From 8bbe906daa75d355607df9b586a5beb7adf3bf45 Mon Sep 17 00:00:00 2001 From: Luo Wei Date: Mon, 16 Oct 2023 19:33:55 +0800 Subject: [PATCH] mfd: display-serdes: power off remote serdes while shutdown Signed-off-by: Luo Wei Change-Id: Ic358750583e2cb94a79710cabc84bc739bf12b12 --- drivers/mfd/display-serdes/core.h | 3 ++- drivers/mfd/display-serdes/serdes-core.c | 25 +++++++++++++++++++++++- drivers/mfd/display-serdes/serdes-i2c.c | 11 ++++++++++- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/drivers/mfd/display-serdes/core.h b/drivers/mfd/display-serdes/core.h index 28f994588964..e05ff39236c3 100644 --- a/drivers/mfd/display-serdes/core.h +++ b/drivers/mfd/display-serdes/core.h @@ -334,7 +334,8 @@ int serdes_set_pinctrl_default(struct serdes *serdes); int serdes_set_pinctrl_sleep(struct serdes *serdes); int serdes_device_suspend(struct serdes *serdes); int serdes_device_resume(struct serdes *serdes); -void serdes_device_shutdown(struct serdes *serdes); +void serdes_device_poweroff(struct serdes *serdes); +int serdes_device_shutdown(struct serdes *serdes); int serdes_irq_init(struct serdes *serdes); void serdes_irq_exit(struct serdes *serdes); void serdes_auxadc_init(struct serdes *serdes); diff --git a/drivers/mfd/display-serdes/serdes-core.c b/drivers/mfd/display-serdes/serdes-core.c index 5ef62f8e4d75..08805244f928 100644 --- a/drivers/mfd/display-serdes/serdes-core.c +++ b/drivers/mfd/display-serdes/serdes-core.c @@ -376,7 +376,7 @@ int serdes_device_resume(struct serdes *serdes) } EXPORT_SYMBOL_GPL(serdes_device_resume); -void serdes_device_shutdown(struct serdes *serdes) +void serdes_device_poweroff(struct serdes *serdes) { int ret = 0; @@ -385,6 +385,29 @@ void serdes_device_shutdown(struct serdes *serdes) if (ret) dev_err(serdes->dev, "could not set sleep pins\n"); } + + if (!IS_ERR(serdes->vpower)) { + ret = regulator_disable(serdes->vpower); + if (ret) + dev_err(serdes->dev, "fail to disable vpower regulator\n"); + } + +} +EXPORT_SYMBOL_GPL(serdes_device_poweroff); + +int serdes_device_shutdown(struct serdes *serdes) +{ + int ret = 0; + + if (!IS_ERR(serdes->vpower)) { + ret = regulator_disable(serdes->vpower); + if (ret) { + dev_err(serdes->dev, "fail to disable vpower regulator\n"); + return ret; + } + } + + return ret; } EXPORT_SYMBOL_GPL(serdes_device_shutdown); diff --git a/drivers/mfd/display-serdes/serdes-i2c.c b/drivers/mfd/display-serdes/serdes-i2c.c index 237b1e61ded4..c95469bc07bb 100644 --- a/drivers/mfd/display-serdes/serdes-i2c.c +++ b/drivers/mfd/display-serdes/serdes-i2c.c @@ -223,6 +223,14 @@ static int serdes_i2c_probe(struct i2c_client *client, return 0; } +static void serdes_i2c_shutdown(struct i2c_client *client) +{ + struct device *dev = &client->dev; + struct serdes *serdes = dev_get_drvdata(dev); + + serdes_device_shutdown(serdes); +} + static int serdes_i2c_prepare(struct device *dev) { return 0; @@ -264,7 +272,7 @@ static int serdes_i2c_poweroff(struct device *dev) { struct serdes *serdes = dev_get_drvdata(dev); - serdes_device_shutdown(serdes); + serdes_device_poweroff(serdes); return 0; } @@ -315,6 +323,7 @@ static struct i2c_driver serdes_i2c_driver = { .of_match_table = of_match_ptr(serdes_of_match), }, .probe = serdes_i2c_probe, + .shutdown = serdes_i2c_shutdown, }; static int __init serdes_i2c_init(void)