[U-Boot] [RESEND PATCH 4/5] clk: add device tree support for clock framework

Simon Glass sjg at chromium.org
Mon Dec 28 15:20:53 CET 2015


Hi Masahiro,

On 27 December 2015 at 21:23, Simon Glass <sjg at chromium.org> wrote:
> Hi Masahiro,
>
> On 22 December 2015 at 03:04, Masahiro Yamada
> <yamada.masahiro at socionext.com> wrote:
>> Add device tree binding support for the clock uclass.  This allows
>> clock consumers to get the peripheral ID based on the "clocks"
>> property in the device tree.
>>
>> Usage:
>> Assume the following device tree:
>>
>>   clk: myclock {
>>           compatible = "myclocktype";
>>           #clock-cells = <1>;
>>   };
>>
>>   uart {
>>           compatible = "myuart";
>>           clocks = <&clk 3>;
>>   };
>>
>>   i2c {
>>           compatible = "myi2c";
>>           clocks = <&clk 5>;
>>   };
>>
>> The UART, I2C driver can get the peripheral ID 3, 5, respectively
>> by calling fdt_clk_get().  The clock provider should set its get_id
>> callback to clk_get_id_simple.  This should be enough for most cases
>> although more complicated DT-PeripheralID translation would be
>> possible by a specific get_id callback.
>>
>> Signed-off-by: Masahiro Yamada <yamada.masahiro at socionext.com>
>> ---
>>
>>  drivers/clk/Makefile  |  1 +
>>  drivers/clk/clk-fdt.c | 37 +++++++++++++++++++++++++++++++++++++
>
> I think clk_fdt.c is better since we mostly avoid hyphens except for the uclass.
>
>>  include/clk.h         | 20 ++++++++++++++++++++
>>  3 files changed, 58 insertions(+)
>>  create mode 100644 drivers/clk/clk-fdt.c
>>
>> diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
>> index 4a6a4a8..5fcdf39 100644
>> --- a/drivers/clk/Makefile
>> +++ b/drivers/clk/Makefile
>> @@ -6,6 +6,7 @@
>>  #
>>
>>  obj-$(CONFIG_CLK) += clk-uclass.o
>> +obj-$(CONFIG_$(SPL_)OF_CONTROL) += clk-fdt.o
>>  obj-$(CONFIG_ROCKCHIP_RK3036) += clk_rk3036.o
>>  obj-$(CONFIG_ROCKCHIP_RK3288) += clk_rk3288.o
>>  obj-$(CONFIG_SANDBOX) += clk_sandbox.o
>> diff --git a/drivers/clk/clk-fdt.c b/drivers/clk/clk-fdt.c
>> new file mode 100644
>> index 0000000..fc53157
>> --- /dev/null
>> +++ b/drivers/clk/clk-fdt.c
>> @@ -0,0 +1,37 @@
>> +/*
>> + * Copyright (C) 2015 Masahiro Yamada <yamada.masahiro at socionext.com>
>> + *
>> + * Device Tree support for clk uclass
>> + *
>> + * SPDX-License-Identifier:    GPL-2.0+
>> + */
>> +
>> +#include <clk.h>
>> +#include <dm/uclass.h>
>> +#include <fdtdec.h>
>> +
>> +int fdt_clk_get(const void *fdt, int nodeoffset, int index,
>> +               struct udevice **dev)
>
> I think this should work using a device rather than a node offset.
> I've pushed a working tree to u-boot-dm/rockchip-working to show what
> I mean.
>
> Also BTW I implemented your full pinctrl for rockchip in that tree -
> seems to work well! The only problem is that init is quite slow. It
> might be the phandle lookups, I'm not sure.
>
>> +{
>> +       struct fdtdec_phandle_args clkspec;
>> +       struct udevice *clkdev;
>> +       int rc;
>> +
>> +       rc = fdtdec_parse_phandle_with_args(fdt, nodeoffset, "clocks",
>> +                                           "#clock-cells", 0, index, &clkspec);
>> +       if (rc)
>> +               return rc;
>> +
>> +       rc = uclass_get_device_by_of_offset(UCLASS_CLK, clkspec.node, &clkdev);
>> +       if (rc)
>> +               return rc;
>> +
>> +       rc = clk_get_id(clkdev, clkspec.args_count, clkspec.args);
>> +       if (rc < 0)
>> +               return rc;
>> +
>> +       if (dev)
>> +               *dev = clkdev;
>> +
>> +       return rc;
>> +}
>> diff --git a/include/clk.h b/include/clk.h
>> index 1efbaf2..518cb47 100644
>> --- a/include/clk.h
>> +++ b/include/clk.h
>> @@ -121,4 +121,24 @@ static inline int clk_get_id_simple(struct udevice *dev, int args_count,
>>         return args_count > 0 ? args[0] : 0;
>>  }
>>
>> +#if CONFIG_IS_ENABLED(OF_CONTROL)
>> +/**
>> + * fdt_clk_get() - Get peripheral ID from device tree
>> + *
>> + * @fdt:       FDT blob
>> + * @periph:    Offset of clock consumer node
>> + * @index:     index of a phandle to parse out in "clocks" property
>> + * @dev:       if not NULL, filled with pointer of clock provider
>> + * @return peripheral ID, or -ve error code
>> + */
>> +int fdt_clk_get(const void *fdt, int nodeoffset, int index,
>> +               struct udevice **dev);
>> +#else
>> +static inline int fdt_clk_get(const void *fdt, int nodeoffset, int index,
>> +                             struct udevice **dev);

With a bit more thought, I think the concerns I have are mostly
cosmetic. This function should be passed a struct udevice rather than
fdt and nodeoffset, since it can get them itself. Also I'm not keen on
the fdt_ prefix. Other than that it is similar to the
clk_get_by_index() that I was fiddling with for rockchip. I think it
is better to return the periph_id as a return value (as you have)
rather than a pointer arg (as I did).

>> +{
>> +       return -ENOSYS;
>> +}
>> +#endif
>> +
>>  #endif /* _CLK_H_ */
>> --
>> 1.9.1
>>
>
> Regards,
> Simon

Regards,
Simon


More information about the U-Boot mailing list