diff options
-rw-r--r-- | drivers/power/twl4030_charger.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c index f14108844e1a..2598c588006e 100644 --- a/drivers/power/twl4030_charger.c +++ b/drivers/power/twl4030_charger.c | |||
@@ -28,10 +28,13 @@ | |||
28 | #define TWL4030_BCIICHG 0x08 | 28 | #define TWL4030_BCIICHG 0x08 |
29 | #define TWL4030_BCIVAC 0x0a | 29 | #define TWL4030_BCIVAC 0x0a |
30 | #define TWL4030_BCIVBUS 0x0c | 30 | #define TWL4030_BCIVBUS 0x0c |
31 | #define TWL4030_BCIMFSTS3 0x0F | ||
31 | #define TWL4030_BCIMFSTS4 0x10 | 32 | #define TWL4030_BCIMFSTS4 0x10 |
32 | #define TWL4030_BCICTL1 0x23 | 33 | #define TWL4030_BCICTL1 0x23 |
33 | #define TWL4030_BB_CFG 0x12 | 34 | #define TWL4030_BB_CFG 0x12 |
34 | 35 | ||
36 | #define TWL4030_BCIMFSTS1 0x01 | ||
37 | |||
35 | #define TWL4030_BCIAUTOWEN BIT(5) | 38 | #define TWL4030_BCIAUTOWEN BIT(5) |
36 | #define TWL4030_CONFIG_DONE BIT(4) | 39 | #define TWL4030_CONFIG_DONE BIT(4) |
37 | #define TWL4030_BCIAUTOUSB BIT(1) | 40 | #define TWL4030_BCIAUTOUSB BIT(1) |
@@ -52,6 +55,9 @@ | |||
52 | #define TWL4030_BBISEL_500uA 0x02 | 55 | #define TWL4030_BBISEL_500uA 0x02 |
53 | #define TWL4030_BBISEL_1000uA 0x03 | 56 | #define TWL4030_BBISEL_1000uA 0x03 |
54 | 57 | ||
58 | #define TWL4030_BATSTSPCHG BIT(2) | ||
59 | #define TWL4030_BATSTSMCHG BIT(6) | ||
60 | |||
55 | /* BCI interrupts */ | 61 | /* BCI interrupts */ |
56 | #define TWL4030_WOVF BIT(0) /* Watchdog overflow */ | 62 | #define TWL4030_WOVF BIT(0) /* Watchdog overflow */ |
57 | #define TWL4030_TMOVF BIT(1) /* Timer overflow */ | 63 | #define TWL4030_TMOVF BIT(1) /* Timer overflow */ |
@@ -145,6 +151,35 @@ static int twl4030bci_read_adc_val(u8 reg) | |||
145 | } | 151 | } |
146 | 152 | ||
147 | /* | 153 | /* |
154 | * Check if Battery Pack was present | ||
155 | */ | ||
156 | static int twl4030_is_battery_present(struct twl4030_bci *bci) | ||
157 | { | ||
158 | int ret; | ||
159 | u8 val = 0; | ||
160 | |||
161 | /* Battery presence in Main charge? */ | ||
162 | ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE, &val, TWL4030_BCIMFSTS3); | ||
163 | if (ret) | ||
164 | return ret; | ||
165 | if (val & TWL4030_BATSTSMCHG) | ||
166 | return 0; | ||
167 | |||
168 | /* | ||
169 | * OK, It could be that bootloader did not enable main charger, | ||
170 | * pre-charge is h/w auto. So, Battery presence in Pre-charge? | ||
171 | */ | ||
172 | ret = twl_i2c_read_u8(TWL4030_MODULE_PRECHARGE, &val, | ||
173 | TWL4030_BCIMFSTS1); | ||
174 | if (ret) | ||
175 | return ret; | ||
176 | if (val & TWL4030_BATSTSPCHG) | ||
177 | return 0; | ||
178 | |||
179 | return -ENODEV; | ||
180 | } | ||
181 | |||
182 | /* | ||
148 | * Check if VBUS power is present | 183 | * Check if VBUS power is present |
149 | */ | 184 | */ |
150 | static int twl4030_bci_have_vbus(struct twl4030_bci *bci) | 185 | static int twl4030_bci_have_vbus(struct twl4030_bci *bci) |
@@ -541,8 +576,14 @@ static int __init twl4030_bci_probe(struct platform_device *pdev) | |||
541 | bci->irq_chg = platform_get_irq(pdev, 0); | 576 | bci->irq_chg = platform_get_irq(pdev, 0); |
542 | bci->irq_bci = platform_get_irq(pdev, 1); | 577 | bci->irq_bci = platform_get_irq(pdev, 1); |
543 | 578 | ||
544 | platform_set_drvdata(pdev, bci); | 579 | /* Only proceed further *IF* battery is physically present */ |
580 | ret = twl4030_is_battery_present(bci); | ||
581 | if (ret) { | ||
582 | dev_crit(&pdev->dev, "Battery was not detected:%d\n", ret); | ||
583 | goto fail_no_battery; | ||
584 | } | ||
545 | 585 | ||
586 | platform_set_drvdata(pdev, bci); | ||
546 | bci->ac.name = "twl4030_ac"; | 587 | bci->ac.name = "twl4030_ac"; |
547 | bci->ac.type = POWER_SUPPLY_TYPE_MAINS; | 588 | bci->ac.type = POWER_SUPPLY_TYPE_MAINS; |
548 | bci->ac.properties = twl4030_charger_props; | 589 | bci->ac.properties = twl4030_charger_props; |
@@ -633,6 +674,7 @@ fail_chg_irq: | |||
633 | fail_register_usb: | 674 | fail_register_usb: |
634 | power_supply_unregister(&bci->ac); | 675 | power_supply_unregister(&bci->ac); |
635 | fail_register_ac: | 676 | fail_register_ac: |
677 | fail_no_battery: | ||
636 | kfree(bci); | 678 | kfree(bci); |
637 | 679 | ||
638 | return ret; | 680 | return ret; |