drivers/input/misc/atc260x-onkey.c

Source file repositories/reference/linux-study-clean/drivers/input/misc/atc260x-onkey.c

File Facts

System
Linux kernel
Corpus path
drivers/input/misc/atc260x-onkey.c
Extension
.c
Size
8371 bytes
Lines
306
Domain
Driver Families
Bucket
drivers/input
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 atc260x_onkey_params {
	u32 reg_int_ctl;
	u32 kdwn_state_bm;
	u32 long_int_pnd_bm;
	u32 short_int_pnd_bm;
	u32 kdwn_int_pnd_bm;
	u32 press_int_en_bm;
	u32 kdwn_int_en_bm;
	u32 press_time_bm;
	u32 reset_en_bm;
	u32 reset_time_bm;
};

struct atc260x_onkey {
	struct atc260x *atc260x;
	const struct atc260x_onkey_params *params;
	struct input_dev *input_dev;
	struct delayed_work work;
	int irq;
};

static const struct atc260x_onkey_params atc2603c_onkey_params = {
	.reg_int_ctl		= ATC2603C_PMU_SYS_CTL2,
	.long_int_pnd_bm	= ATC2603C_PMU_SYS_CTL2_ONOFF_LONG_PRESS,
	.short_int_pnd_bm	= ATC2603C_PMU_SYS_CTL2_ONOFF_SHORT_PRESS,
	.kdwn_int_pnd_bm	= ATC2603C_PMU_SYS_CTL2_ONOFF_PRESS_PD,
	.press_int_en_bm	= ATC2603C_PMU_SYS_CTL2_ONOFF_INT_EN,
	.kdwn_int_en_bm		= ATC2603C_PMU_SYS_CTL2_ONOFF_PRESS_INT_EN,
	.kdwn_state_bm		= ATC2603C_PMU_SYS_CTL2_ONOFF_PRESS,
	.press_time_bm		= ATC2603C_PMU_SYS_CTL2_ONOFF_PRESS_TIME,
	.reset_en_bm		= ATC2603C_PMU_SYS_CTL2_ONOFF_PRESS_RESET_EN,
	.reset_time_bm		= ATC2603C_PMU_SYS_CTL2_ONOFF_RESET_TIME_SEL,
};

static const struct atc260x_onkey_params atc2609a_onkey_params = {
	.reg_int_ctl		= ATC2609A_PMU_SYS_CTL2,
	.long_int_pnd_bm	= ATC2609A_PMU_SYS_CTL2_ONOFF_LONG_PRESS,
	.short_int_pnd_bm	= ATC2609A_PMU_SYS_CTL2_ONOFF_SHORT_PRESS,
	.kdwn_int_pnd_bm	= ATC2609A_PMU_SYS_CTL2_ONOFF_PRESS_PD,
	.press_int_en_bm	= ATC2609A_PMU_SYS_CTL2_ONOFF_LSP_INT_EN,
	.kdwn_int_en_bm		= ATC2609A_PMU_SYS_CTL2_ONOFF_PRESS_INT_EN,
	.kdwn_state_bm		= ATC2609A_PMU_SYS_CTL2_ONOFF_PRESS,
	.press_time_bm		= ATC2609A_PMU_SYS_CTL2_ONOFF_PRESS_TIME,
	.reset_en_bm		= ATC2609A_PMU_SYS_CTL2_ONOFF_RESET_EN,
	.reset_time_bm		= ATC2609A_PMU_SYS_CTL2_ONOFF_RESET_TIME_SEL,
};

static int atc2603x_onkey_hw_init(struct atc260x_onkey *onkey,
				  enum atc260x_onkey_reset_status reset_status,
				  u32 reset_time, u32 press_time)
{
	u32 reg_bm, reg_val;

	reg_bm = onkey->params->long_int_pnd_bm |
		 onkey->params->short_int_pnd_bm |
		 onkey->params->kdwn_int_pnd_bm |
		 onkey->params->press_int_en_bm |
		 onkey->params->kdwn_int_en_bm;

	reg_val = reg_bm | press_time;
	reg_bm |= onkey->params->press_time_bm;

	if (reset_status == KEY_RESET_DISABLED) {
		reg_bm |= onkey->params->reset_en_bm;
	} else if (reset_status == KEY_RESET_USER_SEL) {
		reg_bm |= onkey->params->reset_en_bm |
			  onkey->params->reset_time_bm;
		reg_val |= onkey->params->reset_en_bm | reset_time;
	}

	return regmap_update_bits(onkey->atc260x->regmap,
				  onkey->params->reg_int_ctl, reg_bm, reg_val);
}

static void atc260x_onkey_query(struct atc260x_onkey *onkey)
{
	u32 reg_bits;
	int ret, key_down;

	ret = regmap_read(onkey->atc260x->regmap,
			  onkey->params->reg_int_ctl, &key_down);
	if (ret) {
		key_down = 1;
		dev_err(onkey->atc260x->dev,
			"Failed to read onkey status: %d\n", ret);
	} else {
		key_down &= onkey->params->kdwn_state_bm;
	}

	/*

Annotation

Implementation Notes