Lines Matching +full:adc +full:- +full:chan

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Driver for the Nuvoton NAU7802 ADC
64 #define NAU7802_CHANNEL(chan) { \ argument
67 .channel = (chan), \
68 .scan_index = (chan), \
88 for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) in nau7802_show_scales()
89 len += scnprintf(buf + len, PAGE_SIZE - len, "0.%09d ", in nau7802_show_scales()
90 st->scale_avail[i]); in nau7802_show_scales()
92 buf[len-1] = '\n'; in nau7802_show_scales()
116 mutex_lock(&st->lock); in nau7802_set_gain()
117 st->conversion_count = 0; in nau7802_set_gain()
119 ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_CTRL1); in nau7802_set_gain()
122 ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_CTRL1, in nau7802_set_gain()
127 mutex_unlock(&st->lock); in nau7802_set_gain()
136 mutex_lock(&st->data_lock); in nau7802_read_conversion()
137 data = i2c_smbus_read_byte_data(st->client, NAU7802_REG_ADC_B2); in nau7802_read_conversion()
140 st->last_value = data << 16; in nau7802_read_conversion()
142 data = i2c_smbus_read_byte_data(st->client, NAU7802_REG_ADC_B1); in nau7802_read_conversion()
145 st->last_value |= data << 8; in nau7802_read_conversion()
147 data = i2c_smbus_read_byte_data(st->client, NAU7802_REG_ADC_B0); in nau7802_read_conversion()
150 st->last_value |= data; in nau7802_read_conversion()
152 st->last_value = sign_extend32(st->last_value, 23); in nau7802_read_conversion()
155 mutex_unlock(&st->data_lock); in nau7802_read_conversion()
167 ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_PUCTRL); in nau7802_sync()
170 ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_PUCTRL, in nau7802_sync()
182 status = i2c_smbus_read_byte_data(st->client, NAU7802_REG_PUCTRL); in nau7802_eoc_trigger()
193 * Because there is actually only one ADC for both channels, we have to in nau7802_eoc_trigger()
197 if (st->conversion_count < NAU7802_MIN_CONVERSIONS) in nau7802_eoc_trigger()
198 st->conversion_count++; in nau7802_eoc_trigger()
199 if (st->conversion_count >= NAU7802_MIN_CONVERSIONS) in nau7802_eoc_trigger()
200 complete(&st->value_ok); in nau7802_eoc_trigger()
206 struct iio_chan_spec const *chan, in nau7802_read_irq() argument
212 reinit_completion(&st->value_ok); in nau7802_read_irq()
213 enable_irq(st->client->irq); in nau7802_read_irq()
223 ret = wait_for_completion_interruptible_timeout(&st->value_ok, in nau7802_read_irq()
226 ret = -ETIMEDOUT; in nau7802_read_irq()
231 disable_irq(st->client->irq); in nau7802_read_irq()
233 *val = st->last_value; in nau7802_read_irq()
238 disable_irq(st->client->irq); in nau7802_read_irq()
244 struct iio_chan_spec const *chan, in nau7802_read_poll() argument
258 * Because there is actually only one ADC for both channels, we have to in nau7802_read_poll()
263 ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_PUCTRL); in nau7802_read_poll()
268 if (st->sample_rate != NAU7802_SAMP_FREQ_320) in nau7802_read_poll()
272 ret = i2c_smbus_read_byte_data(st->client, in nau7802_read_poll()
281 if (st->conversion_count < NAU7802_MIN_CONVERSIONS) in nau7802_read_poll()
282 st->conversion_count++; in nau7802_read_poll()
283 } while (st->conversion_count < NAU7802_MIN_CONVERSIONS); in nau7802_read_poll()
285 *val = st->last_value; in nau7802_read_poll()
291 struct iio_chan_spec const *chan, in nau7802_read_raw() argument
299 mutex_lock(&st->lock); in nau7802_read_raw()
302 * - Channel 1 is value 0 in the CHS register in nau7802_read_raw()
303 * - Channel 2 is value 1 in the CHS register in nau7802_read_raw()
305 ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_CTRL2); in nau7802_read_raw()
307 mutex_unlock(&st->lock); in nau7802_read_raw()
311 if (((ret & NAU7802_CTRL2_CHS_BIT) && !chan->channel) || in nau7802_read_raw()
313 chan->channel)) { in nau7802_read_raw()
314 st->conversion_count = 0; in nau7802_read_raw()
315 ret = i2c_smbus_write_byte_data(st->client, in nau7802_read_raw()
317 NAU7802_CTRL2_CHS(chan->channel) | in nau7802_read_raw()
318 NAU7802_CTRL2_CRS(st->sample_rate)); in nau7802_read_raw()
321 mutex_unlock(&st->lock); in nau7802_read_raw()
326 if (st->client->irq) in nau7802_read_raw()
327 ret = nau7802_read_irq(indio_dev, chan, val); in nau7802_read_raw()
329 ret = nau7802_read_poll(indio_dev, chan, val); in nau7802_read_raw()
331 mutex_unlock(&st->lock); in nau7802_read_raw()
335 ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_CTRL1); in nau7802_read_raw()
343 *val = st->vref_mv; in nau7802_read_raw()
349 *val = nau7802_sample_freq_avail[st->sample_rate]; in nau7802_read_raw()
357 return -EINVAL; in nau7802_read_raw()
361 struct iio_chan_spec const *chan, in nau7802_write_raw() argument
369 for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) in nau7802_write_raw()
370 if (val2 == st->scale_avail[i]) in nau7802_write_raw()
378 mutex_lock(&st->lock); in nau7802_write_raw()
379 st->sample_rate = i; in nau7802_write_raw()
380 st->conversion_count = 0; in nau7802_write_raw()
381 ret = i2c_smbus_write_byte_data(st->client, in nau7802_write_raw()
383 NAU7802_CTRL2_CRS(st->sample_rate)); in nau7802_write_raw()
384 mutex_unlock(&st->lock); in nau7802_write_raw()
394 return -EINVAL; in nau7802_write_raw()
398 struct iio_chan_spec const *chan, in nau7802_write_raw_get_fmt() argument
419 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*st)); in nau7802_probe()
421 return -ENOMEM; in nau7802_probe()
425 indio_dev->name = dev_name(&client->dev); in nau7802_probe()
426 indio_dev->modes = INDIO_DIRECT_MODE; in nau7802_probe()
427 indio_dev->info = &nau7802_info; in nau7802_probe()
429 st->client = client; in nau7802_probe()
432 ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_PUCTRL, in nau7802_probe()
438 ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_PUCTRL, in nau7802_probe()
448 ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_PUCTRL); in nau7802_probe()
454 device_property_read_u32(&client->dev, "nuvoton,vldo", &tmp); in nau7802_probe()
455 st->vref_mv = tmp; in nau7802_probe()
462 ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_PUCTRL, data); in nau7802_probe()
465 ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_ADC_CTRL, 0x30); in nau7802_probe()
470 data = NAU7802_CTRL1_VLDO((4500 - tmp) / 300); in nau7802_probe()
471 ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_CTRL1, in nau7802_probe()
477 /* Populate available ADC input ranges */ in nau7802_probe()
478 for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) in nau7802_probe()
479 st->scale_avail[i] = (((u64)st->vref_mv) * 1000000000ULL) in nau7802_probe()
482 init_completion(&st->value_ok); in nau7802_probe()
485 * The ADC fires continuously and we can't do anything about in nau7802_probe()
489 if (client->irq) { in nau7802_probe()
490 ret = devm_request_threaded_irq(&client->dev, client->irq, in nau7802_probe()
495 client->dev.driver->name, in nau7802_probe()
501 * by this ADC as when going over 40 sample per second, in nau7802_probe()
506 dev_info(&client->dev, in nau7802_probe()
508 client->irq = 0; in nau7802_probe()
512 if (!client->irq) { in nau7802_probe()
517 st->sample_rate = NAU7802_SAMP_FREQ_320; in nau7802_probe()
518 ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_CTRL2, in nau7802_probe()
519 NAU7802_CTRL2_CRS(st->sample_rate)); in nau7802_probe()
524 /* Setup the ADC channels available on the board */ in nau7802_probe()
525 indio_dev->num_channels = ARRAY_SIZE(nau7802_chan_array); in nau7802_probe()
526 indio_dev->channels = nau7802_chan_array; in nau7802_probe()
528 mutex_init(&st->lock); in nau7802_probe()
529 mutex_init(&st->data_lock); in nau7802_probe()
531 return devm_iio_device_register(&client->dev, indio_dev); in nau7802_probe()
558 MODULE_DESCRIPTION("Nuvoton NAU7802 ADC Driver");
559 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
560 MODULE_AUTHOR("Alexandre Belloni <alexandre.belloni@free-electrons.com>");