0a45c24b4120e0e30cdee1207f6823afa472ae2f
[pandora-kernel.git] / drivers / power / twl4030_charger.c
1 /*
2  * TWL4030/TPS65950 BCI (Battery Charger Interface) driver
3  *
4  * Copyright (C) 2010 Gražvydas Ignotas <notasas@gmail.com>
5  *
6  * based on twl4030_bci_battery.c by TI
7  * Copyright (C) 2008 Texas Instruments, Inc.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  */
14
15 #include <linux/init.h>
16 #include <linux/module.h>
17 #include <linux/slab.h>
18 #include <linux/platform_device.h>
19 #include <linux/interrupt.h>
20 #include <linux/i2c/twl.h>
21 #include <linux/power_supply.h>
22 #include <linux/notifier.h>
23 #include <linux/usb/otg.h>
24 #include <linux/ratelimit.h>
25 #include <linux/regulator/machine.h>
26
27 #define TWL4030_BCIMSTATEC      0x02
28 #define TWL4030_BCIICHG         0x08
29 #define TWL4030_BCIVAC          0x0a
30 #define TWL4030_BCIVBUS         0x0c
31 #define TWL4030_BCIMFSTS3       0x0f
32 #define TWL4030_BCIMFSTS4       0x10
33 #define TWL4030_BCIMFKEY        0x11
34 #define TWL4030_BCICTL1         0x23
35 #define TWL4030_BCIIREF1        0x27
36 #define TWL4030_BCIIREF2        0x28
37
38 #define TWL4030_BCIAUTOWEN      BIT(5)
39 #define TWL4030_CONFIG_DONE     BIT(4)
40 #define TWL4030_CVENAC          BIT(2)
41 #define TWL4030_BCIAUTOUSB      BIT(1)
42 #define TWL4030_BCIAUTOAC       BIT(0)
43 #define TWL4030_CGAIN           BIT(5)
44 #define TWL4030_USBFASTMCHG     BIT(2)
45 #define TWL4030_STS_VBUS        BIT(7)
46 #define TWL4030_STS_USB_ID      BIT(2)
47
48 /* BCI interrupts */
49 #define TWL4030_WOVF            BIT(0) /* Watchdog overflow */
50 #define TWL4030_TMOVF           BIT(1) /* Timer overflow */
51 #define TWL4030_ICHGHIGH        BIT(2) /* Battery charge current high */
52 #define TWL4030_ICHGLOW         BIT(3) /* Battery cc. low / FSM state change */
53 #define TWL4030_ICHGEOC         BIT(4) /* Battery current end-of-charge */
54 #define TWL4030_TBATOR2         BIT(5) /* Battery temperature out of range 2 */
55 #define TWL4030_TBATOR1         BIT(6) /* Battery temperature out of range 1 */
56 #define TWL4030_BATSTS          BIT(7) /* Battery status */
57
58 #define TWL4030_VBATLVL         BIT(0) /* VBAT level */
59 #define TWL4030_VBATOV          BIT(1) /* VBAT overvoltage */
60 #define TWL4030_VBUSOV          BIT(2) /* VBUS overvoltage */
61 #define TWL4030_ACCHGOV         BIT(3) /* Ac charger overvoltage */
62
63 #define TWL4030_MSTATEC_USB             BIT(4)
64 #define TWL4030_MSTATEC_AC              BIT(5)
65 #define TWL4030_MSTATEC_MASK            0x0f
66 #define TWL4030_MSTATEC_QUICK1          0x02
67 #define TWL4030_MSTATEC_QUICK7          0x07
68 #define TWL4030_MSTATEC_COMPLETE1       0x0b
69 #define TWL4030_MSTATEC_COMPLETE4       0x0e
70
71 #define TWL4030_KEY_IIREF               0xe7
72 #define TWL4030_BATSTSMCHG              BIT(6)
73
74 static bool allow_usb = 1;
75 module_param(allow_usb, bool, 0644);
76 MODULE_PARM_DESC(allow_usb, "Allow USB charge drawing default current");
77
78 struct twl4030_bci {
79         struct device           *dev;
80         struct power_supply     ac;
81         struct power_supply     usb;
82         struct otg_transceiver  *transceiver;
83         struct notifier_block   otg_nb;
84         struct work_struct      work;
85         int                     irq_chg;
86         int                     irq_bci;
87         bool                    ac_charge_enable;
88         bool                    usb_charge_enable;
89         int                     usb_current;
90         int                     ac_current;
91         enum power_supply_type  current_supply;
92         struct regulator        *usb_reg;
93         int                     usb_enabled;
94
95         unsigned long           event;
96         struct ratelimit_state  ratelimit;
97 };
98
99 /*
100  * clear and set bits on an given register on a given module
101  */
102 static int twl4030_clear_set(u8 mod_no, u8 clear, u8 set, u8 reg)
103 {
104         u8 val = 0;
105         int ret;
106
107         ret = twl_i2c_read_u8(mod_no, &val, reg);
108         if (ret)
109                 return ret;
110
111         val &= ~clear;
112         val |= set;
113
114         return twl_i2c_write_u8(mod_no, val, reg);
115 }
116
117 static int twl4030_bci_read(u8 reg, u8 *val)
118 {
119         return twl_i2c_read_u8(TWL4030_MODULE_MAIN_CHARGE, val, reg);
120 }
121
122 static int twl4030_bci_write(u8 reg, u8 val)
123 {
124         return twl_i2c_write_u8(TWL4030_MODULE_MAIN_CHARGE, val, reg);
125 }
126
127 static int twl4030_clear_set_boot_bci(u8 clear, u8 set)
128 {
129         return twl4030_clear_set(TWL4030_MODULE_PM_MASTER, clear,
130                         TWL4030_CONFIG_DONE | TWL4030_BCIAUTOWEN | set,
131                         TWL4030_PM_MASTER_BOOT_BCI);
132 }
133
134 static int twl4030bci_read_adc_val(u8 reg)
135 {
136         int ret, temp;
137         u8 val;
138
139         /* read MSB */
140         ret = twl4030_bci_read(reg + 1, &val);
141         if (ret)
142                 return ret;
143
144         temp = (int)(val & 0x03) << 8;
145
146         /* read LSB */
147         ret = twl4030_bci_read(reg, &val);
148         if (ret)
149                 return ret;
150
151         return temp | val;
152 }
153
154 /*
155  * Check if VBUS power is present
156  */
157 static int twl4030_bci_have_vbus(struct twl4030_bci *bci)
158 {
159         int ret;
160         u8 hwsts;
161
162         ret = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &hwsts,
163                               TWL4030_PM_MASTER_STS_HW_CONDITIONS);
164         if (ret < 0)
165                 return 0;
166
167         dev_dbg(bci->dev, "check_vbus: HW_CONDITIONS %02x\n", hwsts);
168
169         /* in case we also have STS_USB_ID, VBUS is driven by TWL itself */
170         if ((hwsts & TWL4030_STS_VBUS) && !(hwsts & TWL4030_STS_USB_ID))
171                 return 1;
172
173         return 0;
174 }
175
176 /*
177  * Enable/Disable USB Charge functionality.
178  */
179 static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable)
180 {
181         int ret;
182
183         if (enable) {
184                 if (!bci->usb_charge_enable)
185                         return -EACCES;
186
187                 /* Check for USB charger conneted */
188                 if (!twl4030_bci_have_vbus(bci))
189                         return -ENODEV;
190
191                 /*
192                  * Until we can find out what current the device can provide,
193                  * require a module param to enable USB charging.
194                  */
195                 if (!allow_usb) {
196                         dev_warn(bci->dev, "USB charging is disabled.\n");
197                         return -EACCES;
198                 }
199
200                 /* Need to keep regulator on */
201                 if (!bci->usb_enabled &&
202                     bci->usb_reg &&
203                     regulator_enable(bci->usb_reg) == 0)
204                         bci->usb_enabled = 1;
205
206                 /* forcing the field BCIAUTOUSB (BOOT_BCI[1]) to 1 */
207                 ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOUSB);
208                 if (ret < 0)
209                         return ret;
210
211                 /* forcing USBFASTMCHG(BCIMFSTS4[2]) to 1 */
212                 ret = twl4030_clear_set(TWL4030_MODULE_MAIN_CHARGE, 0,
213                         TWL4030_USBFASTMCHG, TWL4030_BCIMFSTS4);
214         } else {
215                 ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOUSB, 0);
216                 if (bci->usb_enabled &&
217                     regulator_disable(bci->usb_reg) == 0)
218                         bci->usb_enabled = 0;
219         }
220
221         return ret;
222 }
223
224 /*
225  * Enable/Disable AC Charge funtionality.
226  */
227 static int twl4030_charger_enable_ac(bool enable)
228 {
229         int ret;
230
231         if (enable)
232                 ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOAC);
233         else
234                 ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOAC, 0);
235
236         return ret;
237 }
238
239 static int set_charge_current(struct twl4030_bci *bci, int new_current)
240 {
241         u8 val, boot_bci_prev, cgain_set, cgain_clear;
242         int ret, ret2;
243
244         ret = twl4030_bci_read(TWL4030_BCIMFSTS3, &val);
245         if (ret)
246                 goto out_norestore;
247
248         if (!(val & TWL4030_BATSTSMCHG)) {
249                 dev_err(bci->dev, "missing battery, can't change charge_current\n");
250                 goto out_norestore;
251         }
252
253         ret = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &boot_bci_prev,
254                 TWL4030_PM_MASTER_BOOT_BCI);
255         if (ret)
256                 goto out_norestore;
257
258         /* 
259          * Stop automatic charging here, because charge current change
260          * requires multiple register writes and CGAIN change requires
261          * automatic charge to be stopped (and CV mode disabled too).
262          */
263         ret = twl4030_clear_set_boot_bci(
264                 TWL4030_CVENAC | TWL4030_BCIAUTOAC | TWL4030_BCIAUTOUSB, 0);
265         if (ret)
266                 goto out;
267
268         ret = twl4030_bci_write(TWL4030_BCIMFKEY, TWL4030_KEY_IIREF);
269         if (ret)
270                 goto out;
271
272         ret = twl4030_bci_write(TWL4030_BCIIREF1, new_current & 0xff);
273         if (ret)
274                 goto out;
275
276         ret = twl4030_bci_write(TWL4030_BCIMFKEY, TWL4030_KEY_IIREF);
277         if (ret)
278                 goto out;
279
280         ret = twl4030_bci_write(TWL4030_BCIIREF2, (new_current >> 8) & 0x1);
281         if (ret)
282                 goto out;
283
284         /* Set CGAIN = 0 or 1 */
285         if (new_current > 511) {
286                 cgain_set = TWL4030_CGAIN;
287                 cgain_clear = 0;
288         } else {
289                 cgain_set = 0;
290                 cgain_clear = TWL4030_CGAIN;
291         }
292
293         ret = twl4030_clear_set(TWL4030_MODULE_MAIN_CHARGE,
294                         cgain_clear, cgain_set, TWL4030_BCICTL1);
295         if (ret)
296                 goto out;
297
298         ret = twl4030_bci_read(TWL4030_BCICTL1, &val);
299         if (ret != 0 || (val & TWL4030_CGAIN) != cgain_set) {
300                 dev_err(bci->dev, "CGAIN change failed\n");
301                 goto out;
302         }
303
304 out:
305         ret2 = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, boot_bci_prev,
306                 TWL4030_PM_MASTER_BOOT_BCI);
307         if (ret2 != 0)
308                 dev_err(bci->dev, "failed boot_bci restore: %d\n", ret2);
309
310 out_norestore:
311         if (ret != 0)
312                 dev_err(bci->dev, "charge current change failed: %d\n", ret);
313
314         return ret;
315 }
316
317 /*
318  * TWL4030 CHG_PRES (AC charger presence) events
319  */
320 static irqreturn_t twl4030_charger_interrupt(int irq, void *arg)
321 {
322         struct twl4030_bci *bci = arg;
323
324         dev_dbg(bci->dev, "CHG_PRES irq\n");
325         power_supply_changed(&bci->ac);
326         power_supply_changed(&bci->usb);
327
328         return IRQ_HANDLED;
329 }
330
331 /*
332  * TWL4030 BCI monitoring events
333  */
334 static irqreturn_t twl4030_bci_interrupt(int irq, void *arg)
335 {
336         struct twl4030_bci *bci = arg;
337         u8 irqs1, irqs2;
338         int ret;
339
340         ret = twl_i2c_read_u8(TWL4030_MODULE_INTERRUPTS, &irqs1,
341                               TWL4030_INTERRUPTS_BCIISR1A);
342         if (ret < 0)
343                 return IRQ_HANDLED;
344
345         ret = twl_i2c_read_u8(TWL4030_MODULE_INTERRUPTS, &irqs2,
346                               TWL4030_INTERRUPTS_BCIISR2A);
347         if (ret < 0)
348                 return IRQ_HANDLED;
349
350         dev_dbg(bci->dev, "BCI irq %02x %02x\n", irqs2, irqs1);
351
352         if (irqs1 & (TWL4030_ICHGLOW | TWL4030_ICHGEOC)) {
353                 /* charger state change, inform the core */
354                 power_supply_changed(&bci->ac);
355                 power_supply_changed(&bci->usb);
356         }
357
358         /* various monitoring events, for now we just log them here */
359         if (irqs1 & (TWL4030_TBATOR2 | TWL4030_TBATOR1) &&
360                         __ratelimit(&bci->ratelimit))
361                 dev_warn(bci->dev, "battery temperature out of range\n");
362
363         if (irqs1 & TWL4030_BATSTS && __ratelimit(&bci->ratelimit))
364                 dev_crit(bci->dev, "battery disconnected\n");
365
366         if (irqs2 & TWL4030_VBATOV && __ratelimit(&bci->ratelimit))
367                 dev_crit(bci->dev, "VBAT overvoltage\n");
368
369         if (irqs2 & TWL4030_VBUSOV && __ratelimit(&bci->ratelimit))
370                 dev_crit(bci->dev, "VBUS overvoltage\n");
371
372         if (irqs2 & TWL4030_ACCHGOV && __ratelimit(&bci->ratelimit))
373                 dev_crit(bci->dev, "Ac charger overvoltage\n");
374
375         /* ack the interrupts */
376         twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, irqs1,
377                          TWL4030_INTERRUPTS_BCIISR1A);
378         twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, irqs2,
379                          TWL4030_INTERRUPTS_BCIISR2A);
380
381         return IRQ_HANDLED;
382 }
383
384 static void twl4030_bci_usb_work(struct work_struct *data)
385 {
386         struct twl4030_bci *bci = container_of(data, struct twl4030_bci, work);
387
388         switch (bci->event) {
389         case USB_EVENT_VBUS:
390         case USB_EVENT_CHARGER:
391                 twl4030_charger_enable_usb(bci, true);
392                 break;
393         case USB_EVENT_NONE:
394                 twl4030_charger_enable_usb(bci, false);
395                 break;
396         }
397 }
398
399 static int twl4030_bci_usb_ncb(struct notifier_block *nb, unsigned long val,
400                                void *priv)
401 {
402         struct twl4030_bci *bci = container_of(nb, struct twl4030_bci, otg_nb);
403
404         dev_dbg(bci->dev, "OTG notify %lu\n", val);
405
406         bci->event = val;
407         schedule_work(&bci->work);
408
409         return NOTIFY_OK;
410 }
411
412 /*
413  * TI provided formulas:
414  * CGAIN == 0: ICHG = (BCIICHG * 1.7) / (2^10 - 1) - 0.85
415  * CGAIN == 1: ICHG = (BCIICHG * 3.4) / (2^10 - 1) - 1.7
416  * Here we use integer approximation of:
417  * CGAIN == 0: val * 1.6618 - 0.85
418  * CGAIN == 1: (val * 1.6618 - 0.85) * 2
419  */
420 static int twl4030_charger_get_current(void)
421 {
422         int curr;
423         int ret;
424         u8 bcictl1;
425
426         curr = twl4030bci_read_adc_val(TWL4030_BCIICHG);
427         if (curr < 0)
428                 return curr;
429
430         ret = twl4030_bci_read(TWL4030_BCICTL1, &bcictl1);
431         if (ret)
432                 return ret;
433
434         ret = (curr * 16618 - 850 * 10000) / 10;
435         if (bcictl1 & TWL4030_CGAIN)
436                 ret *= 2;
437
438         return ret;
439 }
440
441 static ssize_t twl4030_bci_ac_show_enable(struct device *dev,
442                                           struct device_attribute *attr,
443                                           char *buf)
444 {
445         u8 boot_bci;
446         int ret;
447
448         ret = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &boot_bci,
449                               TWL4030_PM_MASTER_BOOT_BCI);
450         if (ret)
451                 return ret;
452
453         return sprintf(buf, "%d\n", (boot_bci & TWL4030_BCIAUTOAC) ? 1 : 0);
454 }
455
456 static ssize_t twl4030_bci_ac_store_enable(struct device *dev,
457                                            struct device_attribute *attr,
458                                            const char *buf, size_t count)
459 {
460         struct power_supply *psy = dev_get_drvdata(dev);
461         struct twl4030_bci *bci = container_of(psy, struct twl4030_bci, ac);
462         unsigned long enable;
463         int ret;
464
465         ret = strict_strtoul(buf, 10, &enable);
466         if (ret || enable > 1)
467                 return -EINVAL;
468
469         bci->ac_charge_enable = enable;
470         twl4030_charger_enable_ac(enable);
471
472         return count;
473 }
474 static struct device_attribute dev_attr_enable_ac =
475         __ATTR(enable, S_IRUGO | S_IWUSR, twl4030_bci_ac_show_enable,
476         twl4030_bci_ac_store_enable);
477
478 static ssize_t twl4030_bci_usb_show_enable(struct device *dev,
479                                            struct device_attribute *attr,
480                                            char *buf)
481 {
482         u8 boot_bci;
483         int ret;
484
485         ret = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &boot_bci,
486                               TWL4030_PM_MASTER_BOOT_BCI);
487         if (ret)
488                 return ret;
489
490         return sprintf(buf, "%d\n", (boot_bci & TWL4030_BCIAUTOUSB) ? 1 : 0);
491 }
492
493 static ssize_t twl4030_bci_usb_store_enable(struct device *dev,
494                                             struct device_attribute *attr,
495                                             const char *buf, size_t count)
496 {
497         struct power_supply *psy = dev_get_drvdata(dev);
498         struct twl4030_bci *bci = container_of(psy, struct twl4030_bci, usb);
499         unsigned long enable;
500         int ret;
501
502         ret = strict_strtoul(buf, 10, &enable);
503         if (ret || enable > 1)
504                 return -EINVAL;
505
506         bci->usb_charge_enable = enable;
507         twl4030_charger_enable_usb(bci, enable);
508
509         return count;
510 }
511 static struct device_attribute dev_attr_enable_usb =
512         __ATTR(enable, S_IRUGO | S_IWUSR, twl4030_bci_usb_show_enable,
513         twl4030_bci_usb_store_enable);
514
515 static ssize_t show_charge_current(struct device *dev,
516                         struct device_attribute *attr, char *buf)
517 {
518         int ret, val;
519         u8 ctl;
520         
521         val = twl4030bci_read_adc_val(TWL4030_BCIIREF1);
522         if (val < 0)
523                 return val;
524         ret = twl4030_bci_read(TWL4030_BCICTL1, &ctl);
525         if (ret < 0)
526                 return ret;
527
528         val &= 0x1ff;
529         if (ctl & TWL4030_CGAIN)
530                 val |= 0x200;
531
532         return sprintf(buf, "%d\n", val);
533 }
534
535 static ssize_t store_charge_current(struct device *dev,
536                         struct device_attribute *attr, const char *buf,
537                         size_t count)
538 {
539         struct power_supply *psy = dev_get_drvdata(dev);
540         struct twl4030_bci *bci = dev_get_drvdata(psy->dev->parent);
541         unsigned long new_current;
542         int ret;
543
544         ret = strict_strtoul(buf, 10, &new_current);
545         if (ret)
546                 return -EINVAL;
547
548         ret = set_charge_current(bci, new_current);
549         if (ret)
550                 return ret;
551
552         if (psy->type == POWER_SUPPLY_TYPE_MAINS)
553                 bci->ac_current = new_current;
554         else
555                 bci->usb_current = new_current;
556
557         return count;
558 }
559 static DEVICE_ATTR(charge_current, S_IRUGO | S_IWUSR, show_charge_current,
560         store_charge_current);
561
562 static struct attribute *bci_ac_attrs[] = {
563         &dev_attr_enable_ac.attr,
564         &dev_attr_charge_current.attr,
565         NULL,
566 };
567
568 static struct attribute *bci_usb_attrs[] = {
569         &dev_attr_enable_usb.attr,
570         &dev_attr_charge_current.attr,
571         NULL,
572 };
573         
574 static const struct attribute_group bci_ac_attr_group = {
575         .attrs = bci_ac_attrs,
576 };
577
578 static const struct attribute_group bci_usb_attr_group = {
579         .attrs = bci_usb_attrs,
580 };
581
582 /*
583  * Returns the main charge FSM state
584  * Or < 0 on failure.
585  */
586 static int twl4030bci_state(struct twl4030_bci *bci)
587 {
588         int ret;
589         u8 state;
590
591         ret = twl4030_bci_read(TWL4030_BCIMSTATEC, &state);
592         if (ret) {
593                 pr_err("twl4030_bci: error reading BCIMSTATEC\n");
594                 return ret;
595         }
596
597         dev_dbg(bci->dev, "state: %02x\n", state);
598
599         return state;
600 }
601
602 static int twl4030_bci_state_to_status(int state)
603 {
604         state &= TWL4030_MSTATEC_MASK;
605         if (TWL4030_MSTATEC_QUICK1 <= state && state <= TWL4030_MSTATEC_QUICK7)
606                 return POWER_SUPPLY_STATUS_CHARGING;
607         else if (TWL4030_MSTATEC_COMPLETE1 <= state &&
608                                         state <= TWL4030_MSTATEC_COMPLETE4)
609                 return POWER_SUPPLY_STATUS_FULL;
610         else
611                 return POWER_SUPPLY_STATUS_NOT_CHARGING;
612 }
613
614 static int twl4030_bci_get_property(struct power_supply *psy,
615                                     enum power_supply_property psp,
616                                     union power_supply_propval *val)
617 {
618         struct twl4030_bci *bci = dev_get_drvdata(psy->dev->parent);
619         int is_charging;
620         int state;
621         int ret;
622
623         state = twl4030bci_state(bci);
624         if (state < 0)
625                 return state;
626
627         if (psy->type == POWER_SUPPLY_TYPE_USB)
628                 is_charging = state & TWL4030_MSTATEC_USB;
629         else
630                 is_charging = state & TWL4030_MSTATEC_AC;
631         if (is_charging && psy->type != bci->current_supply) {
632                 if (psy->type == POWER_SUPPLY_TYPE_USB)
633                         set_charge_current(bci, bci->usb_current);
634                 else
635                         set_charge_current(bci, bci->ac_current);
636                 bci->current_supply = psy->type;
637         }
638
639         switch (psp) {
640         case POWER_SUPPLY_PROP_STATUS:
641                 if (is_charging)
642                         val->intval = twl4030_bci_state_to_status(state);
643                 else
644                         val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
645                 break;
646         case POWER_SUPPLY_PROP_VOLTAGE_NOW:
647                 /* charging must be active for meaningful result */
648                 if (!is_charging)
649                         return -ENODATA;
650                 if (psy->type == POWER_SUPPLY_TYPE_USB) {
651                         ret = twl4030bci_read_adc_val(TWL4030_BCIVBUS);
652                         if (ret < 0)
653                                 return ret;
654                         /* BCIVBUS uses ADCIN8, 7/1023 V/step */
655                         val->intval = ret * 6843;
656                 } else {
657                         ret = twl4030bci_read_adc_val(TWL4030_BCIVAC);
658                         if (ret < 0)
659                                 return ret;
660                         /* BCIVAC uses ADCIN11, 10/1023 V/step */
661                         val->intval = ret * 9775;
662                 }
663                 break;
664         case POWER_SUPPLY_PROP_CURRENT_NOW:
665                 if (!is_charging)
666                         return -ENODATA;
667                 /* current measurement is shared between AC and USB */
668                 ret = twl4030_charger_get_current();
669                 if (ret < 0)
670                         return ret;
671                 val->intval = ret;
672                 break;
673         case POWER_SUPPLY_PROP_ONLINE:
674                 val->intval = is_charging &&
675                         twl4030_bci_state_to_status(state) !=
676                                 POWER_SUPPLY_STATUS_NOT_CHARGING;
677                 break;
678         default:
679                 return -EINVAL;
680         }
681
682         return 0;
683 }
684
685 static enum power_supply_property twl4030_charger_props[] = {
686         POWER_SUPPLY_PROP_STATUS,
687         POWER_SUPPLY_PROP_ONLINE,
688         POWER_SUPPLY_PROP_VOLTAGE_NOW,
689         POWER_SUPPLY_PROP_CURRENT_NOW,
690 };
691
692 static int __init twl4030_bci_probe(struct platform_device *pdev)
693 {
694         const struct twl4030_bci_platform_data *pdata = pdev->dev.platform_data;
695         struct twl4030_bci *bci;
696         int ret;
697         u32 reg;
698
699         if (pdata == NULL) {
700                 dev_err(&pdev->dev, "No platform data\n");
701                 return -EINVAL;
702         }
703
704         bci = kzalloc(sizeof(*bci), GFP_KERNEL);
705         if (bci == NULL)
706                 return -ENOMEM;
707
708         bci->dev = &pdev->dev;
709         bci->irq_chg = platform_get_irq(pdev, 0);
710         bci->irq_bci = platform_get_irq(pdev, 1);
711         bci->ac_current = 860; /* ~1.2A */
712         bci->usb_current = 360; /* ~600mA */
713
714         platform_set_drvdata(pdev, bci);
715
716         ratelimit_state_init(&bci->ratelimit, HZ, 2);
717
718         bci->ac.name = "twl4030_ac";
719         bci->ac.type = POWER_SUPPLY_TYPE_MAINS;
720         bci->ac.properties = twl4030_charger_props;
721         bci->ac.num_properties = ARRAY_SIZE(twl4030_charger_props);
722         bci->ac.get_property = twl4030_bci_get_property;
723         bci->ac.supplied_to = pdata->supplied_to;
724         bci->ac.num_supplicants = pdata->num_supplicants;
725
726         ret = power_supply_register(&pdev->dev, &bci->ac);
727         if (ret) {
728                 dev_err(&pdev->dev, "failed to register ac: %d\n", ret);
729                 goto fail_register_ac;
730         }
731
732         bci->usb.name = "twl4030_usb";
733         bci->usb.type = POWER_SUPPLY_TYPE_USB;
734         bci->usb.properties = twl4030_charger_props;
735         bci->usb.num_properties = ARRAY_SIZE(twl4030_charger_props);
736         bci->usb.get_property = twl4030_bci_get_property;
737         bci->usb.supplied_to = pdata->supplied_to;
738         bci->usb.num_supplicants = pdata->num_supplicants;
739
740         bci->usb_reg = regulator_get(bci->dev, "bci3v1");
741         if (IS_ERR(bci->usb_reg)) {
742                 dev_warn(&pdev->dev, "regulator get bci3v1 failed\n");
743                 bci->usb_reg = NULL;
744         }
745
746         ret = power_supply_register(&pdev->dev, &bci->usb);
747         if (ret) {
748                 dev_err(&pdev->dev, "failed to register usb: %d\n", ret);
749                 goto fail_register_usb;
750         }
751
752         ret = request_threaded_irq(bci->irq_chg, NULL,
753                         twl4030_charger_interrupt, 0, pdev->name, bci);
754         if (ret < 0) {
755                 dev_err(&pdev->dev, "could not request irq %d, status %d\n",
756                         bci->irq_chg, ret);
757                 goto fail_chg_irq;
758         }
759
760         ret = request_threaded_irq(bci->irq_bci, NULL,
761                         twl4030_bci_interrupt, 0, pdev->name, bci);
762         if (ret < 0) {
763                 dev_err(&pdev->dev, "could not request irq %d, status %d\n",
764                         bci->irq_bci, ret);
765                 goto fail_bci_irq;
766         }
767
768         INIT_WORK(&bci->work, twl4030_bci_usb_work);
769
770         bci->transceiver = otg_get_transceiver();
771         if (bci->transceiver != NULL) {
772                 bci->otg_nb.notifier_call = twl4030_bci_usb_ncb;
773                 otg_register_notifier(bci->transceiver, &bci->otg_nb);
774         }
775
776         ret = sysfs_create_group(&bci->ac.dev->kobj, &bci_ac_attr_group);
777         if (ret) {
778                 dev_err(&pdev->dev, "failed to create sysfs group: %d\n", ret);
779                 goto fail_sysfs1;
780         }
781
782         ret = sysfs_create_group(&bci->usb.dev->kobj, &bci_usb_attr_group);
783         if (ret) {
784                 dev_err(&pdev->dev, "failed to create sysfs group: %d\n", ret);
785                 goto fail_sysfs2;
786         }
787
788         /* Enable interrupts now. */
789         reg = ~(u32)(TWL4030_ICHGLOW | TWL4030_ICHGEOC | TWL4030_TBATOR2 |
790                 TWL4030_TBATOR1 | TWL4030_BATSTS);
791         ret = twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, reg,
792                                TWL4030_INTERRUPTS_BCIIMR1A);
793         if (ret < 0) {
794                 dev_err(&pdev->dev, "failed to unmask interrupts: %d\n", ret);
795                 goto fail_unmask_interrupts;
796         }
797
798         reg = ~(u32)(TWL4030_VBATOV | TWL4030_VBUSOV | TWL4030_ACCHGOV);
799         ret = twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, reg,
800                                TWL4030_INTERRUPTS_BCIIMR2A);
801         if (ret < 0)
802                 dev_warn(&pdev->dev, "failed to unmask interrupts: %d\n", ret);
803
804         bci->ac_charge_enable = true;
805         bci->usb_charge_enable = true;
806         twl4030_charger_enable_ac(true);
807         twl4030_charger_enable_usb(bci, true);
808
809         return 0;
810
811 fail_unmask_interrupts:
812         sysfs_remove_group(&bci->usb.dev->kobj, &bci_usb_attr_group);
813 fail_sysfs2:
814         sysfs_remove_group(&bci->ac.dev->kobj, &bci_ac_attr_group);
815 fail_sysfs1:
816         if (bci->transceiver != NULL) {
817                 otg_unregister_notifier(bci->transceiver, &bci->otg_nb);
818                 otg_put_transceiver(bci->transceiver);
819         }
820         free_irq(bci->irq_bci, bci);
821 fail_bci_irq:
822         free_irq(bci->irq_chg, bci);
823 fail_chg_irq:
824         power_supply_unregister(&bci->usb);
825 fail_register_usb:
826         power_supply_unregister(&bci->ac);
827 fail_register_ac:
828         platform_set_drvdata(pdev, NULL);
829         kfree(bci);
830
831         return ret;
832 }
833
834 static int __exit twl4030_bci_remove(struct platform_device *pdev)
835 {
836         struct twl4030_bci *bci = platform_get_drvdata(pdev);
837
838         sysfs_remove_group(&bci->usb.dev->kobj, &bci_usb_attr_group);
839         sysfs_remove_group(&bci->ac.dev->kobj, &bci_ac_attr_group);
840
841         twl4030_charger_enable_ac(false);
842         twl4030_charger_enable_usb(bci, false);
843
844         /* mask interrupts */
845         twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, 0xff,
846                          TWL4030_INTERRUPTS_BCIIMR1A);
847         twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, 0xff,
848                          TWL4030_INTERRUPTS_BCIIMR2A);
849
850         if (bci->transceiver != NULL) {
851                 otg_unregister_notifier(bci->transceiver, &bci->otg_nb);
852                 otg_put_transceiver(bci->transceiver);
853         }
854         free_irq(bci->irq_bci, bci);
855         free_irq(bci->irq_chg, bci);
856         power_supply_unregister(&bci->usb);
857         power_supply_unregister(&bci->ac);
858         platform_set_drvdata(pdev, NULL);
859         kfree(bci);
860
861         return 0;
862 }
863
864 static struct platform_driver twl4030_bci_driver = {
865         .driver = {
866                 .name   = "twl4030_bci",
867                 .owner  = THIS_MODULE,
868         },
869         .remove = __exit_p(twl4030_bci_remove),
870 };
871
872 static int __init twl4030_bci_init(void)
873 {
874         return platform_driver_probe(&twl4030_bci_driver, twl4030_bci_probe);
875 }
876 module_init(twl4030_bci_init);
877
878 static void __exit twl4030_bci_exit(void)
879 {
880         platform_driver_unregister(&twl4030_bci_driver);
881 }
882 module_exit(twl4030_bci_exit);
883
884 MODULE_AUTHOR("Gražvydas Ignotas");
885 MODULE_DESCRIPTION("TWL4030 Battery Charger Interface driver");
886 MODULE_LICENSE("GPL");
887 MODULE_ALIAS("platform:twl4030_bci");