提交 b0163222 编写于 作者: N Nicolas Guion 提交者: Lee Jones

ab8500-charger: Add support for autopower on AB8505 and AB9540

Accessing autopower register fails on the AB8505 and ab9540 as
the fallback software control register has moved.
Signed-off-by: NMarcus Cooper <marcus.xm.cooper@stericsson.com>
Signed-off-by: NLee Jones <lee.jones@linaro.org>
Reviewed-by: NMattias WALLIN <mattias.wallin@stericsson.com>
Reviewed-by: NNicolas GUION <nicolas.guion@stericsson.com>
Reviewed-by: NJonas ABERG <jonas.aberg@stericsson.com>
Tested-by: NJonas ABERG <jonas.aberg@stericsson.com>
上级 c9ade0fc
...@@ -95,6 +95,8 @@ ...@@ -95,6 +95,8 @@
#define CHG_WD_INTERVAL (60 * HZ) #define CHG_WD_INTERVAL (60 * HZ)
#define AB8500_SW_CONTROL_FALLBACK 0x03
/* UsbLineStatus register - usb types */ /* UsbLineStatus register - usb types */
enum ab8500_charger_link_status { enum ab8500_charger_link_status {
USB_STAT_NOT_CONFIGURED, USB_STAT_NOT_CONFIGURED,
...@@ -312,42 +314,58 @@ static enum power_supply_property ab8500_charger_usb_props[] = { ...@@ -312,42 +314,58 @@ static enum power_supply_property ab8500_charger_usb_props[] = {
static void ab8500_enable_disable_sw_fallback(struct ab8500_charger *di, static void ab8500_enable_disable_sw_fallback(struct ab8500_charger *di,
bool fallback) bool fallback)
{ {
u8 val;
u8 reg; u8 reg;
u8 bank;
u8 bit;
int ret; int ret;
dev_dbg(di->dev, "SW Fallback: %d\n", fallback); dev_dbg(di->dev, "SW Fallback: %d\n", fallback);
if (is_ab8500(di->parent)) {
bank = 0x15;
reg = 0x0;
bit = 3;
} else {
bank = AB8500_SYS_CTRL1_BLOCK;
reg = AB8500_SW_CONTROL_FALLBACK;
bit = 0;
}
/* read the register containing fallback bit */ /* read the register containing fallback bit */
ret = abx500_get_register_interruptible(di->dev, 0x15, 0x00, &reg); ret = abx500_get_register_interruptible(di->dev, bank, reg, &val);
if (ret) { if (ret < 0) {
dev_err(di->dev, "%d write failed\n", __LINE__); dev_err(di->dev, "%d read failed\n", __LINE__);
return; return;
} }
/* enable the OPT emulation registers */ if (is_ab8500(di->parent)) {
ret = abx500_set_register_interruptible(di->dev, 0x11, 0x00, 0x2); /* enable the OPT emulation registers */
if (ret) { ret = abx500_set_register_interruptible(di->dev, 0x11, 0x00, 0x2);
dev_err(di->dev, "%d write failed\n", __LINE__); if (ret) {
return; dev_err(di->dev, "%d write failed\n", __LINE__);
goto disable_otp;
}
} }
if (fallback) if (fallback)
reg |= 0x8; val |= (1 << bit);
else else
reg &= ~0x8; val &= ~(1 << bit);
/* write back the changed fallback bit value to register */ /* write back the changed fallback bit value to register */
ret = abx500_set_register_interruptible(di->dev, 0x15, 0x00, reg); ret = abx500_set_register_interruptible(di->dev, bank, reg, val);
if (ret) { if (ret) {
dev_err(di->dev, "%d write failed\n", __LINE__); dev_err(di->dev, "%d write failed\n", __LINE__);
return;
} }
/* disable the set OTP registers again */ disable_otp:
ret = abx500_set_register_interruptible(di->dev, 0x11, 0x00, 0x0); if (is_ab8500(di->parent)) {
if (ret) { /* disable the set OTP registers again */
dev_err(di->dev, "%d write failed\n", __LINE__); ret = abx500_set_register_interruptible(di->dev, 0x11, 0x00, 0x0);
return; if (ret) {
dev_err(di->dev, "%d write failed\n", __LINE__);
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册