Commit 55924157 authored by Fabien Parent's avatar Fabien Parent Committed by Matthias Brugger

soc: mediatek: pwrap: add support for sys & tmr clocks

MT8365 requires an extra 2 clocks to be enabled to behave correctly.
Add support these 2 clocks, they are made optional since they seem to
be present only on MT8365.
Signed-off-by: default avatarFabien Parent <fparent@baylibre.com>
Signed-off-by: default avatarFadwa CHIBY <fchiby@baylibre.com>
Reviewed-by: default avatarAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://lore.kernel.org/r/20221031093401.22916-3-fchiby@baylibre.comSigned-off-by: default avatarMatthias Brugger <matthias.bgg@gmail.com>
parent 415c0282
...@@ -1171,6 +1171,8 @@ struct pmic_wrapper { ...@@ -1171,6 +1171,8 @@ struct pmic_wrapper {
const struct pwrap_slv_type *slave; const struct pwrap_slv_type *slave;
struct clk *clk_spi; struct clk *clk_spi;
struct clk *clk_wrap; struct clk *clk_wrap;
struct clk *clk_sys;
struct clk *clk_tmr;
struct reset_control *rstc; struct reset_control *rstc;
struct reset_control *rstc_bridge; struct reset_control *rstc_bridge;
...@@ -2214,6 +2216,20 @@ static int pwrap_probe(struct platform_device *pdev) ...@@ -2214,6 +2216,20 @@ static int pwrap_probe(struct platform_device *pdev)
return PTR_ERR(wrp->clk_wrap); return PTR_ERR(wrp->clk_wrap);
} }
wrp->clk_sys = devm_clk_get_optional(wrp->dev, "sys");
if (IS_ERR(wrp->clk_sys)) {
return dev_err_probe(wrp->dev, PTR_ERR(wrp->clk_sys),
"failed to get clock: %pe\n",
wrp->clk_sys);
}
wrp->clk_tmr = devm_clk_get_optional(wrp->dev, "tmr");
if (IS_ERR(wrp->clk_tmr)) {
return dev_err_probe(wrp->dev, PTR_ERR(wrp->clk_tmr),
"failed to get clock: %pe\n",
wrp->clk_tmr);
}
ret = clk_prepare_enable(wrp->clk_spi); ret = clk_prepare_enable(wrp->clk_spi);
if (ret) if (ret)
return ret; return ret;
...@@ -2222,6 +2238,14 @@ static int pwrap_probe(struct platform_device *pdev) ...@@ -2222,6 +2238,14 @@ static int pwrap_probe(struct platform_device *pdev)
if (ret) if (ret)
goto err_out1; goto err_out1;
ret = clk_prepare_enable(wrp->clk_sys);
if (ret)
goto err_out2;
ret = clk_prepare_enable(wrp->clk_tmr);
if (ret)
goto err_out3;
/* Enable internal dynamic clock */ /* Enable internal dynamic clock */
if (HAS_CAP(wrp->master->caps, PWRAP_CAP_DCM)) { if (HAS_CAP(wrp->master->caps, PWRAP_CAP_DCM)) {
pwrap_writel(wrp, 1, PWRAP_DCM_EN); pwrap_writel(wrp, 1, PWRAP_DCM_EN);
...@@ -2236,7 +2260,7 @@ static int pwrap_probe(struct platform_device *pdev) ...@@ -2236,7 +2260,7 @@ static int pwrap_probe(struct platform_device *pdev)
ret = pwrap_init(wrp); ret = pwrap_init(wrp);
if (ret) { if (ret) {
dev_dbg(wrp->dev, "init failed with %d\n", ret); dev_dbg(wrp->dev, "init failed with %d\n", ret);
goto err_out2; goto err_out4;
} }
} }
...@@ -2250,7 +2274,7 @@ static int pwrap_probe(struct platform_device *pdev) ...@@ -2250,7 +2274,7 @@ static int pwrap_probe(struct platform_device *pdev)
if (!(pwrap_readl(wrp, PWRAP_WACS2_RDATA) & mask_done)) { if (!(pwrap_readl(wrp, PWRAP_WACS2_RDATA) & mask_done)) {
dev_dbg(wrp->dev, "initialization isn't finished\n"); dev_dbg(wrp->dev, "initialization isn't finished\n");
ret = -ENODEV; ret = -ENODEV;
goto err_out2; goto err_out4;
} }
/* Initialize watchdog, may not be done by the bootloader */ /* Initialize watchdog, may not be done by the bootloader */
...@@ -2288,7 +2312,7 @@ static int pwrap_probe(struct platform_device *pdev) ...@@ -2288,7 +2312,7 @@ static int pwrap_probe(struct platform_device *pdev)
IRQF_TRIGGER_HIGH, IRQF_TRIGGER_HIGH,
"mt-pmic-pwrap", wrp); "mt-pmic-pwrap", wrp);
if (ret) if (ret)
goto err_out2; goto err_out4;
wrp->regmap = devm_regmap_init(wrp->dev, NULL, wrp, wrp->slave->regops->regmap); wrp->regmap = devm_regmap_init(wrp->dev, NULL, wrp, wrp->slave->regops->regmap);
if (IS_ERR(wrp->regmap)) { if (IS_ERR(wrp->regmap)) {
...@@ -2300,11 +2324,15 @@ static int pwrap_probe(struct platform_device *pdev) ...@@ -2300,11 +2324,15 @@ static int pwrap_probe(struct platform_device *pdev)
if (ret) { if (ret) {
dev_dbg(wrp->dev, "failed to create child devices at %pOF\n", dev_dbg(wrp->dev, "failed to create child devices at %pOF\n",
np); np);
goto err_out2; goto err_out4;
} }
return 0; return 0;
err_out4:
clk_disable_unprepare(wrp->clk_tmr);
err_out3:
clk_disable_unprepare(wrp->clk_sys);
err_out2: err_out2:
clk_disable_unprepare(wrp->clk_wrap); clk_disable_unprepare(wrp->clk_wrap);
err_out1: err_out1:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment