mfd: twl-core: Add power off implementation for twl603x
authorAndreas Kemnade <andreas@kemnade.info>
Sat, 17 Feb 2024 08:20:04 +0000 (09:20 +0100)
committerLee Jones <lee@kernel.org>
Fri, 23 Feb 2024 16:11:39 +0000 (16:11 +0000)
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>
drivers/mfd/twl-core.c
include/linux/mfd/twl.h

index 6e384a79e3418987a4afc52f79696367d8c7ed5b..c130ffef182f1971b8ae6bce152e879f1b684490 100644 (file)
 #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);
 
index c062d91a67d927a0cb1a38079c5ea65277c4053a..85dc406173dba92b2c5b64f49dbfb0c176b96f1e 100644 (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 */