drivers/media/rc/meson-ir.c

Source file repositories/reference/linux-study-clean/drivers/media/rc/meson-ir.c

File Facts

System
Linux kernel
Corpus path
drivers/media/rc/meson-ir.c
Extension
.c
Size
20107 bytes
Lines
645
Domain
Driver Families
Bucket
drivers/media
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct meson_ir_protocol {
	u8 hw_protocol;
	bool repeat_counter_enable;
	bool repeat_check_enable;
	bool repeat_compare_enable;
	bool bit_order;
	bool bit1_match_enable;
	bool hold_code_enable;
	bool count_tick_mode;
	u8 code_length;
	u16 frame_time_max;
	u16 leader_active_max;
	u16 leader_active_min;
	u16 leader_idle_max;
	u16 leader_idle_min;
	u16 repeat_leader_max;
	u16 repeat_leader_min;
	u16 bit0_max;
	u16 bit0_min;
	u16 bit1_max;
	u16 bit1_min;
	u16 duration2_max;
	u16 duration2_min;
	u16 duration3_max;
	u16 duration3_min;
};

struct meson_ir_param {
	bool support_hw_decoder;
	unsigned int max_register;
};

struct meson_ir {
	const struct meson_ir_param *param;
	struct regmap	*reg;
	struct rc_dev	*rc;
	spinlock_t	lock;
};

static struct regmap_config meson_ir_regmap_config = {
	.reg_bits = 32,
	.val_bits = 32,
	.reg_stride = 4,
};

static const struct meson_ir_protocol protocol_timings[] = {
	/* protocol, repeat counter, repeat check, repeat compare, order */
	{DEC_MODE_NEC, false, false, false, FRAME_LSB_FIRST,
	/* bit 1 match, hold code, count tick, len, frame time */
	true, false, false, 32, 4000,
	/* leader active max/min, leader idle max/min, repeat leader max/min */
	500, 400, 300, 200, 150, 80,
	/* bit0 max/min, bit1 max/min, duration2 max/min, duration3 max/min */
	72, 40, 134, 90, 0, 0, 0, 0}
};

static void meson_ir_nec_handler(struct meson_ir *ir)
{
	u32 code = 0;
	u32 status = 0;
	enum rc_proto proto;

	regmap_read(ir->reg, IR_DEC_STATUS, &status);

	if (status & DEC_STATUS_REPEAT) {
		rc_repeat(ir->rc);
	} else {
		regmap_read(ir->reg, IR_DEC_FRAME, &code);

		code = ir_nec_bytes_to_scancode(code, code >> 8,
						code >> 16, code >> 24, &proto);
		rc_keydown(ir->rc, proto, code, 0);
	}
}

static void meson_ir_hw_handler(struct meson_ir *ir)
{
	if (ir->rc->enabled_protocols & RC_PROTO_BIT_NEC)
		meson_ir_nec_handler(ir);
}

static irqreturn_t meson_ir_irq(int irqno, void *dev_id)
{
	struct meson_ir *ir = dev_id;
	u32 duration, status;
	struct ir_raw_event rawir = {};

	spin_lock(&ir->lock);

	regmap_read(ir->reg, IR_DEC_STATUS, &status);

Annotation

Implementation Notes