Lines Matching +full:svdd +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0
8 * linux-driver-SX9310_NoSmartHSensing>.
262 len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%d ", in sx9310_show_samp_freq_avail()
265 buf[len - 1] = '\n'; in sx9310_show_samp_freq_avail()
330 if ((data->chan_read | data->chan_event) != channels) { in sx9310_update_chan_en()
331 ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL0, in sx9310_update_chan_en()
337 data->chan_read = chan_read; in sx9310_update_chan_en()
338 data->chan_event = chan_event; in sx9310_update_chan_en()
344 return sx9310_update_chan_en(data, data->chan_read | BIT(channel), in sx9310_get_read_channel()
345 data->chan_event); in sx9310_get_read_channel()
350 return sx9310_update_chan_en(data, data->chan_read & ~BIT(channel), in sx9310_put_read_channel()
351 data->chan_event); in sx9310_put_read_channel()
356 return sx9310_update_chan_en(data, data->chan_read, in sx9310_get_event_channel()
357 data->chan_event | BIT(channel)); in sx9310_get_event_channel()
362 return sx9310_update_chan_en(data, data->chan_read, in sx9310_put_event_channel()
363 data->chan_event & ~BIT(channel)); in sx9310_put_event_channel()
368 if (!data->client->irq) in sx9310_enable_irq()
370 return regmap_update_bits(data->regmap, SX9310_REG_IRQ_MSK, irq, irq); in sx9310_enable_irq()
375 if (!data->client->irq) in sx9310_disable_irq()
377 return regmap_update_bits(data->regmap, SX9310_REG_IRQ_MSK, irq, 0); in sx9310_disable_irq()
385 ret = regmap_write(data->regmap, SX9310_REG_SENSOR_SEL, chan->channel); in sx9310_read_prox_data()
389 return regmap_bulk_read(data->regmap, chan->address, val, sizeof(*val)); in sx9310_read_prox_data()
401 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &val); in sx9310_wait_for_sample()
418 mutex_lock(&data->mutex); in sx9310_read_proximity()
420 ret = sx9310_get_read_channel(data, chan->channel); in sx9310_read_proximity()
428 mutex_unlock(&data->mutex); in sx9310_read_proximity()
430 if (data->client->irq) { in sx9310_read_proximity()
431 ret = wait_for_completion_interruptible(&data->completion); in sx9310_read_proximity()
432 reinit_completion(&data->completion); in sx9310_read_proximity()
437 mutex_lock(&data->mutex); in sx9310_read_proximity()
447 chan->address == SX9310_REG_DIFF_MSB ? 11 : 15); in sx9310_read_proximity()
453 ret = sx9310_put_read_channel(data, chan->channel); in sx9310_read_proximity()
457 mutex_unlock(&data->mutex); in sx9310_read_proximity()
464 sx9310_put_read_channel(data, chan->channel); in sx9310_read_proximity()
466 mutex_unlock(&data->mutex); in sx9310_read_proximity()
477 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL3, ®val); in sx9310_read_gain()
481 switch (chan->channel) { in sx9310_read_gain()
491 return -EINVAL; in sx9310_read_gain()
504 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, ®val); in sx9310_read_samp_freq()
522 if (chan->type != IIO_PROXIMITY) in sx9310_read_raw()
523 return -EINVAL; in sx9310_read_raw()
545 return -EINVAL; in sx9310_read_raw()
556 if (chan->type != IIO_PROXIMITY) in sx9310_read_avail()
557 return -EINVAL; in sx9310_read_avail()
567 return -EINVAL; in sx9310_read_avail()
586 return -EINVAL; in sx9310_get_thresh_reg()
596 reg = ret = sx9310_get_thresh_reg(chan->channel); in sx9310_read_thresh()
600 ret = regmap_read(data->regmap, reg, ®val); in sx9310_read_thresh()
606 return -EINVAL; in sx9310_read_thresh()
622 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, ®val); in sx9310_read_hysteresis()
631 *val = pthresh >> (5 - regval); in sx9310_read_hysteresis()
641 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, ®val); in sx9310_read_far_debounce()
659 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, ®val); in sx9310_read_close_debounce()
680 if (chan->type != IIO_PROXIMITY) in sx9310_read_event_val()
681 return -EINVAL; in sx9310_read_event_val()
693 return -EINVAL; in sx9310_read_event_val()
698 return -EINVAL; in sx9310_read_event_val()
709 reg = ret = sx9310_get_thresh_reg(chan->channel); in sx9310_write_thresh()
721 return -EINVAL; in sx9310_write_thresh()
724 mutex_lock(&data->mutex); in sx9310_write_thresh()
725 ret = regmap_update_bits(data->regmap, reg, in sx9310_write_thresh()
727 mutex_unlock(&data->mutex); in sx9310_write_thresh()
751 return -EINVAL; in sx9310_write_hysteresis()
754 mutex_lock(&data->mutex); in sx9310_write_hysteresis()
755 ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10, in sx9310_write_hysteresis()
757 mutex_unlock(&data->mutex); in sx9310_write_hysteresis()
770 return -EINVAL; in sx9310_write_far_debounce()
774 mutex_lock(&data->mutex); in sx9310_write_far_debounce()
775 ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10, in sx9310_write_far_debounce()
778 mutex_unlock(&data->mutex); in sx9310_write_far_debounce()
791 return -EINVAL; in sx9310_write_close_debounce()
795 mutex_lock(&data->mutex); in sx9310_write_close_debounce()
796 ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10, in sx9310_write_close_debounce()
799 mutex_unlock(&data->mutex); in sx9310_write_close_debounce()
812 if (chan->type != IIO_PROXIMITY) in sx9310_write_event_val()
813 return -EINVAL; in sx9310_write_event_val()
825 return -EINVAL; in sx9310_write_event_val()
830 return -EINVAL; in sx9310_write_event_val()
844 return -EINVAL; in sx9310_set_samp_freq()
846 mutex_lock(&data->mutex); in sx9310_set_samp_freq()
849 data->regmap, SX9310_REG_PROX_CTRL0, in sx9310_set_samp_freq()
853 mutex_unlock(&data->mutex); in sx9310_set_samp_freq()
866 switch (chan->channel) { in sx9310_write_gain()
878 return -EINVAL; in sx9310_write_gain()
881 mutex_lock(&data->mutex); in sx9310_write_gain()
882 ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL3, mask, in sx9310_write_gain()
884 mutex_unlock(&data->mutex); in sx9310_write_gain()
895 if (chan->type != IIO_PROXIMITY) in sx9310_write_raw()
896 return -EINVAL; in sx9310_write_raw()
905 return -EINVAL; in sx9310_write_raw()
913 if (data->trigger_enabled) in sx9310_irq_handler()
914 iio_trigger_poll(data->trig); in sx9310_irq_handler()
933 ret = regmap_read(data->regmap, SX9310_REG_STAT0, &val); in sx9310_push_events()
935 dev_err(&data->client->dev, "i2c transfer error in irq\n"); in sx9310_push_events()
943 prox_changed = (data->chan_prox_stat ^ val) & data->chan_event; in sx9310_push_events()
955 data->chan_prox_stat = val; in sx9310_push_events()
965 mutex_lock(&data->mutex); in sx9310_irq_thread_handler()
967 ret = regmap_read(data->regmap, SX9310_REG_IRQ_SRC, &val); in sx9310_irq_thread_handler()
969 dev_err(&data->client->dev, "i2c transfer error in irq\n"); in sx9310_irq_thread_handler()
977 complete(&data->completion); in sx9310_irq_thread_handler()
980 mutex_unlock(&data->mutex); in sx9310_irq_thread_handler()
992 return !!(data->chan_event & BIT(chan->channel)); in sx9310_read_event_config()
1005 if (!!(data->chan_event & BIT(chan->channel)) == state) in sx9310_write_event_config()
1008 mutex_lock(&data->mutex); in sx9310_write_event_config()
1010 ret = sx9310_get_event_channel(data, chan->channel); in sx9310_write_event_config()
1013 if (!(data->chan_event & ~BIT(chan->channel))) { in sx9310_write_event_config()
1016 sx9310_put_event_channel(data, chan->channel); in sx9310_write_event_config()
1019 ret = sx9310_put_event_channel(data, chan->channel); in sx9310_write_event_config()
1022 if (!data->chan_event) { in sx9310_write_event_config()
1025 sx9310_get_event_channel(data, chan->channel); in sx9310_write_event_config()
1030 mutex_unlock(&data->mutex); in sx9310_write_event_config()
1060 mutex_lock(&data->mutex); in sx9310_set_trigger_state()
1064 else if (!data->chan_read) in sx9310_set_trigger_state()
1069 data->trigger_enabled = state; in sx9310_set_trigger_state()
1072 mutex_unlock(&data->mutex); in sx9310_set_trigger_state()
1084 struct iio_dev *indio_dev = pf->indio_dev; in sx9310_trigger_handler()
1089 mutex_lock(&data->mutex); in sx9310_trigger_handler()
1091 for_each_set_bit(bit, indio_dev->active_scan_mask, in sx9310_trigger_handler()
1092 indio_dev->masklength) { in sx9310_trigger_handler()
1093 ret = sx9310_read_prox_data(data, &indio_dev->channels[bit], in sx9310_trigger_handler()
1098 data->buffer.channels[i++] = val; in sx9310_trigger_handler()
1101 iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, in sx9310_trigger_handler()
1102 pf->timestamp); in sx9310_trigger_handler()
1105 mutex_unlock(&data->mutex); in sx9310_trigger_handler()
1107 iio_trigger_notify_done(indio_dev->trig); in sx9310_trigger_handler()
1118 mutex_lock(&data->mutex); in sx9310_buffer_preenable()
1119 for_each_set_bit(bit, indio_dev->active_scan_mask, in sx9310_buffer_preenable()
1120 indio_dev->masklength) in sx9310_buffer_preenable()
1121 __set_bit(indio_dev->channels[bit].channel, &channels); in sx9310_buffer_preenable()
1123 ret = sx9310_update_chan_en(data, channels, data->chan_event); in sx9310_buffer_preenable()
1124 mutex_unlock(&data->mutex); in sx9310_buffer_preenable()
1133 mutex_lock(&data->mutex); in sx9310_buffer_postdisable()
1134 ret = sx9310_update_chan_en(data, 0, data->chan_event); in sx9310_buffer_postdisable()
1135 mutex_unlock(&data->mutex); in sx9310_buffer_postdisable()
1199 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &ctrl0); in sx9310_init_compensation()
1204 ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, in sx9310_init_compensation()
1209 ret = regmap_read_poll_timeout(data->regmap, SX9310_REG_STAT1, val, in sx9310_init_compensation()
1213 if (ret == -ETIMEDOUT) in sx9310_init_compensation()
1214 dev_err(&data->client->dev, in sx9310_init_compensation()
1220 regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0); in sx9310_init_compensation()
1235 switch (reg_def->reg) { in sx9310_get_default_reg()
1237 if (device_property_read_bool(dev, "semtech,cs0-ground")) { in sx9310_get_default_reg()
1238 reg_def->def &= ~SX9310_REG_PROX_CTRL2_SHIELDEN_MASK; in sx9310_get_default_reg()
1239 reg_def->def |= SX9310_REG_PROX_CTRL2_SHIELDEN_GROUND; in sx9310_get_default_reg()
1242 count = device_property_count_u32(dev, "semtech,combined-sensors"); in sx9310_get_default_reg()
1245 ret = device_property_read_u32_array(dev, "semtech,combined-sensors", in sx9310_get_default_reg()
1253 reg_def->def &= ~SX9310_REG_PROX_CTRL2_COMBMODE_MASK; in sx9310_get_default_reg()
1255 reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1_CS2_CS3; in sx9310_get_default_reg()
1257 reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2; in sx9310_get_default_reg()
1259 reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1; in sx9310_get_default_reg()
1261 reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS3; in sx9310_get_default_reg()
1269 reg_def->def &= ~SX9310_REG_PROX_CTRL4_RESOLUTION_MASK; in sx9310_get_default_reg()
1271 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_COARSEST; in sx9310_get_default_reg()
1272 else if (!strcmp(res, "very-coarse")) in sx9310_get_default_reg()
1273 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_COARSE; in sx9310_get_default_reg()
1275 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_COARSE; in sx9310_get_default_reg()
1276 else if (!strcmp(res, "medium-coarse")) in sx9310_get_default_reg()
1277 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM_COARSE; in sx9310_get_default_reg()
1279 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM; in sx9310_get_default_reg()
1281 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_FINE; in sx9310_get_default_reg()
1282 else if (!strcmp(res, "very-fine")) in sx9310_get_default_reg()
1283 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_FINE; in sx9310_get_default_reg()
1285 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST; in sx9310_get_default_reg()
1289 ret = device_property_read_u32(dev, "semtech,startup-sensor", &start); in sx9310_get_default_reg()
1292 reg_def->def); in sx9310_get_default_reg()
1295 reg_def->def &= ~SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK; in sx9310_get_default_reg()
1296 reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK, in sx9310_get_default_reg()
1299 ret = device_property_read_u32(dev, "semtech,proxraw-strength", &raw); in sx9310_get_default_reg()
1302 reg_def->def); in sx9310_get_default_reg()
1307 reg_def->def &= ~SX9310_REG_PROX_CTRL5_RAWFILT_MASK; in sx9310_get_default_reg()
1308 reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL5_RAWFILT_MASK, in sx9310_get_default_reg()
1312 ret = device_property_read_u32(dev, "semtech,avg-pos-strength", &pos); in sx9310_get_default_reg()
1317 pos = clamp(ilog2(pos), 3, 11) - (pos >= 32 ? 4 : 3); in sx9310_get_default_reg()
1318 reg_def->def &= ~SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK; in sx9310_get_default_reg()
1319 reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK, in sx9310_get_default_reg()
1335 ret = regmap_write(data->regmap, SX9310_REG_RESET, SX9310_SOFT_RESET); in sx9310_init_device()
1339 usleep_range(1000, 2000); /* power-up time is ~1ms. */ in sx9310_init_device()
1342 ret = regmap_read(data->regmap, SX9310_REG_IRQ_SRC, &val); in sx9310_init_device()
1348 initval = sx9310_get_default_reg(&indio_dev->dev, i, &tmp); in sx9310_init_device()
1349 ret = regmap_write(data->regmap, initval->reg, initval->def); in sx9310_init_device()
1366 return -ENODEV; in sx9310_set_indio_dev_name()
1371 indio_dev->name = "sx9310"; in sx9310_set_indio_dev_name()
1374 indio_dev->name = "sx9311"; in sx9310_set_indio_dev_name()
1378 return -ENODEV; in sx9310_set_indio_dev_name()
1388 regulator_bulk_disable(ARRAY_SIZE(data->supplies), data->supplies); in sx9310_regulator_disable()
1394 struct device *dev = &client->dev; in sx9310_probe()
1400 return -ENOMEM; in sx9310_probe()
1403 data->client = client; in sx9310_probe()
1404 data->supplies[0].supply = "vdd"; in sx9310_probe()
1405 data->supplies[1].supply = "svdd"; in sx9310_probe()
1406 mutex_init(&data->mutex); in sx9310_probe()
1407 init_completion(&data->completion); in sx9310_probe()
1409 data->regmap = devm_regmap_init_i2c(client, &sx9310_regmap_config); in sx9310_probe()
1410 if (IS_ERR(data->regmap)) in sx9310_probe()
1411 return PTR_ERR(data->regmap); in sx9310_probe()
1413 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->supplies), in sx9310_probe()
1414 data->supplies); in sx9310_probe()
1418 ret = regulator_bulk_enable(ARRAY_SIZE(data->supplies), data->supplies); in sx9310_probe()
1428 ret = regmap_read(data->regmap, SX9310_REG_WHOAMI, &data->whoami); in sx9310_probe()
1434 ret = sx9310_set_indio_dev_name(dev, indio_dev, data->whoami); in sx9310_probe()
1438 ACPI_COMPANION_SET(&indio_dev->dev, ACPI_COMPANION(dev)); in sx9310_probe()
1439 indio_dev->channels = sx9310_channels; in sx9310_probe()
1440 indio_dev->num_channels = ARRAY_SIZE(sx9310_channels); in sx9310_probe()
1441 indio_dev->info = &sx9310_info; in sx9310_probe()
1442 indio_dev->modes = INDIO_DIRECT_MODE; in sx9310_probe()
1449 if (client->irq) { in sx9310_probe()
1450 ret = devm_request_threaded_irq(dev, client->irq, in sx9310_probe()
1458 data->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", in sx9310_probe()
1459 indio_dev->name, in sx9310_probe()
1461 if (!data->trig) in sx9310_probe()
1462 return -ENOMEM; in sx9310_probe()
1464 data->trig->ops = &sx9310_trigger_ops; in sx9310_probe()
1465 iio_trigger_set_drvdata(data->trig, indio_dev); in sx9310_probe()
1467 ret = devm_iio_trigger_register(dev, data->trig); in sx9310_probe()
1489 disable_irq_nosync(data->client->irq); in sx9310_suspend()
1491 mutex_lock(&data->mutex); in sx9310_suspend()
1492 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, in sx9310_suspend()
1493 &data->suspend_ctrl0); in sx9310_suspend()
1497 ctrl0 = data->suspend_ctrl0 & ~SX9310_REG_PROX_CTRL0_SENSOREN_MASK; in sx9310_suspend()
1498 ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0); in sx9310_suspend()
1502 ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 0); in sx9310_suspend()
1505 mutex_unlock(&data->mutex); in sx9310_suspend()
1515 mutex_lock(&data->mutex); in sx9310_resume()
1516 ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 1); in sx9310_resume()
1520 ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, in sx9310_resume()
1521 data->suspend_ctrl0); in sx9310_resume()
1524 mutex_unlock(&data->mutex); in sx9310_resume()
1528 enable_irq(data->client->irq); in sx9310_resume()