Hi Sean, > For clocks not in the CCF, their parents will not have UCLASS_CLK, so > we just enable them as normal. The enable count is local to the > struct clk, but this will never result in the actual en-/dis-able op > being called (unless the same struct clk is enabled twice). > > For clocks in the CCF, we always traverse up the tree when enabling. > Previously, CCF clocks without id set would be skipped, stopping the > traversal too early. > > Signed-off-by: Sean Anderson <sean...@gmail.com>
Acked-by: Lukasz Majewski <lu...@denx.de> > --- > Changes for v3: > - New. > > drivers/clk/clk-uclass.c | 58 > +++++++++++++++++----------------------- 1 file changed, 25 > insertions(+), 33 deletions(-) > > diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c > index 9aa8537004..87d101aab4 100644 > --- a/drivers/clk/clk-uclass.c > +++ b/drivers/clk/clk-uclass.c > @@ -490,7 +490,6 @@ int clk_set_parent(struct clk *clk, struct clk > *parent) int clk_enable(struct clk *clk) > { > const struct clk_ops *ops; > - struct clk *clkp = NULL; > int ret; > > debug("%s(clk=%p)\n", __func__, clk); > @@ -499,32 +498,28 @@ int clk_enable(struct clk *clk) > ops = clk_dev_ops(clk->dev); > > if (CONFIG_IS_ENABLED(CLK_CCF)) { > - /* Take id 0 as a non-valid clk, such as dummy */ > - if (clk->id && !clk_get_by_id(clk->id, &clkp)) { > - if (clkp->enable_count) { > - clkp->enable_count++; > - return 0; > - } > - if (clkp->dev->parent && > - device_get_uclass_id(clkp->dev) == > UCLASS_CLK) { > - ret = > clk_enable(dev_get_clk_ptr(clkp->dev->parent)); > - if (ret) { > - printf("Enable %s failed\n", > - > clkp->dev->parent->name); > - return ret; > - } > + if (clk->enable_count) { > + clk->enable_count++; > + return 0; > + } > + if (clk->dev->parent && > + device_get_uclass_id(clk->dev->parent) == > UCLASS_CLK) { > + ret = > clk_enable(dev_get_clk_ptr(clk->dev->parent)); > + if (ret) { > + printf("Enable %s failed\n", > + clk->dev->parent->name); > + return ret; > } > } > > if (ops->enable) { > ret = ops->enable(clk); > if (ret) { > - printf("Enable %s failed\n", > clk->dev->name); > + printf("Enable %s failed (error > %d)\n", clk->dev->name, ret); return ret; > } > } > - if (clkp) > - clkp->enable_count++; > + clk->enable_count++; > } else { > if (!ops->enable) > return -ENOSYS; > @@ -550,7 +545,6 @@ int clk_enable_bulk(struct clk_bulk *bulk) > int clk_disable(struct clk *clk) > { > const struct clk_ops *ops; > - struct clk *clkp = NULL; > int ret; > > debug("%s(clk=%p)\n", __func__, clk); > @@ -559,29 +553,27 @@ int clk_disable(struct clk *clk) > ops = clk_dev_ops(clk->dev); > > if (CONFIG_IS_ENABLED(CLK_CCF)) { > - if (clk->id && !clk_get_by_id(clk->id, &clkp)) { > - if (clkp->enable_count == 0) { > - printf("clk %s already disabled\n", > - clkp->dev->name); > - return 0; > - } > - > - if (--clkp->enable_count > 0) > - return 0; > + if (clk->enable_count == 0) { > + printf("clk %s already disabled\n", > + clk->dev->name); > + return 0; > } > > + if (--clk->enable_count > 0) > + return 0; > + > if (ops->disable) { > ret = ops->disable(clk); > if (ret) > return ret; > } > > - if (clkp && clkp->dev->parent && > - device_get_uclass_id(clkp->dev) == UCLASS_CLK) { > - ret = > clk_disable(dev_get_clk_ptr(clkp->dev->parent)); > + if (clk->dev->parent && > + device_get_uclass_id(clk->dev) == UCLASS_CLK) { > + ret = > clk_disable(dev_get_clk_ptr(clk->dev->parent)); if (ret) { > - printf("Disable %s failed\n", > - clkp->dev->parent->name); > + printf("Disable %s failed (error > %d)\n", > + clk->dev->parent->name, ret); > return ret; > } > } Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lu...@denx.de
pgpV9aQAXDHwG.pgp
Description: OpenPGP digital signature