Message ID | 20210429073050.21039-4-peng.fan@oss.nxp.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | soc: imx: gpcv2: support i.MX8MM | expand |
On 29.04.21 09:30, Peng Fan (OSS) wrote: > From: Lucas Stach <l.stach@pengutronix.de> > > Use clk_bulk API to simplify the code a bit. Also add some error > checking to the clk_prepare_enable calls. > > Signed-off-by: Lucas Stach <l.stach@pengutronix.de> > --- > drivers/soc/imx/gpcv2.c | 60 +++++++++-------------------------------- > 1 file changed, 12 insertions(+), 48 deletions(-) > > diff --git a/drivers/soc/imx/gpcv2.c b/drivers/soc/imx/gpcv2.c > index 552d3e6bee52..1d90c7802972 100644 > --- a/drivers/soc/imx/gpcv2.c > +++ b/drivers/soc/imx/gpcv2.c > @@ -100,13 +100,11 @@ > > #define GPC_PGC_CTRL_PCR BIT(0) > > -#define GPC_CLK_MAX 6 > - > struct imx_pgc_domain { > struct generic_pm_domain genpd; > struct regmap *regmap; > struct regulator *regulator; > - struct clk *clk[GPC_CLK_MAX]; > + struct clk_bulk_data *clks; > int num_clks; > > unsigned int pgc; > @@ -149,8 +147,12 @@ static int imx_gpc_pu_pgc_sw_pxx_req(struct generic_pm_domain *genpd, > } > > /* Enable reset clocks for all devices in the domain */ > - for (i = 0; i < domain->num_clks; i++) > - clk_prepare_enable(domain->clk[i]); > + clk_bulk_prepare_enable(domain->num_clks, domain->clks); Looks like this fails to catch the return value. This is fixed in patch 04/13 but should happen here already. All the rest looks good to me. > + if (ret) { > + dev_err(domain->dev, "failed to enable reset clocks\n"); > + regulator_disable(domain->regulator); > + return ret; > + } > > if (enable_power_control) > regmap_update_bits(domain->regmap, GPC_PGC_CTRL(domain->pgc), > @@ -187,8 +189,7 @@ static int imx_gpc_pu_pgc_sw_pxx_req(struct generic_pm_domain *genpd, > GPC_PGC_CTRL_PCR, 0); > > /* Disable reset clocks for all devices in the domain */ > - for (i = 0; i < domain->num_clks; i++) > - clk_disable_unprepare(domain->clk[i]); > + clk_bulk_disable_unprepare(domain->num_clks, domain->clks); > > if (has_regulator && !on) { > int err; > @@ -438,41 +439,6 @@ static const struct imx_pgc_domain_data imx8m_pgc_domain_data = { > .reg_access_table = &imx8m_access_table, > }; > > -static int imx_pgc_get_clocks(struct imx_pgc_domain *domain) > -{ > - int i, ret; > - > - for (i = 0; ; i++) { > - struct clk *clk = of_clk_get(domain->dev->of_node, i); > - if (IS_ERR(clk)) > - break; > - if (i >= GPC_CLK_MAX) { > - dev_err(domain->dev, "more than %d clocks\n", > - GPC_CLK_MAX); > - ret = -EINVAL; > - goto clk_err; > - } > - domain->clk[i] = clk; > - } > - domain->num_clks = i; > - > - return 0; > - > -clk_err: > - while (i--) > - clk_put(domain->clk[i]); > - > - return ret; > -} > - > -static void imx_pgc_put_clocks(struct imx_pgc_domain *domain) > -{ > - int i; > - > - for (i = domain->num_clks - 1; i >= 0; i--) > - clk_put(domain->clk[i]); > -} > - > static int imx_pgc_domain_probe(struct platform_device *pdev) > { > struct imx_pgc_domain *domain = pdev->dev.platform_data; > @@ -490,9 +456,10 @@ static int imx_pgc_domain_probe(struct platform_device *pdev) > domain->voltage, domain->voltage); > } > > - ret = imx_pgc_get_clocks(domain); > - if (ret) > - return dev_err_probe(domain->dev, ret, "Failed to get domain's clocks\n"); > + domain->num_clks = devm_clk_bulk_get_all(domain->dev, &domain->clks); > + if (domain->num_clks < 0) > + return dev_err_probe(domain->dev, domain->num_clks, > + "Failed to get domain's clocks\n"); > > regmap_update_bits(domain->regmap, GPC_PGC_CPU_MAPPING, > domain->bits.map, domain->bits.map); > @@ -517,7 +484,6 @@ static int imx_pgc_domain_probe(struct platform_device *pdev) > out_domain_unmap: > regmap_update_bits(domain->regmap, GPC_PGC_CPU_MAPPING, > domain->bits.map, 0); > - imx_pgc_put_clocks(domain); > > return ret; > } > @@ -532,8 +498,6 @@ static int imx_pgc_domain_remove(struct platform_device *pdev) > regmap_update_bits(domain->regmap, GPC_PGC_CPU_MAPPING, > domain->bits.map, 0); > > - imx_pgc_put_clocks(domain); > - > return 0; > } > >
diff --git a/drivers/soc/imx/gpcv2.c b/drivers/soc/imx/gpcv2.c index 552d3e6bee52..1d90c7802972 100644 --- a/drivers/soc/imx/gpcv2.c +++ b/drivers/soc/imx/gpcv2.c @@ -100,13 +100,11 @@ #define GPC_PGC_CTRL_PCR BIT(0) -#define GPC_CLK_MAX 6 - struct imx_pgc_domain { struct generic_pm_domain genpd; struct regmap *regmap; struct regulator *regulator; - struct clk *clk[GPC_CLK_MAX]; + struct clk_bulk_data *clks; int num_clks; unsigned int pgc; @@ -149,8 +147,12 @@ static int imx_gpc_pu_pgc_sw_pxx_req(struct generic_pm_domain *genpd, } /* Enable reset clocks for all devices in the domain */ - for (i = 0; i < domain->num_clks; i++) - clk_prepare_enable(domain->clk[i]); + clk_bulk_prepare_enable(domain->num_clks, domain->clks); + if (ret) { + dev_err(domain->dev, "failed to enable reset clocks\n"); + regulator_disable(domain->regulator); + return ret; + } if (enable_power_control) regmap_update_bits(domain->regmap, GPC_PGC_CTRL(domain->pgc), @@ -187,8 +189,7 @@ static int imx_gpc_pu_pgc_sw_pxx_req(struct generic_pm_domain *genpd, GPC_PGC_CTRL_PCR, 0); /* Disable reset clocks for all devices in the domain */ - for (i = 0; i < domain->num_clks; i++) - clk_disable_unprepare(domain->clk[i]); + clk_bulk_disable_unprepare(domain->num_clks, domain->clks); if (has_regulator && !on) { int err; @@ -438,41 +439,6 @@ static const struct imx_pgc_domain_data imx8m_pgc_domain_data = { .reg_access_table = &imx8m_access_table, }; -static int imx_pgc_get_clocks(struct imx_pgc_domain *domain) -{ - int i, ret; - - for (i = 0; ; i++) { - struct clk *clk = of_clk_get(domain->dev->of_node, i); - if (IS_ERR(clk)) - break; - if (i >= GPC_CLK_MAX) { - dev_err(domain->dev, "more than %d clocks\n", - GPC_CLK_MAX); - ret = -EINVAL; - goto clk_err; - } - domain->clk[i] = clk; - } - domain->num_clks = i; - - return 0; - -clk_err: - while (i--) - clk_put(domain->clk[i]); - - return ret; -} - -static void imx_pgc_put_clocks(struct imx_pgc_domain *domain) -{ - int i; - - for (i = domain->num_clks - 1; i >= 0; i--) - clk_put(domain->clk[i]); -} - static int imx_pgc_domain_probe(struct platform_device *pdev) { struct imx_pgc_domain *domain = pdev->dev.platform_data; @@ -490,9 +456,10 @@ static int imx_pgc_domain_probe(struct platform_device *pdev) domain->voltage, domain->voltage); } - ret = imx_pgc_get_clocks(domain); - if (ret) - return dev_err_probe(domain->dev, ret, "Failed to get domain's clocks\n"); + domain->num_clks = devm_clk_bulk_get_all(domain->dev, &domain->clks); + if (domain->num_clks < 0) + return dev_err_probe(domain->dev, domain->num_clks, + "Failed to get domain's clocks\n"); regmap_update_bits(domain->regmap, GPC_PGC_CPU_MAPPING, domain->bits.map, domain->bits.map); @@ -517,7 +484,6 @@ static int imx_pgc_domain_probe(struct platform_device *pdev) out_domain_unmap: regmap_update_bits(domain->regmap, GPC_PGC_CPU_MAPPING, domain->bits.map, 0); - imx_pgc_put_clocks(domain); return ret; } @@ -532,8 +498,6 @@ static int imx_pgc_domain_remove(struct platform_device *pdev) regmap_update_bits(domain->regmap, GPC_PGC_CPU_MAPPING, domain->bits.map, 0); - imx_pgc_put_clocks(domain); - return 0; }