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

Simon Glass sjg at chromium.org
Mon Dec 28 05:23:12 CET 2015


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);
> +{
> +       return -ENOSYS;
> +}
> +#endif
> +
>  #endif /* _CLK_H_ */
> --
> 1.9.1
>

Regards,
Simon


More information about the U-Boot mailing list