mfd: twl-core: Add power off implementation for twl603x

If the system-power-controller property is there, enable power off.
Implementation is based on a Linux v3.0 vendor kernel.

Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
Link: https://lore.kernel.org/r/20240217082007.3238948-3-andreas@kemnade.info
Signed-off-by: Lee Jones <lee@kernel.org>
This commit is contained in:
Andreas Kemnade 2024-02-17 09:20:04 +01:00 committed by Lee Jones
parent 0c7cc7497f
commit ca9414a1d0
2 changed files with 29 additions and 0 deletions

View File

@ -124,6 +124,11 @@
#define TWL6030_BASEADD_RSV 0x0000
#define TWL6030_BASEADD_ZERO 0x0000
/* Some fields in TWL6030_PHOENIX_DEV_ON */
#define TWL6030_APP_DEVOFF BIT(0)
#define TWL6030_CON_DEVOFF BIT(1)
#define TWL6030_MOD_DEVOFF BIT(2)
/* Few power values */
#define R_CFG_BOOT 0x05
@ -687,6 +692,20 @@ static void twl_remove(struct i2c_client *client)
twl_priv->ready = false;
}
static void twl6030_power_off(void)
{
int err;
u8 val;
err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &val, TWL6030_PHOENIX_DEV_ON);
if (err)
return;
val |= TWL6030_APP_DEVOFF | TWL6030_CON_DEVOFF | TWL6030_MOD_DEVOFF;
twl_i2c_write_u8(TWL_MODULE_PM_MASTER, val, TWL6030_PHOENIX_DEV_ON);
}
static struct of_dev_auxdata twl_auxdata_lookup[] = {
OF_DEV_AUXDATA("ti,twl4030-gpio", 0, "twl4030-gpio", NULL),
{ /* sentinel */ },
@ -852,6 +871,15 @@ twl_probe(struct i2c_client *client)
goto free;
}
if (twl_class_is_6030()) {
if (of_device_is_system_power_controller(node)) {
if (!pm_power_off)
pm_power_off = twl6030_power_off;
else
dev_warn(&client->dev, "Poweroff callback already assigned\n");
}
}
status = of_platform_populate(node, NULL, twl_auxdata_lookup,
&client->dev);

View File

@ -461,6 +461,7 @@ static inline int twl6030_mmc_card_detect(struct device *dev, int slot)
#define TWL4030_PM_MASTER_GLOBAL_TST 0xb6
#define TWL6030_PHOENIX_DEV_ON 0x06
/*----------------------------------------------------------------------*/
/* Power bus message definitions */