| From 1eb87e58f3a27b79973b0e1b815a8d84b529fc82 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 1 Jun 2021 11:59:04 +0800 |
| Subject: soc: mtk-pm-domains: do not register smi node as syscon |
| |
| From: Hsin-Yi Wang <hsinyi@chromium.org> |
| |
| [ Upstream commit eed6ff1bb2da65067d928f4ab322c7d75f944fa4 ] |
| |
| Mediatek requires mmsys clocks to be unprepared during suspend, |
| otherwise system has chances to hang. |
| |
| syscon_regmap_lookup_by_phandle_optional() will attach and prepare the |
| first clock in smi node, leading to additional prepare to the clock |
| which is not balanced with the prepare/unprepare pair in resume/suspend |
| callbacks. |
| |
| If a power domain node requests an smi node and the smi node's first |
| clock is an mmsys clock, it will results in an unstable suspend resume. |
| |
| Fixes: f414854c8843 ("soc: mediatek: pm-domains: Add SMI block as bus protection block") |
| Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> |
| Reviewed-by: chun-jie.chen <chun-jie.chen@mediatek.com> |
| Reviewed-by: Enric Balletbo i Serra <enric.balletbo@collabora.com> |
| Link: https://lore.kernel.org/r/20210601035905.2970384-2-hsinyi@chromium.org |
| Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/soc/mediatek/mtk-pm-domains.c | 11 ++++++++--- |
| 1 file changed, 8 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/soc/mediatek/mtk-pm-domains.c b/drivers/soc/mediatek/mtk-pm-domains.c |
| index 0af00efa0ef8..22fa52f0e86e 100644 |
| --- a/drivers/soc/mediatek/mtk-pm-domains.c |
| +++ b/drivers/soc/mediatek/mtk-pm-domains.c |
| @@ -297,6 +297,7 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no |
| const struct scpsys_domain_data *domain_data; |
| struct scpsys_domain *pd; |
| struct device_node *root_node = scpsys->dev->of_node; |
| + struct device_node *smi_node; |
| struct property *prop; |
| const char *clk_name; |
| int i, ret, num_clks; |
| @@ -352,9 +353,13 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no |
| if (IS_ERR(pd->infracfg)) |
| return ERR_CAST(pd->infracfg); |
| |
| - pd->smi = syscon_regmap_lookup_by_phandle_optional(node, "mediatek,smi"); |
| - if (IS_ERR(pd->smi)) |
| - return ERR_CAST(pd->smi); |
| + smi_node = of_parse_phandle(node, "mediatek,smi", 0); |
| + if (smi_node) { |
| + pd->smi = device_node_to_regmap(smi_node); |
| + of_node_put(smi_node); |
| + if (IS_ERR(pd->smi)) |
| + return ERR_CAST(pd->smi); |
| + } |
| |
| num_clks = of_clk_get_parent_count(node); |
| if (num_clks > 0) { |
| -- |
| 2.30.2 |
| |