diff mbox series

serial: pl01x: Add error value checking

Message ID 8eb6b7ec908337cc5ee6dbe78b47bff40c922be3.1602664950.git.michal.simek@xilinx.com
State Superseded
Delegated to: Michal Simek
Headers show
Series serial: pl01x: Add error value checking | expand

Commit Message

Michal Simek Oct. 14, 2020, 8:42 a.m. UTC
There also a need to check return values to make sure that clocks were
enabled and setup properly.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

 drivers/serial/serial_pl01x.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

Comments

Simon Glass Oct. 15, 2020, 3:05 p.m. UTC | #1
On Wed, 14 Oct 2020 at 02:42, Michal Simek <michal.simek@xilinx.com> wrote:
>
> There also a need to check return values to make sure that clocks were
> enabled and setup properly.
>
> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
> ---
>
>  drivers/serial/serial_pl01x.c | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)

Reviewed-by: Simon Glass <sjg@chromium.org>
Andre Przywara Oct. 15, 2020, 3:09 p.m. UTC | #2
On 14/10/2020 09:42, Michal Simek wrote:

Hi,

> There also a need to check return values to make sure that clocks were
> enabled and setup properly.

is that just clean-up or is there a particular problem that's fixed?

I am asking because I am not sure how useful debug output in a console
driver is.
Also in some cases the UART is actually already configured, so failure
to get the clock (due to a sloppy/too complicated DTB) is not really
fatal at the moment.

I am not against this patch, just wanted to make sure we don't break
anything.

Cheers,
Andre


> 
> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
> ---
> 
>  drivers/serial/serial_pl01x.c | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/serial/serial_pl01x.c b/drivers/serial/serial_pl01x.c
> index 2772c25f1d2d..8672095ea4de 100644
> --- a/drivers/serial/serial_pl01x.c
> +++ b/drivers/serial/serial_pl01x.c
> @@ -362,8 +362,18 @@ int pl01x_serial_ofdata_to_platdata(struct udevice *dev)
>  	plat->clock = dev_read_u32_default(dev, "clock", CONFIG_PL011_CLOCK);
>  	ret = clk_get_by_index(dev, 0, &clk);
>  	if (!ret) {
> -		clk_enable(&clk);
> +		ret = clk_enable(&clk);
> +		if (ret && ret != -ENOSYS) {
> +			dev_err(dev, "failed to enable clock\n");
> +			return ret;
> +		}
> +
>  		plat->clock = clk_get_rate(&clk);
> +		if (IS_ERR_VALUE(plat->clock)) {
> +			dev_err(dev, "failed to get rate\n");
> +			return plat->clock;
> +		}
> +		debug("%s: CLK %d\n", __func__, plat->clock);
>  	}
>  	plat->type = dev_get_driver_data(dev);
>  	plat->skip_init = dev_read_bool(dev, "skip-init");
>
Michal Simek Oct. 15, 2020, 4:11 p.m. UTC | #3
Hi,

On 15. 10. 20 17:09, André Przywara wrote:
> On 14/10/2020 09:42, Michal Simek wrote:
> 
> Hi,
> 
>> There also a need to check return values to make sure that clocks were
>> enabled and setup properly.
> 
> is that just clean-up or is there a particular problem that's fixed?
> 
> I am asking because I am not sure how useful debug output in a console
> driver is.
> Also in some cases the UART is actually already configured, so failure
> to get the clock (due to a sloppy/too complicated DTB) is not really
> fatal at the moment.
> 
> I am not against this patch, just wanted to make sure we don't break
> anything.

We have created the patch long time ago and it was also sent to mailing
list in October 2018.

https://github.com/Xilinx/u-boot-xlnx/commit/7c7266d3d058f4e5d99ad7449eddf6b7e9ff238d#diff-375baede8682cf017faf02039e060958d6574db7900775e7d6f17219bd4d0ecb

More or less the most of the part of it where already added by different
people. The only missing part was checking error values.
There are 2 reasons behind this patch.

1. it is good practice to check all return values - and coverity also
reports it.
2. at this time clock driver is up and running and if not you will get
errors. In our case we are asking firmware for doing that
action/returning value which needs to be catch.

And early console can be configured properly when DEBUG console is used
that's why debug message will be shown over this interface and it makes
sense to show message about it. And if you don't failed you can break
regular console by configuring by incorrect values.

Thanks,
Michal
diff mbox series

Patch

diff --git a/drivers/serial/serial_pl01x.c b/drivers/serial/serial_pl01x.c
index 2772c25f1d2d..8672095ea4de 100644
--- a/drivers/serial/serial_pl01x.c
+++ b/drivers/serial/serial_pl01x.c
@@ -362,8 +362,18 @@  int pl01x_serial_ofdata_to_platdata(struct udevice *dev)
 	plat->clock = dev_read_u32_default(dev, "clock", CONFIG_PL011_CLOCK);
 	ret = clk_get_by_index(dev, 0, &clk);
 	if (!ret) {
-		clk_enable(&clk);
+		ret = clk_enable(&clk);
+		if (ret && ret != -ENOSYS) {
+			dev_err(dev, "failed to enable clock\n");
+			return ret;
+		}
+
 		plat->clock = clk_get_rate(&clk);
+		if (IS_ERR_VALUE(plat->clock)) {
+			dev_err(dev, "failed to get rate\n");
+			return plat->clock;
+		}
+		debug("%s: CLK %d\n", __func__, plat->clock);
 	}
 	plat->type = dev_get_driver_data(dev);
 	plat->skip_init = dev_read_bool(dev, "skip-init");