[PATCH 0/2] timer: sti: mimic Linux declaration and usage

This series update the sti-timer for cortex-a9 CPU (arm global timer) to mimic the behavior presents in Linux. Therefor, the same device tree node can be use for U-Boot and Linux.
Nicolas Heemeryck (2): timer: sti: convert to livetree timer: sti: use clk API to get timer clock rate
drivers/timer/sti-timer.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-)

Update STI timer to support a live tree
Signed-off-by: Nicolas Heemeryck nicolas.heemeryck@gmail.com --- drivers/timer/sti-timer.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/timer/sti-timer.c b/drivers/timer/sti-timer.c index 9def7e02f4..eac22ae39b 100644 --- a/drivers/timer/sti-timer.c +++ b/drivers/timer/sti-timer.c @@ -6,14 +6,11 @@
#include <common.h> #include <dm.h> -#include <fdtdec.h> #include <timer.h>
#include <asm/io.h> #include <asm/arch-armv7/globaltimer.h>
-DECLARE_GLOBAL_DATA_PTR; - struct sti_timer_priv { struct globaltimer *global_timer; }; @@ -44,13 +41,13 @@ static int sti_timer_probe(struct udevice *dev) { struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); struct sti_timer_priv *priv = dev_get_priv(dev); - fdt_addr_t addr;
uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK;
/* get arm global timer base address */ - addr = fdtdec_get_addr(gd->fdt_blob, dev_of_offset(dev), "reg"); - priv->global_timer = (struct globaltimer *)addr; + priv->global_timer = (struct globaltimer *)dev_read_addr_ptr(dev); + if (!priv->global_timer) + return -ENOENT;
/* init timer */ writel(0x01, &priv->global_timer->ctl);

Hi Nicolas
On 3/8/20 2:20 PM, Nicolas Heemeryck wrote:
Update STI timer to support a live tree
Signed-off-by: Nicolas Heemeryck nicolas.heemeryck@gmail.com
drivers/timer/sti-timer.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/timer/sti-timer.c b/drivers/timer/sti-timer.c index 9def7e02f4..eac22ae39b 100644 --- a/drivers/timer/sti-timer.c +++ b/drivers/timer/sti-timer.c @@ -6,14 +6,11 @@
#include <common.h> #include <dm.h> -#include <fdtdec.h> #include <timer.h>
#include <asm/io.h> #include <asm/arch-armv7/globaltimer.h>
-DECLARE_GLOBAL_DATA_PTR;
struct sti_timer_priv { struct globaltimer *global_timer; }; @@ -44,13 +41,13 @@ static int sti_timer_probe(struct udevice *dev) { struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); struct sti_timer_priv *priv = dev_get_priv(dev);
fdt_addr_t addr;
uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK;
/* get arm global timer base address */
addr = fdtdec_get_addr(gd->fdt_blob, dev_of_offset(dev), "reg");
priv->global_timer = (struct globaltimer *)addr;
priv->global_timer = (struct globaltimer *)dev_read_addr_ptr(dev);
if (!priv->global_timer)
return -ENOENT;
/* init timer */ writel(0x01, &priv->global_timer->ctl);
Acked-by: Patrice Chotard patrice.chotard@st.com
Thanks
Patrice

Retrieve clock rate through device tree. This mimics the behavior of arm_global_timer in Linux.
Signed-off-by: Nicolas Heemeryck nicolas.heemeryck@gmail.com --- drivers/timer/sti-timer.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/timer/sti-timer.c b/drivers/timer/sti-timer.c index eac22ae39b..123fac04a9 100644 --- a/drivers/timer/sti-timer.c +++ b/drivers/timer/sti-timer.c @@ -6,6 +6,7 @@
#include <common.h> #include <dm.h> +#include <clk.h> #include <timer.h>
#include <asm/io.h> @@ -41,14 +42,22 @@ static int sti_timer_probe(struct udevice *dev) { struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); struct sti_timer_priv *priv = dev_get_priv(dev); - - uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK; + struct clk clk; + int ret;
/* get arm global timer base address */ priv->global_timer = (struct globaltimer *)dev_read_addr_ptr(dev); if (!priv->global_timer) return -ENOENT;
+ ret = clk_get_by_index(dev, 0, &clk); + if (ret) + return ret; + + uc_priv->clock_rate = clk_get_rate(&clk); + if (!uc_priv->clock_rate) + return -EINVAL; + /* init timer */ writel(0x01, &priv->global_timer->ctl);

Hi Nicolas
On 3/8/20 2:20 PM, Nicolas Heemeryck wrote:
Retrieve clock rate through device tree. This mimics the behavior of arm_global_timer in Linux.
Signed-off-by: Nicolas Heemeryck nicolas.heemeryck@gmail.com
drivers/timer/sti-timer.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/timer/sti-timer.c b/drivers/timer/sti-timer.c index eac22ae39b..123fac04a9 100644 --- a/drivers/timer/sti-timer.c +++ b/drivers/timer/sti-timer.c @@ -6,6 +6,7 @@
#include <common.h> #include <dm.h> +#include <clk.h> #include <timer.h>
#include <asm/io.h> @@ -41,14 +42,22 @@ static int sti_timer_probe(struct udevice *dev) { struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); struct sti_timer_priv *priv = dev_get_priv(dev);
- uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK;
struct clk clk;
int ret;
/* get arm global timer base address */ priv->global_timer = (struct globaltimer *)dev_read_addr_ptr(dev); if (!priv->global_timer) return -ENOENT;
ret = clk_get_by_index(dev, 0, &clk);
if (ret)
return ret;
uc_priv->clock_rate = clk_get_rate(&clk);
if (!uc_priv->clock_rate)
return -EINVAL;
/* init timer */ writel(0x01, &priv->global_timer->ctl);
Nack, for STi board, there is no clock driver (all clock are enabled by default).
So clk_get_by_index() will return an error and will avoid timer driver to probe properly.
Thanks
Patrice

This series update the sti-timer for cortex-a9 CPU (arm global timer) to mimic the behavior presents in Linux. Therefor, the same device tree node can be use for U-Boot and Linux.
Changes in v2:
Since some boards do not necessary have a clock driver, fall back on CONFIG_SYS_HZ_CLOCK. This is similar to what we can find on timer-uclass timer_pre_probe function.
Cc: Patrice Chotard patrice.chotard@st.com
Nicolas Heemeryck (2): timer: sti: convert to livetree timer: sti: use clk API to get timer clock rate
drivers/timer/sti-timer.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-)

Update STI timer to support a live tree
Signed-off-by: Nicolas Heemeryck nicolas.heemeryck@gmail.com Cc: Patrice Chotard patrice.chotard@st.com
---
Changes for v2: None --- drivers/timer/sti-timer.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/timer/sti-timer.c b/drivers/timer/sti-timer.c index 9def7e02f4..eac22ae39b 100644 --- a/drivers/timer/sti-timer.c +++ b/drivers/timer/sti-timer.c @@ -6,14 +6,11 @@
#include <common.h> #include <dm.h> -#include <fdtdec.h> #include <timer.h>
#include <asm/io.h> #include <asm/arch-armv7/globaltimer.h>
-DECLARE_GLOBAL_DATA_PTR; - struct sti_timer_priv { struct globaltimer *global_timer; }; @@ -44,13 +41,13 @@ static int sti_timer_probe(struct udevice *dev) { struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); struct sti_timer_priv *priv = dev_get_priv(dev); - fdt_addr_t addr;
uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK;
/* get arm global timer base address */ - addr = fdtdec_get_addr(gd->fdt_blob, dev_of_offset(dev), "reg"); - priv->global_timer = (struct globaltimer *)addr; + priv->global_timer = (struct globaltimer *)dev_read_addr_ptr(dev); + if (!priv->global_timer) + return -ENOENT;
/* init timer */ writel(0x01, &priv->global_timer->ctl);

Hi Nicolas
On 3/13/20 11:42 PM, Nicolas Heemeryck wrote:
Update STI timer to support a live tree
Signed-off-by: Nicolas Heemeryck nicolas.heemeryck@gmail.com Cc: Patrice Chotard patrice.chotard@st.com
Changes for v2: None
drivers/timer/sti-timer.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/timer/sti-timer.c b/drivers/timer/sti-timer.c index 9def7e02f4..eac22ae39b 100644 --- a/drivers/timer/sti-timer.c +++ b/drivers/timer/sti-timer.c @@ -6,14 +6,11 @@
#include <common.h> #include <dm.h> -#include <fdtdec.h> #include <timer.h>
#include <asm/io.h> #include <asm/arch-armv7/globaltimer.h>
-DECLARE_GLOBAL_DATA_PTR;
struct sti_timer_priv { struct globaltimer *global_timer; }; @@ -44,13 +41,13 @@ static int sti_timer_probe(struct udevice *dev) { struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); struct sti_timer_priv *priv = dev_get_priv(dev);
fdt_addr_t addr;
uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK;
/* get arm global timer base address */
addr = fdtdec_get_addr(gd->fdt_blob, dev_of_offset(dev), "reg");
priv->global_timer = (struct globaltimer *)addr;
priv->global_timer = (struct globaltimer *)dev_read_addr_ptr(dev);
if (!priv->global_timer)
return -ENOENT;
/* init timer */ writel(0x01, &priv->global_timer->ctl);
Acked-by: Patrice Chotard patrice.chotard@st.com
Thanks
Patrice

Hi,
From: U-Boot u-boot-bounces@lists.denx.de On Behalf Of Nicolas Heemeryck Sent: vendredi 13 mars 2020 23:43
Update STI timer to support a live tree
Signed-off-by: Nicolas Heemeryck nicolas.heemeryck@gmail.com Cc: Patrice Chotard patrice.chotard@st.com
Applied to u-boot-stm/next, thanks!
Regards
Patrick

Retrieve clock rate through device tree. This mimics the behavior of arm_global_timer in Linux.
Signed-off-by: Nicolas Heemeryck nicolas.heemeryck@gmail.com Cc: Patrice Chotard patrice.chotard@st.com
---
Changes for v2:
- Fall back on CONFIG_SYS_HZ_CLOCK if clk_get_by_index returns an error or no clock driver is provided. --- drivers/timer/sti-timer.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/drivers/timer/sti-timer.c b/drivers/timer/sti-timer.c index eac22ae39b..ff42056abd 100644 --- a/drivers/timer/sti-timer.c +++ b/drivers/timer/sti-timer.c @@ -6,7 +6,9 @@
#include <common.h> #include <dm.h> +#include <clk.h> #include <timer.h> +#include <linux/err.h>
#include <asm/io.h> #include <asm/arch-armv7/globaltimer.h> @@ -41,14 +43,25 @@ static int sti_timer_probe(struct udevice *dev) { struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); struct sti_timer_priv *priv = dev_get_priv(dev); - - uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK; + struct clk clk; + int err; + ulong ret;
/* get arm global timer base address */ priv->global_timer = (struct globaltimer *)dev_read_addr_ptr(dev); if (!priv->global_timer) return -ENOENT;
+ err = clk_get_by_index(dev, 0, &clk); + if (!err) { + ret = clk_get_rate(&clk); + if (IS_ERR_VALUE(ret)) + return ret; + uc_priv->clock_rate = ret; + } else { + uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK; + } + /* init timer */ writel(0x01, &priv->global_timer->ctl);

Hi Nicolas
On 3/13/20 11:42 PM, Nicolas Heemeryck wrote:
Retrieve clock rate through device tree. This mimics the behavior of arm_global_timer in Linux.
Signed-off-by: Nicolas Heemeryck nicolas.heemeryck@gmail.com Cc: Patrice Chotard patrice.chotard@st.com
Changes for v2:
- Fall back on CONFIG_SYS_HZ_CLOCK if clk_get_by_index returns an
error or no clock driver is provided.
drivers/timer/sti-timer.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/drivers/timer/sti-timer.c b/drivers/timer/sti-timer.c index eac22ae39b..ff42056abd 100644 --- a/drivers/timer/sti-timer.c +++ b/drivers/timer/sti-timer.c @@ -6,7 +6,9 @@
#include <common.h> #include <dm.h> +#include <clk.h> #include <timer.h> +#include <linux/err.h>
#include <asm/io.h> #include <asm/arch-armv7/globaltimer.h> @@ -41,14 +43,25 @@ static int sti_timer_probe(struct udevice *dev) { struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); struct sti_timer_priv *priv = dev_get_priv(dev);
- uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK;
struct clk clk;
int err;
ulong ret;
/* get arm global timer base address */ priv->global_timer = (struct globaltimer *)dev_read_addr_ptr(dev); if (!priv->global_timer) return -ENOENT;
err = clk_get_by_index(dev, 0, &clk);
if (!err) {
ret = clk_get_rate(&clk);
if (IS_ERR_VALUE(ret))
return ret;
uc_priv->clock_rate = ret;
} else {
uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK;
}
/* init timer */ writel(0x01, &priv->global_timer->ctl);
Acked-by: Patrice Chotard patrice.chotard@st.com
Thanks
Patrice

Hi,
From: U-Boot u-boot-bounces@lists.denx.de On Behalf Of Nicolas Heemeryck Sent: vendredi 13 mars 2020 23:43
Retrieve clock rate through device tree. This mimics the behavior of arm_global_timer in Linux.
Signed-off-by: Nicolas Heemeryck nicolas.heemeryck@gmail.com Cc: Patrice Chotard patrice.chotard@st.com
Applied to u-boot-stm/next, thanks!
Regards
Patrick
participants (3)
-
Nicolas Heemeryck
-
Patrice CHOTARD
-
Patrick DELAUNAY