diff mbox series

[14/20] serial_lpuart: add clock enable if CONFIG_CLK is defined

Message ID 20191204174439.69934-15-giulio.benetti@benettiengineering.com
State Changes Requested
Delegated to: Stefano Babic
Headers show
Series Add i.MXRT family support | expand

Commit Message

Giulio Benetti Dec. 4, 2019, 5:44 p.m. UTC
This driver assumes that lpuart clock is already enabled before probing
but using DM only lpuart won't be automatically enabled so add
clk_enable() when probing if CONFIG_CLK is defined.

Signed-off-by: Giulio Benetti <giulio.benetti@benettiengineering.com>
---
 drivers/serial/serial_lpuart.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

Comments

Lukasz Majewski Dec. 8, 2019, 2:52 p.m. UTC | #1
On Wed,  4 Dec 2019 18:44:33 +0100
Giulio Benetti <giulio.benetti@benettiengineering.com> wrote:

> This driver assumes that lpuart clock is already enabled before
> probing but using DM only lpuart won't be automatically enabled so add
> clk_enable() when probing if CONFIG_CLK is defined.
> 
> Signed-off-by: Giulio Benetti <giulio.benetti@benettiengineering.com>
> ---
>  drivers/serial/serial_lpuart.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/drivers/serial/serial_lpuart.c
> b/drivers/serial/serial_lpuart.c index 4b0a964d1b..52bd2baf7d 100644
> --- a/drivers/serial/serial_lpuart.c
> +++ b/drivers/serial/serial_lpuart.c
> @@ -483,6 +483,19 @@ static int lpuart_serial_pending(struct udevice
> *dev, bool input) 
>  static int lpuart_serial_probe(struct udevice *dev)
>  {
> +#if CONFIG_IS_ENABLED(CLK)
> +	struct clk per_clk;
> +	int ret;
> +
> +	ret = clk_get_by_name(dev, "per", &per_clk);
> +	if (ret) {
> +		dev_err(dev, "Failed to get per clk: %d\n", ret);
> +		return ret;
> +	}
> +
> +	clk_enable(&per_clk);
> +#endif
> +

I think that this change will _silently_ break all boards which do have
CONFIG_CLK enabled (for some clocks/drivers), but did not yet provided
CCF definition for lpuart clock.

Was this series checked with travis-ci? 

For example:
https://travis-ci.org/lmajewski/u-boot-dfu/jobs/622226547

>  	if (is_lpuart32(dev))
>  		return _lpuart32_serial_init(dev);
>  	else




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
Giulio Benetti Dec. 9, 2019, 3:20 p.m. UTC | #2
Hi Lukasz,

On 12/8/19 3:52 PM, Lukasz Majewski wrote:
> On Wed,  4 Dec 2019 18:44:33 +0100
> Giulio Benetti <giulio.benetti@benettiengineering.com> wrote:
> 
>> This driver assumes that lpuart clock is already enabled before
>> probing but using DM only lpuart won't be automatically enabled so add
>> clk_enable() when probing if CONFIG_CLK is defined.
>>
>> Signed-off-by: Giulio Benetti <giulio.benetti@benettiengineering.com>
>> ---
>>   drivers/serial/serial_lpuart.c | 13 +++++++++++++
>>   1 file changed, 13 insertions(+)
>>
>> diff --git a/drivers/serial/serial_lpuart.c
>> b/drivers/serial/serial_lpuart.c index 4b0a964d1b..52bd2baf7d 100644
>> --- a/drivers/serial/serial_lpuart.c
>> +++ b/drivers/serial/serial_lpuart.c
>> @@ -483,6 +483,19 @@ static int lpuart_serial_pending(struct udevice
>> *dev, bool input)
>>   static int lpuart_serial_probe(struct udevice *dev)
>>   {
>> +#if CONFIG_IS_ENABLED(CLK)
>> +	struct clk per_clk;
>> +	int ret;
>> +
>> +	ret = clk_get_by_name(dev, "per", &per_clk);
>> +	if (ret) {
>> +		dev_err(dev, "Failed to get per clk: %d\n", ret);
>> +		return ret;
>> +	}
>> +
>> +	clk_enable(&per_clk);
>> +#endif
>> +
> 
> I think that this change will _silently_ break all boards which do have
> CONFIG_CLK enabled (for some clocks/drivers), but did not yet provided
> CCF definition for lpuart clock.

Oops, yes, you're totally right.
Would it be correct if I try to retrieve clock and otherwise I fallback 
sending warnings like following?:

`
static int lpuart_serial_probe(struct udevice *dev)
{
#if CONFIG_IS_ENABLED(CLK)
	struct clk per_clk;
	int ret;

	ret = clk_get_by_name(dev, "per", &per_clk);
	if (!ret) {
		ret = clk_enable(&per_clk);
		if (ret) {
			dev_err(dev, "Failed to get per clk: %d\n",
				ret);
			return;
		}
	} else {
		dev_warn(dev, "Failed to get per clk: %d\n",
			 ret);
	}
#endif

....

`

Best regards
Lukasz Majewski Dec. 9, 2019, 11:48 p.m. UTC | #3
On Mon, 9 Dec 2019 16:20:10 +0100
Giulio Benetti <giulio.benetti@benettiengineering.com> wrote:

> Hi Lukasz,
> 
> On 12/8/19 3:52 PM, Lukasz Majewski wrote:
> > On Wed,  4 Dec 2019 18:44:33 +0100
> > Giulio Benetti <giulio.benetti@benettiengineering.com> wrote:
> >   
> >> This driver assumes that lpuart clock is already enabled before
> >> probing but using DM only lpuart won't be automatically enabled so
> >> add clk_enable() when probing if CONFIG_CLK is defined.
> >>
> >> Signed-off-by: Giulio Benetti
> >> <giulio.benetti@benettiengineering.com> ---
> >>   drivers/serial/serial_lpuart.c | 13 +++++++++++++
> >>   1 file changed, 13 insertions(+)
> >>
> >> diff --git a/drivers/serial/serial_lpuart.c
> >> b/drivers/serial/serial_lpuart.c index 4b0a964d1b..52bd2baf7d
> >> 100644 --- a/drivers/serial/serial_lpuart.c
> >> +++ b/drivers/serial/serial_lpuart.c
> >> @@ -483,6 +483,19 @@ static int lpuart_serial_pending(struct
> >> udevice *dev, bool input)
> >>   static int lpuart_serial_probe(struct udevice *dev)
> >>   {
> >> +#if CONFIG_IS_ENABLED(CLK)
> >> +	struct clk per_clk;
> >> +	int ret;
> >> +
> >> +	ret = clk_get_by_name(dev, "per", &per_clk);
> >> +	if (ret) {
> >> +		dev_err(dev, "Failed to get per clk: %d\n", ret);
> >> +		return ret;
> >> +	}
> >> +
> >> +	clk_enable(&per_clk);
> >> +#endif
> >> +  
> > 
> > I think that this change will _silently_ break all boards which do
> > have CONFIG_CLK enabled (for some clocks/drivers), but did not yet
> > provided CCF definition for lpuart clock.  
> 
> Oops, yes, you're totally right.
> Would it be correct if I try to retrieve clock and otherwise I
> fallback sending warnings like following?:
> 
> `
> static int lpuart_serial_probe(struct udevice *dev)
> {
> #if CONFIG_IS_ENABLED(CLK)
> 	struct clk per_clk;
> 	int ret;
> 
> 	ret = clk_get_by_name(dev, "per", &per_clk);
> 	if (!ret) {
> 		ret = clk_enable(&per_clk);
> 		if (ret) {
> 			dev_err(dev, "Failed to get per clk: %d\n",
> 				ret);
> 			return;
> 		}
> 	} else {
> 		dev_warn(dev, "Failed to get per clk: %d\n",
> 			 ret);
> 	}
> #endif
> 

Yes, warning is OK.

> ....
> 
> `
> 
> Best regards




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
Giulio Benetti Dec. 17, 2019, 6:37 p.m. UTC | #4
Hi Lukasz and all,

On 12/10/19 12:48 AM, Lukasz Majewski wrote:
> On Mon, 9 Dec 2019 16:20:10 +0100
> Giulio Benetti <giulio.benetti@benettiengineering.com> wrote:
> 
>> Hi Lukasz,
>>
>> On 12/8/19 3:52 PM, Lukasz Majewski wrote:
>>> On Wed,  4 Dec 2019 18:44:33 +0100
>>> Giulio Benetti <giulio.benetti@benettiengineering.com> wrote:
>>>    
>>>> This driver assumes that lpuart clock is already enabled before
>>>> probing but using DM only lpuart won't be automatically enabled so
>>>> add clk_enable() when probing if CONFIG_CLK is defined.
>>>>
>>>> Signed-off-by: Giulio Benetti
>>>> <giulio.benetti@benettiengineering.com> ---
>>>>    drivers/serial/serial_lpuart.c | 13 +++++++++++++
>>>>    1 file changed, 13 insertions(+)
>>>>
>>>> diff --git a/drivers/serial/serial_lpuart.c
>>>> b/drivers/serial/serial_lpuart.c index 4b0a964d1b..52bd2baf7d
>>>> 100644 --- a/drivers/serial/serial_lpuart.c
>>>> +++ b/drivers/serial/serial_lpuart.c
>>>> @@ -483,6 +483,19 @@ static int lpuart_serial_pending(struct
>>>> udevice *dev, bool input)
>>>>    static int lpuart_serial_probe(struct udevice *dev)
>>>>    {
>>>> +#if CONFIG_IS_ENABLED(CLK)
>>>> +	struct clk per_clk;
>>>> +	int ret;
>>>> +
>>>> +	ret = clk_get_by_name(dev, "per", &per_clk);

While adding support for OF_PLATDATA, I've realized that when using 
OF_PLATDATA I can only use clk_get_by_index_platdata() but often imx 
peripheral drivers(as done in Linux) get clock by name("per" clock) 
instead of other clock sources. So here the problem is that I can't know 
for sure which id "per" clock source will have. I wouldn't use 0 as 
default clock-id since it's not sure "per" will be the 0 index.
And this will occur for fsl_esdhc_imx.c driver too.

Do you have any suggestions?

Thanks in advance

Best regards
Simon Glass Dec. 30, 2019, 1:21 a.m. UTC | #5
Hi Giulio,

On Tue, 17 Dec 2019 at 11:37, Giulio Benetti
<giulio.benetti@benettiengineering.com> wrote:
>
> Hi Lukasz and all,
>
> On 12/10/19 12:48 AM, Lukasz Majewski wrote:
> > On Mon, 9 Dec 2019 16:20:10 +0100
> > Giulio Benetti <giulio.benetti@benettiengineering.com> wrote:
> >
> >> Hi Lukasz,
> >>
> >> On 12/8/19 3:52 PM, Lukasz Majewski wrote:
> >>> On Wed,  4 Dec 2019 18:44:33 +0100
> >>> Giulio Benetti <giulio.benetti@benettiengineering.com> wrote:
> >>>
> >>>> This driver assumes that lpuart clock is already enabled before
> >>>> probing but using DM only lpuart won't be automatically enabled so
> >>>> add clk_enable() when probing if CONFIG_CLK is defined.
> >>>>
> >>>> Signed-off-by: Giulio Benetti
> >>>> <giulio.benetti@benettiengineering.com> ---
> >>>>    drivers/serial/serial_lpuart.c | 13 +++++++++++++
> >>>>    1 file changed, 13 insertions(+)
> >>>>
> >>>> diff --git a/drivers/serial/serial_lpuart.c
> >>>> b/drivers/serial/serial_lpuart.c index 4b0a964d1b..52bd2baf7d
> >>>> 100644 --- a/drivers/serial/serial_lpuart.c
> >>>> +++ b/drivers/serial/serial_lpuart.c
> >>>> @@ -483,6 +483,19 @@ static int lpuart_serial_pending(struct
> >>>> udevice *dev, bool input)
> >>>>    static int lpuart_serial_probe(struct udevice *dev)
> >>>>    {
> >>>> +#if CONFIG_IS_ENABLED(CLK)
> >>>> +  struct clk per_clk;
> >>>> +  int ret;
> >>>> +
> >>>> +  ret = clk_get_by_name(dev, "per", &per_clk);
>
> While adding support for OF_PLATDATA, I've realized that when using
> OF_PLATDATA I can only use clk_get_by_index_platdata() but often imx
> peripheral drivers(as done in Linux) get clock by name("per" clock)
> instead of other clock sources. So here the problem is that I can't know
> for sure which id "per" clock source will have. I wouldn't use 0 as
> default clock-id since it's not sure "per" will be the 0 index.
> And this will occur for fsl_esdhc_imx.c driver too.
>
> Do you have any suggestions?

I can't think of anything other than defining the values perhaps in a
header, then asserting that they are valid in the non-OF_PLATDATA
code.

I'm not sure how we could enhance of-platdata to support this. Of
course, adding the strings would be bad since we are trying to
minimise overhere.

Regards,
Simon
diff mbox series

Patch

diff --git a/drivers/serial/serial_lpuart.c b/drivers/serial/serial_lpuart.c
index 4b0a964d1b..52bd2baf7d 100644
--- a/drivers/serial/serial_lpuart.c
+++ b/drivers/serial/serial_lpuart.c
@@ -483,6 +483,19 @@  static int lpuart_serial_pending(struct udevice *dev, bool input)
 
 static int lpuart_serial_probe(struct udevice *dev)
 {
+#if CONFIG_IS_ENABLED(CLK)
+	struct clk per_clk;
+	int ret;
+
+	ret = clk_get_by_name(dev, "per", &per_clk);
+	if (ret) {
+		dev_err(dev, "Failed to get per clk: %d\n", ret);
+		return ret;
+	}
+
+	clk_enable(&per_clk);
+#endif
+
 	if (is_lpuart32(dev))
 		return _lpuart32_serial_init(dev);
 	else