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 108 struct hx9023s_bin { 109 u16 reg_count; 110 u16 fw_size; 111 u8 fw_ver; 112 u8 data[] __counted_by(fw_size); 113 }; 114 115 struct 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 136 struct 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 165 static 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 218 static 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 258 static 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 267 static 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 274 static const struct regmap_range hx9023s_rd_reg_ranges[] = { 275 regmap_reg_range(HX9023S_GLOBAL_CTRL0, HX9023S_LP_DIFF_CH3_2), 276 }; 277 278 static const struct regmap_range hx9023s_wr_reg_ranges[] = { 279 regmap_reg_range(HX9023S_GLOBAL_CTRL0, HX9023S_LP_DIFF_CH3_2), 280 }; 281 282 static 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 288 static 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 293 static 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 298 static 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 303 static 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 312 static 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 318 static 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 324 static 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 337 static 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 361 static 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 369 static 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 377 static 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 390 static 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 403 static 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 423 static 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 443 static 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 455 static 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 467 static 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 472 static 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 503 static 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 574 err: 575 return hx9023s_data_lock(data, false); 576 } 577 578 static 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 597 static 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", ®); 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 638 static 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 658 static 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 676 static 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 692 static 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 717 static 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 739 static 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 754 static 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 765 static 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 796 static 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 807 static 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 842 static 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 877 static 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 887 static 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 904 static 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 913 static 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 928 static const struct iio_trigger_ops hx9023s_trigger_ops = { 929 .set_trigger_state = hx9023s_set_trigger_state, 930 }; 931 932 static 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 962 out: 963 iio_trigger_notify_done(indio_dev->trig); 964 965 return IRQ_HANDLED; 966 } 967 968 static 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 983 static 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 993 static const struct iio_buffer_setup_ops hx9023s_buffer_setup_ops = { 994 .preenable = hx9023s_buffer_preenable, 995 .postdisable = hx9023s_buffer_postdisable, 996 }; 997 998 static 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 1015 static 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 1033 static 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 1050 static 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 1073 no_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 1086 static 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 1168 static 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 1178 static 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 1189 static DEFINE_SIMPLE_DEV_PM_OPS(hx9023s_pm_ops, hx9023s_suspend, 1190 hx9023s_resume); 1191 1192 static const struct of_device_id hx9023s_of_match[] = { 1193 { .compatible = "tyhx,hx9023s" }, 1194 { } 1195 }; 1196 MODULE_DEVICE_TABLE(of, hx9023s_of_match); 1197 1198 static const struct i2c_device_id hx9023s_id[] = { 1199 { "hx9023s" }, 1200 { } 1201 }; 1202 MODULE_DEVICE_TABLE(i2c, hx9023s_id); 1203 1204 static 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 }; 1220 module_i2c_driver(hx9023s_driver); 1221 1222 MODULE_AUTHOR("Yasin Lee <yasin.lee.x@gmail.com>"); 1223 MODULE_DESCRIPTION("Driver for TYHX HX9023S SAR sensor"); 1224 MODULE_LICENSE("GPL"); 1225