From 8b9bedf44ed5600c8127da231d69e9efc9d245fd Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Tue, 6 Nov 2018 16:47:57 +0800 Subject: [PATCH] soc: rockchip: power-domain: support qos node status get check if qos node is available for use. Change-Id: Ife40ee58664cd53a9705cda934b92d886ca35522 Signed-off-by: Elaine Zhang --- drivers/soc/rockchip/pm_domains.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c index 9fc727cb8522..0d24a6f31ade 100644 --- a/drivers/soc/rockchip/pm_domains.c +++ b/drivers/soc/rockchip/pm_domains.c @@ -511,6 +511,7 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, const struct rockchip_domain_info *pd_info; struct rockchip_pm_domain *pd; struct device_node *qos_node; + int num_qos = 0, num_qos_reg = 0; int i, j; u32 id; int error; @@ -572,8 +573,14 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, if (error) goto err_put_clocks; - pd->num_qos = of_count_phandle_with_args(node, "pm_qos", - NULL); + num_qos = of_count_phandle_with_args(node, "pm_qos", NULL); + + for (j = 0; j < num_qos; j++) { + qos_node = of_parse_phandle(node, "pm_qos", j); + if (qos_node && of_device_is_available(qos_node)) + pd->num_qos++; + of_node_put(qos_node); + } if (pd->num_qos > 0) { pd->qos_regmap = devm_kcalloc(pmu->dev, pd->num_qos, @@ -595,19 +602,25 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, } } - for (j = 0; j < pd->num_qos; j++) { + for (j = 0; j < num_qos; j++) { qos_node = of_parse_phandle(node, "pm_qos", j); if (!qos_node) { error = -ENODEV; goto err_unprepare_clocks; } - pd->qos_regmap[j] = syscon_node_to_regmap(qos_node); - if (IS_ERR(pd->qos_regmap[j])) { - error = -ENODEV; - of_node_put(qos_node); - goto err_unprepare_clocks; + if (of_device_is_available(qos_node)) { + pd->qos_regmap[num_qos_reg] = + syscon_node_to_regmap(qos_node); + if (IS_ERR(pd->qos_regmap[num_qos_reg])) { + error = -ENODEV; + of_node_put(qos_node); + goto err_unprepare_clocks; + } + num_qos_reg++; } of_node_put(qos_node); + if (num_qos_reg > pd->num_qos) + goto err_unprepare_clocks; } }