]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
twl4030_charger: Add backup-battery charging
authorNeilBrown <neilb@suse.de>
Tue, 8 May 2012 21:40:40 +0000 (07:40 +1000)
committerAnton Vorontsov <cbouatmailru@gmail.com>
Wed, 20 Jun 2012 02:12:53 +0000 (19:12 -0700)
This allows a voltage and current (bb_uvolts and bb_uamps) to be
specified in the platform_data, and charging of the backup battery will
be enabled with those specification.

As it is not possible to monitor the backup battery at all there is no
new device created to represent it.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
drivers/power/twl4030_charger.c
include/linux/i2c/twl.h

index 3e6e991011067ae968838f7e0b6490a7f80bfa68..0511610b235f6e976512e441d09bac19629fc086 100644 (file)
@@ -28,6 +28,7 @@
 #define TWL4030_BCIVBUS                0x0c
 #define TWL4030_BCIMFSTS4      0x10
 #define TWL4030_BCICTL1                0x23
+#define TWL4030_BB_CFG         0x12
 
 #define TWL4030_BCIAUTOWEN     BIT(5)
 #define TWL4030_CONFIG_DONE    BIT(4)
 #define TWL4030_USBFASTMCHG    BIT(2)
 #define TWL4030_STS_VBUS       BIT(7)
 #define TWL4030_STS_USB_ID     BIT(2)
+#define TWL4030_BBCHEN         BIT(4)
+#define TWL4030_BBSEL_MASK     0b1100
+#define TWL4030_BBSEL_2V5      0b0000
+#define TWL4030_BBSEL_3V0      0b0100
+#define TWL4030_BBSEL_3V1      0b1000
+#define TWL4030_BBSEL_3V2      0b1100
+#define TWL4030_BBISEL_MASK    0b11
+#define TWL4030_BBISEL_25uA    0b00
+#define TWL4030_BBISEL_150uA   0b01
+#define TWL4030_BBISEL_500uA   0b10
+#define TWL4030_BBISEL_1000uA  0b11
 
 /* BCI interrupts */
 #define TWL4030_WOVF           BIT(0) /* Watchdog overflow */
@@ -201,6 +213,49 @@ static int twl4030_charger_enable_ac(bool enable)
        return ret;
 }
 
+/*
+ * Enable/Disable charging of Backup Battery.
+ */
+static int twl4030_charger_enable_backup(int uvolt, int uamp)
+{
+       int ret;
+       u8 flags;
+
+       if (uvolt < 2500000 ||
+           uamp < 25) {
+               /* disable charging of backup battery */
+               ret = twl4030_clear_set(TWL4030_MODULE_PM_RECEIVER,
+                                       TWL4030_BBCHEN, 0, TWL4030_BB_CFG);
+               return ret;
+       }
+
+       flags = TWL4030_BBCHEN;
+       if (uvolt >= 3200000)
+               flags |= TWL4030_BBSEL_3V2;
+       else if (uvolt >= 3100000)
+               flags |= TWL4030_BBSEL_3V1;
+       else if (uvolt >= 3000000)
+               flags |= TWL4030_BBSEL_3V0;
+       else
+               flags |= TWL4030_BBSEL_2V5;
+
+       if (uamp >= 1000)
+               flags |= TWL4030_BBISEL_1000uA;
+       else if (uamp >= 500)
+               flags |= TWL4030_BBISEL_500uA;
+       else if (uamp >= 150)
+               flags |= TWL4030_BBISEL_150uA;
+       else
+               flags |= TWL4030_BBISEL_25uA;
+
+       ret = twl4030_clear_set(TWL4030_MODULE_PM_RECEIVER,
+                               TWL4030_BBSEL_MASK | TWL4030_BBISEL_MASK,
+                               flags,
+                               TWL4030_BB_CFG);
+
+       return ret;
+}
+
 /*
  * TWL4030 CHG_PRES (AC charger presence) events
  */
@@ -424,6 +479,7 @@ static enum power_supply_property twl4030_charger_props[] = {
 static int __init twl4030_bci_probe(struct platform_device *pdev)
 {
        struct twl4030_bci *bci;
+       struct twl4030_bci_platform_data *pdata = pdev->dev.platform_data;
        int ret;
        u32 reg;
 
@@ -503,6 +559,8 @@ static int __init twl4030_bci_probe(struct platform_device *pdev)
 
        twl4030_charger_enable_ac(true);
        twl4030_charger_enable_usb(bci, true);
+       twl4030_charger_enable_backup(pdata->bb_uvolt,
+                                     pdata->bb_uamp);
 
        return 0;
 
@@ -531,6 +589,7 @@ static int __exit twl4030_bci_remove(struct platform_device *pdev)
 
        twl4030_charger_enable_ac(false);
        twl4030_charger_enable_usb(bci, false);
+       twl4030_charger_enable_backup(0, 0);
 
        /* mask interrupts */
        twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, 0xff,
index 3993477103a5673e65f69a751ba302d5c03b0a0e..8eec4403b17012fbb85a15c7de95ec7374ef3d01 100644 (file)
@@ -555,6 +555,8 @@ struct twl4030_clock_init_data {
 struct twl4030_bci_platform_data {
        int *battery_tmp_tbl;
        unsigned int tblsize;
+       int     bb_uvolt;       /* voltage to charge backup battery */
+       int     bb_uamp;        /* current for backup battery charging */
 };
 
 /* TWL4030_GPIO_MAX (18) GPIOs, with interrupts */