Hi Lothar

On 06/21/2017 09:56 AM, Lothar Waßmann wrote:
> Hi,
> 
> On Tue, 20 Jun 2017 12:56:48 +0000 Patrice CHOTARD wrote:
>> Hi Lothar
>>
>> On 06/20/2017 02:06 PM, Lothar Waßmann wrote:
>>> Hi,
>>>
>>> On Tue, 20 Jun 2017 11:59:09 +0200 patrice.chot...@st.com wrote:
>>>> From: Patrice Chotard <patrice.chot...@st.com>
>>>>
>>>> use array to save enabled clocks reference in order to
>>>> disabled them in case of error during probe() or during
>>>> driver removal.
>>>>
>>>> Signed-off-by: Patrice Chotard <patrice.chot...@st.com>
>>>> ---
>>>> v7:        _ replace clk_count() by ofnode_count_phandle_with_args()
>>>>
>>>> v6:        _ none
>>>>
>>>> v5:        _ none
>>>>
>>>> v4:        _ use generic_phy_valid() before generic_phy_exit() call
>>>>
>>>> v3:        _ extract in this patch the CLOCK support add-on from previous 
>>>> patch 5
>>>>    _ keep enabled clocks reference in list in order to
>>>>      disable clocks in error path or in .remove callback
>>>>
>>>> v2:        _ add error path management
>>>>    _ add .remove callback
>>>>
>>>>    drivers/usb/host/ohci-generic.c | 59 
>>>> +++++++++++++++++++++++++++++++++++++++--
>>>>    1 file changed, 57 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/usb/host/ohci-generic.c 
>>>> b/drivers/usb/host/ohci-generic.c
>>>> index f85738f..f76a1c2 100644
>>>> --- a/drivers/usb/host/ohci-generic.c
>>>> +++ b/drivers/usb/host/ohci-generic.c
>>>> @@ -5,27 +5,83 @@
>>>>     */
>>>>    
>>>>    #include <common.h>
>>>> +#include <clk.h>
>>>>    #include <dm.h>
>>>>    #include "ohci.h"
>>>>    
>>>> +#include <dm/ofnode.h>
>>>> +
>>>>    #if !defined(CONFIG_USB_OHCI_NEW)
>>>>    # error "Generic OHCI driver requires CONFIG_USB_OHCI_NEW"
>>>>    #endif
>>>>    
>>>>    struct generic_ohci {
>>>>            ohci_t ohci;
>>>> +  struct clk *clocks;
>>>> +  int clock_count;
>>>>    };
>>>>    
>>>>    static int ohci_usb_probe(struct udevice *dev)
>>>>    {
>>>>            struct ohci_regs *regs = (struct ohci_regs 
>>>> *)devfdt_get_addr(dev);
>>>> +  struct generic_ohci *priv = dev_get_priv(dev);
>>>> +  int i, err, ret, clock_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);
>>>> +          if (!priv->clocks) {
>>>> +                  error("Can't allocate resource\n");
>>>> +                  return -ENOMEM;
>>>> +          }
>>>> +
>>>> +          for (i = 0; i < clock_nb; i++) {
>>>> +                  err = clk_get_by_index(dev, i, &priv->clocks[i]);
>>>> +                  if (err < 0)
>>>> +                          break;
>>>> +
>>>> +                  priv->clock_count++;
>>>> +
>>>> +                  if (clk_enable(&priv->clocks[i])) {
>>>> +                          error("failed to enable clock %d\n", i);
>>>> +                          clk_free(&priv->clocks[i]);
>>>> +                          goto clk_err;
>>>> +                  }
>>>> +                  clk_free(&priv->clocks[i]);
>>>>
>>> You free the freshly allocated clock right away and use it lateron?
>>
>> clk_free() didn't free clock resources, it's the opposite of
>> clk_request(), see comments in include.clk.h
>>
> But as long as you are working with some resource (whether it's a
> clock, a gpio, a 'reset' or whatever), you should keep it requested and
> free it only after you relinquished using it.
> Otherwise the object you are using may be destroyed underneath your
> feet.

Ah yes, my bad, i focused on the clk_free() inside the previous statement.

I will fix it

Thanks
> 
> 
> Lothar Waßmann
> 
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to