[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