[U-Boot] [PATCH v2 09/11] drivers: serial_sifive: Skip baudrate config if no input clock
Auer, Lukas
lukas.auer at aisec.fraunhofer.de
Sun Jan 20 20:22:29 UTC 2019
Hi Anup,
On Fri, 2019-01-18 at 11:19 +0000, Anup Patel wrote:
> From: Atish Patra <atish.patra at wdc.com>
>
> It is possible that input clock is not available because clk
> device was not available and 'clock-frequency' DT property is
> also not available.
Why would the clock device not be available?
I suspect the problem is that the clock driver is not probed pre-
relocation. Adding DM_FLAG_PRE_RELOC to the driver flags would fix
this.
>
> In this case, instead of failing we should just skip baudrate
> config by returning zero.
Won't this cause issues if an incorrect baudrate is set?
Thanks,
Lukas
>
> Signed-off-by: Atish Patra <atish.patra at wdc.com>
> Signed-off-by: Anup Patel <anup.patel at wdc.com>
> Reviewed-by: Alexander Graf <agraf at suse.de>
> ---
> drivers/serial/serial_sifive.c | 32 ++++++++++++++++----------------
> 1 file changed, 16 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/serial/serial_sifive.c
> b/drivers/serial/serial_sifive.c
> index ea4d35d48c..537bc7a975 100644
> --- a/drivers/serial/serial_sifive.c
> +++ b/drivers/serial/serial_sifive.c
> @@ -99,27 +99,27 @@ static int _sifive_serial_getc(struct uart_sifive
> *regs)
>
> static int sifive_serial_setbrg(struct udevice *dev, int baudrate)
> {
> - int err;
> + int ret;
> struct clk clk;
> struct sifive_uart_platdata *platdata = dev_get_platdata(dev);
> + u32 clock = 0;
>
> - err = clk_get_by_index(dev, 0, &clk);
> - if (!err) {
> - err = clk_get_rate(&clk);
> - if (!IS_ERR_VALUE(err))
> - platdata->clock = err;
> - } else if (err != -ENOENT && err != -ENODEV && err != -ENOSYS)
> {
> + ret = clk_get_by_index(dev, 0, &clk);
> + if (IS_ERR_VALUE(ret)) {
> debug("SiFive UART failed to get clock\n");
> - return err;
> - }
> -
> - if (!platdata->clock)
> - platdata->clock = dev_read_u32_default(dev, "clock-
> frequency", 0);
> - if (!platdata->clock) {
> - debug("SiFive UART clock not defined\n");
> - return -EINVAL;
> + ret = dev_read_u32(dev, "clock-frequency", &clock);
> + if (IS_ERR_VALUE(ret)) {
> + debug("SiFive UART clock not defined\n");
> + return 0;
> + }
> + } else {
> + clock = clk_get_rate(&clk);
> + if (IS_ERR_VALUE(clock)) {
> + debug("SiFive UART clock get rate failed\n");
> + return 0;
> + }
> }
> -
> + platdata->clock = clock;
> _sifive_serial_setbrg(platdata->regs, platdata->clock,
> baudrate);
>
> return 0;
More information about the U-Boot
mailing list