1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Driver for the Nuvoton NAU7802 ADC
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright 2013 Free Electrons
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <linux/delay.h>
9*4882a593Smuzhiyun #include <linux/i2c.h>
10*4882a593Smuzhiyun #include <linux/interrupt.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/wait.h>
13*4882a593Smuzhiyun #include <linux/log2.h>
14*4882a593Smuzhiyun #include <linux/of.h>
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun #include <linux/iio/iio.h>
17*4882a593Smuzhiyun #include <linux/iio/sysfs.h>
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #define NAU7802_REG_PUCTRL 0x00
20*4882a593Smuzhiyun #define NAU7802_PUCTRL_RR(x) (x << 0)
21*4882a593Smuzhiyun #define NAU7802_PUCTRL_RR_BIT NAU7802_PUCTRL_RR(1)
22*4882a593Smuzhiyun #define NAU7802_PUCTRL_PUD(x) (x << 1)
23*4882a593Smuzhiyun #define NAU7802_PUCTRL_PUD_BIT NAU7802_PUCTRL_PUD(1)
24*4882a593Smuzhiyun #define NAU7802_PUCTRL_PUA(x) (x << 2)
25*4882a593Smuzhiyun #define NAU7802_PUCTRL_PUA_BIT NAU7802_PUCTRL_PUA(1)
26*4882a593Smuzhiyun #define NAU7802_PUCTRL_PUR(x) (x << 3)
27*4882a593Smuzhiyun #define NAU7802_PUCTRL_PUR_BIT NAU7802_PUCTRL_PUR(1)
28*4882a593Smuzhiyun #define NAU7802_PUCTRL_CS(x) (x << 4)
29*4882a593Smuzhiyun #define NAU7802_PUCTRL_CS_BIT NAU7802_PUCTRL_CS(1)
30*4882a593Smuzhiyun #define NAU7802_PUCTRL_CR(x) (x << 5)
31*4882a593Smuzhiyun #define NAU7802_PUCTRL_CR_BIT NAU7802_PUCTRL_CR(1)
32*4882a593Smuzhiyun #define NAU7802_PUCTRL_AVDDS(x) (x << 7)
33*4882a593Smuzhiyun #define NAU7802_PUCTRL_AVDDS_BIT NAU7802_PUCTRL_AVDDS(1)
34*4882a593Smuzhiyun #define NAU7802_REG_CTRL1 0x01
35*4882a593Smuzhiyun #define NAU7802_CTRL1_VLDO(x) (x << 3)
36*4882a593Smuzhiyun #define NAU7802_CTRL1_GAINS(x) (x)
37*4882a593Smuzhiyun #define NAU7802_CTRL1_GAINS_BITS 0x07
38*4882a593Smuzhiyun #define NAU7802_REG_CTRL2 0x02
39*4882a593Smuzhiyun #define NAU7802_CTRL2_CHS(x) (x << 7)
40*4882a593Smuzhiyun #define NAU7802_CTRL2_CRS(x) (x << 4)
41*4882a593Smuzhiyun #define NAU7802_SAMP_FREQ_320 0x07
42*4882a593Smuzhiyun #define NAU7802_CTRL2_CHS_BIT NAU7802_CTRL2_CHS(1)
43*4882a593Smuzhiyun #define NAU7802_REG_ADC_B2 0x12
44*4882a593Smuzhiyun #define NAU7802_REG_ADC_B1 0x13
45*4882a593Smuzhiyun #define NAU7802_REG_ADC_B0 0x14
46*4882a593Smuzhiyun #define NAU7802_REG_ADC_CTRL 0x15
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun #define NAU7802_MIN_CONVERSIONS 6
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun struct nau7802_state {
51*4882a593Smuzhiyun struct i2c_client *client;
52*4882a593Smuzhiyun s32 last_value;
53*4882a593Smuzhiyun struct mutex lock;
54*4882a593Smuzhiyun struct mutex data_lock;
55*4882a593Smuzhiyun u32 vref_mv;
56*4882a593Smuzhiyun u32 conversion_count;
57*4882a593Smuzhiyun u32 min_conversions;
58*4882a593Smuzhiyun u8 sample_rate;
59*4882a593Smuzhiyun u32 scale_avail[8];
60*4882a593Smuzhiyun struct completion value_ok;
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun #define NAU7802_CHANNEL(chan) { \
64*4882a593Smuzhiyun .type = IIO_VOLTAGE, \
65*4882a593Smuzhiyun .indexed = 1, \
66*4882a593Smuzhiyun .channel = (chan), \
67*4882a593Smuzhiyun .scan_index = (chan), \
68*4882a593Smuzhiyun .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
69*4882a593Smuzhiyun .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
70*4882a593Smuzhiyun BIT(IIO_CHAN_INFO_SAMP_FREQ) \
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun static const struct iio_chan_spec nau7802_chan_array[] = {
74*4882a593Smuzhiyun NAU7802_CHANNEL(0),
75*4882a593Smuzhiyun NAU7802_CHANNEL(1),
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun static const u16 nau7802_sample_freq_avail[] = {10, 20, 40, 80,
79*4882a593Smuzhiyun 10, 10, 10, 320};
80*4882a593Smuzhiyun
nau7802_show_scales(struct device * dev,struct device_attribute * attr,char * buf)81*4882a593Smuzhiyun static ssize_t nau7802_show_scales(struct device *dev,
82*4882a593Smuzhiyun struct device_attribute *attr, char *buf)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun struct nau7802_state *st = iio_priv(dev_to_iio_dev(dev));
85*4882a593Smuzhiyun int i, len = 0;
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++)
88*4882a593Smuzhiyun len += scnprintf(buf + len, PAGE_SIZE - len, "0.%09d ",
89*4882a593Smuzhiyun st->scale_avail[i]);
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun buf[len-1] = '\n';
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun return len;
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("10 40 80 320");
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun static IIO_DEVICE_ATTR(in_voltage_scale_available, S_IRUGO, nau7802_show_scales,
99*4882a593Smuzhiyun NULL, 0);
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun static struct attribute *nau7802_attributes[] = {
102*4882a593Smuzhiyun &iio_const_attr_sampling_frequency_available.dev_attr.attr,
103*4882a593Smuzhiyun &iio_dev_attr_in_voltage_scale_available.dev_attr.attr,
104*4882a593Smuzhiyun NULL
105*4882a593Smuzhiyun };
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun static const struct attribute_group nau7802_attribute_group = {
108*4882a593Smuzhiyun .attrs = nau7802_attributes,
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun
nau7802_set_gain(struct nau7802_state * st,int gain)111*4882a593Smuzhiyun static int nau7802_set_gain(struct nau7802_state *st, int gain)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun int ret;
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun mutex_lock(&st->lock);
116*4882a593Smuzhiyun st->conversion_count = 0;
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_CTRL1);
119*4882a593Smuzhiyun if (ret < 0)
120*4882a593Smuzhiyun goto nau7802_sysfs_set_gain_out;
121*4882a593Smuzhiyun ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_CTRL1,
122*4882a593Smuzhiyun (ret & (~NAU7802_CTRL1_GAINS_BITS)) |
123*4882a593Smuzhiyun gain);
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun nau7802_sysfs_set_gain_out:
126*4882a593Smuzhiyun mutex_unlock(&st->lock);
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun return ret;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun
nau7802_read_conversion(struct nau7802_state * st)131*4882a593Smuzhiyun static int nau7802_read_conversion(struct nau7802_state *st)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun int data;
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun mutex_lock(&st->data_lock);
136*4882a593Smuzhiyun data = i2c_smbus_read_byte_data(st->client, NAU7802_REG_ADC_B2);
137*4882a593Smuzhiyun if (data < 0)
138*4882a593Smuzhiyun goto nau7802_read_conversion_out;
139*4882a593Smuzhiyun st->last_value = data << 16;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun data = i2c_smbus_read_byte_data(st->client, NAU7802_REG_ADC_B1);
142*4882a593Smuzhiyun if (data < 0)
143*4882a593Smuzhiyun goto nau7802_read_conversion_out;
144*4882a593Smuzhiyun st->last_value |= data << 8;
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun data = i2c_smbus_read_byte_data(st->client, NAU7802_REG_ADC_B0);
147*4882a593Smuzhiyun if (data < 0)
148*4882a593Smuzhiyun goto nau7802_read_conversion_out;
149*4882a593Smuzhiyun st->last_value |= data;
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun st->last_value = sign_extend32(st->last_value, 23);
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun nau7802_read_conversion_out:
154*4882a593Smuzhiyun mutex_unlock(&st->data_lock);
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun return data;
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun /*
160*4882a593Smuzhiyun * Conversions are synchronised on the rising edge of NAU7802_PUCTRL_CS_BIT
161*4882a593Smuzhiyun */
nau7802_sync(struct nau7802_state * st)162*4882a593Smuzhiyun static int nau7802_sync(struct nau7802_state *st)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun int ret;
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_PUCTRL);
167*4882a593Smuzhiyun if (ret < 0)
168*4882a593Smuzhiyun return ret;
169*4882a593Smuzhiyun ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_PUCTRL,
170*4882a593Smuzhiyun ret | NAU7802_PUCTRL_CS_BIT);
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun return ret;
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun
nau7802_eoc_trigger(int irq,void * private)175*4882a593Smuzhiyun static irqreturn_t nau7802_eoc_trigger(int irq, void *private)
176*4882a593Smuzhiyun {
177*4882a593Smuzhiyun struct iio_dev *indio_dev = private;
178*4882a593Smuzhiyun struct nau7802_state *st = iio_priv(indio_dev);
179*4882a593Smuzhiyun int status;
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun status = i2c_smbus_read_byte_data(st->client, NAU7802_REG_PUCTRL);
182*4882a593Smuzhiyun if (status < 0)
183*4882a593Smuzhiyun return IRQ_HANDLED;
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun if (!(status & NAU7802_PUCTRL_CR_BIT))
186*4882a593Smuzhiyun return IRQ_NONE;
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun if (nau7802_read_conversion(st) < 0)
189*4882a593Smuzhiyun return IRQ_HANDLED;
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun /*
192*4882a593Smuzhiyun * Because there is actually only one ADC for both channels, we have to
193*4882a593Smuzhiyun * wait for enough conversions to happen before getting a significant
194*4882a593Smuzhiyun * value when changing channels and the values are far apart.
195*4882a593Smuzhiyun */
196*4882a593Smuzhiyun if (st->conversion_count < NAU7802_MIN_CONVERSIONS)
197*4882a593Smuzhiyun st->conversion_count++;
198*4882a593Smuzhiyun if (st->conversion_count >= NAU7802_MIN_CONVERSIONS)
199*4882a593Smuzhiyun complete(&st->value_ok);
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun return IRQ_HANDLED;
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun
nau7802_read_irq(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int * val)204*4882a593Smuzhiyun static int nau7802_read_irq(struct iio_dev *indio_dev,
205*4882a593Smuzhiyun struct iio_chan_spec const *chan,
206*4882a593Smuzhiyun int *val)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun struct nau7802_state *st = iio_priv(indio_dev);
209*4882a593Smuzhiyun int ret;
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun reinit_completion(&st->value_ok);
212*4882a593Smuzhiyun enable_irq(st->client->irq);
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun nau7802_sync(st);
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun /* read registers to ensure we flush everything */
217*4882a593Smuzhiyun ret = nau7802_read_conversion(st);
218*4882a593Smuzhiyun if (ret < 0)
219*4882a593Smuzhiyun goto read_chan_info_failure;
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun /* Wait for a conversion to finish */
222*4882a593Smuzhiyun ret = wait_for_completion_interruptible_timeout(&st->value_ok,
223*4882a593Smuzhiyun msecs_to_jiffies(1000));
224*4882a593Smuzhiyun if (ret == 0)
225*4882a593Smuzhiyun ret = -ETIMEDOUT;
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun if (ret < 0)
228*4882a593Smuzhiyun goto read_chan_info_failure;
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun disable_irq(st->client->irq);
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun *val = st->last_value;
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun return IIO_VAL_INT;
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun read_chan_info_failure:
237*4882a593Smuzhiyun disable_irq(st->client->irq);
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun return ret;
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun
nau7802_read_poll(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int * val)242*4882a593Smuzhiyun static int nau7802_read_poll(struct iio_dev *indio_dev,
243*4882a593Smuzhiyun struct iio_chan_spec const *chan,
244*4882a593Smuzhiyun int *val)
245*4882a593Smuzhiyun {
246*4882a593Smuzhiyun struct nau7802_state *st = iio_priv(indio_dev);
247*4882a593Smuzhiyun int ret;
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun nau7802_sync(st);
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun /* read registers to ensure we flush everything */
252*4882a593Smuzhiyun ret = nau7802_read_conversion(st);
253*4882a593Smuzhiyun if (ret < 0)
254*4882a593Smuzhiyun return ret;
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun /*
257*4882a593Smuzhiyun * Because there is actually only one ADC for both channels, we have to
258*4882a593Smuzhiyun * wait for enough conversions to happen before getting a significant
259*4882a593Smuzhiyun * value when changing channels and the values are far appart.
260*4882a593Smuzhiyun */
261*4882a593Smuzhiyun do {
262*4882a593Smuzhiyun ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_PUCTRL);
263*4882a593Smuzhiyun if (ret < 0)
264*4882a593Smuzhiyun return ret;
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun while (!(ret & NAU7802_PUCTRL_CR_BIT)) {
267*4882a593Smuzhiyun if (st->sample_rate != NAU7802_SAMP_FREQ_320)
268*4882a593Smuzhiyun msleep(20);
269*4882a593Smuzhiyun else
270*4882a593Smuzhiyun mdelay(4);
271*4882a593Smuzhiyun ret = i2c_smbus_read_byte_data(st->client,
272*4882a593Smuzhiyun NAU7802_REG_PUCTRL);
273*4882a593Smuzhiyun if (ret < 0)
274*4882a593Smuzhiyun return ret;
275*4882a593Smuzhiyun }
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun ret = nau7802_read_conversion(st);
278*4882a593Smuzhiyun if (ret < 0)
279*4882a593Smuzhiyun return ret;
280*4882a593Smuzhiyun if (st->conversion_count < NAU7802_MIN_CONVERSIONS)
281*4882a593Smuzhiyun st->conversion_count++;
282*4882a593Smuzhiyun } while (st->conversion_count < NAU7802_MIN_CONVERSIONS);
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun *val = st->last_value;
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun return IIO_VAL_INT;
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun
nau7802_read_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int * val,int * val2,long mask)289*4882a593Smuzhiyun static int nau7802_read_raw(struct iio_dev *indio_dev,
290*4882a593Smuzhiyun struct iio_chan_spec const *chan,
291*4882a593Smuzhiyun int *val, int *val2, long mask)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun struct nau7802_state *st = iio_priv(indio_dev);
294*4882a593Smuzhiyun int ret;
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun switch (mask) {
297*4882a593Smuzhiyun case IIO_CHAN_INFO_RAW:
298*4882a593Smuzhiyun mutex_lock(&st->lock);
299*4882a593Smuzhiyun /*
300*4882a593Smuzhiyun * Select the channel to use
301*4882a593Smuzhiyun * - Channel 1 is value 0 in the CHS register
302*4882a593Smuzhiyun * - Channel 2 is value 1 in the CHS register
303*4882a593Smuzhiyun */
304*4882a593Smuzhiyun ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_CTRL2);
305*4882a593Smuzhiyun if (ret < 0) {
306*4882a593Smuzhiyun mutex_unlock(&st->lock);
307*4882a593Smuzhiyun return ret;
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun if (((ret & NAU7802_CTRL2_CHS_BIT) && !chan->channel) ||
311*4882a593Smuzhiyun (!(ret & NAU7802_CTRL2_CHS_BIT) &&
312*4882a593Smuzhiyun chan->channel)) {
313*4882a593Smuzhiyun st->conversion_count = 0;
314*4882a593Smuzhiyun ret = i2c_smbus_write_byte_data(st->client,
315*4882a593Smuzhiyun NAU7802_REG_CTRL2,
316*4882a593Smuzhiyun NAU7802_CTRL2_CHS(chan->channel) |
317*4882a593Smuzhiyun NAU7802_CTRL2_CRS(st->sample_rate));
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun if (ret < 0) {
320*4882a593Smuzhiyun mutex_unlock(&st->lock);
321*4882a593Smuzhiyun return ret;
322*4882a593Smuzhiyun }
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun if (st->client->irq)
326*4882a593Smuzhiyun ret = nau7802_read_irq(indio_dev, chan, val);
327*4882a593Smuzhiyun else
328*4882a593Smuzhiyun ret = nau7802_read_poll(indio_dev, chan, val);
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun mutex_unlock(&st->lock);
331*4882a593Smuzhiyun return ret;
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun case IIO_CHAN_INFO_SCALE:
334*4882a593Smuzhiyun ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_CTRL1);
335*4882a593Smuzhiyun if (ret < 0)
336*4882a593Smuzhiyun return ret;
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun /*
339*4882a593Smuzhiyun * We have 24 bits of signed data, that means 23 bits of data
340*4882a593Smuzhiyun * plus the sign bit
341*4882a593Smuzhiyun */
342*4882a593Smuzhiyun *val = st->vref_mv;
343*4882a593Smuzhiyun *val2 = 23 + (ret & NAU7802_CTRL1_GAINS_BITS);
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun return IIO_VAL_FRACTIONAL_LOG2;
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun case IIO_CHAN_INFO_SAMP_FREQ:
348*4882a593Smuzhiyun *val = nau7802_sample_freq_avail[st->sample_rate];
349*4882a593Smuzhiyun *val2 = 0;
350*4882a593Smuzhiyun return IIO_VAL_INT;
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun default:
353*4882a593Smuzhiyun break;
354*4882a593Smuzhiyun }
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun return -EINVAL;
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun
nau7802_write_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int val,int val2,long mask)359*4882a593Smuzhiyun static int nau7802_write_raw(struct iio_dev *indio_dev,
360*4882a593Smuzhiyun struct iio_chan_spec const *chan,
361*4882a593Smuzhiyun int val, int val2, long mask)
362*4882a593Smuzhiyun {
363*4882a593Smuzhiyun struct nau7802_state *st = iio_priv(indio_dev);
364*4882a593Smuzhiyun int i, ret;
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun switch (mask) {
367*4882a593Smuzhiyun case IIO_CHAN_INFO_SCALE:
368*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++)
369*4882a593Smuzhiyun if (val2 == st->scale_avail[i])
370*4882a593Smuzhiyun return nau7802_set_gain(st, i);
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun break;
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun case IIO_CHAN_INFO_SAMP_FREQ:
375*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(nau7802_sample_freq_avail); i++)
376*4882a593Smuzhiyun if (val == nau7802_sample_freq_avail[i]) {
377*4882a593Smuzhiyun mutex_lock(&st->lock);
378*4882a593Smuzhiyun st->sample_rate = i;
379*4882a593Smuzhiyun st->conversion_count = 0;
380*4882a593Smuzhiyun ret = i2c_smbus_write_byte_data(st->client,
381*4882a593Smuzhiyun NAU7802_REG_CTRL2,
382*4882a593Smuzhiyun NAU7802_CTRL2_CRS(st->sample_rate));
383*4882a593Smuzhiyun mutex_unlock(&st->lock);
384*4882a593Smuzhiyun return ret;
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun break;
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun default:
390*4882a593Smuzhiyun break;
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun return -EINVAL;
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun
nau7802_write_raw_get_fmt(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,long mask)396*4882a593Smuzhiyun static int nau7802_write_raw_get_fmt(struct iio_dev *indio_dev,
397*4882a593Smuzhiyun struct iio_chan_spec const *chan,
398*4882a593Smuzhiyun long mask)
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun return IIO_VAL_INT_PLUS_NANO;
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun static const struct iio_info nau7802_info = {
404*4882a593Smuzhiyun .read_raw = &nau7802_read_raw,
405*4882a593Smuzhiyun .write_raw = &nau7802_write_raw,
406*4882a593Smuzhiyun .write_raw_get_fmt = nau7802_write_raw_get_fmt,
407*4882a593Smuzhiyun .attrs = &nau7802_attribute_group,
408*4882a593Smuzhiyun };
409*4882a593Smuzhiyun
nau7802_probe(struct i2c_client * client,const struct i2c_device_id * id)410*4882a593Smuzhiyun static int nau7802_probe(struct i2c_client *client,
411*4882a593Smuzhiyun const struct i2c_device_id *id)
412*4882a593Smuzhiyun {
413*4882a593Smuzhiyun struct iio_dev *indio_dev;
414*4882a593Smuzhiyun struct nau7802_state *st;
415*4882a593Smuzhiyun struct device_node *np = client->dev.of_node;
416*4882a593Smuzhiyun int i, ret;
417*4882a593Smuzhiyun u8 data;
418*4882a593Smuzhiyun u32 tmp = 0;
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun if (!client->dev.of_node) {
421*4882a593Smuzhiyun dev_err(&client->dev, "No device tree node available.\n");
422*4882a593Smuzhiyun return -EINVAL;
423*4882a593Smuzhiyun }
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*st));
426*4882a593Smuzhiyun if (indio_dev == NULL)
427*4882a593Smuzhiyun return -ENOMEM;
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun st = iio_priv(indio_dev);
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun i2c_set_clientdata(client, indio_dev);
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun indio_dev->name = dev_name(&client->dev);
434*4882a593Smuzhiyun indio_dev->modes = INDIO_DIRECT_MODE;
435*4882a593Smuzhiyun indio_dev->info = &nau7802_info;
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun st->client = client;
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun /* Reset the device */
440*4882a593Smuzhiyun ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_PUCTRL,
441*4882a593Smuzhiyun NAU7802_PUCTRL_RR_BIT);
442*4882a593Smuzhiyun if (ret < 0)
443*4882a593Smuzhiyun return ret;
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun /* Enter normal operation mode */
446*4882a593Smuzhiyun ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_PUCTRL,
447*4882a593Smuzhiyun NAU7802_PUCTRL_PUD_BIT);
448*4882a593Smuzhiyun if (ret < 0)
449*4882a593Smuzhiyun return ret;
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun /*
452*4882a593Smuzhiyun * After about 200 usecs, the device should be ready and then
453*4882a593Smuzhiyun * the Power Up bit will be set to 1. If not, wait for it.
454*4882a593Smuzhiyun */
455*4882a593Smuzhiyun udelay(210);
456*4882a593Smuzhiyun ret = i2c_smbus_read_byte_data(st->client, NAU7802_REG_PUCTRL);
457*4882a593Smuzhiyun if (ret < 0)
458*4882a593Smuzhiyun return ret;
459*4882a593Smuzhiyun if (!(ret & NAU7802_PUCTRL_PUR_BIT))
460*4882a593Smuzhiyun return ret;
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun of_property_read_u32(np, "nuvoton,vldo", &tmp);
463*4882a593Smuzhiyun st->vref_mv = tmp;
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun data = NAU7802_PUCTRL_PUD_BIT | NAU7802_PUCTRL_PUA_BIT |
466*4882a593Smuzhiyun NAU7802_PUCTRL_CS_BIT;
467*4882a593Smuzhiyun if (tmp >= 2400)
468*4882a593Smuzhiyun data |= NAU7802_PUCTRL_AVDDS_BIT;
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_PUCTRL, data);
471*4882a593Smuzhiyun if (ret < 0)
472*4882a593Smuzhiyun return ret;
473*4882a593Smuzhiyun ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_ADC_CTRL, 0x30);
474*4882a593Smuzhiyun if (ret < 0)
475*4882a593Smuzhiyun return ret;
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun if (tmp >= 2400) {
478*4882a593Smuzhiyun data = NAU7802_CTRL1_VLDO((4500 - tmp) / 300);
479*4882a593Smuzhiyun ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_CTRL1,
480*4882a593Smuzhiyun data);
481*4882a593Smuzhiyun if (ret < 0)
482*4882a593Smuzhiyun return ret;
483*4882a593Smuzhiyun }
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun /* Populate available ADC input ranges */
486*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++)
487*4882a593Smuzhiyun st->scale_avail[i] = (((u64)st->vref_mv) * 1000000000ULL)
488*4882a593Smuzhiyun >> (23 + i);
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun init_completion(&st->value_ok);
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun /*
493*4882a593Smuzhiyun * The ADC fires continuously and we can't do anything about
494*4882a593Smuzhiyun * it. So we need to have the IRQ disabled by default, and we
495*4882a593Smuzhiyun * will enable them back when we will need them..
496*4882a593Smuzhiyun */
497*4882a593Smuzhiyun if (client->irq) {
498*4882a593Smuzhiyun ret = request_threaded_irq(client->irq,
499*4882a593Smuzhiyun NULL,
500*4882a593Smuzhiyun nau7802_eoc_trigger,
501*4882a593Smuzhiyun IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
502*4882a593Smuzhiyun client->dev.driver->name,
503*4882a593Smuzhiyun indio_dev);
504*4882a593Smuzhiyun if (ret) {
505*4882a593Smuzhiyun /*
506*4882a593Smuzhiyun * What may happen here is that our IRQ controller is
507*4882a593Smuzhiyun * not able to get level interrupt but this is required
508*4882a593Smuzhiyun * by this ADC as when going over 40 sample per second,
509*4882a593Smuzhiyun * the interrupt line may stay high between conversions.
510*4882a593Smuzhiyun * So, we continue no matter what but we switch to
511*4882a593Smuzhiyun * polling mode.
512*4882a593Smuzhiyun */
513*4882a593Smuzhiyun dev_info(&client->dev,
514*4882a593Smuzhiyun "Failed to allocate IRQ, using polling mode\n");
515*4882a593Smuzhiyun client->irq = 0;
516*4882a593Smuzhiyun } else
517*4882a593Smuzhiyun disable_irq(client->irq);
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun if (!client->irq) {
521*4882a593Smuzhiyun /*
522*4882a593Smuzhiyun * We are polling, use the fastest sample rate by
523*4882a593Smuzhiyun * default
524*4882a593Smuzhiyun */
525*4882a593Smuzhiyun st->sample_rate = NAU7802_SAMP_FREQ_320;
526*4882a593Smuzhiyun ret = i2c_smbus_write_byte_data(st->client, NAU7802_REG_CTRL2,
527*4882a593Smuzhiyun NAU7802_CTRL2_CRS(st->sample_rate));
528*4882a593Smuzhiyun if (ret)
529*4882a593Smuzhiyun goto error_free_irq;
530*4882a593Smuzhiyun }
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun /* Setup the ADC channels available on the board */
533*4882a593Smuzhiyun indio_dev->num_channels = ARRAY_SIZE(nau7802_chan_array);
534*4882a593Smuzhiyun indio_dev->channels = nau7802_chan_array;
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun mutex_init(&st->lock);
537*4882a593Smuzhiyun mutex_init(&st->data_lock);
538*4882a593Smuzhiyun
539*4882a593Smuzhiyun ret = iio_device_register(indio_dev);
540*4882a593Smuzhiyun if (ret < 0) {
541*4882a593Smuzhiyun dev_err(&client->dev, "Couldn't register the device.\n");
542*4882a593Smuzhiyun goto error_device_register;
543*4882a593Smuzhiyun }
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun return 0;
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun error_device_register:
548*4882a593Smuzhiyun mutex_destroy(&st->lock);
549*4882a593Smuzhiyun mutex_destroy(&st->data_lock);
550*4882a593Smuzhiyun error_free_irq:
551*4882a593Smuzhiyun if (client->irq)
552*4882a593Smuzhiyun free_irq(client->irq, indio_dev);
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun return ret;
555*4882a593Smuzhiyun }
556*4882a593Smuzhiyun
nau7802_remove(struct i2c_client * client)557*4882a593Smuzhiyun static int nau7802_remove(struct i2c_client *client)
558*4882a593Smuzhiyun {
559*4882a593Smuzhiyun struct iio_dev *indio_dev = i2c_get_clientdata(client);
560*4882a593Smuzhiyun struct nau7802_state *st = iio_priv(indio_dev);
561*4882a593Smuzhiyun
562*4882a593Smuzhiyun iio_device_unregister(indio_dev);
563*4882a593Smuzhiyun mutex_destroy(&st->lock);
564*4882a593Smuzhiyun mutex_destroy(&st->data_lock);
565*4882a593Smuzhiyun if (client->irq)
566*4882a593Smuzhiyun free_irq(client->irq, indio_dev);
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun return 0;
569*4882a593Smuzhiyun }
570*4882a593Smuzhiyun
571*4882a593Smuzhiyun static const struct i2c_device_id nau7802_i2c_id[] = {
572*4882a593Smuzhiyun { "nau7802", 0 },
573*4882a593Smuzhiyun { }
574*4882a593Smuzhiyun };
575*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, nau7802_i2c_id);
576*4882a593Smuzhiyun
577*4882a593Smuzhiyun static const struct of_device_id nau7802_dt_ids[] = {
578*4882a593Smuzhiyun { .compatible = "nuvoton,nau7802" },
579*4882a593Smuzhiyun {},
580*4882a593Smuzhiyun };
581*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, nau7802_dt_ids);
582*4882a593Smuzhiyun
583*4882a593Smuzhiyun static struct i2c_driver nau7802_driver = {
584*4882a593Smuzhiyun .probe = nau7802_probe,
585*4882a593Smuzhiyun .remove = nau7802_remove,
586*4882a593Smuzhiyun .id_table = nau7802_i2c_id,
587*4882a593Smuzhiyun .driver = {
588*4882a593Smuzhiyun .name = "nau7802",
589*4882a593Smuzhiyun .of_match_table = nau7802_dt_ids,
590*4882a593Smuzhiyun },
591*4882a593Smuzhiyun };
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun module_i2c_driver(nau7802_driver);
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun MODULE_LICENSE("GPL");
596*4882a593Smuzhiyun MODULE_DESCRIPTION("Nuvoton NAU7802 ADC Driver");
597*4882a593Smuzhiyun MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
598*4882a593Smuzhiyun MODULE_AUTHOR("Alexandre Belloni <alexandre.belloni@free-electrons.com>");
599