| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046 |
- // SPDX-License-Identifier: GPL-2.0-only
- /*
- * MAX11410 SPI ADC driver
- *
- * Copyright 2022 Analog Devices Inc.
- */
- #include <linux/bitfield.h>
- #include <linux/delay.h>
- #include <linux/device.h>
- #include <linux/err.h>
- #include <linux/interrupt.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/regmap.h>
- #include <linux/regulator/consumer.h>
- #include <linux/spi/spi.h>
- #include <linux/unaligned.h>
- #include <linux/iio/buffer.h>
- #include <linux/iio/sysfs.h>
- #include <linux/iio/trigger.h>
- #include <linux/iio/trigger_consumer.h>
- #include <linux/iio/triggered_buffer.h>
- #define MAX11410_REG_CONV_START 0x01
- #define MAX11410_CONV_TYPE_SINGLE 0x00
- #define MAX11410_CONV_TYPE_CONTINUOUS 0x01
- #define MAX11410_REG_CAL_START 0x03
- #define MAX11410_CAL_START_SELF 0x00
- #define MAX11410_CAL_START_PGA 0x01
- #define MAX11410_REG_GPIO_CTRL(ch) ((ch) ? 0x05 : 0x04)
- #define MAX11410_GPIO_INTRB 0xC1
- #define MAX11410_REG_FILTER 0x08
- #define MAX11410_FILTER_RATE_MASK GENMASK(3, 0)
- #define MAX11410_FILTER_RATE_MAX 0x0F
- #define MAX11410_FILTER_LINEF_MASK GENMASK(5, 4)
- #define MAX11410_FILTER_50HZ BIT(5)
- #define MAX11410_FILTER_60HZ BIT(4)
- #define MAX11410_REG_CTRL 0x09
- #define MAX11410_CTRL_REFSEL_MASK GENMASK(2, 0)
- #define MAX11410_CTRL_VREFN_BUF_BIT BIT(3)
- #define MAX11410_CTRL_VREFP_BUF_BIT BIT(4)
- #define MAX11410_CTRL_FORMAT_BIT BIT(5)
- #define MAX11410_CTRL_UNIPOLAR_BIT BIT(6)
- #define MAX11410_REG_MUX_CTRL0 0x0B
- #define MAX11410_REG_PGA 0x0E
- #define MAX11410_PGA_GAIN_MASK GENMASK(2, 0)
- #define MAX11410_PGA_SIG_PATH_MASK GENMASK(5, 4)
- #define MAX11410_PGA_SIG_PATH_BUFFERED 0x00
- #define MAX11410_PGA_SIG_PATH_BYPASS 0x01
- #define MAX11410_PGA_SIG_PATH_PGA 0x02
- #define MAX11410_REG_DATA0 0x30
- #define MAX11410_REG_STATUS 0x38
- #define MAX11410_STATUS_CONV_READY_BIT BIT(0)
- #define MAX11410_STATUS_CAL_READY_BIT BIT(2)
- #define MAX11410_REFSEL_AVDD_AGND 0x03
- #define MAX11410_REFSEL_MAX 0x06
- #define MAX11410_SIG_PATH_MAX 0x02
- #define MAX11410_CHANNEL_INDEX_MAX 0x0A
- #define MAX11410_AINP_AVDD 0x0A
- #define MAX11410_AINN_GND 0x0A
- #define MAX11410_CONVERSION_TIMEOUT_MS 2000
- #define MAX11410_CALIB_TIMEOUT_MS 2000
- #define MAX11410_SCALE_AVAIL_SIZE 8
- enum max11410_filter {
- MAX11410_FILTER_FIR5060,
- MAX11410_FILTER_FIR50,
- MAX11410_FILTER_FIR60,
- MAX11410_FILTER_SINC4,
- };
- static const u8 max11410_sampling_len[] = {
- [MAX11410_FILTER_FIR5060] = 5,
- [MAX11410_FILTER_FIR50] = 6,
- [MAX11410_FILTER_FIR60] = 6,
- [MAX11410_FILTER_SINC4] = 10,
- };
- static const int max11410_sampling_rates[4][10][2] = {
- [MAX11410_FILTER_FIR5060] = {
- { 1, 100000 },
- { 2, 100000 },
- { 4, 200000 },
- { 8, 400000 },
- { 16, 800000 }
- },
- [MAX11410_FILTER_FIR50] = {
- { 1, 300000 },
- { 2, 700000 },
- { 5, 300000 },
- { 10, 700000 },
- { 21, 300000 },
- { 40 }
- },
- [MAX11410_FILTER_FIR60] = {
- { 1, 300000 },
- { 2, 700000 },
- { 5, 300000 },
- { 10, 700000 },
- { 21, 300000 },
- { 40 }
- },
- [MAX11410_FILTER_SINC4] = {
- { 4 },
- { 10 },
- { 20 },
- { 40 },
- { 60 },
- { 120 },
- { 240 },
- { 480 },
- { 960 },
- { 1920 }
- }
- };
- struct max11410_channel_config {
- u32 settling_time_us;
- u32 *scale_avail;
- u8 refsel;
- u8 sig_path;
- u8 gain;
- bool bipolar;
- bool buffered_vrefp;
- bool buffered_vrefn;
- };
- struct max11410_state {
- struct spi_device *spi_dev;
- struct iio_trigger *trig;
- struct completion completion;
- struct mutex lock; /* Prevent changing channel config during sampling */
- struct regmap *regmap;
- struct regulator *avdd;
- struct regulator *vrefp[3];
- struct regulator *vrefn[3];
- struct max11410_channel_config *channels;
- int irq;
- struct {
- u32 data __aligned(IIO_DMA_MINALIGN);
- aligned_s64 ts;
- } scan;
- };
- static const struct iio_chan_spec chanspec_template = {
- .type = IIO_VOLTAGE,
- .indexed = 1,
- .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
- BIT(IIO_CHAN_INFO_SCALE) |
- BIT(IIO_CHAN_INFO_OFFSET),
- .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
- .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SAMP_FREQ),
- .scan_type = {
- .sign = 's',
- .realbits = 24,
- .storagebits = 32,
- .endianness = IIO_LE,
- },
- };
- static unsigned int max11410_reg_size(unsigned int reg)
- {
- /* Registers from 0x00 to 0x10 are 1 byte, the rest are 3 bytes long. */
- return reg <= 0x10 ? 1 : 3;
- }
- static int max11410_write_reg(struct max11410_state *st, unsigned int reg,
- unsigned int val)
- {
- /* This driver only needs to write 8-bit registers */
- if (max11410_reg_size(reg) != 1)
- return -EINVAL;
- return regmap_write(st->regmap, reg, val);
- }
- static int max11410_read_reg(struct max11410_state *st, unsigned int reg,
- int *val)
- {
- int ret;
- if (max11410_reg_size(reg) == 3) {
- ret = regmap_bulk_read(st->regmap, reg, &st->scan.data, 3);
- if (ret)
- return ret;
- *val = get_unaligned_be24(&st->scan.data);
- return 0;
- }
- return regmap_read(st->regmap, reg, val);
- }
- static struct regulator *max11410_get_vrefp(struct max11410_state *st,
- u8 refsel)
- {
- refsel = refsel % 4;
- if (refsel == 3)
- return st->avdd;
- return st->vrefp[refsel];
- }
- static struct regulator *max11410_get_vrefn(struct max11410_state *st,
- u8 refsel)
- {
- if (refsel > 2)
- return NULL;
- return st->vrefn[refsel];
- }
- static const struct regmap_config regmap_config = {
- .reg_bits = 8,
- .val_bits = 8,
- .max_register = 0x39,
- };
- static ssize_t max11410_notch_en_show(struct device *dev,
- struct device_attribute *devattr,
- char *buf)
- {
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct max11410_state *state = iio_priv(indio_dev);
- struct iio_dev_attr *iio_attr = to_iio_dev_attr(devattr);
- unsigned int val;
- int ret;
- ret = max11410_read_reg(state, MAX11410_REG_FILTER, &val);
- if (ret)
- return ret;
- switch (iio_attr->address) {
- case 0:
- val = !FIELD_GET(MAX11410_FILTER_50HZ, val);
- break;
- case 1:
- val = !FIELD_GET(MAX11410_FILTER_60HZ, val);
- break;
- case 2:
- val = FIELD_GET(MAX11410_FILTER_LINEF_MASK, val) == 3;
- break;
- default:
- return -EINVAL;
- }
- return sysfs_emit(buf, "%d\n", val);
- }
- static ssize_t max11410_notch_en_store(struct device *dev,
- struct device_attribute *devattr,
- const char *buf, size_t count)
- {
- struct iio_dev_attr *iio_attr = to_iio_dev_attr(devattr);
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct max11410_state *state = iio_priv(indio_dev);
- unsigned int filter_bits;
- bool enable;
- int ret;
- ret = kstrtobool(buf, &enable);
- if (ret)
- return ret;
- switch (iio_attr->address) {
- case 0:
- filter_bits = MAX11410_FILTER_50HZ;
- break;
- case 1:
- filter_bits = MAX11410_FILTER_60HZ;
- break;
- case 2:
- default:
- filter_bits = MAX11410_FILTER_50HZ | MAX11410_FILTER_60HZ;
- enable = !enable;
- break;
- }
- if (enable)
- ret = regmap_clear_bits(state->regmap, MAX11410_REG_FILTER,
- filter_bits);
- else
- ret = regmap_set_bits(state->regmap, MAX11410_REG_FILTER,
- filter_bits);
- if (ret)
- return ret;
- return count;
- }
- static ssize_t in_voltage_filter2_notch_center_show(struct device *dev,
- struct device_attribute *devattr,
- char *buf)
- {
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct max11410_state *state = iio_priv(indio_dev);
- int ret, reg, rate, filter;
- ret = regmap_read(state->regmap, MAX11410_REG_FILTER, ®);
- if (ret)
- return ret;
- rate = FIELD_GET(MAX11410_FILTER_RATE_MASK, reg);
- rate = clamp_val(rate, 0,
- max11410_sampling_len[MAX11410_FILTER_SINC4] - 1);
- filter = max11410_sampling_rates[MAX11410_FILTER_SINC4][rate][0];
- return sysfs_emit(buf, "%d\n", filter);
- }
- static IIO_CONST_ATTR(in_voltage_filter0_notch_center, "50");
- static IIO_CONST_ATTR(in_voltage_filter1_notch_center, "60");
- static IIO_DEVICE_ATTR_RO(in_voltage_filter2_notch_center, 2);
- static IIO_DEVICE_ATTR(in_voltage_filter0_notch_en, 0644,
- max11410_notch_en_show, max11410_notch_en_store, 0);
- static IIO_DEVICE_ATTR(in_voltage_filter1_notch_en, 0644,
- max11410_notch_en_show, max11410_notch_en_store, 1);
- static IIO_DEVICE_ATTR(in_voltage_filter2_notch_en, 0644,
- max11410_notch_en_show, max11410_notch_en_store, 2);
- static struct attribute *max11410_attributes[] = {
- &iio_const_attr_in_voltage_filter0_notch_center.dev_attr.attr,
- &iio_const_attr_in_voltage_filter1_notch_center.dev_attr.attr,
- &iio_dev_attr_in_voltage_filter2_notch_center.dev_attr.attr,
- &iio_dev_attr_in_voltage_filter0_notch_en.dev_attr.attr,
- &iio_dev_attr_in_voltage_filter1_notch_en.dev_attr.attr,
- &iio_dev_attr_in_voltage_filter2_notch_en.dev_attr.attr,
- NULL
- };
- static const struct attribute_group max11410_attribute_group = {
- .attrs = max11410_attributes,
- };
- static int max11410_set_input_mux(struct max11410_state *st, u8 ainp, u8 ainn)
- {
- if (ainp > MAX11410_CHANNEL_INDEX_MAX ||
- ainn > MAX11410_CHANNEL_INDEX_MAX)
- return -EINVAL;
- return max11410_write_reg(st, MAX11410_REG_MUX_CTRL0,
- (ainp << 4) | ainn);
- }
- static int max11410_configure_channel(struct max11410_state *st,
- struct iio_chan_spec const *chan)
- {
- struct max11410_channel_config cfg = st->channels[chan->address];
- unsigned int regval;
- int ret;
- if (chan->differential)
- ret = max11410_set_input_mux(st, chan->channel, chan->channel2);
- else
- ret = max11410_set_input_mux(st, chan->channel,
- MAX11410_AINN_GND);
- if (ret)
- return ret;
- regval = FIELD_PREP(MAX11410_CTRL_VREFP_BUF_BIT, cfg.buffered_vrefp) |
- FIELD_PREP(MAX11410_CTRL_VREFN_BUF_BIT, cfg.buffered_vrefn) |
- FIELD_PREP(MAX11410_CTRL_REFSEL_MASK, cfg.refsel) |
- FIELD_PREP(MAX11410_CTRL_UNIPOLAR_BIT, cfg.bipolar ? 0 : 1);
- ret = regmap_update_bits(st->regmap, MAX11410_REG_CTRL,
- MAX11410_CTRL_REFSEL_MASK |
- MAX11410_CTRL_VREFP_BUF_BIT |
- MAX11410_CTRL_VREFN_BUF_BIT |
- MAX11410_CTRL_UNIPOLAR_BIT, regval);
- if (ret)
- return ret;
- regval = FIELD_PREP(MAX11410_PGA_SIG_PATH_MASK, cfg.sig_path) |
- FIELD_PREP(MAX11410_PGA_GAIN_MASK, cfg.gain);
- ret = regmap_write(st->regmap, MAX11410_REG_PGA, regval);
- if (ret)
- return ret;
- if (cfg.settling_time_us)
- fsleep(cfg.settling_time_us);
- return 0;
- }
- static int max11410_sample(struct max11410_state *st, int *sample_raw,
- struct iio_chan_spec const *chan)
- {
- int val, ret;
- ret = max11410_configure_channel(st, chan);
- if (ret)
- return ret;
- if (st->irq > 0)
- reinit_completion(&st->completion);
- /* Start Conversion */
- ret = max11410_write_reg(st, MAX11410_REG_CONV_START,
- MAX11410_CONV_TYPE_SINGLE);
- if (ret)
- return ret;
- if (st->irq > 0) {
- /* Wait for an interrupt. */
- ret = wait_for_completion_timeout(&st->completion,
- msecs_to_jiffies(MAX11410_CONVERSION_TIMEOUT_MS));
- if (!ret)
- return -ETIMEDOUT;
- } else {
- int ret2;
- /* Wait for status register Conversion Ready flag */
- ret = read_poll_timeout(max11410_read_reg, ret2,
- ret2 || (val & MAX11410_STATUS_CONV_READY_BIT),
- 5000, MAX11410_CONVERSION_TIMEOUT_MS * 1000,
- true, st, MAX11410_REG_STATUS, &val);
- if (ret)
- return ret;
- if (ret2)
- return ret2;
- }
- /* Read ADC Data */
- return max11410_read_reg(st, MAX11410_REG_DATA0, sample_raw);
- }
- static int max11410_get_scale(struct max11410_state *state,
- struct max11410_channel_config cfg)
- {
- struct regulator *vrefp, *vrefn;
- int scale;
- vrefp = max11410_get_vrefp(state, cfg.refsel);
- scale = regulator_get_voltage(vrefp) / 1000;
- vrefn = max11410_get_vrefn(state, cfg.refsel);
- if (vrefn)
- scale -= regulator_get_voltage(vrefn) / 1000;
- if (cfg.bipolar)
- scale *= 2;
- return scale >> cfg.gain;
- }
- static int max11410_read_raw(struct iio_dev *indio_dev,
- struct iio_chan_spec const *chan,
- int *val, int *val2, long info)
- {
- struct max11410_state *state = iio_priv(indio_dev);
- struct max11410_channel_config cfg = state->channels[chan->address];
- int ret, reg_val, filter, rate;
- switch (info) {
- case IIO_CHAN_INFO_SCALE:
- *val = max11410_get_scale(state, cfg);
- *val2 = chan->scan_type.realbits;
- return IIO_VAL_FRACTIONAL_LOG2;
- case IIO_CHAN_INFO_OFFSET:
- if (cfg.bipolar)
- *val = -BIT(chan->scan_type.realbits - 1);
- else
- *val = 0;
- return IIO_VAL_INT;
- case IIO_CHAN_INFO_RAW:
- if (!iio_device_claim_direct(indio_dev))
- return -EBUSY;
- mutex_lock(&state->lock);
- ret = max11410_sample(state, ®_val, chan);
- mutex_unlock(&state->lock);
- iio_device_release_direct(indio_dev);
- if (ret)
- return ret;
- *val = reg_val;
- return IIO_VAL_INT;
- case IIO_CHAN_INFO_SAMP_FREQ:
- ret = regmap_read(state->regmap, MAX11410_REG_FILTER, ®_val);
- if (ret)
- return ret;
- filter = FIELD_GET(MAX11410_FILTER_LINEF_MASK, reg_val);
- rate = reg_val & MAX11410_FILTER_RATE_MASK;
- if (rate >= max11410_sampling_len[filter])
- rate = max11410_sampling_len[filter] - 1;
- *val = max11410_sampling_rates[filter][rate][0];
- *val2 = max11410_sampling_rates[filter][rate][1];
- return IIO_VAL_INT_PLUS_MICRO;
- }
- return -EINVAL;
- }
- static int __max11410_write_samp_freq(struct max11410_state *st,
- int val, int val2)
- {
- int ret, i, reg_val, filter;
- guard(mutex)(&st->lock);
- ret = regmap_read(st->regmap, MAX11410_REG_FILTER, ®_val);
- if (ret)
- return ret;
- filter = FIELD_GET(MAX11410_FILTER_LINEF_MASK, reg_val);
- for (i = 0; i < max11410_sampling_len[filter]; ++i) {
- if (val == max11410_sampling_rates[filter][i][0] &&
- val2 == max11410_sampling_rates[filter][i][1])
- break;
- }
- if (i == max11410_sampling_len[filter])
- return -EINVAL;
- return regmap_write_bits(st->regmap, MAX11410_REG_FILTER,
- MAX11410_FILTER_RATE_MASK, i);
- }
- static int max11410_write_raw(struct iio_dev *indio_dev,
- struct iio_chan_spec const *chan,
- int val, int val2, long mask)
- {
- struct max11410_state *st = iio_priv(indio_dev);
- int ret, gain;
- u32 *scale_avail;
- switch (mask) {
- case IIO_CHAN_INFO_SCALE:
- scale_avail = st->channels[chan->address].scale_avail;
- if (!scale_avail)
- return -EOPNOTSUPP;
- /* Accept values in range 0.000001 <= scale < 1.000000 */
- if (val != 0 || val2 == 0)
- return -EINVAL;
- if (!iio_device_claim_direct(indio_dev))
- return -EBUSY;
- /* Convert from INT_PLUS_MICRO to FRACTIONAL_LOG2 */
- val2 = val2 * DIV_ROUND_CLOSEST(BIT(24), 1000000);
- val2 = DIV_ROUND_CLOSEST(scale_avail[0], val2);
- gain = order_base_2(val2);
- st->channels[chan->address].gain = clamp_val(gain, 0, 7);
- iio_device_release_direct(indio_dev);
- return 0;
- case IIO_CHAN_INFO_SAMP_FREQ:
- if (!iio_device_claim_direct(indio_dev))
- return -EBUSY;
- ret = __max11410_write_samp_freq(st, val, val2);
- iio_device_release_direct(indio_dev);
- return ret;
- default:
- return -EINVAL;
- }
- }
- static int max11410_read_avail(struct iio_dev *indio_dev,
- struct iio_chan_spec const *chan,
- const int **vals, int *type, int *length,
- long info)
- {
- struct max11410_state *st = iio_priv(indio_dev);
- struct max11410_channel_config cfg;
- int ret, reg_val, filter;
- switch (info) {
- case IIO_CHAN_INFO_SAMP_FREQ:
- ret = regmap_read(st->regmap, MAX11410_REG_FILTER, ®_val);
- if (ret)
- return ret;
- filter = FIELD_GET(MAX11410_FILTER_LINEF_MASK, reg_val);
- *vals = (const int *)max11410_sampling_rates[filter];
- *length = max11410_sampling_len[filter] * 2;
- *type = IIO_VAL_INT_PLUS_MICRO;
- return IIO_AVAIL_LIST;
- case IIO_CHAN_INFO_SCALE:
- cfg = st->channels[chan->address];
- if (!cfg.scale_avail)
- return -EINVAL;
- *vals = cfg.scale_avail;
- *length = MAX11410_SCALE_AVAIL_SIZE * 2;
- *type = IIO_VAL_FRACTIONAL_LOG2;
- return IIO_AVAIL_LIST;
- }
- return -EINVAL;
- }
- static const struct iio_info max11410_info = {
- .read_raw = max11410_read_raw,
- .write_raw = max11410_write_raw,
- .read_avail = max11410_read_avail,
- .attrs = &max11410_attribute_group,
- };
- static irqreturn_t max11410_trigger_handler(int irq, void *p)
- {
- struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->indio_dev;
- struct max11410_state *st = iio_priv(indio_dev);
- int ret;
- ret = max11410_read_reg(st, MAX11410_REG_DATA0, &st->scan.data);
- if (ret) {
- dev_err(&indio_dev->dev, "cannot read data\n");
- goto out;
- }
- iio_push_to_buffers_with_ts(indio_dev, &st->scan, sizeof(st->scan),
- iio_get_time_ns(indio_dev));
- out:
- iio_trigger_notify_done(indio_dev->trig);
- return IRQ_HANDLED;
- }
- static int max11410_buffer_postenable(struct iio_dev *indio_dev)
- {
- struct max11410_state *st = iio_priv(indio_dev);
- int scan_ch, ret;
- scan_ch = ffs(*indio_dev->active_scan_mask) - 1;
- ret = max11410_configure_channel(st, &indio_dev->channels[scan_ch]);
- if (ret)
- return ret;
- /* Start continuous conversion. */
- return max11410_write_reg(st, MAX11410_REG_CONV_START,
- MAX11410_CONV_TYPE_CONTINUOUS);
- }
- static int max11410_buffer_predisable(struct iio_dev *indio_dev)
- {
- struct max11410_state *st = iio_priv(indio_dev);
- /* Stop continuous conversion. */
- return max11410_write_reg(st, MAX11410_REG_CONV_START,
- MAX11410_CONV_TYPE_SINGLE);
- }
- static const struct iio_buffer_setup_ops max11410_buffer_ops = {
- .postenable = &max11410_buffer_postenable,
- .predisable = &max11410_buffer_predisable,
- .validate_scan_mask = &iio_validate_scan_mask_onehot,
- };
- static const struct iio_trigger_ops max11410_trigger_ops = {
- .validate_device = iio_trigger_validate_own_device,
- };
- static irqreturn_t max11410_interrupt(int irq, void *dev_id)
- {
- struct iio_dev *indio_dev = dev_id;
- struct max11410_state *st = iio_priv(indio_dev);
- if (iio_buffer_enabled(indio_dev))
- iio_trigger_poll_nested(st->trig);
- else
- complete(&st->completion);
- return IRQ_HANDLED;
- };
- static int max11410_parse_channels(struct max11410_state *st,
- struct iio_dev *indio_dev)
- {
- struct iio_chan_spec chanspec = chanspec_template;
- struct device *dev = &st->spi_dev->dev;
- struct max11410_channel_config *cfg;
- struct iio_chan_spec *channels;
- u32 reference, sig_path;
- const char *node_name;
- u32 inputs[2], scale;
- unsigned int num_ch;
- int chan_idx = 0;
- int ret, i;
- num_ch = device_get_child_node_count(dev);
- if (num_ch == 0)
- return dev_err_probe(&indio_dev->dev, -ENODEV,
- "FW has no channels defined\n");
- /* Reserve space for soft timestamp channel */
- num_ch++;
- channels = devm_kcalloc(dev, num_ch, sizeof(*channels), GFP_KERNEL);
- if (!channels)
- return -ENOMEM;
- st->channels = devm_kcalloc(dev, num_ch, sizeof(*st->channels),
- GFP_KERNEL);
- if (!st->channels)
- return -ENOMEM;
- device_for_each_child_node_scoped(dev, child) {
- node_name = fwnode_get_name(child);
- if (fwnode_property_present(child, "diff-channels")) {
- ret = fwnode_property_read_u32_array(child,
- "diff-channels",
- inputs,
- ARRAY_SIZE(inputs));
- chanspec.differential = 1;
- } else {
- ret = fwnode_property_read_u32(child, "reg", &inputs[0]);
- inputs[1] = 0;
- chanspec.differential = 0;
- }
- if (ret)
- return ret;
- if (inputs[0] > MAX11410_CHANNEL_INDEX_MAX ||
- inputs[1] > MAX11410_CHANNEL_INDEX_MAX)
- return dev_err_probe(&indio_dev->dev, -EINVAL,
- "Invalid channel index for %s, should be less than %d\n",
- node_name,
- MAX11410_CHANNEL_INDEX_MAX + 1);
- cfg = &st->channels[chan_idx];
- reference = MAX11410_REFSEL_AVDD_AGND;
- fwnode_property_read_u32(child, "adi,reference", &reference);
- if (reference > MAX11410_REFSEL_MAX)
- return dev_err_probe(&indio_dev->dev, -EINVAL,
- "Invalid adi,reference value for %s, should be less than %d.\n",
- node_name, MAX11410_REFSEL_MAX + 1);
- if (!max11410_get_vrefp(st, reference) ||
- (!max11410_get_vrefn(st, reference) && reference <= 2))
- return dev_err_probe(&indio_dev->dev, -EINVAL,
- "Invalid VREF configuration for %s, either specify corresponding VREF regulators or change adi,reference property.\n",
- node_name);
- sig_path = MAX11410_PGA_SIG_PATH_BUFFERED;
- fwnode_property_read_u32(child, "adi,input-mode", &sig_path);
- if (sig_path > MAX11410_SIG_PATH_MAX)
- return dev_err_probe(&indio_dev->dev, -EINVAL,
- "Invalid adi,input-mode value for %s, should be less than %d.\n",
- node_name, MAX11410_SIG_PATH_MAX + 1);
- fwnode_property_read_u32(child, "settling-time-us",
- &cfg->settling_time_us);
- cfg->bipolar = fwnode_property_read_bool(child, "bipolar");
- cfg->buffered_vrefp = fwnode_property_read_bool(child, "adi,buffered-vrefp");
- cfg->buffered_vrefn = fwnode_property_read_bool(child, "adi,buffered-vrefn");
- cfg->refsel = reference;
- cfg->sig_path = sig_path;
- cfg->gain = 0;
- /* Enable scale_available property if input mode is PGA */
- if (sig_path == MAX11410_PGA_SIG_PATH_PGA) {
- __set_bit(IIO_CHAN_INFO_SCALE,
- &chanspec.info_mask_separate_available);
- cfg->scale_avail = devm_kcalloc(dev, MAX11410_SCALE_AVAIL_SIZE * 2,
- sizeof(*cfg->scale_avail),
- GFP_KERNEL);
- if (!cfg->scale_avail)
- return -ENOMEM;
- scale = max11410_get_scale(st, *cfg);
- for (i = 0; i < MAX11410_SCALE_AVAIL_SIZE; i++) {
- cfg->scale_avail[2 * i] = scale >> i;
- cfg->scale_avail[2 * i + 1] = chanspec.scan_type.realbits;
- }
- } else {
- __clear_bit(IIO_CHAN_INFO_SCALE,
- &chanspec.info_mask_separate_available);
- }
- chanspec.address = chan_idx;
- chanspec.scan_index = chan_idx;
- chanspec.channel = inputs[0];
- chanspec.channel2 = inputs[1];
- channels[chan_idx] = chanspec;
- chan_idx++;
- }
- channels[chan_idx] = (struct iio_chan_spec)IIO_CHAN_SOFT_TIMESTAMP(chan_idx);
- indio_dev->num_channels = chan_idx + 1;
- indio_dev->channels = channels;
- return 0;
- }
- static void max11410_disable_reg(void *reg)
- {
- regulator_disable(reg);
- }
- static int max11410_init_vref(struct device *dev,
- struct regulator **vref,
- const char *id)
- {
- struct regulator *reg;
- int ret;
- reg = devm_regulator_get_optional(dev, id);
- if (PTR_ERR(reg) == -ENODEV) {
- *vref = NULL;
- return 0;
- } else if (IS_ERR(reg)) {
- return PTR_ERR(reg);
- }
- ret = regulator_enable(reg);
- if (ret)
- return dev_err_probe(dev, ret,
- "Failed to enable regulator %s\n", id);
- *vref = reg;
- return devm_add_action_or_reset(dev, max11410_disable_reg, reg);
- }
- static int max11410_calibrate(struct max11410_state *st, u32 cal_type)
- {
- int ret, ret2, val;
- ret = max11410_write_reg(st, MAX11410_REG_CAL_START, cal_type);
- if (ret)
- return ret;
- /* Wait for status register Calibration Ready flag */
- ret = read_poll_timeout(max11410_read_reg, ret2,
- ret2 || (val & MAX11410_STATUS_CAL_READY_BIT),
- 50000, MAX11410_CALIB_TIMEOUT_MS * 1000, true,
- st, MAX11410_REG_STATUS, &val);
- if (ret)
- return ret;
- return ret2;
- }
- static int max11410_self_calibrate(struct max11410_state *st)
- {
- int ret, i;
- ret = regmap_write_bits(st->regmap, MAX11410_REG_FILTER,
- MAX11410_FILTER_RATE_MASK,
- FIELD_PREP(MAX11410_FILTER_RATE_MASK,
- MAX11410_FILTER_RATE_MAX));
- if (ret)
- return ret;
- ret = max11410_calibrate(st, MAX11410_CAL_START_SELF);
- if (ret)
- return ret;
- ret = regmap_write_bits(st->regmap, MAX11410_REG_PGA,
- MAX11410_PGA_SIG_PATH_MASK,
- FIELD_PREP(MAX11410_PGA_SIG_PATH_MASK,
- MAX11410_PGA_SIG_PATH_PGA));
- if (ret)
- return ret;
- /* PGA calibrations */
- for (i = 1; i < 8; ++i) {
- ret = regmap_write_bits(st->regmap, MAX11410_REG_PGA,
- MAX11410_PGA_GAIN_MASK, i);
- if (ret)
- return ret;
- ret = max11410_calibrate(st, MAX11410_CAL_START_PGA);
- if (ret)
- return ret;
- }
- /* Cleanup */
- ret = regmap_write_bits(st->regmap, MAX11410_REG_PGA,
- MAX11410_PGA_GAIN_MASK, 0);
- if (ret)
- return ret;
- ret = regmap_write_bits(st->regmap, MAX11410_REG_FILTER,
- MAX11410_FILTER_RATE_MASK, 0);
- if (ret)
- return ret;
- return regmap_write_bits(st->regmap, MAX11410_REG_PGA,
- MAX11410_PGA_SIG_PATH_MASK,
- FIELD_PREP(MAX11410_PGA_SIG_PATH_MASK,
- MAX11410_PGA_SIG_PATH_BUFFERED));
- }
- static int max11410_probe(struct spi_device *spi)
- {
- const char *vrefp_regs[] = { "vref0p", "vref1p", "vref2p" };
- const char *vrefn_regs[] = { "vref0n", "vref1n", "vref2n" };
- struct device *dev = &spi->dev;
- struct max11410_state *st;
- struct iio_dev *indio_dev;
- int ret, irqs[2];
- int i;
- indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
- if (!indio_dev)
- return -ENOMEM;
- st = iio_priv(indio_dev);
- st->spi_dev = spi;
- init_completion(&st->completion);
- mutex_init(&st->lock);
- indio_dev->name = "max11410";
- indio_dev->modes = INDIO_DIRECT_MODE;
- indio_dev->info = &max11410_info;
- st->regmap = devm_regmap_init_spi(spi, ®map_config);
- if (IS_ERR(st->regmap))
- return dev_err_probe(dev, PTR_ERR(st->regmap),
- "regmap initialization failed\n");
- ret = max11410_init_vref(dev, &st->avdd, "avdd");
- if (ret)
- return ret;
- for (i = 0; i < ARRAY_SIZE(vrefp_regs); i++) {
- ret = max11410_init_vref(dev, &st->vrefp[i], vrefp_regs[i]);
- if (ret)
- return ret;
- ret = max11410_init_vref(dev, &st->vrefn[i], vrefn_regs[i]);
- if (ret)
- return ret;
- }
- /*
- * Regulators must be configured before parsing channels for
- * validating "adi,reference" property of each channel.
- */
- ret = max11410_parse_channels(st, indio_dev);
- if (ret)
- return ret;
- irqs[0] = fwnode_irq_get_byname(dev_fwnode(dev), "gpio0");
- irqs[1] = fwnode_irq_get_byname(dev_fwnode(dev), "gpio1");
- if (irqs[0] > 0) {
- st->irq = irqs[0];
- ret = regmap_write(st->regmap, MAX11410_REG_GPIO_CTRL(0),
- MAX11410_GPIO_INTRB);
- } else if (irqs[1] > 0) {
- st->irq = irqs[1];
- ret = regmap_write(st->regmap, MAX11410_REG_GPIO_CTRL(1),
- MAX11410_GPIO_INTRB);
- } else if (spi->irq > 0) {
- return dev_err_probe(dev, -ENODEV,
- "no interrupt name specified");
- }
- if (ret)
- return ret;
- ret = regmap_set_bits(st->regmap, MAX11410_REG_CTRL,
- MAX11410_CTRL_FORMAT_BIT);
- if (ret)
- return ret;
- ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,
- &max11410_trigger_handler,
- &max11410_buffer_ops);
- if (ret)
- return ret;
- if (st->irq > 0) {
- st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
- indio_dev->name,
- iio_device_id(indio_dev));
- if (!st->trig)
- return -ENOMEM;
- st->trig->ops = &max11410_trigger_ops;
- ret = devm_iio_trigger_register(dev, st->trig);
- if (ret)
- return ret;
- ret = devm_request_threaded_irq(dev, st->irq, NULL,
- &max11410_interrupt,
- IRQF_ONESHOT, "max11410",
- indio_dev);
- if (ret)
- return ret;
- }
- ret = max11410_self_calibrate(st);
- if (ret)
- return dev_err_probe(dev, ret,
- "cannot perform device self calibration\n");
- return devm_iio_device_register(dev, indio_dev);
- }
- static const struct of_device_id max11410_spi_of_id[] = {
- { .compatible = "adi,max11410" },
- { }
- };
- MODULE_DEVICE_TABLE(of, max11410_spi_of_id);
- static const struct spi_device_id max11410_id[] = {
- { "max11410" },
- { }
- };
- MODULE_DEVICE_TABLE(spi, max11410_id);
- static struct spi_driver max11410_driver = {
- .driver = {
- .name = "max11410",
- .of_match_table = max11410_spi_of_id,
- },
- .probe = max11410_probe,
- .id_table = max11410_id,
- };
- module_spi_driver(max11410_driver);
- MODULE_AUTHOR("David Jung <David.Jung@analog.com>");
- MODULE_AUTHOR("Ibrahim Tilki <Ibrahim.Tilki@analog.com>");
- MODULE_DESCRIPTION("Analog Devices MAX11410 ADC");
- MODULE_LICENSE("GPL");
|