Message ID | 20160726222410.2052-2-paul.burton@imgtec.com |
---|---|
State | Superseded |
Delegated to: | Daniel Schwierzeck |
Headers | show |
Hi Paul, On 26 July 2016 at 16:24, Paul Burton <paul.burton@imgtec.com> wrote: > Previously ns16550 compatible UARTs probed via device tree have needed > their device tree nodes to contain a clock-frequency property. An > alternative to this commonly used with Linux is to reference a clock via > a phandle. This patch allows U-Boot to support that, retrieving the > clock frequency by probing the appropriate clock device. > > For example, a system might choose to provide the UART base clock as a > reference to a clock common to multiple devices: > > sys_clk: clock { > compatible = "fixed-clock"; > #clock-cells = <0>; > clock-frequency = <10000000>; > }; > > uart0: uart@10000000 { > compatible = "ns16550a"; > reg = <0x10000000 0x1000>; > clocks = <&sys_clk>; > }; > > uart1: uart@10000000 { > compatible = "ns16550a"; > reg = <0x10001000 0x1000>; > clocks = <&sys_clk>; > }; > > This removes the need for the frequency information to be duplicated in > multiple nodes and allows the device tree to be more descriptive of the > system. > > Signed-off-by: Paul Burton <paul.burton@imgtec.com> > --- > > drivers/serial/ns16550.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) Looks reasonable - but see below. > > diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c > index 88fca15..53032dc 100644 > --- a/drivers/serial/ns16550.c > +++ b/drivers/serial/ns16550.c > @@ -5,6 +5,7 @@ > */ > > #include <common.h> > +#include <clk.h> > #include <dm.h> > #include <errno.h> > #include <fdtdec.h> > @@ -352,6 +353,8 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev) > { > struct ns16550_platdata *plat = dev->platdata; > fdt_addr_t addr; > + struct clk clk; > + int err; > > /* try Processor Local Bus device first */ > addr = dev_get_addr(dev); > @@ -397,9 +400,14 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev) > "reg-offset", 0); > plat->reg_shift = fdtdec_get_int(gd->fdt_blob, dev->of_offset, > "reg-shift", 0); > - plat->clock = fdtdec_get_int(gd->fdt_blob, dev->of_offset, > - "clock-frequency", > - CONFIG_SYS_NS16550_CLK); > + > + err = clk_get_by_index(dev, 0, &clk); > + if (!err) > + plat->clock = clk_get_rate(&clk); I think this should ignore -ENODEV perhaps (no clock device) but not any other error. > + if (!plat->clock) > + plat->clock = fdtdec_get_int(gd->fdt_blob, dev->of_offset, > + "clock-frequency", > + CONFIG_SYS_NS16550_CLK); > if (!plat->clock) { > debug("ns16550 clock not defined\n"); > return -EINVAL; > -- > 2.9.0 > Regards, Simon
diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c index 88fca15..53032dc 100644 --- a/drivers/serial/ns16550.c +++ b/drivers/serial/ns16550.c @@ -5,6 +5,7 @@ */ #include <common.h> +#include <clk.h> #include <dm.h> #include <errno.h> #include <fdtdec.h> @@ -352,6 +353,8 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev) { struct ns16550_platdata *plat = dev->platdata; fdt_addr_t addr; + struct clk clk; + int err; /* try Processor Local Bus device first */ addr = dev_get_addr(dev); @@ -397,9 +400,14 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev) "reg-offset", 0); plat->reg_shift = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "reg-shift", 0); - plat->clock = fdtdec_get_int(gd->fdt_blob, dev->of_offset, - "clock-frequency", - CONFIG_SYS_NS16550_CLK); + + err = clk_get_by_index(dev, 0, &clk); + if (!err) + plat->clock = clk_get_rate(&clk); + if (!plat->clock) + plat->clock = fdtdec_get_int(gd->fdt_blob, dev->of_offset, + "clock-frequency", + CONFIG_SYS_NS16550_CLK); if (!plat->clock) { debug("ns16550 clock not defined\n"); return -EINVAL;
Previously ns16550 compatible UARTs probed via device tree have needed their device tree nodes to contain a clock-frequency property. An alternative to this commonly used with Linux is to reference a clock via a phandle. This patch allows U-Boot to support that, retrieving the clock frequency by probing the appropriate clock device. For example, a system might choose to provide the UART base clock as a reference to a clock common to multiple devices: sys_clk: clock { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <10000000>; }; uart0: uart@10000000 { compatible = "ns16550a"; reg = <0x10000000 0x1000>; clocks = <&sys_clk>; }; uart1: uart@10000000 { compatible = "ns16550a"; reg = <0x10001000 0x1000>; clocks = <&sys_clk>; }; This removes the need for the frequency information to be duplicated in multiple nodes and allows the device tree to be more descriptive of the system. Signed-off-by: Paul Burton <paul.burton@imgtec.com> --- drivers/serial/ns16550.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)