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/init.h>
33 #include <linux/device.h>
34 #include <linux/interrupt.h>
35 #include <linux/kernel.h>
36 #include <linux/delay.h>
37 #include <linux/platform_device.h>
38 #include <linux/slab.h>
39 #include <linux/i2c/twl.h>
40 #include <linux/i2c/twl4030-madc.h>
41 #include <linux/module.h>
42 #include <linux/stddef.h>
43 #include <linux/mutex.h>
44 #include <linux/bitops.h>
45 #include <linux/jiffies.h>
46 #include <linux/types.h>
47 #include <linux/gfp.h>
48 #include <linux/err.h>
51 * struct twl4030_madc_data - a container for madc info
52 * @dev - pointer to device structure for madc
53 * @lock - mutex protecting this data structure
54 * @requests - Array of request struct corresponding to SW1, SW2 and RT
55 * @imr - Interrupt mask register of MADC
56 * @isr - Interrupt status register of MADC
58 struct twl4030_madc_data {
60 struct mutex lock; /* mutex protecting this data structure */
61 struct twl4030_madc_request requests[TWL4030_MADC_NUM_METHODS];
66 static struct twl4030_madc_data *twl4030_madc;
68 struct twl4030_prescale_divider_ratios {
73 static const struct twl4030_prescale_divider_ratios
74 twl4030_divider_ratios[16] = {
75 {1, 1}, /* CHANNEL 0 No Prescaler */
76 {1, 1}, /* CHANNEL 1 No Prescaler */
77 {6, 10}, /* CHANNEL 2 */
78 {6, 10}, /* CHANNEL 3 */
79 {6, 10}, /* CHANNEL 4 */
80 {6, 10}, /* CHANNEL 5 */
81 {6, 10}, /* CHANNEL 6 */
82 {6, 10}, /* CHANNEL 7 */
83 {3, 14}, /* CHANNEL 8 */
84 {1, 3}, /* CHANNEL 9 */
85 {1, 1}, /* CHANNEL 10 No Prescaler */
86 {15, 100}, /* CHANNEL 11 */
87 {1, 4}, /* CHANNEL 12 */
88 {1, 1}, /* CHANNEL 13 Reserved channels */
89 {1, 1}, /* CHANNEL 14 Reseved channels */
90 {5, 11}, /* CHANNEL 15 */
95 * Conversion table from -3 to 55 degree Celcius
97 static int therm_tbl[] = {
98 30800, 29500, 28300, 27100,
99 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900,
100 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100,
101 11600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310,
102 8020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830,
103 5640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170,
104 4040, 3910, 3790, 3670, 3550
108 * Structure containing the registers
109 * of different conversion methods supported by MADC.
110 * Hardware or RT real time conversion request initiated by external host
111 * processor for RT Signal conversions.
112 * External host processors can also request for non RT conversions
113 * SW1 and SW2 software conversions also called asynchronous or GPC request.
116 const struct twl4030_madc_conversion_method twl4030_conversion_methods[] = {
117 [TWL4030_MADC_RT] = {
118 .sel = TWL4030_MADC_RTSELECT_LSB,
119 .avg = TWL4030_MADC_RTAVERAGE_LSB,
120 .rbase = TWL4030_MADC_RTCH0_LSB,
122 [TWL4030_MADC_SW1] = {
123 .sel = TWL4030_MADC_SW1SELECT_LSB,
124 .avg = TWL4030_MADC_SW1AVERAGE_LSB,
125 .rbase = TWL4030_MADC_GPCH0_LSB,
126 .ctrl = TWL4030_MADC_CTRL_SW1,
128 [TWL4030_MADC_SW2] = {
129 .sel = TWL4030_MADC_SW2SELECT_LSB,
130 .avg = TWL4030_MADC_SW2AVERAGE_LSB,
131 .rbase = TWL4030_MADC_GPCH0_LSB,
132 .ctrl = TWL4030_MADC_CTRL_SW2,
137 * Function to read a particular channel value.
138 * @madc - pointer to struct twl4030_madc_data
139 * @reg - lsb of ADC Channel
140 * If the i2c read fails it returns an error else returns 0.
142 static int twl4030_madc_channel_raw_read(struct twl4030_madc_data *madc, u8 reg)
147 * For each ADC channel, we have MSB and LSB register pair. MSB address
148 * is always LSB address+1. reg parameter is the address of LSB register
150 ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &msb, reg + 1);
152 dev_err(madc->dev, "unable to read MSB register 0x%X\n",
156 ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &lsb, reg);
158 dev_err(madc->dev, "unable to read LSB register 0x%X\n", reg);
162 return (int)(((msb << 8) | lsb) >> 6);
166 * Return battery temperature
169 static int twl4030battery_temperature(int raw_volt)
172 int temp, curr, volt, res, ret;
174 volt = (raw_volt * TEMP_STEP_SIZE) / TEMP_PSR_R;
175 /* Getting and calculating the supply current in micro ampers */
176 ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE, &val,
180 curr = ((val & TWL4030_BCI_ITHEN) + 1) * 10;
181 /* Getting and calculating the thermistor resistance in ohms */
182 res = volt * 1000 / curr;
183 /* calculating temperature */
184 for (temp = 58; temp >= 0; temp--) {
185 int actual = therm_tbl[temp];
187 if ((actual - res) >= 0)
194 static int twl4030battery_current(int raw_volt)
199 ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE, &val,
200 TWL4030_BCI_BCICTL1);
203 if (val & TWL4030_BCI_CGAIN) /* slope of 0.44 mV/mA */
204 return (raw_volt * CURR_STEP_SIZE) / CURR_PSR_R1;
205 else /* slope of 0.88 mV/mA */
206 return (raw_volt * CURR_STEP_SIZE) / CURR_PSR_R2;
209 * Function to read channel values
210 * @madc - pointer to twl4030_madc_data struct
211 * @reg_base - Base address of the first channel
212 * @Channels - 16 bit bitmap. If the bit is set, channel value is read
213 * @buf - The channel values are stored here. if read fails error
214 * @raw - Return raw values without conversion
216 * Returns the number of successfully read channels.
218 static int twl4030_madc_read_channels(struct twl4030_madc_data *madc,
219 u8 reg_base, unsigned
220 long channels, int *buf,
223 int count = 0, count_req = 0, i;
226 for_each_set_bit(i, &channels, TWL4030_MADC_MAX_CHANNELS) {
227 reg = reg_base + 2 * i;
228 buf[i] = twl4030_madc_channel_raw_read(madc, reg);
231 "Unable to read register 0x%X\n", reg);
241 buf[i] = twl4030battery_current(buf[i]);
243 dev_err(madc->dev, "err reading current\n");
247 buf[i] = buf[i] - 750;
251 buf[i] = twl4030battery_temperature(buf[i]);
253 dev_err(madc->dev, "err reading temperature\n");
262 /* Analog Input (V) = conv_result * step_size / R
263 * conv_result = decimal value of 10-bit conversion
265 * step size = 1.5 / (2 ^ 10 -1)
266 * R = Prescaler ratio for input channels.
267 * Result given in mV hence multiplied by 1000.
269 buf[i] = (buf[i] * 3 * 1000 *
270 twl4030_divider_ratios[i].denominator)
272 twl4030_divider_ratios[i].numerator);
276 dev_err(madc->dev, "%d channel conversion failed\n", count_req);
283 * @madc - pointer to twl4030_madc_data struct
284 * @id - irq number to be enabled
285 * can take one of TWL4030_MADC_RT, TWL4030_MADC_SW1, TWL4030_MADC_SW2
286 * corresponding to RT, SW1, SW2 conversion requests.
287 * If the i2c read fails it returns an error else returns 0.
289 static int twl4030_madc_enable_irq(struct twl4030_madc_data *madc, u8 id)
294 ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &val, madc->imr);
296 dev_err(madc->dev, "unable to read imr register 0x%X\n",
301 ret = twl_i2c_write_u8(TWL4030_MODULE_MADC, val, madc->imr);
304 "unable to write imr register 0x%X\n", madc->imr);
314 * @madc - pointer to twl4030_madc_data struct
315 * @id - irq number to be disabled
316 * can take one of TWL4030_MADC_RT, TWL4030_MADC_SW1, TWL4030_MADC_SW2
317 * corresponding to RT, SW1, SW2 conversion requests.
318 * Returns error if i2c read/write fails.
320 static int twl4030_madc_disable_irq(struct twl4030_madc_data *madc, u8 id)
325 ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &val, madc->imr);
327 dev_err(madc->dev, "unable to read imr register 0x%X\n",
332 ret = twl_i2c_write_u8(TWL4030_MODULE_MADC, val, madc->imr);
335 "unable to write imr register 0x%X\n", madc->imr);
342 static irqreturn_t twl4030_madc_threaded_irq_handler(int irq, void *_madc)
344 struct twl4030_madc_data *madc = _madc;
345 const struct twl4030_madc_conversion_method *method;
348 struct twl4030_madc_request *r;
350 mutex_lock(&madc->lock);
351 ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &isr_val, madc->isr);
353 dev_err(madc->dev, "unable to read isr register 0x%X\n",
357 ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &imr_val, madc->imr);
359 dev_err(madc->dev, "unable to read imr register 0x%X\n",
364 for (i = 0; i < TWL4030_MADC_NUM_METHODS; i++) {
365 if (!(isr_val & (1 << i)))
367 ret = twl4030_madc_disable_irq(madc, i);
369 dev_dbg(madc->dev, "Disable interrupt failed%d\n", i);
370 madc->requests[i].result_pending = 1;
372 for (i = 0; i < TWL4030_MADC_NUM_METHODS; i++) {
373 r = &madc->requests[i];
374 /* No pending results for this method, move to next one */
375 if (!r->result_pending)
377 method = &twl4030_conversion_methods[r->method];
379 len = twl4030_madc_read_channels(madc, method->rbase,
380 r->channels, r->rbuf, r->raw);
381 /* Return results to caller */
382 if (r->func_cb != NULL) {
383 r->func_cb(len, r->channels, r->rbuf);
387 r->result_pending = 0;
390 mutex_unlock(&madc->lock);
396 * In case of error check whichever request is active
397 * and service the same.
399 for (i = 0; i < TWL4030_MADC_NUM_METHODS; i++) {
400 r = &madc->requests[i];
403 method = &twl4030_conversion_methods[r->method];
405 len = twl4030_madc_read_channels(madc, method->rbase,
406 r->channels, r->rbuf, r->raw);
407 /* Return results to caller */
408 if (r->func_cb != NULL) {
409 r->func_cb(len, r->channels, r->rbuf);
413 r->result_pending = 0;
416 mutex_unlock(&madc->lock);
421 static int twl4030_madc_set_irq(struct twl4030_madc_data *madc,
422 struct twl4030_madc_request *req)
424 struct twl4030_madc_request *p;
427 p = &madc->requests[req->method];
428 memcpy(p, req, sizeof(*req));
429 ret = twl4030_madc_enable_irq(madc, req->method);
431 dev_err(madc->dev, "enable irq failed!!\n");
439 * Function which enables the madc conversion
440 * by writing to the control register.
441 * @madc - pointer to twl4030_madc_data struct
442 * @conv_method - can be TWL4030_MADC_RT, TWL4030_MADC_SW2, TWL4030_MADC_SW1
443 * corresponding to RT SW1 or SW2 conversion methods.
444 * Returns 0 if succeeds else a negative error value
446 static int twl4030_madc_start_conversion(struct twl4030_madc_data *madc,
449 const struct twl4030_madc_conversion_method *method;
451 method = &twl4030_conversion_methods[conv_method];
452 switch (conv_method) {
453 case TWL4030_MADC_SW1:
454 case TWL4030_MADC_SW2:
455 ret = twl_i2c_write_u8(TWL4030_MODULE_MADC,
456 TWL4030_MADC_SW_START, method->ctrl);
459 "unable to write ctrl register 0x%X\n",
472 * Function that waits for conversion to be ready
473 * @madc - pointer to twl4030_madc_data struct
474 * @timeout_ms - timeout value in milliseconds
475 * @status_reg - ctrl register
476 * returns 0 if succeeds else a negative error value
478 static int twl4030_madc_wait_conversion_ready(struct twl4030_madc_data *madc,
479 unsigned int timeout_ms,
482 unsigned long timeout;
485 timeout = jiffies + msecs_to_jiffies(timeout_ms);
489 ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, ®, status_reg);
492 "unable to read status register 0x%X\n",
496 if (!(reg & TWL4030_MADC_BUSY) && (reg & TWL4030_MADC_EOC_SW))
498 usleep_range(500, 2000);
499 } while (!time_after(jiffies, timeout));
500 dev_err(madc->dev, "conversion timeout!\n");
506 * An exported function which can be called from other kernel drivers.
507 * @req twl4030_madc_request structure
508 * req->rbuf will be filled with read values of channels based on the
509 * channel index. If a particular channel reading fails there will
510 * be a negative error value in the corresponding array element.
511 * returns 0 if succeeds else error value
513 int twl4030_madc_conversion(struct twl4030_madc_request *req)
515 const struct twl4030_madc_conversion_method *method;
519 if (!req || !twl4030_madc)
522 mutex_lock(&twl4030_madc->lock);
523 if (req->method < TWL4030_MADC_RT || req->method > TWL4030_MADC_SW2) {
527 /* Do we have a conversion request ongoing */
528 if (twl4030_madc->requests[req->method].active) {
532 ch_msb = (req->channels >> 8) & 0xff;
533 ch_lsb = req->channels & 0xff;
534 method = &twl4030_conversion_methods[req->method];
535 /* Select channels to be converted */
536 ret = twl_i2c_write_u8(TWL4030_MODULE_MADC, ch_msb, method->sel + 1);
538 dev_err(twl4030_madc->dev,
539 "unable to write sel register 0x%X\n", method->sel + 1);
542 ret = twl_i2c_write_u8(TWL4030_MODULE_MADC, ch_lsb, method->sel);
544 dev_err(twl4030_madc->dev,
545 "unable to write sel register 0x%X\n", method->sel + 1);
548 /* Select averaging for all channels if do_avg is set */
550 ret = twl_i2c_write_u8(TWL4030_MODULE_MADC,
551 ch_msb, method->avg + 1);
553 dev_err(twl4030_madc->dev,
554 "unable to write avg register 0x%X\n",
558 ret = twl_i2c_write_u8(TWL4030_MODULE_MADC,
559 ch_lsb, method->avg);
561 dev_err(twl4030_madc->dev,
562 "unable to write sel reg 0x%X\n",
567 if (req->type == TWL4030_MADC_IRQ_ONESHOT && req->func_cb != NULL) {
568 ret = twl4030_madc_set_irq(twl4030_madc, req);
571 ret = twl4030_madc_start_conversion(twl4030_madc, req->method);
574 twl4030_madc->requests[req->method].active = 1;
578 /* With RT method we should not be here anymore */
579 if (req->method == TWL4030_MADC_RT) {
583 ret = twl4030_madc_start_conversion(twl4030_madc, req->method);
586 twl4030_madc->requests[req->method].active = 1;
587 /* Wait until conversion is ready (ctrl register returns EOC) */
588 ret = twl4030_madc_wait_conversion_ready(twl4030_madc, 5, method->ctrl);
590 twl4030_madc->requests[req->method].active = 0;
593 ret = twl4030_madc_read_channels(twl4030_madc, method->rbase,
594 req->channels, req->rbuf, req->raw);
595 twl4030_madc->requests[req->method].active = 0;
598 mutex_unlock(&twl4030_madc->lock);
602 EXPORT_SYMBOL_GPL(twl4030_madc_conversion);
605 * Return channel value
608 int twl4030_get_madc_conversion(int channel_no)
610 struct twl4030_madc_request req;
614 req.channels = (1 << channel_no);
615 req.method = TWL4030_MADC_SW2;
618 ret = twl4030_madc_conversion(&req);
621 if (req.rbuf[channel_no] > 0)
622 temp = req.rbuf[channel_no];
626 EXPORT_SYMBOL_GPL(twl4030_get_madc_conversion);
629 * Function to enable or disable bias current for
630 * main battery type reading or temperature sensing
631 * @madc - pointer to twl4030_madc_data struct
632 * @chan - can be one of the two values
633 * TWL4030_BCI_ITHEN - Enables bias current for main battery type reading
634 * TWL4030_BCI_TYPEN - Enables bias current for main battery temperature
636 * @on - enable or disable chan.
638 static int twl4030_madc_set_current_generator(struct twl4030_madc_data *madc,
644 ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE,
645 ®val, TWL4030_BCI_BCICTL1);
647 dev_err(madc->dev, "unable to read BCICTL1 reg 0x%X",
648 TWL4030_BCI_BCICTL1);
652 regval |= chan ? TWL4030_BCI_ITHEN : TWL4030_BCI_TYPEN;
654 regval &= chan ? ~TWL4030_BCI_ITHEN : ~TWL4030_BCI_TYPEN;
655 ret = twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE,
656 regval, TWL4030_BCI_BCICTL1);
658 dev_err(madc->dev, "unable to write BCICTL1 reg 0x%X\n",
659 TWL4030_BCI_BCICTL1);
667 * Function that sets MADC software power on bit to enable MADC
668 * @madc - pointer to twl4030_madc_data struct
669 * @on - Enable or disable MADC software powen on bit.
670 * returns error if i2c read/write fails else 0
672 static int twl4030_madc_set_power(struct twl4030_madc_data *madc, int on)
677 ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE,
678 ®val, TWL4030_MADC_CTRL1);
680 dev_err(madc->dev, "unable to read madc ctrl1 reg 0x%X\n",
685 regval |= TWL4030_MADC_MADCON;
687 regval &= ~TWL4030_MADC_MADCON;
688 ret = twl_i2c_write_u8(TWL4030_MODULE_MADC, regval, TWL4030_MADC_CTRL1);
690 dev_err(madc->dev, "unable to write madc ctrl1 reg 0x%X\n",
699 * Initialize MADC and request for threaded irq
701 static int twl4030_madc_probe(struct platform_device *pdev)
703 struct twl4030_madc_data *madc;
704 struct twl4030_madc_platform_data *pdata = dev_get_platdata(&pdev->dev);
709 dev_err(&pdev->dev, "platform_data not available\n");
712 madc = kzalloc(sizeof(*madc), GFP_KERNEL);
716 madc->dev = &pdev->dev;
719 * Phoenix provides 2 interrupt lines. The first one is connected to
720 * the OMAP. The other one can be connected to the other processor such
721 * as modem. Hence two separate ISR and IMR registers.
723 madc->imr = (pdata->irq_line == 1) ?
724 TWL4030_MADC_IMR1 : TWL4030_MADC_IMR2;
725 madc->isr = (pdata->irq_line == 1) ?
726 TWL4030_MADC_ISR1 : TWL4030_MADC_ISR2;
727 ret = twl4030_madc_set_power(madc, 1);
730 ret = twl4030_madc_set_current_generator(madc, 0, 1);
732 goto err_current_generator;
734 ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE,
735 ®val, TWL4030_BCI_BCICTL1);
737 dev_err(&pdev->dev, "unable to read reg BCI CTL1 0x%X\n",
738 TWL4030_BCI_BCICTL1);
741 regval |= TWL4030_BCI_MESBAT;
742 ret = twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE,
743 regval, TWL4030_BCI_BCICTL1);
745 dev_err(&pdev->dev, "unable to write reg BCI Ctl1 0x%X\n",
746 TWL4030_BCI_BCICTL1);
750 /* Check that MADC clock is on */
751 ret = twl_i2c_read_u8(TWL4030_MODULE_INTBR, ®val, TWL4030_REG_GPBR1);
753 dev_err(&pdev->dev, "unable to read reg GPBR1 0x%X\n",
758 /* If MADC clk is not on, turn it on */
759 if (!(regval & TWL4030_GPBR1_MADC_HFCLK_EN)) {
760 dev_info(&pdev->dev, "clk disabled, enabling\n");
761 regval |= TWL4030_GPBR1_MADC_HFCLK_EN;
762 ret = twl_i2c_write_u8(TWL4030_MODULE_INTBR, regval,
765 dev_err(&pdev->dev, "unable to write reg GPBR1 0x%X\n",
771 platform_set_drvdata(pdev, madc);
772 mutex_init(&madc->lock);
773 ret = request_threaded_irq(platform_get_irq(pdev, 0), NULL,
774 twl4030_madc_threaded_irq_handler,
775 IRQF_TRIGGER_RISING, "twl4030_madc", madc);
777 dev_dbg(&pdev->dev, "could not request irq\n");
783 twl4030_madc_set_current_generator(madc, 0, 0);
784 err_current_generator:
785 twl4030_madc_set_power(madc, 0);
792 static int twl4030_madc_remove(struct platform_device *pdev)
794 struct twl4030_madc_data *madc = platform_get_drvdata(pdev);
796 free_irq(platform_get_irq(pdev, 0), madc);
797 twl4030_madc_set_current_generator(madc, 0, 0);
798 twl4030_madc_set_power(madc, 0);
804 static struct platform_driver twl4030_madc_driver = {
805 .probe = twl4030_madc_probe,
806 .remove = twl4030_madc_remove,
808 .name = "twl4030_madc",
809 .owner = THIS_MODULE,
813 module_platform_driver(twl4030_madc_driver);
815 MODULE_DESCRIPTION("TWL4030 ADC driver");
816 MODULE_LICENSE("GPL");
817 MODULE_AUTHOR("J Keerthy");
818 MODULE_ALIAS("platform:twl4030_madc");