diff options
Diffstat (limited to 'arch/xtensa/include/asm')
-rw-r--r-- | arch/xtensa/include/asm/cacheflush.h | 95 | ||||
-rw-r--r-- | arch/xtensa/include/asm/gpio.h | 8 | ||||
-rw-r--r-- | arch/xtensa/include/asm/irq.h | 12 |
3 files changed, 110 insertions, 5 deletions
diff --git a/arch/xtensa/include/asm/cacheflush.h b/arch/xtensa/include/asm/cacheflush.h index 8fc1c0c8de07..b7b8fbe47c77 100644 --- a/arch/xtensa/include/asm/cacheflush.h +++ b/arch/xtensa/include/asm/cacheflush.h | |||
@@ -155,5 +155,100 @@ extern void copy_from_user_page(struct vm_area_struct*, struct page*, | |||
155 | 155 | ||
156 | #endif | 156 | #endif |
157 | 157 | ||
158 | #define XTENSA_CACHEBLK_LOG2 29 | ||
159 | #define XTENSA_CACHEBLK_SIZE (1 << XTENSA_CACHEBLK_LOG2) | ||
160 | #define XTENSA_CACHEBLK_MASK (7 << XTENSA_CACHEBLK_LOG2) | ||
161 | |||
162 | #if XCHAL_HAVE_CACHEATTR | ||
163 | static inline u32 xtensa_get_cacheattr(void) | ||
164 | { | ||
165 | u32 r; | ||
166 | asm volatile(" rsr %0, CACHEATTR" : "=a"(r)); | ||
167 | return r; | ||
168 | } | ||
169 | |||
170 | static inline u32 xtensa_get_dtlb1(u32 addr) | ||
171 | { | ||
172 | u32 r = addr & XTENSA_CACHEBLK_MASK; | ||
173 | return r | ((xtensa_get_cacheattr() >> (r >> (XTENSA_CACHEBLK_LOG2-2))) | ||
174 | & 0xF); | ||
175 | } | ||
176 | #else | ||
177 | static inline u32 xtensa_get_dtlb1(u32 addr) | ||
178 | { | ||
179 | u32 r; | ||
180 | asm volatile(" rdtlb1 %0, %1" : "=a"(r) : "a"(addr)); | ||
181 | asm volatile(" dsync"); | ||
182 | return r; | ||
183 | } | ||
184 | |||
185 | static inline u32 xtensa_get_cacheattr(void) | ||
186 | { | ||
187 | u32 r = 0; | ||
188 | u32 a = 0; | ||
189 | do { | ||
190 | a -= XTENSA_CACHEBLK_SIZE; | ||
191 | r = (r << 4) | (xtensa_get_dtlb1(a) & 0xF); | ||
192 | } while (a); | ||
193 | return r; | ||
194 | } | ||
195 | #endif | ||
196 | |||
197 | static inline int xtensa_need_flush_dma_source(u32 addr) | ||
198 | { | ||
199 | return (xtensa_get_dtlb1(addr) & ((1 << XCHAL_CA_BITS) - 1)) >= 4; | ||
200 | } | ||
201 | |||
202 | static inline int xtensa_need_invalidate_dma_destination(u32 addr) | ||
203 | { | ||
204 | return (xtensa_get_dtlb1(addr) & ((1 << XCHAL_CA_BITS) - 1)) != 2; | ||
205 | } | ||
206 | |||
207 | static inline void flush_dcache_unaligned(u32 addr, u32 size) | ||
208 | { | ||
209 | u32 cnt; | ||
210 | if (size) { | ||
211 | cnt = (size + ((XCHAL_DCACHE_LINESIZE - 1) & addr) | ||
212 | + XCHAL_DCACHE_LINESIZE - 1) / XCHAL_DCACHE_LINESIZE; | ||
213 | while (cnt--) { | ||
214 | asm volatile(" dhwb %0, 0" : : "a"(addr)); | ||
215 | addr += XCHAL_DCACHE_LINESIZE; | ||
216 | } | ||
217 | asm volatile(" dsync"); | ||
218 | } | ||
219 | } | ||
220 | |||
221 | static inline void invalidate_dcache_unaligned(u32 addr, u32 size) | ||
222 | { | ||
223 | int cnt; | ||
224 | if (size) { | ||
225 | asm volatile(" dhwbi %0, 0 ;" : : "a"(addr)); | ||
226 | cnt = (size + ((XCHAL_DCACHE_LINESIZE - 1) & addr) | ||
227 | - XCHAL_DCACHE_LINESIZE - 1) / XCHAL_DCACHE_LINESIZE; | ||
228 | while (cnt-- > 0) { | ||
229 | asm volatile(" dhi %0, %1" : : "a"(addr), | ||
230 | "n"(XCHAL_DCACHE_LINESIZE)); | ||
231 | addr += XCHAL_DCACHE_LINESIZE; | ||
232 | } | ||
233 | asm volatile(" dhwbi %0, %1" : : "a"(addr), | ||
234 | "n"(XCHAL_DCACHE_LINESIZE)); | ||
235 | asm volatile(" dsync"); | ||
236 | } | ||
237 | } | ||
238 | |||
239 | static inline void flush_invalidate_dcache_unaligned(u32 addr, u32 size) | ||
240 | { | ||
241 | u32 cnt; | ||
242 | if (size) { | ||
243 | cnt = (size + ((XCHAL_DCACHE_LINESIZE - 1) & addr) | ||
244 | + XCHAL_DCACHE_LINESIZE - 1) / XCHAL_DCACHE_LINESIZE; | ||
245 | while (cnt--) { | ||
246 | asm volatile(" dhwbi %0, 0" : : "a"(addr)); | ||
247 | addr += XCHAL_DCACHE_LINESIZE; | ||
248 | } | ||
249 | asm volatile(" dsync"); | ||
250 | } | ||
251 | } | ||
252 | |||
158 | #endif /* __KERNEL__ */ | 253 | #endif /* __KERNEL__ */ |
159 | #endif /* _XTENSA_CACHEFLUSH_H */ | 254 | #endif /* _XTENSA_CACHEFLUSH_H */ |
diff --git a/arch/xtensa/include/asm/gpio.h b/arch/xtensa/include/asm/gpio.h index 0763b0763960..a8c9fc46c790 100644 --- a/arch/xtensa/include/asm/gpio.h +++ b/arch/xtensa/include/asm/gpio.h | |||
@@ -38,14 +38,14 @@ static inline int gpio_cansleep(unsigned int gpio) | |||
38 | return __gpio_cansleep(gpio); | 38 | return __gpio_cansleep(gpio); |
39 | } | 39 | } |
40 | 40 | ||
41 | /* | ||
42 | * Not implemented, yet. | ||
43 | */ | ||
44 | static inline int gpio_to_irq(unsigned int gpio) | 41 | static inline int gpio_to_irq(unsigned int gpio) |
45 | { | 42 | { |
46 | return -ENOSYS; | 43 | return __gpio_to_irq(gpio); |
47 | } | 44 | } |
48 | 45 | ||
46 | /* | ||
47 | * Not implemented, yet. | ||
48 | */ | ||
49 | static inline int irq_to_gpio(unsigned int irq) | 49 | static inline int irq_to_gpio(unsigned int irq) |
50 | { | 50 | { |
51 | return -EINVAL; | 51 | return -EINVAL; |
diff --git a/arch/xtensa/include/asm/irq.h b/arch/xtensa/include/asm/irq.h index dfac82dc52ad..4c0ccc9c4f4c 100644 --- a/arch/xtensa/include/asm/irq.h +++ b/arch/xtensa/include/asm/irq.h | |||
@@ -11,6 +11,7 @@ | |||
11 | #ifndef _XTENSA_IRQ_H | 11 | #ifndef _XTENSA_IRQ_H |
12 | #define _XTENSA_IRQ_H | 12 | #define _XTENSA_IRQ_H |
13 | 13 | ||
14 | #include <linux/init.h> | ||
14 | #include <platform/hardware.h> | 15 | #include <platform/hardware.h> |
15 | #include <variant/core.h> | 16 | #include <variant/core.h> |
16 | 17 | ||
@@ -21,11 +22,20 @@ static inline void variant_irq_enable(unsigned int irq) { } | |||
21 | static inline void variant_irq_disable(unsigned int irq) { } | 22 | static inline void variant_irq_disable(unsigned int irq) { } |
22 | #endif | 23 | #endif |
23 | 24 | ||
25 | #ifndef VARIANT_NR_IRQS | ||
26 | # define VARIANT_NR_IRQS 0 | ||
27 | #endif | ||
24 | #ifndef PLATFORM_NR_IRQS | 28 | #ifndef PLATFORM_NR_IRQS |
25 | # define PLATFORM_NR_IRQS 0 | 29 | # define PLATFORM_NR_IRQS 0 |
26 | #endif | 30 | #endif |
27 | #define XTENSA_NR_IRQS XCHAL_NUM_INTERRUPTS | 31 | #define XTENSA_NR_IRQS XCHAL_NUM_INTERRUPTS |
28 | #define NR_IRQS (XTENSA_NR_IRQS + PLATFORM_NR_IRQS) | 32 | #define NR_IRQS (XTENSA_NR_IRQS + VARIANT_NR_IRQS + PLATFORM_NR_IRQS) |
33 | |||
34 | #if VARIANT_NR_IRQS == 0 | ||
35 | static inline void variant_init_irq(void) { } | ||
36 | #else | ||
37 | void variant_init_irq(void) __init; | ||
38 | #endif | ||
29 | 39 | ||
30 | static __inline__ int irq_canonicalize(int irq) | 40 | static __inline__ int irq_canonicalize(int irq) |
31 | { | 41 | { |