diff options
190 files changed, 7915 insertions, 1508 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index d6befb2c470f..33d0ec494e34 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -685,6 +685,18 @@ ARM/MAGICIAN MACHINE SUPPORT | |||
685 | M: Philipp Zabel <philipp.zabel@gmail.com> | 685 | M: Philipp Zabel <philipp.zabel@gmail.com> |
686 | S: Maintained | 686 | S: Maintained |
687 | 687 | ||
688 | ARM/Marvell Loki/Kirkwood/MV78xx0/Orion SOC support | ||
689 | M: Lennert Buytenhek <buytenh@marvell.com> | ||
690 | M: Nicolas Pitre <nico@marvell.com> | ||
691 | L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) | ||
692 | T: git git://git.marvell.com/orion | ||
693 | S: Maintained | ||
694 | F: arch/arm/mach-loki/ | ||
695 | F: arch/arm/mach-kirkwood/ | ||
696 | F: arch/arm/mach-mv78xx0/ | ||
697 | F: arch/arm/mach-orion5x/ | ||
698 | F: arch/arm/plat-orion/ | ||
699 | |||
688 | ARM/MIOA701 MACHINE SUPPORT | 700 | ARM/MIOA701 MACHINE SUPPORT |
689 | M: Robert Jarzmik <robert.jarzmik@free.fr> | 701 | M: Robert Jarzmik <robert.jarzmik@free.fr> |
690 | L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) | 702 | L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index a7eb44a1955c..9746667c1973 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -46,10 +46,6 @@ config GENERIC_CLOCKEVENTS_BROADCAST | |||
46 | depends on GENERIC_CLOCKEVENTS | 46 | depends on GENERIC_CLOCKEVENTS |
47 | default y if SMP && !LOCAL_TIMERS | 47 | default y if SMP && !LOCAL_TIMERS |
48 | 48 | ||
49 | config MMU | ||
50 | bool | ||
51 | default y | ||
52 | |||
53 | config NO_IOPORT | 49 | config NO_IOPORT |
54 | bool | 50 | bool |
55 | 51 | ||
@@ -188,6 +184,13 @@ source "kernel/Kconfig.freezer" | |||
188 | 184 | ||
189 | menu "System Type" | 185 | menu "System Type" |
190 | 186 | ||
187 | config MMU | ||
188 | bool "MMU-based Paged Memory Management Support" | ||
189 | default y | ||
190 | help | ||
191 | Select if you want MMU-based virtualised addressing space | ||
192 | support by paged memory management. If unsure, say 'Y'. | ||
193 | |||
191 | choice | 194 | choice |
192 | prompt "ARM system type" | 195 | prompt "ARM system type" |
193 | default ARCH_VERSATILE | 196 | default ARCH_VERSATILE |
@@ -972,6 +975,21 @@ config HZ | |||
972 | default AT91_TIMER_HZ if ARCH_AT91 | 975 | default AT91_TIMER_HZ if ARCH_AT91 |
973 | default 100 | 976 | default 100 |
974 | 977 | ||
978 | config THUMB2_KERNEL | ||
979 | bool "Compile the kernel in Thumb-2 mode" | ||
980 | depends on CPU_V7 && EXPERIMENTAL | ||
981 | select AEABI | ||
982 | select ARM_ASM_UNIFIED | ||
983 | help | ||
984 | By enabling this option, the kernel will be compiled in | ||
985 | Thumb-2 mode. A compiler/assembler that understand the unified | ||
986 | ARM-Thumb syntax is needed. | ||
987 | |||
988 | If unsure, say N. | ||
989 | |||
990 | config ARM_ASM_UNIFIED | ||
991 | bool | ||
992 | |||
975 | config AEABI | 993 | config AEABI |
976 | bool "Use the ARM EABI to compile the kernel" | 994 | bool "Use the ARM EABI to compile the kernel" |
977 | help | 995 | help |
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index a89e4734b8f0..1a6f70e52921 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug | |||
@@ -8,6 +8,7 @@ source "lib/Kconfig.debug" | |||
8 | # n, but then RMK will have to kill you ;). | 8 | # n, but then RMK will have to kill you ;). |
9 | config FRAME_POINTER | 9 | config FRAME_POINTER |
10 | bool | 10 | bool |
11 | depends on !THUMB2_KERNEL | ||
11 | default y if !ARM_UNWIND | 12 | default y if !ARM_UNWIND |
12 | help | 13 | help |
13 | If you say N here, the resulting kernel will be slightly smaller and | 14 | If you say N here, the resulting kernel will be slightly smaller and |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index c877d6df23d1..8f117acd98e9 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -93,9 +93,16 @@ ifeq ($(CONFIG_ARM_UNWIND),y) | |||
93 | CFLAGS_ABI +=-funwind-tables | 93 | CFLAGS_ABI +=-funwind-tables |
94 | endif | 94 | endif |
95 | 95 | ||
96 | ifeq ($(CONFIG_THUMB2_KERNEL),y) | ||
97 | AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=thumb,-Wa$(comma)-mauto-it) | ||
98 | AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W) | ||
99 | CFLAGS_THUMB2 :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN) | ||
100 | AFLAGS_THUMB2 :=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb | ||
101 | endif | ||
102 | |||
96 | # Need -Uarm for gcc < 3.x | 103 | # Need -Uarm for gcc < 3.x |
97 | KBUILD_CFLAGS +=$(CFLAGS_ABI) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float -Uarm | 104 | KBUILD_CFLAGS +=$(CFLAGS_ABI) $(CFLAGS_THUMB2) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float -Uarm |
98 | KBUILD_AFLAGS +=$(CFLAGS_ABI) $(arch-y) $(tune-y) -msoft-float | 105 | KBUILD_AFLAGS +=$(CFLAGS_ABI) $(AFLAGS_THUMB2) $(arch-y) $(tune-y) -include asm/unified.h -msoft-float |
99 | 106 | ||
100 | CHECKFLAGS += -D__arm__ | 107 | CHECKFLAGS += -D__arm__ |
101 | 108 | ||
@@ -135,6 +142,7 @@ machine-$(CONFIG_ARCH_MSM) := msm | |||
135 | machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0 | 142 | machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0 |
136 | machine-$(CONFIG_ARCH_MX1) := mx1 | 143 | machine-$(CONFIG_ARCH_MX1) := mx1 |
137 | machine-$(CONFIG_ARCH_MX2) := mx2 | 144 | machine-$(CONFIG_ARCH_MX2) := mx2 |
145 | machine-$(CONFIG_ARCH_MX25) := mx25 | ||
138 | machine-$(CONFIG_ARCH_MX3) := mx3 | 146 | machine-$(CONFIG_ARCH_MX3) := mx3 |
139 | machine-$(CONFIG_ARCH_NETX) := netx | 147 | machine-$(CONFIG_ARCH_NETX) := netx |
140 | machine-$(CONFIG_ARCH_NS9XXX) := ns9xxx | 148 | machine-$(CONFIG_ARCH_NS9XXX) := ns9xxx |
@@ -158,6 +166,7 @@ machine-$(CONFIG_ARCH_U300) := u300 | |||
158 | machine-$(CONFIG_ARCH_VERSATILE) := versatile | 166 | machine-$(CONFIG_ARCH_VERSATILE) := versatile |
159 | machine-$(CONFIG_ARCH_W90X900) := w90x900 | 167 | machine-$(CONFIG_ARCH_W90X900) := w90x900 |
160 | machine-$(CONFIG_FOOTBRIDGE) := footbridge | 168 | machine-$(CONFIG_FOOTBRIDGE) := footbridge |
169 | machine-$(CONFIG_ARCH_MXC91231) := mxc91231 | ||
161 | 170 | ||
162 | # Platform directory name. This list is sorted alphanumerically | 171 | # Platform directory name. This list is sorted alphanumerically |
163 | # by CONFIG_* macro name. | 172 | # by CONFIG_* macro name. |
diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile index da226abce2d0..4a590f4113e2 100644 --- a/arch/arm/boot/Makefile +++ b/arch/arm/boot/Makefile | |||
@@ -61,7 +61,7 @@ endif | |||
61 | 61 | ||
62 | quiet_cmd_uimage = UIMAGE $@ | 62 | quiet_cmd_uimage = UIMAGE $@ |
63 | cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \ | 63 | cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \ |
64 | -C none -a $(LOADADDR) -e $(LOADADDR) \ | 64 | -C none -a $(LOADADDR) -e $(STARTADDR) \ |
65 | -n 'Linux-$(KERNELRELEASE)' -d $< $@ | 65 | -n 'Linux-$(KERNELRELEASE)' -d $< $@ |
66 | 66 | ||
67 | ifeq ($(CONFIG_ZBOOT_ROM),y) | 67 | ifeq ($(CONFIG_ZBOOT_ROM),y) |
@@ -70,6 +70,13 @@ else | |||
70 | $(obj)/uImage: LOADADDR=$(ZRELADDR) | 70 | $(obj)/uImage: LOADADDR=$(ZRELADDR) |
71 | endif | 71 | endif |
72 | 72 | ||
73 | ifeq ($(CONFIG_THUMB2_KERNEL),y) | ||
74 | # Set bit 0 to 1 so that "mov pc, rx" switches to Thumb-2 mode | ||
75 | $(obj)/uImage: STARTADDR=$(shell echo $(LOADADDR) | sed -e "s/.$$/1/") | ||
76 | else | ||
77 | $(obj)/uImage: STARTADDR=$(LOADADDR) | ||
78 | endif | ||
79 | |||
73 | $(obj)/uImage: $(obj)/zImage FORCE | 80 | $(obj)/uImage: $(obj)/zImage FORCE |
74 | $(call if_changed,uimage) | 81 | $(call if_changed,uimage) |
75 | @echo ' Image $@ is ready' | 82 | @echo ' Image $@ is ready' |
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 4515728c5345..fa6fbf45cf3b 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
@@ -140,7 +140,8 @@ start: | |||
140 | tst r2, #3 @ not user? | 140 | tst r2, #3 @ not user? |
141 | bne not_angel | 141 | bne not_angel |
142 | mov r0, #0x17 @ angel_SWIreason_EnterSVC | 142 | mov r0, #0x17 @ angel_SWIreason_EnterSVC |
143 | swi 0x123456 @ angel_SWI_ARM | 143 | ARM( swi 0x123456 ) @ angel_SWI_ARM |
144 | THUMB( svc 0xab ) @ angel_SWI_THUMB | ||
144 | not_angel: | 145 | not_angel: |
145 | mrs r2, cpsr @ turn off interrupts to | 146 | mrs r2, cpsr @ turn off interrupts to |
146 | orr r2, r2, #0xc0 @ prevent angel from running | 147 | orr r2, r2, #0xc0 @ prevent angel from running |
@@ -161,7 +162,9 @@ not_angel: | |||
161 | 162 | ||
162 | .text | 163 | .text |
163 | adr r0, LC0 | 164 | adr r0, LC0 |
164 | ldmia r0, {r1, r2, r3, r4, r5, r6, ip, sp} | 165 | ARM( ldmia r0, {r1, r2, r3, r4, r5, r6, ip, sp} ) |
166 | THUMB( ldmia r0, {r1, r2, r3, r4, r5, r6, ip} ) | ||
167 | THUMB( ldr sp, [r0, #28] ) | ||
165 | subs r0, r0, r1 @ calculate the delta offset | 168 | subs r0, r0, r1 @ calculate the delta offset |
166 | 169 | ||
167 | @ if delta is zero, we are | 170 | @ if delta is zero, we are |
@@ -263,22 +266,25 @@ not_relocated: mov r0, #0 | |||
263 | * r6 = processor ID | 266 | * r6 = processor ID |
264 | * r7 = architecture ID | 267 | * r7 = architecture ID |
265 | * r8 = atags pointer | 268 | * r8 = atags pointer |
266 | * r9-r14 = corrupted | 269 | * r9-r12,r14 = corrupted |
267 | */ | 270 | */ |
268 | add r1, r5, r0 @ end of decompressed kernel | 271 | add r1, r5, r0 @ end of decompressed kernel |
269 | adr r2, reloc_start | 272 | adr r2, reloc_start |
270 | ldr r3, LC1 | 273 | ldr r3, LC1 |
271 | add r3, r2, r3 | 274 | add r3, r2, r3 |
272 | 1: ldmia r2!, {r9 - r14} @ copy relocation code | 275 | 1: ldmia r2!, {r9 - r12, r14} @ copy relocation code |
273 | stmia r1!, {r9 - r14} | 276 | stmia r1!, {r9 - r12, r14} |
274 | ldmia r2!, {r9 - r14} | 277 | ldmia r2!, {r9 - r12, r14} |
275 | stmia r1!, {r9 - r14} | 278 | stmia r1!, {r9 - r12, r14} |
276 | cmp r2, r3 | 279 | cmp r2, r3 |
277 | blo 1b | 280 | blo 1b |
278 | add sp, r1, #128 @ relocate the stack | 281 | mov sp, r1 |
282 | add sp, sp, #128 @ relocate the stack | ||
279 | 283 | ||
280 | bl cache_clean_flush | 284 | bl cache_clean_flush |
281 | add pc, r5, r0 @ call relocation code | 285 | ARM( add pc, r5, r0 ) @ call relocation code |
286 | THUMB( add r12, r5, r0 ) | ||
287 | THUMB( mov pc, r12 ) @ call relocation code | ||
282 | 288 | ||
283 | /* | 289 | /* |
284 | * We're not in danger of overwriting ourselves. Do this the simple way. | 290 | * We're not in danger of overwriting ourselves. Do this the simple way. |
@@ -291,6 +297,7 @@ wont_overwrite: mov r0, r4 | |||
291 | bl decompress_kernel | 297 | bl decompress_kernel |
292 | b call_kernel | 298 | b call_kernel |
293 | 299 | ||
300 | .align 2 | ||
294 | .type LC0, #object | 301 | .type LC0, #object |
295 | LC0: .word LC0 @ r1 | 302 | LC0: .word LC0 @ r1 |
296 | .word __bss_start @ r2 | 303 | .word __bss_start @ r2 |
@@ -431,6 +438,7 @@ ENDPROC(__setup_mmu) | |||
431 | 438 | ||
432 | __armv4_mmu_cache_on: | 439 | __armv4_mmu_cache_on: |
433 | mov r12, lr | 440 | mov r12, lr |
441 | #ifdef CONFIG_MMU | ||
434 | bl __setup_mmu | 442 | bl __setup_mmu |
435 | mov r0, #0 | 443 | mov r0, #0 |
436 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | 444 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer |
@@ -444,10 +452,12 @@ __armv4_mmu_cache_on: | |||
444 | bl __common_mmu_cache_on | 452 | bl __common_mmu_cache_on |
445 | mov r0, #0 | 453 | mov r0, #0 |
446 | mcr p15, 0, r0, c8, c7, 0 @ flush I,D TLBs | 454 | mcr p15, 0, r0, c8, c7, 0 @ flush I,D TLBs |
455 | #endif | ||
447 | mov pc, r12 | 456 | mov pc, r12 |
448 | 457 | ||
449 | __armv7_mmu_cache_on: | 458 | __armv7_mmu_cache_on: |
450 | mov r12, lr | 459 | mov r12, lr |
460 | #ifdef CONFIG_MMU | ||
451 | mrc p15, 0, r11, c0, c1, 4 @ read ID_MMFR0 | 461 | mrc p15, 0, r11, c0, c1, 4 @ read ID_MMFR0 |
452 | tst r11, #0xf @ VMSA | 462 | tst r11, #0xf @ VMSA |
453 | blne __setup_mmu | 463 | blne __setup_mmu |
@@ -455,9 +465,11 @@ __armv7_mmu_cache_on: | |||
455 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | 465 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer |
456 | tst r11, #0xf @ VMSA | 466 | tst r11, #0xf @ VMSA |
457 | mcrne p15, 0, r0, c8, c7, 0 @ flush I,D TLBs | 467 | mcrne p15, 0, r0, c8, c7, 0 @ flush I,D TLBs |
468 | #endif | ||
458 | mrc p15, 0, r0, c1, c0, 0 @ read control reg | 469 | mrc p15, 0, r0, c1, c0, 0 @ read control reg |
459 | orr r0, r0, #0x5000 @ I-cache enable, RR cache replacement | 470 | orr r0, r0, #0x5000 @ I-cache enable, RR cache replacement |
460 | orr r0, r0, #0x003c @ write buffer | 471 | orr r0, r0, #0x003c @ write buffer |
472 | #ifdef CONFIG_MMU | ||
461 | #ifdef CONFIG_CPU_ENDIAN_BE8 | 473 | #ifdef CONFIG_CPU_ENDIAN_BE8 |
462 | orr r0, r0, #1 << 25 @ big-endian page tables | 474 | orr r0, r0, #1 << 25 @ big-endian page tables |
463 | #endif | 475 | #endif |
@@ -465,6 +477,7 @@ __armv7_mmu_cache_on: | |||
465 | movne r1, #-1 | 477 | movne r1, #-1 |
466 | mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer | 478 | mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer |
467 | mcrne p15, 0, r1, c3, c0, 0 @ load domain access control | 479 | mcrne p15, 0, r1, c3, c0, 0 @ load domain access control |
480 | #endif | ||
468 | mcr p15, 0, r0, c1, c0, 0 @ load control register | 481 | mcr p15, 0, r0, c1, c0, 0 @ load control register |
469 | mrc p15, 0, r0, c1, c0, 0 @ and read it back | 482 | mrc p15, 0, r0, c1, c0, 0 @ and read it back |
470 | mov r0, #0 | 483 | mov r0, #0 |
@@ -498,6 +511,7 @@ __arm6_mmu_cache_on: | |||
498 | mov pc, r12 | 511 | mov pc, r12 |
499 | 512 | ||
500 | __common_mmu_cache_on: | 513 | __common_mmu_cache_on: |
514 | #ifndef CONFIG_THUMB2_KERNEL | ||
501 | #ifndef DEBUG | 515 | #ifndef DEBUG |
502 | orr r0, r0, #0x000d @ Write buffer, mmu | 516 | orr r0, r0, #0x000d @ Write buffer, mmu |
503 | #endif | 517 | #endif |
@@ -509,6 +523,7 @@ __common_mmu_cache_on: | |||
509 | 1: mcr p15, 0, r0, c1, c0, 0 @ load control register | 523 | 1: mcr p15, 0, r0, c1, c0, 0 @ load control register |
510 | mrc p15, 0, r0, c1, c0, 0 @ and read it back to | 524 | mrc p15, 0, r0, c1, c0, 0 @ and read it back to |
511 | sub pc, lr, r0, lsr #32 @ properly flush pipeline | 525 | sub pc, lr, r0, lsr #32 @ properly flush pipeline |
526 | #endif | ||
512 | 527 | ||
513 | /* | 528 | /* |
514 | * All code following this line is relocatable. It is relocated by | 529 | * All code following this line is relocatable. It is relocated by |
@@ -522,7 +537,7 @@ __common_mmu_cache_on: | |||
522 | * r6 = processor ID | 537 | * r6 = processor ID |
523 | * r7 = architecture ID | 538 | * r7 = architecture ID |
524 | * r8 = atags pointer | 539 | * r8 = atags pointer |
525 | * r9-r14 = corrupted | 540 | * r9-r12,r14 = corrupted |
526 | */ | 541 | */ |
527 | .align 5 | 542 | .align 5 |
528 | reloc_start: add r9, r5, r0 | 543 | reloc_start: add r9, r5, r0 |
@@ -531,13 +546,14 @@ reloc_start: add r9, r5, r0 | |||
531 | mov r1, r4 | 546 | mov r1, r4 |
532 | 1: | 547 | 1: |
533 | .rept 4 | 548 | .rept 4 |
534 | ldmia r5!, {r0, r2, r3, r10 - r14} @ relocate kernel | 549 | ldmia r5!, {r0, r2, r3, r10 - r12, r14} @ relocate kernel |
535 | stmia r1!, {r0, r2, r3, r10 - r14} | 550 | stmia r1!, {r0, r2, r3, r10 - r12, r14} |
536 | .endr | 551 | .endr |
537 | 552 | ||
538 | cmp r5, r9 | 553 | cmp r5, r9 |
539 | blo 1b | 554 | blo 1b |
540 | add sp, r1, #128 @ relocate the stack | 555 | mov sp, r1 |
556 | add sp, sp, #128 @ relocate the stack | ||
541 | debug_reloc_end | 557 | debug_reloc_end |
542 | 558 | ||
543 | call_kernel: bl cache_clean_flush | 559 | call_kernel: bl cache_clean_flush |
@@ -571,7 +587,9 @@ call_cache_fn: adr r12, proc_types | |||
571 | ldr r2, [r12, #4] @ get mask | 587 | ldr r2, [r12, #4] @ get mask |
572 | eor r1, r1, r6 @ (real ^ match) | 588 | eor r1, r1, r6 @ (real ^ match) |
573 | tst r1, r2 @ & mask | 589 | tst r1, r2 @ & mask |
574 | addeq pc, r12, r3 @ call cache function | 590 | ARM( addeq pc, r12, r3 ) @ call cache function |
591 | THUMB( addeq r12, r3 ) | ||
592 | THUMB( moveq pc, r12 ) @ call cache function | ||
575 | add r12, r12, #4*5 | 593 | add r12, r12, #4*5 |
576 | b 1b | 594 | b 1b |
577 | 595 | ||
@@ -589,13 +607,15 @@ call_cache_fn: adr r12, proc_types | |||
589 | * methods. Writeback caches _must_ have the flush method | 607 | * methods. Writeback caches _must_ have the flush method |
590 | * defined. | 608 | * defined. |
591 | */ | 609 | */ |
610 | .align 2 | ||
592 | .type proc_types,#object | 611 | .type proc_types,#object |
593 | proc_types: | 612 | proc_types: |
594 | .word 0x41560600 @ ARM6/610 | 613 | .word 0x41560600 @ ARM6/610 |
595 | .word 0xffffffe0 | 614 | .word 0xffffffe0 |
596 | b __arm6_mmu_cache_off @ works, but slow | 615 | W(b) __arm6_mmu_cache_off @ works, but slow |
597 | b __arm6_mmu_cache_off | 616 | W(b) __arm6_mmu_cache_off |
598 | mov pc, lr | 617 | mov pc, lr |
618 | THUMB( nop ) | ||
599 | @ b __arm6_mmu_cache_on @ untested | 619 | @ b __arm6_mmu_cache_on @ untested |
600 | @ b __arm6_mmu_cache_off | 620 | @ b __arm6_mmu_cache_off |
601 | @ b __armv3_mmu_cache_flush | 621 | @ b __armv3_mmu_cache_flush |
@@ -603,76 +623,84 @@ proc_types: | |||
603 | .word 0x00000000 @ old ARM ID | 623 | .word 0x00000000 @ old ARM ID |
604 | .word 0x0000f000 | 624 | .word 0x0000f000 |
605 | mov pc, lr | 625 | mov pc, lr |
626 | THUMB( nop ) | ||
606 | mov pc, lr | 627 | mov pc, lr |
628 | THUMB( nop ) | ||
607 | mov pc, lr | 629 | mov pc, lr |
630 | THUMB( nop ) | ||
608 | 631 | ||
609 | .word 0x41007000 @ ARM7/710 | 632 | .word 0x41007000 @ ARM7/710 |
610 | .word 0xfff8fe00 | 633 | .word 0xfff8fe00 |
611 | b __arm7_mmu_cache_off | 634 | W(b) __arm7_mmu_cache_off |
612 | b __arm7_mmu_cache_off | 635 | W(b) __arm7_mmu_cache_off |
613 | mov pc, lr | 636 | mov pc, lr |
637 | THUMB( nop ) | ||
614 | 638 | ||
615 | .word 0x41807200 @ ARM720T (writethrough) | 639 | .word 0x41807200 @ ARM720T (writethrough) |
616 | .word 0xffffff00 | 640 | .word 0xffffff00 |
617 | b __armv4_mmu_cache_on | 641 | W(b) __armv4_mmu_cache_on |
618 | b __armv4_mmu_cache_off | 642 | W(b) __armv4_mmu_cache_off |
619 | mov pc, lr | 643 | mov pc, lr |
644 | THUMB( nop ) | ||
620 | 645 | ||
621 | .word 0x41007400 @ ARM74x | 646 | .word 0x41007400 @ ARM74x |
622 | .word 0xff00ff00 | 647 | .word 0xff00ff00 |
623 | b __armv3_mpu_cache_on | 648 | W(b) __armv3_mpu_cache_on |
624 | b __armv3_mpu_cache_off | 649 | W(b) __armv3_mpu_cache_off |
625 | b __armv3_mpu_cache_flush | 650 | W(b) __armv3_mpu_cache_flush |
626 | 651 | ||
627 | .word 0x41009400 @ ARM94x | 652 | .word 0x41009400 @ ARM94x |
628 | .word 0xff00ff00 | 653 | .word 0xff00ff00 |
629 | b __armv4_mpu_cache_on | 654 | W(b) __armv4_mpu_cache_on |
630 | b __armv4_mpu_cache_off | 655 | W(b) __armv4_mpu_cache_off |
631 | b __armv4_mpu_cache_flush | 656 | W(b) __armv4_mpu_cache_flush |
632 | 657 | ||
633 | .word 0x00007000 @ ARM7 IDs | 658 | .word 0x00007000 @ ARM7 IDs |
634 | .word 0x0000f000 | 659 | .word 0x0000f000 |
635 | mov pc, lr | 660 | mov pc, lr |
661 | THUMB( nop ) | ||
636 | mov pc, lr | 662 | mov pc, lr |
663 | THUMB( nop ) | ||
637 | mov pc, lr | 664 | mov pc, lr |
665 | THUMB( nop ) | ||
638 | 666 | ||
639 | @ Everything from here on will be the new ID system. | 667 | @ Everything from here on will be the new ID system. |
640 | 668 | ||
641 | .word 0x4401a100 @ sa110 / sa1100 | 669 | .word 0x4401a100 @ sa110 / sa1100 |
642 | .word 0xffffffe0 | 670 | .word 0xffffffe0 |
643 | b __armv4_mmu_cache_on | 671 | W(b) __armv4_mmu_cache_on |
644 | b __armv4_mmu_cache_off | 672 | W(b) __armv4_mmu_cache_off |
645 | b __armv4_mmu_cache_flush | 673 | W(b) __armv4_mmu_cache_flush |
646 | 674 | ||
647 | .word 0x6901b110 @ sa1110 | 675 | .word 0x6901b110 @ sa1110 |
648 | .word 0xfffffff0 | 676 | .word 0xfffffff0 |
649 | b __armv4_mmu_cache_on | 677 | W(b) __armv4_mmu_cache_on |
650 | b __armv4_mmu_cache_off | 678 | W(b) __armv4_mmu_cache_off |
651 | b __armv4_mmu_cache_flush | 679 | W(b) __armv4_mmu_cache_flush |
652 | 680 | ||
653 | .word 0x56056930 | 681 | .word 0x56056930 |
654 | .word 0xff0ffff0 @ PXA935 | 682 | .word 0xff0ffff0 @ PXA935 |
655 | b __armv4_mmu_cache_on | 683 | W(b) __armv4_mmu_cache_on |
656 | b __armv4_mmu_cache_off | 684 | W(b) __armv4_mmu_cache_off |
657 | b __armv4_mmu_cache_flush | 685 | W(b) __armv4_mmu_cache_flush |
658 | 686 | ||
659 | .word 0x56158000 @ PXA168 | 687 | .word 0x56158000 @ PXA168 |
660 | .word 0xfffff000 | 688 | .word 0xfffff000 |
661 | b __armv4_mmu_cache_on | 689 | W(b) __armv4_mmu_cache_on |
662 | b __armv4_mmu_cache_off | 690 | W(b) __armv4_mmu_cache_off |
663 | b __armv5tej_mmu_cache_flush | 691 | W(b) __armv5tej_mmu_cache_flush |
664 | 692 | ||
665 | .word 0x56056930 | 693 | .word 0x56056930 |
666 | .word 0xff0ffff0 @ PXA935 | 694 | .word 0xff0ffff0 @ PXA935 |
667 | b __armv4_mmu_cache_on | 695 | W(b) __armv4_mmu_cache_on |
668 | b __armv4_mmu_cache_off | 696 | W(b) __armv4_mmu_cache_off |
669 | b __armv4_mmu_cache_flush | 697 | W(b) __armv4_mmu_cache_flush |
670 | 698 | ||
671 | .word 0x56050000 @ Feroceon | 699 | .word 0x56050000 @ Feroceon |
672 | .word 0xff0f0000 | 700 | .word 0xff0f0000 |
673 | b __armv4_mmu_cache_on | 701 | W(b) __armv4_mmu_cache_on |
674 | b __armv4_mmu_cache_off | 702 | W(b) __armv4_mmu_cache_off |
675 | b __armv5tej_mmu_cache_flush | 703 | W(b) __armv5tej_mmu_cache_flush |
676 | 704 | ||
677 | #ifdef CONFIG_CPU_FEROCEON_OLD_ID | 705 | #ifdef CONFIG_CPU_FEROCEON_OLD_ID |
678 | /* this conflicts with the standard ARMv5TE entry */ | 706 | /* this conflicts with the standard ARMv5TE entry */ |
@@ -685,47 +713,50 @@ proc_types: | |||
685 | 713 | ||
686 | .word 0x66015261 @ FA526 | 714 | .word 0x66015261 @ FA526 |
687 | .word 0xff01fff1 | 715 | .word 0xff01fff1 |
688 | b __fa526_cache_on | 716 | W(b) __fa526_cache_on |
689 | b __armv4_mmu_cache_off | 717 | W(b) __armv4_mmu_cache_off |
690 | b __fa526_cache_flush | 718 | W(b) __fa526_cache_flush |
691 | 719 | ||
692 | @ These match on the architecture ID | 720 | @ These match on the architecture ID |
693 | 721 | ||
694 | .word 0x00020000 @ ARMv4T | 722 | .word 0x00020000 @ ARMv4T |
695 | .word 0x000f0000 | 723 | .word 0x000f0000 |
696 | b __armv4_mmu_cache_on | 724 | W(b) __armv4_mmu_cache_on |
697 | b __armv4_mmu_cache_off | 725 | W(b) __armv4_mmu_cache_off |
698 | b __armv4_mmu_cache_flush | 726 | W(b) __armv4_mmu_cache_flush |
699 | 727 | ||
700 | .word 0x00050000 @ ARMv5TE | 728 | .word 0x00050000 @ ARMv5TE |
701 | .word 0x000f0000 | 729 | .word 0x000f0000 |
702 | b __armv4_mmu_cache_on | 730 | W(b) __armv4_mmu_cache_on |
703 | b __armv4_mmu_cache_off | 731 | W(b) __armv4_mmu_cache_off |
704 | b __armv4_mmu_cache_flush | 732 | W(b) __armv4_mmu_cache_flush |
705 | 733 | ||
706 | .word 0x00060000 @ ARMv5TEJ | 734 | .word 0x00060000 @ ARMv5TEJ |
707 | .word 0x000f0000 | 735 | .word 0x000f0000 |
708 | b __armv4_mmu_cache_on | 736 | W(b) __armv4_mmu_cache_on |
709 | b __armv4_mmu_cache_off | 737 | W(b) __armv4_mmu_cache_off |
710 | b __armv5tej_mmu_cache_flush | 738 | W(b) __armv4_mmu_cache_flush |
711 | 739 | ||
712 | .word 0x0007b000 @ ARMv6 | 740 | .word 0x0007b000 @ ARMv6 |
713 | .word 0x000ff000 | 741 | .word 0x000ff000 |
714 | b __armv4_mmu_cache_on | 742 | W(b) __armv4_mmu_cache_on |
715 | b __armv4_mmu_cache_off | 743 | W(b) __armv4_mmu_cache_off |
716 | b __armv6_mmu_cache_flush | 744 | W(b) __armv6_mmu_cache_flush |
717 | 745 | ||
718 | .word 0x000f0000 @ new CPU Id | 746 | .word 0x000f0000 @ new CPU Id |
719 | .word 0x000f0000 | 747 | .word 0x000f0000 |
720 | b __armv7_mmu_cache_on | 748 | W(b) __armv7_mmu_cache_on |
721 | b __armv7_mmu_cache_off | 749 | W(b) __armv7_mmu_cache_off |
722 | b __armv7_mmu_cache_flush | 750 | W(b) __armv7_mmu_cache_flush |
723 | 751 | ||
724 | .word 0 @ unrecognised type | 752 | .word 0 @ unrecognised type |
725 | .word 0 | 753 | .word 0 |
726 | mov pc, lr | 754 | mov pc, lr |
755 | THUMB( nop ) | ||
727 | mov pc, lr | 756 | mov pc, lr |
757 | THUMB( nop ) | ||
728 | mov pc, lr | 758 | mov pc, lr |
759 | THUMB( nop ) | ||
729 | 760 | ||
730 | .size proc_types, . - proc_types | 761 | .size proc_types, . - proc_types |
731 | 762 | ||
@@ -760,22 +791,30 @@ __armv3_mpu_cache_off: | |||
760 | mov pc, lr | 791 | mov pc, lr |
761 | 792 | ||
762 | __armv4_mmu_cache_off: | 793 | __armv4_mmu_cache_off: |
794 | #ifdef CONFIG_MMU | ||
763 | mrc p15, 0, r0, c1, c0 | 795 | mrc p15, 0, r0, c1, c0 |
764 | bic r0, r0, #0x000d | 796 | bic r0, r0, #0x000d |
765 | mcr p15, 0, r0, c1, c0 @ turn MMU and cache off | 797 | mcr p15, 0, r0, c1, c0 @ turn MMU and cache off |
766 | mov r0, #0 | 798 | mov r0, #0 |
767 | mcr p15, 0, r0, c7, c7 @ invalidate whole cache v4 | 799 | mcr p15, 0, r0, c7, c7 @ invalidate whole cache v4 |
768 | mcr p15, 0, r0, c8, c7 @ invalidate whole TLB v4 | 800 | mcr p15, 0, r0, c8, c7 @ invalidate whole TLB v4 |
801 | #endif | ||
769 | mov pc, lr | 802 | mov pc, lr |
770 | 803 | ||
771 | __armv7_mmu_cache_off: | 804 | __armv7_mmu_cache_off: |
772 | mrc p15, 0, r0, c1, c0 | 805 | mrc p15, 0, r0, c1, c0 |
806 | #ifdef CONFIG_MMU | ||
773 | bic r0, r0, #0x000d | 807 | bic r0, r0, #0x000d |
808 | #else | ||
809 | bic r0, r0, #0x000c | ||
810 | #endif | ||
774 | mcr p15, 0, r0, c1, c0 @ turn MMU and cache off | 811 | mcr p15, 0, r0, c1, c0 @ turn MMU and cache off |
775 | mov r12, lr | 812 | mov r12, lr |
776 | bl __armv7_mmu_cache_flush | 813 | bl __armv7_mmu_cache_flush |
777 | mov r0, #0 | 814 | mov r0, #0 |
815 | #ifdef CONFIG_MMU | ||
778 | mcr p15, 0, r0, c8, c7, 0 @ invalidate whole TLB | 816 | mcr p15, 0, r0, c8, c7, 0 @ invalidate whole TLB |
817 | #endif | ||
779 | mcr p15, 0, r0, c7, c5, 6 @ invalidate BTC | 818 | mcr p15, 0, r0, c7, c5, 6 @ invalidate BTC |
780 | mcr p15, 0, r0, c7, c10, 4 @ DSB | 819 | mcr p15, 0, r0, c7, c10, 4 @ DSB |
781 | mcr p15, 0, r0, c7, c5, 4 @ ISB | 820 | mcr p15, 0, r0, c7, c5, 4 @ ISB |
@@ -852,7 +891,7 @@ __armv7_mmu_cache_flush: | |||
852 | b iflush | 891 | b iflush |
853 | hierarchical: | 892 | hierarchical: |
854 | mcr p15, 0, r10, c7, c10, 5 @ DMB | 893 | mcr p15, 0, r10, c7, c10, 5 @ DMB |
855 | stmfd sp!, {r0-r5, r7, r9, r11} | 894 | stmfd sp!, {r0-r7, r9-r11} |
856 | mrc p15, 1, r0, c0, c0, 1 @ read clidr | 895 | mrc p15, 1, r0, c0, c0, 1 @ read clidr |
857 | ands r3, r0, #0x7000000 @ extract loc from clidr | 896 | ands r3, r0, #0x7000000 @ extract loc from clidr |
858 | mov r3, r3, lsr #23 @ left align loc bit field | 897 | mov r3, r3, lsr #23 @ left align loc bit field |
@@ -877,8 +916,12 @@ loop1: | |||
877 | loop2: | 916 | loop2: |
878 | mov r9, r4 @ create working copy of max way size | 917 | mov r9, r4 @ create working copy of max way size |
879 | loop3: | 918 | loop3: |
880 | orr r11, r10, r9, lsl r5 @ factor way and cache number into r11 | 919 | ARM( orr r11, r10, r9, lsl r5 ) @ factor way and cache number into r11 |
881 | orr r11, r11, r7, lsl r2 @ factor index number into r11 | 920 | ARM( orr r11, r11, r7, lsl r2 ) @ factor index number into r11 |
921 | THUMB( lsl r6, r9, r5 ) | ||
922 | THUMB( orr r11, r10, r6 ) @ factor way and cache number into r11 | ||
923 | THUMB( lsl r6, r7, r2 ) | ||
924 | THUMB( orr r11, r11, r6 ) @ factor index number into r11 | ||
882 | mcr p15, 0, r11, c7, c14, 2 @ clean & invalidate by set/way | 925 | mcr p15, 0, r11, c7, c14, 2 @ clean & invalidate by set/way |
883 | subs r9, r9, #1 @ decrement the way | 926 | subs r9, r9, #1 @ decrement the way |
884 | bge loop3 | 927 | bge loop3 |
@@ -889,7 +932,7 @@ skip: | |||
889 | cmp r3, r10 | 932 | cmp r3, r10 |
890 | bgt loop1 | 933 | bgt loop1 |
891 | finished: | 934 | finished: |
892 | ldmfd sp!, {r0-r5, r7, r9, r11} | 935 | ldmfd sp!, {r0-r7, r9-r11} |
893 | mov r10, #0 @ swith back to cache level 0 | 936 | mov r10, #0 @ swith back to cache level 0 |
894 | mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr | 937 | mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr |
895 | iflush: | 938 | iflush: |
@@ -923,9 +966,13 @@ __armv4_mmu_cache_flush: | |||
923 | mov r11, #8 | 966 | mov r11, #8 |
924 | mov r11, r11, lsl r3 @ cache line size in bytes | 967 | mov r11, r11, lsl r3 @ cache line size in bytes |
925 | no_cache_id: | 968 | no_cache_id: |
926 | bic r1, pc, #63 @ align to longest cache line | 969 | mov r1, pc |
970 | bic r1, r1, #63 @ align to longest cache line | ||
927 | add r2, r1, r2 | 971 | add r2, r1, r2 |
928 | 1: ldr r3, [r1], r11 @ s/w flush D cache | 972 | 1: |
973 | ARM( ldr r3, [r1], r11 ) @ s/w flush D cache | ||
974 | THUMB( ldr r3, [r1] ) @ s/w flush D cache | ||
975 | THUMB( add r1, r1, r11 ) | ||
929 | teq r1, r2 | 976 | teq r1, r2 |
930 | bne 1b | 977 | bne 1b |
931 | 978 | ||
@@ -945,6 +992,7 @@ __armv3_mpu_cache_flush: | |||
945 | * memory, which again must be relocatable. | 992 | * memory, which again must be relocatable. |
946 | */ | 993 | */ |
947 | #ifdef DEBUG | 994 | #ifdef DEBUG |
995 | .align 2 | ||
948 | .type phexbuf,#object | 996 | .type phexbuf,#object |
949 | phexbuf: .space 12 | 997 | phexbuf: .space 12 |
950 | .size phexbuf, . - phexbuf | 998 | .size phexbuf, . - phexbuf |
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 44912cd5da13..00f46d9ce299 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
@@ -166,3 +166,87 @@ | |||
166 | #endif | 166 | #endif |
167 | #endif | 167 | #endif |
168 | .endm | 168 | .endm |
169 | |||
170 | #ifdef CONFIG_THUMB2_KERNEL | ||
171 | .macro setmode, mode, reg | ||
172 | mov \reg, #\mode | ||
173 | msr cpsr_c, \reg | ||
174 | .endm | ||
175 | #else | ||
176 | .macro setmode, mode, reg | ||
177 | msr cpsr_c, #\mode | ||
178 | .endm | ||
179 | #endif | ||
180 | |||
181 | /* | ||
182 | * STRT/LDRT access macros with ARM and Thumb-2 variants | ||
183 | */ | ||
184 | #ifdef CONFIG_THUMB2_KERNEL | ||
185 | |||
186 | .macro usraccoff, instr, reg, ptr, inc, off, cond, abort | ||
187 | 9999: | ||
188 | .if \inc == 1 | ||
189 | \instr\cond\()bt \reg, [\ptr, #\off] | ||
190 | .elseif \inc == 4 | ||
191 | \instr\cond\()t \reg, [\ptr, #\off] | ||
192 | .else | ||
193 | .error "Unsupported inc macro argument" | ||
194 | .endif | ||
195 | |||
196 | .section __ex_table,"a" | ||
197 | .align 3 | ||
198 | .long 9999b, \abort | ||
199 | .previous | ||
200 | .endm | ||
201 | |||
202 | .macro usracc, instr, reg, ptr, inc, cond, rept, abort | ||
203 | @ explicit IT instruction needed because of the label | ||
204 | @ introduced by the USER macro | ||
205 | .ifnc \cond,al | ||
206 | .if \rept == 1 | ||
207 | itt \cond | ||
208 | .elseif \rept == 2 | ||
209 | ittt \cond | ||
210 | .else | ||
211 | .error "Unsupported rept macro argument" | ||
212 | .endif | ||
213 | .endif | ||
214 | |||
215 | @ Slightly optimised to avoid incrementing the pointer twice | ||
216 | usraccoff \instr, \reg, \ptr, \inc, 0, \cond, \abort | ||
217 | .if \rept == 2 | ||
218 | usraccoff \instr, \reg, \ptr, \inc, 4, \cond, \abort | ||
219 | .endif | ||
220 | |||
221 | add\cond \ptr, #\rept * \inc | ||
222 | .endm | ||
223 | |||
224 | #else /* !CONFIG_THUMB2_KERNEL */ | ||
225 | |||
226 | .macro usracc, instr, reg, ptr, inc, cond, rept, abort | ||
227 | .rept \rept | ||
228 | 9999: | ||
229 | .if \inc == 1 | ||
230 | \instr\cond\()bt \reg, [\ptr], #\inc | ||
231 | .elseif \inc == 4 | ||
232 | \instr\cond\()t \reg, [\ptr], #\inc | ||
233 | .else | ||
234 | .error "Unsupported inc macro argument" | ||
235 | .endif | ||
236 | |||
237 | .section __ex_table,"a" | ||
238 | .align 3 | ||
239 | .long 9999b, \abort | ||
240 | .previous | ||
241 | .endr | ||
242 | .endm | ||
243 | |||
244 | #endif /* CONFIG_THUMB2_KERNEL */ | ||
245 | |||
246 | .macro strusr, reg, ptr, inc, cond=al, rept=1, abort=9001f | ||
247 | usracc str, \reg, \ptr, \inc, \cond, \rept, \abort | ||
248 | .endm | ||
249 | |||
250 | .macro ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f | ||
251 | usracc ldr, \reg, \ptr, \inc, \cond, \rept, \abort | ||
252 | .endm | ||
diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h index c207504de84d..c3b911ee9151 100644 --- a/arch/arm/include/asm/elf.h +++ b/arch/arm/include/asm/elf.h | |||
@@ -55,6 +55,9 @@ typedef struct user_fp elf_fpregset_t; | |||
55 | #define R_ARM_MOVW_ABS_NC 43 | 55 | #define R_ARM_MOVW_ABS_NC 43 |
56 | #define R_ARM_MOVT_ABS 44 | 56 | #define R_ARM_MOVT_ABS 44 |
57 | 57 | ||
58 | #define R_ARM_THM_CALL 10 | ||
59 | #define R_ARM_THM_JUMP24 30 | ||
60 | |||
58 | /* | 61 | /* |
59 | * These are used to set parameters in the core dumps. | 62 | * These are used to set parameters in the core dumps. |
60 | */ | 63 | */ |
diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h index 9ee743b95de8..bfcc15929a7f 100644 --- a/arch/arm/include/asm/futex.h +++ b/arch/arm/include/asm/futex.h | |||
@@ -99,6 +99,7 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | |||
99 | __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" | 99 | __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" |
100 | "1: ldrt %0, [%3]\n" | 100 | "1: ldrt %0, [%3]\n" |
101 | " teq %0, %1\n" | 101 | " teq %0, %1\n" |
102 | " it eq @ explicit IT needed for the 2b label\n" | ||
102 | "2: streqt %2, [%3]\n" | 103 | "2: streqt %2, [%3]\n" |
103 | "3:\n" | 104 | "3:\n" |
104 | " .section __ex_table,\"a\"\n" | 105 | " .section __ex_table,\"a\"\n" |
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 85763db87449..376be1a62866 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
@@ -44,7 +44,13 @@ | |||
44 | * The module space lives between the addresses given by TASK_SIZE | 44 | * The module space lives between the addresses given by TASK_SIZE |
45 | * and PAGE_OFFSET - it must be within 32MB of the kernel text. | 45 | * and PAGE_OFFSET - it must be within 32MB of the kernel text. |
46 | */ | 46 | */ |
47 | #ifndef CONFIG_THUMB2_KERNEL | ||
47 | #define MODULES_VADDR (PAGE_OFFSET - 16*1024*1024) | 48 | #define MODULES_VADDR (PAGE_OFFSET - 16*1024*1024) |
49 | #else | ||
50 | /* smaller range for Thumb-2 symbols relocation (2^24)*/ | ||
51 | #define MODULES_VADDR (PAGE_OFFSET - 8*1024*1024) | ||
52 | #endif | ||
53 | |||
48 | #if TASK_SIZE > MODULES_VADDR | 54 | #if TASK_SIZE > MODULES_VADDR |
49 | #error Top of user space clashes with start of module space | 55 | #error Top of user space clashes with start of module space |
50 | #endif | 56 | #endif |
diff --git a/arch/arm/include/asm/mmu_context.h b/arch/arm/include/asm/mmu_context.h index 263fed05ea33..bcdb9291ef0c 100644 --- a/arch/arm/include/asm/mmu_context.h +++ b/arch/arm/include/asm/mmu_context.h | |||
@@ -62,8 +62,10 @@ static inline void check_context(struct mm_struct *mm) | |||
62 | 62 | ||
63 | static inline void check_context(struct mm_struct *mm) | 63 | static inline void check_context(struct mm_struct *mm) |
64 | { | 64 | { |
65 | #ifdef CONFIG_MMU | ||
65 | if (unlikely(mm->context.kvm_seq != init_mm.context.kvm_seq)) | 66 | if (unlikely(mm->context.kvm_seq != init_mm.context.kvm_seq)) |
66 | __check_kvm_seq(mm); | 67 | __check_kvm_seq(mm); |
68 | #endif | ||
67 | } | 69 | } |
68 | 70 | ||
69 | #define init_new_context(tsk,mm) 0 | 71 | #define init_new_context(tsk,mm) 0 |
diff --git a/arch/arm/include/asm/page-nommu.h b/arch/arm/include/asm/page-nommu.h index 3574c0deb37f..d1b162a18dcb 100644 --- a/arch/arm/include/asm/page-nommu.h +++ b/arch/arm/include/asm/page-nommu.h | |||
@@ -43,7 +43,4 @@ typedef unsigned long pgprot_t; | |||
43 | #define __pmd(x) (x) | 43 | #define __pmd(x) (x) |
44 | #define __pgprot(x) (x) | 44 | #define __pgprot(x) (x) |
45 | 45 | ||
46 | extern unsigned long memory_start; | ||
47 | extern unsigned long memory_end; | ||
48 | |||
49 | #endif | 46 | #endif |
diff --git a/arch/arm/include/asm/ptrace.h b/arch/arm/include/asm/ptrace.h index 67b833c9b6b9..bbecccda76d0 100644 --- a/arch/arm/include/asm/ptrace.h +++ b/arch/arm/include/asm/ptrace.h | |||
@@ -82,6 +82,14 @@ | |||
82 | #define PSR_ENDSTATE 0 | 82 | #define PSR_ENDSTATE 0 |
83 | #endif | 83 | #endif |
84 | 84 | ||
85 | /* | ||
86 | * These are 'magic' values for PTRACE_PEEKUSR that return info about where a | ||
87 | * process is located in memory. | ||
88 | */ | ||
89 | #define PT_TEXT_ADDR 0x10000 | ||
90 | #define PT_DATA_ADDR 0x10004 | ||
91 | #define PT_TEXT_END_ADDR 0x10008 | ||
92 | |||
85 | #ifndef __ASSEMBLY__ | 93 | #ifndef __ASSEMBLY__ |
86 | 94 | ||
87 | /* | 95 | /* |
diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h index 0da9bc9b3b1d..1d6bd40a4322 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <asm/memory.h> | 17 | #include <asm/memory.h> |
18 | #include <asm/domain.h> | 18 | #include <asm/domain.h> |
19 | #include <asm/system.h> | 19 | #include <asm/system.h> |
20 | #include <asm/unified.h> | ||
20 | 21 | ||
21 | #define VERIFY_READ 0 | 22 | #define VERIFY_READ 0 |
22 | #define VERIFY_WRITE 1 | 23 | #define VERIFY_WRITE 1 |
@@ -365,8 +366,10 @@ do { \ | |||
365 | 366 | ||
366 | #define __put_user_asm_dword(x,__pu_addr,err) \ | 367 | #define __put_user_asm_dword(x,__pu_addr,err) \ |
367 | __asm__ __volatile__( \ | 368 | __asm__ __volatile__( \ |
368 | "1: strt " __reg_oper1 ", [%1], #4\n" \ | 369 | ARM( "1: strt " __reg_oper1 ", [%1], #4\n" ) \ |
369 | "2: strt " __reg_oper0 ", [%1]\n" \ | 370 | ARM( "2: strt " __reg_oper0 ", [%1]\n" ) \ |
371 | THUMB( "1: strt " __reg_oper1 ", [%1]\n" ) \ | ||
372 | THUMB( "2: strt " __reg_oper0 ", [%1, #4]\n" ) \ | ||
370 | "3:\n" \ | 373 | "3:\n" \ |
371 | " .section .fixup,\"ax\"\n" \ | 374 | " .section .fixup,\"ax\"\n" \ |
372 | " .align 2\n" \ | 375 | " .align 2\n" \ |
diff --git a/arch/arm/include/asm/unified.h b/arch/arm/include/asm/unified.h new file mode 100644 index 000000000000..073e85b9b961 --- /dev/null +++ b/arch/arm/include/asm/unified.h | |||
@@ -0,0 +1,126 @@ | |||
1 | /* | ||
2 | * include/asm-arm/unified.h - Unified Assembler Syntax helper macros | ||
3 | * | ||
4 | * Copyright (C) 2008 ARM Limited | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | */ | ||
19 | |||
20 | #ifndef __ASM_UNIFIED_H | ||
21 | #define __ASM_UNIFIED_H | ||
22 | |||
23 | #if defined(__ASSEMBLY__) && defined(CONFIG_ARM_ASM_UNIFIED) | ||
24 | .syntax unified | ||
25 | #endif | ||
26 | |||
27 | #ifdef CONFIG_THUMB2_KERNEL | ||
28 | |||
29 | #if __GNUC__ < 4 | ||
30 | #error Thumb-2 kernel requires gcc >= 4 | ||
31 | #endif | ||
32 | |||
33 | /* The CPSR bit describing the instruction set (Thumb) */ | ||
34 | #define PSR_ISETSTATE PSR_T_BIT | ||
35 | |||
36 | #define ARM(x...) | ||
37 | #define THUMB(x...) x | ||
38 | #define W(instr) instr.w | ||
39 | #define BSYM(sym) sym + 1 | ||
40 | |||
41 | #else /* !CONFIG_THUMB2_KERNEL */ | ||
42 | |||
43 | /* The CPSR bit describing the instruction set (ARM) */ | ||
44 | #define PSR_ISETSTATE 0 | ||
45 | |||
46 | #define ARM(x...) x | ||
47 | #define THUMB(x...) | ||
48 | #define W(instr) instr | ||
49 | #define BSYM(sym) sym | ||
50 | |||
51 | #endif /* CONFIG_THUMB2_KERNEL */ | ||
52 | |||
53 | #ifndef CONFIG_ARM_ASM_UNIFIED | ||
54 | |||
55 | /* | ||
56 | * If the unified assembly syntax isn't used (in ARM mode), these | ||
57 | * macros expand to an empty string | ||
58 | */ | ||
59 | #ifdef __ASSEMBLY__ | ||
60 | .macro it, cond | ||
61 | .endm | ||
62 | .macro itt, cond | ||
63 | .endm | ||
64 | .macro ite, cond | ||
65 | .endm | ||
66 | .macro ittt, cond | ||
67 | .endm | ||
68 | .macro itte, cond | ||
69 | .endm | ||
70 | .macro itet, cond | ||
71 | .endm | ||
72 | .macro itee, cond | ||
73 | .endm | ||
74 | .macro itttt, cond | ||
75 | .endm | ||
76 | .macro ittte, cond | ||
77 | .endm | ||
78 | .macro ittet, cond | ||
79 | .endm | ||
80 | .macro ittee, cond | ||
81 | .endm | ||
82 | .macro itett, cond | ||
83 | .endm | ||
84 | .macro itete, cond | ||
85 | .endm | ||
86 | .macro iteet, cond | ||
87 | .endm | ||
88 | .macro iteee, cond | ||
89 | .endm | ||
90 | #else /* !__ASSEMBLY__ */ | ||
91 | __asm__( | ||
92 | " .macro it, cond\n" | ||
93 | " .endm\n" | ||
94 | " .macro itt, cond\n" | ||
95 | " .endm\n" | ||
96 | " .macro ite, cond\n" | ||
97 | " .endm\n" | ||
98 | " .macro ittt, cond\n" | ||
99 | " .endm\n" | ||
100 | " .macro itte, cond\n" | ||
101 | " .endm\n" | ||
102 | " .macro itet, cond\n" | ||
103 | " .endm\n" | ||
104 | " .macro itee, cond\n" | ||
105 | " .endm\n" | ||
106 | " .macro itttt, cond\n" | ||
107 | " .endm\n" | ||
108 | " .macro ittte, cond\n" | ||
109 | " .endm\n" | ||
110 | " .macro ittet, cond\n" | ||
111 | " .endm\n" | ||
112 | " .macro ittee, cond\n" | ||
113 | " .endm\n" | ||
114 | " .macro itett, cond\n" | ||
115 | " .endm\n" | ||
116 | " .macro itete, cond\n" | ||
117 | " .endm\n" | ||
118 | " .macro iteet, cond\n" | ||
119 | " .endm\n" | ||
120 | " .macro iteee, cond\n" | ||
121 | " .endm\n"); | ||
122 | #endif /* __ASSEMBLY__ */ | ||
123 | |||
124 | #endif /* CONFIG_ARM_ASM_UNIFIED */ | ||
125 | |||
126 | #endif /* !__ASM_UNIFIED_H */ | ||
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 792abd0dfae1..3d727a8a23bc 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -34,7 +34,7 @@ | |||
34 | @ | 34 | @ |
35 | @ routine called with r0 = irq number, r1 = struct pt_regs * | 35 | @ routine called with r0 = irq number, r1 = struct pt_regs * |
36 | @ | 36 | @ |
37 | adrne lr, 1b | 37 | adrne lr, BSYM(1b) |
38 | bne asm_do_IRQ | 38 | bne asm_do_IRQ |
39 | 39 | ||
40 | #ifdef CONFIG_SMP | 40 | #ifdef CONFIG_SMP |
@@ -46,13 +46,13 @@ | |||
46 | */ | 46 | */ |
47 | test_for_ipi r0, r6, r5, lr | 47 | test_for_ipi r0, r6, r5, lr |
48 | movne r0, sp | 48 | movne r0, sp |
49 | adrne lr, 1b | 49 | adrne lr, BSYM(1b) |
50 | bne do_IPI | 50 | bne do_IPI |
51 | 51 | ||
52 | #ifdef CONFIG_LOCAL_TIMERS | 52 | #ifdef CONFIG_LOCAL_TIMERS |
53 | test_for_ltirq r0, r6, r5, lr | 53 | test_for_ltirq r0, r6, r5, lr |
54 | movne r0, sp | 54 | movne r0, sp |
55 | adrne lr, 1b | 55 | adrne lr, BSYM(1b) |
56 | bne do_local_timer | 56 | bne do_local_timer |
57 | #endif | 57 | #endif |
58 | #endif | 58 | #endif |
@@ -70,7 +70,10 @@ | |||
70 | */ | 70 | */ |
71 | .macro inv_entry, reason | 71 | .macro inv_entry, reason |
72 | sub sp, sp, #S_FRAME_SIZE | 72 | sub sp, sp, #S_FRAME_SIZE |
73 | stmib sp, {r1 - lr} | 73 | ARM( stmib sp, {r1 - lr} ) |
74 | THUMB( stmia sp, {r0 - r12} ) | ||
75 | THUMB( str sp, [sp, #S_SP] ) | ||
76 | THUMB( str lr, [sp, #S_LR] ) | ||
74 | mov r1, #\reason | 77 | mov r1, #\reason |
75 | .endm | 78 | .endm |
76 | 79 | ||
@@ -126,17 +129,24 @@ ENDPROC(__und_invalid) | |||
126 | .macro svc_entry, stack_hole=0 | 129 | .macro svc_entry, stack_hole=0 |
127 | UNWIND(.fnstart ) | 130 | UNWIND(.fnstart ) |
128 | UNWIND(.save {r0 - pc} ) | 131 | UNWIND(.save {r0 - pc} ) |
129 | sub sp, sp, #(S_FRAME_SIZE + \stack_hole) | 132 | sub sp, sp, #(S_FRAME_SIZE + \stack_hole - 4) |
133 | #ifdef CONFIG_THUMB2_KERNEL | ||
134 | SPFIX( str r0, [sp] ) @ temporarily saved | ||
135 | SPFIX( mov r0, sp ) | ||
136 | SPFIX( tst r0, #4 ) @ test original stack alignment | ||
137 | SPFIX( ldr r0, [sp] ) @ restored | ||
138 | #else | ||
130 | SPFIX( tst sp, #4 ) | 139 | SPFIX( tst sp, #4 ) |
131 | SPFIX( bicne sp, sp, #4 ) | 140 | #endif |
132 | stmib sp, {r1 - r12} | 141 | SPFIX( subeq sp, sp, #4 ) |
142 | stmia sp, {r1 - r12} | ||
133 | 143 | ||
134 | ldmia r0, {r1 - r3} | 144 | ldmia r0, {r1 - r3} |
135 | add r5, sp, #S_SP @ here for interlock avoidance | 145 | add r5, sp, #S_SP - 4 @ here for interlock avoidance |
136 | mov r4, #-1 @ "" "" "" "" | 146 | mov r4, #-1 @ "" "" "" "" |
137 | add r0, sp, #(S_FRAME_SIZE + \stack_hole) | 147 | add r0, sp, #(S_FRAME_SIZE + \stack_hole - 4) |
138 | SPFIX( addne r0, r0, #4 ) | 148 | SPFIX( addeq r0, r0, #4 ) |
139 | str r1, [sp] @ save the "real" r0 copied | 149 | str r1, [sp, #-4]! @ save the "real" r0 copied |
140 | @ from the exception stack | 150 | @ from the exception stack |
141 | 151 | ||
142 | mov r1, lr | 152 | mov r1, lr |
@@ -198,9 +208,8 @@ __dabt_svc: | |||
198 | @ | 208 | @ |
199 | @ restore SPSR and restart the instruction | 209 | @ restore SPSR and restart the instruction |
200 | @ | 210 | @ |
201 | ldr r0, [sp, #S_PSR] | 211 | ldr r2, [sp, #S_PSR] |
202 | msr spsr_cxsf, r0 | 212 | svc_exit r2 @ return from exception |
203 | ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr | ||
204 | UNWIND(.fnend ) | 213 | UNWIND(.fnend ) |
205 | ENDPROC(__dabt_svc) | 214 | ENDPROC(__dabt_svc) |
206 | 215 | ||
@@ -224,13 +233,12 @@ __irq_svc: | |||
224 | tst r0, #_TIF_NEED_RESCHED | 233 | tst r0, #_TIF_NEED_RESCHED |
225 | blne svc_preempt | 234 | blne svc_preempt |
226 | #endif | 235 | #endif |
227 | ldr r0, [sp, #S_PSR] @ irqs are already disabled | 236 | ldr r4, [sp, #S_PSR] @ irqs are already disabled |
228 | msr spsr_cxsf, r0 | ||
229 | #ifdef CONFIG_TRACE_IRQFLAGS | 237 | #ifdef CONFIG_TRACE_IRQFLAGS |
230 | tst r0, #PSR_I_BIT | 238 | tst r4, #PSR_I_BIT |
231 | bleq trace_hardirqs_on | 239 | bleq trace_hardirqs_on |
232 | #endif | 240 | #endif |
233 | ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr | 241 | svc_exit r4 @ return from exception |
234 | UNWIND(.fnend ) | 242 | UNWIND(.fnend ) |
235 | ENDPROC(__irq_svc) | 243 | ENDPROC(__irq_svc) |
236 | 244 | ||
@@ -265,7 +273,7 @@ __und_svc: | |||
265 | @ r0 - instruction | 273 | @ r0 - instruction |
266 | @ | 274 | @ |
267 | ldr r0, [r2, #-4] | 275 | ldr r0, [r2, #-4] |
268 | adr r9, 1f | 276 | adr r9, BSYM(1f) |
269 | bl call_fpe | 277 | bl call_fpe |
270 | 278 | ||
271 | mov r0, sp @ struct pt_regs *regs | 279 | mov r0, sp @ struct pt_regs *regs |
@@ -279,9 +287,8 @@ __und_svc: | |||
279 | @ | 287 | @ |
280 | @ restore SPSR and restart the instruction | 288 | @ restore SPSR and restart the instruction |
281 | @ | 289 | @ |
282 | ldr lr, [sp, #S_PSR] @ Get SVC cpsr | 290 | ldr r2, [sp, #S_PSR] @ Get SVC cpsr |
283 | msr spsr_cxsf, lr | 291 | svc_exit r2 @ return from exception |
284 | ldmia sp, {r0 - pc}^ @ Restore SVC registers | ||
285 | UNWIND(.fnend ) | 292 | UNWIND(.fnend ) |
286 | ENDPROC(__und_svc) | 293 | ENDPROC(__und_svc) |
287 | 294 | ||
@@ -322,9 +329,8 @@ __pabt_svc: | |||
322 | @ | 329 | @ |
323 | @ restore SPSR and restart the instruction | 330 | @ restore SPSR and restart the instruction |
324 | @ | 331 | @ |
325 | ldr r0, [sp, #S_PSR] | 332 | ldr r2, [sp, #S_PSR] |
326 | msr spsr_cxsf, r0 | 333 | svc_exit r2 @ return from exception |
327 | ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr | ||
328 | UNWIND(.fnend ) | 334 | UNWIND(.fnend ) |
329 | ENDPROC(__pabt_svc) | 335 | ENDPROC(__pabt_svc) |
330 | 336 | ||
@@ -352,7 +358,8 @@ ENDPROC(__pabt_svc) | |||
352 | UNWIND(.fnstart ) | 358 | UNWIND(.fnstart ) |
353 | UNWIND(.cantunwind ) @ don't unwind the user space | 359 | UNWIND(.cantunwind ) @ don't unwind the user space |
354 | sub sp, sp, #S_FRAME_SIZE | 360 | sub sp, sp, #S_FRAME_SIZE |
355 | stmib sp, {r1 - r12} | 361 | ARM( stmib sp, {r1 - r12} ) |
362 | THUMB( stmia sp, {r0 - r12} ) | ||
356 | 363 | ||
357 | ldmia r0, {r1 - r3} | 364 | ldmia r0, {r1 - r3} |
358 | add r0, sp, #S_PC @ here for interlock avoidance | 365 | add r0, sp, #S_PC @ here for interlock avoidance |
@@ -371,7 +378,8 @@ ENDPROC(__pabt_svc) | |||
371 | @ Also, separately save sp_usr and lr_usr | 378 | @ Also, separately save sp_usr and lr_usr |
372 | @ | 379 | @ |
373 | stmia r0, {r2 - r4} | 380 | stmia r0, {r2 - r4} |
374 | stmdb r0, {sp, lr}^ | 381 | ARM( stmdb r0, {sp, lr}^ ) |
382 | THUMB( store_user_sp_lr r0, r1, S_SP - S_PC ) | ||
375 | 383 | ||
376 | @ | 384 | @ |
377 | @ Enable the alignment trap while in kernel mode | 385 | @ Enable the alignment trap while in kernel mode |
@@ -428,7 +436,7 @@ __dabt_usr: | |||
428 | @ | 436 | @ |
429 | enable_irq | 437 | enable_irq |
430 | mov r2, sp | 438 | mov r2, sp |
431 | adr lr, ret_from_exception | 439 | adr lr, BSYM(ret_from_exception) |
432 | b do_DataAbort | 440 | b do_DataAbort |
433 | UNWIND(.fnend ) | 441 | UNWIND(.fnend ) |
434 | ENDPROC(__dabt_usr) | 442 | ENDPROC(__dabt_usr) |
@@ -450,7 +458,9 @@ __irq_usr: | |||
450 | ldr r0, [tsk, #TI_PREEMPT] | 458 | ldr r0, [tsk, #TI_PREEMPT] |
451 | str r8, [tsk, #TI_PREEMPT] | 459 | str r8, [tsk, #TI_PREEMPT] |
452 | teq r0, r7 | 460 | teq r0, r7 |
453 | strne r0, [r0, -r0] | 461 | ARM( strne r0, [r0, -r0] ) |
462 | THUMB( movne r0, #0 ) | ||
463 | THUMB( strne r0, [r0] ) | ||
454 | #endif | 464 | #endif |
455 | #ifdef CONFIG_TRACE_IRQFLAGS | 465 | #ifdef CONFIG_TRACE_IRQFLAGS |
456 | bl trace_hardirqs_on | 466 | bl trace_hardirqs_on |
@@ -474,9 +484,10 @@ __und_usr: | |||
474 | @ | 484 | @ |
475 | @ r0 - instruction | 485 | @ r0 - instruction |
476 | @ | 486 | @ |
477 | adr r9, ret_from_exception | 487 | adr r9, BSYM(ret_from_exception) |
478 | adr lr, __und_usr_unknown | 488 | adr lr, BSYM(__und_usr_unknown) |
479 | tst r3, #PSR_T_BIT @ Thumb mode? | 489 | tst r3, #PSR_T_BIT @ Thumb mode? |
490 | itet eq @ explicit IT needed for the 1f label | ||
480 | subeq r4, r2, #4 @ ARM instr at LR - 4 | 491 | subeq r4, r2, #4 @ ARM instr at LR - 4 |
481 | subne r4, r2, #2 @ Thumb instr at LR - 2 | 492 | subne r4, r2, #2 @ Thumb instr at LR - 2 |
482 | 1: ldreqt r0, [r4] | 493 | 1: ldreqt r0, [r4] |
@@ -486,7 +497,10 @@ __und_usr: | |||
486 | beq call_fpe | 497 | beq call_fpe |
487 | @ Thumb instruction | 498 | @ Thumb instruction |
488 | #if __LINUX_ARM_ARCH__ >= 7 | 499 | #if __LINUX_ARM_ARCH__ >= 7 |
489 | 2: ldrht r5, [r4], #2 | 500 | 2: |
501 | ARM( ldrht r5, [r4], #2 ) | ||
502 | THUMB( ldrht r5, [r4] ) | ||
503 | THUMB( add r4, r4, #2 ) | ||
490 | and r0, r5, #0xf800 @ mask bits 111x x... .... .... | 504 | and r0, r5, #0xf800 @ mask bits 111x x... .... .... |
491 | cmp r0, #0xe800 @ 32bit instruction if xx != 0 | 505 | cmp r0, #0xe800 @ 32bit instruction if xx != 0 |
492 | blo __und_usr_unknown | 506 | blo __und_usr_unknown |
@@ -575,9 +589,11 @@ call_fpe: | |||
575 | moveq pc, lr | 589 | moveq pc, lr |
576 | get_thread_info r10 @ get current thread | 590 | get_thread_info r10 @ get current thread |
577 | and r8, r0, #0x00000f00 @ mask out CP number | 591 | and r8, r0, #0x00000f00 @ mask out CP number |
592 | THUMB( lsr r8, r8, #8 ) | ||
578 | mov r7, #1 | 593 | mov r7, #1 |
579 | add r6, r10, #TI_USED_CP | 594 | add r6, r10, #TI_USED_CP |
580 | strb r7, [r6, r8, lsr #8] @ set appropriate used_cp[] | 595 | ARM( strb r7, [r6, r8, lsr #8] ) @ set appropriate used_cp[] |
596 | THUMB( strb r7, [r6, r8] ) @ set appropriate used_cp[] | ||
581 | #ifdef CONFIG_IWMMXT | 597 | #ifdef CONFIG_IWMMXT |
582 | @ Test if we need to give access to iWMMXt coprocessors | 598 | @ Test if we need to give access to iWMMXt coprocessors |
583 | ldr r5, [r10, #TI_FLAGS] | 599 | ldr r5, [r10, #TI_FLAGS] |
@@ -585,36 +601,38 @@ call_fpe: | |||
585 | movcss r7, r5, lsr #(TIF_USING_IWMMXT + 1) | 601 | movcss r7, r5, lsr #(TIF_USING_IWMMXT + 1) |
586 | bcs iwmmxt_task_enable | 602 | bcs iwmmxt_task_enable |
587 | #endif | 603 | #endif |
588 | add pc, pc, r8, lsr #6 | 604 | ARM( add pc, pc, r8, lsr #6 ) |
589 | mov r0, r0 | 605 | THUMB( lsl r8, r8, #2 ) |
590 | 606 | THUMB( add pc, r8 ) | |
591 | mov pc, lr @ CP#0 | 607 | nop |
592 | b do_fpe @ CP#1 (FPE) | 608 | |
593 | b do_fpe @ CP#2 (FPE) | 609 | W(mov) pc, lr @ CP#0 |
594 | mov pc, lr @ CP#3 | 610 | W(b) do_fpe @ CP#1 (FPE) |
611 | W(b) do_fpe @ CP#2 (FPE) | ||
612 | W(mov) pc, lr @ CP#3 | ||
595 | #ifdef CONFIG_CRUNCH | 613 | #ifdef CONFIG_CRUNCH |
596 | b crunch_task_enable @ CP#4 (MaverickCrunch) | 614 | b crunch_task_enable @ CP#4 (MaverickCrunch) |
597 | b crunch_task_enable @ CP#5 (MaverickCrunch) | 615 | b crunch_task_enable @ CP#5 (MaverickCrunch) |
598 | b crunch_task_enable @ CP#6 (MaverickCrunch) | 616 | b crunch_task_enable @ CP#6 (MaverickCrunch) |
599 | #else | 617 | #else |
600 | mov pc, lr @ CP#4 | 618 | W(mov) pc, lr @ CP#4 |
601 | mov pc, lr @ CP#5 | 619 | W(mov) pc, lr @ CP#5 |
602 | mov pc, lr @ CP#6 | 620 | W(mov) pc, lr @ CP#6 |
603 | #endif | 621 | #endif |
604 | mov pc, lr @ CP#7 | 622 | W(mov) pc, lr @ CP#7 |
605 | mov pc, lr @ CP#8 | 623 | W(mov) pc, lr @ CP#8 |
606 | mov pc, lr @ CP#9 | 624 | W(mov) pc, lr @ CP#9 |
607 | #ifdef CONFIG_VFP | 625 | #ifdef CONFIG_VFP |
608 | b do_vfp @ CP#10 (VFP) | 626 | W(b) do_vfp @ CP#10 (VFP) |
609 | b do_vfp @ CP#11 (VFP) | 627 | W(b) do_vfp @ CP#11 (VFP) |
610 | #else | 628 | #else |
611 | mov pc, lr @ CP#10 (VFP) | 629 | W(mov) pc, lr @ CP#10 (VFP) |
612 | mov pc, lr @ CP#11 (VFP) | 630 | W(mov) pc, lr @ CP#11 (VFP) |
613 | #endif | 631 | #endif |
614 | mov pc, lr @ CP#12 | 632 | W(mov) pc, lr @ CP#12 |
615 | mov pc, lr @ CP#13 | 633 | W(mov) pc, lr @ CP#13 |
616 | mov pc, lr @ CP#14 (Debug) | 634 | W(mov) pc, lr @ CP#14 (Debug) |
617 | mov pc, lr @ CP#15 (Control) | 635 | W(mov) pc, lr @ CP#15 (Control) |
618 | 636 | ||
619 | #ifdef CONFIG_NEON | 637 | #ifdef CONFIG_NEON |
620 | .align 6 | 638 | .align 6 |
@@ -665,7 +683,7 @@ no_fp: mov pc, lr | |||
665 | __und_usr_unknown: | 683 | __und_usr_unknown: |
666 | enable_irq | 684 | enable_irq |
667 | mov r0, sp | 685 | mov r0, sp |
668 | adr lr, ret_from_exception | 686 | adr lr, BSYM(ret_from_exception) |
669 | b do_undefinstr | 687 | b do_undefinstr |
670 | ENDPROC(__und_usr_unknown) | 688 | ENDPROC(__und_usr_unknown) |
671 | 689 | ||
@@ -709,7 +727,10 @@ ENTRY(__switch_to) | |||
709 | UNWIND(.cantunwind ) | 727 | UNWIND(.cantunwind ) |
710 | add ip, r1, #TI_CPU_SAVE | 728 | add ip, r1, #TI_CPU_SAVE |
711 | ldr r3, [r2, #TI_TP_VALUE] | 729 | ldr r3, [r2, #TI_TP_VALUE] |
712 | stmia ip!, {r4 - sl, fp, sp, lr} @ Store most regs on stack | 730 | ARM( stmia ip!, {r4 - sl, fp, sp, lr} ) @ Store most regs on stack |
731 | THUMB( stmia ip!, {r4 - sl, fp} ) @ Store most regs on stack | ||
732 | THUMB( str sp, [ip], #4 ) | ||
733 | THUMB( str lr, [ip], #4 ) | ||
713 | #ifdef CONFIG_MMU | 734 | #ifdef CONFIG_MMU |
714 | ldr r6, [r2, #TI_CPU_DOMAIN] | 735 | ldr r6, [r2, #TI_CPU_DOMAIN] |
715 | #endif | 736 | #endif |
@@ -734,8 +755,12 @@ ENTRY(__switch_to) | |||
734 | ldr r0, =thread_notify_head | 755 | ldr r0, =thread_notify_head |
735 | mov r1, #THREAD_NOTIFY_SWITCH | 756 | mov r1, #THREAD_NOTIFY_SWITCH |
736 | bl atomic_notifier_call_chain | 757 | bl atomic_notifier_call_chain |
758 | THUMB( mov ip, r4 ) | ||
737 | mov r0, r5 | 759 | mov r0, r5 |
738 | ldmia r4, {r4 - sl, fp, sp, pc} @ Load all regs saved previously | 760 | ARM( ldmia r4, {r4 - sl, fp, sp, pc} ) @ Load all regs saved previously |
761 | THUMB( ldmia ip!, {r4 - sl, fp} ) @ Load all regs saved previously | ||
762 | THUMB( ldr sp, [ip], #4 ) | ||
763 | THUMB( ldr pc, [ip] ) | ||
739 | UNWIND(.fnend ) | 764 | UNWIND(.fnend ) |
740 | ENDPROC(__switch_to) | 765 | ENDPROC(__switch_to) |
741 | 766 | ||
@@ -770,6 +795,7 @@ ENDPROC(__switch_to) | |||
770 | * if your compiled code is not going to use the new instructions for other | 795 | * if your compiled code is not going to use the new instructions for other |
771 | * purpose. | 796 | * purpose. |
772 | */ | 797 | */ |
798 | THUMB( .arm ) | ||
773 | 799 | ||
774 | .macro usr_ret, reg | 800 | .macro usr_ret, reg |
775 | #ifdef CONFIG_ARM_THUMB | 801 | #ifdef CONFIG_ARM_THUMB |
@@ -1018,6 +1044,7 @@ __kuser_helper_version: @ 0xffff0ffc | |||
1018 | .globl __kuser_helper_end | 1044 | .globl __kuser_helper_end |
1019 | __kuser_helper_end: | 1045 | __kuser_helper_end: |
1020 | 1046 | ||
1047 | THUMB( .thumb ) | ||
1021 | 1048 | ||
1022 | /* | 1049 | /* |
1023 | * Vector stubs. | 1050 | * Vector stubs. |
@@ -1052,17 +1079,23 @@ vector_\name: | |||
1052 | @ Prepare for SVC32 mode. IRQs remain disabled. | 1079 | @ Prepare for SVC32 mode. IRQs remain disabled. |
1053 | @ | 1080 | @ |
1054 | mrs r0, cpsr | 1081 | mrs r0, cpsr |
1055 | eor r0, r0, #(\mode ^ SVC_MODE) | 1082 | eor r0, r0, #(\mode ^ SVC_MODE | PSR_ISETSTATE) |
1056 | msr spsr_cxsf, r0 | 1083 | msr spsr_cxsf, r0 |
1057 | 1084 | ||
1058 | @ | 1085 | @ |
1059 | @ the branch table must immediately follow this code | 1086 | @ the branch table must immediately follow this code |
1060 | @ | 1087 | @ |
1061 | and lr, lr, #0x0f | 1088 | and lr, lr, #0x0f |
1089 | THUMB( adr r0, 1f ) | ||
1090 | THUMB( ldr lr, [r0, lr, lsl #2] ) | ||
1062 | mov r0, sp | 1091 | mov r0, sp |
1063 | ldr lr, [pc, lr, lsl #2] | 1092 | ARM( ldr lr, [pc, lr, lsl #2] ) |
1064 | movs pc, lr @ branch to handler in SVC mode | 1093 | movs pc, lr @ branch to handler in SVC mode |
1065 | ENDPROC(vector_\name) | 1094 | ENDPROC(vector_\name) |
1095 | |||
1096 | .align 2 | ||
1097 | @ handler addresses follow this label | ||
1098 | 1: | ||
1066 | .endm | 1099 | .endm |
1067 | 1100 | ||
1068 | .globl __stubs_start | 1101 | .globl __stubs_start |
@@ -1200,14 +1233,16 @@ __stubs_end: | |||
1200 | 1233 | ||
1201 | .globl __vectors_start | 1234 | .globl __vectors_start |
1202 | __vectors_start: | 1235 | __vectors_start: |
1203 | swi SYS_ERROR0 | 1236 | ARM( swi SYS_ERROR0 ) |
1204 | b vector_und + stubs_offset | 1237 | THUMB( svc #0 ) |
1205 | ldr pc, .LCvswi + stubs_offset | 1238 | THUMB( nop ) |
1206 | b vector_pabt + stubs_offset | 1239 | W(b) vector_und + stubs_offset |
1207 | b vector_dabt + stubs_offset | 1240 | W(ldr) pc, .LCvswi + stubs_offset |
1208 | b vector_addrexcptn + stubs_offset | 1241 | W(b) vector_pabt + stubs_offset |
1209 | b vector_irq + stubs_offset | 1242 | W(b) vector_dabt + stubs_offset |
1210 | b vector_fiq + stubs_offset | 1243 | W(b) vector_addrexcptn + stubs_offset |
1244 | W(b) vector_irq + stubs_offset | ||
1245 | W(b) vector_fiq + stubs_offset | ||
1211 | 1246 | ||
1212 | .globl __vectors_end | 1247 | .globl __vectors_end |
1213 | __vectors_end: | 1248 | __vectors_end: |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 99208728d48f..df19e8bf2e4a 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
@@ -33,14 +33,7 @@ ret_fast_syscall: | |||
33 | /* perform architecture specific actions before user return */ | 33 | /* perform architecture specific actions before user return */ |
34 | arch_ret_to_user r1, lr | 34 | arch_ret_to_user r1, lr |
35 | 35 | ||
36 | @ fast_restore_user_regs | 36 | restore_user_regs fast = 1, offset = S_OFF |
37 | ldr r1, [sp, #S_OFF + S_PSR] @ get calling cpsr | ||
38 | ldr lr, [sp, #S_OFF + S_PC]! @ get pc | ||
39 | msr spsr_cxsf, r1 @ save in spsr_svc | ||
40 | ldmdb sp, {r1 - lr}^ @ get calling r1 - lr | ||
41 | mov r0, r0 | ||
42 | add sp, sp, #S_FRAME_SIZE - S_PC | ||
43 | movs pc, lr @ return & move spsr_svc into cpsr | ||
44 | UNWIND(.fnend ) | 37 | UNWIND(.fnend ) |
45 | 38 | ||
46 | /* | 39 | /* |
@@ -73,14 +66,7 @@ no_work_pending: | |||
73 | /* perform architecture specific actions before user return */ | 66 | /* perform architecture specific actions before user return */ |
74 | arch_ret_to_user r1, lr | 67 | arch_ret_to_user r1, lr |
75 | 68 | ||
76 | @ slow_restore_user_regs | 69 | restore_user_regs fast = 0, offset = 0 |
77 | ldr r1, [sp, #S_PSR] @ get calling cpsr | ||
78 | ldr lr, [sp, #S_PC]! @ get pc | ||
79 | msr spsr_cxsf, r1 @ save in spsr_svc | ||
80 | ldmdb sp, {r0 - lr}^ @ get calling r0 - lr | ||
81 | mov r0, r0 | ||
82 | add sp, sp, #S_FRAME_SIZE - S_PC | ||
83 | movs pc, lr @ return & move spsr_svc into cpsr | ||
84 | ENDPROC(ret_to_user) | 70 | ENDPROC(ret_to_user) |
85 | 71 | ||
86 | /* | 72 | /* |
@@ -201,8 +187,10 @@ ftrace_stub: | |||
201 | ENTRY(vector_swi) | 187 | ENTRY(vector_swi) |
202 | sub sp, sp, #S_FRAME_SIZE | 188 | sub sp, sp, #S_FRAME_SIZE |
203 | stmia sp, {r0 - r12} @ Calling r0 - r12 | 189 | stmia sp, {r0 - r12} @ Calling r0 - r12 |
204 | add r8, sp, #S_PC | 190 | ARM( add r8, sp, #S_PC ) |
205 | stmdb r8, {sp, lr}^ @ Calling sp, lr | 191 | ARM( stmdb r8, {sp, lr}^ ) @ Calling sp, lr |
192 | THUMB( mov r8, sp ) | ||
193 | THUMB( store_user_sp_lr r8, r10, S_SP ) @ calling sp, lr | ||
206 | mrs r8, spsr @ called from non-FIQ mode, so ok. | 194 | mrs r8, spsr @ called from non-FIQ mode, so ok. |
207 | str lr, [sp, #S_PC] @ Save calling PC | 195 | str lr, [sp, #S_PC] @ Save calling PC |
208 | str r8, [sp, #S_PSR] @ Save CPSR | 196 | str r8, [sp, #S_PSR] @ Save CPSR |
@@ -291,7 +279,7 @@ ENTRY(vector_swi) | |||
291 | bne __sys_trace | 279 | bne __sys_trace |
292 | 280 | ||
293 | cmp scno, #NR_syscalls @ check upper syscall limit | 281 | cmp scno, #NR_syscalls @ check upper syscall limit |
294 | adr lr, ret_fast_syscall @ return address | 282 | adr lr, BSYM(ret_fast_syscall) @ return address |
295 | ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine | 283 | ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine |
296 | 284 | ||
297 | add r1, sp, #S_OFF | 285 | add r1, sp, #S_OFF |
@@ -312,7 +300,7 @@ __sys_trace: | |||
312 | mov r0, #0 @ trace entry [IP = 0] | 300 | mov r0, #0 @ trace entry [IP = 0] |
313 | bl syscall_trace | 301 | bl syscall_trace |
314 | 302 | ||
315 | adr lr, __sys_trace_return @ return address | 303 | adr lr, BSYM(__sys_trace_return) @ return address |
316 | mov scno, r0 @ syscall number (possibly new) | 304 | mov scno, r0 @ syscall number (possibly new) |
317 | add r1, sp, #S_R0 + S_OFF @ pointer to regs | 305 | add r1, sp, #S_R0 + S_OFF @ pointer to regs |
318 | cmp scno, #NR_syscalls @ check upper syscall limit | 306 | cmp scno, #NR_syscalls @ check upper syscall limit |
diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index 87ab4e157997..a4eaf4f920c5 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S | |||
@@ -36,11 +36,6 @@ | |||
36 | #endif | 36 | #endif |
37 | .endm | 37 | .endm |
38 | 38 | ||
39 | .macro get_thread_info, rd | ||
40 | mov \rd, sp, lsr #13 | ||
41 | mov \rd, \rd, lsl #13 | ||
42 | .endm | ||
43 | |||
44 | .macro alignment_trap, rtemp | 39 | .macro alignment_trap, rtemp |
45 | #ifdef CONFIG_ALIGNMENT_TRAP | 40 | #ifdef CONFIG_ALIGNMENT_TRAP |
46 | ldr \rtemp, .LCcralign | 41 | ldr \rtemp, .LCcralign |
@@ -49,6 +44,93 @@ | |||
49 | #endif | 44 | #endif |
50 | .endm | 45 | .endm |
51 | 46 | ||
47 | @ | ||
48 | @ Store/load the USER SP and LR registers by switching to the SYS | ||
49 | @ mode. Useful in Thumb-2 mode where "stm/ldm rd, {sp, lr}^" is not | ||
50 | @ available. Should only be called from SVC mode | ||
51 | @ | ||
52 | .macro store_user_sp_lr, rd, rtemp, offset = 0 | ||
53 | mrs \rtemp, cpsr | ||
54 | eor \rtemp, \rtemp, #(SVC_MODE ^ SYSTEM_MODE) | ||
55 | msr cpsr_c, \rtemp @ switch to the SYS mode | ||
56 | |||
57 | str sp, [\rd, #\offset] @ save sp_usr | ||
58 | str lr, [\rd, #\offset + 4] @ save lr_usr | ||
59 | |||
60 | eor \rtemp, \rtemp, #(SVC_MODE ^ SYSTEM_MODE) | ||
61 | msr cpsr_c, \rtemp @ switch back to the SVC mode | ||
62 | .endm | ||
63 | |||
64 | .macro load_user_sp_lr, rd, rtemp, offset = 0 | ||
65 | mrs \rtemp, cpsr | ||
66 | eor \rtemp, \rtemp, #(SVC_MODE ^ SYSTEM_MODE) | ||
67 | msr cpsr_c, \rtemp @ switch to the SYS mode | ||
68 | |||
69 | ldr sp, [\rd, #\offset] @ load sp_usr | ||
70 | ldr lr, [\rd, #\offset + 4] @ load lr_usr | ||
71 | |||
72 | eor \rtemp, \rtemp, #(SVC_MODE ^ SYSTEM_MODE) | ||
73 | msr cpsr_c, \rtemp @ switch back to the SVC mode | ||
74 | .endm | ||
75 | |||
76 | #ifndef CONFIG_THUMB2_KERNEL | ||
77 | .macro svc_exit, rpsr | ||
78 | msr spsr_cxsf, \rpsr | ||
79 | ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr | ||
80 | .endm | ||
81 | |||
82 | .macro restore_user_regs, fast = 0, offset = 0 | ||
83 | ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr | ||
84 | ldr lr, [sp, #\offset + S_PC]! @ get pc | ||
85 | msr spsr_cxsf, r1 @ save in spsr_svc | ||
86 | .if \fast | ||
87 | ldmdb sp, {r1 - lr}^ @ get calling r1 - lr | ||
88 | .else | ||
89 | ldmdb sp, {r0 - lr}^ @ get calling r0 - lr | ||
90 | .endif | ||
91 | add sp, sp, #S_FRAME_SIZE - S_PC | ||
92 | movs pc, lr @ return & move spsr_svc into cpsr | ||
93 | .endm | ||
94 | |||
95 | .macro get_thread_info, rd | ||
96 | mov \rd, sp, lsr #13 | ||
97 | mov \rd, \rd, lsl #13 | ||
98 | .endm | ||
99 | #else /* CONFIG_THUMB2_KERNEL */ | ||
100 | .macro svc_exit, rpsr | ||
101 | ldr r0, [sp, #S_SP] @ top of the stack | ||
102 | ldr r1, [sp, #S_PC] @ return address | ||
103 | tst r0, #4 @ orig stack 8-byte aligned? | ||
104 | stmdb r0, {r1, \rpsr} @ rfe context | ||
105 | ldmia sp, {r0 - r12} | ||
106 | ldr lr, [sp, #S_LR] | ||
107 | addeq sp, sp, #S_FRAME_SIZE - 8 @ aligned | ||
108 | addne sp, sp, #S_FRAME_SIZE - 4 @ not aligned | ||
109 | rfeia sp! | ||
110 | .endm | ||
111 | |||
112 | .macro restore_user_regs, fast = 0, offset = 0 | ||
113 | mov r2, sp | ||
114 | load_user_sp_lr r2, r3, \offset + S_SP @ calling sp, lr | ||
115 | ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr | ||
116 | ldr lr, [sp, #\offset + S_PC] @ get pc | ||
117 | add sp, sp, #\offset + S_SP | ||
118 | msr spsr_cxsf, r1 @ save in spsr_svc | ||
119 | .if \fast | ||
120 | ldmdb sp, {r1 - r12} @ get calling r1 - r12 | ||
121 | .else | ||
122 | ldmdb sp, {r0 - r12} @ get calling r0 - r12 | ||
123 | .endif | ||
124 | add sp, sp, #S_FRAME_SIZE - S_SP | ||
125 | movs pc, lr @ return & move spsr_svc into cpsr | ||
126 | .endm | ||
127 | |||
128 | .macro get_thread_info, rd | ||
129 | mov \rd, sp | ||
130 | lsr \rd, \rd, #13 | ||
131 | mov \rd, \rd, lsl #13 | ||
132 | .endm | ||
133 | #endif /* !CONFIG_THUMB2_KERNEL */ | ||
52 | 134 | ||
53 | /* | 135 | /* |
54 | * These are the registers used in the syscall handler, and allow us to | 136 | * These are the registers used in the syscall handler, and allow us to |
diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S index 991952c644d1..93ad576b2d74 100644 --- a/arch/arm/kernel/head-common.S +++ b/arch/arm/kernel/head-common.S | |||
@@ -14,6 +14,7 @@ | |||
14 | #define ATAG_CORE 0x54410001 | 14 | #define ATAG_CORE 0x54410001 |
15 | #define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2) | 15 | #define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2) |
16 | 16 | ||
17 | .align 2 | ||
17 | .type __switch_data, %object | 18 | .type __switch_data, %object |
18 | __switch_data: | 19 | __switch_data: |
19 | .long __mmap_switched | 20 | .long __mmap_switched |
@@ -51,7 +52,9 @@ __mmap_switched: | |||
51 | strcc fp, [r6],#4 | 52 | strcc fp, [r6],#4 |
52 | bcc 1b | 53 | bcc 1b |
53 | 54 | ||
54 | ldmia r3, {r4, r5, r6, r7, sp} | 55 | ARM( ldmia r3, {r4, r5, r6, r7, sp}) |
56 | THUMB( ldmia r3, {r4, r5, r6, r7} ) | ||
57 | THUMB( ldr sp, [r3, #16] ) | ||
55 | str r9, [r4] @ Save processor ID | 58 | str r9, [r4] @ Save processor ID |
56 | str r1, [r5] @ Save machine type | 59 | str r1, [r5] @ Save machine type |
57 | str r2, [r6] @ Save atags pointer | 60 | str r2, [r6] @ Save atags pointer |
@@ -155,7 +158,8 @@ ENDPROC(__error) | |||
155 | */ | 158 | */ |
156 | __lookup_processor_type: | 159 | __lookup_processor_type: |
157 | adr r3, 3f | 160 | adr r3, 3f |
158 | ldmda r3, {r5 - r7} | 161 | ldmia r3, {r5 - r7} |
162 | add r3, r3, #8 | ||
159 | sub r3, r3, r7 @ get offset between virt&phys | 163 | sub r3, r3, r7 @ get offset between virt&phys |
160 | add r5, r5, r3 @ convert virt addresses to | 164 | add r5, r5, r3 @ convert virt addresses to |
161 | add r6, r6, r3 @ physical address space | 165 | add r6, r6, r3 @ physical address space |
@@ -185,9 +189,10 @@ ENDPROC(lookup_processor_type) | |||
185 | * Look in <asm/procinfo.h> and arch/arm/kernel/arch.[ch] for | 189 | * Look in <asm/procinfo.h> and arch/arm/kernel/arch.[ch] for |
186 | * more information about the __proc_info and __arch_info structures. | 190 | * more information about the __proc_info and __arch_info structures. |
187 | */ | 191 | */ |
188 | .long __proc_info_begin | 192 | .align 2 |
193 | 3: .long __proc_info_begin | ||
189 | .long __proc_info_end | 194 | .long __proc_info_end |
190 | 3: .long . | 195 | 4: .long . |
191 | .long __arch_info_begin | 196 | .long __arch_info_begin |
192 | .long __arch_info_end | 197 | .long __arch_info_end |
193 | 198 | ||
@@ -203,7 +208,7 @@ ENDPROC(lookup_processor_type) | |||
203 | * r5 = mach_info pointer in physical address space | 208 | * r5 = mach_info pointer in physical address space |
204 | */ | 209 | */ |
205 | __lookup_machine_type: | 210 | __lookup_machine_type: |
206 | adr r3, 3b | 211 | adr r3, 4b |
207 | ldmia r3, {r4, r5, r6} | 212 | ldmia r3, {r4, r5, r6} |
208 | sub r3, r3, r4 @ get offset between virt&phys | 213 | sub r3, r3, r4 @ get offset between virt&phys |
209 | add r5, r5, r3 @ convert virt addresses to | 214 | add r5, r5, r3 @ convert virt addresses to |
diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index cc87e1765ed2..e5dfc2895e24 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S | |||
@@ -34,7 +34,7 @@ | |||
34 | */ | 34 | */ |
35 | .section ".text.head", "ax" | 35 | .section ".text.head", "ax" |
36 | ENTRY(stext) | 36 | ENTRY(stext) |
37 | msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode | 37 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode |
38 | @ and irqs disabled | 38 | @ and irqs disabled |
39 | #ifndef CONFIG_CPU_CP15 | 39 | #ifndef CONFIG_CPU_CP15 |
40 | ldr r9, =CONFIG_PROCESSOR_ID | 40 | ldr r9, =CONFIG_PROCESSOR_ID |
@@ -50,8 +50,10 @@ ENTRY(stext) | |||
50 | 50 | ||
51 | ldr r13, __switch_data @ address to jump to after | 51 | ldr r13, __switch_data @ address to jump to after |
52 | @ the initialization is done | 52 | @ the initialization is done |
53 | adr lr, __after_proc_init @ return (PIC) address | 53 | adr lr, BSYM(__after_proc_init) @ return (PIC) address |
54 | add pc, r10, #PROCINFO_INITFUNC | 54 | ARM( add pc, r10, #PROCINFO_INITFUNC ) |
55 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) | ||
56 | THUMB( mov pc, r12 ) | ||
55 | ENDPROC(stext) | 57 | ENDPROC(stext) |
56 | 58 | ||
57 | /* | 59 | /* |
@@ -59,7 +61,10 @@ ENDPROC(stext) | |||
59 | */ | 61 | */ |
60 | __after_proc_init: | 62 | __after_proc_init: |
61 | #ifdef CONFIG_CPU_CP15 | 63 | #ifdef CONFIG_CPU_CP15 |
62 | mrc p15, 0, r0, c1, c0, 0 @ read control reg | 64 | /* |
65 | * CP15 system control register value returned in r0 from | ||
66 | * the CPU init function. | ||
67 | */ | ||
63 | #ifdef CONFIG_ALIGNMENT_TRAP | 68 | #ifdef CONFIG_ALIGNMENT_TRAP |
64 | orr r0, r0, #CR_A | 69 | orr r0, r0, #CR_A |
65 | #else | 70 | #else |
@@ -82,7 +87,8 @@ __after_proc_init: | |||
82 | mcr p15, 0, r0, c1, c0, 0 @ write control reg | 87 | mcr p15, 0, r0, c1, c0, 0 @ write control reg |
83 | #endif /* CONFIG_CPU_CP15 */ | 88 | #endif /* CONFIG_CPU_CP15 */ |
84 | 89 | ||
85 | mov pc, r13 @ clear the BSS and jump | 90 | mov r3, r13 |
91 | mov pc, r3 @ clear the BSS and jump | ||
86 | @ to start_kernel | 92 | @ to start_kernel |
87 | ENDPROC(__after_proc_init) | 93 | ENDPROC(__after_proc_init) |
88 | .ltorg | 94 | .ltorg |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 21e17dc94cb5..38ccbe1d3b2c 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -76,7 +76,7 @@ | |||
76 | */ | 76 | */ |
77 | .section ".text.head", "ax" | 77 | .section ".text.head", "ax" |
78 | ENTRY(stext) | 78 | ENTRY(stext) |
79 | msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode | 79 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode |
80 | @ and irqs disabled | 80 | @ and irqs disabled |
81 | mrc p15, 0, r9, c0, c0 @ get processor id | 81 | mrc p15, 0, r9, c0, c0 @ get processor id |
82 | bl __lookup_processor_type @ r5=procinfo r9=cpuid | 82 | bl __lookup_processor_type @ r5=procinfo r9=cpuid |
@@ -97,8 +97,10 @@ ENTRY(stext) | |||
97 | */ | 97 | */ |
98 | ldr r13, __switch_data @ address to jump to after | 98 | ldr r13, __switch_data @ address to jump to after |
99 | @ mmu has been enabled | 99 | @ mmu has been enabled |
100 | adr lr, __enable_mmu @ return (PIC) address | 100 | adr lr, BSYM(__enable_mmu) @ return (PIC) address |
101 | add pc, r10, #PROCINFO_INITFUNC | 101 | ARM( add pc, r10, #PROCINFO_INITFUNC ) |
102 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) | ||
103 | THUMB( mov pc, r12 ) | ||
102 | ENDPROC(stext) | 104 | ENDPROC(stext) |
103 | 105 | ||
104 | #if defined(CONFIG_SMP) | 106 | #if defined(CONFIG_SMP) |
@@ -110,7 +112,7 @@ ENTRY(secondary_startup) | |||
110 | * the processor type - there is no need to check the machine type | 112 | * the processor type - there is no need to check the machine type |
111 | * as it has already been validated by the primary processor. | 113 | * as it has already been validated by the primary processor. |
112 | */ | 114 | */ |
113 | msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE | 115 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 |
114 | mrc p15, 0, r9, c0, c0 @ get processor id | 116 | mrc p15, 0, r9, c0, c0 @ get processor id |
115 | bl __lookup_processor_type | 117 | bl __lookup_processor_type |
116 | movs r10, r5 @ invalid processor? | 118 | movs r10, r5 @ invalid processor? |
@@ -121,12 +123,15 @@ ENTRY(secondary_startup) | |||
121 | * Use the page tables supplied from __cpu_up. | 123 | * Use the page tables supplied from __cpu_up. |
122 | */ | 124 | */ |
123 | adr r4, __secondary_data | 125 | adr r4, __secondary_data |
124 | ldmia r4, {r5, r7, r13} @ address to jump to after | 126 | ldmia r4, {r5, r7, r12} @ address to jump to after |
125 | sub r4, r4, r5 @ mmu has been enabled | 127 | sub r4, r4, r5 @ mmu has been enabled |
126 | ldr r4, [r7, r4] @ get secondary_data.pgdir | 128 | ldr r4, [r7, r4] @ get secondary_data.pgdir |
127 | adr lr, __enable_mmu @ return address | 129 | adr lr, BSYM(__enable_mmu) @ return address |
128 | add pc, r10, #PROCINFO_INITFUNC @ initialise processor | 130 | mov r13, r12 @ __secondary_switched address |
129 | @ (return control reg) | 131 | ARM( add pc, r10, #PROCINFO_INITFUNC ) @ initialise processor |
132 | @ (return control reg) | ||
133 | THUMB( add r12, r10, #PROCINFO_INITFUNC ) | ||
134 | THUMB( mov pc, r12 ) | ||
130 | ENDPROC(secondary_startup) | 135 | ENDPROC(secondary_startup) |
131 | 136 | ||
132 | /* | 137 | /* |
@@ -193,8 +198,8 @@ __turn_mmu_on: | |||
193 | mcr p15, 0, r0, c1, c0, 0 @ write control reg | 198 | mcr p15, 0, r0, c1, c0, 0 @ write control reg |
194 | mrc p15, 0, r3, c0, c0, 0 @ read id reg | 199 | mrc p15, 0, r3, c0, c0, 0 @ read id reg |
195 | mov r3, r3 | 200 | mov r3, r3 |
196 | mov r3, r3 | 201 | mov r3, r13 |
197 | mov pc, r13 | 202 | mov pc, r3 |
198 | ENDPROC(__turn_mmu_on) | 203 | ENDPROC(__turn_mmu_on) |
199 | 204 | ||
200 | 205 | ||
@@ -235,7 +240,8 @@ __create_page_tables: | |||
235 | * will be removed by paging_init(). We use our current program | 240 | * will be removed by paging_init(). We use our current program |
236 | * counter to determine corresponding section base address. | 241 | * counter to determine corresponding section base address. |
237 | */ | 242 | */ |
238 | mov r6, pc, lsr #20 @ start of kernel section | 243 | mov r6, pc |
244 | mov r6, r6, lsr #20 @ start of kernel section | ||
239 | orr r3, r7, r6, lsl #20 @ flags + kernel base | 245 | orr r3, r7, r6, lsl #20 @ flags + kernel base |
240 | str r3, [r4, r6, lsl #2] @ identity mapping | 246 | str r3, [r4, r6, lsl #2] @ identity mapping |
241 | 247 | ||
diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c index bac03c81489d..f28c5e9c51ea 100644 --- a/arch/arm/kernel/module.c +++ b/arch/arm/kernel/module.c | |||
@@ -102,6 +102,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, | |||
102 | unsigned long loc; | 102 | unsigned long loc; |
103 | Elf32_Sym *sym; | 103 | Elf32_Sym *sym; |
104 | s32 offset; | 104 | s32 offset; |
105 | u32 upper, lower, sign, j1, j2; | ||
105 | 106 | ||
106 | offset = ELF32_R_SYM(rel->r_info); | 107 | offset = ELF32_R_SYM(rel->r_info); |
107 | if (offset < 0 || offset > (symsec->sh_size / sizeof(Elf32_Sym))) { | 108 | if (offset < 0 || offset > (symsec->sh_size / sizeof(Elf32_Sym))) { |
@@ -184,6 +185,58 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, | |||
184 | (offset & 0x0fff); | 185 | (offset & 0x0fff); |
185 | break; | 186 | break; |
186 | 187 | ||
188 | case R_ARM_THM_CALL: | ||
189 | case R_ARM_THM_JUMP24: | ||
190 | upper = *(u16 *)loc; | ||
191 | lower = *(u16 *)(loc + 2); | ||
192 | |||
193 | /* | ||
194 | * 25 bit signed address range (Thumb-2 BL and B.W | ||
195 | * instructions): | ||
196 | * S:I1:I2:imm10:imm11:0 | ||
197 | * where: | ||
198 | * S = upper[10] = offset[24] | ||
199 | * I1 = ~(J1 ^ S) = offset[23] | ||
200 | * I2 = ~(J2 ^ S) = offset[22] | ||
201 | * imm10 = upper[9:0] = offset[21:12] | ||
202 | * imm11 = lower[10:0] = offset[11:1] | ||
203 | * J1 = lower[13] | ||
204 | * J2 = lower[11] | ||
205 | */ | ||
206 | sign = (upper >> 10) & 1; | ||
207 | j1 = (lower >> 13) & 1; | ||
208 | j2 = (lower >> 11) & 1; | ||
209 | offset = (sign << 24) | ((~(j1 ^ sign) & 1) << 23) | | ||
210 | ((~(j2 ^ sign) & 1) << 22) | | ||
211 | ((upper & 0x03ff) << 12) | | ||
212 | ((lower & 0x07ff) << 1); | ||
213 | if (offset & 0x01000000) | ||
214 | offset -= 0x02000000; | ||
215 | offset += sym->st_value - loc; | ||
216 | |||
217 | /* only Thumb addresses allowed (no interworking) */ | ||
218 | if (!(offset & 1) || | ||
219 | offset <= (s32)0xff000000 || | ||
220 | offset >= (s32)0x01000000) { | ||
221 | printk(KERN_ERR | ||
222 | "%s: relocation out of range, section " | ||
223 | "%d reloc %d sym '%s'\n", module->name, | ||
224 | relindex, i, strtab + sym->st_name); | ||
225 | return -ENOEXEC; | ||
226 | } | ||
227 | |||
228 | sign = (offset >> 24) & 1; | ||
229 | j1 = sign ^ (~(offset >> 23) & 1); | ||
230 | j2 = sign ^ (~(offset >> 22) & 1); | ||
231 | *(u16 *)loc = (u16)((upper & 0xf800) | (sign << 10) | | ||
232 | ((offset >> 12) & 0x03ff)); | ||
233 | *(u16 *)(loc + 2) = (u16)((lower & 0xd000) | | ||
234 | (j1 << 13) | (j2 << 11) | | ||
235 | ((offset >> 1) & 0x07ff)); | ||
236 | upper = *(u16 *)loc; | ||
237 | lower = *(u16 *)(loc + 2); | ||
238 | break; | ||
239 | |||
187 | default: | 240 | default: |
188 | printk(KERN_ERR "%s: unknown relocation: %u\n", | 241 | printk(KERN_ERR "%s: unknown relocation: %u\n", |
189 | module->name, ELF32_R_TYPE(rel->r_info)); | 242 | module->name, ELF32_R_TYPE(rel->r_info)); |
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 39196dff478c..790fbee92ec5 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -388,7 +388,7 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | |||
388 | regs.ARM_r2 = (unsigned long)fn; | 388 | regs.ARM_r2 = (unsigned long)fn; |
389 | regs.ARM_r3 = (unsigned long)kernel_thread_exit; | 389 | regs.ARM_r3 = (unsigned long)kernel_thread_exit; |
390 | regs.ARM_pc = (unsigned long)kernel_thread_helper; | 390 | regs.ARM_pc = (unsigned long)kernel_thread_helper; |
391 | regs.ARM_cpsr = SVC_MODE | PSR_ENDSTATE; | 391 | regs.ARM_cpsr = SVC_MODE | PSR_ENDSTATE | PSR_ISETSTATE; |
392 | 392 | ||
393 | return do_fork(flags|CLONE_VM|CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | 393 | return do_fork(flags|CLONE_VM|CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); |
394 | } | 394 | } |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 89882a1d0187..a2ea3854cb3c 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
@@ -521,7 +521,13 @@ static int ptrace_read_user(struct task_struct *tsk, unsigned long off, | |||
521 | return -EIO; | 521 | return -EIO; |
522 | 522 | ||
523 | tmp = 0; | 523 | tmp = 0; |
524 | if (off < sizeof(struct pt_regs)) | 524 | if (off == PT_TEXT_ADDR) |
525 | tmp = tsk->mm->start_code; | ||
526 | else if (off == PT_DATA_ADDR) | ||
527 | tmp = tsk->mm->start_data; | ||
528 | else if (off == PT_TEXT_END_ADDR) | ||
529 | tmp = tsk->mm->end_code; | ||
530 | else if (off < sizeof(struct pt_regs)) | ||
525 | tmp = get_user_reg(tsk, off >> 2); | 531 | tmp = get_user_reg(tsk, off >> 2); |
526 | 532 | ||
527 | return put_user(tmp, ret); | 533 | return put_user(tmp, ret); |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index bc5e4128f9f3..d4d4f77c91b2 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/smp.h> | 25 | #include <linux/smp.h> |
26 | #include <linux/fs.h> | 26 | #include <linux/fs.h> |
27 | 27 | ||
28 | #include <asm/unified.h> | ||
28 | #include <asm/cpu.h> | 29 | #include <asm/cpu.h> |
29 | #include <asm/cputype.h> | 30 | #include <asm/cputype.h> |
30 | #include <asm/elf.h> | 31 | #include <asm/elf.h> |
@@ -327,25 +328,38 @@ void cpu_init(void) | |||
327 | } | 328 | } |
328 | 329 | ||
329 | /* | 330 | /* |
331 | * Define the placement constraint for the inline asm directive below. | ||
332 | * In Thumb-2, msr with an immediate value is not allowed. | ||
333 | */ | ||
334 | #ifdef CONFIG_THUMB2_KERNEL | ||
335 | #define PLC "r" | ||
336 | #else | ||
337 | #define PLC "I" | ||
338 | #endif | ||
339 | |||
340 | /* | ||
330 | * setup stacks for re-entrant exception handlers | 341 | * setup stacks for re-entrant exception handlers |
331 | */ | 342 | */ |
332 | __asm__ ( | 343 | __asm__ ( |
333 | "msr cpsr_c, %1\n\t" | 344 | "msr cpsr_c, %1\n\t" |
334 | "add sp, %0, %2\n\t" | 345 | "add r14, %0, %2\n\t" |
346 | "mov sp, r14\n\t" | ||
335 | "msr cpsr_c, %3\n\t" | 347 | "msr cpsr_c, %3\n\t" |
336 | "add sp, %0, %4\n\t" | 348 | "add r14, %0, %4\n\t" |
349 | "mov sp, r14\n\t" | ||
337 | "msr cpsr_c, %5\n\t" | 350 | "msr cpsr_c, %5\n\t" |
338 | "add sp, %0, %6\n\t" | 351 | "add r14, %0, %6\n\t" |
352 | "mov sp, r14\n\t" | ||
339 | "msr cpsr_c, %7" | 353 | "msr cpsr_c, %7" |
340 | : | 354 | : |
341 | : "r" (stk), | 355 | : "r" (stk), |
342 | "I" (PSR_F_BIT | PSR_I_BIT | IRQ_MODE), | 356 | PLC (PSR_F_BIT | PSR_I_BIT | IRQ_MODE), |
343 | "I" (offsetof(struct stack, irq[0])), | 357 | "I" (offsetof(struct stack, irq[0])), |
344 | "I" (PSR_F_BIT | PSR_I_BIT | ABT_MODE), | 358 | PLC (PSR_F_BIT | PSR_I_BIT | ABT_MODE), |
345 | "I" (offsetof(struct stack, abt[0])), | 359 | "I" (offsetof(struct stack, abt[0])), |
346 | "I" (PSR_F_BIT | PSR_I_BIT | UND_MODE), | 360 | PLC (PSR_F_BIT | PSR_I_BIT | UND_MODE), |
347 | "I" (offsetof(struct stack, und[0])), | 361 | "I" (offsetof(struct stack, und[0])), |
348 | "I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE) | 362 | PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE) |
349 | : "r14"); | 363 | : "r14"); |
350 | } | 364 | } |
351 | 365 | ||
diff --git a/arch/arm/kernel/unwind.c b/arch/arm/kernel/unwind.c index dd56e11f339a..39baf1128bfa 100644 --- a/arch/arm/kernel/unwind.c +++ b/arch/arm/kernel/unwind.c | |||
@@ -62,7 +62,11 @@ struct unwind_ctrl_block { | |||
62 | }; | 62 | }; |
63 | 63 | ||
64 | enum regs { | 64 | enum regs { |
65 | #ifdef CONFIG_THUMB2_KERNEL | ||
66 | FP = 7, | ||
67 | #else | ||
65 | FP = 11, | 68 | FP = 11, |
69 | #endif | ||
66 | SP = 13, | 70 | SP = 13, |
67 | LR = 14, | 71 | LR = 14, |
68 | PC = 15 | 72 | PC = 15 |
diff --git a/arch/arm/lib/ashldi3.S b/arch/arm/lib/ashldi3.S index 1154d924080b..638deb13da1c 100644 --- a/arch/arm/lib/ashldi3.S +++ b/arch/arm/lib/ashldi3.S | |||
@@ -43,7 +43,9 @@ ENTRY(__aeabi_llsl) | |||
43 | rsb ip, r2, #32 | 43 | rsb ip, r2, #32 |
44 | movmi ah, ah, lsl r2 | 44 | movmi ah, ah, lsl r2 |
45 | movpl ah, al, lsl r3 | 45 | movpl ah, al, lsl r3 |
46 | orrmi ah, ah, al, lsr ip | 46 | ARM( orrmi ah, ah, al, lsr ip ) |
47 | THUMB( lsrmi r3, al, ip ) | ||
48 | THUMB( orrmi ah, ah, r3 ) | ||
47 | mov al, al, lsl r2 | 49 | mov al, al, lsl r2 |
48 | mov pc, lr | 50 | mov pc, lr |
49 | 51 | ||
diff --git a/arch/arm/lib/ashrdi3.S b/arch/arm/lib/ashrdi3.S index 9f8b35572f8c..015e8aa5a1d1 100644 --- a/arch/arm/lib/ashrdi3.S +++ b/arch/arm/lib/ashrdi3.S | |||
@@ -43,7 +43,9 @@ ENTRY(__aeabi_lasr) | |||
43 | rsb ip, r2, #32 | 43 | rsb ip, r2, #32 |
44 | movmi al, al, lsr r2 | 44 | movmi al, al, lsr r2 |
45 | movpl al, ah, asr r3 | 45 | movpl al, ah, asr r3 |
46 | orrmi al, al, ah, lsl ip | 46 | ARM( orrmi al, al, ah, lsl ip ) |
47 | THUMB( lslmi r3, ah, ip ) | ||
48 | THUMB( orrmi al, al, r3 ) | ||
47 | mov ah, ah, asr r2 | 49 | mov ah, ah, asr r2 |
48 | mov pc, lr | 50 | mov pc, lr |
49 | 51 | ||
diff --git a/arch/arm/lib/backtrace.S b/arch/arm/lib/backtrace.S index b0951d0e8b2c..aaf7220d9e30 100644 --- a/arch/arm/lib/backtrace.S +++ b/arch/arm/lib/backtrace.S | |||
@@ -38,7 +38,9 @@ ENDPROC(c_backtrace) | |||
38 | beq no_frame @ we have no stack frames | 38 | beq no_frame @ we have no stack frames |
39 | 39 | ||
40 | tst r1, #0x10 @ 26 or 32-bit mode? | 40 | tst r1, #0x10 @ 26 or 32-bit mode? |
41 | moveq mask, #0xfc000003 @ mask for 26-bit | 41 | ARM( moveq mask, #0xfc000003 ) |
42 | THUMB( moveq mask, #0xfc000000 ) | ||
43 | THUMB( orreq mask, #0x03 ) | ||
42 | movne mask, #0 @ mask for 32-bit | 44 | movne mask, #0 @ mask for 32-bit |
43 | 45 | ||
44 | 1: stmfd sp!, {pc} @ calculate offset of PC stored | 46 | 1: stmfd sp!, {pc} @ calculate offset of PC stored |
@@ -126,7 +128,9 @@ ENDPROC(c_backtrace) | |||
126 | mov reg, #10 | 128 | mov reg, #10 |
127 | mov r7, #0 | 129 | mov r7, #0 |
128 | 1: mov r3, #1 | 130 | 1: mov r3, #1 |
129 | tst instr, r3, lsl reg | 131 | ARM( tst instr, r3, lsl reg ) |
132 | THUMB( lsl r3, reg ) | ||
133 | THUMB( tst instr, r3 ) | ||
130 | beq 2f | 134 | beq 2f |
131 | add r7, r7, #1 | 135 | add r7, r7, #1 |
132 | teq r7, #6 | 136 | teq r7, #6 |
diff --git a/arch/arm/lib/clear_user.S b/arch/arm/lib/clear_user.S index 844f56785ebc..1279abd8b886 100644 --- a/arch/arm/lib/clear_user.S +++ b/arch/arm/lib/clear_user.S | |||
@@ -27,21 +27,20 @@ WEAK(__clear_user) | |||
27 | ands ip, r0, #3 | 27 | ands ip, r0, #3 |
28 | beq 1f | 28 | beq 1f |
29 | cmp ip, #2 | 29 | cmp ip, #2 |
30 | USER( strbt r2, [r0], #1) | 30 | strusr r2, r0, 1 |
31 | USER( strlebt r2, [r0], #1) | 31 | strusr r2, r0, 1, le |
32 | USER( strltbt r2, [r0], #1) | 32 | strusr r2, r0, 1, lt |
33 | rsb ip, ip, #4 | 33 | rsb ip, ip, #4 |
34 | sub r1, r1, ip @ 7 6 5 4 3 2 1 | 34 | sub r1, r1, ip @ 7 6 5 4 3 2 1 |
35 | 1: subs r1, r1, #8 @ -1 -2 -3 -4 -5 -6 -7 | 35 | 1: subs r1, r1, #8 @ -1 -2 -3 -4 -5 -6 -7 |
36 | USER( strplt r2, [r0], #4) | 36 | strusr r2, r0, 4, pl, rept=2 |
37 | USER( strplt r2, [r0], #4) | ||
38 | bpl 1b | 37 | bpl 1b |
39 | adds r1, r1, #4 @ 3 2 1 0 -1 -2 -3 | 38 | adds r1, r1, #4 @ 3 2 1 0 -1 -2 -3 |
40 | USER( strplt r2, [r0], #4) | 39 | strusr r2, r0, 4, pl |
41 | 2: tst r1, #2 @ 1x 1x 0x 0x 1x 1x 0x | 40 | 2: tst r1, #2 @ 1x 1x 0x 0x 1x 1x 0x |
42 | USER( strnebt r2, [r0], #1) | 41 | strusr r2, r0, 1, ne, rept=2 |
43 | USER( strnebt r2, [r0], #1) | ||
44 | tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1 | 42 | tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1 |
43 | it ne @ explicit IT needed for the label | ||
45 | USER( strnebt r2, [r0]) | 44 | USER( strnebt r2, [r0]) |
46 | mov r0, #0 | 45 | mov r0, #0 |
47 | ldmfd sp!, {r1, pc} | 46 | ldmfd sp!, {r1, pc} |
diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S index 56799a165cc4..e4fe124acedc 100644 --- a/arch/arm/lib/copy_from_user.S +++ b/arch/arm/lib/copy_from_user.S | |||
@@ -33,11 +33,15 @@ | |||
33 | * Number of bytes NOT copied. | 33 | * Number of bytes NOT copied. |
34 | */ | 34 | */ |
35 | 35 | ||
36 | #ifndef CONFIG_THUMB2_KERNEL | ||
37 | #define LDR1W_SHIFT 0 | ||
38 | #else | ||
39 | #define LDR1W_SHIFT 1 | ||
40 | #endif | ||
41 | #define STR1W_SHIFT 0 | ||
42 | |||
36 | .macro ldr1w ptr reg abort | 43 | .macro ldr1w ptr reg abort |
37 | 100: ldrt \reg, [\ptr], #4 | 44 | ldrusr \reg, \ptr, 4, abort=\abort |
38 | .section __ex_table, "a" | ||
39 | .long 100b, \abort | ||
40 | .previous | ||
41 | .endm | 45 | .endm |
42 | 46 | ||
43 | .macro ldr4w ptr reg1 reg2 reg3 reg4 abort | 47 | .macro ldr4w ptr reg1 reg2 reg3 reg4 abort |
@@ -53,14 +57,11 @@ | |||
53 | .endm | 57 | .endm |
54 | 58 | ||
55 | .macro ldr1b ptr reg cond=al abort | 59 | .macro ldr1b ptr reg cond=al abort |
56 | 100: ldr\cond\()bt \reg, [\ptr], #1 | 60 | ldrusr \reg, \ptr, 1, \cond, abort=\abort |
57 | .section __ex_table, "a" | ||
58 | .long 100b, \abort | ||
59 | .previous | ||
60 | .endm | 61 | .endm |
61 | 62 | ||
62 | .macro str1w ptr reg abort | 63 | .macro str1w ptr reg abort |
63 | str \reg, [\ptr], #4 | 64 | W(str) \reg, [\ptr], #4 |
64 | .endm | 65 | .endm |
65 | 66 | ||
66 | .macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort | 67 | .macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort |
diff --git a/arch/arm/lib/copy_template.S b/arch/arm/lib/copy_template.S index 139cce646055..805e3f8fb007 100644 --- a/arch/arm/lib/copy_template.S +++ b/arch/arm/lib/copy_template.S | |||
@@ -57,6 +57,13 @@ | |||
57 | * | 57 | * |
58 | * Restore registers with the values previously saved with the | 58 | * Restore registers with the values previously saved with the |
59 | * 'preserv' macro. Called upon code termination. | 59 | * 'preserv' macro. Called upon code termination. |
60 | * | ||
61 | * LDR1W_SHIFT | ||
62 | * STR1W_SHIFT | ||
63 | * | ||
64 | * Correction to be applied to the "ip" register when branching into | ||
65 | * the ldr1w or str1w instructions (some of these macros may expand to | ||
66 | * than one 32bit instruction in Thumb-2) | ||
60 | */ | 67 | */ |
61 | 68 | ||
62 | 69 | ||
@@ -99,9 +106,15 @@ | |||
99 | 106 | ||
100 | 5: ands ip, r2, #28 | 107 | 5: ands ip, r2, #28 |
101 | rsb ip, ip, #32 | 108 | rsb ip, ip, #32 |
109 | #if LDR1W_SHIFT > 0 | ||
110 | lsl ip, ip, #LDR1W_SHIFT | ||
111 | #endif | ||
102 | addne pc, pc, ip @ C is always clear here | 112 | addne pc, pc, ip @ C is always clear here |
103 | b 7f | 113 | b 7f |
104 | 6: nop | 114 | 6: |
115 | .rept (1 << LDR1W_SHIFT) | ||
116 | W(nop) | ||
117 | .endr | ||
105 | ldr1w r1, r3, abort=20f | 118 | ldr1w r1, r3, abort=20f |
106 | ldr1w r1, r4, abort=20f | 119 | ldr1w r1, r4, abort=20f |
107 | ldr1w r1, r5, abort=20f | 120 | ldr1w r1, r5, abort=20f |
@@ -110,9 +123,16 @@ | |||
110 | ldr1w r1, r8, abort=20f | 123 | ldr1w r1, r8, abort=20f |
111 | ldr1w r1, lr, abort=20f | 124 | ldr1w r1, lr, abort=20f |
112 | 125 | ||
126 | #if LDR1W_SHIFT < STR1W_SHIFT | ||
127 | lsl ip, ip, #STR1W_SHIFT - LDR1W_SHIFT | ||
128 | #elif LDR1W_SHIFT > STR1W_SHIFT | ||
129 | lsr ip, ip, #LDR1W_SHIFT - STR1W_SHIFT | ||
130 | #endif | ||
113 | add pc, pc, ip | 131 | add pc, pc, ip |
114 | nop | 132 | nop |
115 | nop | 133 | .rept (1 << STR1W_SHIFT) |
134 | W(nop) | ||
135 | .endr | ||
116 | str1w r0, r3, abort=20f | 136 | str1w r0, r3, abort=20f |
117 | str1w r0, r4, abort=20f | 137 | str1w r0, r4, abort=20f |
118 | str1w r0, r5, abort=20f | 138 | str1w r0, r5, abort=20f |
diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S index 878820f0a320..1a71e1584442 100644 --- a/arch/arm/lib/copy_to_user.S +++ b/arch/arm/lib/copy_to_user.S | |||
@@ -33,8 +33,15 @@ | |||
33 | * Number of bytes NOT copied. | 33 | * Number of bytes NOT copied. |
34 | */ | 34 | */ |
35 | 35 | ||
36 | #define LDR1W_SHIFT 0 | ||
37 | #ifndef CONFIG_THUMB2_KERNEL | ||
38 | #define STR1W_SHIFT 0 | ||
39 | #else | ||
40 | #define STR1W_SHIFT 1 | ||
41 | #endif | ||
42 | |||
36 | .macro ldr1w ptr reg abort | 43 | .macro ldr1w ptr reg abort |
37 | ldr \reg, [\ptr], #4 | 44 | W(ldr) \reg, [\ptr], #4 |
38 | .endm | 45 | .endm |
39 | 46 | ||
40 | .macro ldr4w ptr reg1 reg2 reg3 reg4 abort | 47 | .macro ldr4w ptr reg1 reg2 reg3 reg4 abort |
@@ -50,10 +57,7 @@ | |||
50 | .endm | 57 | .endm |
51 | 58 | ||
52 | .macro str1w ptr reg abort | 59 | .macro str1w ptr reg abort |
53 | 100: strt \reg, [\ptr], #4 | 60 | strusr \reg, \ptr, 4, abort=\abort |
54 | .section __ex_table, "a" | ||
55 | .long 100b, \abort | ||
56 | .previous | ||
57 | .endm | 61 | .endm |
58 | 62 | ||
59 | .macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort | 63 | .macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort |
@@ -68,10 +72,7 @@ | |||
68 | .endm | 72 | .endm |
69 | 73 | ||
70 | .macro str1b ptr reg cond=al abort | 74 | .macro str1b ptr reg cond=al abort |
71 | 100: str\cond\()bt \reg, [\ptr], #1 | 75 | strusr \reg, \ptr, 1, \cond, abort=\abort |
72 | .section __ex_table, "a" | ||
73 | .long 100b, \abort | ||
74 | .previous | ||
75 | .endm | 76 | .endm |
76 | 77 | ||
77 | .macro enter reg1 reg2 | 78 | .macro enter reg1 reg2 |
diff --git a/arch/arm/lib/csumpartialcopyuser.S b/arch/arm/lib/csumpartialcopyuser.S index 14677fb4b0c4..fd0e9dcd9fdc 100644 --- a/arch/arm/lib/csumpartialcopyuser.S +++ b/arch/arm/lib/csumpartialcopyuser.S | |||
@@ -26,50 +26,28 @@ | |||
26 | .endm | 26 | .endm |
27 | 27 | ||
28 | .macro load1b, reg1 | 28 | .macro load1b, reg1 |
29 | 9999: ldrbt \reg1, [r0], $1 | 29 | ldrusr \reg1, r0, 1 |
30 | .section __ex_table, "a" | ||
31 | .align 3 | ||
32 | .long 9999b, 6001f | ||
33 | .previous | ||
34 | .endm | 30 | .endm |
35 | 31 | ||
36 | .macro load2b, reg1, reg2 | 32 | .macro load2b, reg1, reg2 |
37 | 9999: ldrbt \reg1, [r0], $1 | 33 | ldrusr \reg1, r0, 1 |
38 | 9998: ldrbt \reg2, [r0], $1 | 34 | ldrusr \reg2, r0, 1 |
39 | .section __ex_table, "a" | ||
40 | .long 9999b, 6001f | ||
41 | .long 9998b, 6001f | ||
42 | .previous | ||
43 | .endm | 35 | .endm |
44 | 36 | ||
45 | .macro load1l, reg1 | 37 | .macro load1l, reg1 |
46 | 9999: ldrt \reg1, [r0], $4 | 38 | ldrusr \reg1, r0, 4 |
47 | .section __ex_table, "a" | ||
48 | .align 3 | ||
49 | .long 9999b, 6001f | ||
50 | .previous | ||
51 | .endm | 39 | .endm |
52 | 40 | ||
53 | .macro load2l, reg1, reg2 | 41 | .macro load2l, reg1, reg2 |
54 | 9999: ldrt \reg1, [r0], $4 | 42 | ldrusr \reg1, r0, 4 |
55 | 9998: ldrt \reg2, [r0], $4 | 43 | ldrusr \reg2, r0, 4 |
56 | .section __ex_table, "a" | ||
57 | .long 9999b, 6001f | ||
58 | .long 9998b, 6001f | ||
59 | .previous | ||
60 | .endm | 44 | .endm |
61 | 45 | ||
62 | .macro load4l, reg1, reg2, reg3, reg4 | 46 | .macro load4l, reg1, reg2, reg3, reg4 |
63 | 9999: ldrt \reg1, [r0], $4 | 47 | ldrusr \reg1, r0, 4 |
64 | 9998: ldrt \reg2, [r0], $4 | 48 | ldrusr \reg2, r0, 4 |
65 | 9997: ldrt \reg3, [r0], $4 | 49 | ldrusr \reg3, r0, 4 |
66 | 9996: ldrt \reg4, [r0], $4 | 50 | ldrusr \reg4, r0, 4 |
67 | .section __ex_table, "a" | ||
68 | .long 9999b, 6001f | ||
69 | .long 9998b, 6001f | ||
70 | .long 9997b, 6001f | ||
71 | .long 9996b, 6001f | ||
72 | .previous | ||
73 | .endm | 51 | .endm |
74 | 52 | ||
75 | /* | 53 | /* |
@@ -92,14 +70,14 @@ | |||
92 | */ | 70 | */ |
93 | .section .fixup,"ax" | 71 | .section .fixup,"ax" |
94 | .align 4 | 72 | .align 4 |
95 | 6001: mov r4, #-EFAULT | 73 | 9001: mov r4, #-EFAULT |
96 | ldr r5, [fp, #4] @ *err_ptr | 74 | ldr r5, [fp, #4] @ *err_ptr |
97 | str r4, [r5] | 75 | str r4, [r5] |
98 | ldmia sp, {r1, r2} @ retrieve dst, len | 76 | ldmia sp, {r1, r2} @ retrieve dst, len |
99 | add r2, r2, r1 | 77 | add r2, r2, r1 |
100 | mov r0, #0 @ zero the buffer | 78 | mov r0, #0 @ zero the buffer |
101 | 6002: teq r2, r1 | 79 | 9002: teq r2, r1 |
102 | strneb r0, [r1], #1 | 80 | strneb r0, [r1], #1 |
103 | bne 6002b | 81 | bne 9002b |
104 | load_regs | 82 | load_regs |
105 | .previous | 83 | .previous |
diff --git a/arch/arm/lib/div64.S b/arch/arm/lib/div64.S index 1425e789ba86..faa7748142da 100644 --- a/arch/arm/lib/div64.S +++ b/arch/arm/lib/div64.S | |||
@@ -177,7 +177,9 @@ ENTRY(__do_div64) | |||
177 | mov yh, xh, lsr ip | 177 | mov yh, xh, lsr ip |
178 | mov yl, xl, lsr ip | 178 | mov yl, xl, lsr ip |
179 | rsb ip, ip, #32 | 179 | rsb ip, ip, #32 |
180 | orr yl, yl, xh, lsl ip | 180 | ARM( orr yl, yl, xh, lsl ip ) |
181 | THUMB( lsl xh, xh, ip ) | ||
182 | THUMB( orr yl, yl, xh ) | ||
181 | mov xh, xl, lsl ip | 183 | mov xh, xl, lsl ip |
182 | mov xh, xh, lsr ip | 184 | mov xh, xh, lsr ip |
183 | mov pc, lr | 185 | mov pc, lr |
diff --git a/arch/arm/lib/findbit.S b/arch/arm/lib/findbit.S index 8c4defc4f3c4..1e4cbd4e7be9 100644 --- a/arch/arm/lib/findbit.S +++ b/arch/arm/lib/findbit.S | |||
@@ -25,7 +25,10 @@ ENTRY(_find_first_zero_bit_le) | |||
25 | teq r1, #0 | 25 | teq r1, #0 |
26 | beq 3f | 26 | beq 3f |
27 | mov r2, #0 | 27 | mov r2, #0 |
28 | 1: ldrb r3, [r0, r2, lsr #3] | 28 | 1: |
29 | ARM( ldrb r3, [r0, r2, lsr #3] ) | ||
30 | THUMB( lsr r3, r2, #3 ) | ||
31 | THUMB( ldrb r3, [r0, r3] ) | ||
29 | eors r3, r3, #0xff @ invert bits | 32 | eors r3, r3, #0xff @ invert bits |
30 | bne .L_found @ any now set - found zero bit | 33 | bne .L_found @ any now set - found zero bit |
31 | add r2, r2, #8 @ next bit pointer | 34 | add r2, r2, #8 @ next bit pointer |
@@ -44,7 +47,9 @@ ENTRY(_find_next_zero_bit_le) | |||
44 | beq 3b | 47 | beq 3b |
45 | ands ip, r2, #7 | 48 | ands ip, r2, #7 |
46 | beq 1b @ If new byte, goto old routine | 49 | beq 1b @ If new byte, goto old routine |
47 | ldrb r3, [r0, r2, lsr #3] | 50 | ARM( ldrb r3, [r0, r2, lsr #3] ) |
51 | THUMB( lsr r3, r2, #3 ) | ||
52 | THUMB( ldrb r3, [r0, r3] ) | ||
48 | eor r3, r3, #0xff @ now looking for a 1 bit | 53 | eor r3, r3, #0xff @ now looking for a 1 bit |
49 | movs r3, r3, lsr ip @ shift off unused bits | 54 | movs r3, r3, lsr ip @ shift off unused bits |
50 | bne .L_found | 55 | bne .L_found |
@@ -61,7 +66,10 @@ ENTRY(_find_first_bit_le) | |||
61 | teq r1, #0 | 66 | teq r1, #0 |
62 | beq 3f | 67 | beq 3f |
63 | mov r2, #0 | 68 | mov r2, #0 |
64 | 1: ldrb r3, [r0, r2, lsr #3] | 69 | 1: |
70 | ARM( ldrb r3, [r0, r2, lsr #3] ) | ||
71 | THUMB( lsr r3, r2, #3 ) | ||
72 | THUMB( ldrb r3, [r0, r3] ) | ||
65 | movs r3, r3 | 73 | movs r3, r3 |
66 | bne .L_found @ any now set - found zero bit | 74 | bne .L_found @ any now set - found zero bit |
67 | add r2, r2, #8 @ next bit pointer | 75 | add r2, r2, #8 @ next bit pointer |
@@ -80,7 +88,9 @@ ENTRY(_find_next_bit_le) | |||
80 | beq 3b | 88 | beq 3b |
81 | ands ip, r2, #7 | 89 | ands ip, r2, #7 |
82 | beq 1b @ If new byte, goto old routine | 90 | beq 1b @ If new byte, goto old routine |
83 | ldrb r3, [r0, r2, lsr #3] | 91 | ARM( ldrb r3, [r0, r2, lsr #3] ) |
92 | THUMB( lsr r3, r2, #3 ) | ||
93 | THUMB( ldrb r3, [r0, r3] ) | ||
84 | movs r3, r3, lsr ip @ shift off unused bits | 94 | movs r3, r3, lsr ip @ shift off unused bits |
85 | bne .L_found | 95 | bne .L_found |
86 | orr r2, r2, #7 @ if zero, then no bits here | 96 | orr r2, r2, #7 @ if zero, then no bits here |
@@ -95,7 +105,9 @@ ENTRY(_find_first_zero_bit_be) | |||
95 | beq 3f | 105 | beq 3f |
96 | mov r2, #0 | 106 | mov r2, #0 |
97 | 1: eor r3, r2, #0x18 @ big endian byte ordering | 107 | 1: eor r3, r2, #0x18 @ big endian byte ordering |
98 | ldrb r3, [r0, r3, lsr #3] | 108 | ARM( ldrb r3, [r0, r3, lsr #3] ) |
109 | THUMB( lsr r3, #3 ) | ||
110 | THUMB( ldrb r3, [r0, r3] ) | ||
99 | eors r3, r3, #0xff @ invert bits | 111 | eors r3, r3, #0xff @ invert bits |
100 | bne .L_found @ any now set - found zero bit | 112 | bne .L_found @ any now set - found zero bit |
101 | add r2, r2, #8 @ next bit pointer | 113 | add r2, r2, #8 @ next bit pointer |
@@ -111,7 +123,9 @@ ENTRY(_find_next_zero_bit_be) | |||
111 | ands ip, r2, #7 | 123 | ands ip, r2, #7 |
112 | beq 1b @ If new byte, goto old routine | 124 | beq 1b @ If new byte, goto old routine |
113 | eor r3, r2, #0x18 @ big endian byte ordering | 125 | eor r3, r2, #0x18 @ big endian byte ordering |
114 | ldrb r3, [r0, r3, lsr #3] | 126 | ARM( ldrb r3, [r0, r3, lsr #3] ) |
127 | THUMB( lsr r3, #3 ) | ||
128 | THUMB( ldrb r3, [r0, r3] ) | ||
115 | eor r3, r3, #0xff @ now looking for a 1 bit | 129 | eor r3, r3, #0xff @ now looking for a 1 bit |
116 | movs r3, r3, lsr ip @ shift off unused bits | 130 | movs r3, r3, lsr ip @ shift off unused bits |
117 | bne .L_found | 131 | bne .L_found |
@@ -125,7 +139,9 @@ ENTRY(_find_first_bit_be) | |||
125 | beq 3f | 139 | beq 3f |
126 | mov r2, #0 | 140 | mov r2, #0 |
127 | 1: eor r3, r2, #0x18 @ big endian byte ordering | 141 | 1: eor r3, r2, #0x18 @ big endian byte ordering |
128 | ldrb r3, [r0, r3, lsr #3] | 142 | ARM( ldrb r3, [r0, r3, lsr #3] ) |
143 | THUMB( lsr r3, #3 ) | ||
144 | THUMB( ldrb r3, [r0, r3] ) | ||
129 | movs r3, r3 | 145 | movs r3, r3 |
130 | bne .L_found @ any now set - found zero bit | 146 | bne .L_found @ any now set - found zero bit |
131 | add r2, r2, #8 @ next bit pointer | 147 | add r2, r2, #8 @ next bit pointer |
@@ -141,7 +157,9 @@ ENTRY(_find_next_bit_be) | |||
141 | ands ip, r2, #7 | 157 | ands ip, r2, #7 |
142 | beq 1b @ If new byte, goto old routine | 158 | beq 1b @ If new byte, goto old routine |
143 | eor r3, r2, #0x18 @ big endian byte ordering | 159 | eor r3, r2, #0x18 @ big endian byte ordering |
144 | ldrb r3, [r0, r3, lsr #3] | 160 | ARM( ldrb r3, [r0, r3, lsr #3] ) |
161 | THUMB( lsr r3, #3 ) | ||
162 | THUMB( ldrb r3, [r0, r3] ) | ||
145 | movs r3, r3, lsr ip @ shift off unused bits | 163 | movs r3, r3, lsr ip @ shift off unused bits |
146 | bne .L_found | 164 | bne .L_found |
147 | orr r2, r2, #7 @ if zero, then no bits here | 165 | orr r2, r2, #7 @ if zero, then no bits here |
diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S index 6763088b7607..a1814d927122 100644 --- a/arch/arm/lib/getuser.S +++ b/arch/arm/lib/getuser.S | |||
@@ -36,8 +36,13 @@ ENTRY(__get_user_1) | |||
36 | ENDPROC(__get_user_1) | 36 | ENDPROC(__get_user_1) |
37 | 37 | ||
38 | ENTRY(__get_user_2) | 38 | ENTRY(__get_user_2) |
39 | #ifdef CONFIG_THUMB2_KERNEL | ||
40 | 2: ldrbt r2, [r0] | ||
41 | 3: ldrbt r3, [r0, #1] | ||
42 | #else | ||
39 | 2: ldrbt r2, [r0], #1 | 43 | 2: ldrbt r2, [r0], #1 |
40 | 3: ldrbt r3, [r0] | 44 | 3: ldrbt r3, [r0] |
45 | #endif | ||
41 | #ifndef __ARMEB__ | 46 | #ifndef __ARMEB__ |
42 | orr r2, r2, r3, lsl #8 | 47 | orr r2, r2, r3, lsl #8 |
43 | #else | 48 | #else |
diff --git a/arch/arm/lib/io-writesw-armv4.S b/arch/arm/lib/io-writesw-armv4.S index d6585612c86b..ff4f71b579ee 100644 --- a/arch/arm/lib/io-writesw-armv4.S +++ b/arch/arm/lib/io-writesw-armv4.S | |||
@@ -75,7 +75,10 @@ ENTRY(__raw_writesw) | |||
75 | #endif | 75 | #endif |
76 | 76 | ||
77 | .Loutsw_noalign: | 77 | .Loutsw_noalign: |
78 | ldr r3, [r1, -r3]! | 78 | ARM( ldr r3, [r1, -r3]! ) |
79 | THUMB( rsb r3, r3, #0 ) | ||
80 | THUMB( ldr r3, [r1, r3] ) | ||
81 | THUMB( sub r1, r3 ) | ||
79 | subcs r2, r2, #1 | 82 | subcs r2, r2, #1 |
80 | bcs 2f | 83 | bcs 2f |
81 | subs r2, r2, #2 | 84 | subs r2, r2, #2 |
diff --git a/arch/arm/lib/lshrdi3.S b/arch/arm/lib/lshrdi3.S index 99ea338bf87c..f83d449141f7 100644 --- a/arch/arm/lib/lshrdi3.S +++ b/arch/arm/lib/lshrdi3.S | |||
@@ -43,7 +43,9 @@ ENTRY(__aeabi_llsr) | |||
43 | rsb ip, r2, #32 | 43 | rsb ip, r2, #32 |
44 | movmi al, al, lsr r2 | 44 | movmi al, al, lsr r2 |
45 | movpl al, ah, lsr r3 | 45 | movpl al, ah, lsr r3 |
46 | orrmi al, al, ah, lsl ip | 46 | ARM( orrmi al, al, ah, lsl ip ) |
47 | THUMB( lslmi r3, ah, ip ) | ||
48 | THUMB( orrmi al, al, r3 ) | ||
47 | mov ah, ah, lsr r2 | 49 | mov ah, ah, lsr r2 |
48 | mov pc, lr | 50 | mov pc, lr |
49 | 51 | ||
diff --git a/arch/arm/lib/memcpy.S b/arch/arm/lib/memcpy.S index e0d002641d3f..a9b9e2287a09 100644 --- a/arch/arm/lib/memcpy.S +++ b/arch/arm/lib/memcpy.S | |||
@@ -13,8 +13,11 @@ | |||
13 | #include <linux/linkage.h> | 13 | #include <linux/linkage.h> |
14 | #include <asm/assembler.h> | 14 | #include <asm/assembler.h> |
15 | 15 | ||
16 | #define LDR1W_SHIFT 0 | ||
17 | #define STR1W_SHIFT 0 | ||
18 | |||
16 | .macro ldr1w ptr reg abort | 19 | .macro ldr1w ptr reg abort |
17 | ldr \reg, [\ptr], #4 | 20 | W(ldr) \reg, [\ptr], #4 |
18 | .endm | 21 | .endm |
19 | 22 | ||
20 | .macro ldr4w ptr reg1 reg2 reg3 reg4 abort | 23 | .macro ldr4w ptr reg1 reg2 reg3 reg4 abort |
@@ -30,7 +33,7 @@ | |||
30 | .endm | 33 | .endm |
31 | 34 | ||
32 | .macro str1w ptr reg abort | 35 | .macro str1w ptr reg abort |
33 | str \reg, [\ptr], #4 | 36 | W(str) \reg, [\ptr], #4 |
34 | .endm | 37 | .endm |
35 | 38 | ||
36 | .macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort | 39 | .macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort |
diff --git a/arch/arm/lib/memmove.S b/arch/arm/lib/memmove.S index 12549187088c..5025c863713d 100644 --- a/arch/arm/lib/memmove.S +++ b/arch/arm/lib/memmove.S | |||
@@ -75,24 +75,24 @@ ENTRY(memmove) | |||
75 | addne pc, pc, ip @ C is always clear here | 75 | addne pc, pc, ip @ C is always clear here |
76 | b 7f | 76 | b 7f |
77 | 6: nop | 77 | 6: nop |
78 | ldr r3, [r1, #-4]! | 78 | W(ldr) r3, [r1, #-4]! |
79 | ldr r4, [r1, #-4]! | 79 | W(ldr) r4, [r1, #-4]! |
80 | ldr r5, [r1, #-4]! | 80 | W(ldr) r5, [r1, #-4]! |
81 | ldr r6, [r1, #-4]! | 81 | W(ldr) r6, [r1, #-4]! |
82 | ldr r7, [r1, #-4]! | 82 | W(ldr) r7, [r1, #-4]! |
83 | ldr r8, [r1, #-4]! | 83 | W(ldr) r8, [r1, #-4]! |
84 | ldr lr, [r1, #-4]! | 84 | W(ldr) lr, [r1, #-4]! |
85 | 85 | ||
86 | add pc, pc, ip | 86 | add pc, pc, ip |
87 | nop | 87 | nop |
88 | nop | 88 | nop |
89 | str r3, [r0, #-4]! | 89 | W(str) r3, [r0, #-4]! |
90 | str r4, [r0, #-4]! | 90 | W(str) r4, [r0, #-4]! |
91 | str r5, [r0, #-4]! | 91 | W(str) r5, [r0, #-4]! |
92 | str r6, [r0, #-4]! | 92 | W(str) r6, [r0, #-4]! |
93 | str r7, [r0, #-4]! | 93 | W(str) r7, [r0, #-4]! |
94 | str r8, [r0, #-4]! | 94 | W(str) r8, [r0, #-4]! |
95 | str lr, [r0, #-4]! | 95 | W(str) lr, [r0, #-4]! |
96 | 96 | ||
97 | CALGN( bcs 2b ) | 97 | CALGN( bcs 2b ) |
98 | 98 | ||
diff --git a/arch/arm/lib/putuser.S b/arch/arm/lib/putuser.S index 864f3c1c4f18..02fedbf07c0d 100644 --- a/arch/arm/lib/putuser.S +++ b/arch/arm/lib/putuser.S | |||
@@ -37,6 +37,15 @@ ENDPROC(__put_user_1) | |||
37 | 37 | ||
38 | ENTRY(__put_user_2) | 38 | ENTRY(__put_user_2) |
39 | mov ip, r2, lsr #8 | 39 | mov ip, r2, lsr #8 |
40 | #ifdef CONFIG_THUMB2_KERNEL | ||
41 | #ifndef __ARMEB__ | ||
42 | 2: strbt r2, [r0] | ||
43 | 3: strbt ip, [r0, #1] | ||
44 | #else | ||
45 | 2: strbt ip, [r0] | ||
46 | 3: strbt r2, [r0, #1] | ||
47 | #endif | ||
48 | #else /* !CONFIG_THUMB2_KERNEL */ | ||
40 | #ifndef __ARMEB__ | 49 | #ifndef __ARMEB__ |
41 | 2: strbt r2, [r0], #1 | 50 | 2: strbt r2, [r0], #1 |
42 | 3: strbt ip, [r0] | 51 | 3: strbt ip, [r0] |
@@ -44,6 +53,7 @@ ENTRY(__put_user_2) | |||
44 | 2: strbt ip, [r0], #1 | 53 | 2: strbt ip, [r0], #1 |
45 | 3: strbt r2, [r0] | 54 | 3: strbt r2, [r0] |
46 | #endif | 55 | #endif |
56 | #endif /* CONFIG_THUMB2_KERNEL */ | ||
47 | mov r0, #0 | 57 | mov r0, #0 |
48 | mov pc, lr | 58 | mov pc, lr |
49 | ENDPROC(__put_user_2) | 59 | ENDPROC(__put_user_2) |
@@ -55,8 +65,13 @@ ENTRY(__put_user_4) | |||
55 | ENDPROC(__put_user_4) | 65 | ENDPROC(__put_user_4) |
56 | 66 | ||
57 | ENTRY(__put_user_8) | 67 | ENTRY(__put_user_8) |
68 | #ifdef CONFIG_THUMB2_KERNEL | ||
69 | 5: strt r2, [r0] | ||
70 | 6: strt r3, [r0, #4] | ||
71 | #else | ||
58 | 5: strt r2, [r0], #4 | 72 | 5: strt r2, [r0], #4 |
59 | 6: strt r3, [r0] | 73 | 6: strt r3, [r0] |
74 | #endif | ||
60 | mov r0, #0 | 75 | mov r0, #0 |
61 | mov pc, lr | 76 | mov pc, lr |
62 | ENDPROC(__put_user_8) | 77 | ENDPROC(__put_user_8) |
diff --git a/arch/arm/lib/sha1.S b/arch/arm/lib/sha1.S index a16fb208c841..09b548cac1a4 100644 --- a/arch/arm/lib/sha1.S +++ b/arch/arm/lib/sha1.S | |||
@@ -187,6 +187,7 @@ ENTRY(sha_transform) | |||
187 | 187 | ||
188 | ENDPROC(sha_transform) | 188 | ENDPROC(sha_transform) |
189 | 189 | ||
190 | .align 2 | ||
190 | .L_sha_K: | 191 | .L_sha_K: |
191 | .word 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6 | 192 | .word 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6 |
192 | 193 | ||
@@ -195,6 +196,7 @@ ENDPROC(sha_transform) | |||
195 | * void sha_init(__u32 *buf) | 196 | * void sha_init(__u32 *buf) |
196 | */ | 197 | */ |
197 | 198 | ||
199 | .align 2 | ||
198 | .L_sha_initial_digest: | 200 | .L_sha_initial_digest: |
199 | .word 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 | 201 | .word 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 |
200 | 202 | ||
diff --git a/arch/arm/lib/strncpy_from_user.S b/arch/arm/lib/strncpy_from_user.S index 330373c26dd9..1c9814f346c6 100644 --- a/arch/arm/lib/strncpy_from_user.S +++ b/arch/arm/lib/strncpy_from_user.S | |||
@@ -23,7 +23,7 @@ | |||
23 | ENTRY(__strncpy_from_user) | 23 | ENTRY(__strncpy_from_user) |
24 | mov ip, r1 | 24 | mov ip, r1 |
25 | 1: subs r2, r2, #1 | 25 | 1: subs r2, r2, #1 |
26 | USER( ldrplbt r3, [r1], #1) | 26 | ldrusr r3, r1, 1, pl |
27 | bmi 2f | 27 | bmi 2f |
28 | strb r3, [r0], #1 | 28 | strb r3, [r0], #1 |
29 | teq r3, #0 | 29 | teq r3, #0 |
diff --git a/arch/arm/lib/strnlen_user.S b/arch/arm/lib/strnlen_user.S index 90bb9d020836..7855b2906659 100644 --- a/arch/arm/lib/strnlen_user.S +++ b/arch/arm/lib/strnlen_user.S | |||
@@ -23,7 +23,7 @@ | |||
23 | ENTRY(__strnlen_user) | 23 | ENTRY(__strnlen_user) |
24 | mov r2, r0 | 24 | mov r2, r0 |
25 | 1: | 25 | 1: |
26 | USER( ldrbt r3, [r0], #1) | 26 | ldrusr r3, r0, 1 |
27 | teq r3, #0 | 27 | teq r3, #0 |
28 | beq 2f | 28 | beq 2f |
29 | subs r1, r1, #1 | 29 | subs r1, r1, #1 |
diff --git a/arch/arm/mach-integrator/include/mach/hardware.h b/arch/arm/mach-integrator/include/mach/hardware.h index 1251319ef9ae..d795642fad22 100644 --- a/arch/arm/mach-integrator/include/mach/hardware.h +++ b/arch/arm/mach-integrator/include/mach/hardware.h | |||
@@ -36,8 +36,12 @@ | |||
36 | #define PCIO_BASE PCI_IO_VADDR | 36 | #define PCIO_BASE PCI_IO_VADDR |
37 | #define PCIMEM_BASE PCI_MEMORY_VADDR | 37 | #define PCIMEM_BASE PCI_MEMORY_VADDR |
38 | 38 | ||
39 | #ifdef CONFIG_MMU | ||
39 | /* macro to get at IO space when running virtually */ | 40 | /* macro to get at IO space when running virtually */ |
40 | #define IO_ADDRESS(x) (((x) >> 4) + IO_BASE) | 41 | #define IO_ADDRESS(x) (((x) >> 4) + IO_BASE) |
42 | #else | ||
43 | #define IO_ADDRESS(x) (x) | ||
44 | #endif | ||
41 | 45 | ||
42 | #define pcibios_assign_all_busses() 1 | 46 | #define pcibios_assign_all_busses() 1 |
43 | 47 | ||
diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c index 4ac04055c2ea..452931b2690e 100644 --- a/arch/arm/mach-integrator/integrator_cp.c +++ b/arch/arm/mach-integrator/integrator_cp.c | |||
@@ -49,14 +49,14 @@ | |||
49 | 49 | ||
50 | #define INTCP_PA_CLCD_BASE 0xc0000000 | 50 | #define INTCP_PA_CLCD_BASE 0xc0000000 |
51 | 51 | ||
52 | #define INTCP_VA_CIC_BASE 0xf1000040 | 52 | #define INTCP_VA_CIC_BASE IO_ADDRESS(INTEGRATOR_HDR_BASE) + 0x40 |
53 | #define INTCP_VA_PIC_BASE 0xf1400000 | 53 | #define INTCP_VA_PIC_BASE IO_ADDRESS(INTEGRATOR_IC_BASE) |
54 | #define INTCP_VA_SIC_BASE 0xfca00000 | 54 | #define INTCP_VA_SIC_BASE IO_ADDRESS(0xca000000) |
55 | 55 | ||
56 | #define INTCP_PA_ETH_BASE 0xc8000000 | 56 | #define INTCP_PA_ETH_BASE 0xc8000000 |
57 | #define INTCP_ETH_SIZE 0x10 | 57 | #define INTCP_ETH_SIZE 0x10 |
58 | 58 | ||
59 | #define INTCP_VA_CTRL_BASE 0xfcb00000 | 59 | #define INTCP_VA_CTRL_BASE IO_ADDRESS(0xcb000000) |
60 | #define INTCP_FLASHPROG 0x04 | 60 | #define INTCP_FLASHPROG 0x04 |
61 | #define CINTEGRATOR_FLASHPROG_FLVPPEN (1 << 0) | 61 | #define CINTEGRATOR_FLASHPROG_FLVPPEN (1 << 0) |
62 | #define CINTEGRATOR_FLASHPROG_FLWREN (1 << 1) | 62 | #define CINTEGRATOR_FLASHPROG_FLWREN (1 << 1) |
@@ -121,12 +121,12 @@ static struct map_desc intcp_io_desc[] __initdata = { | |||
121 | .length = SZ_4K, | 121 | .length = SZ_4K, |
122 | .type = MT_DEVICE | 122 | .type = MT_DEVICE |
123 | }, { | 123 | }, { |
124 | .virtual = 0xfca00000, | 124 | .virtual = IO_ADDRESS(0xca000000), |
125 | .pfn = __phys_to_pfn(0xca000000), | 125 | .pfn = __phys_to_pfn(0xca000000), |
126 | .length = SZ_4K, | 126 | .length = SZ_4K, |
127 | .type = MT_DEVICE | 127 | .type = MT_DEVICE |
128 | }, { | 128 | }, { |
129 | .virtual = 0xfcb00000, | 129 | .virtual = IO_ADDRESS(0xcb000000), |
130 | .pfn = __phys_to_pfn(0xcb000000), | 130 | .pfn = __phys_to_pfn(0xcb000000), |
131 | .length = SZ_4K, | 131 | .length = SZ_4K, |
132 | .type = MT_DEVICE | 132 | .type = MT_DEVICE |
@@ -394,8 +394,8 @@ static struct platform_device *intcp_devs[] __initdata = { | |||
394 | */ | 394 | */ |
395 | static unsigned int mmc_status(struct device *dev) | 395 | static unsigned int mmc_status(struct device *dev) |
396 | { | 396 | { |
397 | unsigned int status = readl(0xfca00004); | 397 | unsigned int status = readl(IO_ADDRESS(0xca000000) + 4); |
398 | writel(8, 0xfcb00008); | 398 | writel(8, IO_ADDRESS(0xcb000000) + 8); |
399 | 399 | ||
400 | return status & 8; | 400 | return status & 8; |
401 | } | 401 | } |
diff --git a/arch/arm/mach-kirkwood/Kconfig b/arch/arm/mach-kirkwood/Kconfig index 25100f7acf4c..0aca451b216d 100644 --- a/arch/arm/mach-kirkwood/Kconfig +++ b/arch/arm/mach-kirkwood/Kconfig | |||
@@ -38,6 +38,12 @@ config MACH_TS219 | |||
38 | Say 'Y' here if you want your kernel to support the | 38 | Say 'Y' here if you want your kernel to support the |
39 | QNAP TS-119 and TS-219 Turbo NAS devices. | 39 | QNAP TS-119 and TS-219 Turbo NAS devices. |
40 | 40 | ||
41 | config MACH_OPENRD_BASE | ||
42 | bool "Marvell OpenRD Base Board" | ||
43 | help | ||
44 | Say 'Y' here if you want your kernel to support the | ||
45 | Marvell OpenRD Base Board. | ||
46 | |||
41 | endmenu | 47 | endmenu |
42 | 48 | ||
43 | endif | 49 | endif |
diff --git a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile index 9dd680e964d6..80ab0ec90ee1 100644 --- a/arch/arm/mach-kirkwood/Makefile +++ b/arch/arm/mach-kirkwood/Makefile | |||
@@ -6,5 +6,6 @@ obj-$(CONFIG_MACH_RD88F6281) += rd88f6281-setup.o | |||
6 | obj-$(CONFIG_MACH_MV88F6281GTW_GE) += mv88f6281gtw_ge-setup.o | 6 | obj-$(CONFIG_MACH_MV88F6281GTW_GE) += mv88f6281gtw_ge-setup.o |
7 | obj-$(CONFIG_MACH_SHEEVAPLUG) += sheevaplug-setup.o | 7 | obj-$(CONFIG_MACH_SHEEVAPLUG) += sheevaplug-setup.o |
8 | obj-$(CONFIG_MACH_TS219) += ts219-setup.o | 8 | obj-$(CONFIG_MACH_TS219) += ts219-setup.o |
9 | obj-$(CONFIG_MACH_OPENRD_BASE) += openrd_base-setup.o | ||
9 | 10 | ||
10 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o | 11 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index 0f6919838011..0acb61f3c10b 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
@@ -838,7 +838,8 @@ int __init kirkwood_find_tclk(void) | |||
838 | u32 dev, rev; | 838 | u32 dev, rev; |
839 | 839 | ||
840 | kirkwood_pcie_id(&dev, &rev); | 840 | kirkwood_pcie_id(&dev, &rev); |
841 | if (dev == MV88F6281_DEV_ID && rev == MV88F6281_REV_A0) | 841 | if (dev == MV88F6281_DEV_ID && (rev == MV88F6281_REV_A0 || |
842 | rev == MV88F6281_REV_A1)) | ||
842 | return 200000000; | 843 | return 200000000; |
843 | 844 | ||
844 | return 166666667; | 845 | return 166666667; |
@@ -872,6 +873,8 @@ static char * __init kirkwood_id(void) | |||
872 | return "MV88F6281-Z0"; | 873 | return "MV88F6281-Z0"; |
873 | else if (rev == MV88F6281_REV_A0) | 874 | else if (rev == MV88F6281_REV_A0) |
874 | return "MV88F6281-A0"; | 875 | return "MV88F6281-A0"; |
876 | else if (rev == MV88F6281_REV_A1) | ||
877 | return "MV88F6281-A1"; | ||
875 | else | 878 | else |
876 | return "MV88F6281-Rev-Unsupported"; | 879 | return "MV88F6281-Rev-Unsupported"; |
877 | } else if (dev == MV88F6192_DEV_ID) { | 880 | } else if (dev == MV88F6192_DEV_ID) { |
diff --git a/arch/arm/mach-kirkwood/include/mach/kirkwood.h b/arch/arm/mach-kirkwood/include/mach/kirkwood.h index 07af858814a0..54c132731d2d 100644 --- a/arch/arm/mach-kirkwood/include/mach/kirkwood.h +++ b/arch/arm/mach-kirkwood/include/mach/kirkwood.h | |||
@@ -101,6 +101,7 @@ | |||
101 | #define MV88F6281_DEV_ID 0x6281 | 101 | #define MV88F6281_DEV_ID 0x6281 |
102 | #define MV88F6281_REV_Z0 0 | 102 | #define MV88F6281_REV_Z0 0 |
103 | #define MV88F6281_REV_A0 2 | 103 | #define MV88F6281_REV_A0 2 |
104 | #define MV88F6281_REV_A1 3 | ||
104 | 105 | ||
105 | #define MV88F6192_DEV_ID 0x6192 | 106 | #define MV88F6192_DEV_ID 0x6192 |
106 | #define MV88F6192_REV_Z0 0 | 107 | #define MV88F6192_REV_Z0 0 |
diff --git a/arch/arm/mach-kirkwood/openrd_base-setup.c b/arch/arm/mach-kirkwood/openrd_base-setup.c new file mode 100644 index 000000000000..947dfb8cd5b2 --- /dev/null +++ b/arch/arm/mach-kirkwood/openrd_base-setup.c | |||
@@ -0,0 +1,84 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-kirkwood/openrd_base-setup.c | ||
3 | * | ||
4 | * Marvell OpenRD Base Board Setup | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/mtd/partitions.h> | ||
15 | #include <linux/ata_platform.h> | ||
16 | #include <linux/mv643xx_eth.h> | ||
17 | #include <asm/mach-types.h> | ||
18 | #include <asm/mach/arch.h> | ||
19 | #include <mach/kirkwood.h> | ||
20 | #include <plat/mvsdio.h> | ||
21 | #include "common.h" | ||
22 | #include "mpp.h" | ||
23 | |||
24 | static struct mtd_partition openrd_base_nand_parts[] = { | ||
25 | { | ||
26 | .name = "u-boot", | ||
27 | .offset = 0, | ||
28 | .size = SZ_1M | ||
29 | }, { | ||
30 | .name = "uImage", | ||
31 | .offset = MTDPART_OFS_NXTBLK, | ||
32 | .size = SZ_4M | ||
33 | }, { | ||
34 | .name = "root", | ||
35 | .offset = MTDPART_OFS_NXTBLK, | ||
36 | .size = MTDPART_SIZ_FULL | ||
37 | }, | ||
38 | }; | ||
39 | |||
40 | static struct mv643xx_eth_platform_data openrd_base_ge00_data = { | ||
41 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | ||
42 | }; | ||
43 | |||
44 | static struct mv_sata_platform_data openrd_base_sata_data = { | ||
45 | .n_ports = 2, | ||
46 | }; | ||
47 | |||
48 | static struct mvsdio_platform_data openrd_base_mvsdio_data = { | ||
49 | .gpio_card_detect = 29, /* MPP29 used as SD card detect */ | ||
50 | }; | ||
51 | |||
52 | static unsigned int openrd_base_mpp_config[] __initdata = { | ||
53 | MPP29_GPIO, | ||
54 | 0 | ||
55 | }; | ||
56 | |||
57 | static void __init openrd_base_init(void) | ||
58 | { | ||
59 | /* | ||
60 | * Basic setup. Needs to be called early. | ||
61 | */ | ||
62 | kirkwood_init(); | ||
63 | kirkwood_mpp_conf(openrd_base_mpp_config); | ||
64 | |||
65 | kirkwood_uart0_init(); | ||
66 | kirkwood_nand_init(ARRAY_AND_SIZE(openrd_base_nand_parts), 25); | ||
67 | |||
68 | kirkwood_ehci_init(); | ||
69 | |||
70 | kirkwood_ge00_init(&openrd_base_ge00_data); | ||
71 | kirkwood_sata_init(&openrd_base_sata_data); | ||
72 | kirkwood_sdio_init(&openrd_base_mvsdio_data); | ||
73 | } | ||
74 | |||
75 | MACHINE_START(OPENRD_BASE, "Marvell OpenRD Base Board") | ||
76 | /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */ | ||
77 | .phys_io = KIRKWOOD_REGS_PHYS_BASE, | ||
78 | .io_pg_offst = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc, | ||
79 | .boot_params = 0x00000100, | ||
80 | .init_machine = openrd_base_init, | ||
81 | .map_io = kirkwood_map_io, | ||
82 | .init_irq = kirkwood_init_irq, | ||
83 | .timer = &kirkwood_timer, | ||
84 | MACHINE_END | ||
diff --git a/arch/arm/mach-mx1/clock.c b/arch/arm/mach-mx1/clock.c index 0d0f306851d0..d1b588519ad2 100644 --- a/arch/arm/mach-mx1/clock.c +++ b/arch/arm/mach-mx1/clock.c | |||
@@ -18,11 +18,14 @@ | |||
18 | 18 | ||
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/list.h> | ||
21 | #include <linux/math64.h> | 22 | #include <linux/math64.h> |
22 | #include <linux/err.h> | 23 | #include <linux/err.h> |
23 | #include <linux/clk.h> | 24 | #include <linux/clk.h> |
24 | #include <linux/io.h> | 25 | #include <linux/io.h> |
25 | 26 | ||
27 | #include <asm/clkdev.h> | ||
28 | |||
26 | #include <mach/clock.h> | 29 | #include <mach/clock.h> |
27 | #include <mach/hardware.h> | 30 | #include <mach/hardware.h> |
28 | #include <mach/common.h> | 31 | #include <mach/common.h> |
@@ -94,7 +97,6 @@ static unsigned long clk16m_get_rate(struct clk *clk) | |||
94 | } | 97 | } |
95 | 98 | ||
96 | static struct clk clk16m = { | 99 | static struct clk clk16m = { |
97 | .name = "CLK16M", | ||
98 | .get_rate = clk16m_get_rate, | 100 | .get_rate = clk16m_get_rate, |
99 | .enable = _clk_enable, | 101 | .enable = _clk_enable, |
100 | .enable_reg = CCM_CSCR, | 102 | .enable_reg = CCM_CSCR, |
@@ -111,7 +113,6 @@ static unsigned long clk32_get_rate(struct clk *clk) | |||
111 | } | 113 | } |
112 | 114 | ||
113 | static struct clk clk32 = { | 115 | static struct clk clk32 = { |
114 | .name = "CLK32", | ||
115 | .get_rate = clk32_get_rate, | 116 | .get_rate = clk32_get_rate, |
116 | }; | 117 | }; |
117 | 118 | ||
@@ -121,7 +122,6 @@ static unsigned long clk32_premult_get_rate(struct clk *clk) | |||
121 | } | 122 | } |
122 | 123 | ||
123 | static struct clk clk32_premult = { | 124 | static struct clk clk32_premult = { |
124 | .name = "CLK32_premultiplier", | ||
125 | .parent = &clk32, | 125 | .parent = &clk32, |
126 | .get_rate = clk32_premult_get_rate, | 126 | .get_rate = clk32_premult_get_rate, |
127 | }; | 127 | }; |
@@ -156,7 +156,6 @@ static int prem_clk_set_parent(struct clk *clk, struct clk *parent) | |||
156 | } | 156 | } |
157 | 157 | ||
158 | static struct clk prem_clk = { | 158 | static struct clk prem_clk = { |
159 | .name = "prem_clk", | ||
160 | .set_parent = prem_clk_set_parent, | 159 | .set_parent = prem_clk_set_parent, |
161 | }; | 160 | }; |
162 | 161 | ||
@@ -167,7 +166,6 @@ static unsigned long system_clk_get_rate(struct clk *clk) | |||
167 | } | 166 | } |
168 | 167 | ||
169 | static struct clk system_clk = { | 168 | static struct clk system_clk = { |
170 | .name = "system_clk", | ||
171 | .parent = &prem_clk, | 169 | .parent = &prem_clk, |
172 | .get_rate = system_clk_get_rate, | 170 | .get_rate = system_clk_get_rate, |
173 | }; | 171 | }; |
@@ -179,7 +177,6 @@ static unsigned long mcu_clk_get_rate(struct clk *clk) | |||
179 | } | 177 | } |
180 | 178 | ||
181 | static struct clk mcu_clk = { | 179 | static struct clk mcu_clk = { |
182 | .name = "mcu_clk", | ||
183 | .parent = &clk32_premult, | 180 | .parent = &clk32_premult, |
184 | .get_rate = mcu_clk_get_rate, | 181 | .get_rate = mcu_clk_get_rate, |
185 | }; | 182 | }; |
@@ -195,7 +192,6 @@ static unsigned long fclk_get_rate(struct clk *clk) | |||
195 | } | 192 | } |
196 | 193 | ||
197 | static struct clk fclk = { | 194 | static struct clk fclk = { |
198 | .name = "fclk", | ||
199 | .parent = &mcu_clk, | 195 | .parent = &mcu_clk, |
200 | .get_rate = fclk_get_rate, | 196 | .get_rate = fclk_get_rate, |
201 | }; | 197 | }; |
@@ -238,7 +234,6 @@ static int hclk_set_rate(struct clk *clk, unsigned long rate) | |||
238 | } | 234 | } |
239 | 235 | ||
240 | static struct clk hclk = { | 236 | static struct clk hclk = { |
241 | .name = "hclk", | ||
242 | .parent = &system_clk, | 237 | .parent = &system_clk, |
243 | .get_rate = hclk_get_rate, | 238 | .get_rate = hclk_get_rate, |
244 | .round_rate = hclk_round_rate, | 239 | .round_rate = hclk_round_rate, |
@@ -280,7 +275,6 @@ static int clk48m_set_rate(struct clk *clk, unsigned long rate) | |||
280 | } | 275 | } |
281 | 276 | ||
282 | static struct clk clk48m = { | 277 | static struct clk clk48m = { |
283 | .name = "CLK48M", | ||
284 | .parent = &system_clk, | 278 | .parent = &system_clk, |
285 | .get_rate = clk48m_get_rate, | 279 | .get_rate = clk48m_get_rate, |
286 | .round_rate = clk48m_round_rate, | 280 | .round_rate = clk48m_round_rate, |
@@ -400,21 +394,18 @@ static int perclk3_set_rate(struct clk *clk, unsigned long rate) | |||
400 | 394 | ||
401 | static struct clk perclk[] = { | 395 | static struct clk perclk[] = { |
402 | { | 396 | { |
403 | .name = "perclk", | ||
404 | .id = 0, | 397 | .id = 0, |
405 | .parent = &system_clk, | 398 | .parent = &system_clk, |
406 | .get_rate = perclk1_get_rate, | 399 | .get_rate = perclk1_get_rate, |
407 | .round_rate = perclk1_round_rate, | 400 | .round_rate = perclk1_round_rate, |
408 | .set_rate = perclk1_set_rate, | 401 | .set_rate = perclk1_set_rate, |
409 | }, { | 402 | }, { |
410 | .name = "perclk", | ||
411 | .id = 1, | 403 | .id = 1, |
412 | .parent = &system_clk, | 404 | .parent = &system_clk, |
413 | .get_rate = perclk2_get_rate, | 405 | .get_rate = perclk2_get_rate, |
414 | .round_rate = perclk2_round_rate, | 406 | .round_rate = perclk2_round_rate, |
415 | .set_rate = perclk2_set_rate, | 407 | .set_rate = perclk2_set_rate, |
416 | }, { | 408 | }, { |
417 | .name = "perclk", | ||
418 | .id = 2, | 409 | .id = 2, |
419 | .parent = &system_clk, | 410 | .parent = &system_clk, |
420 | .get_rate = perclk3_get_rate, | 411 | .get_rate = perclk3_get_rate, |
@@ -457,12 +448,10 @@ static int clko_set_parent(struct clk *clk, struct clk *parent) | |||
457 | } | 448 | } |
458 | 449 | ||
459 | static struct clk clko_clk = { | 450 | static struct clk clko_clk = { |
460 | .name = "clko_clk", | ||
461 | .set_parent = clko_set_parent, | 451 | .set_parent = clko_set_parent, |
462 | }; | 452 | }; |
463 | 453 | ||
464 | static struct clk dma_clk = { | 454 | static struct clk dma_clk = { |
465 | .name = "dma", | ||
466 | .parent = &hclk, | 455 | .parent = &hclk, |
467 | .round_rate = _clk_parent_round_rate, | 456 | .round_rate = _clk_parent_round_rate, |
468 | .set_rate = _clk_parent_set_rate, | 457 | .set_rate = _clk_parent_set_rate, |
@@ -473,7 +462,6 @@ static struct clk dma_clk = { | |||
473 | }; | 462 | }; |
474 | 463 | ||
475 | static struct clk csi_clk = { | 464 | static struct clk csi_clk = { |
476 | .name = "csi_clk", | ||
477 | .parent = &hclk, | 465 | .parent = &hclk, |
478 | .round_rate = _clk_parent_round_rate, | 466 | .round_rate = _clk_parent_round_rate, |
479 | .set_rate = _clk_parent_set_rate, | 467 | .set_rate = _clk_parent_set_rate, |
@@ -484,7 +472,6 @@ static struct clk csi_clk = { | |||
484 | }; | 472 | }; |
485 | 473 | ||
486 | static struct clk mma_clk = { | 474 | static struct clk mma_clk = { |
487 | .name = "mma_clk", | ||
488 | .parent = &hclk, | 475 | .parent = &hclk, |
489 | .round_rate = _clk_parent_round_rate, | 476 | .round_rate = _clk_parent_round_rate, |
490 | .set_rate = _clk_parent_set_rate, | 477 | .set_rate = _clk_parent_set_rate, |
@@ -495,7 +482,6 @@ static struct clk mma_clk = { | |||
495 | }; | 482 | }; |
496 | 483 | ||
497 | static struct clk usbd_clk = { | 484 | static struct clk usbd_clk = { |
498 | .name = "usbd_clk", | ||
499 | .parent = &clk48m, | 485 | .parent = &clk48m, |
500 | .round_rate = _clk_parent_round_rate, | 486 | .round_rate = _clk_parent_round_rate, |
501 | .set_rate = _clk_parent_set_rate, | 487 | .set_rate = _clk_parent_set_rate, |
@@ -506,99 +492,85 @@ static struct clk usbd_clk = { | |||
506 | }; | 492 | }; |
507 | 493 | ||
508 | static struct clk gpt_clk = { | 494 | static struct clk gpt_clk = { |
509 | .name = "gpt_clk", | ||
510 | .parent = &perclk[0], | 495 | .parent = &perclk[0], |
511 | .round_rate = _clk_parent_round_rate, | 496 | .round_rate = _clk_parent_round_rate, |
512 | .set_rate = _clk_parent_set_rate, | 497 | .set_rate = _clk_parent_set_rate, |
513 | }; | 498 | }; |
514 | 499 | ||
515 | static struct clk uart_clk = { | 500 | static struct clk uart_clk = { |
516 | .name = "uart", | ||
517 | .parent = &perclk[0], | 501 | .parent = &perclk[0], |
518 | .round_rate = _clk_parent_round_rate, | 502 | .round_rate = _clk_parent_round_rate, |
519 | .set_rate = _clk_parent_set_rate, | 503 | .set_rate = _clk_parent_set_rate, |
520 | }; | 504 | }; |
521 | 505 | ||
522 | static struct clk i2c_clk = { | 506 | static struct clk i2c_clk = { |
523 | .name = "i2c_clk", | ||
524 | .parent = &hclk, | 507 | .parent = &hclk, |
525 | .round_rate = _clk_parent_round_rate, | 508 | .round_rate = _clk_parent_round_rate, |
526 | .set_rate = _clk_parent_set_rate, | 509 | .set_rate = _clk_parent_set_rate, |
527 | }; | 510 | }; |
528 | 511 | ||
529 | static struct clk spi_clk = { | 512 | static struct clk spi_clk = { |
530 | .name = "spi_clk", | ||
531 | .parent = &perclk[1], | 513 | .parent = &perclk[1], |
532 | .round_rate = _clk_parent_round_rate, | 514 | .round_rate = _clk_parent_round_rate, |
533 | .set_rate = _clk_parent_set_rate, | 515 | .set_rate = _clk_parent_set_rate, |
534 | }; | 516 | }; |
535 | 517 | ||
536 | static struct clk sdhc_clk = { | 518 | static struct clk sdhc_clk = { |
537 | .name = "sdhc_clk", | ||
538 | .parent = &perclk[1], | 519 | .parent = &perclk[1], |
539 | .round_rate = _clk_parent_round_rate, | 520 | .round_rate = _clk_parent_round_rate, |
540 | .set_rate = _clk_parent_set_rate, | 521 | .set_rate = _clk_parent_set_rate, |
541 | }; | 522 | }; |
542 | 523 | ||
543 | static struct clk lcdc_clk = { | 524 | static struct clk lcdc_clk = { |
544 | .name = "lcdc_clk", | ||
545 | .parent = &perclk[1], | 525 | .parent = &perclk[1], |
546 | .round_rate = _clk_parent_round_rate, | 526 | .round_rate = _clk_parent_round_rate, |
547 | .set_rate = _clk_parent_set_rate, | 527 | .set_rate = _clk_parent_set_rate, |
548 | }; | 528 | }; |
549 | 529 | ||
550 | static struct clk mshc_clk = { | 530 | static struct clk mshc_clk = { |
551 | .name = "mshc_clk", | ||
552 | .parent = &hclk, | 531 | .parent = &hclk, |
553 | .round_rate = _clk_parent_round_rate, | 532 | .round_rate = _clk_parent_round_rate, |
554 | .set_rate = _clk_parent_set_rate, | 533 | .set_rate = _clk_parent_set_rate, |
555 | }; | 534 | }; |
556 | 535 | ||
557 | static struct clk ssi_clk = { | 536 | static struct clk ssi_clk = { |
558 | .name = "ssi_clk", | ||
559 | .parent = &perclk[2], | 537 | .parent = &perclk[2], |
560 | .round_rate = _clk_parent_round_rate, | 538 | .round_rate = _clk_parent_round_rate, |
561 | .set_rate = _clk_parent_set_rate, | 539 | .set_rate = _clk_parent_set_rate, |
562 | }; | 540 | }; |
563 | 541 | ||
564 | static struct clk rtc_clk = { | 542 | static struct clk rtc_clk = { |
565 | .name = "rtc_clk", | ||
566 | .parent = &clk32, | 543 | .parent = &clk32, |
567 | }; | 544 | }; |
568 | 545 | ||
569 | static struct clk *mxc_clks[] = { | 546 | #define _REGISTER_CLOCK(d, n, c) \ |
570 | &clk16m, | 547 | { \ |
571 | &clk32, | 548 | .dev_id = d, \ |
572 | &clk32_premult, | 549 | .con_id = n, \ |
573 | &prem_clk, | 550 | .clk = &c, \ |
574 | &system_clk, | 551 | }, |
575 | &mcu_clk, | 552 | static struct clk_lookup lookups[] __initdata = { |
576 | &fclk, | 553 | _REGISTER_CLOCK(NULL, "dma", dma_clk) |
577 | &hclk, | 554 | _REGISTER_CLOCK("mx1-camera.0", NULL, csi_clk) |
578 | &clk48m, | 555 | _REGISTER_CLOCK(NULL, "mma", mma_clk) |
579 | &perclk[0], | 556 | _REGISTER_CLOCK("imx_udc.0", NULL, usbd_clk) |
580 | &perclk[1], | 557 | _REGISTER_CLOCK(NULL, "gpt", gpt_clk) |
581 | &perclk[2], | 558 | _REGISTER_CLOCK("imx-uart.0", NULL, uart_clk) |
582 | &clko_clk, | 559 | _REGISTER_CLOCK("imx-uart.1", NULL, uart_clk) |
583 | &dma_clk, | 560 | _REGISTER_CLOCK("imx-uart.2", NULL, uart_clk) |
584 | &csi_clk, | 561 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c_clk) |
585 | &mma_clk, | 562 | _REGISTER_CLOCK("spi_imx.0", NULL, spi_clk) |
586 | &usbd_clk, | 563 | _REGISTER_CLOCK("imx-mmc.0", NULL, sdhc_clk) |
587 | &gpt_clk, | 564 | _REGISTER_CLOCK("imx-fb.0", NULL, lcdc_clk) |
588 | &uart_clk, | 565 | _REGISTER_CLOCK(NULL, "mshc", mshc_clk) |
589 | &i2c_clk, | 566 | _REGISTER_CLOCK(NULL, "ssi", ssi_clk) |
590 | &spi_clk, | 567 | _REGISTER_CLOCK("mxc_rtc.0", NULL, rtc_clk) |
591 | &sdhc_clk, | ||
592 | &lcdc_clk, | ||
593 | &mshc_clk, | ||
594 | &ssi_clk, | ||
595 | &rtc_clk, | ||
596 | }; | 568 | }; |
597 | 569 | ||
598 | int __init mx1_clocks_init(unsigned long fref) | 570 | int __init mx1_clocks_init(unsigned long fref) |
599 | { | 571 | { |
600 | struct clk **clkp; | ||
601 | unsigned int reg; | 572 | unsigned int reg; |
573 | int i; | ||
602 | 574 | ||
603 | /* disable clocks we are able to */ | 575 | /* disable clocks we are able to */ |
604 | __raw_writel(0, SCM_GCCR); | 576 | __raw_writel(0, SCM_GCCR); |
@@ -620,13 +592,13 @@ int __init mx1_clocks_init(unsigned long fref) | |||
620 | reg = (reg & CCM_CSCR_CLKO_MASK) >> CCM_CSCR_CLKO_OFFSET; | 592 | reg = (reg & CCM_CSCR_CLKO_MASK) >> CCM_CSCR_CLKO_OFFSET; |
621 | clko_clk.parent = (struct clk *)clko_clocks[reg]; | 593 | clko_clk.parent = (struct clk *)clko_clocks[reg]; |
622 | 594 | ||
623 | for (clkp = mxc_clks; clkp < mxc_clks + ARRAY_SIZE(mxc_clks); clkp++) | 595 | for (i = 0; i < ARRAY_SIZE(lookups); i++) |
624 | clk_register(*clkp); | 596 | clkdev_add(&lookups[i]); |
625 | 597 | ||
626 | clk_enable(&hclk); | 598 | clk_enable(&hclk); |
627 | clk_enable(&fclk); | 599 | clk_enable(&fclk); |
628 | 600 | ||
629 | mxc_timer_init(&gpt_clk); | 601 | mxc_timer_init(&gpt_clk, IO_ADDRESS(TIM1_BASE_ADDR), TIM1_INT); |
630 | 602 | ||
631 | return 0; | 603 | return 0; |
632 | } | 604 | } |
diff --git a/arch/arm/mach-mx1/devices.c b/arch/arm/mach-mx1/devices.c index 76d1ffb48079..b6be29d1cb08 100644 --- a/arch/arm/mach-mx1/devices.c +++ b/arch/arm/mach-mx1/devices.c | |||
@@ -29,12 +29,11 @@ | |||
29 | #include "devices.h" | 29 | #include "devices.h" |
30 | 30 | ||
31 | static struct resource imx_csi_resources[] = { | 31 | static struct resource imx_csi_resources[] = { |
32 | [0] = { | 32 | { |
33 | .start = 0x00224000, | 33 | .start = 0x00224000, |
34 | .end = 0x00224010, | 34 | .end = 0x00224010, |
35 | .flags = IORESOURCE_MEM, | 35 | .flags = IORESOURCE_MEM, |
36 | }, | 36 | }, { |
37 | [1] = { | ||
38 | .start = CSI_INT, | 37 | .start = CSI_INT, |
39 | .end = CSI_INT, | 38 | .end = CSI_INT, |
40 | .flags = IORESOURCE_IRQ, | 39 | .flags = IORESOURCE_IRQ, |
@@ -55,12 +54,11 @@ struct platform_device imx_csi_device = { | |||
55 | }; | 54 | }; |
56 | 55 | ||
57 | static struct resource imx_i2c_resources[] = { | 56 | static struct resource imx_i2c_resources[] = { |
58 | [0] = { | 57 | { |
59 | .start = 0x00217000, | 58 | .start = 0x00217000, |
60 | .end = 0x00217010, | 59 | .end = 0x00217010, |
61 | .flags = IORESOURCE_MEM, | 60 | .flags = IORESOURCE_MEM, |
62 | }, | 61 | }, { |
63 | [1] = { | ||
64 | .start = I2C_INT, | 62 | .start = I2C_INT, |
65 | .end = I2C_INT, | 63 | .end = I2C_INT, |
66 | .flags = IORESOURCE_IRQ, | 64 | .flags = IORESOURCE_IRQ, |
@@ -75,22 +73,19 @@ struct platform_device imx_i2c_device = { | |||
75 | }; | 73 | }; |
76 | 74 | ||
77 | static struct resource imx_uart1_resources[] = { | 75 | static struct resource imx_uart1_resources[] = { |
78 | [0] = { | 76 | { |
79 | .start = UART1_BASE_ADDR, | 77 | .start = UART1_BASE_ADDR, |
80 | .end = UART1_BASE_ADDR + 0xD0, | 78 | .end = UART1_BASE_ADDR + 0xD0, |
81 | .flags = IORESOURCE_MEM, | 79 | .flags = IORESOURCE_MEM, |
82 | }, | 80 | }, { |
83 | [1] = { | ||
84 | .start = UART1_MINT_RX, | 81 | .start = UART1_MINT_RX, |
85 | .end = UART1_MINT_RX, | 82 | .end = UART1_MINT_RX, |
86 | .flags = IORESOURCE_IRQ, | 83 | .flags = IORESOURCE_IRQ, |
87 | }, | 84 | }, { |
88 | [2] = { | ||
89 | .start = UART1_MINT_TX, | 85 | .start = UART1_MINT_TX, |
90 | .end = UART1_MINT_TX, | 86 | .end = UART1_MINT_TX, |
91 | .flags = IORESOURCE_IRQ, | 87 | .flags = IORESOURCE_IRQ, |
92 | }, | 88 | }, { |
93 | [3] = { | ||
94 | .start = UART1_MINT_RTS, | 89 | .start = UART1_MINT_RTS, |
95 | .end = UART1_MINT_RTS, | 90 | .end = UART1_MINT_RTS, |
96 | .flags = IORESOURCE_IRQ, | 91 | .flags = IORESOURCE_IRQ, |
@@ -105,22 +100,19 @@ struct platform_device imx_uart1_device = { | |||
105 | }; | 100 | }; |
106 | 101 | ||
107 | static struct resource imx_uart2_resources[] = { | 102 | static struct resource imx_uart2_resources[] = { |
108 | [0] = { | 103 | { |
109 | .start = UART2_BASE_ADDR, | 104 | .start = UART2_BASE_ADDR, |
110 | .end = UART2_BASE_ADDR + 0xD0, | 105 | .end = UART2_BASE_ADDR + 0xD0, |
111 | .flags = IORESOURCE_MEM, | 106 | .flags = IORESOURCE_MEM, |
112 | }, | 107 | }, { |
113 | [1] = { | ||
114 | .start = UART2_MINT_RX, | 108 | .start = UART2_MINT_RX, |
115 | .end = UART2_MINT_RX, | 109 | .end = UART2_MINT_RX, |
116 | .flags = IORESOURCE_IRQ, | 110 | .flags = IORESOURCE_IRQ, |
117 | }, | 111 | }, { |
118 | [2] = { | ||
119 | .start = UART2_MINT_TX, | 112 | .start = UART2_MINT_TX, |
120 | .end = UART2_MINT_TX, | 113 | .end = UART2_MINT_TX, |
121 | .flags = IORESOURCE_IRQ, | 114 | .flags = IORESOURCE_IRQ, |
122 | }, | 115 | }, { |
123 | [3] = { | ||
124 | .start = UART2_MINT_RTS, | 116 | .start = UART2_MINT_RTS, |
125 | .end = UART2_MINT_RTS, | 117 | .end = UART2_MINT_RTS, |
126 | .flags = IORESOURCE_IRQ, | 118 | .flags = IORESOURCE_IRQ, |
@@ -135,17 +127,15 @@ struct platform_device imx_uart2_device = { | |||
135 | }; | 127 | }; |
136 | 128 | ||
137 | static struct resource imx_rtc_resources[] = { | 129 | static struct resource imx_rtc_resources[] = { |
138 | [0] = { | 130 | { |
139 | .start = 0x00204000, | 131 | .start = 0x00204000, |
140 | .end = 0x00204024, | 132 | .end = 0x00204024, |
141 | .flags = IORESOURCE_MEM, | 133 | .flags = IORESOURCE_MEM, |
142 | }, | 134 | }, { |
143 | [1] = { | ||
144 | .start = RTC_INT, | 135 | .start = RTC_INT, |
145 | .end = RTC_INT, | 136 | .end = RTC_INT, |
146 | .flags = IORESOURCE_IRQ, | 137 | .flags = IORESOURCE_IRQ, |
147 | }, | 138 | }, { |
148 | [2] = { | ||
149 | .start = RTC_SAMINT, | 139 | .start = RTC_SAMINT, |
150 | .end = RTC_SAMINT, | 140 | .end = RTC_SAMINT, |
151 | .flags = IORESOURCE_IRQ, | 141 | .flags = IORESOURCE_IRQ, |
@@ -160,12 +150,11 @@ struct platform_device imx_rtc_device = { | |||
160 | }; | 150 | }; |
161 | 151 | ||
162 | static struct resource imx_wdt_resources[] = { | 152 | static struct resource imx_wdt_resources[] = { |
163 | [0] = { | 153 | { |
164 | .start = 0x00201000, | 154 | .start = 0x00201000, |
165 | .end = 0x00201008, | 155 | .end = 0x00201008, |
166 | .flags = IORESOURCE_MEM, | 156 | .flags = IORESOURCE_MEM, |
167 | }, | 157 | }, { |
168 | [1] = { | ||
169 | .start = WDT_INT, | 158 | .start = WDT_INT, |
170 | .end = WDT_INT, | 159 | .end = WDT_INT, |
171 | .flags = IORESOURCE_IRQ, | 160 | .flags = IORESOURCE_IRQ, |
@@ -180,42 +169,35 @@ struct platform_device imx_wdt_device = { | |||
180 | }; | 169 | }; |
181 | 170 | ||
182 | static struct resource imx_usb_resources[] = { | 171 | static struct resource imx_usb_resources[] = { |
183 | [0] = { | 172 | { |
184 | .start = 0x00212000, | 173 | .start = 0x00212000, |
185 | .end = 0x00212148, | 174 | .end = 0x00212148, |
186 | .flags = IORESOURCE_MEM, | 175 | .flags = IORESOURCE_MEM, |
187 | }, | 176 | }, { |
188 | [1] = { | ||
189 | .start = USBD_INT0, | 177 | .start = USBD_INT0, |
190 | .end = USBD_INT0, | 178 | .end = USBD_INT0, |
191 | .flags = IORESOURCE_IRQ, | 179 | .flags = IORESOURCE_IRQ, |
192 | }, | 180 | }, { |
193 | [2] = { | ||
194 | .start = USBD_INT1, | 181 | .start = USBD_INT1, |
195 | .end = USBD_INT1, | 182 | .end = USBD_INT1, |
196 | .flags = IORESOURCE_IRQ, | 183 | .flags = IORESOURCE_IRQ, |
197 | }, | 184 | }, { |
198 | [3] = { | ||
199 | .start = USBD_INT2, | 185 | .start = USBD_INT2, |
200 | .end = USBD_INT2, | 186 | .end = USBD_INT2, |
201 | .flags = IORESOURCE_IRQ, | 187 | .flags = IORESOURCE_IRQ, |
202 | }, | 188 | }, { |
203 | [4] = { | ||
204 | .start = USBD_INT3, | 189 | .start = USBD_INT3, |
205 | .end = USBD_INT3, | 190 | .end = USBD_INT3, |
206 | .flags = IORESOURCE_IRQ, | 191 | .flags = IORESOURCE_IRQ, |
207 | }, | 192 | }, { |
208 | [5] = { | ||
209 | .start = USBD_INT4, | 193 | .start = USBD_INT4, |
210 | .end = USBD_INT4, | 194 | .end = USBD_INT4, |
211 | .flags = IORESOURCE_IRQ, | 195 | .flags = IORESOURCE_IRQ, |
212 | }, | 196 | }, { |
213 | [6] = { | ||
214 | .start = USBD_INT5, | 197 | .start = USBD_INT5, |
215 | .end = USBD_INT5, | 198 | .end = USBD_INT5, |
216 | .flags = IORESOURCE_IRQ, | 199 | .flags = IORESOURCE_IRQ, |
217 | }, | 200 | }, { |
218 | [7] = { | ||
219 | .start = USBD_INT6, | 201 | .start = USBD_INT6, |
220 | .end = USBD_INT6, | 202 | .end = USBD_INT6, |
221 | .flags = IORESOURCE_IRQ, | 203 | .flags = IORESOURCE_IRQ, |
@@ -231,29 +213,26 @@ struct platform_device imx_usb_device = { | |||
231 | 213 | ||
232 | /* GPIO port description */ | 214 | /* GPIO port description */ |
233 | static struct mxc_gpio_port imx_gpio_ports[] = { | 215 | static struct mxc_gpio_port imx_gpio_ports[] = { |
234 | [0] = { | 216 | { |
235 | .chip.label = "gpio-0", | 217 | .chip.label = "gpio-0", |
236 | .base = (void __iomem *)IO_ADDRESS(GPIO_BASE_ADDR), | 218 | .base = (void __iomem *)IO_ADDRESS(GPIO_BASE_ADDR), |
237 | .irq = GPIO_INT_PORTA, | 219 | .irq = GPIO_INT_PORTA, |
238 | .virtual_irq_start = MXC_GPIO_IRQ_START | 220 | .virtual_irq_start = MXC_GPIO_IRQ_START, |
239 | }, | 221 | }, { |
240 | [1] = { | ||
241 | .chip.label = "gpio-1", | 222 | .chip.label = "gpio-1", |
242 | .base = (void __iomem *)IO_ADDRESS(GPIO_BASE_ADDR + 0x100), | 223 | .base = (void __iomem *)IO_ADDRESS(GPIO_BASE_ADDR + 0x100), |
243 | .irq = GPIO_INT_PORTB, | 224 | .irq = GPIO_INT_PORTB, |
244 | .virtual_irq_start = MXC_GPIO_IRQ_START + 32 | 225 | .virtual_irq_start = MXC_GPIO_IRQ_START + 32, |
245 | }, | 226 | }, { |
246 | [2] = { | ||
247 | .chip.label = "gpio-2", | 227 | .chip.label = "gpio-2", |
248 | .base = (void __iomem *)IO_ADDRESS(GPIO_BASE_ADDR + 0x200), | 228 | .base = (void __iomem *)IO_ADDRESS(GPIO_BASE_ADDR + 0x200), |
249 | .irq = GPIO_INT_PORTC, | 229 | .irq = GPIO_INT_PORTC, |
250 | .virtual_irq_start = MXC_GPIO_IRQ_START + 64 | 230 | .virtual_irq_start = MXC_GPIO_IRQ_START + 64, |
251 | }, | 231 | }, { |
252 | [3] = { | ||
253 | .chip.label = "gpio-3", | 232 | .chip.label = "gpio-3", |
254 | .base = (void __iomem *)IO_ADDRESS(GPIO_BASE_ADDR + 0x300), | 233 | .base = (void __iomem *)IO_ADDRESS(GPIO_BASE_ADDR + 0x300), |
255 | .irq = GPIO_INT_PORTD, | 234 | .irq = GPIO_INT_PORTD, |
256 | .virtual_irq_start = MXC_GPIO_IRQ_START + 96 | 235 | .virtual_irq_start = MXC_GPIO_IRQ_START + 96, |
257 | } | 236 | } |
258 | }; | 237 | }; |
259 | 238 | ||
diff --git a/arch/arm/mach-mx1/generic.c b/arch/arm/mach-mx1/generic.c index 7622c9b38c97..7f9fc1034c08 100644 --- a/arch/arm/mach-mx1/generic.c +++ b/arch/arm/mach-mx1/generic.c | |||
@@ -41,6 +41,13 @@ static struct map_desc imx_io_desc[] __initdata = { | |||
41 | void __init mx1_map_io(void) | 41 | void __init mx1_map_io(void) |
42 | { | 42 | { |
43 | mxc_set_cpu_type(MXC_CPU_MX1); | 43 | mxc_set_cpu_type(MXC_CPU_MX1); |
44 | mxc_arch_reset_init(IO_ADDRESS(WDT_BASE_ADDR)); | ||
44 | 45 | ||
45 | iotable_init(imx_io_desc, ARRAY_SIZE(imx_io_desc)); | 46 | iotable_init(imx_io_desc, ARRAY_SIZE(imx_io_desc)); |
46 | } | 47 | } |
48 | |||
49 | void __init mx1_init_irq(void) | ||
50 | { | ||
51 | mxc_init_irq(IO_ADDRESS(AVIC_BASE_ADDR)); | ||
52 | } | ||
53 | |||
diff --git a/arch/arm/mach-mx1/mx1ads.c b/arch/arm/mach-mx1/mx1ads.c index e5b0c0a83c3b..30f04e56fafe 100644 --- a/arch/arm/mach-mx1/mx1ads.c +++ b/arch/arm/mach-mx1/mx1ads.c | |||
@@ -104,12 +104,10 @@ static struct imxi2c_platform_data mx1ads_i2c_data = { | |||
104 | 104 | ||
105 | static struct i2c_board_info mx1ads_i2c_devices[] = { | 105 | static struct i2c_board_info mx1ads_i2c_devices[] = { |
106 | { | 106 | { |
107 | I2C_BOARD_INFO("pcf857x", 0x22), | 107 | I2C_BOARD_INFO("pcf8575", 0x22), |
108 | .type = "pcf8575", | ||
109 | .platform_data = &pcf857x_data[0], | 108 | .platform_data = &pcf857x_data[0], |
110 | }, { | 109 | }, { |
111 | I2C_BOARD_INFO("pcf857x", 0x24), | 110 | I2C_BOARD_INFO("pcf8575", 0x24), |
112 | .type = "pcf8575", | ||
113 | .platform_data = &pcf857x_data[1], | 111 | .platform_data = &pcf857x_data[1], |
114 | }, | 112 | }, |
115 | }; | 113 | }; |
@@ -151,7 +149,7 @@ MACHINE_START(MX1ADS, "Freescale MX1ADS") | |||
151 | .io_pg_offst = (IMX_IO_BASE >> 18) & 0xfffc, | 149 | .io_pg_offst = (IMX_IO_BASE >> 18) & 0xfffc, |
152 | .boot_params = PHYS_OFFSET + 0x100, | 150 | .boot_params = PHYS_OFFSET + 0x100, |
153 | .map_io = mx1_map_io, | 151 | .map_io = mx1_map_io, |
154 | .init_irq = mxc_init_irq, | 152 | .init_irq = mx1_init_irq, |
155 | .timer = &mx1ads_timer, | 153 | .timer = &mx1ads_timer, |
156 | .init_machine = mx1ads_init, | 154 | .init_machine = mx1ads_init, |
157 | MACHINE_END | 155 | MACHINE_END |
@@ -161,7 +159,7 @@ MACHINE_START(MXLADS, "Freescale MXLADS") | |||
161 | .io_pg_offst = (IMX_IO_BASE >> 18) & 0xfffc, | 159 | .io_pg_offst = (IMX_IO_BASE >> 18) & 0xfffc, |
162 | .boot_params = PHYS_OFFSET + 0x100, | 160 | .boot_params = PHYS_OFFSET + 0x100, |
163 | .map_io = mx1_map_io, | 161 | .map_io = mx1_map_io, |
164 | .init_irq = mxc_init_irq, | 162 | .init_irq = mx1_init_irq, |
165 | .timer = &mx1ads_timer, | 163 | .timer = &mx1ads_timer, |
166 | .init_machine = mx1ads_init, | 164 | .init_machine = mx1ads_init, |
167 | MACHINE_END | 165 | MACHINE_END |
diff --git a/arch/arm/mach-mx1/scb9328.c b/arch/arm/mach-mx1/scb9328.c index 20e0b5bcdffc..325d98df6053 100644 --- a/arch/arm/mach-mx1/scb9328.c +++ b/arch/arm/mach-mx1/scb9328.c | |||
@@ -68,22 +68,20 @@ static struct dm9000_plat_data dm9000_platdata = { | |||
68 | * to gain access to address latch registers and the data path. | 68 | * to gain access to address latch registers and the data path. |
69 | */ | 69 | */ |
70 | static struct resource dm9000x_resources[] = { | 70 | static struct resource dm9000x_resources[] = { |
71 | [0] = { | 71 | { |
72 | .name = "address area", | 72 | .name = "address area", |
73 | .start = IMX_CS5_PHYS, | 73 | .start = IMX_CS5_PHYS, |
74 | .end = IMX_CS5_PHYS + 1, | 74 | .end = IMX_CS5_PHYS + 1, |
75 | .flags = IORESOURCE_MEM /* address access */ | 75 | .flags = IORESOURCE_MEM, /* address access */ |
76 | }, | 76 | }, { |
77 | [1] = { | ||
78 | .name = "data area", | 77 | .name = "data area", |
79 | .start = IMX_CS5_PHYS + 4, | 78 | .start = IMX_CS5_PHYS + 4, |
80 | .end = IMX_CS5_PHYS + 5, | 79 | .end = IMX_CS5_PHYS + 5, |
81 | .flags = IORESOURCE_MEM /* data access */ | 80 | .flags = IORESOURCE_MEM, /* data access */ |
82 | }, | 81 | }, { |
83 | [2] = { | ||
84 | .start = IRQ_GPIOC(3), | 82 | .start = IRQ_GPIOC(3), |
85 | .end = IRQ_GPIOC(3), | 83 | .end = IRQ_GPIOC(3), |
86 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL | 84 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, |
87 | }, | 85 | }, |
88 | }; | 86 | }; |
89 | 87 | ||
@@ -154,7 +152,7 @@ MACHINE_START(SCB9328, "Synertronixx scb9328") | |||
154 | .io_pg_offst = ((0xe0200000) >> 18) & 0xfffc, | 152 | .io_pg_offst = ((0xe0200000) >> 18) & 0xfffc, |
155 | .boot_params = 0x08000100, | 153 | .boot_params = 0x08000100, |
156 | .map_io = mx1_map_io, | 154 | .map_io = mx1_map_io, |
157 | .init_irq = mxc_init_irq, | 155 | .init_irq = mx1_init_irq, |
158 | .timer = &scb9328_timer, | 156 | .timer = &scb9328_timer, |
159 | .init_machine = scb9328_init, | 157 | .init_machine = scb9328_init, |
160 | MACHINE_END | 158 | MACHINE_END |
diff --git a/arch/arm/mach-mx2/Kconfig b/arch/arm/mach-mx2/Kconfig index c77da586b71d..c8a2eac4d13c 100644 --- a/arch/arm/mach-mx2/Kconfig +++ b/arch/arm/mach-mx2/Kconfig | |||
@@ -53,6 +53,34 @@ config MACH_PCM970_BASEBOARD | |||
53 | 53 | ||
54 | endchoice | 54 | endchoice |
55 | 55 | ||
56 | config MACH_EUKREA_CPUIMX27 | ||
57 | bool "Eukrea CPUIMX27 module" | ||
58 | depends on MACH_MX27 | ||
59 | help | ||
60 | Include support for Eukrea CPUIMX27 platform. This includes | ||
61 | specific configurations for the module and its peripherals. | ||
62 | |||
63 | config MACH_EUKREA_CPUIMX27_USESDHC2 | ||
64 | bool "CPUIMX27 integrates SDHC2 module" | ||
65 | depends on MACH_EUKREA_CPUIMX27 | ||
66 | help | ||
67 | This adds support for the internal SDHC2 used on CPUIMX27 used | ||
68 | for wifi or eMMC. | ||
69 | |||
70 | choice | ||
71 | prompt "Baseboard" | ||
72 | depends on MACH_EUKREA_CPUIMX27 | ||
73 | default MACH_EUKREA_MBIMX27_BASEBOARD | ||
74 | |||
75 | config MACH_EUKREA_MBIMX27_BASEBOARD | ||
76 | prompt "Eukrea MBIMX27 development board" | ||
77 | bool | ||
78 | help | ||
79 | This adds board specific devices that can be found on Eukrea's | ||
80 | MBIMX27 evaluation board. | ||
81 | |||
82 | endchoice | ||
83 | |||
56 | config MACH_MX27_3DS | 84 | config MACH_MX27_3DS |
57 | bool "MX27PDK platform" | 85 | bool "MX27PDK platform" |
58 | depends on MACH_MX27 | 86 | depends on MACH_MX27 |
@@ -67,4 +95,11 @@ config MACH_MX27LITE | |||
67 | Include support for MX27 LITEKIT platform. This includes specific | 95 | Include support for MX27 LITEKIT platform. This includes specific |
68 | configurations for the board and its peripherals. | 96 | configurations for the board and its peripherals. |
69 | 97 | ||
98 | config MACH_PCA100 | ||
99 | bool "Phytec phyCARD-s (pca100)" | ||
100 | depends on MACH_MX27 | ||
101 | help | ||
102 | Include support for phyCARD-s (aka pca100) platform. This | ||
103 | includes specific configurations for the module and its peripherals. | ||
104 | |||
70 | endif | 105 | endif |
diff --git a/arch/arm/mach-mx2/Makefile b/arch/arm/mach-mx2/Makefile index b9b1cca4e9bc..19560f045632 100644 --- a/arch/arm/mach-mx2/Makefile +++ b/arch/arm/mach-mx2/Makefile | |||
@@ -17,4 +17,7 @@ obj-$(CONFIG_MACH_PCM038) += pcm038.o | |||
17 | obj-$(CONFIG_MACH_PCM970_BASEBOARD) += pcm970-baseboard.o | 17 | obj-$(CONFIG_MACH_PCM970_BASEBOARD) += pcm970-baseboard.o |
18 | obj-$(CONFIG_MACH_MX27_3DS) += mx27pdk.o | 18 | obj-$(CONFIG_MACH_MX27_3DS) += mx27pdk.o |
19 | obj-$(CONFIG_MACH_MX27LITE) += mx27lite.o | 19 | obj-$(CONFIG_MACH_MX27LITE) += mx27lite.o |
20 | obj-$(CONFIG_MACH_EUKREA_CPUIMX27) += eukrea_cpuimx27.o | ||
21 | obj-$(CONFIG_MACH_EUKREA_MBIMX27_BASEBOARD) += eukrea_mbimx27-baseboard.o | ||
22 | obj-$(CONFIG_MACH_PCA100) += pca100.o | ||
20 | 23 | ||
diff --git a/arch/arm/mach-mx2/clock_imx21.c b/arch/arm/mach-mx2/clock_imx21.c index 0850fb88ec15..eede79855f4a 100644 --- a/arch/arm/mach-mx2/clock_imx21.c +++ b/arch/arm/mach-mx2/clock_imx21.c | |||
@@ -1004,6 +1004,6 @@ int __init mx21_clocks_init(unsigned long lref, unsigned long href) | |||
1004 | clk_enable(&uart_clk[0]); | 1004 | clk_enable(&uart_clk[0]); |
1005 | #endif | 1005 | #endif |
1006 | 1006 | ||
1007 | mxc_timer_init(&gpt_clk[0]); | 1007 | mxc_timer_init(&gpt_clk[0], IO_ADDRESS(GPT1_BASE_ADDR), MXC_INT_GPT1); |
1008 | return 0; | 1008 | return 0; |
1009 | } | 1009 | } |
diff --git a/arch/arm/mach-mx2/clock_imx27.c b/arch/arm/mach-mx2/clock_imx27.c index 2c971442f3f2..4089951acb47 100644 --- a/arch/arm/mach-mx2/clock_imx27.c +++ b/arch/arm/mach-mx2/clock_imx27.c | |||
@@ -643,7 +643,14 @@ static struct clk_lookup lookups[] = { | |||
643 | _REGISTER_CLOCK(NULL, "cspi3", cspi3_clk) | 643 | _REGISTER_CLOCK(NULL, "cspi3", cspi3_clk) |
644 | _REGISTER_CLOCK("imx-fb.0", NULL, lcdc_clk) | 644 | _REGISTER_CLOCK("imx-fb.0", NULL, lcdc_clk) |
645 | _REGISTER_CLOCK(NULL, "csi", csi_clk) | 645 | _REGISTER_CLOCK(NULL, "csi", csi_clk) |
646 | _REGISTER_CLOCK(NULL, "usb", usb_clk) | 646 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usb_clk) |
647 | _REGISTER_CLOCK("fsl-usb2-udc", "usb_ahb", usb_clk1) | ||
648 | _REGISTER_CLOCK("mxc-ehci.0", "usb", usb_clk) | ||
649 | _REGISTER_CLOCK("mxc-ehci.0", "usb_ahb", usb_clk1) | ||
650 | _REGISTER_CLOCK("mxc-ehci.1", "usb", usb_clk) | ||
651 | _REGISTER_CLOCK("mxc-ehci.1", "usb_ahb", usb_clk1) | ||
652 | _REGISTER_CLOCK("mxc-ehci.2", "usb", usb_clk) | ||
653 | _REGISTER_CLOCK("mxc-ehci.2", "usb_ahb", usb_clk1) | ||
647 | _REGISTER_CLOCK(NULL, "ssi1", ssi1_clk) | 654 | _REGISTER_CLOCK(NULL, "ssi1", ssi1_clk) |
648 | _REGISTER_CLOCK(NULL, "ssi2", ssi2_clk) | 655 | _REGISTER_CLOCK(NULL, "ssi2", ssi2_clk) |
649 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) | 656 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) |
@@ -748,7 +755,7 @@ int __init mx27_clocks_init(unsigned long fref) | |||
748 | clk_enable(&uart1_clk); | 755 | clk_enable(&uart1_clk); |
749 | #endif | 756 | #endif |
750 | 757 | ||
751 | mxc_timer_init(&gpt1_clk); | 758 | mxc_timer_init(&gpt1_clk, IO_ADDRESS(GPT1_BASE_ADDR), MXC_INT_GPT1); |
752 | 759 | ||
753 | return 0; | 760 | return 0; |
754 | } | 761 | } |
diff --git a/arch/arm/mach-mx2/devices.c b/arch/arm/mach-mx2/devices.c index a0f1b3674327..50199aff0143 100644 --- a/arch/arm/mach-mx2/devices.c +++ b/arch/arm/mach-mx2/devices.c | |||
@@ -40,45 +40,87 @@ | |||
40 | #include "devices.h" | 40 | #include "devices.h" |
41 | 41 | ||
42 | /* | 42 | /* |
43 | * Resource definition for the MXC IrDA | 43 | * SPI master controller |
44 | * | ||
45 | * - i.MX1: 2 channel (slighly different register setting) | ||
46 | * - i.MX21: 2 channel | ||
47 | * - i.MX27: 3 channel | ||
44 | */ | 48 | */ |
45 | static struct resource mxc_irda_resources[] = { | 49 | static struct resource mxc_spi_resources0[] = { |
46 | [0] = { | 50 | { |
47 | .start = UART3_BASE_ADDR, | 51 | .start = CSPI1_BASE_ADDR, |
48 | .end = UART3_BASE_ADDR + SZ_4K - 1, | 52 | .end = CSPI1_BASE_ADDR + SZ_4K - 1, |
49 | .flags = IORESOURCE_MEM, | 53 | .flags = IORESOURCE_MEM, |
54 | }, { | ||
55 | .start = MXC_INT_CSPI1, | ||
56 | .end = MXC_INT_CSPI1, | ||
57 | .flags = IORESOURCE_IRQ, | ||
50 | }, | 58 | }, |
51 | [1] = { | 59 | }; |
52 | .start = MXC_INT_UART3, | 60 | |
53 | .end = MXC_INT_UART3, | 61 | static struct resource mxc_spi_resources1[] = { |
54 | .flags = IORESOURCE_IRQ, | 62 | { |
63 | .start = CSPI2_BASE_ADDR, | ||
64 | .end = CSPI2_BASE_ADDR + SZ_4K - 1, | ||
65 | .flags = IORESOURCE_MEM, | ||
66 | }, { | ||
67 | .start = MXC_INT_CSPI2, | ||
68 | .end = MXC_INT_CSPI2, | ||
69 | .flags = IORESOURCE_IRQ, | ||
55 | }, | 70 | }, |
56 | }; | 71 | }; |
57 | 72 | ||
58 | /* Platform Data for MXC IrDA */ | 73 | #ifdef CONFIG_MACH_MX27 |
59 | struct platform_device mxc_irda_device = { | 74 | static struct resource mxc_spi_resources2[] = { |
60 | .name = "mxc_irda", | 75 | { |
76 | .start = CSPI3_BASE_ADDR, | ||
77 | .end = CSPI3_BASE_ADDR + SZ_4K - 1, | ||
78 | .flags = IORESOURCE_MEM, | ||
79 | }, { | ||
80 | .start = MXC_INT_CSPI3, | ||
81 | .end = MXC_INT_CSPI3, | ||
82 | .flags = IORESOURCE_IRQ, | ||
83 | }, | ||
84 | }; | ||
85 | #endif | ||
86 | |||
87 | struct platform_device mxc_spi_device0 = { | ||
88 | .name = "spi_imx", | ||
61 | .id = 0, | 89 | .id = 0, |
62 | .num_resources = ARRAY_SIZE(mxc_irda_resources), | 90 | .num_resources = ARRAY_SIZE(mxc_spi_resources0), |
63 | .resource = mxc_irda_resources, | 91 | .resource = mxc_spi_resources0, |
92 | }; | ||
93 | |||
94 | struct platform_device mxc_spi_device1 = { | ||
95 | .name = "spi_imx", | ||
96 | .id = 1, | ||
97 | .num_resources = ARRAY_SIZE(mxc_spi_resources1), | ||
98 | .resource = mxc_spi_resources1, | ||
99 | }; | ||
100 | |||
101 | #ifdef CONFIG_MACH_MX27 | ||
102 | struct platform_device mxc_spi_device2 = { | ||
103 | .name = "spi_imx", | ||
104 | .id = 2, | ||
105 | .num_resources = ARRAY_SIZE(mxc_spi_resources2), | ||
106 | .resource = mxc_spi_resources2, | ||
64 | }; | 107 | }; |
108 | #endif | ||
65 | 109 | ||
66 | /* | 110 | /* |
67 | * General Purpose Timer | 111 | * General Purpose Timer |
68 | * - i.MX1: 2 timer (slighly different register handling) | 112 | * - i.MX21: 3 timers |
69 | * - i.MX21: 3 timer | 113 | * - i.MX27: 6 timers |
70 | * - i.MX27: 6 timer | ||
71 | */ | 114 | */ |
72 | 115 | ||
73 | /* We use gpt0 as system timer, so do not add a device for this one */ | 116 | /* We use gpt0 as system timer, so do not add a device for this one */ |
74 | 117 | ||
75 | static struct resource timer1_resources[] = { | 118 | static struct resource timer1_resources[] = { |
76 | [0] = { | 119 | { |
77 | .start = GPT2_BASE_ADDR, | 120 | .start = GPT2_BASE_ADDR, |
78 | .end = GPT2_BASE_ADDR + 0x17, | 121 | .end = GPT2_BASE_ADDR + 0x17, |
79 | .flags = IORESOURCE_MEM | 122 | .flags = IORESOURCE_MEM, |
80 | }, | 123 | }, { |
81 | [1] = { | ||
82 | .start = MXC_INT_GPT2, | 124 | .start = MXC_INT_GPT2, |
83 | .end = MXC_INT_GPT2, | 125 | .end = MXC_INT_GPT2, |
84 | .flags = IORESOURCE_IRQ, | 126 | .flags = IORESOURCE_IRQ, |
@@ -89,16 +131,15 @@ struct platform_device mxc_gpt1 = { | |||
89 | .name = "imx_gpt", | 131 | .name = "imx_gpt", |
90 | .id = 1, | 132 | .id = 1, |
91 | .num_resources = ARRAY_SIZE(timer1_resources), | 133 | .num_resources = ARRAY_SIZE(timer1_resources), |
92 | .resource = timer1_resources | 134 | .resource = timer1_resources, |
93 | }; | 135 | }; |
94 | 136 | ||
95 | static struct resource timer2_resources[] = { | 137 | static struct resource timer2_resources[] = { |
96 | [0] = { | 138 | { |
97 | .start = GPT3_BASE_ADDR, | 139 | .start = GPT3_BASE_ADDR, |
98 | .end = GPT3_BASE_ADDR + 0x17, | 140 | .end = GPT3_BASE_ADDR + 0x17, |
99 | .flags = IORESOURCE_MEM | 141 | .flags = IORESOURCE_MEM, |
100 | }, | 142 | }, { |
101 | [1] = { | ||
102 | .start = MXC_INT_GPT3, | 143 | .start = MXC_INT_GPT3, |
103 | .end = MXC_INT_GPT3, | 144 | .end = MXC_INT_GPT3, |
104 | .flags = IORESOURCE_IRQ, | 145 | .flags = IORESOURCE_IRQ, |
@@ -109,17 +150,16 @@ struct platform_device mxc_gpt2 = { | |||
109 | .name = "imx_gpt", | 150 | .name = "imx_gpt", |
110 | .id = 2, | 151 | .id = 2, |
111 | .num_resources = ARRAY_SIZE(timer2_resources), | 152 | .num_resources = ARRAY_SIZE(timer2_resources), |
112 | .resource = timer2_resources | 153 | .resource = timer2_resources, |
113 | }; | 154 | }; |
114 | 155 | ||
115 | #ifdef CONFIG_MACH_MX27 | 156 | #ifdef CONFIG_MACH_MX27 |
116 | static struct resource timer3_resources[] = { | 157 | static struct resource timer3_resources[] = { |
117 | [0] = { | 158 | { |
118 | .start = GPT4_BASE_ADDR, | 159 | .start = GPT4_BASE_ADDR, |
119 | .end = GPT4_BASE_ADDR + 0x17, | 160 | .end = GPT4_BASE_ADDR + 0x17, |
120 | .flags = IORESOURCE_MEM | 161 | .flags = IORESOURCE_MEM, |
121 | }, | 162 | }, { |
122 | [1] = { | ||
123 | .start = MXC_INT_GPT4, | 163 | .start = MXC_INT_GPT4, |
124 | .end = MXC_INT_GPT4, | 164 | .end = MXC_INT_GPT4, |
125 | .flags = IORESOURCE_IRQ, | 165 | .flags = IORESOURCE_IRQ, |
@@ -130,16 +170,15 @@ struct platform_device mxc_gpt3 = { | |||
130 | .name = "imx_gpt", | 170 | .name = "imx_gpt", |
131 | .id = 3, | 171 | .id = 3, |
132 | .num_resources = ARRAY_SIZE(timer3_resources), | 172 | .num_resources = ARRAY_SIZE(timer3_resources), |
133 | .resource = timer3_resources | 173 | .resource = timer3_resources, |
134 | }; | 174 | }; |
135 | 175 | ||
136 | static struct resource timer4_resources[] = { | 176 | static struct resource timer4_resources[] = { |
137 | [0] = { | 177 | { |
138 | .start = GPT5_BASE_ADDR, | 178 | .start = GPT5_BASE_ADDR, |
139 | .end = GPT5_BASE_ADDR + 0x17, | 179 | .end = GPT5_BASE_ADDR + 0x17, |
140 | .flags = IORESOURCE_MEM | 180 | .flags = IORESOURCE_MEM, |
141 | }, | 181 | }, { |
142 | [1] = { | ||
143 | .start = MXC_INT_GPT5, | 182 | .start = MXC_INT_GPT5, |
144 | .end = MXC_INT_GPT5, | 183 | .end = MXC_INT_GPT5, |
145 | .flags = IORESOURCE_IRQ, | 184 | .flags = IORESOURCE_IRQ, |
@@ -150,16 +189,15 @@ struct platform_device mxc_gpt4 = { | |||
150 | .name = "imx_gpt", | 189 | .name = "imx_gpt", |
151 | .id = 4, | 190 | .id = 4, |
152 | .num_resources = ARRAY_SIZE(timer4_resources), | 191 | .num_resources = ARRAY_SIZE(timer4_resources), |
153 | .resource = timer4_resources | 192 | .resource = timer4_resources, |
154 | }; | 193 | }; |
155 | 194 | ||
156 | static struct resource timer5_resources[] = { | 195 | static struct resource timer5_resources[] = { |
157 | [0] = { | 196 | { |
158 | .start = GPT6_BASE_ADDR, | 197 | .start = GPT6_BASE_ADDR, |
159 | .end = GPT6_BASE_ADDR + 0x17, | 198 | .end = GPT6_BASE_ADDR + 0x17, |
160 | .flags = IORESOURCE_MEM | 199 | .flags = IORESOURCE_MEM, |
161 | }, | 200 | }, { |
162 | [1] = { | ||
163 | .start = MXC_INT_GPT6, | 201 | .start = MXC_INT_GPT6, |
164 | .end = MXC_INT_GPT6, | 202 | .end = MXC_INT_GPT6, |
165 | .flags = IORESOURCE_IRQ, | 203 | .flags = IORESOURCE_IRQ, |
@@ -170,7 +208,7 @@ struct platform_device mxc_gpt5 = { | |||
170 | .name = "imx_gpt", | 208 | .name = "imx_gpt", |
171 | .id = 5, | 209 | .id = 5, |
172 | .num_resources = ARRAY_SIZE(timer5_resources), | 210 | .num_resources = ARRAY_SIZE(timer5_resources), |
173 | .resource = timer5_resources | 211 | .resource = timer5_resources, |
174 | }; | 212 | }; |
175 | #endif | 213 | #endif |
176 | 214 | ||
@@ -214,11 +252,11 @@ static struct resource mxc_nand_resources[] = { | |||
214 | { | 252 | { |
215 | .start = NFC_BASE_ADDR, | 253 | .start = NFC_BASE_ADDR, |
216 | .end = NFC_BASE_ADDR + 0xfff, | 254 | .end = NFC_BASE_ADDR + 0xfff, |
217 | .flags = IORESOURCE_MEM | 255 | .flags = IORESOURCE_MEM, |
218 | }, { | 256 | }, { |
219 | .start = MXC_INT_NANDFC, | 257 | .start = MXC_INT_NANDFC, |
220 | .end = MXC_INT_NANDFC, | 258 | .end = MXC_INT_NANDFC, |
221 | .flags = IORESOURCE_IRQ | 259 | .flags = IORESOURCE_IRQ, |
222 | }, | 260 | }, |
223 | }; | 261 | }; |
224 | 262 | ||
@@ -240,8 +278,7 @@ static struct resource mxc_fb[] = { | |||
240 | .start = LCDC_BASE_ADDR, | 278 | .start = LCDC_BASE_ADDR, |
241 | .end = LCDC_BASE_ADDR + 0xFFF, | 279 | .end = LCDC_BASE_ADDR + 0xFFF, |
242 | .flags = IORESOURCE_MEM, | 280 | .flags = IORESOURCE_MEM, |
243 | }, | 281 | }, { |
244 | { | ||
245 | .start = MXC_INT_LCDC, | 282 | .start = MXC_INT_LCDC, |
246 | .end = MXC_INT_LCDC, | 283 | .end = MXC_INT_LCDC, |
247 | .flags = IORESOURCE_IRQ, | 284 | .flags = IORESOURCE_IRQ, |
@@ -264,11 +301,11 @@ static struct resource mxc_fec_resources[] = { | |||
264 | { | 301 | { |
265 | .start = FEC_BASE_ADDR, | 302 | .start = FEC_BASE_ADDR, |
266 | .end = FEC_BASE_ADDR + 0xfff, | 303 | .end = FEC_BASE_ADDR + 0xfff, |
267 | .flags = IORESOURCE_MEM | 304 | .flags = IORESOURCE_MEM, |
268 | }, { | 305 | }, { |
269 | .start = MXC_INT_FEC, | 306 | .start = MXC_INT_FEC, |
270 | .end = MXC_INT_FEC, | 307 | .end = MXC_INT_FEC, |
271 | .flags = IORESOURCE_IRQ | 308 | .flags = IORESOURCE_IRQ, |
272 | }, | 309 | }, |
273 | }; | 310 | }; |
274 | 311 | ||
@@ -281,15 +318,14 @@ struct platform_device mxc_fec_device = { | |||
281 | #endif | 318 | #endif |
282 | 319 | ||
283 | static struct resource mxc_i2c_1_resources[] = { | 320 | static struct resource mxc_i2c_1_resources[] = { |
284 | [0] = { | 321 | { |
285 | .start = I2C_BASE_ADDR, | 322 | .start = I2C_BASE_ADDR, |
286 | .end = I2C_BASE_ADDR + 0x0fff, | 323 | .end = I2C_BASE_ADDR + 0x0fff, |
287 | .flags = IORESOURCE_MEM | 324 | .flags = IORESOURCE_MEM, |
288 | }, | 325 | }, { |
289 | [1] = { | ||
290 | .start = MXC_INT_I2C, | 326 | .start = MXC_INT_I2C, |
291 | .end = MXC_INT_I2C, | 327 | .end = MXC_INT_I2C, |
292 | .flags = IORESOURCE_IRQ | 328 | .flags = IORESOURCE_IRQ, |
293 | } | 329 | } |
294 | }; | 330 | }; |
295 | 331 | ||
@@ -297,20 +333,19 @@ struct platform_device mxc_i2c_device0 = { | |||
297 | .name = "imx-i2c", | 333 | .name = "imx-i2c", |
298 | .id = 0, | 334 | .id = 0, |
299 | .num_resources = ARRAY_SIZE(mxc_i2c_1_resources), | 335 | .num_resources = ARRAY_SIZE(mxc_i2c_1_resources), |
300 | .resource = mxc_i2c_1_resources | 336 | .resource = mxc_i2c_1_resources, |
301 | }; | 337 | }; |
302 | 338 | ||
303 | #ifdef CONFIG_MACH_MX27 | 339 | #ifdef CONFIG_MACH_MX27 |
304 | static struct resource mxc_i2c_2_resources[] = { | 340 | static struct resource mxc_i2c_2_resources[] = { |
305 | [0] = { | 341 | { |
306 | .start = I2C2_BASE_ADDR, | 342 | .start = I2C2_BASE_ADDR, |
307 | .end = I2C2_BASE_ADDR + 0x0fff, | 343 | .end = I2C2_BASE_ADDR + 0x0fff, |
308 | .flags = IORESOURCE_MEM | 344 | .flags = IORESOURCE_MEM, |
309 | }, | 345 | }, { |
310 | [1] = { | ||
311 | .start = MXC_INT_I2C2, | 346 | .start = MXC_INT_I2C2, |
312 | .end = MXC_INT_I2C2, | 347 | .end = MXC_INT_I2C2, |
313 | .flags = IORESOURCE_IRQ | 348 | .flags = IORESOURCE_IRQ, |
314 | } | 349 | } |
315 | }; | 350 | }; |
316 | 351 | ||
@@ -318,17 +353,16 @@ struct platform_device mxc_i2c_device1 = { | |||
318 | .name = "imx-i2c", | 353 | .name = "imx-i2c", |
319 | .id = 1, | 354 | .id = 1, |
320 | .num_resources = ARRAY_SIZE(mxc_i2c_2_resources), | 355 | .num_resources = ARRAY_SIZE(mxc_i2c_2_resources), |
321 | .resource = mxc_i2c_2_resources | 356 | .resource = mxc_i2c_2_resources, |
322 | }; | 357 | }; |
323 | #endif | 358 | #endif |
324 | 359 | ||
325 | static struct resource mxc_pwm_resources[] = { | 360 | static struct resource mxc_pwm_resources[] = { |
326 | [0] = { | 361 | { |
327 | .start = PWM_BASE_ADDR, | 362 | .start = PWM_BASE_ADDR, |
328 | .end = PWM_BASE_ADDR + 0x0fff, | 363 | .end = PWM_BASE_ADDR + 0x0fff, |
329 | .flags = IORESOURCE_MEM | 364 | .flags = IORESOURCE_MEM, |
330 | }, | 365 | }, { |
331 | [1] = { | ||
332 | .start = MXC_INT_PWM, | 366 | .start = MXC_INT_PWM, |
333 | .end = MXC_INT_PWM, | 367 | .end = MXC_INT_PWM, |
334 | .flags = IORESOURCE_IRQ, | 368 | .flags = IORESOURCE_IRQ, |
@@ -339,28 +373,26 @@ struct platform_device mxc_pwm_device = { | |||
339 | .name = "mxc_pwm", | 373 | .name = "mxc_pwm", |
340 | .id = 0, | 374 | .id = 0, |
341 | .num_resources = ARRAY_SIZE(mxc_pwm_resources), | 375 | .num_resources = ARRAY_SIZE(mxc_pwm_resources), |
342 | .resource = mxc_pwm_resources | 376 | .resource = mxc_pwm_resources, |
343 | }; | 377 | }; |
344 | 378 | ||
345 | /* | 379 | /* |
346 | * Resource definition for the MXC SDHC | 380 | * Resource definition for the MXC SDHC |
347 | */ | 381 | */ |
348 | static struct resource mxc_sdhc1_resources[] = { | 382 | static struct resource mxc_sdhc1_resources[] = { |
349 | [0] = { | 383 | { |
350 | .start = SDHC1_BASE_ADDR, | 384 | .start = SDHC1_BASE_ADDR, |
351 | .end = SDHC1_BASE_ADDR + SZ_4K - 1, | 385 | .end = SDHC1_BASE_ADDR + SZ_4K - 1, |
352 | .flags = IORESOURCE_MEM, | 386 | .flags = IORESOURCE_MEM, |
353 | }, | 387 | }, { |
354 | [1] = { | 388 | .start = MXC_INT_SDHC1, |
355 | .start = MXC_INT_SDHC1, | 389 | .end = MXC_INT_SDHC1, |
356 | .end = MXC_INT_SDHC1, | 390 | .flags = IORESOURCE_IRQ, |
357 | .flags = IORESOURCE_IRQ, | 391 | }, { |
358 | }, | 392 | .start = DMA_REQ_SDHC1, |
359 | [2] = { | 393 | .end = DMA_REQ_SDHC1, |
360 | .start = DMA_REQ_SDHC1, | 394 | .flags = IORESOURCE_DMA, |
361 | .end = DMA_REQ_SDHC1, | 395 | }, |
362 | .flags = IORESOURCE_DMA | ||
363 | }, | ||
364 | }; | 396 | }; |
365 | 397 | ||
366 | static u64 mxc_sdhc1_dmamask = 0xffffffffUL; | 398 | static u64 mxc_sdhc1_dmamask = 0xffffffffUL; |
@@ -377,21 +409,19 @@ struct platform_device mxc_sdhc_device0 = { | |||
377 | }; | 409 | }; |
378 | 410 | ||
379 | static struct resource mxc_sdhc2_resources[] = { | 411 | static struct resource mxc_sdhc2_resources[] = { |
380 | [0] = { | 412 | { |
381 | .start = SDHC2_BASE_ADDR, | 413 | .start = SDHC2_BASE_ADDR, |
382 | .end = SDHC2_BASE_ADDR + SZ_4K - 1, | 414 | .end = SDHC2_BASE_ADDR + SZ_4K - 1, |
383 | .flags = IORESOURCE_MEM, | 415 | .flags = IORESOURCE_MEM, |
384 | }, | 416 | }, { |
385 | [1] = { | 417 | .start = MXC_INT_SDHC2, |
386 | .start = MXC_INT_SDHC2, | 418 | .end = MXC_INT_SDHC2, |
387 | .end = MXC_INT_SDHC2, | 419 | .flags = IORESOURCE_IRQ, |
388 | .flags = IORESOURCE_IRQ, | 420 | }, { |
389 | }, | 421 | .start = DMA_REQ_SDHC2, |
390 | [2] = { | 422 | .end = DMA_REQ_SDHC2, |
391 | .start = DMA_REQ_SDHC2, | 423 | .flags = IORESOURCE_DMA, |
392 | .end = DMA_REQ_SDHC2, | 424 | }, |
393 | .flags = IORESOURCE_DMA | ||
394 | }, | ||
395 | }; | 425 | }; |
396 | 426 | ||
397 | static u64 mxc_sdhc2_dmamask = 0xffffffffUL; | 427 | static u64 mxc_sdhc2_dmamask = 0xffffffffUL; |
@@ -407,35 +437,123 @@ struct platform_device mxc_sdhc_device1 = { | |||
407 | .resource = mxc_sdhc2_resources, | 437 | .resource = mxc_sdhc2_resources, |
408 | }; | 438 | }; |
409 | 439 | ||
440 | #ifdef CONFIG_MACH_MX27 | ||
441 | static struct resource otg_resources[] = { | ||
442 | { | ||
443 | .start = OTG_BASE_ADDR, | ||
444 | .end = OTG_BASE_ADDR + 0x1ff, | ||
445 | .flags = IORESOURCE_MEM, | ||
446 | }, { | ||
447 | .start = MXC_INT_USB3, | ||
448 | .end = MXC_INT_USB3, | ||
449 | .flags = IORESOURCE_IRQ, | ||
450 | }, | ||
451 | }; | ||
452 | |||
453 | static u64 otg_dmamask = 0xffffffffUL; | ||
454 | |||
455 | /* OTG gadget device */ | ||
456 | struct platform_device mxc_otg_udc_device = { | ||
457 | .name = "fsl-usb2-udc", | ||
458 | .id = -1, | ||
459 | .dev = { | ||
460 | .dma_mask = &otg_dmamask, | ||
461 | .coherent_dma_mask = 0xffffffffUL, | ||
462 | }, | ||
463 | .resource = otg_resources, | ||
464 | .num_resources = ARRAY_SIZE(otg_resources), | ||
465 | }; | ||
466 | |||
467 | /* OTG host */ | ||
468 | struct platform_device mxc_otg_host = { | ||
469 | .name = "mxc-ehci", | ||
470 | .id = 0, | ||
471 | .dev = { | ||
472 | .coherent_dma_mask = 0xffffffff, | ||
473 | .dma_mask = &otg_dmamask, | ||
474 | }, | ||
475 | .resource = otg_resources, | ||
476 | .num_resources = ARRAY_SIZE(otg_resources), | ||
477 | }; | ||
478 | |||
479 | /* USB host 1 */ | ||
480 | |||
481 | static u64 usbh1_dmamask = 0xffffffffUL; | ||
482 | |||
483 | static struct resource mxc_usbh1_resources[] = { | ||
484 | { | ||
485 | .start = OTG_BASE_ADDR + 0x200, | ||
486 | .end = OTG_BASE_ADDR + 0x3ff, | ||
487 | .flags = IORESOURCE_MEM, | ||
488 | }, { | ||
489 | .start = MXC_INT_USB1, | ||
490 | .end = MXC_INT_USB1, | ||
491 | .flags = IORESOURCE_IRQ, | ||
492 | }, | ||
493 | }; | ||
494 | |||
495 | struct platform_device mxc_usbh1 = { | ||
496 | .name = "mxc-ehci", | ||
497 | .id = 1, | ||
498 | .dev = { | ||
499 | .coherent_dma_mask = 0xffffffff, | ||
500 | .dma_mask = &usbh1_dmamask, | ||
501 | }, | ||
502 | .resource = mxc_usbh1_resources, | ||
503 | .num_resources = ARRAY_SIZE(mxc_usbh1_resources), | ||
504 | }; | ||
505 | |||
506 | /* USB host 2 */ | ||
507 | static u64 usbh2_dmamask = 0xffffffffUL; | ||
508 | |||
509 | static struct resource mxc_usbh2_resources[] = { | ||
510 | { | ||
511 | .start = OTG_BASE_ADDR + 0x400, | ||
512 | .end = OTG_BASE_ADDR + 0x5ff, | ||
513 | .flags = IORESOURCE_MEM, | ||
514 | }, { | ||
515 | .start = MXC_INT_USB2, | ||
516 | .end = MXC_INT_USB2, | ||
517 | .flags = IORESOURCE_IRQ, | ||
518 | }, | ||
519 | }; | ||
520 | |||
521 | struct platform_device mxc_usbh2 = { | ||
522 | .name = "mxc-ehci", | ||
523 | .id = 2, | ||
524 | .dev = { | ||
525 | .coherent_dma_mask = 0xffffffff, | ||
526 | .dma_mask = &usbh2_dmamask, | ||
527 | }, | ||
528 | .resource = mxc_usbh2_resources, | ||
529 | .num_resources = ARRAY_SIZE(mxc_usbh2_resources), | ||
530 | }; | ||
531 | #endif | ||
532 | |||
410 | /* GPIO port description */ | 533 | /* GPIO port description */ |
411 | static struct mxc_gpio_port imx_gpio_ports[] = { | 534 | static struct mxc_gpio_port imx_gpio_ports[] = { |
412 | [0] = { | 535 | { |
413 | .chip.label = "gpio-0", | 536 | .chip.label = "gpio-0", |
414 | .irq = MXC_INT_GPIO, | 537 | .irq = MXC_INT_GPIO, |
415 | .base = IO_ADDRESS(GPIO_BASE_ADDR), | 538 | .base = IO_ADDRESS(GPIO_BASE_ADDR), |
416 | .virtual_irq_start = MXC_GPIO_IRQ_START, | 539 | .virtual_irq_start = MXC_GPIO_IRQ_START, |
417 | }, | 540 | }, { |
418 | [1] = { | ||
419 | .chip.label = "gpio-1", | 541 | .chip.label = "gpio-1", |
420 | .base = IO_ADDRESS(GPIO_BASE_ADDR + 0x100), | 542 | .base = IO_ADDRESS(GPIO_BASE_ADDR + 0x100), |
421 | .virtual_irq_start = MXC_GPIO_IRQ_START + 32, | 543 | .virtual_irq_start = MXC_GPIO_IRQ_START + 32, |
422 | }, | 544 | }, { |
423 | [2] = { | ||
424 | .chip.label = "gpio-2", | 545 | .chip.label = "gpio-2", |
425 | .base = IO_ADDRESS(GPIO_BASE_ADDR + 0x200), | 546 | .base = IO_ADDRESS(GPIO_BASE_ADDR + 0x200), |
426 | .virtual_irq_start = MXC_GPIO_IRQ_START + 64, | 547 | .virtual_irq_start = MXC_GPIO_IRQ_START + 64, |
427 | }, | 548 | }, { |
428 | [3] = { | ||
429 | .chip.label = "gpio-3", | 549 | .chip.label = "gpio-3", |
430 | .base = IO_ADDRESS(GPIO_BASE_ADDR + 0x300), | 550 | .base = IO_ADDRESS(GPIO_BASE_ADDR + 0x300), |
431 | .virtual_irq_start = MXC_GPIO_IRQ_START + 96, | 551 | .virtual_irq_start = MXC_GPIO_IRQ_START + 96, |
432 | }, | 552 | }, { |
433 | [4] = { | ||
434 | .chip.label = "gpio-4", | 553 | .chip.label = "gpio-4", |
435 | .base = IO_ADDRESS(GPIO_BASE_ADDR + 0x400), | 554 | .base = IO_ADDRESS(GPIO_BASE_ADDR + 0x400), |
436 | .virtual_irq_start = MXC_GPIO_IRQ_START + 128, | 555 | .virtual_irq_start = MXC_GPIO_IRQ_START + 128, |
437 | }, | 556 | }, { |
438 | [5] = { | ||
439 | .chip.label = "gpio-5", | 557 | .chip.label = "gpio-5", |
440 | .base = IO_ADDRESS(GPIO_BASE_ADDR + 0x500), | 558 | .base = IO_ADDRESS(GPIO_BASE_ADDR + 0x500), |
441 | .virtual_irq_start = MXC_GPIO_IRQ_START + 160, | 559 | .virtual_irq_start = MXC_GPIO_IRQ_START + 160, |
diff --git a/arch/arm/mach-mx2/devices.h b/arch/arm/mach-mx2/devices.h index 049005bb6aa9..d315406d6725 100644 --- a/arch/arm/mach-mx2/devices.h +++ b/arch/arm/mach-mx2/devices.h | |||
@@ -4,7 +4,6 @@ extern struct platform_device mxc_gpt3; | |||
4 | extern struct platform_device mxc_gpt4; | 4 | extern struct platform_device mxc_gpt4; |
5 | extern struct platform_device mxc_gpt5; | 5 | extern struct platform_device mxc_gpt5; |
6 | extern struct platform_device mxc_wdt; | 6 | extern struct platform_device mxc_wdt; |
7 | extern struct platform_device mxc_irda_device; | ||
8 | extern struct platform_device mxc_uart_device0; | 7 | extern struct platform_device mxc_uart_device0; |
9 | extern struct platform_device mxc_uart_device1; | 8 | extern struct platform_device mxc_uart_device1; |
10 | extern struct platform_device mxc_uart_device2; | 9 | extern struct platform_device mxc_uart_device2; |
@@ -20,3 +19,11 @@ extern struct platform_device mxc_i2c_device0; | |||
20 | extern struct platform_device mxc_i2c_device1; | 19 | extern struct platform_device mxc_i2c_device1; |
21 | extern struct platform_device mxc_sdhc_device0; | 20 | extern struct platform_device mxc_sdhc_device0; |
22 | extern struct platform_device mxc_sdhc_device1; | 21 | extern struct platform_device mxc_sdhc_device1; |
22 | extern struct platform_device mxc_otg_udc_device; | ||
23 | extern struct platform_device mxc_otg_host; | ||
24 | extern struct platform_device mxc_usbh1; | ||
25 | extern struct platform_device mxc_usbh2; | ||
26 | extern struct platform_device mxc_spi_device0; | ||
27 | extern struct platform_device mxc_spi_device1; | ||
28 | extern struct platform_device mxc_spi_device2; | ||
29 | |||
diff --git a/arch/arm/mach-mx2/eukrea_cpuimx27.c b/arch/arm/mach-mx2/eukrea_cpuimx27.c new file mode 100644 index 000000000000..7b187606682c --- /dev/null +++ b/arch/arm/mach-mx2/eukrea_cpuimx27.c | |||
@@ -0,0 +1,234 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 Eric Benard - eric@eukrea.com | ||
3 | * | ||
4 | * Based on pcm038.c which is : | ||
5 | * Copyright 2007 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix | ||
6 | * Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de) | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version 2 | ||
11 | * of the License, or (at your option) any later version. | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
20 | * MA 02110-1301, USA. | ||
21 | */ | ||
22 | |||
23 | #include <linux/i2c.h> | ||
24 | #include <linux/io.h> | ||
25 | #include <linux/mtd/plat-ram.h> | ||
26 | #include <linux/mtd/physmap.h> | ||
27 | #include <linux/platform_device.h> | ||
28 | #include <linux/serial_8250.h> | ||
29 | |||
30 | #include <asm/mach-types.h> | ||
31 | #include <asm/mach/arch.h> | ||
32 | #include <asm/mach/time.h> | ||
33 | #include <asm/mach/map.h> | ||
34 | |||
35 | #include <mach/board-eukrea_cpuimx27.h> | ||
36 | #include <mach/common.h> | ||
37 | #include <mach/hardware.h> | ||
38 | #include <mach/i2c.h> | ||
39 | #include <mach/iomux.h> | ||
40 | #include <mach/imx-uart.h> | ||
41 | #include <mach/mxc_nand.h> | ||
42 | |||
43 | #include "devices.h" | ||
44 | |||
45 | static int eukrea_cpuimx27_pins[] = { | ||
46 | /* UART1 */ | ||
47 | PE12_PF_UART1_TXD, | ||
48 | PE13_PF_UART1_RXD, | ||
49 | PE14_PF_UART1_CTS, | ||
50 | PE15_PF_UART1_RTS, | ||
51 | /* UART4 */ | ||
52 | PB26_AF_UART4_RTS, | ||
53 | PB28_AF_UART4_TXD, | ||
54 | PB29_AF_UART4_CTS, | ||
55 | PB31_AF_UART4_RXD, | ||
56 | /* FEC */ | ||
57 | PD0_AIN_FEC_TXD0, | ||
58 | PD1_AIN_FEC_TXD1, | ||
59 | PD2_AIN_FEC_TXD2, | ||
60 | PD3_AIN_FEC_TXD3, | ||
61 | PD4_AOUT_FEC_RX_ER, | ||
62 | PD5_AOUT_FEC_RXD1, | ||
63 | PD6_AOUT_FEC_RXD2, | ||
64 | PD7_AOUT_FEC_RXD3, | ||
65 | PD8_AF_FEC_MDIO, | ||
66 | PD9_AIN_FEC_MDC, | ||
67 | PD10_AOUT_FEC_CRS, | ||
68 | PD11_AOUT_FEC_TX_CLK, | ||
69 | PD12_AOUT_FEC_RXD0, | ||
70 | PD13_AOUT_FEC_RX_DV, | ||
71 | PD14_AOUT_FEC_RX_CLK, | ||
72 | PD15_AOUT_FEC_COL, | ||
73 | PD16_AIN_FEC_TX_ER, | ||
74 | PF23_AIN_FEC_TX_EN, | ||
75 | /* I2C1 */ | ||
76 | PD17_PF_I2C_DATA, | ||
77 | PD18_PF_I2C_CLK, | ||
78 | /* SDHC2 */ | ||
79 | PB4_PF_SD2_D0, | ||
80 | PB5_PF_SD2_D1, | ||
81 | PB6_PF_SD2_D2, | ||
82 | PB7_PF_SD2_D3, | ||
83 | PB8_PF_SD2_CMD, | ||
84 | PB9_PF_SD2_CLK, | ||
85 | #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE) | ||
86 | /* Quad UART's IRQ */ | ||
87 | GPIO_PORTD | 22 | GPIO_GPIO | GPIO_IN, | ||
88 | GPIO_PORTD | 23 | GPIO_GPIO | GPIO_IN, | ||
89 | GPIO_PORTD | 27 | GPIO_GPIO | GPIO_IN, | ||
90 | GPIO_PORTD | 30 | GPIO_GPIO | GPIO_IN, | ||
91 | #endif | ||
92 | }; | ||
93 | |||
94 | static struct physmap_flash_data eukrea_cpuimx27_flash_data = { | ||
95 | .width = 2, | ||
96 | }; | ||
97 | |||
98 | static struct resource eukrea_cpuimx27_flash_resource = { | ||
99 | .start = 0xc0000000, | ||
100 | .end = 0xc3ffffff, | ||
101 | .flags = IORESOURCE_MEM, | ||
102 | }; | ||
103 | |||
104 | static struct platform_device eukrea_cpuimx27_nor_mtd_device = { | ||
105 | .name = "physmap-flash", | ||
106 | .id = 0, | ||
107 | .dev = { | ||
108 | .platform_data = &eukrea_cpuimx27_flash_data, | ||
109 | }, | ||
110 | .num_resources = 1, | ||
111 | .resource = &eukrea_cpuimx27_flash_resource, | ||
112 | }; | ||
113 | |||
114 | static struct imxuart_platform_data uart_pdata[] = { | ||
115 | { | ||
116 | .flags = IMXUART_HAVE_RTSCTS, | ||
117 | }, { | ||
118 | .flags = IMXUART_HAVE_RTSCTS, | ||
119 | }, | ||
120 | }; | ||
121 | |||
122 | static struct mxc_nand_platform_data eukrea_cpuimx27_nand_board_info = { | ||
123 | .width = 1, | ||
124 | .hw_ecc = 1, | ||
125 | }; | ||
126 | |||
127 | static struct platform_device *platform_devices[] __initdata = { | ||
128 | &eukrea_cpuimx27_nor_mtd_device, | ||
129 | &mxc_fec_device, | ||
130 | }; | ||
131 | |||
132 | static struct imxi2c_platform_data eukrea_cpuimx27_i2c_1_data = { | ||
133 | .bitrate = 100000, | ||
134 | }; | ||
135 | |||
136 | static struct i2c_board_info eukrea_cpuimx27_i2c_devices[] = { | ||
137 | { | ||
138 | I2C_BOARD_INFO("pcf8563", 0x51), | ||
139 | }, | ||
140 | }; | ||
141 | |||
142 | #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE) | ||
143 | static struct plat_serial8250_port serial_platform_data[] = { | ||
144 | { | ||
145 | .mapbase = (unsigned long)(CS3_BASE_ADDR + 0x200000), | ||
146 | .irq = IRQ_GPIOB(23), | ||
147 | .uartclk = 14745600, | ||
148 | .regshift = 1, | ||
149 | .iotype = UPIO_MEM, | ||
150 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP, | ||
151 | }, { | ||
152 | .mapbase = (unsigned long)(CS3_BASE_ADDR + 0x400000), | ||
153 | .irq = IRQ_GPIOB(22), | ||
154 | .uartclk = 14745600, | ||
155 | .regshift = 1, | ||
156 | .iotype = UPIO_MEM, | ||
157 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP, | ||
158 | }, { | ||
159 | .mapbase = (unsigned long)(CS3_BASE_ADDR + 0x800000), | ||
160 | .irq = IRQ_GPIOB(27), | ||
161 | .uartclk = 14745600, | ||
162 | .regshift = 1, | ||
163 | .iotype = UPIO_MEM, | ||
164 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP, | ||
165 | }, { | ||
166 | .mapbase = (unsigned long)(CS3_BASE_ADDR + 0x1000000), | ||
167 | .irq = IRQ_GPIOB(30), | ||
168 | .uartclk = 14745600, | ||
169 | .regshift = 1, | ||
170 | .iotype = UPIO_MEM, | ||
171 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP, | ||
172 | }, { | ||
173 | } | ||
174 | }; | ||
175 | |||
176 | static struct platform_device serial_device = { | ||
177 | .name = "serial8250", | ||
178 | .id = 0, | ||
179 | .dev = { | ||
180 | .platform_data = serial_platform_data, | ||
181 | }, | ||
182 | }; | ||
183 | #endif | ||
184 | |||
185 | static void __init eukrea_cpuimx27_init(void) | ||
186 | { | ||
187 | mxc_gpio_setup_multiple_pins(eukrea_cpuimx27_pins, | ||
188 | ARRAY_SIZE(eukrea_cpuimx27_pins), "CPUIMX27"); | ||
189 | |||
190 | mxc_register_device(&mxc_uart_device0, &uart_pdata[0]); | ||
191 | |||
192 | mxc_register_device(&mxc_nand_device, &eukrea_cpuimx27_nand_board_info); | ||
193 | |||
194 | i2c_register_board_info(0, eukrea_cpuimx27_i2c_devices, | ||
195 | ARRAY_SIZE(eukrea_cpuimx27_i2c_devices)); | ||
196 | |||
197 | mxc_register_device(&mxc_i2c_device0, &eukrea_cpuimx27_i2c_1_data); | ||
198 | |||
199 | platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); | ||
200 | |||
201 | #if defined(CONFIG_MACH_EUKREA_CPUIMX27_USESDHC2) | ||
202 | /* SDHC2 can be used for Wifi */ | ||
203 | mxc_register_device(&mxc_sdhc_device1, NULL); | ||
204 | /* in which case UART4 is also used for Bluetooth */ | ||
205 | mxc_register_device(&mxc_uart_device3, &uart_pdata[1]); | ||
206 | #endif | ||
207 | |||
208 | #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE) | ||
209 | platform_device_register(&serial_device); | ||
210 | #endif | ||
211 | |||
212 | #ifdef CONFIG_MACH_EUKREA_MBIMX27_BASEBOARD | ||
213 | eukrea_mbimx27_baseboard_init(); | ||
214 | #endif | ||
215 | } | ||
216 | |||
217 | static void __init eukrea_cpuimx27_timer_init(void) | ||
218 | { | ||
219 | mx27_clocks_init(26000000); | ||
220 | } | ||
221 | |||
222 | static struct sys_timer eukrea_cpuimx27_timer = { | ||
223 | .init = eukrea_cpuimx27_timer_init, | ||
224 | }; | ||
225 | |||
226 | MACHINE_START(CPUIMX27, "EUKREA CPUIMX27") | ||
227 | .phys_io = AIPI_BASE_ADDR, | ||
228 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, | ||
229 | .boot_params = PHYS_OFFSET + 0x100, | ||
230 | .map_io = mx27_map_io, | ||
231 | .init_irq = mx27_init_irq, | ||
232 | .init_machine = eukrea_cpuimx27_init, | ||
233 | .timer = &eukrea_cpuimx27_timer, | ||
234 | MACHINE_END | ||
diff --git a/arch/arm/mach-mx2/eukrea_mbimx27-baseboard.c b/arch/arm/mach-mx2/eukrea_mbimx27-baseboard.c new file mode 100644 index 000000000000..7382b6d27ee1 --- /dev/null +++ b/arch/arm/mach-mx2/eukrea_mbimx27-baseboard.c | |||
@@ -0,0 +1,249 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 Eric Benard - eric@eukrea.com | ||
3 | * | ||
4 | * Based on pcm970-baseboard.c which is : | ||
5 | * Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de) | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version 2 | ||
10 | * of the License, or (at your option) any later version. | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
19 | * MA 02110-1301, USA. | ||
20 | */ | ||
21 | |||
22 | #include <linux/gpio.h> | ||
23 | #include <linux/irq.h> | ||
24 | #include <linux/platform_device.h> | ||
25 | #include <linux/spi/spi.h> | ||
26 | #include <linux/spi/ads7846.h> | ||
27 | |||
28 | #include <asm/mach/arch.h> | ||
29 | |||
30 | #include <mach/common.h> | ||
31 | #include <mach/iomux.h> | ||
32 | #include <mach/imxfb.h> | ||
33 | #include <mach/hardware.h> | ||
34 | #include <mach/mmc.h> | ||
35 | #include <mach/imx-uart.h> | ||
36 | |||
37 | #include "devices.h" | ||
38 | |||
39 | static int eukrea_mbimx27_pins[] = { | ||
40 | /* UART2 */ | ||
41 | PE3_PF_UART2_CTS, | ||
42 | PE4_PF_UART2_RTS, | ||
43 | PE6_PF_UART2_TXD, | ||
44 | PE7_PF_UART2_RXD, | ||
45 | /* UART3 */ | ||
46 | PE8_PF_UART3_TXD, | ||
47 | PE9_PF_UART3_RXD, | ||
48 | PE10_PF_UART3_CTS, | ||
49 | PE11_PF_UART3_RTS, | ||
50 | /* UART4 */ | ||
51 | PB26_AF_UART4_RTS, | ||
52 | PB28_AF_UART4_TXD, | ||
53 | PB29_AF_UART4_CTS, | ||
54 | PB31_AF_UART4_RXD, | ||
55 | /* SDHC1*/ | ||
56 | PE18_PF_SD1_D0, | ||
57 | PE19_PF_SD1_D1, | ||
58 | PE20_PF_SD1_D2, | ||
59 | PE21_PF_SD1_D3, | ||
60 | PE22_PF_SD1_CMD, | ||
61 | PE23_PF_SD1_CLK, | ||
62 | /* display */ | ||
63 | PA5_PF_LSCLK, | ||
64 | PA6_PF_LD0, | ||
65 | PA7_PF_LD1, | ||
66 | PA8_PF_LD2, | ||
67 | PA9_PF_LD3, | ||
68 | PA10_PF_LD4, | ||
69 | PA11_PF_LD5, | ||
70 | PA12_PF_LD6, | ||
71 | PA13_PF_LD7, | ||
72 | PA14_PF_LD8, | ||
73 | PA15_PF_LD9, | ||
74 | PA16_PF_LD10, | ||
75 | PA17_PF_LD11, | ||
76 | PA18_PF_LD12, | ||
77 | PA19_PF_LD13, | ||
78 | PA20_PF_LD14, | ||
79 | PA21_PF_LD15, | ||
80 | PA22_PF_LD16, | ||
81 | PA23_PF_LD17, | ||
82 | PA28_PF_HSYNC, | ||
83 | PA29_PF_VSYNC, | ||
84 | PA30_PF_CONTRAST, | ||
85 | PA31_PF_OE_ACD, | ||
86 | /* SPI1 */ | ||
87 | PD28_PF_CSPI1_SS0, | ||
88 | PD29_PF_CSPI1_SCLK, | ||
89 | PD30_PF_CSPI1_MISO, | ||
90 | PD31_PF_CSPI1_MOSI, | ||
91 | }; | ||
92 | |||
93 | static struct gpio_led gpio_leds[] = { | ||
94 | { | ||
95 | .name = "led1", | ||
96 | .default_trigger = "heartbeat", | ||
97 | .active_low = 1, | ||
98 | .gpio = GPIO_PORTF | 16, | ||
99 | }, | ||
100 | { | ||
101 | .name = "led2", | ||
102 | .default_trigger = "none", | ||
103 | .active_low = 1, | ||
104 | .gpio = GPIO_PORTF | 19, | ||
105 | }, | ||
106 | { | ||
107 | .name = "backlight", | ||
108 | .default_trigger = "backlight", | ||
109 | .active_low = 0, | ||
110 | .gpio = GPIO_PORTE | 5, | ||
111 | }, | ||
112 | }; | ||
113 | |||
114 | static struct gpio_led_platform_data gpio_led_info = { | ||
115 | .leds = gpio_leds, | ||
116 | .num_leds = ARRAY_SIZE(gpio_leds), | ||
117 | }; | ||
118 | |||
119 | static struct platform_device leds_gpio = { | ||
120 | .name = "leds-gpio", | ||
121 | .id = -1, | ||
122 | .dev = { | ||
123 | .platform_data = &gpio_led_info, | ||
124 | }, | ||
125 | }; | ||
126 | |||
127 | static struct imx_fb_videomode eukrea_mbimx27_modes[] = { | ||
128 | { | ||
129 | .mode = { | ||
130 | .name = "CMO-QGVA", | ||
131 | .refresh = 60, | ||
132 | .xres = 320, | ||
133 | .yres = 240, | ||
134 | .pixclock = 156000, | ||
135 | .hsync_len = 30, | ||
136 | .left_margin = 38, | ||
137 | .right_margin = 20, | ||
138 | .vsync_len = 3, | ||
139 | .upper_margin = 15, | ||
140 | .lower_margin = 4, | ||
141 | }, | ||
142 | .pcr = 0xFAD08B80, | ||
143 | .bpp = 16, | ||
144 | }, | ||
145 | }; | ||
146 | |||
147 | static struct imx_fb_platform_data eukrea_mbimx27_fb_data = { | ||
148 | .mode = eukrea_mbimx27_modes, | ||
149 | .num_modes = ARRAY_SIZE(eukrea_mbimx27_modes), | ||
150 | |||
151 | .pwmr = 0x00A903FF, | ||
152 | .lscr1 = 0x00120300, | ||
153 | .dmacr = 0x00040060, | ||
154 | }; | ||
155 | |||
156 | static struct imxuart_platform_data uart_pdata[] = { | ||
157 | { | ||
158 | .flags = IMXUART_HAVE_RTSCTS, | ||
159 | }, | ||
160 | { | ||
161 | .flags = IMXUART_HAVE_RTSCTS, | ||
162 | }, | ||
163 | }; | ||
164 | |||
165 | #if defined(CONFIG_TOUCHSCREEN_ADS7846) | ||
166 | || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) | ||
167 | |||
168 | #define ADS7846_PENDOWN (GPIO_PORTD | 25) | ||
169 | |||
170 | static void ads7846_dev_init(void) | ||
171 | { | ||
172 | if (gpio_request(ADS7846_PENDOWN, "ADS7846 pendown") < 0) { | ||
173 | printk(KERN_ERR "can't get ads746 pen down GPIO\n"); | ||
174 | return; | ||
175 | } | ||
176 | |||
177 | gpio_direction_input(ADS7846_PENDOWN); | ||
178 | } | ||
179 | |||
180 | static int ads7846_get_pendown_state(void) | ||
181 | { | ||
182 | return !gpio_get_value(ADS7846_PENDOWN); | ||
183 | } | ||
184 | |||
185 | static struct ads7846_platform_data ads7846_config __initdata = { | ||
186 | .get_pendown_state = ads7846_get_pendown_state, | ||
187 | .keep_vref_on = 1, | ||
188 | }; | ||
189 | |||
190 | static struct spi_board_info eukrea_mbimx27_spi_board_info[] __initdata = { | ||
191 | [0] = { | ||
192 | .modalias = "ads7846", | ||
193 | .bus_num = 0, | ||
194 | .chip_select = 0, | ||
195 | .max_speed_hz = 1500000, | ||
196 | .irq = IRQ_GPIOD(25), | ||
197 | .platform_data = &ads7846_config, | ||
198 | .mode = SPI_MODE_2, | ||
199 | }, | ||
200 | }; | ||
201 | |||
202 | static int eukrea_mbimx27_spi_cs[] = {GPIO_PORTD | 28}; | ||
203 | |||
204 | static struct spi_imx_master eukrea_mbimx27_spi_0_data = { | ||
205 | .chipselect = eukrea_mbimx27_spi_cs, | ||
206 | .num_chipselect = ARRAY_SIZE(eukrea_mbimx27_spi_cs), | ||
207 | }; | ||
208 | #endif | ||
209 | |||
210 | static struct platform_device *platform_devices[] __initdata = { | ||
211 | &leds_gpio, | ||
212 | }; | ||
213 | |||
214 | /* | ||
215 | * system init for baseboard usage. Will be called by cpuimx27 init. | ||
216 | * | ||
217 | * Add platform devices present on this baseboard and init | ||
218 | * them from CPU side as far as required to use them later on | ||
219 | */ | ||
220 | void __init eukrea_mbimx27_baseboard_init(void) | ||
221 | { | ||
222 | mxc_gpio_setup_multiple_pins(eukrea_mbimx27_pins, | ||
223 | ARRAY_SIZE(eukrea_mbimx27_pins), "MBIMX27"); | ||
224 | |||
225 | mxc_register_device(&mxc_uart_device1, &uart_pdata[0]); | ||
226 | mxc_register_device(&mxc_uart_device2, &uart_pdata[1]); | ||
227 | |||
228 | mxc_register_device(&mxc_fb_device, &eukrea_mbimx27_fb_data); | ||
229 | mxc_register_device(&mxc_sdhc_device0, NULL); | ||
230 | |||
231 | #if defined(CONFIG_TOUCHSCREEN_ADS7846) | ||
232 | || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) | ||
233 | /* SPI and ADS7846 Touchscreen controler init */ | ||
234 | mxc_gpio_mode(GPIO_PORTD | 28 | GPIO_GPIO | GPIO_OUT); | ||
235 | mxc_gpio_mode(GPIO_PORTD | 25 | GPIO_GPIO | GPIO_IN); | ||
236 | mxc_register_device(&mxc_spi_device0, &eukrea_mbimx27_spi_0_data); | ||
237 | spi_register_board_info(eukrea_mbimx27_spi_board_info, | ||
238 | ARRAY_SIZE(eukrea_mbimx27_spi_board_info)); | ||
239 | ads7846_dev_init(); | ||
240 | #endif | ||
241 | |||
242 | /* Leds configuration */ | ||
243 | mxc_gpio_mode(GPIO_PORTF | 16 | GPIO_GPIO | GPIO_OUT); | ||
244 | mxc_gpio_mode(GPIO_PORTF | 19 | GPIO_GPIO | GPIO_OUT); | ||
245 | /* Backlight */ | ||
246 | mxc_gpio_mode(GPIO_PORTE | 5 | GPIO_GPIO | GPIO_OUT); | ||
247 | |||
248 | platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); | ||
249 | } | ||
diff --git a/arch/arm/mach-mx2/generic.c b/arch/arm/mach-mx2/generic.c index 169372f69d8f..ae8f759134d1 100644 --- a/arch/arm/mach-mx2/generic.c +++ b/arch/arm/mach-mx2/generic.c | |||
@@ -72,6 +72,7 @@ static struct map_desc mxc_io_desc[] __initdata = { | |||
72 | void __init mx21_map_io(void) | 72 | void __init mx21_map_io(void) |
73 | { | 73 | { |
74 | mxc_set_cpu_type(MXC_CPU_MX21); | 74 | mxc_set_cpu_type(MXC_CPU_MX21); |
75 | mxc_arch_reset_init(IO_ADDRESS(WDOG_BASE_ADDR)); | ||
75 | 76 | ||
76 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); | 77 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); |
77 | } | 78 | } |
@@ -79,7 +80,18 @@ void __init mx21_map_io(void) | |||
79 | void __init mx27_map_io(void) | 80 | void __init mx27_map_io(void) |
80 | { | 81 | { |
81 | mxc_set_cpu_type(MXC_CPU_MX27); | 82 | mxc_set_cpu_type(MXC_CPU_MX27); |
83 | mxc_arch_reset_init(IO_ADDRESS(WDOG_BASE_ADDR)); | ||
82 | 84 | ||
83 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); | 85 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); |
84 | } | 86 | } |
85 | 87 | ||
88 | void __init mx27_init_irq(void) | ||
89 | { | ||
90 | mxc_init_irq(IO_ADDRESS(AVIC_BASE_ADDR)); | ||
91 | } | ||
92 | |||
93 | void __init mx21_init_irq(void) | ||
94 | { | ||
95 | mx27_init_irq(); | ||
96 | } | ||
97 | |||
diff --git a/arch/arm/mach-mx2/mx21ads.c b/arch/arm/mach-mx2/mx21ads.c index a5ee461cb405..cf5f77cbc2f1 100644 --- a/arch/arm/mach-mx2/mx21ads.c +++ b/arch/arm/mach-mx2/mx21ads.c | |||
@@ -164,25 +164,33 @@ static void mx21ads_fb_exit(struct platform_device *pdev) | |||
164 | * Connected is a portrait Sharp-QVGA display | 164 | * Connected is a portrait Sharp-QVGA display |
165 | * of type: LQ035Q7DB02 | 165 | * of type: LQ035Q7DB02 |
166 | */ | 166 | */ |
167 | static struct imx_fb_platform_data mx21ads_fb_data = { | 167 | static struct imx_fb_videomode mx21ads_modes[] = { |
168 | .pixclock = 188679, /* in ps */ | 168 | { |
169 | .xres = 240, | 169 | .mode = { |
170 | .yres = 320, | 170 | .name = "Sharp-LQ035Q7", |
171 | 171 | .refresh = 60, | |
172 | .bpp = 16, | 172 | .xres = 240, |
173 | .hsync_len = 2, | 173 | .yres = 320, |
174 | .left_margin = 6, | 174 | .pixclock = 188679, /* in ps (5.3MHz) */ |
175 | .right_margin = 16, | 175 | .hsync_len = 2, |
176 | .left_margin = 6, | ||
177 | .right_margin = 16, | ||
178 | .vsync_len = 1, | ||
179 | .upper_margin = 8, | ||
180 | .lower_margin = 10, | ||
181 | }, | ||
182 | .pcr = 0xfb108bc7, | ||
183 | .bpp = 16, | ||
184 | }, | ||
185 | }; | ||
176 | 186 | ||
177 | .vsync_len = 1, | 187 | static struct imx_fb_platform_data mx21ads_fb_data = { |
178 | .upper_margin = 8, | 188 | .mode = mx21ads_modes, |
179 | .lower_margin = 10, | 189 | .num_modes = ARRAY_SIZE(mx21ads_modes), |
180 | .fixed_screen_cpu = 0, | ||
181 | 190 | ||
182 | .pcr = 0xFB108BC7, | 191 | .pwmr = 0x00a903ff, |
183 | .pwmr = 0x00A901ff, | 192 | .lscr1 = 0x00120300, |
184 | .lscr1 = 0x00120300, | 193 | .dmacr = 0x00020008, |
185 | .dmacr = 0x00020008, | ||
186 | 194 | ||
187 | .init = mx21ads_fb_init, | 195 | .init = mx21ads_fb_init, |
188 | .exit = mx21ads_fb_exit, | 196 | .exit = mx21ads_fb_exit, |
@@ -280,7 +288,7 @@ MACHINE_START(MX21ADS, "Freescale i.MX21ADS") | |||
280 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 288 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
281 | .boot_params = PHYS_OFFSET + 0x100, | 289 | .boot_params = PHYS_OFFSET + 0x100, |
282 | .map_io = mx21ads_map_io, | 290 | .map_io = mx21ads_map_io, |
283 | .init_irq = mxc_init_irq, | 291 | .init_irq = mx21_init_irq, |
284 | .init_machine = mx21ads_board_init, | 292 | .init_machine = mx21ads_board_init, |
285 | .timer = &mx21ads_timer, | 293 | .timer = &mx21ads_timer, |
286 | MACHINE_END | 294 | MACHINE_END |
diff --git a/arch/arm/mach-mx2/mx27ads.c b/arch/arm/mach-mx2/mx27ads.c index 02daddac6995..83e412b713e6 100644 --- a/arch/arm/mach-mx2/mx27ads.c +++ b/arch/arm/mach-mx2/mx27ads.c | |||
@@ -183,20 +183,29 @@ void lcd_power(int on) | |||
183 | __raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_CLEAR_REG); | 183 | __raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_CLEAR_REG); |
184 | } | 184 | } |
185 | 185 | ||
186 | static struct imx_fb_platform_data mx27ads_fb_data = { | 186 | static struct imx_fb_videomode mx27ads_modes[] = { |
187 | .pixclock = 188679, | 187 | { |
188 | .xres = 240, | 188 | .mode = { |
189 | .yres = 320, | 189 | .name = "Sharp-LQ035Q7", |
190 | 190 | .refresh = 60, | |
191 | .bpp = 16, | 191 | .xres = 240, |
192 | .hsync_len = 1, | 192 | .yres = 320, |
193 | .left_margin = 9, | 193 | .pixclock = 188679, /* in ps (5.3MHz) */ |
194 | .right_margin = 16, | 194 | .hsync_len = 1, |
195 | .left_margin = 9, | ||
196 | .right_margin = 16, | ||
197 | .vsync_len = 1, | ||
198 | .upper_margin = 7, | ||
199 | .lower_margin = 9, | ||
200 | }, | ||
201 | .bpp = 16, | ||
202 | .pcr = 0xFB008BC0, | ||
203 | }, | ||
204 | }; | ||
195 | 205 | ||
196 | .vsync_len = 1, | 206 | static struct imx_fb_platform_data mx27ads_fb_data = { |
197 | .upper_margin = 7, | 207 | .mode = mx27ads_modes, |
198 | .lower_margin = 9, | 208 | .num_modes = ARRAY_SIZE(mx27ads_modes), |
199 | .fixed_screen_cpu = 0, | ||
200 | 209 | ||
201 | /* | 210 | /* |
202 | * - HSYNC active high | 211 | * - HSYNC active high |
@@ -207,7 +216,6 @@ static struct imx_fb_platform_data mx27ads_fb_data = { | |||
207 | * - data enable low active | 216 | * - data enable low active |
208 | * - enable sharp mode | 217 | * - enable sharp mode |
209 | */ | 218 | */ |
210 | .pcr = 0xFB008BC0, | ||
211 | .pwmr = 0x00A903FF, | 219 | .pwmr = 0x00A903FF, |
212 | .lscr1 = 0x00120300, | 220 | .lscr1 = 0x00120300, |
213 | .dmacr = 0x00020010, | 221 | .dmacr = 0x00020010, |
@@ -330,7 +338,7 @@ MACHINE_START(MX27ADS, "Freescale i.MX27ADS") | |||
330 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 338 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
331 | .boot_params = PHYS_OFFSET + 0x100, | 339 | .boot_params = PHYS_OFFSET + 0x100, |
332 | .map_io = mx27ads_map_io, | 340 | .map_io = mx27ads_map_io, |
333 | .init_irq = mxc_init_irq, | 341 | .init_irq = mx27_init_irq, |
334 | .init_machine = mx27ads_board_init, | 342 | .init_machine = mx27ads_board_init, |
335 | .timer = &mx27ads_timer, | 343 | .timer = &mx27ads_timer, |
336 | MACHINE_END | 344 | MACHINE_END |
diff --git a/arch/arm/mach-mx2/mx27lite.c b/arch/arm/mach-mx2/mx27lite.c index 3ae11cb8c04b..82ea227ea0cf 100644 --- a/arch/arm/mach-mx2/mx27lite.c +++ b/arch/arm/mach-mx2/mx27lite.c | |||
@@ -89,7 +89,7 @@ MACHINE_START(IMX27LITE, "LogicPD i.MX27LITE") | |||
89 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 89 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
90 | .boot_params = PHYS_OFFSET + 0x100, | 90 | .boot_params = PHYS_OFFSET + 0x100, |
91 | .map_io = mx27_map_io, | 91 | .map_io = mx27_map_io, |
92 | .init_irq = mxc_init_irq, | 92 | .init_irq = mx27_init_irq, |
93 | .init_machine = mx27lite_init, | 93 | .init_machine = mx27lite_init, |
94 | .timer = &mx27lite_timer, | 94 | .timer = &mx27lite_timer, |
95 | MACHINE_END | 95 | MACHINE_END |
diff --git a/arch/arm/mach-mx2/mx27pdk.c b/arch/arm/mach-mx2/mx27pdk.c index 1d9238c7a6c3..6761d1b79e43 100644 --- a/arch/arm/mach-mx2/mx27pdk.c +++ b/arch/arm/mach-mx2/mx27pdk.c | |||
@@ -89,7 +89,7 @@ MACHINE_START(MX27_3DS, "Freescale MX27PDK") | |||
89 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 89 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
90 | .boot_params = PHYS_OFFSET + 0x100, | 90 | .boot_params = PHYS_OFFSET + 0x100, |
91 | .map_io = mx27_map_io, | 91 | .map_io = mx27_map_io, |
92 | .init_irq = mxc_init_irq, | 92 | .init_irq = mx27_init_irq, |
93 | .init_machine = mx27pdk_init, | 93 | .init_machine = mx27pdk_init, |
94 | .timer = &mx27pdk_timer, | 94 | .timer = &mx27pdk_timer, |
95 | MACHINE_END | 95 | MACHINE_END |
diff --git a/arch/arm/mach-mx2/pca100.c b/arch/arm/mach-mx2/pca100.c new file mode 100644 index 000000000000..fe5b165b88cc --- /dev/null +++ b/arch/arm/mach-mx2/pca100.c | |||
@@ -0,0 +1,244 @@ | |||
1 | /* | ||
2 | * Copyright 2007 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix | ||
3 | * Copyright (C) 2009 Sascha Hauer (kernel@pengutronix.de) | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License | ||
7 | * as published by the Free Software Foundation; either version 2 | ||
8 | * of the License, or (at your option) any later version. | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
17 | * MA 02110-1301, USA. | ||
18 | */ | ||
19 | |||
20 | #include <linux/platform_device.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <linux/i2c.h> | ||
23 | #include <linux/i2c/at24.h> | ||
24 | #include <linux/dma-mapping.h> | ||
25 | #include <linux/spi/spi.h> | ||
26 | #include <linux/spi/eeprom.h> | ||
27 | #include <linux/irq.h> | ||
28 | #include <linux/gpio.h> | ||
29 | |||
30 | #include <asm/mach/arch.h> | ||
31 | #include <asm/mach-types.h> | ||
32 | #include <mach/common.h> | ||
33 | #include <mach/hardware.h> | ||
34 | #include <mach/iomux.h> | ||
35 | #include <mach/i2c.h> | ||
36 | #include <asm/mach/time.h> | ||
37 | #if defined(CONFIG_SPI_IMX) || defined(CONFIG_SPI_IMX_MODULE) | ||
38 | #include <mach/spi.h> | ||
39 | #endif | ||
40 | #include <mach/imx-uart.h> | ||
41 | #include <mach/mxc_nand.h> | ||
42 | #include <mach/irqs.h> | ||
43 | #include <mach/mmc.h> | ||
44 | |||
45 | #include "devices.h" | ||
46 | |||
47 | static int pca100_pins[] = { | ||
48 | /* UART1 */ | ||
49 | PE12_PF_UART1_TXD, | ||
50 | PE13_PF_UART1_RXD, | ||
51 | PE14_PF_UART1_CTS, | ||
52 | PE15_PF_UART1_RTS, | ||
53 | /* SDHC */ | ||
54 | PB4_PF_SD2_D0, | ||
55 | PB5_PF_SD2_D1, | ||
56 | PB6_PF_SD2_D2, | ||
57 | PB7_PF_SD2_D3, | ||
58 | PB8_PF_SD2_CMD, | ||
59 | PB9_PF_SD2_CLK, | ||
60 | /* FEC */ | ||
61 | PD0_AIN_FEC_TXD0, | ||
62 | PD1_AIN_FEC_TXD1, | ||
63 | PD2_AIN_FEC_TXD2, | ||
64 | PD3_AIN_FEC_TXD3, | ||
65 | PD4_AOUT_FEC_RX_ER, | ||
66 | PD5_AOUT_FEC_RXD1, | ||
67 | PD6_AOUT_FEC_RXD2, | ||
68 | PD7_AOUT_FEC_RXD3, | ||
69 | PD8_AF_FEC_MDIO, | ||
70 | PD9_AIN_FEC_MDC, | ||
71 | PD10_AOUT_FEC_CRS, | ||
72 | PD11_AOUT_FEC_TX_CLK, | ||
73 | PD12_AOUT_FEC_RXD0, | ||
74 | PD13_AOUT_FEC_RX_DV, | ||
75 | PD14_AOUT_FEC_RX_CLK, | ||
76 | PD15_AOUT_FEC_COL, | ||
77 | PD16_AIN_FEC_TX_ER, | ||
78 | PF23_AIN_FEC_TX_EN, | ||
79 | /* SSI1 */ | ||
80 | PC20_PF_SSI1_FS, | ||
81 | PC21_PF_SSI1_RXD, | ||
82 | PC22_PF_SSI1_TXD, | ||
83 | PC23_PF_SSI1_CLK, | ||
84 | /* onboard I2C */ | ||
85 | PC5_PF_I2C2_SDA, | ||
86 | PC6_PF_I2C2_SCL, | ||
87 | /* external I2C */ | ||
88 | PD17_PF_I2C_DATA, | ||
89 | PD18_PF_I2C_CLK, | ||
90 | /* SPI1 */ | ||
91 | PD25_PF_CSPI1_RDY, | ||
92 | PD29_PF_CSPI1_SCLK, | ||
93 | PD30_PF_CSPI1_MISO, | ||
94 | PD31_PF_CSPI1_MOSI, | ||
95 | }; | ||
96 | |||
97 | static struct imxuart_platform_data uart_pdata = { | ||
98 | .flags = IMXUART_HAVE_RTSCTS, | ||
99 | }; | ||
100 | |||
101 | static struct mxc_nand_platform_data pca100_nand_board_info = { | ||
102 | .width = 1, | ||
103 | .hw_ecc = 1, | ||
104 | }; | ||
105 | |||
106 | static struct platform_device *platform_devices[] __initdata = { | ||
107 | &mxc_w1_master_device, | ||
108 | &mxc_fec_device, | ||
109 | }; | ||
110 | |||
111 | static struct imxi2c_platform_data pca100_i2c_1_data = { | ||
112 | .bitrate = 100000, | ||
113 | }; | ||
114 | |||
115 | static struct at24_platform_data board_eeprom = { | ||
116 | .byte_len = 4096, | ||
117 | .page_size = 32, | ||
118 | .flags = AT24_FLAG_ADDR16, | ||
119 | }; | ||
120 | |||
121 | static struct i2c_board_info pca100_i2c_devices[] = { | ||
122 | { | ||
123 | I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */ | ||
124 | .platform_data = &board_eeprom, | ||
125 | }, { | ||
126 | I2C_BOARD_INFO("rtc-pcf8563", 0x51), | ||
127 | .type = "pcf8563" | ||
128 | }, { | ||
129 | I2C_BOARD_INFO("lm75", 0x4a), | ||
130 | .type = "lm75" | ||
131 | } | ||
132 | }; | ||
133 | |||
134 | #if defined(CONFIG_SPI_IMX) || defined(CONFIG_SPI_IMX_MODULE) | ||
135 | static struct spi_eeprom at25320 = { | ||
136 | .name = "at25320an", | ||
137 | .byte_len = 4096, | ||
138 | .page_size = 32, | ||
139 | .flags = EE_ADDR2, | ||
140 | }; | ||
141 | |||
142 | static struct spi_board_info pca100_spi_board_info[] __initdata = { | ||
143 | { | ||
144 | .modalias = "at25", | ||
145 | .max_speed_hz = 30000, | ||
146 | .bus_num = 0, | ||
147 | .chip_select = 1, | ||
148 | .platform_data = &at25320, | ||
149 | }, | ||
150 | }; | ||
151 | |||
152 | static int pca100_spi_cs[] = {GPIO_PORTD + 28, GPIO_PORTD + 27}; | ||
153 | |||
154 | static struct spi_imx_master pca100_spi_0_data = { | ||
155 | .chipselect = pca100_spi_cs, | ||
156 | .num_chipselect = ARRAY_SIZE(pca100_spi_cs), | ||
157 | }; | ||
158 | #endif | ||
159 | |||
160 | static int pca100_sdhc2_init(struct device *dev, irq_handler_t detect_irq, | ||
161 | void *data) | ||
162 | { | ||
163 | int ret; | ||
164 | |||
165 | ret = request_irq(IRQ_GPIOC(29), detect_irq, | ||
166 | IRQF_DISABLED | IRQF_TRIGGER_FALLING, | ||
167 | "imx-mmc-detect", data); | ||
168 | if (ret) | ||
169 | printk(KERN_ERR | ||
170 | "pca100: Failed to reuest irq for sd/mmc detection\n"); | ||
171 | |||
172 | return ret; | ||
173 | } | ||
174 | |||
175 | static void pca100_sdhc2_exit(struct device *dev, void *data) | ||
176 | { | ||
177 | free_irq(IRQ_GPIOC(29), data); | ||
178 | } | ||
179 | |||
180 | static struct imxmmc_platform_data sdhc_pdata = { | ||
181 | .init = pca100_sdhc2_init, | ||
182 | .exit = pca100_sdhc2_exit, | ||
183 | }; | ||
184 | |||
185 | static void __init pca100_init(void) | ||
186 | { | ||
187 | int ret; | ||
188 | |||
189 | ret = mxc_gpio_setup_multiple_pins(pca100_pins, | ||
190 | ARRAY_SIZE(pca100_pins), "PCA100"); | ||
191 | if (ret) | ||
192 | printk(KERN_ERR "pca100: Failed to setup pins (%d)\n", ret); | ||
193 | |||
194 | mxc_register_device(&mxc_uart_device0, &uart_pdata); | ||
195 | |||
196 | mxc_gpio_mode(GPIO_PORTC | 29 | GPIO_GPIO | GPIO_IN); | ||
197 | mxc_register_device(&mxc_sdhc_device1, &sdhc_pdata); | ||
198 | |||
199 | mxc_register_device(&mxc_nand_device, &pca100_nand_board_info); | ||
200 | |||
201 | /* only the i2c master 1 is used on this CPU card */ | ||
202 | i2c_register_board_info(1, pca100_i2c_devices, | ||
203 | ARRAY_SIZE(pca100_i2c_devices)); | ||
204 | |||
205 | mxc_register_device(&mxc_i2c_device1, &pca100_i2c_1_data); | ||
206 | |||
207 | mxc_gpio_mode(GPIO_PORTD | 28 | GPIO_GPIO | GPIO_OUT); | ||
208 | mxc_gpio_mode(GPIO_PORTD | 27 | GPIO_GPIO | GPIO_OUT); | ||
209 | |||
210 | /* GPIO0_IRQ */ | ||
211 | mxc_gpio_mode(GPIO_PORTC | 31 | GPIO_GPIO | GPIO_IN); | ||
212 | /* GPIO1_IRQ */ | ||
213 | mxc_gpio_mode(GPIO_PORTC | 25 | GPIO_GPIO | GPIO_IN); | ||
214 | /* GPIO2_IRQ */ | ||
215 | mxc_gpio_mode(GPIO_PORTE | 5 | GPIO_GPIO | GPIO_IN); | ||
216 | |||
217 | #if defined(CONFIG_SPI_IMX) || defined(CONFIG_SPI_IMX_MODULE) | ||
218 | spi_register_board_info(pca100_spi_board_info, | ||
219 | ARRAY_SIZE(pca100_spi_board_info)); | ||
220 | mxc_register_device(&mxc_spi_device0, &pca100_spi_0_data); | ||
221 | #endif | ||
222 | |||
223 | platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); | ||
224 | } | ||
225 | |||
226 | static void __init pca100_timer_init(void) | ||
227 | { | ||
228 | mx27_clocks_init(26000000); | ||
229 | } | ||
230 | |||
231 | static struct sys_timer pca100_timer = { | ||
232 | .init = pca100_timer_init, | ||
233 | }; | ||
234 | |||
235 | MACHINE_START(PCA100, "phyCARD-i.MX27") | ||
236 | .phys_io = AIPI_BASE_ADDR, | ||
237 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, | ||
238 | .boot_params = PHYS_OFFSET + 0x100, | ||
239 | .map_io = mx27_map_io, | ||
240 | .init_irq = mxc_init_irq, | ||
241 | .init_machine = pca100_init, | ||
242 | .timer = &pca100_timer, | ||
243 | MACHINE_END | ||
244 | |||
diff --git a/arch/arm/mach-mx2/pcm038.c b/arch/arm/mach-mx2/pcm038.c index a4628d004343..ee65dda584cf 100644 --- a/arch/arm/mach-mx2/pcm038.c +++ b/arch/arm/mach-mx2/pcm038.c | |||
@@ -186,17 +186,13 @@ static struct at24_platform_data board_eeprom = { | |||
186 | }; | 186 | }; |
187 | 187 | ||
188 | static struct i2c_board_info pcm038_i2c_devices[] = { | 188 | static struct i2c_board_info pcm038_i2c_devices[] = { |
189 | [0] = { | 189 | { |
190 | I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */ | 190 | I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */ |
191 | .platform_data = &board_eeprom, | 191 | .platform_data = &board_eeprom, |
192 | }, | 192 | }, { |
193 | [1] = { | 193 | I2C_BOARD_INFO("pcf8563", 0x51), |
194 | I2C_BOARD_INFO("rtc-pcf8563", 0x51), | 194 | }, { |
195 | .type = "pcf8563" | ||
196 | }, | ||
197 | [2] = { | ||
198 | I2C_BOARD_INFO("lm75", 0x4a), | 195 | I2C_BOARD_INFO("lm75", 0x4a), |
199 | .type = "lm75" | ||
200 | } | 196 | } |
201 | }; | 197 | }; |
202 | 198 | ||
@@ -220,6 +216,9 @@ static void __init pcm038_init(void) | |||
220 | 216 | ||
221 | mxc_register_device(&mxc_i2c_device1, &pcm038_i2c_1_data); | 217 | mxc_register_device(&mxc_i2c_device1, &pcm038_i2c_1_data); |
222 | 218 | ||
219 | /* PE18 for user-LED D40 */ | ||
220 | mxc_gpio_mode(GPIO_PORTE | 18 | GPIO_GPIO | GPIO_OUT); | ||
221 | |||
223 | platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); | 222 | platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); |
224 | 223 | ||
225 | #ifdef CONFIG_MACH_PCM970_BASEBOARD | 224 | #ifdef CONFIG_MACH_PCM970_BASEBOARD |
@@ -241,7 +240,7 @@ MACHINE_START(PCM038, "phyCORE-i.MX27") | |||
241 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 240 | .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
242 | .boot_params = PHYS_OFFSET + 0x100, | 241 | .boot_params = PHYS_OFFSET + 0x100, |
243 | .map_io = mx27_map_io, | 242 | .map_io = mx27_map_io, |
244 | .init_irq = mxc_init_irq, | 243 | .init_irq = mx27_init_irq, |
245 | .init_machine = pcm038_init, | 244 | .init_machine = pcm038_init, |
246 | .timer = &pcm038_timer, | 245 | .timer = &pcm038_timer, |
247 | MACHINE_END | 246 | MACHINE_END |
diff --git a/arch/arm/mach-mx2/pcm970-baseboard.c b/arch/arm/mach-mx2/pcm970-baseboard.c index 6a3acaf57dd4..c261f59b0b4c 100644 --- a/arch/arm/mach-mx2/pcm970-baseboard.c +++ b/arch/arm/mach-mx2/pcm970-baseboard.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/gpio.h> | 19 | #include <linux/gpio.h> |
20 | #include <linux/irq.h> | 20 | #include <linux/irq.h> |
21 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
22 | #include <linux/can/platform/sja1000.h> | ||
22 | 23 | ||
23 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
24 | 25 | ||
@@ -125,40 +126,96 @@ static struct imxmmc_platform_data sdhc_pdata = { | |||
125 | .exit = pcm970_sdhc2_exit, | 126 | .exit = pcm970_sdhc2_exit, |
126 | }; | 127 | }; |
127 | 128 | ||
128 | /* | 129 | static struct imx_fb_videomode pcm970_modes[] = { |
129 | * Connected is a portrait Sharp-QVGA display | 130 | { |
130 | * of type: LQ035Q7DH06 | 131 | .mode = { |
131 | */ | 132 | .name = "Sharp-LQ035Q7", |
132 | static struct imx_fb_platform_data pcm038_fb_data = { | 133 | .refresh = 60, |
133 | .pixclock = 188679, /* in ps (5.3MHz) */ | 134 | .xres = 240, |
134 | .xres = 240, | 135 | .yres = 320, |
135 | .yres = 320, | 136 | .pixclock = 188679, /* in ps (5.3MHz) */ |
136 | 137 | .hsync_len = 7, | |
137 | .bpp = 16, | 138 | .left_margin = 5, |
138 | .hsync_len = 7, | 139 | .right_margin = 16, |
139 | .left_margin = 5, | 140 | .vsync_len = 1, |
140 | .right_margin = 16, | 141 | .upper_margin = 7, |
142 | .lower_margin = 9, | ||
143 | }, | ||
144 | /* | ||
145 | * - HSYNC active high | ||
146 | * - VSYNC active high | ||
147 | * - clk notenabled while idle | ||
148 | * - clock not inverted | ||
149 | * - data not inverted | ||
150 | * - data enable low active | ||
151 | * - enable sharp mode | ||
152 | */ | ||
153 | .pcr = 0xF00080C0, | ||
154 | .bpp = 16, | ||
155 | }, { | ||
156 | .mode = { | ||
157 | .name = "TX090", | ||
158 | .refresh = 60, | ||
159 | .xres = 240, | ||
160 | .yres = 320, | ||
161 | .pixclock = 38255, | ||
162 | .left_margin = 144, | ||
163 | .right_margin = 0, | ||
164 | .upper_margin = 7, | ||
165 | .lower_margin = 40, | ||
166 | .hsync_len = 96, | ||
167 | .vsync_len = 1, | ||
168 | }, | ||
169 | /* | ||
170 | * - HSYNC active low (1 << 22) | ||
171 | * - VSYNC active low (1 << 23) | ||
172 | * - clk notenabled while idle | ||
173 | * - clock not inverted | ||
174 | * - data not inverted | ||
175 | * - data enable low active | ||
176 | * - enable sharp mode | ||
177 | */ | ||
178 | .pcr = 0xF0008080 | (1<<22) | (1<<23) | (1<<19), | ||
179 | .bpp = 32, | ||
180 | }, | ||
181 | }; | ||
141 | 182 | ||
142 | .vsync_len = 1, | 183 | static struct imx_fb_platform_data pcm038_fb_data = { |
143 | .upper_margin = 7, | 184 | .mode = pcm970_modes, |
144 | .lower_margin = 9, | 185 | .num_modes = ARRAY_SIZE(pcm970_modes), |
145 | .fixed_screen_cpu = 0, | ||
146 | 186 | ||
147 | /* | ||
148 | * - HSYNC active high | ||
149 | * - VSYNC active high | ||
150 | * - clk notenabled while idle | ||
151 | * - clock not inverted | ||
152 | * - data not inverted | ||
153 | * - data enable low active | ||
154 | * - enable sharp mode | ||
155 | */ | ||
156 | .pcr = 0xFA0080C0, | ||
157 | .pwmr = 0x00A903FF, | 187 | .pwmr = 0x00A903FF, |
158 | .lscr1 = 0x00120300, | 188 | .lscr1 = 0x00120300, |
159 | .dmacr = 0x00020010, | 189 | .dmacr = 0x00020010, |
160 | }; | 190 | }; |
161 | 191 | ||
192 | static struct resource pcm970_sja1000_resources[] = { | ||
193 | { | ||
194 | .start = CS4_BASE_ADDR, | ||
195 | .end = CS4_BASE_ADDR + 0x100 - 1, | ||
196 | .flags = IORESOURCE_MEM, | ||
197 | }, { | ||
198 | .start = IRQ_GPIOE(19), | ||
199 | .end = IRQ_GPIOE(19), | ||
200 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE, | ||
201 | }, | ||
202 | }; | ||
203 | |||
204 | struct sja1000_platform_data pcm970_sja1000_platform_data = { | ||
205 | .clock = 16000000 / 2, | ||
206 | .ocr = 0x40 | 0x18, | ||
207 | .cdr = 0x40, | ||
208 | }; | ||
209 | |||
210 | static struct platform_device pcm970_sja1000 = { | ||
211 | .name = "sja1000_platform", | ||
212 | .dev = { | ||
213 | .platform_data = &pcm970_sja1000_platform_data, | ||
214 | }, | ||
215 | .resource = pcm970_sja1000_resources, | ||
216 | .num_resources = ARRAY_SIZE(pcm970_sja1000_resources), | ||
217 | }; | ||
218 | |||
162 | /* | 219 | /* |
163 | * system init for baseboard usage. Will be called by pcm038 init. | 220 | * system init for baseboard usage. Will be called by pcm038 init. |
164 | * | 221 | * |
@@ -172,4 +229,5 @@ void __init pcm970_baseboard_init(void) | |||
172 | 229 | ||
173 | mxc_register_device(&mxc_fb_device, &pcm038_fb_data); | 230 | mxc_register_device(&mxc_fb_device, &pcm038_fb_data); |
174 | mxc_register_device(&mxc_sdhc_device1, &sdhc_pdata); | 231 | mxc_register_device(&mxc_sdhc_device1, &sdhc_pdata); |
232 | platform_device_register(&pcm970_sja1000); | ||
175 | } | 233 | } |
diff --git a/arch/arm/mach-mx25/Kconfig b/arch/arm/mach-mx25/Kconfig new file mode 100644 index 000000000000..cc28f56eae80 --- /dev/null +++ b/arch/arm/mach-mx25/Kconfig | |||
@@ -0,0 +1,9 @@ | |||
1 | if ARCH_MX25 | ||
2 | |||
3 | comment "MX25 platforms:" | ||
4 | |||
5 | config MACH_MX25_3DS | ||
6 | select ARCH_MXC_IOMUX_V3 | ||
7 | bool "Support MX25PDK (3DS) Platform" | ||
8 | |||
9 | endif | ||
diff --git a/arch/arm/mach-mx25/Makefile b/arch/arm/mach-mx25/Makefile new file mode 100644 index 000000000000..fe23836a9f3d --- /dev/null +++ b/arch/arm/mach-mx25/Makefile | |||
@@ -0,0 +1,3 @@ | |||
1 | obj-y := mm.o devices.o | ||
2 | obj-$(CONFIG_ARCH_MX25) += clock.o | ||
3 | obj-$(CONFIG_MACH_MX25_3DS) += mx25pdk.o | ||
diff --git a/arch/arm/mach-mx25/Makefile.boot b/arch/arm/mach-mx25/Makefile.boot new file mode 100644 index 000000000000..e1dd366f836b --- /dev/null +++ b/arch/arm/mach-mx25/Makefile.boot | |||
@@ -0,0 +1,3 @@ | |||
1 | zreladdr-y := 0x80008000 | ||
2 | params_phys-y := 0x80000100 | ||
3 | initrd_phys-y := 0x80800000 | ||
diff --git a/arch/arm/mach-mx25/clock.c b/arch/arm/mach-mx25/clock.c new file mode 100644 index 000000000000..ef26951a5275 --- /dev/null +++ b/arch/arm/mach-mx25/clock.c | |||
@@ -0,0 +1,219 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 by Sascha Hauer, Pengutronix | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; either version 2 | ||
7 | * of the License, or (at your option) any later version. | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program; if not, write to the Free Software | ||
15 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
16 | * MA 02110-1301, USA. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/list.h> | ||
22 | #include <linux/clk.h> | ||
23 | #include <linux/io.h> | ||
24 | |||
25 | #include <asm/clkdev.h> | ||
26 | |||
27 | #include <mach/clock.h> | ||
28 | #include <mach/hardware.h> | ||
29 | #include <mach/common.h> | ||
30 | #include <mach/mx25.h> | ||
31 | |||
32 | #define CRM_BASE MX25_IO_ADDRESS(MX25_CRM_BASE_ADDR) | ||
33 | |||
34 | #define CCM_MPCTL 0x00 | ||
35 | #define CCM_UPCTL 0x04 | ||
36 | #define CCM_CCTL 0x08 | ||
37 | #define CCM_CGCR0 0x0C | ||
38 | #define CCM_CGCR1 0x10 | ||
39 | #define CCM_CGCR2 0x14 | ||
40 | #define CCM_PCDR0 0x18 | ||
41 | #define CCM_PCDR1 0x1C | ||
42 | #define CCM_PCDR2 0x20 | ||
43 | #define CCM_PCDR3 0x24 | ||
44 | #define CCM_RCSR 0x28 | ||
45 | #define CCM_CRDR 0x2C | ||
46 | #define CCM_DCVR0 0x30 | ||
47 | #define CCM_DCVR1 0x34 | ||
48 | #define CCM_DCVR2 0x38 | ||
49 | #define CCM_DCVR3 0x3c | ||
50 | #define CCM_LTR0 0x40 | ||
51 | #define CCM_LTR1 0x44 | ||
52 | #define CCM_LTR2 0x48 | ||
53 | #define CCM_LTR3 0x4c | ||
54 | |||
55 | static unsigned long get_rate_mpll(void) | ||
56 | { | ||
57 | ulong mpctl = __raw_readl(CRM_BASE + CCM_MPCTL); | ||
58 | |||
59 | return mxc_decode_pll(mpctl, 24000000); | ||
60 | } | ||
61 | |||
62 | static unsigned long get_rate_upll(void) | ||
63 | { | ||
64 | ulong mpctl = __raw_readl(CRM_BASE + CCM_UPCTL); | ||
65 | |||
66 | return mxc_decode_pll(mpctl, 24000000); | ||
67 | } | ||
68 | |||
69 | unsigned long get_rate_arm(struct clk *clk) | ||
70 | { | ||
71 | unsigned long cctl = readl(CRM_BASE + CCM_CCTL); | ||
72 | unsigned long rate = get_rate_mpll(); | ||
73 | |||
74 | if (cctl & (1 << 14)) | ||
75 | rate = (rate * 3) >> 1; | ||
76 | |||
77 | return rate / ((cctl >> 30) + 1); | ||
78 | } | ||
79 | |||
80 | static unsigned long get_rate_ahb(struct clk *clk) | ||
81 | { | ||
82 | unsigned long cctl = readl(CRM_BASE + CCM_CCTL); | ||
83 | |||
84 | return get_rate_arm(NULL) / (((cctl >> 28) & 0x3) + 1); | ||
85 | } | ||
86 | |||
87 | static unsigned long get_rate_ipg(struct clk *clk) | ||
88 | { | ||
89 | return get_rate_ahb(NULL) >> 1; | ||
90 | } | ||
91 | |||
92 | static unsigned long get_rate_per(int per) | ||
93 | { | ||
94 | unsigned long ofs = (per & 0x3) * 8; | ||
95 | unsigned long reg = per & ~0x3; | ||
96 | unsigned long val = (readl(CRM_BASE + CCM_PCDR0 + reg) >> ofs) & 0x3f; | ||
97 | unsigned long fref; | ||
98 | |||
99 | if (readl(CRM_BASE + 0x64) & (1 << per)) | ||
100 | fref = get_rate_upll(); | ||
101 | else | ||
102 | fref = get_rate_ipg(NULL); | ||
103 | |||
104 | return fref / (val + 1); | ||
105 | } | ||
106 | |||
107 | static unsigned long get_rate_uart(struct clk *clk) | ||
108 | { | ||
109 | return get_rate_per(15); | ||
110 | } | ||
111 | |||
112 | static unsigned long get_rate_i2c(struct clk *clk) | ||
113 | { | ||
114 | return get_rate_per(6); | ||
115 | } | ||
116 | |||
117 | static unsigned long get_rate_nfc(struct clk *clk) | ||
118 | { | ||
119 | return get_rate_per(8); | ||
120 | } | ||
121 | |||
122 | static unsigned long get_rate_otg(struct clk *clk) | ||
123 | { | ||
124 | return 48000000; /* FIXME */ | ||
125 | } | ||
126 | |||
127 | static int clk_cgcr_enable(struct clk *clk) | ||
128 | { | ||
129 | u32 reg; | ||
130 | |||
131 | reg = __raw_readl(clk->enable_reg); | ||
132 | reg |= 1 << clk->enable_shift; | ||
133 | __raw_writel(reg, clk->enable_reg); | ||
134 | |||
135 | return 0; | ||
136 | } | ||
137 | |||
138 | static void clk_cgcr_disable(struct clk *clk) | ||
139 | { | ||
140 | u32 reg; | ||
141 | |||
142 | reg = __raw_readl(clk->enable_reg); | ||
143 | reg &= ~(1 << clk->enable_shift); | ||
144 | __raw_writel(reg, clk->enable_reg); | ||
145 | } | ||
146 | |||
147 | #define DEFINE_CLOCK(name, i, er, es, gr, sr) \ | ||
148 | static struct clk name = { \ | ||
149 | .id = i, \ | ||
150 | .enable_reg = CRM_BASE + er, \ | ||
151 | .enable_shift = es, \ | ||
152 | .get_rate = gr, \ | ||
153 | .set_rate = sr, \ | ||
154 | .enable = clk_cgcr_enable, \ | ||
155 | .disable = clk_cgcr_disable, \ | ||
156 | } | ||
157 | |||
158 | DEFINE_CLOCK(gpt_clk, 0, CCM_CGCR0, 5, get_rate_ipg, NULL); | ||
159 | DEFINE_CLOCK(cspi1_clk, 0, CCM_CGCR1, 5, get_rate_ipg, NULL); | ||
160 | DEFINE_CLOCK(cspi2_clk, 0, CCM_CGCR1, 6, get_rate_ipg, NULL); | ||
161 | DEFINE_CLOCK(cspi3_clk, 0, CCM_CGCR1, 7, get_rate_ipg, NULL); | ||
162 | DEFINE_CLOCK(uart1_clk, 0, CCM_CGCR2, 14, get_rate_uart, NULL); | ||
163 | DEFINE_CLOCK(uart2_clk, 0, CCM_CGCR2, 15, get_rate_uart, NULL); | ||
164 | DEFINE_CLOCK(uart3_clk, 0, CCM_CGCR2, 16, get_rate_uart, NULL); | ||
165 | DEFINE_CLOCK(uart4_clk, 0, CCM_CGCR2, 17, get_rate_uart, NULL); | ||
166 | DEFINE_CLOCK(uart5_clk, 0, CCM_CGCR2, 18, get_rate_uart, NULL); | ||
167 | DEFINE_CLOCK(nfc_clk, 0, CCM_CGCR0, 8, get_rate_nfc, NULL); | ||
168 | DEFINE_CLOCK(usbotg_clk, 0, CCM_CGCR0, 28, get_rate_otg, NULL); | ||
169 | DEFINE_CLOCK(pwm1_clk, 0, CCM_CGCR1, 31, get_rate_ipg, NULL); | ||
170 | DEFINE_CLOCK(pwm2_clk, 0, CCM_CGCR2, 0, get_rate_ipg, NULL); | ||
171 | DEFINE_CLOCK(pwm3_clk, 0, CCM_CGCR2, 1, get_rate_ipg, NULL); | ||
172 | DEFINE_CLOCK(pwm4_clk, 0, CCM_CGCR2, 2, get_rate_ipg, NULL); | ||
173 | DEFINE_CLOCK(kpp_clk, 0, CCM_CGCR1, 28, get_rate_ipg, NULL); | ||
174 | DEFINE_CLOCK(tsc_clk, 0, CCM_CGCR2, 13, get_rate_ipg, NULL); | ||
175 | DEFINE_CLOCK(i2c_clk, 0, CCM_CGCR0, 6, get_rate_i2c, NULL); | ||
176 | |||
177 | #define _REGISTER_CLOCK(d, n, c) \ | ||
178 | { \ | ||
179 | .dev_id = d, \ | ||
180 | .con_id = n, \ | ||
181 | .clk = &c, \ | ||
182 | }, | ||
183 | |||
184 | static struct clk_lookup lookups[] = { | ||
185 | _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk) | ||
186 | _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk) | ||
187 | _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk) | ||
188 | _REGISTER_CLOCK("imx-uart.3", NULL, uart4_clk) | ||
189 | _REGISTER_CLOCK("imx-uart.4", NULL, uart5_clk) | ||
190 | _REGISTER_CLOCK("mxc-ehci.0", "usb", usbotg_clk) | ||
191 | _REGISTER_CLOCK("mxc-ehci.1", "usb", usbotg_clk) | ||
192 | _REGISTER_CLOCK("mxc-ehci.2", "usb", usbotg_clk) | ||
193 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usbotg_clk) | ||
194 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) | ||
195 | _REGISTER_CLOCK("spi_imx.0", NULL, cspi1_clk) | ||
196 | _REGISTER_CLOCK("spi_imx.1", NULL, cspi2_clk) | ||
197 | _REGISTER_CLOCK("spi_imx.2", NULL, cspi3_clk) | ||
198 | _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm1_clk) | ||
199 | _REGISTER_CLOCK("mxc_pwm.1", NULL, pwm2_clk) | ||
200 | _REGISTER_CLOCK("mxc_pwm.2", NULL, pwm3_clk) | ||
201 | _REGISTER_CLOCK("mxc_pwm.3", NULL, pwm4_clk) | ||
202 | _REGISTER_CLOCK("mxc-keypad", NULL, kpp_clk) | ||
203 | _REGISTER_CLOCK("mx25-adc", NULL, tsc_clk) | ||
204 | _REGISTER_CLOCK("imx-i2c.0", NULL, i2c_clk) | ||
205 | _REGISTER_CLOCK("imx-i2c.1", NULL, i2c_clk) | ||
206 | _REGISTER_CLOCK("imx-i2c.2", NULL, i2c_clk) | ||
207 | }; | ||
208 | |||
209 | int __init mx25_clocks_init(unsigned long fref) | ||
210 | { | ||
211 | int i; | ||
212 | |||
213 | for (i = 0; i < ARRAY_SIZE(lookups); i++) | ||
214 | clkdev_add(&lookups[i]); | ||
215 | |||
216 | mxc_timer_init(&gpt_clk, MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54); | ||
217 | |||
218 | return 0; | ||
219 | } | ||
diff --git a/arch/arm/mach-mx25/devices.c b/arch/arm/mach-mx25/devices.c new file mode 100644 index 000000000000..eb12de1da42d --- /dev/null +++ b/arch/arm/mach-mx25/devices.c | |||
@@ -0,0 +1,402 @@ | |||
1 | #include <linux/platform_device.h> | ||
2 | #include <linux/gpio.h> | ||
3 | #include <mach/mx25.h> | ||
4 | #include <mach/irqs.h> | ||
5 | |||
6 | static struct resource uart0[] = { | ||
7 | { | ||
8 | .start = 0x43f90000, | ||
9 | .end = 0x43f93fff, | ||
10 | .flags = IORESOURCE_MEM, | ||
11 | }, { | ||
12 | .start = 45, | ||
13 | .end = 45, | ||
14 | .flags = IORESOURCE_IRQ, | ||
15 | }, | ||
16 | }; | ||
17 | |||
18 | struct platform_device mxc_uart_device0 = { | ||
19 | .name = "imx-uart", | ||
20 | .id = 0, | ||
21 | .resource = uart0, | ||
22 | .num_resources = ARRAY_SIZE(uart0), | ||
23 | }; | ||
24 | |||
25 | static struct resource uart1[] = { | ||
26 | { | ||
27 | .start = 0x43f94000, | ||
28 | .end = 0x43f97fff, | ||
29 | .flags = IORESOURCE_MEM, | ||
30 | }, { | ||
31 | .start = 32, | ||
32 | .end = 32, | ||
33 | .flags = IORESOURCE_IRQ, | ||
34 | }, | ||
35 | }; | ||
36 | |||
37 | struct platform_device mxc_uart_device1 = { | ||
38 | .name = "imx-uart", | ||
39 | .id = 1, | ||
40 | .resource = uart1, | ||
41 | .num_resources = ARRAY_SIZE(uart1), | ||
42 | }; | ||
43 | |||
44 | static struct resource uart2[] = { | ||
45 | { | ||
46 | .start = 0x5000c000, | ||
47 | .end = 0x5000ffff, | ||
48 | .flags = IORESOURCE_MEM, | ||
49 | }, { | ||
50 | .start = 18, | ||
51 | .end = 18, | ||
52 | .flags = IORESOURCE_IRQ, | ||
53 | }, | ||
54 | }; | ||
55 | |||
56 | struct platform_device mxc_uart_device2 = { | ||
57 | .name = "imx-uart", | ||
58 | .id = 2, | ||
59 | .resource = uart2, | ||
60 | .num_resources = ARRAY_SIZE(uart2), | ||
61 | }; | ||
62 | |||
63 | static struct resource uart3[] = { | ||
64 | { | ||
65 | .start = 0x50008000, | ||
66 | .end = 0x5000bfff, | ||
67 | .flags = IORESOURCE_MEM, | ||
68 | }, { | ||
69 | .start = 5, | ||
70 | .end = 5, | ||
71 | .flags = IORESOURCE_IRQ, | ||
72 | }, | ||
73 | }; | ||
74 | |||
75 | struct platform_device mxc_uart_device3 = { | ||
76 | .name = "imx-uart", | ||
77 | .id = 3, | ||
78 | .resource = uart3, | ||
79 | .num_resources = ARRAY_SIZE(uart3), | ||
80 | }; | ||
81 | |||
82 | static struct resource uart4[] = { | ||
83 | { | ||
84 | .start = 0x5002c000, | ||
85 | .end = 0x5002ffff, | ||
86 | .flags = IORESOURCE_MEM, | ||
87 | }, { | ||
88 | .start = 40, | ||
89 | .end = 40, | ||
90 | .flags = IORESOURCE_IRQ, | ||
91 | }, | ||
92 | }; | ||
93 | |||
94 | struct platform_device mxc_uart_device4 = { | ||
95 | .name = "imx-uart", | ||
96 | .id = 4, | ||
97 | .resource = uart4, | ||
98 | .num_resources = ARRAY_SIZE(uart4), | ||
99 | }; | ||
100 | |||
101 | #define MX25_OTG_BASE_ADDR 0x53FF4000 | ||
102 | |||
103 | static u64 otg_dmamask = DMA_BIT_MASK(32); | ||
104 | |||
105 | static struct resource mxc_otg_resources[] = { | ||
106 | { | ||
107 | .start = MX25_OTG_BASE_ADDR, | ||
108 | .end = MX25_OTG_BASE_ADDR + 0x1ff, | ||
109 | .flags = IORESOURCE_MEM, | ||
110 | }, { | ||
111 | .start = 37, | ||
112 | .end = 37, | ||
113 | .flags = IORESOURCE_IRQ, | ||
114 | }, | ||
115 | }; | ||
116 | |||
117 | struct platform_device mxc_otg = { | ||
118 | .name = "mxc-ehci", | ||
119 | .id = 0, | ||
120 | .dev = { | ||
121 | .coherent_dma_mask = 0xffffffff, | ||
122 | .dma_mask = &otg_dmamask, | ||
123 | }, | ||
124 | .resource = mxc_otg_resources, | ||
125 | .num_resources = ARRAY_SIZE(mxc_otg_resources), | ||
126 | }; | ||
127 | |||
128 | /* OTG gadget device */ | ||
129 | struct platform_device otg_udc_device = { | ||
130 | .name = "fsl-usb2-udc", | ||
131 | .id = -1, | ||
132 | .dev = { | ||
133 | .dma_mask = &otg_dmamask, | ||
134 | .coherent_dma_mask = 0xffffffff, | ||
135 | }, | ||
136 | .resource = mxc_otg_resources, | ||
137 | .num_resources = ARRAY_SIZE(mxc_otg_resources), | ||
138 | }; | ||
139 | |||
140 | static u64 usbh2_dmamask = DMA_BIT_MASK(32); | ||
141 | |||
142 | static struct resource mxc_usbh2_resources[] = { | ||
143 | { | ||
144 | .start = MX25_OTG_BASE_ADDR + 0x400, | ||
145 | .end = MX25_OTG_BASE_ADDR + 0x5ff, | ||
146 | .flags = IORESOURCE_MEM, | ||
147 | }, { | ||
148 | .start = 35, | ||
149 | .end = 35, | ||
150 | .flags = IORESOURCE_IRQ, | ||
151 | }, | ||
152 | }; | ||
153 | |||
154 | struct platform_device mxc_usbh2 = { | ||
155 | .name = "mxc-ehci", | ||
156 | .id = 1, | ||
157 | .dev = { | ||
158 | .coherent_dma_mask = 0xffffffff, | ||
159 | .dma_mask = &usbh2_dmamask, | ||
160 | }, | ||
161 | .resource = mxc_usbh2_resources, | ||
162 | .num_resources = ARRAY_SIZE(mxc_usbh2_resources), | ||
163 | }; | ||
164 | |||
165 | static struct resource mxc_spi_resources0[] = { | ||
166 | { | ||
167 | .start = 0x43fa4000, | ||
168 | .end = 0x43fa7fff, | ||
169 | .flags = IORESOURCE_MEM, | ||
170 | }, { | ||
171 | .start = 14, | ||
172 | .end = 14, | ||
173 | .flags = IORESOURCE_IRQ, | ||
174 | }, | ||
175 | }; | ||
176 | |||
177 | struct platform_device mxc_spi_device0 = { | ||
178 | .name = "spi_imx", | ||
179 | .id = 0, | ||
180 | .num_resources = ARRAY_SIZE(mxc_spi_resources0), | ||
181 | .resource = mxc_spi_resources0, | ||
182 | }; | ||
183 | |||
184 | static struct resource mxc_spi_resources1[] = { | ||
185 | { | ||
186 | .start = 0x50010000, | ||
187 | .end = 0x50013fff, | ||
188 | .flags = IORESOURCE_MEM, | ||
189 | }, { | ||
190 | .start = 13, | ||
191 | .end = 13, | ||
192 | .flags = IORESOURCE_IRQ, | ||
193 | }, | ||
194 | }; | ||
195 | |||
196 | struct platform_device mxc_spi_device1 = { | ||
197 | .name = "spi_imx", | ||
198 | .id = 1, | ||
199 | .num_resources = ARRAY_SIZE(mxc_spi_resources1), | ||
200 | .resource = mxc_spi_resources1, | ||
201 | }; | ||
202 | |||
203 | static struct resource mxc_spi_resources2[] = { | ||
204 | { | ||
205 | .start = 0x50004000, | ||
206 | .end = 0x50007fff, | ||
207 | .flags = IORESOURCE_MEM, | ||
208 | }, { | ||
209 | .start = 0, | ||
210 | .end = 0, | ||
211 | .flags = IORESOURCE_IRQ, | ||
212 | }, | ||
213 | }; | ||
214 | |||
215 | struct platform_device mxc_spi_device2 = { | ||
216 | .name = "spi_imx", | ||
217 | .id = 2, | ||
218 | .num_resources = ARRAY_SIZE(mxc_spi_resources2), | ||
219 | .resource = mxc_spi_resources2, | ||
220 | }; | ||
221 | |||
222 | static struct resource mxc_pwm_resources0[] = { | ||
223 | { | ||
224 | .start = 0x53fe0000, | ||
225 | .end = 0x53fe3fff, | ||
226 | .flags = IORESOURCE_MEM, | ||
227 | }, { | ||
228 | .start = 26, | ||
229 | .end = 26, | ||
230 | .flags = IORESOURCE_IRQ, | ||
231 | } | ||
232 | }; | ||
233 | |||
234 | struct platform_device mxc_pwm_device0 = { | ||
235 | .name = "mxc_pwm", | ||
236 | .id = 0, | ||
237 | .num_resources = ARRAY_SIZE(mxc_pwm_resources0), | ||
238 | .resource = mxc_pwm_resources0, | ||
239 | }; | ||
240 | |||
241 | static struct resource mxc_pwm_resources1[] = { | ||
242 | { | ||
243 | .start = 0x53fa0000, | ||
244 | .end = 0x53fa3fff, | ||
245 | .flags = IORESOURCE_MEM, | ||
246 | }, { | ||
247 | .start = 36, | ||
248 | .end = 36, | ||
249 | .flags = IORESOURCE_IRQ, | ||
250 | } | ||
251 | }; | ||
252 | |||
253 | struct platform_device mxc_pwm_device1 = { | ||
254 | .name = "mxc_pwm", | ||
255 | .id = 1, | ||
256 | .num_resources = ARRAY_SIZE(mxc_pwm_resources1), | ||
257 | .resource = mxc_pwm_resources1, | ||
258 | }; | ||
259 | |||
260 | static struct resource mxc_pwm_resources2[] = { | ||
261 | { | ||
262 | .start = 0x53fa8000, | ||
263 | .end = 0x53fabfff, | ||
264 | .flags = IORESOURCE_MEM, | ||
265 | }, { | ||
266 | .start = 41, | ||
267 | .end = 41, | ||
268 | .flags = IORESOURCE_IRQ, | ||
269 | } | ||
270 | }; | ||
271 | |||
272 | struct platform_device mxc_pwm_device2 = { | ||
273 | .name = "mxc_pwm", | ||
274 | .id = 2, | ||
275 | .num_resources = ARRAY_SIZE(mxc_pwm_resources2), | ||
276 | .resource = mxc_pwm_resources2, | ||
277 | }; | ||
278 | |||
279 | static struct resource mxc_keypad_resources[] = { | ||
280 | { | ||
281 | .start = 0x43fa8000, | ||
282 | .end = 0x43fabfff, | ||
283 | .flags = IORESOURCE_MEM, | ||
284 | }, { | ||
285 | .start = 24, | ||
286 | .end = 24, | ||
287 | .flags = IORESOURCE_IRQ, | ||
288 | } | ||
289 | }; | ||
290 | |||
291 | struct platform_device mxc_keypad_device = { | ||
292 | .name = "mxc-keypad", | ||
293 | .id = -1, | ||
294 | .num_resources = ARRAY_SIZE(mxc_keypad_resources), | ||
295 | .resource = mxc_keypad_resources, | ||
296 | }; | ||
297 | |||
298 | static struct resource mxc_pwm_resources3[] = { | ||
299 | { | ||
300 | .start = 0x53fc8000, | ||
301 | .end = 0x53fcbfff, | ||
302 | .flags = IORESOURCE_MEM, | ||
303 | }, { | ||
304 | .start = 42, | ||
305 | .end = 42, | ||
306 | .flags = IORESOURCE_IRQ, | ||
307 | } | ||
308 | }; | ||
309 | |||
310 | struct platform_device mxc_pwm_device3 = { | ||
311 | .name = "mxc_pwm", | ||
312 | .id = 3, | ||
313 | .num_resources = ARRAY_SIZE(mxc_pwm_resources3), | ||
314 | .resource = mxc_pwm_resources3, | ||
315 | }; | ||
316 | |||
317 | static struct resource mxc_i2c_1_resources[] = { | ||
318 | { | ||
319 | .start = 0x43f80000, | ||
320 | .end = 0x43f83fff, | ||
321 | .flags = IORESOURCE_MEM, | ||
322 | }, { | ||
323 | .start = 3, | ||
324 | .end = 3, | ||
325 | .flags = IORESOURCE_IRQ, | ||
326 | } | ||
327 | }; | ||
328 | |||
329 | struct platform_device mxc_i2c_device0 = { | ||
330 | .name = "imx-i2c", | ||
331 | .id = 0, | ||
332 | .num_resources = ARRAY_SIZE(mxc_i2c_1_resources), | ||
333 | .resource = mxc_i2c_1_resources, | ||
334 | }; | ||
335 | |||
336 | static struct resource mxc_i2c_2_resources[] = { | ||
337 | { | ||
338 | .start = 0x43f98000, | ||
339 | .end = 0x43f9bfff, | ||
340 | .flags = IORESOURCE_MEM, | ||
341 | }, { | ||
342 | .start = 4, | ||
343 | .end = 4, | ||
344 | .flags = IORESOURCE_IRQ, | ||
345 | } | ||
346 | }; | ||
347 | |||
348 | struct platform_device mxc_i2c_device1 = { | ||
349 | .name = "imx-i2c", | ||
350 | .id = 1, | ||
351 | .num_resources = ARRAY_SIZE(mxc_i2c_2_resources), | ||
352 | .resource = mxc_i2c_2_resources, | ||
353 | }; | ||
354 | |||
355 | static struct resource mxc_i2c_3_resources[] = { | ||
356 | { | ||
357 | .start = 0x43f84000, | ||
358 | .end = 0x43f87fff, | ||
359 | .flags = IORESOURCE_MEM, | ||
360 | }, { | ||
361 | .start = 10, | ||
362 | .end = 10, | ||
363 | .flags = IORESOURCE_IRQ, | ||
364 | } | ||
365 | }; | ||
366 | |||
367 | struct platform_device mxc_i2c_device2 = { | ||
368 | .name = "imx-i2c", | ||
369 | .id = 2, | ||
370 | .num_resources = ARRAY_SIZE(mxc_i2c_3_resources), | ||
371 | .resource = mxc_i2c_3_resources, | ||
372 | }; | ||
373 | |||
374 | static struct mxc_gpio_port imx_gpio_ports[] = { | ||
375 | { | ||
376 | .chip.label = "gpio-0", | ||
377 | .base = (void __iomem *)MX25_GPIO1_BASE_ADDR_VIRT, | ||
378 | .irq = 52, | ||
379 | .virtual_irq_start = MXC_GPIO_IRQ_START, | ||
380 | }, { | ||
381 | .chip.label = "gpio-1", | ||
382 | .base = (void __iomem *)MX25_GPIO2_BASE_ADDR_VIRT, | ||
383 | .irq = 51, | ||
384 | .virtual_irq_start = MXC_GPIO_IRQ_START + 32, | ||
385 | }, { | ||
386 | .chip.label = "gpio-2", | ||
387 | .base = (void __iomem *)MX25_GPIO3_BASE_ADDR_VIRT, | ||
388 | .irq = 16, | ||
389 | .virtual_irq_start = MXC_GPIO_IRQ_START + 64, | ||
390 | }, { | ||
391 | .chip.label = "gpio-3", | ||
392 | .base = (void __iomem *)MX25_GPIO4_BASE_ADDR_VIRT, | ||
393 | .irq = 23, | ||
394 | .virtual_irq_start = MXC_GPIO_IRQ_START + 96, | ||
395 | } | ||
396 | }; | ||
397 | |||
398 | int __init mxc_register_gpios(void) | ||
399 | { | ||
400 | return mxc_gpio_init(imx_gpio_ports, ARRAY_SIZE(imx_gpio_ports)); | ||
401 | } | ||
402 | |||
diff --git a/arch/arm/mach-mx25/devices.h b/arch/arm/mach-mx25/devices.h new file mode 100644 index 000000000000..fe6bf88ad1dd --- /dev/null +++ b/arch/arm/mach-mx25/devices.h | |||
@@ -0,0 +1,19 @@ | |||
1 | extern struct platform_device mxc_uart_device0; | ||
2 | extern struct platform_device mxc_uart_device1; | ||
3 | extern struct platform_device mxc_uart_device2; | ||
4 | extern struct platform_device mxc_uart_device3; | ||
5 | extern struct platform_device mxc_uart_device4; | ||
6 | extern struct platform_device mxc_otg; | ||
7 | extern struct platform_device otg_udc_device; | ||
8 | extern struct platform_device mxc_usbh2; | ||
9 | extern struct platform_device mxc_spi_device0; | ||
10 | extern struct platform_device mxc_spi_device1; | ||
11 | extern struct platform_device mxc_spi_device2; | ||
12 | extern struct platform_device mxc_pwm_device0; | ||
13 | extern struct platform_device mxc_pwm_device1; | ||
14 | extern struct platform_device mxc_pwm_device2; | ||
15 | extern struct platform_device mxc_pwm_device3; | ||
16 | extern struct platform_device mxc_keypad_device; | ||
17 | extern struct platform_device mxc_i2c_device0; | ||
18 | extern struct platform_device mxc_i2c_device1; | ||
19 | extern struct platform_device mxc_i2c_device2; | ||
diff --git a/arch/arm/mach-mx25/mm.c b/arch/arm/mach-mx25/mm.c new file mode 100644 index 000000000000..a7e587ff3e9e --- /dev/null +++ b/arch/arm/mach-mx25/mm.c | |||
@@ -0,0 +1,76 @@ | |||
1 | /* | ||
2 | * Copyright (C) 1999,2000 Arm Limited | ||
3 | * Copyright (C) 2000 Deep Blue Solutions Ltd | ||
4 | * Copyright (C) 2002 Shane Nay (shane@minirl.com) | ||
5 | * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
6 | * - add MX31 specific definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | */ | ||
22 | |||
23 | #include <linux/mm.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/err.h> | ||
26 | |||
27 | #include <asm/pgtable.h> | ||
28 | #include <asm/mach/map.h> | ||
29 | |||
30 | #include <mach/common.h> | ||
31 | #include <mach/hardware.h> | ||
32 | #include <mach/mx25.h> | ||
33 | #include <mach/iomux-v3.h> | ||
34 | |||
35 | /* | ||
36 | * This table defines static virtual address mappings for I/O regions. | ||
37 | * These are the mappings common across all MX3 boards. | ||
38 | */ | ||
39 | static struct map_desc mxc_io_desc[] __initdata = { | ||
40 | { | ||
41 | .virtual = MX25_AVIC_BASE_ADDR_VIRT, | ||
42 | .pfn = __phys_to_pfn(MX25_AVIC_BASE_ADDR), | ||
43 | .length = MX25_AVIC_SIZE, | ||
44 | .type = MT_DEVICE_NONSHARED | ||
45 | }, { | ||
46 | .virtual = MX25_AIPS1_BASE_ADDR_VIRT, | ||
47 | .pfn = __phys_to_pfn(MX25_AIPS1_BASE_ADDR), | ||
48 | .length = MX25_AIPS1_SIZE, | ||
49 | .type = MT_DEVICE_NONSHARED | ||
50 | }, { | ||
51 | .virtual = MX25_AIPS2_BASE_ADDR_VIRT, | ||
52 | .pfn = __phys_to_pfn(MX25_AIPS2_BASE_ADDR), | ||
53 | .length = MX25_AIPS2_SIZE, | ||
54 | .type = MT_DEVICE_NONSHARED | ||
55 | }, | ||
56 | }; | ||
57 | |||
58 | /* | ||
59 | * This function initializes the memory map. It is called during the | ||
60 | * system startup to create static physical to virtual memory mappings | ||
61 | * for the IO modules. | ||
62 | */ | ||
63 | void __init mx25_map_io(void) | ||
64 | { | ||
65 | mxc_set_cpu_type(MXC_CPU_MX25); | ||
66 | mxc_iomux_v3_init(MX25_IO_ADDRESS(MX25_IOMUXC_BASE_ADDR)); | ||
67 | mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); | ||
68 | |||
69 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); | ||
70 | } | ||
71 | |||
72 | void __init mx25_init_irq(void) | ||
73 | { | ||
74 | mxc_init_irq((void __iomem *)MX25_AVIC_BASE_ADDR_VIRT); | ||
75 | } | ||
76 | |||
diff --git a/arch/arm/mach-mx25/mx25pdk.c b/arch/arm/mach-mx25/mx25pdk.c new file mode 100644 index 000000000000..92aa4fd19d99 --- /dev/null +++ b/arch/arm/mach-mx25/mx25pdk.c | |||
@@ -0,0 +1,58 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/init.h> | ||
3 | #include <linux/clk.h> | ||
4 | #include <linux/irq.h> | ||
5 | #include <linux/gpio.h> | ||
6 | #include <linux/smsc911x.h> | ||
7 | #include <linux/platform_device.h> | ||
8 | |||
9 | #include <mach/hardware.h> | ||
10 | #include <asm/mach-types.h> | ||
11 | #include <asm/mach/arch.h> | ||
12 | #include <asm/mach/time.h> | ||
13 | #include <asm/memory.h> | ||
14 | #include <asm/mach/map.h> | ||
15 | #include <mach/common.h> | ||
16 | #include <mach/imx-uart.h> | ||
17 | #include <mach/mx25.h> | ||
18 | #include <mach/mxc_nand.h> | ||
19 | #include "devices.h" | ||
20 | #include <mach/iomux-v3.h> | ||
21 | |||
22 | static struct imxuart_platform_data uart_pdata = { | ||
23 | .flags = IMXUART_HAVE_RTSCTS, | ||
24 | }; | ||
25 | |||
26 | static struct mxc_nand_platform_data nand_board_info = { | ||
27 | .width = 1, | ||
28 | .hw_ecc = 1, | ||
29 | }; | ||
30 | |||
31 | static void __init mx25pdk_init(void) | ||
32 | { | ||
33 | mxc_register_device(&mxc_uart_device0, &uart_pdata); | ||
34 | mxc_register_device(&mxc_usbh2, NULL); | ||
35 | mxc_register_device(&mxc_nand_device, &nand_board_info); | ||
36 | } | ||
37 | |||
38 | |||
39 | static void __init mx25pdk_timer_init(void) | ||
40 | { | ||
41 | mx25_clocks_init(26000000); | ||
42 | } | ||
43 | |||
44 | static struct sys_timer mx25pdk_timer = { | ||
45 | .init = mx25pdk_timer_init, | ||
46 | }; | ||
47 | |||
48 | MACHINE_START(MX25_3DS, "Freescale MX25PDK (3DS)") | ||
49 | /* Maintainer: Freescale Semiconductor, Inc. */ | ||
50 | .phys_io = MX25_AIPS1_BASE_ADDR, | ||
51 | .io_pg_offst = ((MX25_AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, | ||
52 | .boot_params = PHYS_OFFSET + 0x100, | ||
53 | .map_io = mx25_map_io, | ||
54 | .init_irq = mx25_init_irq, | ||
55 | .init_machine = mx25pdk_init, | ||
56 | .timer = &mx25pdk_timer, | ||
57 | MACHINE_END | ||
58 | |||
diff --git a/arch/arm/mach-mx3/armadillo5x0.c b/arch/arm/mach-mx3/armadillo5x0.c index ee331fd6b1bd..776c0ee1b3cd 100644 --- a/arch/arm/mach-mx3/armadillo5x0.c +++ b/arch/arm/mach-mx3/armadillo5x0.c | |||
@@ -352,7 +352,7 @@ MACHINE_START(ARMADILLO5X0, "Armadillo-500") | |||
352 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 352 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
353 | .boot_params = PHYS_OFFSET + 0x00000100, | 353 | .boot_params = PHYS_OFFSET + 0x00000100, |
354 | .map_io = mx31_map_io, | 354 | .map_io = mx31_map_io, |
355 | .init_irq = mxc_init_irq, | 355 | .init_irq = mx31_init_irq, |
356 | .timer = &armadillo5x0_timer, | 356 | .timer = &armadillo5x0_timer, |
357 | .init_machine = armadillo5x0_init, | 357 | .init_machine = armadillo5x0_init, |
358 | MACHINE_END | 358 | MACHINE_END |
diff --git a/arch/arm/mach-mx3/clock-imx35.c b/arch/arm/mach-mx3/clock-imx35.c index 577ee83d1f60..fe5c4217322e 100644 --- a/arch/arm/mach-mx3/clock-imx35.c +++ b/arch/arm/mach-mx3/clock-imx35.c | |||
@@ -273,6 +273,19 @@ static unsigned long get_rate_csi(struct clk *clk) | |||
273 | return rate / get_3_3_div((pdr2 >> 16) & 0x3f); | 273 | return rate / get_3_3_div((pdr2 >> 16) & 0x3f); |
274 | } | 274 | } |
275 | 275 | ||
276 | static unsigned long get_rate_otg(struct clk *clk) | ||
277 | { | ||
278 | unsigned long pdr4 = __raw_readl(CCM_BASE + CCM_PDR4); | ||
279 | unsigned long rate; | ||
280 | |||
281 | if (pdr4 & (1 << 9)) | ||
282 | rate = get_rate_arm(); | ||
283 | else | ||
284 | rate = get_rate_ppll(); | ||
285 | |||
286 | return rate / get_3_3_div((pdr4 >> 22) & 0x3f); | ||
287 | } | ||
288 | |||
276 | static unsigned long get_rate_ipg_per(struct clk *clk) | 289 | static unsigned long get_rate_ipg_per(struct clk *clk) |
277 | { | 290 | { |
278 | unsigned long pdr0 = __raw_readl(CCM_BASE + CCM_PDR0); | 291 | unsigned long pdr0 = __raw_readl(CCM_BASE + CCM_PDR0); |
@@ -365,7 +378,7 @@ DEFINE_CLOCK(ssi2_clk, 1, CCM_CGR2, 14, get_rate_ssi, NULL); | |||
365 | DEFINE_CLOCK(uart1_clk, 0, CCM_CGR2, 16, get_rate_uart, NULL); | 378 | DEFINE_CLOCK(uart1_clk, 0, CCM_CGR2, 16, get_rate_uart, NULL); |
366 | DEFINE_CLOCK(uart2_clk, 1, CCM_CGR2, 18, get_rate_uart, NULL); | 379 | DEFINE_CLOCK(uart2_clk, 1, CCM_CGR2, 18, get_rate_uart, NULL); |
367 | DEFINE_CLOCK(uart3_clk, 2, CCM_CGR2, 20, get_rate_uart, NULL); | 380 | DEFINE_CLOCK(uart3_clk, 2, CCM_CGR2, 20, get_rate_uart, NULL); |
368 | DEFINE_CLOCK(usbotg_clk, 0, CCM_CGR2, 22, NULL, NULL); | 381 | DEFINE_CLOCK(usbotg_clk, 0, CCM_CGR2, 22, get_rate_otg, NULL); |
369 | DEFINE_CLOCK(wdog_clk, 0, CCM_CGR2, 24, NULL, NULL); | 382 | DEFINE_CLOCK(wdog_clk, 0, CCM_CGR2, 24, NULL, NULL); |
370 | DEFINE_CLOCK(max_clk, 0, CCM_CGR2, 26, NULL, NULL); | 383 | DEFINE_CLOCK(max_clk, 0, CCM_CGR2, 26, NULL, NULL); |
371 | DEFINE_CLOCK(admux_clk, 0, CCM_CGR2, 30, NULL, NULL); | 384 | DEFINE_CLOCK(admux_clk, 0, CCM_CGR2, 30, NULL, NULL); |
@@ -426,7 +439,10 @@ static struct clk_lookup lookups[] = { | |||
426 | _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk) | 439 | _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk) |
427 | _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk) | 440 | _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk) |
428 | _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk) | 441 | _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk) |
429 | _REGISTER_CLOCK(NULL, "usbotg", usbotg_clk) | 442 | _REGISTER_CLOCK("mxc-ehci.0", "usb", usbotg_clk) |
443 | _REGISTER_CLOCK("mxc-ehci.1", "usb", usbotg_clk) | ||
444 | _REGISTER_CLOCK("mxc-ehci.2", "usb", usbotg_clk) | ||
445 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usbotg_clk) | ||
430 | _REGISTER_CLOCK("mxc_wdt.0", NULL, wdog_clk) | 446 | _REGISTER_CLOCK("mxc_wdt.0", NULL, wdog_clk) |
431 | _REGISTER_CLOCK(NULL, "max", max_clk) | 447 | _REGISTER_CLOCK(NULL, "max", max_clk) |
432 | _REGISTER_CLOCK(NULL, "admux", admux_clk) | 448 | _REGISTER_CLOCK(NULL, "admux", admux_clk) |
@@ -456,7 +472,7 @@ int __init mx35_clocks_init() | |||
456 | __raw_writel((3 << 26) | ll, CCM_BASE + CCM_CGR2); | 472 | __raw_writel((3 << 26) | ll, CCM_BASE + CCM_CGR2); |
457 | __raw_writel(0, CCM_BASE + CCM_CGR3); | 473 | __raw_writel(0, CCM_BASE + CCM_CGR3); |
458 | 474 | ||
459 | mxc_timer_init(&gpt_clk); | 475 | mxc_timer_init(&gpt_clk, IO_ADDRESS(GPT1_BASE_ADDR), MXC_INT_GPT); |
460 | 476 | ||
461 | return 0; | 477 | return 0; |
462 | } | 478 | } |
diff --git a/arch/arm/mach-mx3/clock.c b/arch/arm/mach-mx3/clock.c index 8b14239724c9..06bd6180bfc3 100644 --- a/arch/arm/mach-mx3/clock.c +++ b/arch/arm/mach-mx3/clock.c | |||
@@ -29,6 +29,7 @@ | |||
29 | 29 | ||
30 | #include <mach/clock.h> | 30 | #include <mach/clock.h> |
31 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
32 | #include <mach/mx31.h> | ||
32 | #include <mach/common.h> | 33 | #include <mach/common.h> |
33 | 34 | ||
34 | #include "crm_regs.h" | 35 | #include "crm_regs.h" |
@@ -402,6 +403,11 @@ static unsigned long clk_ckih_get_rate(struct clk *clk) | |||
402 | return ckih_rate; | 403 | return ckih_rate; |
403 | } | 404 | } |
404 | 405 | ||
406 | static unsigned long clk_ckil_get_rate(struct clk *clk) | ||
407 | { | ||
408 | return CKIL_CLK_FREQ; | ||
409 | } | ||
410 | |||
405 | static struct clk ckih_clk = { | 411 | static struct clk ckih_clk = { |
406 | .get_rate = clk_ckih_get_rate, | 412 | .get_rate = clk_ckih_get_rate, |
407 | }; | 413 | }; |
@@ -508,6 +514,7 @@ DEFINE_CLOCK(usb_clk1, 0, NULL, 0, usb_get_rate, NULL, &usb_pll_clk) | |||
508 | DEFINE_CLOCK(nfc_clk, 0, NULL, 0, nfc_get_rate, NULL, &ahb_clk); | 514 | DEFINE_CLOCK(nfc_clk, 0, NULL, 0, nfc_get_rate, NULL, &ahb_clk); |
509 | DEFINE_CLOCK(scc_clk, 0, NULL, 0, NULL, NULL, &ipg_clk); | 515 | DEFINE_CLOCK(scc_clk, 0, NULL, 0, NULL, NULL, &ipg_clk); |
510 | DEFINE_CLOCK(ipg_clk, 0, NULL, 0, ipg_get_rate, NULL, &ahb_clk); | 516 | DEFINE_CLOCK(ipg_clk, 0, NULL, 0, ipg_get_rate, NULL, &ahb_clk); |
517 | DEFINE_CLOCK(ckil_clk, 0, NULL, 0, clk_ckil_get_rate, NULL, NULL); | ||
511 | 518 | ||
512 | #define _REGISTER_CLOCK(d, n, c) \ | 519 | #define _REGISTER_CLOCK(d, n, c) \ |
513 | { \ | 520 | { \ |
@@ -518,9 +525,9 @@ DEFINE_CLOCK(ipg_clk, 0, NULL, 0, ipg_get_rate, NULL, &ahb_clk); | |||
518 | 525 | ||
519 | static struct clk_lookup lookups[] = { | 526 | static struct clk_lookup lookups[] = { |
520 | _REGISTER_CLOCK(NULL, "emi", emi_clk) | 527 | _REGISTER_CLOCK(NULL, "emi", emi_clk) |
521 | _REGISTER_CLOCK(NULL, "cspi", cspi1_clk) | 528 | _REGISTER_CLOCK("spi_imx.0", NULL, cspi1_clk) |
522 | _REGISTER_CLOCK(NULL, "cspi", cspi2_clk) | 529 | _REGISTER_CLOCK("spi_imx.1", NULL, cspi2_clk) |
523 | _REGISTER_CLOCK(NULL, "cspi", cspi3_clk) | 530 | _REGISTER_CLOCK("spi_imx.2", NULL, cspi3_clk) |
524 | _REGISTER_CLOCK(NULL, "gpt", gpt_clk) | 531 | _REGISTER_CLOCK(NULL, "gpt", gpt_clk) |
525 | _REGISTER_CLOCK(NULL, "pwm", pwm_clk) | 532 | _REGISTER_CLOCK(NULL, "pwm", pwm_clk) |
526 | _REGISTER_CLOCK(NULL, "wdog", wdog_clk) | 533 | _REGISTER_CLOCK(NULL, "wdog", wdog_clk) |
@@ -531,6 +538,12 @@ static struct clk_lookup lookups[] = { | |||
531 | _REGISTER_CLOCK("ipu-core", NULL, ipu_clk) | 538 | _REGISTER_CLOCK("ipu-core", NULL, ipu_clk) |
532 | _REGISTER_CLOCK("mx3_sdc_fb", NULL, ipu_clk) | 539 | _REGISTER_CLOCK("mx3_sdc_fb", NULL, ipu_clk) |
533 | _REGISTER_CLOCK(NULL, "kpp", kpp_clk) | 540 | _REGISTER_CLOCK(NULL, "kpp", kpp_clk) |
541 | _REGISTER_CLOCK("mxc-ehci.0", "usb", usb_clk1) | ||
542 | _REGISTER_CLOCK("mxc-ehci.0", "usb_ahb", usb_clk2) | ||
543 | _REGISTER_CLOCK("mxc-ehci.1", "usb", usb_clk1) | ||
544 | _REGISTER_CLOCK("mxc-ehci.1", "usb_ahb", usb_clk2) | ||
545 | _REGISTER_CLOCK("mxc-ehci.2", "usb", usb_clk1) | ||
546 | _REGISTER_CLOCK("mxc-ehci.2", "usb_ahb", usb_clk2) | ||
534 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usb_clk1) | 547 | _REGISTER_CLOCK("fsl-usb2-udc", "usb", usb_clk1) |
535 | _REGISTER_CLOCK("fsl-usb2-udc", "usb_ahb", usb_clk2) | 548 | _REGISTER_CLOCK("fsl-usb2-udc", "usb_ahb", usb_clk2) |
536 | _REGISTER_CLOCK("mx3-camera.0", NULL, csi_clk) | 549 | _REGISTER_CLOCK("mx3-camera.0", NULL, csi_clk) |
@@ -559,6 +572,7 @@ static struct clk_lookup lookups[] = { | |||
559 | _REGISTER_CLOCK(NULL, "iim", iim_clk) | 572 | _REGISTER_CLOCK(NULL, "iim", iim_clk) |
560 | _REGISTER_CLOCK(NULL, "mpeg4", mpeg4_clk) | 573 | _REGISTER_CLOCK(NULL, "mpeg4", mpeg4_clk) |
561 | _REGISTER_CLOCK(NULL, "mbx", mbx_clk) | 574 | _REGISTER_CLOCK(NULL, "mbx", mbx_clk) |
575 | _REGISTER_CLOCK("mxc_rtc", NULL, ckil_clk) | ||
562 | }; | 576 | }; |
563 | 577 | ||
564 | int __init mx31_clocks_init(unsigned long fref) | 578 | int __init mx31_clocks_init(unsigned long fref) |
@@ -609,7 +623,7 @@ int __init mx31_clocks_init(unsigned long fref) | |||
609 | __raw_writel(reg, MXC_CCM_PMCR1); | 623 | __raw_writel(reg, MXC_CCM_PMCR1); |
610 | } | 624 | } |
611 | 625 | ||
612 | mxc_timer_init(&ipg_clk); | 626 | mxc_timer_init(&ipg_clk, IO_ADDRESS(GPT1_BASE_ADDR), MXC_INT_GPT); |
613 | 627 | ||
614 | return 0; | 628 | return 0; |
615 | } | 629 | } |
diff --git a/arch/arm/mach-mx3/devices.c b/arch/arm/mach-mx3/devices.c index 9e87e08fb121..8a577f367250 100644 --- a/arch/arm/mach-mx3/devices.c +++ b/arch/arm/mach-mx3/devices.c | |||
@@ -129,19 +129,17 @@ struct platform_device mxc_uart_device4 = { | |||
129 | 129 | ||
130 | /* GPIO port description */ | 130 | /* GPIO port description */ |
131 | static struct mxc_gpio_port imx_gpio_ports[] = { | 131 | static struct mxc_gpio_port imx_gpio_ports[] = { |
132 | [0] = { | 132 | { |
133 | .chip.label = "gpio-0", | 133 | .chip.label = "gpio-0", |
134 | .base = IO_ADDRESS(GPIO1_BASE_ADDR), | 134 | .base = IO_ADDRESS(GPIO1_BASE_ADDR), |
135 | .irq = MXC_INT_GPIO1, | 135 | .irq = MXC_INT_GPIO1, |
136 | .virtual_irq_start = MXC_GPIO_IRQ_START, | 136 | .virtual_irq_start = MXC_GPIO_IRQ_START, |
137 | }, | 137 | }, { |
138 | [1] = { | ||
139 | .chip.label = "gpio-1", | 138 | .chip.label = "gpio-1", |
140 | .base = IO_ADDRESS(GPIO2_BASE_ADDR), | 139 | .base = IO_ADDRESS(GPIO2_BASE_ADDR), |
141 | .irq = MXC_INT_GPIO2, | 140 | .irq = MXC_INT_GPIO2, |
142 | .virtual_irq_start = MXC_GPIO_IRQ_START + 32, | 141 | .virtual_irq_start = MXC_GPIO_IRQ_START + 32, |
143 | }, | 142 | }, { |
144 | [2] = { | ||
145 | .chip.label = "gpio-2", | 143 | .chip.label = "gpio-2", |
146 | .base = IO_ADDRESS(GPIO3_BASE_ADDR), | 144 | .base = IO_ADDRESS(GPIO3_BASE_ADDR), |
147 | .irq = MXC_INT_GPIO3, | 145 | .irq = MXC_INT_GPIO3, |
@@ -173,11 +171,11 @@ static struct resource mxc_nand_resources[] = { | |||
173 | { | 171 | { |
174 | .start = 0, /* runtime dependent */ | 172 | .start = 0, /* runtime dependent */ |
175 | .end = 0, | 173 | .end = 0, |
176 | .flags = IORESOURCE_MEM | 174 | .flags = IORESOURCE_MEM, |
177 | }, { | 175 | }, { |
178 | .start = MXC_INT_NANDFC, | 176 | .start = MXC_INT_NANDFC, |
179 | .end = MXC_INT_NANDFC, | 177 | .end = MXC_INT_NANDFC, |
180 | .flags = IORESOURCE_IRQ | 178 | .flags = IORESOURCE_IRQ, |
181 | }, | 179 | }, |
182 | }; | 180 | }; |
183 | 181 | ||
@@ -193,8 +191,7 @@ static struct resource mxc_i2c0_resources[] = { | |||
193 | .start = I2C_BASE_ADDR, | 191 | .start = I2C_BASE_ADDR, |
194 | .end = I2C_BASE_ADDR + SZ_4K - 1, | 192 | .end = I2C_BASE_ADDR + SZ_4K - 1, |
195 | .flags = IORESOURCE_MEM, | 193 | .flags = IORESOURCE_MEM, |
196 | }, | 194 | }, { |
197 | { | ||
198 | .start = MXC_INT_I2C, | 195 | .start = MXC_INT_I2C, |
199 | .end = MXC_INT_I2C, | 196 | .end = MXC_INT_I2C, |
200 | .flags = IORESOURCE_IRQ, | 197 | .flags = IORESOURCE_IRQ, |
@@ -213,8 +210,7 @@ static struct resource mxc_i2c1_resources[] = { | |||
213 | .start = I2C2_BASE_ADDR, | 210 | .start = I2C2_BASE_ADDR, |
214 | .end = I2C2_BASE_ADDR + SZ_4K - 1, | 211 | .end = I2C2_BASE_ADDR + SZ_4K - 1, |
215 | .flags = IORESOURCE_MEM, | 212 | .flags = IORESOURCE_MEM, |
216 | }, | 213 | }, { |
217 | { | ||
218 | .start = MXC_INT_I2C2, | 214 | .start = MXC_INT_I2C2, |
219 | .end = MXC_INT_I2C2, | 215 | .end = MXC_INT_I2C2, |
220 | .flags = IORESOURCE_IRQ, | 216 | .flags = IORESOURCE_IRQ, |
@@ -233,8 +229,7 @@ static struct resource mxc_i2c2_resources[] = { | |||
233 | .start = I2C3_BASE_ADDR, | 229 | .start = I2C3_BASE_ADDR, |
234 | .end = I2C3_BASE_ADDR + SZ_4K - 1, | 230 | .end = I2C3_BASE_ADDR + SZ_4K - 1, |
235 | .flags = IORESOURCE_MEM, | 231 | .flags = IORESOURCE_MEM, |
236 | }, | 232 | }, { |
237 | { | ||
238 | .start = MXC_INT_I2C3, | 233 | .start = MXC_INT_I2C3, |
239 | .end = MXC_INT_I2C3, | 234 | .end = MXC_INT_I2C3, |
240 | .flags = IORESOURCE_IRQ, | 235 | .flags = IORESOURCE_IRQ, |
@@ -371,8 +366,8 @@ struct platform_device mx3_camera = { | |||
371 | 366 | ||
372 | static struct resource otg_resources[] = { | 367 | static struct resource otg_resources[] = { |
373 | { | 368 | { |
374 | .start = OTG_BASE_ADDR, | 369 | .start = MX31_OTG_BASE_ADDR, |
375 | .end = OTG_BASE_ADDR + 0x1ff, | 370 | .end = MX31_OTG_BASE_ADDR + 0x1ff, |
376 | .flags = IORESOURCE_MEM, | 371 | .flags = IORESOURCE_MEM, |
377 | }, { | 372 | }, { |
378 | .start = MXC_INT_USB3, | 373 | .start = MXC_INT_USB3, |
@@ -395,16 +390,142 @@ struct platform_device mxc_otg_udc_device = { | |||
395 | .num_resources = ARRAY_SIZE(otg_resources), | 390 | .num_resources = ARRAY_SIZE(otg_resources), |
396 | }; | 391 | }; |
397 | 392 | ||
393 | /* OTG host */ | ||
394 | struct platform_device mxc_otg_host = { | ||
395 | .name = "mxc-ehci", | ||
396 | .id = 0, | ||
397 | .dev = { | ||
398 | .coherent_dma_mask = 0xffffffff, | ||
399 | .dma_mask = &otg_dmamask, | ||
400 | }, | ||
401 | .resource = otg_resources, | ||
402 | .num_resources = ARRAY_SIZE(otg_resources), | ||
403 | }; | ||
404 | |||
405 | /* USB host 1 */ | ||
406 | |||
407 | static u64 usbh1_dmamask = ~(u32)0; | ||
408 | |||
409 | static struct resource mxc_usbh1_resources[] = { | ||
410 | { | ||
411 | .start = MX31_OTG_BASE_ADDR + 0x200, | ||
412 | .end = MX31_OTG_BASE_ADDR + 0x3ff, | ||
413 | .flags = IORESOURCE_MEM, | ||
414 | }, { | ||
415 | .start = MXC_INT_USB1, | ||
416 | .end = MXC_INT_USB1, | ||
417 | .flags = IORESOURCE_IRQ, | ||
418 | }, | ||
419 | }; | ||
420 | |||
421 | struct platform_device mxc_usbh1 = { | ||
422 | .name = "mxc-ehci", | ||
423 | .id = 1, | ||
424 | .dev = { | ||
425 | .coherent_dma_mask = 0xffffffff, | ||
426 | .dma_mask = &usbh1_dmamask, | ||
427 | }, | ||
428 | .resource = mxc_usbh1_resources, | ||
429 | .num_resources = ARRAY_SIZE(mxc_usbh1_resources), | ||
430 | }; | ||
431 | |||
432 | /* USB host 2 */ | ||
433 | static u64 usbh2_dmamask = ~(u32)0; | ||
434 | |||
435 | static struct resource mxc_usbh2_resources[] = { | ||
436 | { | ||
437 | .start = MX31_OTG_BASE_ADDR + 0x400, | ||
438 | .end = MX31_OTG_BASE_ADDR + 0x5ff, | ||
439 | .flags = IORESOURCE_MEM, | ||
440 | }, { | ||
441 | .start = MXC_INT_USB2, | ||
442 | .end = MXC_INT_USB2, | ||
443 | .flags = IORESOURCE_IRQ, | ||
444 | }, | ||
445 | }; | ||
446 | |||
447 | struct platform_device mxc_usbh2 = { | ||
448 | .name = "mxc-ehci", | ||
449 | .id = 2, | ||
450 | .dev = { | ||
451 | .coherent_dma_mask = 0xffffffff, | ||
452 | .dma_mask = &usbh2_dmamask, | ||
453 | }, | ||
454 | .resource = mxc_usbh2_resources, | ||
455 | .num_resources = ARRAY_SIZE(mxc_usbh2_resources), | ||
456 | }; | ||
457 | |||
458 | /* | ||
459 | * SPI master controller | ||
460 | * 3 channels | ||
461 | */ | ||
462 | static struct resource imx_spi_0_resources[] = { | ||
463 | { | ||
464 | .start = CSPI1_BASE_ADDR, | ||
465 | .end = CSPI1_BASE_ADDR + SZ_4K - 1, | ||
466 | .flags = IORESOURCE_MEM, | ||
467 | }, { | ||
468 | .start = MXC_INT_CSPI1, | ||
469 | .end = MXC_INT_CSPI1, | ||
470 | .flags = IORESOURCE_IRQ, | ||
471 | }, | ||
472 | }; | ||
473 | |||
474 | static struct resource imx_spi_1_resources[] = { | ||
475 | { | ||
476 | .start = CSPI2_BASE_ADDR, | ||
477 | .end = CSPI2_BASE_ADDR + SZ_4K - 1, | ||
478 | .flags = IORESOURCE_MEM, | ||
479 | }, { | ||
480 | .start = MXC_INT_CSPI2, | ||
481 | .end = MXC_INT_CSPI2, | ||
482 | .flags = IORESOURCE_IRQ, | ||
483 | }, | ||
484 | }; | ||
485 | |||
486 | static struct resource imx_spi_2_resources[] = { | ||
487 | { | ||
488 | .start = CSPI3_BASE_ADDR, | ||
489 | .end = CSPI3_BASE_ADDR + SZ_4K - 1, | ||
490 | .flags = IORESOURCE_MEM, | ||
491 | }, { | ||
492 | .start = MXC_INT_CSPI3, | ||
493 | .end = MXC_INT_CSPI3, | ||
494 | .flags = IORESOURCE_IRQ, | ||
495 | }, | ||
496 | }; | ||
497 | |||
498 | struct platform_device imx_spi_device0 = { | ||
499 | .name = "spi_imx", | ||
500 | .id = 0, | ||
501 | .num_resources = ARRAY_SIZE(imx_spi_0_resources), | ||
502 | .resource = imx_spi_0_resources, | ||
503 | }; | ||
504 | |||
505 | struct platform_device imx_spi_device1 = { | ||
506 | .name = "spi_imx", | ||
507 | .id = 1, | ||
508 | .num_resources = ARRAY_SIZE(imx_spi_1_resources), | ||
509 | .resource = imx_spi_1_resources, | ||
510 | }; | ||
511 | |||
512 | struct platform_device imx_spi_device2 = { | ||
513 | .name = "spi_imx", | ||
514 | .id = 2, | ||
515 | .num_resources = ARRAY_SIZE(imx_spi_2_resources), | ||
516 | .resource = imx_spi_2_resources, | ||
517 | }; | ||
518 | |||
398 | #ifdef CONFIG_ARCH_MX35 | 519 | #ifdef CONFIG_ARCH_MX35 |
399 | static struct resource mxc_fec_resources[] = { | 520 | static struct resource mxc_fec_resources[] = { |
400 | { | 521 | { |
401 | .start = MXC_FEC_BASE_ADDR, | 522 | .start = MXC_FEC_BASE_ADDR, |
402 | .end = MXC_FEC_BASE_ADDR + 0xfff, | 523 | .end = MXC_FEC_BASE_ADDR + 0xfff, |
403 | .flags = IORESOURCE_MEM | 524 | .flags = IORESOURCE_MEM, |
404 | }, { | 525 | }, { |
405 | .start = MXC_INT_FEC, | 526 | .start = MXC_INT_FEC, |
406 | .end = MXC_INT_FEC, | 527 | .end = MXC_INT_FEC, |
407 | .flags = IORESOURCE_IRQ | 528 | .flags = IORESOURCE_IRQ, |
408 | }, | 529 | }, |
409 | }; | 530 | }; |
410 | 531 | ||
@@ -426,6 +547,14 @@ static int mx3_devices_init(void) | |||
426 | if (cpu_is_mx35()) { | 547 | if (cpu_is_mx35()) { |
427 | mxc_nand_resources[0].start = MX35_NFC_BASE_ADDR; | 548 | mxc_nand_resources[0].start = MX35_NFC_BASE_ADDR; |
428 | mxc_nand_resources[0].end = MX35_NFC_BASE_ADDR + 0xfff; | 549 | mxc_nand_resources[0].end = MX35_NFC_BASE_ADDR + 0xfff; |
550 | otg_resources[0].start = MX35_OTG_BASE_ADDR; | ||
551 | otg_resources[0].end = MX35_OTG_BASE_ADDR + 0x1ff; | ||
552 | otg_resources[1].start = MXC_INT_USBOTG; | ||
553 | otg_resources[1].end = MXC_INT_USBOTG; | ||
554 | mxc_usbh1_resources[0].start = MX35_OTG_BASE_ADDR + 0x400; | ||
555 | mxc_usbh1_resources[0].end = MX35_OTG_BASE_ADDR + 0x5ff; | ||
556 | mxc_usbh1_resources[1].start = MXC_INT_USBHS; | ||
557 | mxc_usbh1_resources[1].end = MXC_INT_USBHS; | ||
429 | } | 558 | } |
430 | 559 | ||
431 | return 0; | 560 | return 0; |
diff --git a/arch/arm/mach-mx3/devices.h b/arch/arm/mach-mx3/devices.h index ffd494ddd4ac..79f2be45d139 100644 --- a/arch/arm/mach-mx3/devices.h +++ b/arch/arm/mach-mx3/devices.h | |||
@@ -16,5 +16,11 @@ extern struct platform_device mxc_fec_device; | |||
16 | extern struct platform_device mxcsdhc_device0; | 16 | extern struct platform_device mxcsdhc_device0; |
17 | extern struct platform_device mxcsdhc_device1; | 17 | extern struct platform_device mxcsdhc_device1; |
18 | extern struct platform_device mxc_otg_udc_device; | 18 | extern struct platform_device mxc_otg_udc_device; |
19 | extern struct platform_device mxc_otg_host; | ||
20 | extern struct platform_device mxc_usbh1; | ||
21 | extern struct platform_device mxc_usbh2; | ||
19 | extern struct platform_device mxc_rnga_device; | 22 | extern struct platform_device mxc_rnga_device; |
23 | extern struct platform_device imx_spi_device0; | ||
24 | extern struct platform_device imx_spi_device1; | ||
25 | extern struct platform_device imx_spi_device2; | ||
20 | 26 | ||
diff --git a/arch/arm/mach-mx3/mm.c b/arch/arm/mach-mx3/mm.c index 1f5fdd456cb9..ad5a1122d765 100644 --- a/arch/arm/mach-mx3/mm.c +++ b/arch/arm/mach-mx3/mm.c | |||
@@ -30,6 +30,7 @@ | |||
30 | 30 | ||
31 | #include <mach/common.h> | 31 | #include <mach/common.h> |
32 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
33 | #include <mach/iomux-v3.h> | ||
33 | 34 | ||
34 | /*! | 35 | /*! |
35 | * @file mm.c | 36 | * @file mm.c |
@@ -75,6 +76,7 @@ static struct map_desc mxc_io_desc[] __initdata = { | |||
75 | void __init mx31_map_io(void) | 76 | void __init mx31_map_io(void) |
76 | { | 77 | { |
77 | mxc_set_cpu_type(MXC_CPU_MX31); | 78 | mxc_set_cpu_type(MXC_CPU_MX31); |
79 | mxc_arch_reset_init(IO_ADDRESS(WDOG_BASE_ADDR)); | ||
78 | 80 | ||
79 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); | 81 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); |
80 | } | 82 | } |
@@ -82,10 +84,22 @@ void __init mx31_map_io(void) | |||
82 | void __init mx35_map_io(void) | 84 | void __init mx35_map_io(void) |
83 | { | 85 | { |
84 | mxc_set_cpu_type(MXC_CPU_MX35); | 86 | mxc_set_cpu_type(MXC_CPU_MX35); |
87 | mxc_iomux_v3_init(IO_ADDRESS(IOMUXC_BASE_ADDR)); | ||
88 | mxc_arch_reset_init(IO_ADDRESS(WDOG_BASE_ADDR)); | ||
85 | 89 | ||
86 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); | 90 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); |
87 | } | 91 | } |
88 | 92 | ||
93 | void __init mx31_init_irq(void) | ||
94 | { | ||
95 | mxc_init_irq(IO_ADDRESS(AVIC_BASE_ADDR)); | ||
96 | } | ||
97 | |||
98 | void __init mx35_init_irq(void) | ||
99 | { | ||
100 | mx31_init_irq(); | ||
101 | } | ||
102 | |||
89 | #ifdef CONFIG_CACHE_L2X0 | 103 | #ifdef CONFIG_CACHE_L2X0 |
90 | static int mxc_init_l2x0(void) | 104 | static int mxc_init_l2x0(void) |
91 | { | 105 | { |
diff --git a/arch/arm/mach-mx3/mx31ads.c b/arch/arm/mach-mx3/mx31ads.c index 30e2767a78ae..0497c152be18 100644 --- a/arch/arm/mach-mx3/mx31ads.c +++ b/arch/arm/mach-mx3/mx31ads.c | |||
@@ -517,7 +517,7 @@ static void __init mx31ads_map_io(void) | |||
517 | 517 | ||
518 | static void __init mx31ads_init_irq(void) | 518 | static void __init mx31ads_init_irq(void) |
519 | { | 519 | { |
520 | mxc_init_irq(); | 520 | mx31_init_irq(); |
521 | mx31ads_init_expio(); | 521 | mx31ads_init_expio(); |
522 | } | 522 | } |
523 | 523 | ||
diff --git a/arch/arm/mach-mx3/mx31lilly.c b/arch/arm/mach-mx3/mx31lilly.c index 6ab2f163cb95..423025150f6f 100644 --- a/arch/arm/mach-mx3/mx31lilly.c +++ b/arch/arm/mach-mx3/mx31lilly.c | |||
@@ -148,7 +148,7 @@ MACHINE_START(LILLY1131, "INCO startec LILLY-1131") | |||
148 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 148 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
149 | .boot_params = PHYS_OFFSET + 0x100, | 149 | .boot_params = PHYS_OFFSET + 0x100, |
150 | .map_io = mx31_map_io, | 150 | .map_io = mx31_map_io, |
151 | .init_irq = mxc_init_irq, | 151 | .init_irq = mx31_init_irq, |
152 | .init_machine = mx31lilly_board_init, | 152 | .init_machine = mx31lilly_board_init, |
153 | .timer = &mx31lilly_timer, | 153 | .timer = &mx31lilly_timer, |
154 | MACHINE_END | 154 | MACHINE_END |
diff --git a/arch/arm/mach-mx3/mx31lite.c b/arch/arm/mach-mx3/mx31lite.c index 86fe70fa3e13..a8d57decdfdb 100644 --- a/arch/arm/mach-mx3/mx31lite.c +++ b/arch/arm/mach-mx3/mx31lite.c | |||
@@ -71,12 +71,11 @@ static struct smsc911x_platform_config smsc911x_config = { | |||
71 | }; | 71 | }; |
72 | 72 | ||
73 | static struct resource smsc911x_resources[] = { | 73 | static struct resource smsc911x_resources[] = { |
74 | [0] = { | 74 | { |
75 | .start = CS4_BASE_ADDR, | 75 | .start = CS4_BASE_ADDR, |
76 | .end = CS4_BASE_ADDR + 0x100, | 76 | .end = CS4_BASE_ADDR + 0x100, |
77 | .flags = IORESOURCE_MEM, | 77 | .flags = IORESOURCE_MEM, |
78 | }, | 78 | }, { |
79 | [1] = { | ||
80 | .start = IOMUX_TO_IRQ(MX31_PIN_SFS6), | 79 | .start = IOMUX_TO_IRQ(MX31_PIN_SFS6), |
81 | .end = IOMUX_TO_IRQ(MX31_PIN_SFS6), | 80 | .end = IOMUX_TO_IRQ(MX31_PIN_SFS6), |
82 | .flags = IORESOURCE_IRQ, | 81 | .flags = IORESOURCE_IRQ, |
@@ -162,7 +161,7 @@ MACHINE_START(MX31LITE, "LogicPD MX31 LITEKIT") | |||
162 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 161 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
163 | .boot_params = PHYS_OFFSET + 0x100, | 162 | .boot_params = PHYS_OFFSET + 0x100, |
164 | .map_io = mx31lite_map_io, | 163 | .map_io = mx31lite_map_io, |
165 | .init_irq = mxc_init_irq, | 164 | .init_irq = mx31_init_irq, |
166 | .init_machine = mxc_board_init, | 165 | .init_machine = mxc_board_init, |
167 | .timer = &mx31lite_timer, | 166 | .timer = &mx31lite_timer, |
168 | MACHINE_END | 167 | MACHINE_END |
diff --git a/arch/arm/mach-mx3/mx31moboard-devboard.c b/arch/arm/mach-mx3/mx31moboard-devboard.c index 4704405165a1..b3e8f251ac79 100644 --- a/arch/arm/mach-mx3/mx31moboard-devboard.c +++ b/arch/arm/mach-mx3/mx31moboard-devboard.c | |||
@@ -16,7 +16,6 @@ | |||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/fsl_devices.h> | ||
20 | #include <linux/gpio.h> | 19 | #include <linux/gpio.h> |
21 | #include <linux/init.h> | 20 | #include <linux/init.h> |
22 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
@@ -40,18 +39,6 @@ static unsigned int devboard_pins[] = { | |||
40 | MX31_PIN_PC_READY__SD2_DATA1, MX31_PIN_PC_WAIT_B__SD2_DATA0, | 39 | MX31_PIN_PC_READY__SD2_DATA1, MX31_PIN_PC_WAIT_B__SD2_DATA0, |
41 | MX31_PIN_PC_CD2_B__SD2_CLK, MX31_PIN_PC_CD1_B__SD2_CMD, | 40 | MX31_PIN_PC_CD2_B__SD2_CLK, MX31_PIN_PC_CD1_B__SD2_CMD, |
42 | MX31_PIN_ATA_DIOR__GPIO3_28, MX31_PIN_ATA_DIOW__GPIO3_29, | 41 | MX31_PIN_ATA_DIOR__GPIO3_28, MX31_PIN_ATA_DIOW__GPIO3_29, |
43 | /* USB OTG */ | ||
44 | MX31_PIN_USBOTG_DATA0__USBOTG_DATA0, | ||
45 | MX31_PIN_USBOTG_DATA1__USBOTG_DATA1, | ||
46 | MX31_PIN_USBOTG_DATA2__USBOTG_DATA2, | ||
47 | MX31_PIN_USBOTG_DATA3__USBOTG_DATA3, | ||
48 | MX31_PIN_USBOTG_DATA4__USBOTG_DATA4, | ||
49 | MX31_PIN_USBOTG_DATA5__USBOTG_DATA5, | ||
50 | MX31_PIN_USBOTG_DATA6__USBOTG_DATA6, | ||
51 | MX31_PIN_USBOTG_DATA7__USBOTG_DATA7, | ||
52 | MX31_PIN_USBOTG_CLK__USBOTG_CLK, MX31_PIN_USBOTG_DIR__USBOTG_DIR, | ||
53 | MX31_PIN_USBOTG_NXT__USBOTG_NXT, MX31_PIN_USBOTG_STP__USBOTG_STP, | ||
54 | MX31_PIN_USB_OC__GPIO1_30, | ||
55 | }; | 42 | }; |
56 | 43 | ||
57 | static struct imxuart_platform_data uart_pdata = { | 44 | static struct imxuart_platform_data uart_pdata = { |
@@ -111,33 +98,6 @@ static struct imxmmc_platform_data sdhc2_pdata = { | |||
111 | .exit = devboard_sdhc2_exit, | 98 | .exit = devboard_sdhc2_exit, |
112 | }; | 99 | }; |
113 | 100 | ||
114 | static struct fsl_usb2_platform_data usb_pdata = { | ||
115 | .operating_mode = FSL_USB2_DR_DEVICE, | ||
116 | .phy_mode = FSL_USB2_PHY_ULPI, | ||
117 | }; | ||
118 | |||
119 | #define OTG_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST) | ||
120 | #define OTG_EN_B IOMUX_TO_GPIO(MX31_PIN_USB_OC) | ||
121 | |||
122 | static void devboard_usbotg_init(void) | ||
123 | { | ||
124 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA0, OTG_PAD_CFG); | ||
125 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA1, OTG_PAD_CFG); | ||
126 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA2, OTG_PAD_CFG); | ||
127 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA3, OTG_PAD_CFG); | ||
128 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA4, OTG_PAD_CFG); | ||
129 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA5, OTG_PAD_CFG); | ||
130 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA6, OTG_PAD_CFG); | ||
131 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA7, OTG_PAD_CFG); | ||
132 | mxc_iomux_set_pad(MX31_PIN_USBOTG_CLK, OTG_PAD_CFG); | ||
133 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DIR, OTG_PAD_CFG); | ||
134 | mxc_iomux_set_pad(MX31_PIN_USBOTG_NXT, OTG_PAD_CFG); | ||
135 | mxc_iomux_set_pad(MX31_PIN_USBOTG_STP, OTG_PAD_CFG); | ||
136 | |||
137 | gpio_request(OTG_EN_B, "usb-udc-en"); | ||
138 | gpio_direction_output(OTG_EN_B, 0); | ||
139 | } | ||
140 | |||
141 | /* | 101 | /* |
142 | * system init for baseboard usage. Will be called by mx31moboard init. | 102 | * system init for baseboard usage. Will be called by mx31moboard init. |
143 | */ | 103 | */ |
@@ -151,7 +111,4 @@ void __init mx31moboard_devboard_init(void) | |||
151 | mxc_register_device(&mxc_uart_device1, &uart_pdata); | 111 | mxc_register_device(&mxc_uart_device1, &uart_pdata); |
152 | 112 | ||
153 | mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata); | 113 | mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata); |
154 | |||
155 | devboard_usbotg_init(); | ||
156 | mxc_register_device(&mxc_otg_udc_device, &usb_pdata); | ||
157 | } | 114 | } |
diff --git a/arch/arm/mach-mx3/mx31moboard-marxbot.c b/arch/arm/mach-mx3/mx31moboard-marxbot.c index 641c3d6153ae..3e2b73051b94 100644 --- a/arch/arm/mach-mx3/mx31moboard-marxbot.c +++ b/arch/arm/mach-mx3/mx31moboard-marxbot.c | |||
@@ -16,7 +16,6 @@ | |||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/fsl_devices.h> | ||
20 | #include <linux/gpio.h> | 19 | #include <linux/gpio.h> |
21 | #include <linux/init.h> | 20 | #include <linux/init.h> |
22 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
@@ -48,18 +47,8 @@ static unsigned int marxbot_pins[] = { | |||
48 | MX31_PIN_CSI_PIXCLK__CSI_PIXCLK, MX31_PIN_CSI_VSYNC__CSI_VSYNC, | 47 | MX31_PIN_CSI_PIXCLK__CSI_PIXCLK, MX31_PIN_CSI_VSYNC__CSI_VSYNC, |
49 | MX31_PIN_GPIO3_0__GPIO3_0, MX31_PIN_GPIO3_1__GPIO3_1, | 48 | MX31_PIN_GPIO3_0__GPIO3_0, MX31_PIN_GPIO3_1__GPIO3_1, |
50 | MX31_PIN_TXD2__GPIO1_28, | 49 | MX31_PIN_TXD2__GPIO1_28, |
51 | /* USB OTG */ | 50 | /* dsPIC resets */ |
52 | MX31_PIN_USBOTG_DATA0__USBOTG_DATA0, | 51 | MX31_PIN_STXD5__GPIO1_21, MX31_PIN_SRXD5__GPIO1_22, |
53 | MX31_PIN_USBOTG_DATA1__USBOTG_DATA1, | ||
54 | MX31_PIN_USBOTG_DATA2__USBOTG_DATA2, | ||
55 | MX31_PIN_USBOTG_DATA3__USBOTG_DATA3, | ||
56 | MX31_PIN_USBOTG_DATA4__USBOTG_DATA4, | ||
57 | MX31_PIN_USBOTG_DATA5__USBOTG_DATA5, | ||
58 | MX31_PIN_USBOTG_DATA6__USBOTG_DATA6, | ||
59 | MX31_PIN_USBOTG_DATA7__USBOTG_DATA7, | ||
60 | MX31_PIN_USBOTG_CLK__USBOTG_CLK, MX31_PIN_USBOTG_DIR__USBOTG_DIR, | ||
61 | MX31_PIN_USBOTG_NXT__USBOTG_NXT, MX31_PIN_USBOTG_STP__USBOTG_STP, | ||
62 | MX31_PIN_USB_OC__GPIO1_30, | ||
63 | }; | 52 | }; |
64 | 53 | ||
65 | #define SDHC2_CD IOMUX_TO_GPIO(MX31_PIN_ATA_DIOR) | 54 | #define SDHC2_CD IOMUX_TO_GPIO(MX31_PIN_ATA_DIOR) |
@@ -115,31 +104,20 @@ static struct imxmmc_platform_data sdhc2_pdata = { | |||
115 | .exit = marxbot_sdhc2_exit, | 104 | .exit = marxbot_sdhc2_exit, |
116 | }; | 105 | }; |
117 | 106 | ||
118 | static struct fsl_usb2_platform_data usb_pdata = { | 107 | #define TRSLAT_RST_B IOMUX_TO_GPIO(MX31_PIN_STXD5) |
119 | .operating_mode = FSL_USB2_DR_DEVICE, | 108 | #define DSPICS_RST_B IOMUX_TO_GPIO(MX31_PIN_SRXD5) |
120 | .phy_mode = FSL_USB2_PHY_ULPI, | ||
121 | }; | ||
122 | |||
123 | #define OTG_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST) | ||
124 | #define OTG_EN_B IOMUX_TO_GPIO(MX31_PIN_USB_OC) | ||
125 | 109 | ||
126 | static void marxbot_usbotg_init(void) | 110 | static void dspics_resets_init(void) |
127 | { | 111 | { |
128 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA0, OTG_PAD_CFG); | 112 | if (!gpio_request(TRSLAT_RST_B, "translator-rst")) { |
129 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA1, OTG_PAD_CFG); | 113 | gpio_direction_output(TRSLAT_RST_B, 1); |
130 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA2, OTG_PAD_CFG); | 114 | gpio_export(TRSLAT_RST_B, false); |
131 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA3, OTG_PAD_CFG); | 115 | } |
132 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA4, OTG_PAD_CFG); | 116 | |
133 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA5, OTG_PAD_CFG); | 117 | if (!gpio_request(DSPICS_RST_B, "dspics-rst")) { |
134 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA6, OTG_PAD_CFG); | 118 | gpio_direction_output(DSPICS_RST_B, 1); |
135 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA7, OTG_PAD_CFG); | 119 | gpio_export(DSPICS_RST_B, false); |
136 | mxc_iomux_set_pad(MX31_PIN_USBOTG_CLK, OTG_PAD_CFG); | 120 | } |
137 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DIR, OTG_PAD_CFG); | ||
138 | mxc_iomux_set_pad(MX31_PIN_USBOTG_NXT, OTG_PAD_CFG); | ||
139 | mxc_iomux_set_pad(MX31_PIN_USBOTG_STP, OTG_PAD_CFG); | ||
140 | |||
141 | gpio_request(OTG_EN_B, "usb-udc-en"); | ||
142 | gpio_direction_output(OTG_EN_B, 0); | ||
143 | } | 121 | } |
144 | 122 | ||
145 | /* | 123 | /* |
@@ -152,8 +130,7 @@ void __init mx31moboard_marxbot_init(void) | |||
152 | mxc_iomux_setup_multiple_pins(marxbot_pins, ARRAY_SIZE(marxbot_pins), | 130 | mxc_iomux_setup_multiple_pins(marxbot_pins, ARRAY_SIZE(marxbot_pins), |
153 | "marxbot"); | 131 | "marxbot"); |
154 | 132 | ||
155 | mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata); | 133 | dspics_resets_init(); |
156 | 134 | ||
157 | marxbot_usbotg_init(); | 135 | mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata); |
158 | mxc_register_device(&mxc_otg_udc_device, &usb_pdata); | ||
159 | } | 136 | } |
diff --git a/arch/arm/mach-mx3/mx31moboard.c b/arch/arm/mach-mx3/mx31moboard.c index a17f2e411609..d3c6bb26271f 100644 --- a/arch/arm/mach-mx3/mx31moboard.c +++ b/arch/arm/mach-mx3/mx31moboard.c | |||
@@ -16,9 +16,12 @@ | |||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/delay.h> | ||
20 | #include <linux/fsl_devices.h> | ||
19 | #include <linux/gpio.h> | 21 | #include <linux/gpio.h> |
20 | #include <linux/init.h> | 22 | #include <linux/init.h> |
21 | #include <linux/interrupt.h> | 23 | #include <linux/interrupt.h> |
24 | #include <linux/leds.h> | ||
22 | #include <linux/memory.h> | 25 | #include <linux/memory.h> |
23 | #include <linux/mtd/physmap.h> | 26 | #include <linux/mtd/physmap.h> |
24 | #include <linux/mtd/partitions.h> | 27 | #include <linux/mtd/partitions.h> |
@@ -36,6 +39,7 @@ | |||
36 | #include <mach/iomux-mx3.h> | 39 | #include <mach/iomux-mx3.h> |
37 | #include <mach/i2c.h> | 40 | #include <mach/i2c.h> |
38 | #include <mach/mmc.h> | 41 | #include <mach/mmc.h> |
42 | #include <mach/mx31.h> | ||
39 | 43 | ||
40 | #include "devices.h" | 44 | #include "devices.h" |
41 | 45 | ||
@@ -55,6 +59,26 @@ static unsigned int moboard_pins[] = { | |||
55 | MX31_PIN_SD1_DATA1__SD1_DATA1, MX31_PIN_SD1_DATA0__SD1_DATA0, | 59 | MX31_PIN_SD1_DATA1__SD1_DATA1, MX31_PIN_SD1_DATA0__SD1_DATA0, |
56 | MX31_PIN_SD1_CLK__SD1_CLK, MX31_PIN_SD1_CMD__SD1_CMD, | 60 | MX31_PIN_SD1_CLK__SD1_CLK, MX31_PIN_SD1_CMD__SD1_CMD, |
57 | MX31_PIN_ATA_CS0__GPIO3_26, MX31_PIN_ATA_CS1__GPIO3_27, | 61 | MX31_PIN_ATA_CS0__GPIO3_26, MX31_PIN_ATA_CS1__GPIO3_27, |
62 | /* USB reset */ | ||
63 | MX31_PIN_GPIO1_0__GPIO1_0, | ||
64 | /* USB OTG */ | ||
65 | MX31_PIN_USBOTG_DATA0__USBOTG_DATA0, | ||
66 | MX31_PIN_USBOTG_DATA1__USBOTG_DATA1, | ||
67 | MX31_PIN_USBOTG_DATA2__USBOTG_DATA2, | ||
68 | MX31_PIN_USBOTG_DATA3__USBOTG_DATA3, | ||
69 | MX31_PIN_USBOTG_DATA4__USBOTG_DATA4, | ||
70 | MX31_PIN_USBOTG_DATA5__USBOTG_DATA5, | ||
71 | MX31_PIN_USBOTG_DATA6__USBOTG_DATA6, | ||
72 | MX31_PIN_USBOTG_DATA7__USBOTG_DATA7, | ||
73 | MX31_PIN_USBOTG_CLK__USBOTG_CLK, MX31_PIN_USBOTG_DIR__USBOTG_DIR, | ||
74 | MX31_PIN_USBOTG_NXT__USBOTG_NXT, MX31_PIN_USBOTG_STP__USBOTG_STP, | ||
75 | MX31_PIN_USB_OC__GPIO1_30, | ||
76 | /* LEDs */ | ||
77 | MX31_PIN_SVEN0__GPIO2_0, MX31_PIN_STX0__GPIO2_1, | ||
78 | MX31_PIN_SRX0__GPIO2_2, MX31_PIN_SIMPD0__GPIO2_3, | ||
79 | /* SEL */ | ||
80 | MX31_PIN_DTR_DCE1__GPIO2_8, MX31_PIN_DSR_DCE1__GPIO2_9, | ||
81 | MX31_PIN_RI_DCE1__GPIO2_10, MX31_PIN_DCD_DCE1__GPIO2_11, | ||
58 | }; | 82 | }; |
59 | 83 | ||
60 | static struct physmap_flash_data mx31moboard_flash_data = { | 84 | static struct physmap_flash_data mx31moboard_flash_data = { |
@@ -142,8 +166,109 @@ static struct imxmmc_platform_data sdhc1_pdata = { | |||
142 | .exit = moboard_sdhc1_exit, | 166 | .exit = moboard_sdhc1_exit, |
143 | }; | 167 | }; |
144 | 168 | ||
169 | /* | ||
170 | * this pin is dedicated for all mx31moboard systems, so we do it here | ||
171 | */ | ||
172 | #define USB_RESET_B IOMUX_TO_GPIO(MX31_PIN_GPIO1_0) | ||
173 | |||
174 | static void usb_xcvr_reset(void) | ||
175 | { | ||
176 | gpio_request(USB_RESET_B, "usb-reset"); | ||
177 | gpio_direction_output(USB_RESET_B, 0); | ||
178 | mdelay(1); | ||
179 | gpio_set_value(USB_RESET_B, 1); | ||
180 | } | ||
181 | |||
182 | #define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \ | ||
183 | PAD_CTL_ODE_CMOS | PAD_CTL_100K_PU) | ||
184 | |||
185 | #define OTG_EN_B IOMUX_TO_GPIO(MX31_PIN_USB_OC) | ||
186 | |||
187 | static void moboard_usbotg_init(void) | ||
188 | { | ||
189 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA0, USB_PAD_CFG); | ||
190 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA1, USB_PAD_CFG); | ||
191 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA2, USB_PAD_CFG); | ||
192 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA3, USB_PAD_CFG); | ||
193 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA4, USB_PAD_CFG); | ||
194 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA5, USB_PAD_CFG); | ||
195 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA6, USB_PAD_CFG); | ||
196 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA7, USB_PAD_CFG); | ||
197 | mxc_iomux_set_pad(MX31_PIN_USBOTG_CLK, USB_PAD_CFG); | ||
198 | mxc_iomux_set_pad(MX31_PIN_USBOTG_DIR, USB_PAD_CFG); | ||
199 | mxc_iomux_set_pad(MX31_PIN_USBOTG_NXT, USB_PAD_CFG); | ||
200 | mxc_iomux_set_pad(MX31_PIN_USBOTG_STP, USB_PAD_CFG); | ||
201 | |||
202 | gpio_request(OTG_EN_B, "usb-udc-en"); | ||
203 | gpio_direction_output(OTG_EN_B, 0); | ||
204 | } | ||
205 | |||
206 | static struct fsl_usb2_platform_data usb_pdata = { | ||
207 | .operating_mode = FSL_USB2_DR_DEVICE, | ||
208 | .phy_mode = FSL_USB2_PHY_ULPI, | ||
209 | }; | ||
210 | |||
211 | static struct gpio_led mx31moboard_leds[] = { | ||
212 | { | ||
213 | .name = "coreboard-led-0:red:running", | ||
214 | .default_trigger = "heartbeat", | ||
215 | .gpio = IOMUX_TO_GPIO(MX31_PIN_SVEN0), | ||
216 | }, { | ||
217 | .name = "coreboard-led-1:red", | ||
218 | .gpio = IOMUX_TO_GPIO(MX31_PIN_STX0), | ||
219 | }, { | ||
220 | .name = "coreboard-led-2:red", | ||
221 | .gpio = IOMUX_TO_GPIO(MX31_PIN_SRX0), | ||
222 | }, { | ||
223 | .name = "coreboard-led-3:red", | ||
224 | .gpio = IOMUX_TO_GPIO(MX31_PIN_SIMPD0), | ||
225 | }, | ||
226 | }; | ||
227 | |||
228 | static struct gpio_led_platform_data mx31moboard_led_pdata = { | ||
229 | .num_leds = ARRAY_SIZE(mx31moboard_leds), | ||
230 | .leds = mx31moboard_leds, | ||
231 | }; | ||
232 | |||
233 | static struct platform_device mx31moboard_leds_device = { | ||
234 | .name = "leds-gpio", | ||
235 | .id = -1, | ||
236 | .dev = { | ||
237 | .platform_data = &mx31moboard_led_pdata, | ||
238 | }, | ||
239 | }; | ||
240 | |||
241 | #define SEL0 IOMUX_TO_GPIO(MX31_PIN_DTR_DCE1) | ||
242 | #define SEL1 IOMUX_TO_GPIO(MX31_PIN_DSR_DCE1) | ||
243 | #define SEL2 IOMUX_TO_GPIO(MX31_PIN_RI_DCE1) | ||
244 | #define SEL3 IOMUX_TO_GPIO(MX31_PIN_DCD_DCE1) | ||
245 | |||
246 | static void mx31moboard_init_sel_gpios(void) | ||
247 | { | ||
248 | if (!gpio_request(SEL0, "sel0")) { | ||
249 | gpio_direction_input(SEL0); | ||
250 | gpio_export(SEL0, true); | ||
251 | } | ||
252 | |||
253 | if (!gpio_request(SEL1, "sel1")) { | ||
254 | gpio_direction_input(SEL1); | ||
255 | gpio_export(SEL1, true); | ||
256 | } | ||
257 | |||
258 | if (!gpio_request(SEL2, "sel2")) { | ||
259 | gpio_direction_input(SEL2); | ||
260 | gpio_export(SEL2, true); | ||
261 | } | ||
262 | |||
263 | if (!gpio_request(SEL3, "sel3")) { | ||
264 | gpio_direction_input(SEL3); | ||
265 | gpio_export(SEL3, true); | ||
266 | } | ||
267 | } | ||
268 | |||
145 | static struct platform_device *devices[] __initdata = { | 269 | static struct platform_device *devices[] __initdata = { |
146 | &mx31moboard_flash, | 270 | &mx31moboard_flash, |
271 | &mx31moboard_leds_device, | ||
147 | }; | 272 | }; |
148 | 273 | ||
149 | static int mx31moboard_baseboard; | 274 | static int mx31moboard_baseboard; |
@@ -162,11 +287,18 @@ static void __init mxc_board_init(void) | |||
162 | mxc_register_device(&mxc_uart_device0, &uart_pdata); | 287 | mxc_register_device(&mxc_uart_device0, &uart_pdata); |
163 | mxc_register_device(&mxc_uart_device4, &uart_pdata); | 288 | mxc_register_device(&mxc_uart_device4, &uart_pdata); |
164 | 289 | ||
290 | mx31moboard_init_sel_gpios(); | ||
291 | |||
165 | mxc_register_device(&mxc_i2c_device0, &moboard_i2c0_pdata); | 292 | mxc_register_device(&mxc_i2c_device0, &moboard_i2c0_pdata); |
166 | mxc_register_device(&mxc_i2c_device1, &moboard_i2c1_pdata); | 293 | mxc_register_device(&mxc_i2c_device1, &moboard_i2c1_pdata); |
167 | 294 | ||
168 | mxc_register_device(&mxcsdhc_device0, &sdhc1_pdata); | 295 | mxc_register_device(&mxcsdhc_device0, &sdhc1_pdata); |
169 | 296 | ||
297 | usb_xcvr_reset(); | ||
298 | |||
299 | moboard_usbotg_init(); | ||
300 | mxc_register_device(&mxc_otg_udc_device, &usb_pdata); | ||
301 | |||
170 | switch (mx31moboard_baseboard) { | 302 | switch (mx31moboard_baseboard) { |
171 | case MX31NOBOARD: | 303 | case MX31NOBOARD: |
172 | break; | 304 | break; |
@@ -197,7 +329,7 @@ MACHINE_START(MX31MOBOARD, "EPFL Mobots mx31moboard") | |||
197 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 329 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
198 | .boot_params = PHYS_OFFSET + 0x100, | 330 | .boot_params = PHYS_OFFSET + 0x100, |
199 | .map_io = mx31_map_io, | 331 | .map_io = mx31_map_io, |
200 | .init_irq = mxc_init_irq, | 332 | .init_irq = mx31_init_irq, |
201 | .init_machine = mxc_board_init, | 333 | .init_machine = mxc_board_init, |
202 | .timer = &mx31moboard_timer, | 334 | .timer = &mx31moboard_timer, |
203 | MACHINE_END | 335 | MACHINE_END |
diff --git a/arch/arm/mach-mx3/mx31pdk.c b/arch/arm/mach-mx3/mx31pdk.c index c19838d2e369..0f7a2f06bc2d 100644 --- a/arch/arm/mach-mx3/mx31pdk.c +++ b/arch/arm/mach-mx3/mx31pdk.c | |||
@@ -265,7 +265,7 @@ MACHINE_START(MX31_3DS, "Freescale MX31PDK (3DS)") | |||
265 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 265 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
266 | .boot_params = PHYS_OFFSET + 0x100, | 266 | .boot_params = PHYS_OFFSET + 0x100, |
267 | .map_io = mx31pdk_map_io, | 267 | .map_io = mx31pdk_map_io, |
268 | .init_irq = mxc_init_irq, | 268 | .init_irq = mx31_init_irq, |
269 | .init_machine = mxc_board_init, | 269 | .init_machine = mxc_board_init, |
270 | .timer = &mx31pdk_timer, | 270 | .timer = &mx31pdk_timer, |
271 | MACHINE_END | 271 | MACHINE_END |
diff --git a/arch/arm/mach-mx3/mx35pdk.c b/arch/arm/mach-mx3/mx35pdk.c index 6d15374414b9..6ff186e46ceb 100644 --- a/arch/arm/mach-mx3/mx35pdk.c +++ b/arch/arm/mach-mx3/mx35pdk.c | |||
@@ -98,7 +98,7 @@ MACHINE_START(MX35_3DS, "Freescale MX35PDK") | |||
98 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 98 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
99 | .boot_params = PHYS_OFFSET + 0x100, | 99 | .boot_params = PHYS_OFFSET + 0x100, |
100 | .map_io = mx35_map_io, | 100 | .map_io = mx35_map_io, |
101 | .init_irq = mxc_init_irq, | 101 | .init_irq = mx35_init_irq, |
102 | .init_machine = mxc_board_init, | 102 | .init_machine = mxc_board_init, |
103 | .timer = &mx35pdk_timer, | 103 | .timer = &mx35pdk_timer, |
104 | MACHINE_END | 104 | MACHINE_END |
diff --git a/arch/arm/mach-mx3/pcm037.c b/arch/arm/mach-mx3/pcm037.c index 840cfda341d0..6cbaabedf386 100644 --- a/arch/arm/mach-mx3/pcm037.c +++ b/arch/arm/mach-mx3/pcm037.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/spi/spi.h> | 32 | #include <linux/spi/spi.h> |
33 | #include <linux/irq.h> | 33 | #include <linux/irq.h> |
34 | #include <linux/fsl_devices.h> | 34 | #include <linux/fsl_devices.h> |
35 | #include <linux/can/platform/sja1000.h> | ||
35 | 36 | ||
36 | #include <media/soc_camera.h> | 37 | #include <media/soc_camera.h> |
37 | 38 | ||
@@ -169,6 +170,8 @@ static unsigned int pcm037_pins[] = { | |||
169 | MX31_PIN_CSI_MCLK__CSI_MCLK, | 170 | MX31_PIN_CSI_MCLK__CSI_MCLK, |
170 | MX31_PIN_CSI_PIXCLK__CSI_PIXCLK, | 171 | MX31_PIN_CSI_PIXCLK__CSI_PIXCLK, |
171 | MX31_PIN_CSI_VSYNC__CSI_VSYNC, | 172 | MX31_PIN_CSI_VSYNC__CSI_VSYNC, |
173 | /* GPIO */ | ||
174 | IOMUX_MODE(MX31_PIN_ATA_DMACK, IOMUX_CONFIG_GPIO), | ||
172 | }; | 175 | }; |
173 | 176 | ||
174 | static struct physmap_flash_data pcm037_flash_data = { | 177 | static struct physmap_flash_data pcm037_flash_data = { |
@@ -244,12 +247,11 @@ static struct imxuart_platform_data uart_pdata = { | |||
244 | }; | 247 | }; |
245 | 248 | ||
246 | static struct resource smsc911x_resources[] = { | 249 | static struct resource smsc911x_resources[] = { |
247 | [0] = { | 250 | { |
248 | .start = CS1_BASE_ADDR + 0x300, | 251 | .start = CS1_BASE_ADDR + 0x300, |
249 | .end = CS1_BASE_ADDR + 0x300 + SZ_64K - 1, | 252 | .end = CS1_BASE_ADDR + 0x300 + SZ_64K - 1, |
250 | .flags = IORESOURCE_MEM, | 253 | .flags = IORESOURCE_MEM, |
251 | }, | 254 | }, { |
252 | [1] = { | ||
253 | .start = IOMUX_TO_IRQ(MX31_PIN_GPIO3_1), | 255 | .start = IOMUX_TO_IRQ(MX31_PIN_GPIO3_1), |
254 | .end = IOMUX_TO_IRQ(MX31_PIN_GPIO3_1), | 256 | .end = IOMUX_TO_IRQ(MX31_PIN_GPIO3_1), |
255 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, | 257 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, |
@@ -339,8 +341,7 @@ static struct i2c_board_info pcm037_i2c_devices[] = { | |||
339 | I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */ | 341 | I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */ |
340 | .platform_data = &board_eeprom, | 342 | .platform_data = &board_eeprom, |
341 | }, { | 343 | }, { |
342 | I2C_BOARD_INFO("rtc-pcf8563", 0x51), | 344 | I2C_BOARD_INFO("pcf8563", 0x51), |
343 | .type = "pcf8563", | ||
344 | } | 345 | } |
345 | }; | 346 | }; |
346 | 347 | ||
@@ -515,6 +516,33 @@ static struct mx3fb_platform_data mx3fb_pdata = { | |||
515 | .num_modes = ARRAY_SIZE(fb_modedb), | 516 | .num_modes = ARRAY_SIZE(fb_modedb), |
516 | }; | 517 | }; |
517 | 518 | ||
519 | static struct resource pcm970_sja1000_resources[] = { | ||
520 | { | ||
521 | .start = CS5_BASE_ADDR, | ||
522 | .end = CS5_BASE_ADDR + 0x100 - 1, | ||
523 | .flags = IORESOURCE_MEM, | ||
524 | }, { | ||
525 | .start = IOMUX_TO_IRQ(IOMUX_PIN(48, 105)), | ||
526 | .end = IOMUX_TO_IRQ(IOMUX_PIN(48, 105)), | ||
527 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE, | ||
528 | }, | ||
529 | }; | ||
530 | |||
531 | struct sja1000_platform_data pcm970_sja1000_platform_data = { | ||
532 | .clock = 16000000 / 2, | ||
533 | .ocr = 0x40 | 0x18, | ||
534 | .cdr = 0x40, | ||
535 | }; | ||
536 | |||
537 | static struct platform_device pcm970_sja1000 = { | ||
538 | .name = "sja1000_platform", | ||
539 | .dev = { | ||
540 | .platform_data = &pcm970_sja1000_platform_data, | ||
541 | }, | ||
542 | .resource = pcm970_sja1000_resources, | ||
543 | .num_resources = ARRAY_SIZE(pcm970_sja1000_resources), | ||
544 | }; | ||
545 | |||
518 | /* | 546 | /* |
519 | * Board specific initialization. | 547 | * Board specific initialization. |
520 | */ | 548 | */ |
@@ -575,6 +603,8 @@ static void __init mxc_board_init(void) | |||
575 | 603 | ||
576 | if (!pcm037_camera_alloc_dma(4 * 1024 * 1024)) | 604 | if (!pcm037_camera_alloc_dma(4 * 1024 * 1024)) |
577 | mxc_register_device(&mx3_camera, &camera_pdata); | 605 | mxc_register_device(&mx3_camera, &camera_pdata); |
606 | |||
607 | platform_device_register(&pcm970_sja1000); | ||
578 | } | 608 | } |
579 | 609 | ||
580 | static void __init pcm037_timer_init(void) | 610 | static void __init pcm037_timer_init(void) |
@@ -592,7 +622,7 @@ MACHINE_START(PCM037, "Phytec Phycore pcm037") | |||
592 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 622 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
593 | .boot_params = PHYS_OFFSET + 0x100, | 623 | .boot_params = PHYS_OFFSET + 0x100, |
594 | .map_io = mx31_map_io, | 624 | .map_io = mx31_map_io, |
595 | .init_irq = mxc_init_irq, | 625 | .init_irq = mx31_init_irq, |
596 | .init_machine = mxc_board_init, | 626 | .init_machine = mxc_board_init, |
597 | .timer = &pcm037_timer, | 627 | .timer = &pcm037_timer, |
598 | MACHINE_END | 628 | MACHINE_END |
diff --git a/arch/arm/mach-mx3/pcm043.c b/arch/arm/mach-mx3/pcm043.c index 8d27c324abf2..e18a224671fa 100644 --- a/arch/arm/mach-mx3/pcm043.c +++ b/arch/arm/mach-mx3/pcm043.c | |||
@@ -133,8 +133,7 @@ static struct i2c_board_info pcm043_i2c_devices[] = { | |||
133 | I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */ | 133 | I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */ |
134 | .platform_data = &board_eeprom, | 134 | .platform_data = &board_eeprom, |
135 | }, { | 135 | }, { |
136 | I2C_BOARD_INFO("rtc-pcf8563", 0x51), | 136 | I2C_BOARD_INFO("pcf8563", 0x51), |
137 | .type = "pcf8563", | ||
138 | } | 137 | } |
139 | }; | 138 | }; |
140 | #endif | 139 | #endif |
@@ -203,7 +202,8 @@ static struct pad_desc pcm043_pads[] = { | |||
203 | MX35_PAD_D3_VSYNC__IPU_DISPB_D3_VSYNC, | 202 | MX35_PAD_D3_VSYNC__IPU_DISPB_D3_VSYNC, |
204 | MX35_PAD_D3_REV__IPU_DISPB_D3_REV, | 203 | MX35_PAD_D3_REV__IPU_DISPB_D3_REV, |
205 | MX35_PAD_D3_CLS__IPU_DISPB_D3_CLS, | 204 | MX35_PAD_D3_CLS__IPU_DISPB_D3_CLS, |
206 | MX35_PAD_D3_SPL__IPU_DISPB_D3_SPL | 205 | /* gpio */ |
206 | MX35_PAD_ATA_CS0__GPIO2_6, | ||
207 | }; | 207 | }; |
208 | 208 | ||
209 | /* | 209 | /* |
@@ -245,7 +245,7 @@ MACHINE_START(PCM043, "Phytec Phycore pcm043") | |||
245 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 245 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
246 | .boot_params = PHYS_OFFSET + 0x100, | 246 | .boot_params = PHYS_OFFSET + 0x100, |
247 | .map_io = mx35_map_io, | 247 | .map_io = mx35_map_io, |
248 | .init_irq = mxc_init_irq, | 248 | .init_irq = mx35_init_irq, |
249 | .init_machine = mxc_board_init, | 249 | .init_machine = mxc_board_init, |
250 | .timer = &pcm043_timer, | 250 | .timer = &pcm043_timer, |
251 | MACHINE_END | 251 | MACHINE_END |
diff --git a/arch/arm/mach-mx3/qong.c b/arch/arm/mach-mx3/qong.c index 82b31c4ab11f..044511f1b9a9 100644 --- a/arch/arm/mach-mx3/qong.c +++ b/arch/arm/mach-mx3/qong.c | |||
@@ -81,13 +81,12 @@ static inline void mxc_init_imx_uart(void) | |||
81 | } | 81 | } |
82 | 82 | ||
83 | static struct resource dnet_resources[] = { | 83 | static struct resource dnet_resources[] = { |
84 | [0] = { | 84 | { |
85 | .name = "dnet-memory", | 85 | .name = "dnet-memory", |
86 | .start = QONG_DNET_BASEADDR, | 86 | .start = QONG_DNET_BASEADDR, |
87 | .end = QONG_DNET_BASEADDR + QONG_DNET_SIZE - 1, | 87 | .end = QONG_DNET_BASEADDR + QONG_DNET_SIZE - 1, |
88 | .flags = IORESOURCE_MEM, | 88 | .flags = IORESOURCE_MEM, |
89 | }, | 89 | }, { |
90 | [1] = { | ||
91 | .start = QONG_FPGA_IRQ, | 90 | .start = QONG_FPGA_IRQ, |
92 | .end = QONG_FPGA_IRQ, | 91 | .end = QONG_FPGA_IRQ, |
93 | .flags = IORESOURCE_IRQ, | 92 | .flags = IORESOURCE_IRQ, |
@@ -280,7 +279,7 @@ MACHINE_START(QONG, "Dave/DENX QongEVB-LITE") | |||
280 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, | 279 | .io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, |
281 | .boot_params = PHYS_OFFSET + 0x100, | 280 | .boot_params = PHYS_OFFSET + 0x100, |
282 | .map_io = mx31_map_io, | 281 | .map_io = mx31_map_io, |
283 | .init_irq = mxc_init_irq, | 282 | .init_irq = mx31_init_irq, |
284 | .init_machine = mxc_board_init, | 283 | .init_machine = mxc_board_init, |
285 | .timer = &qong_timer, | 284 | .timer = &qong_timer, |
286 | MACHINE_END | 285 | MACHINE_END |
diff --git a/arch/arm/mach-mxc91231/Kconfig b/arch/arm/mach-mxc91231/Kconfig new file mode 100644 index 000000000000..8e5fa38ebb67 --- /dev/null +++ b/arch/arm/mach-mxc91231/Kconfig | |||
@@ -0,0 +1,11 @@ | |||
1 | if ARCH_MXC91231 | ||
2 | |||
3 | comment "MXC91231 platforms:" | ||
4 | |||
5 | config MACH_MAGX_ZN5 | ||
6 | bool "Support Motorola Zn5 GSM phone" | ||
7 | default n | ||
8 | help | ||
9 | Include support for Motorola Zn5 GSM phone. | ||
10 | |||
11 | endif | ||
diff --git a/arch/arm/mach-mxc91231/Makefile b/arch/arm/mach-mxc91231/Makefile new file mode 100644 index 000000000000..011d5e197125 --- /dev/null +++ b/arch/arm/mach-mxc91231/Makefile | |||
@@ -0,0 +1,2 @@ | |||
1 | obj-y := mm.o clock.o devices.o system.o iomux.o | ||
2 | obj-$(CONFIG_MACH_MAGX_ZN5) += magx-zn5.o | ||
diff --git a/arch/arm/mach-mxc91231/Makefile.boot b/arch/arm/mach-mxc91231/Makefile.boot new file mode 100644 index 000000000000..9939a19d99a1 --- /dev/null +++ b/arch/arm/mach-mxc91231/Makefile.boot | |||
@@ -0,0 +1,3 @@ | |||
1 | zreladdr-y := 0x90008000 | ||
2 | params_phys-y := 0x90000100 | ||
3 | initrd_phys-y := 0x90800000 | ||
diff --git a/arch/arm/mach-mxc91231/clock.c b/arch/arm/mach-mxc91231/clock.c new file mode 100644 index 000000000000..ecfa37fef8ad --- /dev/null +++ b/arch/arm/mach-mxc91231/clock.c | |||
@@ -0,0 +1,642 @@ | |||
1 | #include <linux/clk.h> | ||
2 | #include <linux/kernel.h> | ||
3 | #include <linux/init.h> | ||
4 | #include <linux/io.h> | ||
5 | |||
6 | #include <mach/clock.h> | ||
7 | #include <mach/hardware.h> | ||
8 | #include <mach/common.h> | ||
9 | |||
10 | #include <asm/clkdev.h> | ||
11 | #include <asm/bug.h> | ||
12 | #include <asm/div64.h> | ||
13 | |||
14 | #include "crm_regs.h" | ||
15 | |||
16 | #define CRM_SMALL_DIVIDER(base, name) \ | ||
17 | crm_small_divider(base, \ | ||
18 | base ## _ ## name ## _OFFSET, \ | ||
19 | base ## _ ## name ## _MASK) | ||
20 | #define CRM_1DIVIDER(base, name) \ | ||
21 | crm_divider(base, \ | ||
22 | base ## _ ## name ## _OFFSET, \ | ||
23 | base ## _ ## name ## _MASK, 1) | ||
24 | #define CRM_16DIVIDER(base, name) \ | ||
25 | crm_divider(base, \ | ||
26 | base ## _ ## name ## _OFFSET, \ | ||
27 | base ## _ ## name ## _MASK, 16) | ||
28 | |||
29 | static u32 crm_small_divider(void __iomem *reg, u8 offset, u32 mask) | ||
30 | { | ||
31 | static const u32 crm_small_dividers[] = { | ||
32 | 2, 3, 4, 5, 6, 8, 10, 12 | ||
33 | }; | ||
34 | u8 idx; | ||
35 | |||
36 | idx = (__raw_readl(reg) & mask) >> offset; | ||
37 | if (idx > 7) | ||
38 | return 1; | ||
39 | |||
40 | return crm_small_dividers[idx]; | ||
41 | } | ||
42 | |||
43 | static u32 crm_divider(void __iomem *reg, u8 offset, u32 mask, u32 z) | ||
44 | { | ||
45 | u32 div; | ||
46 | div = (__raw_readl(reg) & mask) >> offset; | ||
47 | return div ? div : z; | ||
48 | } | ||
49 | |||
50 | static int _clk_1bit_enable(struct clk *clk) | ||
51 | { | ||
52 | u32 reg; | ||
53 | |||
54 | reg = __raw_readl(clk->enable_reg); | ||
55 | reg |= 1 << clk->enable_shift; | ||
56 | __raw_writel(reg, clk->enable_reg); | ||
57 | |||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | static void _clk_1bit_disable(struct clk *clk) | ||
62 | { | ||
63 | u32 reg; | ||
64 | |||
65 | reg = __raw_readl(clk->enable_reg); | ||
66 | reg &= ~(1 << clk->enable_shift); | ||
67 | __raw_writel(reg, clk->enable_reg); | ||
68 | } | ||
69 | |||
70 | static int _clk_3bit_enable(struct clk *clk) | ||
71 | { | ||
72 | u32 reg; | ||
73 | |||
74 | reg = __raw_readl(clk->enable_reg); | ||
75 | reg |= 0x7 << clk->enable_shift; | ||
76 | __raw_writel(reg, clk->enable_reg); | ||
77 | |||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | static void _clk_3bit_disable(struct clk *clk) | ||
82 | { | ||
83 | u32 reg; | ||
84 | |||
85 | reg = __raw_readl(clk->enable_reg); | ||
86 | reg &= ~(0x7 << clk->enable_shift); | ||
87 | __raw_writel(reg, clk->enable_reg); | ||
88 | } | ||
89 | |||
90 | static unsigned long ckih_rate; | ||
91 | |||
92 | static unsigned long clk_ckih_get_rate(struct clk *clk) | ||
93 | { | ||
94 | return ckih_rate; | ||
95 | } | ||
96 | |||
97 | static struct clk ckih_clk = { | ||
98 | .get_rate = clk_ckih_get_rate, | ||
99 | }; | ||
100 | |||
101 | static unsigned long clk_ckih_x2_get_rate(struct clk *clk) | ||
102 | { | ||
103 | return 2 * clk_get_rate(clk->parent); | ||
104 | } | ||
105 | |||
106 | static struct clk ckih_x2_clk = { | ||
107 | .parent = &ckih_clk, | ||
108 | .get_rate = clk_ckih_x2_get_rate, | ||
109 | }; | ||
110 | |||
111 | static unsigned long clk_ckil_get_rate(struct clk *clk) | ||
112 | { | ||
113 | return CKIL_CLK_FREQ; | ||
114 | } | ||
115 | |||
116 | static struct clk ckil_clk = { | ||
117 | .get_rate = clk_ckil_get_rate, | ||
118 | }; | ||
119 | |||
120 | /* plls stuff */ | ||
121 | static struct clk mcu_pll_clk; | ||
122 | static struct clk dsp_pll_clk; | ||
123 | static struct clk usb_pll_clk; | ||
124 | |||
125 | static struct clk *pll_clk(u8 sel) | ||
126 | { | ||
127 | switch (sel) { | ||
128 | case 0: | ||
129 | return &mcu_pll_clk; | ||
130 | case 1: | ||
131 | return &dsp_pll_clk; | ||
132 | case 2: | ||
133 | return &usb_pll_clk; | ||
134 | } | ||
135 | BUG(); | ||
136 | } | ||
137 | |||
138 | static void __iomem *pll_base(struct clk *clk) | ||
139 | { | ||
140 | if (clk == &mcu_pll_clk) | ||
141 | return MXC_PLL0_BASE; | ||
142 | else if (clk == &dsp_pll_clk) | ||
143 | return MXC_PLL1_BASE; | ||
144 | else if (clk == &usb_pll_clk) | ||
145 | return MXC_PLL2_BASE; | ||
146 | BUG(); | ||
147 | } | ||
148 | |||
149 | static unsigned long clk_pll_get_rate(struct clk *clk) | ||
150 | { | ||
151 | const void __iomem *pllbase; | ||
152 | unsigned long dp_op, dp_mfd, dp_mfn, pll_hfsm, ref_clk, mfi; | ||
153 | long mfn, mfn_abs, mfd, pdf; | ||
154 | s64 temp; | ||
155 | pllbase = pll_base(clk); | ||
156 | |||
157 | pll_hfsm = __raw_readl(pllbase + MXC_PLL_DP_CTL) & MXC_PLL_DP_CTL_HFSM; | ||
158 | if (pll_hfsm == 0) { | ||
159 | dp_op = __raw_readl(pllbase + MXC_PLL_DP_OP); | ||
160 | dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_MFD); | ||
161 | dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_MFN); | ||
162 | } else { | ||
163 | dp_op = __raw_readl(pllbase + MXC_PLL_DP_HFS_OP); | ||
164 | dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFD); | ||
165 | dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFN); | ||
166 | } | ||
167 | |||
168 | pdf = dp_op & MXC_PLL_DP_OP_PDF_MASK; | ||
169 | mfi = (dp_op >> MXC_PLL_DP_OP_MFI_OFFSET) & MXC_PLL_DP_OP_PDF_MASK; | ||
170 | mfi = (mfi <= 5) ? 5 : mfi; | ||
171 | mfd = dp_mfd & MXC_PLL_DP_MFD_MASK; | ||
172 | mfn = dp_mfn & MXC_PLL_DP_MFN_MASK; | ||
173 | mfn = (mfn <= 0x4000000) ? mfn : (mfn - 0x10000000); | ||
174 | |||
175 | if (mfn < 0) | ||
176 | mfn_abs = -mfn; | ||
177 | else | ||
178 | mfn_abs = mfn; | ||
179 | |||
180 | /* XXX: actually this asumes that ckih is fed to pll, but spec says | ||
181 | * that ckih_x2 is also possible. need to check this out. | ||
182 | */ | ||
183 | ref_clk = clk_get_rate(&ckih_clk); | ||
184 | |||
185 | ref_clk *= 2; | ||
186 | ref_clk /= pdf + 1; | ||
187 | |||
188 | temp = (u64) ref_clk * mfn_abs; | ||
189 | do_div(temp, mfd); | ||
190 | if (mfn < 0) | ||
191 | temp = -temp; | ||
192 | temp += ref_clk * mfi; | ||
193 | |||
194 | return temp; | ||
195 | } | ||
196 | |||
197 | static int clk_pll_enable(struct clk *clk) | ||
198 | { | ||
199 | void __iomem *ctl; | ||
200 | u32 reg; | ||
201 | |||
202 | ctl = pll_base(clk); | ||
203 | reg = __raw_readl(ctl); | ||
204 | reg |= (MXC_PLL_DP_CTL_RST | MXC_PLL_DP_CTL_UPEN); | ||
205 | __raw_writel(reg, ctl); | ||
206 | do { | ||
207 | reg = __raw_readl(ctl); | ||
208 | } while ((reg & MXC_PLL_DP_CTL_LRF) != MXC_PLL_DP_CTL_LRF); | ||
209 | return 0; | ||
210 | } | ||
211 | |||
212 | static void clk_pll_disable(struct clk *clk) | ||
213 | { | ||
214 | void __iomem *ctl; | ||
215 | u32 reg; | ||
216 | |||
217 | ctl = pll_base(clk); | ||
218 | reg = __raw_readl(ctl); | ||
219 | reg &= ~(MXC_PLL_DP_CTL_RST | MXC_PLL_DP_CTL_UPEN); | ||
220 | __raw_writel(reg, ctl); | ||
221 | } | ||
222 | |||
223 | static struct clk mcu_pll_clk = { | ||
224 | .parent = &ckih_clk, | ||
225 | .get_rate = clk_pll_get_rate, | ||
226 | .enable = clk_pll_enable, | ||
227 | .disable = clk_pll_disable, | ||
228 | }; | ||
229 | |||
230 | static struct clk dsp_pll_clk = { | ||
231 | .parent = &ckih_clk, | ||
232 | .get_rate = clk_pll_get_rate, | ||
233 | .enable = clk_pll_enable, | ||
234 | .disable = clk_pll_disable, | ||
235 | }; | ||
236 | |||
237 | static struct clk usb_pll_clk = { | ||
238 | .parent = &ckih_clk, | ||
239 | .get_rate = clk_pll_get_rate, | ||
240 | .enable = clk_pll_enable, | ||
241 | .disable = clk_pll_disable, | ||
242 | }; | ||
243 | /* plls stuff end */ | ||
244 | |||
245 | /* ap_ref_clk stuff */ | ||
246 | static struct clk ap_ref_clk; | ||
247 | |||
248 | static unsigned long clk_ap_ref_get_rate(struct clk *clk) | ||
249 | { | ||
250 | u32 ascsr, acsr; | ||
251 | u8 ap_pat_ref_div_2, ap_isel, acs, ads; | ||
252 | |||
253 | ascsr = __raw_readl(MXC_CRMAP_ASCSR); | ||
254 | acsr = __raw_readl(MXC_CRMAP_ACSR); | ||
255 | |||
256 | /* 0 for ckih, 1 for ckih*2 */ | ||
257 | ap_isel = ascsr & MXC_CRMAP_ASCSR_APISEL; | ||
258 | /* reg divider */ | ||
259 | ap_pat_ref_div_2 = (ascsr >> MXC_CRMAP_ASCSR_AP_PATDIV2_OFFSET) & 0x1; | ||
260 | /* undocumented, 1 for disabling divider */ | ||
261 | ads = (acsr >> MXC_CRMAP_ACSR_ADS_OFFSET) & 0x1; | ||
262 | /* 0 for pat_ref, 1 for divider out */ | ||
263 | acs = acsr & MXC_CRMAP_ACSR_ACS; | ||
264 | |||
265 | if (acs & !ads) | ||
266 | /* use divided clock */ | ||
267 | return clk_get_rate(clk->parent) / (ap_pat_ref_div_2 ? 2 : 1); | ||
268 | |||
269 | return clk_get_rate(clk->parent) * (ap_isel ? 2 : 1); | ||
270 | } | ||
271 | |||
272 | static struct clk ap_ref_clk = { | ||
273 | .parent = &ckih_clk, | ||
274 | .get_rate = clk_ap_ref_get_rate, | ||
275 | }; | ||
276 | /* ap_ref_clk stuff end */ | ||
277 | |||
278 | /* ap_pre_dfs_clk stuff */ | ||
279 | static struct clk ap_pre_dfs_clk; | ||
280 | |||
281 | static unsigned long clk_ap_pre_dfs_get_rate(struct clk *clk) | ||
282 | { | ||
283 | u32 acsr, ascsr; | ||
284 | |||
285 | acsr = __raw_readl(MXC_CRMAP_ACSR); | ||
286 | ascsr = __raw_readl(MXC_CRMAP_ASCSR); | ||
287 | |||
288 | if (acsr & MXC_CRMAP_ACSR_ACS) { | ||
289 | u8 sel; | ||
290 | sel = (ascsr & MXC_CRMAP_ASCSR_APSEL_MASK) >> | ||
291 | MXC_CRMAP_ASCSR_APSEL_OFFSET; | ||
292 | return clk_get_rate(pll_clk(sel)) / | ||
293 | CRM_SMALL_DIVIDER(MXC_CRMAP_ACDR, ARMDIV); | ||
294 | } | ||
295 | return clk_get_rate(&ap_ref_clk); | ||
296 | } | ||
297 | |||
298 | static struct clk ap_pre_dfs_clk = { | ||
299 | .get_rate = clk_ap_pre_dfs_get_rate, | ||
300 | }; | ||
301 | /* ap_pre_dfs_clk stuff end */ | ||
302 | |||
303 | /* usb_clk stuff */ | ||
304 | static struct clk usb_clk; | ||
305 | |||
306 | static struct clk *clk_usb_parent(struct clk *clk) | ||
307 | { | ||
308 | u32 acsr, ascsr; | ||
309 | |||
310 | acsr = __raw_readl(MXC_CRMAP_ACSR); | ||
311 | ascsr = __raw_readl(MXC_CRMAP_ASCSR); | ||
312 | |||
313 | if (acsr & MXC_CRMAP_ACSR_ACS) { | ||
314 | u8 sel; | ||
315 | sel = (ascsr & MXC_CRMAP_ASCSR_USBSEL_MASK) >> | ||
316 | MXC_CRMAP_ASCSR_USBSEL_OFFSET; | ||
317 | return pll_clk(sel); | ||
318 | } | ||
319 | return &ap_ref_clk; | ||
320 | } | ||
321 | |||
322 | static unsigned long clk_usb_get_rate(struct clk *clk) | ||
323 | { | ||
324 | return clk_get_rate(clk->parent) / | ||
325 | CRM_SMALL_DIVIDER(MXC_CRMAP_ACDER2, USBDIV); | ||
326 | } | ||
327 | |||
328 | static struct clk usb_clk = { | ||
329 | .enable_reg = MXC_CRMAP_ACDER2, | ||
330 | .enable_shift = MXC_CRMAP_ACDER2_USBEN_OFFSET, | ||
331 | .get_rate = clk_usb_get_rate, | ||
332 | .enable = _clk_1bit_enable, | ||
333 | .disable = _clk_1bit_disable, | ||
334 | }; | ||
335 | /* usb_clk stuff end */ | ||
336 | |||
337 | static unsigned long clk_ipg_get_rate(struct clk *clk) | ||
338 | { | ||
339 | return clk_get_rate(clk->parent) / CRM_16DIVIDER(MXC_CRMAP_ACDR, IPDIV); | ||
340 | } | ||
341 | |||
342 | static unsigned long clk_ahb_get_rate(struct clk *clk) | ||
343 | { | ||
344 | return clk_get_rate(clk->parent) / | ||
345 | CRM_16DIVIDER(MXC_CRMAP_ACDR, AHBDIV); | ||
346 | } | ||
347 | |||
348 | static struct clk ipg_clk = { | ||
349 | .parent = &ap_pre_dfs_clk, | ||
350 | .get_rate = clk_ipg_get_rate, | ||
351 | }; | ||
352 | |||
353 | static struct clk ahb_clk = { | ||
354 | .parent = &ap_pre_dfs_clk, | ||
355 | .get_rate = clk_ahb_get_rate, | ||
356 | }; | ||
357 | |||
358 | /* perclk_clk stuff */ | ||
359 | static struct clk perclk_clk; | ||
360 | |||
361 | static unsigned long clk_perclk_get_rate(struct clk *clk) | ||
362 | { | ||
363 | u32 acder2; | ||
364 | |||
365 | acder2 = __raw_readl(MXC_CRMAP_ACDER2); | ||
366 | if (acder2 & MXC_CRMAP_ACDER2_BAUD_ISEL_MASK) | ||
367 | return 2 * clk_get_rate(clk->parent); | ||
368 | |||
369 | return clk_get_rate(clk->parent); | ||
370 | } | ||
371 | |||
372 | static struct clk perclk_clk = { | ||
373 | .parent = &ckih_clk, | ||
374 | .get_rate = clk_perclk_get_rate, | ||
375 | }; | ||
376 | /* perclk_clk stuff end */ | ||
377 | |||
378 | /* uart_clk stuff */ | ||
379 | static struct clk uart_clk[]; | ||
380 | |||
381 | static unsigned long clk_uart_get_rate(struct clk *clk) | ||
382 | { | ||
383 | u32 div; | ||
384 | |||
385 | switch (clk->id) { | ||
386 | case 0: | ||
387 | case 1: | ||
388 | div = CRM_SMALL_DIVIDER(MXC_CRMAP_ACDER2, BAUDDIV); | ||
389 | break; | ||
390 | case 2: | ||
391 | div = CRM_SMALL_DIVIDER(MXC_CRMAP_APRA, UART3DIV); | ||
392 | break; | ||
393 | default: | ||
394 | BUG(); | ||
395 | } | ||
396 | return clk_get_rate(clk->parent) / div; | ||
397 | } | ||
398 | |||
399 | static struct clk uart_clk[] = { | ||
400 | { | ||
401 | .id = 0, | ||
402 | .parent = &perclk_clk, | ||
403 | .enable_reg = MXC_CRMAP_APRA, | ||
404 | .enable_shift = MXC_CRMAP_APRA_UART1EN_OFFSET, | ||
405 | .get_rate = clk_uart_get_rate, | ||
406 | .enable = _clk_1bit_enable, | ||
407 | .disable = _clk_1bit_disable, | ||
408 | }, { | ||
409 | .id = 1, | ||
410 | .parent = &perclk_clk, | ||
411 | .enable_reg = MXC_CRMAP_APRA, | ||
412 | .enable_shift = MXC_CRMAP_APRA_UART2EN_OFFSET, | ||
413 | .get_rate = clk_uart_get_rate, | ||
414 | .enable = _clk_1bit_enable, | ||
415 | .disable = _clk_1bit_disable, | ||
416 | }, { | ||
417 | .id = 2, | ||
418 | .parent = &perclk_clk, | ||
419 | .enable_reg = MXC_CRMAP_APRA, | ||
420 | .enable_shift = MXC_CRMAP_APRA_UART3EN_OFFSET, | ||
421 | .get_rate = clk_uart_get_rate, | ||
422 | .enable = _clk_1bit_enable, | ||
423 | .disable = _clk_1bit_disable, | ||
424 | }, | ||
425 | }; | ||
426 | /* uart_clk stuff end */ | ||
427 | |||
428 | /* sdhc_clk stuff */ | ||
429 | static struct clk nfc_clk; | ||
430 | |||
431 | static unsigned long clk_nfc_get_rate(struct clk *clk) | ||
432 | { | ||
433 | return clk_get_rate(clk->parent) / | ||
434 | CRM_1DIVIDER(MXC_CRMAP_ACDER2, NFCDIV); | ||
435 | } | ||
436 | |||
437 | static struct clk nfc_clk = { | ||
438 | .parent = &ahb_clk, | ||
439 | .enable_reg = MXC_CRMAP_ACDER2, | ||
440 | .enable_shift = MXC_CRMAP_ACDER2_NFCEN_OFFSET, | ||
441 | .get_rate = clk_nfc_get_rate, | ||
442 | .enable = _clk_1bit_enable, | ||
443 | .disable = _clk_1bit_disable, | ||
444 | }; | ||
445 | /* sdhc_clk stuff end */ | ||
446 | |||
447 | /* sdhc_clk stuff */ | ||
448 | static struct clk sdhc_clk[]; | ||
449 | |||
450 | static struct clk *clk_sdhc_parent(struct clk *clk) | ||
451 | { | ||
452 | u32 aprb; | ||
453 | u8 sel; | ||
454 | u32 mask; | ||
455 | int offset; | ||
456 | |||
457 | aprb = __raw_readl(MXC_CRMAP_APRB); | ||
458 | |||
459 | switch (clk->id) { | ||
460 | case 0: | ||
461 | mask = MXC_CRMAP_APRB_SDHC1_ISEL_MASK; | ||
462 | offset = MXC_CRMAP_APRB_SDHC1_ISEL_OFFSET; | ||
463 | break; | ||
464 | case 1: | ||
465 | mask = MXC_CRMAP_APRB_SDHC2_ISEL_MASK; | ||
466 | offset = MXC_CRMAP_APRB_SDHC2_ISEL_OFFSET; | ||
467 | break; | ||
468 | default: | ||
469 | BUG(); | ||
470 | } | ||
471 | sel = (aprb & mask) >> offset; | ||
472 | |||
473 | switch (sel) { | ||
474 | case 0: | ||
475 | return &ckih_clk; | ||
476 | case 1: | ||
477 | return &ckih_x2_clk; | ||
478 | } | ||
479 | return &usb_clk; | ||
480 | } | ||
481 | |||
482 | static unsigned long clk_sdhc_get_rate(struct clk *clk) | ||
483 | { | ||
484 | u32 div; | ||
485 | |||
486 | switch (clk->id) { | ||
487 | case 0: | ||
488 | div = CRM_SMALL_DIVIDER(MXC_CRMAP_APRB, SDHC1_DIV); | ||
489 | break; | ||
490 | case 1: | ||
491 | div = CRM_SMALL_DIVIDER(MXC_CRMAP_APRB, SDHC2_DIV); | ||
492 | break; | ||
493 | default: | ||
494 | BUG(); | ||
495 | } | ||
496 | |||
497 | return clk_get_rate(clk->parent) / div; | ||
498 | } | ||
499 | |||
500 | static int clk_sdhc_enable(struct clk *clk) | ||
501 | { | ||
502 | u32 amlpmre1, aprb; | ||
503 | |||
504 | amlpmre1 = __raw_readl(MXC_CRMAP_AMLPMRE1); | ||
505 | aprb = __raw_readl(MXC_CRMAP_APRB); | ||
506 | switch (clk->id) { | ||
507 | case 0: | ||
508 | amlpmre1 |= (0x7 << MXC_CRMAP_AMLPMRE1_MLPME4_OFFSET); | ||
509 | aprb |= (0x1 << MXC_CRMAP_APRB_SDHC1EN_OFFSET); | ||
510 | break; | ||
511 | case 1: | ||
512 | amlpmre1 |= (0x7 << MXC_CRMAP_AMLPMRE1_MLPME5_OFFSET); | ||
513 | aprb |= (0x1 << MXC_CRMAP_APRB_SDHC2EN_OFFSET); | ||
514 | break; | ||
515 | } | ||
516 | __raw_writel(amlpmre1, MXC_CRMAP_AMLPMRE1); | ||
517 | __raw_writel(aprb, MXC_CRMAP_APRB); | ||
518 | return 0; | ||
519 | } | ||
520 | |||
521 | static void clk_sdhc_disable(struct clk *clk) | ||
522 | { | ||
523 | u32 amlpmre1, aprb; | ||
524 | |||
525 | amlpmre1 = __raw_readl(MXC_CRMAP_AMLPMRE1); | ||
526 | aprb = __raw_readl(MXC_CRMAP_APRB); | ||
527 | switch (clk->id) { | ||
528 | case 0: | ||
529 | amlpmre1 &= ~(0x7 << MXC_CRMAP_AMLPMRE1_MLPME4_OFFSET); | ||
530 | aprb &= ~(0x1 << MXC_CRMAP_APRB_SDHC1EN_OFFSET); | ||
531 | break; | ||
532 | case 1: | ||
533 | amlpmre1 &= ~(0x7 << MXC_CRMAP_AMLPMRE1_MLPME5_OFFSET); | ||
534 | aprb &= ~(0x1 << MXC_CRMAP_APRB_SDHC2EN_OFFSET); | ||
535 | break; | ||
536 | } | ||
537 | __raw_writel(amlpmre1, MXC_CRMAP_AMLPMRE1); | ||
538 | __raw_writel(aprb, MXC_CRMAP_APRB); | ||
539 | } | ||
540 | |||
541 | static struct clk sdhc_clk[] = { | ||
542 | { | ||
543 | .id = 0, | ||
544 | .get_rate = clk_sdhc_get_rate, | ||
545 | .enable = clk_sdhc_enable, | ||
546 | .disable = clk_sdhc_disable, | ||
547 | }, { | ||
548 | .id = 1, | ||
549 | .get_rate = clk_sdhc_get_rate, | ||
550 | .enable = clk_sdhc_enable, | ||
551 | .disable = clk_sdhc_disable, | ||
552 | }, | ||
553 | }; | ||
554 | /* sdhc_clk stuff end */ | ||
555 | |||
556 | /* wdog_clk stuff */ | ||
557 | static struct clk wdog_clk[] = { | ||
558 | { | ||
559 | .id = 0, | ||
560 | .parent = &ipg_clk, | ||
561 | .enable_reg = MXC_CRMAP_AMLPMRD, | ||
562 | .enable_shift = MXC_CRMAP_AMLPMRD_MLPMD7_OFFSET, | ||
563 | .enable = _clk_3bit_enable, | ||
564 | .disable = _clk_3bit_disable, | ||
565 | }, { | ||
566 | .id = 1, | ||
567 | .parent = &ipg_clk, | ||
568 | .enable_reg = MXC_CRMAP_AMLPMRD, | ||
569 | .enable_shift = MXC_CRMAP_AMLPMRD_MLPMD3_OFFSET, | ||
570 | .enable = _clk_3bit_enable, | ||
571 | .disable = _clk_3bit_disable, | ||
572 | }, | ||
573 | }; | ||
574 | /* wdog_clk stuff end */ | ||
575 | |||
576 | /* gpt_clk stuff */ | ||
577 | static struct clk gpt_clk = { | ||
578 | .parent = &ipg_clk, | ||
579 | .enable_reg = MXC_CRMAP_AMLPMRC, | ||
580 | .enable_shift = MXC_CRMAP_AMLPMRC_MLPMC4_OFFSET, | ||
581 | .enable = _clk_3bit_enable, | ||
582 | .disable = _clk_3bit_disable, | ||
583 | }; | ||
584 | /* gpt_clk stuff end */ | ||
585 | |||
586 | /* cspi_clk stuff */ | ||
587 | static struct clk cspi_clk[] = { | ||
588 | { | ||
589 | .id = 0, | ||
590 | .parent = &ipg_clk, | ||
591 | .enable_reg = MXC_CRMAP_AMLPMRE2, | ||
592 | .enable_shift = MXC_CRMAP_AMLPMRE2_MLPME0_OFFSET, | ||
593 | .enable = _clk_3bit_enable, | ||
594 | .disable = _clk_3bit_disable, | ||
595 | }, { | ||
596 | .id = 1, | ||
597 | .parent = &ipg_clk, | ||
598 | .enable_reg = MXC_CRMAP_AMLPMRE1, | ||
599 | .enable_shift = MXC_CRMAP_AMLPMRE1_MLPME6_OFFSET, | ||
600 | .enable = _clk_3bit_enable, | ||
601 | .disable = _clk_3bit_disable, | ||
602 | }, | ||
603 | }; | ||
604 | /* cspi_clk stuff end */ | ||
605 | |||
606 | #define _REGISTER_CLOCK(d, n, c) \ | ||
607 | { \ | ||
608 | .dev_id = d, \ | ||
609 | .con_id = n, \ | ||
610 | .clk = &c, \ | ||
611 | }, | ||
612 | |||
613 | static struct clk_lookup lookups[] = { | ||
614 | _REGISTER_CLOCK("imx-uart.0", NULL, uart_clk[0]) | ||
615 | _REGISTER_CLOCK("imx-uart.1", NULL, uart_clk[1]) | ||
616 | _REGISTER_CLOCK("imx-uart.2", NULL, uart_clk[2]) | ||
617 | _REGISTER_CLOCK("mxc-mmc.0", NULL, sdhc_clk[0]) | ||
618 | _REGISTER_CLOCK("mxc-mmc.1", NULL, sdhc_clk[1]) | ||
619 | _REGISTER_CLOCK("mxc-wdt.0", NULL, wdog_clk[0]) | ||
620 | _REGISTER_CLOCK("spi_imx.0", NULL, cspi_clk[0]) | ||
621 | _REGISTER_CLOCK("spi_imx.1", NULL, cspi_clk[1]) | ||
622 | }; | ||
623 | |||
624 | int __init mxc91231_clocks_init(unsigned long fref) | ||
625 | { | ||
626 | void __iomem *gpt_base; | ||
627 | int i; | ||
628 | |||
629 | ckih_rate = fref; | ||
630 | |||
631 | usb_clk.parent = clk_usb_parent(&usb_clk); | ||
632 | sdhc_clk[0].parent = clk_sdhc_parent(&sdhc_clk[0]); | ||
633 | sdhc_clk[1].parent = clk_sdhc_parent(&sdhc_clk[1]); | ||
634 | |||
635 | for (i = 0; i < ARRAY_SIZE(lookups); i++) | ||
636 | clkdev_add(&lookups[i]); | ||
637 | |||
638 | gpt_base = MXC91231_IO_ADDRESS(MXC91231_GPT1_BASE_ADDR); | ||
639 | mxc_timer_init(&gpt_clk, gpt_base, MXC91231_INT_GPT); | ||
640 | |||
641 | return 0; | ||
642 | } | ||
diff --git a/arch/arm/mach-mxc91231/crm_regs.h b/arch/arm/mach-mxc91231/crm_regs.h new file mode 100644 index 000000000000..ce4f59058189 --- /dev/null +++ b/arch/arm/mach-mxc91231/crm_regs.h | |||
@@ -0,0 +1,399 @@ | |||
1 | /* | ||
2 | * Copyright 2006 Freescale Semiconductor, Inc. | ||
3 | * Copyright 2006-2007 Motorola, Inc. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | * | ||
19 | */ | ||
20 | |||
21 | #ifndef _ARCH_ARM_MACH_MXC91231_CRM_REGS_H_ | ||
22 | #define _ARCH_ARM_MACH_MXC91231_CRM_REGS_H_ | ||
23 | |||
24 | #define CKIL_CLK_FREQ 32768 | ||
25 | |||
26 | #define MXC_CRM_AP_BASE MXC91231_IO_ADDRESS(MXC91231_CRM_AP_BASE_ADDR) | ||
27 | #define MXC_CRM_COM_BASE MXC91231_IO_ADDRESS(MXC91231_CRM_COM_BASE_ADDR) | ||
28 | #define MXC_DSM_BASE MXC91231_IO_ADDRESS(MXC91231_DSM_BASE_ADDR) | ||
29 | #define MXC_PLL0_BASE MXC91231_IO_ADDRESS(MXC91231_PLL0_BASE_ADDR) | ||
30 | #define MXC_PLL1_BASE MXC91231_IO_ADDRESS(MXC91231_PLL1_BASE_ADDR) | ||
31 | #define MXC_PLL2_BASE MXC91231_IO_ADDRESS(MXC91231_PLL2_BASE_ADDR) | ||
32 | #define MXC_CLKCTL_BASE MXC91231_IO_ADDRESS(MXC91231_CLKCTL_BASE_ADDR) | ||
33 | |||
34 | /* PLL Register Offsets */ | ||
35 | #define MXC_PLL_DP_CTL 0x00 | ||
36 | #define MXC_PLL_DP_CONFIG 0x04 | ||
37 | #define MXC_PLL_DP_OP 0x08 | ||
38 | #define MXC_PLL_DP_MFD 0x0C | ||
39 | #define MXC_PLL_DP_MFN 0x10 | ||
40 | #define MXC_PLL_DP_HFS_OP 0x1C | ||
41 | #define MXC_PLL_DP_HFS_MFD 0x20 | ||
42 | #define MXC_PLL_DP_HFS_MFN 0x24 | ||
43 | |||
44 | /* PLL Register Bit definitions */ | ||
45 | #define MXC_PLL_DP_CTL_DPDCK0_2_EN 0x1000 | ||
46 | #define MXC_PLL_DP_CTL_ADE 0x800 | ||
47 | #define MXC_PLL_DP_CTL_REF_CLK_DIV 0x400 | ||
48 | #define MXC_PLL_DP_CTL_HFSM 0x80 | ||
49 | #define MXC_PLL_DP_CTL_PRE 0x40 | ||
50 | #define MXC_PLL_DP_CTL_UPEN 0x20 | ||
51 | #define MXC_PLL_DP_CTL_RST 0x10 | ||
52 | #define MXC_PLL_DP_CTL_RCP 0x8 | ||
53 | #define MXC_PLL_DP_CTL_PLM 0x4 | ||
54 | #define MXC_PLL_DP_CTL_BRM0 0x2 | ||
55 | #define MXC_PLL_DP_CTL_LRF 0x1 | ||
56 | |||
57 | #define MXC_PLL_DP_OP_MFI_OFFSET 4 | ||
58 | #define MXC_PLL_DP_OP_MFI_MASK 0xF | ||
59 | #define MXC_PLL_DP_OP_PDF_OFFSET 0 | ||
60 | #define MXC_PLL_DP_OP_PDF_MASK 0xF | ||
61 | |||
62 | #define MXC_PLL_DP_MFD_OFFSET 0 | ||
63 | #define MXC_PLL_DP_MFD_MASK 0x7FFFFFF | ||
64 | |||
65 | #define MXC_PLL_DP_MFN_OFFSET 0 | ||
66 | #define MXC_PLL_DP_MFN_MASK 0x7FFFFFF | ||
67 | |||
68 | /* CRM AP Register Offsets */ | ||
69 | #define MXC_CRMAP_ASCSR (MXC_CRM_AP_BASE + 0x00) | ||
70 | #define MXC_CRMAP_ACDR (MXC_CRM_AP_BASE + 0x04) | ||
71 | #define MXC_CRMAP_ACDER1 (MXC_CRM_AP_BASE + 0x08) | ||
72 | #define MXC_CRMAP_ACDER2 (MXC_CRM_AP_BASE + 0x0C) | ||
73 | #define MXC_CRMAP_ACGCR (MXC_CRM_AP_BASE + 0x10) | ||
74 | #define MXC_CRMAP_ACCGCR (MXC_CRM_AP_BASE + 0x14) | ||
75 | #define MXC_CRMAP_AMLPMRA (MXC_CRM_AP_BASE + 0x18) | ||
76 | #define MXC_CRMAP_AMLPMRB (MXC_CRM_AP_BASE + 0x1C) | ||
77 | #define MXC_CRMAP_AMLPMRC (MXC_CRM_AP_BASE + 0x20) | ||
78 | #define MXC_CRMAP_AMLPMRD (MXC_CRM_AP_BASE + 0x24) | ||
79 | #define MXC_CRMAP_AMLPMRE1 (MXC_CRM_AP_BASE + 0x28) | ||
80 | #define MXC_CRMAP_AMLPMRE2 (MXC_CRM_AP_BASE + 0x2C) | ||
81 | #define MXC_CRMAP_AMLPMRF (MXC_CRM_AP_BASE + 0x30) | ||
82 | #define MXC_CRMAP_AMLPMRG (MXC_CRM_AP_BASE + 0x34) | ||
83 | #define MXC_CRMAP_APGCR (MXC_CRM_AP_BASE + 0x38) | ||
84 | #define MXC_CRMAP_ACSR (MXC_CRM_AP_BASE + 0x3C) | ||
85 | #define MXC_CRMAP_ADCR (MXC_CRM_AP_BASE + 0x40) | ||
86 | #define MXC_CRMAP_ACR (MXC_CRM_AP_BASE + 0x44) | ||
87 | #define MXC_CRMAP_AMCR (MXC_CRM_AP_BASE + 0x48) | ||
88 | #define MXC_CRMAP_APCR (MXC_CRM_AP_BASE + 0x4C) | ||
89 | #define MXC_CRMAP_AMORA (MXC_CRM_AP_BASE + 0x50) | ||
90 | #define MXC_CRMAP_AMORB (MXC_CRM_AP_BASE + 0x54) | ||
91 | #define MXC_CRMAP_AGPR (MXC_CRM_AP_BASE + 0x58) | ||
92 | #define MXC_CRMAP_APRA (MXC_CRM_AP_BASE + 0x5C) | ||
93 | #define MXC_CRMAP_APRB (MXC_CRM_AP_BASE + 0x60) | ||
94 | #define MXC_CRMAP_APOR (MXC_CRM_AP_BASE + 0x64) | ||
95 | #define MXC_CRMAP_ADFMR (MXC_CRM_AP_BASE + 0x68) | ||
96 | |||
97 | /* CRM AP Register Bit definitions */ | ||
98 | #define MXC_CRMAP_ASCSR_CRS 0x10000 | ||
99 | #define MXC_CRMAP_ASCSR_AP_PATDIV2_OFFSET 15 | ||
100 | #define MXC_CRMAP_ASCSR_AP_PATREF_DIV2 0x8000 | ||
101 | #define MXC_CRMAP_ASCSR_USBSEL_OFFSET 13 | ||
102 | #define MXC_CRMAP_ASCSR_USBSEL_MASK (0x3 << 13) | ||
103 | #define MXC_CRMAP_ASCSR_CSISEL_OFFSET 11 | ||
104 | #define MXC_CRMAP_ASCSR_CSISEL_MASK (0x3 << 11) | ||
105 | #define MXC_CRMAP_ASCSR_SSI2SEL_OFFSET 7 | ||
106 | #define MXC_CRMAP_ASCSR_SSI2SEL_MASK (0x3 << 7) | ||
107 | #define MXC_CRMAP_ASCSR_SSI1SEL_OFFSET 5 | ||
108 | #define MXC_CRMAP_ASCSR_SSI1SEL_MASK (0x3 << 5) | ||
109 | #define MXC_CRMAP_ASCSR_APSEL_OFFSET 3 | ||
110 | #define MXC_CRMAP_ASCSR_APSEL_MASK (0x3 << 3) | ||
111 | #define MXC_CRMAP_ASCSR_AP_PATDIV1_OFFSET 2 | ||
112 | #define MXC_CRMAP_ASCSR_AP_PATREF_DIV1 0x4 | ||
113 | #define MXC_CRMAP_ASCSR_APISEL 0x1 | ||
114 | |||
115 | #define MXC_CRMAP_ACDR_ARMDIV_OFFSET 8 | ||
116 | #define MXC_CRMAP_ACDR_ARMDIV_MASK (0xF << 8) | ||
117 | #define MXC_CRMAP_ACDR_AHBDIV_OFFSET 4 | ||
118 | #define MXC_CRMAP_ACDR_AHBDIV_MASK (0xF << 4) | ||
119 | #define MXC_CRMAP_ACDR_IPDIV_OFFSET 0 | ||
120 | #define MXC_CRMAP_ACDR_IPDIV_MASK 0xF | ||
121 | |||
122 | #define MXC_CRMAP_ACDER1_CSIEN_OFFSET 30 | ||
123 | #define MXC_CRMAP_ACDER1_CSIDIV_OFFSET 24 | ||
124 | #define MXC_CRMAP_ACDER1_CSIDIV_MASK (0x3F << 24) | ||
125 | #define MXC_CRMAP_ACDER1_SSI2EN_OFFSET 14 | ||
126 | #define MXC_CRMAP_ACDER1_SSI2DIV_OFFSET 8 | ||
127 | #define MXC_CRMAP_ACDER1_SSI2DIV_MASK (0x3F << 8) | ||
128 | #define MXC_CRMAP_ACDER1_SSI1EN_OFFSET 6 | ||
129 | #define MXC_CRMAP_ACDER1_SSI1DIV_OFFSET 0 | ||
130 | #define MXC_CRMAP_ACDER1_SSI1DIV_MASK 0x3F | ||
131 | |||
132 | #define MXC_CRMAP_ACDER2_CRCT_CLK_DIV_OFFSET 24 | ||
133 | #define MXC_CRMAP_ACDER2_CRCT_CLK_DIV_MASK (0x7 << 24) | ||
134 | #define MXC_CRMAP_ACDER2_NFCEN_OFFSET 20 | ||
135 | #define MXC_CRMAP_ACDER2_NFCDIV_OFFSET 16 | ||
136 | #define MXC_CRMAP_ACDER2_NFCDIV_MASK (0xF << 16) | ||
137 | #define MXC_CRMAP_ACDER2_USBEN_OFFSET 12 | ||
138 | #define MXC_CRMAP_ACDER2_USBDIV_OFFSET 8 | ||
139 | #define MXC_CRMAP_ACDER2_USBDIV_MASK (0xF << 8) | ||
140 | #define MXC_CRMAP_ACDER2_BAUD_ISEL_OFFSET 5 | ||
141 | #define MXC_CRMAP_ACDER2_BAUD_ISEL_MASK (0x3 << 5) | ||
142 | #define MXC_CRMAP_ACDER2_BAUDDIV_OFFSET 0 | ||
143 | #define MXC_CRMAP_ACDER2_BAUDDIV_MASK 0xF | ||
144 | |||
145 | #define MXC_CRMAP_AMLPMRA_MLPMA7_OFFSET 22 | ||
146 | #define MXC_CRMAP_AMLPMRA_MLPMA7_MASK (0x7 << 22) | ||
147 | #define MXC_CRMAP_AMLPMRA_MLPMA6_OFFSET 19 | ||
148 | #define MXC_CRMAP_AMLPMRA_MLPMA6_MASK (0x7 << 19) | ||
149 | #define MXC_CRMAP_AMLPMRA_MLPMA4_OFFSET 12 | ||
150 | #define MXC_CRMAP_AMLPMRA_MLPMA4_MASK (0x7 << 12) | ||
151 | #define MXC_CRMAP_AMLPMRA_MLPMA3_OFFSET 9 | ||
152 | #define MXC_CRMAP_AMLPMRA_MLPMA3_MASK (0x7 << 9) | ||
153 | #define MXC_CRMAP_AMLPMRA_MLPMA2_OFFSET 6 | ||
154 | #define MXC_CRMAP_AMLPMRA_MLPMA2_MASK (0x7 << 6) | ||
155 | #define MXC_CRMAP_AMLPMRA_MLPMA1_OFFSET 3 | ||
156 | #define MXC_CRMAP_AMLPMRA_MLPMA1_MASK (0x7 << 3) | ||
157 | |||
158 | #define MXC_CRMAP_AMLPMRB_MLPMB0_OFFSET 0 | ||
159 | #define MXC_CRMAP_AMLPMRB_MLPMB0_MASK 0x7 | ||
160 | |||
161 | #define MXC_CRMAP_AMLPMRC_MLPMC9_OFFSET 28 | ||
162 | #define MXC_CRMAP_AMLPMRC_MLPMC9_MASK (0x7 << 28) | ||
163 | #define MXC_CRMAP_AMLPMRC_MLPMC7_OFFSET 22 | ||
164 | #define MXC_CRMAP_AMLPMRC_MLPMC7_MASK (0x7 << 22) | ||
165 | #define MXC_CRMAP_AMLPMRC_MLPMC5_OFFSET 16 | ||
166 | #define MXC_CRMAP_AMLPMRC_MLPMC5_MASK (0x7 << 16) | ||
167 | #define MXC_CRMAP_AMLPMRC_MLPMC4_OFFSET 12 | ||
168 | #define MXC_CRMAP_AMLPMRC_MLPMC4_MASK (0x7 << 12) | ||
169 | #define MXC_CRMAP_AMLPMRC_MLPMC3_OFFSET 9 | ||
170 | #define MXC_CRMAP_AMLPMRC_MLPMC3_MASK (0x7 << 9) | ||
171 | #define MXC_CRMAP_AMLPMRC_MLPMC2_OFFSET 6 | ||
172 | #define MXC_CRMAP_AMLPMRC_MLPMC2_MASK (0x7 << 6) | ||
173 | #define MXC_CRMAP_AMLPMRC_MLPMC1_OFFSET 3 | ||
174 | #define MXC_CRMAP_AMLPMRC_MLPMC1_MASK (0x7 << 3) | ||
175 | #define MXC_CRMAP_AMLPMRC_MLPMC0_OFFSET 0 | ||
176 | #define MXC_CRMAP_AMLPMRC_MLPMC0_MASK 0x7 | ||
177 | |||
178 | #define MXC_CRMAP_AMLPMRD_MLPMD7_OFFSET 22 | ||
179 | #define MXC_CRMAP_AMLPMRD_MLPMD7_MASK (0x7 << 22) | ||
180 | #define MXC_CRMAP_AMLPMRD_MLPMD4_OFFSET 12 | ||
181 | #define MXC_CRMAP_AMLPMRD_MLPMD4_MASK (0x7 << 12) | ||
182 | #define MXC_CRMAP_AMLPMRD_MLPMD3_OFFSET 9 | ||
183 | #define MXC_CRMAP_AMLPMRD_MLPMD3_MASK (0x7 << 9) | ||
184 | #define MXC_CRMAP_AMLPMRD_MLPMD2_OFFSET 6 | ||
185 | #define MXC_CRMAP_AMLPMRD_MLPMD2_MASK (0x7 << 6) | ||
186 | #define MXC_CRMAP_AMLPMRD_MLPMD0_OFFSET 0 | ||
187 | #define MXC_CRMAP_AMLPMRD_MLPMD0_MASK 0x7 | ||
188 | |||
189 | #define MXC_CRMAP_AMLPMRE1_MLPME9_OFFSET 28 | ||
190 | #define MXC_CRMAP_AMLPMRE1_MLPME9_MASK (0x7 << 28) | ||
191 | #define MXC_CRMAP_AMLPMRE1_MLPME8_OFFSET 25 | ||
192 | #define MXC_CRMAP_AMLPMRE1_MLPME8_MASK (0x7 << 25) | ||
193 | #define MXC_CRMAP_AMLPMRE1_MLPME7_OFFSET 22 | ||
194 | #define MXC_CRMAP_AMLPMRE1_MLPME7_MASK (0x7 << 22) | ||
195 | #define MXC_CRMAP_AMLPMRE1_MLPME6_OFFSET 19 | ||
196 | #define MXC_CRMAP_AMLPMRE1_MLPME6_MASK (0x7 << 19) | ||
197 | #define MXC_CRMAP_AMLPMRE1_MLPME5_OFFSET 16 | ||
198 | #define MXC_CRMAP_AMLPMRE1_MLPME5_MASK (0x7 << 16) | ||
199 | #define MXC_CRMAP_AMLPMRE1_MLPME4_OFFSET 12 | ||
200 | #define MXC_CRMAP_AMLPMRE1_MLPME4_MASK (0x7 << 12) | ||
201 | #define MXC_CRMAP_AMLPMRE1_MLPME3_OFFSET 9 | ||
202 | #define MXC_CRMAP_AMLPMRE1_MLPME3_MASK (0x7 << 9) | ||
203 | #define MXC_CRMAP_AMLPMRE1_MLPME2_OFFSET 6 | ||
204 | #define MXC_CRMAP_AMLPMRE1_MLPME2_MASK (0x7 << 6) | ||
205 | #define MXC_CRMAP_AMLPMRE1_MLPME1_OFFSET 3 | ||
206 | #define MXC_CRMAP_AMLPMRE1_MLPME1_MASK (0x7 << 3) | ||
207 | #define MXC_CRMAP_AMLPMRE1_MLPME0_OFFSET 0 | ||
208 | #define MXC_CRMAP_AMLPMRE1_MLPME0_MASK 0x7 | ||
209 | |||
210 | #define MXC_CRMAP_AMLPMRE2_MLPME0_OFFSET 0 | ||
211 | #define MXC_CRMAP_AMLPMRE2_MLPME0_MASK 0x7 | ||
212 | |||
213 | #define MXC_CRMAP_AMLPMRF_MLPMF6_OFFSET 19 | ||
214 | #define MXC_CRMAP_AMLPMRF_MLPMF6_MASK (0x7 << 19) | ||
215 | #define MXC_CRMAP_AMLPMRF_MLPMF5_OFFSET 16 | ||
216 | #define MXC_CRMAP_AMLPMRF_MLPMF5_MASK (0x7 << 16) | ||
217 | #define MXC_CRMAP_AMLPMRF_MLPMF3_OFFSET 9 | ||
218 | #define MXC_CRMAP_AMLPMRF_MLPMF3_MASK (0x7 << 9) | ||
219 | #define MXC_CRMAP_AMLPMRF_MLPMF2_OFFSET 6 | ||
220 | #define MXC_CRMAP_AMLPMRF_MLPMF2_MASK (0x7 << 6) | ||
221 | #define MXC_CRMAP_AMLPMRF_MLPMF1_OFFSET 3 | ||
222 | #define MXC_CRMAP_AMLPMRF_MLPMF1_MASK (0x7 << 3) | ||
223 | #define MXC_CRMAP_AMLPMRF_MLPMF0_OFFSET 0 | ||
224 | #define MXC_CRMAP_AMLPMRF_MLPMF0_MASK (0x7 << 0) | ||
225 | |||
226 | #define MXC_CRMAP_AMLPMRG_MLPMG9_OFFSET 28 | ||
227 | #define MXC_CRMAP_AMLPMRG_MLPMG9_MASK (0x7 << 28) | ||
228 | #define MXC_CRMAP_AMLPMRG_MLPMG7_OFFSET 22 | ||
229 | #define MXC_CRMAP_AMLPMRG_MLPMG7_MASK (0x7 << 22) | ||
230 | #define MXC_CRMAP_AMLPMRG_MLPMG6_OFFSET 19 | ||
231 | #define MXC_CRMAP_AMLPMRG_MLPMG6_MASK (0x7 << 19) | ||
232 | #define MXC_CRMAP_AMLPMRG_MLPMG5_OFFSET 16 | ||
233 | #define MXC_CRMAP_AMLPMRG_MLPMG5_MASK (0x7 << 16) | ||
234 | #define MXC_CRMAP_AMLPMRG_MLPMG4_OFFSET 12 | ||
235 | #define MXC_CRMAP_AMLPMRG_MLPMG4_MASK (0x7 << 12) | ||
236 | #define MXC_CRMAP_AMLPMRG_MLPMG3_OFFSET 9 | ||
237 | #define MXC_CRMAP_AMLPMRG_MLPMG3_MASK (0x7 << 9) | ||
238 | #define MXC_CRMAP_AMLPMRG_MLPMG2_OFFSET 6 | ||
239 | #define MXC_CRMAP_AMLPMRG_MLPMG2_MASK (0x7 << 6) | ||
240 | #define MXC_CRMAP_AMLPMRG_MLPMG1_OFFSET 3 | ||
241 | #define MXC_CRMAP_AMLPMRG_MLPMG1_MASK (0x7 << 3) | ||
242 | #define MXC_CRMAP_AMLPMRG_MLPMG0_OFFSET 0 | ||
243 | #define MXC_CRMAP_AMLPMRG_MLPMG0_MASK 0x7 | ||
244 | |||
245 | #define MXC_CRMAP_AGPR_IPUPAD_OFFSET 20 | ||
246 | #define MXC_CRMAP_AGPR_IPUPAD_MASK (0x7 << 20) | ||
247 | |||
248 | #define MXC_CRMAP_APRA_EL1TEN_OFFSET 29 | ||
249 | #define MXC_CRMAP_APRA_SIMEN_OFFSET 24 | ||
250 | #define MXC_CRMAP_APRA_UART3DIV_OFFSET 17 | ||
251 | #define MXC_CRMAP_APRA_UART3DIV_MASK (0xF << 17) | ||
252 | #define MXC_CRMAP_APRA_UART3EN_OFFSET 16 | ||
253 | #define MXC_CRMAP_APRA_SAHARA_DIV2_CLKEN_OFFSET 14 | ||
254 | #define MXC_CRMAP_APRA_MQSPIEN_OFFSET 13 | ||
255 | #define MXC_CRMAP_APRA_UART2EN_OFFSET 8 | ||
256 | #define MXC_CRMAP_APRA_UART1EN_OFFSET 0 | ||
257 | |||
258 | #define MXC_CRMAP_APRB_SDHC2_ISEL_OFFSET 13 | ||
259 | #define MXC_CRMAP_APRB_SDHC2_ISEL_MASK (0x7 << 13) | ||
260 | #define MXC_CRMAP_APRB_SDHC2_DIV_OFFSET 9 | ||
261 | #define MXC_CRMAP_APRB_SDHC2_DIV_MASK (0xF << 9) | ||
262 | #define MXC_CRMAP_APRB_SDHC2EN_OFFSET 8 | ||
263 | #define MXC_CRMAP_APRB_SDHC1_ISEL_OFFSET 5 | ||
264 | #define MXC_CRMAP_APRB_SDHC1_ISEL_MASK (0x7 << 5) | ||
265 | #define MXC_CRMAP_APRB_SDHC1_DIV_OFFSET 1 | ||
266 | #define MXC_CRMAP_APRB_SDHC1_DIV_MASK (0xF << 1) | ||
267 | #define MXC_CRMAP_APRB_SDHC1EN_OFFSET 0 | ||
268 | |||
269 | #define MXC_CRMAP_ACSR_ADS_OFFSET 8 | ||
270 | #define MXC_CRMAP_ACSR_ADS (0x1 << 8) | ||
271 | #define MXC_CRMAP_ACSR_ACS 0x1 | ||
272 | |||
273 | #define MXC_CRMAP_ADCR_LFDF_0 (0x0 << 8) | ||
274 | #define MXC_CRMAP_ADCR_LFDF_2 (0x1 << 8) | ||
275 | #define MXC_CRMAP_ADCR_LFDF_4 (0x2 << 8) | ||
276 | #define MXC_CRMAP_ADCR_LFDF_8 (0x3 << 8) | ||
277 | #define MXC_CRMAP_ADCR_LFDF_OFFSET 8 | ||
278 | #define MXC_CRMAP_ADCR_LFDF_MASK (0x3 << 8) | ||
279 | #define MXC_CRMAP_ADCR_ALT_PLL 0x80 | ||
280 | #define MXC_CRMAP_ADCR_DFS_DIVEN 0x20 | ||
281 | #define MXC_CRMAP_ADCR_DIV_BYP 0x2 | ||
282 | #define MXC_CRMAP_ADCR_VSTAT 0x8 | ||
283 | #define MXC_CRMAP_ADCR_TSTAT 0x10 | ||
284 | #define MXC_CRMAP_ADCR_DVFS_VCTRL 0x10 | ||
285 | #define MXC_CRMAP_ADCR_CLK_ON 0x40 | ||
286 | |||
287 | #define MXC_CRMAP_ADFMR_FC_OFFSET 16 | ||
288 | #define MXC_CRMAP_ADFMR_FC_MASK (0x1F << 16) | ||
289 | #define MXC_CRMAP_ADFMR_MF_OFFSET 1 | ||
290 | #define MXC_CRMAP_ADFMR_MF_MASK (0x3FF << 1) | ||
291 | #define MXC_CRMAP_ADFMR_DFM_CLK_READY 0x1 | ||
292 | #define MXC_CRMAP_ADFMR_DFM_PWR_DOWN 0x8000 | ||
293 | |||
294 | #define MXC_CRMAP_ACR_CKOHS_HIGH (1 << 18) | ||
295 | #define MXC_CRMAP_ACR_CKOS_HIGH (1 << 16) | ||
296 | #define MXC_CRMAP_ACR_CKOHS_MASK (0x7 << 12) | ||
297 | #define MXC_CRMAP_ACR_CKOHD (1 << 11) | ||
298 | #define MXC_CRMAP_ACR_CKOHDIV_MASK (0xF << 8) | ||
299 | #define MXC_CRMAP_ACR_CKOHDIV_OFFSET 8 | ||
300 | #define MXC_CRMAP_ACR_CKOD (1 << 7) | ||
301 | #define MXC_CRMAP_ACR_CKOS_MASK (0x7 << 4) | ||
302 | |||
303 | /* AP Warm reset */ | ||
304 | #define MXC_CRMAP_AMCR_SW_AP (1 << 14) | ||
305 | |||
306 | /* Bit definitions of ACGCR in CRM_AP for tree level clock gating */ | ||
307 | #define MXC_CRMAP_ACGCR_ACG0_STOP_WAIT 0x00000001 | ||
308 | #define MXC_CRMAP_ACGCR_ACG0_STOP 0x00000003 | ||
309 | #define MXC_CRMAP_ACGCR_ACG0_RUN 0x00000007 | ||
310 | #define MXC_CRMAP_ACGCR_ACG0_DISABLED 0x00000000 | ||
311 | |||
312 | #define MXC_CRMAP_ACGCR_ACG1_STOP_WAIT 0x00000008 | ||
313 | #define MXC_CRMAP_ACGCR_ACG1_STOP 0x00000018 | ||
314 | #define MXC_CRMAP_ACGCR_ACG1_RUN 0x00000038 | ||
315 | #define MXC_CRMAP_ACGCR_ACG1_DISABLED 0x00000000 | ||
316 | |||
317 | #define MXC_CRMAP_ACGCR_ACG2_STOP_WAIT 0x00000040 | ||
318 | #define MXC_CRMAP_ACGCR_ACG2_STOP 0x000000C0 | ||
319 | #define MXC_CRMAP_ACGCR_ACG2_RUN 0x000001C0 | ||
320 | #define MXC_CRMAP_ACGCR_ACG2_DISABLED 0x00000000 | ||
321 | |||
322 | #define MXC_CRMAP_ACGCR_ACG3_STOP_WAIT 0x00000200 | ||
323 | #define MXC_CRMAP_ACGCR_ACG3_STOP 0x00000600 | ||
324 | #define MXC_CRMAP_ACGCR_ACG3_RUN 0x00000E00 | ||
325 | #define MXC_CRMAP_ACGCR_ACG3_DISABLED 0x00000000 | ||
326 | |||
327 | #define MXC_CRMAP_ACGCR_ACG4_STOP_WAIT 0x00001000 | ||
328 | #define MXC_CRMAP_ACGCR_ACG4_STOP 0x00003000 | ||
329 | #define MXC_CRMAP_ACGCR_ACG4_RUN 0x00007000 | ||
330 | #define MXC_CRMAP_ACGCR_ACG4_DISABLED 0x00000000 | ||
331 | |||
332 | #define MXC_CRMAP_ACGCR_ACG5_STOP_WAIT 0x00010000 | ||
333 | #define MXC_CRMAP_ACGCR_ACG5_STOP 0x00030000 | ||
334 | #define MXC_CRMAP_ACGCR_ACG5_RUN 0x00070000 | ||
335 | #define MXC_CRMAP_ACGCR_ACG5_DISABLED 0x00000000 | ||
336 | |||
337 | #define MXC_CRMAP_ACGCR_ACG6_STOP_WAIT 0x00080000 | ||
338 | #define MXC_CRMAP_ACGCR_ACG6_STOP 0x00180000 | ||
339 | #define MXC_CRMAP_ACGCR_ACG6_RUN 0x00380000 | ||
340 | #define MXC_CRMAP_ACGCR_ACG6_DISABLED 0x00000000 | ||
341 | |||
342 | #define NUM_GATE_CTRL 6 | ||
343 | |||
344 | /* CRM COM Register Offsets */ | ||
345 | #define MXC_CRMCOM_CSCR (MXC_CRM_COM_BASE + 0x0C) | ||
346 | #define MXC_CRMCOM_CCCR (MXC_CRM_COM_BASE + 0x10) | ||
347 | |||
348 | /* CRM COM Bit Definitions */ | ||
349 | #define MXC_CRMCOM_CSCR_PPD1 0x08000000 | ||
350 | #define MXC_CRMCOM_CSCR_CKOHSEL (1 << 18) | ||
351 | #define MXC_CRMCOM_CSCR_CKOSEL (1 << 17) | ||
352 | #define MXC_CRMCOM_CCCR_CC_DIV_OFFSET 8 | ||
353 | #define MXC_CRMCOM_CCCR_CC_DIV_MASK (0x1F << 8) | ||
354 | #define MXC_CRMCOM_CCCR_CC_SEL_OFFSET 0 | ||
355 | #define MXC_CRMCOM_CCCR_CC_SEL_MASK 0x3 | ||
356 | |||
357 | /* DSM Register Offsets */ | ||
358 | #define MXC_DSM_SLEEP_TIME (MXC_DSM_BASE + 0x0c) | ||
359 | #define MXC_DSM_CONTROL0 (MXC_DSM_BASE + 0x20) | ||
360 | #define MXC_DSM_CONTROL1 (MXC_DSM_BASE + 0x24) | ||
361 | #define MXC_DSM_CTREN (MXC_DSM_BASE + 0x28) | ||
362 | #define MXC_DSM_WARM_PER (MXC_DSM_BASE + 0x40) | ||
363 | #define MXC_DSM_LOCK_PER (MXC_DSM_BASE + 0x44) | ||
364 | #define MXC_DSM_MGPER (MXC_DSM_BASE + 0x4c) | ||
365 | #define MXC_DSM_CRM_CONTROL (MXC_DSM_BASE + 0x50) | ||
366 | |||
367 | /* Bit definitions of various registers in DSM */ | ||
368 | #define MXC_DSM_CRM_CTRL_DVFS_BYP 0x00000008 | ||
369 | #define MXC_DSM_CRM_CTRL_DVFS_VCTRL 0x00000004 | ||
370 | #define MXC_DSM_CRM_CTRL_LPMD1 0x00000002 | ||
371 | #define MXC_DSM_CRM_CTRL_LPMD0 0x00000001 | ||
372 | #define MXC_DSM_CRM_CTRL_LPMD_STOP_MODE 0x00000000 | ||
373 | #define MXC_DSM_CRM_CTRL_LPMD_WAIT_MODE 0x00000001 | ||
374 | #define MXC_DSM_CRM_CTRL_LPMD_RUN_MODE 0x00000003 | ||
375 | #define MXC_DSM_CONTROL0_STBY_COMMIT_EN 0x00000200 | ||
376 | #define MXC_DSM_CONTROL0_MSTR_EN 0x00000001 | ||
377 | #define MXC_DSM_CONTROL0_RESTART 0x00000010 | ||
378 | /* Counter Block reset */ | ||
379 | #define MXC_DSM_CONTROL1_CB_RST 0x00000002 | ||
380 | /* State Machine reset */ | ||
381 | #define MXC_DSM_CONTROL1_SM_RST 0x00000004 | ||
382 | /* Bit needed to reset counter block */ | ||
383 | #define MXC_CONTROL1_RST_CNT32 0x00000008 | ||
384 | #define MXC_DSM_CONTROL1_RST_CNT32_EN 0x00000800 | ||
385 | #define MXC_DSM_CONTROL1_SLEEP 0x00000100 | ||
386 | #define MXC_DSM_CONTROL1_WAKEUP_DISABLE 0x00004000 | ||
387 | #define MXC_DSM_CTREN_CNT32 0x00000001 | ||
388 | |||
389 | /* Magic Fix enable bit */ | ||
390 | #define MXC_DSM_MGPER_EN_MGFX 0x80000000 | ||
391 | #define MXC_DSM_MGPER_PER_MASK 0x000003FF | ||
392 | #define MXC_DSM_MGPER_PER(n) (MXC_DSM_MGPER_PER_MASK & n) | ||
393 | |||
394 | /* Address offsets of the CLKCTL registers */ | ||
395 | #define MXC_CLKCTL_GP_CTRL (MXC_CLKCTL_BASE + 0x00) | ||
396 | #define MXC_CLKCTL_GP_SER (MXC_CLKCTL_BASE + 0x04) | ||
397 | #define MXC_CLKCTL_GP_CER (MXC_CLKCTL_BASE + 0x08) | ||
398 | |||
399 | #endif /* _ARCH_ARM_MACH_MXC91231_CRM_REGS_H_ */ | ||
diff --git a/arch/arm/mach-mxc91231/devices.c b/arch/arm/mach-mxc91231/devices.c new file mode 100644 index 000000000000..353bd977b393 --- /dev/null +++ b/arch/arm/mach-mxc91231/devices.c | |||
@@ -0,0 +1,251 @@ | |||
1 | /* | ||
2 | * Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * Copyright 2008 Sascha Hauer, kernel@pengutronix.de | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License | ||
7 | * as published by the Free Software Foundation; either version 2 | ||
8 | * of the License, or (at your option) any later version. | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
17 | * Boston, MA 02110-1301, USA. | ||
18 | */ | ||
19 | |||
20 | #include <linux/module.h> | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/serial.h> | ||
23 | #include <linux/gpio.h> | ||
24 | #include <mach/hardware.h> | ||
25 | #include <mach/irqs.h> | ||
26 | #include <mach/imx-uart.h> | ||
27 | |||
28 | static struct resource uart0[] = { | ||
29 | { | ||
30 | .start = MXC91231_UART1_BASE_ADDR, | ||
31 | .end = MXC91231_UART1_BASE_ADDR + 0x0B5, | ||
32 | .flags = IORESOURCE_MEM, | ||
33 | }, { | ||
34 | .start = MXC91231_INT_UART1_RX, | ||
35 | .end = MXC91231_INT_UART1_RX, | ||
36 | .flags = IORESOURCE_IRQ, | ||
37 | }, { | ||
38 | .start = MXC91231_INT_UART1_TX, | ||
39 | .end = MXC91231_INT_UART1_TX, | ||
40 | .flags = IORESOURCE_IRQ, | ||
41 | }, { | ||
42 | .start = MXC91231_INT_UART1_MINT, | ||
43 | .end = MXC91231_INT_UART1_MINT, | ||
44 | .flags = IORESOURCE_IRQ, | ||
45 | }, | ||
46 | }; | ||
47 | |||
48 | struct platform_device mxc_uart_device0 = { | ||
49 | .name = "imx-uart", | ||
50 | .id = 0, | ||
51 | .resource = uart0, | ||
52 | .num_resources = ARRAY_SIZE(uart0), | ||
53 | }; | ||
54 | |||
55 | static struct resource uart1[] = { | ||
56 | { | ||
57 | .start = MXC91231_UART2_BASE_ADDR, | ||
58 | .end = MXC91231_UART2_BASE_ADDR + 0x0B5, | ||
59 | .flags = IORESOURCE_MEM, | ||
60 | }, { | ||
61 | .start = MXC91231_INT_UART2_RX, | ||
62 | .end = MXC91231_INT_UART2_RX, | ||
63 | .flags = IORESOURCE_IRQ, | ||
64 | }, { | ||
65 | .start = MXC91231_INT_UART2_TX, | ||
66 | .end = MXC91231_INT_UART2_TX, | ||
67 | .flags = IORESOURCE_IRQ, | ||
68 | }, { | ||
69 | .start = MXC91231_INT_UART2_MINT, | ||
70 | .end = MXC91231_INT_UART2_MINT, | ||
71 | .flags = IORESOURCE_IRQ, | ||
72 | }, | ||
73 | }; | ||
74 | |||
75 | struct platform_device mxc_uart_device1 = { | ||
76 | .name = "imx-uart", | ||
77 | .id = 1, | ||
78 | .resource = uart1, | ||
79 | .num_resources = ARRAY_SIZE(uart1), | ||
80 | }; | ||
81 | |||
82 | static struct resource uart2[] = { | ||
83 | { | ||
84 | .start = MXC91231_UART3_BASE_ADDR, | ||
85 | .end = MXC91231_UART3_BASE_ADDR + 0x0B5, | ||
86 | .flags = IORESOURCE_MEM, | ||
87 | }, { | ||
88 | .start = MXC91231_INT_UART3_RX, | ||
89 | .end = MXC91231_INT_UART3_RX, | ||
90 | .flags = IORESOURCE_IRQ, | ||
91 | }, { | ||
92 | .start = MXC91231_INT_UART3_TX, | ||
93 | .end = MXC91231_INT_UART3_TX, | ||
94 | .flags = IORESOURCE_IRQ, | ||
95 | }, { | ||
96 | .start = MXC91231_INT_UART3_MINT, | ||
97 | .end = MXC91231_INT_UART3_MINT, | ||
98 | .flags = IORESOURCE_IRQ, | ||
99 | |||
100 | }, | ||
101 | }; | ||
102 | |||
103 | struct platform_device mxc_uart_device2 = { | ||
104 | .name = "imx-uart", | ||
105 | .id = 2, | ||
106 | .resource = uart2, | ||
107 | .num_resources = ARRAY_SIZE(uart2), | ||
108 | }; | ||
109 | |||
110 | /* GPIO port description */ | ||
111 | static struct mxc_gpio_port mxc_gpio_ports[] = { | ||
112 | [0] = { | ||
113 | .chip.label = "gpio-0", | ||
114 | .base = MXC91231_IO_ADDRESS(MXC91231_GPIO1_AP_BASE_ADDR), | ||
115 | .irq = MXC91231_INT_GPIO1, | ||
116 | .virtual_irq_start = MXC_GPIO_IRQ_START, | ||
117 | }, | ||
118 | [1] = { | ||
119 | .chip.label = "gpio-1", | ||
120 | .base = MXC91231_IO_ADDRESS(MXC91231_GPIO2_AP_BASE_ADDR), | ||
121 | .irq = MXC91231_INT_GPIO2, | ||
122 | .virtual_irq_start = MXC_GPIO_IRQ_START + 32, | ||
123 | }, | ||
124 | [2] = { | ||
125 | .chip.label = "gpio-2", | ||
126 | .base = MXC91231_IO_ADDRESS(MXC91231_GPIO3_AP_BASE_ADDR), | ||
127 | .irq = MXC91231_INT_GPIO3, | ||
128 | .virtual_irq_start = MXC_GPIO_IRQ_START + 64, | ||
129 | }, | ||
130 | [3] = { | ||
131 | .chip.label = "gpio-3", | ||
132 | .base = MXC91231_IO_ADDRESS(MXC91231_GPIO4_SH_BASE_ADDR), | ||
133 | .irq = MXC91231_INT_GPIO4, | ||
134 | .virtual_irq_start = MXC_GPIO_IRQ_START + 96, | ||
135 | }, | ||
136 | }; | ||
137 | |||
138 | int __init mxc_register_gpios(void) | ||
139 | { | ||
140 | return mxc_gpio_init(mxc_gpio_ports, ARRAY_SIZE(mxc_gpio_ports)); | ||
141 | } | ||
142 | |||
143 | static struct resource mxc_nand_resources[] = { | ||
144 | { | ||
145 | .start = MXC91231_NFC_BASE_ADDR, | ||
146 | .end = MXC91231_NFC_BASE_ADDR + 0xfff, | ||
147 | .flags = IORESOURCE_MEM | ||
148 | }, { | ||
149 | .start = MXC91231_INT_NANDFC, | ||
150 | .end = MXC91231_INT_NANDFC, | ||
151 | .flags = IORESOURCE_IRQ | ||
152 | }, | ||
153 | }; | ||
154 | |||
155 | struct platform_device mxc_nand_device = { | ||
156 | .name = "mxc_nand", | ||
157 | .id = 0, | ||
158 | .num_resources = ARRAY_SIZE(mxc_nand_resources), | ||
159 | .resource = mxc_nand_resources, | ||
160 | }; | ||
161 | |||
162 | static struct resource mxc_sdhc0_resources[] = { | ||
163 | { | ||
164 | .start = MXC91231_MMC_SDHC1_BASE_ADDR, | ||
165 | .end = MXC91231_MMC_SDHC1_BASE_ADDR + SZ_16K - 1, | ||
166 | .flags = IORESOURCE_MEM, | ||
167 | }, { | ||
168 | .start = MXC91231_INT_MMC_SDHC1, | ||
169 | .end = MXC91231_INT_MMC_SDHC1, | ||
170 | .flags = IORESOURCE_IRQ, | ||
171 | }, | ||
172 | }; | ||
173 | |||
174 | static struct resource mxc_sdhc1_resources[] = { | ||
175 | { | ||
176 | .start = MXC91231_MMC_SDHC2_BASE_ADDR, | ||
177 | .end = MXC91231_MMC_SDHC2_BASE_ADDR + SZ_16K - 1, | ||
178 | .flags = IORESOURCE_MEM, | ||
179 | }, { | ||
180 | .start = MXC91231_INT_MMC_SDHC2, | ||
181 | .end = MXC91231_INT_MMC_SDHC2, | ||
182 | .flags = IORESOURCE_IRQ, | ||
183 | }, | ||
184 | }; | ||
185 | |||
186 | struct platform_device mxc_sdhc_device0 = { | ||
187 | .name = "mxc-mmc", | ||
188 | .id = 0, | ||
189 | .num_resources = ARRAY_SIZE(mxc_sdhc0_resources), | ||
190 | .resource = mxc_sdhc0_resources, | ||
191 | }; | ||
192 | |||
193 | struct platform_device mxc_sdhc_device1 = { | ||
194 | .name = "mxc-mmc", | ||
195 | .id = 1, | ||
196 | .num_resources = ARRAY_SIZE(mxc_sdhc1_resources), | ||
197 | .resource = mxc_sdhc1_resources, | ||
198 | }; | ||
199 | |||
200 | static struct resource mxc_cspi0_resources[] = { | ||
201 | { | ||
202 | .start = MXC91231_CSPI1_BASE_ADDR, | ||
203 | .end = MXC91231_CSPI1_BASE_ADDR + 0x20, | ||
204 | .flags = IORESOURCE_MEM, | ||
205 | }, { | ||
206 | .start = MXC91231_INT_CSPI1, | ||
207 | .end = MXC91231_INT_CSPI1, | ||
208 | .flags = IORESOURCE_IRQ, | ||
209 | }, | ||
210 | }; | ||
211 | |||
212 | struct platform_device mxc_cspi_device0 = { | ||
213 | .name = "spi_imx", | ||
214 | .id = 0, | ||
215 | .num_resources = ARRAY_SIZE(mxc_cspi0_resources), | ||
216 | .resource = mxc_cspi0_resources, | ||
217 | }; | ||
218 | |||
219 | static struct resource mxc_cspi1_resources[] = { | ||
220 | { | ||
221 | .start = MXC91231_CSPI2_BASE_ADDR, | ||
222 | .end = MXC91231_CSPI2_BASE_ADDR + 0x20, | ||
223 | .flags = IORESOURCE_MEM, | ||
224 | }, { | ||
225 | .start = MXC91231_INT_CSPI2, | ||
226 | .end = MXC91231_INT_CSPI2, | ||
227 | .flags = IORESOURCE_IRQ, | ||
228 | }, | ||
229 | }; | ||
230 | |||
231 | struct platform_device mxc_cspi_device1 = { | ||
232 | .name = "spi_imx", | ||
233 | .id = 1, | ||
234 | .num_resources = ARRAY_SIZE(mxc_cspi1_resources), | ||
235 | .resource = mxc_cspi1_resources, | ||
236 | }; | ||
237 | |||
238 | static struct resource mxc_wdog0_resources[] = { | ||
239 | { | ||
240 | .start = MXC91231_WDOG1_BASE_ADDR, | ||
241 | .end = MXC91231_WDOG1_BASE_ADDR + 0x10, | ||
242 | .flags = IORESOURCE_MEM, | ||
243 | }, | ||
244 | }; | ||
245 | |||
246 | struct platform_device mxc_wdog_device0 = { | ||
247 | .name = "mxc-wdt", | ||
248 | .id = 0, | ||
249 | .num_resources = ARRAY_SIZE(mxc_wdog0_resources), | ||
250 | .resource = mxc_wdog0_resources, | ||
251 | }; | ||
diff --git a/arch/arm/mach-mxc91231/devices.h b/arch/arm/mach-mxc91231/devices.h new file mode 100644 index 000000000000..72a2136ce27d --- /dev/null +++ b/arch/arm/mach-mxc91231/devices.h | |||
@@ -0,0 +1,13 @@ | |||
1 | extern struct platform_device mxc_uart_device0; | ||
2 | extern struct platform_device mxc_uart_device1; | ||
3 | extern struct platform_device mxc_uart_device2; | ||
4 | |||
5 | extern struct platform_device mxc_nand_device; | ||
6 | |||
7 | extern struct platform_device mxc_sdhc_device0; | ||
8 | extern struct platform_device mxc_sdhc_device1; | ||
9 | |||
10 | extern struct platform_device mxc_cspi_device0; | ||
11 | extern struct platform_device mxc_cspi_device1; | ||
12 | |||
13 | extern struct platform_device mxc_wdog_device0; | ||
diff --git a/arch/arm/mach-mxc91231/iomux.c b/arch/arm/mach-mxc91231/iomux.c new file mode 100644 index 000000000000..405d9b19d891 --- /dev/null +++ b/arch/arm/mach-mxc91231/iomux.c | |||
@@ -0,0 +1,177 @@ | |||
1 | /* | ||
2 | * Copyright 2004-2006 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * Copyright (C) 2008 by Sascha Hauer <kernel@pengutronix.de> | ||
4 | * Copyright (C) 2009 by Valentin Longchamp <valentin.longchamp@epfl.ch> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version 2 | ||
9 | * of the License, or (at your option) any later version. | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
18 | * MA 02110-1301, USA. | ||
19 | */ | ||
20 | |||
21 | #include <linux/module.h> | ||
22 | #include <linux/spinlock.h> | ||
23 | #include <linux/io.h> | ||
24 | #include <linux/kernel.h> | ||
25 | #include <mach/hardware.h> | ||
26 | #include <mach/gpio.h> | ||
27 | #include <mach/iomux-mxc91231.h> | ||
28 | |||
29 | /* | ||
30 | * IOMUX register (base) addresses | ||
31 | */ | ||
32 | #define IOMUX_AP_BASE MXC91231_IO_ADDRESS(MXC91231_IOMUX_AP_BASE_ADDR) | ||
33 | #define IOMUX_COM_BASE MXC91231_IO_ADDRESS(MXC91231_IOMUX_COM_BASE_ADDR) | ||
34 | #define IOMUXSW_AP_MUX_CTL (IOMUX_AP_BASE + 0x000) | ||
35 | #define IOMUXSW_SP_MUX_CTL (IOMUX_COM_BASE + 0x000) | ||
36 | #define IOMUXSW_PAD_CTL (IOMUX_COM_BASE + 0x200) | ||
37 | |||
38 | #define IOMUXINT_OBS1 (IOMUX_AP_BASE + 0x600) | ||
39 | #define IOMUXINT_OBS2 (IOMUX_AP_BASE + 0x004) | ||
40 | |||
41 | static DEFINE_SPINLOCK(gpio_mux_lock); | ||
42 | |||
43 | #define NB_PORTS ((PIN_MAX + 32) / 32) | ||
44 | #define PIN_GLOBAL_NUM(pin) \ | ||
45 | (((pin & MUX_SIDE_MASK) >> MUX_SIDE_SHIFT)*PIN_AP_MAX + \ | ||
46 | ((pin & MUX_REG_MASK) >> MUX_REG_SHIFT)*4 + \ | ||
47 | ((pin & MUX_FIELD_MASK) >> MUX_FIELD_SHIFT)) | ||
48 | |||
49 | unsigned long mxc_pin_alloc_map[NB_PORTS * 32 / BITS_PER_LONG]; | ||
50 | /* | ||
51 | * set the mode for a IOMUX pin. | ||
52 | */ | ||
53 | int mxc_iomux_mode(const unsigned int pin_mode) | ||
54 | { | ||
55 | u32 side, field, l, mode, ret = 0; | ||
56 | void __iomem *reg; | ||
57 | |||
58 | side = (pin_mode & MUX_SIDE_MASK) >> MUX_SIDE_SHIFT; | ||
59 | switch (side) { | ||
60 | case MUX_SIDE_AP: | ||
61 | reg = IOMUXSW_AP_MUX_CTL; | ||
62 | break; | ||
63 | case MUX_SIDE_SP: | ||
64 | reg = IOMUXSW_SP_MUX_CTL; | ||
65 | break; | ||
66 | default: | ||
67 | return -EINVAL; | ||
68 | } | ||
69 | reg += ((pin_mode & MUX_REG_MASK) >> MUX_REG_SHIFT) * 4; | ||
70 | field = (pin_mode & MUX_FIELD_MASK) >> MUX_FIELD_SHIFT; | ||
71 | mode = (pin_mode & MUX_MODE_MASK) >> MUX_MODE_SHIFT; | ||
72 | |||
73 | spin_lock(&gpio_mux_lock); | ||
74 | |||
75 | l = __raw_readl(reg); | ||
76 | l &= ~(0xff << (field * 8)); | ||
77 | l |= mode << (field * 8); | ||
78 | __raw_writel(l, reg); | ||
79 | |||
80 | spin_unlock(&gpio_mux_lock); | ||
81 | |||
82 | return ret; | ||
83 | } | ||
84 | EXPORT_SYMBOL(mxc_iomux_mode); | ||
85 | |||
86 | /* | ||
87 | * This function configures the pad value for a IOMUX pin. | ||
88 | */ | ||
89 | void mxc_iomux_set_pad(enum iomux_pins pin, u32 config) | ||
90 | { | ||
91 | u32 padgrp, field, l; | ||
92 | void __iomem *reg; | ||
93 | |||
94 | padgrp = (pin & MUX_PADGRP_MASK) >> MUX_PADGRP_SHIFT; | ||
95 | reg = IOMUXSW_PAD_CTL + (pin + 2) / 3 * 4; | ||
96 | field = (pin + 2) % 3; | ||
97 | |||
98 | pr_debug("%s: reg offset = 0x%x, field = %d\n", | ||
99 | __func__, (pin + 2) / 3, field); | ||
100 | |||
101 | spin_lock(&gpio_mux_lock); | ||
102 | |||
103 | l = __raw_readl(reg); | ||
104 | l &= ~(0x1ff << (field * 10)); | ||
105 | l |= config << (field * 10); | ||
106 | __raw_writel(l, reg); | ||
107 | |||
108 | spin_unlock(&gpio_mux_lock); | ||
109 | } | ||
110 | EXPORT_SYMBOL(mxc_iomux_set_pad); | ||
111 | |||
112 | /* | ||
113 | * allocs a single pin: | ||
114 | * - reserves the pin so that it is not claimed by another driver | ||
115 | * - setups the iomux according to the configuration | ||
116 | */ | ||
117 | int mxc_iomux_alloc_pin(const unsigned int pin_mode, const char *label) | ||
118 | { | ||
119 | unsigned pad = PIN_GLOBAL_NUM(pin_mode); | ||
120 | if (pad >= (PIN_MAX + 1)) { | ||
121 | printk(KERN_ERR "mxc_iomux: Attempt to request nonexistant pin %u for \"%s\"\n", | ||
122 | pad, label ? label : "?"); | ||
123 | return -EINVAL; | ||
124 | } | ||
125 | |||
126 | if (test_and_set_bit(pad, mxc_pin_alloc_map)) { | ||
127 | printk(KERN_ERR "mxc_iomux: pin %u already used. Allocation for \"%s\" failed\n", | ||
128 | pad, label ? label : "?"); | ||
129 | return -EBUSY; | ||
130 | } | ||
131 | mxc_iomux_mode(pin_mode); | ||
132 | |||
133 | return 0; | ||
134 | } | ||
135 | EXPORT_SYMBOL(mxc_iomux_alloc_pin); | ||
136 | |||
137 | int mxc_iomux_setup_multiple_pins(unsigned int *pin_list, unsigned count, | ||
138 | const char *label) | ||
139 | { | ||
140 | unsigned int *p = pin_list; | ||
141 | int i; | ||
142 | int ret = -EINVAL; | ||
143 | |||
144 | for (i = 0; i < count; i++) { | ||
145 | ret = mxc_iomux_alloc_pin(*p, label); | ||
146 | if (ret) | ||
147 | goto setup_error; | ||
148 | p++; | ||
149 | } | ||
150 | return 0; | ||
151 | |||
152 | setup_error: | ||
153 | mxc_iomux_release_multiple_pins(pin_list, i); | ||
154 | return ret; | ||
155 | } | ||
156 | EXPORT_SYMBOL(mxc_iomux_setup_multiple_pins); | ||
157 | |||
158 | void mxc_iomux_release_pin(const unsigned int pin_mode) | ||
159 | { | ||
160 | unsigned pad = PIN_GLOBAL_NUM(pin_mode); | ||
161 | |||
162 | if (pad < (PIN_MAX + 1)) | ||
163 | clear_bit(pad, mxc_pin_alloc_map); | ||
164 | } | ||
165 | EXPORT_SYMBOL(mxc_iomux_release_pin); | ||
166 | |||
167 | void mxc_iomux_release_multiple_pins(unsigned int *pin_list, int count) | ||
168 | { | ||
169 | unsigned int *p = pin_list; | ||
170 | int i; | ||
171 | |||
172 | for (i = 0; i < count; i++) { | ||
173 | mxc_iomux_release_pin(*p); | ||
174 | p++; | ||
175 | } | ||
176 | } | ||
177 | EXPORT_SYMBOL(mxc_iomux_release_multiple_pins); | ||
diff --git a/arch/arm/mach-mxc91231/magx-zn5.c b/arch/arm/mach-mxc91231/magx-zn5.c new file mode 100644 index 000000000000..7dbe4ca12efd --- /dev/null +++ b/arch/arm/mach-mxc91231/magx-zn5.c | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | * Copyright 2009 Dmitriy Taychenachev <dimichxp@gmail.com> | ||
3 | * | ||
4 | * This file is released under the GPLv2 or later. | ||
5 | */ | ||
6 | |||
7 | #include <linux/irq.h> | ||
8 | #include <linux/init.h> | ||
9 | #include <linux/device.h> | ||
10 | |||
11 | #include <asm/mach-types.h> | ||
12 | #include <asm/mach/time.h> | ||
13 | #include <asm/mach/arch.h> | ||
14 | |||
15 | #include <mach/common.h> | ||
16 | #include <mach/hardware.h> | ||
17 | #include <mach/iomux-mxc91231.h> | ||
18 | #include <mach/mmc.h> | ||
19 | #include <mach/imx-uart.h> | ||
20 | |||
21 | #include "devices.h" | ||
22 | |||
23 | static struct imxuart_platform_data uart_pdata = { | ||
24 | }; | ||
25 | |||
26 | static struct imxmmc_platform_data sdhc_pdata = { | ||
27 | }; | ||
28 | |||
29 | static void __init zn5_init(void) | ||
30 | { | ||
31 | pm_power_off = mxc91231_power_off; | ||
32 | |||
33 | mxc_iomux_alloc_pin(MXC91231_PIN_SP_USB_DAT_VP__RXD2, "uart2-rx"); | ||
34 | mxc_iomux_alloc_pin(MXC91231_PIN_SP_USB_SE0_VM__TXD2, "uart2-tx"); | ||
35 | |||
36 | mxc_register_device(&mxc_uart_device1, &uart_pdata); | ||
37 | mxc_register_device(&mxc_uart_device0, &uart_pdata); | ||
38 | |||
39 | mxc_register_device(&mxc_sdhc_device0, &sdhc_pdata); | ||
40 | |||
41 | mxc_register_device(&mxc_wdog_device0, NULL); | ||
42 | |||
43 | return; | ||
44 | } | ||
45 | |||
46 | static void __init zn5_timer_init(void) | ||
47 | { | ||
48 | mxc91231_clocks_init(26000000); /* 26mhz ckih */ | ||
49 | } | ||
50 | |||
51 | struct sys_timer zn5_timer = { | ||
52 | .init = zn5_timer_init, | ||
53 | }; | ||
54 | |||
55 | MACHINE_START(MAGX_ZN5, "Motorola Zn5") | ||
56 | .phys_io = MXC91231_AIPS1_BASE_ADDR, | ||
57 | .io_pg_offst = ((MXC91231_AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, | ||
58 | .boot_params = PHYS_OFFSET + 0x100, | ||
59 | .map_io = mxc91231_map_io, | ||
60 | .init_irq = mxc91231_init_irq, | ||
61 | .timer = &zn5_timer, | ||
62 | .init_machine = zn5_init, | ||
63 | MACHINE_END | ||
diff --git a/arch/arm/mach-mxc91231/mm.c b/arch/arm/mach-mxc91231/mm.c new file mode 100644 index 000000000000..6becda3ff331 --- /dev/null +++ b/arch/arm/mach-mxc91231/mm.c | |||
@@ -0,0 +1,94 @@ | |||
1 | /* | ||
2 | * Copyright (C) 1999,2000 Arm Limited | ||
3 | * Copyright (C) 2000 Deep Blue Solutions Ltd | ||
4 | * Copyright (C) 2002 Shane Nay (shane@minirl.com) | ||
5 | * Copyright 2004-2005 Freescale Semiconductor, Inc. All Rights Reserved. | ||
6 | * - add MXC specific definitions | ||
7 | * Copyright 2006 Motorola, Inc. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
22 | * | ||
23 | */ | ||
24 | |||
25 | #include <linux/mm.h> | ||
26 | #include <linux/init.h> | ||
27 | #include <mach/hardware.h> | ||
28 | #include <mach/common.h> | ||
29 | #include <asm/pgtable.h> | ||
30 | #include <asm/mach/map.h> | ||
31 | |||
32 | /* | ||
33 | * This structure defines the MXC memory map. | ||
34 | */ | ||
35 | static struct map_desc mxc_io_desc[] __initdata = { | ||
36 | { | ||
37 | .virtual = MXC91231_L2CC_BASE_ADDR_VIRT, | ||
38 | .pfn = __phys_to_pfn(MXC91231_L2CC_BASE_ADDR), | ||
39 | .length = MXC91231_L2CC_SIZE, | ||
40 | .type = MT_DEVICE, | ||
41 | }, { | ||
42 | .virtual = MXC91231_X_MEMC_BASE_ADDR_VIRT, | ||
43 | .pfn = __phys_to_pfn(MXC91231_X_MEMC_BASE_ADDR), | ||
44 | .length = MXC91231_X_MEMC_SIZE, | ||
45 | .type = MT_DEVICE, | ||
46 | }, { | ||
47 | .virtual = MXC91231_ROMP_BASE_ADDR_VIRT, | ||
48 | .pfn = __phys_to_pfn(MXC91231_ROMP_BASE_ADDR), | ||
49 | .length = MXC91231_ROMP_SIZE, | ||
50 | .type = MT_DEVICE, | ||
51 | }, { | ||
52 | .virtual = MXC91231_AVIC_BASE_ADDR_VIRT, | ||
53 | .pfn = __phys_to_pfn(MXC91231_AVIC_BASE_ADDR), | ||
54 | .length = MXC91231_AVIC_SIZE, | ||
55 | .type = MT_DEVICE, | ||
56 | }, { | ||
57 | .virtual = MXC91231_AIPS1_BASE_ADDR_VIRT, | ||
58 | .pfn = __phys_to_pfn(MXC91231_AIPS1_BASE_ADDR), | ||
59 | .length = MXC91231_AIPS1_SIZE, | ||
60 | .type = MT_DEVICE, | ||
61 | }, { | ||
62 | .virtual = MXC91231_SPBA0_BASE_ADDR_VIRT, | ||
63 | .pfn = __phys_to_pfn(MXC91231_SPBA0_BASE_ADDR), | ||
64 | .length = MXC91231_SPBA0_SIZE, | ||
65 | .type = MT_DEVICE, | ||
66 | }, { | ||
67 | .virtual = MXC91231_SPBA1_BASE_ADDR_VIRT, | ||
68 | .pfn = __phys_to_pfn(MXC91231_SPBA1_BASE_ADDR), | ||
69 | .length = MXC91231_SPBA1_SIZE, | ||
70 | .type = MT_DEVICE, | ||
71 | }, { | ||
72 | .virtual = MXC91231_AIPS2_BASE_ADDR_VIRT, | ||
73 | .pfn = __phys_to_pfn(MXC91231_AIPS2_BASE_ADDR), | ||
74 | .length = MXC91231_AIPS2_SIZE, | ||
75 | .type = MT_DEVICE, | ||
76 | }, | ||
77 | }; | ||
78 | |||
79 | /* | ||
80 | * This function initializes the memory map. It is called during the | ||
81 | * system startup to create static physical to virtual memory map for | ||
82 | * the IO modules. | ||
83 | */ | ||
84 | void __init mxc91231_map_io(void) | ||
85 | { | ||
86 | mxc_set_cpu_type(MXC_CPU_MXC91231); | ||
87 | |||
88 | iotable_init(mxc_io_desc, ARRAY_SIZE(mxc_io_desc)); | ||
89 | } | ||
90 | |||
91 | void __init mxc91231_init_irq(void) | ||
92 | { | ||
93 | mxc_init_irq(MXC91231_IO_ADDRESS(MXC91231_AVIC_BASE_ADDR)); | ||
94 | } | ||
diff --git a/arch/arm/mach-mxc91231/system.c b/arch/arm/mach-mxc91231/system.c new file mode 100644 index 000000000000..736f7efd874a --- /dev/null +++ b/arch/arm/mach-mxc91231/system.c | |||
@@ -0,0 +1,51 @@ | |||
1 | /* | ||
2 | * Copyright 2009 Dmitriy Taychenachev <dimichxp@gmail.com> | ||
3 | * | ||
4 | * This file is released under the GPLv2 or later. | ||
5 | */ | ||
6 | |||
7 | #include <linux/delay.h> | ||
8 | #include <linux/io.h> | ||
9 | |||
10 | #include <asm/proc-fns.h> | ||
11 | #include <mach/hardware.h> | ||
12 | |||
13 | #include "crm_regs.h" | ||
14 | |||
15 | #define WDOG_WCR MXC91231_IO_ADDRESS(MXC91231_WDOG1_BASE_ADDR) | ||
16 | #define WDOG_WCR_OUT_ENABLE (1 << 6) | ||
17 | #define WDOG_WCR_ASSERT (1 << 5) | ||
18 | |||
19 | void mxc91231_power_off(void) | ||
20 | { | ||
21 | u16 wcr; | ||
22 | |||
23 | wcr = __raw_readw(WDOG_WCR); | ||
24 | wcr |= WDOG_WCR_OUT_ENABLE; | ||
25 | wcr &= ~WDOG_WCR_ASSERT; | ||
26 | __raw_writew(wcr, WDOG_WCR); | ||
27 | } | ||
28 | |||
29 | void mxc91231_arch_reset(char mode, const char *cmd) | ||
30 | { | ||
31 | u32 amcr; | ||
32 | |||
33 | /* Reset the AP using CRM */ | ||
34 | amcr = __raw_readl(MXC_CRMAP_AMCR); | ||
35 | amcr &= ~MXC_CRMAP_AMCR_SW_AP; | ||
36 | __raw_writel(amcr, MXC_CRMAP_AMCR); | ||
37 | |||
38 | mdelay(10); | ||
39 | cpu_reset(0); | ||
40 | } | ||
41 | |||
42 | void mxc91231_prepare_idle(void) | ||
43 | { | ||
44 | u32 crm_ctl; | ||
45 | |||
46 | /* Go to WAIT mode after WFI */ | ||
47 | crm_ctl = __raw_readl(MXC_DSM_CRM_CONTROL); | ||
48 | crm_ctl &= ~(MXC_DSM_CRM_CTRL_LPMD0 | MXC_DSM_CRM_CTRL_LPMD1); | ||
49 | crm_ctl |= MXC_DSM_CRM_CTRL_LPMD_WAIT_MODE; | ||
50 | __raw_writel(crm_ctl, MXC_DSM_CRM_CONTROL); | ||
51 | } | ||
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 57e477bd89c6..7e1e721f0324 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
@@ -39,7 +39,7 @@ static struct platform_device *sdp4430_devices[] __initdata = { | |||
39 | }; | 39 | }; |
40 | 40 | ||
41 | static struct omap_uart_config sdp4430_uart_config __initdata = { | 41 | static struct omap_uart_config sdp4430_uart_config __initdata = { |
42 | .enabled_uarts = (1 << 0) | (1 << 1) | (1 << 2), | 42 | .enabled_uarts = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3), |
43 | }; | 43 | }; |
44 | 44 | ||
45 | static struct omap_lcd_config sdp4430_lcd_config __initdata = { | 45 | static struct omap_lcd_config sdp4430_lcd_config __initdata = { |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index dff5528fbfb5..e26af837510b 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
@@ -51,6 +51,7 @@ | |||
51 | 51 | ||
52 | #define OVERO_GPIO_BT_XGATE 15 | 52 | #define OVERO_GPIO_BT_XGATE 15 |
53 | #define OVERO_GPIO_W2W_NRESET 16 | 53 | #define OVERO_GPIO_W2W_NRESET 16 |
54 | #define OVERO_GPIO_PENDOWN 114 | ||
54 | #define OVERO_GPIO_BT_NRESET 164 | 55 | #define OVERO_GPIO_BT_NRESET 164 |
55 | #define OVERO_GPIO_USBH_CPEN 168 | 56 | #define OVERO_GPIO_USBH_CPEN 168 |
56 | #define OVERO_GPIO_USBH_NRESET 183 | 57 | #define OVERO_GPIO_USBH_NRESET 183 |
diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h index 1d3c93bf86d3..f3c91a1ca391 100644 --- a/arch/arm/mach-omap2/cm.h +++ b/arch/arm/mach-omap2/cm.h | |||
@@ -29,9 +29,9 @@ | |||
29 | * These registers appear once per CM module. | 29 | * These registers appear once per CM module. |
30 | */ | 30 | */ |
31 | 31 | ||
32 | #define OMAP3430_CM_REVISION OMAP_CM_REGADDR(OCP_MOD, 0x0000) | 32 | #define OMAP3430_CM_REVISION OMAP34XX_CM_REGADDR(OCP_MOD, 0x0000) |
33 | #define OMAP3430_CM_SYSCONFIG OMAP_CM_REGADDR(OCP_MOD, 0x0010) | 33 | #define OMAP3430_CM_SYSCONFIG OMAP34XX_CM_REGADDR(OCP_MOD, 0x0010) |
34 | #define OMAP3430_CM_POLCTRL OMAP_CM_REGADDR(OCP_MOD, 0x009c) | 34 | #define OMAP3430_CM_POLCTRL OMAP34XX_CM_REGADDR(OCP_MOD, 0x009c) |
35 | 35 | ||
36 | #define OMAP3_CM_CLKOUT_CTRL_OFFSET 0x0070 | 36 | #define OMAP3_CM_CLKOUT_CTRL_OFFSET 0x0070 |
37 | #define OMAP3430_CM_CLKOUT_CTRL OMAP_CM_REGADDR(OMAP3430_CCR_MOD, 0x0070) | 37 | #define OMAP3430_CM_CLKOUT_CTRL OMAP_CM_REGADDR(OMAP3430_CCR_MOD, 0x0070) |
diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c index a5c0f0435cd6..d49dfb5e931f 100644 --- a/arch/arm/mach-omap2/mcbsp.c +++ b/arch/arm/mach-omap2/mcbsp.c | |||
@@ -169,6 +169,42 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = { | |||
169 | #define OMAP34XX_MCBSP_PDATA_SZ 0 | 169 | #define OMAP34XX_MCBSP_PDATA_SZ 0 |
170 | #endif | 170 | #endif |
171 | 171 | ||
172 | static struct omap_mcbsp_platform_data omap44xx_mcbsp_pdata[] = { | ||
173 | { | ||
174 | .phys_base = OMAP44XX_MCBSP1_BASE, | ||
175 | .dma_rx_sync = OMAP44XX_DMA_MCBSP1_RX, | ||
176 | .dma_tx_sync = OMAP44XX_DMA_MCBSP1_TX, | ||
177 | .rx_irq = INT_24XX_MCBSP1_IRQ_RX, | ||
178 | .tx_irq = INT_24XX_MCBSP1_IRQ_TX, | ||
179 | .ops = &omap2_mcbsp_ops, | ||
180 | }, | ||
181 | { | ||
182 | .phys_base = OMAP44XX_MCBSP2_BASE, | ||
183 | .dma_rx_sync = OMAP44XX_DMA_MCBSP2_RX, | ||
184 | .dma_tx_sync = OMAP44XX_DMA_MCBSP2_TX, | ||
185 | .rx_irq = INT_24XX_MCBSP2_IRQ_RX, | ||
186 | .tx_irq = INT_24XX_MCBSP2_IRQ_TX, | ||
187 | .ops = &omap2_mcbsp_ops, | ||
188 | }, | ||
189 | { | ||
190 | .phys_base = OMAP44XX_MCBSP3_BASE, | ||
191 | .dma_rx_sync = OMAP44XX_DMA_MCBSP3_RX, | ||
192 | .dma_tx_sync = OMAP44XX_DMA_MCBSP3_TX, | ||
193 | .rx_irq = INT_24XX_MCBSP3_IRQ_RX, | ||
194 | .tx_irq = INT_24XX_MCBSP3_IRQ_TX, | ||
195 | .ops = &omap2_mcbsp_ops, | ||
196 | }, | ||
197 | { | ||
198 | .phys_base = OMAP44XX_MCBSP4_BASE, | ||
199 | .dma_rx_sync = OMAP44XX_DMA_MCBSP4_RX, | ||
200 | .dma_tx_sync = OMAP44XX_DMA_MCBSP4_TX, | ||
201 | .rx_irq = INT_24XX_MCBSP4_IRQ_RX, | ||
202 | .tx_irq = INT_24XX_MCBSP4_IRQ_TX, | ||
203 | .ops = &omap2_mcbsp_ops, | ||
204 | }, | ||
205 | }; | ||
206 | #define OMAP44XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap44xx_mcbsp_pdata) | ||
207 | |||
172 | static int __init omap2_mcbsp_init(void) | 208 | static int __init omap2_mcbsp_init(void) |
173 | { | 209 | { |
174 | if (cpu_is_omap2420()) | 210 | if (cpu_is_omap2420()) |
@@ -177,6 +213,8 @@ static int __init omap2_mcbsp_init(void) | |||
177 | omap_mcbsp_count = OMAP2430_MCBSP_PDATA_SZ; | 213 | omap_mcbsp_count = OMAP2430_MCBSP_PDATA_SZ; |
178 | if (cpu_is_omap34xx()) | 214 | if (cpu_is_omap34xx()) |
179 | omap_mcbsp_count = OMAP34XX_MCBSP_PDATA_SZ; | 215 | omap_mcbsp_count = OMAP34XX_MCBSP_PDATA_SZ; |
216 | if (cpu_is_omap44xx()) | ||
217 | omap_mcbsp_count = OMAP44XX_MCBSP_PDATA_SZ; | ||
180 | 218 | ||
181 | mcbsp_ptr = kzalloc(omap_mcbsp_count * sizeof(struct omap_mcbsp *), | 219 | mcbsp_ptr = kzalloc(omap_mcbsp_count * sizeof(struct omap_mcbsp *), |
182 | GFP_KERNEL); | 220 | GFP_KERNEL); |
@@ -192,6 +230,9 @@ static int __init omap2_mcbsp_init(void) | |||
192 | if (cpu_is_omap34xx()) | 230 | if (cpu_is_omap34xx()) |
193 | omap_mcbsp_register_board_cfg(omap34xx_mcbsp_pdata, | 231 | omap_mcbsp_register_board_cfg(omap34xx_mcbsp_pdata, |
194 | OMAP34XX_MCBSP_PDATA_SZ); | 232 | OMAP34XX_MCBSP_PDATA_SZ); |
233 | if (cpu_is_omap44xx()) | ||
234 | omap_mcbsp_register_board_cfg(omap44xx_mcbsp_pdata, | ||
235 | OMAP44XX_MCBSP_PDATA_SZ); | ||
195 | 236 | ||
196 | return omap_mcbsp_init(); | 237 | return omap_mcbsp_init(); |
197 | } | 238 | } |
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index f7b3baf76678..21201cd4117b 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h | |||
@@ -11,9 +11,6 @@ | |||
11 | #ifndef __ARCH_ARM_MACH_OMAP2_PM_H | 11 | #ifndef __ARCH_ARM_MACH_OMAP2_PM_H |
12 | #define __ARCH_ARM_MACH_OMAP2_PM_H | 12 | #define __ARCH_ARM_MACH_OMAP2_PM_H |
13 | 13 | ||
14 | extern int omap2_pm_init(void); | ||
15 | extern int omap3_pm_init(void); | ||
16 | |||
17 | #ifdef CONFIG_PM_DEBUG | 14 | #ifdef CONFIG_PM_DEBUG |
18 | extern void omap2_pm_dump(int mode, int resume, unsigned int us); | 15 | extern void omap2_pm_dump(int mode, int resume, unsigned int us); |
19 | extern int omap2_pm_debug; | 16 | extern int omap2_pm_debug; |
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index db1025562fb0..528dbdc26e23 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
@@ -470,7 +470,7 @@ static void __init prcm_setup_regs(void) | |||
470 | WKUP_MOD, PM_WKEN); | 470 | WKUP_MOD, PM_WKEN); |
471 | } | 471 | } |
472 | 472 | ||
473 | int __init omap2_pm_init(void) | 473 | static int __init omap2_pm_init(void) |
474 | { | 474 | { |
475 | u32 l; | 475 | u32 l; |
476 | 476 | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 841d4c5ed8be..488d595d8e4b 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -39,7 +39,9 @@ | |||
39 | struct power_state { | 39 | struct power_state { |
40 | struct powerdomain *pwrdm; | 40 | struct powerdomain *pwrdm; |
41 | u32 next_state; | 41 | u32 next_state; |
42 | #ifdef CONFIG_SUSPEND | ||
42 | u32 saved_state; | 43 | u32 saved_state; |
44 | #endif | ||
43 | struct list_head node; | 45 | struct list_head node; |
44 | }; | 46 | }; |
45 | 47 | ||
@@ -293,6 +295,9 @@ out: | |||
293 | local_irq_enable(); | 295 | local_irq_enable(); |
294 | } | 296 | } |
295 | 297 | ||
298 | #ifdef CONFIG_SUSPEND | ||
299 | static suspend_state_t suspend_state; | ||
300 | |||
296 | static int omap3_pm_prepare(void) | 301 | static int omap3_pm_prepare(void) |
297 | { | 302 | { |
298 | disable_hlt(); | 303 | disable_hlt(); |
@@ -321,7 +326,6 @@ static int omap3_pm_suspend(void) | |||
321 | restore: | 326 | restore: |
322 | /* Restore next_pwrsts */ | 327 | /* Restore next_pwrsts */ |
323 | list_for_each_entry(pwrst, &pwrst_list, node) { | 328 | list_for_each_entry(pwrst, &pwrst_list, node) { |
324 | set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); | ||
325 | state = pwrdm_read_prev_pwrst(pwrst->pwrdm); | 329 | state = pwrdm_read_prev_pwrst(pwrst->pwrdm); |
326 | if (state > pwrst->next_state) { | 330 | if (state > pwrst->next_state) { |
327 | printk(KERN_INFO "Powerdomain (%s) didn't enter " | 331 | printk(KERN_INFO "Powerdomain (%s) didn't enter " |
@@ -329,6 +333,7 @@ restore: | |||
329 | pwrst->pwrdm->name, pwrst->next_state); | 333 | pwrst->pwrdm->name, pwrst->next_state); |
330 | ret = -1; | 334 | ret = -1; |
331 | } | 335 | } |
336 | set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); | ||
332 | } | 337 | } |
333 | if (ret) | 338 | if (ret) |
334 | printk(KERN_ERR "Could not enter target state in pm_suspend\n"); | 339 | printk(KERN_ERR "Could not enter target state in pm_suspend\n"); |
@@ -339,11 +344,11 @@ restore: | |||
339 | return ret; | 344 | return ret; |
340 | } | 345 | } |
341 | 346 | ||
342 | static int omap3_pm_enter(suspend_state_t state) | 347 | static int omap3_pm_enter(suspend_state_t unused) |
343 | { | 348 | { |
344 | int ret = 0; | 349 | int ret = 0; |
345 | 350 | ||
346 | switch (state) { | 351 | switch (suspend_state) { |
347 | case PM_SUSPEND_STANDBY: | 352 | case PM_SUSPEND_STANDBY: |
348 | case PM_SUSPEND_MEM: | 353 | case PM_SUSPEND_MEM: |
349 | ret = omap3_pm_suspend(); | 354 | ret = omap3_pm_suspend(); |
@@ -360,12 +365,30 @@ static void omap3_pm_finish(void) | |||
360 | enable_hlt(); | 365 | enable_hlt(); |
361 | } | 366 | } |
362 | 367 | ||
368 | /* Hooks to enable / disable UART interrupts during suspend */ | ||
369 | static int omap3_pm_begin(suspend_state_t state) | ||
370 | { | ||
371 | suspend_state = state; | ||
372 | omap_uart_enable_irqs(0); | ||
373 | return 0; | ||
374 | } | ||
375 | |||
376 | static void omap3_pm_end(void) | ||
377 | { | ||
378 | suspend_state = PM_SUSPEND_ON; | ||
379 | omap_uart_enable_irqs(1); | ||
380 | return; | ||
381 | } | ||
382 | |||
363 | static struct platform_suspend_ops omap_pm_ops = { | 383 | static struct platform_suspend_ops omap_pm_ops = { |
384 | .begin = omap3_pm_begin, | ||
385 | .end = omap3_pm_end, | ||
364 | .prepare = omap3_pm_prepare, | 386 | .prepare = omap3_pm_prepare, |
365 | .enter = omap3_pm_enter, | 387 | .enter = omap3_pm_enter, |
366 | .finish = omap3_pm_finish, | 388 | .finish = omap3_pm_finish, |
367 | .valid = suspend_valid_only_mem, | 389 | .valid = suspend_valid_only_mem, |
368 | }; | 390 | }; |
391 | #endif /* CONFIG_SUSPEND */ | ||
369 | 392 | ||
370 | 393 | ||
371 | /** | 394 | /** |
@@ -613,6 +636,24 @@ static void __init prcm_setup_regs(void) | |||
613 | /* Clear any pending PRCM interrupts */ | 636 | /* Clear any pending PRCM interrupts */ |
614 | prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 637 | prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); |
615 | 638 | ||
639 | /* Don't attach IVA interrupts */ | ||
640 | prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); | ||
641 | prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); | ||
642 | prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3); | ||
643 | prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL); | ||
644 | |||
645 | /* Clear any pending 'reset' flags */ | ||
646 | prm_write_mod_reg(0xffffffff, MPU_MOD, RM_RSTST); | ||
647 | prm_write_mod_reg(0xffffffff, CORE_MOD, RM_RSTST); | ||
648 | prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, RM_RSTST); | ||
649 | prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, RM_RSTST); | ||
650 | prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, RM_RSTST); | ||
651 | prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, RM_RSTST); | ||
652 | prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, RM_RSTST); | ||
653 | |||
654 | /* Clear any pending PRCM interrupts */ | ||
655 | prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | ||
656 | |||
616 | omap3_iva_idle(); | 657 | omap3_iva_idle(); |
617 | omap3_d2d_idle(); | 658 | omap3_d2d_idle(); |
618 | } | 659 | } |
@@ -652,7 +693,7 @@ static int __init clkdms_setup(struct clockdomain *clkdm) | |||
652 | return 0; | 693 | return 0; |
653 | } | 694 | } |
654 | 695 | ||
655 | int __init omap3_pm_init(void) | 696 | static int __init omap3_pm_init(void) |
656 | { | 697 | { |
657 | struct power_state *pwrst, *tmp; | 698 | struct power_state *pwrst, *tmp; |
658 | int ret; | 699 | int ret; |
@@ -692,7 +733,9 @@ int __init omap3_pm_init(void) | |||
692 | _omap_sram_idle = omap_sram_push(omap34xx_cpu_suspend, | 733 | _omap_sram_idle = omap_sram_push(omap34xx_cpu_suspend, |
693 | omap34xx_cpu_suspend_sz); | 734 | omap34xx_cpu_suspend_sz); |
694 | 735 | ||
736 | #ifdef CONFIG_SUSPEND | ||
695 | suspend_set_ops(&omap_pm_ops); | 737 | suspend_set_ops(&omap_pm_ops); |
738 | #endif /* CONFIG_SUSPEND */ | ||
696 | 739 | ||
697 | pm_idle = omap3_pm_idle; | 740 | pm_idle = omap3_pm_idle; |
698 | 741 | ||
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index b094c15bfe47..ce22344b94e7 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
@@ -54,6 +54,7 @@ struct omap_uart_state { | |||
54 | 54 | ||
55 | struct plat_serial8250_port *p; | 55 | struct plat_serial8250_port *p; |
56 | struct list_head node; | 56 | struct list_head node; |
57 | struct platform_device pdev; | ||
57 | 58 | ||
58 | #if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM) | 59 | #if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM) |
59 | int context_valid; | 60 | int context_valid; |
@@ -68,10 +69,9 @@ struct omap_uart_state { | |||
68 | #endif | 69 | #endif |
69 | }; | 70 | }; |
70 | 71 | ||
71 | static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS]; | ||
72 | static LIST_HEAD(uart_list); | 72 | static LIST_HEAD(uart_list); |
73 | 73 | ||
74 | static struct plat_serial8250_port serial_platform_data[] = { | 74 | static struct plat_serial8250_port serial_platform_data0[] = { |
75 | { | 75 | { |
76 | .membase = IO_ADDRESS(OMAP_UART1_BASE), | 76 | .membase = IO_ADDRESS(OMAP_UART1_BASE), |
77 | .mapbase = OMAP_UART1_BASE, | 77 | .mapbase = OMAP_UART1_BASE, |
@@ -81,6 +81,12 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
81 | .regshift = 2, | 81 | .regshift = 2, |
82 | .uartclk = OMAP24XX_BASE_BAUD * 16, | 82 | .uartclk = OMAP24XX_BASE_BAUD * 16, |
83 | }, { | 83 | }, { |
84 | .flags = 0 | ||
85 | } | ||
86 | }; | ||
87 | |||
88 | static struct plat_serial8250_port serial_platform_data1[] = { | ||
89 | { | ||
84 | .membase = IO_ADDRESS(OMAP_UART2_BASE), | 90 | .membase = IO_ADDRESS(OMAP_UART2_BASE), |
85 | .mapbase = OMAP_UART2_BASE, | 91 | .mapbase = OMAP_UART2_BASE, |
86 | .irq = 73, | 92 | .irq = 73, |
@@ -89,6 +95,12 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
89 | .regshift = 2, | 95 | .regshift = 2, |
90 | .uartclk = OMAP24XX_BASE_BAUD * 16, | 96 | .uartclk = OMAP24XX_BASE_BAUD * 16, |
91 | }, { | 97 | }, { |
98 | .flags = 0 | ||
99 | } | ||
100 | }; | ||
101 | |||
102 | static struct plat_serial8250_port serial_platform_data2[] = { | ||
103 | { | ||
92 | .membase = IO_ADDRESS(OMAP_UART3_BASE), | 104 | .membase = IO_ADDRESS(OMAP_UART3_BASE), |
93 | .mapbase = OMAP_UART3_BASE, | 105 | .mapbase = OMAP_UART3_BASE, |
94 | .irq = 74, | 106 | .irq = 74, |
@@ -97,6 +109,16 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
97 | .regshift = 2, | 109 | .regshift = 2, |
98 | .uartclk = OMAP24XX_BASE_BAUD * 16, | 110 | .uartclk = OMAP24XX_BASE_BAUD * 16, |
99 | }, { | 111 | }, { |
112 | #ifdef CONFIG_ARCH_OMAP4 | ||
113 | .membase = IO_ADDRESS(OMAP_UART4_BASE), | ||
114 | .mapbase = OMAP_UART4_BASE, | ||
115 | .irq = 70, | ||
116 | .flags = UPF_BOOT_AUTOCONF, | ||
117 | .iotype = UPIO_MEM, | ||
118 | .regshift = 2, | ||
119 | .uartclk = OMAP24XX_BASE_BAUD * 16, | ||
120 | }, { | ||
121 | #endif | ||
100 | .flags = 0 | 122 | .flags = 0 |
101 | } | 123 | } |
102 | }; | 124 | }; |
@@ -217,6 +239,40 @@ static inline void omap_uart_disable_clocks(struct omap_uart_state *uart) | |||
217 | clk_disable(uart->fck); | 239 | clk_disable(uart->fck); |
218 | } | 240 | } |
219 | 241 | ||
242 | static void omap_uart_enable_wakeup(struct omap_uart_state *uart) | ||
243 | { | ||
244 | /* Set wake-enable bit */ | ||
245 | if (uart->wk_en && uart->wk_mask) { | ||
246 | u32 v = __raw_readl(uart->wk_en); | ||
247 | v |= uart->wk_mask; | ||
248 | __raw_writel(v, uart->wk_en); | ||
249 | } | ||
250 | |||
251 | /* Ensure IOPAD wake-enables are set */ | ||
252 | if (cpu_is_omap34xx() && uart->padconf) { | ||
253 | u16 v = omap_ctrl_readw(uart->padconf); | ||
254 | v |= OMAP3_PADCONF_WAKEUPENABLE0; | ||
255 | omap_ctrl_writew(v, uart->padconf); | ||
256 | } | ||
257 | } | ||
258 | |||
259 | static void omap_uart_disable_wakeup(struct omap_uart_state *uart) | ||
260 | { | ||
261 | /* Clear wake-enable bit */ | ||
262 | if (uart->wk_en && uart->wk_mask) { | ||
263 | u32 v = __raw_readl(uart->wk_en); | ||
264 | v &= ~uart->wk_mask; | ||
265 | __raw_writel(v, uart->wk_en); | ||
266 | } | ||
267 | |||
268 | /* Ensure IOPAD wake-enables are cleared */ | ||
269 | if (cpu_is_omap34xx() && uart->padconf) { | ||
270 | u16 v = omap_ctrl_readw(uart->padconf); | ||
271 | v &= ~OMAP3_PADCONF_WAKEUPENABLE0; | ||
272 | omap_ctrl_writew(v, uart->padconf); | ||
273 | } | ||
274 | } | ||
275 | |||
220 | static void omap_uart_smart_idle_enable(struct omap_uart_state *uart, | 276 | static void omap_uart_smart_idle_enable(struct omap_uart_state *uart, |
221 | int enable) | 277 | int enable) |
222 | { | 278 | { |
@@ -246,6 +302,11 @@ static void omap_uart_block_sleep(struct omap_uart_state *uart) | |||
246 | 302 | ||
247 | static void omap_uart_allow_sleep(struct omap_uart_state *uart) | 303 | static void omap_uart_allow_sleep(struct omap_uart_state *uart) |
248 | { | 304 | { |
305 | if (device_may_wakeup(&uart->pdev.dev)) | ||
306 | omap_uart_enable_wakeup(uart); | ||
307 | else | ||
308 | omap_uart_disable_wakeup(uart); | ||
309 | |||
249 | if (!uart->clocked) | 310 | if (!uart->clocked) |
250 | return; | 311 | return; |
251 | 312 | ||
@@ -292,7 +353,6 @@ void omap_uart_resume_idle(int num) | |||
292 | /* Check for normal UART wakeup */ | 353 | /* Check for normal UART wakeup */ |
293 | if (__raw_readl(uart->wk_st) & uart->wk_mask) | 354 | if (__raw_readl(uart->wk_st) & uart->wk_mask) |
294 | omap_uart_block_sleep(uart); | 355 | omap_uart_block_sleep(uart); |
295 | |||
296 | return; | 356 | return; |
297 | } | 357 | } |
298 | } | 358 | } |
@@ -346,16 +406,13 @@ static irqreturn_t omap_uart_interrupt(int irq, void *dev_id) | |||
346 | return IRQ_NONE; | 406 | return IRQ_NONE; |
347 | } | 407 | } |
348 | 408 | ||
349 | static u32 sleep_timeout = DEFAULT_TIMEOUT; | ||
350 | |||
351 | static void omap_uart_idle_init(struct omap_uart_state *uart) | 409 | static void omap_uart_idle_init(struct omap_uart_state *uart) |
352 | { | 410 | { |
353 | u32 v; | ||
354 | struct plat_serial8250_port *p = uart->p; | 411 | struct plat_serial8250_port *p = uart->p; |
355 | int ret; | 412 | int ret; |
356 | 413 | ||
357 | uart->can_sleep = 0; | 414 | uart->can_sleep = 0; |
358 | uart->timeout = sleep_timeout; | 415 | uart->timeout = DEFAULT_TIMEOUT; |
359 | setup_timer(&uart->timer, omap_uart_idle_timer, | 416 | setup_timer(&uart->timer, omap_uart_idle_timer, |
360 | (unsigned long) uart); | 417 | (unsigned long) uart); |
361 | mod_timer(&uart->timer, jiffies + uart->timeout); | 418 | mod_timer(&uart->timer, jiffies + uart->timeout); |
@@ -413,76 +470,101 @@ static void omap_uart_idle_init(struct omap_uart_state *uart) | |||
413 | uart->padconf = 0; | 470 | uart->padconf = 0; |
414 | } | 471 | } |
415 | 472 | ||
416 | /* Set wake-enable bit */ | ||
417 | if (uart->wk_en && uart->wk_mask) { | ||
418 | v = __raw_readl(uart->wk_en); | ||
419 | v |= uart->wk_mask; | ||
420 | __raw_writel(v, uart->wk_en); | ||
421 | } | ||
422 | |||
423 | /* Ensure IOPAD wake-enables are set */ | ||
424 | if (cpu_is_omap34xx() && uart->padconf) { | ||
425 | u16 v; | ||
426 | |||
427 | v = omap_ctrl_readw(uart->padconf); | ||
428 | v |= OMAP3_PADCONF_WAKEUPENABLE0; | ||
429 | omap_ctrl_writew(v, uart->padconf); | ||
430 | } | ||
431 | |||
432 | p->flags |= UPF_SHARE_IRQ; | 473 | p->flags |= UPF_SHARE_IRQ; |
433 | ret = request_irq(p->irq, omap_uart_interrupt, IRQF_SHARED, | 474 | ret = request_irq(p->irq, omap_uart_interrupt, IRQF_SHARED, |
434 | "serial idle", (void *)uart); | 475 | "serial idle", (void *)uart); |
435 | WARN_ON(ret); | 476 | WARN_ON(ret); |
436 | } | 477 | } |
437 | 478 | ||
438 | static ssize_t sleep_timeout_show(struct kobject *kobj, | 479 | void omap_uart_enable_irqs(int enable) |
439 | struct kobj_attribute *attr, | 480 | { |
481 | int ret; | ||
482 | struct omap_uart_state *uart; | ||
483 | |||
484 | list_for_each_entry(uart, &uart_list, node) { | ||
485 | if (enable) | ||
486 | ret = request_irq(uart->p->irq, omap_uart_interrupt, | ||
487 | IRQF_SHARED, "serial idle", (void *)uart); | ||
488 | else | ||
489 | free_irq(uart->p->irq, (void *)uart); | ||
490 | } | ||
491 | } | ||
492 | |||
493 | static ssize_t sleep_timeout_show(struct device *dev, | ||
494 | struct device_attribute *attr, | ||
440 | char *buf) | 495 | char *buf) |
441 | { | 496 | { |
442 | return sprintf(buf, "%u\n", sleep_timeout / HZ); | 497 | struct platform_device *pdev = container_of(dev, |
498 | struct platform_device, dev); | ||
499 | struct omap_uart_state *uart = container_of(pdev, | ||
500 | struct omap_uart_state, pdev); | ||
501 | |||
502 | return sprintf(buf, "%u\n", uart->timeout / HZ); | ||
443 | } | 503 | } |
444 | 504 | ||
445 | static ssize_t sleep_timeout_store(struct kobject *kobj, | 505 | static ssize_t sleep_timeout_store(struct device *dev, |
446 | struct kobj_attribute *attr, | 506 | struct device_attribute *attr, |
447 | const char *buf, size_t n) | 507 | const char *buf, size_t n) |
448 | { | 508 | { |
449 | struct omap_uart_state *uart; | 509 | struct platform_device *pdev = container_of(dev, |
510 | struct platform_device, dev); | ||
511 | struct omap_uart_state *uart = container_of(pdev, | ||
512 | struct omap_uart_state, pdev); | ||
450 | unsigned int value; | 513 | unsigned int value; |
451 | 514 | ||
452 | if (sscanf(buf, "%u", &value) != 1) { | 515 | if (sscanf(buf, "%u", &value) != 1) { |
453 | printk(KERN_ERR "sleep_timeout_store: Invalid value\n"); | 516 | printk(KERN_ERR "sleep_timeout_store: Invalid value\n"); |
454 | return -EINVAL; | 517 | return -EINVAL; |
455 | } | 518 | } |
456 | sleep_timeout = value * HZ; | 519 | |
457 | list_for_each_entry(uart, &uart_list, node) { | 520 | uart->timeout = value * HZ; |
458 | uart->timeout = sleep_timeout; | 521 | if (uart->timeout) |
459 | if (uart->timeout) | 522 | mod_timer(&uart->timer, jiffies + uart->timeout); |
460 | mod_timer(&uart->timer, jiffies + uart->timeout); | 523 | else |
461 | else | 524 | /* A zero value means disable timeout feature */ |
462 | /* A zero value means disable timeout feature */ | 525 | omap_uart_block_sleep(uart); |
463 | omap_uart_block_sleep(uart); | 526 | |
464 | } | ||
465 | return n; | 527 | return n; |
466 | } | 528 | } |
467 | 529 | ||
468 | static struct kobj_attribute sleep_timeout_attr = | 530 | DEVICE_ATTR(sleep_timeout, 0644, sleep_timeout_show, sleep_timeout_store); |
469 | __ATTR(sleep_timeout, 0644, sleep_timeout_show, sleep_timeout_store); | 531 | #define DEV_CREATE_FILE(dev, attr) WARN_ON(device_create_file(dev, attr)) |
470 | |||
471 | #else | 532 | #else |
472 | static inline void omap_uart_idle_init(struct omap_uart_state *uart) {} | 533 | static inline void omap_uart_idle_init(struct omap_uart_state *uart) {} |
534 | #define DEV_CREATE_FILE(dev, attr) | ||
473 | #endif /* CONFIG_PM */ | 535 | #endif /* CONFIG_PM */ |
474 | 536 | ||
475 | static struct platform_device serial_device = { | 537 | static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = { |
476 | .name = "serial8250", | 538 | { |
477 | .id = PLAT8250_DEV_PLATFORM, | 539 | .pdev = { |
478 | .dev = { | 540 | .name = "serial8250", |
479 | .platform_data = serial_platform_data, | 541 | .id = PLAT8250_DEV_PLATFORM, |
542 | .dev = { | ||
543 | .platform_data = serial_platform_data0, | ||
544 | }, | ||
545 | }, | ||
546 | }, { | ||
547 | .pdev = { | ||
548 | .name = "serial8250", | ||
549 | .id = PLAT8250_DEV_PLATFORM1, | ||
550 | .dev = { | ||
551 | .platform_data = serial_platform_data1, | ||
552 | }, | ||
553 | }, | ||
554 | }, { | ||
555 | .pdev = { | ||
556 | .name = "serial8250", | ||
557 | .id = PLAT8250_DEV_PLATFORM2, | ||
558 | .dev = { | ||
559 | .platform_data = serial_platform_data2, | ||
560 | }, | ||
561 | }, | ||
480 | }, | 562 | }, |
481 | }; | 563 | }; |
482 | 564 | ||
483 | void __init omap_serial_init(void) | 565 | void __init omap_serial_init(void) |
484 | { | 566 | { |
485 | int i, err; | 567 | int i; |
486 | const struct omap_uart_config *info; | 568 | const struct omap_uart_config *info; |
487 | char name[16]; | 569 | char name[16]; |
488 | 570 | ||
@@ -496,14 +578,12 @@ void __init omap_serial_init(void) | |||
496 | 578 | ||
497 | if (info == NULL) | 579 | if (info == NULL) |
498 | return; | 580 | return; |
499 | if (cpu_is_omap44xx()) { | ||
500 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) | ||
501 | serial_platform_data[i].irq += 32; | ||
502 | } | ||
503 | 581 | ||
504 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { | 582 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { |
505 | struct plat_serial8250_port *p = serial_platform_data + i; | ||
506 | struct omap_uart_state *uart = &omap_uart[i]; | 583 | struct omap_uart_state *uart = &omap_uart[i]; |
584 | struct platform_device *pdev = &uart->pdev; | ||
585 | struct device *dev = &pdev->dev; | ||
586 | struct plat_serial8250_port *p = dev->platform_data; | ||
507 | 587 | ||
508 | if (!(info->enabled_uarts & (1 << i))) { | 588 | if (!(info->enabled_uarts & (1 << i))) { |
509 | p->membase = NULL; | 589 | p->membase = NULL; |
@@ -531,20 +611,21 @@ void __init omap_serial_init(void) | |||
531 | uart->num = i; | 611 | uart->num = i; |
532 | p->private_data = uart; | 612 | p->private_data = uart; |
533 | uart->p = p; | 613 | uart->p = p; |
534 | list_add(&uart->node, &uart_list); | 614 | list_add_tail(&uart->node, &uart_list); |
615 | |||
616 | if (cpu_is_omap44xx()) | ||
617 | p->irq += 32; | ||
535 | 618 | ||
536 | omap_uart_enable_clocks(uart); | 619 | omap_uart_enable_clocks(uart); |
537 | omap_uart_reset(uart); | 620 | omap_uart_reset(uart); |
538 | omap_uart_idle_init(uart); | 621 | omap_uart_idle_init(uart); |
539 | } | ||
540 | |||
541 | err = platform_device_register(&serial_device); | ||
542 | |||
543 | #ifdef CONFIG_PM | ||
544 | if (!err) | ||
545 | err = sysfs_create_file(&serial_device.dev.kobj, | ||
546 | &sleep_timeout_attr.attr); | ||
547 | #endif | ||
548 | 622 | ||
623 | if (WARN_ON(platform_device_register(pdev))) | ||
624 | continue; | ||
625 | if ((cpu_is_omap34xx() && uart->padconf) || | ||
626 | (uart->wk_en && uart->wk_mask)) { | ||
627 | device_init_wakeup(dev, true); | ||
628 | DEV_CREATE_FILE(dev, &dev_attr_sleep_timeout); | ||
629 | } | ||
630 | } | ||
549 | } | 631 | } |
550 | |||
diff --git a/arch/arm/mach-orion5x/Kconfig b/arch/arm/mach-orion5x/Kconfig index 2c7035d8dcbf..5062b05b76b7 100644 --- a/arch/arm/mach-orion5x/Kconfig +++ b/arch/arm/mach-orion5x/Kconfig | |||
@@ -89,6 +89,20 @@ config MACH_EDMINI_V2 | |||
89 | Say 'Y' here if you want your kernel to support the | 89 | Say 'Y' here if you want your kernel to support the |
90 | LaCie Ethernet Disk mini V2. | 90 | LaCie Ethernet Disk mini V2. |
91 | 91 | ||
92 | config MACH_D2NET | ||
93 | bool "LaCie d2 Network" | ||
94 | select I2C_BOARDINFO | ||
95 | help | ||
96 | Say 'Y' here if you want your kernel to support the | ||
97 | LaCie d2 Network NAS. | ||
98 | |||
99 | config MACH_BIGDISK | ||
100 | bool "LaCie Big Disk Network" | ||
101 | select I2C_BOARDINFO | ||
102 | help | ||
103 | Say 'Y' here if you want your kernel to support the | ||
104 | LaCie Big Disk Network NAS. | ||
105 | |||
92 | config MACH_MSS2 | 106 | config MACH_MSS2 |
93 | bool "Maxtor Shared Storage II" | 107 | bool "Maxtor Shared Storage II" |
94 | help | 108 | help |
diff --git a/arch/arm/mach-orion5x/Makefile b/arch/arm/mach-orion5x/Makefile index edc38e2c856f..1db8a3a2708a 100644 --- a/arch/arm/mach-orion5x/Makefile +++ b/arch/arm/mach-orion5x/Makefile | |||
@@ -12,6 +12,8 @@ obj-$(CONFIG_MACH_WRT350N_V2) += wrt350n-v2-setup.o | |||
12 | obj-$(CONFIG_MACH_TS78XX) += ts78xx-setup.o | 12 | obj-$(CONFIG_MACH_TS78XX) += ts78xx-setup.o |
13 | obj-$(CONFIG_MACH_MV2120) += mv2120-setup.o | 13 | obj-$(CONFIG_MACH_MV2120) += mv2120-setup.o |
14 | obj-$(CONFIG_MACH_EDMINI_V2) += edmini_v2-setup.o | 14 | obj-$(CONFIG_MACH_EDMINI_V2) += edmini_v2-setup.o |
15 | obj-$(CONFIG_MACH_D2NET) += d2net-setup.o | ||
16 | obj-$(CONFIG_MACH_BIGDISK) += d2net-setup.o | ||
15 | obj-$(CONFIG_MACH_MSS2) += mss2-setup.o | 17 | obj-$(CONFIG_MACH_MSS2) += mss2-setup.o |
16 | obj-$(CONFIG_MACH_WNR854T) += wnr854t-setup.o | 18 | obj-$(CONFIG_MACH_WNR854T) += wnr854t-setup.o |
17 | obj-$(CONFIG_MACH_RD88F5181L_GE) += rd88f5181l-ge-setup.o | 19 | obj-$(CONFIG_MACH_RD88F5181L_GE) += rd88f5181l-ge-setup.o |
diff --git a/arch/arm/mach-orion5x/addr-map.c b/arch/arm/mach-orion5x/addr-map.c index d78731edebb6..1a5d6a0e2602 100644 --- a/arch/arm/mach-orion5x/addr-map.c +++ b/arch/arm/mach-orion5x/addr-map.c | |||
@@ -84,7 +84,8 @@ static int __init orion5x_cpu_win_can_remap(int win) | |||
84 | orion5x_pcie_id(&dev, &rev); | 84 | orion5x_pcie_id(&dev, &rev); |
85 | if ((dev == MV88F5281_DEV_ID && win < 4) | 85 | if ((dev == MV88F5281_DEV_ID && win < 4) |
86 | || (dev == MV88F5182_DEV_ID && win < 2) | 86 | || (dev == MV88F5182_DEV_ID && win < 2) |
87 | || (dev == MV88F5181_DEV_ID && win < 2)) | 87 | || (dev == MV88F5181_DEV_ID && win < 2) |
88 | || (dev == MV88F6183_DEV_ID && win < 4)) | ||
88 | return 1; | 89 | return 1; |
89 | 90 | ||
90 | return 0; | 91 | return 0; |
diff --git a/arch/arm/mach-orion5x/d2net-setup.c b/arch/arm/mach-orion5x/d2net-setup.c new file mode 100644 index 000000000000..9d4bf763f25b --- /dev/null +++ b/arch/arm/mach-orion5x/d2net-setup.c | |||
@@ -0,0 +1,365 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-orion5x/d2net-setup.c | ||
3 | * | ||
4 | * LaCie d2Network and Big Disk Network NAS setup | ||
5 | * | ||
6 | * Copyright (C) 2009 Simon Guinot <sguinot@lacie.com> | ||
7 | * | ||
8 | * This file is licensed under the terms of the GNU General Public | ||
9 | * License version 2. This program is licensed "as is" without any | ||
10 | * warranty of any kind, whether express or implied. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/pci.h> | ||
17 | #include <linux/irq.h> | ||
18 | #include <linux/mtd/physmap.h> | ||
19 | #include <linux/mv643xx_eth.h> | ||
20 | #include <linux/leds.h> | ||
21 | #include <linux/gpio_keys.h> | ||
22 | #include <linux/input.h> | ||
23 | #include <linux/i2c.h> | ||
24 | #include <linux/ata_platform.h> | ||
25 | #include <linux/gpio.h> | ||
26 | #include <asm/mach-types.h> | ||
27 | #include <asm/mach/arch.h> | ||
28 | #include <asm/mach/pci.h> | ||
29 | #include <mach/orion5x.h> | ||
30 | #include "common.h" | ||
31 | #include "mpp.h" | ||
32 | |||
33 | /***************************************************************************** | ||
34 | * LaCie d2 Network Info | ||
35 | ****************************************************************************/ | ||
36 | |||
37 | /* | ||
38 | * 512KB NOR flash Device bus boot chip select | ||
39 | */ | ||
40 | |||
41 | #define D2NET_NOR_BOOT_BASE 0xfff80000 | ||
42 | #define D2NET_NOR_BOOT_SIZE SZ_512K | ||
43 | |||
44 | /***************************************************************************** | ||
45 | * 512KB NOR Flash on Boot Device | ||
46 | ****************************************************************************/ | ||
47 | |||
48 | /* | ||
49 | * TODO: Check write support on flash MX29LV400CBTC-70G | ||
50 | */ | ||
51 | |||
52 | static struct mtd_partition d2net_partitions[] = { | ||
53 | { | ||
54 | .name = "Full512kb", | ||
55 | .size = MTDPART_SIZ_FULL, | ||
56 | .offset = 0, | ||
57 | .mask_flags = MTD_WRITEABLE, | ||
58 | }, | ||
59 | }; | ||
60 | |||
61 | static struct physmap_flash_data d2net_nor_flash_data = { | ||
62 | .width = 1, | ||
63 | .parts = d2net_partitions, | ||
64 | .nr_parts = ARRAY_SIZE(d2net_partitions), | ||
65 | }; | ||
66 | |||
67 | static struct resource d2net_nor_flash_resource = { | ||
68 | .flags = IORESOURCE_MEM, | ||
69 | .start = D2NET_NOR_BOOT_BASE, | ||
70 | .end = D2NET_NOR_BOOT_BASE | ||
71 | + D2NET_NOR_BOOT_SIZE - 1, | ||
72 | }; | ||
73 | |||
74 | static struct platform_device d2net_nor_flash = { | ||
75 | .name = "physmap-flash", | ||
76 | .id = 0, | ||
77 | .dev = { | ||
78 | .platform_data = &d2net_nor_flash_data, | ||
79 | }, | ||
80 | .num_resources = 1, | ||
81 | .resource = &d2net_nor_flash_resource, | ||
82 | }; | ||
83 | |||
84 | /***************************************************************************** | ||
85 | * Ethernet | ||
86 | ****************************************************************************/ | ||
87 | |||
88 | static struct mv643xx_eth_platform_data d2net_eth_data = { | ||
89 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | ||
90 | }; | ||
91 | |||
92 | /***************************************************************************** | ||
93 | * I2C devices | ||
94 | ****************************************************************************/ | ||
95 | |||
96 | /* | ||
97 | * i2c addr | chip | description | ||
98 | * 0x32 | Ricoh 5C372b | RTC | ||
99 | * 0x3e | GMT G762 | PWM fan controller | ||
100 | * 0x50 | HT24LC08 | eeprom (1kB) | ||
101 | * | ||
102 | * TODO: Add G762 support to the g760a driver. | ||
103 | */ | ||
104 | static struct i2c_board_info __initdata d2net_i2c_devices[] = { | ||
105 | { | ||
106 | I2C_BOARD_INFO("rs5c372b", 0x32), | ||
107 | }, { | ||
108 | I2C_BOARD_INFO("24c08", 0x50), | ||
109 | }, | ||
110 | }; | ||
111 | |||
112 | /***************************************************************************** | ||
113 | * SATA | ||
114 | ****************************************************************************/ | ||
115 | |||
116 | static struct mv_sata_platform_data d2net_sata_data = { | ||
117 | .n_ports = 2, | ||
118 | }; | ||
119 | |||
120 | #define D2NET_GPIO_SATA0_POWER 3 | ||
121 | #define D2NET_GPIO_SATA1_POWER 12 | ||
122 | |||
123 | static void __init d2net_sata_power_init(void) | ||
124 | { | ||
125 | int err; | ||
126 | |||
127 | err = gpio_request(D2NET_GPIO_SATA0_POWER, "SATA0 power"); | ||
128 | if (err == 0) { | ||
129 | err = gpio_direction_output(D2NET_GPIO_SATA0_POWER, 1); | ||
130 | if (err) | ||
131 | gpio_free(D2NET_GPIO_SATA0_POWER); | ||
132 | } | ||
133 | if (err) | ||
134 | pr_err("d2net: failed to configure SATA0 power GPIO\n"); | ||
135 | |||
136 | err = gpio_request(D2NET_GPIO_SATA1_POWER, "SATA1 power"); | ||
137 | if (err == 0) { | ||
138 | err = gpio_direction_output(D2NET_GPIO_SATA1_POWER, 1); | ||
139 | if (err) | ||
140 | gpio_free(D2NET_GPIO_SATA1_POWER); | ||
141 | } | ||
142 | if (err) | ||
143 | pr_err("d2net: failed to configure SATA1 power GPIO\n"); | ||
144 | } | ||
145 | |||
146 | /***************************************************************************** | ||
147 | * GPIO LED's | ||
148 | ****************************************************************************/ | ||
149 | |||
150 | /* | ||
151 | * The blue front LED is wired to the CPLD and can blink in relation with the | ||
152 | * SATA activity. This feature is disabled to make this LED compatible with | ||
153 | * the leds-gpio driver: MPP14 and MPP15 are configured to act like output | ||
154 | * GPIO's and have to stay in an active state. This is needed to set the blue | ||
155 | * LED in a "fix on" state regardless of the SATA activity. | ||
156 | * | ||
157 | * The following array detail the different LED registers and the combination | ||
158 | * of their possible values: | ||
159 | * | ||
160 | * led_off | blink_ctrl | SATA active | LED state | ||
161 | * | | | | ||
162 | * 1 | x | x | off | ||
163 | * 0 | 0 | 0 | off | ||
164 | * 0 | 1 | 0 | blink (rate 300ms) | ||
165 | * 0 | x | 1 | on | ||
166 | * | ||
167 | * Notes: The blue and the red front LED's can't be on at the same time. | ||
168 | * Red LED have priority. | ||
169 | */ | ||
170 | |||
171 | #define D2NET_GPIO_RED_LED 6 | ||
172 | #define D2NET_GPIO_BLUE_LED_BLINK_CTRL 16 | ||
173 | #define D2NET_GPIO_BLUE_LED_OFF 23 | ||
174 | #define D2NET_GPIO_SATA0_ACT 14 | ||
175 | #define D2NET_GPIO_SATA1_ACT 15 | ||
176 | |||
177 | static struct gpio_led d2net_leds[] = { | ||
178 | { | ||
179 | .name = "d2net:blue:power", | ||
180 | .gpio = D2NET_GPIO_BLUE_LED_OFF, | ||
181 | .active_low = 1, | ||
182 | }, | ||
183 | { | ||
184 | .name = "d2net:red:fail", | ||
185 | .gpio = D2NET_GPIO_RED_LED, | ||
186 | }, | ||
187 | }; | ||
188 | |||
189 | static struct gpio_led_platform_data d2net_led_data = { | ||
190 | .num_leds = ARRAY_SIZE(d2net_leds), | ||
191 | .leds = d2net_leds, | ||
192 | }; | ||
193 | |||
194 | static struct platform_device d2net_gpio_leds = { | ||
195 | .name = "leds-gpio", | ||
196 | .id = -1, | ||
197 | .dev = { | ||
198 | .platform_data = &d2net_led_data, | ||
199 | }, | ||
200 | }; | ||
201 | |||
202 | static void __init d2net_gpio_leds_init(void) | ||
203 | { | ||
204 | /* Configure GPIO over MPP max number. */ | ||
205 | orion_gpio_set_valid(D2NET_GPIO_BLUE_LED_OFF, 1); | ||
206 | |||
207 | if (gpio_request(D2NET_GPIO_SATA0_ACT, "LED SATA0 activity") != 0) | ||
208 | return; | ||
209 | if (gpio_direction_output(D2NET_GPIO_SATA0_ACT, 1) != 0) | ||
210 | goto err_free_1; | ||
211 | if (gpio_request(D2NET_GPIO_SATA1_ACT, "LED SATA1 activity") != 0) | ||
212 | goto err_free_1; | ||
213 | if (gpio_direction_output(D2NET_GPIO_SATA1_ACT, 1) != 0) | ||
214 | goto err_free_2; | ||
215 | platform_device_register(&d2net_gpio_leds); | ||
216 | return; | ||
217 | |||
218 | err_free_2: | ||
219 | gpio_free(D2NET_GPIO_SATA1_ACT); | ||
220 | err_free_1: | ||
221 | gpio_free(D2NET_GPIO_SATA0_ACT); | ||
222 | return; | ||
223 | } | ||
224 | |||
225 | /**************************************************************************** | ||
226 | * GPIO keys | ||
227 | ****************************************************************************/ | ||
228 | |||
229 | #define D2NET_GPIO_PUSH_BUTTON 18 | ||
230 | #define D2NET_GPIO_POWER_SWITCH_ON 8 | ||
231 | #define D2NET_GPIO_POWER_SWITCH_OFF 9 | ||
232 | |||
233 | #define D2NET_SWITCH_POWER_ON 0x1 | ||
234 | #define D2NET_SWITCH_POWER_OFF 0x2 | ||
235 | |||
236 | static struct gpio_keys_button d2net_buttons[] = { | ||
237 | { | ||
238 | .type = EV_SW, | ||
239 | .code = D2NET_SWITCH_POWER_OFF, | ||
240 | .gpio = D2NET_GPIO_POWER_SWITCH_OFF, | ||
241 | .desc = "Power rocker switch (auto|off)", | ||
242 | .active_low = 0, | ||
243 | }, | ||
244 | { | ||
245 | .type = EV_SW, | ||
246 | .code = D2NET_SWITCH_POWER_ON, | ||
247 | .gpio = D2NET_GPIO_POWER_SWITCH_ON, | ||
248 | .desc = "Power rocker switch (on|auto)", | ||
249 | .active_low = 0, | ||
250 | }, | ||
251 | { | ||
252 | .type = EV_KEY, | ||
253 | .code = KEY_POWER, | ||
254 | .gpio = D2NET_GPIO_PUSH_BUTTON, | ||
255 | .desc = "Front Push Button", | ||
256 | .active_low = 0, | ||
257 | }, | ||
258 | }; | ||
259 | |||
260 | static struct gpio_keys_platform_data d2net_button_data = { | ||
261 | .buttons = d2net_buttons, | ||
262 | .nbuttons = ARRAY_SIZE(d2net_buttons), | ||
263 | }; | ||
264 | |||
265 | static struct platform_device d2net_gpio_buttons = { | ||
266 | .name = "gpio-keys", | ||
267 | .id = -1, | ||
268 | .dev = { | ||
269 | .platform_data = &d2net_button_data, | ||
270 | }, | ||
271 | }; | ||
272 | |||
273 | /***************************************************************************** | ||
274 | * General Setup | ||
275 | ****************************************************************************/ | ||
276 | |||
277 | static struct orion5x_mpp_mode d2net_mpp_modes[] __initdata = { | ||
278 | { 0, MPP_GPIO }, /* Board ID (bit 0) */ | ||
279 | { 1, MPP_GPIO }, /* Board ID (bit 1) */ | ||
280 | { 2, MPP_GPIO }, /* Board ID (bit 2) */ | ||
281 | { 3, MPP_GPIO }, /* SATA 0 power */ | ||
282 | { 4, MPP_UNUSED }, | ||
283 | { 5, MPP_GPIO }, /* Fan fail detection */ | ||
284 | { 6, MPP_GPIO }, /* Red front LED */ | ||
285 | { 7, MPP_UNUSED }, | ||
286 | { 8, MPP_GPIO }, /* Rear power switch (on|auto) */ | ||
287 | { 9, MPP_GPIO }, /* Rear power switch (auto|off) */ | ||
288 | { 10, MPP_UNUSED }, | ||
289 | { 11, MPP_UNUSED }, | ||
290 | { 12, MPP_GPIO }, /* SATA 1 power */ | ||
291 | { 13, MPP_UNUSED }, | ||
292 | { 14, MPP_GPIO }, /* SATA 0 active */ | ||
293 | { 15, MPP_GPIO }, /* SATA 1 active */ | ||
294 | { 16, MPP_GPIO }, /* Blue front LED blink control */ | ||
295 | { 17, MPP_UNUSED }, | ||
296 | { 18, MPP_GPIO }, /* Front button (0 = Released, 1 = Pushed ) */ | ||
297 | { 19, MPP_UNUSED }, | ||
298 | { -1 } | ||
299 | /* 22: USB port 1 fuse (0 = Fail, 1 = Ok) */ | ||
300 | /* 23: Blue front LED off */ | ||
301 | /* 24: Inhibit board power off (0 = Disabled, 1 = Enabled) */ | ||
302 | }; | ||
303 | |||
304 | static void __init d2net_init(void) | ||
305 | { | ||
306 | /* | ||
307 | * Setup basic Orion functions. Need to be called early. | ||
308 | */ | ||
309 | orion5x_init(); | ||
310 | |||
311 | orion5x_mpp_conf(d2net_mpp_modes); | ||
312 | |||
313 | /* | ||
314 | * Configure peripherals. | ||
315 | */ | ||
316 | orion5x_ehci0_init(); | ||
317 | orion5x_eth_init(&d2net_eth_data); | ||
318 | orion5x_i2c_init(); | ||
319 | orion5x_uart0_init(); | ||
320 | |||
321 | d2net_sata_power_init(); | ||
322 | orion5x_sata_init(&d2net_sata_data); | ||
323 | |||
324 | orion5x_setup_dev_boot_win(D2NET_NOR_BOOT_BASE, | ||
325 | D2NET_NOR_BOOT_SIZE); | ||
326 | platform_device_register(&d2net_nor_flash); | ||
327 | |||
328 | platform_device_register(&d2net_gpio_buttons); | ||
329 | |||
330 | d2net_gpio_leds_init(); | ||
331 | |||
332 | pr_notice("d2net: Flash write are not yet supported.\n"); | ||
333 | |||
334 | i2c_register_board_info(0, d2net_i2c_devices, | ||
335 | ARRAY_SIZE(d2net_i2c_devices)); | ||
336 | } | ||
337 | |||
338 | /* Warning: LaCie use a wrong mach-type (0x20e=526) in their bootloader. */ | ||
339 | |||
340 | #ifdef CONFIG_MACH_D2NET | ||
341 | MACHINE_START(D2NET, "LaCie d2 Network") | ||
342 | .phys_io = ORION5X_REGS_PHYS_BASE, | ||
343 | .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC, | ||
344 | .boot_params = 0x00000100, | ||
345 | .init_machine = d2net_init, | ||
346 | .map_io = orion5x_map_io, | ||
347 | .init_irq = orion5x_init_irq, | ||
348 | .timer = &orion5x_timer, | ||
349 | .fixup = tag_fixup_mem32, | ||
350 | MACHINE_END | ||
351 | #endif | ||
352 | |||
353 | #ifdef CONFIG_MACH_BIGDISK | ||
354 | MACHINE_START(BIGDISK, "LaCie Big Disk Network") | ||
355 | .phys_io = ORION5X_REGS_PHYS_BASE, | ||
356 | .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC, | ||
357 | .boot_params = 0x00000100, | ||
358 | .init_machine = d2net_init, | ||
359 | .map_io = orion5x_map_io, | ||
360 | .init_irq = orion5x_init_irq, | ||
361 | .timer = &orion5x_timer, | ||
362 | .fixup = tag_fixup_mem32, | ||
363 | MACHINE_END | ||
364 | #endif | ||
365 | |||
diff --git a/arch/arm/mach-realview/Kconfig b/arch/arm/mach-realview/Kconfig index d4cfa2145386..dfc9b0bc6eb2 100644 --- a/arch/arm/mach-realview/Kconfig +++ b/arch/arm/mach-realview/Kconfig | |||
@@ -75,7 +75,7 @@ config MACH_REALVIEW_PBX | |||
75 | 75 | ||
76 | config REALVIEW_HIGH_PHYS_OFFSET | 76 | config REALVIEW_HIGH_PHYS_OFFSET |
77 | bool "High physical base address for the RealView platform" | 77 | bool "High physical base address for the RealView platform" |
78 | depends on !MACH_REALVIEW_PB1176 | 78 | depends on MMU && !MACH_REALVIEW_PB1176 |
79 | default y | 79 | default y |
80 | help | 80 | help |
81 | RealView boards other than PB1176 have the RAM available at | 81 | RealView boards other than PB1176 have the RAM available at |
diff --git a/arch/arm/mach-realview/include/mach/hardware.h b/arch/arm/mach-realview/include/mach/hardware.h index b42c14f89acb..8a638d15797f 100644 --- a/arch/arm/mach-realview/include/mach/hardware.h +++ b/arch/arm/mach-realview/include/mach/hardware.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <asm/sizes.h> | 25 | #include <asm/sizes.h> |
26 | 26 | ||
27 | /* macro to get at IO space when running virtually */ | 27 | /* macro to get at IO space when running virtually */ |
28 | #ifdef CONFIG_MMU | ||
28 | /* | 29 | /* |
29 | * Statically mapped addresses: | 30 | * Statically mapped addresses: |
30 | * | 31 | * |
@@ -33,6 +34,9 @@ | |||
33 | * 1fxx xxxx -> fexx xxxx | 34 | * 1fxx xxxx -> fexx xxxx |
34 | */ | 35 | */ |
35 | #define IO_ADDRESS(x) (((x) & 0x03ffffff) + 0xfb000000) | 36 | #define IO_ADDRESS(x) (((x) & 0x03ffffff) + 0xfb000000) |
37 | #else | ||
38 | #define IO_ADDRESS(x) (x) | ||
39 | #endif | ||
36 | #define __io_address(n) __io(IO_ADDRESS(n)) | 40 | #define __io_address(n) __io(IO_ADDRESS(n)) |
37 | 41 | ||
38 | #endif | 42 | #endif |
diff --git a/arch/arm/mach-realview/platsmp.c b/arch/arm/mach-realview/platsmp.c index ac0e83f1cc3a..a88458b4799d 100644 --- a/arch/arm/mach-realview/platsmp.c +++ b/arch/arm/mach-realview/platsmp.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
21 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
22 | #include <asm/localtimer.h> | 22 | #include <asm/localtimer.h> |
23 | #include <asm/unified.h> | ||
23 | 24 | ||
24 | #include <mach/board-eb.h> | 25 | #include <mach/board-eb.h> |
25 | #include <mach/board-pb11mp.h> | 26 | #include <mach/board-pb11mp.h> |
@@ -137,26 +138,19 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) | |||
137 | 138 | ||
138 | static void __init poke_milo(void) | 139 | static void __init poke_milo(void) |
139 | { | 140 | { |
140 | extern void secondary_startup(void); | ||
141 | |||
142 | /* nobody is to be released from the pen yet */ | 141 | /* nobody is to be released from the pen yet */ |
143 | pen_release = -1; | 142 | pen_release = -1; |
144 | 143 | ||
145 | /* | 144 | /* |
146 | * write the address of secondary startup into the system-wide | 145 | * Write the address of secondary startup into the system-wide flags |
147 | * flags register, then clear the bottom two bits, which is what | 146 | * register. The BootMonitor waits for this register to become |
148 | * BootMonitor is waiting for | 147 | * non-zero. |
149 | */ | 148 | */ |
150 | #if 1 | ||
151 | #define REALVIEW_SYS_FLAGSS_OFFSET 0x30 | 149 | #define REALVIEW_SYS_FLAGSS_OFFSET 0x30 |
152 | __raw_writel(virt_to_phys(realview_secondary_startup), | ||
153 | __io_address(REALVIEW_SYS_BASE) + | ||
154 | REALVIEW_SYS_FLAGSS_OFFSET); | ||
155 | #define REALVIEW_SYS_FLAGSC_OFFSET 0x34 | 150 | #define REALVIEW_SYS_FLAGSC_OFFSET 0x34 |
156 | __raw_writel(3, | 151 | __raw_writel(BSYM(virt_to_phys(realview_secondary_startup)), |
157 | __io_address(REALVIEW_SYS_BASE) + | 152 | __io_address(REALVIEW_SYS_BASE) + |
158 | REALVIEW_SYS_FLAGSC_OFFSET); | 153 | REALVIEW_SYS_FLAGSS_OFFSET); |
159 | #endif | ||
160 | 154 | ||
161 | mb(); | 155 | mb(); |
162 | } | 156 | } |
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index 03cd27d917b9..b270d6228fe2 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c | |||
@@ -159,7 +159,9 @@ union offset_union { | |||
159 | 159 | ||
160 | #define __get8_unaligned_check(ins,val,addr,err) \ | 160 | #define __get8_unaligned_check(ins,val,addr,err) \ |
161 | __asm__( \ | 161 | __asm__( \ |
162 | "1: "ins" %1, [%2], #1\n" \ | 162 | ARM( "1: "ins" %1, [%2], #1\n" ) \ |
163 | THUMB( "1: "ins" %1, [%2]\n" ) \ | ||
164 | THUMB( " add %2, %2, #1\n" ) \ | ||
163 | "2:\n" \ | 165 | "2:\n" \ |
164 | " .section .fixup,\"ax\"\n" \ | 166 | " .section .fixup,\"ax\"\n" \ |
165 | " .align 2\n" \ | 167 | " .align 2\n" \ |
@@ -215,7 +217,9 @@ union offset_union { | |||
215 | do { \ | 217 | do { \ |
216 | unsigned int err = 0, v = val, a = addr; \ | 218 | unsigned int err = 0, v = val, a = addr; \ |
217 | __asm__( FIRST_BYTE_16 \ | 219 | __asm__( FIRST_BYTE_16 \ |
218 | "1: "ins" %1, [%2], #1\n" \ | 220 | ARM( "1: "ins" %1, [%2], #1\n" ) \ |
221 | THUMB( "1: "ins" %1, [%2]\n" ) \ | ||
222 | THUMB( " add %2, %2, #1\n" ) \ | ||
219 | " mov %1, %1, "NEXT_BYTE"\n" \ | 223 | " mov %1, %1, "NEXT_BYTE"\n" \ |
220 | "2: "ins" %1, [%2]\n" \ | 224 | "2: "ins" %1, [%2]\n" \ |
221 | "3:\n" \ | 225 | "3:\n" \ |
@@ -245,11 +249,17 @@ union offset_union { | |||
245 | do { \ | 249 | do { \ |
246 | unsigned int err = 0, v = val, a = addr; \ | 250 | unsigned int err = 0, v = val, a = addr; \ |
247 | __asm__( FIRST_BYTE_32 \ | 251 | __asm__( FIRST_BYTE_32 \ |
248 | "1: "ins" %1, [%2], #1\n" \ | 252 | ARM( "1: "ins" %1, [%2], #1\n" ) \ |
253 | THUMB( "1: "ins" %1, [%2]\n" ) \ | ||
254 | THUMB( " add %2, %2, #1\n" ) \ | ||
249 | " mov %1, %1, "NEXT_BYTE"\n" \ | 255 | " mov %1, %1, "NEXT_BYTE"\n" \ |
250 | "2: "ins" %1, [%2], #1\n" \ | 256 | ARM( "2: "ins" %1, [%2], #1\n" ) \ |
257 | THUMB( "2: "ins" %1, [%2]\n" ) \ | ||
258 | THUMB( " add %2, %2, #1\n" ) \ | ||
251 | " mov %1, %1, "NEXT_BYTE"\n" \ | 259 | " mov %1, %1, "NEXT_BYTE"\n" \ |
252 | "3: "ins" %1, [%2], #1\n" \ | 260 | ARM( "3: "ins" %1, [%2], #1\n" ) \ |
261 | THUMB( "3: "ins" %1, [%2]\n" ) \ | ||
262 | THUMB( " add %2, %2, #1\n" ) \ | ||
253 | " mov %1, %1, "NEXT_BYTE"\n" \ | 263 | " mov %1, %1, "NEXT_BYTE"\n" \ |
254 | "4: "ins" %1, [%2]\n" \ | 264 | "4: "ins" %1, [%2]\n" \ |
255 | "5:\n" \ | 265 | "5:\n" \ |
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index be93ff02a98d..bda0ec31a4e2 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S | |||
@@ -21,7 +21,7 @@ | |||
21 | * | 21 | * |
22 | * Flush the whole D-cache. | 22 | * Flush the whole D-cache. |
23 | * | 23 | * |
24 | * Corrupted registers: r0-r5, r7, r9-r11 | 24 | * Corrupted registers: r0-r7, r9-r11 (r6 only in Thumb mode) |
25 | * | 25 | * |
26 | * - mm - mm_struct describing address space | 26 | * - mm - mm_struct describing address space |
27 | */ | 27 | */ |
@@ -51,8 +51,12 @@ loop1: | |||
51 | loop2: | 51 | loop2: |
52 | mov r9, r4 @ create working copy of max way size | 52 | mov r9, r4 @ create working copy of max way size |
53 | loop3: | 53 | loop3: |
54 | orr r11, r10, r9, lsl r5 @ factor way and cache number into r11 | 54 | ARM( orr r11, r10, r9, lsl r5 ) @ factor way and cache number into r11 |
55 | orr r11, r11, r7, lsl r2 @ factor index number into r11 | 55 | THUMB( lsl r6, r9, r5 ) |
56 | THUMB( orr r11, r10, r6 ) @ factor way and cache number into r11 | ||
57 | ARM( orr r11, r11, r7, lsl r2 ) @ factor index number into r11 | ||
58 | THUMB( lsl r6, r7, r2 ) | ||
59 | THUMB( orr r11, r11, r6 ) @ factor index number into r11 | ||
56 | mcr p15, 0, r11, c7, c14, 2 @ clean & invalidate by set/way | 60 | mcr p15, 0, r11, c7, c14, 2 @ clean & invalidate by set/way |
57 | subs r9, r9, #1 @ decrement the way | 61 | subs r9, r9, #1 @ decrement the way |
58 | bge loop3 | 62 | bge loop3 |
@@ -82,11 +86,13 @@ ENDPROC(v7_flush_dcache_all) | |||
82 | * | 86 | * |
83 | */ | 87 | */ |
84 | ENTRY(v7_flush_kern_cache_all) | 88 | ENTRY(v7_flush_kern_cache_all) |
85 | stmfd sp!, {r4-r5, r7, r9-r11, lr} | 89 | ARM( stmfd sp!, {r4-r5, r7, r9-r11, lr} ) |
90 | THUMB( stmfd sp!, {r4-r7, r9-r11, lr} ) | ||
86 | bl v7_flush_dcache_all | 91 | bl v7_flush_dcache_all |
87 | mov r0, #0 | 92 | mov r0, #0 |
88 | mcr p15, 0, r0, c7, c5, 0 @ I+BTB cache invalidate | 93 | mcr p15, 0, r0, c7, c5, 0 @ I+BTB cache invalidate |
89 | ldmfd sp!, {r4-r5, r7, r9-r11, lr} | 94 | ARM( ldmfd sp!, {r4-r5, r7, r9-r11, lr} ) |
95 | THUMB( ldmfd sp!, {r4-r7, r9-r11, lr} ) | ||
90 | mov pc, lr | 96 | mov pc, lr |
91 | ENDPROC(v7_flush_kern_cache_all) | 97 | ENDPROC(v7_flush_kern_cache_all) |
92 | 98 | ||
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 510c179b0ac8..b30925fcbcdc 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -36,7 +36,34 @@ | |||
36 | #define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PGDIR_SHIFT) | 36 | #define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PGDIR_SHIFT) |
37 | #define NUM_CONSISTENT_PTES (CONSISTENT_DMA_SIZE >> PGDIR_SHIFT) | 37 | #define NUM_CONSISTENT_PTES (CONSISTENT_DMA_SIZE >> PGDIR_SHIFT) |
38 | 38 | ||
39 | static u64 get_coherent_dma_mask(struct device *dev) | ||
40 | { | ||
41 | u64 mask = ISA_DMA_THRESHOLD; | ||
42 | |||
43 | if (dev) { | ||
44 | mask = dev->coherent_dma_mask; | ||
45 | |||
46 | /* | ||
47 | * Sanity check the DMA mask - it must be non-zero, and | ||
48 | * must be able to be satisfied by a DMA allocation. | ||
49 | */ | ||
50 | if (mask == 0) { | ||
51 | dev_warn(dev, "coherent DMA mask is unset\n"); | ||
52 | return 0; | ||
53 | } | ||
54 | |||
55 | if ((~mask) & ISA_DMA_THRESHOLD) { | ||
56 | dev_warn(dev, "coherent DMA mask %#llx is smaller " | ||
57 | "than system GFP_DMA mask %#llx\n", | ||
58 | mask, (unsigned long long)ISA_DMA_THRESHOLD); | ||
59 | return 0; | ||
60 | } | ||
61 | } | ||
39 | 62 | ||
63 | return mask; | ||
64 | } | ||
65 | |||
66 | #ifdef CONFIG_MMU | ||
40 | /* | 67 | /* |
41 | * These are the page tables (2MB each) covering uncached, DMA consistent allocations | 68 | * These are the page tables (2MB each) covering uncached, DMA consistent allocations |
42 | */ | 69 | */ |
@@ -152,7 +179,8 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | |||
152 | struct page *page; | 179 | struct page *page; |
153 | struct arm_vm_region *c; | 180 | struct arm_vm_region *c; |
154 | unsigned long order; | 181 | unsigned long order; |
155 | u64 mask = ISA_DMA_THRESHOLD, limit; | 182 | u64 mask = get_coherent_dma_mask(dev); |
183 | u64 limit; | ||
156 | 184 | ||
157 | if (!consistent_pte[0]) { | 185 | if (!consistent_pte[0]) { |
158 | printk(KERN_ERR "%s: not initialised\n", __func__); | 186 | printk(KERN_ERR "%s: not initialised\n", __func__); |
@@ -160,25 +188,8 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | |||
160 | return NULL; | 188 | return NULL; |
161 | } | 189 | } |
162 | 190 | ||
163 | if (dev) { | 191 | if (!mask) |
164 | mask = dev->coherent_dma_mask; | 192 | goto no_page; |
165 | |||
166 | /* | ||
167 | * Sanity check the DMA mask - it must be non-zero, and | ||
168 | * must be able to be satisfied by a DMA allocation. | ||
169 | */ | ||
170 | if (mask == 0) { | ||
171 | dev_warn(dev, "coherent DMA mask is unset\n"); | ||
172 | goto no_page; | ||
173 | } | ||
174 | |||
175 | if ((~mask) & ISA_DMA_THRESHOLD) { | ||
176 | dev_warn(dev, "coherent DMA mask %#llx is smaller " | ||
177 | "than system GFP_DMA mask %#llx\n", | ||
178 | mask, (unsigned long long)ISA_DMA_THRESHOLD); | ||
179 | goto no_page; | ||
180 | } | ||
181 | } | ||
182 | 193 | ||
183 | /* | 194 | /* |
184 | * Sanity check the allocation size. | 195 | * Sanity check the allocation size. |
@@ -267,6 +278,31 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | |||
267 | *handle = ~0; | 278 | *handle = ~0; |
268 | return NULL; | 279 | return NULL; |
269 | } | 280 | } |
281 | #else /* !CONFIG_MMU */ | ||
282 | static void * | ||
283 | __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | ||
284 | pgprot_t prot) | ||
285 | { | ||
286 | void *virt; | ||
287 | u64 mask = get_coherent_dma_mask(dev); | ||
288 | |||
289 | if (!mask) | ||
290 | goto error; | ||
291 | |||
292 | if (mask != 0xffffffff) | ||
293 | gfp |= GFP_DMA; | ||
294 | virt = kmalloc(size, gfp); | ||
295 | if (!virt) | ||
296 | goto error; | ||
297 | |||
298 | *handle = virt_to_dma(dev, virt); | ||
299 | return virt; | ||
300 | |||
301 | error: | ||
302 | *handle = ~0; | ||
303 | return NULL; | ||
304 | } | ||
305 | #endif /* CONFIG_MMU */ | ||
270 | 306 | ||
271 | /* | 307 | /* |
272 | * Allocate DMA-coherent memory space and return both the kernel remapped | 308 | * Allocate DMA-coherent memory space and return both the kernel remapped |
@@ -311,9 +347,10 @@ EXPORT_SYMBOL(dma_alloc_writecombine); | |||
311 | static int dma_mmap(struct device *dev, struct vm_area_struct *vma, | 347 | static int dma_mmap(struct device *dev, struct vm_area_struct *vma, |
312 | void *cpu_addr, dma_addr_t dma_addr, size_t size) | 348 | void *cpu_addr, dma_addr_t dma_addr, size_t size) |
313 | { | 349 | { |
350 | int ret = -ENXIO; | ||
351 | #ifdef CONFIG_MMU | ||
314 | unsigned long flags, user_size, kern_size; | 352 | unsigned long flags, user_size, kern_size; |
315 | struct arm_vm_region *c; | 353 | struct arm_vm_region *c; |
316 | int ret = -ENXIO; | ||
317 | 354 | ||
318 | user_size = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; | 355 | user_size = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; |
319 | 356 | ||
@@ -334,6 +371,7 @@ static int dma_mmap(struct device *dev, struct vm_area_struct *vma, | |||
334 | vma->vm_page_prot); | 371 | vma->vm_page_prot); |
335 | } | 372 | } |
336 | } | 373 | } |
374 | #endif /* CONFIG_MMU */ | ||
337 | 375 | ||
338 | return ret; | 376 | return ret; |
339 | } | 377 | } |
@@ -358,6 +396,7 @@ EXPORT_SYMBOL(dma_mmap_writecombine); | |||
358 | * free a page as defined by the above mapping. | 396 | * free a page as defined by the above mapping. |
359 | * Must not be called with IRQs disabled. | 397 | * Must not be called with IRQs disabled. |
360 | */ | 398 | */ |
399 | #ifdef CONFIG_MMU | ||
361 | void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t handle) | 400 | void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t handle) |
362 | { | 401 | { |
363 | struct arm_vm_region *c; | 402 | struct arm_vm_region *c; |
@@ -444,6 +483,14 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr | |||
444 | __func__, cpu_addr); | 483 | __func__, cpu_addr); |
445 | dump_stack(); | 484 | dump_stack(); |
446 | } | 485 | } |
486 | #else /* !CONFIG_MMU */ | ||
487 | void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t handle) | ||
488 | { | ||
489 | if (dma_release_from_coherent(dev, get_order(size), cpu_addr)) | ||
490 | return; | ||
491 | kfree(cpu_addr); | ||
492 | } | ||
493 | #endif /* CONFIG_MMU */ | ||
447 | EXPORT_SYMBOL(dma_free_coherent); | 494 | EXPORT_SYMBOL(dma_free_coherent); |
448 | 495 | ||
449 | /* | 496 | /* |
@@ -451,10 +498,12 @@ EXPORT_SYMBOL(dma_free_coherent); | |||
451 | */ | 498 | */ |
452 | static int __init consistent_init(void) | 499 | static int __init consistent_init(void) |
453 | { | 500 | { |
501 | int ret = 0; | ||
502 | #ifdef CONFIG_MMU | ||
454 | pgd_t *pgd; | 503 | pgd_t *pgd; |
455 | pmd_t *pmd; | 504 | pmd_t *pmd; |
456 | pte_t *pte; | 505 | pte_t *pte; |
457 | int ret = 0, i = 0; | 506 | int i = 0; |
458 | u32 base = CONSISTENT_BASE; | 507 | u32 base = CONSISTENT_BASE; |
459 | 508 | ||
460 | do { | 509 | do { |
@@ -477,6 +526,7 @@ static int __init consistent_init(void) | |||
477 | consistent_pte[i++] = pte; | 526 | consistent_pte[i++] = pte; |
478 | base += (1 << PGDIR_SHIFT); | 527 | base += (1 << PGDIR_SHIFT); |
479 | } while (base < CONSISTENT_END); | 528 | } while (base < CONSISTENT_END); |
529 | #endif /* !CONFIG_MMU */ | ||
480 | 530 | ||
481 | return ret; | 531 | return ret; |
482 | } | 532 | } |
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index 6fdcbb709827..556c8daf087d 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/kprobes.h> | 16 | #include <linux/kprobes.h> |
17 | #include <linux/uaccess.h> | 17 | #include <linux/uaccess.h> |
18 | #include <linux/page-flags.h> | 18 | #include <linux/page-flags.h> |
19 | #include <linux/sched.h> | ||
19 | 20 | ||
20 | #include <asm/system.h> | 21 | #include <asm/system.h> |
21 | #include <asm/pgtable.h> | 22 | #include <asm/pgtable.h> |
@@ -23,6 +24,7 @@ | |||
23 | 24 | ||
24 | #include "fault.h" | 25 | #include "fault.h" |
25 | 26 | ||
27 | #ifdef CONFIG_MMU | ||
26 | 28 | ||
27 | #ifdef CONFIG_KPROBES | 29 | #ifdef CONFIG_KPROBES |
28 | static inline int notify_page_fault(struct pt_regs *regs, unsigned int fsr) | 30 | static inline int notify_page_fault(struct pt_regs *regs, unsigned int fsr) |
@@ -97,6 +99,10 @@ void show_pte(struct mm_struct *mm, unsigned long addr) | |||
97 | 99 | ||
98 | printk("\n"); | 100 | printk("\n"); |
99 | } | 101 | } |
102 | #else /* CONFIG_MMU */ | ||
103 | void show_pte(struct mm_struct *mm, unsigned long addr) | ||
104 | { } | ||
105 | #endif /* CONFIG_MMU */ | ||
100 | 106 | ||
101 | /* | 107 | /* |
102 | * Oops. The kernel tried to access some page that wasn't present. | 108 | * Oops. The kernel tried to access some page that wasn't present. |
@@ -171,6 +177,7 @@ void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
171 | __do_kernel_fault(mm, addr, fsr, regs); | 177 | __do_kernel_fault(mm, addr, fsr, regs); |
172 | } | 178 | } |
173 | 179 | ||
180 | #ifdef CONFIG_MMU | ||
174 | #define VM_FAULT_BADMAP 0x010000 | 181 | #define VM_FAULT_BADMAP 0x010000 |
175 | #define VM_FAULT_BADACCESS 0x020000 | 182 | #define VM_FAULT_BADACCESS 0x020000 |
176 | 183 | ||
@@ -322,6 +329,13 @@ no_context: | |||
322 | __do_kernel_fault(mm, addr, fsr, regs); | 329 | __do_kernel_fault(mm, addr, fsr, regs); |
323 | return 0; | 330 | return 0; |
324 | } | 331 | } |
332 | #else /* CONFIG_MMU */ | ||
333 | static int | ||
334 | do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | ||
335 | { | ||
336 | return 0; | ||
337 | } | ||
338 | #endif /* CONFIG_MMU */ | ||
325 | 339 | ||
326 | /* | 340 | /* |
327 | * First Level Translation Fault Handler | 341 | * First Level Translation Fault Handler |
@@ -340,6 +354,7 @@ no_context: | |||
340 | * interrupt or a critical region, and should only copy the information | 354 | * interrupt or a critical region, and should only copy the information |
341 | * from the master page table, nothing more. | 355 | * from the master page table, nothing more. |
342 | */ | 356 | */ |
357 | #ifdef CONFIG_MMU | ||
343 | static int __kprobes | 358 | static int __kprobes |
344 | do_translation_fault(unsigned long addr, unsigned int fsr, | 359 | do_translation_fault(unsigned long addr, unsigned int fsr, |
345 | struct pt_regs *regs) | 360 | struct pt_regs *regs) |
@@ -378,6 +393,14 @@ bad_area: | |||
378 | do_bad_area(addr, fsr, regs); | 393 | do_bad_area(addr, fsr, regs); |
379 | return 0; | 394 | return 0; |
380 | } | 395 | } |
396 | #else /* CONFIG_MMU */ | ||
397 | static int | ||
398 | do_translation_fault(unsigned long addr, unsigned int fsr, | ||
399 | struct pt_regs *regs) | ||
400 | { | ||
401 | return 0; | ||
402 | } | ||
403 | #endif /* CONFIG_MMU */ | ||
381 | 404 | ||
382 | /* | 405 | /* |
383 | * Some section permission faults need to be handled gracefully. | 406 | * Some section permission faults need to be handled gracefully. |
diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c index ad7bacc693b2..900811cc9130 100644 --- a/arch/arm/mm/nommu.c +++ b/arch/arm/mm/nommu.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <asm/cacheflush.h> | 12 | #include <asm/cacheflush.h> |
13 | #include <asm/sections.h> | 13 | #include <asm/sections.h> |
14 | #include <asm/page.h> | 14 | #include <asm/page.h> |
15 | #include <asm/setup.h> | ||
15 | #include <asm/mach/arch.h> | 16 | #include <asm/mach/arch.h> |
16 | 17 | ||
17 | #include "mm.h" | 18 | #include "mm.h" |
diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S index 54b1f721dec8..f1559c227784 100644 --- a/arch/arm/mm/proc-macros.S +++ b/arch/arm/mm/proc-macros.S | |||
@@ -77,6 +77,7 @@ | |||
77 | * Sanity check the PTE configuration for the code below - which makes | 77 | * Sanity check the PTE configuration for the code below - which makes |
78 | * certain assumptions about how these bits are layed out. | 78 | * certain assumptions about how these bits are layed out. |
79 | */ | 79 | */ |
80 | #ifdef CONFIG_MMU | ||
80 | #if L_PTE_SHARED != PTE_EXT_SHARED | 81 | #if L_PTE_SHARED != PTE_EXT_SHARED |
81 | #error PTE shared bit mismatch | 82 | #error PTE shared bit mismatch |
82 | #endif | 83 | #endif |
@@ -90,6 +91,7 @@ | |||
90 | L_PTE_FILE+L_PTE_PRESENT) > L_PTE_SHARED | 91 | L_PTE_FILE+L_PTE_PRESENT) > L_PTE_SHARED |
91 | #error Invalid Linux PTE bit settings | 92 | #error Invalid Linux PTE bit settings |
92 | #endif | 93 | #endif |
94 | #endif /* CONFIG_MMU */ | ||
93 | 95 | ||
94 | /* | 96 | /* |
95 | * The ARMv6 and ARMv7 set_pte_ext translation function. | 97 | * The ARMv6 and ARMv7 set_pte_ext translation function. |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 180a08d03a03..f3fa1c32fe92 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -127,7 +127,9 @@ ENDPROC(cpu_v7_switch_mm) | |||
127 | */ | 127 | */ |
128 | ENTRY(cpu_v7_set_pte_ext) | 128 | ENTRY(cpu_v7_set_pte_ext) |
129 | #ifdef CONFIG_MMU | 129 | #ifdef CONFIG_MMU |
130 | str r1, [r0], #-2048 @ linux version | 130 | ARM( str r1, [r0], #-2048 ) @ linux version |
131 | THUMB( str r1, [r0] ) @ linux version | ||
132 | THUMB( sub r0, r0, #2048 ) | ||
131 | 133 | ||
132 | bic r3, r1, #0x000003f0 | 134 | bic r3, r1, #0x000003f0 |
133 | bic r3, r3, #PTE_TYPE_MASK | 135 | bic r3, r3, #PTE_TYPE_MASK |
@@ -232,7 +234,6 @@ __v7_setup: | |||
232 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 | 234 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 |
233 | mov r10, #0x1f @ domains 0, 1 = manager | 235 | mov r10, #0x1f @ domains 0, 1 = manager |
234 | mcr p15, 0, r10, c3, c0, 0 @ load domain access register | 236 | mcr p15, 0, r10, c3, c0, 0 @ load domain access register |
235 | #endif | ||
236 | /* | 237 | /* |
237 | * Memory region attributes with SCTLR.TRE=1 | 238 | * Memory region attributes with SCTLR.TRE=1 |
238 | * | 239 | * |
@@ -265,6 +266,7 @@ __v7_setup: | |||
265 | ldr r6, =0x40e040e0 @ NMRR | 266 | ldr r6, =0x40e040e0 @ NMRR |
266 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR | 267 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR |
267 | mcr p15, 0, r6, c10, c2, 1 @ write NMRR | 268 | mcr p15, 0, r6, c10, c2, 1 @ write NMRR |
269 | #endif | ||
268 | adr r5, v7_crval | 270 | adr r5, v7_crval |
269 | ldmia r5, {r5, r6} | 271 | ldmia r5, {r5, r6} |
270 | #ifdef CONFIG_CPU_ENDIAN_BE8 | 272 | #ifdef CONFIG_CPU_ENDIAN_BE8 |
@@ -273,6 +275,7 @@ __v7_setup: | |||
273 | mrc p15, 0, r0, c1, c0, 0 @ read control register | 275 | mrc p15, 0, r0, c1, c0, 0 @ read control register |
274 | bic r0, r0, r5 @ clear bits them | 276 | bic r0, r0, r5 @ clear bits them |
275 | orr r0, r0, r6 @ set them | 277 | orr r0, r0, r6 @ set them |
278 | THUMB( orr r0, r0, #1 << 30 ) @ Thumb exceptions | ||
276 | mov pc, lr @ return to head.S:__ret | 279 | mov pc, lr @ return to head.S:__ret |
277 | ENDPROC(__v7_setup) | 280 | ENDPROC(__v7_setup) |
278 | 281 | ||
diff --git a/arch/arm/plat-mxc/Kconfig b/arch/arm/plat-mxc/Kconfig index 8986b7412235..ca5c7c226341 100644 --- a/arch/arm/plat-mxc/Kconfig +++ b/arch/arm/plat-mxc/Kconfig | |||
@@ -9,6 +9,7 @@ choice | |||
9 | config ARCH_MX1 | 9 | config ARCH_MX1 |
10 | bool "MX1-based" | 10 | bool "MX1-based" |
11 | select CPU_ARM920T | 11 | select CPU_ARM920T |
12 | select COMMON_CLKDEV | ||
12 | help | 13 | help |
13 | This enables support for systems based on the Freescale i.MX1 family | 14 | This enables support for systems based on the Freescale i.MX1 family |
14 | 15 | ||
@@ -19,6 +20,13 @@ config ARCH_MX2 | |||
19 | help | 20 | help |
20 | This enables support for systems based on the Freescale i.MX2 family | 21 | This enables support for systems based on the Freescale i.MX2 family |
21 | 22 | ||
23 | config ARCH_MX25 | ||
24 | bool "MX25-based" | ||
25 | select CPU_ARM926T | ||
26 | select COMMON_CLKDEV | ||
27 | help | ||
28 | This enables support for systems based on the Freescale i.MX25 family | ||
29 | |||
22 | config ARCH_MX3 | 30 | config ARCH_MX3 |
23 | bool "MX3-based" | 31 | bool "MX3-based" |
24 | select CPU_V6 | 32 | select CPU_V6 |
@@ -26,11 +34,20 @@ config ARCH_MX3 | |||
26 | help | 34 | help |
27 | This enables support for systems based on the Freescale i.MX3 family | 35 | This enables support for systems based on the Freescale i.MX3 family |
28 | 36 | ||
37 | config ARCH_MXC91231 | ||
38 | bool "MXC91231-based" | ||
39 | select CPU_V6 | ||
40 | select COMMON_CLKDEV | ||
41 | help | ||
42 | This enables support for systems based on the Freescale MXC91231 family | ||
43 | |||
29 | endchoice | 44 | endchoice |
30 | 45 | ||
31 | source "arch/arm/mach-mx1/Kconfig" | 46 | source "arch/arm/mach-mx1/Kconfig" |
32 | source "arch/arm/mach-mx2/Kconfig" | 47 | source "arch/arm/mach-mx2/Kconfig" |
33 | source "arch/arm/mach-mx3/Kconfig" | 48 | source "arch/arm/mach-mx3/Kconfig" |
49 | source "arch/arm/mach-mx25/Kconfig" | ||
50 | source "arch/arm/mach-mxc91231/Kconfig" | ||
34 | 51 | ||
35 | endmenu | 52 | endmenu |
36 | 53 | ||
diff --git a/arch/arm/plat-mxc/clock.c b/arch/arm/plat-mxc/clock.c index 92e13566cd4f..9e8fbd57495c 100644 --- a/arch/arm/plat-mxc/clock.c +++ b/arch/arm/plat-mxc/clock.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/string.h> | 39 | #include <linux/string.h> |
40 | 40 | ||
41 | #include <mach/clock.h> | 41 | #include <mach/clock.h> |
42 | #include <mach/hardware.h> | ||
42 | 43 | ||
43 | static LIST_HEAD(clocks); | 44 | static LIST_HEAD(clocks); |
44 | static DEFINE_MUTEX(clocks_mutex); | 45 | static DEFINE_MUTEX(clocks_mutex); |
@@ -47,76 +48,6 @@ static DEFINE_MUTEX(clocks_mutex); | |||
47 | * Standard clock functions defined in include/linux/clk.h | 48 | * Standard clock functions defined in include/linux/clk.h |
48 | *-------------------------------------------------------------------------*/ | 49 | *-------------------------------------------------------------------------*/ |
49 | 50 | ||
50 | /* | ||
51 | * All the code inside #ifndef CONFIG_COMMON_CLKDEV can be removed once all | ||
52 | * MXC architectures have switched to using clkdev. | ||
53 | */ | ||
54 | #ifndef CONFIG_COMMON_CLKDEV | ||
55 | /* | ||
56 | * Retrieve a clock by name. | ||
57 | * | ||
58 | * Note that we first try to use device id on the bus | ||
59 | * and clock name. If this fails, we try to use "<name>.<id>". If this fails, | ||
60 | * we try to use clock name only. | ||
61 | * The reference count to the clock's module owner ref count is incremented. | ||
62 | */ | ||
63 | struct clk *clk_get(struct device *dev, const char *id) | ||
64 | { | ||
65 | struct clk *p, *clk = ERR_PTR(-ENOENT); | ||
66 | int idno; | ||
67 | const char *str; | ||
68 | |||
69 | if (id == NULL) | ||
70 | return clk; | ||
71 | |||
72 | if (dev == NULL || dev->bus != &platform_bus_type) | ||
73 | idno = -1; | ||
74 | else | ||
75 | idno = to_platform_device(dev)->id; | ||
76 | |||
77 | mutex_lock(&clocks_mutex); | ||
78 | |||
79 | list_for_each_entry(p, &clocks, node) { | ||
80 | if (p->id == idno && | ||
81 | strcmp(id, p->name) == 0 && try_module_get(p->owner)) { | ||
82 | clk = p; | ||
83 | goto found; | ||
84 | } | ||
85 | } | ||
86 | |||
87 | str = strrchr(id, '.'); | ||
88 | if (str) { | ||
89 | int cnt = str - id; | ||
90 | str++; | ||
91 | idno = simple_strtol(str, NULL, 10); | ||
92 | list_for_each_entry(p, &clocks, node) { | ||
93 | if (p->id == idno && | ||
94 | strlen(p->name) == cnt && | ||
95 | strncmp(id, p->name, cnt) == 0 && | ||
96 | try_module_get(p->owner)) { | ||
97 | clk = p; | ||
98 | goto found; | ||
99 | } | ||
100 | } | ||
101 | } | ||
102 | |||
103 | list_for_each_entry(p, &clocks, node) { | ||
104 | if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) { | ||
105 | clk = p; | ||
106 | goto found; | ||
107 | } | ||
108 | } | ||
109 | |||
110 | printk(KERN_WARNING "clk: Unable to get requested clock: %s\n", id); | ||
111 | |||
112 | found: | ||
113 | mutex_unlock(&clocks_mutex); | ||
114 | |||
115 | return clk; | ||
116 | } | ||
117 | EXPORT_SYMBOL(clk_get); | ||
118 | #endif | ||
119 | |||
120 | static void __clk_disable(struct clk *clk) | 51 | static void __clk_disable(struct clk *clk) |
121 | { | 52 | { |
122 | if (clk == NULL || IS_ERR(clk)) | 53 | if (clk == NULL || IS_ERR(clk)) |
@@ -193,16 +124,6 @@ unsigned long clk_get_rate(struct clk *clk) | |||
193 | } | 124 | } |
194 | EXPORT_SYMBOL(clk_get_rate); | 125 | EXPORT_SYMBOL(clk_get_rate); |
195 | 126 | ||
196 | #ifndef CONFIG_COMMON_CLKDEV | ||
197 | /* Decrement the clock's module reference count */ | ||
198 | void clk_put(struct clk *clk) | ||
199 | { | ||
200 | if (clk && !IS_ERR(clk)) | ||
201 | module_put(clk->owner); | ||
202 | } | ||
203 | EXPORT_SYMBOL(clk_put); | ||
204 | #endif | ||
205 | |||
206 | /* Round the requested clock rate to the nearest supported | 127 | /* Round the requested clock rate to the nearest supported |
207 | * rate that is less than or equal to the requested rate. | 128 | * rate that is less than or equal to the requested rate. |
208 | * This is dependent on the clock's current parent. | 129 | * This is dependent on the clock's current parent. |
@@ -265,80 +186,6 @@ struct clk *clk_get_parent(struct clk *clk) | |||
265 | } | 186 | } |
266 | EXPORT_SYMBOL(clk_get_parent); | 187 | EXPORT_SYMBOL(clk_get_parent); |
267 | 188 | ||
268 | #ifndef CONFIG_COMMON_CLKDEV | ||
269 | /* | ||
270 | * Add a new clock to the clock tree. | ||
271 | */ | ||
272 | int clk_register(struct clk *clk) | ||
273 | { | ||
274 | if (clk == NULL || IS_ERR(clk)) | ||
275 | return -EINVAL; | ||
276 | |||
277 | mutex_lock(&clocks_mutex); | ||
278 | list_add(&clk->node, &clocks); | ||
279 | mutex_unlock(&clocks_mutex); | ||
280 | |||
281 | return 0; | ||
282 | } | ||
283 | EXPORT_SYMBOL(clk_register); | ||
284 | |||
285 | /* Remove a clock from the clock tree */ | ||
286 | void clk_unregister(struct clk *clk) | ||
287 | { | ||
288 | if (clk == NULL || IS_ERR(clk)) | ||
289 | return; | ||
290 | |||
291 | mutex_lock(&clocks_mutex); | ||
292 | list_del(&clk->node); | ||
293 | mutex_unlock(&clocks_mutex); | ||
294 | } | ||
295 | EXPORT_SYMBOL(clk_unregister); | ||
296 | |||
297 | #ifdef CONFIG_PROC_FS | ||
298 | static int mxc_clock_read_proc(char *page, char **start, off_t off, | ||
299 | int count, int *eof, void *data) | ||
300 | { | ||
301 | struct clk *clkp; | ||
302 | char *p = page; | ||
303 | int len; | ||
304 | |||
305 | list_for_each_entry(clkp, &clocks, node) { | ||
306 | p += sprintf(p, "%s-%d:\t\t%lu, %d", clkp->name, clkp->id, | ||
307 | clk_get_rate(clkp), clkp->usecount); | ||
308 | if (clkp->parent) | ||
309 | p += sprintf(p, ", %s-%d\n", clkp->parent->name, | ||
310 | clkp->parent->id); | ||
311 | else | ||
312 | p += sprintf(p, "\n"); | ||
313 | } | ||
314 | |||
315 | len = (p - page) - off; | ||
316 | if (len < 0) | ||
317 | len = 0; | ||
318 | |||
319 | *eof = (len <= count) ? 1 : 0; | ||
320 | *start = page + off; | ||
321 | |||
322 | return len; | ||
323 | } | ||
324 | |||
325 | static int __init mxc_setup_proc_entry(void) | ||
326 | { | ||
327 | struct proc_dir_entry *res; | ||
328 | |||
329 | res = create_proc_read_entry("cpu/clocks", 0, NULL, | ||
330 | mxc_clock_read_proc, NULL); | ||
331 | if (!res) { | ||
332 | printk(KERN_ERR "Failed to create proc/cpu/clocks\n"); | ||
333 | return -ENOMEM; | ||
334 | } | ||
335 | return 0; | ||
336 | } | ||
337 | |||
338 | late_initcall(mxc_setup_proc_entry); | ||
339 | #endif /* CONFIG_PROC_FS */ | ||
340 | #endif | ||
341 | |||
342 | /* | 189 | /* |
343 | * Get the resulting clock rate from a PLL register value and the input | 190 | * Get the resulting clock rate from a PLL register value and the input |
344 | * frequency. PLLs with this register layout can at least be found on | 191 | * frequency. PLLs with this register layout can at least be found on |
@@ -363,12 +210,11 @@ unsigned long mxc_decode_pll(unsigned int reg_val, u32 freq) | |||
363 | 210 | ||
364 | mfn_abs = mfn; | 211 | mfn_abs = mfn; |
365 | 212 | ||
366 | #if !defined CONFIG_ARCH_MX1 && !defined CONFIG_ARCH_MX21 | 213 | /* On all i.MXs except i.MX1 and i.MX21 mfn is a 10bit |
367 | if (mfn >= 0x200) { | 214 | * 2's complements number |
368 | mfn |= 0xFFFFFE00; | 215 | */ |
369 | mfn_abs = -mfn; | 216 | if (!cpu_is_mx1() && !cpu_is_mx21() && mfn >= 0x200) |
370 | } | 217 | mfn_abs = 0x400 - mfn; |
371 | #endif | ||
372 | 218 | ||
373 | freq *= 2; | 219 | freq *= 2; |
374 | freq /= pd + 1; | 220 | freq /= pd + 1; |
@@ -376,8 +222,10 @@ unsigned long mxc_decode_pll(unsigned int reg_val, u32 freq) | |||
376 | ll = (unsigned long long)freq * mfn_abs; | 222 | ll = (unsigned long long)freq * mfn_abs; |
377 | 223 | ||
378 | do_div(ll, mfd + 1); | 224 | do_div(ll, mfd + 1); |
379 | if (mfn < 0) | 225 | |
226 | if (!cpu_is_mx1() && !cpu_is_mx21() && mfn >= 0x200) | ||
380 | ll = -ll; | 227 | ll = -ll; |
228 | |||
381 | ll = (freq * mfi) + ll; | 229 | ll = (freq * mfi) + ll; |
382 | 230 | ||
383 | return ll; | 231 | return ll; |
diff --git a/arch/arm/plat-mxc/gpio.c b/arch/arm/plat-mxc/gpio.c index 7506d963be4b..cfc4a8b43e6a 100644 --- a/arch/arm/plat-mxc/gpio.c +++ b/arch/arm/plat-mxc/gpio.c | |||
@@ -29,6 +29,23 @@ | |||
29 | static struct mxc_gpio_port *mxc_gpio_ports; | 29 | static struct mxc_gpio_port *mxc_gpio_ports; |
30 | static int gpio_table_size; | 30 | static int gpio_table_size; |
31 | 31 | ||
32 | #define cpu_is_mx1_mx2() (cpu_is_mx1() || cpu_is_mx2()) | ||
33 | |||
34 | #define GPIO_DR (cpu_is_mx1_mx2() ? 0x1c : 0x00) | ||
35 | #define GPIO_GDIR (cpu_is_mx1_mx2() ? 0x00 : 0x04) | ||
36 | #define GPIO_PSR (cpu_is_mx1_mx2() ? 0x24 : 0x08) | ||
37 | #define GPIO_ICR1 (cpu_is_mx1_mx2() ? 0x28 : 0x0C) | ||
38 | #define GPIO_ICR2 (cpu_is_mx1_mx2() ? 0x2C : 0x10) | ||
39 | #define GPIO_IMR (cpu_is_mx1_mx2() ? 0x30 : 0x14) | ||
40 | #define GPIO_ISR (cpu_is_mx1_mx2() ? 0x34 : 0x18) | ||
41 | #define GPIO_ISR (cpu_is_mx1_mx2() ? 0x34 : 0x18) | ||
42 | |||
43 | #define GPIO_INT_LOW_LEV (cpu_is_mx1_mx2() ? 0x3 : 0x0) | ||
44 | #define GPIO_INT_HIGH_LEV (cpu_is_mx1_mx2() ? 0x2 : 0x1) | ||
45 | #define GPIO_INT_RISE_EDGE (cpu_is_mx1_mx2() ? 0x0 : 0x2) | ||
46 | #define GPIO_INT_FALL_EDGE (cpu_is_mx1_mx2() ? 0x1 : 0x3) | ||
47 | #define GPIO_INT_NONE 0x4 | ||
48 | |||
32 | /* Note: This driver assumes 32 GPIOs are handled in one register */ | 49 | /* Note: This driver assumes 32 GPIOs are handled in one register */ |
33 | 50 | ||
34 | static void _clear_gpio_irqstatus(struct mxc_gpio_port *port, u32 index) | 51 | static void _clear_gpio_irqstatus(struct mxc_gpio_port *port, u32 index) |
@@ -162,7 +179,6 @@ static void mxc_gpio_irq_handler(struct mxc_gpio_port *port, u32 irq_stat) | |||
162 | } | 179 | } |
163 | } | 180 | } |
164 | 181 | ||
165 | #if defined(CONFIG_ARCH_MX3) || defined(CONFIG_ARCH_MX1) | ||
166 | /* MX1 and MX3 has one interrupt *per* gpio port */ | 182 | /* MX1 and MX3 has one interrupt *per* gpio port */ |
167 | static void mx3_gpio_irq_handler(u32 irq, struct irq_desc *desc) | 183 | static void mx3_gpio_irq_handler(u32 irq, struct irq_desc *desc) |
168 | { | 184 | { |
@@ -174,9 +190,7 @@ static void mx3_gpio_irq_handler(u32 irq, struct irq_desc *desc) | |||
174 | 190 | ||
175 | mxc_gpio_irq_handler(port, irq_stat); | 191 | mxc_gpio_irq_handler(port, irq_stat); |
176 | } | 192 | } |
177 | #endif | ||
178 | 193 | ||
179 | #ifdef CONFIG_ARCH_MX2 | ||
180 | /* MX2 has one interrupt *for all* gpio ports */ | 194 | /* MX2 has one interrupt *for all* gpio ports */ |
181 | static void mx2_gpio_irq_handler(u32 irq, struct irq_desc *desc) | 195 | static void mx2_gpio_irq_handler(u32 irq, struct irq_desc *desc) |
182 | { | 196 | { |
@@ -195,7 +209,6 @@ static void mx2_gpio_irq_handler(u32 irq, struct irq_desc *desc) | |||
195 | mxc_gpio_irq_handler(&port[i], irq_stat); | 209 | mxc_gpio_irq_handler(&port[i], irq_stat); |
196 | } | 210 | } |
197 | } | 211 | } |
198 | #endif | ||
199 | 212 | ||
200 | static struct irq_chip gpio_irq_chip = { | 213 | static struct irq_chip gpio_irq_chip = { |
201 | .ack = gpio_ack_irq, | 214 | .ack = gpio_ack_irq, |
@@ -284,17 +297,18 @@ int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt) | |||
284 | /* its a serious configuration bug when it fails */ | 297 | /* its a serious configuration bug when it fails */ |
285 | BUG_ON( gpiochip_add(&port[i].chip) < 0 ); | 298 | BUG_ON( gpiochip_add(&port[i].chip) < 0 ); |
286 | 299 | ||
287 | #if defined(CONFIG_ARCH_MX3) || defined(CONFIG_ARCH_MX1) | 300 | if (cpu_is_mx1() || cpu_is_mx3() || cpu_is_mx25()) { |
288 | /* setup one handler for each entry */ | 301 | /* setup one handler for each entry */ |
289 | set_irq_chained_handler(port[i].irq, mx3_gpio_irq_handler); | 302 | set_irq_chained_handler(port[i].irq, mx3_gpio_irq_handler); |
290 | set_irq_data(port[i].irq, &port[i]); | 303 | set_irq_data(port[i].irq, &port[i]); |
291 | #endif | 304 | } |
305 | } | ||
306 | |||
307 | if (cpu_is_mx2()) { | ||
308 | /* setup one handler for all GPIO interrupts */ | ||
309 | set_irq_chained_handler(port[0].irq, mx2_gpio_irq_handler); | ||
310 | set_irq_data(port[0].irq, port); | ||
292 | } | 311 | } |
293 | 312 | ||
294 | #ifdef CONFIG_ARCH_MX2 | ||
295 | /* setup one handler for all GPIO interrupts */ | ||
296 | set_irq_chained_handler(port[0].irq, mx2_gpio_irq_handler); | ||
297 | set_irq_data(port[0].irq, port); | ||
298 | #endif | ||
299 | return 0; | 313 | return 0; |
300 | } | 314 | } |
diff --git a/arch/arm/plat-mxc/include/mach/board-armadillo5x0.h b/arch/arm/plat-mxc/include/mach/board-armadillo5x0.h index 8769e910e559..0376c133c9f4 100644 --- a/arch/arm/plat-mxc/include/mach/board-armadillo5x0.h +++ b/arch/arm/plat-mxc/include/mach/board-armadillo5x0.h | |||
@@ -12,11 +12,4 @@ | |||
12 | #ifndef __ASM_ARCH_MXC_BOARD_ARMADILLO5X0_H__ | 12 | #ifndef __ASM_ARCH_MXC_BOARD_ARMADILLO5X0_H__ |
13 | #define __ASM_ARCH_MXC_BOARD_ARMADILLO5X0_H__ | 13 | #define __ASM_ARCH_MXC_BOARD_ARMADILLO5X0_H__ |
14 | 14 | ||
15 | #include <mach/hardware.h> | ||
16 | |||
17 | /* mandatory for CONFIG_DEBUG_LL */ | ||
18 | |||
19 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
20 | #define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
21 | |||
22 | #endif | 15 | #endif |
diff --git a/arch/arm/plat-mxc/include/mach/board-eukrea_cpuimx27.h b/arch/arm/plat-mxc/include/mach/board-eukrea_cpuimx27.h new file mode 100644 index 000000000000..a1fd5830af48 --- /dev/null +++ b/arch/arm/plat-mxc/include/mach/board-eukrea_cpuimx27.h | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 Eric Benard - eric@eukrea.com | ||
3 | * | ||
4 | * Based on board-pcm038.h which is : | ||
5 | * Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de) | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version 2 | ||
10 | * of the License, or (at your option) any later version. | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
19 | * MA 02110-1301, USA. | ||
20 | */ | ||
21 | |||
22 | #ifndef __ASM_ARCH_MXC_BOARD_EUKREA_CPUIMX27_H__ | ||
23 | #define __ASM_ARCH_MXC_BOARD_EUKREA_CPUIMX27_H__ | ||
24 | |||
25 | #ifndef __ASSEMBLY__ | ||
26 | /* | ||
27 | * This CPU module needs a baseboard to work. After basic initializing | ||
28 | * its own devices, it calls baseboard's init function. | ||
29 | * TODO: Add your own baseboard init function and call it from | ||
30 | * inside eukrea_cpuimx27_init(). | ||
31 | * | ||
32 | * This example here is for the development board. Refer | ||
33 | * eukrea_mbimx27-baseboard.c | ||
34 | */ | ||
35 | |||
36 | extern void eukrea_mbimx27_baseboard_init(void); | ||
37 | |||
38 | #endif | ||
39 | |||
40 | #endif /* __ASM_ARCH_MXC_BOARD_EUKREA_CPUIMX27_H__ */ | ||
diff --git a/arch/arm/plat-mxc/include/mach/board-mx21ads.h b/arch/arm/plat-mxc/include/mach/board-mx21ads.h index 06701df74c42..0cf4fa29510c 100644 --- a/arch/arm/plat-mxc/include/mach/board-mx21ads.h +++ b/arch/arm/plat-mxc/include/mach/board-mx21ads.h | |||
@@ -15,12 +15,6 @@ | |||
15 | #define __ASM_ARCH_MXC_BOARD_MX21ADS_H__ | 15 | #define __ASM_ARCH_MXC_BOARD_MX21ADS_H__ |
16 | 16 | ||
17 | /* | 17 | /* |
18 | * MXC UART EVB board level configurations | ||
19 | */ | ||
20 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
21 | #define MXC_LL_UART_VADDR AIPI_IO_ADDRESS(UART1_BASE_ADDR) | ||
22 | |||
23 | /* | ||
24 | * Memory-mapped I/O on MX21ADS base board | 18 | * Memory-mapped I/O on MX21ADS base board |
25 | */ | 19 | */ |
26 | #define MX21ADS_MMIO_BASE_ADDR 0xF5000000 | 20 | #define MX21ADS_MMIO_BASE_ADDR 0xF5000000 |
diff --git a/arch/arm/plat-mxc/include/mach/board-mx27ads.h b/arch/arm/plat-mxc/include/mach/board-mx27ads.h index d42f4e6116f8..7776d230327f 100644 --- a/arch/arm/plat-mxc/include/mach/board-mx27ads.h +++ b/arch/arm/plat-mxc/include/mach/board-mx27ads.h | |||
@@ -26,12 +26,6 @@ | |||
26 | MXC_MAX_VIRTUAL_INTS) | 26 | MXC_MAX_VIRTUAL_INTS) |
27 | 27 | ||
28 | /* | 28 | /* |
29 | * MXC UART EVB board level configurations | ||
30 | */ | ||
31 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
32 | #define MXC_LL_UART_VADDR AIPI_IO_ADDRESS(UART1_BASE_ADDR) | ||
33 | |||
34 | /* | ||
35 | * @name Memory Size parameters | 29 | * @name Memory Size parameters |
36 | */ | 30 | */ |
37 | 31 | ||
diff --git a/arch/arm/plat-mxc/include/mach/board-mx27lite.h b/arch/arm/plat-mxc/include/mach/board-mx27lite.h index a870f8ea2443..ea87551d2736 100644 --- a/arch/arm/plat-mxc/include/mach/board-mx27lite.h +++ b/arch/arm/plat-mxc/include/mach/board-mx27lite.h | |||
@@ -11,9 +11,4 @@ | |||
11 | #ifndef __ASM_ARCH_MXC_BOARD_MX27LITE_H__ | 11 | #ifndef __ASM_ARCH_MXC_BOARD_MX27LITE_H__ |
12 | #define __ASM_ARCH_MXC_BOARD_MX27LITE_H__ | 12 | #define __ASM_ARCH_MXC_BOARD_MX27LITE_H__ |
13 | 13 | ||
14 | /* mandatory for CONFIG_DEBUG_LL */ | ||
15 | |||
16 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
17 | #define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
18 | |||
19 | #endif /* __ASM_ARCH_MXC_BOARD_MX27LITE_H__ */ | 14 | #endif /* __ASM_ARCH_MXC_BOARD_MX27LITE_H__ */ |
diff --git a/arch/arm/plat-mxc/include/mach/board-mx27pdk.h b/arch/arm/plat-mxc/include/mach/board-mx27pdk.h index 552b55d714d8..fec1bcfa9164 100644 --- a/arch/arm/plat-mxc/include/mach/board-mx27pdk.h +++ b/arch/arm/plat-mxc/include/mach/board-mx27pdk.h | |||
@@ -11,9 +11,4 @@ | |||
11 | #ifndef __ASM_ARCH_MXC_BOARD_MX27PDK_H__ | 11 | #ifndef __ASM_ARCH_MXC_BOARD_MX27PDK_H__ |
12 | #define __ASM_ARCH_MXC_BOARD_MX27PDK_H__ | 12 | #define __ASM_ARCH_MXC_BOARD_MX27PDK_H__ |
13 | 13 | ||
14 | /* mandatory for CONFIG_DEBUG_LL */ | ||
15 | |||
16 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
17 | #define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
18 | |||
19 | #endif /* __ASM_ARCH_MXC_BOARD_MX27PDK_H__ */ | 14 | #endif /* __ASM_ARCH_MXC_BOARD_MX27PDK_H__ */ |
diff --git a/arch/arm/plat-mxc/include/mach/board-mx31ads.h b/arch/arm/plat-mxc/include/mach/board-mx31ads.h index 06e6895f7f65..2cbfa35e82ff 100644 --- a/arch/arm/plat-mxc/include/mach/board-mx31ads.h +++ b/arch/arm/plat-mxc/include/mach/board-mx31ads.h | |||
@@ -114,9 +114,4 @@ | |||
114 | 114 | ||
115 | #define MXC_MAX_EXP_IO_LINES 16 | 115 | #define MXC_MAX_EXP_IO_LINES 16 |
116 | 116 | ||
117 | /* mandatory for CONFIG_DEBUG_LL */ | ||
118 | |||
119 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
120 | #define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
121 | |||
122 | #endif /* __ASM_ARCH_MXC_BOARD_MX31ADS_H__ */ | 117 | #endif /* __ASM_ARCH_MXC_BOARD_MX31ADS_H__ */ |
diff --git a/arch/arm/plat-mxc/include/mach/board-mx31lilly.h b/arch/arm/plat-mxc/include/mach/board-mx31lilly.h index 78cf31e22e4d..eb5a5024622e 100644 --- a/arch/arm/plat-mxc/include/mach/board-mx31lilly.h +++ b/arch/arm/plat-mxc/include/mach/board-mx31lilly.h | |||
@@ -22,11 +22,6 @@ | |||
22 | #ifndef __ASM_ARCH_MXC_BOARD_MX31LILLY_H__ | 22 | #ifndef __ASM_ARCH_MXC_BOARD_MX31LILLY_H__ |
23 | #define __ASM_ARCH_MXC_BOARD_MX31LILLY_H__ | 23 | #define __ASM_ARCH_MXC_BOARD_MX31LILLY_H__ |
24 | 24 | ||
25 | /* mandatory for CONFIG_LL_DEBUG */ | ||
26 | |||
27 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
28 | #define MXC_LL_UART_VADDR (AIPI_BASE_ADDR_VIRT + 0x0A000) | ||
29 | |||
30 | #ifndef __ASSEMBLY__ | 25 | #ifndef __ASSEMBLY__ |
31 | 26 | ||
32 | enum mx31lilly_boards { | 27 | enum mx31lilly_boards { |
diff --git a/arch/arm/plat-mxc/include/mach/board-mx31lite.h b/arch/arm/plat-mxc/include/mach/board-mx31lite.h index 52fbdf2d6f26..8e64325d6905 100644 --- a/arch/arm/plat-mxc/include/mach/board-mx31lite.h +++ b/arch/arm/plat-mxc/include/mach/board-mx31lite.h | |||
@@ -11,8 +11,5 @@ | |||
11 | #ifndef __ASM_ARCH_MXC_BOARD_MX31LITE_H__ | 11 | #ifndef __ASM_ARCH_MXC_BOARD_MX31LITE_H__ |
12 | #define __ASM_ARCH_MXC_BOARD_MX31LITE_H__ | 12 | #define __ASM_ARCH_MXC_BOARD_MX31LITE_H__ |
13 | 13 | ||
14 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
15 | #define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
16 | |||
17 | #endif /* __ASM_ARCH_MXC_BOARD_MX31LITE_H__ */ | 14 | #endif /* __ASM_ARCH_MXC_BOARD_MX31LITE_H__ */ |
18 | 15 | ||
diff --git a/arch/arm/plat-mxc/include/mach/board-mx31moboard.h b/arch/arm/plat-mxc/include/mach/board-mx31moboard.h index 303fd2434a21..d5be6b5a6acf 100644 --- a/arch/arm/plat-mxc/include/mach/board-mx31moboard.h +++ b/arch/arm/plat-mxc/include/mach/board-mx31moboard.h | |||
@@ -19,11 +19,6 @@ | |||
19 | #ifndef __ASM_ARCH_MXC_BOARD_MX31MOBOARD_H__ | 19 | #ifndef __ASM_ARCH_MXC_BOARD_MX31MOBOARD_H__ |
20 | #define __ASM_ARCH_MXC_BOARD_MX31MOBOARD_H__ | 20 | #define __ASM_ARCH_MXC_BOARD_MX31MOBOARD_H__ |
21 | 21 | ||
22 | /* mandatory for CONFIG_DEBUG_LL */ | ||
23 | |||
24 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
25 | #define MXC_LL_UART_VADDR (AIPI_BASE_ADDR_VIRT + 0x0A000) | ||
26 | |||
27 | #ifndef __ASSEMBLY__ | 22 | #ifndef __ASSEMBLY__ |
28 | 23 | ||
29 | enum mx31moboard_boards { | 24 | enum mx31moboard_boards { |
diff --git a/arch/arm/plat-mxc/include/mach/board-mx31pdk.h b/arch/arm/plat-mxc/include/mach/board-mx31pdk.h index 519bab3eb28b..2bbd6ed17f50 100644 --- a/arch/arm/plat-mxc/include/mach/board-mx31pdk.h +++ b/arch/arm/plat-mxc/include/mach/board-mx31pdk.h | |||
@@ -11,11 +11,6 @@ | |||
11 | #ifndef __ASM_ARCH_MXC_BOARD_MX31PDK_H__ | 11 | #ifndef __ASM_ARCH_MXC_BOARD_MX31PDK_H__ |
12 | #define __ASM_ARCH_MXC_BOARD_MX31PDK_H__ | 12 | #define __ASM_ARCH_MXC_BOARD_MX31PDK_H__ |
13 | 13 | ||
14 | /* mandatory for CONFIG_DEBUG_LL */ | ||
15 | |||
16 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
17 | #define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
18 | |||
19 | /* Definitions for components on the Debug board */ | 14 | /* Definitions for components on the Debug board */ |
20 | 15 | ||
21 | /* Base address of CPLD controller on the Debug board */ | 16 | /* Base address of CPLD controller on the Debug board */ |
diff --git a/arch/arm/plat-mxc/include/mach/board-mx35pdk.h b/arch/arm/plat-mxc/include/mach/board-mx35pdk.h index 1111037d6d9d..383f1c04df06 100644 --- a/arch/arm/plat-mxc/include/mach/board-mx35pdk.h +++ b/arch/arm/plat-mxc/include/mach/board-mx35pdk.h | |||
@@ -19,9 +19,4 @@ | |||
19 | #ifndef __ASM_ARCH_MXC_BOARD_MX35PDK_H__ | 19 | #ifndef __ASM_ARCH_MXC_BOARD_MX35PDK_H__ |
20 | #define __ASM_ARCH_MXC_BOARD_MX35PDK_H__ | 20 | #define __ASM_ARCH_MXC_BOARD_MX35PDK_H__ |
21 | 21 | ||
22 | /* mandatory for CONFIG_DEBUG_LL */ | ||
23 | |||
24 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
25 | #define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
26 | |||
27 | #endif /* __ASM_ARCH_MXC_BOARD_MX35PDK_H__ */ | 22 | #endif /* __ASM_ARCH_MXC_BOARD_MX35PDK_H__ */ |
diff --git a/arch/arm/plat-mxc/include/mach/board-pcm037.h b/arch/arm/plat-mxc/include/mach/board-pcm037.h index f0a1fa1938a2..13411709b13a 100644 --- a/arch/arm/plat-mxc/include/mach/board-pcm037.h +++ b/arch/arm/plat-mxc/include/mach/board-pcm037.h | |||
@@ -19,9 +19,4 @@ | |||
19 | #ifndef __ASM_ARCH_MXC_BOARD_PCM037_H__ | 19 | #ifndef __ASM_ARCH_MXC_BOARD_PCM037_H__ |
20 | #define __ASM_ARCH_MXC_BOARD_PCM037_H__ | 20 | #define __ASM_ARCH_MXC_BOARD_PCM037_H__ |
21 | 21 | ||
22 | /* mandatory for CONFIG_DEBUG_LL */ | ||
23 | |||
24 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
25 | #define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
26 | |||
27 | #endif /* __ASM_ARCH_MXC_BOARD_PCM037_H__ */ | 22 | #endif /* __ASM_ARCH_MXC_BOARD_PCM037_H__ */ |
diff --git a/arch/arm/plat-mxc/include/mach/board-pcm038.h b/arch/arm/plat-mxc/include/mach/board-pcm038.h index 4fcd7499e092..410f9786ed22 100644 --- a/arch/arm/plat-mxc/include/mach/board-pcm038.h +++ b/arch/arm/plat-mxc/include/mach/board-pcm038.h | |||
@@ -19,11 +19,6 @@ | |||
19 | #ifndef __ASM_ARCH_MXC_BOARD_PCM038_H__ | 19 | #ifndef __ASM_ARCH_MXC_BOARD_PCM038_H__ |
20 | #define __ASM_ARCH_MXC_BOARD_PCM038_H__ | 20 | #define __ASM_ARCH_MXC_BOARD_PCM038_H__ |
21 | 21 | ||
22 | /* mandatory for CONFIG_DEBUG_LL */ | ||
23 | |||
24 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
25 | #define MXC_LL_UART_VADDR (AIPI_BASE_ADDR_VIRT + 0x0A000) | ||
26 | |||
27 | #ifndef __ASSEMBLY__ | 22 | #ifndef __ASSEMBLY__ |
28 | /* | 23 | /* |
29 | * This CPU module needs a baseboard to work. After basic initializing | 24 | * This CPU module needs a baseboard to work. After basic initializing |
diff --git a/arch/arm/plat-mxc/include/mach/board-pcm043.h b/arch/arm/plat-mxc/include/mach/board-pcm043.h index 15fbdf16abcd..1ac4e1682e5c 100644 --- a/arch/arm/plat-mxc/include/mach/board-pcm043.h +++ b/arch/arm/plat-mxc/include/mach/board-pcm043.h | |||
@@ -19,9 +19,4 @@ | |||
19 | #ifndef __ASM_ARCH_MXC_BOARD_PCM043_H__ | 19 | #ifndef __ASM_ARCH_MXC_BOARD_PCM043_H__ |
20 | #define __ASM_ARCH_MXC_BOARD_PCM043_H__ | 20 | #define __ASM_ARCH_MXC_BOARD_PCM043_H__ |
21 | 21 | ||
22 | /* mandatory for CONFIG_LL_DEBUG */ | ||
23 | |||
24 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
25 | #define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
26 | |||
27 | #endif /* __ASM_ARCH_MXC_BOARD_PCM043_H__ */ | 22 | #endif /* __ASM_ARCH_MXC_BOARD_PCM043_H__ */ |
diff --git a/arch/arm/plat-mxc/include/mach/board-qong.h b/arch/arm/plat-mxc/include/mach/board-qong.h index 04033ec637d2..6d88c7af4b23 100644 --- a/arch/arm/plat-mxc/include/mach/board-qong.h +++ b/arch/arm/plat-mxc/include/mach/board-qong.h | |||
@@ -11,11 +11,6 @@ | |||
11 | #ifndef __ASM_ARCH_MXC_BOARD_QONG_H__ | 11 | #ifndef __ASM_ARCH_MXC_BOARD_QONG_H__ |
12 | #define __ASM_ARCH_MXC_BOARD_QONG_H__ | 12 | #define __ASM_ARCH_MXC_BOARD_QONG_H__ |
13 | 13 | ||
14 | /* mandatory for CONFIG_DEBUG_LL */ | ||
15 | |||
16 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
17 | #define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
18 | |||
19 | /* NOR FLASH */ | 14 | /* NOR FLASH */ |
20 | #define QONG_NOR_SIZE (128*1024*1024) | 15 | #define QONG_NOR_SIZE (128*1024*1024) |
21 | 16 | ||
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index 02c3cd004db3..286cb9b0a25b 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h | |||
@@ -16,18 +16,33 @@ struct clk; | |||
16 | 16 | ||
17 | extern void mx1_map_io(void); | 17 | extern void mx1_map_io(void); |
18 | extern void mx21_map_io(void); | 18 | extern void mx21_map_io(void); |
19 | extern void mx25_map_io(void); | ||
19 | extern void mx27_map_io(void); | 20 | extern void mx27_map_io(void); |
20 | extern void mx31_map_io(void); | 21 | extern void mx31_map_io(void); |
21 | extern void mx35_map_io(void); | 22 | extern void mx35_map_io(void); |
22 | extern void mxc_init_irq(void); | 23 | extern void mxc91231_map_io(void); |
23 | extern void mxc_timer_init(struct clk *timer_clk); | 24 | extern void mxc_init_irq(void __iomem *); |
25 | extern void mx1_init_irq(void); | ||
26 | extern void mx21_init_irq(void); | ||
27 | extern void mx25_init_irq(void); | ||
28 | extern void mx27_init_irq(void); | ||
29 | extern void mx31_init_irq(void); | ||
30 | extern void mx35_init_irq(void); | ||
31 | extern void mxc91231_init_irq(void); | ||
32 | extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int); | ||
24 | extern int mx1_clocks_init(unsigned long fref); | 33 | extern int mx1_clocks_init(unsigned long fref); |
25 | extern int mx21_clocks_init(unsigned long lref, unsigned long fref); | 34 | extern int mx21_clocks_init(unsigned long lref, unsigned long fref); |
35 | extern int mx25_clocks_init(unsigned long fref); | ||
26 | extern int mx27_clocks_init(unsigned long fref); | 36 | extern int mx27_clocks_init(unsigned long fref); |
27 | extern int mx31_clocks_init(unsigned long fref); | 37 | extern int mx31_clocks_init(unsigned long fref); |
28 | extern int mx35_clocks_init(void); | 38 | extern int mx35_clocks_init(void); |
39 | extern int mxc91231_clocks_init(unsigned long fref); | ||
29 | extern int mxc_register_gpios(void); | 40 | extern int mxc_register_gpios(void); |
30 | extern int mxc_register_device(struct platform_device *pdev, void *data); | 41 | extern int mxc_register_device(struct platform_device *pdev, void *data); |
31 | extern void mxc_set_cpu_type(unsigned int type); | 42 | extern void mxc_set_cpu_type(unsigned int type); |
43 | extern void mxc_arch_reset_init(void __iomem *); | ||
44 | extern void mxc91231_power_off(void); | ||
45 | extern void mxc91231_arch_reset(int, const char *); | ||
46 | extern void mxc91231_prepare_idle(void); | ||
32 | 47 | ||
33 | #endif | 48 | #endif |
diff --git a/arch/arm/plat-mxc/include/mach/debug-macro.S b/arch/arm/plat-mxc/include/mach/debug-macro.S index bbc5f6753cfb..15b2b148a105 100644 --- a/arch/arm/plat-mxc/include/mach/debug-macro.S +++ b/arch/arm/plat-mxc/include/mach/debug-macro.S | |||
@@ -11,52 +11,52 @@ | |||
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <mach/hardware.h> | 14 | #ifdef CONFIG_ARCH_MX1 |
15 | 15 | #include <mach/mx1.h> | |
16 | #ifdef CONFIG_MACH_MX31ADS | 16 | #define UART_PADDR UART1_BASE_ADDR |
17 | #include <mach/board-mx31ads.h> | 17 | #define UART_VADDR IO_ADDRESS(UART1_BASE_ADDR) |
18 | #endif | ||
19 | #ifdef CONFIG_MACH_PCM037 | ||
20 | #include <mach/board-pcm037.h> | ||
21 | #endif | ||
22 | #ifdef CONFIG_MACH_MX31LITE | ||
23 | #include <mach/board-mx31lite.h> | ||
24 | #endif | ||
25 | #ifdef CONFIG_MACH_MX27ADS | ||
26 | #include <mach/board-mx27ads.h> | ||
27 | #endif | ||
28 | #ifdef CONFIG_MACH_MX21ADS | ||
29 | #include <mach/board-mx21ads.h> | ||
30 | #endif | 18 | #endif |
31 | #ifdef CONFIG_MACH_PCM038 | 19 | |
32 | #include <mach/board-pcm038.h> | 20 | #ifdef CONFIG_ARCH_MX25 |
21 | #ifdef UART_PADDR | ||
22 | #error "CONFIG_DEBUG_LL is incompatible with multiple archs" | ||
33 | #endif | 23 | #endif |
34 | #ifdef CONFIG_MACH_MX31_3DS | 24 | #include <mach/mx25.h> |
35 | #include <mach/board-mx31pdk.h> | 25 | #define UART_PADDR UART1_BASE_ADDR |
26 | #define UART_VADDR MX25_AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
36 | #endif | 27 | #endif |
37 | #ifdef CONFIG_MACH_QONG | 28 | |
38 | #include <mach/board-qong.h> | 29 | #ifdef CONFIG_ARCH_MX2 |
30 | #ifdef UART_PADDR | ||
31 | #error "CONFIG_DEBUG_LL is incompatible with multiple archs" | ||
39 | #endif | 32 | #endif |
40 | #ifdef CONFIG_MACH_PCM043 | 33 | #include <mach/mx2x.h> |
41 | #include <mach/board-pcm043.h> | 34 | #define UART_PADDR UART1_BASE_ADDR |
35 | #define UART_VADDR AIPI_IO_ADDRESS(UART1_BASE_ADDR) | ||
42 | #endif | 36 | #endif |
43 | #ifdef CONFIG_MACH_MX27_3DS | 37 | |
44 | #include <mach/board-mx27pdk.h> | 38 | #ifdef CONFIG_ARCH_MX3 |
39 | #ifdef UART_PADDR | ||
40 | #error "CONFIG_DEBUG_LL is incompatible with multiple archs" | ||
45 | #endif | 41 | #endif |
46 | #ifdef CONFIG_MACH_ARMADILLO5X0 | 42 | #include <mach/mx3x.h> |
47 | #include <mach/board-armadillo5x0.h> | 43 | #define UART_PADDR UART1_BASE_ADDR |
44 | #define UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR) | ||
48 | #endif | 45 | #endif |
49 | #ifdef CONFIG_MACH_MX35_3DS | 46 | |
50 | #include <mach/board-mx35pdk.h> | 47 | #ifdef CONFIG_ARCH_MXC91231 |
48 | #ifdef UART_PADDR | ||
49 | #error "CONFIG_DEBUG_LL is incompatible with multiple archs" | ||
51 | #endif | 50 | #endif |
52 | #ifdef CONFIG_MACH_MX27LITE | 51 | #include <mach/mxc91231.h> |
53 | #include <mach/board-mx27lite.h> | 52 | #define UART_PADDR MXC91231_UART2_BASE_ADDR |
53 | #define UART_VADDR MXC91231_AIPS1_IO_ADDRESS(MXC91231_UART2_BASE_ADDR) | ||
54 | #endif | 54 | #endif |
55 | .macro addruart,rx | 55 | .macro addruart,rx |
56 | mrc p15, 0, \rx, c1, c0 | 56 | mrc p15, 0, \rx, c1, c0 |
57 | tst \rx, #1 @ MMU enabled? | 57 | tst \rx, #1 @ MMU enabled? |
58 | ldreq \rx, =MXC_LL_UART_PADDR @ physical | 58 | ldreq \rx, =UART_PADDR @ physical |
59 | ldrne \rx, =MXC_LL_UART_VADDR @ virtual | 59 | ldrne \rx, =UART_VADDR @ virtual |
60 | .endm | 60 | .endm |
61 | 61 | ||
62 | .macro senduart,rd,rx | 62 | .macro senduart,rd,rx |
diff --git a/arch/arm/plat-mxc/include/mach/entry-macro.S b/arch/arm/plat-mxc/include/mach/entry-macro.S index 5f01d60da845..7cf290efe768 100644 --- a/arch/arm/plat-mxc/include/mach/entry-macro.S +++ b/arch/arm/plat-mxc/include/mach/entry-macro.S | |||
@@ -18,7 +18,8 @@ | |||
18 | .endm | 18 | .endm |
19 | 19 | ||
20 | .macro get_irqnr_preamble, base, tmp | 20 | .macro get_irqnr_preamble, base, tmp |
21 | ldr \base, =AVIC_IO_ADDRESS(AVIC_BASE_ADDR) | 21 | ldr \base, =avic_base |
22 | ldr \base, [\base] | ||
22 | #ifdef CONFIG_MXC_IRQ_PRIOR | 23 | #ifdef CONFIG_MXC_IRQ_PRIOR |
23 | ldr r4, [\base, #AVIC_NIMASK] | 24 | ldr r4, [\base, #AVIC_NIMASK] |
24 | #endif | 25 | #endif |
diff --git a/arch/arm/plat-mxc/include/mach/hardware.h b/arch/arm/plat-mxc/include/mach/hardware.h index 42e4ee37ca1f..78db75475f69 100644 --- a/arch/arm/plat-mxc/include/mach/hardware.h +++ b/arch/arm/plat-mxc/include/mach/hardware.h | |||
@@ -42,6 +42,14 @@ | |||
42 | # include <mach/mx1.h> | 42 | # include <mach/mx1.h> |
43 | #endif | 43 | #endif |
44 | 44 | ||
45 | #ifdef CONFIG_ARCH_MX25 | ||
46 | # include <mach/mx25.h> | ||
47 | #endif | ||
48 | |||
49 | #ifdef CONFIG_ARCH_MXC91231 | ||
50 | # include <mach/mxc91231.h> | ||
51 | #endif | ||
52 | |||
45 | #include <mach/mxc.h> | 53 | #include <mach/mxc.h> |
46 | 54 | ||
47 | #endif /* __ASM_ARCH_MXC_HARDWARE_H__ */ | 55 | #endif /* __ASM_ARCH_MXC_HARDWARE_H__ */ |
diff --git a/arch/arm/plat-mxc/include/mach/imxfb.h b/arch/arm/plat-mxc/include/mach/imxfb.h index 9f0101157ec1..5263506b7ddf 100644 --- a/arch/arm/plat-mxc/include/mach/imxfb.h +++ b/arch/arm/plat-mxc/include/mach/imxfb.h | |||
@@ -2,6 +2,8 @@ | |||
2 | * This structure describes the machine which we are running on. | 2 | * This structure describes the machine which we are running on. |
3 | */ | 3 | */ |
4 | 4 | ||
5 | #include <linux/fb.h> | ||
6 | |||
5 | #define PCR_TFT (1 << 31) | 7 | #define PCR_TFT (1 << 31) |
6 | #define PCR_COLOR (1 << 30) | 8 | #define PCR_COLOR (1 << 30) |
7 | #define PCR_PBSIZ_1 (0 << 28) | 9 | #define PCR_PBSIZ_1 (0 << 28) |
@@ -13,7 +15,8 @@ | |||
13 | #define PCR_BPIX_4 (2 << 25) | 15 | #define PCR_BPIX_4 (2 << 25) |
14 | #define PCR_BPIX_8 (3 << 25) | 16 | #define PCR_BPIX_8 (3 << 25) |
15 | #define PCR_BPIX_12 (4 << 25) | 17 | #define PCR_BPIX_12 (4 << 25) |
16 | #define PCR_BPIX_16 (4 << 25) | 18 | #define PCR_BPIX_16 (5 << 25) |
19 | #define PCR_BPIX_18 (6 << 25) | ||
17 | #define PCR_PIXPOL (1 << 24) | 20 | #define PCR_PIXPOL (1 << 24) |
18 | #define PCR_FLMPOL (1 << 23) | 21 | #define PCR_FLMPOL (1 << 23) |
19 | #define PCR_LPPOL (1 << 22) | 22 | #define PCR_LPPOL (1 << 22) |
@@ -46,29 +49,21 @@ | |||
46 | #define DMACR_HM(x) (((x) & 0xf) << 16) | 49 | #define DMACR_HM(x) (((x) & 0xf) << 16) |
47 | #define DMACR_TM(x) ((x) & 0xf) | 50 | #define DMACR_TM(x) ((x) & 0xf) |
48 | 51 | ||
49 | struct imx_fb_platform_data { | 52 | struct imx_fb_videomode { |
50 | u_long pixclock; | 53 | struct fb_videomode mode; |
51 | 54 | u32 pcr; | |
52 | u_short xres; | 55 | unsigned char bpp; |
53 | u_short yres; | 56 | }; |
54 | |||
55 | u_int nonstd; | ||
56 | u_char bpp; | ||
57 | u_char hsync_len; | ||
58 | u_char left_margin; | ||
59 | u_char right_margin; | ||
60 | 57 | ||
61 | u_char vsync_len; | 58 | struct imx_fb_platform_data { |
62 | u_char upper_margin; | 59 | struct imx_fb_videomode *mode; |
63 | u_char lower_margin; | 60 | int num_modes; |
64 | u_char sync; | ||
65 | 61 | ||
66 | u_int cmap_greyscale:1, | 62 | u_int cmap_greyscale:1, |
67 | cmap_inverse:1, | 63 | cmap_inverse:1, |
68 | cmap_static:1, | 64 | cmap_static:1, |
69 | unused:29; | 65 | unused:29; |
70 | 66 | ||
71 | u_int pcr; | ||
72 | u_int pwmr; | 67 | u_int pwmr; |
73 | u_int lscr1; | 68 | u_int lscr1; |
74 | u_int dmacr; | 69 | u_int dmacr; |
diff --git a/arch/arm/plat-mxc/include/mach/iomux-mx25.h b/arch/arm/plat-mxc/include/mach/iomux-mx25.h new file mode 100644 index 000000000000..810c47f56e77 --- /dev/null +++ b/arch/arm/plat-mxc/include/mach/iomux-mx25.h | |||
@@ -0,0 +1,517 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-mxc/include/mach/iomux-mx25.h | ||
3 | * | ||
4 | * Copyright (C) 2009 by Lothar Wassmann <LW@KARO-electronics.de> | ||
5 | * | ||
6 | * based on arch/arm/mach-mx25/mx25_pins.h | ||
7 | * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved. | ||
8 | * and | ||
9 | * arch/arm/plat-mxc/include/mach/iomux-mx35.h | ||
10 | * Copyright (C, NO_PAD_CTRL) 2009 by Jan Weitzel Phytec Messtechnik GmbH <armlinux@phytec.de> | ||
11 | * | ||
12 | * The code contained herein is licensed under the GNU General Public | ||
13 | * License. You may obtain a copy of the GNU General Public License | ||
14 | * Version 2 or later at the following locations: | ||
15 | * | ||
16 | * http://www.opensource.org/licenses/gpl-license.html | ||
17 | * http://www.gnu.org/copyleft/gpl.html | ||
18 | */ | ||
19 | #ifndef __IOMUX_MX25_H__ | ||
20 | #define __IOMUX_MX25_H__ | ||
21 | |||
22 | #include <mach/iomux-v3.h> | ||
23 | |||
24 | #ifndef GPIO_PORTA | ||
25 | #error Please include mach/iomux.h | ||
26 | #endif | ||
27 | |||
28 | /* | ||
29 | * | ||
30 | * @brief MX25 I/O Pin List | ||
31 | * | ||
32 | * @ingroup GPIO_MX25 | ||
33 | */ | ||
34 | |||
35 | #ifndef __ASSEMBLY__ | ||
36 | |||
37 | /* | ||
38 | * IOMUX/PAD Bit field definitions | ||
39 | */ | ||
40 | |||
41 | #define MX25_PAD_A10__A10 IOMUX_PAD(0x000, 0x008, 0x00, 0, 0, NO_PAD_CTRL) | ||
42 | #define MX25_PAD_A10__GPIO_4_0 IOMUX_PAD(0x000, 0x008, 0x05, 0, 0, NO_PAD_CTRL) | ||
43 | |||
44 | #define MX25_PAD_A13__A13 IOMUX_PAD(0x22C, 0x00c, 0x00, 0, 0, NO_PAD_CTRL) | ||
45 | #define MX25_PAD_A13__GPIO_4_1 IOMUX_PAD(0x22C, 0x00c, 0x05, 0, 0, NO_PAD_CTRL) | ||
46 | |||
47 | #define MX25_PAD_A14__A14 IOMUX_PAD(0x230, 0x010, 0x10, 0, 0, NO_PAD_CTRL) | ||
48 | #define MX25_PAD_A14__GPIO_2_0 IOMUX_PAD(0x230, 0x010, 0x15, 0, 0, NO_PAD_CTRL) | ||
49 | |||
50 | #define MX25_PAD_A15__A15 IOMUX_PAD(0x234, 0x014, 0x10, 0, 0, NO_PAD_CTRL) | ||
51 | #define MX25_PAD_A15__GPIO_2_1 IOMUX_PAD(0x234, 0x014, 0x15, 0, 0, NO_PAD_CTRL) | ||
52 | |||
53 | #define MX25_PAD_A16__A16 IOMUX_PAD(0x000, 0x018, 0x10, 0, 0, NO_PAD_CTRL) | ||
54 | #define MX25_PAD_A16__GPIO_2_2 IOMUX_PAD(0x000, 0x018, 0x15, 0, 0, NO_PAD_CTRL) | ||
55 | |||
56 | #define MX25_PAD_A17__A17 IOMUX_PAD(0x238, 0x01c, 0x10, 0, 0, NO_PAD_CTRL) | ||
57 | #define MX25_PAD_A17__GPIO_2_3 IOMUX_PAD(0x238, 0x01c, 0x15, 0, 0, NO_PAD_CTRL) | ||
58 | |||
59 | #define MX25_PAD_A18__A18 IOMUX_PAD(0x23c, 0x020, 0x10, 0, 0, NO_PAD_CTRL) | ||
60 | #define MX25_PAD_A18__GPIO_2_4 IOMUX_PAD(0x23c, 0x020, 0x15, 0, 0, NO_PAD_CTRL) | ||
61 | #define MX25_PAD_A18__FEC_COL IOMUX_PAD(0x23c, 0x020, 0x17, 0x504, 0, NO_PAD_CTL) | ||
62 | |||
63 | #define MX25_PAD_A19__A19 IOMUX_PAD(0x240, 0x024, 0x10, 0, 0, NO_PAD_CTRL) | ||
64 | #define MX25_PAD_A19__FEC_RX_ER IOMUX_PAD(0x240, 0x024, 0x17, 0x518, 0, NO_PAD_CTL) | ||
65 | #define MX25_PAD_A19__GPIO_2_5 IOMUX_PAD(0x240, 0x024, 0x15, 0, 0, NO_PAD_CTRL) | ||
66 | |||
67 | #define MX25_PAD_A20__A20 IOMUX_PAD(0x244, 0x028, 0x10, 0, 0, NO_PAD_CTRL) | ||
68 | #define MX25_PAD_A20__GPIO_2_6 IOMUX_PAD(0x244, 0x028, 0x15, 0, 0, NO_PAD_CTRL) | ||
69 | #define MX25_PAD_A20__FEC_RDATA2 IOMUX_PAD(0x244, 0x028, 0x17, 0x50c, 0, NO_PAD_CTL) | ||
70 | |||
71 | #define MX25_PAD_A21__A21 IOMUX_PAD(0x248, 0x02c, 0x10, 0, 0, NO_PAD_CTRL) | ||
72 | #define MX25_PAD_A21__GPIO_2_7 IOMUX_PAD(0x248, 0x02c, 0x15, 0, 0, NO_PAD_CTRL) | ||
73 | #define MX25_PAD_A21__FEC_RDATA3 IOMUX_PAD(0x248, 0x02c, 0x17, 0x510, 0, NO_PAD_CTL) | ||
74 | |||
75 | #define MX25_PAD_A22__A22 IOMUX_PAD(0x000, 0x030, 0x10, 0, 0, NO_PAD_CTRL) | ||
76 | #define MX25_PAD_A22__GPIO_2_8 IOMUX_PAD(0x000, 0x030, 0x15, 0, 0, NO_PAD_CTRL) | ||
77 | |||
78 | #define MX25_PAD_A23__A23 IOMUX_PAD(0x24c, 0x034, 0x10, 0, 0, NO_PAD_CTRL) | ||
79 | #define MX25_PAD_A23__GPIO_2_9 IOMUX_PAD(0x24c, 0x034, 0x15, 0, 0, NO_PAD_CTRL) | ||
80 | |||
81 | #define MX25_PAD_A24__A24 IOMUX_PAD(0x250, 0x038, 0x10, 0, 0, NO_PAD_CTRL) | ||
82 | #define MX25_PAD_A24__GPIO_2_10 IOMUX_PAD(0x250, 0x038, 0x15, 0, 0, NO_PAD_CTRL) | ||
83 | #define MX25_PAD_A24__FEC_RX_CLK IOMUX_PAD(0x250, 0x038, 0x17, 0x514, 0, NO_PAD_CTL) | ||
84 | |||
85 | #define MX25_PAD_A25__A25 IOMUX_PAD(0x254, 0x03c, 0x10, 0, 0, NO_PAD_CTRL) | ||
86 | #define MX25_PAD_A25__GPIO_2_11 IOMUX_PAD(0x254, 0x03c, 0x15, 0, 0, NO_PAD_CTRL) | ||
87 | #define MX25_PAD_A25__FEC_CRS IOMUX_PAD(0x254, 0x03c, 0x17, 0x508, 0, NO_PAD_CTL) | ||
88 | |||
89 | #define MX25_PAD_EB0__EB0 IOMUX_PAD(0x258, 0x040, 0x10, 0, 0, NO_PAD_CTRL) | ||
90 | #define MX25_PAD_EB0__AUD4_TXD IOMUX_PAD(0x258, 0x040, 0x14, 0x464, 0, NO_PAD_CTRL) | ||
91 | #define MX25_PAD_EB0__GPIO_2_12 IOMUX_PAD(0x258, 0x040, 0x15, 0, 0, NO_PAD_CTRL) | ||
92 | |||
93 | #define MX25_PAD_EB1__EB1 IOMUX_PAD(0x25c, 0x044, 0x10, 0, 0, NO_PAD_CTRL) | ||
94 | #define MX25_PAD_EB1__AUD4_RXD IOMUX_PAD(0x25c, 0x044, 0x14, 0x460, 0, NO_PAD_CTRL) | ||
95 | #define MX25_PAD_EB1__GPIO_2_13 IOMUX_PAD(0x25c, 0x044, 0x15, 0, 0, NO_PAD_CTRL) | ||
96 | |||
97 | #define MX25_PAD_OE__OE IOMUX_PAD(0x260, 0x048, 0x10, 0, 0, NO_PAD_CTRL) | ||
98 | #define MX25_PAD_OE__AUD4_TXC IOMUX_PAD(0x260, 0x048, 0x14, 0, 0, NO_PAD_CTRL) | ||
99 | #define MX25_PAD_OE__GPIO_2_14 IOMUX_PAD(0x260, 0x048, 0x15, 0, 0, NO_PAD_CTRL) | ||
100 | |||
101 | #define MX25_PAD_CS0__CS0 IOMUX_PAD(0x000, 0x04c, 0x00, 0, 0, NO_PAD_CTRL) | ||
102 | #define MX25_PAD_CS0__GPIO_4_2 IOMUX_PAD(0x000, 0x04c, 0x05, 0, 0, NO_PAD_CTRL) | ||
103 | |||
104 | #define MX25_PAD_CS1__CS1 IOMUX_PAD(0x000, 0x050, 0x00, 0, 0, NO_PAD_CTRL) | ||
105 | #define MX25_PAD_CS1__GPIO_4_3 IOMUX_PAD(0x000, 0x050, 0x05, 0, 0, NO_PAD_CTRL) | ||
106 | |||
107 | #define MX25_PAD_CS4__CS4 IOMUX_PAD(0x264, 0x054, 0x10, 0, 0, NO_PAD_CTRL) | ||
108 | #define MX25_PAD_CS4__UART5_CTS IOMUX_PAD(0x264, 0x054, 0x13, 0, 0, NO_PAD_CTRL) | ||
109 | #define MX25_PAD_CS4__GPIO_3_20 IOMUX_PAD(0x264, 0x054, 0x15, 0, 0, NO_PAD_CTRL) | ||
110 | |||
111 | #define MX25_PAD_CS5__CS5 IOMUX_PAD(0x268, 0x058, 0x10, 0, 0, NO_PAD_CTRL) | ||
112 | #define MX25_PAD_CS5__UART5_RTS IOMUX_PAD(0x268, 0x058, 0x13, 0x574, 0, NO_PAD_CTRL) | ||
113 | #define MX25_PAD_CS5__GPIO_3_21 IOMUX_PAD(0x268, 0x058, 0x15, 0, 0, NO_PAD_CTRL) | ||
114 | |||
115 | #define MX25_PAD_NF_CE0__NF_CE0 IOMUX_PAD(0x26c, 0x05c, 0x10, 0, 0, NO_PAD_CTL) | ||
116 | #define MX25_PAD_NF_CE0__GPIO_3_22 IOMUX_PAD(0x26c, 0x05c, 0x15, 0, 0, NO_PAD_CTRL) | ||
117 | |||
118 | #define MX25_PAD_ECB__ECB IOMUX_PAD(0x270, 0x060, 0x10, 0, 0, NO_PAD_CTRL) | ||
119 | #define MX25_PAD_ECB__UART5_TXD_MUX IOMUX_PAD(0x270, 0x060, 0x13, 0, 0, NO_PAD_CTRL) | ||
120 | #define MX25_PAD_ECB__GPIO_3_23 IOMUX_PAD(0x270, 0x060, 0x15, 0, 0, NO_PAD_CTRL) | ||
121 | |||
122 | #define MX25_PAD_LBA__LBA IOMUX_PAD(0x274, 0x064, 0x10, 0, 0, NO_PAD_CTRL) | ||
123 | #define MX25_PAD_LBA__UART5_RXD_MUX IOMUX_PAD(0x274, 0x064, 0x13, 0x578, 0, NO_PAD_CTRL) | ||
124 | #define MX25_PAD_LBA__GPIO_3_24 IOMUX_PAD(0x274, 0x064, 0x15, 0, 0, NO_PAD_CTRL) | ||
125 | |||
126 | #define MX25_PAD_BCLK__BCLK IOMUX_PAD(0x000, 0x068, 0x00, 0, 0, NO_PAD_CTRL) | ||
127 | #define MX25_PAD_BCLK__GPIO_4_4 IOMUX_PAD(0x000, 0x068, 0x05, 0, 0, NO_PAD_CTRL) | ||
128 | |||
129 | #define MX25_PAD_RW__RW IOMUX_PAD(0x278, 0x06c, 0x10, 0, 0, NO_PAD_CTRL) | ||
130 | #define MX25_PAD_RW__AUD4_TXFS IOMUX_PAD(0x278, 0x06c, 0x14, 0x474, 0, NO_PAD_CTRL) | ||
131 | #define MX25_PAD_RW__GPIO_3_25 IOMUX_PAD(0x278, 0x06c, 0x15, 0, 0, NO_PAD_CTRL) | ||
132 | |||
133 | #define MX25_PAD_NFWE_B__NFWE_B IOMUX_PAD(0x000, 0x070, 0x10, 0, 0, NO_PAD_CTRL) | ||
134 | #define MX25_PAD_NFWE_B__GPIO_3_26 IOMUX_PAD(0x000, 0x070, 0x15, 0, 0, NO_PAD_CTRL) | ||
135 | |||
136 | #define MX25_PAD_NFRE_B__NFRE_B IOMUX_PAD(0x000, 0x074, 0x10, 0, 0, NO_PAD_CTRL) | ||
137 | #define MX25_PAD_NFRE_B__GPIO_3_27 IOMUX_PAD(0x000, 0x074, 0x15, 0, 0, NO_PAD_CTRL) | ||
138 | |||
139 | #define MX25_PAD_NFALE__NFALE IOMUX_PAD(0x000, 0x078, 0x10, 0, 0, NO_PAD_CTRL) | ||
140 | #define MX25_PAD_NFALE__GPIO_3_28 IOMUX_PAD(0x000, 0x078, 0x15, 0, 0, NO_PAD_CTRL) | ||
141 | |||
142 | #define MX25_PAD_NFCLE__NFCLE IOMUX_PAD(0x000, 0x07c, 0x10, 0, 0, NO_PAD_CTRL) | ||
143 | #define MX25_PAD_NFCLE__GPIO_3_29 IOMUX_PAD(0x000, 0x07c, 0x15, 0, 0, NO_PAD_CTRL) | ||
144 | |||
145 | #define MX25_PAD_NFWP_B__NFWP_B IOMUX_PAD(0x000, 0x080, 0x10, 0, 0, NO_PAD_CTRL) | ||
146 | #define MX25_PAD_NFWP_B__GPIO_3_30 IOMUX_PAD(0x000, 0x080, 0x15, 0, 0, NO_PAD_CTRL) | ||
147 | |||
148 | #define MX25_PAD_NFRB__NFRB IOMUX_PAD(0x27c, 0x084, 0x10, 0, 0, PAD_CTL_PKE) | ||
149 | #define MX25_PAD_NFRB__GPIO_3_31 IOMUX_PAD(0x27c, 0x084, 0x15, 0, 0, NO_PAD_CTRL) | ||
150 | |||
151 | #define MX25_PAD_D15__D15 IOMUX_PAD(0x280, 0x088, 0x00, 0, 0, NO_PAD_CTRL) | ||
152 | #define MX25_PAD_D15__LD16 IOMUX_PAD(0x280, 0x088, 0x01, 0, 0, NO_PAD_CTRL) | ||
153 | #define MX25_PAD_D15__GPIO_4_5 IOMUX_PAD(0x280, 0x088, 0x05, 0, 0, NO_PAD_CTRL) | ||
154 | |||
155 | #define MX25_PAD_D14__D14 IOMUX_PAD(0x284, 0x08c, 0x00, 0, 0, NO_PAD_CTRL) | ||
156 | #define MX25_PAD_D14__LD17 IOMUX_PAD(0x284, 0x08c, 0x01, 0, 0, NO_PAD_CTRL) | ||
157 | #define MX25_PAD_D14__GPIO_4_6 IOMUX_PAD(0x284, 0x08c, 0x05, 0, 0, NO_PAD_CTRL) | ||
158 | |||
159 | #define MX25_PAD_D13__D13 IOMUX_PAD(0x288, 0x090, 0x00, 0, 0, NO_PAD_CTRL) | ||
160 | #define MX25_PAD_D13__LD18 IOMUX_PAD(0x288, 0x090, 0x01, 0, 0, NO_PAD_CTRL) | ||
161 | #define MX25_PAD_D13__GPIO_4_7 IOMUX_PAD(0x288, 0x090, 0x05, 0, 0, NO_PAD_CTRL) | ||
162 | |||
163 | #define MX25_PAD_D12__D12 IOMUX_PAD(0x28c, 0x094, 0x00, 0, 0, NO_PAD_CTRL) | ||
164 | #define MX25_PAD_D12__GPIO_4_8 IOMUX_PAD(0x28c, 0x094, 0x05, 0, 0, NO_PAD_CTRL) | ||
165 | |||
166 | #define MX25_PAD_D11__D11 IOMUX_PAD(0x290, 0x098, 0x00, 0, 0, NO_PAD_CTRL) | ||
167 | #define MX25_PAD_D11__GPIO_4_9 IOMUX_PAD(0x290, 0x098, 0x05, 0, 0, NO_PAD_CTRL) | ||
168 | |||
169 | #define MX25_PAD_D10__D10 IOMUX_PAD(0x294, 0x09c, 0x00, 0, 0, NO_PAD_CTRL) | ||
170 | #define MX25_PAD_D10__GPIO_4_10 IOMUX_PAD(0x294, 0x09c, 0x05, 0, 0, NO_PAD_CTRL) | ||
171 | #define MX25_PAD_D10__USBOTG_OC IOMUX_PAD(0x294, 0x09c, 0x06, 0x57c, 0, PAD_CTL_PUS_100K_UP) | ||
172 | |||
173 | #define MX25_PAD_D9__D9 IOMUX_PAD(0x298, 0x0a0, 0x00, 0, 0, NO_PAD_CTRL) | ||
174 | #define MX25_PAD_D9__GPIO_4_11 IOMUX_PAD(0x298, 0x0a0, 0x05, 0, 0, NO_PAD_CTRL) | ||
175 | #define MX25_PAD_D9__USBH2_PWR IOMUX_PAD(0x298, 0x0a0, 0x06, 0, 0, PAD_CTL_PKE) | ||
176 | |||
177 | #define MX25_PAD_D8__D8 IOMUX_PAD(0x29c, 0x0a4, 0x00, 0, 0, NO_PAD_CTRL) | ||
178 | #define MX25_PAD_D8__GPIO_4_12 IOMUX_PAD(0x29c, 0x0a4, 0x05, 0, 0, NO_PAD_CTRL) | ||
179 | #define MX25_PAD_D8__USBH2_OC IOMUX_PAD(0x29c, 0x0a4, 0x06, 0x580, 0, PAD_CTL_PUS_100K_UP) | ||
180 | |||
181 | #define MX25_PAD_D7__D7 IOMUX_PAD(0x2a0, 0x0a8, 0x00, 0, 0, NO_PAD_CTRL) | ||
182 | #define MX25_PAD_D7__GPIO_4_13 IOMUX_PAD(0x2a0, 0x0a8, 0x05, 0, 0, NO_PAD_CTRL) | ||
183 | |||
184 | #define MX25_PAD_D6__D6 IOMUX_PAD(0x2a4, 0x0ac, 0x00, 0, 0, NO_PAD_CTRL) | ||
185 | #define MX25_PAD_D6__GPIO_4_14 IOMUX_PAD(0x2a4, 0x0ac, 0x05, 0, 0, NO_PAD_CTRL) | ||
186 | |||
187 | #define MX25_PAD_D5__D5 IOMUX_PAD(0x2a8, 0x0b0, 0x00, 0, 0, NO_PAD_CTRL) | ||
188 | #define MX25_PAD_D5__GPIO_4_15 IOMUX_PAD(0x2a8, 0x0b0, 0x05, 0, 0, NO_PAD_CTRL) | ||
189 | |||
190 | #define MX25_PAD_D4__D4 IOMUX_PAD(0x2ac, 0x0b4, 0x00, 0, 0, NO_PAD_CTRL) | ||
191 | #define MX25_PAD_D4__GPIO_4_16 IOMUX_PAD(0x2ac, 0x0b4, 0x05, 0, 0, NO_PAD_CTRL) | ||
192 | |||
193 | #define MX25_PAD_D3__D3 IOMUX_PAD(0x2b0, 0x0b8, 0x00, 0, 0, NO_PAD_CTRL) | ||
194 | #define MX25_PAD_D3__GPIO_4_17 IOMUX_PAD(0x2b0, 0x0b8, 0x05, 0, 0, NO_PAD_CTRL) | ||
195 | |||
196 | #define MX25_PAD_D2__D2 IOMUX_PAD(0x2b4, 0x0bc, 0x00, 0, 0, NO_PAD_CTRL) | ||
197 | #define MX25_PAD_D2__GPIO_4_18 IOMUX_PAD(0x2b4, 0x0bc, 0x05, 0, 0, NO_PAD_CTRL) | ||
198 | |||
199 | #define MX25_PAD_D1__D1 IOMUX_PAD(0x2b8, 0x0c0, 0x00, 0, 0, NO_PAD_CTRL) | ||
200 | #define MX25_PAD_D1__GPIO_4_19 IOMUX_PAD(0x2b8, 0x0c0, 0x05, 0, 0, NO_PAD_CTRL) | ||
201 | |||
202 | #define MX25_PAD_D0__D0 IOMUX_PAD(0x2bc, 0x0c4, 0x00, 0, 0, NO_PAD_CTRL) | ||
203 | #define MX25_PAD_D0__GPIO_4_20 IOMUX_PAD(0x2bc, 0x0c4, 0x05, 0, 0, NO_PAD_CTRL) | ||
204 | |||
205 | #define MX25_PAD_LD0__LD0 IOMUX_PAD(0x2c0, 0x0c8, 0x10, 0, 0, NO_PAD_CTRL) | ||
206 | #define MX25_PAD_LD0__CSI_D0 IOMUX_PAD(0x2c0, 0x0c8, 0x12, 0x488, 0, NO_PAD_CTRL) | ||
207 | #define MX25_PAD_LD0__GPIO_2_15 IOMUX_PAD(0x2c0, 0x0c8, 0x15, 0, 0, NO_PAD_CTRL) | ||
208 | |||
209 | #define MX25_PAD_LD1__LD1 IOMUX_PAD(0x2c4, 0x0cc, 0x10, 0, 0, NO_PAD_CTRL) | ||
210 | #define MX25_PAD_LD1__CSI_D1 IOMUX_PAD(0x2c4, 0x0cc, 0x12, 0x48c, 0, NO_PAD_CTRL) | ||
211 | #define MX25_PAD_LD1__GPIO_2_16 IOMUX_PAD(0x2c4, 0x0cc, 0x15, 0, 0, NO_PAD_CTRL) | ||
212 | |||
213 | #define MX25_PAD_LD2__LD2 IOMUX_PAD(0x2c8, 0x0d0, 0x10, 0, 0, NO_PAD_CTRL) | ||
214 | #define MX25_PAD_LD2__GPIO_2_17 IOMUX_PAD(0x2c8, 0x0d0, 0x15, 0, 0, NO_PAD_CTRL) | ||
215 | |||
216 | #define MX25_PAD_LD3__LD3 IOMUX_PAD(0x2cc, 0x0d4, 0x10, 0, 0, NO_PAD_CTRL) | ||
217 | #define MX25_PAD_LD3__GPIO_2_18 IOMUX_PAD(0x2cc, 0x0d4, 0x15, 0, 0, NO_PAD_CTRL) | ||
218 | |||
219 | #define MX25_PAD_LD4__LD4 IOMUX_PAD(0x2d0, 0x0d8, 0x10, 0, 0, NO_PAD_CTRL) | ||
220 | #define MX25_PAD_LD4__GPIO_2_19 IOMUX_PAD(0x2d0, 0x0d8, 0x15, 0, 0, NO_PAD_CTRL) | ||
221 | |||
222 | #define MX25_PAD_LD5__LD5 IOMUX_PAD(0x2d4, 0x0dc, 0x10, 0, 0, NO_PAD_CTRL) | ||
223 | #define MX25_PAD_LD5__GPIO_1_19 IOMUX_PAD(0x2d4, 0x0dc, 0x15, 0, 0, NO_PAD_CTRL) | ||
224 | |||
225 | #define MX25_PAD_LD6__LD6 IOMUX_PAD(0x2d8, 0x0e0, 0x10, 0, 0, NO_PAD_CTRL) | ||
226 | #define MX25_PAD_LD6__GPIO_1_20 IOMUX_PAD(0x2d8, 0x0e0, 0x15, 0, 0, NO_PAD_CTRL) | ||
227 | |||
228 | #define MX25_PAD_LD7__LD7 IOMUX_PAD(0x2dc, 0x0e4, 0x10, 0, 0, NO_PAD_CTRL) | ||
229 | #define MX25_PAD_LD7__GPIO_1_21 IOMUX_PAD(0x2dc, 0x0e4, 0x15, 0, 0, NO_PAD_CTRL) | ||
230 | |||
231 | #define MX25_PAD_LD8__LD8 IOMUX_PAD(0x2e0, 0x0e8, 0x10, 0, 0, NO_PAD_CTRL) | ||
232 | #define MX25_PAD_LD8__FEC_TX_ERR IOMUX_PAD(0x2e0, 0x0e8, 0x15, 0, 0, NO_PAD_CTL) | ||
233 | |||
234 | #define MX25_PAD_LD9__LD9 IOMUX_PAD(0x2e4, 0x0ec, 0x10, 0, 0, NO_PAD_CTRL) | ||
235 | #define MX25_PAD_LD9__FEC_COL IOMUX_PAD(0x2e4, 0x0ec, 0x15, 0x504, 1, NO_PAD_CTL) | ||
236 | |||
237 | #define MX25_PAD_LD10__LD10 IOMUX_PAD(0x2e8, 0x0f0, 0x10, 0, 0, NO_PAD_CTRL) | ||
238 | #define MX25_PAD_LD10__FEC_RX_ER IOMUX_PAD(0x2e8, 0x0f0, 0x15, 0x518, 1, NO_PAD_CTL) | ||
239 | |||
240 | #define MX25_PAD_LD11__LD11 IOMUX_PAD(0x2ec, 0x0f4, 0x10, 0, 0, NO_PAD_CTRL) | ||
241 | #define MX25_PAD_LD11__FEC_RDATA2 IOMUX_PAD(0x2ec, 0x0f4, 0x15, 0x50c, 1, NO_PAD_CTL) | ||
242 | |||
243 | #define MX25_PAD_LD12__LD12 IOMUX_PAD(0x2f0, 0x0f8, 0x10, 0, 0, NO_PAD_CTRL) | ||
244 | #define MX25_PAD_LD12__FEC_RDATA3 IOMUX_PAD(0x2f0, 0x0f8, 0x15, 0x510, 1, NO_PAD_CTL) | ||
245 | |||
246 | #define MX25_PAD_LD13__LD13 IOMUX_PAD(0x2f4, 0x0fc, 0x10, 0, 0, NO_PAD_CTRL) | ||
247 | #define MX25_PAD_LD13__FEC_TDATA2 IOMUX_PAD(0x2f4, 0x0fc, 0x15, 0, 0, NO_PAD_CTL) | ||
248 | |||
249 | #define MX25_PAD_LD14__LD14 IOMUX_PAD(0x2f8, 0x100, 0x10, 0, 0, NO_PAD_CTRL) | ||
250 | #define MX25_PAD_LD14__FEC_TDATA3 IOMUX_PAD(0x2f8, 0x100, 0x15, 0, 0, NO_PAD_CTL) | ||
251 | |||
252 | #define MX25_PAD_LD15__LD15 IOMUX_PAD(0x2fc, 0x104, 0x10, 0, 0, NO_PAD_CTRL) | ||
253 | #define MX25_PAD_LD15__FEC_RX_CLK IOMUX_PAD(0x2fc, 0x104, 0x15, 0x514, 1, NO_PAD_CTL) | ||
254 | |||
255 | #define MX25_PAD_HSYNC__HSYNC IOMUX_PAD(0x300, 0x108, 0x10, 0, 0, NO_PAD_CTRL) | ||
256 | #define MX25_PAD_HSYNC__GPIO_1_22 IOMUX_PAD(0x300, 0x108, 0x15, 0, 0, NO_PAD_CTRL) | ||
257 | |||
258 | #define MX25_PAD_VSYNC__VSYNC IOMUX_PAD(0x304, 0x10c, 0x10, 0, 0, NO_PAD_CTRL) | ||
259 | #define MX25_PAD_VSYNC__GPIO_1_23 IOMUX_PAD(0x304, 0x10c, 0x15, 0, 0, NO_PAD_CTRL) | ||
260 | |||
261 | #define MX25_PAD_LSCLK__LSCLK IOMUX_PAD(0x308, 0x110, 0x10, 0, 0, NO_PAD_CTRL) | ||
262 | #define MX25_PAD_LSCLK__GPIO_1_24 IOMUX_PAD(0x308, 0x110, 0x15, 0, 0, NO_PAD_CTRL) | ||
263 | |||
264 | #define MX25_PAD_OE_ACD__OE_ACD IOMUX_PAD(0x30c, 0x114, 0x10, 0, 0, NO_PAD_CTRL) | ||
265 | #define MX25_PAD_OE_ACD__GPIO_1_25 IOMUX_PAD(0x30c, 0x114, 0x15, 0, 0, NO_PAD_CTRL) | ||
266 | |||
267 | #define MX25_PAD_CONTRAST__CONTRAST IOMUX_PAD(0x310, 0x118, 0x10, 0, 0, NO_PAD_CTRL) | ||
268 | #define MX25_PAD_CONTRAST__FEC_CRS IOMUX_PAD(0x310, 0x118, 0x15, 0x508, 1, NO_PAD_CTL) | ||
269 | |||
270 | #define MX25_PAD_PWM__PWM IOMUX_PAD(0x314, 0x11c, 0x10, 0, 0, NO_PAD_CTRL) | ||
271 | #define MX25_PAD_PWM__GPIO_1_26 IOMUX_PAD(0x314, 0x11c, 0x15, 0, 0, NO_PAD_CTRL) | ||
272 | #define MX25_PAD_PWM__USBH2_OC IOMUX_PAD(0x314, 0x11c, 0x16, 0x580, 1, PAD_CTL_PUS_100K_UP) | ||
273 | |||
274 | #define MX25_PAD_CSI_D2__CSI_D2 IOMUX_PAD(0x318, 0x120, 0x10, 0, 0, NO_PAD_CTRL) | ||
275 | #define MX25_PAD_CSI_D2__UART5_RXD_MUX IOMUX_PAD(0x318, 0x120, 0x11, 0x578, 1, NO_PAD_CTRL) | ||
276 | #define MX25_PAD_CSI_D2__GPIO_1_27 IOMUX_PAD(0x318, 0x120, 0x15, 0, 0, NO_PAD_CTRL) | ||
277 | |||
278 | #define MX25_PAD_CSI_D3__CSI_D3 IOMUX_PAD(0x31c, 0x124, 0x10, 0, 0, NO_PAD_CTRL) | ||
279 | #define MX25_PAD_CSI_D3__GPIO_1_28 IOMUX_PAD(0x31c, 0x124, 0x15, 0, 0, NO_PAD_CTRL) | ||
280 | |||
281 | #define MX25_PAD_CSI_D4__CSI_D4 IOMUX_PAD(0x320, 0x128, 0x10, 0, 0, NO_PAD_CTRL) | ||
282 | #define MX25_PAD_CSI_D4__UART5_RTS IOMUX_PAD(0x320, 0x128, 0x11, 0x574, 1, NO_PAD_CTRL) | ||
283 | #define MX25_PAD_CSI_D4__GPIO_1_29 IOMUX_PAD(0x320, 0x128, 0x15, 0, 0, NO_PAD_CTRL) | ||
284 | |||
285 | #define MX25_PAD_CSI_D5__CSI_D5 IOMUX_PAD(0x324, 0x12c, 0x10, 0, 0, NO_PAD_CTRL) | ||
286 | #define MX25_PAD_CSI_D5__GPIO_1_30 IOMUX_PAD(0x324, 0x12c, 0x15, 0, 0, NO_PAD_CTRL) | ||
287 | |||
288 | #define MX25_PAD_CSI_D6__CSI_D6 IOMUX_PAD(0x328, 0x130, 0x10, 0, 0, NO_PAD_CTRL) | ||
289 | #define MX25_PAD_CSI_D6__GPIO_1_31 IOMUX_PAD(0x328, 0x130, 0x15, 0, 0, NO_PAD_CTRL) | ||
290 | |||
291 | #define MX25_PAD_CSI_D7__CSI_D7 IOMUX_PAD(0x32c, 0x134, 0x10, 0, 0, NO_PAD_CTRL) | ||
292 | #define MX25_PAD_CSI_D7__GPIO_1_6 IOMUX_PAD(0x32c, 0x134, 0x15, 0, 0, NO_PAD_CTRL) | ||
293 | |||
294 | #define MX25_PAD_CSI_D8__CSI_D8 IOMUX_PAD(0x330, 0x138, 0x10, 0, 0, NO_PAD_CTRL) | ||
295 | #define MX25_PAD_CSI_D8__GPIO_1_7 IOMUX_PAD(0x330, 0x138, 0x15, 0, 0, NO_PAD_CTRL) | ||
296 | |||
297 | #define MX25_PAD_CSI_D9__CSI_D9 IOMUX_PAD(0x334, 0x13c, 0x10, 0, 0, NO_PAD_CTRL) | ||
298 | #define MX25_PAD_CSI_D9__GPIO_4_21 IOMUX_PAD(0x334, 0x13c, 0x15, 0, 0, NO_PAD_CTRL) | ||
299 | |||
300 | #define MX25_PAD_CSI_MCLK__CSI_MCLK IOMUX_PAD(0x338, 0x140, 0x10, 0, 0, NO_PAD_CTRL) | ||
301 | #define MX25_PAD_CSI_MCLK__GPIO_1_8 IOMUX_PAD(0x338, 0x140, 0x15, 0, 0, NO_PAD_CTRL) | ||
302 | |||
303 | #define MX25_PAD_CSI_VSYNC__CSI_VSYNC IOMUX_PAD(0x33c, 0x144, 0x10, 0, 0, NO_PAD_CTRL) | ||
304 | #define MX25_PAD_CSI_VSYNC__GPIO_1_9 IOMUX_PAD(0x33c, 0x144, 0x15, 0, 0, NO_PAD_CTRL) | ||
305 | |||
306 | #define MX25_PAD_CSI_HSYNC__CSI_HSYNC IOMUX_PAD(0x340, 0x148, 0x10, 0, 0, NO_PAD_CTRL) | ||
307 | #define MX25_PAD_CSI_HSYNC__GPIO_1_10 IOMUX_PAD(0x340, 0x148, 0x15, 0, 0, NO_PAD_CTRL) | ||
308 | |||
309 | #define MX25_PAD_CSI_PIXCLK__CSI_PIXCLK IOMUX_PAD(0x344, 0x14c, 0x10, 0, 0, NO_PAD_CTRL) | ||
310 | #define MX25_PAD_CSI_PIXCLK__GPIO_1_11 IOMUX_PAD(0x344, 0x14c, 0x15, 0, 0, NO_PAD_CTRL) | ||
311 | |||
312 | #define MX25_PAD_I2C1_CLK__I2C1_CLK IOMUX_PAD(0x348, 0x150, 0x10, 0, 0, NO_PAD_CTRL) | ||
313 | #define MX25_PAD_I2C1_CLK__GPIO_1_12 IOMUX_PAD(0x348, 0x150, 0x15, 0, 0, NO_PAD_CTRL) | ||
314 | |||
315 | #define MX25_PAD_I2C1_DAT__I2C1_DAT IOMUX_PAD(0x34c, 0x154, 0x10, 0, 0, NO_PAD_CTRL) | ||
316 | #define MX25_PAD_I2C1_DAT__GPIO_1_13 IOMUX_PAD(0x34c, 0x154, 0x15, 0, 0, NO_PAD_CTRL) | ||
317 | |||
318 | #define MX25_PAD_CSPI1_MOSI__CSPI1_MOSI IOMUX_PAD(0x350, 0x158, 0x10, 0, 0, NO_PAD_CTRL) | ||
319 | #define MX25_PAD_CSPI1_MOSI__GPIO_1_14 IOMUX_PAD(0x350, 0x158, 0x15, 0, 0, NO_PAD_CTRL) | ||
320 | |||
321 | #define MX25_PAD_CSPI1_MISO__CSPI1_MISO IOMUX_PAD(0x354, 0x15c, 0x10, 0, 0, NO_PAD_CTRL) | ||
322 | #define MX25_PAD_CSPI1_MISO__GPIO_1_15 IOMUX_PAD(0x354, 0x15c, 0x15, 0, 0, NO_PAD_CTRL) | ||
323 | |||
324 | #define MX25_PAD_CSPI1_SS0__CSPI1_SS0 IOMUX_PAD(0x358, 0x160, 0x10, 0, 0, NO_PAD_CTRL) | ||
325 | #define MX25_PAD_CSPI1_SS0__GPIO_1_16 IOMUX_PAD(0x358, 0x160, 0x15, 0, 0, NO_PAD_CTRL) | ||
326 | |||
327 | #define MX25_PAD_CSPI1_SS1__CSPI1_SS1 IOMUX_PAD(0x35c, 0x164, 0x10, 0, 0, NO_PAD_CTRL) | ||
328 | #define MX25_PAD_CSPI1_SS1__GPIO_1_17 IOMUX_PAD(0x35c, 0x164, 0x15, 0, 0, NO_PAD_CTRL) | ||
329 | |||
330 | #define MX25_PAD_CSPI1_SCLK__CSPI1_SCLK IOMUX_PAD(0x360, 0x168, 0x10, 0, 0, NO_PAD_CTRL) | ||
331 | #define MX25_PAD_CSPI1_SCLK__GPIO_1_18 IOMUX_PAD(0x360, 0x168, 0x15, 0, 0, NO_PAD_CTRL) | ||
332 | |||
333 | #define MX25_PAD_CSPI1_RDY__CSPI1_RDY IOMUX_PAD(0x364, 0x16c, 0x10, 0, 0, PAD_CTL_PKE) | ||
334 | #define MX25_PAD_CSPI1_RDY__GPIO_2_22 IOMUX_PAD(0x364, 0x16c, 0x15, 0, 0, NO_PAD_CTRL) | ||
335 | |||
336 | #define MX25_PAD_UART1_RXD__UART1_RXD IOMUX_PAD(0x368, 0x170, 0x10, 0, 0, PAD_CTL_PUS_100K_DOWN) | ||
337 | #define MX25_PAD_UART1_RXD__GPIO_4_22 IOMUX_PAD(0x368, 0x170, 0x15, 0, 0, NO_PAD_CTRL) | ||
338 | |||
339 | #define MX25_PAD_UART1_TXD__UART1_TXD IOMUX_PAD(0x36c, 0x174, 0x10, 0, 0, NO_PAD_CTRL) | ||
340 | #define MX25_PAD_UART1_TXD__GPIO_4_23 IOMUX_PAD(0x36c, 0x174, 0x15, 0, 0, NO_PAD_CTRL) | ||
341 | |||
342 | #define MX25_PAD_UART1_RTS__UART1_RTS IOMUX_PAD(0x370, 0x178, 0x10, 0, 0, PAD_CTL_PUS_100K_UP) | ||
343 | #define MX25_PAD_UART1_RTS__CSI_D0 IOMUX_PAD(0x370, 0x178, 0x11, 0x488, 1, NO_PAD_CTRL) | ||
344 | #define MX25_PAD_UART1_RTS__GPIO_4_24 IOMUX_PAD(0x370, 0x178, 0x15, 0, 0, NO_PAD_CTRL) | ||
345 | |||
346 | #define MX25_PAD_UART1_CTS__UART1_CTS IOMUX_PAD(0x374, 0x17c, 0x10, 0, 0, PAD_CTL_PUS_100K_UP) | ||
347 | #define MX25_PAD_UART1_CTS__CSI_D1 IOMUX_PAD(0x374, 0x17c, 0x11, 0x48c, 1, NO_PAD_CTRL) | ||
348 | #define MX25_PAD_UART1_CTS__GPIO_4_25 IOMUX_PAD(0x374, 0x17c, 0x15, 0, 0, NO_PAD_CTRL) | ||
349 | |||
350 | #define MX25_PAD_UART2_RXD__UART2_RXD IOMUX_PAD(0x378, 0x180, 0x10, 0, 0, NO_PAD_CTRL) | ||
351 | #define MX25_PAD_UART2_RXD__GPIO_4_26 IOMUX_PAD(0x378, 0x180, 0x15, 0, 0, NO_PAD_CTRL) | ||
352 | |||
353 | #define MX25_PAD_UART2_TXD__UART2_TXD IOMUX_PAD(0x37c, 0x184, 0x10, 0, 0, NO_PAD_CTRL) | ||
354 | #define MX25_PAD_UART2_TXD__GPIO_4_27 IOMUX_PAD(0x37c, 0x184, 0x15, 0, 0, NO_PAD_CTRL) | ||
355 | |||
356 | #define MX25_PAD_UART2_RTS__UART2_RTS IOMUX_PAD(0x380, 0x188, 0x10, 0, 0, NO_PAD_CTRL) | ||
357 | #define MX25_PAD_UART2_RTS__FEC_COL IOMUX_PAD(0x380, 0x188, 0x12, 0x504, 2, NO_PAD_CTL) | ||
358 | #define MX25_PAD_UART2_RTS__GPIO_4_28 IOMUX_PAD(0x380, 0x188, 0x15, 0, 0, NO_PAD_CTRL) | ||
359 | |||
360 | #define MX25_PAD_UART2_CTS__FEC_RX_ER IOMUX_PAD(0x384, 0x18c, 0x12, 0x518, 2, NO_PAD_CTL) | ||
361 | #define MX25_PAD_UART2_CTS__UART2_CTS IOMUX_PAD(0x384, 0x18c, 0x10, 0, 0, NO_PAD_CTRL) | ||
362 | #define MX25_PAD_UART2_CTS__GPIO_4_29 IOMUX_PAD(0x384, 0x18c, 0x15, 0, 0, NO_PAD_CTRL) | ||
363 | |||
364 | #define MX25_PAD_SD1_CMD__SD1_CMD IOMUX_PAD(0x388, 0x190, 0x10, 0, 0, PAD_CTL_PUS_47K_UP) | ||
365 | #define MX25_PAD_SD1_CMD__FEC_RDATA2 IOMUX_PAD(0x388, 0x190, 0x12, 0x50c, 2, NO_PAD_CTL) | ||
366 | #define MX25_PAD_SD1_CMD__GPIO_2_23 IOMUX_PAD(0x388, 0x190, 0x15, 0, 0, NO_PAD_CTRL) | ||
367 | |||
368 | #define MX25_PAD_SD1_CLK__SD1_CLK IOMUX_PAD(0x38c, 0x194, 0x10, 0, 0, PAD_CTL_PUS_47K_UP) | ||
369 | #define MX25_PAD_SD1_CLK__FEC_RDATA3 IOMUX_PAD(0x38c, 0x194, 0x12, 0x510, 2, NO_PAD_CTL) | ||
370 | #define MX25_PAD_SD1_CLK__GPIO_2_24 IOMUX_PAD(0x38c, 0x194, 0x15, 0, 0, NO_PAD_CTRL) | ||
371 | |||
372 | #define MX25_PAD_SD1_DATA0__SD1_DATA0 IOMUX_PAD(0x390, 0x198, 0x10, 0, 0, PAD_CTL_PUS_47K_UP) | ||
373 | #define MX25_PAD_SD1_DATA0__GPIO_2_25 IOMUX_PAD(0x390, 0x198, 0x15, 0, 0, NO_PAD_CTRL) | ||
374 | |||
375 | #define MX25_PAD_SD1_DATA1__SD1_DATA1 IOMUX_PAD(0x394, 0x19c, 0x10, 0, 0, PAD_CTL_PUS_47K_UP) | ||
376 | #define MX25_PAD_SD1_DATA1__AUD7_RXD IOMUX_PAD(0x394, 0x19c, 0x13, 0x478, 0, NO_PAD_CTRL) | ||
377 | #define MX25_PAD_SD1_DATA1__GPIO_2_26 IOMUX_PAD(0x394, 0x19c, 0x15, 0, 0, NO_PAD_CTRL) | ||
378 | |||
379 | #define MX25_PAD_SD1_DATA2__SD1_DATA2 IOMUX_PAD(0x398, 0x1a0, 0x10, 0, 0, PAD_CTL_PUS_47K_UP) | ||
380 | #define MX25_PAD_SD1_DATA2__FEC_RX_CLK IOMUX_PAD(0x398, 0x1a0, 0x15, 0x514, 2, NO_PAD_CTL) | ||
381 | #define MX25_PAD_SD1_DATA2__GPIO_2_27 IOMUX_PAD(0x398, 0x1a0, 0x15, 0, 0, NO_PAD_CTRL) | ||
382 | |||
383 | #define MX25_PAD_SD1_DATA3__SD1_DATA3 IOMUX_PAD(0x39c, 0x1a4, 0x10, 0, 0, PAD_CTL_PUS_47K_UP) | ||
384 | #define MX25_PAD_SD1_DATA3__FEC_CRS IOMUX_PAD(0x39c, 0x1a4, 0x10, 0x508, 2, NO_PAD_CTL) | ||
385 | #define MX25_PAD_SD1_DATA3__GPIO_2_28 IOMUX_PAD(0x39c, 0x1a4, 0x15, 0, 0, NO_PAD_CTRL) | ||
386 | |||
387 | #define MX25_PAD_KPP_ROW0__KPP_ROW0 IOMUX_PAD(0x3a0, 0x1a8, 0x10, 0, 0, PAD_CTL_PKE) | ||
388 | #define MX25_PAD_KPP_ROW0__GPIO_2_29 IOMUX_PAD(0x3a0, 0x1a8, 0x15, 0, 0, NO_PAD_CTRL) | ||
389 | |||
390 | #define MX25_PAD_KPP_ROW1__KPP_ROW1 IOMUX_PAD(0x3a4, 0x1ac, 0x10, 0, 0, PAD_CTL_PKE) | ||
391 | #define MX25_PAD_KPP_ROW1__GPIO_2_30 IOMUX_PAD(0x3a4, 0x1ac, 0x15, 0, 0, NO_PAD_CTRL) | ||
392 | |||
393 | #define MX25_PAD_KPP_ROW2__KPP_ROW2 IOMUX_PAD(0x3a8, 0x1b0, 0x10, 0, 0, PAD_CTL_PKE) | ||
394 | #define MX25_PAD_KPP_ROW2__CSI_D0 IOMUX_PAD(0x3a8, 0x1b0, 0x13, 0x488, 2, NO_PAD_CTRL) | ||
395 | #define MX25_PAD_KPP_ROW2__GPIO_2_31 IOMUX_PAD(0x3a8, 0x1b0, 0x15, 0, 0, NO_PAD_CTRL) | ||
396 | |||
397 | #define MX25_PAD_KPP_ROW3__KPP_ROW3 IOMUX_PAD(0x3ac, 0x1b4, 0x10, 0, 0, PAD_CTL_PKE) | ||
398 | #define MX25_PAD_KPP_ROW3__CSI_LD1 IOMUX_PAD(0x3ac, 0x1b4, 0x13, 0x48c, 2, NO_PAD_CTRL) | ||
399 | #define MX25_PAD_KPP_ROW3__GPIO_3_0 IOMUX_PAD(0x3ac, 0x1b4, 0x15, 0, 0, NO_PAD_CTRL) | ||
400 | |||
401 | #define MX25_PAD_KPP_COL0__KPP_COL0 IOMUX_PAD(0x3b0, 0x1b8, 0x10, 0, 0, PAD_CTL_PKE | PAD_CTL_ODE) | ||
402 | #define MX25_PAD_KPP_COL0__GPIO_3_1 IOMUX_PAD(0x3b0, 0x1b8, 0x15, 0, 0, NO_PAD_CTRL) | ||
403 | |||
404 | #define MX25_PAD_KPP_COL1__KPP_COL1 IOMUX_PAD(0x3b4, 0x1bc, 0x10, 0, 0, PAD_CTL_PKE | PAD_CTL_ODE) | ||
405 | #define MX25_PAD_KPP_COL1__GPIO_3_2 IOMUX_PAD(0x3b4, 0x1bc, 0x15, 0, 0, NO_PAD_CTRL) | ||
406 | |||
407 | #define MX25_PAD_KPP_COL2__KPP_COL2 IOMUX_PAD(0x3b8, 0x1c0, 0x10, 0, 0, PAD_CTL_PKE | PAD_CTL_ODE) | ||
408 | #define MX25_PAD_KPP_COL2__GPIO_3_3 IOMUX_PAD(0x3b8, 0x1c0, 0x15, 0, 0, NO_PAD_CTRL) | ||
409 | |||
410 | #define MX25_PAD_KPP_COL3__KPP_COL3 IOMUX_PAD(0x3bc, 0x1c4, 0x10, 0, 0, PAD_CTL_PKE | PAD_CTL_ODE) | ||
411 | #define MX25_PAD_KPP_COL3__GPIO_3_4 IOMUX_PAD(0x3bc, 0x1c4, 0x15, 0, 0, NO_PAD_CTRL) | ||
412 | |||
413 | #define MX25_PAD_FEC_MDC__FEC_MDC IOMUX_PAD(0x3c0, 0x1c8, 0x10, 0, 0, NO_PAD_CTL) | ||
414 | #define MX25_PAD_FEC_MDC__AUD4_TXD IOMUX_PAD(0x3c0, 0x1c8, 0x12, 0x464, 1, NO_PAD_CTRL) | ||
415 | #define MX25_PAD_FEC_MDC__GPIO_3_5 IOMUX_PAD(0x3c0, 0x1c8, 0x15, 0, 0, NO_PAD_CTRL) | ||
416 | |||
417 | #define MX25_PAD_FEC_MDIO__FEC_MDIO IOMUX_PAD(0x3c4, 0x1cc, 0x10, 0, 0, PAD_CTL_HYS | PAD_CTL_PUS_22K_UP) | ||
418 | #define MX25_PAD_FEC_MDIO__AUD4_RXD IOMUX_PAD(0x3c4, 0x1cc, 0x12, 0x460, 1, NO_PAD_CTRL) | ||
419 | #define MX25_PAD_FEC_MDIO__GPIO_3_6 IOMUX_PAD(0x3c4, 0x1cc, 0x15, 0, 0, NO_PAD_CTRL) | ||
420 | |||
421 | #define MX25_PAD_FEC_TDATA0__FEC_TDATA0 IOMUX_PAD(0x3c8, 0x1d0, 0x10, 0, 0, NO_PAD_CTL) | ||
422 | #define MX25_PAD_FEC_TDATA0__GPIO_3_7 IOMUX_PAD(0x3c8, 0x1d0, 0x15, 0, 0, NO_PAD_CTRL) | ||
423 | |||
424 | #define MX25_PAD_FEC_TDATA1__FEC_TDATA1 IOMUX_PAD(0x3cc, 0x1d4, 0x10, 0, 0, NO_PAD_CTL) | ||
425 | #define MX25_PAD_FEC_TDATA1__AUD4_TXFS IOMUX_PAD(0x3cc, 0x1d4, 0x12, 0x474, 1, NO_PAD_CTRL) | ||
426 | #define MX25_PAD_FEC_TDATA1__GPIO_3_8 IOMUX_PAD(0x3cc, 0x1d4, 0x15, 0, 0, NO_PAD_CTRL) | ||
427 | |||
428 | #define MX25_PAD_FEC_TX_EN__FEC_TX_EN IOMUX_PAD(0x3d0, 0x1d8, 0x10, 0, 0, NO_PAD_CTL) | ||
429 | #define MX25_PAD_FEC_TX_EN__GPIO_3_9 IOMUX_PAD(0x3d0, 0x1d8, 0x15, 0, 0, NO_PAD_CTRL) | ||
430 | |||
431 | #define MX25_PAD_FEC_RDATA0__FEC_RDATA0 IOMUX_PAD(0x3d4, 0x1dc, 0x10, 0, 0, PAD_CTL_PUS_100K_DOWN | NO_PAD_CTL) | ||
432 | #define MX25_PAD_FEC_RDATA0__GPIO_3_10 IOMUX_PAD(0x3d4, 0x1dc, 0x15, 0, 0, NO_PAD_CTRL) | ||
433 | |||
434 | #define MX25_PAD_FEC_RDATA1__FEC_RDATA1 IOMUX_PAD(0x3d8, 0x1e0, 0x10, 0, 0, PAD_CTL_PUS_100K_DOWN | NO_PAD_CTL) | ||
435 | #define MX25_PAD_FEC_RDATA1__GPIO_3_11 IOMUX_PAD(0x3d8, 0x1e0, 0x15, 0, 0, NO_PAD_CTRL) | ||
436 | |||
437 | #define MX25_PAD_FEC_RX_DV__FEC_RX_DV IOMUX_PAD(0x3dc, 0x1e4, 0x10, 0, 0, PAD_CTL_PUS_100K_DOWN | NO_PAD_CTL) | ||
438 | #define MX25_PAD_FEC_RX_DV__CAN2_RX IOMUX_PAD(0x3dc, 0x1e4, 0x14, 0x484, 0, PAD_CTL_PUS_22K_UP) | ||
439 | #define MX25_PAD_FEC_RX_DV__GPIO_3_12 IOMUX_PAD(0x3dc, 0x1e4, 0x15, 0, 0, NO_PAD_CTRL) | ||
440 | |||
441 | #define MX25_PAD_FEC_TX_CLK__FEC_TX_CLK IOMUX_PAD(0x3e0, 0x1e8, 0x10, 0, 0, PAD_CTL_HYS | PAD_CTL_PUS_100K_DOWN) | ||
442 | #define MX25_PAD_FEC_TX_CLK__GPIO_3_13 IOMUX_PAD(0x3e0, 0x1e8, 0x15, 0, 0, NO_PAD_CTRL) | ||
443 | |||
444 | #define MX25_PAD_RTCK__RTCK IOMUX_PAD(0x3e4, 0x1ec, 0x10, 0, 0, NO_PAD_CTRL) | ||
445 | #define MX25_PAD_RTCK__OWIRE IOMUX_PAD(0x3e4, 0x1ec, 0x11, 0, 0, NO_PAD_CTRL) | ||
446 | #define MX25_PAD_RTCK__GPIO_3_14 IOMUX_PAD(0x3e4, 0x1ec, 0x15, 0, 0, NO_PAD_CTRL) | ||
447 | |||
448 | #define MX25_PAD_DE_B__DE_B IOMUX_PAD(0x3ec, 0x1f0, 0x10, 0, 0, NO_PAD_CTRL) | ||
449 | #define MX25_PAD_DE_B__GPIO_2_20 IOMUX_PAD(0x3ec, 0x1f0, 0x15, 0, 0, NO_PAD_CTRL) | ||
450 | |||
451 | #define MX25_PAD_TDO__TDO IOMUX_PAD(0x3e8, 0x000, 0x00, 0, 0, NO_PAD_CTRL) | ||
452 | |||
453 | #define MX25_PAD_GPIO_A__GPIO_A IOMUX_PAD(0x3f0, 0x1f4, 0x10, 0, 0, NO_PAD_CTRL) | ||
454 | #define MX25_PAD_GPIO_A__CAN1_TX IOMUX_PAD(0x3f0, 0x1f4, 0x16, 0, 0, PAD_CTL_PUS_22K_UP) | ||
455 | #define MX25_PAD_GPIO_A__USBOTG_PWR IOMUX_PAD(0x3f0, 0x1f4, 0x12, 0, 0, PAD_CTL_PKE) | ||
456 | |||
457 | #define MX25_PAD_GPIO_B__GPIO_B IOMUX_PAD(0x3f4, 0x1f8, 0x10, 0, 0, NO_PAD_CTRL) | ||
458 | #define MX25_PAD_GPIO_B__CAN1_RX IOMUX_PAD(0x3f4, 0x1f8, 0x16, 0x480, 1, PAD_CTL_PUS_22K) | ||
459 | #define MX25_PAD_GPIO_B__USBOTG_OC IOMUX_PAD(0x3f4, 0x1f8, 0x12, 0x57c, 1, PAD_CTL_PUS_100K_UP) | ||
460 | |||
461 | #define MX25_PAD_GPIO_C__GPIO_C IOMUX_PAD(0x3f8, 0x1fc, 0x10, 0, 0, NO_PAD_CTRL) | ||
462 | #define MX25_PAD_GPIO_C__CAN2_TX IOMUX_PAD(0x3f8, 0x1fc, 0x16, 0, 0, PAD_CTL_PUS_22K_UP) | ||
463 | |||
464 | #define MX25_PAD_GPIO_D__GPIO_D IOMUX_PAD(0x3fc, 0x200, 0x10, 0, 0, NO_PAD_CTRL) | ||
465 | #define MX25_PAD_GPIO_D__CAN2_RX IOMUX_PAD(0x3fc, 0x200, 0x16, 0x484, 1, PAD_CTL_PUS_22K_UP) | ||
466 | |||
467 | #define MX25_PAD_GPIO_E__GPIO_E IOMUX_PAD(0x400, 0x204, 0x10, 0, 0, NO_PAD_CTRL) | ||
468 | #define MX25_PAD_GPIO_E__AUD7_TXD IOMUX_PAD(0x400, 0x204, 0x14, 0, 0, NO_PAD_CTRL) | ||
469 | |||
470 | #define MX25_PAD_GPIO_F__GPIO_F IOMUX_PAD(0x404, 0x208, 0x10, 0, 0, NO_PAD_CTRL) | ||
471 | #define MX25_PAD_GPIO_F__AUD7_TXC IOMUX_PAD(0x404, 0x208, 0x14, 0, 0, NO_PAD_CTRL) | ||
472 | |||
473 | #define MX25_PAD_EXT_ARMCLK__EXT_ARMCLK IOMUX_PAD(0x000, 0x20c, 0x10, 0, 0, NO_PAD_CTRL) | ||
474 | #define MX25_PAD_EXT_ARMCLK__GPIO_3_15 IOMUX_PAD(0x000, 0x20c, 0x15, 0, 0, NO_PAD_CTRL) | ||
475 | |||
476 | #define MX25_PAD_UPLL_BYPCLK__UPLL_BYPCLK IOMUX_PAD(0x000, 0x210, 0x10, 0, 0, NO_PAD_CTRL) | ||
477 | #define MX25_PAD_UPLL_BYPCLK__GPIO_3_16 IOMUX_PAD(0x000, 0x210, 0x15, 0, 0, NO_PAD_CTRL) | ||
478 | |||
479 | #define MX25_PAD_VSTBY_REQ__VSTBY_REQ IOMUX_PAD(0x408, 0x214, 0x10, 0, 0, NO_PAD_CTRL) | ||
480 | #define MX25_PAD_VSTBY_REQ__AUD7_TXFS IOMUX_PAD(0x408, 0x214, 0x14, 0, 0, NO_PAD_CTRL) | ||
481 | #define MX25_PAD_VSTBY_REQ__GPIO_3_17 IOMUX_PAD(0x408, 0x214, 0x15, 0, 0, NO_PAD_CTRL) | ||
482 | #define MX25_PAD_VSTBY_ACK__VSTBY_ACK IOMUX_PAD(0x40c, 0x218, 0x10, 0, 0, NO_PAD_CTRL) | ||
483 | #define MX25_PAD_VSTBY_ACK__GPIO_3_18 IOMUX_PAD(0x40c, 0x218, 0x15, 0, 0, NO_PAD_CTRL) | ||
484 | |||
485 | #define MX25_PAD_POWER_FAIL__POWER_FAIL IOMUX_PAD(0x410, 0x21c, 0x10, 0, 0, NO_PAD_CTRL) | ||
486 | #define MX25_PAD_POWER_FAIL__AUD7_RXD IOMUX_PAD(0x410, 0x21c, 0x14, 0x478, 1, NO_PAD_CTRL) | ||
487 | #define MX25_PAD_POWER_FAIL__GPIO_3_19 IOMUX_PAD(0x410, 0x21c, 0x15, 0, 0, NO_PAD_CTRL) | ||
488 | |||
489 | #define MX25_PAD_CLKO__CLKO IOMUX_PAD(0x414, 0x220, 0x10, 0, 0, NO_PAD_CTRL) | ||
490 | #define MX25_PAD_CLKO__GPIO_2_21 IOMUX_PAD(0x414, 0x220, 0x15, 0, 0, NO_PAD_CTRL) | ||
491 | |||
492 | #define MX25_PAD_BOOT_MODE0__BOOT_MODE0 IOMUX_PAD(0x000, 0x224, 0x00, 0, 0, NO_PAD_CTRL) | ||
493 | #define MX25_PAD_BOOT_MODE0__GPIO_4_30 IOMUX_PAD(0x000, 0x224, 0x05, 0, 0, NO_PAD_CTRL) | ||
494 | #define MX25_PAD_BOOT_MODE1__BOOT_MODE1 IOMUX_PAD(0x000, 0x228, 0x00, 0, 0, NO_PAD_CTRL) | ||
495 | #define MX25_PAD_BOOT_MODE1__GPIO_4_31 IOMUX_PAD(0x000, 0x228, 0x05, 0, 0, NO_PAD_CTRL) | ||
496 | |||
497 | #define MX25_PAD_CTL_GRP_DVS_MISC IOMUX_PAD(0x418, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
498 | #define MX25_PAD_CTL_GRP_DSE_FEC IOMUX_PAD(0x41c, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
499 | #define MX25_PAD_CTL_GRP_DVS_JTAG IOMUX_PAD(0x420, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
500 | #define MX25_PAD_CTL_GRP_DSE_NFC IOMUX_PAD(0x424, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
501 | #define MX25_PAD_CTL_GRP_DSE_CSI IOMUX_PAD(0x428, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
502 | #define MX25_PAD_CTL_GRP_DSE_WEIM IOMUX_PAD(0x42c, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
503 | #define MX25_PAD_CTL_GRP_DSE_DDR IOMUX_PAD(0x430, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
504 | #define MX25_PAD_CTL_GRP_DVS_CRM IOMUX_PAD(0x434, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
505 | #define MX25_PAD_CTL_GRP_DSE_KPP IOMUX_PAD(0x438, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
506 | #define MX25_PAD_CTL_GRP_DSE_SDHC1 IOMUX_PAD(0x43c, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
507 | #define MX25_PAD_CTL_GRP_DSE_LCD IOMUX_PAD(0x440, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
508 | #define MX25_PAD_CTL_GRP_DSE_UART IOMUX_PAD(0x444, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
509 | #define MX25_PAD_CTL_GRP_DVS_NFC IOMUX_PAD(0x448, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
510 | #define MX25_PAD_CTL_GRP_DVS_CSI IOMUX_PAD(0x44c, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
511 | #define MX25_PAD_CTL_GRP_DSE_CSPI1 IOMUX_PAD(0x450, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
512 | #define MX25_PAD_CTL_GRP_DDRTYPE IOMUX_PAD(0x454, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
513 | #define MX25_PAD_CTL_GRP_DVS_SDHC1 IOMUX_PAD(0x458, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
514 | #define MX25_PAD_CTL_GRP_DVS_LCD IOMUX_PAD(0x45c, 0x000, 0, 0, 0, NO_PAD_CTRL) | ||
515 | |||
516 | #endif // __ASSEMBLY__ | ||
517 | #endif // __IOMUX_MX25_H__ | ||
diff --git a/arch/arm/plat-mxc/include/mach/iomux-mx3.h b/arch/arm/plat-mxc/include/mach/iomux-mx3.h index 2eb182f73876..446f86763816 100644 --- a/arch/arm/plat-mxc/include/mach/iomux-mx3.h +++ b/arch/arm/plat-mxc/include/mach/iomux-mx3.h | |||
@@ -635,6 +635,19 @@ enum iomux_pins { | |||
635 | #define MX31_PIN_USBOTG_DIR__USBOTG_DIR IOMUX_MODE(MX31_PIN_USBOTG_DIR, IOMUX_CONFIG_FUNC) | 635 | #define MX31_PIN_USBOTG_DIR__USBOTG_DIR IOMUX_MODE(MX31_PIN_USBOTG_DIR, IOMUX_CONFIG_FUNC) |
636 | #define MX31_PIN_USBOTG_NXT__USBOTG_NXT IOMUX_MODE(MX31_PIN_USBOTG_NXT, IOMUX_CONFIG_FUNC) | 636 | #define MX31_PIN_USBOTG_NXT__USBOTG_NXT IOMUX_MODE(MX31_PIN_USBOTG_NXT, IOMUX_CONFIG_FUNC) |
637 | #define MX31_PIN_USBOTG_STP__USBOTG_STP IOMUX_MODE(MX31_PIN_USBOTG_STP, IOMUX_CONFIG_FUNC) | 637 | #define MX31_PIN_USBOTG_STP__USBOTG_STP IOMUX_MODE(MX31_PIN_USBOTG_STP, IOMUX_CONFIG_FUNC) |
638 | #define MX31_PIN_CSPI1_MOSI__USBH1_RXDM IOMUX_MODE(MX31_PIN_CSPI1_MOSI, IOMUX_CONFIG_ALT1) | ||
639 | #define MX31_PIN_CSPI1_MISO__USBH1_RXDP IOMUX_MODE(MX31_PIN_CSPI1_MISO, IOMUX_CONFIG_ALT1) | ||
640 | #define MX31_PIN_CSPI1_SS0__USBH1_TXDM IOMUX_MODE(MX31_PIN_CSPI1_SS0, IOMUX_CONFIG_ALT1) | ||
641 | #define MX31_PIN_CSPI1_SS1__USBH1_TXDP IOMUX_MODE(MX31_PIN_CSPI1_SS1, IOMUX_CONFIG_ALT1) | ||
642 | #define MX31_PIN_CSPI1_SS2__USBH1_RCV IOMUX_MODE(MX31_PIN_CSPI1_SS2, IOMUX_CONFIG_ALT1) | ||
643 | #define MX31_PIN_CSPI1_SCLK__USBH1_OEB IOMUX_MODE(MX31_PIN_CSPI1_SCLK, IOMUX_CONFIG_ALT1) | ||
644 | #define MX31_PIN_CSPI1_SPI_RDY__USBH1_FS IOMUX_MODE(MX31_PIN_CSPI1_SPI_RDY, IOMUX_CONFIG_ALT1) | ||
645 | #define MX31_PIN_USBH2_DATA0__USBH2_DATA0 IOMUX_MODE(MX31_PIN_USBH2_DATA0, IOMUX_CONFIG_FUNC) | ||
646 | #define MX31_PIN_USBH2_DATA1__USBH2_DATA1 IOMUX_MODE(MX31_PIN_USBH2_DATA1, IOMUX_CONFIG_FUNC) | ||
647 | #define MX31_PIN_USBH2_CLK__USBH2_CLK IOMUX_MODE(MX31_PIN_USBH2_CLK, IOMUX_CONFIG_FUNC) | ||
648 | #define MX31_PIN_USBH2_DIR__USBH2_DIR IOMUX_MODE(MX31_PIN_USBH2_DIR, IOMUX_CONFIG_FUNC) | ||
649 | #define MX31_PIN_USBH2_NXT__USBH2_NXT IOMUX_MODE(MX31_PIN_USBH2_NXT, IOMUX_CONFIG_FUNC) | ||
650 | #define MX31_PIN_USBH2_STP__USBH2_STP IOMUX_MODE(MX31_PIN_USBH2_STP, IOMUX_CONFIG_FUNC) | ||
638 | #define MX31_PIN_USB_OC__GPIO1_30 IOMUX_MODE(MX31_PIN_USB_OC, IOMUX_CONFIG_GPIO) | 651 | #define MX31_PIN_USB_OC__GPIO1_30 IOMUX_MODE(MX31_PIN_USB_OC, IOMUX_CONFIG_GPIO) |
639 | #define MX31_PIN_I2C_DAT__I2C1_SDA IOMUX_MODE(MX31_PIN_I2C_DAT, IOMUX_CONFIG_FUNC) | 652 | #define MX31_PIN_I2C_DAT__I2C1_SDA IOMUX_MODE(MX31_PIN_I2C_DAT, IOMUX_CONFIG_FUNC) |
640 | #define MX31_PIN_I2C_CLK__I2C1_SCL IOMUX_MODE(MX31_PIN_I2C_CLK, IOMUX_CONFIG_FUNC) | 653 | #define MX31_PIN_I2C_CLK__I2C1_SCL IOMUX_MODE(MX31_PIN_I2C_CLK, IOMUX_CONFIG_FUNC) |
@@ -669,6 +682,18 @@ enum iomux_pins { | |||
669 | #define MX31_PIN_GPIO3_0__GPIO3_0 IOMUX_MODE(MX31_PIN_GPIO3_0, IOMUX_CONFIG_GPIO) | 682 | #define MX31_PIN_GPIO3_0__GPIO3_0 IOMUX_MODE(MX31_PIN_GPIO3_0, IOMUX_CONFIG_GPIO) |
670 | #define MX31_PIN_GPIO3_1__GPIO3_1 IOMUX_MODE(MX31_PIN_GPIO3_1, IOMUX_CONFIG_GPIO) | 683 | #define MX31_PIN_GPIO3_1__GPIO3_1 IOMUX_MODE(MX31_PIN_GPIO3_1, IOMUX_CONFIG_GPIO) |
671 | #define MX31_PIN_TXD2__GPIO1_28 IOMUX_MODE(MX31_PIN_TXD2, IOMUX_CONFIG_GPIO) | 684 | #define MX31_PIN_TXD2__GPIO1_28 IOMUX_MODE(MX31_PIN_TXD2, IOMUX_CONFIG_GPIO) |
685 | #define MX31_PIN_GPIO1_0__GPIO1_0 IOMUX_MODE(MX31_PIN_GPIO1_0, IOMUX_CONFIG_GPIO) | ||
686 | #define MX31_PIN_SVEN0__GPIO2_0 IOMUX_MODE(MX31_PIN_SVEN0, IOMUX_CONFIG_GPIO) | ||
687 | #define MX31_PIN_STX0__GPIO2_1 IOMUX_MODE(MX31_PIN_STX0, IOMUX_CONFIG_GPIO) | ||
688 | #define MX31_PIN_SRX0__GPIO2_2 IOMUX_MODE(MX31_PIN_SRX0, IOMUX_CONFIG_GPIO) | ||
689 | #define MX31_PIN_SIMPD0__GPIO2_3 IOMUX_MODE(MX31_PIN_SIMPD0, IOMUX_CONFIG_GPIO) | ||
690 | #define MX31_PIN_DTR_DCE1__GPIO2_8 IOMUX_MODE(MX31_PIN_DTR_DCE1, IOMUX_CONFIG_GPIO) | ||
691 | #define MX31_PIN_DSR_DCE1__GPIO2_9 IOMUX_MODE(MX31_PIN_DSR_DCE1, IOMUX_CONFIG_GPIO) | ||
692 | #define MX31_PIN_RI_DCE1__GPIO2_10 IOMUX_MODE(MX31_PIN_RI_DCE1, IOMUX_CONFIG_GPIO) | ||
693 | #define MX31_PIN_DCD_DCE1__GPIO2_11 IOMUX_MODE(MX31_PIN_DCD_DCE1, IOMUX_CONFIG_GPIO) | ||
694 | #define MX31_PIN_STXD5__GPIO1_21 IOMUX_MODE(MX31_PIN_STXD5, IOMUX_CONFIG_GPIO) | ||
695 | #define MX31_PIN_SRXD5__GPIO1_22 IOMUX_MODE(MX31_PIN_SRXD5, IOMUX_CONFIG_GPIO) | ||
696 | |||
672 | 697 | ||
673 | /*XXX: The SS0, SS1, SS2, SS3 lines of spi3 are multiplexed by cspi2_ss0, cspi2_ss1, cspi1_ss0 | 698 | /*XXX: The SS0, SS1, SS2, SS3 lines of spi3 are multiplexed by cspi2_ss0, cspi2_ss1, cspi1_ss0 |
674 | * cspi1_ss1*/ | 699 | * cspi1_ss1*/ |
diff --git a/arch/arm/plat-mxc/include/mach/iomux-mxc91231.h b/arch/arm/plat-mxc/include/mach/iomux-mxc91231.h new file mode 100644 index 000000000000..9f13061192c8 --- /dev/null +++ b/arch/arm/plat-mxc/include/mach/iomux-mxc91231.h | |||
@@ -0,0 +1,287 @@ | |||
1 | /* | ||
2 | * Copyright 2004-2006 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * Copyright (C) 2008 by Sascha Hauer <kernel@pengutronix.de> | ||
4 | * Copyright (C) 2009 by Dmitriy Taychenachev <dimichxp@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #ifndef __MACH_IOMUX_MXC91231_H__ | ||
22 | #define __MACH_IOMUX_MXC91231_H__ | ||
23 | |||
24 | /* | ||
25 | * various IOMUX output functions | ||
26 | */ | ||
27 | |||
28 | #define IOMUX_OCONFIG_GPIO (0 << 4) /* used as GPIO */ | ||
29 | #define IOMUX_OCONFIG_FUNC (1 << 4) /* used as function */ | ||
30 | #define IOMUX_OCONFIG_ALT1 (2 << 4) /* used as alternate function 1 */ | ||
31 | #define IOMUX_OCONFIG_ALT2 (3 << 4) /* used as alternate function 2 */ | ||
32 | #define IOMUX_OCONFIG_ALT3 (4 << 4) /* used as alternate function 3 */ | ||
33 | #define IOMUX_OCONFIG_ALT4 (5 << 4) /* used as alternate function 4 */ | ||
34 | #define IOMUX_OCONFIG_ALT5 (6 << 4) /* used as alternate function 5 */ | ||
35 | #define IOMUX_OCONFIG_ALT6 (7 << 4) /* used as alternate function 6 */ | ||
36 | #define IOMUX_ICONFIG_NONE 0 /* not configured for input */ | ||
37 | #define IOMUX_ICONFIG_GPIO 1 /* used as GPIO */ | ||
38 | #define IOMUX_ICONFIG_FUNC 2 /* used as function */ | ||
39 | #define IOMUX_ICONFIG_ALT1 4 /* used as alternate function 1 */ | ||
40 | #define IOMUX_ICONFIG_ALT2 8 /* used as alternate function 2 */ | ||
41 | |||
42 | #define IOMUX_CONFIG_GPIO (IOMUX_OCONFIG_GPIO | IOMUX_ICONFIG_GPIO) | ||
43 | #define IOMUX_CONFIG_FUNC (IOMUX_OCONFIG_FUNC | IOMUX_ICONFIG_FUNC) | ||
44 | #define IOMUX_CONFIG_ALT1 (IOMUX_OCONFIG_ALT1 | IOMUX_ICONFIG_ALT1) | ||
45 | #define IOMUX_CONFIG_ALT2 (IOMUX_OCONFIG_ALT2 | IOMUX_ICONFIG_ALT2) | ||
46 | |||
47 | /* | ||
48 | * setups a single pin: | ||
49 | * - reserves the pin so that it is not claimed by another driver | ||
50 | * - setups the iomux according to the configuration | ||
51 | * - if the pin is configured as a GPIO, we claim it throug kernel gpiolib | ||
52 | */ | ||
53 | int mxc_iomux_alloc_pin(const unsigned int pin_mode, const char *label); | ||
54 | /* | ||
55 | * setups mutliple pins | ||
56 | * convenient way to call the above function with tables | ||
57 | */ | ||
58 | int mxc_iomux_setup_multiple_pins(unsigned int *pin_list, unsigned count, | ||
59 | const char *label); | ||
60 | |||
61 | /* | ||
62 | * releases a single pin: | ||
63 | * - make it available for a future use by another driver | ||
64 | * - frees the GPIO if the pin was configured as GPIO | ||
65 | * - DOES NOT reconfigure the IOMUX in its reset state | ||
66 | */ | ||
67 | void mxc_iomux_release_pin(const unsigned int pin_mode); | ||
68 | /* | ||
69 | * releases multiple pins | ||
70 | * convenvient way to call the above function with tables | ||
71 | */ | ||
72 | void mxc_iomux_release_multiple_pins(unsigned int *pin_list, int count); | ||
73 | |||
74 | #define MUX_SIDE_AP (0) | ||
75 | #define MUX_SIDE_SP (1) | ||
76 | |||
77 | #define MUX_SIDE_SHIFT (26) | ||
78 | #define MUX_SIDE_MASK (0x1 << MUX_SIDE_SHIFT) | ||
79 | |||
80 | #define MUX_GPIO_PORT_SHIFT (23) | ||
81 | #define MUX_GPIO_PORT_MASK (0x7 << MUX_GPIO_PORT_SHIFT) | ||
82 | |||
83 | #define MUX_GPIO_PIN_SHIFT (20) | ||
84 | #define MUX_GPIO_PIN_MASK (0x1f << MUX_GPIO_PIN_SHIFT) | ||
85 | |||
86 | #define MUX_REG_SHIFT (15) | ||
87 | #define MUX_REG_MASK (0x1f << MUX_REG_SHIFT) | ||
88 | |||
89 | #define MUX_FIELD_SHIFT (13) | ||
90 | #define MUX_FIELD_MASK (0x3 << MUX_FIELD_SHIFT) | ||
91 | |||
92 | #define MUX_PADGRP_SHIFT (8) | ||
93 | #define MUX_PADGRP_MASK (0x1f << MUX_PADGRP_SHIFT) | ||
94 | |||
95 | #define MUX_PIN_MASK (0xffffff << 8) | ||
96 | |||
97 | #define GPIO_PORT_MAX (3) | ||
98 | |||
99 | #define IOMUX_PIN(side, gport, gpin, ctlreg, ctlfield, padgrp) \ | ||
100 | (((side) << MUX_SIDE_SHIFT) | \ | ||
101 | (gport << MUX_GPIO_PORT_SHIFT) | \ | ||
102 | ((gpin) << MUX_GPIO_PIN_SHIFT) | \ | ||
103 | ((ctlreg) << MUX_REG_SHIFT) | \ | ||
104 | ((ctlfield) << MUX_FIELD_SHIFT) | \ | ||
105 | ((padgrp) << MUX_PADGRP_SHIFT)) | ||
106 | |||
107 | #define MUX_MODE_OUT_SHIFT (4) | ||
108 | #define MUX_MODE_IN_SHIFT (0) | ||
109 | #define MUX_MODE_SHIFT (0) | ||
110 | #define MUX_MODE_MASK (0xff << MUX_MODE_SHIFT) | ||
111 | |||
112 | #define IOMUX_MODE(pin, mode) \ | ||
113 | (pin | (mode << MUX_MODE_SHIFT)) | ||
114 | |||
115 | enum iomux_pins { | ||
116 | /* AP Side pins */ | ||
117 | MXC91231_PIN_AP_CLE = IOMUX_PIN(0, 0, 0, 0, 0, 24), | ||
118 | MXC91231_PIN_AP_ALE = IOMUX_PIN(0, 0, 1, 0, 1, 24), | ||
119 | MXC91231_PIN_AP_CE_B = IOMUX_PIN(0, 0, 2, 0, 2, 24), | ||
120 | MXC91231_PIN_AP_RE_B = IOMUX_PIN(0, 0, 3, 0, 3, 24), | ||
121 | MXC91231_PIN_AP_WE_B = IOMUX_PIN(0, 0, 4, 1, 0, 24), | ||
122 | MXC91231_PIN_AP_WP_B = IOMUX_PIN(0, 0, 5, 1, 1, 24), | ||
123 | MXC91231_PIN_AP_BSY_B = IOMUX_PIN(0, 0, 6, 1, 2, 24), | ||
124 | MXC91231_PIN_AP_U1_TXD = IOMUX_PIN(0, 0, 7, 1, 3, 28), | ||
125 | MXC91231_PIN_AP_U1_RXD = IOMUX_PIN(0, 0, 8, 2, 0, 28), | ||
126 | MXC91231_PIN_AP_U1_RTS_B = IOMUX_PIN(0, 0, 9, 2, 1, 28), | ||
127 | MXC91231_PIN_AP_U1_CTS_B = IOMUX_PIN(0, 0, 10, 2, 2, 28), | ||
128 | MXC91231_PIN_AP_AD1_TXD = IOMUX_PIN(0, 0, 11, 2, 3, 9), | ||
129 | MXC91231_PIN_AP_AD1_RXD = IOMUX_PIN(0, 0, 12, 3, 0, 9), | ||
130 | MXC91231_PIN_AP_AD1_TXC = IOMUX_PIN(0, 0, 13, 3, 1, 9), | ||
131 | MXC91231_PIN_AP_AD1_TXFS = IOMUX_PIN(0, 0, 14, 3, 2, 9), | ||
132 | MXC91231_PIN_AP_AD2_TXD = IOMUX_PIN(0, 0, 15, 3, 3, 9), | ||
133 | MXC91231_PIN_AP_AD2_RXD = IOMUX_PIN(0, 0, 16, 4, 0, 9), | ||
134 | MXC91231_PIN_AP_AD2_TXC = IOMUX_PIN(0, 0, 17, 4, 1, 9), | ||
135 | MXC91231_PIN_AP_AD2_TXFS = IOMUX_PIN(0, 0, 18, 4, 2, 9), | ||
136 | MXC91231_PIN_AP_OWDAT = IOMUX_PIN(0, 0, 19, 4, 3, 28), | ||
137 | MXC91231_PIN_AP_IPU_LD17 = IOMUX_PIN(0, 0, 20, 5, 0, 28), | ||
138 | MXC91231_PIN_AP_IPU_D3_VSYNC = IOMUX_PIN(0, 0, 21, 5, 1, 28), | ||
139 | MXC91231_PIN_AP_IPU_D3_HSYNC = IOMUX_PIN(0, 0, 22, 5, 2, 28), | ||
140 | MXC91231_PIN_AP_IPU_D3_CLK = IOMUX_PIN(0, 0, 23, 5, 3, 28), | ||
141 | MXC91231_PIN_AP_IPU_D3_DRDY = IOMUX_PIN(0, 0, 24, 6, 0, 28), | ||
142 | MXC91231_PIN_AP_IPU_D3_CONTR = IOMUX_PIN(0, 0, 25, 6, 1, 28), | ||
143 | MXC91231_PIN_AP_IPU_D0_CS = IOMUX_PIN(0, 0, 26, 6, 2, 28), | ||
144 | MXC91231_PIN_AP_IPU_LD16 = IOMUX_PIN(0, 0, 27, 6, 3, 28), | ||
145 | MXC91231_PIN_AP_IPU_D2_CS = IOMUX_PIN(0, 0, 28, 7, 0, 28), | ||
146 | MXC91231_PIN_AP_IPU_PAR_RS = IOMUX_PIN(0, 0, 29, 7, 1, 28), | ||
147 | MXC91231_PIN_AP_IPU_D3_PS = IOMUX_PIN(0, 0, 30, 7, 2, 28), | ||
148 | MXC91231_PIN_AP_IPU_D3_CLS = IOMUX_PIN(0, 0, 31, 7, 3, 28), | ||
149 | MXC91231_PIN_AP_IPU_RD = IOMUX_PIN(0, 1, 0, 8, 0, 28), | ||
150 | MXC91231_PIN_AP_IPU_WR = IOMUX_PIN(0, 1, 1, 8, 1, 28), | ||
151 | MXC91231_PIN_AP_IPU_LD0 = IOMUX_PIN(0, 7, 0, 8, 2, 28), | ||
152 | MXC91231_PIN_AP_IPU_LD1 = IOMUX_PIN(0, 7, 0, 8, 3, 28), | ||
153 | MXC91231_PIN_AP_IPU_LD2 = IOMUX_PIN(0, 7, 0, 9, 0, 28), | ||
154 | MXC91231_PIN_AP_IPU_LD3 = IOMUX_PIN(0, 1, 2, 9, 1, 28), | ||
155 | MXC91231_PIN_AP_IPU_LD4 = IOMUX_PIN(0, 1, 3, 9, 2, 28), | ||
156 | MXC91231_PIN_AP_IPU_LD5 = IOMUX_PIN(0, 1, 4, 9, 3, 28), | ||
157 | MXC91231_PIN_AP_IPU_LD6 = IOMUX_PIN(0, 1, 5, 10, 0, 28), | ||
158 | MXC91231_PIN_AP_IPU_LD7 = IOMUX_PIN(0, 1, 6, 10, 1, 28), | ||
159 | MXC91231_PIN_AP_IPU_LD8 = IOMUX_PIN(0, 1, 7, 10, 2, 28), | ||
160 | MXC91231_PIN_AP_IPU_LD9 = IOMUX_PIN(0, 1, 8, 10, 3, 28), | ||
161 | MXC91231_PIN_AP_IPU_LD10 = IOMUX_PIN(0, 1, 9, 11, 0, 28), | ||
162 | MXC91231_PIN_AP_IPU_LD11 = IOMUX_PIN(0, 1, 10, 11, 1, 28), | ||
163 | MXC91231_PIN_AP_IPU_LD12 = IOMUX_PIN(0, 1, 11, 11, 2, 28), | ||
164 | MXC91231_PIN_AP_IPU_LD13 = IOMUX_PIN(0, 1, 12, 11, 3, 28), | ||
165 | MXC91231_PIN_AP_IPU_LD14 = IOMUX_PIN(0, 1, 13, 12, 0, 28), | ||
166 | MXC91231_PIN_AP_IPU_LD15 = IOMUX_PIN(0, 1, 14, 12, 1, 28), | ||
167 | MXC91231_PIN_AP_KPROW4 = IOMUX_PIN(0, 7, 0, 12, 2, 10), | ||
168 | MXC91231_PIN_AP_KPROW5 = IOMUX_PIN(0, 1, 16, 12, 3, 10), | ||
169 | MXC91231_PIN_AP_GPIO_AP_B17 = IOMUX_PIN(0, 1, 17, 13, 0, 10), | ||
170 | MXC91231_PIN_AP_GPIO_AP_B18 = IOMUX_PIN(0, 1, 18, 13, 1, 10), | ||
171 | MXC91231_PIN_AP_KPCOL3 = IOMUX_PIN(0, 1, 19, 13, 2, 11), | ||
172 | MXC91231_PIN_AP_KPCOL4 = IOMUX_PIN(0, 1, 20, 13, 3, 11), | ||
173 | MXC91231_PIN_AP_KPCOL5 = IOMUX_PIN(0, 1, 21, 14, 0, 11), | ||
174 | MXC91231_PIN_AP_GPIO_AP_B22 = IOMUX_PIN(0, 1, 22, 14, 1, 11), | ||
175 | MXC91231_PIN_AP_GPIO_AP_B23 = IOMUX_PIN(0, 1, 23, 14, 2, 11), | ||
176 | MXC91231_PIN_AP_CSI_D0 = IOMUX_PIN(0, 1, 24, 14, 3, 21), | ||
177 | MXC91231_PIN_AP_CSI_D1 = IOMUX_PIN(0, 1, 25, 15, 0, 21), | ||
178 | MXC91231_PIN_AP_CSI_D2 = IOMUX_PIN(0, 1, 26, 15, 1, 21), | ||
179 | MXC91231_PIN_AP_CSI_D3 = IOMUX_PIN(0, 1, 27, 15, 2, 21), | ||
180 | MXC91231_PIN_AP_CSI_D4 = IOMUX_PIN(0, 1, 28, 15, 3, 21), | ||
181 | MXC91231_PIN_AP_CSI_D5 = IOMUX_PIN(0, 1, 29, 16, 0, 21), | ||
182 | MXC91231_PIN_AP_CSI_D6 = IOMUX_PIN(0, 1, 30, 16, 1, 21), | ||
183 | MXC91231_PIN_AP_CSI_D7 = IOMUX_PIN(0, 1, 31, 16, 2, 21), | ||
184 | MXC91231_PIN_AP_CSI_D8 = IOMUX_PIN(0, 2, 0, 16, 3, 21), | ||
185 | MXC91231_PIN_AP_CSI_D9 = IOMUX_PIN(0, 2, 1, 17, 0, 21), | ||
186 | MXC91231_PIN_AP_CSI_MCLK = IOMUX_PIN(0, 2, 2, 17, 1, 21), | ||
187 | MXC91231_PIN_AP_CSI_VSYNC = IOMUX_PIN(0, 2, 3, 17, 2, 21), | ||
188 | MXC91231_PIN_AP_CSI_HSYNC = IOMUX_PIN(0, 2, 4, 17, 3, 21), | ||
189 | MXC91231_PIN_AP_CSI_PIXCLK = IOMUX_PIN(0, 2, 5, 18, 0, 21), | ||
190 | MXC91231_PIN_AP_I2CLK = IOMUX_PIN(0, 2, 6, 18, 1, 12), | ||
191 | MXC91231_PIN_AP_I2DAT = IOMUX_PIN(0, 2, 7, 18, 2, 12), | ||
192 | MXC91231_PIN_AP_GPIO_AP_C8 = IOMUX_PIN(0, 2, 8, 18, 3, 9), | ||
193 | MXC91231_PIN_AP_GPIO_AP_C9 = IOMUX_PIN(0, 2, 9, 19, 0, 9), | ||
194 | MXC91231_PIN_AP_GPIO_AP_C10 = IOMUX_PIN(0, 2, 10, 19, 1, 9), | ||
195 | MXC91231_PIN_AP_GPIO_AP_C11 = IOMUX_PIN(0, 2, 11, 19, 2, 9), | ||
196 | MXC91231_PIN_AP_GPIO_AP_C12 = IOMUX_PIN(0, 2, 12, 19, 3, 9), | ||
197 | MXC91231_PIN_AP_GPIO_AP_C13 = IOMUX_PIN(0, 2, 13, 20, 0, 28), | ||
198 | MXC91231_PIN_AP_GPIO_AP_C14 = IOMUX_PIN(0, 2, 14, 20, 1, 28), | ||
199 | MXC91231_PIN_AP_GPIO_AP_C15 = IOMUX_PIN(0, 2, 15, 20, 2, 9), | ||
200 | MXC91231_PIN_AP_GPIO_AP_C16 = IOMUX_PIN(0, 2, 16, 20, 3, 9), | ||
201 | MXC91231_PIN_AP_GPIO_AP_C17 = IOMUX_PIN(0, 2, 17, 21, 0, 9), | ||
202 | MXC91231_PIN_AP_ED_INT0 = IOMUX_PIN(0, 2, 18, 21, 1, 22), | ||
203 | MXC91231_PIN_AP_ED_INT1 = IOMUX_PIN(0, 2, 19, 21, 2, 22), | ||
204 | MXC91231_PIN_AP_ED_INT2 = IOMUX_PIN(0, 2, 20, 21, 3, 22), | ||
205 | MXC91231_PIN_AP_ED_INT3 = IOMUX_PIN(0, 2, 21, 22, 0, 22), | ||
206 | MXC91231_PIN_AP_ED_INT4 = IOMUX_PIN(0, 2, 22, 22, 1, 23), | ||
207 | MXC91231_PIN_AP_ED_INT5 = IOMUX_PIN(0, 2, 23, 22, 2, 23), | ||
208 | MXC91231_PIN_AP_ED_INT6 = IOMUX_PIN(0, 2, 24, 22, 3, 23), | ||
209 | MXC91231_PIN_AP_ED_INT7 = IOMUX_PIN(0, 2, 25, 23, 0, 23), | ||
210 | MXC91231_PIN_AP_U2_DSR_B = IOMUX_PIN(0, 2, 26, 23, 1, 28), | ||
211 | MXC91231_PIN_AP_U2_RI_B = IOMUX_PIN(0, 2, 27, 23, 2, 28), | ||
212 | MXC91231_PIN_AP_U2_CTS_B = IOMUX_PIN(0, 2, 28, 23, 3, 28), | ||
213 | MXC91231_PIN_AP_U2_DTR_B = IOMUX_PIN(0, 2, 29, 24, 0, 28), | ||
214 | MXC91231_PIN_AP_KPROW0 = IOMUX_PIN(0, 7, 0, 24, 1, 10), | ||
215 | MXC91231_PIN_AP_KPROW1 = IOMUX_PIN(0, 1, 15, 24, 2, 10), | ||
216 | MXC91231_PIN_AP_KPROW2 = IOMUX_PIN(0, 7, 0, 24, 3, 10), | ||
217 | MXC91231_PIN_AP_KPROW3 = IOMUX_PIN(0, 7, 0, 25, 0, 10), | ||
218 | MXC91231_PIN_AP_KPCOL0 = IOMUX_PIN(0, 7, 0, 25, 1, 11), | ||
219 | MXC91231_PIN_AP_KPCOL1 = IOMUX_PIN(0, 7, 0, 25, 2, 11), | ||
220 | MXC91231_PIN_AP_KPCOL2 = IOMUX_PIN(0, 7, 0, 25, 3, 11), | ||
221 | |||
222 | /* Shared pins */ | ||
223 | MXC91231_PIN_SP_U3_TXD = IOMUX_PIN(1, 3, 0, 0, 0, 28), | ||
224 | MXC91231_PIN_SP_U3_RXD = IOMUX_PIN(1, 3, 1, 0, 1, 28), | ||
225 | MXC91231_PIN_SP_U3_RTS_B = IOMUX_PIN(1, 3, 2, 0, 2, 28), | ||
226 | MXC91231_PIN_SP_U3_CTS_B = IOMUX_PIN(1, 3, 3, 0, 3, 28), | ||
227 | MXC91231_PIN_SP_USB_TXOE_B = IOMUX_PIN(1, 3, 4, 1, 0, 28), | ||
228 | MXC91231_PIN_SP_USB_DAT_VP = IOMUX_PIN(1, 3, 5, 1, 1, 28), | ||
229 | MXC91231_PIN_SP_USB_SE0_VM = IOMUX_PIN(1, 3, 6, 1, 2, 28), | ||
230 | MXC91231_PIN_SP_USB_RXD = IOMUX_PIN(1, 3, 7, 1, 3, 28), | ||
231 | MXC91231_PIN_SP_UH2_TXOE_B = IOMUX_PIN(1, 3, 8, 2, 0, 28), | ||
232 | MXC91231_PIN_SP_UH2_SPEED = IOMUX_PIN(1, 3, 9, 2, 1, 28), | ||
233 | MXC91231_PIN_SP_UH2_SUSPEN = IOMUX_PIN(1, 3, 10, 2, 2, 28), | ||
234 | MXC91231_PIN_SP_UH2_TXDP = IOMUX_PIN(1, 3, 11, 2, 3, 28), | ||
235 | MXC91231_PIN_SP_UH2_RXDP = IOMUX_PIN(1, 3, 12, 3, 0, 28), | ||
236 | MXC91231_PIN_SP_UH2_RXDM = IOMUX_PIN(1, 3, 13, 3, 1, 28), | ||
237 | MXC91231_PIN_SP_UH2_OVR = IOMUX_PIN(1, 3, 14, 3, 2, 28), | ||
238 | MXC91231_PIN_SP_UH2_PWR = IOMUX_PIN(1, 3, 15, 3, 3, 28), | ||
239 | MXC91231_PIN_SP_SD1_DAT0 = IOMUX_PIN(1, 3, 16, 4, 0, 25), | ||
240 | MXC91231_PIN_SP_SD1_DAT1 = IOMUX_PIN(1, 3, 17, 4, 1, 25), | ||
241 | MXC91231_PIN_SP_SD1_DAT2 = IOMUX_PIN(1, 3, 18, 4, 2, 25), | ||
242 | MXC91231_PIN_SP_SD1_DAT3 = IOMUX_PIN(1, 3, 19, 4, 3, 25), | ||
243 | MXC91231_PIN_SP_SD1_CMD = IOMUX_PIN(1, 3, 20, 5, 0, 25), | ||
244 | MXC91231_PIN_SP_SD1_CLK = IOMUX_PIN(1, 3, 21, 5, 1, 25), | ||
245 | MXC91231_PIN_SP_SD2_DAT0 = IOMUX_PIN(1, 3, 22, 5, 2, 26), | ||
246 | MXC91231_PIN_SP_SD2_DAT1 = IOMUX_PIN(1, 3, 23, 5, 3, 26), | ||
247 | MXC91231_PIN_SP_SD2_DAT2 = IOMUX_PIN(1, 3, 24, 6, 0, 26), | ||
248 | MXC91231_PIN_SP_SD2_DAT3 = IOMUX_PIN(1, 3, 25, 6, 1, 26), | ||
249 | MXC91231_PIN_SP_GPIO_SP_A26 = IOMUX_PIN(1, 3, 26, 6, 2, 28), | ||
250 | MXC91231_PIN_SP_SPI1_CLK = IOMUX_PIN(1, 3, 27, 6, 3, 13), | ||
251 | MXC91231_PIN_SP_SPI1_MOSI = IOMUX_PIN(1, 3, 28, 7, 0, 13), | ||
252 | MXC91231_PIN_SP_SPI1_MISO = IOMUX_PIN(1, 3, 29, 7, 1, 13), | ||
253 | MXC91231_PIN_SP_SPI1_SS0 = IOMUX_PIN(1, 3, 30, 7, 2, 13), | ||
254 | MXC91231_PIN_SP_SPI1_SS1 = IOMUX_PIN(1, 3, 31, 7, 3, 13), | ||
255 | MXC91231_PIN_SP_SD2_CMD = IOMUX_PIN(1, 7, 0, 8, 0, 26), | ||
256 | MXC91231_PIN_SP_SD2_CLK = IOMUX_PIN(1, 7, 0, 8, 1, 26), | ||
257 | MXC91231_PIN_SP_SIM1_RST_B = IOMUX_PIN(1, 2, 30, 8, 2, 28), | ||
258 | MXC91231_PIN_SP_SIM1_SVEN = IOMUX_PIN(1, 7, 0, 8, 3, 28), | ||
259 | MXC91231_PIN_SP_SIM1_CLK = IOMUX_PIN(1, 7, 0, 9, 0, 28), | ||
260 | MXC91231_PIN_SP_SIM1_TRXD = IOMUX_PIN(1, 7, 0, 9, 1, 28), | ||
261 | MXC91231_PIN_SP_SIM1_PD = IOMUX_PIN(1, 2, 31, 9, 2, 28), | ||
262 | MXC91231_PIN_SP_UH2_TXDM = IOMUX_PIN(1, 7, 0, 9, 3, 28), | ||
263 | MXC91231_PIN_SP_UH2_RXD = IOMUX_PIN(1, 7, 0, 10, 0, 28), | ||
264 | }; | ||
265 | |||
266 | #define PIN_AP_MAX (104) | ||
267 | #define PIN_SP_MAX (41) | ||
268 | |||
269 | #define PIN_MAX (PIN_AP_MAX + PIN_SP_MAX) | ||
270 | |||
271 | /* | ||
272 | * Convenience values for use with mxc_iomux_mode() | ||
273 | * | ||
274 | * Format here is MXC91231_PIN_(pin name)__(function) | ||
275 | */ | ||
276 | |||
277 | #define MXC91231_PIN_SP_USB_DAT_VP__USB_DAT_VP \ | ||
278 | IOMUX_MODE(MXC91231_PIN_SP_USB_DAT_VP, IOMUX_CONFIG_FUNC) | ||
279 | #define MXC91231_PIN_SP_USB_SE0_VM__USB_SE0_VM \ | ||
280 | IOMUX_MODE(MXC91231_PIN_SP_USB_SE0_VM, IOMUX_CONFIG_FUNC) | ||
281 | #define MXC91231_PIN_SP_USB_DAT_VP__RXD2 \ | ||
282 | IOMUX_MODE(MXC91231_PIN_SP_USB_DAT_VP, IOMUX_CONFIG_ALT1) | ||
283 | #define MXC91231_PIN_SP_USB_SE0_VM__TXD2 \ | ||
284 | IOMUX_MODE(MXC91231_PIN_SP_USB_SE0_VM, IOMUX_CONFIG_ALT1) | ||
285 | |||
286 | |||
287 | #endif /* __MACH_IOMUX_MXC91231_H__ */ | ||
diff --git a/arch/arm/plat-mxc/include/mach/iomux-v3.h b/arch/arm/plat-mxc/include/mach/iomux-v3.h index 7cd84547658f..a0fa40265468 100644 --- a/arch/arm/plat-mxc/include/mach/iomux-v3.h +++ b/arch/arm/plat-mxc/include/mach/iomux-v3.h | |||
@@ -68,28 +68,24 @@ struct pad_desc { | |||
68 | /* | 68 | /* |
69 | * Use to set PAD control | 69 | * Use to set PAD control |
70 | */ | 70 | */ |
71 | #define PAD_CTL_DRIVE_VOLTAGE_3_3_V 0 | ||
72 | #define PAD_CTL_DRIVE_VOLTAGE_1_8_V 1 | ||
73 | 71 | ||
74 | #define PAD_CTL_NO_HYSTERESIS 0 | 72 | #define PAD_CTL_DVS (1 << 13) |
75 | #define PAD_CTL_HYSTERESIS 1 | 73 | #define PAD_CTL_HYS (1 << 8) |
76 | 74 | ||
77 | #define PAD_CTL_PULL_DISABLED 0x0 | 75 | #define PAD_CTL_PKE (1 << 7) |
78 | #define PAD_CTL_PULL_KEEPER 0xa | 76 | #define PAD_CTL_PUE (1 << 6) |
79 | #define PAD_CTL_PULL_DOWN_100K 0xc | 77 | #define PAD_CTL_PUS_100K_DOWN (0 << 4) |
80 | #define PAD_CTL_PULL_UP_47K 0xd | 78 | #define PAD_CTL_PUS_47K_UP (1 << 4) |
81 | #define PAD_CTL_PULL_UP_100K 0xe | 79 | #define PAD_CTL_PUS_100K_UP (2 << 4) |
82 | #define PAD_CTL_PULL_UP_22K 0xf | 80 | #define PAD_CTL_PUS_22K_UP (3 << 4) |
83 | 81 | ||
84 | #define PAD_CTL_OUTPUT_CMOS 0 | 82 | #define PAD_CTL_ODE (1 << 3) |
85 | #define PAD_CTL_OUTPUT_OPEN_DRAIN 1 | ||
86 | 83 | ||
87 | #define PAD_CTL_DRIVE_STRENGTH_NORM 0 | 84 | #define PAD_CTL_DSE_STANDARD (0 << 1) |
88 | #define PAD_CTL_DRIVE_STRENGTH_HIGH 1 | 85 | #define PAD_CTL_DSE_HIGH (1 << 1) |
89 | #define PAD_CTL_DRIVE_STRENGTH_MAX 2 | 86 | #define PAD_CTL_DSE_MAX (2 << 1) |
90 | 87 | ||
91 | #define PAD_CTL_SLEW_RATE_SLOW 0 | 88 | #define PAD_CTL_SRE_FAST (1 << 0) |
92 | #define PAD_CTL_SLEW_RATE_FAST 1 | ||
93 | 89 | ||
94 | /* | 90 | /* |
95 | * setups a single pad: | 91 | * setups a single pad: |
@@ -117,5 +113,10 @@ void mxc_iomux_v3_release_pad(struct pad_desc *pad); | |||
117 | */ | 113 | */ |
118 | void mxc_iomux_v3_release_multiple_pads(struct pad_desc *pad_list, int count); | 114 | void mxc_iomux_v3_release_multiple_pads(struct pad_desc *pad_list, int count); |
119 | 115 | ||
116 | /* | ||
117 | * Initialise the iomux controller | ||
118 | */ | ||
119 | void mxc_iomux_v3_init(void __iomem *iomux_v3_base); | ||
120 | |||
120 | #endif /* __MACH_IOMUX_V3_H__*/ | 121 | #endif /* __MACH_IOMUX_V3_H__*/ |
121 | 122 | ||
diff --git a/arch/arm/plat-mxc/include/mach/iomux.h b/arch/arm/plat-mxc/include/mach/iomux.h index 171f8adc1109..6d49f8ae3259 100644 --- a/arch/arm/plat-mxc/include/mach/iomux.h +++ b/arch/arm/plat-mxc/include/mach/iomux.h | |||
@@ -49,6 +49,9 @@ | |||
49 | #ifdef CONFIG_ARCH_MX2 | 49 | #ifdef CONFIG_ARCH_MX2 |
50 | # define GPIO_PORT_MAX 5 | 50 | # define GPIO_PORT_MAX 5 |
51 | #endif | 51 | #endif |
52 | #ifdef CONFIG_ARCH_MX25 | ||
53 | # define GPIO_PORT_MAX 3 | ||
54 | #endif | ||
52 | 55 | ||
53 | #ifndef GPIO_PORT_MAX | 56 | #ifndef GPIO_PORT_MAX |
54 | # error "GPIO config port count unknown!" | 57 | # error "GPIO config port count unknown!" |
@@ -107,6 +110,9 @@ | |||
107 | #include <mach/iomux-mx27.h> | 110 | #include <mach/iomux-mx27.h> |
108 | #endif | 111 | #endif |
109 | #endif | 112 | #endif |
113 | #ifdef CONFIG_ARCH_MX25 | ||
114 | #include <mach/iomux-mx25.h> | ||
115 | #endif | ||
110 | 116 | ||
111 | 117 | ||
112 | /* decode irq number to use with IMR(x), ISR(x) and friends */ | 118 | /* decode irq number to use with IMR(x), ISR(x) and friends */ |
diff --git a/arch/arm/plat-mxc/include/mach/irqs.h b/arch/arm/plat-mxc/include/mach/irqs.h index 518a36504b88..ead9d592168d 100644 --- a/arch/arm/plat-mxc/include/mach/irqs.h +++ b/arch/arm/plat-mxc/include/mach/irqs.h | |||
@@ -24,6 +24,10 @@ | |||
24 | #define MXC_GPIO_IRQS (32 * 6) | 24 | #define MXC_GPIO_IRQS (32 * 6) |
25 | #elif defined CONFIG_ARCH_MX3 | 25 | #elif defined CONFIG_ARCH_MX3 |
26 | #define MXC_GPIO_IRQS (32 * 3) | 26 | #define MXC_GPIO_IRQS (32 * 3) |
27 | #elif defined CONFIG_ARCH_MX25 | ||
28 | #define MXC_GPIO_IRQS (32 * 4) | ||
29 | #elif defined CONFIG_ARCH_MXC91231 | ||
30 | #define MXC_GPIO_IRQS (32 * 4) | ||
27 | #endif | 31 | #endif |
28 | 32 | ||
29 | /* | 33 | /* |
diff --git a/arch/arm/plat-mxc/include/mach/memory.h b/arch/arm/plat-mxc/include/mach/memory.h index 6065e00176ed..d3afafdcc0e5 100644 --- a/arch/arm/plat-mxc/include/mach/memory.h +++ b/arch/arm/plat-mxc/include/mach/memory.h | |||
@@ -22,6 +22,10 @@ | |||
22 | #endif | 22 | #endif |
23 | #elif defined CONFIG_ARCH_MX3 | 23 | #elif defined CONFIG_ARCH_MX3 |
24 | #define PHYS_OFFSET UL(0x80000000) | 24 | #define PHYS_OFFSET UL(0x80000000) |
25 | #elif defined CONFIG_ARCH_MX25 | ||
26 | #define PHYS_OFFSET UL(0x80000000) | ||
27 | #elif defined CONFIG_ARCH_MXC91231 | ||
28 | #define PHYS_OFFSET UL(0x90000000) | ||
25 | #endif | 29 | #endif |
26 | 30 | ||
27 | #if defined(CONFIG_MX1_VIDEO) | 31 | #if defined(CONFIG_MX1_VIDEO) |
diff --git a/arch/arm/plat-mxc/include/mach/mx1.h b/arch/arm/plat-mxc/include/mach/mx1.h index 1000bf330bcd..1b2890a5c452 100644 --- a/arch/arm/plat-mxc/include/mach/mx1.h +++ b/arch/arm/plat-mxc/include/mach/mx1.h | |||
@@ -12,10 +12,6 @@ | |||
12 | #ifndef __ASM_ARCH_MXC_MX1_H__ | 12 | #ifndef __ASM_ARCH_MXC_MX1_H__ |
13 | #define __ASM_ARCH_MXC_MX1_H__ | 13 | #define __ASM_ARCH_MXC_MX1_H__ |
14 | 14 | ||
15 | #ifndef __ASM_ARCH_MXC_HARDWARE_H__ | ||
16 | #error "Do not include directly." | ||
17 | #endif | ||
18 | |||
19 | #include <mach/vmalloc.h> | 15 | #include <mach/vmalloc.h> |
20 | 16 | ||
21 | /* | 17 | /* |
@@ -138,20 +134,6 @@ | |||
138 | #define GPIO_INT_PORTD 62 | 134 | #define GPIO_INT_PORTD 62 |
139 | #define WDT_INT 63 | 135 | #define WDT_INT 63 |
140 | 136 | ||
141 | /* gpio and gpio based interrupt handling */ | ||
142 | #define GPIO_DR 0x1C | ||
143 | #define GPIO_GDIR 0x00 | ||
144 | #define GPIO_PSR 0x24 | ||
145 | #define GPIO_ICR1 0x28 | ||
146 | #define GPIO_ICR2 0x2C | ||
147 | #define GPIO_IMR 0x30 | ||
148 | #define GPIO_ISR 0x34 | ||
149 | #define GPIO_INT_LOW_LEV 0x3 | ||
150 | #define GPIO_INT_HIGH_LEV 0x2 | ||
151 | #define GPIO_INT_RISE_EDGE 0x0 | ||
152 | #define GPIO_INT_FALL_EDGE 0x1 | ||
153 | #define GPIO_INT_NONE 0x4 | ||
154 | |||
155 | /* DMA */ | 137 | /* DMA */ |
156 | #define DMA_REQ_UART3_T 2 | 138 | #define DMA_REQ_UART3_T 2 |
157 | #define DMA_REQ_UART3_R 3 | 139 | #define DMA_REQ_UART3_R 3 |
@@ -179,8 +161,4 @@ | |||
179 | #define DMA_REQ_UART1_T 30 | 161 | #define DMA_REQ_UART1_T 30 |
180 | #define DMA_REQ_UART1_R 31 | 162 | #define DMA_REQ_UART1_R 31 |
181 | 163 | ||
182 | /* mandatory for CONFIG_DEBUG_LL */ | ||
183 | #define MXC_LL_UART_PADDR UART1_BASE_ADDR | ||
184 | #define MXC_LL_UART_VADDR IO_ADDRESS(UART1_BASE_ADDR) | ||
185 | |||
186 | #endif /* __ASM_ARCH_MXC_MX1_H__ */ | 164 | #endif /* __ASM_ARCH_MXC_MX1_H__ */ |
diff --git a/arch/arm/plat-mxc/include/mach/mx21.h b/arch/arm/plat-mxc/include/mach/mx21.h index 8b070a041a99..21112c695ec5 100644 --- a/arch/arm/plat-mxc/include/mach/mx21.h +++ b/arch/arm/plat-mxc/include/mach/mx21.h | |||
@@ -25,11 +25,6 @@ | |||
25 | #ifndef __ASM_ARCH_MXC_MX21_H__ | 25 | #ifndef __ASM_ARCH_MXC_MX21_H__ |
26 | #define __ASM_ARCH_MXC_MX21_H__ | 26 | #define __ASM_ARCH_MXC_MX21_H__ |
27 | 27 | ||
28 | #ifndef __ASM_ARCH_MXC_HARDWARE_H__ | ||
29 | #error "Do not include directly." | ||
30 | #endif | ||
31 | |||
32 | |||
33 | /* Memory regions and CS */ | 28 | /* Memory regions and CS */ |
34 | #define SDRAM_BASE_ADDR 0xC0000000 | 29 | #define SDRAM_BASE_ADDR 0xC0000000 |
35 | #define CSD1_BASE_ADDR 0xC4000000 | 30 | #define CSD1_BASE_ADDR 0xC4000000 |
diff --git a/arch/arm/plat-mxc/include/mach/mx25.h b/arch/arm/plat-mxc/include/mach/mx25.h new file mode 100644 index 000000000000..ec64bd9a8ab1 --- /dev/null +++ b/arch/arm/plat-mxc/include/mach/mx25.h | |||
@@ -0,0 +1,44 @@ | |||
1 | #ifndef __MACH_MX25_H__ | ||
2 | #define __MACH_MX25_H__ | ||
3 | |||
4 | #define MX25_AIPS1_BASE_ADDR 0x43F00000 | ||
5 | #define MX25_AIPS1_BASE_ADDR_VIRT 0xFC000000 | ||
6 | #define MX25_AIPS1_SIZE SZ_1M | ||
7 | #define MX25_AIPS2_BASE_ADDR 0x53F00000 | ||
8 | #define MX25_AIPS2_BASE_ADDR_VIRT 0xFC200000 | ||
9 | #define MX25_AIPS2_SIZE SZ_1M | ||
10 | #define MX25_AVIC_BASE_ADDR 0x68000000 | ||
11 | #define MX25_AVIC_BASE_ADDR_VIRT 0xFC400000 | ||
12 | #define MX25_AVIC_SIZE SZ_1M | ||
13 | |||
14 | #define MX25_IOMUXC_BASE_ADDR (MX25_AIPS1_BASE_ADDR + 0xac000) | ||
15 | |||
16 | #define MX25_CRM_BASE_ADDR (MX25_AIPS2_BASE_ADDR + 0x80000) | ||
17 | #define MX25_GPT1_BASE_ADDR (MX25_AIPS2_BASE_ADDR + 0x90000) | ||
18 | #define MX25_WDOG_BASE_ADDR (MX25_AIPS2_BASE_ADDR + 0xdc000) | ||
19 | |||
20 | #define MX25_GPIO1_BASE_ADDR_VIRT (MX25_AIPS2_BASE_ADDR_VIRT + 0xcc000) | ||
21 | #define MX25_GPIO2_BASE_ADDR_VIRT (MX25_AIPS2_BASE_ADDR_VIRT + 0xd0000) | ||
22 | #define MX25_GPIO3_BASE_ADDR_VIRT (MX25_AIPS2_BASE_ADDR_VIRT + 0xa4000) | ||
23 | #define MX25_GPIO4_BASE_ADDR_VIRT (MX25_AIPS2_BASE_ADDR_VIRT + 0x9c000) | ||
24 | |||
25 | #define MX25_AIPS1_IO_ADDRESS(x) \ | ||
26 | (((x) - MX25_AIPS1_BASE_ADDR) + MX25_AIPS1_BASE_ADDR_VIRT) | ||
27 | #define MX25_AIPS2_IO_ADDRESS(x) \ | ||
28 | (((x) - MX25_AIPS2_BASE_ADDR) + MX25_AIPS2_BASE_ADDR_VIRT) | ||
29 | #define MX25_AVIC_IO_ADDRESS(x) \ | ||
30 | (((x) - MX25_AVIC_BASE_ADDR) + MX25_AVIC_BASE_ADDR_VIRT) | ||
31 | |||
32 | #define __in_range(addr, name) ((addr) >= name##_BASE_ADDR && (addr) < name##_BASE_ADDR + name##_SIZE) | ||
33 | |||
34 | #define MX25_IO_ADDRESS(x) \ | ||
35 | (void __force __iomem *) \ | ||
36 | (__in_range(x, MX25_AIPS1) ? MX25_AIPS1_IO_ADDRESS(x) : \ | ||
37 | __in_range(x, MX25_AIPS2) ? MX25_AIPS2_IO_ADDRESS(x) : \ | ||
38 | __in_range(x, MX25_AVIC) ? MX25_AVIC_IO_ADDRESS(x) : \ | ||
39 | 0xDEADBEEF) | ||
40 | |||
41 | #define UART1_BASE_ADDR 0x43f90000 | ||
42 | #define UART2_BASE_ADDR 0x43f94000 | ||
43 | |||
44 | #endif /* __MACH_MX25_H__ */ | ||
diff --git a/arch/arm/plat-mxc/include/mach/mx27.h b/arch/arm/plat-mxc/include/mach/mx27.h index 6e93f2c0b7bb..dc3ad9aa952a 100644 --- a/arch/arm/plat-mxc/include/mach/mx27.h +++ b/arch/arm/plat-mxc/include/mach/mx27.h | |||
@@ -24,10 +24,6 @@ | |||
24 | #ifndef __ASM_ARCH_MXC_MX27_H__ | 24 | #ifndef __ASM_ARCH_MXC_MX27_H__ |
25 | #define __ASM_ARCH_MXC_MX27_H__ | 25 | #define __ASM_ARCH_MXC_MX27_H__ |
26 | 26 | ||
27 | #ifndef __ASM_ARCH_MXC_HARDWARE_H__ | ||
28 | #error "Do not include directly." | ||
29 | #endif | ||
30 | |||
31 | /* IRAM */ | 27 | /* IRAM */ |
32 | #define IRAM_BASE_ADDR 0xFFFF4C00 /* internal ram */ | 28 | #define IRAM_BASE_ADDR 0xFFFF4C00 /* internal ram */ |
33 | 29 | ||
@@ -120,7 +116,4 @@ extern int mx27_revision(void); | |||
120 | 116 | ||
121 | /* Mandatory defines used globally */ | 117 | /* Mandatory defines used globally */ |
122 | 118 | ||
123 | /* this CPU supports up to 192 GPIOs (don't forget the baseboard!) */ | ||
124 | #define ARCH_NR_GPIOS (192 + 16) | ||
125 | |||
126 | #endif /* __ASM_ARCH_MXC_MX27_H__ */ | 119 | #endif /* __ASM_ARCH_MXC_MX27_H__ */ |
diff --git a/arch/arm/plat-mxc/include/mach/mx2x.h b/arch/arm/plat-mxc/include/mach/mx2x.h index fc40d3ab8c5b..db5d921e0fe6 100644 --- a/arch/arm/plat-mxc/include/mach/mx2x.h +++ b/arch/arm/plat-mxc/include/mach/mx2x.h | |||
@@ -23,10 +23,6 @@ | |||
23 | #ifndef __ASM_ARCH_MXC_MX2x_H__ | 23 | #ifndef __ASM_ARCH_MXC_MX2x_H__ |
24 | #define __ASM_ARCH_MXC_MX2x_H__ | 24 | #define __ASM_ARCH_MXC_MX2x_H__ |
25 | 25 | ||
26 | #ifndef __ASM_ARCH_MXC_HARDWARE_H__ | ||
27 | #error "Do not include directly." | ||
28 | #endif | ||
29 | |||
30 | /* The following addresses are common between i.MX21 and i.MX27 */ | 26 | /* The following addresses are common between i.MX21 and i.MX27 */ |
31 | 27 | ||
32 | /* Register offests */ | 28 | /* Register offests */ |
@@ -154,20 +150,6 @@ | |||
154 | #define MXC_INT_GPIO 8 | 150 | #define MXC_INT_GPIO 8 |
155 | #define MXC_INT_CSPI3 6 | 151 | #define MXC_INT_CSPI3 6 |
156 | 152 | ||
157 | /* gpio and gpio based interrupt handling */ | ||
158 | #define GPIO_DR 0x1C | ||
159 | #define GPIO_GDIR 0x00 | ||
160 | #define GPIO_PSR 0x24 | ||
161 | #define GPIO_ICR1 0x28 | ||
162 | #define GPIO_ICR2 0x2C | ||
163 | #define GPIO_IMR 0x30 | ||
164 | #define GPIO_ISR 0x34 | ||
165 | #define GPIO_INT_LOW_LEV 0x3 | ||
166 | #define GPIO_INT_HIGH_LEV 0x2 | ||
167 | #define GPIO_INT_RISE_EDGE 0x0 | ||
168 | #define GPIO_INT_FALL_EDGE 0x1 | ||
169 | #define GPIO_INT_NONE 0x4 | ||
170 | |||
171 | /* fixed DMA request numbers */ | 153 | /* fixed DMA request numbers */ |
172 | #define DMA_REQ_CSI_RX 31 | 154 | #define DMA_REQ_CSI_RX 31 |
173 | #define DMA_REQ_CSI_STAT 30 | 155 | #define DMA_REQ_CSI_STAT 30 |
diff --git a/arch/arm/plat-mxc/include/mach/mx31.h b/arch/arm/plat-mxc/include/mach/mx31.h index 0b06941b6139..14ac0dcc82f4 100644 --- a/arch/arm/plat-mxc/include/mach/mx31.h +++ b/arch/arm/plat-mxc/include/mach/mx31.h | |||
@@ -4,7 +4,7 @@ | |||
4 | #define MX31_IRAM_BASE_ADDR 0x1FFC0000 /* internal ram */ | 4 | #define MX31_IRAM_BASE_ADDR 0x1FFC0000 /* internal ram */ |
5 | #define MX31_IRAM_SIZE SZ_16K | 5 | #define MX31_IRAM_SIZE SZ_16K |
6 | 6 | ||
7 | #define OTG_BASE_ADDR (AIPS1_BASE_ADDR + 0x00088000) | 7 | #define MX31_OTG_BASE_ADDR (AIPS1_BASE_ADDR + 0x00088000) |
8 | #define ATA_BASE_ADDR (AIPS1_BASE_ADDR + 0x0008C000) | 8 | #define ATA_BASE_ADDR (AIPS1_BASE_ADDR + 0x0008C000) |
9 | #define UART4_BASE_ADDR (AIPS1_BASE_ADDR + 0x000B0000) | 9 | #define UART4_BASE_ADDR (AIPS1_BASE_ADDR + 0x000B0000) |
10 | #define UART5_BASE_ADDR (AIPS1_BASE_ADDR + 0x000B4000) | 10 | #define UART5_BASE_ADDR (AIPS1_BASE_ADDR + 0x000B4000) |
diff --git a/arch/arm/plat-mxc/include/mach/mx35.h b/arch/arm/plat-mxc/include/mach/mx35.h index 6465fefb42e3..ab4cfec6c8ab 100644 --- a/arch/arm/plat-mxc/include/mach/mx35.h +++ b/arch/arm/plat-mxc/include/mach/mx35.h | |||
@@ -5,6 +5,7 @@ | |||
5 | #define MX35_IRAM_SIZE SZ_128K | 5 | #define MX35_IRAM_SIZE SZ_128K |
6 | 6 | ||
7 | #define MXC_FEC_BASE_ADDR 0x50038000 | 7 | #define MXC_FEC_BASE_ADDR 0x50038000 |
8 | #define MX35_OTG_BASE_ADDR 0x53ff4000 | ||
8 | #define MX35_NFC_BASE_ADDR 0xBB000000 | 9 | #define MX35_NFC_BASE_ADDR 0xBB000000 |
9 | 10 | ||
10 | /* | 11 | /* |
diff --git a/arch/arm/plat-mxc/include/mach/mx3x.h b/arch/arm/plat-mxc/include/mach/mx3x.h index b559a4bb5769..009f4440276b 100644 --- a/arch/arm/plat-mxc/include/mach/mx3x.h +++ b/arch/arm/plat-mxc/include/mach/mx3x.h | |||
@@ -11,10 +11,6 @@ | |||
11 | #ifndef __ASM_ARCH_MXC_MX31_H__ | 11 | #ifndef __ASM_ARCH_MXC_MX31_H__ |
12 | #define __ASM_ARCH_MXC_MX31_H__ | 12 | #define __ASM_ARCH_MXC_MX31_H__ |
13 | 13 | ||
14 | #ifndef __ASM_ARCH_MXC_HARDWARE_H__ | ||
15 | #error "Do not include directly." | ||
16 | #endif | ||
17 | |||
18 | /* | 14 | /* |
19 | * MX31 memory map: | 15 | * MX31 memory map: |
20 | * | 16 | * |
@@ -263,25 +259,8 @@ | |||
263 | #define SYSTEM_REV_MIN CHIP_REV_1_0 | 259 | #define SYSTEM_REV_MIN CHIP_REV_1_0 |
264 | #define SYSTEM_REV_NUM 3 | 260 | #define SYSTEM_REV_NUM 3 |
265 | 261 | ||
266 | /* gpio and gpio based interrupt handling */ | ||
267 | #define GPIO_DR 0x00 | ||
268 | #define GPIO_GDIR 0x04 | ||
269 | #define GPIO_PSR 0x08 | ||
270 | #define GPIO_ICR1 0x0C | ||
271 | #define GPIO_ICR2 0x10 | ||
272 | #define GPIO_IMR 0x14 | ||
273 | #define GPIO_ISR 0x18 | ||
274 | #define GPIO_INT_LOW_LEV 0x0 | ||
275 | #define GPIO_INT_HIGH_LEV 0x1 | ||
276 | #define GPIO_INT_RISE_EDGE 0x2 | ||
277 | #define GPIO_INT_FALL_EDGE 0x3 | ||
278 | #define GPIO_INT_NONE 0x4 | ||
279 | |||
280 | /* Mandatory defines used globally */ | 262 | /* Mandatory defines used globally */ |
281 | 263 | ||
282 | /* this CPU supports up to 96 GPIOs */ | ||
283 | #define ARCH_NR_GPIOS 96 | ||
284 | |||
285 | #if !defined(__ASSEMBLY__) && !defined(__MXC_BOOT_UNCOMPRESS) | 264 | #if !defined(__ASSEMBLY__) && !defined(__MXC_BOOT_UNCOMPRESS) |
286 | 265 | ||
287 | extern unsigned int system_rev; | 266 | extern unsigned int system_rev; |
diff --git a/arch/arm/plat-mxc/include/mach/mxc.h b/arch/arm/plat-mxc/include/mach/mxc.h index 5fa2a07f4eaf..51990536b845 100644 --- a/arch/arm/plat-mxc/include/mach/mxc.h +++ b/arch/arm/plat-mxc/include/mach/mxc.h | |||
@@ -26,9 +26,11 @@ | |||
26 | 26 | ||
27 | #define MXC_CPU_MX1 1 | 27 | #define MXC_CPU_MX1 1 |
28 | #define MXC_CPU_MX21 21 | 28 | #define MXC_CPU_MX21 21 |
29 | #define MXC_CPU_MX25 25 | ||
29 | #define MXC_CPU_MX27 27 | 30 | #define MXC_CPU_MX27 27 |
30 | #define MXC_CPU_MX31 31 | 31 | #define MXC_CPU_MX31 31 |
31 | #define MXC_CPU_MX35 35 | 32 | #define MXC_CPU_MX35 35 |
33 | #define MXC_CPU_MXC91231 91231 | ||
32 | 34 | ||
33 | #ifndef __ASSEMBLY__ | 35 | #ifndef __ASSEMBLY__ |
34 | extern unsigned int __mxc_cpu_type; | 36 | extern unsigned int __mxc_cpu_type; |
@@ -58,6 +60,18 @@ extern unsigned int __mxc_cpu_type; | |||
58 | # define cpu_is_mx21() (0) | 60 | # define cpu_is_mx21() (0) |
59 | #endif | 61 | #endif |
60 | 62 | ||
63 | #ifdef CONFIG_ARCH_MX25 | ||
64 | # ifdef mxc_cpu_type | ||
65 | # undef mxc_cpu_type | ||
66 | # define mxc_cpu_type __mxc_cpu_type | ||
67 | # else | ||
68 | # define mxc_cpu_type MXC_CPU_MX25 | ||
69 | # endif | ||
70 | # define cpu_is_mx25() (mxc_cpu_type == MXC_CPU_MX25) | ||
71 | #else | ||
72 | # define cpu_is_mx25() (0) | ||
73 | #endif | ||
74 | |||
61 | #ifdef CONFIG_MACH_MX27 | 75 | #ifdef CONFIG_MACH_MX27 |
62 | # ifdef mxc_cpu_type | 76 | # ifdef mxc_cpu_type |
63 | # undef mxc_cpu_type | 77 | # undef mxc_cpu_type |
@@ -94,13 +108,25 @@ extern unsigned int __mxc_cpu_type; | |||
94 | # define cpu_is_mx35() (0) | 108 | # define cpu_is_mx35() (0) |
95 | #endif | 109 | #endif |
96 | 110 | ||
111 | #ifdef CONFIG_ARCH_MXC91231 | ||
112 | # ifdef mxc_cpu_type | ||
113 | # undef mxc_cpu_type | ||
114 | # define mxc_cpu_type __mxc_cpu_type | ||
115 | # else | ||
116 | # define mxc_cpu_type MXC_CPU_MXC91231 | ||
117 | # endif | ||
118 | # define cpu_is_mxc91231() (mxc_cpu_type == MXC_CPU_MXC91231) | ||
119 | #else | ||
120 | # define cpu_is_mxc91231() (0) | ||
121 | #endif | ||
122 | |||
97 | #if defined(CONFIG_ARCH_MX3) || defined(CONFIG_ARCH_MX2) | 123 | #if defined(CONFIG_ARCH_MX3) || defined(CONFIG_ARCH_MX2) |
98 | #define CSCR_U(n) (IO_ADDRESS(WEIM_BASE_ADDR) + n * 0x10) | 124 | #define CSCR_U(n) (IO_ADDRESS(WEIM_BASE_ADDR) + n * 0x10) |
99 | #define CSCR_L(n) (IO_ADDRESS(WEIM_BASE_ADDR) + n * 0x10 + 0x4) | 125 | #define CSCR_L(n) (IO_ADDRESS(WEIM_BASE_ADDR) + n * 0x10 + 0x4) |
100 | #define CSCR_A(n) (IO_ADDRESS(WEIM_BASE_ADDR) + n * 0x10 + 0x8) | 126 | #define CSCR_A(n) (IO_ADDRESS(WEIM_BASE_ADDR) + n * 0x10 + 0x8) |
101 | #endif | 127 | #endif |
102 | 128 | ||
103 | #define cpu_is_mx3() (cpu_is_mx31() || cpu_is_mx35()) | 129 | #define cpu_is_mx3() (cpu_is_mx31() || cpu_is_mx35() || cpu_is_mxc91231()) |
104 | #define cpu_is_mx2() (cpu_is_mx21() || cpu_is_mx27()) | 130 | #define cpu_is_mx2() (cpu_is_mx21() || cpu_is_mx27()) |
105 | 131 | ||
106 | #endif /* __ASM_ARCH_MXC_H__ */ | 132 | #endif /* __ASM_ARCH_MXC_H__ */ |
diff --git a/arch/arm/plat-mxc/include/mach/mxc91231.h b/arch/arm/plat-mxc/include/mach/mxc91231.h new file mode 100644 index 000000000000..81484d1ef232 --- /dev/null +++ b/arch/arm/plat-mxc/include/mach/mxc91231.h | |||
@@ -0,0 +1,315 @@ | |||
1 | /* | ||
2 | * Copyright 2004-2006 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * - Platform specific register memory map | ||
4 | * | ||
5 | * Copyright 2005-2007 Motorola, Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | #ifndef __MACH_MXC91231_H__ | ||
22 | #define __MACH_MXC91231_H__ | ||
23 | |||
24 | /* | ||
25 | * L2CC | ||
26 | */ | ||
27 | #define MXC91231_L2CC_BASE_ADDR 0x30000000 | ||
28 | #define MXC91231_L2CC_BASE_ADDR_VIRT 0xF9000000 | ||
29 | #define MXC91231_L2CC_SIZE SZ_64K | ||
30 | |||
31 | /* | ||
32 | * AIPS 1 | ||
33 | */ | ||
34 | #define MXC91231_AIPS1_BASE_ADDR 0x43F00000 | ||
35 | #define MXC91231_AIPS1_BASE_ADDR_VIRT 0xFC000000 | ||
36 | #define MXC91231_AIPS1_SIZE SZ_1M | ||
37 | |||
38 | #define MXC91231_AIPS1_CTRL_BASE_ADDR MXC91231_AIPS1_BASE_ADDR | ||
39 | #define MXC91231_MAX_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x04000) | ||
40 | #define MXC91231_EVTMON_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x08000) | ||
41 | #define MXC91231_CLKCTL_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x0C000) | ||
42 | #define MXC91231_ETB_SLOT4_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x10000) | ||
43 | #define MXC91231_ETB_SLOT5_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x14000) | ||
44 | #define MXC91231_ECT_CTIO_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x18000) | ||
45 | #define MXC91231_I2C_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x80000) | ||
46 | #define MXC91231_MU_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x88000) | ||
47 | #define MXC91231_UART1_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x90000) | ||
48 | #define MXC91231_UART2_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x94000) | ||
49 | #define MXC91231_DSM_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x98000) | ||
50 | #define MXC91231_OWIRE_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0x9C000) | ||
51 | #define MXC91231_SSI1_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0xA0000) | ||
52 | #define MXC91231_KPP_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0xA8000) | ||
53 | #define MXC91231_IOMUX_AP_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0xAC000) | ||
54 | #define MXC91231_CTI_AP_BASE_ADDR (MXC91231_AIPS1_BASE_ADDR + 0xB8000) | ||
55 | |||
56 | /* | ||
57 | * AIPS 2 | ||
58 | */ | ||
59 | #define MXC91231_AIPS2_BASE_ADDR 0x53F00000 | ||
60 | #define MXC91231_AIPS2_BASE_ADDR_VIRT 0xFC100000 | ||
61 | #define MXC91231_AIPS2_SIZE SZ_1M | ||
62 | |||
63 | #define MXC91231_GEMK_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0x8C000) | ||
64 | #define MXC91231_GPT1_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0x90000) | ||
65 | #define MXC91231_EPIT1_AP_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0x94000) | ||
66 | #define MXC91231_SCC_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xAC000) | ||
67 | #define MXC91231_RNGA_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xB0000) | ||
68 | #define MXC91231_IPU_CTRL_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xC0000) | ||
69 | #define MXC91231_AUDMUX_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xC4000) | ||
70 | #define MXC91231_EDIO_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xC8000) | ||
71 | #define MXC91231_GPIO1_AP_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xCC000) | ||
72 | #define MXC91231_GPIO2_AP_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xD0000) | ||
73 | #define MXC91231_SDMA_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xD4000) | ||
74 | #define MXC91231_RTC_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xD8000) | ||
75 | #define MXC91231_WDOG1_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xDC000) | ||
76 | #define MXC91231_PWM_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xE0000) | ||
77 | #define MXC91231_GPIO3_AP_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xE4000) | ||
78 | #define MXC91231_WDOG2_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xE8000) | ||
79 | #define MXC91231_RTIC_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xEC000) | ||
80 | #define MXC91231_LPMC_BASE_ADDR (MXC91231_AIPS2_BASE_ADDR + 0xF0000) | ||
81 | |||
82 | /* | ||
83 | * SPBA global module 0 | ||
84 | */ | ||
85 | #define MXC91231_SPBA0_BASE_ADDR 0x50000000 | ||
86 | #define MXC91231_SPBA0_BASE_ADDR_VIRT 0xFC200000 | ||
87 | #define MXC91231_SPBA0_SIZE SZ_1M | ||
88 | |||
89 | #define MXC91231_MMC_SDHC1_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x04000) | ||
90 | #define MXC91231_MMC_SDHC2_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x08000) | ||
91 | #define MXC91231_UART3_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x0C000) | ||
92 | #define MXC91231_CSPI2_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x10000) | ||
93 | #define MXC91231_SSI2_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x14000) | ||
94 | #define MXC91231_SIM_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x18000) | ||
95 | #define MXC91231_IIM_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x1C000) | ||
96 | #define MXC91231_CTI_SDMA_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x20000) | ||
97 | #define MXC91231_USBOTG_CTRL_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x24000) | ||
98 | #define MXC91231_USBOTG_DATA_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x28000) | ||
99 | #define MXC91231_CSPI1_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x30000) | ||
100 | #define MXC91231_SPBA_CTRL_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x3C000) | ||
101 | #define MXC91231_IOMUX_COM_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x40000) | ||
102 | #define MXC91231_CRM_COM_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x44000) | ||
103 | #define MXC91231_CRM_AP_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x48000) | ||
104 | #define MXC91231_PLL0_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x4C000) | ||
105 | #define MXC91231_PLL1_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x50000) | ||
106 | #define MXC91231_PLL2_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x54000) | ||
107 | #define MXC91231_GPIO4_SH_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x58000) | ||
108 | #define MXC91231_HAC_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x5C000) | ||
109 | #define MXC91231_SAHARA_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x5C000) | ||
110 | #define MXC91231_PLL3_BASE_ADDR (MXC91231_SPBA0_BASE_ADDR + 0x60000) | ||
111 | |||
112 | /* | ||
113 | * SPBA global module 1 | ||
114 | */ | ||
115 | #define MXC91231_SPBA1_BASE_ADDR 0x52000000 | ||
116 | #define MXC91231_SPBA1_BASE_ADDR_VIRT 0xFC300000 | ||
117 | #define MXC91231_SPBA1_SIZE SZ_1M | ||
118 | |||
119 | #define MXC91231_MQSPI_BASE_ADDR (MXC91231_SPBA1_BASE_ADDR + 0x34000) | ||
120 | #define MXC91231_EL1T_BASE_ADDR (MXC91231_SPBA1_BASE_ADDR + 0x38000) | ||
121 | |||
122 | /*! | ||
123 | * Defines for SPBA modules | ||
124 | */ | ||
125 | #define MXC91231_SPBA_SDHC1 0x04 | ||
126 | #define MXC91231_SPBA_SDHC2 0x08 | ||
127 | #define MXC91231_SPBA_UART3 0x0C | ||
128 | #define MXC91231_SPBA_CSPI2 0x10 | ||
129 | #define MXC91231_SPBA_SSI2 0x14 | ||
130 | #define MXC91231_SPBA_SIM 0x18 | ||
131 | #define MXC91231_SPBA_IIM 0x1C | ||
132 | #define MXC91231_SPBA_CTI_SDMA 0x20 | ||
133 | #define MXC91231_SPBA_USBOTG_CTRL_REGS 0x24 | ||
134 | #define MXC91231_SPBA_USBOTG_DATA_REGS 0x28 | ||
135 | #define MXC91231_SPBA_CSPI1 0x30 | ||
136 | #define MXC91231_SPBA_MQSPI 0x34 | ||
137 | #define MXC91231_SPBA_EL1T 0x38 | ||
138 | #define MXC91231_SPBA_IOMUX 0x40 | ||
139 | #define MXC91231_SPBA_CRM_COM 0x44 | ||
140 | #define MXC91231_SPBA_CRM_AP 0x48 | ||
141 | #define MXC91231_SPBA_PLL0 0x4C | ||
142 | #define MXC91231_SPBA_PLL1 0x50 | ||
143 | #define MXC91231_SPBA_PLL2 0x54 | ||
144 | #define MXC91231_SPBA_GPIO4 0x58 | ||
145 | #define MXC91231_SPBA_SAHARA 0x5C | ||
146 | |||
147 | /* | ||
148 | * ROMP and AVIC | ||
149 | */ | ||
150 | #define MXC91231_ROMP_BASE_ADDR 0x60000000 | ||
151 | #define MXC91231_ROMP_BASE_ADDR_VIRT 0xFC400000 | ||
152 | #define MXC91231_ROMP_SIZE SZ_64K | ||
153 | |||
154 | #define MXC91231_AVIC_BASE_ADDR 0x68000000 | ||
155 | #define MXC91231_AVIC_BASE_ADDR_VIRT 0xFC410000 | ||
156 | #define MXC91231_AVIC_SIZE SZ_64K | ||
157 | |||
158 | /* | ||
159 | * NAND, SDRAM, WEIM, M3IF, EMI controllers | ||
160 | */ | ||
161 | #define MXC91231_X_MEMC_BASE_ADDR 0xB8000000 | ||
162 | #define MXC91231_X_MEMC_BASE_ADDR_VIRT 0xFC420000 | ||
163 | #define MXC91231_X_MEMC_SIZE SZ_64K | ||
164 | |||
165 | #define MXC91231_NFC_BASE_ADDR (MXC91231_X_MEMC_BASE_ADDR + 0x0000) | ||
166 | #define MXC91231_ESDCTL_BASE_ADDR (MXC91231_X_MEMC_BASE_ADDR + 0x1000) | ||
167 | #define MXC91231_WEIM_BASE_ADDR (MXC91231_X_MEMC_BASE_ADDR + 0x2000) | ||
168 | #define MXC91231_M3IF_BASE_ADDR (MXC91231_X_MEMC_BASE_ADDR + 0x3000) | ||
169 | #define MXC91231_EMI_CTL_BASE_ADDR (MXC91231_X_MEMC_BASE_ADDR + 0x4000) | ||
170 | |||
171 | /* | ||
172 | * Memory regions and CS | ||
173 | * CPLD is connected on CS4 | ||
174 | * CS5 is TP1021 or it is not connected | ||
175 | * */ | ||
176 | #define MXC91231_FB_RAM_BASE_ADDR 0x78000000 | ||
177 | #define MXC91231_FB_RAM_SIZE SZ_256K | ||
178 | #define MXC91231_CSD0_BASE_ADDR 0x80000000 | ||
179 | #define MXC91231_CSD1_BASE_ADDR 0x90000000 | ||
180 | #define MXC91231_CS0_BASE_ADDR 0xA0000000 | ||
181 | #define MXC91231_CS1_BASE_ADDR 0xA8000000 | ||
182 | #define MXC91231_CS2_BASE_ADDR 0xB0000000 | ||
183 | #define MXC91231_CS3_BASE_ADDR 0xB2000000 | ||
184 | #define MXC91231_CS4_BASE_ADDR 0xB4000000 | ||
185 | #define MXC91231_CS5_BASE_ADDR 0xB6000000 | ||
186 | |||
187 | /* Is given address belongs to the specified memory region? */ | ||
188 | #define ADDRESS_IN_REGION(addr, start, size) \ | ||
189 | (((addr) >= (start)) && ((addr) < (start)+(size))) | ||
190 | |||
191 | /* Is given address belongs to the specified named `module'? */ | ||
192 | #define MXC91231_IS_MODULE(addr, module) \ | ||
193 | ADDRESS_IN_REGION(addr, MXC91231_ ## module ## _BASE_ADDR, \ | ||
194 | MXC91231_ ## module ## _SIZE) | ||
195 | /* | ||
196 | * This macro defines the physical to virtual address mapping for all the | ||
197 | * peripheral modules. It is used by passing in the physical address as x | ||
198 | * and returning the virtual address. If the physical address is not mapped, | ||
199 | * it returns 0xDEADBEEF | ||
200 | */ | ||
201 | |||
202 | #define MXC91231_IO_ADDRESS(x) \ | ||
203 | (void __iomem *) \ | ||
204 | (MXC91231_IS_MODULE(x, L2CC) ? MXC91231_L2CC_IO_ADDRESS(x) : \ | ||
205 | MXC91231_IS_MODULE(x, AIPS1) ? MXC91231_AIPS1_IO_ADDRESS(x) : \ | ||
206 | MXC91231_IS_MODULE(x, AIPS2) ? MXC91231_AIPS2_IO_ADDRESS(x) : \ | ||
207 | MXC91231_IS_MODULE(x, SPBA0) ? MXC91231_SPBA0_IO_ADDRESS(x) : \ | ||
208 | MXC91231_IS_MODULE(x, SPBA1) ? MXC91231_SPBA1_IO_ADDRESS(x) : \ | ||
209 | MXC91231_IS_MODULE(x, ROMP) ? MXC91231_ROMP_IO_ADDRESS(x) : \ | ||
210 | MXC91231_IS_MODULE(x, AVIC) ? MXC91231_AVIC_IO_ADDRESS(x) : \ | ||
211 | MXC91231_IS_MODULE(x, X_MEMC) ? MXC91231_X_MEMC_IO_ADDRESS(x) : \ | ||
212 | 0xDEADBEEF) | ||
213 | |||
214 | |||
215 | /* | ||
216 | * define the address mapping macros: in physical address order | ||
217 | */ | ||
218 | #define MXC91231_L2CC_IO_ADDRESS(x) \ | ||
219 | (((x) - MXC91231_L2CC_BASE_ADDR) + MXC91231_L2CC_BASE_ADDR_VIRT) | ||
220 | |||
221 | #define MXC91231_AIPS1_IO_ADDRESS(x) \ | ||
222 | (((x) - MXC91231_AIPS1_BASE_ADDR) + MXC91231_AIPS1_BASE_ADDR_VIRT) | ||
223 | |||
224 | #define MXC91231_SPBA0_IO_ADDRESS(x) \ | ||
225 | (((x) - MXC91231_SPBA0_BASE_ADDR) + MXC91231_SPBA0_BASE_ADDR_VIRT) | ||
226 | |||
227 | #define MXC91231_SPBA1_IO_ADDRESS(x) \ | ||
228 | (((x) - MXC91231_SPBA1_BASE_ADDR) + MXC91231_SPBA1_BASE_ADDR_VIRT) | ||
229 | |||
230 | #define MXC91231_AIPS2_IO_ADDRESS(x) \ | ||
231 | (((x) - MXC91231_AIPS2_BASE_ADDR) + MXC91231_AIPS2_BASE_ADDR_VIRT) | ||
232 | |||
233 | #define MXC91231_ROMP_IO_ADDRESS(x) \ | ||
234 | (((x) - MXC91231_ROMP_BASE_ADDR) + MXC91231_ROMP_BASE_ADDR_VIRT) | ||
235 | |||
236 | #define MXC91231_AVIC_IO_ADDRESS(x) \ | ||
237 | (((x) - MXC91231_AVIC_BASE_ADDR) + MXC91231_AVIC_BASE_ADDR_VIRT) | ||
238 | |||
239 | #define MXC91231_X_MEMC_IO_ADDRESS(x) \ | ||
240 | (((x) - MXC91231_X_MEMC_BASE_ADDR) + MXC91231_X_MEMC_BASE_ADDR_VIRT) | ||
241 | |||
242 | /* | ||
243 | * Interrupt numbers | ||
244 | */ | ||
245 | #define MXC91231_INT_GPIO3 0 | ||
246 | #define MXC91231_INT_EL1T_CI 1 | ||
247 | #define MXC91231_INT_EL1T_RFCI 2 | ||
248 | #define MXC91231_INT_EL1T_RFI 3 | ||
249 | #define MXC91231_INT_EL1T_MCU 4 | ||
250 | #define MXC91231_INT_EL1T_IPI 5 | ||
251 | #define MXC91231_INT_MU_GEN 6 | ||
252 | #define MXC91231_INT_GPIO4 7 | ||
253 | #define MXC91231_INT_MMC_SDHC2 8 | ||
254 | #define MXC91231_INT_MMC_SDHC1 9 | ||
255 | #define MXC91231_INT_I2C 10 | ||
256 | #define MXC91231_INT_SSI2 11 | ||
257 | #define MXC91231_INT_SSI1 12 | ||
258 | #define MXC91231_INT_CSPI2 13 | ||
259 | #define MXC91231_INT_CSPI1 14 | ||
260 | #define MXC91231_INT_RTIC 15 | ||
261 | #define MXC91231_INT_SAHARA 15 | ||
262 | #define MXC91231_INT_HAC 15 | ||
263 | #define MXC91231_INT_UART3_RX 16 | ||
264 | #define MXC91231_INT_UART3_TX 17 | ||
265 | #define MXC91231_INT_UART3_MINT 18 | ||
266 | #define MXC91231_INT_ECT 19 | ||
267 | #define MXC91231_INT_SIM_IPB 20 | ||
268 | #define MXC91231_INT_SIM_DATA 21 | ||
269 | #define MXC91231_INT_RNGA 22 | ||
270 | #define MXC91231_INT_DSM_AP 23 | ||
271 | #define MXC91231_INT_KPP 24 | ||
272 | #define MXC91231_INT_RTC 25 | ||
273 | #define MXC91231_INT_PWM 26 | ||
274 | #define MXC91231_INT_GEMK_AP 27 | ||
275 | #define MXC91231_INT_EPIT 28 | ||
276 | #define MXC91231_INT_GPT 29 | ||
277 | #define MXC91231_INT_UART2_RX 30 | ||
278 | #define MXC91231_INT_UART2_TX 31 | ||
279 | #define MXC91231_INT_UART2_MINT 32 | ||
280 | #define MXC91231_INT_NANDFC 33 | ||
281 | #define MXC91231_INT_SDMA 34 | ||
282 | #define MXC91231_INT_USB_WAKEUP 35 | ||
283 | #define MXC91231_INT_USB_SOF 36 | ||
284 | #define MXC91231_INT_PMU_EVTMON 37 | ||
285 | #define MXC91231_INT_USB_FUNC 38 | ||
286 | #define MXC91231_INT_USB_DMA 39 | ||
287 | #define MXC91231_INT_USB_CTRL 40 | ||
288 | #define MXC91231_INT_IPU_ERR 41 | ||
289 | #define MXC91231_INT_IPU_SYN 42 | ||
290 | #define MXC91231_INT_UART1_RX 43 | ||
291 | #define MXC91231_INT_UART1_TX 44 | ||
292 | #define MXC91231_INT_UART1_MINT 45 | ||
293 | #define MXC91231_INT_IIM 46 | ||
294 | #define MXC91231_INT_MU_RX_OR 47 | ||
295 | #define MXC91231_INT_MU_TX_OR 48 | ||
296 | #define MXC91231_INT_SCC_SCM 49 | ||
297 | #define MXC91231_INT_SCC_SMN 50 | ||
298 | #define MXC91231_INT_GPIO2 51 | ||
299 | #define MXC91231_INT_GPIO1 52 | ||
300 | #define MXC91231_INT_MQSPI1 53 | ||
301 | #define MXC91231_INT_MQSPI2 54 | ||
302 | #define MXC91231_INT_WDOG2 55 | ||
303 | #define MXC91231_INT_EXT_INT7 56 | ||
304 | #define MXC91231_INT_EXT_INT6 57 | ||
305 | #define MXC91231_INT_EXT_INT5 58 | ||
306 | #define MXC91231_INT_EXT_INT4 59 | ||
307 | #define MXC91231_INT_EXT_INT3 60 | ||
308 | #define MXC91231_INT_EXT_INT2 61 | ||
309 | #define MXC91231_INT_EXT_INT1 62 | ||
310 | #define MXC91231_INT_EXT_INT0 63 | ||
311 | |||
312 | #define MXC91231_MAX_INT_LINES 63 | ||
313 | #define MXC91231_MAX_EXT_LINES 8 | ||
314 | |||
315 | #endif /* __MACH_MXC91231_H__ */ | ||
diff --git a/arch/arm/plat-mxc/include/mach/system.h b/arch/arm/plat-mxc/include/mach/system.h index e56241af870e..ef00199568de 100644 --- a/arch/arm/plat-mxc/include/mach/system.h +++ b/arch/arm/plat-mxc/include/mach/system.h | |||
@@ -21,8 +21,18 @@ | |||
21 | #ifndef __ASM_ARCH_MXC_SYSTEM_H__ | 21 | #ifndef __ASM_ARCH_MXC_SYSTEM_H__ |
22 | #define __ASM_ARCH_MXC_SYSTEM_H__ | 22 | #define __ASM_ARCH_MXC_SYSTEM_H__ |
23 | 23 | ||
24 | #include <mach/hardware.h> | ||
25 | #include <mach/common.h> | ||
26 | |||
24 | static inline void arch_idle(void) | 27 | static inline void arch_idle(void) |
25 | { | 28 | { |
29 | #ifdef CONFIG_ARCH_MXC91231 | ||
30 | if (cpu_is_mxc91231()) { | ||
31 | /* Need this to set DSM low-power mode */ | ||
32 | mxc91231_prepare_idle(); | ||
33 | } | ||
34 | #endif | ||
35 | |||
26 | cpu_do_idle(); | 36 | cpu_do_idle(); |
27 | } | 37 | } |
28 | 38 | ||
diff --git a/arch/arm/plat-mxc/include/mach/timex.h b/arch/arm/plat-mxc/include/mach/timex.h index 07b4a73c9d2f..527a6c24788e 100644 --- a/arch/arm/plat-mxc/include/mach/timex.h +++ b/arch/arm/plat-mxc/include/mach/timex.h | |||
@@ -26,6 +26,10 @@ | |||
26 | #define CLOCK_TICK_RATE 13300000 | 26 | #define CLOCK_TICK_RATE 13300000 |
27 | #elif defined CONFIG_ARCH_MX3 | 27 | #elif defined CONFIG_ARCH_MX3 |
28 | #define CLOCK_TICK_RATE 16625000 | 28 | #define CLOCK_TICK_RATE 16625000 |
29 | #elif defined CONFIG_ARCH_MX25 | ||
30 | #define CLOCK_TICK_RATE 16000000 | ||
31 | #elif defined CONFIG_ARCH_MXC91231 | ||
32 | #define CLOCK_TICK_RATE 13000000 | ||
29 | #endif | 33 | #endif |
30 | 34 | ||
31 | #endif /* __ASM_ARCH_MXC_TIMEX_H__ */ | 35 | #endif /* __ASM_ARCH_MXC_TIMEX_H__ */ |
diff --git a/arch/arm/plat-mxc/include/mach/uncompress.h b/arch/arm/plat-mxc/include/mach/uncompress.h index de6fe0365982..082a3908256b 100644 --- a/arch/arm/plat-mxc/include/mach/uncompress.h +++ b/arch/arm/plat-mxc/include/mach/uncompress.h | |||
@@ -26,8 +26,11 @@ | |||
26 | #define __MXC_BOOT_UNCOMPRESS | 26 | #define __MXC_BOOT_UNCOMPRESS |
27 | 27 | ||
28 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <asm/mach-types.h> | ||
29 | 30 | ||
30 | #define UART(x) (*(volatile unsigned long *)(serial_port + (x))) | 31 | static unsigned long uart_base; |
32 | |||
33 | #define UART(x) (*(volatile unsigned long *)(uart_base + (x))) | ||
31 | 34 | ||
32 | #define USR2 0x98 | 35 | #define USR2 0x98 |
33 | #define USR2_TXFE (1<<14) | 36 | #define USR2_TXFE (1<<14) |
@@ -46,19 +49,10 @@ | |||
46 | 49 | ||
47 | static void putc(int ch) | 50 | static void putc(int ch) |
48 | { | 51 | { |
49 | static unsigned long serial_port = 0; | 52 | if (!uart_base) |
50 | 53 | return; | |
51 | if (unlikely(serial_port == 0)) { | 54 | if (!(UART(UCR1) & UCR1_UARTEN)) |
52 | do { | 55 | return; |
53 | serial_port = UART1_BASE_ADDR; | ||
54 | if (UART(UCR1) & UCR1_UARTEN) | ||
55 | break; | ||
56 | serial_port = UART2_BASE_ADDR; | ||
57 | if (UART(UCR1) & UCR1_UARTEN) | ||
58 | break; | ||
59 | return; | ||
60 | } while (0); | ||
61 | } | ||
62 | 56 | ||
63 | while (!(UART(USR2) & USR2_TXFE)) | 57 | while (!(UART(USR2) & USR2_TXFE)) |
64 | barrier(); | 58 | barrier(); |
@@ -68,11 +62,49 @@ static void putc(int ch) | |||
68 | 62 | ||
69 | #define flush() do { } while (0) | 63 | #define flush() do { } while (0) |
70 | 64 | ||
71 | /* | 65 | #define MX1_UART1_BASE_ADDR 0x00206000 |
72 | * nothing to do | 66 | #define MX25_UART1_BASE_ADDR 0x43f90000 |
73 | */ | 67 | #define MX2X_UART1_BASE_ADDR 0x1000a000 |
74 | #define arch_decomp_setup() | 68 | #define MX3X_UART1_BASE_ADDR 0x43F90000 |
69 | #define MX3X_UART2_BASE_ADDR 0x43F94000 | ||
70 | |||
71 | static __inline__ void __arch_decomp_setup(unsigned long arch_id) | ||
72 | { | ||
73 | switch (arch_id) { | ||
74 | case MACH_TYPE_MX1ADS: | ||
75 | case MACH_TYPE_SCB9328: | ||
76 | uart_base = MX1_UART1_BASE_ADDR; | ||
77 | break; | ||
78 | case MACH_TYPE_MX25_3DS: | ||
79 | uart_base = MX25_UART1_BASE_ADDR; | ||
80 | break; | ||
81 | case MACH_TYPE_IMX27LITE: | ||
82 | case MACH_TYPE_MX27_3DS: | ||
83 | case MACH_TYPE_MX27ADS: | ||
84 | case MACH_TYPE_PCM038: | ||
85 | case MACH_TYPE_MX21ADS: | ||
86 | uart_base = MX2X_UART1_BASE_ADDR; | ||
87 | break; | ||
88 | case MACH_TYPE_MX31LITE: | ||
89 | case MACH_TYPE_ARMADILLO5X0: | ||
90 | case MACH_TYPE_MX31MOBOARD: | ||
91 | case MACH_TYPE_QONG: | ||
92 | case MACH_TYPE_MX31_3DS: | ||
93 | case MACH_TYPE_PCM037: | ||
94 | case MACH_TYPE_MX31ADS: | ||
95 | case MACH_TYPE_MX35_3DS: | ||
96 | case MACH_TYPE_PCM043: | ||
97 | uart_base = MX3X_UART1_BASE_ADDR; | ||
98 | break; | ||
99 | case MACH_TYPE_MAGX_ZN5: | ||
100 | uart_base = MX3X_UART2_BASE_ADDR; | ||
101 | break; | ||
102 | default: | ||
103 | break; | ||
104 | } | ||
105 | } | ||
75 | 106 | ||
107 | #define arch_decomp_setup() __arch_decomp_setup(arch_id) | ||
76 | #define arch_decomp_wdog() | 108 | #define arch_decomp_wdog() |
77 | 109 | ||
78 | #endif /* __ASM_ARCH_MXC_UNCOMPRESS_H__ */ | 110 | #endif /* __ASM_ARCH_MXC_UNCOMPRESS_H__ */ |
diff --git a/arch/arm/plat-mxc/iomux-v3.c b/arch/arm/plat-mxc/iomux-v3.c index 77a078f9513f..851ca99bf1b1 100644 --- a/arch/arm/plat-mxc/iomux-v3.c +++ b/arch/arm/plat-mxc/iomux-v3.c | |||
@@ -29,7 +29,7 @@ | |||
29 | #include <asm/mach/map.h> | 29 | #include <asm/mach/map.h> |
30 | #include <mach/iomux-v3.h> | 30 | #include <mach/iomux-v3.h> |
31 | 31 | ||
32 | #define IOMUX_BASE IO_ADDRESS(IOMUXC_BASE_ADDR) | 32 | static void __iomem *base; |
33 | 33 | ||
34 | static unsigned long iomux_v3_pad_alloc_map[0x200 / BITS_PER_LONG]; | 34 | static unsigned long iomux_v3_pad_alloc_map[0x200 / BITS_PER_LONG]; |
35 | 35 | ||
@@ -45,14 +45,14 @@ int mxc_iomux_v3_setup_pad(struct pad_desc *pad) | |||
45 | if (test_and_set_bit(pad_ofs >> 2, iomux_v3_pad_alloc_map)) | 45 | if (test_and_set_bit(pad_ofs >> 2, iomux_v3_pad_alloc_map)) |
46 | return -EBUSY; | 46 | return -EBUSY; |
47 | if (pad->mux_ctrl_ofs) | 47 | if (pad->mux_ctrl_ofs) |
48 | __raw_writel(pad->mux_mode, IOMUX_BASE + pad->mux_ctrl_ofs); | 48 | __raw_writel(pad->mux_mode, base + pad->mux_ctrl_ofs); |
49 | 49 | ||
50 | if (pad->select_input_ofs) | 50 | if (pad->select_input_ofs) |
51 | __raw_writel(pad->select_input, | 51 | __raw_writel(pad->select_input, |
52 | IOMUX_BASE + pad->select_input_ofs); | 52 | base + pad->select_input_ofs); |
53 | 53 | ||
54 | if (!(pad->pad_ctrl & NO_PAD_CTRL)) | 54 | if (!(pad->pad_ctrl & NO_PAD_CTRL) && pad->pad_ctrl_ofs) |
55 | __raw_writel(pad->pad_ctrl, IOMUX_BASE + pad->pad_ctrl_ofs); | 55 | __raw_writel(pad->pad_ctrl, base + pad->pad_ctrl_ofs); |
56 | return 0; | 56 | return 0; |
57 | } | 57 | } |
58 | EXPORT_SYMBOL(mxc_iomux_v3_setup_pad); | 58 | EXPORT_SYMBOL(mxc_iomux_v3_setup_pad); |
@@ -96,3 +96,8 @@ void mxc_iomux_v3_release_multiple_pads(struct pad_desc *pad_list, int count) | |||
96 | } | 96 | } |
97 | } | 97 | } |
98 | EXPORT_SYMBOL(mxc_iomux_v3_release_multiple_pads); | 98 | EXPORT_SYMBOL(mxc_iomux_v3_release_multiple_pads); |
99 | |||
100 | void mxc_iomux_v3_init(void __iomem *iomux_v3_base) | ||
101 | { | ||
102 | base = iomux_v3_base; | ||
103 | } | ||
diff --git a/arch/arm/plat-mxc/irq.c b/arch/arm/plat-mxc/irq.c index 8aee76304f8f..778ddfe57d89 100644 --- a/arch/arm/plat-mxc/irq.c +++ b/arch/arm/plat-mxc/irq.c | |||
@@ -44,7 +44,7 @@ | |||
44 | #define AVIC_FIPNDH 0x60 /* fast int pending high */ | 44 | #define AVIC_FIPNDH 0x60 /* fast int pending high */ |
45 | #define AVIC_FIPNDL 0x64 /* fast int pending low */ | 45 | #define AVIC_FIPNDL 0x64 /* fast int pending low */ |
46 | 46 | ||
47 | static void __iomem *avic_base; | 47 | void __iomem *avic_base; |
48 | 48 | ||
49 | int imx_irq_set_priority(unsigned char irq, unsigned char prio) | 49 | int imx_irq_set_priority(unsigned char irq, unsigned char prio) |
50 | { | 50 | { |
@@ -113,11 +113,11 @@ static struct irq_chip mxc_avic_chip = { | |||
113 | * interrupts. It registers the interrupt enable and disable functions | 113 | * interrupts. It registers the interrupt enable and disable functions |
114 | * to the kernel for each interrupt source. | 114 | * to the kernel for each interrupt source. |
115 | */ | 115 | */ |
116 | void __init mxc_init_irq(void) | 116 | void __init mxc_init_irq(void __iomem *irqbase) |
117 | { | 117 | { |
118 | int i; | 118 | int i; |
119 | 119 | ||
120 | avic_base = IO_ADDRESS(AVIC_BASE_ADDR); | 120 | avic_base = irqbase; |
121 | 121 | ||
122 | /* put the AVIC into the reset value with | 122 | /* put the AVIC into the reset value with |
123 | * all interrupts disabled | 123 | * all interrupts disabled |
diff --git a/arch/arm/plat-mxc/pwm.c b/arch/arm/plat-mxc/pwm.c index ae34198a79dd..5cdbd605ac05 100644 --- a/arch/arm/plat-mxc/pwm.c +++ b/arch/arm/plat-mxc/pwm.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #define MX3_PWMPR 0x10 /* PWM Period Register */ | 32 | #define MX3_PWMPR 0x10 /* PWM Period Register */ |
33 | #define MX3_PWMCR_PRESCALER(x) (((x - 1) & 0xFFF) << 4) | 33 | #define MX3_PWMCR_PRESCALER(x) (((x - 1) & 0xFFF) << 4) |
34 | #define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16) | 34 | #define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16) |
35 | #define MX3_PWMCR_CLKSRC_IPG (1 << 16) | ||
35 | #define MX3_PWMCR_EN (1 << 0) | 36 | #define MX3_PWMCR_EN (1 << 0) |
36 | 37 | ||
37 | 38 | ||
@@ -55,9 +56,11 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) | |||
55 | if (pwm == NULL || period_ns == 0 || duty_ns > period_ns) | 56 | if (pwm == NULL || period_ns == 0 || duty_ns > period_ns) |
56 | return -EINVAL; | 57 | return -EINVAL; |
57 | 58 | ||
58 | if (cpu_is_mx27() || cpu_is_mx3()) { | 59 | if (cpu_is_mx27() || cpu_is_mx3() || cpu_is_mx25()) { |
59 | unsigned long long c; | 60 | unsigned long long c; |
60 | unsigned long period_cycles, duty_cycles, prescale; | 61 | unsigned long period_cycles, duty_cycles, prescale; |
62 | u32 cr; | ||
63 | |||
61 | c = clk_get_rate(pwm->clk); | 64 | c = clk_get_rate(pwm->clk); |
62 | c = c * period_ns; | 65 | c = c * period_ns; |
63 | do_div(c, 1000000000); | 66 | do_div(c, 1000000000); |
@@ -72,9 +75,15 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) | |||
72 | 75 | ||
73 | writel(duty_cycles, pwm->mmio_base + MX3_PWMSAR); | 76 | writel(duty_cycles, pwm->mmio_base + MX3_PWMSAR); |
74 | writel(period_cycles, pwm->mmio_base + MX3_PWMPR); | 77 | writel(period_cycles, pwm->mmio_base + MX3_PWMPR); |
75 | writel(MX3_PWMCR_PRESCALER(prescale - 1) | | 78 | |
76 | MX3_PWMCR_CLKSRC_IPG_HIGH | MX3_PWMCR_EN, | 79 | cr = MX3_PWMCR_PRESCALER(prescale) | MX3_PWMCR_EN; |
77 | pwm->mmio_base + MX3_PWMCR); | 80 | |
81 | if (cpu_is_mx25()) | ||
82 | cr |= MX3_PWMCR_CLKSRC_IPG; | ||
83 | else | ||
84 | cr |= MX3_PWMCR_CLKSRC_IPG_HIGH; | ||
85 | |||
86 | writel(cr, pwm->mmio_base + MX3_PWMCR); | ||
78 | } else if (cpu_is_mx1() || cpu_is_mx21()) { | 87 | } else if (cpu_is_mx1() || cpu_is_mx21()) { |
79 | /* The PWM subsystem allows for exact frequencies. However, | 88 | /* The PWM subsystem allows for exact frequencies. However, |
80 | * I cannot connect a scope on my device to the PWM line and | 89 | * I cannot connect a scope on my device to the PWM line and |
@@ -118,6 +127,8 @@ EXPORT_SYMBOL(pwm_enable); | |||
118 | 127 | ||
119 | void pwm_disable(struct pwm_device *pwm) | 128 | void pwm_disable(struct pwm_device *pwm) |
120 | { | 129 | { |
130 | writel(0, pwm->mmio_base + MX3_PWMCR); | ||
131 | |||
121 | if (pwm->clk_enabled) { | 132 | if (pwm->clk_enabled) { |
122 | clk_disable(pwm->clk); | 133 | clk_disable(pwm->clk); |
123 | pwm->clk_enabled = 0; | 134 | pwm->clk_enabled = 0; |
diff --git a/arch/arm/plat-mxc/system.c b/arch/arm/plat-mxc/system.c index 79c37577c916..97f42799fa58 100644 --- a/arch/arm/plat-mxc/system.c +++ b/arch/arm/plat-mxc/system.c | |||
@@ -27,32 +27,38 @@ | |||
27 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
28 | 28 | ||
29 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
30 | #include <mach/common.h> | ||
30 | #include <asm/proc-fns.h> | 31 | #include <asm/proc-fns.h> |
31 | #include <asm/system.h> | 32 | #include <asm/system.h> |
32 | 33 | ||
33 | #ifdef CONFIG_ARCH_MX1 | 34 | static void __iomem *wdog_base; |
34 | #define WDOG_WCR_REG IO_ADDRESS(WDT_BASE_ADDR) | ||
35 | #define WDOG_WCR_ENABLE (1 << 0) | ||
36 | #else | ||
37 | #define WDOG_WCR_REG IO_ADDRESS(WDOG_BASE_ADDR) | ||
38 | #define WDOG_WCR_ENABLE (1 << 2) | ||
39 | #endif | ||
40 | 35 | ||
41 | /* | 36 | /* |
42 | * Reset the system. It is called by machine_restart(). | 37 | * Reset the system. It is called by machine_restart(). |
43 | */ | 38 | */ |
44 | void arch_reset(char mode, const char *cmd) | 39 | void arch_reset(char mode, const char *cmd) |
45 | { | 40 | { |
46 | if (!cpu_is_mx1()) { | 41 | unsigned int wcr_enable; |
42 | |||
43 | #ifdef CONFIG_ARCH_MXC91231 | ||
44 | if (cpu_is_mxc91231()) { | ||
45 | mxc91231_arch_reset(mode, cmd); | ||
46 | return; | ||
47 | } | ||
48 | #endif | ||
49 | if (cpu_is_mx1()) { | ||
50 | wcr_enable = (1 << 0); | ||
51 | } else { | ||
47 | struct clk *clk; | 52 | struct clk *clk; |
48 | 53 | ||
49 | clk = clk_get_sys("imx-wdt.0", NULL); | 54 | clk = clk_get_sys("imx-wdt.0", NULL); |
50 | if (!IS_ERR(clk)) | 55 | if (!IS_ERR(clk)) |
51 | clk_enable(clk); | 56 | clk_enable(clk); |
57 | wcr_enable = (1 << 2); | ||
52 | } | 58 | } |
53 | 59 | ||
54 | /* Assert SRS signal */ | 60 | /* Assert SRS signal */ |
55 | __raw_writew(WDOG_WCR_ENABLE, WDOG_WCR_REG); | 61 | __raw_writew(wcr_enable, wdog_base); |
56 | 62 | ||
57 | /* wait for reset to assert... */ | 63 | /* wait for reset to assert... */ |
58 | mdelay(500); | 64 | mdelay(500); |
@@ -65,3 +71,8 @@ void arch_reset(char mode, const char *cmd) | |||
65 | /* we'll take a jump through zero as a poor second */ | 71 | /* we'll take a jump through zero as a poor second */ |
66 | cpu_reset(0); | 72 | cpu_reset(0); |
67 | } | 73 | } |
74 | |||
75 | void mxc_arch_reset_init(void __iomem *base) | ||
76 | { | ||
77 | wdog_base = base; | ||
78 | } | ||
diff --git a/arch/arm/plat-mxc/time.c b/arch/arm/plat-mxc/time.c index 88fb3a57e029..844567ee35fe 100644 --- a/arch/arm/plat-mxc/time.c +++ b/arch/arm/plat-mxc/time.c | |||
@@ -47,7 +47,7 @@ | |||
47 | #define MX2_TSTAT_CAPT (1 << 1) | 47 | #define MX2_TSTAT_CAPT (1 << 1) |
48 | #define MX2_TSTAT_COMP (1 << 0) | 48 | #define MX2_TSTAT_COMP (1 << 0) |
49 | 49 | ||
50 | /* MX31, MX35 */ | 50 | /* MX31, MX35, MX25, MXC91231 */ |
51 | #define MX3_TCTL_WAITEN (1 << 3) | 51 | #define MX3_TCTL_WAITEN (1 << 3) |
52 | #define MX3_TCTL_CLK_IPG (1 << 6) | 52 | #define MX3_TCTL_CLK_IPG (1 << 6) |
53 | #define MX3_TCTL_FRR (1 << 9) | 53 | #define MX3_TCTL_FRR (1 << 9) |
@@ -66,7 +66,7 @@ static inline void gpt_irq_disable(void) | |||
66 | { | 66 | { |
67 | unsigned int tmp; | 67 | unsigned int tmp; |
68 | 68 | ||
69 | if (cpu_is_mx3()) | 69 | if (cpu_is_mx3() || cpu_is_mx25()) |
70 | __raw_writel(0, timer_base + MX3_IR); | 70 | __raw_writel(0, timer_base + MX3_IR); |
71 | else { | 71 | else { |
72 | tmp = __raw_readl(timer_base + MXC_TCTL); | 72 | tmp = __raw_readl(timer_base + MXC_TCTL); |
@@ -76,7 +76,7 @@ static inline void gpt_irq_disable(void) | |||
76 | 76 | ||
77 | static inline void gpt_irq_enable(void) | 77 | static inline void gpt_irq_enable(void) |
78 | { | 78 | { |
79 | if (cpu_is_mx3()) | 79 | if (cpu_is_mx3() || cpu_is_mx25()) |
80 | __raw_writel(1<<0, timer_base + MX3_IR); | 80 | __raw_writel(1<<0, timer_base + MX3_IR); |
81 | else { | 81 | else { |
82 | __raw_writel(__raw_readl(timer_base + MXC_TCTL) | MX1_2_TCTL_IRQEN, | 82 | __raw_writel(__raw_readl(timer_base + MXC_TCTL) | MX1_2_TCTL_IRQEN, |
@@ -90,7 +90,7 @@ static void gpt_irq_acknowledge(void) | |||
90 | __raw_writel(0, timer_base + MX1_2_TSTAT); | 90 | __raw_writel(0, timer_base + MX1_2_TSTAT); |
91 | if (cpu_is_mx2()) | 91 | if (cpu_is_mx2()) |
92 | __raw_writel(MX2_TSTAT_CAPT | MX2_TSTAT_COMP, timer_base + MX1_2_TSTAT); | 92 | __raw_writel(MX2_TSTAT_CAPT | MX2_TSTAT_COMP, timer_base + MX1_2_TSTAT); |
93 | if (cpu_is_mx3()) | 93 | if (cpu_is_mx3() || cpu_is_mx25()) |
94 | __raw_writel(MX3_TSTAT_OF1, timer_base + MX3_TSTAT); | 94 | __raw_writel(MX3_TSTAT_OF1, timer_base + MX3_TSTAT); |
95 | } | 95 | } |
96 | 96 | ||
@@ -117,7 +117,7 @@ static int __init mxc_clocksource_init(struct clk *timer_clk) | |||
117 | { | 117 | { |
118 | unsigned int c = clk_get_rate(timer_clk); | 118 | unsigned int c = clk_get_rate(timer_clk); |
119 | 119 | ||
120 | if (cpu_is_mx3()) | 120 | if (cpu_is_mx3() || cpu_is_mx25()) |
121 | clocksource_mxc.read = mx3_get_cycles; | 121 | clocksource_mxc.read = mx3_get_cycles; |
122 | 122 | ||
123 | clocksource_mxc.mult = clocksource_hz2mult(c, | 123 | clocksource_mxc.mult = clocksource_hz2mult(c, |
@@ -180,7 +180,7 @@ static void mxc_set_mode(enum clock_event_mode mode, | |||
180 | 180 | ||
181 | if (mode != clockevent_mode) { | 181 | if (mode != clockevent_mode) { |
182 | /* Set event time into far-far future */ | 182 | /* Set event time into far-far future */ |
183 | if (cpu_is_mx3()) | 183 | if (cpu_is_mx3() || cpu_is_mx25()) |
184 | __raw_writel(__raw_readl(timer_base + MX3_TCN) - 3, | 184 | __raw_writel(__raw_readl(timer_base + MX3_TCN) - 3, |
185 | timer_base + MX3_TCMP); | 185 | timer_base + MX3_TCMP); |
186 | else | 186 | else |
@@ -233,7 +233,7 @@ static irqreturn_t mxc_timer_interrupt(int irq, void *dev_id) | |||
233 | struct clock_event_device *evt = &clockevent_mxc; | 233 | struct clock_event_device *evt = &clockevent_mxc; |
234 | uint32_t tstat; | 234 | uint32_t tstat; |
235 | 235 | ||
236 | if (cpu_is_mx3()) | 236 | if (cpu_is_mx3() || cpu_is_mx25()) |
237 | tstat = __raw_readl(timer_base + MX3_TSTAT); | 237 | tstat = __raw_readl(timer_base + MX3_TSTAT); |
238 | else | 238 | else |
239 | tstat = __raw_readl(timer_base + MX1_2_TSTAT); | 239 | tstat = __raw_readl(timer_base + MX1_2_TSTAT); |
@@ -264,7 +264,7 @@ static int __init mxc_clockevent_init(struct clk *timer_clk) | |||
264 | { | 264 | { |
265 | unsigned int c = clk_get_rate(timer_clk); | 265 | unsigned int c = clk_get_rate(timer_clk); |
266 | 266 | ||
267 | if (cpu_is_mx3()) | 267 | if (cpu_is_mx3() || cpu_is_mx25()) |
268 | clockevent_mxc.set_next_event = mx3_set_next_event; | 268 | clockevent_mxc.set_next_event = mx3_set_next_event; |
269 | 269 | ||
270 | clockevent_mxc.mult = div_sc(c, NSEC_PER_SEC, | 270 | clockevent_mxc.mult = div_sc(c, NSEC_PER_SEC, |
@@ -281,30 +281,13 @@ static int __init mxc_clockevent_init(struct clk *timer_clk) | |||
281 | return 0; | 281 | return 0; |
282 | } | 282 | } |
283 | 283 | ||
284 | void __init mxc_timer_init(struct clk *timer_clk) | 284 | void __init mxc_timer_init(struct clk *timer_clk, void __iomem *base, int irq) |
285 | { | 285 | { |
286 | uint32_t tctl_val; | 286 | uint32_t tctl_val; |
287 | int irq; | ||
288 | 287 | ||
289 | clk_enable(timer_clk); | 288 | clk_enable(timer_clk); |
290 | 289 | ||
291 | if (cpu_is_mx1()) { | 290 | timer_base = base; |
292 | #ifdef CONFIG_ARCH_MX1 | ||
293 | timer_base = IO_ADDRESS(TIM1_BASE_ADDR); | ||
294 | irq = TIM1_INT; | ||
295 | #endif | ||
296 | } else if (cpu_is_mx2()) { | ||
297 | #ifdef CONFIG_ARCH_MX2 | ||
298 | timer_base = IO_ADDRESS(GPT1_BASE_ADDR); | ||
299 | irq = MXC_INT_GPT1; | ||
300 | #endif | ||
301 | } else if (cpu_is_mx3()) { | ||
302 | #ifdef CONFIG_ARCH_MX3 | ||
303 | timer_base = IO_ADDRESS(GPT1_BASE_ADDR); | ||
304 | irq = MXC_INT_GPT; | ||
305 | #endif | ||
306 | } else | ||
307 | BUG(); | ||
308 | 291 | ||
309 | /* | 292 | /* |
310 | * Initialise to a known state (all timers off, and timing reset) | 293 | * Initialise to a known state (all timers off, and timing reset) |
@@ -313,7 +296,7 @@ void __init mxc_timer_init(struct clk *timer_clk) | |||
313 | __raw_writel(0, timer_base + MXC_TCTL); | 296 | __raw_writel(0, timer_base + MXC_TCTL); |
314 | __raw_writel(0, timer_base + MXC_TPRER); /* see datasheet note */ | 297 | __raw_writel(0, timer_base + MXC_TPRER); /* see datasheet note */ |
315 | 298 | ||
316 | if (cpu_is_mx3()) | 299 | if (cpu_is_mx3() || cpu_is_mx25()) |
317 | tctl_val = MX3_TCTL_CLK_IPG | MX3_TCTL_FRR | MX3_TCTL_WAITEN | MXC_TCTL_TEN; | 300 | tctl_val = MX3_TCTL_CLK_IPG | MX3_TCTL_FRR | MX3_TCTL_WAITEN | MXC_TCTL_TEN; |
318 | else | 301 | else |
319 | tctl_val = MX1_2_TCTL_FRR | MX1_2_TCTL_CLK_PCLK1 | MXC_TCTL_TEN; | 302 | tctl_val = MX1_2_TCTL_FRR | MX1_2_TCTL_CLK_PCLK1 | MXC_TCTL_TEN; |
diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c index 843e8af64066..1868c0d8f9b5 100644 --- a/arch/arm/plat-omap/cpu-omap.c +++ b/arch/arm/plat-omap/cpu-omap.c | |||
@@ -78,10 +78,10 @@ static int omap_target(struct cpufreq_policy *policy, | |||
78 | 78 | ||
79 | /* Ensure desired rate is within allowed range. Some govenors | 79 | /* Ensure desired rate is within allowed range. Some govenors |
80 | * (ondemand) will just pass target_freq=0 to get the minimum. */ | 80 | * (ondemand) will just pass target_freq=0 to get the minimum. */ |
81 | if (target_freq < policy->cpuinfo.min_freq) | 81 | if (target_freq < policy->min) |
82 | target_freq = policy->cpuinfo.min_freq; | 82 | target_freq = policy->min; |
83 | if (target_freq > policy->cpuinfo.max_freq) | 83 | if (target_freq > policy->max) |
84 | target_freq = policy->cpuinfo.max_freq; | 84 | target_freq = policy->max; |
85 | 85 | ||
86 | freqs.old = omap_getspeed(0); | 86 | freqs.old = omap_getspeed(0); |
87 | freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000; | 87 | freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000; |
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index 26b387c12423..00940dc6bb50 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
@@ -138,6 +138,32 @@ | |||
138 | #define OMAP24XX_GPIO_CLEARDATAOUT 0x0090 | 138 | #define OMAP24XX_GPIO_CLEARDATAOUT 0x0090 |
139 | #define OMAP24XX_GPIO_SETDATAOUT 0x0094 | 139 | #define OMAP24XX_GPIO_SETDATAOUT 0x0094 |
140 | 140 | ||
141 | #define OMAP4_GPIO_REVISION 0x0000 | ||
142 | #define OMAP4_GPIO_SYSCONFIG 0x0010 | ||
143 | #define OMAP4_GPIO_EOI 0x0020 | ||
144 | #define OMAP4_GPIO_IRQSTATUSRAW0 0x0024 | ||
145 | #define OMAP4_GPIO_IRQSTATUSRAW1 0x0028 | ||
146 | #define OMAP4_GPIO_IRQSTATUS0 0x002c | ||
147 | #define OMAP4_GPIO_IRQSTATUS1 0x0030 | ||
148 | #define OMAP4_GPIO_IRQSTATUSSET0 0x0034 | ||
149 | #define OMAP4_GPIO_IRQSTATUSSET1 0x0038 | ||
150 | #define OMAP4_GPIO_IRQSTATUSCLR0 0x003c | ||
151 | #define OMAP4_GPIO_IRQSTATUSCLR1 0x0040 | ||
152 | #define OMAP4_GPIO_IRQWAKEN0 0x0044 | ||
153 | #define OMAP4_GPIO_IRQWAKEN1 0x0048 | ||
154 | #define OMAP4_GPIO_SYSSTATUS 0x0104 | ||
155 | #define OMAP4_GPIO_CTRL 0x0130 | ||
156 | #define OMAP4_GPIO_OE 0x0134 | ||
157 | #define OMAP4_GPIO_DATAIN 0x0138 | ||
158 | #define OMAP4_GPIO_DATAOUT 0x013c | ||
159 | #define OMAP4_GPIO_LEVELDETECT0 0x0140 | ||
160 | #define OMAP4_GPIO_LEVELDETECT1 0x0144 | ||
161 | #define OMAP4_GPIO_RISINGDETECT 0x0148 | ||
162 | #define OMAP4_GPIO_FALLINGDETECT 0x014c | ||
163 | #define OMAP4_GPIO_DEBOUNCENABLE 0x0150 | ||
164 | #define OMAP4_GPIO_DEBOUNCINGTIME 0x0154 | ||
165 | #define OMAP4_GPIO_CLEARDATAOUT 0x0190 | ||
166 | #define OMAP4_GPIO_SETDATAOUT 0x0194 | ||
141 | /* | 167 | /* |
142 | * omap34xx specific GPIO registers | 168 | * omap34xx specific GPIO registers |
143 | */ | 169 | */ |
@@ -386,12 +412,16 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input) | |||
386 | reg += OMAP850_GPIO_DIR_CONTROL; | 412 | reg += OMAP850_GPIO_DIR_CONTROL; |
387 | break; | 413 | break; |
388 | #endif | 414 | #endif |
389 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 415 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
390 | defined(CONFIG_ARCH_OMAP4) | ||
391 | case METHOD_GPIO_24XX: | 416 | case METHOD_GPIO_24XX: |
392 | reg += OMAP24XX_GPIO_OE; | 417 | reg += OMAP24XX_GPIO_OE; |
393 | break; | 418 | break; |
394 | #endif | 419 | #endif |
420 | #if defined(CONFIG_ARCH_OMAP4) | ||
421 | case METHOD_GPIO_24XX: | ||
422 | reg += OMAP4_GPIO_OE; | ||
423 | break; | ||
424 | #endif | ||
395 | default: | 425 | default: |
396 | WARN_ON(1); | 426 | WARN_ON(1); |
397 | return; | 427 | return; |
@@ -459,8 +489,7 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) | |||
459 | l &= ~(1 << gpio); | 489 | l &= ~(1 << gpio); |
460 | break; | 490 | break; |
461 | #endif | 491 | #endif |
462 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 492 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
463 | defined(CONFIG_ARCH_OMAP4) | ||
464 | case METHOD_GPIO_24XX: | 493 | case METHOD_GPIO_24XX: |
465 | if (enable) | 494 | if (enable) |
466 | reg += OMAP24XX_GPIO_SETDATAOUT; | 495 | reg += OMAP24XX_GPIO_SETDATAOUT; |
@@ -469,6 +498,15 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) | |||
469 | l = 1 << gpio; | 498 | l = 1 << gpio; |
470 | break; | 499 | break; |
471 | #endif | 500 | #endif |
501 | #ifdef CONFIG_ARCH_OMAP4 | ||
502 | case METHOD_GPIO_24XX: | ||
503 | if (enable) | ||
504 | reg += OMAP4_GPIO_SETDATAOUT; | ||
505 | else | ||
506 | reg += OMAP4_GPIO_CLEARDATAOUT; | ||
507 | l = 1 << gpio; | ||
508 | break; | ||
509 | #endif | ||
472 | default: | 510 | default: |
473 | WARN_ON(1); | 511 | WARN_ON(1); |
474 | return; | 512 | return; |
@@ -511,12 +549,16 @@ static int __omap_get_gpio_datain(int gpio) | |||
511 | reg += OMAP850_GPIO_DATA_INPUT; | 549 | reg += OMAP850_GPIO_DATA_INPUT; |
512 | break; | 550 | break; |
513 | #endif | 551 | #endif |
514 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 552 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
515 | defined(CONFIG_ARCH_OMAP4) | ||
516 | case METHOD_GPIO_24XX: | 553 | case METHOD_GPIO_24XX: |
517 | reg += OMAP24XX_GPIO_DATAIN; | 554 | reg += OMAP24XX_GPIO_DATAIN; |
518 | break; | 555 | break; |
519 | #endif | 556 | #endif |
557 | #ifdef CONFIG_ARCH_OMAP4 | ||
558 | case METHOD_GPIO_24XX: | ||
559 | reg += OMAP4_GPIO_DATAIN; | ||
560 | break; | ||
561 | #endif | ||
520 | default: | 562 | default: |
521 | return -EINVAL; | 563 | return -EINVAL; |
522 | } | 564 | } |
@@ -544,7 +586,11 @@ void omap_set_gpio_debounce(int gpio, int enable) | |||
544 | 586 | ||
545 | bank = get_gpio_bank(gpio); | 587 | bank = get_gpio_bank(gpio); |
546 | reg = bank->base; | 588 | reg = bank->base; |
589 | #ifdef CONFIG_ARCH_OMAP4 | ||
590 | reg += OMAP4_GPIO_DEBOUNCENABLE; | ||
591 | #else | ||
547 | reg += OMAP24XX_GPIO_DEBOUNCE_EN; | 592 | reg += OMAP24XX_GPIO_DEBOUNCE_EN; |
593 | #endif | ||
548 | 594 | ||
549 | spin_lock_irqsave(&bank->lock, flags); | 595 | spin_lock_irqsave(&bank->lock, flags); |
550 | val = __raw_readl(reg); | 596 | val = __raw_readl(reg); |
@@ -581,7 +627,11 @@ void omap_set_gpio_debounce_time(int gpio, int enc_time) | |||
581 | reg = bank->base; | 627 | reg = bank->base; |
582 | 628 | ||
583 | enc_time &= 0xff; | 629 | enc_time &= 0xff; |
630 | #ifdef CONFIG_ARCH_OMAP4 | ||
631 | reg += OMAP4_GPIO_DEBOUNCINGTIME; | ||
632 | #else | ||
584 | reg += OMAP24XX_GPIO_DEBOUNCE_VAL; | 633 | reg += OMAP24XX_GPIO_DEBOUNCE_VAL; |
634 | #endif | ||
585 | __raw_writel(enc_time, reg); | 635 | __raw_writel(enc_time, reg); |
586 | } | 636 | } |
587 | EXPORT_SYMBOL(omap_set_gpio_debounce_time); | 637 | EXPORT_SYMBOL(omap_set_gpio_debounce_time); |
@@ -593,23 +643,46 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | |||
593 | { | 643 | { |
594 | void __iomem *base = bank->base; | 644 | void __iomem *base = bank->base; |
595 | u32 gpio_bit = 1 << gpio; | 645 | u32 gpio_bit = 1 << gpio; |
646 | u32 val; | ||
596 | 647 | ||
597 | MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT0, gpio_bit, | 648 | if (cpu_is_omap44xx()) { |
598 | trigger & IRQ_TYPE_LEVEL_LOW); | 649 | MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT0, gpio_bit, |
599 | MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT1, gpio_bit, | 650 | trigger & IRQ_TYPE_LEVEL_LOW); |
600 | trigger & IRQ_TYPE_LEVEL_HIGH); | 651 | MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT1, gpio_bit, |
601 | MOD_REG_BIT(OMAP24XX_GPIO_RISINGDETECT, gpio_bit, | 652 | trigger & IRQ_TYPE_LEVEL_HIGH); |
602 | trigger & IRQ_TYPE_EDGE_RISING); | 653 | MOD_REG_BIT(OMAP4_GPIO_RISINGDETECT, gpio_bit, |
603 | MOD_REG_BIT(OMAP24XX_GPIO_FALLINGDETECT, gpio_bit, | 654 | trigger & IRQ_TYPE_EDGE_RISING); |
604 | trigger & IRQ_TYPE_EDGE_FALLING); | 655 | MOD_REG_BIT(OMAP4_GPIO_FALLINGDETECT, gpio_bit, |
605 | 656 | trigger & IRQ_TYPE_EDGE_FALLING); | |
657 | } else { | ||
658 | MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT0, gpio_bit, | ||
659 | trigger & IRQ_TYPE_LEVEL_LOW); | ||
660 | MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT1, gpio_bit, | ||
661 | trigger & IRQ_TYPE_LEVEL_HIGH); | ||
662 | MOD_REG_BIT(OMAP24XX_GPIO_RISINGDETECT, gpio_bit, | ||
663 | trigger & IRQ_TYPE_EDGE_RISING); | ||
664 | MOD_REG_BIT(OMAP24XX_GPIO_FALLINGDETECT, gpio_bit, | ||
665 | trigger & IRQ_TYPE_EDGE_FALLING); | ||
666 | } | ||
606 | if (likely(!(bank->non_wakeup_gpios & gpio_bit))) { | 667 | if (likely(!(bank->non_wakeup_gpios & gpio_bit))) { |
607 | if (trigger != 0) | 668 | if (cpu_is_omap44xx()) { |
608 | __raw_writel(1 << gpio, bank->base | 669 | if (trigger != 0) |
670 | __raw_writel(1 << gpio, bank->base+ | ||
671 | OMAP4_GPIO_IRQWAKEN0); | ||
672 | else { | ||
673 | val = __raw_readl(bank->base + | ||
674 | OMAP4_GPIO_IRQWAKEN0); | ||
675 | __raw_writel(val & (~(1 << gpio)), bank->base + | ||
676 | OMAP4_GPIO_IRQWAKEN0); | ||
677 | } | ||
678 | } else { | ||
679 | if (trigger != 0) | ||
680 | __raw_writel(1 << gpio, bank->base | ||
609 | + OMAP24XX_GPIO_SETWKUENA); | 681 | + OMAP24XX_GPIO_SETWKUENA); |
610 | else | 682 | else |
611 | __raw_writel(1 << gpio, bank->base | 683 | __raw_writel(1 << gpio, bank->base |
612 | + OMAP24XX_GPIO_CLEARWKUENA); | 684 | + OMAP24XX_GPIO_CLEARWKUENA); |
685 | } | ||
613 | } else { | 686 | } else { |
614 | if (trigger != 0) | 687 | if (trigger != 0) |
615 | bank->enabled_non_wakeup_gpios |= gpio_bit; | 688 | bank->enabled_non_wakeup_gpios |= gpio_bit; |
@@ -617,9 +690,15 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | |||
617 | bank->enabled_non_wakeup_gpios &= ~gpio_bit; | 690 | bank->enabled_non_wakeup_gpios &= ~gpio_bit; |
618 | } | 691 | } |
619 | 692 | ||
620 | bank->level_mask = | 693 | if (cpu_is_omap44xx()) { |
621 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0) | | 694 | bank->level_mask = |
622 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); | 695 | __raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT0) | |
696 | __raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT1); | ||
697 | } else { | ||
698 | bank->level_mask = | ||
699 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0) | | ||
700 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); | ||
701 | } | ||
623 | } | 702 | } |
624 | #endif | 703 | #endif |
625 | 704 | ||
@@ -783,12 +862,16 @@ static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | |||
783 | reg += OMAP850_GPIO_INT_STATUS; | 862 | reg += OMAP850_GPIO_INT_STATUS; |
784 | break; | 863 | break; |
785 | #endif | 864 | #endif |
786 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 865 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
787 | defined(CONFIG_ARCH_OMAP4) | ||
788 | case METHOD_GPIO_24XX: | 866 | case METHOD_GPIO_24XX: |
789 | reg += OMAP24XX_GPIO_IRQSTATUS1; | 867 | reg += OMAP24XX_GPIO_IRQSTATUS1; |
790 | break; | 868 | break; |
791 | #endif | 869 | #endif |
870 | #if defined(CONFIG_ARCH_OMAP4) | ||
871 | case METHOD_GPIO_24XX: | ||
872 | reg += OMAP4_GPIO_IRQSTATUS0; | ||
873 | break; | ||
874 | #endif | ||
792 | default: | 875 | default: |
793 | WARN_ON(1); | 876 | WARN_ON(1); |
794 | return; | 877 | return; |
@@ -798,12 +881,16 @@ static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | |||
798 | /* Workaround for clearing DSP GPIO interrupts to allow retention */ | 881 | /* Workaround for clearing DSP GPIO interrupts to allow retention */ |
799 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 882 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
800 | reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2; | 883 | reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2; |
801 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | 884 | #endif |
885 | #if defined(CONFIG_ARCH_OMAP4) | ||
886 | reg = bank->base + OMAP4_GPIO_IRQSTATUS1; | ||
887 | #endif | ||
888 | if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { | ||
802 | __raw_writel(gpio_mask, reg); | 889 | __raw_writel(gpio_mask, reg); |
803 | 890 | ||
804 | /* Flush posted write for the irq status to avoid spurious interrupts */ | 891 | /* Flush posted write for the irq status to avoid spurious interrupts */ |
805 | __raw_readl(reg); | 892 | __raw_readl(reg); |
806 | #endif | 893 | } |
807 | } | 894 | } |
808 | 895 | ||
809 | static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio) | 896 | static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio) |
@@ -853,13 +940,18 @@ static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank) | |||
853 | inv = 1; | 940 | inv = 1; |
854 | break; | 941 | break; |
855 | #endif | 942 | #endif |
856 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 943 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
857 | defined(CONFIG_ARCH_OMAP4) | ||
858 | case METHOD_GPIO_24XX: | 944 | case METHOD_GPIO_24XX: |
859 | reg += OMAP24XX_GPIO_IRQENABLE1; | 945 | reg += OMAP24XX_GPIO_IRQENABLE1; |
860 | mask = 0xffffffff; | 946 | mask = 0xffffffff; |
861 | break; | 947 | break; |
862 | #endif | 948 | #endif |
949 | #if defined(CONFIG_ARCH_OMAP4) | ||
950 | case METHOD_GPIO_24XX: | ||
951 | reg += OMAP4_GPIO_IRQSTATUSSET0; | ||
952 | mask = 0xffffffff; | ||
953 | break; | ||
954 | #endif | ||
863 | default: | 955 | default: |
864 | WARN_ON(1); | 956 | WARN_ON(1); |
865 | return 0; | 957 | return 0; |
@@ -927,8 +1019,7 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enab | |||
927 | l |= gpio_mask; | 1019 | l |= gpio_mask; |
928 | break; | 1020 | break; |
929 | #endif | 1021 | #endif |
930 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 1022 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
931 | defined(CONFIG_ARCH_OMAP4) | ||
932 | case METHOD_GPIO_24XX: | 1023 | case METHOD_GPIO_24XX: |
933 | if (enable) | 1024 | if (enable) |
934 | reg += OMAP24XX_GPIO_SETIRQENABLE1; | 1025 | reg += OMAP24XX_GPIO_SETIRQENABLE1; |
@@ -937,6 +1028,15 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enab | |||
937 | l = gpio_mask; | 1028 | l = gpio_mask; |
938 | break; | 1029 | break; |
939 | #endif | 1030 | #endif |
1031 | #ifdef CONFIG_ARCH_OMAP4 | ||
1032 | case METHOD_GPIO_24XX: | ||
1033 | if (enable) | ||
1034 | reg += OMAP4_GPIO_IRQSTATUSSET0; | ||
1035 | else | ||
1036 | reg += OMAP4_GPIO_IRQSTATUSCLR0; | ||
1037 | l = gpio_mask; | ||
1038 | break; | ||
1039 | #endif | ||
940 | default: | 1040 | default: |
941 | WARN_ON(1); | 1041 | WARN_ON(1); |
942 | return; | 1042 | return; |
@@ -1112,11 +1212,14 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
1112 | if (bank->method == METHOD_GPIO_850) | 1212 | if (bank->method == METHOD_GPIO_850) |
1113 | isr_reg = bank->base + OMAP850_GPIO_INT_STATUS; | 1213 | isr_reg = bank->base + OMAP850_GPIO_INT_STATUS; |
1114 | #endif | 1214 | #endif |
1115 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 1215 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
1116 | defined(CONFIG_ARCH_OMAP4) | ||
1117 | if (bank->method == METHOD_GPIO_24XX) | 1216 | if (bank->method == METHOD_GPIO_24XX) |
1118 | isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1; | 1217 | isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1; |
1119 | #endif | 1218 | #endif |
1219 | #if defined(CONFIG_ARCH_OMAP4) | ||
1220 | if (bank->method == METHOD_GPIO_24XX) | ||
1221 | isr_reg = bank->base + OMAP4_GPIO_IRQSTATUS0; | ||
1222 | #endif | ||
1120 | while(1) { | 1223 | while(1) { |
1121 | u32 isr_saved, level_mask = 0; | 1224 | u32 isr_saved, level_mask = 0; |
1122 | u32 enabled; | 1225 | u32 enabled; |
@@ -1189,6 +1292,7 @@ static void gpio_mask_irq(unsigned int irq) | |||
1189 | struct gpio_bank *bank = get_irq_chip_data(irq); | 1292 | struct gpio_bank *bank = get_irq_chip_data(irq); |
1190 | 1293 | ||
1191 | _set_gpio_irqenable(bank, gpio, 0); | 1294 | _set_gpio_irqenable(bank, gpio, 0); |
1295 | _set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE); | ||
1192 | } | 1296 | } |
1193 | 1297 | ||
1194 | static void gpio_unmask_irq(unsigned int irq) | 1298 | static void gpio_unmask_irq(unsigned int irq) |
@@ -1196,6 +1300,11 @@ static void gpio_unmask_irq(unsigned int irq) | |||
1196 | unsigned int gpio = irq - IH_GPIO_BASE; | 1300 | unsigned int gpio = irq - IH_GPIO_BASE; |
1197 | struct gpio_bank *bank = get_irq_chip_data(irq); | 1301 | struct gpio_bank *bank = get_irq_chip_data(irq); |
1198 | unsigned int irq_mask = 1 << get_gpio_index(gpio); | 1302 | unsigned int irq_mask = 1 << get_gpio_index(gpio); |
1303 | struct irq_desc *desc = irq_to_desc(irq); | ||
1304 | u32 trigger = desc->status & IRQ_TYPE_SENSE_MASK; | ||
1305 | |||
1306 | if (trigger) | ||
1307 | _set_gpio_triggering(bank, get_gpio_index(gpio), trigger); | ||
1199 | 1308 | ||
1200 | /* For level-triggered GPIOs, the clearing must be done after | 1309 | /* For level-triggered GPIOs, the clearing must be done after |
1201 | * the HW source is cleared, thus after the handler has run */ | 1310 | * the HW source is cleared, thus after the handler has run */ |
@@ -1547,7 +1656,7 @@ static int __init _omap_gpio_init(void) | |||
1547 | 1656 | ||
1548 | gpio_bank_count = OMAP34XX_NR_GPIOS; | 1657 | gpio_bank_count = OMAP34XX_NR_GPIOS; |
1549 | gpio_bank = gpio_bank_44xx; | 1658 | gpio_bank = gpio_bank_44xx; |
1550 | rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION); | 1659 | rev = __raw_readl(gpio_bank[0].base + OMAP4_GPIO_REVISION); |
1551 | printk(KERN_INFO "OMAP44xx GPIO hardware version %d.%d\n", | 1660 | printk(KERN_INFO "OMAP44xx GPIO hardware version %d.%d\n", |
1552 | (rev >> 4) & 0x0f, rev & 0x0f); | 1661 | (rev >> 4) & 0x0f, rev & 0x0f); |
1553 | } | 1662 | } |
@@ -1581,7 +1690,16 @@ static int __init _omap_gpio_init(void) | |||
1581 | static const u32 non_wakeup_gpios[] = { | 1690 | static const u32 non_wakeup_gpios[] = { |
1582 | 0xe203ffc0, 0x08700040 | 1691 | 0xe203ffc0, 0x08700040 |
1583 | }; | 1692 | }; |
1584 | 1693 | if (cpu_is_omap44xx()) { | |
1694 | __raw_writel(0xffffffff, bank->base + | ||
1695 | OMAP4_GPIO_IRQSTATUSCLR0); | ||
1696 | __raw_writew(0x0015, bank->base + | ||
1697 | OMAP4_GPIO_SYSCONFIG); | ||
1698 | __raw_writel(0x00000000, bank->base + | ||
1699 | OMAP4_GPIO_DEBOUNCENABLE); | ||
1700 | /* Initialize interface clock ungated, module enabled */ | ||
1701 | __raw_writel(0, bank->base + OMAP4_GPIO_CTRL); | ||
1702 | } else { | ||
1585 | __raw_writel(0x00000000, bank->base + OMAP24XX_GPIO_IRQENABLE1); | 1703 | __raw_writel(0x00000000, bank->base + OMAP24XX_GPIO_IRQENABLE1); |
1586 | __raw_writel(0xffffffff, bank->base + OMAP24XX_GPIO_IRQSTATUS1); | 1704 | __raw_writel(0xffffffff, bank->base + OMAP24XX_GPIO_IRQSTATUS1); |
1587 | __raw_writew(0x0015, bank->base + OMAP24XX_GPIO_SYSCONFIG); | 1705 | __raw_writew(0x0015, bank->base + OMAP24XX_GPIO_SYSCONFIG); |
@@ -1589,12 +1707,12 @@ static int __init _omap_gpio_init(void) | |||
1589 | 1707 | ||
1590 | /* Initialize interface clock ungated, module enabled */ | 1708 | /* Initialize interface clock ungated, module enabled */ |
1591 | __raw_writel(0, bank->base + OMAP24XX_GPIO_CTRL); | 1709 | __raw_writel(0, bank->base + OMAP24XX_GPIO_CTRL); |
1710 | } | ||
1592 | if (i < ARRAY_SIZE(non_wakeup_gpios)) | 1711 | if (i < ARRAY_SIZE(non_wakeup_gpios)) |
1593 | bank->non_wakeup_gpios = non_wakeup_gpios[i]; | 1712 | bank->non_wakeup_gpios = non_wakeup_gpios[i]; |
1594 | gpio_count = 32; | 1713 | gpio_count = 32; |
1595 | } | 1714 | } |
1596 | #endif | 1715 | #endif |
1597 | |||
1598 | /* REVISIT eventually switch from OMAP-specific gpio structs | 1716 | /* REVISIT eventually switch from OMAP-specific gpio structs |
1599 | * over to the generic ones | 1717 | * over to the generic ones |
1600 | */ | 1718 | */ |
@@ -1680,14 +1798,20 @@ static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg) | |||
1680 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; | 1798 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; |
1681 | break; | 1799 | break; |
1682 | #endif | 1800 | #endif |
1683 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 1801 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
1684 | defined(CONFIG_ARCH_OMAP4) | ||
1685 | case METHOD_GPIO_24XX: | 1802 | case METHOD_GPIO_24XX: |
1686 | wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN; | 1803 | wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN; |
1687 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | 1804 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; |
1688 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; | 1805 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; |
1689 | break; | 1806 | break; |
1690 | #endif | 1807 | #endif |
1808 | #ifdef CONFIG_ARCH_OMAP4 | ||
1809 | case METHOD_GPIO_24XX: | ||
1810 | wake_status = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1811 | wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1812 | wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1813 | break; | ||
1814 | #endif | ||
1691 | default: | 1815 | default: |
1692 | continue; | 1816 | continue; |
1693 | } | 1817 | } |
@@ -1722,13 +1846,18 @@ static int omap_gpio_resume(struct sys_device *dev) | |||
1722 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; | 1846 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; |
1723 | break; | 1847 | break; |
1724 | #endif | 1848 | #endif |
1725 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 1849 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
1726 | defined(CONFIG_ARCH_OMAP4) | ||
1727 | case METHOD_GPIO_24XX: | 1850 | case METHOD_GPIO_24XX: |
1728 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | 1851 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; |
1729 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; | 1852 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; |
1730 | break; | 1853 | break; |
1731 | #endif | 1854 | #endif |
1855 | #ifdef CONFIG_ARCH_OMAP4 | ||
1856 | case METHOD_GPIO_24XX: | ||
1857 | wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1858 | wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1859 | break; | ||
1860 | #endif | ||
1732 | default: | 1861 | default: |
1733 | continue; | 1862 | continue; |
1734 | } | 1863 | } |
@@ -1772,21 +1901,29 @@ void omap2_gpio_prepare_for_retention(void) | |||
1772 | 1901 | ||
1773 | if (!(bank->enabled_non_wakeup_gpios)) | 1902 | if (!(bank->enabled_non_wakeup_gpios)) |
1774 | continue; | 1903 | continue; |
1775 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 1904 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
1776 | defined(CONFIG_ARCH_OMAP4) | ||
1777 | bank->saved_datain = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); | 1905 | bank->saved_datain = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); |
1778 | l1 = __raw_readl(bank->base + OMAP24XX_GPIO_FALLINGDETECT); | 1906 | l1 = __raw_readl(bank->base + OMAP24XX_GPIO_FALLINGDETECT); |
1779 | l2 = __raw_readl(bank->base + OMAP24XX_GPIO_RISINGDETECT); | 1907 | l2 = __raw_readl(bank->base + OMAP24XX_GPIO_RISINGDETECT); |
1780 | #endif | 1908 | #endif |
1909 | #ifdef CONFIG_ARCH_OMAP4 | ||
1910 | bank->saved_datain = __raw_readl(bank->base + | ||
1911 | OMAP4_GPIO_DATAIN); | ||
1912 | l1 = __raw_readl(bank->base + OMAP4_GPIO_FALLINGDETECT); | ||
1913 | l2 = __raw_readl(bank->base + OMAP4_GPIO_RISINGDETECT); | ||
1914 | #endif | ||
1781 | bank->saved_fallingdetect = l1; | 1915 | bank->saved_fallingdetect = l1; |
1782 | bank->saved_risingdetect = l2; | 1916 | bank->saved_risingdetect = l2; |
1783 | l1 &= ~bank->enabled_non_wakeup_gpios; | 1917 | l1 &= ~bank->enabled_non_wakeup_gpios; |
1784 | l2 &= ~bank->enabled_non_wakeup_gpios; | 1918 | l2 &= ~bank->enabled_non_wakeup_gpios; |
1785 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 1919 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
1786 | defined(CONFIG_ARCH_OMAP4) | ||
1787 | __raw_writel(l1, bank->base + OMAP24XX_GPIO_FALLINGDETECT); | 1920 | __raw_writel(l1, bank->base + OMAP24XX_GPIO_FALLINGDETECT); |
1788 | __raw_writel(l2, bank->base + OMAP24XX_GPIO_RISINGDETECT); | 1921 | __raw_writel(l2, bank->base + OMAP24XX_GPIO_RISINGDETECT); |
1789 | #endif | 1922 | #endif |
1923 | #ifdef CONFIG_ARCH_OMAP4 | ||
1924 | __raw_writel(l1, bank->base + OMAP4_GPIO_FALLINGDETECT); | ||
1925 | __raw_writel(l2, bank->base + OMAP4_GPIO_RISINGDETECT); | ||
1926 | #endif | ||
1790 | c++; | 1927 | c++; |
1791 | } | 1928 | } |
1792 | if (!c) { | 1929 | if (!c) { |
@@ -1808,27 +1945,29 @@ void omap2_gpio_resume_after_retention(void) | |||
1808 | 1945 | ||
1809 | if (!(bank->enabled_non_wakeup_gpios)) | 1946 | if (!(bank->enabled_non_wakeup_gpios)) |
1810 | continue; | 1947 | continue; |
1811 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 1948 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
1812 | defined(CONFIG_ARCH_OMAP4) | ||
1813 | __raw_writel(bank->saved_fallingdetect, | 1949 | __raw_writel(bank->saved_fallingdetect, |
1814 | bank->base + OMAP24XX_GPIO_FALLINGDETECT); | 1950 | bank->base + OMAP24XX_GPIO_FALLINGDETECT); |
1815 | __raw_writel(bank->saved_risingdetect, | 1951 | __raw_writel(bank->saved_risingdetect, |
1816 | bank->base + OMAP24XX_GPIO_RISINGDETECT); | 1952 | bank->base + OMAP24XX_GPIO_RISINGDETECT); |
1953 | l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); | ||
1954 | #endif | ||
1955 | #ifdef CONFIG_ARCH_OMAP4 | ||
1956 | __raw_writel(bank->saved_fallingdetect, | ||
1957 | bank->base + OMAP4_GPIO_FALLINGDETECT); | ||
1958 | __raw_writel(bank->saved_risingdetect, | ||
1959 | bank->base + OMAP4_GPIO_RISINGDETECT); | ||
1960 | l = __raw_readl(bank->base + OMAP4_GPIO_DATAIN); | ||
1817 | #endif | 1961 | #endif |
1818 | /* Check if any of the non-wakeup interrupt GPIOs have changed | 1962 | /* Check if any of the non-wakeup interrupt GPIOs have changed |
1819 | * state. If so, generate an IRQ by software. This is | 1963 | * state. If so, generate an IRQ by software. This is |
1820 | * horribly racy, but it's the best we can do to work around | 1964 | * horribly racy, but it's the best we can do to work around |
1821 | * this silicon bug. */ | 1965 | * this silicon bug. */ |
1822 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | ||
1823 | defined(CONFIG_ARCH_OMAP4) | ||
1824 | l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); | ||
1825 | #endif | ||
1826 | l ^= bank->saved_datain; | 1966 | l ^= bank->saved_datain; |
1827 | l &= bank->non_wakeup_gpios; | 1967 | l &= bank->non_wakeup_gpios; |
1828 | if (l) { | 1968 | if (l) { |
1829 | u32 old0, old1; | 1969 | u32 old0, old1; |
1830 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | 1970 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
1831 | defined(CONFIG_ARCH_OMAP4) | ||
1832 | old0 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0); | 1971 | old0 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0); |
1833 | old1 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); | 1972 | old1 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); |
1834 | __raw_writel(old0 | l, bank->base + OMAP24XX_GPIO_LEVELDETECT0); | 1973 | __raw_writel(old0 | l, bank->base + OMAP24XX_GPIO_LEVELDETECT0); |
@@ -1836,6 +1975,20 @@ void omap2_gpio_resume_after_retention(void) | |||
1836 | __raw_writel(old0, bank->base + OMAP24XX_GPIO_LEVELDETECT0); | 1975 | __raw_writel(old0, bank->base + OMAP24XX_GPIO_LEVELDETECT0); |
1837 | __raw_writel(old1, bank->base + OMAP24XX_GPIO_LEVELDETECT1); | 1976 | __raw_writel(old1, bank->base + OMAP24XX_GPIO_LEVELDETECT1); |
1838 | #endif | 1977 | #endif |
1978 | #ifdef CONFIG_ARCH_OMAP4 | ||
1979 | old0 = __raw_readl(bank->base + | ||
1980 | OMAP4_GPIO_LEVELDETECT0); | ||
1981 | old1 = __raw_readl(bank->base + | ||
1982 | OMAP4_GPIO_LEVELDETECT1); | ||
1983 | __raw_writel(old0 | l, bank->base + | ||
1984 | OMAP4_GPIO_LEVELDETECT0); | ||
1985 | __raw_writel(old1 | l, bank->base + | ||
1986 | OMAP4_GPIO_LEVELDETECT1); | ||
1987 | __raw_writel(old0, bank->base + | ||
1988 | OMAP4_GPIO_LEVELDETECT0); | ||
1989 | __raw_writel(old1, bank->base + | ||
1990 | OMAP4_GPIO_LEVELDETECT1); | ||
1991 | #endif | ||
1839 | } | 1992 | } |
1840 | } | 1993 | } |
1841 | 1994 | ||
diff --git a/arch/arm/plat-omap/include/mach/dma.h b/arch/arm/plat-omap/include/mach/dma.h index 7b939cc01962..72f680b7180d 100644 --- a/arch/arm/plat-omap/include/mach/dma.h +++ b/arch/arm/plat-omap/include/mach/dma.h | |||
@@ -122,6 +122,11 @@ | |||
122 | #define OMAP_DMA4_CCFN(n) (0x60 * (n) + 0xc0) | 122 | #define OMAP_DMA4_CCFN(n) (0x60 * (n) + 0xc0) |
123 | #define OMAP_DMA4_COLOR(n) (0x60 * (n) + 0xc4) | 123 | #define OMAP_DMA4_COLOR(n) (0x60 * (n) + 0xc4) |
124 | 124 | ||
125 | /* Additional registers available on OMAP4 */ | ||
126 | #define OMAP_DMA4_CDP(n) (0x60 * (n) + 0xd0) | ||
127 | #define OMAP_DMA4_CNDP(n) (0x60 * (n) + 0xd4) | ||
128 | #define OMAP_DMA4_CCDN(n) (0x60 * (n) + 0xd8) | ||
129 | |||
125 | /* Dummy defines to keep multi-omap compiles happy */ | 130 | /* Dummy defines to keep multi-omap compiles happy */ |
126 | #define OMAP1_DMA_REVISION 0 | 131 | #define OMAP1_DMA_REVISION 0 |
127 | #define OMAP1_DMA_IRQSTATUS_L0 0 | 132 | #define OMAP1_DMA_IRQSTATUS_L0 0 |
@@ -311,6 +316,89 @@ | |||
311 | #define OMAP34XX_DMA_USIM_TX 79 /* S_DMA_78 */ | 316 | #define OMAP34XX_DMA_USIM_TX 79 /* S_DMA_78 */ |
312 | #define OMAP34XX_DMA_USIM_RX 80 /* S_DMA_79 */ | 317 | #define OMAP34XX_DMA_USIM_RX 80 /* S_DMA_79 */ |
313 | 318 | ||
319 | /* DMA request lines for 44xx */ | ||
320 | #define OMAP44XX_DMA_DSS_DISPC_REQ 6 /* S_DMA_5 */ | ||
321 | #define OMAP44XX_DMA_SYS_REQ2 7 /* S_DMA_6 */ | ||
322 | #define OMAP44XX_DMA_ISS_REQ1 9 /* S_DMA_8 */ | ||
323 | #define OMAP44XX_DMA_ISS_REQ2 10 /* S_DMA_9 */ | ||
324 | #define OMAP44XX_DMA_ISS_REQ3 12 /* S_DMA_11 */ | ||
325 | #define OMAP44XX_DMA_ISS_REQ4 13 /* S_DMA_12 */ | ||
326 | #define OMAP44XX_DMA_DSS_RFBI_REQ 14 /* S_DMA_13 */ | ||
327 | #define OMAP44XX_DMA_SPI3_TX0 15 /* S_DMA_14 */ | ||
328 | #define OMAP44XX_DMA_SPI3_RX0 16 /* S_DMA_15 */ | ||
329 | #define OMAP44XX_DMA_MCBSP2_TX 17 /* S_DMA_16 */ | ||
330 | #define OMAP44XX_DMA_MCBSP2_RX 18 /* S_DMA_17 */ | ||
331 | #define OMAP44XX_DMA_MCBSP3_TX 19 /* S_DMA_18 */ | ||
332 | #define OMAP44XX_DMA_MCBSP3_RX 20 /* S_DMA_19 */ | ||
333 | #define OMAP44XX_DMA_SPI3_TX1 23 /* S_DMA_22 */ | ||
334 | #define OMAP44XX_DMA_SPI3_RX1 24 /* S_DMA_23 */ | ||
335 | #define OMAP44XX_DMA_I2C3_TX 25 /* S_DMA_24 */ | ||
336 | #define OMAP44XX_DMA_I2C3_RX 26 /* S_DMA_25 */ | ||
337 | #define OMAP44XX_DMA_I2C1_TX 27 /* S_DMA_26 */ | ||
338 | #define OMAP44XX_DMA_I2C1_RX 28 /* S_DMA_27 */ | ||
339 | #define OMAP44XX_DMA_I2C2_TX 29 /* S_DMA_28 */ | ||
340 | #define OMAP44XX_DMA_I2C2_RX 30 /* S_DMA_29 */ | ||
341 | #define OMAP44XX_DMA_MCBSP4_TX 31 /* S_DMA_30 */ | ||
342 | #define OMAP44XX_DMA_MCBSP4_RX 32 /* S_DMA_31 */ | ||
343 | #define OMAP44XX_DMA_MCBSP1_TX 33 /* S_DMA_32 */ | ||
344 | #define OMAP44XX_DMA_MCBSP1_RX 34 /* S_DMA_33 */ | ||
345 | #define OMAP44XX_DMA_SPI1_TX0 35 /* S_DMA_34 */ | ||
346 | #define OMAP44XX_DMA_SPI1_RX0 36 /* S_DMA_35 */ | ||
347 | #define OMAP44XX_DMA_SPI1_TX1 37 /* S_DMA_36 */ | ||
348 | #define OMAP44XX_DMA_SPI1_RX1 38 /* S_DMA_37 */ | ||
349 | #define OMAP44XX_DMA_SPI1_TX2 39 /* S_DMA_38 */ | ||
350 | #define OMAP44XX_DMA_SPI1_RX2 40 /* S_DMA_39 */ | ||
351 | #define OMAP44XX_DMA_SPI1_TX3 41 /* S_DMA_40 */ | ||
352 | #define OMAP44XX_DMA_SPI1_RX3 42 /* S_DMA_41 */ | ||
353 | #define OMAP44XX_DMA_SPI2_TX0 43 /* S_DMA_42 */ | ||
354 | #define OMAP44XX_DMA_SPI2_RX0 44 /* S_DMA_43 */ | ||
355 | #define OMAP44XX_DMA_SPI2_TX1 45 /* S_DMA_44 */ | ||
356 | #define OMAP44XX_DMA_SPI2_RX1 46 /* S_DMA_45 */ | ||
357 | #define OMAP44XX_DMA_MMC2_TX 47 /* S_DMA_46 */ | ||
358 | #define OMAP44XX_DMA_MMC2_RX 48 /* S_DMA_47 */ | ||
359 | #define OMAP44XX_DMA_UART1_TX 49 /* S_DMA_48 */ | ||
360 | #define OMAP44XX_DMA_UART1_RX 50 /* S_DMA_49 */ | ||
361 | #define OMAP44XX_DMA_UART2_TX 51 /* S_DMA_50 */ | ||
362 | #define OMAP44XX_DMA_UART2_RX 52 /* S_DMA_51 */ | ||
363 | #define OMAP44XX_DMA_UART3_TX 53 /* S_DMA_52 */ | ||
364 | #define OMAP44XX_DMA_UART3_RX 54 /* S_DMA_53 */ | ||
365 | #define OMAP44XX_DMA_UART4_TX 55 /* S_DMA_54 */ | ||
366 | #define OMAP44XX_DMA_UART4_RX 56 /* S_DMA_55 */ | ||
367 | #define OMAP44XX_DMA_MMC4_TX 57 /* S_DMA_56 */ | ||
368 | #define OMAP44XX_DMA_MMC4_RX 58 /* S_DMA_57 */ | ||
369 | #define OMAP44XX_DMA_MMC5_TX 59 /* S_DMA_58 */ | ||
370 | #define OMAP44XX_DMA_MMC5_RX 60 /* S_DMA_59 */ | ||
371 | #define OMAP44XX_DMA_MMC1_TX 61 /* S_DMA_60 */ | ||
372 | #define OMAP44XX_DMA_MMC1_RX 62 /* S_DMA_61 */ | ||
373 | #define OMAP44XX_DMA_SYS_REQ3 64 /* S_DMA_63 */ | ||
374 | #define OMAP44XX_DMA_MCPDM_UP 65 /* S_DMA_64 */ | ||
375 | #define OMAP44XX_DMA_MCPDM_DL 66 /* S_DMA_65 */ | ||
376 | #define OMAP44XX_DMA_SPI4_TX0 70 /* S_DMA_69 */ | ||
377 | #define OMAP44XX_DMA_SPI4_RX0 71 /* S_DMA_70 */ | ||
378 | #define OMAP44XX_DMA_DSS_DSI1_REQ0 72 /* S_DMA_71 */ | ||
379 | #define OMAP44XX_DMA_DSS_DSI1_REQ1 73 /* S_DMA_72 */ | ||
380 | #define OMAP44XX_DMA_DSS_DSI1_REQ2 74 /* S_DMA_73 */ | ||
381 | #define OMAP44XX_DMA_DSS_DSI1_REQ3 75 /* S_DMA_74 */ | ||
382 | #define OMAP44XX_DMA_DSS_HDMI_REQ 76 /* S_DMA_75 */ | ||
383 | #define OMAP44XX_DMA_MMC3_TX 77 /* S_DMA_76 */ | ||
384 | #define OMAP44XX_DMA_MMC3_RX 78 /* S_DMA_77 */ | ||
385 | #define OMAP44XX_DMA_USIM_TX 79 /* S_DMA_78 */ | ||
386 | #define OMAP44XX_DMA_USIM_RX 80 /* S_DMA_79 */ | ||
387 | #define OMAP44XX_DMA_DSS_DSI2_REQ0 81 /* S_DMA_80 */ | ||
388 | #define OMAP44XX_DMA_DSS_DSI2_REQ1 82 /* S_DMA_81 */ | ||
389 | #define OMAP44XX_DMA_DSS_DSI2_REQ2 83 /* S_DMA_82 */ | ||
390 | #define OMAP44XX_DMA_DSS_DSI2_REQ3 84 /* S_DMA_83 */ | ||
391 | #define OMAP44XX_DMA_ABE_REQ0 101 /* S_DMA_100 */ | ||
392 | #define OMAP44XX_DMA_ABE_REQ1 102 /* S_DMA_101 */ | ||
393 | #define OMAP44XX_DMA_ABE_REQ2 103 /* S_DMA_102 */ | ||
394 | #define OMAP44XX_DMA_ABE_REQ3 104 /* S_DMA_103 */ | ||
395 | #define OMAP44XX_DMA_ABE_REQ4 105 /* S_DMA_104 */ | ||
396 | #define OMAP44XX_DMA_ABE_REQ5 106 /* S_DMA_105 */ | ||
397 | #define OMAP44XX_DMA_ABE_REQ6 107 /* S_DMA_106 */ | ||
398 | #define OMAP44XX_DMA_ABE_REQ7 108 /* S_DMA_107 */ | ||
399 | #define OMAP44XX_DMA_I2C4_TX 124 /* S_DMA_123 */ | ||
400 | #define OMAP44XX_DMA_I2C4_RX 125 /* S_DMA_124 */ | ||
401 | |||
314 | /*----------------------------------------------------------------------------*/ | 402 | /*----------------------------------------------------------------------------*/ |
315 | 403 | ||
316 | /* Hardware registers for LCD DMA */ | 404 | /* Hardware registers for LCD DMA */ |
diff --git a/arch/arm/plat-omap/include/mach/mcbsp.h b/arch/arm/plat-omap/include/mach/mcbsp.h index bb154ea76769..ec6f81e06d39 100644 --- a/arch/arm/plat-omap/include/mach/mcbsp.h +++ b/arch/arm/plat-omap/include/mach/mcbsp.h | |||
@@ -53,6 +53,11 @@ | |||
53 | #define OMAP34XX_MCBSP4_BASE 0x49026000 | 53 | #define OMAP34XX_MCBSP4_BASE 0x49026000 |
54 | #define OMAP34XX_MCBSP5_BASE 0x48096000 | 54 | #define OMAP34XX_MCBSP5_BASE 0x48096000 |
55 | 55 | ||
56 | #define OMAP44XX_MCBSP1_BASE 0x49022000 | ||
57 | #define OMAP44XX_MCBSP2_BASE 0x49024000 | ||
58 | #define OMAP44XX_MCBSP3_BASE 0x49026000 | ||
59 | #define OMAP44XX_MCBSP4_BASE 0x48074000 | ||
60 | |||
56 | #if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP730) | 61 | #if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP730) |
57 | 62 | ||
58 | #define OMAP_MCBSP_REG_DRR2 0x00 | 63 | #define OMAP_MCBSP_REG_DRR2 0x00 |
@@ -98,7 +103,8 @@ | |||
98 | #define AUDIO_DMA_TX OMAP_DMA_MCBSP1_TX | 103 | #define AUDIO_DMA_TX OMAP_DMA_MCBSP1_TX |
99 | #define AUDIO_DMA_RX OMAP_DMA_MCBSP1_RX | 104 | #define AUDIO_DMA_RX OMAP_DMA_MCBSP1_RX |
100 | 105 | ||
101 | #elif defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 106 | #elif defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
107 | defined(CONFIG_ARCH_OMAP4) | ||
102 | 108 | ||
103 | #define OMAP_MCBSP_REG_DRR2 0x00 | 109 | #define OMAP_MCBSP_REG_DRR2 0x00 |
104 | #define OMAP_MCBSP_REG_DRR1 0x04 | 110 | #define OMAP_MCBSP_REG_DRR1 0x04 |
diff --git a/arch/arm/plat-omap/include/mach/serial.h b/arch/arm/plat-omap/include/mach/serial.h index 13abd02d1527..def0529c75eb 100644 --- a/arch/arm/plat-omap/include/mach/serial.h +++ b/arch/arm/plat-omap/include/mach/serial.h | |||
@@ -59,6 +59,7 @@ extern void omap_uart_check_wakeup(void); | |||
59 | extern void omap_uart_prepare_suspend(void); | 59 | extern void omap_uart_prepare_suspend(void); |
60 | extern void omap_uart_prepare_idle(int num); | 60 | extern void omap_uart_prepare_idle(int num); |
61 | extern void omap_uart_resume_idle(int num); | 61 | extern void omap_uart_resume_idle(int num); |
62 | extern void omap_uart_enable_irqs(int enable); | ||
62 | #endif | 63 | #endif |
63 | 64 | ||
64 | #endif | 65 | #endif |
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index efa0e0111f38..e42fa7cfc795 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c | |||
@@ -191,7 +191,7 @@ void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg *config) | |||
191 | OMAP_MCBSP_WRITE(io_base, MCR2, config->mcr2); | 191 | OMAP_MCBSP_WRITE(io_base, MCR2, config->mcr2); |
192 | OMAP_MCBSP_WRITE(io_base, MCR1, config->mcr1); | 192 | OMAP_MCBSP_WRITE(io_base, MCR1, config->mcr1); |
193 | OMAP_MCBSP_WRITE(io_base, PCR0, config->pcr0); | 193 | OMAP_MCBSP_WRITE(io_base, PCR0, config->pcr0); |
194 | if (cpu_is_omap2430() || cpu_is_omap34xx()) { | 194 | if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { |
195 | OMAP_MCBSP_WRITE(io_base, XCCR, config->xccr); | 195 | OMAP_MCBSP_WRITE(io_base, XCCR, config->xccr); |
196 | OMAP_MCBSP_WRITE(io_base, RCCR, config->rccr); | 196 | OMAP_MCBSP_WRITE(io_base, RCCR, config->rccr); |
197 | } | 197 | } |
diff --git a/arch/arm/vfp/entry.S b/arch/arm/vfp/entry.S index a2bed62aec21..4fa9903b83cf 100644 --- a/arch/arm/vfp/entry.S +++ b/arch/arm/vfp/entry.S | |||
@@ -42,6 +42,7 @@ ENTRY(vfp_null_entry) | |||
42 | mov pc, lr | 42 | mov pc, lr |
43 | ENDPROC(vfp_null_entry) | 43 | ENDPROC(vfp_null_entry) |
44 | 44 | ||
45 | .align 2 | ||
45 | .LCvfp: | 46 | .LCvfp: |
46 | .word vfp_vector | 47 | .word vfp_vector |
47 | 48 | ||
@@ -61,6 +62,7 @@ ENTRY(vfp_testing_entry) | |||
61 | mov pc, r9 @ we have handled the fault | 62 | mov pc, r9 @ we have handled the fault |
62 | ENDPROC(vfp_testing_entry) | 63 | ENDPROC(vfp_testing_entry) |
63 | 64 | ||
65 | .align 2 | ||
64 | VFP_arch_address: | 66 | VFP_arch_address: |
65 | .word VFP_arch | 67 | .word VFP_arch |
66 | 68 | ||
diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S index 1aeae38725dd..66dc2d03b7fc 100644 --- a/arch/arm/vfp/vfphw.S +++ b/arch/arm/vfp/vfphw.S | |||
@@ -209,40 +209,55 @@ ENDPROC(vfp_save_state) | |||
209 | last_VFP_context_address: | 209 | last_VFP_context_address: |
210 | .word last_VFP_context | 210 | .word last_VFP_context |
211 | 211 | ||
212 | ENTRY(vfp_get_float) | 212 | .macro tbl_branch, base, tmp, shift |
213 | add pc, pc, r0, lsl #3 | 213 | #ifdef CONFIG_THUMB2_KERNEL |
214 | adr \tmp, 1f | ||
215 | add \tmp, \tmp, \base, lsl \shift | ||
216 | mov pc, \tmp | ||
217 | #else | ||
218 | add pc, pc, \base, lsl \shift | ||
214 | mov r0, r0 | 219 | mov r0, r0 |
220 | #endif | ||
221 | 1: | ||
222 | .endm | ||
223 | |||
224 | ENTRY(vfp_get_float) | ||
225 | tbl_branch r0, r3, #3 | ||
215 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | 226 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
216 | mrc p10, 0, r0, c\dr, c0, 0 @ fmrs r0, s0 | 227 | 1: mrc p10, 0, r0, c\dr, c0, 0 @ fmrs r0, s0 |
217 | mov pc, lr | 228 | mov pc, lr |
218 | mrc p10, 0, r0, c\dr, c0, 4 @ fmrs r0, s1 | 229 | .org 1b + 8 |
230 | 1: mrc p10, 0, r0, c\dr, c0, 4 @ fmrs r0, s1 | ||
219 | mov pc, lr | 231 | mov pc, lr |
232 | .org 1b + 8 | ||
220 | .endr | 233 | .endr |
221 | ENDPROC(vfp_get_float) | 234 | ENDPROC(vfp_get_float) |
222 | 235 | ||
223 | ENTRY(vfp_put_float) | 236 | ENTRY(vfp_put_float) |
224 | add pc, pc, r1, lsl #3 | 237 | tbl_branch r1, r3, #3 |
225 | mov r0, r0 | ||
226 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | 238 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
227 | mcr p10, 0, r0, c\dr, c0, 0 @ fmsr r0, s0 | 239 | 1: mcr p10, 0, r0, c\dr, c0, 0 @ fmsr r0, s0 |
228 | mov pc, lr | 240 | mov pc, lr |
229 | mcr p10, 0, r0, c\dr, c0, 4 @ fmsr r0, s1 | 241 | .org 1b + 8 |
242 | 1: mcr p10, 0, r0, c\dr, c0, 4 @ fmsr r0, s1 | ||
230 | mov pc, lr | 243 | mov pc, lr |
244 | .org 1b + 8 | ||
231 | .endr | 245 | .endr |
232 | ENDPROC(vfp_put_float) | 246 | ENDPROC(vfp_put_float) |
233 | 247 | ||
234 | ENTRY(vfp_get_double) | 248 | ENTRY(vfp_get_double) |
235 | add pc, pc, r0, lsl #3 | 249 | tbl_branch r0, r3, #3 |
236 | mov r0, r0 | ||
237 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | 250 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
238 | fmrrd r0, r1, d\dr | 251 | 1: fmrrd r0, r1, d\dr |
239 | mov pc, lr | 252 | mov pc, lr |
253 | .org 1b + 8 | ||
240 | .endr | 254 | .endr |
241 | #ifdef CONFIG_VFPv3 | 255 | #ifdef CONFIG_VFPv3 |
242 | @ d16 - d31 registers | 256 | @ d16 - d31 registers |
243 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | 257 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
244 | mrrc p11, 3, r0, r1, c\dr @ fmrrd r0, r1, d\dr | 258 | 1: mrrc p11, 3, r0, r1, c\dr @ fmrrd r0, r1, d\dr |
245 | mov pc, lr | 259 | mov pc, lr |
260 | .org 1b + 8 | ||
246 | .endr | 261 | .endr |
247 | #endif | 262 | #endif |
248 | 263 | ||
@@ -253,17 +268,18 @@ ENTRY(vfp_get_double) | |||
253 | ENDPROC(vfp_get_double) | 268 | ENDPROC(vfp_get_double) |
254 | 269 | ||
255 | ENTRY(vfp_put_double) | 270 | ENTRY(vfp_put_double) |
256 | add pc, pc, r2, lsl #3 | 271 | tbl_branch r2, r3, #3 |
257 | mov r0, r0 | ||
258 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | 272 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
259 | fmdrr d\dr, r0, r1 | 273 | 1: fmdrr d\dr, r0, r1 |
260 | mov pc, lr | 274 | mov pc, lr |
275 | .org 1b + 8 | ||
261 | .endr | 276 | .endr |
262 | #ifdef CONFIG_VFPv3 | 277 | #ifdef CONFIG_VFPv3 |
263 | @ d16 - d31 registers | 278 | @ d16 - d31 registers |
264 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | 279 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
265 | mcrr p11, 3, r1, r2, c\dr @ fmdrr r1, r2, d\dr | 280 | 1: mcrr p11, 3, r1, r2, c\dr @ fmdrr r1, r2, d\dr |
266 | mov pc, lr | 281 | mov pc, lr |
282 | .org 1b + 8 | ||
267 | .endr | 283 | .endr |
268 | #endif | 284 | #endif |
269 | ENDPROC(vfp_put_double) | 285 | ENDPROC(vfp_put_double) |
diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index 5d7b58f1fe42..7485afd0df4c 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c | |||
@@ -67,21 +67,8 @@ | |||
67 | #define UBIR 0xa4 /* BRM Incremental Register */ | 67 | #define UBIR 0xa4 /* BRM Incremental Register */ |
68 | #define UBMR 0xa8 /* BRM Modulator Register */ | 68 | #define UBMR 0xa8 /* BRM Modulator Register */ |
69 | #define UBRC 0xac /* Baud Rate Count Register */ | 69 | #define UBRC 0xac /* Baud Rate Count Register */ |
70 | #if defined CONFIG_ARCH_MX3 || defined CONFIG_ARCH_MX2 | 70 | #define MX2_ONEMS 0xb0 /* One Millisecond register */ |
71 | #define ONEMS 0xb0 /* One Millisecond register */ | 71 | #define UTS (cpu_is_mx1() ? 0xd0 : 0xb4) /* UART Test Register */ |
72 | #define UTS 0xb4 /* UART Test Register */ | ||
73 | #endif | ||
74 | #ifdef CONFIG_ARCH_MX1 | ||
75 | #define BIPR1 0xb0 /* Incremental Preset Register 1 */ | ||
76 | #define BIPR2 0xb4 /* Incremental Preset Register 2 */ | ||
77 | #define BIPR3 0xb8 /* Incremental Preset Register 3 */ | ||
78 | #define BIPR4 0xbc /* Incremental Preset Register 4 */ | ||
79 | #define BMPR1 0xc0 /* BRM Modulator Register 1 */ | ||
80 | #define BMPR2 0xc4 /* BRM Modulator Register 2 */ | ||
81 | #define BMPR3 0xc8 /* BRM Modulator Register 3 */ | ||
82 | #define BMPR4 0xcc /* BRM Modulator Register 4 */ | ||
83 | #define UTS 0xd0 /* UART Test Register */ | ||
84 | #endif | ||
85 | 72 | ||
86 | /* UART Control Register Bit Fields.*/ | 73 | /* UART Control Register Bit Fields.*/ |
87 | #define URXD_CHARRDY (1<<15) | 74 | #define URXD_CHARRDY (1<<15) |
@@ -101,12 +88,7 @@ | |||
101 | #define UCR1_RTSDEN (1<<5) /* RTS delta interrupt enable */ | 88 | #define UCR1_RTSDEN (1<<5) /* RTS delta interrupt enable */ |
102 | #define UCR1_SNDBRK (1<<4) /* Send break */ | 89 | #define UCR1_SNDBRK (1<<4) /* Send break */ |
103 | #define UCR1_TDMAEN (1<<3) /* Transmitter ready DMA enable */ | 90 | #define UCR1_TDMAEN (1<<3) /* Transmitter ready DMA enable */ |
104 | #ifdef CONFIG_ARCH_MX1 | 91 | #define MX1_UCR1_UARTCLKEN (1<<2) /* UART clock enabled, mx1 only */ |
105 | #define UCR1_UARTCLKEN (1<<2) /* UART clock enabled */ | ||
106 | #endif | ||
107 | #if defined CONFIG_ARCH_MX3 || defined CONFIG_ARCH_MX2 | ||
108 | #define UCR1_UARTCLKEN (0) /* not present on mx2/mx3 */ | ||
109 | #endif | ||
110 | #define UCR1_DOZE (1<<1) /* Doze */ | 92 | #define UCR1_DOZE (1<<1) /* Doze */ |
111 | #define UCR1_UARTEN (1<<0) /* UART enabled */ | 93 | #define UCR1_UARTEN (1<<0) /* UART enabled */ |
112 | #define UCR2_ESCI (1<<15) /* Escape seq interrupt enable */ | 94 | #define UCR2_ESCI (1<<15) /* Escape seq interrupt enable */ |
@@ -132,13 +114,9 @@ | |||
132 | #define UCR3_RXDSEN (1<<6) /* Receive status interrupt enable */ | 114 | #define UCR3_RXDSEN (1<<6) /* Receive status interrupt enable */ |
133 | #define UCR3_AIRINTEN (1<<5) /* Async IR wake interrupt enable */ | 115 | #define UCR3_AIRINTEN (1<<5) /* Async IR wake interrupt enable */ |
134 | #define UCR3_AWAKEN (1<<4) /* Async wake interrupt enable */ | 116 | #define UCR3_AWAKEN (1<<4) /* Async wake interrupt enable */ |
135 | #ifdef CONFIG_ARCH_MX1 | 117 | #define MX1_UCR3_REF25 (1<<3) /* Ref freq 25 MHz, only on mx1 */ |
136 | #define UCR3_REF25 (1<<3) /* Ref freq 25 MHz, only on mx1 */ | 118 | #define MX1_UCR3_REF30 (1<<2) /* Ref Freq 30 MHz, only on mx1 */ |
137 | #define UCR3_REF30 (1<<2) /* Ref Freq 30 MHz, only on mx1 */ | 119 | #define MX2_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select, on mx2/mx3 */ |
138 | #endif | ||
139 | #if defined CONFIG_ARCH_MX2 || defined CONFIG_ARCH_MX3 | ||
140 | #define UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select, on mx2/mx3 */ | ||
141 | #endif | ||
142 | #define UCR3_INVT (1<<1) /* Inverted Infrared transmission */ | 120 | #define UCR3_INVT (1<<1) /* Inverted Infrared transmission */ |
143 | #define UCR3_BPEN (1<<0) /* Preset registers enable */ | 121 | #define UCR3_BPEN (1<<0) /* Preset registers enable */ |
144 | #define UCR4_CTSTL_32 (32<<10) /* CTS trigger level (32 chars) */ | 122 | #define UCR4_CTSTL_32 (32<<10) /* CTS trigger level (32 chars) */ |
@@ -186,12 +164,10 @@ | |||
186 | #define UTS_SOFTRST (1<<0) /* Software reset */ | 164 | #define UTS_SOFTRST (1<<0) /* Software reset */ |
187 | 165 | ||
188 | /* We've been assigned a range on the "Low-density serial ports" major */ | 166 | /* We've been assigned a range on the "Low-density serial ports" major */ |
189 | #ifdef CONFIG_ARCH_MXC | ||
190 | #define SERIAL_IMX_MAJOR 207 | 167 | #define SERIAL_IMX_MAJOR 207 |
191 | #define MINOR_START 16 | 168 | #define MINOR_START 16 |
192 | #define DEV_NAME "ttymxc" | 169 | #define DEV_NAME "ttymxc" |
193 | #define MAX_INTERNAL_IRQ MXC_INTERNAL_IRQS | 170 | #define MAX_INTERNAL_IRQ MXC_INTERNAL_IRQS |
194 | #endif | ||
195 | 171 | ||
196 | /* | 172 | /* |
197 | * This determines how often we check the modem status signals | 173 | * This determines how often we check the modem status signals |
@@ -706,11 +682,11 @@ static int imx_startup(struct uart_port *port) | |||
706 | } | 682 | } |
707 | } | 683 | } |
708 | 684 | ||
709 | #if defined CONFIG_ARCH_MX2 || defined CONFIG_ARCH_MX3 | 685 | if (!cpu_is_mx1()) { |
710 | temp = readl(sport->port.membase + UCR3); | 686 | temp = readl(sport->port.membase + UCR3); |
711 | temp |= UCR3_RXDMUXSEL; | 687 | temp |= MX2_UCR3_RXDMUXSEL; |
712 | writel(temp, sport->port.membase + UCR3); | 688 | writel(temp, sport->port.membase + UCR3); |
713 | #endif | 689 | } |
714 | 690 | ||
715 | if (USE_IRDA(sport)) { | 691 | if (USE_IRDA(sport)) { |
716 | temp = readl(sport->port.membase + UCR4); | 692 | temp = readl(sport->port.membase + UCR4); |
@@ -942,9 +918,9 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios, | |||
942 | writel(num, sport->port.membase + UBIR); | 918 | writel(num, sport->port.membase + UBIR); |
943 | writel(denom, sport->port.membase + UBMR); | 919 | writel(denom, sport->port.membase + UBMR); |
944 | 920 | ||
945 | #ifdef ONEMS | 921 | if (!cpu_is_mx1()) |
946 | writel(sport->port.uartclk / div / 1000, sport->port.membase + ONEMS); | 922 | writel(sport->port.uartclk / div / 1000, |
947 | #endif | 923 | sport->port.membase + MX2_ONEMS); |
948 | 924 | ||
949 | writel(old_ucr1, sport->port.membase + UCR1); | 925 | writel(old_ucr1, sport->port.membase + UCR1); |
950 | 926 | ||
@@ -1074,17 +1050,20 @@ static void | |||
1074 | imx_console_write(struct console *co, const char *s, unsigned int count) | 1050 | imx_console_write(struct console *co, const char *s, unsigned int count) |
1075 | { | 1051 | { |
1076 | struct imx_port *sport = imx_ports[co->index]; | 1052 | struct imx_port *sport = imx_ports[co->index]; |
1077 | unsigned int old_ucr1, old_ucr2; | 1053 | unsigned int old_ucr1, old_ucr2, ucr1; |
1078 | 1054 | ||
1079 | /* | 1055 | /* |
1080 | * First, save UCR1/2 and then disable interrupts | 1056 | * First, save UCR1/2 and then disable interrupts |
1081 | */ | 1057 | */ |
1082 | old_ucr1 = readl(sport->port.membase + UCR1); | 1058 | ucr1 = old_ucr1 = readl(sport->port.membase + UCR1); |
1083 | old_ucr2 = readl(sport->port.membase + UCR2); | 1059 | old_ucr2 = readl(sport->port.membase + UCR2); |
1084 | 1060 | ||
1085 | writel((old_ucr1 | UCR1_UARTCLKEN | UCR1_UARTEN) & | 1061 | if (cpu_is_mx1()) |
1086 | ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN), | 1062 | ucr1 |= MX1_UCR1_UARTCLKEN; |
1087 | sport->port.membase + UCR1); | 1063 | ucr1 |= UCR1_UARTEN; |
1064 | ucr1 &= ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN); | ||
1065 | |||
1066 | writel(ucr1, sport->port.membase + UCR1); | ||
1088 | 1067 | ||
1089 | writel(old_ucr2 | UCR2_TXEN, sport->port.membase + UCR2); | 1068 | writel(old_ucr2 | UCR2_TXEN, sport->port.membase + UCR2); |
1090 | 1069 | ||
diff --git a/drivers/video/imxfb.c b/drivers/video/imxfb.c index 15a0ee6d8e23..30ae3022f633 100644 --- a/drivers/video/imxfb.c +++ b/drivers/video/imxfb.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/math64.h> | 33 | #include <linux/math64.h> |
34 | 34 | ||
35 | #include <mach/imxfb.h> | 35 | #include <mach/imxfb.h> |
36 | #include <mach/hardware.h> | ||
36 | 37 | ||
37 | /* | 38 | /* |
38 | * Complain if VAR is out of range. | 39 | * Complain if VAR is out of range. |
@@ -129,6 +130,10 @@ | |||
129 | #define LCDISR_EOF (1<<1) | 130 | #define LCDISR_EOF (1<<1) |
130 | #define LCDISR_BOF (1<<0) | 131 | #define LCDISR_BOF (1<<0) |
131 | 132 | ||
133 | /* Used fb-mode. Can be set on kernel command line, therefore file-static. */ | ||
134 | static const char *fb_mode; | ||
135 | |||
136 | |||
132 | /* | 137 | /* |
133 | * These are the bitfields for each | 138 | * These are the bitfields for each |
134 | * display depth that we support. | 139 | * display depth that we support. |
@@ -145,10 +150,6 @@ struct imxfb_info { | |||
145 | void __iomem *regs; | 150 | void __iomem *regs; |
146 | struct clk *clk; | 151 | struct clk *clk; |
147 | 152 | ||
148 | u_int max_bpp; | ||
149 | u_int max_xres; | ||
150 | u_int max_yres; | ||
151 | |||
152 | /* | 153 | /* |
153 | * These are the addresses we mapped | 154 | * These are the addresses we mapped |
154 | * the framebuffer memory region to. | 155 | * the framebuffer memory region to. |
@@ -172,6 +173,9 @@ struct imxfb_info { | |||
172 | cmap_static:1, | 173 | cmap_static:1, |
173 | unused:30; | 174 | unused:30; |
174 | 175 | ||
176 | struct imx_fb_videomode *mode; | ||
177 | int num_modes; | ||
178 | |||
175 | void (*lcd_power)(int); | 179 | void (*lcd_power)(int); |
176 | void (*backlight_power)(int); | 180 | void (*backlight_power)(int); |
177 | }; | 181 | }; |
@@ -298,6 +302,18 @@ static int imxfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
298 | return ret; | 302 | return ret; |
299 | } | 303 | } |
300 | 304 | ||
305 | static const struct imx_fb_videomode *imxfb_find_mode(struct imxfb_info *fbi) | ||
306 | { | ||
307 | struct imx_fb_videomode *m; | ||
308 | int i; | ||
309 | |||
310 | for (i = 0, m = &fbi->mode[0]; i < fbi->num_modes; i++, m++) { | ||
311 | if (!strcmp(m->mode.name, fb_mode)) | ||
312 | return m; | ||
313 | } | ||
314 | return NULL; | ||
315 | } | ||
316 | |||
301 | /* | 317 | /* |
302 | * imxfb_check_var(): | 318 | * imxfb_check_var(): |
303 | * Round up in the following order: bits_per_pixel, xres, | 319 | * Round up in the following order: bits_per_pixel, xres, |
@@ -308,35 +324,81 @@ static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |||
308 | { | 324 | { |
309 | struct imxfb_info *fbi = info->par; | 325 | struct imxfb_info *fbi = info->par; |
310 | struct imxfb_rgb *rgb; | 326 | struct imxfb_rgb *rgb; |
327 | const struct imx_fb_videomode *imxfb_mode; | ||
328 | unsigned long lcd_clk; | ||
329 | unsigned long long tmp; | ||
330 | u32 pcr = 0; | ||
311 | 331 | ||
312 | if (var->xres < MIN_XRES) | 332 | if (var->xres < MIN_XRES) |
313 | var->xres = MIN_XRES; | 333 | var->xres = MIN_XRES; |
314 | if (var->yres < MIN_YRES) | 334 | if (var->yres < MIN_YRES) |
315 | var->yres = MIN_YRES; | 335 | var->yres = MIN_YRES; |
316 | if (var->xres > fbi->max_xres) | 336 | |
317 | var->xres = fbi->max_xres; | 337 | imxfb_mode = imxfb_find_mode(fbi); |
318 | if (var->yres > fbi->max_yres) | 338 | if (!imxfb_mode) |
319 | var->yres = fbi->max_yres; | 339 | return -EINVAL; |
320 | var->xres_virtual = max(var->xres_virtual, var->xres); | 340 | |
321 | var->yres_virtual = max(var->yres_virtual, var->yres); | 341 | var->xres = imxfb_mode->mode.xres; |
342 | var->yres = imxfb_mode->mode.yres; | ||
343 | var->bits_per_pixel = imxfb_mode->bpp; | ||
344 | var->pixclock = imxfb_mode->mode.pixclock; | ||
345 | var->hsync_len = imxfb_mode->mode.hsync_len; | ||
346 | var->left_margin = imxfb_mode->mode.left_margin; | ||
347 | var->right_margin = imxfb_mode->mode.right_margin; | ||
348 | var->vsync_len = imxfb_mode->mode.vsync_len; | ||
349 | var->upper_margin = imxfb_mode->mode.upper_margin; | ||
350 | var->lower_margin = imxfb_mode->mode.lower_margin; | ||
351 | var->sync = imxfb_mode->mode.sync; | ||
352 | var->xres_virtual = max(var->xres_virtual, var->xres); | ||
353 | var->yres_virtual = max(var->yres_virtual, var->yres); | ||
322 | 354 | ||
323 | pr_debug("var->bits_per_pixel=%d\n", var->bits_per_pixel); | 355 | pr_debug("var->bits_per_pixel=%d\n", var->bits_per_pixel); |
356 | |||
357 | lcd_clk = clk_get_rate(fbi->clk); | ||
358 | |||
359 | tmp = var->pixclock * (unsigned long long)lcd_clk; | ||
360 | |||
361 | do_div(tmp, 1000000); | ||
362 | |||
363 | if (do_div(tmp, 1000000) > 500000) | ||
364 | tmp++; | ||
365 | |||
366 | pcr = (unsigned int)tmp; | ||
367 | |||
368 | if (--pcr > 0x3F) { | ||
369 | pcr = 0x3F; | ||
370 | printk(KERN_WARNING "Must limit pixel clock to %luHz\n", | ||
371 | lcd_clk / pcr); | ||
372 | } | ||
373 | |||
324 | switch (var->bits_per_pixel) { | 374 | switch (var->bits_per_pixel) { |
325 | case 32: | 375 | case 32: |
376 | pcr |= PCR_BPIX_18; | ||
326 | rgb = &def_rgb_18; | 377 | rgb = &def_rgb_18; |
327 | break; | 378 | break; |
328 | case 16: | 379 | case 16: |
329 | default: | 380 | default: |
330 | if (fbi->pcr & PCR_TFT) | 381 | if (cpu_is_mx1()) |
382 | pcr |= PCR_BPIX_12; | ||
383 | else | ||
384 | pcr |= PCR_BPIX_16; | ||
385 | |||
386 | if (imxfb_mode->pcr & PCR_TFT) | ||
331 | rgb = &def_rgb_16_tft; | 387 | rgb = &def_rgb_16_tft; |
332 | else | 388 | else |
333 | rgb = &def_rgb_16_stn; | 389 | rgb = &def_rgb_16_stn; |
334 | break; | 390 | break; |
335 | case 8: | 391 | case 8: |
392 | pcr |= PCR_BPIX_8; | ||
336 | rgb = &def_rgb_8; | 393 | rgb = &def_rgb_8; |
337 | break; | 394 | break; |
338 | } | 395 | } |
339 | 396 | ||
397 | /* add sync polarities */ | ||
398 | pcr |= imxfb_mode->pcr & ~(0x3f | (7 << 25)); | ||
399 | |||
400 | fbi->pcr = pcr; | ||
401 | |||
340 | /* | 402 | /* |
341 | * Copy the RGB parameters for this display | 403 | * Copy the RGB parameters for this display |
342 | * from the machine specific parameters. | 404 | * from the machine specific parameters. |
@@ -393,10 +455,6 @@ static void imxfb_enable_controller(struct imxfb_info *fbi) | |||
393 | 455 | ||
394 | writel(fbi->screen_dma, fbi->regs + LCDC_SSA); | 456 | writel(fbi->screen_dma, fbi->regs + LCDC_SSA); |
395 | 457 | ||
396 | /* physical screen start address */ | ||
397 | writel(VPW_VPW(fbi->max_xres * fbi->max_bpp / 8 / 4), | ||
398 | fbi->regs + LCDC_VPW); | ||
399 | |||
400 | /* panning offset 0 (0 pixel offset) */ | 458 | /* panning offset 0 (0 pixel offset) */ |
401 | writel(0x00000000, fbi->regs + LCDC_POS); | 459 | writel(0x00000000, fbi->regs + LCDC_POS); |
402 | 460 | ||
@@ -468,8 +526,6 @@ static struct fb_ops imxfb_ops = { | |||
468 | static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info) | 526 | static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info) |
469 | { | 527 | { |
470 | struct imxfb_info *fbi = info->par; | 528 | struct imxfb_info *fbi = info->par; |
471 | unsigned int pcr, lcd_clk; | ||
472 | unsigned long long tmp; | ||
473 | 529 | ||
474 | pr_debug("var: xres=%d hslen=%d lm=%d rm=%d\n", | 530 | pr_debug("var: xres=%d hslen=%d lm=%d rm=%d\n", |
475 | var->xres, var->hsync_len, | 531 | var->xres, var->hsync_len, |
@@ -505,6 +561,10 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf | |||
505 | info->fix.id, var->lower_margin); | 561 | info->fix.id, var->lower_margin); |
506 | #endif | 562 | #endif |
507 | 563 | ||
564 | /* physical screen start address */ | ||
565 | writel(VPW_VPW(var->xres * var->bits_per_pixel / 8 / 4), | ||
566 | fbi->regs + LCDC_VPW); | ||
567 | |||
508 | writel(HCR_H_WIDTH(var->hsync_len - 1) | | 568 | writel(HCR_H_WIDTH(var->hsync_len - 1) | |
509 | HCR_H_WAIT_1(var->right_margin - 1) | | 569 | HCR_H_WAIT_1(var->right_margin - 1) | |
510 | HCR_H_WAIT_2(var->left_margin - 3), | 570 | HCR_H_WAIT_2(var->left_margin - 3), |
@@ -518,22 +578,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf | |||
518 | writel(SIZE_XMAX(var->xres) | SIZE_YMAX(var->yres), | 578 | writel(SIZE_XMAX(var->xres) | SIZE_YMAX(var->yres), |
519 | fbi->regs + LCDC_SIZE); | 579 | fbi->regs + LCDC_SIZE); |
520 | 580 | ||
521 | lcd_clk = clk_get_rate(fbi->clk); | 581 | writel(fbi->pcr, fbi->regs + LCDC_PCR); |
522 | tmp = var->pixclock * (unsigned long long)lcd_clk; | ||
523 | do_div(tmp, 1000000); | ||
524 | if (do_div(tmp, 1000000) > 500000) | ||
525 | tmp++; | ||
526 | pcr = (unsigned int)tmp; | ||
527 | if (--pcr > 0x3F) { | ||
528 | pcr = 0x3F; | ||
529 | printk(KERN_WARNING "Must limit pixel clock to %uHz\n", | ||
530 | lcd_clk / pcr); | ||
531 | } | ||
532 | |||
533 | /* add sync polarities */ | ||
534 | pcr |= fbi->pcr & ~0x3F; | ||
535 | |||
536 | writel(pcr, fbi->regs + LCDC_PCR); | ||
537 | writel(fbi->pwmr, fbi->regs + LCDC_PWMR); | 582 | writel(fbi->pwmr, fbi->regs + LCDC_PWMR); |
538 | writel(fbi->lscr1, fbi->regs + LCDC_LSCR1); | 583 | writel(fbi->lscr1, fbi->regs + LCDC_LSCR1); |
539 | writel(fbi->dmacr, fbi->regs + LCDC_DMACR); | 584 | writel(fbi->dmacr, fbi->regs + LCDC_DMACR); |
@@ -575,6 +620,8 @@ static int __init imxfb_init_fbinfo(struct platform_device *pdev) | |||
575 | struct imx_fb_platform_data *pdata = pdev->dev.platform_data; | 620 | struct imx_fb_platform_data *pdata = pdev->dev.platform_data; |
576 | struct fb_info *info = dev_get_drvdata(&pdev->dev); | 621 | struct fb_info *info = dev_get_drvdata(&pdev->dev); |
577 | struct imxfb_info *fbi = info->par; | 622 | struct imxfb_info *fbi = info->par; |
623 | struct imx_fb_videomode *m; | ||
624 | int i; | ||
578 | 625 | ||
579 | pr_debug("%s\n",__func__); | 626 | pr_debug("%s\n",__func__); |
580 | 627 | ||
@@ -603,35 +650,18 @@ static int __init imxfb_init_fbinfo(struct platform_device *pdev) | |||
603 | info->fbops = &imxfb_ops; | 650 | info->fbops = &imxfb_ops; |
604 | info->flags = FBINFO_FLAG_DEFAULT | | 651 | info->flags = FBINFO_FLAG_DEFAULT | |
605 | FBINFO_READS_FAST; | 652 | FBINFO_READS_FAST; |
606 | |||
607 | fbi->max_xres = pdata->xres; | ||
608 | info->var.xres = pdata->xres; | ||
609 | info->var.xres_virtual = pdata->xres; | ||
610 | fbi->max_yres = pdata->yres; | ||
611 | info->var.yres = pdata->yres; | ||
612 | info->var.yres_virtual = pdata->yres; | ||
613 | fbi->max_bpp = pdata->bpp; | ||
614 | info->var.bits_per_pixel = pdata->bpp; | ||
615 | info->var.nonstd = pdata->nonstd; | ||
616 | info->var.pixclock = pdata->pixclock; | ||
617 | info->var.hsync_len = pdata->hsync_len; | ||
618 | info->var.left_margin = pdata->left_margin; | ||
619 | info->var.right_margin = pdata->right_margin; | ||
620 | info->var.vsync_len = pdata->vsync_len; | ||
621 | info->var.upper_margin = pdata->upper_margin; | ||
622 | info->var.lower_margin = pdata->lower_margin; | ||
623 | info->var.sync = pdata->sync; | ||
624 | info->var.grayscale = pdata->cmap_greyscale; | 653 | info->var.grayscale = pdata->cmap_greyscale; |
625 | fbi->cmap_inverse = pdata->cmap_inverse; | 654 | fbi->cmap_inverse = pdata->cmap_inverse; |
626 | fbi->cmap_static = pdata->cmap_static; | 655 | fbi->cmap_static = pdata->cmap_static; |
627 | fbi->pcr = pdata->pcr; | ||
628 | fbi->lscr1 = pdata->lscr1; | 656 | fbi->lscr1 = pdata->lscr1; |
629 | fbi->dmacr = pdata->dmacr; | 657 | fbi->dmacr = pdata->dmacr; |
630 | fbi->pwmr = pdata->pwmr; | 658 | fbi->pwmr = pdata->pwmr; |
631 | fbi->lcd_power = pdata->lcd_power; | 659 | fbi->lcd_power = pdata->lcd_power; |
632 | fbi->backlight_power = pdata->backlight_power; | 660 | fbi->backlight_power = pdata->backlight_power; |
633 | info->fix.smem_len = fbi->max_xres * fbi->max_yres * | 661 | |
634 | fbi->max_bpp / 8; | 662 | for (i = 0, m = &pdata->mode[0]; i < pdata->num_modes; i++, m++) |
663 | info->fix.smem_len = max_t(size_t, info->fix.smem_len, | ||
664 | m->mode.xres * m->mode.yres * m->bpp / 8); | ||
635 | 665 | ||
636 | return 0; | 666 | return 0; |
637 | } | 667 | } |
@@ -642,9 +672,9 @@ static int __init imxfb_probe(struct platform_device *pdev) | |||
642 | struct fb_info *info; | 672 | struct fb_info *info; |
643 | struct imx_fb_platform_data *pdata; | 673 | struct imx_fb_platform_data *pdata; |
644 | struct resource *res; | 674 | struct resource *res; |
645 | int ret; | 675 | int ret, i; |
646 | 676 | ||
647 | printk("i.MX Framebuffer driver\n"); | 677 | dev_info(&pdev->dev, "i.MX Framebuffer driver\n"); |
648 | 678 | ||
649 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 679 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
650 | if (!res) | 680 | if (!res) |
@@ -662,6 +692,9 @@ static int __init imxfb_probe(struct platform_device *pdev) | |||
662 | 692 | ||
663 | fbi = info->par; | 693 | fbi = info->par; |
664 | 694 | ||
695 | if (!fb_mode) | ||
696 | fb_mode = pdata->mode[0].mode.name; | ||
697 | |||
665 | platform_set_drvdata(pdev, info); | 698 | platform_set_drvdata(pdev, info); |
666 | 699 | ||
667 | ret = imxfb_init_fbinfo(pdev); | 700 | ret = imxfb_init_fbinfo(pdev); |
@@ -684,7 +717,7 @@ static int __init imxfb_probe(struct platform_device *pdev) | |||
684 | 717 | ||
685 | fbi->regs = ioremap(res->start, resource_size(res)); | 718 | fbi->regs = ioremap(res->start, resource_size(res)); |
686 | if (fbi->regs == NULL) { | 719 | if (fbi->regs == NULL) { |
687 | printk(KERN_ERR"Cannot map frame buffer registers\n"); | 720 | dev_err(&pdev->dev, "Cannot map frame buffer registers\n"); |
688 | goto failed_ioremap; | 721 | goto failed_ioremap; |
689 | } | 722 | } |
690 | 723 | ||
@@ -719,6 +752,13 @@ static int __init imxfb_probe(struct platform_device *pdev) | |||
719 | goto failed_platform_init; | 752 | goto failed_platform_init; |
720 | } | 753 | } |
721 | 754 | ||
755 | fbi->mode = pdata->mode; | ||
756 | fbi->num_modes = pdata->num_modes; | ||
757 | |||
758 | INIT_LIST_HEAD(&info->modelist); | ||
759 | for (i = 0; i < pdata->num_modes; i++) | ||
760 | fb_add_videomode(&pdata->mode[i].mode, &info->modelist); | ||
761 | |||
722 | /* | 762 | /* |
723 | * This makes sure that our colour bitfield | 763 | * This makes sure that our colour bitfield |
724 | * descriptors are correctly initialised. | 764 | * descriptors are correctly initialised. |
@@ -754,7 +794,7 @@ failed_map: | |||
754 | failed_getclock: | 794 | failed_getclock: |
755 | iounmap(fbi->regs); | 795 | iounmap(fbi->regs); |
756 | failed_ioremap: | 796 | failed_ioremap: |
757 | release_mem_region(res->start, res->end - res->start); | 797 | release_mem_region(res->start, resource_size(res)); |
758 | failed_req: | 798 | failed_req: |
759 | kfree(info->pseudo_palette); | 799 | kfree(info->pseudo_palette); |
760 | failed_init: | 800 | failed_init: |
@@ -785,7 +825,7 @@ static int __devexit imxfb_remove(struct platform_device *pdev) | |||
785 | framebuffer_release(info); | 825 | framebuffer_release(info); |
786 | 826 | ||
787 | iounmap(fbi->regs); | 827 | iounmap(fbi->regs); |
788 | release_mem_region(res->start, res->end - res->start + 1); | 828 | release_mem_region(res->start, resource_size(res)); |
789 | clk_disable(fbi->clk); | 829 | clk_disable(fbi->clk); |
790 | clk_put(fbi->clk); | 830 | clk_put(fbi->clk); |
791 | 831 | ||
@@ -811,8 +851,34 @@ static struct platform_driver imxfb_driver = { | |||
811 | }, | 851 | }, |
812 | }; | 852 | }; |
813 | 853 | ||
854 | static int imxfb_setup(void) | ||
855 | { | ||
856 | #ifndef MODULE | ||
857 | char *opt, *options = NULL; | ||
858 | |||
859 | if (fb_get_options("imxfb", &options)) | ||
860 | return -ENODEV; | ||
861 | |||
862 | if (!options || !*options) | ||
863 | return 0; | ||
864 | |||
865 | while ((opt = strsep(&options, ",")) != NULL) { | ||
866 | if (!*opt) | ||
867 | continue; | ||
868 | else | ||
869 | fb_mode = opt; | ||
870 | } | ||
871 | #endif | ||
872 | return 0; | ||
873 | } | ||
874 | |||
814 | int __init imxfb_init(void) | 875 | int __init imxfb_init(void) |
815 | { | 876 | { |
877 | int ret = imxfb_setup(); | ||
878 | |||
879 | if (ret < 0) | ||
880 | return ret; | ||
881 | |||
816 | return platform_driver_probe(&imxfb_driver, imxfb_probe); | 882 | return platform_driver_probe(&imxfb_driver, imxfb_probe); |
817 | } | 883 | } |
818 | 884 | ||