On 21/08/2024 10:26, friday.yang wrote: > In order to avoid handling glitch signal when MTCMOS on/off, SMI need > clamp and reset operation. Parse power reset settings for LARBs which > need to reset. Register genpd callback for SMI LARBs and apply reset > operations in the callback. > > Signed-off-by: friday.yang <friday.yang@xxxxxxxxxxxx> > --- > drivers/memory/mtk-smi.c | 148 ++++++++++++++++++++++++++++++++++++++- > 1 file changed, 146 insertions(+), 2 deletions(-) > ... > + > +static int mtk_smi_larb_parse_reset_info(struct mtk_smi_larb *larb) > +{ > + struct device_node *reset_node; > + struct device *dev = larb->dev; > + int ret; > + > + /* only larb with "resets" need to get reset setting */ > + reset_node = of_parse_phandle(dev->of_node, "resets", 0); Nope, you do not parse rasets. > + if (!reset_node) > + return 0; > + of_node_put(reset_node); > + > + larb->rst_con = devm_reset_control_get(dev, "larb_rst"); Where are the bindings? Why do you add undocumented properties? How possible this passes dtbs_check??? > + if (IS_ERR(larb->rst_con)) > + return dev_err_probe(dev, PTR_ERR(larb->rst_con), > + "cannot get larb reset controller\n"); > + > + larb->nb.notifier_call = mtk_smi_genpd_callback; > + ret = dev_pm_genpd_add_notifier(dev, &larb->nb); > + if (ret) { > + dev_err(dev, "Failed to add genpd callback %d\n", ret); > + return -EINVAL; > + } > + > + return 0; > +} > + > static int mtk_smi_larb_probe(struct platform_device *pdev) > { > struct mtk_smi_larb *larb; > @@ -538,6 +662,7 @@ static int mtk_smi_larb_probe(struct platform_device *pdev) > if (!larb) > return -ENOMEM; > > + larb->dev = dev; > larb->larb_gen = of_device_get_match_data(dev); > larb->base = devm_platform_ioremap_resource(pdev, 0); > if (IS_ERR(larb->base)) > @@ -554,15 +679,29 @@ static int mtk_smi_larb_probe(struct platform_device *pdev) > if (ret < 0) > return ret; > > - pm_runtime_enable(dev); > + /* find sub common to clamp larb for ISP software reset */ > + ret = mtk_smi_larb_parse_clamp_info(larb); > + if (ret) { > + dev_err(dev, "Failed to get clamp setting for larb\n"); > + goto err_pm_disable; > + } > + > + ret = mtk_smi_larb_parse_reset_info(larb); > + if (ret) { > + dev_err(dev, "Failed to get power setting for larb\n"); > + goto err_pm_disable; > + } > + > platform_set_drvdata(pdev, larb); > ret = component_add(dev, &mtk_smi_larb_component_ops); > if (ret) > goto err_pm_disable; > + > + pm_runtime_enable(dev); > + > return 0; > > err_pm_disable: > - pm_runtime_disable(dev); > device_link_remove(dev, larb->smi_common_dev); Label asls pm disable. Where is the pm disable? > return ret; > } > @@ -686,6 +825,10 @@ static const struct mtk_smi_common_plat mtk_smi_common_mt8188_vpp = { > .init = mtk_smi_common_mt8195_init, > }; Best regards, Krzysztof