1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright 2021 Google LLC. 4 * 5 * Common part of most Semtech SAR sensor. 6 */ 7 8 #include <linux/acpi.h> 9 #include <linux/bitops.h> 10 #include <linux/byteorder/generic.h> 11 #include <linux/delay.h> 12 #include <linux/device.h> 13 #include <linux/err.h> 14 #include <linux/export.h> 15 #include <linux/interrupt.h> 16 #include <linux/irqreturn.h> 17 #include <linux/i2c.h> 18 #include <linux/kernel.h> 19 #include <linux/module.h> 20 #include <linux/regmap.h> 21 #include <linux/regulator/consumer.h> 22 #include <vdso/bits.h> 23 24 #include <linux/iio/buffer.h> 25 #include <linux/iio/events.h> 26 #include <linux/iio/iio.h> 27 #include <linux/iio/trigger.h> 28 #include <linux/iio/triggered_buffer.h> 29 #include <linux/iio/trigger_consumer.h> 30 31 #include "sx_common.h" 32 33 /* All Semtech SAR sensors have IRQ bit in the same order. */ 34 #define SX_COMMON_CONVDONE_IRQ BIT(0) 35 #define SX_COMMON_FAR_IRQ BIT(2) 36 #define SX_COMMON_CLOSE_IRQ BIT(3) 37 38 const struct iio_event_spec sx_common_events[3] = { 39 { 40 .type = IIO_EV_TYPE_THRESH, 41 .dir = IIO_EV_DIR_RISING, 42 .mask_shared_by_all = BIT(IIO_EV_INFO_PERIOD), 43 }, 44 { 45 .type = IIO_EV_TYPE_THRESH, 46 .dir = IIO_EV_DIR_FALLING, 47 .mask_shared_by_all = BIT(IIO_EV_INFO_PERIOD), 48 }, 49 { 50 .type = IIO_EV_TYPE_THRESH, 51 .dir = IIO_EV_DIR_EITHER, 52 .mask_separate = BIT(IIO_EV_INFO_ENABLE) | 53 BIT(IIO_EV_INFO_HYSTERESIS) | 54 BIT(IIO_EV_INFO_VALUE), 55 }, 56 }; 57 EXPORT_SYMBOL_NS_GPL(sx_common_events, SEMTECH_PROX); 58 59 static irqreturn_t sx_common_irq_handler(int irq, void *private) 60 { 61 struct iio_dev *indio_dev = private; 62 struct sx_common_data *data = iio_priv(indio_dev); 63 64 if (data->trigger_enabled) 65 iio_trigger_poll(data->trig); 66 67 /* 68 * Even if no event is enabled, we need to wake the thread to clear the 69 * interrupt state by reading SX_COMMON_REG_IRQ_SRC. 70 * It is not possible to do that here because regmap_read takes a mutex. 71 */ 72 return IRQ_WAKE_THREAD; 73 } 74 75 static void sx_common_push_events(struct iio_dev *indio_dev) 76 { 77 int ret; 78 unsigned int val, chan; 79 struct sx_common_data *data = iio_priv(indio_dev); 80 s64 timestamp = iio_get_time_ns(indio_dev); 81 unsigned long prox_changed; 82 83 /* Read proximity state on all channels */ 84 ret = regmap_read(data->regmap, data->chip_info->reg_stat, &val); 85 if (ret) { 86 dev_err(&data->client->dev, "i2c transfer error in irq\n"); 87 return; 88 } 89 90 val >>= data->chip_info->stat_offset; 91 92 /* 93 * Only iterate over channels with changes on proximity status that have 94 * events enabled. 95 */ 96 prox_changed = (data->chan_prox_stat ^ val) & data->chan_event; 97 98 for_each_set_bit(chan, &prox_changed, data->chip_info->num_channels) { 99 int dir; 100 u64 ev; 101 102 dir = (val & BIT(chan)) ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING; 103 ev = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, chan, 104 IIO_EV_TYPE_THRESH, dir); 105 106 iio_push_event(indio_dev, ev, timestamp); 107 } 108 data->chan_prox_stat = val; 109 } 110 111 static int sx_common_enable_irq(struct sx_common_data *data, unsigned int irq) 112 { 113 if (!data->client->irq) 114 return 0; 115 return regmap_update_bits(data->regmap, data->chip_info->reg_irq_msk, 116 irq << data->chip_info->irq_msk_offset, 117 irq << data->chip_info->irq_msk_offset); 118 } 119 120 static int sx_common_disable_irq(struct sx_common_data *data, unsigned int irq) 121 { 122 if (!data->client->irq) 123 return 0; 124 return regmap_update_bits(data->regmap, data->chip_info->reg_irq_msk, 125 irq << data->chip_info->irq_msk_offset, 0); 126 } 127 128 static int sx_common_update_chan_en(struct sx_common_data *data, 129 unsigned long chan_read, 130 unsigned long chan_event) 131 { 132 int ret; 133 unsigned long channels = chan_read | chan_event; 134 135 if ((data->chan_read | data->chan_event) != channels) { 136 ret = regmap_update_bits(data->regmap, 137 data->chip_info->reg_enable_chan, 138 data->chip_info->mask_enable_chan, 139 channels); 140 if (ret) 141 return ret; 142 } 143 data->chan_read = chan_read; 144 data->chan_event = chan_event; 145 return 0; 146 } 147 148 static int sx_common_get_read_channel(struct sx_common_data *data, int channel) 149 { 150 return sx_common_update_chan_en(data, data->chan_read | BIT(channel), 151 data->chan_event); 152 } 153 154 static int sx_common_put_read_channel(struct sx_common_data *data, int channel) 155 { 156 return sx_common_update_chan_en(data, data->chan_read & ~BIT(channel), 157 data->chan_event); 158 } 159 160 static int sx_common_get_event_channel(struct sx_common_data *data, int channel) 161 { 162 return sx_common_update_chan_en(data, data->chan_read, 163 data->chan_event | BIT(channel)); 164 } 165 166 static int sx_common_put_event_channel(struct sx_common_data *data, int channel) 167 { 168 return sx_common_update_chan_en(data, data->chan_read, 169 data->chan_event & ~BIT(channel)); 170 } 171 172 /** 173 * sx_common_read_proximity() - Read raw proximity value. 174 * @data: Internal data 175 * @chan: Channel to read 176 * @val: pointer to return read value. 177 * 178 * Request a conversion, wait for the sensor to be ready and 179 * return the raw proximity value. 180 */ 181 int sx_common_read_proximity(struct sx_common_data *data, 182 const struct iio_chan_spec *chan, int *val) 183 { 184 int ret; 185 __be16 rawval; 186 187 mutex_lock(&data->mutex); 188 189 ret = sx_common_get_read_channel(data, chan->channel); 190 if (ret) 191 goto out; 192 193 ret = sx_common_enable_irq(data, SX_COMMON_CONVDONE_IRQ); 194 if (ret) 195 goto out_put_channel; 196 197 mutex_unlock(&data->mutex); 198 199 if (data->client->irq) { 200 ret = wait_for_completion_interruptible(&data->completion); 201 reinit_completion(&data->completion); 202 } else { 203 ret = data->chip_info->ops.wait_for_sample(data); 204 } 205 206 mutex_lock(&data->mutex); 207 208 if (ret) 209 goto out_disable_irq; 210 211 ret = data->chip_info->ops.read_prox_data(data, chan, &rawval); 212 if (ret) 213 goto out_disable_irq; 214 215 *val = sign_extend32(be16_to_cpu(rawval), chan->scan_type.realbits - 1); 216 217 ret = sx_common_disable_irq(data, SX_COMMON_CONVDONE_IRQ); 218 if (ret) 219 goto out_put_channel; 220 221 ret = sx_common_put_read_channel(data, chan->channel); 222 if (ret) 223 goto out; 224 225 mutex_unlock(&data->mutex); 226 227 return IIO_VAL_INT; 228 229 out_disable_irq: 230 sx_common_disable_irq(data, SX_COMMON_CONVDONE_IRQ); 231 out_put_channel: 232 sx_common_put_read_channel(data, chan->channel); 233 out: 234 mutex_unlock(&data->mutex); 235 236 return ret; 237 } 238 EXPORT_SYMBOL_NS_GPL(sx_common_read_proximity, SEMTECH_PROX); 239 240 /** 241 * sx_common_read_event_config() - Configure event setting. 242 * @indio_dev: iio device object 243 * @chan: Channel to read 244 * @type: Type of event (unused) 245 * @dir: Direction of event (unused) 246 * 247 * return if the given channel is used for event gathering. 248 */ 249 int sx_common_read_event_config(struct iio_dev *indio_dev, 250 const struct iio_chan_spec *chan, 251 enum iio_event_type type, 252 enum iio_event_direction dir) 253 { 254 struct sx_common_data *data = iio_priv(indio_dev); 255 256 return !!(data->chan_event & BIT(chan->channel)); 257 } 258 EXPORT_SYMBOL_NS_GPL(sx_common_read_event_config, SEMTECH_PROX); 259 260 /** 261 * sx_common_write_event_config() - Configure event setting. 262 * @indio_dev: iio device object 263 * @chan: Channel to enable 264 * @type: Type of event (unused) 265 * @dir: Direction of event (unused) 266 * @state: State of the event. 267 * 268 * Enable/Disable event on a given channel. 269 */ 270 int sx_common_write_event_config(struct iio_dev *indio_dev, 271 const struct iio_chan_spec *chan, 272 enum iio_event_type type, 273 enum iio_event_direction dir, int state) 274 { 275 struct sx_common_data *data = iio_priv(indio_dev); 276 unsigned int eventirq = SX_COMMON_FAR_IRQ | SX_COMMON_CLOSE_IRQ; 277 int ret; 278 279 /* If the state hasn't changed, there's nothing to do. */ 280 if (!!(data->chan_event & BIT(chan->channel)) == state) 281 return 0; 282 283 mutex_lock(&data->mutex); 284 if (state) { 285 ret = sx_common_get_event_channel(data, chan->channel); 286 if (ret) 287 goto out_unlock; 288 if (!(data->chan_event & ~BIT(chan->channel))) { 289 ret = sx_common_enable_irq(data, eventirq); 290 if (ret) 291 sx_common_put_event_channel(data, chan->channel); 292 } 293 } else { 294 ret = sx_common_put_event_channel(data, chan->channel); 295 if (ret) 296 goto out_unlock; 297 if (!data->chan_event) { 298 ret = sx_common_disable_irq(data, eventirq); 299 if (ret) 300 sx_common_get_event_channel(data, chan->channel); 301 } 302 } 303 304 out_unlock: 305 mutex_unlock(&data->mutex); 306 return ret; 307 } 308 EXPORT_SYMBOL_NS_GPL(sx_common_write_event_config, SEMTECH_PROX); 309 310 static int sx_common_set_trigger_state(struct iio_trigger *trig, bool state) 311 { 312 struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); 313 struct sx_common_data *data = iio_priv(indio_dev); 314 int ret = 0; 315 316 mutex_lock(&data->mutex); 317 318 if (state) 319 ret = sx_common_enable_irq(data, SX_COMMON_CONVDONE_IRQ); 320 else if (!data->chan_read) 321 ret = sx_common_disable_irq(data, SX_COMMON_CONVDONE_IRQ); 322 if (ret) 323 goto out; 324 325 data->trigger_enabled = state; 326 327 out: 328 mutex_unlock(&data->mutex); 329 330 return ret; 331 } 332 333 static const struct iio_trigger_ops sx_common_trigger_ops = { 334 .set_trigger_state = sx_common_set_trigger_state, 335 }; 336 337 static irqreturn_t sx_common_irq_thread_handler(int irq, void *private) 338 { 339 struct iio_dev *indio_dev = private; 340 struct sx_common_data *data = iio_priv(indio_dev); 341 int ret; 342 unsigned int val; 343 344 mutex_lock(&data->mutex); 345 346 ret = regmap_read(data->regmap, SX_COMMON_REG_IRQ_SRC, &val); 347 if (ret) { 348 dev_err(&data->client->dev, "i2c transfer error in irq\n"); 349 goto out; 350 } 351 352 if (val & ((SX_COMMON_FAR_IRQ | SX_COMMON_CLOSE_IRQ) << data->chip_info->irq_msk_offset)) 353 sx_common_push_events(indio_dev); 354 355 if (val & (SX_COMMON_CONVDONE_IRQ << data->chip_info->irq_msk_offset)) 356 complete(&data->completion); 357 358 out: 359 mutex_unlock(&data->mutex); 360 361 return IRQ_HANDLED; 362 } 363 364 static irqreturn_t sx_common_trigger_handler(int irq, void *private) 365 { 366 struct iio_poll_func *pf = private; 367 struct iio_dev *indio_dev = pf->indio_dev; 368 struct sx_common_data *data = iio_priv(indio_dev); 369 __be16 val; 370 int bit, ret, i = 0; 371 372 mutex_lock(&data->mutex); 373 374 for_each_set_bit(bit, indio_dev->active_scan_mask, 375 indio_dev->masklength) { 376 ret = data->chip_info->ops.read_prox_data(data, 377 &indio_dev->channels[bit], 378 &val); 379 if (ret) 380 goto out; 381 382 data->buffer.channels[i++] = val; 383 } 384 385 iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, 386 pf->timestamp); 387 388 out: 389 mutex_unlock(&data->mutex); 390 391 iio_trigger_notify_done(indio_dev->trig); 392 393 return IRQ_HANDLED; 394 } 395 396 static int sx_common_buffer_preenable(struct iio_dev *indio_dev) 397 { 398 struct sx_common_data *data = iio_priv(indio_dev); 399 unsigned long channels = 0; 400 int bit, ret; 401 402 mutex_lock(&data->mutex); 403 for_each_set_bit(bit, indio_dev->active_scan_mask, 404 indio_dev->masklength) 405 __set_bit(indio_dev->channels[bit].channel, &channels); 406 407 ret = sx_common_update_chan_en(data, channels, data->chan_event); 408 mutex_unlock(&data->mutex); 409 return ret; 410 } 411 412 static int sx_common_buffer_postdisable(struct iio_dev *indio_dev) 413 { 414 struct sx_common_data *data = iio_priv(indio_dev); 415 int ret; 416 417 mutex_lock(&data->mutex); 418 ret = sx_common_update_chan_en(data, 0, data->chan_event); 419 mutex_unlock(&data->mutex); 420 return ret; 421 } 422 423 static const struct iio_buffer_setup_ops sx_common_buffer_setup_ops = { 424 .preenable = sx_common_buffer_preenable, 425 .postdisable = sx_common_buffer_postdisable, 426 }; 427 428 static void sx_common_regulator_disable(void *_data) 429 { 430 struct sx_common_data *data = _data; 431 432 regulator_bulk_disable(ARRAY_SIZE(data->supplies), data->supplies); 433 } 434 435 #define SX_COMMON_SOFT_RESET 0xde 436 437 static int sx_common_init_device(struct iio_dev *indio_dev) 438 { 439 struct sx_common_data *data = iio_priv(indio_dev); 440 struct sx_common_reg_default tmp; 441 const struct sx_common_reg_default *initval; 442 int ret; 443 unsigned int i, val; 444 445 ret = regmap_write(data->regmap, data->chip_info->reg_reset, 446 SX_COMMON_SOFT_RESET); 447 if (ret) 448 return ret; 449 450 usleep_range(1000, 2000); /* power-up time is ~1ms. */ 451 452 /* Clear reset interrupt state by reading SX_COMMON_REG_IRQ_SRC. */ 453 ret = regmap_read(data->regmap, SX_COMMON_REG_IRQ_SRC, &val); 454 if (ret) 455 return ret; 456 457 /* Program defaults from constant or BIOS. */ 458 for (i = 0; i < data->chip_info->num_default_regs; i++) { 459 initval = data->chip_info->ops.get_default_reg(&indio_dev->dev, 460 i, &tmp); 461 ret = regmap_write(data->regmap, initval->reg, initval->def); 462 if (ret) 463 return ret; 464 } 465 466 return data->chip_info->ops.init_compensation(indio_dev); 467 } 468 469 /** 470 * sx_common_probe() - Common setup for Semtech SAR sensor 471 * @client: I2C client object 472 * @chip_info: Semtech sensor chip information. 473 * @regmap_config: Sensor registers map configuration. 474 */ 475 int sx_common_probe(struct i2c_client *client, 476 const struct sx_common_chip_info *chip_info, 477 const struct regmap_config *regmap_config) 478 { 479 struct device *dev = &client->dev; 480 struct iio_dev *indio_dev; 481 struct sx_common_data *data; 482 int ret; 483 484 indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); 485 if (!indio_dev) 486 return -ENOMEM; 487 488 data = iio_priv(indio_dev); 489 490 data->chip_info = chip_info; 491 data->client = client; 492 data->supplies[0].supply = "vdd"; 493 data->supplies[1].supply = "svdd"; 494 mutex_init(&data->mutex); 495 init_completion(&data->completion); 496 497 data->regmap = devm_regmap_init_i2c(client, regmap_config); 498 if (IS_ERR(data->regmap)) 499 return dev_err_probe(dev, PTR_ERR(data->regmap), 500 "Could init register map\n"); 501 502 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->supplies), 503 data->supplies); 504 if (ret) 505 return dev_err_probe(dev, ret, "Unable to get regulators\n"); 506 507 ret = regulator_bulk_enable(ARRAY_SIZE(data->supplies), data->supplies); 508 if (ret) 509 return dev_err_probe(dev, ret, "Unable to enable regulators\n"); 510 511 /* Must wait for Tpor time after initial power up */ 512 usleep_range(1000, 1100); 513 514 ret = devm_add_action_or_reset(dev, sx_common_regulator_disable, data); 515 if (ret) 516 return dev_err_probe(dev, ret, 517 "Unable to register regulators deleter\n"); 518 519 ret = data->chip_info->ops.check_whoami(dev, indio_dev); 520 if (ret) 521 return dev_err_probe(dev, ret, "error reading WHOAMI\n"); 522 523 ACPI_COMPANION_SET(&indio_dev->dev, ACPI_COMPANION(dev)); 524 indio_dev->modes = INDIO_DIRECT_MODE; 525 526 indio_dev->channels = data->chip_info->iio_channels; 527 indio_dev->num_channels = data->chip_info->num_iio_channels; 528 indio_dev->info = &data->chip_info->iio_info; 529 530 i2c_set_clientdata(client, indio_dev); 531 532 ret = sx_common_init_device(indio_dev); 533 if (ret) 534 return dev_err_probe(dev, ret, "Unable to initialize sensor\n"); 535 536 if (client->irq) { 537 ret = devm_request_threaded_irq(dev, client->irq, 538 sx_common_irq_handler, 539 sx_common_irq_thread_handler, 540 IRQF_ONESHOT, 541 "sx_event", indio_dev); 542 if (ret) 543 return dev_err_probe(dev, ret, "No IRQ\n"); 544 545 data->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", 546 indio_dev->name, 547 iio_device_id(indio_dev)); 548 if (!data->trig) 549 return -ENOMEM; 550 551 data->trig->ops = &sx_common_trigger_ops; 552 iio_trigger_set_drvdata(data->trig, indio_dev); 553 554 ret = devm_iio_trigger_register(dev, data->trig); 555 if (ret) 556 return ret; 557 } 558 559 ret = devm_iio_triggered_buffer_setup(dev, indio_dev, 560 iio_pollfunc_store_time, 561 sx_common_trigger_handler, 562 &sx_common_buffer_setup_ops); 563 if (ret) 564 return ret; 565 566 return devm_iio_device_register(dev, indio_dev); 567 } 568 EXPORT_SYMBOL_NS_GPL(sx_common_probe, SEMTECH_PROX); 569 570 MODULE_AUTHOR("Gwendal Grignou <gwendal@chromium.org>"); 571 MODULE_DESCRIPTION("Common functions and structures for Semtech sensor"); 572 MODULE_LICENSE("GPL v2"); 573