diff mbox

[U-Boot,3/8] zynq: Add clk framework support to zynq timer

Message ID 1483532844-20649-4-git-send-email-stefan.herbrechtsmeier@weidmueller.com
State Accepted
Commit c7abb824ddcc69004948580ca564110d86764b5c
Delegated to: Michal Simek
Headers show

Commit Message

Herbrechtsmeier Dr.-Ing. , Stefan Jan. 4, 2017, 12:27 p.m. UTC
From: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>

If available use the clock framework to calculate the clock rate of the
zynq timer.

Signed-off-by: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
---

 arch/arm/mach-zynq/timer.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

Comments

Michal Simek Jan. 10, 2017, 2:10 p.m. UTC | #1
On 4.1.2017 13:27, stefan.herbrechtsmeier@weidmueller.com wrote:
> From: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
> 
> If available use the clock framework to calculate the clock rate of the
> zynq timer.
> 
> Signed-off-by: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
> ---
> 
>  arch/arm/mach-zynq/timer.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
> 
> diff --git a/arch/arm/mach-zynq/timer.c b/arch/arm/mach-zynq/timer.c
> index 8ff82dc..0335cbe 100644
> --- a/arch/arm/mach-zynq/timer.c
> +++ b/arch/arm/mach-zynq/timer.c
> @@ -1,4 +1,7 @@
>  /*
> + * Copyright (C) 2017 Weidmüller Interface GmbH & Co. KG
> + * Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
> + *
>   * Copyright (C) 2012 Michal Simek <monstr@monstr.eu>
>   * Copyright (C) 2011-2012 Xilinx, Inc. All rights reserved.
>   *
> @@ -25,8 +28,10 @@
>   * SPDX-License-Identifier:	GPL-2.0+
>   */
>  
> +#include <clk.h>
>  #include <common.h>
>  #include <div64.h>
> +#include <dm.h>
>  #include <asm/io.h>
>  #include <asm/arch/hardware.h>
>  #include <asm/arch/clk.h>
> @@ -56,6 +61,26 @@ int timer_init(void)
>  			(TIMER_PRESCALE << SCUTIMER_CONTROL_PRESCALER_SHIFT) |
>  			SCUTIMER_CONTROL_ENABLE_MASK;
>  
> +#if defined(CONFIG_CLK) || defined(CONFIG_SPL_CLK)
> +	struct udevice *dev;
> +	struct clk clk;
> +	int ret;
> +
> +	ret = uclass_get_device_by_driver(UCLASS_CLK,
> +		DM_GET_DRIVER(zynq_clk), &dev);
> +	if (ret)
> +		return ret;
> +
> +	clk.id = cpu_6or4x_clk;

This information is already present in DT file. What's the reason not to
take it from it?

> +	ret = clk_request(dev, &clk);
> +	if (ret < 0)
> +		return ret;
> +
> +	gd->cpu_clk = clk_get_rate(&clk);
> +
> +	clk_free(&clk);

Not clk expert but isn't there a way to handle it like it is handled for
other drivers? clk_get(), clk_get_rate()?

> +#endif
> +
>  	gd->arch.timer_rate_hz = (gd->cpu_clk / 2) / (TIMER_PRESCALE + 1);
>  
>  	/* Load the timer counter register */
> 

Thanks,
Michal
Herbrechtsmeier Dr.-Ing. , Stefan Jan. 10, 2017, 2:54 p.m. UTC | #2
> -----Ursprüngliche Nachricht-----

> Von: Michal Simek [mailto:monstr@monstr.eu]

> Gesendet: Dienstag, 10. Januar 2017 15:10

> An: Herbrechtsmeier, Stefan; u-boot@lists.denx.de

> Cc: Albert Aribaud; Herbrechtsmeier, Stefan

> Betreff: Re: [PATCH 3/8] zynq: Add clk framework support to zynq timer

> 

> On 4.1.2017 13:27, stefan.herbrechtsmeier@weidmueller.com wrote:

> > From: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>

> >

> > If available use the clock framework to calculate the clock rate of

> > the zynq timer.

> >

> > Signed-off-by: Stefan Herbrechtsmeier

> > <stefan.herbrechtsmeier@weidmueller.com>

> > ---

> >

> >  arch/arm/mach-zynq/timer.c | 25 +++++++++++++++++++++++++

> >  1 file changed, 25 insertions(+)

> >

> > diff --git a/arch/arm/mach-zynq/timer.c b/arch/arm/mach-zynq/timer.c

> > index 8ff82dc..0335cbe 100644

> > --- a/arch/arm/mach-zynq/timer.c

> > +++ b/arch/arm/mach-zynq/timer.c

> > @@ -1,4 +1,7 @@

> >  /*

> > + * Copyright (C) 2017 Weidmüller Interface GmbH & Co. KG

> > + * Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>

> > + *

> >   * Copyright (C) 2012 Michal Simek <monstr@monstr.eu>

> >   * Copyright (C) 2011-2012 Xilinx, Inc. All rights reserved.

> >   *

> > @@ -25,8 +28,10 @@

> >   * SPDX-License-Identifier:	GPL-2.0+

> >   */

> >

> > +#include <clk.h>

> >  #include <common.h>

> >  #include <div64.h>

> > +#include <dm.h>

> >  #include <asm/io.h>

> >  #include <asm/arch/hardware.h>

> >  #include <asm/arch/clk.h>

> > @@ -56,6 +61,26 @@ int timer_init(void)

> >  			(TIMER_PRESCALE << SCUTIMER_CONTROL_PRESCALER_SHIFT)

> |

> >  			SCUTIMER_CONTROL_ENABLE_MASK;

> >

> > +#if defined(CONFIG_CLK) || defined(CONFIG_SPL_CLK)

> > +	struct udevice *dev;

> > +	struct clk clk;

> > +	int ret;

> > +

> > +	ret = uclass_get_device_by_driver(UCLASS_CLK,

> > +		DM_GET_DRIVER(zynq_clk), &dev);

> > +	if (ret)

> > +		return ret;

> > +

> > +	clk.id = cpu_6or4x_clk;

> 

> This information is already present in DT file. What's the reason not

> to take it from it?

Because this is not a DM driver and I don't know the device node. This could be done if we move the driver to drivers/timer.

> 

> > +	ret = clk_request(dev, &clk);

> > +	if (ret < 0)

> > +		return ret;

> > +

> > +	gd->cpu_clk = clk_get_rate(&clk);

> > +

> > +	clk_free(&clk);

> 

> Not clk expert but isn't there a way to handle it like it is handled

> for other drivers? clk_get(), clk_get_rate()?

This is the solution I found in other platform drivers. The clk_get function requires a DM device.

> 

> > +#endif

> > +

> >  	gd->arch.timer_rate_hz = (gd->cpu_clk / 2) / (TIMER_PRESCALE +

> 1);

> >

> >  	/* Load the timer counter register */

> >

> 


Regards,
  Stefan



Kommanditgesellschaft - Sitz: Detmold - Amtsgericht Lemgo HRA 2790 - 
Komplementärin: Weidmüller Interface Führungsgesellschaft mbH - 
Sitz: Detmold - Amtsgericht Lemgo HRB 3924; 
Geschäftsführer: José Carlos Álvarez Tobar, Elke Eckstein, Dr. Peter Köhler, Jörg Timmermann;
USt-ID-Nr. DE124599660
Michal Simek Jan. 10, 2017, 3:08 p.m. UTC | #3
On 10.1.2017 15:54, Stefan.Herbrechtsmeier@weidmueller.com wrote:
>> -----Ursprüngliche Nachricht-----
>> Von: Michal Simek [mailto:monstr@monstr.eu]
>> Gesendet: Dienstag, 10. Januar 2017 15:10
>> An: Herbrechtsmeier, Stefan; u-boot@lists.denx.de
>> Cc: Albert Aribaud; Herbrechtsmeier, Stefan
>> Betreff: Re: [PATCH 3/8] zynq: Add clk framework support to zynq timer
>>
>> On 4.1.2017 13:27, stefan.herbrechtsmeier@weidmueller.com wrote:
>>> From: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
>>>
>>> If available use the clock framework to calculate the clock rate of
>>> the zynq timer.
>>>
>>> Signed-off-by: Stefan Herbrechtsmeier
>>> <stefan.herbrechtsmeier@weidmueller.com>
>>> ---
>>>
>>>  arch/arm/mach-zynq/timer.c | 25 +++++++++++++++++++++++++
>>>  1 file changed, 25 insertions(+)
>>>
>>> diff --git a/arch/arm/mach-zynq/timer.c b/arch/arm/mach-zynq/timer.c
>>> index 8ff82dc..0335cbe 100644
>>> --- a/arch/arm/mach-zynq/timer.c
>>> +++ b/arch/arm/mach-zynq/timer.c
>>> @@ -1,4 +1,7 @@
>>>  /*
>>> + * Copyright (C) 2017 Weidmüller Interface GmbH & Co. KG
>>> + * Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
>>> + *
>>>   * Copyright (C) 2012 Michal Simek <monstr@monstr.eu>
>>>   * Copyright (C) 2011-2012 Xilinx, Inc. All rights reserved.
>>>   *
>>> @@ -25,8 +28,10 @@
>>>   * SPDX-License-Identifier:	GPL-2.0+
>>>   */
>>>
>>> +#include <clk.h>
>>>  #include <common.h>
>>>  #include <div64.h>
>>> +#include <dm.h>
>>>  #include <asm/io.h>
>>>  #include <asm/arch/hardware.h>
>>>  #include <asm/arch/clk.h>
>>> @@ -56,6 +61,26 @@ int timer_init(void)
>>>  			(TIMER_PRESCALE << SCUTIMER_CONTROL_PRESCALER_SHIFT)
>> |
>>>  			SCUTIMER_CONTROL_ENABLE_MASK;
>>>
>>> +#if defined(CONFIG_CLK) || defined(CONFIG_SPL_CLK)
>>> +	struct udevice *dev;
>>> +	struct clk clk;
>>> +	int ret;
>>> +
>>> +	ret = uclass_get_device_by_driver(UCLASS_CLK,
>>> +		DM_GET_DRIVER(zynq_clk), &dev);
>>> +	if (ret)
>>> +		return ret;
>>> +
>>> +	clk.id = cpu_6or4x_clk;
>>
>> This information is already present in DT file. What's the reason not
>> to take it from it?
> Because this is not a DM driver and I don't know the device node. This could be done if we move the driver to drivers/timer.
> 
>>
>>> +	ret = clk_request(dev, &clk);
>>> +	if (ret < 0)
>>> +		return ret;
>>> +
>>> +	gd->cpu_clk = clk_get_rate(&clk);
>>> +
>>> +	clk_free(&clk);
>>
>> Not clk expert but isn't there a way to handle it like it is handled
>> for other drivers? clk_get(), clk_get_rate()?
> This is the solution I found in other platform drivers. The clk_get function requires a DM device.

Ok fair enough. We can use it when driver is moved.

Thanks,
Michal
diff mbox

Patch

diff --git a/arch/arm/mach-zynq/timer.c b/arch/arm/mach-zynq/timer.c
index 8ff82dc..0335cbe 100644
--- a/arch/arm/mach-zynq/timer.c
+++ b/arch/arm/mach-zynq/timer.c
@@ -1,4 +1,7 @@ 
 /*
+ * Copyright (C) 2017 Weidmüller Interface GmbH & Co. KG
+ * Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
+ *
  * Copyright (C) 2012 Michal Simek <monstr@monstr.eu>
  * Copyright (C) 2011-2012 Xilinx, Inc. All rights reserved.
  *
@@ -25,8 +28,10 @@ 
  * SPDX-License-Identifier:	GPL-2.0+
  */
 
+#include <clk.h>
 #include <common.h>
 #include <div64.h>
+#include <dm.h>
 #include <asm/io.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/clk.h>
@@ -56,6 +61,26 @@  int timer_init(void)
 			(TIMER_PRESCALE << SCUTIMER_CONTROL_PRESCALER_SHIFT) |
 			SCUTIMER_CONTROL_ENABLE_MASK;
 
+#if defined(CONFIG_CLK) || defined(CONFIG_SPL_CLK)
+	struct udevice *dev;
+	struct clk clk;
+	int ret;
+
+	ret = uclass_get_device_by_driver(UCLASS_CLK,
+		DM_GET_DRIVER(zynq_clk), &dev);
+	if (ret)
+		return ret;
+
+	clk.id = cpu_6or4x_clk;
+	ret = clk_request(dev, &clk);
+	if (ret < 0)
+		return ret;
+
+	gd->cpu_clk = clk_get_rate(&clk);
+
+	clk_free(&clk);
+#endif
+
 	gd->arch.timer_rate_hz = (gd->cpu_clk / 2) / (TIMER_PRESCALE + 1);
 
 	/* Load the timer counter register */