drm/client: Fix drm client endless Kconfig loop
[drm/drm-misc.git] / drivers / iio / adc / twl4030-madc.c
blob0ea51ddeaa0a0a9bc22caa75b5001584993bfc73
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
4 * TWL4030 MADC module driver-This driver monitors the real time
5 * conversion of analog signals like battery temperature,
6 * battery type, battery level etc.
8 * Copyright (C) 2011 Texas Instruments Incorporated - https://www.ti.com/
9 * J Keerthy <j-keerthy@ti.com>
11 * Based on twl4030-madc.c
12 * Copyright (C) 2008 Nokia Corporation
13 * Mikko Ylinen <mikko.k.ylinen@nokia.com>
15 * Amit Kucheria <amit.kucheria@canonical.com>
18 #include <linux/device.h>
19 #include <linux/interrupt.h>
20 #include <linux/kernel.h>
21 #include <linux/delay.h>
22 #include <linux/mod_devicetable.h>
23 #include <linux/module.h>
24 #include <linux/platform_device.h>
25 #include <linux/property.h>
26 #include <linux/slab.h>
27 #include <linux/mfd/twl.h>
28 #include <linux/stddef.h>
29 #include <linux/mutex.h>
30 #include <linux/bitops.h>
31 #include <linux/jiffies.h>
32 #include <linux/types.h>
33 #include <linux/gfp.h>
34 #include <linux/err.h>
35 #include <linux/regulator/consumer.h>
37 #include <linux/iio/iio.h>
39 #define TWL4030_MADC_MAX_CHANNELS 16
41 #define TWL4030_MADC_CTRL1 0x00
42 #define TWL4030_MADC_CTRL2 0x01
44 #define TWL4030_MADC_RTSELECT_LSB 0x02
45 #define TWL4030_MADC_SW1SELECT_LSB 0x06
46 #define TWL4030_MADC_SW2SELECT_LSB 0x0A
48 #define TWL4030_MADC_RTAVERAGE_LSB 0x04
49 #define TWL4030_MADC_SW1AVERAGE_LSB 0x08
50 #define TWL4030_MADC_SW2AVERAGE_LSB 0x0C
52 #define TWL4030_MADC_CTRL_SW1 0x12
53 #define TWL4030_MADC_CTRL_SW2 0x13
55 #define TWL4030_MADC_RTCH0_LSB 0x17
56 #define TWL4030_MADC_GPCH0_LSB 0x37
58 #define TWL4030_MADC_MADCON (1 << 0) /* MADC power on */
59 #define TWL4030_MADC_BUSY (1 << 0) /* MADC busy */
60 /* MADC conversion completion */
61 #define TWL4030_MADC_EOC_SW (1 << 1)
62 /* MADC SWx start conversion */
63 #define TWL4030_MADC_SW_START (1 << 5)
64 #define TWL4030_MADC_ADCIN0 (1 << 0)
65 #define TWL4030_MADC_ADCIN1 (1 << 1)
66 #define TWL4030_MADC_ADCIN2 (1 << 2)
67 #define TWL4030_MADC_ADCIN3 (1 << 3)
68 #define TWL4030_MADC_ADCIN4 (1 << 4)
69 #define TWL4030_MADC_ADCIN5 (1 << 5)
70 #define TWL4030_MADC_ADCIN6 (1 << 6)
71 #define TWL4030_MADC_ADCIN7 (1 << 7)
72 #define TWL4030_MADC_ADCIN8 (1 << 8)
73 #define TWL4030_MADC_ADCIN9 (1 << 9)
74 #define TWL4030_MADC_ADCIN10 (1 << 10)
75 #define TWL4030_MADC_ADCIN11 (1 << 11)
76 #define TWL4030_MADC_ADCIN12 (1 << 12)
77 #define TWL4030_MADC_ADCIN13 (1 << 13)
78 #define TWL4030_MADC_ADCIN14 (1 << 14)
79 #define TWL4030_MADC_ADCIN15 (1 << 15)
81 /* Fixed channels */
82 #define TWL4030_MADC_BTEMP TWL4030_MADC_ADCIN1
83 #define TWL4030_MADC_VBUS TWL4030_MADC_ADCIN8
84 #define TWL4030_MADC_VBKB TWL4030_MADC_ADCIN9
85 #define TWL4030_MADC_ICHG TWL4030_MADC_ADCIN10
86 #define TWL4030_MADC_VCHG TWL4030_MADC_ADCIN11
87 #define TWL4030_MADC_VBAT TWL4030_MADC_ADCIN12
89 /* Step size and prescaler ratio */
90 #define TEMP_STEP_SIZE 147
91 #define TEMP_PSR_R 100
92 #define CURR_STEP_SIZE 147
93 #define CURR_PSR_R1 44
94 #define CURR_PSR_R2 88
96 #define TWL4030_BCI_BCICTL1 0x23
97 #define TWL4030_BCI_CGAIN 0x020
98 #define TWL4030_BCI_MESBAT (1 << 1)
99 #define TWL4030_BCI_TYPEN (1 << 4)
100 #define TWL4030_BCI_ITHEN (1 << 3)
102 #define REG_BCICTL2 0x024
103 #define TWL4030_BCI_ITHSENS 0x007
105 /* Register and bits for GPBR1 register */
106 #define TWL4030_REG_GPBR1 0x0c
107 #define TWL4030_GPBR1_MADC_HFCLK_EN (1 << 7)
109 #define TWL4030_USB_SEL_MADC_MCPC (1<<3)
110 #define TWL4030_USB_CARKIT_ANA_CTRL 0xBB
112 struct twl4030_madc_conversion_method {
113 u8 sel;
114 u8 avg;
115 u8 rbase;
116 u8 ctrl;
120 * struct twl4030_madc_request - madc request packet for channel conversion
121 * @channels: 16 bit bitmap for individual channels
122 * @do_avg: sample the input channel for 4 consecutive cycles
123 * @method: RT, SW1, SW2
124 * @type: Polling or interrupt based method
125 * @active: Flag if request is active
126 * @result_pending: Flag from irq handler, that result is ready
127 * @raw: Return raw value, do not convert it
128 * @rbuf: Result buffer
130 struct twl4030_madc_request {
131 unsigned long channels;
132 bool do_avg;
133 u16 method;
134 u16 type;
135 bool active;
136 bool result_pending;
137 bool raw;
138 int rbuf[TWL4030_MADC_MAX_CHANNELS];
141 enum conversion_methods {
142 TWL4030_MADC_RT,
143 TWL4030_MADC_SW1,
144 TWL4030_MADC_SW2,
145 TWL4030_MADC_NUM_METHODS
148 enum sample_type {
149 TWL4030_MADC_WAIT,
150 TWL4030_MADC_IRQ_ONESHOT,
151 TWL4030_MADC_IRQ_REARM
155 * struct twl4030_madc_data - a container for madc info
156 * @dev: Pointer to device structure for madc
157 * @lock: Mutex protecting this data structure
158 * @usb3v1: Pointer to bias regulator for madc
159 * @requests: Array of request struct corresponding to SW1, SW2 and RT
160 * @use_second_irq: IRQ selection (main or co-processor)
161 * @imr: Interrupt mask register of MADC
162 * @isr: Interrupt status register of MADC
164 struct twl4030_madc_data {
165 struct device *dev;
166 struct mutex lock;
167 struct regulator *usb3v1;
168 struct twl4030_madc_request requests[TWL4030_MADC_NUM_METHODS];
169 bool use_second_irq;
170 u8 imr;
171 u8 isr;
174 static int twl4030_madc_conversion(struct twl4030_madc_request *req);
176 static int twl4030_madc_read(struct iio_dev *iio_dev,
177 const struct iio_chan_spec *chan,
178 int *val, int *val2, long mask)
180 struct twl4030_madc_data *madc = iio_priv(iio_dev);
181 struct twl4030_madc_request req;
182 int ret;
184 req.method = madc->use_second_irq ? TWL4030_MADC_SW2 : TWL4030_MADC_SW1;
186 req.channels = BIT(chan->channel);
187 req.active = false;
188 req.type = TWL4030_MADC_WAIT;
189 req.raw = !(mask == IIO_CHAN_INFO_PROCESSED);
190 req.do_avg = (mask == IIO_CHAN_INFO_AVERAGE_RAW);
192 ret = twl4030_madc_conversion(&req);
193 if (ret < 0)
194 return ret;
196 *val = req.rbuf[chan->channel];
198 return IIO_VAL_INT;
201 static const struct iio_info twl4030_madc_iio_info = {
202 .read_raw = &twl4030_madc_read,
205 #define TWL4030_ADC_CHANNEL(_channel, _type, _name) { \
206 .type = _type, \
207 .channel = _channel, \
208 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
209 BIT(IIO_CHAN_INFO_AVERAGE_RAW) | \
210 BIT(IIO_CHAN_INFO_PROCESSED), \
211 .datasheet_name = _name, \
212 .indexed = 1, \
215 static const struct iio_chan_spec twl4030_madc_iio_channels[] = {
216 TWL4030_ADC_CHANNEL(0, IIO_VOLTAGE, "ADCIN0"),
217 TWL4030_ADC_CHANNEL(1, IIO_TEMP, "ADCIN1"),
218 TWL4030_ADC_CHANNEL(2, IIO_VOLTAGE, "ADCIN2"),
219 TWL4030_ADC_CHANNEL(3, IIO_VOLTAGE, "ADCIN3"),
220 TWL4030_ADC_CHANNEL(4, IIO_VOLTAGE, "ADCIN4"),
221 TWL4030_ADC_CHANNEL(5, IIO_VOLTAGE, "ADCIN5"),
222 TWL4030_ADC_CHANNEL(6, IIO_VOLTAGE, "ADCIN6"),
223 TWL4030_ADC_CHANNEL(7, IIO_VOLTAGE, "ADCIN7"),
224 TWL4030_ADC_CHANNEL(8, IIO_VOLTAGE, "ADCIN8"),
225 TWL4030_ADC_CHANNEL(9, IIO_VOLTAGE, "ADCIN9"),
226 TWL4030_ADC_CHANNEL(10, IIO_CURRENT, "ADCIN10"),
227 TWL4030_ADC_CHANNEL(11, IIO_VOLTAGE, "ADCIN11"),
228 TWL4030_ADC_CHANNEL(12, IIO_VOLTAGE, "ADCIN12"),
229 TWL4030_ADC_CHANNEL(13, IIO_VOLTAGE, "ADCIN13"),
230 TWL4030_ADC_CHANNEL(14, IIO_VOLTAGE, "ADCIN14"),
231 TWL4030_ADC_CHANNEL(15, IIO_VOLTAGE, "ADCIN15"),
234 static struct twl4030_madc_data *twl4030_madc;
236 static const struct s16_fract twl4030_divider_ratios[16] = {
237 {1, 1}, /* CHANNEL 0 No Prescaler */
238 {1, 1}, /* CHANNEL 1 No Prescaler */
239 {6, 10}, /* CHANNEL 2 */
240 {6, 10}, /* CHANNEL 3 */
241 {6, 10}, /* CHANNEL 4 */
242 {6, 10}, /* CHANNEL 5 */
243 {6, 10}, /* CHANNEL 6 */
244 {6, 10}, /* CHANNEL 7 */
245 {3, 14}, /* CHANNEL 8 */
246 {1, 3}, /* CHANNEL 9 */
247 {1, 1}, /* CHANNEL 10 No Prescaler */
248 {15, 100}, /* CHANNEL 11 */
249 {1, 4}, /* CHANNEL 12 */
250 {1, 1}, /* CHANNEL 13 Reserved channels */
251 {1, 1}, /* CHANNEL 14 Reserved channels */
252 {5, 11}, /* CHANNEL 15 */
255 /* Conversion table from -3 to 55 degrees Celcius */
256 static int twl4030_therm_tbl[] = {
257 30800, 29500, 28300, 27100,
258 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700,
259 17900, 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100,
260 12600, 12100, 11600, 11200, 10800, 10400, 10000, 9630, 9280,
261 8950, 8620, 8310, 8020, 7730, 7460, 7200, 6950, 6710,
262 6470, 6250, 6040, 5830, 5640, 5450, 5260, 5090, 4920,
263 4760, 4600, 4450, 4310, 4170, 4040, 3910, 3790, 3670,
264 3550
268 * Structure containing the registers
269 * of different conversion methods supported by MADC.
270 * Hardware or RT real time conversion request initiated by external host
271 * processor for RT Signal conversions.
272 * External host processors can also request for non RT conversions
273 * SW1 and SW2 software conversions also called asynchronous or GPC request.
275 static
276 const struct twl4030_madc_conversion_method twl4030_conversion_methods[] = {
277 [TWL4030_MADC_RT] = {
278 .sel = TWL4030_MADC_RTSELECT_LSB,
279 .avg = TWL4030_MADC_RTAVERAGE_LSB,
280 .rbase = TWL4030_MADC_RTCH0_LSB,
282 [TWL4030_MADC_SW1] = {
283 .sel = TWL4030_MADC_SW1SELECT_LSB,
284 .avg = TWL4030_MADC_SW1AVERAGE_LSB,
285 .rbase = TWL4030_MADC_GPCH0_LSB,
286 .ctrl = TWL4030_MADC_CTRL_SW1,
288 [TWL4030_MADC_SW2] = {
289 .sel = TWL4030_MADC_SW2SELECT_LSB,
290 .avg = TWL4030_MADC_SW2AVERAGE_LSB,
291 .rbase = TWL4030_MADC_GPCH0_LSB,
292 .ctrl = TWL4030_MADC_CTRL_SW2,
297 * twl4030_madc_channel_raw_read() - Function to read a particular channel value
298 * @madc: pointer to struct twl4030_madc_data
299 * @reg: lsb of ADC Channel
301 * Return: 0 on success, an error code otherwise.
303 static int twl4030_madc_channel_raw_read(struct twl4030_madc_data *madc, u8 reg)
305 u16 val;
306 int ret;
308 * For each ADC channel, we have MSB and LSB register pair. MSB address
309 * is always LSB address+1. reg parameter is the address of LSB register
311 ret = twl_i2c_read_u16(TWL4030_MODULE_MADC, &val, reg);
312 if (ret) {
313 dev_err(madc->dev, "unable to read register 0x%X\n", reg);
314 return ret;
317 return (int)(val >> 6);
321 * Return battery temperature in degrees Celsius
322 * Or < 0 on failure.
324 static int twl4030battery_temperature(int raw_volt)
326 u8 val;
327 int temp, curr, volt, res, ret;
329 volt = (raw_volt * TEMP_STEP_SIZE) / TEMP_PSR_R;
330 /* Getting and calculating the supply current in micro amperes */
331 ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE, &val,
332 REG_BCICTL2);
333 if (ret < 0)
334 return ret;
336 curr = ((val & TWL4030_BCI_ITHSENS) + 1) * 10;
337 /* Getting and calculating the thermistor resistance in ohms */
338 res = volt * 1000 / curr;
339 /* calculating temperature */
340 for (temp = 58; temp >= 0; temp--) {
341 int actual = twl4030_therm_tbl[temp];
342 if ((actual - res) >= 0)
343 break;
346 return temp + 1;
349 static int twl4030battery_current(int raw_volt)
351 int ret;
352 u8 val;
354 ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE, &val,
355 TWL4030_BCI_BCICTL1);
356 if (ret)
357 return ret;
358 if (val & TWL4030_BCI_CGAIN) /* slope of 0.44 mV/mA */
359 return (raw_volt * CURR_STEP_SIZE) / CURR_PSR_R1;
360 else /* slope of 0.88 mV/mA */
361 return (raw_volt * CURR_STEP_SIZE) / CURR_PSR_R2;
365 * Function to read channel values
366 * @madc - pointer to twl4030_madc_data struct
367 * @reg_base - Base address of the first channel
368 * @Channels - 16 bit bitmap. If the bit is set, channel's value is read
369 * @buf - The channel values are stored here. if read fails error
370 * @raw - Return raw values without conversion
371 * value is stored
372 * Returns the number of successfully read channels.
374 static int twl4030_madc_read_channels(struct twl4030_madc_data *madc,
375 u8 reg_base, unsigned
376 long channels, int *buf,
377 bool raw)
379 int count = 0;
380 int i;
381 u8 reg;
383 for_each_set_bit(i, &channels, TWL4030_MADC_MAX_CHANNELS) {
384 reg = reg_base + (2 * i);
385 buf[i] = twl4030_madc_channel_raw_read(madc, reg);
386 if (buf[i] < 0) {
387 dev_err(madc->dev, "Unable to read register 0x%X\n",
388 reg);
389 return buf[i];
391 if (raw) {
392 count++;
393 continue;
395 switch (i) {
396 case 10:
397 buf[i] = twl4030battery_current(buf[i]);
398 if (buf[i] < 0) {
399 dev_err(madc->dev, "err reading current\n");
400 return buf[i];
401 } else {
402 count++;
403 buf[i] = buf[i] - 750;
405 break;
406 case 1:
407 buf[i] = twl4030battery_temperature(buf[i]);
408 if (buf[i] < 0) {
409 dev_err(madc->dev, "err reading temperature\n");
410 return buf[i];
411 } else {
412 buf[i] -= 3;
413 count++;
415 break;
416 default:
417 count++;
418 /* Analog Input (V) = conv_result * step_size / R
419 * conv_result = decimal value of 10-bit conversion
420 * result
421 * step size = 1.5 / (2 ^ 10 -1)
422 * R = Prescaler ratio for input channels.
423 * Result given in mV hence multiplied by 1000.
425 buf[i] = (buf[i] * 3 * 1000 *
426 twl4030_divider_ratios[i].denominator)
427 / (2 * 1023 *
428 twl4030_divider_ratios[i].numerator);
432 return count;
436 * Disables irq.
437 * @madc - pointer to twl4030_madc_data struct
438 * @id - irq number to be disabled
439 * can take one of TWL4030_MADC_RT, TWL4030_MADC_SW1, TWL4030_MADC_SW2
440 * corresponding to RT, SW1, SW2 conversion requests.
441 * Returns error if i2c read/write fails.
443 static int twl4030_madc_disable_irq(struct twl4030_madc_data *madc, u8 id)
445 u8 val;
446 int ret;
448 ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &val, madc->imr);
449 if (ret) {
450 dev_err(madc->dev, "unable to read imr register 0x%X\n",
451 madc->imr);
452 return ret;
454 val |= (1 << id);
455 ret = twl_i2c_write_u8(TWL4030_MODULE_MADC, val, madc->imr);
456 if (ret) {
457 dev_err(madc->dev,
458 "unable to write imr register 0x%X\n", madc->imr);
459 return ret;
462 return 0;
465 static irqreturn_t twl4030_madc_threaded_irq_handler(int irq, void *_madc)
467 struct twl4030_madc_data *madc = _madc;
468 const struct twl4030_madc_conversion_method *method;
469 u8 isr_val, imr_val;
470 int i, ret;
471 struct twl4030_madc_request *r;
473 mutex_lock(&madc->lock);
474 ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &isr_val, madc->isr);
475 if (ret) {
476 dev_err(madc->dev, "unable to read isr register 0x%X\n",
477 madc->isr);
478 goto err_i2c;
480 ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &imr_val, madc->imr);
481 if (ret) {
482 dev_err(madc->dev, "unable to read imr register 0x%X\n",
483 madc->imr);
484 goto err_i2c;
486 isr_val &= ~imr_val;
487 for (i = 0; i < TWL4030_MADC_NUM_METHODS; i++) {
488 if (!(isr_val & (1 << i)))
489 continue;
490 ret = twl4030_madc_disable_irq(madc, i);
491 if (ret < 0)
492 dev_dbg(madc->dev, "Disable interrupt failed %d\n", i);
493 madc->requests[i].result_pending = true;
495 for (i = 0; i < TWL4030_MADC_NUM_METHODS; i++) {
496 r = &madc->requests[i];
497 /* No pending results for this method, move to next one */
498 if (!r->result_pending)
499 continue;
500 method = &twl4030_conversion_methods[r->method];
501 /* Read results */
502 twl4030_madc_read_channels(madc, method->rbase,
503 r->channels, r->rbuf, r->raw);
504 /* Free request */
505 r->result_pending = false;
506 r->active = false;
508 mutex_unlock(&madc->lock);
510 return IRQ_HANDLED;
512 err_i2c:
514 * In case of error check whichever request is active
515 * and service the same.
517 for (i = 0; i < TWL4030_MADC_NUM_METHODS; i++) {
518 r = &madc->requests[i];
519 if (!r->active)
520 continue;
521 method = &twl4030_conversion_methods[r->method];
522 /* Read results */
523 twl4030_madc_read_channels(madc, method->rbase,
524 r->channels, r->rbuf, r->raw);
525 /* Free request */
526 r->result_pending = false;
527 r->active = false;
529 mutex_unlock(&madc->lock);
531 return IRQ_HANDLED;
535 * Function which enables the madc conversion
536 * by writing to the control register.
537 * @madc - pointer to twl4030_madc_data struct
538 * @conv_method - can be TWL4030_MADC_RT, TWL4030_MADC_SW2, TWL4030_MADC_SW1
539 * corresponding to RT SW1 or SW2 conversion methods.
540 * Returns 0 if succeeds else a negative error value
542 static int twl4030_madc_start_conversion(struct twl4030_madc_data *madc,
543 int conv_method)
545 const struct twl4030_madc_conversion_method *method;
546 int ret = 0;
548 if (conv_method != TWL4030_MADC_SW1 && conv_method != TWL4030_MADC_SW2)
549 return -ENOTSUPP;
551 method = &twl4030_conversion_methods[conv_method];
552 ret = twl_i2c_write_u8(TWL4030_MODULE_MADC, TWL4030_MADC_SW_START,
553 method->ctrl);
554 if (ret) {
555 dev_err(madc->dev, "unable to write ctrl register 0x%X\n",
556 method->ctrl);
557 return ret;
560 return 0;
564 * Function that waits for conversion to be ready
565 * @madc - pointer to twl4030_madc_data struct
566 * @timeout_ms - timeout value in milliseconds
567 * @status_reg - ctrl register
568 * returns 0 if succeeds else a negative error value
570 static int twl4030_madc_wait_conversion_ready(struct twl4030_madc_data *madc,
571 unsigned int timeout_ms,
572 u8 status_reg)
574 unsigned long timeout;
575 int ret;
577 timeout = jiffies + msecs_to_jiffies(timeout_ms);
578 do {
579 u8 reg;
581 ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &reg, status_reg);
582 if (ret) {
583 dev_err(madc->dev,
584 "unable to read status register 0x%X\n",
585 status_reg);
586 return ret;
588 if (!(reg & TWL4030_MADC_BUSY) && (reg & TWL4030_MADC_EOC_SW))
589 return 0;
590 usleep_range(500, 2000);
591 } while (!time_after(jiffies, timeout));
592 dev_err(madc->dev, "conversion timeout!\n");
594 return -EAGAIN;
598 * An exported function which can be called from other kernel drivers.
599 * @req twl4030_madc_request structure
600 * req->rbuf will be filled with read values of channels based on the
601 * channel index. If a particular channel reading fails there will
602 * be a negative error value in the corresponding array element.
603 * returns 0 if succeeds else error value
605 static int twl4030_madc_conversion(struct twl4030_madc_request *req)
607 const struct twl4030_madc_conversion_method *method;
608 int ret;
610 if (!req || !twl4030_madc)
611 return -EINVAL;
613 mutex_lock(&twl4030_madc->lock);
614 if (req->method < TWL4030_MADC_RT || req->method > TWL4030_MADC_SW2) {
615 ret = -EINVAL;
616 goto out;
618 /* Do we have a conversion request ongoing */
619 if (twl4030_madc->requests[req->method].active) {
620 ret = -EBUSY;
621 goto out;
623 method = &twl4030_conversion_methods[req->method];
624 /* Select channels to be converted */
625 ret = twl_i2c_write_u16(TWL4030_MODULE_MADC, req->channels, method->sel);
626 if (ret) {
627 dev_err(twl4030_madc->dev,
628 "unable to write sel register 0x%X\n", method->sel);
629 goto out;
631 /* Select averaging for all channels if do_avg is set */
632 if (req->do_avg) {
633 ret = twl_i2c_write_u16(TWL4030_MODULE_MADC, req->channels,
634 method->avg);
635 if (ret) {
636 dev_err(twl4030_madc->dev,
637 "unable to write avg register 0x%X\n",
638 method->avg);
639 goto out;
642 /* With RT method we should not be here anymore */
643 if (req->method == TWL4030_MADC_RT) {
644 ret = -EINVAL;
645 goto out;
647 ret = twl4030_madc_start_conversion(twl4030_madc, req->method);
648 if (ret < 0)
649 goto out;
650 twl4030_madc->requests[req->method].active = true;
651 /* Wait until conversion is ready (ctrl register returns EOC) */
652 ret = twl4030_madc_wait_conversion_ready(twl4030_madc, 5, method->ctrl);
653 if (ret) {
654 twl4030_madc->requests[req->method].active = false;
655 goto out;
657 ret = twl4030_madc_read_channels(twl4030_madc, method->rbase,
658 req->channels, req->rbuf, req->raw);
659 twl4030_madc->requests[req->method].active = false;
661 out:
662 mutex_unlock(&twl4030_madc->lock);
664 return ret;
668 * twl4030_madc_set_current_generator() - setup bias current
670 * @madc: pointer to twl4030_madc_data struct
671 * @chan: can be one of the two values:
672 * 0 - Enables bias current for main battery type reading
673 * 1 - Enables bias current for main battery temperature sensing
674 * @on: enable or disable chan.
676 * Function to enable or disable bias current for
677 * main battery type reading or temperature sensing
679 static int twl4030_madc_set_current_generator(struct twl4030_madc_data *madc,
680 int chan, int on)
682 int ret;
683 int regmask;
684 u8 regval;
686 ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE,
687 &regval, TWL4030_BCI_BCICTL1);
688 if (ret) {
689 dev_err(madc->dev, "unable to read BCICTL1 reg 0x%X",
690 TWL4030_BCI_BCICTL1);
691 return ret;
694 regmask = chan ? TWL4030_BCI_ITHEN : TWL4030_BCI_TYPEN;
695 if (on)
696 regval |= regmask;
697 else
698 regval &= ~regmask;
700 ret = twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE,
701 regval, TWL4030_BCI_BCICTL1);
702 if (ret) {
703 dev_err(madc->dev, "unable to write BCICTL1 reg 0x%X\n",
704 TWL4030_BCI_BCICTL1);
705 return ret;
708 return 0;
712 * Function that sets MADC software power on bit to enable MADC
713 * @madc - pointer to twl4030_madc_data struct
714 * @on - Enable or disable MADC software power on bit.
715 * returns error if i2c read/write fails else 0
717 static int twl4030_madc_set_power(struct twl4030_madc_data *madc, int on)
719 u8 regval;
720 int ret;
722 ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE,
723 &regval, TWL4030_MADC_CTRL1);
724 if (ret) {
725 dev_err(madc->dev, "unable to read madc ctrl1 reg 0x%X\n",
726 TWL4030_MADC_CTRL1);
727 return ret;
729 if (on)
730 regval |= TWL4030_MADC_MADCON;
731 else
732 regval &= ~TWL4030_MADC_MADCON;
733 ret = twl_i2c_write_u8(TWL4030_MODULE_MADC, regval, TWL4030_MADC_CTRL1);
734 if (ret) {
735 dev_err(madc->dev, "unable to write madc ctrl1 reg 0x%X\n",
736 TWL4030_MADC_CTRL1);
737 return ret;
740 return 0;
744 * Initialize MADC and request for threaded irq
746 static int twl4030_madc_probe(struct platform_device *pdev)
748 struct device *dev = &pdev->dev;
749 struct twl4030_madc_platform_data *pdata = dev_get_platdata(dev);
750 struct twl4030_madc_data *madc;
751 int irq, ret;
752 u8 regval;
753 struct iio_dev *iio_dev = NULL;
755 if (!pdata && !dev_fwnode(dev)) {
756 dev_err(&pdev->dev, "neither platform data nor Device Tree node available\n");
757 return -EINVAL;
760 iio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*madc));
761 if (!iio_dev) {
762 dev_err(&pdev->dev, "failed allocating iio device\n");
763 return -ENOMEM;
766 madc = iio_priv(iio_dev);
767 madc->dev = &pdev->dev;
769 iio_dev->name = dev_name(&pdev->dev);
770 iio_dev->info = &twl4030_madc_iio_info;
771 iio_dev->modes = INDIO_DIRECT_MODE;
772 iio_dev->channels = twl4030_madc_iio_channels;
773 iio_dev->num_channels = ARRAY_SIZE(twl4030_madc_iio_channels);
776 * Phoenix provides 2 interrupt lines. The first one is connected to
777 * the OMAP. The other one can be connected to the other processor such
778 * as modem. Hence two separate ISR and IMR registers.
780 if (pdata)
781 madc->use_second_irq = (pdata->irq_line != 1);
782 else
783 madc->use_second_irq = device_property_read_bool(dev,
784 "ti,system-uses-second-madc-irq");
786 madc->imr = madc->use_second_irq ? TWL4030_MADC_IMR2 :
787 TWL4030_MADC_IMR1;
788 madc->isr = madc->use_second_irq ? TWL4030_MADC_ISR2 :
789 TWL4030_MADC_ISR1;
791 ret = twl4030_madc_set_power(madc, 1);
792 if (ret < 0)
793 return ret;
794 ret = twl4030_madc_set_current_generator(madc, 0, 1);
795 if (ret < 0)
796 goto err_current_generator;
798 ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE,
799 &regval, TWL4030_BCI_BCICTL1);
800 if (ret) {
801 dev_err(&pdev->dev, "unable to read reg BCI CTL1 0x%X\n",
802 TWL4030_BCI_BCICTL1);
803 goto err_i2c;
805 regval |= TWL4030_BCI_MESBAT;
806 ret = twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE,
807 regval, TWL4030_BCI_BCICTL1);
808 if (ret) {
809 dev_err(&pdev->dev, "unable to write reg BCI Ctl1 0x%X\n",
810 TWL4030_BCI_BCICTL1);
811 goto err_i2c;
814 /* Check that MADC clock is on */
815 ret = twl_i2c_read_u8(TWL4030_MODULE_INTBR, &regval, TWL4030_REG_GPBR1);
816 if (ret) {
817 dev_err(&pdev->dev, "unable to read reg GPBR1 0x%X\n",
818 TWL4030_REG_GPBR1);
819 goto err_i2c;
822 /* If MADC clk is not on, turn it on */
823 if (!(regval & TWL4030_GPBR1_MADC_HFCLK_EN)) {
824 dev_info(&pdev->dev, "clk disabled, enabling\n");
825 regval |= TWL4030_GPBR1_MADC_HFCLK_EN;
826 ret = twl_i2c_write_u8(TWL4030_MODULE_INTBR, regval,
827 TWL4030_REG_GPBR1);
828 if (ret) {
829 dev_err(&pdev->dev, "unable to write reg GPBR1 0x%X\n",
830 TWL4030_REG_GPBR1);
831 goto err_i2c;
835 platform_set_drvdata(pdev, iio_dev);
836 mutex_init(&madc->lock);
838 irq = platform_get_irq(pdev, 0);
839 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
840 twl4030_madc_threaded_irq_handler,
841 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
842 "twl4030_madc", madc);
843 if (ret) {
844 dev_err(&pdev->dev, "could not request irq\n");
845 goto err_i2c;
847 twl4030_madc = madc;
849 /* Configure MADC[3:6] */
850 ret = twl_i2c_read_u8(TWL_MODULE_USB, &regval,
851 TWL4030_USB_CARKIT_ANA_CTRL);
852 if (ret) {
853 dev_err(&pdev->dev, "unable to read reg CARKIT_ANA_CTRL 0x%X\n",
854 TWL4030_USB_CARKIT_ANA_CTRL);
855 goto err_i2c;
857 regval |= TWL4030_USB_SEL_MADC_MCPC;
858 ret = twl_i2c_write_u8(TWL_MODULE_USB, regval,
859 TWL4030_USB_CARKIT_ANA_CTRL);
860 if (ret) {
861 dev_err(&pdev->dev, "unable to write reg CARKIT_ANA_CTRL 0x%X\n",
862 TWL4030_USB_CARKIT_ANA_CTRL);
863 goto err_i2c;
866 /* Enable 3v1 bias regulator for MADC[3:6] */
867 madc->usb3v1 = devm_regulator_get(madc->dev, "vusb3v1");
868 if (IS_ERR(madc->usb3v1)) {
869 ret = -ENODEV;
870 goto err_i2c;
873 ret = regulator_enable(madc->usb3v1);
874 if (ret) {
875 dev_err(madc->dev, "could not enable 3v1 bias regulator\n");
876 goto err_i2c;
879 ret = iio_device_register(iio_dev);
880 if (ret) {
881 dev_err(&pdev->dev, "could not register iio device\n");
882 goto err_usb3v1;
885 return 0;
887 err_usb3v1:
888 regulator_disable(madc->usb3v1);
889 err_i2c:
890 twl4030_madc_set_current_generator(madc, 0, 0);
891 err_current_generator:
892 twl4030_madc_set_power(madc, 0);
893 return ret;
896 static void twl4030_madc_remove(struct platform_device *pdev)
898 struct iio_dev *iio_dev = platform_get_drvdata(pdev);
899 struct twl4030_madc_data *madc = iio_priv(iio_dev);
901 iio_device_unregister(iio_dev);
903 twl4030_madc_set_current_generator(madc, 0, 0);
904 twl4030_madc_set_power(madc, 0);
906 regulator_disable(madc->usb3v1);
909 static const struct of_device_id twl_madc_of_match[] = {
910 { .compatible = "ti,twl4030-madc", },
913 MODULE_DEVICE_TABLE(of, twl_madc_of_match);
915 static struct platform_driver twl4030_madc_driver = {
916 .probe = twl4030_madc_probe,
917 .remove = twl4030_madc_remove,
918 .driver = {
919 .name = "twl4030_madc",
920 .of_match_table = twl_madc_of_match,
924 module_platform_driver(twl4030_madc_driver);
926 MODULE_DESCRIPTION("TWL4030 ADC driver");
927 MODULE_LICENSE("GPL");
928 MODULE_AUTHOR("J Keerthy");
929 MODULE_ALIAS("platform:twl4030_madc");