drivers/input/misc/da7280.c

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

File Facts

System
Linux kernel
Corpus path
drivers/input/misc/da7280.c
Extension
.c
Size
34917 bytes
Lines
1329
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 da7280_gpi_ctl {
	u8 seq_id;
	u8 mode;
	u8 polarity;
};

struct da7280_haptic {
	struct regmap *regmap;
	struct input_dev *input_dev;
	struct device *dev;
	struct i2c_client *client;
	struct pwm_device *pwm_dev;

	struct work_struct work;
	int val;
	u16 gain;
	s16 level;

	u8 dev_type;
	u8 op_mode;
	u8 const_op_mode;
	u8 periodic_op_mode;
	u16 nommax;
	u16 absmax;
	u32 imax;
	u32 impd;
	u32 resonant_freq_h;
	u32 resonant_freq_l;
	bool bemf_sense_en;
	bool freq_track_en;
	bool acc_en;
	bool rapid_stop_en;
	bool amp_pid_en;
	u8 ps_seq_id;
	u8 ps_seq_loop;
	struct da7280_gpi_ctl gpi_ctl[3];
	bool mem_update;
	u8 snp_mem[DA7280_SNP_MEM_SIZE];
	bool active;
	bool suspended;
};

static bool da7280_volatile_register(struct device *dev, unsigned int reg)
{
	switch (reg) {
	case DA7280_IRQ_EVENT1:
	case DA7280_IRQ_EVENT_WARNING_DIAG:
	case DA7280_IRQ_EVENT_SEQ_DIAG:
	case DA7280_IRQ_STATUS1:
	case DA7280_TOP_CTL1:
		return true;
	default:
		return false;
	}
}

static const struct regmap_config da7280_haptic_regmap_config = {
	.reg_bits = 8,
	.val_bits = 8,
	.max_register = DA7280_SNP_MEM_MAX,
	.volatile_reg = da7280_volatile_register,
};

static int da7280_haptic_mem_update(struct da7280_haptic *haptics)
{
	unsigned int val;
	int error;

	/* The patterns should be updated when haptic is not working */
	error = regmap_read(haptics->regmap, DA7280_IRQ_STATUS1, &val);
	if (error)
		return error;
	if (val & DA7280_STA_WARNING_MASK) {
		dev_warn(haptics->dev,
			 "Warning! Please check HAPTIC status.\n");
		return -EBUSY;
	}

	/* Patterns are not updated if the lock bit is enabled */
	val = 0;
	error = regmap_read(haptics->regmap, DA7280_MEM_CTL2, &val);
	if (error)
		return error;
	if (~val & DA7280_WAV_MEM_LOCK_MASK) {
		dev_warn(haptics->dev, "Please unlock the bit first\n");
		return -EACCES;
	}

	/* Set to Inactive mode to make sure safety */
	error = regmap_update_bits(haptics->regmap,

Annotation

Implementation Notes