Skip to content

Commit

Permalink
SPEAr: Add DT bindings for SPEAr's timer
Browse files Browse the repository at this point in the history
All SPEAr SoC's use ST's Timer module. This patch adds device tree probing
capability for that.

Signed-off-by: Viresh Kumar <viresh.kumar@st.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
  • Loading branch information
Viresh Kumar authored and Arnd Bergmann committed May 12, 2012
1 parent fa599c3 commit 30551c0
Show file tree
Hide file tree
Showing 12 changed files with 56 additions and 19 deletions.
18 changes: 18 additions & 0 deletions Documentation/devicetree/bindings/arm/spear-timer.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
* SPEAr ARM Timer

** Timer node required properties:

- compatible : Should be:
"st,spear-timer"
- reg: Address range of the timer registers
- interrupt-parent: Should be the phandle for the interrupt controller
that services interrupts for this device
- interrupt: Should contain the timer interrupt number

Example:

timer@f0000000 {
compatible = "st,spear-timer";
reg = <0xf0000000 0x400>;
interrupts = <2>;
};
6 changes: 6 additions & 0 deletions arch/arm/boot/dts/spear3xx.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,12 @@
interrupts = <12>;
status = "disabled";
};

timer@f0000000 {
compatible = "st,spear-timer";
reg = <0xf0000000 0x400>;
interrupts = <2>;
};
};
};
};
6 changes: 6 additions & 0 deletions arch/arm/boot/dts/spear600.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,12 @@
interrupts = <28>;
status = "disabled";
};

timer@f0000000 {
compatible = "st,spear-timer";
reg = <0xf0000000 0x400>;
interrupts = <16>;
};
};
};
};
2 changes: 1 addition & 1 deletion arch/arm/mach-spear3xx/include/mach/generic.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ extern struct pl022_ssp_controller pl022_plat_data;
extern struct pl08x_platform_data pl080_plat_data;

/* Add spear3xx family function declarations here */
void __init spear_setup_timer(resource_size_t base, int irq);
void __init spear_setup_of_timer(void);
void __init spear3xx_map_io(void);
void __init spear3xx_dt_init_irq(void);

Expand Down
1 change: 0 additions & 1 deletion arch/arm/mach-spear3xx/include/mach/irqs.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

/* FIXME: probe all these from DT */
#define SPEAR3XX_IRQ_INTRCOMM_RAS_ARM 1
#define SPEAR3XX_IRQ_CPU_GPT1_1 2
#define SPEAR3XX_IRQ_GEN_RAS_1 28
#define SPEAR3XX_IRQ_GEN_RAS_2 29
#define SPEAR3XX_IRQ_GEN_RAS_3 30
Expand Down
1 change: 0 additions & 1 deletion arch/arm/mach-spear3xx/include/mach/spear.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
/* ML1 - Multi Layer CPU Subsystem */
#define SPEAR3XX_ICM3_ML1_2_BASE UL(0xF0000000)
#define VA_SPEAR6XX_ML_CPU_BASE UL(0xF0000000)
#define SPEAR3XX_CPU_TMR_BASE UL(0xF0000000)

/* ICM3 - Basic Subsystem */
#define SPEAR3XX_ICM3_SMI_CTRL_BASE UL(0xFC000000)
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-spear3xx/spear3xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -534,7 +534,7 @@ static void __init spear3xx_timer_init(void)
clk_put(gpt_clk);
clk_put(pclk);

spear_setup_timer(SPEAR3XX_CPU_TMR_BASE, SPEAR3XX_IRQ_CPU_GPT1_1);
spear_setup_of_timer();
}

struct sys_timer spear3xx_timer = {
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-spear6xx/include/mach/generic.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

#include <linux/init.h>

void __init spear_setup_timer(resource_size_t base, int irq);
void __init spear_setup_of_timer(void);
void spear_restart(char, const char *);
void __init spear6xx_clk_init(void);

Expand Down
3 changes: 0 additions & 3 deletions arch/arm/mach-spear6xx/include/mach/irqs.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@

/* IRQ definitions */
/* VIC 1 */
/* FIXME: probe this from DT */
#define IRQ_CPU_GPT1_1 16

#define IRQ_VIC_END 64

/* GPIO pins virtual irqs */
Expand Down
1 change: 0 additions & 1 deletion arch/arm/mach-spear6xx/include/mach/spear.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
/* ML-1, 2 - Multi Layer CPU Subsystem */
#define SPEAR6XX_ML_CPU_BASE UL(0xF0000000)
#define VA_SPEAR6XX_ML_CPU_BASE UL(0xF0000000)
#define SPEAR6XX_CPU_TMR_BASE UL(0xF0000000)

/* ICM3 - Basic Subsystem */
#define SPEAR6XX_ICM3_SMI_CTRL_BASE UL(0xFC000000)
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-spear6xx/spear6xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -448,7 +448,7 @@ static void __init spear6xx_timer_init(void)
clk_put(gpt_clk);
clk_put(pclk);

spear_setup_timer(SPEAR6XX_CPU_TMR_BASE, IRQ_CPU_GPT1_1);
spear_setup_of_timer();
}

struct sys_timer spear6xx_timer = {
Expand Down
31 changes: 22 additions & 9 deletions arch/arm/plat-spear/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
#include <linux/ioport.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/of_irq.h>
#include <linux/of_address.h>
#include <linux/time.h>
#include <linux/irq.h>
#include <asm/mach/time.h>
Expand Down Expand Up @@ -197,19 +199,32 @@ static void __init spear_clockevent_init(int irq)
setup_irq(irq, &spear_timer_irq);
}

void __init spear_setup_timer(resource_size_t base, int irq)
const static struct of_device_id timer_of_match[] __initconst = {
{ .compatible = "st,spear-timer", },
{ },
};

void __init spear_setup_of_timer(void)
{
int ret;
struct device_node *np;
int irq, ret;

np = of_find_matching_node(NULL, timer_of_match);
if (!np) {
pr_err("%s: No timer passed via DT\n", __func__);
return;
}

if (!request_mem_region(base, SZ_1K, "gpt0")) {
pr_err("%s:cannot get IO addr\n", __func__);
irq = irq_of_parse_and_map(np, 0);
if (!irq) {
pr_err("%s: No irq passed for timer via DT\n", __func__);
return;
}

gpt_base = ioremap(base, SZ_1K);
gpt_base = of_iomap(np, 0);
if (!gpt_base) {
pr_err("%s:ioremap failed for gpt\n", __func__);
goto err_mem;
pr_err("%s: of iomap failed\n", __func__);
return;
}

gpt_clk = clk_get_sys("gpt0", NULL);
Expand All @@ -233,6 +248,4 @@ void __init spear_setup_timer(resource_size_t base, int irq)
clk_put(gpt_clk);
err_iomap:
iounmap(gpt_base);
err_mem:
release_mem_region(base, SZ_1K);
}

0 comments on commit 30551c0

Please sign in to comment.