From mboxrd@z Thu Jan 1 00:00:00 1970 From: Simon Glass Date: Sun, 27 Dec 2015 21:23:12 -0700 Subject: [U-Boot] [RESEND PATCH 4/5] clk: add device tree support for clock framework In-Reply-To: <1450778671-21134-5-git-send-email-yamada.masahiro@socionext.com> References: <1450778671-21134-1-git-send-email-yamada.masahiro@socionext.com> <1450778671-21134-5-git-send-email-yamada.masahiro@socionext.com> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Masahiro, On 22 December 2015 at 03:04, Masahiro Yamada 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 > --- > > 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 > + * > + * Device Tree support for clk uclass > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#include > +#include > +#include > + > +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