Lines Matching +full:data +full:- +full:bits

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * ADS7138 - Texas Instruments Analog-to-Digital Converter
23 * Always assume 16 bits resolution as HW registers are aligned like that and
24 * with enabled oversampling/averaging it actually corresponds to 16 bits.
110 return -ENOMEM; in ads7138_i2c_write_block()
120 return -EIO; in ads7138_i2c_write_block()
135 return -EIO; in ads7138_i2c_write_with_opcode()
146 static int ads7138_i2c_set_bit(const struct i2c_client *client, u8 reg, u8 bits) in ads7138_i2c_set_bit() argument
148 return ads7138_i2c_write_with_opcode(client, reg, bits, in ads7138_i2c_set_bit()
152 static int ads7138_i2c_clear_bit(const struct i2c_client *client, u8 reg, u8 bits) in ads7138_i2c_clear_bit() argument
154 return ads7138_i2c_write_with_opcode(client, reg, bits, in ads7138_i2c_clear_bit()
165 .addr = client->addr, in ads7138_i2c_read_block()
170 .addr = client->addr, in ads7138_i2c_read_block()
177 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in ads7138_i2c_read_block()
181 return -EIO; in ads7138_i2c_read_block()
205 return -EINVAL; in ads7138_freq_to_bits()
208 static int ads7138_bits_to_freq(int bits) in ads7138_bits_to_freq() argument
213 if (bits == ads7138_samp_freqs_bits[1][i]) in ads7138_bits_to_freq()
216 return -EINVAL; in ads7138_bits_to_freq()
227 return -EINVAL; in ads7138_osr_to_bits()
234 struct ads7138_data *data = iio_priv(indio_dev); in ads7138_read_raw() local
235 int ret, vref, bits; in ads7138_read_raw() local
240 ret = ads7138_i2c_read_block(data->client, in ads7138_read_raw()
241 ADS7138_REG_RECENT_LSB_CH(chan->channel), in ads7138_read_raw()
249 ret = ads7138_i2c_read_block(data->client, in ads7138_read_raw()
250 ADS7138_REG_MAX_LSB_CH(chan->channel), in ads7138_read_raw()
258 ret = ads7138_i2c_read_block(data->client, in ads7138_read_raw()
259 ADS7138_REG_MIN_LSB_CH(chan->channel), in ads7138_read_raw()
267 ret = ads7138_i2c_read(data->client, ADS7138_REG_OPMODE_CFG); in ads7138_read_raw()
271 bits = FIELD_GET(ADS7138_OPMODE_CFG_FREQ_MASK, ret); in ads7138_read_raw()
272 *val = ads7138_bits_to_freq(bits); in ads7138_read_raw()
275 vref = regulator_get_voltage(data->vref_regu); in ads7138_read_raw()
282 ret = ads7138_i2c_read(data->client, ADS7138_REG_OSR_CFG); in ads7138_read_raw()
286 bits = FIELD_GET(ADS7138_OSR_CFG_MASK, ret); in ads7138_read_raw()
287 *val = ads7138_oversampling_ratios[bits]; in ads7138_read_raw()
290 return -EINVAL; in ads7138_read_raw()
298 struct ads7138_data *data = iio_priv(indio_dev); in ads7138_write_raw() local
299 int bits, ret; in ads7138_write_raw() local
304 bits = ads7138_freq_to_bits(val); in ads7138_write_raw()
305 if (bits < 0) in ads7138_write_raw()
306 return bits; in ads7138_write_raw()
308 guard(mutex)(&data->lock); in ads7138_write_raw()
309 ret = ads7138_i2c_read(data->client, ADS7138_REG_OPMODE_CFG); in ads7138_write_raw()
314 value |= FIELD_PREP(ADS7138_OPMODE_CFG_FREQ_MASK, bits); in ads7138_write_raw()
315 return ads7138_i2c_write(data->client, ADS7138_REG_OPMODE_CFG, in ads7138_write_raw()
319 bits = ads7138_osr_to_bits(val); in ads7138_write_raw()
320 if (bits < 0) in ads7138_write_raw()
321 return bits; in ads7138_write_raw()
323 return ads7138_i2c_write(data->client, ADS7138_REG_OSR_CFG, in ads7138_write_raw()
324 bits); in ads7138_write_raw()
326 return -EINVAL; in ads7138_write_raw()
336 struct ads7138_data *data = iio_priv(indio_dev); in ads7138_read_event() local
343 ADS7138_REG_HIGH_TH_HYS_CH(chan->channel) : in ads7138_read_event()
344 ADS7138_REG_LOW_TH_CNT_CH(chan->channel); in ads7138_read_event()
345 ret = ads7138_i2c_read_block(data->client, reg, values, in ads7138_read_event()
353 ret = ads7138_i2c_read(data->client, in ads7138_read_event()
354 ADS7138_REG_HIGH_TH_HYS_CH(chan->channel)); in ads7138_read_event()
361 return -EINVAL; in ads7138_read_event()
371 struct ads7138_data *data = iio_priv(indio_dev); in ads7138_write_event() local
378 return -EINVAL; in ads7138_write_event()
381 ADS7138_REG_HIGH_TH_HYS_CH(chan->channel) : in ads7138_write_event()
382 ADS7138_REG_LOW_TH_CNT_CH(chan->channel); in ads7138_write_event()
384 guard(mutex)(&data->lock); in ads7138_write_event()
385 ret = ads7138_i2c_read(data->client, reg); in ads7138_write_event()
392 return ads7138_i2c_write_block(data->client, reg, values, in ads7138_write_event()
397 return -EINVAL; in ads7138_write_event()
399 reg = ADS7138_REG_HIGH_TH_HYS_CH(chan->channel); in ads7138_write_event()
401 guard(mutex)(&data->lock); in ads7138_write_event()
402 ret = ads7138_i2c_read(data->client, reg); in ads7138_write_event()
408 return ads7138_i2c_write(data->client, reg, values[0]); in ads7138_write_event()
411 return -EINVAL; in ads7138_write_event()
420 struct ads7138_data *data = iio_priv(indio_dev); in ads7138_read_event_config() local
424 return -EINVAL; in ads7138_read_event_config()
426 ret = ads7138_i2c_read(data->client, ADS7138_REG_ALERT_CH_SEL); in ads7138_read_event_config()
430 return (ret & BIT(chan->channel)) ? 1 : 0; in ads7138_read_event_config()
438 struct ads7138_data *data = iio_priv(indio_dev); in ads7138_write_event_config() local
441 return -EINVAL; in ads7138_write_event_config()
444 return ads7138_i2c_set_bit(data->client, in ads7138_write_event_config()
446 BIT(chan->channel)); in ads7138_write_event_config()
448 return ads7138_i2c_clear_bit(data->client, in ads7138_write_event_config()
450 BIT(chan->channel)); in ads7138_write_event_config()
472 return -EINVAL; in ads7138_read_avail()
535 struct ads7138_data *data = iio_priv(indio_dev); in ads7138_event_handler() local
536 struct device *dev = &data->client->dev; in ads7138_event_handler()
542 ret = ads7138_i2c_read(data->client, ADS7138_REG_EVENT_FLAG); in ads7138_event_handler()
546 ret = ads7138_i2c_read(data->client, ADS7138_REG_EVENT_HIGH_FLAG); in ads7138_event_handler()
553 ret = ads7138_i2c_read(data->client, ADS7138_REG_EVENT_LOW_FLAG); in ads7138_event_handler()
560 for (i = 0; i < data->chip_data->channel_num; i++) { in ads7138_event_handler()
578 ret = ads7138_i2c_write(data->client, ADS7138_REG_EVENT_HIGH_FLAG, 0xFF); in ads7138_event_handler()
582 ret = ads7138_i2c_write(data->client, ADS7138_REG_EVENT_LOW_FLAG, 0xFF); in ads7138_event_handler()
589 static int ads7138_set_conv_mode(struct ads7138_data *data, in ads7138_set_conv_mode() argument
593 return ads7138_i2c_set_bit(data->client, ADS7138_REG_OPMODE_CFG, in ads7138_set_conv_mode()
595 return ads7138_i2c_clear_bit(data->client, ADS7138_REG_OPMODE_CFG, in ads7138_set_conv_mode()
599 static int ads7138_init_hw(struct ads7138_data *data) in ads7138_init_hw() argument
601 struct device *dev = &data->client->dev; in ads7138_init_hw()
604 data->vref_regu = devm_regulator_get(dev, "avdd"); in ads7138_init_hw()
605 if (IS_ERR(data->vref_regu)) in ads7138_init_hw()
606 return dev_err_probe(dev, PTR_ERR(data->vref_regu), in ads7138_init_hw()
609 ret = regulator_get_voltage(data->vref_regu); in ads7138_init_hw()
614 ret = ads7138_i2c_set_bit(data->client, ADS7138_REG_GENERAL_CFG, in ads7138_init_hw()
619 ret = ads7138_set_conv_mode(data, ADS7138_MODE_AUTO); in ads7138_init_hw()
624 ret = ads7138_i2c_set_bit(data->client, ADS7138_REG_GENERAL_CFG, in ads7138_init_hw()
631 ret = ads7138_i2c_set_bit(data->client, ADS7138_REG_AUTO_SEQ_CH_SEL, 0xFF); in ads7138_init_hw()
636 return ads7138_i2c_set_bit(data->client, ADS7138_REG_SEQUENCE_CFG, in ads7138_init_hw()
643 struct device *dev = &client->dev; in ads7138_probe()
645 struct ads7138_data *data; in ads7138_probe() local
648 indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); in ads7138_probe()
650 return -ENOMEM; in ads7138_probe()
652 data = iio_priv(indio_dev); in ads7138_probe()
653 data->client = client; in ads7138_probe()
654 data->chip_data = i2c_get_match_data(client); in ads7138_probe()
655 if (!data->chip_data) in ads7138_probe()
656 return -ENODEV; in ads7138_probe()
658 ret = devm_mutex_init(dev, &data->lock); in ads7138_probe()
662 indio_dev->name = data->chip_data->name; in ads7138_probe()
663 indio_dev->modes = INDIO_DIRECT_MODE; in ads7138_probe()
664 indio_dev->channels = ads7138_channels; in ads7138_probe()
665 indio_dev->num_channels = ARRAY_SIZE(ads7138_channels); in ads7138_probe()
666 indio_dev->info = &ti_ads7138_info; in ads7138_probe()
670 if (client->irq > 0) { in ads7138_probe()
671 ret = devm_request_threaded_irq(dev, client->irq, in ads7138_probe()
675 client->name, indio_dev); in ads7138_probe()
680 ret = ads7138_init_hw(data); in ads7138_probe()
694 struct ads7138_data *data = iio_priv(indio_dev); in ads7138_runtime_suspend() local
696 return ads7138_set_conv_mode(data, ADS7138_MODE_MANUAL); in ads7138_runtime_suspend()
702 struct ads7138_data *data = iio_priv(indio_dev); in ads7138_runtime_resume() local
704 return ads7138_set_conv_mode(data, ADS7138_MODE_AUTO); in ads7138_runtime_resume()
723 { .compatible = "ti,ads7128", .data = &ads7128_data },
724 { .compatible = "ti,ads7138", .data = &ads7138_data },