From f109558947f46d65a0d63fd05f91c0d8c71efd46 Mon Sep 17 00:00:00 2001 From: XiaoDong Huang Date: Mon, 18 Dec 2023 09:57:23 +0800 Subject: [PATCH] soc: rockchip: pm_config: support sleep_io_config Signed-off-by: XiaoDong Huang Change-Id: Idbb08bb3f7c1deff8e53348dbee1a13785568b75 --- drivers/soc/rockchip/rockchip_pm_config.c | 33 +++++++++++++++++++++ include/linux/rockchip/rockchip_pm_config.h | 2 ++ 2 files changed, 35 insertions(+) diff --git a/drivers/soc/rockchip/rockchip_pm_config.c b/drivers/soc/rockchip/rockchip_pm_config.c index 3e9d6cab17c5..351075704973 100644 --- a/drivers/soc/rockchip/rockchip_pm_config.c +++ b/drivers/soc/rockchip/rockchip_pm_config.c @@ -374,6 +374,38 @@ out: return ret; } +static int parse_io_config(struct device *dev) +{ + int ret = 0, cnt; + struct device_node *node = dev->of_node; + struct rk_sleep_config *config = &sleep_config[RK_PM_MEM]; + + cnt = of_property_count_u32_elems(node, "rockchip,sleep-io-config"); + if (cnt > 0) { + /* 0 as the last element of virtual_pwroff_irqs */ + config->sleep_io_config = + devm_kmalloc_array(dev, cnt, sizeof(u32), GFP_KERNEL); + if (!config->sleep_io_config) { + ret = -ENOMEM; + goto out; + } + + ret = of_property_read_u32_array(node, "rockchip,sleep-io-config", + config->sleep_io_config, cnt); + if (ret) { + dev_err(dev, "get rockchip,sleep-io-config error\n"); + goto out; + } + + config->sleep_io_config_cnt = cnt; + } else { + dev_dbg(dev, "not set sleep-pin-config\n"); + } + +out: + return ret; +} + static int pm_config_probe(struct platform_device *pdev) { const struct of_device_id *match_id; @@ -488,6 +520,7 @@ static int pm_config_probe(struct platform_device *pdev) ret); } + parse_io_config(&pdev->dev); parse_mcu_sleep_config(node); #ifndef MODULE diff --git a/include/linux/rockchip/rockchip_pm_config.h b/include/linux/rockchip/rockchip_pm_config.h index f77e5c66928e..2c95b04b092d 100644 --- a/include/linux/rockchip/rockchip_pm_config.h +++ b/include/linux/rockchip/rockchip_pm_config.h @@ -13,6 +13,8 @@ struct rk_sleep_config { u32 pwm_regulator_config; u32 *power_ctrl_config; u32 power_ctrl_config_cnt; + u32 *sleep_io_config; + u32 sleep_io_config_cnt; u32 apios_suspend; u32 io_ret_config; u32 sleep_pin_config[2];