Lines Matching +full:vref +full:- +full:p

1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (C) 2010-2011 Michael Hennerich, Analog Devices Inc.
7 * Copyright (C) 2008-2010 Jonathan Cameron
10 * Copyright (C) 2002-2004 Stefan Eletzhofer
101 * struct ad799x_chip_config - chip specific information
113 * struct ad799x_chip_info - chip specific information
128 struct regulator *vref; member
140 switch (st->id) { in ad799x_write_config()
143 return i2c_smbus_write_word_swapped(st->client, AD7998_CONF_REG, in ad799x_write_config()
148 return i2c_smbus_write_byte_data(st->client, AD7998_CONF_REG, in ad799x_write_config()
152 st->config = val; in ad799x_write_config()
159 switch (st->id) { in ad799x_read_config()
162 return i2c_smbus_read_word_swapped(st->client, AD7998_CONF_REG); in ad799x_read_config()
166 return i2c_smbus_read_byte_data(st->client, AD7998_CONF_REG); in ad799x_read_config()
169 return st->config; in ad799x_read_config()
183 st->config = ret; in ad799x_update_config()
188 static irqreturn_t ad799x_trigger_handler(int irq, void *p) in ad799x_trigger_handler() argument
190 struct iio_poll_func *pf = p; in ad799x_trigger_handler()
191 struct iio_dev *indio_dev = pf->indio_dev; in ad799x_trigger_handler()
196 switch (st->id) { in ad799x_trigger_handler()
200 cmd = st->config | in ad799x_trigger_handler()
201 (*indio_dev->active_scan_mask << AD799X_CHANNEL_SHIFT); in ad799x_trigger_handler()
206 cmd = (*indio_dev->active_scan_mask << AD799X_CHANNEL_SHIFT) | in ad799x_trigger_handler()
217 b_sent = i2c_smbus_read_i2c_block_data(st->client, in ad799x_trigger_handler()
218 cmd, st->transfer_size, st->rx_buf); in ad799x_trigger_handler()
222 iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf, in ad799x_trigger_handler()
225 iio_trigger_notify_done(indio_dev->trig); in ad799x_trigger_handler()
235 kfree(st->rx_buf); in ad799x_update_scan_mode()
236 st->rx_buf = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); in ad799x_update_scan_mode()
237 if (!st->rx_buf) in ad799x_update_scan_mode()
238 return -ENOMEM; in ad799x_update_scan_mode()
240 st->transfer_size = bitmap_weight(scan_mask, indio_dev->masklength) * 2; in ad799x_update_scan_mode()
242 switch (st->id) { in ad799x_update_scan_mode()
248 st->config &= ~(GENMASK(7, 0) << AD799X_CHANNEL_SHIFT); in ad799x_update_scan_mode()
249 st->config |= (*scan_mask << AD799X_CHANNEL_SHIFT); in ad799x_update_scan_mode()
250 return ad799x_write_config(st, st->config); in ad799x_update_scan_mode()
260 switch (st->id) { in ad799x_scan_direct()
264 cmd = st->config | (BIT(ch) << AD799X_CHANNEL_SHIFT); in ad799x_scan_direct()
276 return -EINVAL; in ad799x_scan_direct()
279 return i2c_smbus_read_word_swapped(st->client, cmd); in ad799x_scan_direct()
296 mutex_lock(&st->lock); in ad799x_read_raw()
297 ret = ad799x_scan_direct(st, chan->scan_index); in ad799x_read_raw()
298 mutex_unlock(&st->lock); in ad799x_read_raw()
303 *val = (ret >> chan->scan_type.shift) & in ad799x_read_raw()
304 GENMASK(chan->scan_type.realbits - 1, 0); in ad799x_read_raw()
307 if (st->vref) in ad799x_read_raw()
308 ret = regulator_get_voltage(st->vref); in ad799x_read_raw()
310 ret = regulator_get_voltage(st->reg); in ad799x_read_raw()
315 *val2 = chan->scan_type.realbits; in ad799x_read_raw()
318 return -EINVAL; in ad799x_read_raw()
337 int ret = i2c_smbus_read_byte_data(st->client, AD7998_CYCLE_TMR_REG); in ad799x_read_frequency()
359 mutex_lock(&st->lock); in ad799x_write_frequency()
361 ret = i2c_smbus_read_byte_data(st->client, AD7998_CYCLE_TMR_REG); in ad799x_write_frequency()
371 ret = -EINVAL; in ad799x_write_frequency()
375 ret = i2c_smbus_write_byte_data(st->client, AD7998_CYCLE_TMR_REG, in ad799x_write_frequency()
382 mutex_unlock(&st->lock); in ad799x_write_frequency()
394 if (!(st->config & AD7998_ALERT_EN)) in ad799x_read_event_config()
397 if ((st->config >> AD799X_CHANNEL_SHIFT) & BIT(chan->scan_index)) in ad799x_read_event_config()
416 mutex_lock(&st->lock); in ad799x_write_event_config()
419 st->config |= BIT(chan->scan_index) << AD799X_CHANNEL_SHIFT; in ad799x_write_event_config()
421 st->config &= ~(BIT(chan->scan_index) << AD799X_CHANNEL_SHIFT); in ad799x_write_event_config()
423 if (st->config >> AD799X_CHANNEL_SHIFT) in ad799x_write_event_config()
424 st->config |= AD7998_ALERT_EN; in ad799x_write_event_config()
426 st->config &= ~AD7998_ALERT_EN; in ad799x_write_event_config()
428 ret = ad799x_write_config(st, st->config); in ad799x_write_event_config()
429 mutex_unlock(&st->lock); in ad799x_write_event_config()
441 return AD7998_DATALOW_REG(chan->channel); in ad799x_threshold_reg()
443 return AD7998_DATAHIGH_REG(chan->channel); in ad799x_threshold_reg()
445 return AD7998_HYST_REG(chan->channel); in ad799x_threshold_reg()
447 return -EINVAL; in ad799x_threshold_reg()
463 if (val < 0 || val > GENMASK(chan->scan_type.realbits - 1, 0)) in ad799x_write_event_value()
464 return -EINVAL; in ad799x_write_event_value()
466 ret = i2c_smbus_write_word_swapped(st->client, in ad799x_write_event_value()
468 val << chan->scan_type.shift); in ad799x_write_event_value()
483 ret = i2c_smbus_read_word_swapped(st->client, in ad799x_read_event_value()
487 *val = (ret >> chan->scan_type.shift) & in ad799x_read_event_value()
488 GENMASK(chan->scan_type.realbits - 1, 0); in ad799x_read_event_value()
499 ret = i2c_smbus_read_byte_data(st->client, AD7998_ALERT_STAT_REG); in ad799x_event_handler()
503 if (i2c_smbus_write_byte_data(st->client, AD7998_ALERT_STAT_REG, in ad799x_event_handler()
590 .shift = 12 - (_realbits), \
786 &ad799x_chip_info_tbl[id->driver_data]; in ad799x_probe()
788 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*st)); in ad799x_probe()
790 return -ENOMEM; in ad799x_probe()
796 st->id = id->driver_data; in ad799x_probe()
797 if (client->irq > 0 && chip_info->irq_config.info) in ad799x_probe()
798 st->chip_config = &chip_info->irq_config; in ad799x_probe()
800 st->chip_config = &chip_info->noirq_config; in ad799x_probe()
804 st->reg = devm_regulator_get(&client->dev, "vcc"); in ad799x_probe()
805 if (IS_ERR(st->reg)) in ad799x_probe()
806 return PTR_ERR(st->reg); in ad799x_probe()
807 ret = regulator_enable(st->reg); in ad799x_probe()
812 st->vref = devm_regulator_get_optional(&client->dev, "vref"); in ad799x_probe()
814 if (IS_ERR(st->vref)) { in ad799x_probe()
815 if (PTR_ERR(st->vref) == -ENODEV) { in ad799x_probe()
816 st->vref = NULL; in ad799x_probe()
817 dev_info(&client->dev, "Using VCC reference voltage\n"); in ad799x_probe()
819 ret = PTR_ERR(st->vref); in ad799x_probe()
824 if (st->vref) { in ad799x_probe()
829 if ((st->id == ad7991) || (st->id == ad7995) || (st->id == ad7999)) { in ad799x_probe()
830 dev_info(&client->dev, "Using external reference voltage\n"); in ad799x_probe()
832 ret = regulator_enable(st->vref); in ad799x_probe()
836 st->vref = NULL; in ad799x_probe()
837 dev_warn(&client->dev, "Supplied reference not supported\n"); in ad799x_probe()
841 st->client = client; in ad799x_probe()
843 indio_dev->name = id->name; in ad799x_probe()
844 indio_dev->info = st->chip_config->info; in ad799x_probe()
846 indio_dev->modes = INDIO_DIRECT_MODE; in ad799x_probe()
847 indio_dev->channels = st->chip_config->channel; in ad799x_probe()
848 indio_dev->num_channels = chip_info->num_channels; in ad799x_probe()
850 ret = ad799x_update_config(st, st->chip_config->default_config | extra_config); in ad799x_probe()
859 if (client->irq > 0) { in ad799x_probe()
860 ret = devm_request_threaded_irq(&client->dev, in ad799x_probe()
861 client->irq, in ad799x_probe()
866 client->name, in ad799x_probe()
872 mutex_init(&st->lock); in ad799x_probe()
883 if (st->vref) in ad799x_probe()
884 regulator_disable(st->vref); in ad799x_probe()
886 regulator_disable(st->reg); in ad799x_probe()
899 if (st->vref) in ad799x_remove()
900 regulator_disable(st->vref); in ad799x_remove()
901 regulator_disable(st->reg); in ad799x_remove()
902 kfree(st->rx_buf); in ad799x_remove()
910 if (st->vref) in ad799x_suspend()
911 regulator_disable(st->vref); in ad799x_suspend()
912 regulator_disable(st->reg); in ad799x_suspend()
923 ret = regulator_enable(st->reg); in ad799x_resume()
929 if (st->vref) { in ad799x_resume()
930 ret = regulator_enable(st->vref); in ad799x_resume()
932 regulator_disable(st->reg); in ad799x_resume()
933 dev_err(dev, "Unable to enable vref regulator\n"); in ad799x_resume()
939 ret = ad799x_update_config(st, st->config); in ad799x_resume()
941 if (st->vref) in ad799x_resume()
942 regulator_disable(st->vref); in ad799x_resume()
943 regulator_disable(st->reg); in ad799x_resume()