Commit 5c188d74 authored by Tony Lindgren's avatar Tony Lindgren Committed by Lee Jones

mfd: twl4030-power: Fix pmic for boards that need AC charger disabled

I noticed the PMIC configuration on 37xx-evm won't actually shut down
the voltages during off-idle. Turns out 37xx-evm needs the AC charger
state transitions disabled like we are doing for SDP and LDP in the
legacy booting case.

Let's fix this for device tree based booting by setting up the quirk
flag based on the compatible flag. And let's also use the existing
define for STARTON_CHG.

Note that SDP and EVM do not have the PMIC clken wired to gate the
the oscillator while LDP has.
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 53960e2b
...@@ -264,7 +264,9 @@ static int twl4030_config_wakeup3_sequence(u8 address) ...@@ -264,7 +264,9 @@ static int twl4030_config_wakeup3_sequence(u8 address)
return err; return err;
} }
static int twl4030_config_wakeup12_sequence(u8 address) static int
twl4030_config_wakeup12_sequence(const struct twl4030_power_data *pdata,
u8 address)
{ {
int err = 0; int err = 0;
u8 data; u8 data;
...@@ -293,13 +295,14 @@ static int twl4030_config_wakeup12_sequence(u8 address) ...@@ -293,13 +295,14 @@ static int twl4030_config_wakeup12_sequence(u8 address)
if (err) if (err)
goto out; goto out;
if (machine_is_omap_3430sdp() || machine_is_omap_ldp()) { if (pdata->ac_charger_quirk || machine_is_omap_3430sdp() ||
machine_is_omap_ldp()) {
/* Disabling AC charger effect on sleep-active transitions */ /* Disabling AC charger effect on sleep-active transitions */
err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &data, err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &data,
R_CFG_P1_TRANSITION); R_CFG_P1_TRANSITION);
if (err) if (err)
goto out; goto out;
data &= ~(1<<1); data &= ~STARTON_CHG;
err = twl_i2c_write_u8(TWL_MODULE_PM_MASTER, data, err = twl_i2c_write_u8(TWL_MODULE_PM_MASTER, data,
R_CFG_P1_TRANSITION); R_CFG_P1_TRANSITION);
if (err) if (err)
...@@ -459,8 +462,9 @@ static int twl4030_configure_resource(struct twl4030_resconfig *rconfig) ...@@ -459,8 +462,9 @@ static int twl4030_configure_resource(struct twl4030_resconfig *rconfig)
return 0; return 0;
} }
static int load_twl4030_script(struct twl4030_script *tscript, static int load_twl4030_script(const struct twl4030_power_data *pdata,
u8 address) struct twl4030_script *tscript,
u8 address)
{ {
int err; int err;
static int order; static int order;
...@@ -487,7 +491,7 @@ static int load_twl4030_script(struct twl4030_script *tscript, ...@@ -487,7 +491,7 @@ static int load_twl4030_script(struct twl4030_script *tscript,
if (err) if (err)
goto out; goto out;
err = twl4030_config_wakeup12_sequence(address); err = twl4030_config_wakeup12_sequence(pdata, address);
if (err) if (err)
goto out; goto out;
order = 1; order = 1;
...@@ -567,7 +571,7 @@ twl4030_power_configure_scripts(const struct twl4030_power_data *pdata) ...@@ -567,7 +571,7 @@ twl4030_power_configure_scripts(const struct twl4030_power_data *pdata)
u8 address = twl4030_start_script_address; u8 address = twl4030_start_script_address;
for (i = 0; i < pdata->num; i++) { for (i = 0; i < pdata->num; i++) {
err = load_twl4030_script(pdata->scripts[i], address); err = load_twl4030_script(pdata, pdata->scripts[i], address);
if (err) if (err)
return err; return err;
address += pdata->scripts[i]->size; address += pdata->scripts[i]->size;
...@@ -829,6 +833,21 @@ static struct twl4030_power_data osc_off_idle = { ...@@ -829,6 +833,21 @@ static struct twl4030_power_data osc_off_idle = {
.board_config = osc_off_rconfig, .board_config = osc_off_rconfig,
}; };
static struct twl4030_power_data omap3_idle_ac_quirk = {
.scripts = omap3_idle_scripts,
.num = ARRAY_SIZE(omap3_idle_scripts),
.resource_config = omap3_idle_rconfig,
.ac_charger_quirk = true,
};
static struct twl4030_power_data omap3_idle_ac_quirk_osc_off = {
.scripts = omap3_idle_scripts,
.num = ARRAY_SIZE(omap3_idle_scripts),
.resource_config = omap3_idle_rconfig,
.board_config = osc_off_rconfig,
.ac_charger_quirk = true,
};
static const struct of_device_id twl4030_power_of_match[] = { static const struct of_device_id twl4030_power_of_match[] = {
{ {
.compatible = "ti,twl4030-power", .compatible = "ti,twl4030-power",
...@@ -845,6 +864,18 @@ static const struct of_device_id twl4030_power_of_match[] = { ...@@ -845,6 +864,18 @@ static const struct of_device_id twl4030_power_of_match[] = {
.compatible = "ti,twl4030-power-idle-osc-off", .compatible = "ti,twl4030-power-idle-osc-off",
.data = &osc_off_idle, .data = &osc_off_idle,
}, },
{
.compatible = "ti,twl4030-power-omap3-sdp",
.data = &omap3_idle_ac_quirk,
},
{
.compatible = "ti,twl4030-power-omap3-ldp",
.data = &omap3_idle_ac_quirk_osc_off,
},
{
.compatible = "ti,twl4030-power-omap3-evm",
.data = &omap3_idle_ac_quirk,
},
{ }, { },
}; };
MODULE_DEVICE_TABLE(of, twl4030_power_of_match); MODULE_DEVICE_TABLE(of, twl4030_power_of_match);
......
...@@ -675,6 +675,7 @@ struct twl4030_power_data { ...@@ -675,6 +675,7 @@ struct twl4030_power_data {
struct twl4030_resconfig *board_config; struct twl4030_resconfig *board_config;
#define TWL4030_RESCONFIG_UNDEF ((u8)-1) #define TWL4030_RESCONFIG_UNDEF ((u8)-1)
bool use_poweroff; /* Board is wired for TWL poweroff */ bool use_poweroff; /* Board is wired for TWL poweroff */
bool ac_charger_quirk; /* Disable AC charger on board */
}; };
extern int twl4030_remove_script(u8 flags); extern int twl4030_remove_script(u8 flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment