[U-Boot] [PATCH v7 08/10] usb: host: ohci-generic: add CLOCK support

Patrice CHOTARD patrice.chotard at st.com
Wed Jun 21 08:36:12 UTC 2017


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.chotard at st.com wrote:
>>>> From: Patrice Chotard <patrice.chotard at 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.chotard at 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
> 


More information about the U-Boot mailing list