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/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> 24 #include <linux/pm.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> 30 31 #include <asm/byteorder.h> 32 #include <asm/unaligned.h> 33 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> 41 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 47 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 98 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) 102 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 */ 108 109 struct { 110 unsigned int near; 111 unsigned int far; 112 } thres; 113 114 u16 dac; 115 u8 channel_positive; 116 u8 channel_negative; 117 bool sel_bl; 118 bool sel_raw; 119 bool sel_diff; 120 bool sel_lp; 121 bool enable; 122 }; 123 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; 134 135 struct { 136 __le16 channels[HX9023S_CH_NUM]; 137 s64 ts __aligned(8); 138 } buffer; 139 140 /* 141 * Serialize access to registers below: 142 * HX9023S_PROX_INT_LOW_CFG, 143 * HX9023S_PROX_INT_HIGH_CFG, 144 * HX9023S_INTERRUPT_CFG, 145 * HX9023S_CH_NUM_CFG 146 * Serialize access to channel configuration in 147 * hx9023s_push_events and hx9023s_trigger_handler. 148 */ 149 struct mutex mutex; 150 struct hx9023s_ch_data ch_data[HX9023S_CH_NUM]; 151 }; 152 153 static const struct reg_sequence hx9023s_reg_init_list[] = { 154 /* scan period */ 155 REG_SEQ0(HX9023S_PRF_CFG, 0x17), 156 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), 161 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), 168 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), 172 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), 177 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), 182 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), 186 187 /* selection of data for the Data Mux Register to output data */ 188 REG_SEQ0(HX9023S_RAW_BL_RD_CFG, 0xF0), 189 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), 194 195 /* threshold of the offset compensation */ 196 REG_SEQ0(HX9023S_CALI_DIFF_CFG, 0x07), 197 198 /* proximity persistency number(near & far) */ 199 REG_SEQ0(HX9023S_PROX_INT_HIGH_CFG, 0x01), 200 REG_SEQ0(HX9023S_PROX_INT_LOW_CFG, 0x01), 201 202 /* disable the data lock */ 203 REG_SEQ0(HX9023S_DSP_CONFIG_CTRL1, 0x00), 204 }; 205 206 static const struct iio_event_spec hx9023s_events[] = { 207 { 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), 212 }, 213 { 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), 218 219 }, 220 { 221 .type = IIO_EV_TYPE_THRESH, 222 .dir = IIO_EV_DIR_EITHER, 223 .mask_separate = BIT(IIO_EV_INFO_ENABLE), 224 }, 225 }; 226 227 #define HX9023S_CHANNEL(idx) \ 228 { \ 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),\ 232 .indexed = 1, \ 233 .channel = idx, \ 234 .address = 0, \ 235 .event_spec = hx9023s_events, \ 236 .num_event_specs = ARRAY_SIZE(hx9023s_events), \ 237 .scan_index = idx, \ 238 .scan_type = { \ 239 .sign = 's', \ 240 .realbits = 16, \ 241 .storagebits = 16, \ 242 .endianness = IIO_BE, \ 243 }, \ 244 } 245 246 static const struct iio_chan_spec hx9023s_channels[] = { 247 HX9023S_CHANNEL(0), 248 HX9023S_CHANNEL(1), 249 HX9023S_CHANNEL(2), 250 HX9023S_CHANNEL(3), 251 HX9023S_CHANNEL(4), 252 IIO_CHAN_SOFT_TIMESTAMP(5), 253 }; 254 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, 259 3000, 4000, 260 }; 261 262 static const struct regmap_range hx9023s_rd_reg_ranges[] = { 263 regmap_reg_range(HX9023S_GLOBAL_CTRL0, HX9023S_LP_DIFF_CH3_2), 264 }; 265 266 static const struct regmap_range hx9023s_wr_reg_ranges[] = { 267 regmap_reg_range(HX9023S_GLOBAL_CTRL0, HX9023S_LP_DIFF_CH3_2), 268 }; 269 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), 274 }; 275 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), 279 }; 280 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), 284 }; 285 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), 289 }; 290 291 static const struct regmap_config hx9023s_regmap_config = { 292 .reg_bits = 8, 293 .val_bits = 8, 294 .cache_type = REGCACHE_MAPLE, 295 .rd_table = &hx9023s_rd_regs, 296 .wr_table = &hx9023s_wr_regs, 297 .volatile_table = &hx9023s_volatile_regs, 298 }; 299 300 static int hx9023s_interrupt_enable(struct hx9023s_data *data) 301 { 302 return regmap_update_bits(data->regmap, HX9023S_INTERRUPT_CFG, 303 HX9023S_INTERRUPT_MASK, HX9023S_INTERRUPT_MASK); 304 } 305 306 static int hx9023s_interrupt_disable(struct hx9023s_data *data) 307 { 308 return regmap_update_bits(data->regmap, HX9023S_INTERRUPT_CFG, 309 HX9023S_INTERRUPT_MASK, 0x00); 310 } 311 312 static int hx9023s_data_lock(struct hx9023s_data *data, bool locked) 313 { 314 if (locked) 315 return regmap_update_bits(data->regmap, 316 HX9023S_DSP_CONFIG_CTRL1, 317 HX9023S_DATA_LOCK_MASK, 318 HX9023S_DATA_LOCK_MASK); 319 else 320 return regmap_update_bits(data->regmap, 321 HX9023S_DSP_CONFIG_CTRL1, 322 HX9023S_DATA_LOCK_MASK, 0); 323 } 324 325 static int hx9023s_ch_cfg(struct hx9023s_data *data) 326 { 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 }; 332 unsigned int i; 333 u16 reg; 334 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]; 340 341 reg = (HX9023S_POS << ch_pos[i]) | (HX9023S_NEG << ch_neg[i]); 342 reg_list[i] = cpu_to_le16(reg); 343 } 344 345 return regmap_bulk_write(data->regmap, HX9023S_CH0_CFG_7_0, reg_list, 346 sizeof(reg_list)); 347 } 348 349 static int hx9023s_write_far_debounce(struct hx9023s_data *data, int val) 350 { 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)); 355 } 356 357 static int hx9023s_write_near_debounce(struct hx9023s_data *data, int val) 358 { 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)); 363 } 364 365 static int hx9023s_read_far_debounce(struct hx9023s_data *data, int *val) 366 { 367 int ret; 368 369 ret = regmap_read(data->regmap, HX9023S_PROX_INT_LOW_CFG, val); 370 if (ret) 371 return ret; 372 373 *val = FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK, *val); 374 375 return IIO_VAL_INT; 376 } 377 378 static int hx9023s_read_near_debounce(struct hx9023s_data *data, int *val) 379 { 380 int ret; 381 382 ret = regmap_read(data->regmap, HX9023S_PROX_INT_HIGH_CFG, val); 383 if (ret) 384 return ret; 385 386 *val = FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK, *val); 387 388 return IIO_VAL_INT; 389 } 390 391 static int hx9023s_get_thres_near(struct hx9023s_data *data, u8 ch, int *val) 392 { 393 int ret; 394 __le16 buf; 395 unsigned int reg, tmp; 396 397 reg = (ch == 4) ? HX9023S_PROX_HIGH_DIFF_CFG_CH4_0 : 398 HX9023S_PROX_HIGH_DIFF_CFG_CH0_0 + (ch * 2); 399 400 ret = regmap_bulk_read(data->regmap, reg, &buf, sizeof(buf)); 401 if (ret) 402 return ret; 403 404 tmp = (le16_to_cpu(buf) & GENMASK(9, 0)) * 32; 405 data->ch_data[ch].thres.near = tmp; 406 *val = tmp; 407 408 return IIO_VAL_INT; 409 } 410 411 static int hx9023s_get_thres_far(struct hx9023s_data *data, u8 ch, int *val) 412 { 413 int ret; 414 __le16 buf; 415 unsigned int reg, tmp; 416 417 reg = (ch == 4) ? HX9023S_PROX_LOW_DIFF_CFG_CH4_0 : 418 HX9023S_PROX_LOW_DIFF_CFG_CH0_0 + (ch * 2); 419 420 ret = regmap_bulk_read(data->regmap, reg, &buf, sizeof(buf)); 421 if (ret) 422 return ret; 423 424 tmp = (le16_to_cpu(buf) & GENMASK(9, 0)) * 32; 425 data->ch_data[ch].thres.far = tmp; 426 *val = tmp; 427 428 return IIO_VAL_INT; 429 } 430 431 static int hx9023s_set_thres_near(struct hx9023s_data *data, u8 ch, int val) 432 { 433 __le16 val_le16 = cpu_to_le16((val / 32) & GENMASK(9, 0)); 434 unsigned int reg; 435 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); 439 440 return regmap_bulk_write(data->regmap, reg, &val_le16, sizeof(val_le16)); 441 } 442 443 static int hx9023s_set_thres_far(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.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); 451 452 return regmap_bulk_write(data->regmap, reg, &val_le16, sizeof(val_le16)); 453 } 454 455 static int hx9023s_get_prox_state(struct hx9023s_data *data) 456 { 457 return regmap_read(data->regmap, HX9023S_PROX_STATUS, &data->prox_state_reg); 458 } 459 460 static int hx9023s_data_select(struct hx9023s_data *data) 461 { 462 int ret; 463 unsigned int i, buf; 464 unsigned long tmp; 465 466 ret = regmap_read(data->regmap, HX9023S_RAW_BL_RD_CFG, &buf); 467 if (ret) 468 return ret; 469 470 tmp = 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; 476 } 477 478 ret = regmap_read(data->regmap, HX9023S_INTERRUPT_CFG1, &buf); 479 if (ret) 480 return ret; 481 482 tmp = 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; 487 488 return 0; 489 } 490 491 static int hx9023s_sample(struct hx9023s_data *data) 492 { 493 int ret; 494 unsigned int i; 495 u8 buf[HX9023S_CH_NUM * 3]; 496 u16 value; 497 498 ret = hx9023s_data_lock(data, true); 499 if (ret) 500 return ret; 501 502 ret = hx9023s_data_select(data); 503 if (ret) 504 goto err; 505 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); 508 if (ret) 509 goto err; 510 511 /* 3 bytes for channel 4 */ 512 ret = regmap_bulk_read(data->regmap, HX9023S_RAW_BL_CH4_0, buf + 12, 3); 513 if (ret) 514 goto err; 515 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; 524 } 525 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); 528 if (ret) 529 goto err; 530 531 /* 3 bytes for channel 4 */ 532 ret = regmap_bulk_read(data->regmap, HX9023S_LP_DIFF_CH4_0, buf + 12, 3); 533 if (ret) 534 goto err; 535 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; 544 } 545 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; 549 } 550 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); 553 if (ret) 554 goto err; 555 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; 560 } 561 562 err: 563 return hx9023s_data_lock(data, false); 564 } 565 566 static int hx9023s_ch_en(struct hx9023s_data *data, u8 ch_id, bool en) 567 { 568 int ret; 569 unsigned int buf; 570 571 ret = regmap_read(data->regmap, HX9023S_CH_NUM_CFG, &buf); 572 if (ret) 573 return ret; 574 575 data->ch_en_stat = buf; 576 if (en && data->ch_en_stat == 0) 577 data->prox_state_reg = 0; 578 579 data->ch_data[ch_id].enable = en; 580 __assign_bit(ch_id, &data->ch_en_stat, en); 581 582 return regmap_write(data->regmap, HX9023S_CH_NUM_CFG, data->ch_en_stat); 583 } 584 585 static int hx9023s_property_get(struct hx9023s_data *data) 586 { 587 struct device *dev = regmap_get_device(data->regmap); 588 u32 array[2]; 589 u32 i, reg, temp; 590 int ret; 591 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; 596 } 597 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); 604 605 ret = fwnode_property_read_u32(child, "single-channel", &temp); 606 if (ret == 0) { 607 data->ch_data[reg].channel_positive = temp; 608 data->ch_data[reg].channel_negative = HX9023S_NOT_CONNECTED; 609 } else { 610 ret = fwnode_property_read_u32_array(child, "diff-channels", 611 array, ARRAY_SIZE(array)); 612 if (ret == 0) { 613 data->ch_data[reg].channel_positive = array[0]; 614 data->ch_data[reg].channel_negative = array[1]; 615 } else { 616 return dev_err_probe(dev, ret, 617 "Property read failed: %d\n", 618 reg); 619 } 620 } 621 } 622 623 return 0; 624 } 625 626 static int hx9023s_update_chan_en(struct hx9023s_data *data, 627 unsigned long chan_read, 628 unsigned long chan_event) 629 { 630 unsigned int i; 631 unsigned long channels = chan_read | chan_event; 632 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); 638 } 639 640 data->chan_read = chan_read; 641 data->chan_event = chan_event; 642 643 return 0; 644 } 645 646 static int hx9023s_get_proximity(struct hx9023s_data *data, 647 const struct iio_chan_spec *chan, 648 int *val) 649 { 650 int ret; 651 652 ret = hx9023s_sample(data); 653 if (ret) 654 return ret; 655 656 ret = hx9023s_get_prox_state(data); 657 if (ret) 658 return ret; 659 660 *val = data->ch_data[chan->channel].diff; 661 return IIO_VAL_INT; 662 } 663 664 static int hx9023s_get_samp_freq(struct hx9023s_data *data, int *val, int *val2) 665 { 666 int ret; 667 unsigned int odr, index; 668 669 ret = regmap_read(data->regmap, HX9023S_PRF_CFG, &index); 670 if (ret) 671 return ret; 672 673 odr = hx9023s_samp_freq_table[index]; 674 *val = KILO / odr; 675 *val2 = div_u64((KILO % odr) * MICRO, odr); 676 677 return IIO_VAL_INT_PLUS_MICRO; 678 } 679 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) 683 { 684 struct hx9023s_data *data = iio_priv(indio_dev); 685 int ret; 686 687 if (chan->type != IIO_PROXIMITY) 688 return -EINVAL; 689 690 switch (mask) { 691 case IIO_CHAN_INFO_RAW: 692 ret = iio_device_claim_direct_mode(indio_dev); 693 if (ret) 694 return ret; 695 696 ret = hx9023s_get_proximity(data, chan, val); 697 iio_device_release_direct_mode(indio_dev); 698 return ret; 699 case IIO_CHAN_INFO_SAMP_FREQ: 700 return hx9023s_get_samp_freq(data, val, val2); 701 default: 702 return -EINVAL; 703 } 704 } 705 706 static int hx9023s_set_samp_freq(struct hx9023s_data *data, int val, int val2) 707 { 708 struct device *dev = regmap_get_device(data->regmap); 709 unsigned int i, period_ms; 710 711 period_ms = div_u64(NANO, (val * MEGA + val2)); 712 713 for (i = 0; i < ARRAY_SIZE(hx9023s_samp_freq_table); i++) { 714 if (period_ms == hx9023s_samp_freq_table[i]) 715 break; 716 } 717 if (i == ARRAY_SIZE(hx9023s_samp_freq_table)) { 718 dev_err(dev, "Period:%dms NOT found!\n", period_ms); 719 return -EINVAL; 720 } 721 722 return regmap_write(data->regmap, HX9023S_PRF_CFG, i); 723 } 724 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) 728 { 729 struct hx9023s_data *data = iio_priv(indio_dev); 730 731 if (chan->type != IIO_PROXIMITY) 732 return -EINVAL; 733 734 if (mask != IIO_CHAN_INFO_SAMP_FREQ) 735 return -EINVAL; 736 737 return hx9023s_set_samp_freq(data, val, val2); 738 } 739 740 static irqreturn_t hx9023s_irq_handler(int irq, void *private) 741 { 742 struct iio_dev *indio_dev = private; 743 struct hx9023s_data *data = iio_priv(indio_dev); 744 745 if (data->trigger_enabled) 746 iio_trigger_poll(data->trig); 747 748 return IRQ_WAKE_THREAD; 749 } 750 751 static void hx9023s_push_events(struct iio_dev *indio_dev) 752 { 753 struct hx9023s_data *data = iio_priv(indio_dev); 754 s64 timestamp = iio_get_time_ns(indio_dev); 755 unsigned long prox_changed; 756 unsigned int chan; 757 int ret; 758 759 ret = hx9023s_sample(data); 760 if (ret) 761 return; 762 763 ret = hx9023s_get_prox_state(data); 764 if (ret) 765 return; 766 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) { 769 unsigned int dir; 770 771 dir = (data->prox_state_reg & BIT(chan)) ? 772 IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING; 773 774 iio_push_event(indio_dev, 775 IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, chan, 776 IIO_EV_TYPE_THRESH, dir), 777 timestamp); 778 } 779 data->chan_prox_stat = data->prox_state_reg; 780 } 781 782 static irqreturn_t hx9023s_irq_thread_handler(int irq, void *private) 783 { 784 struct iio_dev *indio_dev = private; 785 struct hx9023s_data *data = iio_priv(indio_dev); 786 787 guard(mutex)(&data->mutex); 788 hx9023s_push_events(indio_dev); 789 790 return IRQ_HANDLED; 791 } 792 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) 798 { 799 struct hx9023s_data *data = iio_priv(indio_dev); 800 801 if (chan->type != IIO_PROXIMITY) 802 return -EINVAL; 803 804 switch (info) { 805 case IIO_EV_INFO_VALUE: 806 switch (dir) { 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); 811 default: 812 return -EINVAL; 813 } 814 case IIO_EV_INFO_PERIOD: 815 switch (dir) { 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); 820 default: 821 return -EINVAL; 822 } 823 default: 824 return -EINVAL; 825 } 826 } 827 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) 833 { 834 struct hx9023s_data *data = iio_priv(indio_dev); 835 836 if (chan->type != IIO_PROXIMITY) 837 return -EINVAL; 838 839 switch (info) { 840 case IIO_EV_INFO_VALUE: 841 switch (dir) { 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); 846 default: 847 return -EINVAL; 848 } 849 case IIO_EV_INFO_PERIOD: 850 switch (dir) { 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); 855 default: 856 return -EINVAL; 857 } 858 default: 859 return -EINVAL; 860 } 861 } 862 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) 867 { 868 struct hx9023s_data *data = iio_priv(indio_dev); 869 870 return test_bit(chan->channel, &data->chan_event); 871 } 872 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, 877 int state) 878 { 879 struct hx9023s_data *data = iio_priv(indio_dev); 880 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); 885 } 886 887 return 0; 888 } 889 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, 897 }; 898 899 static int hx9023s_set_trigger_state(struct iio_trigger *trig, bool state) 900 { 901 struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); 902 struct hx9023s_data *data = iio_priv(indio_dev); 903 904 guard(mutex)(&data->mutex); 905 if (state) 906 hx9023s_interrupt_enable(data); 907 else if (!data->chan_read) 908 hx9023s_interrupt_disable(data); 909 data->trigger_enabled = state; 910 911 return 0; 912 } 913 914 static const struct iio_trigger_ops hx9023s_trigger_ops = { 915 .set_trigger_state = hx9023s_set_trigger_state, 916 }; 917 918 static irqreturn_t hx9023s_trigger_handler(int irq, void *private) 919 { 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; 925 int ret; 926 927 guard(mutex)(&data->mutex); 928 ret = hx9023s_sample(data); 929 if (ret) { 930 dev_warn(dev, "sampling failed\n"); 931 goto out; 932 } 933 934 ret = hx9023s_get_prox_state(data); 935 if (ret) { 936 dev_warn(dev, "get prox failed\n"); 937 goto out; 938 } 939 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); 943 } 944 945 iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, 946 pf->timestamp); 947 948 out: 949 iio_trigger_notify_done(indio_dev->trig); 950 951 return IRQ_HANDLED; 952 } 953 954 static int hx9023s_buffer_preenable(struct iio_dev *indio_dev) 955 { 956 struct hx9023s_data *data = iio_priv(indio_dev); 957 unsigned long channels = 0; 958 unsigned int bit; 959 960 guard(mutex)(&data->mutex); 961 iio_for_each_active_channel(indio_dev, bit) 962 __set_bit(indio_dev->channels[bit].channel, &channels); 963 964 hx9023s_update_chan_en(data, channels, data->chan_event); 965 966 return 0; 967 } 968 969 static int hx9023s_buffer_postdisable(struct iio_dev *indio_dev) 970 { 971 struct hx9023s_data *data = iio_priv(indio_dev); 972 973 guard(mutex)(&data->mutex); 974 hx9023s_update_chan_en(data, 0, data->chan_event); 975 976 return 0; 977 } 978 979 static const struct iio_buffer_setup_ops hx9023s_buffer_setup_ops = { 980 .preenable = hx9023s_buffer_preenable, 981 .postdisable = hx9023s_buffer_postdisable, 982 }; 983 984 static int hx9023s_id_check(struct iio_dev *indio_dev) 985 { 986 struct hx9023s_data *data = iio_priv(indio_dev); 987 struct device *dev = regmap_get_device(data->regmap); 988 unsigned int id; 989 int ret; 990 991 ret = regmap_read(data->regmap, HX9023S_DEVICE_ID, &id); 992 if (ret) 993 return ret; 994 995 if (id != HX9023S_CHIP_ID) 996 dev_warn(dev, "Unexpected chip ID, assuming compatible\n"); 997 998 return 0; 999 } 1000 1001 static int hx9023s_probe(struct i2c_client *client) 1002 { 1003 struct device *dev = &client->dev; 1004 struct iio_dev *indio_dev; 1005 struct hx9023s_data *data; 1006 int ret; 1007 1008 indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); 1009 if (!indio_dev) 1010 return -ENOMEM; 1011 1012 data = iio_priv(indio_dev); 1013 mutex_init(&data->mutex); 1014 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"); 1019 1020 ret = hx9023s_property_get(data); 1021 if (ret) 1022 return dev_err_probe(dev, ret, "dts phase failed\n"); 1023 1024 ret = devm_regulator_get_enable(dev, "vdd"); 1025 if (ret) 1026 return dev_err_probe(dev, ret, "regulator get failed\n"); 1027 1028 ret = hx9023s_id_check(indio_dev); 1029 if (ret) 1030 return dev_err_probe(dev, ret, "id check failed\n"); 1031 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); 1038 1039 ret = regmap_multi_reg_write(data->regmap, hx9023s_reg_init_list, 1040 ARRAY_SIZE(hx9023s_reg_init_list)); 1041 if (ret) 1042 return dev_err_probe(dev, ret, "device init failed\n"); 1043 1044 ret = hx9023s_ch_cfg(data); 1045 if (ret) 1046 return dev_err_probe(dev, ret, "channel config failed\n"); 1047 1048 ret = regcache_sync(data->regmap); 1049 if (ret) 1050 return dev_err_probe(dev, ret, "regcache sync failed\n"); 1051 1052 if (client->irq) { 1053 ret = devm_request_threaded_irq(dev, client->irq, 1054 hx9023s_irq_handler, 1055 hx9023s_irq_thread_handler, 1056 IRQF_ONESHOT, 1057 "hx9023s_event", indio_dev); 1058 if (ret) 1059 return dev_err_probe(dev, ret, "irq request failed\n"); 1060 1061 data->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", 1062 indio_dev->name, 1063 iio_device_id(indio_dev)); 1064 if (!data->trig) 1065 return dev_err_probe(dev, -ENOMEM, 1066 "iio trigger alloc failed\n"); 1067 1068 data->trig->ops = &hx9023s_trigger_ops; 1069 iio_trigger_set_drvdata(data->trig, indio_dev); 1070 1071 ret = devm_iio_trigger_register(dev, data->trig); 1072 if (ret) 1073 return dev_err_probe(dev, ret, 1074 "iio trigger register failed\n"); 1075 } 1076 1077 ret = devm_iio_triggered_buffer_setup(dev, indio_dev, 1078 iio_pollfunc_store_time, 1079 hx9023s_trigger_handler, 1080 &hx9023s_buffer_setup_ops); 1081 if (ret) 1082 return dev_err_probe(dev, ret, 1083 "iio triggered buffer setup failed\n"); 1084 1085 return devm_iio_device_register(dev, indio_dev); 1086 } 1087 1088 static int hx9023s_suspend(struct device *dev) 1089 { 1090 struct hx9023s_data *data = iio_priv(dev_get_drvdata(dev)); 1091 1092 guard(mutex)(&data->mutex); 1093 hx9023s_interrupt_disable(data); 1094 1095 return 0; 1096 } 1097 1098 static int hx9023s_resume(struct device *dev) 1099 { 1100 struct hx9023s_data *data = iio_priv(dev_get_drvdata(dev)); 1101 1102 guard(mutex)(&data->mutex); 1103 if (data->trigger_enabled) 1104 hx9023s_interrupt_enable(data); 1105 1106 return 0; 1107 } 1108 1109 static DEFINE_SIMPLE_DEV_PM_OPS(hx9023s_pm_ops, hx9023s_suspend, 1110 hx9023s_resume); 1111 1112 static const struct of_device_id hx9023s_of_match[] = { 1113 { .compatible = "tyhx,hx9023s" }, 1114 {} 1115 }; 1116 MODULE_DEVICE_TABLE(of, hx9023s_of_match); 1117 1118 static const struct i2c_device_id hx9023s_id[] = { 1119 { "hx9023s" }, 1120 {} 1121 }; 1122 MODULE_DEVICE_TABLE(i2c, hx9023s_id); 1123 1124 static struct i2c_driver hx9023s_driver = { 1125 .driver = { 1126 .name = "hx9023s", 1127 .of_match_table = hx9023s_of_match, 1128 .pm = &hx9023s_pm_ops, 1129 1130 /* 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. 1134 */ 1135 .probe_type = PROBE_PREFER_ASYNCHRONOUS, 1136 }, 1137 .probe = hx9023s_probe, 1138 .id_table = hx9023s_id, 1139 }; 1140 module_i2c_driver(hx9023s_driver); 1141 1142 MODULE_AUTHOR("Yasin Lee <yasin.lee.x@gmail.com>"); 1143 MODULE_DESCRIPTION("Driver for TYHX HX9023S SAR sensor"); 1144 MODULE_LICENSE("GPL"); 1145