1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2024 NanjingTianyihexin Electronics Ltd.
4 * http://www.tianyihexin.com
6 * Driver for NanjingTianyihexin HX9023S Cap Sensor.
7 * Datasheet available at:
8 * http://www.tianyihexin.com/ueditor/php/upload/file/20240614/1718336303992081.pdf
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/i2c.h>
18 #include <linux/interrupt.h>
19 #include <linux/irqreturn.h>
20 #include <linux/math64.h>
21 #include <linux/mod_devicetable.h>
22 #include <linux/module.h>
23 #include <linux/mutex.h>
25 #include <linux/property.h>
26 #include <linux/regmap.h>
27 #include <linux/regulator/consumer.h>
28 #include <linux/types.h>
29 #include <linux/units.h>
31 #include <asm/byteorder.h>
32 #include <linux/unaligned.h>
34 #include <linux/iio/buffer.h>
35 #include <linux/iio/events.h>
36 #include <linux/iio/iio.h>
37 #include <linux/iio/trigger.h>
38 #include <linux/iio/triggered_buffer.h>
39 #include <linux/iio/trigger_consumer.h>
40 #include <linux/iio/types.h>
42 #define HX9023S_CHIP_ID 0x1D
43 #define HX9023S_CH_NUM 5
44 #define HX9023S_POS 0x03
45 #define HX9023S_NEG 0x02
46 #define HX9023S_NOT_CONNECTED 16
48 #define HX9023S_GLOBAL_CTRL0 0x00
49 #define HX9023S_PRF_CFG 0x02
50 #define HX9023S_CH0_CFG_7_0 0x03
51 #define HX9023S_CH4_CFG_9_8 0x0C
52 #define HX9023S_RANGE_7_0 0x0D
53 #define HX9023S_RANGE_9_8 0x0E
54 #define HX9023S_RANGE_18_16 0x0F
55 #define HX9023S_AVG0_NOSR0_CFG 0x10
56 #define HX9023S_NOSR12_CFG 0x11
57 #define HX9023S_NOSR34_CFG 0x12
58 #define HX9023S_AVG12_CFG 0x13
59 #define HX9023S_AVG34_CFG 0x14
60 #define HX9023S_OFFSET_DAC0_7_0 0x15
61 #define HX9023S_OFFSET_DAC4_9_8 0x1E
62 #define HX9023S_SAMPLE_NUM_7_0 0x1F
63 #define HX9023S_INTEGRATION_NUM_7_0 0x21
64 #define HX9023S_CH_NUM_CFG 0x24
65 #define HX9023S_LP_ALP_4_CFG 0x29
66 #define HX9023S_LP_ALP_1_0_CFG 0x2A
67 #define HX9023S_LP_ALP_3_2_CFG 0x2B
68 #define HX9023S_UP_ALP_1_0_CFG 0x2C
69 #define HX9023S_UP_ALP_3_2_CFG 0x2D
70 #define HX9023S_DN_UP_ALP_0_4_CFG 0x2E
71 #define HX9023S_DN_ALP_2_1_CFG 0x2F
72 #define HX9023S_DN_ALP_4_3_CFG 0x30
73 #define HX9023S_RAW_BL_RD_CFG 0x38
74 #define HX9023S_INTERRUPT_CFG 0x39
75 #define HX9023S_INTERRUPT_CFG1 0x3A
76 #define HX9023S_CALI_DIFF_CFG 0x3B
77 #define HX9023S_DITHER_CFG 0x3C
78 #define HX9023S_DEVICE_ID 0x60
79 #define HX9023S_PROX_STATUS 0x6B
80 #define HX9023S_PROX_INT_HIGH_CFG 0x6C
81 #define HX9023S_PROX_INT_LOW_CFG 0x6D
82 #define HX9023S_PROX_HIGH_DIFF_CFG_CH0_0 0x80
83 #define HX9023S_PROX_LOW_DIFF_CFG_CH0_0 0x88
84 #define HX9023S_PROX_LOW_DIFF_CFG_CH3_1 0x8F
85 #define HX9023S_PROX_HIGH_DIFF_CFG_CH4_0 0x9E
86 #define HX9023S_PROX_HIGH_DIFF_CFG_CH4_1 0x9F
87 #define HX9023S_PROX_LOW_DIFF_CFG_CH4_0 0xA2
88 #define HX9023S_PROX_LOW_DIFF_CFG_CH4_1 0xA3
89 #define HX9023S_CAP_INI_CH4_0 0xB3
90 #define HX9023S_LP_DIFF_CH4_2 0xBA
91 #define HX9023S_RAW_BL_CH4_0 0xB5
92 #define HX9023S_LP_DIFF_CH4_0 0xB8
93 #define HX9023S_DSP_CONFIG_CTRL1 0xC8
94 #define HX9023S_CAP_INI_CH0_0 0xE0
95 #define HX9023S_RAW_BL_CH0_0 0xE8
96 #define HX9023S_LP_DIFF_CH0_0 0xF4
97 #define HX9023S_LP_DIFF_CH3_2 0xFF
99 #define HX9023S_DATA_LOCK_MASK BIT(4)
100 #define HX9023S_INTERRUPT_MASK GENMASK(9, 0)
101 #define HX9023S_PROX_DEBOUNCE_MASK GENMASK(3, 0)
103 struct hx9023s_ch_data
{
104 s16 raw
; /* Raw Data*/
105 s16 lp
; /* Low Pass Filter Data*/
106 s16 bl
; /* Base Line Data */
107 s16 diff
; /* Difference of Low Pass Data and Base Line Data */
124 struct hx9023s_data
{
125 struct iio_trigger
*trig
;
126 struct regmap
*regmap
;
127 unsigned long chan_prox_stat
;
128 unsigned long chan_read
;
129 unsigned long chan_event
;
130 unsigned long ch_en_stat
;
131 unsigned long chan_in_use
;
132 unsigned int prox_state_reg
;
133 bool trigger_enabled
;
136 __le16 channels
[HX9023S_CH_NUM
];
141 * Serialize access to registers below:
142 * HX9023S_PROX_INT_LOW_CFG,
143 * HX9023S_PROX_INT_HIGH_CFG,
144 * HX9023S_INTERRUPT_CFG,
146 * Serialize access to channel configuration in
147 * hx9023s_push_events and hx9023s_trigger_handler.
150 struct hx9023s_ch_data ch_data
[HX9023S_CH_NUM
];
153 static const struct reg_sequence hx9023s_reg_init_list
[] = {
155 REG_SEQ0(HX9023S_PRF_CFG
, 0x17),
157 /* full scale of conversion phase of each channel */
158 REG_SEQ0(HX9023S_RANGE_7_0
, 0x11),
159 REG_SEQ0(HX9023S_RANGE_9_8
, 0x02),
160 REG_SEQ0(HX9023S_RANGE_18_16
, 0x00),
162 /* ADC average number and OSR number of each channel */
163 REG_SEQ0(HX9023S_AVG0_NOSR0_CFG
, 0x71),
164 REG_SEQ0(HX9023S_NOSR12_CFG
, 0x44),
165 REG_SEQ0(HX9023S_NOSR34_CFG
, 0x00),
166 REG_SEQ0(HX9023S_AVG12_CFG
, 0x33),
167 REG_SEQ0(HX9023S_AVG34_CFG
, 0x00),
169 /* sample & integration frequency of the ADC */
170 REG_SEQ0(HX9023S_SAMPLE_NUM_7_0
, 0x65),
171 REG_SEQ0(HX9023S_INTEGRATION_NUM_7_0
, 0x65),
173 /* coefficient of the first order low pass filter during each channel */
174 REG_SEQ0(HX9023S_LP_ALP_1_0_CFG
, 0x22),
175 REG_SEQ0(HX9023S_LP_ALP_3_2_CFG
, 0x22),
176 REG_SEQ0(HX9023S_LP_ALP_4_CFG
, 0x02),
178 /* up coefficient of the first order low pass filter during each channel */
179 REG_SEQ0(HX9023S_UP_ALP_1_0_CFG
, 0x88),
180 REG_SEQ0(HX9023S_UP_ALP_3_2_CFG
, 0x88),
181 REG_SEQ0(HX9023S_DN_UP_ALP_0_4_CFG
, 0x18),
183 /* down coefficient of the first order low pass filter during each channel */
184 REG_SEQ0(HX9023S_DN_ALP_2_1_CFG
, 0x11),
185 REG_SEQ0(HX9023S_DN_ALP_4_3_CFG
, 0x11),
187 /* selection of data for the Data Mux Register to output data */
188 REG_SEQ0(HX9023S_RAW_BL_RD_CFG
, 0xF0),
190 /* enable the interrupt function */
191 REG_SEQ0(HX9023S_INTERRUPT_CFG
, 0xFF),
192 REG_SEQ0(HX9023S_INTERRUPT_CFG1
, 0x3B),
193 REG_SEQ0(HX9023S_DITHER_CFG
, 0x21),
195 /* threshold of the offset compensation */
196 REG_SEQ0(HX9023S_CALI_DIFF_CFG
, 0x07),
198 /* proximity persistency number(near & far) */
199 REG_SEQ0(HX9023S_PROX_INT_HIGH_CFG
, 0x01),
200 REG_SEQ0(HX9023S_PROX_INT_LOW_CFG
, 0x01),
202 /* disable the data lock */
203 REG_SEQ0(HX9023S_DSP_CONFIG_CTRL1
, 0x00),
206 static const struct iio_event_spec hx9023s_events
[] = {
208 .type
= IIO_EV_TYPE_THRESH
,
209 .dir
= IIO_EV_DIR_RISING
,
210 .mask_shared_by_all
= BIT(IIO_EV_INFO_PERIOD
),
211 .mask_separate
= BIT(IIO_EV_INFO_VALUE
),
214 .type
= IIO_EV_TYPE_THRESH
,
215 .dir
= IIO_EV_DIR_FALLING
,
216 .mask_shared_by_all
= BIT(IIO_EV_INFO_PERIOD
),
217 .mask_separate
= BIT(IIO_EV_INFO_VALUE
),
221 .type
= IIO_EV_TYPE_THRESH
,
222 .dir
= IIO_EV_DIR_EITHER
,
223 .mask_separate
= BIT(IIO_EV_INFO_ENABLE
),
227 #define HX9023S_CHANNEL(idx) \
229 .type = IIO_PROXIMITY, \
230 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
231 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),\
235 .event_spec = hx9023s_events, \
236 .num_event_specs = ARRAY_SIZE(hx9023s_events), \
242 .endianness = IIO_BE, \
246 static const struct iio_chan_spec hx9023s_channels
[] = {
252 IIO_CHAN_SOFT_TIMESTAMP(5),
255 static const unsigned int hx9023s_samp_freq_table
[] = {
256 2, 2, 4, 6, 8, 10, 14, 18, 22, 26,
257 30, 34, 38, 42, 46, 50, 56, 62, 68, 74,
258 80, 90, 100, 200, 300, 400, 600, 800, 1000, 2000,
262 static const struct regmap_range hx9023s_rd_reg_ranges
[] = {
263 regmap_reg_range(HX9023S_GLOBAL_CTRL0
, HX9023S_LP_DIFF_CH3_2
),
266 static const struct regmap_range hx9023s_wr_reg_ranges
[] = {
267 regmap_reg_range(HX9023S_GLOBAL_CTRL0
, HX9023S_LP_DIFF_CH3_2
),
270 static const struct regmap_range hx9023s_volatile_reg_ranges
[] = {
271 regmap_reg_range(HX9023S_CAP_INI_CH4_0
, HX9023S_LP_DIFF_CH4_2
),
272 regmap_reg_range(HX9023S_CAP_INI_CH0_0
, HX9023S_LP_DIFF_CH3_2
),
273 regmap_reg_range(HX9023S_PROX_STATUS
, HX9023S_PROX_STATUS
),
276 static const struct regmap_access_table hx9023s_rd_regs
= {
277 .yes_ranges
= hx9023s_rd_reg_ranges
,
278 .n_yes_ranges
= ARRAY_SIZE(hx9023s_rd_reg_ranges
),
281 static const struct regmap_access_table hx9023s_wr_regs
= {
282 .yes_ranges
= hx9023s_wr_reg_ranges
,
283 .n_yes_ranges
= ARRAY_SIZE(hx9023s_wr_reg_ranges
),
286 static const struct regmap_access_table hx9023s_volatile_regs
= {
287 .yes_ranges
= hx9023s_volatile_reg_ranges
,
288 .n_yes_ranges
= ARRAY_SIZE(hx9023s_volatile_reg_ranges
),
291 static const struct regmap_config hx9023s_regmap_config
= {
294 .cache_type
= REGCACHE_MAPLE
,
295 .rd_table
= &hx9023s_rd_regs
,
296 .wr_table
= &hx9023s_wr_regs
,
297 .volatile_table
= &hx9023s_volatile_regs
,
300 static int hx9023s_interrupt_enable(struct hx9023s_data
*data
)
302 return regmap_update_bits(data
->regmap
, HX9023S_INTERRUPT_CFG
,
303 HX9023S_INTERRUPT_MASK
, HX9023S_INTERRUPT_MASK
);
306 static int hx9023s_interrupt_disable(struct hx9023s_data
*data
)
308 return regmap_update_bits(data
->regmap
, HX9023S_INTERRUPT_CFG
,
309 HX9023S_INTERRUPT_MASK
, 0x00);
312 static int hx9023s_data_lock(struct hx9023s_data
*data
, bool locked
)
315 return regmap_update_bits(data
->regmap
,
316 HX9023S_DSP_CONFIG_CTRL1
,
317 HX9023S_DATA_LOCK_MASK
,
318 HX9023S_DATA_LOCK_MASK
);
320 return regmap_update_bits(data
->regmap
,
321 HX9023S_DSP_CONFIG_CTRL1
,
322 HX9023S_DATA_LOCK_MASK
, 0);
325 static int hx9023s_ch_cfg(struct hx9023s_data
*data
)
327 __le16 reg_list
[HX9023S_CH_NUM
];
328 u8 ch_pos
[HX9023S_CH_NUM
];
329 u8 ch_neg
[HX9023S_CH_NUM
];
330 /* Bit positions corresponding to input pin connections */
331 u8 conn_cs
[HX9023S_CH_NUM
] = { 0, 2, 4, 6, 8 };
335 for (i
= 0; i
< HX9023S_CH_NUM
; i
++) {
336 ch_pos
[i
] = data
->ch_data
[i
].channel_positive
== HX9023S_NOT_CONNECTED
?
337 HX9023S_NOT_CONNECTED
: conn_cs
[data
->ch_data
[i
].channel_positive
];
338 ch_neg
[i
] = data
->ch_data
[i
].channel_negative
== HX9023S_NOT_CONNECTED
?
339 HX9023S_NOT_CONNECTED
: conn_cs
[data
->ch_data
[i
].channel_negative
];
341 reg
= (HX9023S_POS
<< ch_pos
[i
]) | (HX9023S_NEG
<< ch_neg
[i
]);
342 reg_list
[i
] = cpu_to_le16(reg
);
345 return regmap_bulk_write(data
->regmap
, HX9023S_CH0_CFG_7_0
, reg_list
,
349 static int hx9023s_write_far_debounce(struct hx9023s_data
*data
, int val
)
351 guard(mutex
)(&data
->mutex
);
352 return regmap_update_bits(data
->regmap
, HX9023S_PROX_INT_LOW_CFG
,
353 HX9023S_PROX_DEBOUNCE_MASK
,
354 FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK
, val
));
357 static int hx9023s_write_near_debounce(struct hx9023s_data
*data
, int val
)
359 guard(mutex
)(&data
->mutex
);
360 return regmap_update_bits(data
->regmap
, HX9023S_PROX_INT_HIGH_CFG
,
361 HX9023S_PROX_DEBOUNCE_MASK
,
362 FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK
, val
));
365 static int hx9023s_read_far_debounce(struct hx9023s_data
*data
, int *val
)
369 ret
= regmap_read(data
->regmap
, HX9023S_PROX_INT_LOW_CFG
, val
);
373 *val
= FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK
, *val
);
378 static int hx9023s_read_near_debounce(struct hx9023s_data
*data
, int *val
)
382 ret
= regmap_read(data
->regmap
, HX9023S_PROX_INT_HIGH_CFG
, val
);
386 *val
= FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK
, *val
);
391 static int hx9023s_get_thres_near(struct hx9023s_data
*data
, u8 ch
, int *val
)
395 unsigned int reg
, tmp
;
397 reg
= (ch
== 4) ? HX9023S_PROX_HIGH_DIFF_CFG_CH4_0
:
398 HX9023S_PROX_HIGH_DIFF_CFG_CH0_0
+ (ch
* 2);
400 ret
= regmap_bulk_read(data
->regmap
, reg
, &buf
, sizeof(buf
));
404 tmp
= (le16_to_cpu(buf
) & GENMASK(9, 0)) * 32;
405 data
->ch_data
[ch
].thres
.near
= tmp
;
411 static int hx9023s_get_thres_far(struct hx9023s_data
*data
, u8 ch
, int *val
)
415 unsigned int reg
, tmp
;
417 reg
= (ch
== 4) ? HX9023S_PROX_LOW_DIFF_CFG_CH4_0
:
418 HX9023S_PROX_LOW_DIFF_CFG_CH0_0
+ (ch
* 2);
420 ret
= regmap_bulk_read(data
->regmap
, reg
, &buf
, sizeof(buf
));
424 tmp
= (le16_to_cpu(buf
) & GENMASK(9, 0)) * 32;
425 data
->ch_data
[ch
].thres
.far
= tmp
;
431 static int hx9023s_set_thres_near(struct hx9023s_data
*data
, u8 ch
, int val
)
433 __le16 val_le16
= cpu_to_le16((val
/ 32) & GENMASK(9, 0));
436 data
->ch_data
[ch
].thres
.near
= ((val
/ 32) & GENMASK(9, 0)) * 32;
437 reg
= (ch
== 4) ? HX9023S_PROX_HIGH_DIFF_CFG_CH4_0
:
438 HX9023S_PROX_HIGH_DIFF_CFG_CH0_0
+ (ch
* 2);
440 return regmap_bulk_write(data
->regmap
, reg
, &val_le16
, sizeof(val_le16
));
443 static int hx9023s_set_thres_far(struct hx9023s_data
*data
, u8 ch
, int val
)
445 __le16 val_le16
= cpu_to_le16((val
/ 32) & GENMASK(9, 0));
448 data
->ch_data
[ch
].thres
.far
= ((val
/ 32) & GENMASK(9, 0)) * 32;
449 reg
= (ch
== 4) ? HX9023S_PROX_LOW_DIFF_CFG_CH4_0
:
450 HX9023S_PROX_LOW_DIFF_CFG_CH0_0
+ (ch
* 2);
452 return regmap_bulk_write(data
->regmap
, reg
, &val_le16
, sizeof(val_le16
));
455 static int hx9023s_get_prox_state(struct hx9023s_data
*data
)
457 return regmap_read(data
->regmap
, HX9023S_PROX_STATUS
, &data
->prox_state_reg
);
460 static int hx9023s_data_select(struct hx9023s_data
*data
)
466 ret
= regmap_read(data
->regmap
, HX9023S_RAW_BL_RD_CFG
, &buf
);
471 for (i
= 0; i
< 4; i
++) {
472 data
->ch_data
[i
].sel_diff
= test_bit(i
, &tmp
);
473 data
->ch_data
[i
].sel_lp
= !data
->ch_data
[i
].sel_diff
;
474 data
->ch_data
[i
].sel_bl
= test_bit(i
+ 4, &tmp
);
475 data
->ch_data
[i
].sel_raw
= !data
->ch_data
[i
].sel_bl
;
478 ret
= regmap_read(data
->regmap
, HX9023S_INTERRUPT_CFG1
, &buf
);
483 data
->ch_data
[4].sel_diff
= test_bit(2, &tmp
);
484 data
->ch_data
[4].sel_lp
= !data
->ch_data
[4].sel_diff
;
485 data
->ch_data
[4].sel_bl
= test_bit(3, &tmp
);
486 data
->ch_data
[4].sel_raw
= !data
->ch_data
[4].sel_bl
;
491 static int hx9023s_sample(struct hx9023s_data
*data
)
495 u8 buf
[HX9023S_CH_NUM
* 3];
498 ret
= hx9023s_data_lock(data
, true);
502 ret
= hx9023s_data_select(data
);
506 /* 3 bytes for each of channels 0 to 3 which have contiguous registers */
507 ret
= regmap_bulk_read(data
->regmap
, HX9023S_RAW_BL_CH0_0
, buf
, 12);
511 /* 3 bytes for channel 4 */
512 ret
= regmap_bulk_read(data
->regmap
, HX9023S_RAW_BL_CH4_0
, buf
+ 12, 3);
516 for (i
= 0; i
< HX9023S_CH_NUM
; i
++) {
517 value
= get_unaligned_le16(&buf
[i
* 3 + 1]);
518 data
->ch_data
[i
].raw
= 0;
519 data
->ch_data
[i
].bl
= 0;
520 if (data
->ch_data
[i
].sel_raw
)
521 data
->ch_data
[i
].raw
= value
;
522 if (data
->ch_data
[i
].sel_bl
)
523 data
->ch_data
[i
].bl
= value
;
526 /* 3 bytes for each of channels 0 to 3 which have contiguous registers */
527 ret
= regmap_bulk_read(data
->regmap
, HX9023S_LP_DIFF_CH0_0
, buf
, 12);
531 /* 3 bytes for channel 4 */
532 ret
= regmap_bulk_read(data
->regmap
, HX9023S_LP_DIFF_CH4_0
, buf
+ 12, 3);
536 for (i
= 0; i
< HX9023S_CH_NUM
; i
++) {
537 value
= get_unaligned_le16(&buf
[i
* 3 + 1]);
538 data
->ch_data
[i
].lp
= 0;
539 data
->ch_data
[i
].diff
= 0;
540 if (data
->ch_data
[i
].sel_lp
)
541 data
->ch_data
[i
].lp
= value
;
542 if (data
->ch_data
[i
].sel_diff
)
543 data
->ch_data
[i
].diff
= value
;
546 for (i
= 0; i
< HX9023S_CH_NUM
; i
++) {
547 if (data
->ch_data
[i
].sel_lp
&& data
->ch_data
[i
].sel_bl
)
548 data
->ch_data
[i
].diff
= data
->ch_data
[i
].lp
- data
->ch_data
[i
].bl
;
551 /* 2 bytes for each of channels 0 to 4 which have contiguous registers */
552 ret
= regmap_bulk_read(data
->regmap
, HX9023S_OFFSET_DAC0_7_0
, buf
, 10);
556 for (i
= 0; i
< HX9023S_CH_NUM
; i
++) {
557 value
= get_unaligned_le16(&buf
[i
* 2]);
558 value
= FIELD_GET(GENMASK(11, 0), value
);
559 data
->ch_data
[i
].dac
= value
;
563 return hx9023s_data_lock(data
, false);
566 static int hx9023s_ch_en(struct hx9023s_data
*data
, u8 ch_id
, bool en
)
571 ret
= regmap_read(data
->regmap
, HX9023S_CH_NUM_CFG
, &buf
);
575 data
->ch_en_stat
= buf
;
576 if (en
&& data
->ch_en_stat
== 0)
577 data
->prox_state_reg
= 0;
579 data
->ch_data
[ch_id
].enable
= en
;
580 __assign_bit(ch_id
, &data
->ch_en_stat
, en
);
582 return regmap_write(data
->regmap
, HX9023S_CH_NUM_CFG
, data
->ch_en_stat
);
585 static int hx9023s_property_get(struct hx9023s_data
*data
)
587 struct device
*dev
= regmap_get_device(data
->regmap
);
592 data
->chan_in_use
= 0;
593 for (i
= 0; i
< HX9023S_CH_NUM
; i
++) {
594 data
->ch_data
[i
].channel_positive
= HX9023S_NOT_CONNECTED
;
595 data
->ch_data
[i
].channel_negative
= HX9023S_NOT_CONNECTED
;
598 device_for_each_child_node_scoped(dev
, child
) {
599 ret
= fwnode_property_read_u32(child
, "reg", ®
);
600 if (ret
|| reg
>= HX9023S_CH_NUM
)
601 return dev_err_probe(dev
, ret
< 0 ? ret
: -EINVAL
,
602 "Failed to read reg\n");
603 __set_bit(reg
, &data
->chan_in_use
);
605 ret
= fwnode_property_read_u32(child
, "single-channel", &temp
);
607 data
->ch_data
[reg
].channel_positive
= temp
;
608 data
->ch_data
[reg
].channel_negative
= HX9023S_NOT_CONNECTED
;
610 ret
= fwnode_property_read_u32_array(child
, "diff-channels",
611 array
, ARRAY_SIZE(array
));
613 data
->ch_data
[reg
].channel_positive
= array
[0];
614 data
->ch_data
[reg
].channel_negative
= array
[1];
616 return dev_err_probe(dev
, ret
,
617 "Property read failed: %d\n",
626 static int hx9023s_update_chan_en(struct hx9023s_data
*data
,
627 unsigned long chan_read
,
628 unsigned long chan_event
)
631 unsigned long channels
= chan_read
| chan_event
;
633 if ((data
->chan_read
| data
->chan_event
) != channels
) {
634 for_each_set_bit(i
, &channels
, HX9023S_CH_NUM
)
635 hx9023s_ch_en(data
, i
, test_bit(i
, &data
->chan_in_use
));
636 for_each_clear_bit(i
, &channels
, HX9023S_CH_NUM
)
637 hx9023s_ch_en(data
, i
, false);
640 data
->chan_read
= chan_read
;
641 data
->chan_event
= chan_event
;
646 static int hx9023s_get_proximity(struct hx9023s_data
*data
,
647 const struct iio_chan_spec
*chan
,
652 ret
= hx9023s_sample(data
);
656 ret
= hx9023s_get_prox_state(data
);
660 *val
= data
->ch_data
[chan
->channel
].diff
;
664 static int hx9023s_get_samp_freq(struct hx9023s_data
*data
, int *val
, int *val2
)
667 unsigned int odr
, index
;
669 ret
= regmap_read(data
->regmap
, HX9023S_PRF_CFG
, &index
);
673 odr
= hx9023s_samp_freq_table
[index
];
675 *val2
= div_u64((KILO
% odr
) * MICRO
, odr
);
677 return IIO_VAL_INT_PLUS_MICRO
;
680 static int hx9023s_read_raw(struct iio_dev
*indio_dev
,
681 const struct iio_chan_spec
*chan
,
682 int *val
, int *val2
, long mask
)
684 struct hx9023s_data
*data
= iio_priv(indio_dev
);
687 if (chan
->type
!= IIO_PROXIMITY
)
691 case IIO_CHAN_INFO_RAW
:
692 ret
= iio_device_claim_direct_mode(indio_dev
);
696 ret
= hx9023s_get_proximity(data
, chan
, val
);
697 iio_device_release_direct_mode(indio_dev
);
699 case IIO_CHAN_INFO_SAMP_FREQ
:
700 return hx9023s_get_samp_freq(data
, val
, val2
);
706 static int hx9023s_set_samp_freq(struct hx9023s_data
*data
, int val
, int val2
)
708 struct device
*dev
= regmap_get_device(data
->regmap
);
709 unsigned int i
, period_ms
;
711 period_ms
= div_u64(NANO
, (val
* MEGA
+ val2
));
713 for (i
= 0; i
< ARRAY_SIZE(hx9023s_samp_freq_table
); i
++) {
714 if (period_ms
== hx9023s_samp_freq_table
[i
])
717 if (i
== ARRAY_SIZE(hx9023s_samp_freq_table
)) {
718 dev_err(dev
, "Period:%dms NOT found!\n", period_ms
);
722 return regmap_write(data
->regmap
, HX9023S_PRF_CFG
, i
);
725 static int hx9023s_write_raw(struct iio_dev
*indio_dev
,
726 const struct iio_chan_spec
*chan
,
727 int val
, int val2
, long mask
)
729 struct hx9023s_data
*data
= iio_priv(indio_dev
);
731 if (chan
->type
!= IIO_PROXIMITY
)
734 if (mask
!= IIO_CHAN_INFO_SAMP_FREQ
)
737 return hx9023s_set_samp_freq(data
, val
, val2
);
740 static irqreturn_t
hx9023s_irq_handler(int irq
, void *private)
742 struct iio_dev
*indio_dev
= private;
743 struct hx9023s_data
*data
= iio_priv(indio_dev
);
745 if (data
->trigger_enabled
)
746 iio_trigger_poll(data
->trig
);
748 return IRQ_WAKE_THREAD
;
751 static void hx9023s_push_events(struct iio_dev
*indio_dev
)
753 struct hx9023s_data
*data
= iio_priv(indio_dev
);
754 s64 timestamp
= iio_get_time_ns(indio_dev
);
755 unsigned long prox_changed
;
759 ret
= hx9023s_sample(data
);
763 ret
= hx9023s_get_prox_state(data
);
767 prox_changed
= (data
->chan_prox_stat
^ data
->prox_state_reg
) & data
->chan_event
;
768 for_each_set_bit(chan
, &prox_changed
, HX9023S_CH_NUM
) {
771 dir
= (data
->prox_state_reg
& BIT(chan
)) ?
772 IIO_EV_DIR_FALLING
: IIO_EV_DIR_RISING
;
774 iio_push_event(indio_dev
,
775 IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY
, chan
,
776 IIO_EV_TYPE_THRESH
, dir
),
779 data
->chan_prox_stat
= data
->prox_state_reg
;
782 static irqreturn_t
hx9023s_irq_thread_handler(int irq
, void *private)
784 struct iio_dev
*indio_dev
= private;
785 struct hx9023s_data
*data
= iio_priv(indio_dev
);
787 guard(mutex
)(&data
->mutex
);
788 hx9023s_push_events(indio_dev
);
793 static int hx9023s_read_event_val(struct iio_dev
*indio_dev
,
794 const struct iio_chan_spec
*chan
,
795 enum iio_event_type type
,
796 enum iio_event_direction dir
,
797 enum iio_event_info info
, int *val
, int *val2
)
799 struct hx9023s_data
*data
= iio_priv(indio_dev
);
801 if (chan
->type
!= IIO_PROXIMITY
)
805 case IIO_EV_INFO_VALUE
:
807 case IIO_EV_DIR_RISING
:
808 return hx9023s_get_thres_far(data
, chan
->channel
, val
);
809 case IIO_EV_DIR_FALLING
:
810 return hx9023s_get_thres_near(data
, chan
->channel
, val
);
814 case IIO_EV_INFO_PERIOD
:
816 case IIO_EV_DIR_RISING
:
817 return hx9023s_read_far_debounce(data
, val
);
818 case IIO_EV_DIR_FALLING
:
819 return hx9023s_read_near_debounce(data
, val
);
828 static int hx9023s_write_event_val(struct iio_dev
*indio_dev
,
829 const struct iio_chan_spec
*chan
,
830 enum iio_event_type type
,
831 enum iio_event_direction dir
,
832 enum iio_event_info info
, int val
, int val2
)
834 struct hx9023s_data
*data
= iio_priv(indio_dev
);
836 if (chan
->type
!= IIO_PROXIMITY
)
840 case IIO_EV_INFO_VALUE
:
842 case IIO_EV_DIR_RISING
:
843 return hx9023s_set_thres_far(data
, chan
->channel
, val
);
844 case IIO_EV_DIR_FALLING
:
845 return hx9023s_set_thres_near(data
, chan
->channel
, val
);
849 case IIO_EV_INFO_PERIOD
:
851 case IIO_EV_DIR_RISING
:
852 return hx9023s_write_far_debounce(data
, val
);
853 case IIO_EV_DIR_FALLING
:
854 return hx9023s_write_near_debounce(data
, val
);
863 static int hx9023s_read_event_config(struct iio_dev
*indio_dev
,
864 const struct iio_chan_spec
*chan
,
865 enum iio_event_type type
,
866 enum iio_event_direction dir
)
868 struct hx9023s_data
*data
= iio_priv(indio_dev
);
870 return test_bit(chan
->channel
, &data
->chan_event
);
873 static int hx9023s_write_event_config(struct iio_dev
*indio_dev
,
874 const struct iio_chan_spec
*chan
,
875 enum iio_event_type type
,
876 enum iio_event_direction dir
,
879 struct hx9023s_data
*data
= iio_priv(indio_dev
);
881 if (test_bit(chan
->channel
, &data
->chan_in_use
)) {
882 hx9023s_ch_en(data
, chan
->channel
, !!state
);
883 __assign_bit(chan
->channel
, &data
->chan_event
,
884 data
->ch_data
[chan
->channel
].enable
);
890 static const struct iio_info hx9023s_info
= {
891 .read_raw
= hx9023s_read_raw
,
892 .write_raw
= hx9023s_write_raw
,
893 .read_event_value
= hx9023s_read_event_val
,
894 .write_event_value
= hx9023s_write_event_val
,
895 .read_event_config
= hx9023s_read_event_config
,
896 .write_event_config
= hx9023s_write_event_config
,
899 static int hx9023s_set_trigger_state(struct iio_trigger
*trig
, bool state
)
901 struct iio_dev
*indio_dev
= iio_trigger_get_drvdata(trig
);
902 struct hx9023s_data
*data
= iio_priv(indio_dev
);
904 guard(mutex
)(&data
->mutex
);
906 hx9023s_interrupt_enable(data
);
907 else if (!data
->chan_read
)
908 hx9023s_interrupt_disable(data
);
909 data
->trigger_enabled
= state
;
914 static const struct iio_trigger_ops hx9023s_trigger_ops
= {
915 .set_trigger_state
= hx9023s_set_trigger_state
,
918 static irqreturn_t
hx9023s_trigger_handler(int irq
, void *private)
920 struct iio_poll_func
*pf
= private;
921 struct iio_dev
*indio_dev
= pf
->indio_dev
;
922 struct hx9023s_data
*data
= iio_priv(indio_dev
);
923 struct device
*dev
= regmap_get_device(data
->regmap
);
924 unsigned int bit
, index
, i
= 0;
927 guard(mutex
)(&data
->mutex
);
928 ret
= hx9023s_sample(data
);
930 dev_warn(dev
, "sampling failed\n");
934 ret
= hx9023s_get_prox_state(data
);
936 dev_warn(dev
, "get prox failed\n");
940 iio_for_each_active_channel(indio_dev
, bit
) {
941 index
= indio_dev
->channels
[bit
].channel
;
942 data
->buffer
.channels
[i
++] = cpu_to_le16(data
->ch_data
[index
].diff
);
945 iio_push_to_buffers_with_timestamp(indio_dev
, &data
->buffer
,
949 iio_trigger_notify_done(indio_dev
->trig
);
954 static int hx9023s_buffer_preenable(struct iio_dev
*indio_dev
)
956 struct hx9023s_data
*data
= iio_priv(indio_dev
);
957 unsigned long channels
= 0;
960 guard(mutex
)(&data
->mutex
);
961 iio_for_each_active_channel(indio_dev
, bit
)
962 __set_bit(indio_dev
->channels
[bit
].channel
, &channels
);
964 hx9023s_update_chan_en(data
, channels
, data
->chan_event
);
969 static int hx9023s_buffer_postdisable(struct iio_dev
*indio_dev
)
971 struct hx9023s_data
*data
= iio_priv(indio_dev
);
973 guard(mutex
)(&data
->mutex
);
974 hx9023s_update_chan_en(data
, 0, data
->chan_event
);
979 static const struct iio_buffer_setup_ops hx9023s_buffer_setup_ops
= {
980 .preenable
= hx9023s_buffer_preenable
,
981 .postdisable
= hx9023s_buffer_postdisable
,
984 static int hx9023s_id_check(struct iio_dev
*indio_dev
)
986 struct hx9023s_data
*data
= iio_priv(indio_dev
);
987 struct device
*dev
= regmap_get_device(data
->regmap
);
991 ret
= regmap_read(data
->regmap
, HX9023S_DEVICE_ID
, &id
);
995 if (id
!= HX9023S_CHIP_ID
)
996 dev_warn(dev
, "Unexpected chip ID, assuming compatible\n");
1001 static int hx9023s_probe(struct i2c_client
*client
)
1003 struct device
*dev
= &client
->dev
;
1004 struct iio_dev
*indio_dev
;
1005 struct hx9023s_data
*data
;
1008 indio_dev
= devm_iio_device_alloc(dev
, sizeof(*data
));
1012 data
= iio_priv(indio_dev
);
1013 mutex_init(&data
->mutex
);
1015 data
->regmap
= devm_regmap_init_i2c(client
, &hx9023s_regmap_config
);
1016 if (IS_ERR(data
->regmap
))
1017 return dev_err_probe(dev
, PTR_ERR(data
->regmap
),
1018 "regmap init failed\n");
1020 ret
= hx9023s_property_get(data
);
1022 return dev_err_probe(dev
, ret
, "dts phase failed\n");
1024 ret
= devm_regulator_get_enable(dev
, "vdd");
1026 return dev_err_probe(dev
, ret
, "regulator get failed\n");
1028 ret
= hx9023s_id_check(indio_dev
);
1030 return dev_err_probe(dev
, ret
, "id check failed\n");
1032 indio_dev
->name
= "hx9023s";
1033 indio_dev
->channels
= hx9023s_channels
;
1034 indio_dev
->num_channels
= ARRAY_SIZE(hx9023s_channels
);
1035 indio_dev
->info
= &hx9023s_info
;
1036 indio_dev
->modes
= INDIO_DIRECT_MODE
;
1037 i2c_set_clientdata(client
, indio_dev
);
1039 ret
= regmap_multi_reg_write(data
->regmap
, hx9023s_reg_init_list
,
1040 ARRAY_SIZE(hx9023s_reg_init_list
));
1042 return dev_err_probe(dev
, ret
, "device init failed\n");
1044 ret
= hx9023s_ch_cfg(data
);
1046 return dev_err_probe(dev
, ret
, "channel config failed\n");
1048 ret
= regcache_sync(data
->regmap
);
1050 return dev_err_probe(dev
, ret
, "regcache sync failed\n");
1053 ret
= devm_request_threaded_irq(dev
, client
->irq
,
1054 hx9023s_irq_handler
,
1055 hx9023s_irq_thread_handler
,
1057 "hx9023s_event", indio_dev
);
1059 return dev_err_probe(dev
, ret
, "irq request failed\n");
1061 data
->trig
= devm_iio_trigger_alloc(dev
, "%s-dev%d",
1063 iio_device_id(indio_dev
));
1065 return dev_err_probe(dev
, -ENOMEM
,
1066 "iio trigger alloc failed\n");
1068 data
->trig
->ops
= &hx9023s_trigger_ops
;
1069 iio_trigger_set_drvdata(data
->trig
, indio_dev
);
1071 ret
= devm_iio_trigger_register(dev
, data
->trig
);
1073 return dev_err_probe(dev
, ret
,
1074 "iio trigger register failed\n");
1077 ret
= devm_iio_triggered_buffer_setup(dev
, indio_dev
,
1078 iio_pollfunc_store_time
,
1079 hx9023s_trigger_handler
,
1080 &hx9023s_buffer_setup_ops
);
1082 return dev_err_probe(dev
, ret
,
1083 "iio triggered buffer setup failed\n");
1085 return devm_iio_device_register(dev
, indio_dev
);
1088 static int hx9023s_suspend(struct device
*dev
)
1090 struct hx9023s_data
*data
= iio_priv(dev_get_drvdata(dev
));
1092 guard(mutex
)(&data
->mutex
);
1093 hx9023s_interrupt_disable(data
);
1098 static int hx9023s_resume(struct device
*dev
)
1100 struct hx9023s_data
*data
= iio_priv(dev_get_drvdata(dev
));
1102 guard(mutex
)(&data
->mutex
);
1103 if (data
->trigger_enabled
)
1104 hx9023s_interrupt_enable(data
);
1109 static DEFINE_SIMPLE_DEV_PM_OPS(hx9023s_pm_ops
, hx9023s_suspend
,
1112 static const struct of_device_id hx9023s_of_match
[] = {
1113 { .compatible
= "tyhx,hx9023s" },
1116 MODULE_DEVICE_TABLE(of
, hx9023s_of_match
);
1118 static const struct i2c_device_id hx9023s_id
[] = {
1122 MODULE_DEVICE_TABLE(i2c
, hx9023s_id
);
1124 static struct i2c_driver hx9023s_driver
= {
1127 .of_match_table
= hx9023s_of_match
,
1128 .pm
= &hx9023s_pm_ops
,
1131 * The I2C operations in hx9023s_reg_init() and hx9023s_ch_cfg()
1132 * are time-consuming. Prefer async so we don't delay boot
1133 * if we're builtin to the kernel.
1135 .probe_type
= PROBE_PREFER_ASYNCHRONOUS
,
1137 .probe
= hx9023s_probe
,
1138 .id_table
= hx9023s_id
,
1140 module_i2c_driver(hx9023s_driver
);
1142 MODULE_AUTHOR("Yasin Lee <yasin.lee.x@gmail.com>");
1143 MODULE_DESCRIPTION("Driver for TYHX HX9023S SAR sensor");
1144 MODULE_LICENSE("GPL");