File Index
Files and directories
Sign in
FILE

hx9023s.c

File preview with syntax highlighting.

linux-6.19.14/drivers/iio/proximity/hx9023s.c C
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) 2024 NanjingTianyihexin Electronics Ltd.
   4 * http://www.tianyihexin.com
   5 *
   6 * Driver for NanjingTianyihexin HX9023S Cap Sensor.
   7 * Datasheet available at:
   8 * http://www.tianyihexin.com/ueditor/php/upload/file/20240614/1718336303992081.pdf
   9 */
  10
  11#include <linux/array_size.h>
  12#include <linux/bitfield.h>
  13#include <linux/bitops.h>
  14#include <linux/cleanup.h>
  15#include <linux/device.h>
  16#include <linux/errno.h>
  17#include <linux/firmware.h>
  18#include <linux/i2c.h>
  19#include <linux/interrupt.h>
  20#include <linux/irqreturn.h>
  21#include <linux/math64.h>
  22#include <linux/mod_devicetable.h>
  23#include <linux/module.h>
  24#include <linux/mutex.h>
  25#include <linux/pm.h>
  26#include <linux/property.h>
  27#include <linux/regmap.h>
  28#include <linux/regulator/consumer.h>
  29#include <linux/types.h>
  30#include <linux/units.h>
  31
  32#include <asm/byteorder.h>
  33#include <linux/unaligned.h>
  34
  35#include <linux/iio/buffer.h>
  36#include <linux/iio/events.h>
  37#include <linux/iio/iio.h>
  38#include <linux/iio/trigger.h>
  39#include <linux/iio/triggered_buffer.h>
  40#include <linux/iio/trigger_consumer.h>
  41#include <linux/iio/types.h>
  42
  43#define HX9023S_CHIP_ID 0x1D
  44#define HX9023S_CH_NUM 5
  45#define HX9023S_POS 0x03
  46#define HX9023S_NEG 0x02
  47#define HX9023S_NOT_CONNECTED 16
  48
  49#define HX9023S_GLOBAL_CTRL0                   0x00
  50#define HX9023S_PRF_CFG                        0x02
  51#define HX9023S_CH0_CFG_7_0                    0x03
  52#define HX9023S_CH4_CFG_9_8                    0x0C
  53#define HX9023S_RANGE_7_0                      0x0D
  54#define HX9023S_RANGE_9_8                      0x0E
  55#define HX9023S_RANGE_18_16                    0x0F
  56#define HX9023S_AVG0_NOSR0_CFG                 0x10
  57#define HX9023S_NOSR12_CFG                     0x11
  58#define HX9023S_NOSR34_CFG                     0x12
  59#define HX9023S_AVG12_CFG                      0x13
  60#define HX9023S_AVG34_CFG                      0x14
  61#define HX9023S_OFFSET_DAC0_7_0                0x15
  62#define HX9023S_OFFSET_DAC4_9_8                0x1E
  63#define HX9023S_SAMPLE_NUM_7_0                 0x1F
  64#define HX9023S_INTEGRATION_NUM_7_0            0x21
  65#define HX9023S_CH_NUM_CFG                     0x24
  66#define HX9023S_LP_ALP_4_CFG                   0x29
  67#define HX9023S_LP_ALP_1_0_CFG                 0x2A
  68#define HX9023S_LP_ALP_3_2_CFG                 0x2B
  69#define HX9023S_UP_ALP_1_0_CFG                 0x2C
  70#define HX9023S_UP_ALP_3_2_CFG                 0x2D
  71#define HX9023S_DN_UP_ALP_0_4_CFG              0x2E
  72#define HX9023S_DN_ALP_2_1_CFG                 0x2F
  73#define HX9023S_DN_ALP_4_3_CFG                 0x30
  74#define HX9023S_RAW_BL_RD_CFG                  0x38
  75#define HX9023S_INTERRUPT_CFG                  0x39
  76#define HX9023S_INTERRUPT_CFG1                 0x3A
  77#define HX9023S_CALI_DIFF_CFG                  0x3B
  78#define HX9023S_DITHER_CFG                     0x3C
  79#define HX9023S_DEVICE_ID                      0x60
  80#define HX9023S_PROX_STATUS                    0x6B
  81#define HX9023S_PROX_INT_HIGH_CFG              0x6C
  82#define HX9023S_PROX_INT_LOW_CFG               0x6D
  83#define HX9023S_PROX_HIGH_DIFF_CFG_CH0_0       0x80
  84#define HX9023S_PROX_LOW_DIFF_CFG_CH0_0        0x88
  85#define HX9023S_PROX_LOW_DIFF_CFG_CH3_1        0x8F
  86#define HX9023S_PROX_HIGH_DIFF_CFG_CH4_0       0x9E
  87#define HX9023S_PROX_HIGH_DIFF_CFG_CH4_1       0x9F
  88#define HX9023S_PROX_LOW_DIFF_CFG_CH4_0        0xA2
  89#define HX9023S_PROX_LOW_DIFF_CFG_CH4_1        0xA3
  90#define HX9023S_CAP_INI_CH4_0                  0xB3
  91#define HX9023S_LP_DIFF_CH4_2                  0xBA
  92#define HX9023S_RAW_BL_CH4_0                   0xB5
  93#define HX9023S_LP_DIFF_CH4_0                  0xB8
  94#define HX9023S_DSP_CONFIG_CTRL1               0xC8
  95#define HX9023S_CAP_INI_CH0_0                  0xE0
  96#define HX9023S_RAW_BL_CH0_0                   0xE8
  97#define HX9023S_LP_DIFF_CH0_0                  0xF4
  98#define HX9023S_LP_DIFF_CH3_2                  0xFF
  99
 100#define HX9023S_DATA_LOCK_MASK BIT(4)
 101#define HX9023S_INTERRUPT_MASK GENMASK(9, 0)
 102#define HX9023S_PROX_DEBOUNCE_MASK GENMASK(3, 0)
 103
 104#define FW_VER_OFFSET 2
 105#define FW_REG_CNT_OFFSET 3
 106#define FW_DATA_OFFSET 16
 107
 108struct hx9023s_bin {
 109	u16 reg_count;
 110	u16 fw_size;
 111	u8 fw_ver;
 112	u8 data[] __counted_by(fw_size);
 113};
 114
 115struct hx9023s_ch_data {
 116	s16 raw; /* Raw Data*/
 117	s16 lp; /* Low Pass Filter Data*/
 118	s16 bl; /* Base Line Data */
 119	s16 diff; /* Difference of Low Pass Data and Base Line Data */
 120
 121	struct {
 122		unsigned int near;
 123		unsigned int far;
 124	} thres;
 125
 126	u16 dac;
 127	u8 channel_positive;
 128	u8 channel_negative;
 129	bool sel_bl;
 130	bool sel_raw;
 131	bool sel_diff;
 132	bool sel_lp;
 133	bool enable;
 134};
 135
 136struct hx9023s_data {
 137	struct iio_trigger *trig;
 138	struct regmap *regmap;
 139	unsigned long chan_prox_stat;
 140	unsigned long chan_read;
 141	unsigned long chan_event;
 142	unsigned long ch_en_stat;
 143	unsigned long chan_in_use;
 144	unsigned int prox_state_reg;
 145	bool trigger_enabled;
 146
 147	struct {
 148		__le16 channels[HX9023S_CH_NUM];
 149		aligned_s64 ts;
 150	} buffer;
 151
 152	/*
 153	 * Serialize access to registers below:
 154	 * HX9023S_PROX_INT_LOW_CFG,
 155	 * HX9023S_PROX_INT_HIGH_CFG,
 156	 * HX9023S_INTERRUPT_CFG,
 157	 * HX9023S_CH_NUM_CFG
 158	 * Serialize access to channel configuration in
 159	 * hx9023s_push_events and hx9023s_trigger_handler.
 160	 */
 161	struct mutex mutex;
 162	struct hx9023s_ch_data ch_data[HX9023S_CH_NUM];
 163};
 164
 165static const struct reg_sequence hx9023s_reg_init_list[] = {
 166	/* scan period */
 167	REG_SEQ0(HX9023S_PRF_CFG, 0x17),
 168
 169	/* full scale of conversion phase of each channel */
 170	REG_SEQ0(HX9023S_RANGE_7_0, 0x11),
 171	REG_SEQ0(HX9023S_RANGE_9_8, 0x02),
 172	REG_SEQ0(HX9023S_RANGE_18_16, 0x00),
 173
 174	/* ADC average number and OSR number of each channel */
 175	REG_SEQ0(HX9023S_AVG0_NOSR0_CFG, 0x71),
 176	REG_SEQ0(HX9023S_NOSR12_CFG, 0x44),
 177	REG_SEQ0(HX9023S_NOSR34_CFG, 0x00),
 178	REG_SEQ0(HX9023S_AVG12_CFG, 0x33),
 179	REG_SEQ0(HX9023S_AVG34_CFG, 0x00),
 180
 181	/* sample & integration frequency of the ADC */
 182	REG_SEQ0(HX9023S_SAMPLE_NUM_7_0, 0x65),
 183	REG_SEQ0(HX9023S_INTEGRATION_NUM_7_0, 0x65),
 184
 185	/* coefficient of the first order low pass filter during each channel */
 186	REG_SEQ0(HX9023S_LP_ALP_1_0_CFG, 0x22),
 187	REG_SEQ0(HX9023S_LP_ALP_3_2_CFG, 0x22),
 188	REG_SEQ0(HX9023S_LP_ALP_4_CFG, 0x02),
 189
 190	/* up coefficient of the first order low pass filter during each channel */
 191	REG_SEQ0(HX9023S_UP_ALP_1_0_CFG, 0x88),
 192	REG_SEQ0(HX9023S_UP_ALP_3_2_CFG, 0x88),
 193	REG_SEQ0(HX9023S_DN_UP_ALP_0_4_CFG, 0x18),
 194
 195	/* down coefficient of the first order low pass filter during each channel */
 196	REG_SEQ0(HX9023S_DN_ALP_2_1_CFG, 0x11),
 197	REG_SEQ0(HX9023S_DN_ALP_4_3_CFG, 0x11),
 198
 199	/* selection of data for the Data Mux Register to output data */
 200	REG_SEQ0(HX9023S_RAW_BL_RD_CFG, 0xF0),
 201
 202	/* enable the interrupt function */
 203	REG_SEQ0(HX9023S_INTERRUPT_CFG, 0xFF),
 204	REG_SEQ0(HX9023S_INTERRUPT_CFG1, 0x3B),
 205	REG_SEQ0(HX9023S_DITHER_CFG, 0x21),
 206
 207	/* threshold of the offset compensation */
 208	REG_SEQ0(HX9023S_CALI_DIFF_CFG, 0x07),
 209
 210	/* proximity persistency number(near & far) */
 211	REG_SEQ0(HX9023S_PROX_INT_HIGH_CFG, 0x01),
 212	REG_SEQ0(HX9023S_PROX_INT_LOW_CFG, 0x01),
 213
 214	/* disable the data lock */
 215	REG_SEQ0(HX9023S_DSP_CONFIG_CTRL1, 0x00),
 216};
 217
 218static const struct iio_event_spec hx9023s_events[] = {
 219	{
 220		.type = IIO_EV_TYPE_THRESH,
 221		.dir = IIO_EV_DIR_RISING,
 222		.mask_shared_by_all = BIT(IIO_EV_INFO_PERIOD),
 223		.mask_separate = BIT(IIO_EV_INFO_VALUE),
 224	},
 225	{
 226		.type = IIO_EV_TYPE_THRESH,
 227		.dir = IIO_EV_DIR_FALLING,
 228		.mask_shared_by_all = BIT(IIO_EV_INFO_PERIOD),
 229		.mask_separate = BIT(IIO_EV_INFO_VALUE),
 230
 231	},
 232	{
 233		.type = IIO_EV_TYPE_THRESH,
 234		.dir = IIO_EV_DIR_EITHER,
 235		.mask_separate = BIT(IIO_EV_INFO_ENABLE),
 236	},
 237};
 238
 239#define HX9023S_CHANNEL(idx)					\
 240{								\
 241	.type = IIO_PROXIMITY,					\
 242	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),		\
 243	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),\
 244	.indexed = 1,						\
 245	.channel = idx,						\
 246	.address = 0,						\
 247	.event_spec = hx9023s_events,				\
 248	.num_event_specs = ARRAY_SIZE(hx9023s_events),		\
 249	.scan_index = idx,					\
 250	.scan_type = {						\
 251		.sign = 's',					\
 252		.realbits = 16,					\
 253		.storagebits = 16,				\
 254		.endianness = IIO_BE,				\
 255	},							\
 256}
 257
 258static const struct iio_chan_spec hx9023s_channels[] = {
 259	HX9023S_CHANNEL(0),
 260	HX9023S_CHANNEL(1),
 261	HX9023S_CHANNEL(2),
 262	HX9023S_CHANNEL(3),
 263	HX9023S_CHANNEL(4),
 264	IIO_CHAN_SOFT_TIMESTAMP(5),
 265};
 266
 267static const unsigned int hx9023s_samp_freq_table[] = {
 268	2, 2, 4, 6, 8, 10, 14, 18, 22, 26,
 269	30, 34, 38, 42, 46, 50, 56, 62, 68, 74,
 270	80, 90, 100, 200, 300, 400, 600, 800, 1000, 2000,
 271	3000, 4000,
 272};
 273
 274static const struct regmap_range hx9023s_rd_reg_ranges[] = {
 275	regmap_reg_range(HX9023S_GLOBAL_CTRL0, HX9023S_LP_DIFF_CH3_2),
 276};
 277
 278static const struct regmap_range hx9023s_wr_reg_ranges[] = {
 279	regmap_reg_range(HX9023S_GLOBAL_CTRL0, HX9023S_LP_DIFF_CH3_2),
 280};
 281
 282static const struct regmap_range hx9023s_volatile_reg_ranges[] = {
 283	regmap_reg_range(HX9023S_CAP_INI_CH4_0, HX9023S_LP_DIFF_CH4_2),
 284	regmap_reg_range(HX9023S_CAP_INI_CH0_0, HX9023S_LP_DIFF_CH3_2),
 285	regmap_reg_range(HX9023S_PROX_STATUS, HX9023S_PROX_STATUS),
 286};
 287
 288static const struct regmap_access_table hx9023s_rd_regs = {
 289	.yes_ranges = hx9023s_rd_reg_ranges,
 290	.n_yes_ranges = ARRAY_SIZE(hx9023s_rd_reg_ranges),
 291};
 292
 293static const struct regmap_access_table hx9023s_wr_regs = {
 294	.yes_ranges = hx9023s_wr_reg_ranges,
 295	.n_yes_ranges = ARRAY_SIZE(hx9023s_wr_reg_ranges),
 296};
 297
 298static const struct regmap_access_table hx9023s_volatile_regs = {
 299	.yes_ranges = hx9023s_volatile_reg_ranges,
 300	.n_yes_ranges = ARRAY_SIZE(hx9023s_volatile_reg_ranges),
 301};
 302
 303static const struct regmap_config hx9023s_regmap_config = {
 304	.reg_bits = 8,
 305	.val_bits = 8,
 306	.cache_type = REGCACHE_MAPLE,
 307	.rd_table = &hx9023s_rd_regs,
 308	.wr_table = &hx9023s_wr_regs,
 309	.volatile_table = &hx9023s_volatile_regs,
 310};
 311
 312static int hx9023s_interrupt_enable(struct hx9023s_data *data)
 313{
 314	return regmap_update_bits(data->regmap, HX9023S_INTERRUPT_CFG,
 315				HX9023S_INTERRUPT_MASK, HX9023S_INTERRUPT_MASK);
 316}
 317
 318static int hx9023s_interrupt_disable(struct hx9023s_data *data)
 319{
 320	return regmap_update_bits(data->regmap, HX9023S_INTERRUPT_CFG,
 321				HX9023S_INTERRUPT_MASK, 0x00);
 322}
 323
 324static int hx9023s_data_lock(struct hx9023s_data *data, bool locked)
 325{
 326	if (locked)
 327		return regmap_update_bits(data->regmap,
 328					  HX9023S_DSP_CONFIG_CTRL1,
 329					  HX9023S_DATA_LOCK_MASK,
 330					  HX9023S_DATA_LOCK_MASK);
 331	else
 332		return regmap_update_bits(data->regmap,
 333					  HX9023S_DSP_CONFIG_CTRL1,
 334					  HX9023S_DATA_LOCK_MASK, 0);
 335}
 336
 337static int hx9023s_ch_cfg(struct hx9023s_data *data)
 338{
 339	__le16 reg_list[HX9023S_CH_NUM];
 340	u8 ch_pos[HX9023S_CH_NUM];
 341	u8 ch_neg[HX9023S_CH_NUM];
 342	/* Bit positions corresponding to input pin connections */
 343	u8 conn_cs[HX9023S_CH_NUM] = { 0, 2, 4, 6, 8 };
 344	unsigned int i;
 345	u16 reg;
 346
 347	for (i = 0; i < HX9023S_CH_NUM; i++) {
 348		ch_pos[i] = data->ch_data[i].channel_positive == HX9023S_NOT_CONNECTED ?
 349			HX9023S_NOT_CONNECTED : conn_cs[data->ch_data[i].channel_positive];
 350		ch_neg[i] = data->ch_data[i].channel_negative == HX9023S_NOT_CONNECTED ?
 351			HX9023S_NOT_CONNECTED : conn_cs[data->ch_data[i].channel_negative];
 352
 353		reg = (HX9023S_POS << ch_pos[i]) | (HX9023S_NEG << ch_neg[i]);
 354		reg_list[i] = cpu_to_le16(reg);
 355	}
 356
 357	return regmap_bulk_write(data->regmap, HX9023S_CH0_CFG_7_0, reg_list,
 358				 sizeof(reg_list));
 359}
 360
 361static int hx9023s_write_far_debounce(struct hx9023s_data *data, int val)
 362{
 363	guard(mutex)(&data->mutex);
 364	return regmap_update_bits(data->regmap, HX9023S_PROX_INT_LOW_CFG,
 365				HX9023S_PROX_DEBOUNCE_MASK,
 366				FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK, val));
 367}
 368
 369static int hx9023s_write_near_debounce(struct hx9023s_data *data, int val)
 370{
 371	guard(mutex)(&data->mutex);
 372	return regmap_update_bits(data->regmap, HX9023S_PROX_INT_HIGH_CFG,
 373				HX9023S_PROX_DEBOUNCE_MASK,
 374				FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK, val));
 375}
 376
 377static int hx9023s_read_far_debounce(struct hx9023s_data *data, int *val)
 378{
 379	int ret;
 380
 381	ret = regmap_read(data->regmap, HX9023S_PROX_INT_LOW_CFG, val);
 382	if (ret)
 383		return ret;
 384
 385	*val = FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK, *val);
 386
 387	return IIO_VAL_INT;
 388}
 389
 390static int hx9023s_read_near_debounce(struct hx9023s_data *data, int *val)
 391{
 392	int ret;
 393
 394	ret = regmap_read(data->regmap, HX9023S_PROX_INT_HIGH_CFG, val);
 395	if (ret)
 396		return ret;
 397
 398	*val = FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK, *val);
 399
 400	return IIO_VAL_INT;
 401}
 402
 403static int hx9023s_get_thres_near(struct hx9023s_data *data, u8 ch, int *val)
 404{
 405	int ret;
 406	__le16 buf;
 407	unsigned int reg, tmp;
 408
 409	reg = (ch == 4) ? HX9023S_PROX_HIGH_DIFF_CFG_CH4_0 :
 410		HX9023S_PROX_HIGH_DIFF_CFG_CH0_0 + (ch * 2);
 411
 412	ret = regmap_bulk_read(data->regmap, reg, &buf, sizeof(buf));
 413	if (ret)
 414		return ret;
 415
 416	tmp = (le16_to_cpu(buf) & GENMASK(9, 0)) * 32;
 417	data->ch_data[ch].thres.near = tmp;
 418	*val = tmp;
 419
 420	return IIO_VAL_INT;
 421}
 422
 423static int hx9023s_get_thres_far(struct hx9023s_data *data, u8 ch, int *val)
 424{
 425	int ret;
 426	__le16 buf;
 427	unsigned int reg, tmp;
 428
 429	reg = (ch == 4) ? HX9023S_PROX_LOW_DIFF_CFG_CH4_0 :
 430		HX9023S_PROX_LOW_DIFF_CFG_CH0_0 + (ch * 2);
 431
 432	ret = regmap_bulk_read(data->regmap, reg, &buf, sizeof(buf));
 433	if (ret)
 434		return ret;
 435
 436	tmp = (le16_to_cpu(buf) & GENMASK(9, 0)) * 32;
 437	data->ch_data[ch].thres.far = tmp;
 438	*val = tmp;
 439
 440	return IIO_VAL_INT;
 441}
 442
 443static int hx9023s_set_thres_near(struct hx9023s_data *data, u8 ch, int val)
 444{
 445	__le16 val_le16 = cpu_to_le16((val / 32) & GENMASK(9, 0));
 446	unsigned int reg;
 447
 448	data->ch_data[ch].thres.near = ((val / 32) & GENMASK(9, 0)) * 32;
 449	reg = (ch == 4) ? HX9023S_PROX_HIGH_DIFF_CFG_CH4_0 :
 450		HX9023S_PROX_HIGH_DIFF_CFG_CH0_0 + (ch * 2);
 451
 452	return regmap_bulk_write(data->regmap, reg, &val_le16, sizeof(val_le16));
 453}
 454
 455static int hx9023s_set_thres_far(struct hx9023s_data *data, u8 ch, int val)
 456{
 457	__le16 val_le16 = cpu_to_le16((val / 32) & GENMASK(9, 0));
 458	unsigned int reg;
 459
 460	data->ch_data[ch].thres.far = ((val / 32) & GENMASK(9, 0)) * 32;
 461	reg = (ch == 4) ? HX9023S_PROX_LOW_DIFF_CFG_CH4_0 :
 462		HX9023S_PROX_LOW_DIFF_CFG_CH0_0 + (ch * 2);
 463
 464	return regmap_bulk_write(data->regmap, reg, &val_le16, sizeof(val_le16));
 465}
 466
 467static int hx9023s_get_prox_state(struct hx9023s_data *data)
 468{
 469	return regmap_read(data->regmap, HX9023S_PROX_STATUS, &data->prox_state_reg);
 470}
 471
 472static int hx9023s_data_select(struct hx9023s_data *data)
 473{
 474	int ret;
 475	unsigned int i, buf;
 476	unsigned long tmp;
 477
 478	ret = regmap_read(data->regmap, HX9023S_RAW_BL_RD_CFG, &buf);
 479	if (ret)
 480		return ret;
 481
 482	tmp = buf;
 483	for (i = 0; i < 4; i++) {
 484		data->ch_data[i].sel_diff = test_bit(i, &tmp);
 485		data->ch_data[i].sel_lp = !data->ch_data[i].sel_diff;
 486		data->ch_data[i].sel_bl = test_bit(i + 4, &tmp);
 487		data->ch_data[i].sel_raw = !data->ch_data[i].sel_bl;
 488	}
 489
 490	ret = regmap_read(data->regmap, HX9023S_INTERRUPT_CFG1, &buf);
 491	if (ret)
 492		return ret;
 493
 494	tmp = buf;
 495	data->ch_data[4].sel_diff = test_bit(2, &tmp);
 496	data->ch_data[4].sel_lp = !data->ch_data[4].sel_diff;
 497	data->ch_data[4].sel_bl = test_bit(3, &tmp);
 498	data->ch_data[4].sel_raw = !data->ch_data[4].sel_bl;
 499
 500	return 0;
 501}
 502
 503static int hx9023s_sample(struct hx9023s_data *data)
 504{
 505	int ret;
 506	unsigned int i;
 507	u8 buf[HX9023S_CH_NUM * 3];
 508	u16 value;
 509
 510	ret = hx9023s_data_lock(data, true);
 511	if (ret)
 512		return ret;
 513
 514	ret = hx9023s_data_select(data);
 515	if (ret)
 516		goto err;
 517
 518	/* 3 bytes for each of channels 0 to 3 which have contiguous registers */
 519	ret = regmap_bulk_read(data->regmap, HX9023S_RAW_BL_CH0_0, buf, 12);
 520	if (ret)
 521		goto err;
 522
 523	/* 3 bytes for channel 4 */
 524	ret = regmap_bulk_read(data->regmap, HX9023S_RAW_BL_CH4_0, buf + 12, 3);
 525	if (ret)
 526		goto err;
 527
 528	for (i = 0; i < HX9023S_CH_NUM; i++) {
 529		value = get_unaligned_le16(&buf[i * 3 + 1]);
 530		data->ch_data[i].raw = 0;
 531		data->ch_data[i].bl = 0;
 532		if (data->ch_data[i].sel_raw)
 533			data->ch_data[i].raw = value;
 534		if (data->ch_data[i].sel_bl)
 535			data->ch_data[i].bl = value;
 536	}
 537
 538	/* 3 bytes for each of channels 0 to 3 which have contiguous registers */
 539	ret = regmap_bulk_read(data->regmap, HX9023S_LP_DIFF_CH0_0, buf, 12);
 540	if (ret)
 541		goto err;
 542
 543	/* 3 bytes for channel 4 */
 544	ret = regmap_bulk_read(data->regmap, HX9023S_LP_DIFF_CH4_0, buf + 12, 3);
 545	if (ret)
 546		goto err;
 547
 548	for (i = 0; i < HX9023S_CH_NUM; i++) {
 549		value = get_unaligned_le16(&buf[i * 3 + 1]);
 550		data->ch_data[i].lp = 0;
 551		data->ch_data[i].diff = 0;
 552		if (data->ch_data[i].sel_lp)
 553			data->ch_data[i].lp = value;
 554		if (data->ch_data[i].sel_diff)
 555			data->ch_data[i].diff = value;
 556	}
 557
 558	for (i = 0; i < HX9023S_CH_NUM; i++) {
 559		if (data->ch_data[i].sel_lp && data->ch_data[i].sel_bl)
 560			data->ch_data[i].diff = data->ch_data[i].lp - data->ch_data[i].bl;
 561	}
 562
 563	/* 2 bytes for each of channels 0 to 4 which have contiguous registers */
 564	ret = regmap_bulk_read(data->regmap, HX9023S_OFFSET_DAC0_7_0, buf, 10);
 565	if (ret)
 566		goto err;
 567
 568	for (i = 0; i < HX9023S_CH_NUM; i++) {
 569		value = get_unaligned_le16(&buf[i * 2]);
 570		value = FIELD_GET(GENMASK(11, 0), value);
 571		data->ch_data[i].dac = value;
 572	}
 573
 574err:
 575	return hx9023s_data_lock(data, false);
 576}
 577
 578static int hx9023s_ch_en(struct hx9023s_data *data, u8 ch_id, bool en)
 579{
 580	int ret;
 581	unsigned int buf;
 582
 583	ret = regmap_read(data->regmap, HX9023S_CH_NUM_CFG, &buf);
 584	if (ret)
 585		return ret;
 586
 587	data->ch_en_stat = buf;
 588	if (en && data->ch_en_stat == 0)
 589		data->prox_state_reg = 0;
 590
 591	data->ch_data[ch_id].enable = en;
 592	__assign_bit(ch_id, &data->ch_en_stat, en);
 593
 594	return regmap_write(data->regmap, HX9023S_CH_NUM_CFG, data->ch_en_stat);
 595}
 596
 597static int hx9023s_property_get(struct hx9023s_data *data)
 598{
 599	struct device *dev = regmap_get_device(data->regmap);
 600	u32 array[2];
 601	u32 i, reg, temp;
 602	int ret;
 603
 604	data->chan_in_use = 0;
 605	for (i = 0; i < HX9023S_CH_NUM; i++) {
 606		data->ch_data[i].channel_positive = HX9023S_NOT_CONNECTED;
 607		data->ch_data[i].channel_negative = HX9023S_NOT_CONNECTED;
 608	}
 609
 610	device_for_each_child_node_scoped(dev, child) {
 611		ret = fwnode_property_read_u32(child, "reg", &reg);
 612		if (ret || reg >= HX9023S_CH_NUM)
 613			return dev_err_probe(dev, ret < 0 ? ret : -EINVAL,
 614					     "Failed to read reg\n");
 615		__set_bit(reg, &data->chan_in_use);
 616
 617		ret = fwnode_property_read_u32(child, "single-channel", &temp);
 618		if (ret == 0) {
 619			data->ch_data[reg].channel_positive = temp;
 620			data->ch_data[reg].channel_negative = HX9023S_NOT_CONNECTED;
 621		} else {
 622			ret = fwnode_property_read_u32_array(child, "diff-channels",
 623							     array, ARRAY_SIZE(array));
 624			if (ret == 0) {
 625				data->ch_data[reg].channel_positive = array[0];
 626				data->ch_data[reg].channel_negative = array[1];
 627			} else {
 628				return dev_err_probe(dev, ret,
 629						     "Property read failed: %d\n",
 630						     reg);
 631			}
 632		}
 633	}
 634
 635	return 0;
 636}
 637
 638static int hx9023s_update_chan_en(struct hx9023s_data *data,
 639				  unsigned long chan_read,
 640				  unsigned long chan_event)
 641{
 642	unsigned int i;
 643	unsigned long channels = chan_read | chan_event;
 644
 645	if ((data->chan_read | data->chan_event) != channels) {
 646		for_each_set_bit(i, &channels, HX9023S_CH_NUM)
 647			hx9023s_ch_en(data, i, test_bit(i, &data->chan_in_use));
 648		for_each_clear_bit(i, &channels, HX9023S_CH_NUM)
 649			hx9023s_ch_en(data, i, false);
 650	}
 651
 652	data->chan_read = chan_read;
 653	data->chan_event = chan_event;
 654
 655	return 0;
 656}
 657
 658static int hx9023s_get_proximity(struct hx9023s_data *data,
 659				 const struct iio_chan_spec *chan,
 660				 int *val)
 661{
 662	int ret;
 663
 664	ret = hx9023s_sample(data);
 665	if (ret)
 666		return ret;
 667
 668	ret = hx9023s_get_prox_state(data);
 669	if (ret)
 670		return ret;
 671
 672	*val = data->ch_data[chan->channel].diff;
 673	return IIO_VAL_INT;
 674}
 675
 676static int hx9023s_get_samp_freq(struct hx9023s_data *data, int *val, int *val2)
 677{
 678	int ret;
 679	unsigned int odr, index;
 680
 681	ret = regmap_read(data->regmap, HX9023S_PRF_CFG, &index);
 682	if (ret)
 683		return ret;
 684
 685	odr = hx9023s_samp_freq_table[index];
 686	*val = KILO / odr;
 687	*val2 = div_u64((KILO % odr) * MICRO, odr);
 688
 689	return IIO_VAL_INT_PLUS_MICRO;
 690}
 691
 692static int hx9023s_read_raw(struct iio_dev *indio_dev,
 693			    const struct iio_chan_spec *chan,
 694			    int *val, int *val2, long mask)
 695{
 696	struct hx9023s_data *data = iio_priv(indio_dev);
 697	int ret;
 698
 699	if (chan->type != IIO_PROXIMITY)
 700		return -EINVAL;
 701
 702	switch (mask) {
 703	case IIO_CHAN_INFO_RAW:
 704		if (!iio_device_claim_direct(indio_dev))
 705			return -EBUSY;
 706
 707		ret = hx9023s_get_proximity(data, chan, val);
 708		iio_device_release_direct(indio_dev);
 709		return ret;
 710	case IIO_CHAN_INFO_SAMP_FREQ:
 711		return hx9023s_get_samp_freq(data, val, val2);
 712	default:
 713		return -EINVAL;
 714	}
 715}
 716
 717static int hx9023s_set_samp_freq(struct hx9023s_data *data, int val, int val2)
 718{
 719	struct device *dev = regmap_get_device(data->regmap);
 720	unsigned int i, period_ms;
 721
 722	if (!val && !val2)
 723		return -EINVAL;
 724
 725	period_ms = div_u64(NANO, (val * MEGA + val2));
 726
 727	for (i = 0; i < ARRAY_SIZE(hx9023s_samp_freq_table); i++) {
 728		if (period_ms == hx9023s_samp_freq_table[i])
 729			break;
 730	}
 731	if (i == ARRAY_SIZE(hx9023s_samp_freq_table)) {
 732		dev_err(dev, "Period:%dms NOT found!\n", period_ms);
 733		return -EINVAL;
 734	}
 735
 736	return regmap_write(data->regmap, HX9023S_PRF_CFG, i);
 737}
 738
 739static int hx9023s_write_raw(struct iio_dev *indio_dev,
 740			     const struct iio_chan_spec *chan,
 741			     int val, int val2, long mask)
 742{
 743	struct hx9023s_data *data = iio_priv(indio_dev);
 744
 745	if (chan->type != IIO_PROXIMITY)
 746		return -EINVAL;
 747
 748	if (mask != IIO_CHAN_INFO_SAMP_FREQ)
 749		return -EINVAL;
 750
 751	return hx9023s_set_samp_freq(data, val, val2);
 752}
 753
 754static irqreturn_t hx9023s_irq_handler(int irq, void *private)
 755{
 756	struct iio_dev *indio_dev = private;
 757	struct hx9023s_data *data = iio_priv(indio_dev);
 758
 759	if (data->trigger_enabled)
 760		iio_trigger_poll(data->trig);
 761
 762	return IRQ_WAKE_THREAD;
 763}
 764
 765static void hx9023s_push_events(struct iio_dev *indio_dev)
 766{
 767	struct hx9023s_data *data = iio_priv(indio_dev);
 768	s64 timestamp = iio_get_time_ns(indio_dev);
 769	unsigned long prox_changed;
 770	unsigned int chan;
 771	int ret;
 772
 773	ret = hx9023s_sample(data);
 774	if (ret)
 775		return;
 776
 777	ret = hx9023s_get_prox_state(data);
 778	if (ret)
 779		return;
 780
 781	prox_changed = (data->chan_prox_stat ^ data->prox_state_reg) & data->chan_event;
 782	for_each_set_bit(chan, &prox_changed, HX9023S_CH_NUM) {
 783		unsigned int dir;
 784
 785		dir = (data->prox_state_reg & BIT(chan)) ?
 786			IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING;
 787
 788		iio_push_event(indio_dev,
 789			       IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, chan,
 790						    IIO_EV_TYPE_THRESH, dir),
 791			       timestamp);
 792	}
 793	data->chan_prox_stat = data->prox_state_reg;
 794}
 795
 796static irqreturn_t hx9023s_irq_thread_handler(int irq, void *private)
 797{
 798	struct iio_dev *indio_dev = private;
 799	struct hx9023s_data *data = iio_priv(indio_dev);
 800
 801	guard(mutex)(&data->mutex);
 802	hx9023s_push_events(indio_dev);
 803
 804	return IRQ_HANDLED;
 805}
 806
 807static int hx9023s_read_event_val(struct iio_dev *indio_dev,
 808				  const struct iio_chan_spec *chan,
 809				  enum iio_event_type type,
 810				  enum iio_event_direction dir,
 811				  enum iio_event_info info, int *val, int *val2)
 812{
 813	struct hx9023s_data *data = iio_priv(indio_dev);
 814
 815	if (chan->type != IIO_PROXIMITY)
 816		return -EINVAL;
 817
 818	switch (info) {
 819	case IIO_EV_INFO_VALUE:
 820		switch (dir) {
 821		case IIO_EV_DIR_RISING:
 822			return hx9023s_get_thres_far(data, chan->channel, val);
 823		case IIO_EV_DIR_FALLING:
 824			return hx9023s_get_thres_near(data, chan->channel, val);
 825		default:
 826			return -EINVAL;
 827		}
 828	case IIO_EV_INFO_PERIOD:
 829		switch (dir) {
 830		case IIO_EV_DIR_RISING:
 831			return hx9023s_read_far_debounce(data, val);
 832		case IIO_EV_DIR_FALLING:
 833			return hx9023s_read_near_debounce(data, val);
 834		default:
 835			return -EINVAL;
 836		}
 837	default:
 838		return -EINVAL;
 839	}
 840}
 841
 842static int hx9023s_write_event_val(struct iio_dev *indio_dev,
 843				   const struct iio_chan_spec *chan,
 844				   enum iio_event_type type,
 845				   enum iio_event_direction dir,
 846				   enum iio_event_info info, int val, int val2)
 847{
 848	struct hx9023s_data *data = iio_priv(indio_dev);
 849
 850	if (chan->type != IIO_PROXIMITY)
 851		return -EINVAL;
 852
 853	switch (info) {
 854	case IIO_EV_INFO_VALUE:
 855		switch (dir) {
 856		case IIO_EV_DIR_RISING:
 857			return hx9023s_set_thres_far(data, chan->channel, val);
 858		case IIO_EV_DIR_FALLING:
 859			return hx9023s_set_thres_near(data, chan->channel, val);
 860		default:
 861			return -EINVAL;
 862		}
 863	case IIO_EV_INFO_PERIOD:
 864		switch (dir) {
 865		case IIO_EV_DIR_RISING:
 866			return hx9023s_write_far_debounce(data, val);
 867		case IIO_EV_DIR_FALLING:
 868			return hx9023s_write_near_debounce(data, val);
 869		default:
 870			return -EINVAL;
 871		}
 872	default:
 873		return -EINVAL;
 874	}
 875}
 876
 877static int hx9023s_read_event_config(struct iio_dev *indio_dev,
 878				     const struct iio_chan_spec *chan,
 879				     enum iio_event_type type,
 880				     enum iio_event_direction dir)
 881{
 882	struct hx9023s_data *data = iio_priv(indio_dev);
 883
 884	return test_bit(chan->channel, &data->chan_event);
 885}
 886
 887static int hx9023s_write_event_config(struct iio_dev *indio_dev,
 888				      const struct iio_chan_spec *chan,
 889				      enum iio_event_type type,
 890				      enum iio_event_direction dir,
 891				      bool state)
 892{
 893	struct hx9023s_data *data = iio_priv(indio_dev);
 894
 895	if (test_bit(chan->channel, &data->chan_in_use)) {
 896		hx9023s_ch_en(data, chan->channel, state);
 897		__assign_bit(chan->channel, &data->chan_event,
 898			     data->ch_data[chan->channel].enable);
 899	}
 900
 901	return 0;
 902}
 903
 904static const struct iio_info hx9023s_info = {
 905	.read_raw = hx9023s_read_raw,
 906	.write_raw = hx9023s_write_raw,
 907	.read_event_value = hx9023s_read_event_val,
 908	.write_event_value = hx9023s_write_event_val,
 909	.read_event_config = hx9023s_read_event_config,
 910	.write_event_config = hx9023s_write_event_config,
 911};
 912
 913static int hx9023s_set_trigger_state(struct iio_trigger *trig, bool state)
 914{
 915	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
 916	struct hx9023s_data *data = iio_priv(indio_dev);
 917
 918	guard(mutex)(&data->mutex);
 919	if (state)
 920		hx9023s_interrupt_enable(data);
 921	else if (!data->chan_read)
 922		hx9023s_interrupt_disable(data);
 923	data->trigger_enabled = state;
 924
 925	return 0;
 926}
 927
 928static const struct iio_trigger_ops hx9023s_trigger_ops = {
 929	.set_trigger_state = hx9023s_set_trigger_state,
 930};
 931
 932static irqreturn_t hx9023s_trigger_handler(int irq, void *private)
 933{
 934	struct iio_poll_func *pf = private;
 935	struct iio_dev *indio_dev = pf->indio_dev;
 936	struct hx9023s_data *data = iio_priv(indio_dev);
 937	struct device *dev = regmap_get_device(data->regmap);
 938	unsigned int bit, index, i = 0;
 939	int ret;
 940
 941	guard(mutex)(&data->mutex);
 942	ret = hx9023s_sample(data);
 943	if (ret) {
 944		dev_warn(dev, "sampling failed\n");
 945		goto out;
 946	}
 947
 948	ret = hx9023s_get_prox_state(data);
 949	if (ret) {
 950		dev_warn(dev, "get prox failed\n");
 951		goto out;
 952	}
 953
 954	iio_for_each_active_channel(indio_dev, bit) {
 955		index = indio_dev->channels[bit].channel;
 956		data->buffer.channels[i++] = cpu_to_le16(data->ch_data[index].diff);
 957	}
 958
 959	iio_push_to_buffers_with_ts(indio_dev, &data->buffer,
 960				    sizeof(data->buffer), pf->timestamp);
 961
 962out:
 963	iio_trigger_notify_done(indio_dev->trig);
 964
 965	return IRQ_HANDLED;
 966}
 967
 968static int hx9023s_buffer_preenable(struct iio_dev *indio_dev)
 969{
 970	struct hx9023s_data *data = iio_priv(indio_dev);
 971	unsigned long channels = 0;
 972	unsigned int bit;
 973
 974	guard(mutex)(&data->mutex);
 975	iio_for_each_active_channel(indio_dev, bit)
 976		__set_bit(indio_dev->channels[bit].channel, &channels);
 977
 978	hx9023s_update_chan_en(data, channels, data->chan_event);
 979
 980	return 0;
 981}
 982
 983static int hx9023s_buffer_postdisable(struct iio_dev *indio_dev)
 984{
 985	struct hx9023s_data *data = iio_priv(indio_dev);
 986
 987	guard(mutex)(&data->mutex);
 988	hx9023s_update_chan_en(data, 0, data->chan_event);
 989
 990	return 0;
 991}
 992
 993static const struct iio_buffer_setup_ops hx9023s_buffer_setup_ops = {
 994	.preenable = hx9023s_buffer_preenable,
 995	.postdisable = hx9023s_buffer_postdisable,
 996};
 997
 998static int hx9023s_id_check(struct iio_dev *indio_dev)
 999{
1000	struct hx9023s_data *data = iio_priv(indio_dev);
1001	struct device *dev = regmap_get_device(data->regmap);
1002	unsigned int id;
1003	int ret;
1004
1005	ret = regmap_read(data->regmap, HX9023S_DEVICE_ID, &id);
1006	if (ret)
1007		return ret;
1008
1009	if (id != HX9023S_CHIP_ID)
1010		dev_warn(dev, "Unexpected chip ID, assuming compatible\n");
1011
1012	return 0;
1013}
1014
1015static int hx9023s_bin_load(struct hx9023s_data *data, struct hx9023s_bin *bin)
1016{
1017	u8 *cfg_start = bin->data + FW_DATA_OFFSET;
1018	u8 addr, val;
1019	u16 i;
1020	int ret;
1021
1022	for (i = 0; i < bin->reg_count; i++) {
1023		addr = cfg_start[i * 2];
1024		val = cfg_start[i * 2 + 1];
1025		ret = regmap_write(data->regmap, addr, val);
1026		if (ret < 0)
1027			return ret;
1028	}
1029
1030	return 0;
1031}
1032
1033static int hx9023s_send_cfg(const struct firmware *fw, struct hx9023s_data *data)
1034{
1035	struct hx9023s_bin *bin __free(kfree) =
1036		kzalloc(fw->size + sizeof(*bin), GFP_KERNEL);
1037	if (!bin)
1038		return -ENOMEM;
1039
1040	bin->fw_size = fw->size;
1041	memcpy(bin->data, fw->data, bin->fw_size);
1042	bin->fw_ver = bin->data[FW_VER_OFFSET];
1043	bin->reg_count = get_unaligned_le16(bin->data + FW_REG_CNT_OFFSET);
1044
1045	release_firmware(fw);
1046
1047	return hx9023s_bin_load(data, bin);
1048}
1049
1050static void hx9023s_cfg_update(const struct firmware *fw, void *context)
1051{
1052	struct hx9023s_data *data = context;
1053	struct device *dev = regmap_get_device(data->regmap);
1054	int ret;
1055
1056	if (!fw || !fw->data) {
1057		dev_warn(dev, "No firmware\n");
1058		goto no_fw;
1059	}
1060
1061	ret = hx9023s_send_cfg(fw, data);
1062	if (ret) {
1063		dev_warn(dev, "Firmware update failed: %d\n", ret);
1064		goto no_fw;
1065	}
1066
1067	ret = regcache_sync(data->regmap);
1068	if (ret)
1069		dev_err(dev, "regcache sync failed\n");
1070
1071	return;
1072
1073no_fw:
1074	ret = regmap_multi_reg_write(data->regmap, hx9023s_reg_init_list,
1075				     ARRAY_SIZE(hx9023s_reg_init_list));
1076	if (ret) {
1077		dev_err(dev, "Error loading default configuration\n");
1078		return;
1079	}
1080
1081	ret = regcache_sync(data->regmap);
1082	if (ret)
1083		dev_err(dev, "regcache sync failed\n");
1084}
1085
1086static int hx9023s_probe(struct i2c_client *client)
1087{
1088	struct device *dev = &client->dev;
1089	struct iio_dev *indio_dev;
1090	struct hx9023s_data *data;
1091	int ret;
1092
1093	indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
1094	if (!indio_dev)
1095		return -ENOMEM;
1096
1097	data = iio_priv(indio_dev);
1098	mutex_init(&data->mutex);
1099
1100	data->regmap = devm_regmap_init_i2c(client, &hx9023s_regmap_config);
1101	if (IS_ERR(data->regmap))
1102		return dev_err_probe(dev, PTR_ERR(data->regmap),
1103				     "regmap init failed\n");
1104
1105	ret = hx9023s_property_get(data);
1106	if (ret)
1107		return dev_err_probe(dev, ret, "dts phase failed\n");
1108
1109	ret = devm_regulator_get_enable(dev, "vdd");
1110	if (ret)
1111		return dev_err_probe(dev, ret, "regulator get failed\n");
1112
1113	ret = hx9023s_id_check(indio_dev);
1114	if (ret)
1115		return dev_err_probe(dev, ret, "id check failed\n");
1116
1117	indio_dev->name = "hx9023s";
1118	indio_dev->channels = hx9023s_channels;
1119	indio_dev->num_channels = ARRAY_SIZE(hx9023s_channels);
1120	indio_dev->info = &hx9023s_info;
1121	indio_dev->modes = INDIO_DIRECT_MODE;
1122	i2c_set_clientdata(client, indio_dev);
1123
1124	ret = hx9023s_ch_cfg(data);
1125	if (ret)
1126		return dev_err_probe(dev, ret, "channel config failed\n");
1127
1128	ret = request_firmware_nowait(THIS_MODULE, true, "hx9023s.bin", dev,
1129				      GFP_KERNEL, data, hx9023s_cfg_update);
1130	if (ret)
1131		return dev_err_probe(dev, ret, "reg config failed\n");
1132
1133	if (client->irq) {
1134		ret = devm_request_threaded_irq(dev, client->irq,
1135						hx9023s_irq_handler,
1136						hx9023s_irq_thread_handler,
1137						IRQF_ONESHOT,
1138						"hx9023s_event", indio_dev);
1139		if (ret)
1140			return dev_err_probe(dev, ret, "irq request failed\n");
1141
1142		data->trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
1143						    indio_dev->name,
1144						    iio_device_id(indio_dev));
1145		if (!data->trig)
1146			return -ENOMEM;
1147
1148		data->trig->ops = &hx9023s_trigger_ops;
1149		iio_trigger_set_drvdata(data->trig, indio_dev);
1150
1151		ret = devm_iio_trigger_register(dev, data->trig);
1152		if (ret)
1153			return dev_err_probe(dev, ret,
1154					     "iio trigger register failed\n");
1155	}
1156
1157	ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
1158					      iio_pollfunc_store_time,
1159					      hx9023s_trigger_handler,
1160					      &hx9023s_buffer_setup_ops);
1161	if (ret)
1162		return dev_err_probe(dev, ret,
1163				"iio triggered buffer setup failed\n");
1164
1165	return devm_iio_device_register(dev, indio_dev);
1166}
1167
1168static int hx9023s_suspend(struct device *dev)
1169{
1170	struct hx9023s_data *data = iio_priv(dev_get_drvdata(dev));
1171
1172	guard(mutex)(&data->mutex);
1173	hx9023s_interrupt_disable(data);
1174
1175	return 0;
1176}
1177
1178static int hx9023s_resume(struct device *dev)
1179{
1180	struct hx9023s_data *data = iio_priv(dev_get_drvdata(dev));
1181
1182	guard(mutex)(&data->mutex);
1183	if (data->trigger_enabled)
1184		hx9023s_interrupt_enable(data);
1185
1186	return 0;
1187}
1188
1189static DEFINE_SIMPLE_DEV_PM_OPS(hx9023s_pm_ops, hx9023s_suspend,
1190				hx9023s_resume);
1191
1192static const struct of_device_id hx9023s_of_match[] = {
1193	{ .compatible = "tyhx,hx9023s" },
1194	{ }
1195};
1196MODULE_DEVICE_TABLE(of, hx9023s_of_match);
1197
1198static const struct i2c_device_id hx9023s_id[] = {
1199	{ "hx9023s" },
1200	{ }
1201};
1202MODULE_DEVICE_TABLE(i2c, hx9023s_id);
1203
1204static struct i2c_driver hx9023s_driver = {
1205	.driver = {
1206		.name = "hx9023s",
1207		.of_match_table = hx9023s_of_match,
1208		.pm = &hx9023s_pm_ops,
1209
1210		/*
1211		 * The I2C operations in hx9023s_reg_init() and hx9023s_ch_cfg()
1212		 * are time-consuming. Prefer async so we don't delay boot
1213		 * if we're builtin to the kernel.
1214		 */
1215		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
1216	},
1217	.probe = hx9023s_probe,
1218	.id_table = hx9023s_id,
1219};
1220module_i2c_driver(hx9023s_driver);
1221
1222MODULE_AUTHOR("Yasin Lee <yasin.lee.x@gmail.com>");
1223MODULE_DESCRIPTION("Driver for TYHX HX9023S SAR sensor");
1224MODULE_LICENSE("GPL");
~/ Read-only file preview.