[U-Boot] [PATCH v7 06/10] usb: host: ehci-generic: add error path and .remove callback

Lothar Waßmann LW at KARO-electronics.de
Tue Jun 20 11:26:37 UTC 2017


Hi,

On Tue, 20 Jun 2017 12:09:22 +0200 Marek Vasut wrote:
> On 06/20/2017 11:59 AM, patrice.chotard at st.com wrote:
> > From: Patrice Chotard <patrice.chotard at st.com>
> > 
> > Use an array to save enabled clocks reference and deasserted resets
> > in order to respectively disabled and asserted them in case of error
> > during probe() or during driver removal.
> > 
> > Signed-off-by: Patrice Chotard <patrice.chotard at st.com>
> 
> Nitpicks below
> 
> > ---
> > 
> > v7:	_ replace clk_count() and reset_count() by ofnode_count_phandle_with_args()
> > 
> > v6:	_ none
> > 
> > v5: 	_ none
> > 
> > v4:	_ update the memory allocation for deasserted resets and enabled
> > 	  clocks reference list. Replace lists by arrays.
> > 	_ usage of new RESET and CLOCK methods clk_count(), reset_count(),
> > 	  reset_assert_all() and clk_disable_all().
> > 
> > v3:	_ keep enabled clocks and deasserted resets reference in list in order to
> > 	  disable clock or assert resets in error path or in .remove callback
> > 	_ use struct generic_ehci * instead of struct udevice * as parameter for
> > 	  ehci_release_resets() and ehci_release_clocks()
> > 
> >  drivers/usb/host/ehci-generic.c | 125 ++++++++++++++++++++++++++++++++--------
> >  1 file changed, 101 insertions(+), 24 deletions(-)
> > 
> > diff --git a/drivers/usb/host/ehci-generic.c b/drivers/usb/host/ehci-generic.c
> > index 2116ae1..388b242 100644
> > --- a/drivers/usb/host/ehci-generic.c
> > +++ b/drivers/usb/host/ehci-generic.c
> > @@ -11,6 +11,8 @@
> >  #include <dm.h>
> >  #include "ehci.h"
> >  
> > +#include <dm/ofnode.h>
> > +
> >  /*
> >   * Even though here we don't explicitly use "struct ehci_ctrl"
> >   * ehci_register() expects it to be the first thing that resides in
> > @@ -18,43 +20,119 @@
> >   */
> >  struct generic_ehci {
> >  	struct ehci_ctrl ctrl;
> > +	struct clk *clocks;
> > +	struct reset_ctl *resets;
> > +	int clock_count;
> > +	int reset_count;
> >  };
> >  
> >  static int ehci_usb_probe(struct udevice *dev)
> >  {
> > +	struct generic_ehci *priv = dev_get_priv(dev);
> >  	struct ehci_hccr *hccr;
> >  	struct ehci_hcor *hcor;
> > -	int i;
> > -
> > -	for (i = 0; ; i++) {
> > -		struct clk clk;
> > -		int ret;
> > -
> > -		ret = clk_get_by_index(dev, i, &clk);
> > -		if (ret < 0)
> > -			break;
> > -		if (clk_enable(&clk))
> > -			error("failed to enable clock %d\n", i);
> > -		clk_free(&clk);
> > -	}
> > +	int i, err, ret, clock_nb, reset_nb;
> > +
> > +	err = 0;
> > +	priv->clock_count = 0;
> > +	clock_nb = ofnode_count_phandle_with_args(dev_ofnode(dev), "clocks",
> > +						  "#clock-cells");
> > +	if (clock_nb > 0) {
> > +		priv->clocks = devm_kmalloc(dev, sizeof(struct clk) * clock_nb,
> > +					    GFP_KERNEL);
> 
> devm_kzalloc()
>
devm_kcalloc(dev, clock_nb, sizeof()...)


Lothar Waßmann


More information about the U-Boot mailing list