diff options
author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2011-09-18 10:29:50 -0400 |
---|---|---|
committer | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2011-11-28 09:50:38 -0500 |
commit | 4ab0c5998d327cba5b7e0dc8ce67f45859997669 (patch) | |
tree | 8e785004e227fa4572a0c459fbde72aa07ddcdfc /arch/arm/mach-at91/at91sam926x_time.c | |
parent | cfa5a1fe7e65bacdee59d5df60a9f44b0c030532 (diff) |
ARM: at91: make pit register base soc independent
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Diffstat (limited to 'arch/arm/mach-at91/at91sam926x_time.c')
-rw-r--r-- | arch/arm/mach-at91/at91sam926x_time.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c index 4ba85499fa97..d89ead740a99 100644 --- a/arch/arm/mach-at91/at91sam926x_time.c +++ b/arch/arm/mach-at91/at91sam926x_time.c | |||
@@ -25,7 +25,17 @@ | |||
25 | 25 | ||
26 | static u32 pit_cycle; /* write-once */ | 26 | static u32 pit_cycle; /* write-once */ |
27 | static u32 pit_cnt; /* access only w/system irq blocked */ | 27 | static u32 pit_cnt; /* access only w/system irq blocked */ |
28 | static void __iomem *pit_base_addr __read_mostly; | ||
28 | 29 | ||
30 | static inline unsigned int pit_read(unsigned int reg_offset) | ||
31 | { | ||
32 | return __raw_readl(pit_base_addr + reg_offset); | ||
33 | } | ||
34 | |||
35 | static inline void pit_write(unsigned int reg_offset, unsigned long value) | ||
36 | { | ||
37 | __raw_writel(value, pit_base_addr + reg_offset); | ||
38 | } | ||
29 | 39 | ||
30 | /* | 40 | /* |
31 | * Clocksource: just a monotonic counter of MCK/16 cycles. | 41 | * Clocksource: just a monotonic counter of MCK/16 cycles. |
@@ -39,7 +49,7 @@ static cycle_t read_pit_clk(struct clocksource *cs) | |||
39 | 49 | ||
40 | raw_local_irq_save(flags); | 50 | raw_local_irq_save(flags); |
41 | elapsed = pit_cnt; | 51 | elapsed = pit_cnt; |
42 | t = at91_sys_read(AT91_PIT_PIIR); | 52 | t = pit_read(AT91_PIT_PIIR); |
43 | raw_local_irq_restore(flags); | 53 | raw_local_irq_restore(flags); |
44 | 54 | ||
45 | elapsed += PIT_PICNT(t) * pit_cycle; | 55 | elapsed += PIT_PICNT(t) * pit_cycle; |
@@ -64,8 +74,8 @@ pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) | |||
64 | switch (mode) { | 74 | switch (mode) { |
65 | case CLOCK_EVT_MODE_PERIODIC: | 75 | case CLOCK_EVT_MODE_PERIODIC: |
66 | /* update clocksource counter */ | 76 | /* update clocksource counter */ |
67 | pit_cnt += pit_cycle * PIT_PICNT(at91_sys_read(AT91_PIT_PIVR)); | 77 | pit_cnt += pit_cycle * PIT_PICNT(pit_read(AT91_PIT_PIVR)); |
68 | at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN | 78 | pit_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN |
69 | | AT91_PIT_PITIEN); | 79 | | AT91_PIT_PITIEN); |
70 | break; | 80 | break; |
71 | case CLOCK_EVT_MODE_ONESHOT: | 81 | case CLOCK_EVT_MODE_ONESHOT: |
@@ -74,7 +84,7 @@ pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) | |||
74 | case CLOCK_EVT_MODE_SHUTDOWN: | 84 | case CLOCK_EVT_MODE_SHUTDOWN: |
75 | case CLOCK_EVT_MODE_UNUSED: | 85 | case CLOCK_EVT_MODE_UNUSED: |
76 | /* disable irq, leaving the clocksource active */ | 86 | /* disable irq, leaving the clocksource active */ |
77 | at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN); | 87 | pit_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN); |
78 | break; | 88 | break; |
79 | case CLOCK_EVT_MODE_RESUME: | 89 | case CLOCK_EVT_MODE_RESUME: |
80 | break; | 90 | break; |
@@ -103,11 +113,11 @@ static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id) | |||
103 | 113 | ||
104 | /* The PIT interrupt may be disabled, and is shared */ | 114 | /* The PIT interrupt may be disabled, and is shared */ |
105 | if ((pit_clkevt.mode == CLOCK_EVT_MODE_PERIODIC) | 115 | if ((pit_clkevt.mode == CLOCK_EVT_MODE_PERIODIC) |
106 | && (at91_sys_read(AT91_PIT_SR) & AT91_PIT_PITS)) { | 116 | && (pit_read(AT91_PIT_SR) & AT91_PIT_PITS)) { |
107 | unsigned nr_ticks; | 117 | unsigned nr_ticks; |
108 | 118 | ||
109 | /* Get number of ticks performed before irq, and ack it */ | 119 | /* Get number of ticks performed before irq, and ack it */ |
110 | nr_ticks = PIT_PICNT(at91_sys_read(AT91_PIT_PIVR)); | 120 | nr_ticks = PIT_PICNT(pit_read(AT91_PIT_PIVR)); |
111 | do { | 121 | do { |
112 | pit_cnt += pit_cycle; | 122 | pit_cnt += pit_cycle; |
113 | pit_clkevt.event_handler(&pit_clkevt); | 123 | pit_clkevt.event_handler(&pit_clkevt); |
@@ -129,14 +139,14 @@ static struct irqaction at91sam926x_pit_irq = { | |||
129 | static void at91sam926x_pit_reset(void) | 139 | static void at91sam926x_pit_reset(void) |
130 | { | 140 | { |
131 | /* Disable timer and irqs */ | 141 | /* Disable timer and irqs */ |
132 | at91_sys_write(AT91_PIT_MR, 0); | 142 | pit_write(AT91_PIT_MR, 0); |
133 | 143 | ||
134 | /* Clear any pending interrupts, wait for PIT to stop counting */ | 144 | /* Clear any pending interrupts, wait for PIT to stop counting */ |
135 | while (PIT_CPIV(at91_sys_read(AT91_PIT_PIVR)) != 0) | 145 | while (PIT_CPIV(pit_read(AT91_PIT_PIVR)) != 0) |
136 | cpu_relax(); | 146 | cpu_relax(); |
137 | 147 | ||
138 | /* Start PIT but don't enable IRQ */ | 148 | /* Start PIT but don't enable IRQ */ |
139 | at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN); | 149 | pit_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN); |
140 | } | 150 | } |
141 | 151 | ||
142 | /* | 152 | /* |
@@ -178,7 +188,15 @@ static void __init at91sam926x_pit_init(void) | |||
178 | static void at91sam926x_pit_suspend(void) | 188 | static void at91sam926x_pit_suspend(void) |
179 | { | 189 | { |
180 | /* Disable timer */ | 190 | /* Disable timer */ |
181 | at91_sys_write(AT91_PIT_MR, 0); | 191 | pit_write(AT91_PIT_MR, 0); |
192 | } | ||
193 | |||
194 | void __init at91sam926x_ioremap_pit(u32 addr) | ||
195 | { | ||
196 | pit_base_addr = ioremap(addr, 16); | ||
197 | |||
198 | if (!pit_base_addr) | ||
199 | panic("Impossible to ioremap PIT\n"); | ||
182 | } | 200 | } |
183 | 201 | ||
184 | struct sys_timer at91sam926x_timer = { | 202 | struct sys_timer at91sam926x_timer = { |