/* * Enable/Disable USB Charge funtionality. */ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) { int ret; if (enable) { /* Check for USB charger conneted */ if (!twl4030_bci_have_vbus(bci)) return -ENODEV; /* * Until we can find out what current the device can provide, * require a module param to enable USB charging. */ if (!allow_usb) { dev_warn(bci->dev, "USB charging is disabled.\n"); return -EACCES; } /* forcing the field BCIAUTOUSB (BOOT_BCI[1]) to 1 */ ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOUSB); if (ret < 0) return ret; /* forcing USBFASTMCHG(BCIMFSTS4[2]) to 1 */ ret = twl4030_clear_set(TWL4030_MODULE_MAIN_CHARGE, 0, TWL4030_USBFASTMCHG, TWL4030_BCIMFSTS4); } else { ret = twl4030_clear_set_boot_bci(TWL4030_BCIAUTOUSB, 0); } 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(TWL_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(TWL_MODULE_PM_RECEIVER, TWL4030_BBSEL_MASK | TWL4030_BBISEL_MASK, flags, TWL4030_BB_CFG); return ret; }
static int twl4030_clear_set_boot_bci(u8 clear, u8 set) { return twl4030_clear_set(TWL4030_MODULE_PM_MASTER, 0, TWL4030_CONFIG_DONE | TWL4030_BCIAUTOWEN | set, TWL4030_PM_MASTER_BOOT_BCI); }