[PATCH 2/7] uart: pl011: Add proper DM clock support

Simon Glass sjg at chromium.org
Thu Mar 26 17:20:01 CET 2020


Hi Andre,

On Wed, 25 Mar 2020 at 08:47, Andre Przywara <andre.przywara at arm.com> wrote:
>
> Even though the PL011 UART driver claims to be DM compliant, it does not
> really a good job with parsing DT nodes. U-Boot seems to adhere to a
> non-standard binding, either requiring to have a "skip-init" property in
> the node, or to have an extra "clock" property holding the base
> *frequency* value for the baud rate generator.
> DTs in the U-Boot tree seem to have been hacked to match this
> requirement.
>
> The official binding does not mention any of these properties, instead
> recommends a standard "clocks" property to point to the baud base clock.
>
> Some boards use simple "fixed-clock" providers, which U-Boot readily
> supports, so let's add some simple DM clock code to the PL011 driver to
> learn the rate of the first clock, as described by the official binding.
>
> These clock nodes seem to be not ready very early in the boot process,
> so provide a fallback value, by re-using the already existing
> CONFIG_PL011_CLOCK variable.
>
> Signed-off-by: Andre Przywara <andre.przywara at arm.com>
> ---
>  drivers/serial/serial_pl01x.c | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/serial/serial_pl01x.c b/drivers/serial/serial_pl01x.c
> index 2a5f256184..1ab0ccadb2 100644
> --- a/drivers/serial/serial_pl01x.c
> +++ b/drivers/serial/serial_pl01x.c
> @@ -12,6 +12,7 @@
>
>  #include <common.h>
>  #include <dm.h>
> +#include <clk.h>
>  #include <errno.h>
>  #include <watchdog.h>
>  #include <asm/io.h>
> @@ -340,14 +341,21 @@ static const struct udevice_id pl01x_serial_id[] ={
>  int pl01x_serial_ofdata_to_platdata(struct udevice *dev)
>  {
>         struct pl01x_serial_platdata *plat = dev_get_platdata(dev);
> +       struct clk clk;
>         fdt_addr_t addr;
> +       int ret;
>
>         addr = devfdt_get_addr(dev);
>         if (addr == FDT_ADDR_T_NONE)
>                 return -EINVAL;
>
>         plat->base = addr;
> -       plat->clock = dev_read_u32_default(dev, "clock", 1);
> +       plat->clock = dev_read_u32_default(dev, "clock", CONFIG_PL011_CLOCK);

is this needed?

> +       ret = clk_get_by_index(dev, 0, &clk);
> +       if (!ret) {
> +               clk_enable(&clk);
> +               plat->clock = clk_get_rate(&clk);
> +       }
>         plat->type = dev_get_driver_data(dev);
>         plat->skip_init = dev_read_bool(dev, "skip-init");
>
> --
> 2.14.5
>

Regards,
Simon


More information about the U-Boot mailing list