3 * TWL4030 MADC module driver-This driver monitors the real time
4 * conversion of analog signals like battery temperature,
5 * battery type, battery level etc.
7 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
8 * J Keerthy <j-keerthy@ti.com>
10 * Based on twl4030-madc.c
11 * Copyright (C) 2008 Nokia Corporation
12 * Mikko Ylinen <mikko.k.ylinen@nokia.com>
14 * Amit Kucheria <amit.kucheria@canonical.com>
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License
18 * version 2 as published by the Free Software Foundation.
20 * This program is distributed in the hope that it will be useful, but
21 * WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 * General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
32 #include <linux/device.h>
33 #include <linux/interrupt.h>
34 #include <linux/kernel.h>
35 #include <linux/delay.h>
36 #include <linux/platform_device.h>
37 #include <linux/slab.h>
38 #include <linux/mfd/twl.h>
39 #include <linux/module.h>
40 #include <linux/stddef.h>
41 #include <linux/mutex.h>
42 #include <linux/bitops.h>
43 #include <linux/jiffies.h>
44 #include <linux/types.h>
45 #include <linux/gfp.h>
46 #include <linux/err.h>
47 #include <linux/regulator/consumer.h>
49 #include <linux/iio/iio.h>
51 #define TWL4030_MADC_MAX_CHANNELS 16
53 #define TWL4030_MADC_CTRL1 0x00
54 #define TWL4030_MADC_CTRL2 0x01
56 #define TWL4030_MADC_RTSELECT_LSB 0x02
57 #define TWL4030_MADC_SW1SELECT_LSB 0x06
58 #define TWL4030_MADC_SW2SELECT_LSB 0x0A
60 #define TWL4030_MADC_RTAVERAGE_LSB 0x04
61 #define TWL4030_MADC_SW1AVERAGE_LSB 0x08
62 #define TWL4030_MADC_SW2AVERAGE_LSB 0x0C
64 #define TWL4030_MADC_CTRL_SW1 0x12
65 #define TWL4030_MADC_CTRL_SW2 0x13
67 #define TWL4030_MADC_RTCH0_LSB 0x17
68 #define TWL4030_MADC_GPCH0_LSB 0x37
70 #define TWL4030_MADC_MADCON (1 << 0) /* MADC power on */
71 #define TWL4030_MADC_BUSY (1 << 0) /* MADC busy */
72 /* MADC conversion completion */
73 #define TWL4030_MADC_EOC_SW (1 << 1)
74 /* MADC SWx start conversion */
75 #define TWL4030_MADC_SW_START (1 << 5)
76 #define TWL4030_MADC_ADCIN0 (1 << 0)
77 #define TWL4030_MADC_ADCIN1 (1 << 1)
78 #define TWL4030_MADC_ADCIN2 (1 << 2)
79 #define TWL4030_MADC_ADCIN3 (1 << 3)
80 #define TWL4030_MADC_ADCIN4 (1 << 4)
81 #define TWL4030_MADC_ADCIN5 (1 << 5)
82 #define TWL4030_MADC_ADCIN6 (1 << 6)
83 #define TWL4030_MADC_ADCIN7 (1 << 7)
84 #define TWL4030_MADC_ADCIN8 (1 << 8)
85 #define TWL4030_MADC_ADCIN9 (1 << 9)
86 #define TWL4030_MADC_ADCIN10 (1 << 10)
87 #define TWL4030_MADC_ADCIN11 (1 << 11)
88 #define TWL4030_MADC_ADCIN12 (1 << 12)
89 #define TWL4030_MADC_ADCIN13 (1 << 13)
90 #define TWL4030_MADC_ADCIN14 (1 << 14)
91 #define TWL4030_MADC_ADCIN15 (1 << 15)
94 #define TWL4030_MADC_BTEMP TWL4030_MADC_ADCIN1
95 #define TWL4030_MADC_VBUS TWL4030_MADC_ADCIN8
96 #define TWL4030_MADC_VBKB TWL4030_MADC_ADCIN9
97 #define TWL4030_MADC_ICHG TWL4030_MADC_ADCIN10
98 #define TWL4030_MADC_VCHG TWL4030_MADC_ADCIN11
99 #define TWL4030_MADC_VBAT TWL4030_MADC_ADCIN12
101 /* Step size and prescaler ratio */
102 #define TEMP_STEP_SIZE 147
103 #define TEMP_PSR_R 100
104 #define CURR_STEP_SIZE 147
105 #define CURR_PSR_R1 44
106 #define CURR_PSR_R2 88
108 #define TWL4030_BCI_BCICTL1 0x23
109 #define TWL4030_BCI_CGAIN 0x020
110 #define TWL4030_BCI_MESBAT (1 << 1)
111 #define TWL4030_BCI_TYPEN (1 << 4)
112 #define TWL4030_BCI_ITHEN (1 << 3)
114 #define REG_BCICTL2 0x024
115 #define TWL4030_BCI_ITHSENS 0x007
117 /* Register and bits for GPBR1 register */
118 #define TWL4030_REG_GPBR1 0x0c
119 #define TWL4030_GPBR1_MADC_HFCLK_EN (1 << 7)
121 #define TWL4030_USB_SEL_MADC_MCPC (1<<3)
122 #define TWL4030_USB_CARKIT_ANA_CTRL 0xBB
124 struct twl4030_madc_conversion_method
{
132 * struct twl4030_madc_request - madc request packet for channel conversion
133 * @channels: 16 bit bitmap for individual channels
134 * @do_avg: sample the input channel for 4 consecutive cycles
135 * @method: RT, SW1, SW2
136 * @type: Polling or interrupt based method
137 * @active: Flag if request is active
138 * @result_pending: Flag from irq handler, that result is ready
139 * @raw: Return raw value, do not convert it
140 * @rbuf: Result buffer
142 struct twl4030_madc_request
{
143 unsigned long channels
;
150 int rbuf
[TWL4030_MADC_MAX_CHANNELS
];
153 enum conversion_methods
{
157 TWL4030_MADC_NUM_METHODS
162 TWL4030_MADC_IRQ_ONESHOT
,
163 TWL4030_MADC_IRQ_REARM
167 * struct twl4030_madc_data - a container for madc info
168 * @dev: Pointer to device structure for madc
169 * @lock: Mutex protecting this data structure
170 * @regulator: Pointer to bias regulator for madc
171 * @requests: Array of request struct corresponding to SW1, SW2 and RT
172 * @use_second_irq: IRQ selection (main or co-processor)
173 * @imr: Interrupt mask register of MADC
174 * @isr: Interrupt status register of MADC
176 struct twl4030_madc_data
{
178 struct mutex lock
; /* mutex protecting this data structure */
179 struct regulator
*usb3v1
;
180 struct twl4030_madc_request requests
[TWL4030_MADC_NUM_METHODS
];
186 static int twl4030_madc_conversion(struct twl4030_madc_request
*req
);
188 static int twl4030_madc_read(struct iio_dev
*iio_dev
,
189 const struct iio_chan_spec
*chan
,
190 int *val
, int *val2
, long mask
)
192 struct twl4030_madc_data
*madc
= iio_priv(iio_dev
);
193 struct twl4030_madc_request req
;
196 req
.method
= madc
->use_second_irq
? TWL4030_MADC_SW2
: TWL4030_MADC_SW1
;
198 req
.channels
= BIT(chan
->channel
);
200 req
.type
= TWL4030_MADC_WAIT
;
201 req
.raw
= !(mask
== IIO_CHAN_INFO_PROCESSED
);
202 req
.do_avg
= (mask
== IIO_CHAN_INFO_AVERAGE_RAW
);
204 ret
= twl4030_madc_conversion(&req
);
208 *val
= req
.rbuf
[chan
->channel
];
213 static const struct iio_info twl4030_madc_iio_info
= {
214 .read_raw
= &twl4030_madc_read
,
217 #define TWL4030_ADC_CHANNEL(_channel, _type, _name) { \
219 .channel = _channel, \
220 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
221 BIT(IIO_CHAN_INFO_AVERAGE_RAW) | \
222 BIT(IIO_CHAN_INFO_PROCESSED), \
223 .datasheet_name = _name, \
227 static const struct iio_chan_spec twl4030_madc_iio_channels
[] = {
228 TWL4030_ADC_CHANNEL(0, IIO_VOLTAGE
, "ADCIN0"),
229 TWL4030_ADC_CHANNEL(1, IIO_TEMP
, "ADCIN1"),
230 TWL4030_ADC_CHANNEL(2, IIO_VOLTAGE
, "ADCIN2"),
231 TWL4030_ADC_CHANNEL(3, IIO_VOLTAGE
, "ADCIN3"),
232 TWL4030_ADC_CHANNEL(4, IIO_VOLTAGE
, "ADCIN4"),
233 TWL4030_ADC_CHANNEL(5, IIO_VOLTAGE
, "ADCIN5"),
234 TWL4030_ADC_CHANNEL(6, IIO_VOLTAGE
, "ADCIN6"),
235 TWL4030_ADC_CHANNEL(7, IIO_VOLTAGE
, "ADCIN7"),
236 TWL4030_ADC_CHANNEL(8, IIO_VOLTAGE
, "ADCIN8"),
237 TWL4030_ADC_CHANNEL(9, IIO_VOLTAGE
, "ADCIN9"),
238 TWL4030_ADC_CHANNEL(10, IIO_CURRENT
, "ADCIN10"),
239 TWL4030_ADC_CHANNEL(11, IIO_VOLTAGE
, "ADCIN11"),
240 TWL4030_ADC_CHANNEL(12, IIO_VOLTAGE
, "ADCIN12"),
241 TWL4030_ADC_CHANNEL(13, IIO_VOLTAGE
, "ADCIN13"),
242 TWL4030_ADC_CHANNEL(14, IIO_VOLTAGE
, "ADCIN14"),
243 TWL4030_ADC_CHANNEL(15, IIO_VOLTAGE
, "ADCIN15"),
246 static struct twl4030_madc_data
*twl4030_madc
;
248 struct twl4030_prescale_divider_ratios
{
253 static const struct twl4030_prescale_divider_ratios
254 twl4030_divider_ratios
[16] = {
255 {1, 1}, /* CHANNEL 0 No Prescaler */
256 {1, 1}, /* CHANNEL 1 No Prescaler */
257 {6, 10}, /* CHANNEL 2 */
258 {6, 10}, /* CHANNEL 3 */
259 {6, 10}, /* CHANNEL 4 */
260 {6, 10}, /* CHANNEL 5 */
261 {6, 10}, /* CHANNEL 6 */
262 {6, 10}, /* CHANNEL 7 */
263 {3, 14}, /* CHANNEL 8 */
264 {1, 3}, /* CHANNEL 9 */
265 {1, 1}, /* CHANNEL 10 No Prescaler */
266 {15, 100}, /* CHANNEL 11 */
267 {1, 4}, /* CHANNEL 12 */
268 {1, 1}, /* CHANNEL 13 Reserved channels */
269 {1, 1}, /* CHANNEL 14 Reseved channels */
270 {5, 11}, /* CHANNEL 15 */
274 /* Conversion table from -3 to 55 degrees Celcius */
275 static int twl4030_therm_tbl
[] = {
276 30800, 29500, 28300, 27100,
277 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700,
278 17900, 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100,
279 12600, 12100, 11600, 11200, 10800, 10400, 10000, 9630, 9280,
280 8950, 8620, 8310, 8020, 7730, 7460, 7200, 6950, 6710,
281 6470, 6250, 6040, 5830, 5640, 5450, 5260, 5090, 4920,
282 4760, 4600, 4450, 4310, 4170, 4040, 3910, 3790, 3670,
287 * Structure containing the registers
288 * of different conversion methods supported by MADC.
289 * Hardware or RT real time conversion request initiated by external host
290 * processor for RT Signal conversions.
291 * External host processors can also request for non RT conversions
292 * SW1 and SW2 software conversions also called asynchronous or GPC request.
295 const struct twl4030_madc_conversion_method twl4030_conversion_methods
[] = {
296 [TWL4030_MADC_RT
] = {
297 .sel
= TWL4030_MADC_RTSELECT_LSB
,
298 .avg
= TWL4030_MADC_RTAVERAGE_LSB
,
299 .rbase
= TWL4030_MADC_RTCH0_LSB
,
301 [TWL4030_MADC_SW1
] = {
302 .sel
= TWL4030_MADC_SW1SELECT_LSB
,
303 .avg
= TWL4030_MADC_SW1AVERAGE_LSB
,
304 .rbase
= TWL4030_MADC_GPCH0_LSB
,
305 .ctrl
= TWL4030_MADC_CTRL_SW1
,
307 [TWL4030_MADC_SW2
] = {
308 .sel
= TWL4030_MADC_SW2SELECT_LSB
,
309 .avg
= TWL4030_MADC_SW2AVERAGE_LSB
,
310 .rbase
= TWL4030_MADC_GPCH0_LSB
,
311 .ctrl
= TWL4030_MADC_CTRL_SW2
,
316 * twl4030_madc_channel_raw_read() - Function to read a particular channel value
317 * @madc: pointer to struct twl4030_madc_data
318 * @reg: lsb of ADC Channel
320 * Return: 0 on success, an error code otherwise.
322 static int twl4030_madc_channel_raw_read(struct twl4030_madc_data
*madc
, u8 reg
)
327 * For each ADC channel, we have MSB and LSB register pair. MSB address
328 * is always LSB address+1. reg parameter is the address of LSB register
330 ret
= twl_i2c_read_u16(TWL4030_MODULE_MADC
, &val
, reg
);
332 dev_err(madc
->dev
, "unable to read register 0x%X\n", reg
);
336 return (int)(val
>> 6);
340 * Return battery temperature in degrees Celsius
343 static int twl4030battery_temperature(int raw_volt
)
346 int temp
, curr
, volt
, res
, ret
;
348 volt
= (raw_volt
* TEMP_STEP_SIZE
) / TEMP_PSR_R
;
349 /* Getting and calculating the supply current in micro amperes */
350 ret
= twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE
, &val
,
355 curr
= ((val
& TWL4030_BCI_ITHSENS
) + 1) * 10;
356 /* Getting and calculating the thermistor resistance in ohms */
357 res
= volt
* 1000 / curr
;
358 /* calculating temperature */
359 for (temp
= 58; temp
>= 0; temp
--) {
360 int actual
= twl4030_therm_tbl
[temp
];
361 if ((actual
- res
) >= 0)
368 static int twl4030battery_current(int raw_volt
)
373 ret
= twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE
, &val
,
374 TWL4030_BCI_BCICTL1
);
377 if (val
& TWL4030_BCI_CGAIN
) /* slope of 0.44 mV/mA */
378 return (raw_volt
* CURR_STEP_SIZE
) / CURR_PSR_R1
;
379 else /* slope of 0.88 mV/mA */
380 return (raw_volt
* CURR_STEP_SIZE
) / CURR_PSR_R2
;
384 * Function to read channel values
385 * @madc - pointer to twl4030_madc_data struct
386 * @reg_base - Base address of the first channel
387 * @Channels - 16 bit bitmap. If the bit is set, channel's value is read
388 * @buf - The channel values are stored here. if read fails error
389 * @raw - Return raw values without conversion
391 * Returns the number of successfully read channels.
393 static int twl4030_madc_read_channels(struct twl4030_madc_data
*madc
,
394 u8 reg_base
, unsigned
395 long channels
, int *buf
,
402 for_each_set_bit(i
, &channels
, TWL4030_MADC_MAX_CHANNELS
) {
403 reg
= reg_base
+ (2 * i
);
404 buf
[i
] = twl4030_madc_channel_raw_read(madc
, reg
);
406 dev_err(madc
->dev
, "Unable to read register 0x%X\n",
416 buf
[i
] = twl4030battery_current(buf
[i
]);
418 dev_err(madc
->dev
, "err reading current\n");
422 buf
[i
] = buf
[i
] - 750;
426 buf
[i
] = twl4030battery_temperature(buf
[i
]);
428 dev_err(madc
->dev
, "err reading temperature\n");
437 /* Analog Input (V) = conv_result * step_size / R
438 * conv_result = decimal value of 10-bit conversion
440 * step size = 1.5 / (2 ^ 10 -1)
441 * R = Prescaler ratio for input channels.
442 * Result given in mV hence multiplied by 1000.
444 buf
[i
] = (buf
[i
] * 3 * 1000 *
445 twl4030_divider_ratios
[i
].denominator
)
447 twl4030_divider_ratios
[i
].numerator
);
456 * @madc - pointer to twl4030_madc_data struct
457 * @id - irq number to be disabled
458 * can take one of TWL4030_MADC_RT, TWL4030_MADC_SW1, TWL4030_MADC_SW2
459 * corresponding to RT, SW1, SW2 conversion requests.
460 * Returns error if i2c read/write fails.
462 static int twl4030_madc_disable_irq(struct twl4030_madc_data
*madc
, u8 id
)
467 ret
= twl_i2c_read_u8(TWL4030_MODULE_MADC
, &val
, madc
->imr
);
469 dev_err(madc
->dev
, "unable to read imr register 0x%X\n",
474 ret
= twl_i2c_write_u8(TWL4030_MODULE_MADC
, val
, madc
->imr
);
477 "unable to write imr register 0x%X\n", madc
->imr
);
484 static irqreturn_t
twl4030_madc_threaded_irq_handler(int irq
, void *_madc
)
486 struct twl4030_madc_data
*madc
= _madc
;
487 const struct twl4030_madc_conversion_method
*method
;
490 struct twl4030_madc_request
*r
;
492 mutex_lock(&madc
->lock
);
493 ret
= twl_i2c_read_u8(TWL4030_MODULE_MADC
, &isr_val
, madc
->isr
);
495 dev_err(madc
->dev
, "unable to read isr register 0x%X\n",
499 ret
= twl_i2c_read_u8(TWL4030_MODULE_MADC
, &imr_val
, madc
->imr
);
501 dev_err(madc
->dev
, "unable to read imr register 0x%X\n",
506 for (i
= 0; i
< TWL4030_MADC_NUM_METHODS
; i
++) {
507 if (!(isr_val
& (1 << i
)))
509 ret
= twl4030_madc_disable_irq(madc
, i
);
511 dev_dbg(madc
->dev
, "Disable interrupt failed %d\n", i
);
512 madc
->requests
[i
].result_pending
= 1;
514 for (i
= 0; i
< TWL4030_MADC_NUM_METHODS
; i
++) {
515 r
= &madc
->requests
[i
];
516 /* No pending results for this method, move to next one */
517 if (!r
->result_pending
)
519 method
= &twl4030_conversion_methods
[r
->method
];
521 len
= twl4030_madc_read_channels(madc
, method
->rbase
,
522 r
->channels
, r
->rbuf
, r
->raw
);
524 r
->result_pending
= 0;
527 mutex_unlock(&madc
->lock
);
533 * In case of error check whichever request is active
534 * and service the same.
536 for (i
= 0; i
< TWL4030_MADC_NUM_METHODS
; i
++) {
537 r
= &madc
->requests
[i
];
540 method
= &twl4030_conversion_methods
[r
->method
];
542 len
= twl4030_madc_read_channels(madc
, method
->rbase
,
543 r
->channels
, r
->rbuf
, r
->raw
);
545 r
->result_pending
= 0;
548 mutex_unlock(&madc
->lock
);
554 * Function which enables the madc conversion
555 * by writing to the control register.
556 * @madc - pointer to twl4030_madc_data struct
557 * @conv_method - can be TWL4030_MADC_RT, TWL4030_MADC_SW2, TWL4030_MADC_SW1
558 * corresponding to RT SW1 or SW2 conversion methods.
559 * Returns 0 if succeeds else a negative error value
561 static int twl4030_madc_start_conversion(struct twl4030_madc_data
*madc
,
564 const struct twl4030_madc_conversion_method
*method
;
567 if (conv_method
!= TWL4030_MADC_SW1
&& conv_method
!= TWL4030_MADC_SW2
)
570 method
= &twl4030_conversion_methods
[conv_method
];
571 ret
= twl_i2c_write_u8(TWL4030_MODULE_MADC
, TWL4030_MADC_SW_START
,
574 dev_err(madc
->dev
, "unable to write ctrl register 0x%X\n",
583 * Function that waits for conversion to be ready
584 * @madc - pointer to twl4030_madc_data struct
585 * @timeout_ms - timeout value in milliseconds
586 * @status_reg - ctrl register
587 * returns 0 if succeeds else a negative error value
589 static int twl4030_madc_wait_conversion_ready(struct twl4030_madc_data
*madc
,
590 unsigned int timeout_ms
,
593 unsigned long timeout
;
596 timeout
= jiffies
+ msecs_to_jiffies(timeout_ms
);
600 ret
= twl_i2c_read_u8(TWL4030_MODULE_MADC
, ®
, status_reg
);
603 "unable to read status register 0x%X\n",
607 if (!(reg
& TWL4030_MADC_BUSY
) && (reg
& TWL4030_MADC_EOC_SW
))
609 usleep_range(500, 2000);
610 } while (!time_after(jiffies
, timeout
));
611 dev_err(madc
->dev
, "conversion timeout!\n");
617 * An exported function which can be called from other kernel drivers.
618 * @req twl4030_madc_request structure
619 * req->rbuf will be filled with read values of channels based on the
620 * channel index. If a particular channel reading fails there will
621 * be a negative error value in the corresponding array element.
622 * returns 0 if succeeds else error value
624 static int twl4030_madc_conversion(struct twl4030_madc_request
*req
)
626 const struct twl4030_madc_conversion_method
*method
;
629 if (!req
|| !twl4030_madc
)
632 mutex_lock(&twl4030_madc
->lock
);
633 if (req
->method
< TWL4030_MADC_RT
|| req
->method
> TWL4030_MADC_SW2
) {
637 /* Do we have a conversion request ongoing */
638 if (twl4030_madc
->requests
[req
->method
].active
) {
642 method
= &twl4030_conversion_methods
[req
->method
];
643 /* Select channels to be converted */
644 ret
= twl_i2c_write_u16(TWL4030_MODULE_MADC
, req
->channels
, method
->sel
);
646 dev_err(twl4030_madc
->dev
,
647 "unable to write sel register 0x%X\n", method
->sel
);
650 /* Select averaging for all channels if do_avg is set */
652 ret
= twl_i2c_write_u16(TWL4030_MODULE_MADC
, req
->channels
,
655 dev_err(twl4030_madc
->dev
,
656 "unable to write avg register 0x%X\n",
661 /* With RT method we should not be here anymore */
662 if (req
->method
== TWL4030_MADC_RT
) {
666 ret
= twl4030_madc_start_conversion(twl4030_madc
, req
->method
);
669 twl4030_madc
->requests
[req
->method
].active
= 1;
670 /* Wait until conversion is ready (ctrl register returns EOC) */
671 ret
= twl4030_madc_wait_conversion_ready(twl4030_madc
, 5, method
->ctrl
);
673 twl4030_madc
->requests
[req
->method
].active
= 0;
676 ret
= twl4030_madc_read_channels(twl4030_madc
, method
->rbase
,
677 req
->channels
, req
->rbuf
, req
->raw
);
678 twl4030_madc
->requests
[req
->method
].active
= 0;
681 mutex_unlock(&twl4030_madc
->lock
);
687 * twl4030_madc_set_current_generator() - setup bias current
689 * @madc: pointer to twl4030_madc_data struct
690 * @chan: can be one of the two values:
691 * 0 - Enables bias current for main battery type reading
692 * 1 - Enables bias current for main battery temperature sensing
693 * @on: enable or disable chan.
695 * Function to enable or disable bias current for
696 * main battery type reading or temperature sensing
698 static int twl4030_madc_set_current_generator(struct twl4030_madc_data
*madc
,
705 ret
= twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE
,
706 ®val
, TWL4030_BCI_BCICTL1
);
708 dev_err(madc
->dev
, "unable to read BCICTL1 reg 0x%X",
709 TWL4030_BCI_BCICTL1
);
713 regmask
= chan
? TWL4030_BCI_ITHEN
: TWL4030_BCI_TYPEN
;
719 ret
= twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE
,
720 regval
, TWL4030_BCI_BCICTL1
);
722 dev_err(madc
->dev
, "unable to write BCICTL1 reg 0x%X\n",
723 TWL4030_BCI_BCICTL1
);
731 * Function that sets MADC software power on bit to enable MADC
732 * @madc - pointer to twl4030_madc_data struct
733 * @on - Enable or disable MADC software power on bit.
734 * returns error if i2c read/write fails else 0
736 static int twl4030_madc_set_power(struct twl4030_madc_data
*madc
, int on
)
741 ret
= twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE
,
742 ®val
, TWL4030_MADC_CTRL1
);
744 dev_err(madc
->dev
, "unable to read madc ctrl1 reg 0x%X\n",
749 regval
|= TWL4030_MADC_MADCON
;
751 regval
&= ~TWL4030_MADC_MADCON
;
752 ret
= twl_i2c_write_u8(TWL4030_MODULE_MADC
, regval
, TWL4030_MADC_CTRL1
);
754 dev_err(madc
->dev
, "unable to write madc ctrl1 reg 0x%X\n",
763 * Initialize MADC and request for threaded irq
765 static int twl4030_madc_probe(struct platform_device
*pdev
)
767 struct twl4030_madc_data
*madc
;
768 struct twl4030_madc_platform_data
*pdata
= dev_get_platdata(&pdev
->dev
);
769 struct device_node
*np
= pdev
->dev
.of_node
;
772 struct iio_dev
*iio_dev
= NULL
;
775 dev_err(&pdev
->dev
, "neither platform data nor Device Tree node available\n");
779 iio_dev
= devm_iio_device_alloc(&pdev
->dev
, sizeof(*madc
));
781 dev_err(&pdev
->dev
, "failed allocating iio device\n");
785 madc
= iio_priv(iio_dev
);
786 madc
->dev
= &pdev
->dev
;
788 iio_dev
->name
= dev_name(&pdev
->dev
);
789 iio_dev
->dev
.parent
= &pdev
->dev
;
790 iio_dev
->dev
.of_node
= pdev
->dev
.of_node
;
791 iio_dev
->info
= &twl4030_madc_iio_info
;
792 iio_dev
->modes
= INDIO_DIRECT_MODE
;
793 iio_dev
->channels
= twl4030_madc_iio_channels
;
794 iio_dev
->num_channels
= ARRAY_SIZE(twl4030_madc_iio_channels
);
797 * Phoenix provides 2 interrupt lines. The first one is connected to
798 * the OMAP. The other one can be connected to the other processor such
799 * as modem. Hence two separate ISR and IMR registers.
802 madc
->use_second_irq
= (pdata
->irq_line
!= 1);
804 madc
->use_second_irq
= of_property_read_bool(np
,
805 "ti,system-uses-second-madc-irq");
807 madc
->imr
= madc
->use_second_irq
? TWL4030_MADC_IMR2
:
809 madc
->isr
= madc
->use_second_irq
? TWL4030_MADC_ISR2
:
812 ret
= twl4030_madc_set_power(madc
, 1);
815 ret
= twl4030_madc_set_current_generator(madc
, 0, 1);
817 goto err_current_generator
;
819 ret
= twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE
,
820 ®val
, TWL4030_BCI_BCICTL1
);
822 dev_err(&pdev
->dev
, "unable to read reg BCI CTL1 0x%X\n",
823 TWL4030_BCI_BCICTL1
);
826 regval
|= TWL4030_BCI_MESBAT
;
827 ret
= twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE
,
828 regval
, TWL4030_BCI_BCICTL1
);
830 dev_err(&pdev
->dev
, "unable to write reg BCI Ctl1 0x%X\n",
831 TWL4030_BCI_BCICTL1
);
835 /* Check that MADC clock is on */
836 ret
= twl_i2c_read_u8(TWL4030_MODULE_INTBR
, ®val
, TWL4030_REG_GPBR1
);
838 dev_err(&pdev
->dev
, "unable to read reg GPBR1 0x%X\n",
843 /* If MADC clk is not on, turn it on */
844 if (!(regval
& TWL4030_GPBR1_MADC_HFCLK_EN
)) {
845 dev_info(&pdev
->dev
, "clk disabled, enabling\n");
846 regval
|= TWL4030_GPBR1_MADC_HFCLK_EN
;
847 ret
= twl_i2c_write_u8(TWL4030_MODULE_INTBR
, regval
,
850 dev_err(&pdev
->dev
, "unable to write reg GPBR1 0x%X\n",
856 platform_set_drvdata(pdev
, iio_dev
);
857 mutex_init(&madc
->lock
);
859 irq
= platform_get_irq(pdev
, 0);
860 ret
= devm_request_threaded_irq(&pdev
->dev
, irq
, NULL
,
861 twl4030_madc_threaded_irq_handler
,
862 IRQF_TRIGGER_RISING
| IRQF_ONESHOT
,
863 "twl4030_madc", madc
);
865 dev_err(&pdev
->dev
, "could not request irq\n");
870 /* Configure MADC[3:6] */
871 ret
= twl_i2c_read_u8(TWL_MODULE_USB
, ®val
,
872 TWL4030_USB_CARKIT_ANA_CTRL
);
874 dev_err(&pdev
->dev
, "unable to read reg CARKIT_ANA_CTRL 0x%X\n",
875 TWL4030_USB_CARKIT_ANA_CTRL
);
878 regval
|= TWL4030_USB_SEL_MADC_MCPC
;
879 ret
= twl_i2c_write_u8(TWL_MODULE_USB
, regval
,
880 TWL4030_USB_CARKIT_ANA_CTRL
);
882 dev_err(&pdev
->dev
, "unable to write reg CARKIT_ANA_CTRL 0x%X\n",
883 TWL4030_USB_CARKIT_ANA_CTRL
);
887 /* Enable 3v1 bias regulator for MADC[3:6] */
888 madc
->usb3v1
= devm_regulator_get(madc
->dev
, "vusb3v1");
889 if (IS_ERR(madc
->usb3v1
)) {
894 ret
= regulator_enable(madc
->usb3v1
);
896 dev_err(madc
->dev
, "could not enable 3v1 bias regulator\n");
900 ret
= iio_device_register(iio_dev
);
902 dev_err(&pdev
->dev
, "could not register iio device\n");
909 regulator_disable(madc
->usb3v1
);
911 twl4030_madc_set_current_generator(madc
, 0, 0);
912 err_current_generator
:
913 twl4030_madc_set_power(madc
, 0);
917 static int twl4030_madc_remove(struct platform_device
*pdev
)
919 struct iio_dev
*iio_dev
= platform_get_drvdata(pdev
);
920 struct twl4030_madc_data
*madc
= iio_priv(iio_dev
);
922 iio_device_unregister(iio_dev
);
924 twl4030_madc_set_current_generator(madc
, 0, 0);
925 twl4030_madc_set_power(madc
, 0);
927 regulator_disable(madc
->usb3v1
);
933 static const struct of_device_id twl_madc_of_match
[] = {
934 { .compatible
= "ti,twl4030-madc", },
937 MODULE_DEVICE_TABLE(of
, twl_madc_of_match
);
940 static struct platform_driver twl4030_madc_driver
= {
941 .probe
= twl4030_madc_probe
,
942 .remove
= twl4030_madc_remove
,
944 .name
= "twl4030_madc",
945 .of_match_table
= of_match_ptr(twl_madc_of_match
),
949 module_platform_driver(twl4030_madc_driver
);
951 MODULE_DESCRIPTION("TWL4030 ADC driver");
952 MODULE_LICENSE("GPL");
953 MODULE_AUTHOR("J Keerthy");
954 MODULE_ALIAS("platform:twl4030_madc");