Message ID | 20210531043502.2702645-2-hsinyi@chromium.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/3] soc: mtk-pm-domains: Fix the clock prepared issue | expand |
On Mon, 2021-05-31 at 12:35 +0800, Hsin-Yi Wang wrote: > 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 unstabke suspend > resume. > > Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> Reviewed-by: chun-jie.chen <chun-jie.chen@mediatek.com> > --- > drivers/soc/mediatek/mtk-pm-domains.c | 12 ++++++++---- > 1 file changed, 8 insertions(+), 4 deletions(-) > > diff --git a/drivers/soc/mediatek/mtk-pm-domains.c > b/drivers/soc/mediatek/mtk-pm-domains.c > index 536d8c64b2b4..a9ba71eee4bb 100644 > --- a/drivers/soc/mediatek/mtk-pm-domains.c > +++ b/drivers/soc/mediatek/mtk-pm-domains.c > @@ -296,7 +296,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 *root_node = scpsys->dev->of_node, > *smi_node; > struct property *prop; > const char *clk_name; > int i, ret, num_clks; > @@ -352,9 +352,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) {
Hi Hsin-Yi, (again without html, sorry for the noise) Thank you for the patch. Missatge de Hsin-Yi Wang <hsinyi@chromium.org> del dia dl., 31 de maig 2021 a les 6:35: > > 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 unstabke suspend resume. Typo s/unstabke/unstable/ I think it would be nice to have a Fixes tag for that patch. So can be picked for the stable kernel more easily. > > Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> I have a nit below but the patch looks good to me. So Reviewed-by: Enric Balletbo i Serra <enric.balletbo@collabora.com> > --- > drivers/soc/mediatek/mtk-pm-domains.c | 12 ++++++++---- > 1 file changed, 8 insertions(+), 4 deletions(-) > > diff --git a/drivers/soc/mediatek/mtk-pm-domains.c b/drivers/soc/mediatek/mtk-pm-domains.c > index 536d8c64b2b4..a9ba71eee4bb 100644 > --- a/drivers/soc/mediatek/mtk-pm-domains.c > +++ b/drivers/soc/mediatek/mtk-pm-domains.c > @@ -296,7 +296,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 *root_node = scpsys->dev->of_node, *smi_node; nit: Personal preference, but I'd prefer to add the smi_node in a new line, so it's really clear that the only thing you are doing here is adding a new variable. > struct property *prop; > const char *clk_name; > int i, ret, num_clks; > @@ -352,9 +352,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.32.0.rc0.204.g9fa02ecfa5-goog > > > _______________________________________________ > Linux-mediatek mailing list > Linux-mediatek@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-mediatek
diff --git a/drivers/soc/mediatek/mtk-pm-domains.c b/drivers/soc/mediatek/mtk-pm-domains.c index 536d8c64b2b4..a9ba71eee4bb 100644 --- a/drivers/soc/mediatek/mtk-pm-domains.c +++ b/drivers/soc/mediatek/mtk-pm-domains.c @@ -296,7 +296,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 *root_node = scpsys->dev->of_node, *smi_node; struct property *prop; const char *clk_name; int i, ret, num_clks; @@ -352,9 +352,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) {
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 unstabke suspend resume. Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> --- drivers/soc/mediatek/mtk-pm-domains.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)