mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 20:46:48 +02:00
soc: mediatek: pwrap: Use devm_clk_bulk_get_all_enable()
Use devm_clk_bulk_get_all_enable() to simplify the code and to make sure that clk_disable_unprepare() is called if the driver is unloaded. Fixes:55924157da("soc: mediatek: pwrap: add support for sys & tmr clocks") Fixes:1f022d84bd("soc: mediatek: Add PMIC wrapper for MT8135 and MT8173 SoCs") Suggested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr> Link: https://lore.kernel.org/r/5b1114c538dd5230728592855f89942aec8ef83b.1720331018.git.christophe.jaillet@wanadoo.fr Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
This commit is contained in:
parent
10c1ea1eaf
commit
1c28c9452d
|
|
@ -1366,10 +1366,6 @@ struct pmic_wrapper {
|
|||
struct regmap *regmap;
|
||||
const struct pmic_wrapper_type *master;
|
||||
const struct pwrap_slv_type *slave;
|
||||
struct clk *clk_spi;
|
||||
struct clk *clk_wrap;
|
||||
struct clk *clk_sys;
|
||||
struct clk *clk_tmr;
|
||||
struct reset_control *rstc;
|
||||
|
||||
struct reset_control *rstc_bridge;
|
||||
|
|
@ -2472,6 +2468,7 @@ static int pwrap_probe(struct platform_device *pdev)
|
|||
int ret, irq;
|
||||
u32 mask_done;
|
||||
struct pmic_wrapper *wrp;
|
||||
struct clk_bulk_data *clk;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const struct of_device_id *of_slave_id = NULL;
|
||||
|
||||
|
|
@ -2521,49 +2518,10 @@ static int pwrap_probe(struct platform_device *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
wrp->clk_spi = devm_clk_get(wrp->dev, "spi");
|
||||
if (IS_ERR(wrp->clk_spi)) {
|
||||
dev_dbg(wrp->dev, "failed to get clock: %ld\n",
|
||||
PTR_ERR(wrp->clk_spi));
|
||||
return PTR_ERR(wrp->clk_spi);
|
||||
}
|
||||
|
||||
wrp->clk_wrap = devm_clk_get(wrp->dev, "wrap");
|
||||
if (IS_ERR(wrp->clk_wrap)) {
|
||||
dev_dbg(wrp->dev, "failed to get clock: %ld\n",
|
||||
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 = devm_clk_bulk_get_all_enable(wrp->dev, &clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = clk_prepare_enable(wrp->clk_wrap);
|
||||
if (ret)
|
||||
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;
|
||||
return dev_err_probe(wrp->dev, ret,
|
||||
"failed to get clocks\n");
|
||||
|
||||
/* Enable internal dynamic clock */
|
||||
if (HAS_CAP(wrp->master->caps, PWRAP_CAP_DCM)) {
|
||||
|
|
@ -2579,7 +2537,7 @@ static int pwrap_probe(struct platform_device *pdev)
|
|||
ret = pwrap_init(wrp);
|
||||
if (ret) {
|
||||
dev_dbg(wrp->dev, "init failed with %d\n", ret);
|
||||
goto err_out4;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2592,8 +2550,7 @@ static int pwrap_probe(struct platform_device *pdev)
|
|||
|
||||
if (!(pwrap_readl(wrp, PWRAP_WACS2_RDATA) & mask_done)) {
|
||||
dev_dbg(wrp->dev, "initialization isn't finished\n");
|
||||
ret = -ENODEV;
|
||||
goto err_out4;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Initialize watchdog, may not be done by the bootloader */
|
||||
|
|
@ -2622,42 +2579,27 @@ static int pwrap_probe(struct platform_device *pdev)
|
|||
pwrap_writel(wrp, wrp->master->int1_en_all, PWRAP_INT1_EN);
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0) {
|
||||
ret = irq;
|
||||
goto err_out2;
|
||||
}
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
ret = devm_request_irq(wrp->dev, irq, pwrap_interrupt,
|
||||
IRQF_TRIGGER_HIGH,
|
||||
"mt-pmic-pwrap", wrp);
|
||||
if (ret)
|
||||
goto err_out4;
|
||||
return ret;
|
||||
|
||||
wrp->regmap = devm_regmap_init(wrp->dev, NULL, wrp, wrp->slave->regops->regmap);
|
||||
if (IS_ERR(wrp->regmap)) {
|
||||
ret = PTR_ERR(wrp->regmap);
|
||||
goto err_out2;
|
||||
}
|
||||
if (IS_ERR(wrp->regmap))
|
||||
return PTR_ERR(wrp->regmap);
|
||||
|
||||
ret = of_platform_populate(np, NULL, NULL, wrp->dev);
|
||||
if (ret) {
|
||||
dev_dbg(wrp->dev, "failed to create child devices at %pOF\n",
|
||||
np);
|
||||
goto err_out4;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_out4:
|
||||
clk_disable_unprepare(wrp->clk_tmr);
|
||||
err_out3:
|
||||
clk_disable_unprepare(wrp->clk_sys);
|
||||
err_out2:
|
||||
clk_disable_unprepare(wrp->clk_wrap);
|
||||
err_out1:
|
||||
clk_disable_unprepare(wrp->clk_spi);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct platform_driver pwrap_drv = {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user