Message ID | 1483532844-20649-4-git-send-email-stefan.herbrechtsmeier@weidmueller.com |
---|---|
State | Accepted |
Commit | c7abb824ddcc69004948580ca564110d86764b5c |
Delegated to: | Michal Simek |
Headers | show |
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
> -----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
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 --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 */