diff options
288 files changed, 9133 insertions, 4429 deletions
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 2121fbb2ff4c..05cef5061293 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -13,7 +13,6 @@ config SUPERH | |||
13 | select HAVE_LMB | 13 | select HAVE_LMB |
14 | select HAVE_OPROFILE | 14 | select HAVE_OPROFILE |
15 | select HAVE_GENERIC_DMA_COHERENT | 15 | select HAVE_GENERIC_DMA_COHERENT |
16 | select HAVE_IOREMAP_PROT if MMU | ||
17 | select HAVE_ARCH_TRACEHOOK | 16 | select HAVE_ARCH_TRACEHOOK |
18 | select HAVE_DMA_API_DEBUG | 17 | select HAVE_DMA_API_DEBUG |
19 | select HAVE_DMA_ATTRS | 18 | select HAVE_DMA_ATTRS |
@@ -22,6 +21,7 @@ config SUPERH | |||
22 | select HAVE_KERNEL_GZIP | 21 | select HAVE_KERNEL_GZIP |
23 | select HAVE_KERNEL_BZIP2 | 22 | select HAVE_KERNEL_BZIP2 |
24 | select HAVE_KERNEL_LZMA | 23 | select HAVE_KERNEL_LZMA |
24 | select HAVE_KERNEL_LZO | ||
25 | select HAVE_SYSCALL_TRACEPOINTS | 25 | select HAVE_SYSCALL_TRACEPOINTS |
26 | select RTC_LIB | 26 | select RTC_LIB |
27 | select GENERIC_ATOMIC64 | 27 | select GENERIC_ATOMIC64 |
@@ -35,6 +35,7 @@ config SUPERH32 | |||
35 | def_bool ARCH = "sh" | 35 | def_bool ARCH = "sh" |
36 | select HAVE_KPROBES | 36 | select HAVE_KPROBES |
37 | select HAVE_KRETPROBES | 37 | select HAVE_KRETPROBES |
38 | select HAVE_IOREMAP_PROT if MMU && !X2TLB | ||
38 | select HAVE_FUNCTION_TRACER | 39 | select HAVE_FUNCTION_TRACER |
39 | select HAVE_FTRACE_MCOUNT_RECORD | 40 | select HAVE_FTRACE_MCOUNT_RECORD |
40 | select HAVE_DYNAMIC_FTRACE | 41 | select HAVE_DYNAMIC_FTRACE |
@@ -42,6 +43,8 @@ config SUPERH32 | |||
42 | select HAVE_FTRACE_NMI_ENTER if DYNAMIC_FTRACE | 43 | select HAVE_FTRACE_NMI_ENTER if DYNAMIC_FTRACE |
43 | select HAVE_FUNCTION_GRAPH_TRACER | 44 | select HAVE_FUNCTION_GRAPH_TRACER |
44 | select HAVE_ARCH_KGDB | 45 | select HAVE_ARCH_KGDB |
46 | select HAVE_HW_BREAKPOINT | ||
47 | select PERF_EVENTS if HAVE_HW_BREAKPOINT | ||
45 | select ARCH_HIBERNATION_POSSIBLE if MMU | 48 | select ARCH_HIBERNATION_POSSIBLE if MMU |
46 | 49 | ||
47 | config SUPERH64 | 50 | config SUPERH64 |
@@ -78,11 +81,12 @@ config GENERIC_HARDIRQS | |||
78 | config GENERIC_HARDIRQS_NO__DO_IRQ | 81 | config GENERIC_HARDIRQS_NO__DO_IRQ |
79 | def_bool y | 82 | def_bool y |
80 | 83 | ||
81 | config GENERIC_IRQ_PROBE | 84 | config IRQ_PER_CPU |
82 | def_bool y | 85 | def_bool y |
83 | 86 | ||
84 | config IRQ_PER_CPU | 87 | config SPARSE_IRQ |
85 | def_bool y | 88 | def_bool y |
89 | depends on SUPERH32 | ||
86 | 90 | ||
87 | config GENERIC_GPIO | 91 | config GENERIC_GPIO |
88 | def_bool n | 92 | def_bool n |
@@ -548,8 +552,7 @@ config SH_PCLK_FREQ | |||
548 | CPU_SUBTYPE_SH7203 || \ | 552 | CPU_SUBTYPE_SH7203 || \ |
549 | CPU_SUBTYPE_SH7206 || \ | 553 | CPU_SUBTYPE_SH7206 || \ |
550 | CPU_SUBTYPE_SH7263 || \ | 554 | CPU_SUBTYPE_SH7263 || \ |
551 | CPU_SUBTYPE_MXG || \ | 555 | CPU_SUBTYPE_MXG |
552 | CPU_SUBTYPE_SH7786 | ||
553 | default "60000000" if CPU_SUBTYPE_SH7751 || CPU_SUBTYPE_SH7751R | 556 | default "60000000" if CPU_SUBTYPE_SH7751 || CPU_SUBTYPE_SH7751R |
554 | default "66000000" if CPU_SUBTYPE_SH4_202 | 557 | default "66000000" if CPU_SUBTYPE_SH4_202 |
555 | default "50000000" | 558 | default "50000000" |
@@ -563,7 +566,8 @@ config SH_CLK_CPG | |||
563 | 566 | ||
564 | config SH_CLK_CPG_LEGACY | 567 | config SH_CLK_CPG_LEGACY |
565 | depends on SH_CLK_CPG | 568 | depends on SH_CLK_CPG |
566 | def_bool y if !CPU_SUBTYPE_SH7785 && !ARCH_SHMOBILE | 569 | def_bool y if !CPU_SUBTYPE_SH7785 && !ARCH_SHMOBILE && \ |
570 | !CPU_SUBTYPE_SH7786 | ||
567 | 571 | ||
568 | config SH_CLK_MD | 572 | config SH_CLK_MD |
569 | int "CPU Mode Pin Setting" | 573 | int "CPU Mode Pin Setting" |
@@ -725,18 +729,6 @@ config GUSA_RB | |||
725 | LLSC, this should be more efficient than the other alternative of | 729 | LLSC, this should be more efficient than the other alternative of |
726 | disabling interrupts around the atomic sequence. | 730 | disabling interrupts around the atomic sequence. |
727 | 731 | ||
728 | config SPARSE_IRQ | ||
729 | bool "Support sparse irq numbering" | ||
730 | depends on EXPERIMENTAL | ||
731 | help | ||
732 | This enables support for sparse irqs. This is useful in general | ||
733 | as most CPUs have a fairly sparse array of IRQ vectors, which | ||
734 | the irq_desc then maps directly on to. Systems with a high | ||
735 | number of off-chip IRQs will want to treat this as | ||
736 | experimental until they have been independently verified. | ||
737 | |||
738 | If you don't know what to do here, say N. | ||
739 | |||
740 | endmenu | 732 | endmenu |
741 | 733 | ||
742 | menu "Boot options" | 734 | menu "Boot options" |
@@ -822,11 +814,15 @@ config MAPLE | |||
822 | config PCI | 814 | config PCI |
823 | bool "PCI support" | 815 | bool "PCI support" |
824 | depends on SYS_SUPPORTS_PCI | 816 | depends on SYS_SUPPORTS_PCI |
817 | select PCI_DOMAINS | ||
825 | help | 818 | help |
826 | Find out whether you have a PCI motherboard. PCI is the name of a | 819 | Find out whether you have a PCI motherboard. PCI is the name of a |
827 | bus system, i.e. the way the CPU talks to the other stuff inside | 820 | bus system, i.e. the way the CPU talks to the other stuff inside |
828 | your box. If you have PCI, say Y, otherwise N. | 821 | your box. If you have PCI, say Y, otherwise N. |
829 | 822 | ||
823 | config PCI_DOMAINS | ||
824 | bool | ||
825 | |||
830 | source "drivers/pci/pcie/Kconfig" | 826 | source "drivers/pci/pcie/Kconfig" |
831 | 827 | ||
832 | source "drivers/pci/Kconfig" | 828 | source "drivers/pci/Kconfig" |
diff --git a/arch/sh/Kconfig.cpu b/arch/sh/Kconfig.cpu index cd6e3ea598d5..ddf096c7d8bf 100644 --- a/arch/sh/Kconfig.cpu +++ b/arch/sh/Kconfig.cpu | |||
@@ -68,7 +68,8 @@ config SH_STORE_QUEUES | |||
68 | 68 | ||
69 | config SPECULATIVE_EXECUTION | 69 | config SPECULATIVE_EXECUTION |
70 | bool "Speculative subroutine return" | 70 | bool "Speculative subroutine return" |
71 | depends on CPU_SUBTYPE_SH7780 && EXPERIMENTAL | 71 | depends on EXPERIMENTAL |
72 | depends on CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 || CPU_SUBTYPE_SH7786 | ||
72 | help | 73 | help |
73 | This enables support for a speculative instruction fetch for | 74 | This enables support for a speculative instruction fetch for |
74 | subroutine return. There are various pitfalls associated with | 75 | subroutine return. There are various pitfalls associated with |
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index db91925c79d1..588579ac2e35 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
@@ -83,6 +83,7 @@ defaultimage-$(CONFIG_SH_AP325RXA) := uImage | |||
83 | defaultimage-$(CONFIG_SH_7724_SOLUTION_ENGINE) := uImage | 83 | defaultimage-$(CONFIG_SH_7724_SOLUTION_ENGINE) := uImage |
84 | defaultimage-$(CONFIG_SH_7206_SOLUTION_ENGINE) := vmlinux | 84 | defaultimage-$(CONFIG_SH_7206_SOLUTION_ENGINE) := vmlinux |
85 | defaultimage-$(CONFIG_SH_7619_SOLUTION_ENGINE) := vmlinux | 85 | defaultimage-$(CONFIG_SH_7619_SOLUTION_ENGINE) := vmlinux |
86 | defaultimage-$(CONFIG_SH_SDK7786) := vmlinux.bin | ||
86 | 87 | ||
87 | # Set some sensible Kbuild defaults | 88 | # Set some sensible Kbuild defaults |
88 | KBUILD_IMAGE := $(defaultimage-y) | 89 | KBUILD_IMAGE := $(defaultimage-y) |
@@ -143,11 +144,11 @@ machdir-$(CONFIG_SH_AP325RXA) += mach-ap325rxa | |||
143 | machdir-$(CONFIG_SH_KFR2R09) += mach-kfr2r09 | 144 | machdir-$(CONFIG_SH_KFR2R09) += mach-kfr2r09 |
144 | machdir-$(CONFIG_SH_ECOVEC) += mach-ecovec24 | 145 | machdir-$(CONFIG_SH_ECOVEC) += mach-ecovec24 |
145 | machdir-$(CONFIG_SH_SDK7780) += mach-sdk7780 | 146 | machdir-$(CONFIG_SH_SDK7780) += mach-sdk7780 |
147 | machdir-$(CONFIG_SH_SDK7786) += mach-sdk7786 | ||
146 | machdir-$(CONFIG_SH_X3PROTO) += mach-x3proto | 148 | machdir-$(CONFIG_SH_X3PROTO) += mach-x3proto |
147 | machdir-$(CONFIG_SH_SH7763RDP) += mach-sh7763rdp | 149 | machdir-$(CONFIG_SH_SH7763RDP) += mach-sh7763rdp |
148 | machdir-$(CONFIG_SH_SH4202_MICRODEV) += mach-microdev | 150 | machdir-$(CONFIG_SH_SH4202_MICRODEV) += mach-microdev |
149 | machdir-$(CONFIG_SH_LANDISK) += mach-landisk | 151 | machdir-$(CONFIG_SH_LANDISK) += mach-landisk |
150 | machdir-$(CONFIG_SH_TITAN) += mach-titan | ||
151 | machdir-$(CONFIG_SH_LBOX_RE2) += mach-lboxre2 | 152 | machdir-$(CONFIG_SH_LBOX_RE2) += mach-lboxre2 |
152 | machdir-$(CONFIG_SH_CAYMAN) += mach-cayman | 153 | machdir-$(CONFIG_SH_CAYMAN) += mach-cayman |
153 | machdir-$(CONFIG_SH_RSK) += mach-rsk | 154 | machdir-$(CONFIG_SH_RSK) += mach-rsk |
@@ -203,8 +204,9 @@ endif | |||
203 | libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y) | 204 | libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y) |
204 | libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y) | 205 | libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y) |
205 | 206 | ||
206 | BOOT_TARGETS = uImage uImage.bz2 uImage.gz uImage.lzma uImage.srec uImage.bin \ | 207 | BOOT_TARGETS = uImage uImage.bz2 uImage.gz uImage.lzma uImage.lzo \ |
207 | zImage vmlinux.srec romImage | 208 | uImage.srec uImage.bin zImage vmlinux.bin vmlinux.srec \ |
209 | romImage | ||
208 | PHONY += $(BOOT_TARGETS) | 210 | PHONY += $(BOOT_TARGETS) |
209 | 211 | ||
210 | all: $(KBUILD_IMAGE) | 212 | all: $(KBUILD_IMAGE) |
@@ -225,10 +227,12 @@ define archhelp | |||
225 | @echo ' zImage - Compressed kernel image' | 227 | @echo ' zImage - Compressed kernel image' |
226 | @echo ' romImage - Compressed ROM image, if supported' | 228 | @echo ' romImage - Compressed ROM image, if supported' |
227 | @echo ' vmlinux.srec - Create an ELF S-record' | 229 | @echo ' vmlinux.srec - Create an ELF S-record' |
230 | @echo ' vmlinux.bin - Create an uncompressed binary image' | ||
228 | @echo '* uImage - Alias to bootable U-Boot image' | 231 | @echo '* uImage - Alias to bootable U-Boot image' |
229 | @echo ' uImage.srec - Create an S-record for U-Boot' | 232 | @echo ' uImage.srec - Create an S-record for U-Boot' |
230 | @echo ' uImage.bin - Kernel-only image for U-Boot (bin)' | 233 | @echo ' uImage.bin - Kernel-only image for U-Boot (bin)' |
231 | @echo '* uImage.gz - Kernel-only image for U-Boot (gzip)' | 234 | @echo '* uImage.gz - Kernel-only image for U-Boot (gzip)' |
232 | @echo ' uImage.bz2 - Kernel-only image for U-Boot (bzip2)' | 235 | @echo ' uImage.bz2 - Kernel-only image for U-Boot (bzip2)' |
233 | @echo ' uImage.lzma - Kernel-only image for U-Boot (lzma)' | 236 | @echo ' uImage.lzma - Kernel-only image for U-Boot (lzma)' |
237 | @echo ' uImage.lzo - Kernel-only image for U-Boot (lzo)' | ||
234 | endef | 238 | endef |
diff --git a/arch/sh/boards/Kconfig b/arch/sh/boards/Kconfig index aedd9deb5de2..938e87d51482 100644 --- a/arch/sh/boards/Kconfig +++ b/arch/sh/boards/Kconfig | |||
@@ -150,6 +150,14 @@ config SH_SDK7780 | |||
150 | Select SDK7780 if configuring for a Renesas SH7780 SDK7780R3 | 150 | Select SDK7780 if configuring for a Renesas SH7780 SDK7780R3 |
151 | evaluation board. | 151 | evaluation board. |
152 | 152 | ||
153 | config SH_SDK7786 | ||
154 | bool "SDK7786" | ||
155 | depends on CPU_SUBTYPE_SH7786 | ||
156 | select SYS_SUPPORTS_PCI | ||
157 | help | ||
158 | Select SDK7786 if configuring for a Renesas Technology Europe | ||
159 | SH7786-65nm board. | ||
160 | |||
153 | config SH_HIGHLANDER | 161 | config SH_HIGHLANDER |
154 | bool "Highlander" | 162 | bool "Highlander" |
155 | depends on CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 | 163 | depends on CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 |
diff --git a/arch/sh/boards/Makefile b/arch/sh/boards/Makefile index ce0f26381784..4f90f9b7a922 100644 --- a/arch/sh/boards/Makefile +++ b/arch/sh/boards/Makefile | |||
@@ -8,3 +8,4 @@ obj-$(CONFIG_SH_SHMIN) += board-shmin.o | |||
8 | obj-$(CONFIG_SH_EDOSK7760) += board-edosk7760.o | 8 | obj-$(CONFIG_SH_EDOSK7760) += board-edosk7760.o |
9 | obj-$(CONFIG_SH_ESPT) += board-espt.o | 9 | obj-$(CONFIG_SH_ESPT) += board-espt.o |
10 | obj-$(CONFIG_SH_POLARIS) += board-polaris.o | 10 | obj-$(CONFIG_SH_POLARIS) += board-polaris.o |
11 | obj-$(CONFIG_SH_TITAN) += board-titan.o | ||
diff --git a/arch/sh/boards/board-magicpanelr2.c b/arch/sh/boards/board-magicpanelr2.c index 99ffc5f1c0dd..efba450a0518 100644 --- a/arch/sh/boards/board-magicpanelr2.c +++ b/arch/sh/boards/board-magicpanelr2.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <asm/heartbeat.h> | 23 | #include <asm/heartbeat.h> |
24 | #include <cpu/sh7720.h> | 24 | #include <cpu/sh7720.h> |
25 | 25 | ||
26 | #define LAN9115_READY (ctrl_inl(0xA8000084UL) & 0x00000001UL) | 26 | #define LAN9115_READY (__raw_readl(0xA8000084UL) & 0x00000001UL) |
27 | 27 | ||
28 | /* Prefer cmdline over RedBoot */ | 28 | /* Prefer cmdline over RedBoot */ |
29 | static const char *probes[] = { "cmdlinepart", "RedBoot", NULL }; | 29 | static const char *probes[] = { "cmdlinepart", "RedBoot", NULL }; |
@@ -60,33 +60,33 @@ static void __init setup_chip_select(void) | |||
60 | { | 60 | { |
61 | /* CS2: LAN (0x08000000 - 0x0bffffff) */ | 61 | /* CS2: LAN (0x08000000 - 0x0bffffff) */ |
62 | /* no idle cycles, normal space, 8 bit data bus */ | 62 | /* no idle cycles, normal space, 8 bit data bus */ |
63 | ctrl_outl(0x36db0400, CS2BCR); | 63 | __raw_writel(0x36db0400, CS2BCR); |
64 | /* (SW:1.5 WR:3 HW:1.5), ext. wait */ | 64 | /* (SW:1.5 WR:3 HW:1.5), ext. wait */ |
65 | ctrl_outl(0x000003c0, CS2WCR); | 65 | __raw_writel(0x000003c0, CS2WCR); |
66 | 66 | ||
67 | /* CS4: CAN1 (0xb0000000 - 0xb3ffffff) */ | 67 | /* CS4: CAN1 (0xb0000000 - 0xb3ffffff) */ |
68 | /* no idle cycles, normal space, 8 bit data bus */ | 68 | /* no idle cycles, normal space, 8 bit data bus */ |
69 | ctrl_outl(0x00000200, CS4BCR); | 69 | __raw_writel(0x00000200, CS4BCR); |
70 | /* (SW:1.5 WR:3 HW:1.5), ext. wait */ | 70 | /* (SW:1.5 WR:3 HW:1.5), ext. wait */ |
71 | ctrl_outl(0x00100981, CS4WCR); | 71 | __raw_writel(0x00100981, CS4WCR); |
72 | 72 | ||
73 | /* CS5a: CAN2 (0xb4000000 - 0xb5ffffff) */ | 73 | /* CS5a: CAN2 (0xb4000000 - 0xb5ffffff) */ |
74 | /* no idle cycles, normal space, 8 bit data bus */ | 74 | /* no idle cycles, normal space, 8 bit data bus */ |
75 | ctrl_outl(0x00000200, CS5ABCR); | 75 | __raw_writel(0x00000200, CS5ABCR); |
76 | /* (SW:1.5 WR:3 HW:1.5), ext. wait */ | 76 | /* (SW:1.5 WR:3 HW:1.5), ext. wait */ |
77 | ctrl_outl(0x00100981, CS5AWCR); | 77 | __raw_writel(0x00100981, CS5AWCR); |
78 | 78 | ||
79 | /* CS5b: CAN3 (0xb6000000 - 0xb7ffffff) */ | 79 | /* CS5b: CAN3 (0xb6000000 - 0xb7ffffff) */ |
80 | /* no idle cycles, normal space, 8 bit data bus */ | 80 | /* no idle cycles, normal space, 8 bit data bus */ |
81 | ctrl_outl(0x00000200, CS5BBCR); | 81 | __raw_writel(0x00000200, CS5BBCR); |
82 | /* (SW:1.5 WR:3 HW:1.5), ext. wait */ | 82 | /* (SW:1.5 WR:3 HW:1.5), ext. wait */ |
83 | ctrl_outl(0x00100981, CS5BWCR); | 83 | __raw_writel(0x00100981, CS5BWCR); |
84 | 84 | ||
85 | /* CS6a: Rotary (0xb8000000 - 0xb9ffffff) */ | 85 | /* CS6a: Rotary (0xb8000000 - 0xb9ffffff) */ |
86 | /* no idle cycles, normal space, 8 bit data bus */ | 86 | /* no idle cycles, normal space, 8 bit data bus */ |
87 | ctrl_outl(0x00000200, CS6ABCR); | 87 | __raw_writel(0x00000200, CS6ABCR); |
88 | /* (SW:1.5 WR:3 HW:1.5), no ext. wait */ | 88 | /* (SW:1.5 WR:3 HW:1.5), no ext. wait */ |
89 | ctrl_outl(0x001009C1, CS6AWCR); | 89 | __raw_writel(0x001009C1, CS6AWCR); |
90 | } | 90 | } |
91 | 91 | ||
92 | static void __init setup_port_multiplexing(void) | 92 | static void __init setup_port_multiplexing(void) |
@@ -94,71 +94,71 @@ static void __init setup_port_multiplexing(void) | |||
94 | /* A7 GPO(LED8); A6 GPO(LED7); A5 GPO(LED6); A4 GPO(LED5); | 94 | /* A7 GPO(LED8); A6 GPO(LED7); A5 GPO(LED6); A4 GPO(LED5); |
95 | * A3 GPO(LED4); A2 GPO(LED3); A1 GPO(LED2); A0 GPO(LED1); | 95 | * A3 GPO(LED4); A2 GPO(LED3); A1 GPO(LED2); A0 GPO(LED1); |
96 | */ | 96 | */ |
97 | ctrl_outw(0x5555, PORT_PACR); /* 01 01 01 01 01 01 01 01 */ | 97 | __raw_writew(0x5555, PORT_PACR); /* 01 01 01 01 01 01 01 01 */ |
98 | 98 | ||
99 | /* B7 GPO(RST4); B6 GPO(RST3); B5 GPO(RST2); B4 GPO(RST1); | 99 | /* B7 GPO(RST4); B6 GPO(RST3); B5 GPO(RST2); B4 GPO(RST1); |
100 | * B3 GPO(PB3); B2 GPO(PB2); B1 GPO(PB1); B0 GPO(PB0); | 100 | * B3 GPO(PB3); B2 GPO(PB2); B1 GPO(PB1); B0 GPO(PB0); |
101 | */ | 101 | */ |
102 | ctrl_outw(0x5555, PORT_PBCR); /* 01 01 01 01 01 01 01 01 */ | 102 | __raw_writew(0x5555, PORT_PBCR); /* 01 01 01 01 01 01 01 01 */ |
103 | 103 | ||
104 | /* C7 GPO(PC7); C6 GPO(PC6); C5 GPO(PC5); C4 GPO(PC4); | 104 | /* C7 GPO(PC7); C6 GPO(PC6); C5 GPO(PC5); C4 GPO(PC4); |
105 | * C3 LCD_DATA3; C2 LCD_DATA2; C1 LCD_DATA1; C0 LCD_DATA0; | 105 | * C3 LCD_DATA3; C2 LCD_DATA2; C1 LCD_DATA1; C0 LCD_DATA0; |
106 | */ | 106 | */ |
107 | ctrl_outw(0x5500, PORT_PCCR); /* 01 01 01 01 00 00 00 00 */ | 107 | __raw_writew(0x5500, PORT_PCCR); /* 01 01 01 01 00 00 00 00 */ |
108 | 108 | ||
109 | /* D7 GPO(PD7); D6 GPO(PD6); D5 GPO(PD5); D4 GPO(PD4); | 109 | /* D7 GPO(PD7); D6 GPO(PD6); D5 GPO(PD5); D4 GPO(PD4); |
110 | * D3 GPO(PD3); D2 GPO(PD2); D1 GPO(PD1); D0 GPO(PD0); | 110 | * D3 GPO(PD3); D2 GPO(PD2); D1 GPO(PD1); D0 GPO(PD0); |
111 | */ | 111 | */ |
112 | ctrl_outw(0x5555, PORT_PDCR); /* 01 01 01 01 01 01 01 01 */ | 112 | __raw_writew(0x5555, PORT_PDCR); /* 01 01 01 01 01 01 01 01 */ |
113 | 113 | ||
114 | /* E7 (x); E6 GPI(nu); E5 GPI(nu); E4 LCD_M_DISP; | 114 | /* E7 (x); E6 GPI(nu); E5 GPI(nu); E4 LCD_M_DISP; |
115 | * E3 LCD_CL1; E2 LCD_CL2; E1 LCD_DON; E0 LCD_FLM; | 115 | * E3 LCD_CL1; E2 LCD_CL2; E1 LCD_DON; E0 LCD_FLM; |
116 | */ | 116 | */ |
117 | ctrl_outw(0x3C00, PORT_PECR); /* 00 11 11 00 00 00 00 00 */ | 117 | __raw_writew(0x3C00, PORT_PECR); /* 00 11 11 00 00 00 00 00 */ |
118 | 118 | ||
119 | /* F7 (x); F6 DA1(VLCD); F5 DA0(nc); F4 AN3; | 119 | /* F7 (x); F6 DA1(VLCD); F5 DA0(nc); F4 AN3; |
120 | * F3 AN2(MID_AD); F2 AN1(EARTH_AD); F1 AN0(TEMP); F0 GPI+(nc); | 120 | * F3 AN2(MID_AD); F2 AN1(EARTH_AD); F1 AN0(TEMP); F0 GPI+(nc); |
121 | */ | 121 | */ |
122 | ctrl_outw(0x0002, PORT_PFCR); /* 00 00 00 00 00 00 00 10 */ | 122 | __raw_writew(0x0002, PORT_PFCR); /* 00 00 00 00 00 00 00 10 */ |
123 | 123 | ||
124 | /* G7 (x); G6 IRQ5(TOUCH_BUSY); G5 IRQ4(TOUCH_IRQ); G4 GPI(KEY2); | 124 | /* G7 (x); G6 IRQ5(TOUCH_BUSY); G5 IRQ4(TOUCH_IRQ); G4 GPI(KEY2); |
125 | * G3 GPI(KEY1); G2 GPO(LED11); G1 GPO(LED10); G0 GPO(LED9); | 125 | * G3 GPI(KEY1); G2 GPO(LED11); G1 GPO(LED10); G0 GPO(LED9); |
126 | */ | 126 | */ |
127 | ctrl_outw(0x03D5, PORT_PGCR); /* 00 00 00 11 11 01 01 01 */ | 127 | __raw_writew(0x03D5, PORT_PGCR); /* 00 00 00 11 11 01 01 01 */ |
128 | 128 | ||
129 | /* H7 (x); H6 /RAS(BRAS); H5 /CAS(BCAS); H4 CKE(BCKE); | 129 | /* H7 (x); H6 /RAS(BRAS); H5 /CAS(BCAS); H4 CKE(BCKE); |
130 | * H3 GPO(EARTH_OFF); H2 GPO(EARTH_TEST); H1 USB2_PWR; H0 USB1_PWR; | 130 | * H3 GPO(EARTH_OFF); H2 GPO(EARTH_TEST); H1 USB2_PWR; H0 USB1_PWR; |
131 | */ | 131 | */ |
132 | ctrl_outw(0x0050, PORT_PHCR); /* 00 00 00 00 01 01 00 00 */ | 132 | __raw_writew(0x0050, PORT_PHCR); /* 00 00 00 00 01 01 00 00 */ |
133 | 133 | ||
134 | /* J7 (x); J6 AUDCK; J5 ASEBRKAK; J4 AUDATA3; | 134 | /* J7 (x); J6 AUDCK; J5 ASEBRKAK; J4 AUDATA3; |
135 | * J3 AUDATA2; J2 AUDATA1; J1 AUDATA0; J0 AUDSYNC; | 135 | * J3 AUDATA2; J2 AUDATA1; J1 AUDATA0; J0 AUDSYNC; |
136 | */ | 136 | */ |
137 | ctrl_outw(0x0000, PORT_PJCR); /* 00 00 00 00 00 00 00 00 */ | 137 | __raw_writew(0x0000, PORT_PJCR); /* 00 00 00 00 00 00 00 00 */ |
138 | 138 | ||
139 | /* K7 (x); K6 (x); K5 (x); K4 (x); | 139 | /* K7 (x); K6 (x); K5 (x); K4 (x); |
140 | * K3 PINT7(/PWR2); K2 PINT6(/PWR1); K1 PINT5(nu); K0 PINT4(FLASH_READY) | 140 | * K3 PINT7(/PWR2); K2 PINT6(/PWR1); K1 PINT5(nu); K0 PINT4(FLASH_READY) |
141 | */ | 141 | */ |
142 | ctrl_outw(0x00FF, PORT_PKCR); /* 00 00 00 00 11 11 11 11 */ | 142 | __raw_writew(0x00FF, PORT_PKCR); /* 00 00 00 00 11 11 11 11 */ |
143 | 143 | ||
144 | /* L7 TRST; L6 TMS; L5 TDO; L4 TDI; | 144 | /* L7 TRST; L6 TMS; L5 TDO; L4 TDI; |
145 | * L3 TCK; L2 (x); L1 (x); L0 (x); | 145 | * L3 TCK; L2 (x); L1 (x); L0 (x); |
146 | */ | 146 | */ |
147 | ctrl_outw(0x0000, PORT_PLCR); /* 00 00 00 00 00 00 00 00 */ | 147 | __raw_writew(0x0000, PORT_PLCR); /* 00 00 00 00 00 00 00 00 */ |
148 | 148 | ||
149 | /* M7 GPO(CURRENT_SINK); M6 GPO(PWR_SWITCH); M5 GPO(LAN_SPEED); | 149 | /* M7 GPO(CURRENT_SINK); M6 GPO(PWR_SWITCH); M5 GPO(LAN_SPEED); |
150 | * M4 GPO(LAN_RESET); M3 GPO(BUZZER); M2 GPO(LCD_BL); | 150 | * M4 GPO(LAN_RESET); M3 GPO(BUZZER); M2 GPO(LCD_BL); |
151 | * M1 CS5B(CAN3_CS); M0 GPI+(nc); | 151 | * M1 CS5B(CAN3_CS); M0 GPI+(nc); |
152 | */ | 152 | */ |
153 | ctrl_outw(0x5552, PORT_PMCR); /* 01 01 01 01 01 01 00 10 */ | 153 | __raw_writew(0x5552, PORT_PMCR); /* 01 01 01 01 01 01 00 10 */ |
154 | 154 | ||
155 | /* CURRENT_SINK=off, PWR_SWITCH=off, LAN_SPEED=100MBit, | 155 | /* CURRENT_SINK=off, PWR_SWITCH=off, LAN_SPEED=100MBit, |
156 | * LAN_RESET=off, BUZZER=off, LCD_BL=off | 156 | * LAN_RESET=off, BUZZER=off, LCD_BL=off |
157 | */ | 157 | */ |
158 | #if CONFIG_SH_MAGIC_PANEL_R2_VERSION == 2 | 158 | #if CONFIG_SH_MAGIC_PANEL_R2_VERSION == 2 |
159 | ctrl_outb(0x30, PORT_PMDR); | 159 | __raw_writeb(0x30, PORT_PMDR); |
160 | #elif CONFIG_SH_MAGIC_PANEL_R2_VERSION == 3 | 160 | #elif CONFIG_SH_MAGIC_PANEL_R2_VERSION == 3 |
161 | ctrl_outb(0xF0, PORT_PMDR); | 161 | __raw_writeb(0xF0, PORT_PMDR); |
162 | #else | 162 | #else |
163 | #error Unknown revision of PLATFORM_MP_R2 | 163 | #error Unknown revision of PLATFORM_MP_R2 |
164 | #endif | 164 | #endif |
@@ -167,8 +167,8 @@ static void __init setup_port_multiplexing(void) | |||
167 | * P4 GPO(nu); P3 IRQ3(LAN_IRQ); P2 IRQ2(CAN3_IRQ); | 167 | * P4 GPO(nu); P3 IRQ3(LAN_IRQ); P2 IRQ2(CAN3_IRQ); |
168 | * P1 IRQ1(CAN2_IRQ); P0 IRQ0(CAN1_IRQ) | 168 | * P1 IRQ1(CAN2_IRQ); P0 IRQ0(CAN1_IRQ) |
169 | */ | 169 | */ |
170 | ctrl_outw(0x0100, PORT_PPCR); /* 00 00 00 01 00 00 00 00 */ | 170 | __raw_writew(0x0100, PORT_PPCR); /* 00 00 00 01 00 00 00 00 */ |
171 | ctrl_outb(0x10, PORT_PPDR); | 171 | __raw_writeb(0x10, PORT_PPDR); |
172 | 172 | ||
173 | /* R7 A25; R6 A24; R5 A23; R4 A22; | 173 | /* R7 A25; R6 A24; R5 A23; R4 A22; |
174 | * R3 A21; R2 A20; R1 A19; R0 A0; | 174 | * R3 A21; R2 A20; R1 A19; R0 A0; |
@@ -185,22 +185,22 @@ static void __init setup_port_multiplexing(void) | |||
185 | /* S7 (x); S6 (x); S5 (x); S4 GPO(EEPROM_CS2); | 185 | /* S7 (x); S6 (x); S5 (x); S4 GPO(EEPROM_CS2); |
186 | * S3 GPO(EEPROM_CS1); S2 SIOF0_TXD; S1 SIOF0_RXD; S0 SIOF0_SCK; | 186 | * S3 GPO(EEPROM_CS1); S2 SIOF0_TXD; S1 SIOF0_RXD; S0 SIOF0_SCK; |
187 | */ | 187 | */ |
188 | ctrl_outw(0x0140, PORT_PSCR); /* 00 00 00 01 01 00 00 00 */ | 188 | __raw_writew(0x0140, PORT_PSCR); /* 00 00 00 01 01 00 00 00 */ |
189 | 189 | ||
190 | /* T7 (x); T6 (x); T5 (x); T4 COM1_CTS; | 190 | /* T7 (x); T6 (x); T5 (x); T4 COM1_CTS; |
191 | * T3 COM1_RTS; T2 COM1_TXD; T1 COM1_RXD; T0 GPO(WDOG) | 191 | * T3 COM1_RTS; T2 COM1_TXD; T1 COM1_RXD; T0 GPO(WDOG) |
192 | */ | 192 | */ |
193 | ctrl_outw(0x0001, PORT_PTCR); /* 00 00 00 00 00 00 00 01 */ | 193 | __raw_writew(0x0001, PORT_PTCR); /* 00 00 00 00 00 00 00 01 */ |
194 | 194 | ||
195 | /* U7 (x); U6 (x); U5 (x); U4 GPI+(/AC_FAULT); | 195 | /* U7 (x); U6 (x); U5 (x); U4 GPI+(/AC_FAULT); |
196 | * U3 GPO(TOUCH_CS); U2 TOUCH_TXD; U1 TOUCH_RXD; U0 TOUCH_SCK; | 196 | * U3 GPO(TOUCH_CS); U2 TOUCH_TXD; U1 TOUCH_RXD; U0 TOUCH_SCK; |
197 | */ | 197 | */ |
198 | ctrl_outw(0x0240, PORT_PUCR); /* 00 00 00 10 01 00 00 00 */ | 198 | __raw_writew(0x0240, PORT_PUCR); /* 00 00 00 10 01 00 00 00 */ |
199 | 199 | ||
200 | /* V7 (x); V6 (x); V5 (x); V4 GPO(MID2); | 200 | /* V7 (x); V6 (x); V5 (x); V4 GPO(MID2); |
201 | * V3 GPO(MID1); V2 CARD_TxD; V1 CARD_RxD; V0 GPI+(/BAT_FAULT); | 201 | * V3 GPO(MID1); V2 CARD_TxD; V1 CARD_RxD; V0 GPI+(/BAT_FAULT); |
202 | */ | 202 | */ |
203 | ctrl_outw(0x0142, PORT_PVCR); /* 00 00 00 01 01 00 00 10 */ | 203 | __raw_writew(0x0142, PORT_PVCR); /* 00 00 00 01 01 00 00 10 */ |
204 | } | 204 | } |
205 | 205 | ||
206 | static void __init mpr2_setup(char **cmdline_p) | 206 | static void __init mpr2_setup(char **cmdline_p) |
@@ -209,24 +209,24 @@ static void __init mpr2_setup(char **cmdline_p) | |||
209 | * /PCC_CD1, /PCC_CD2, PCC_BVD1, PCC_BVD2, | 209 | * /PCC_CD1, /PCC_CD2, PCC_BVD1, PCC_BVD2, |
210 | * /IOIS16, IRQ4, IRQ5, USB1d_SUSPEND | 210 | * /IOIS16, IRQ4, IRQ5, USB1d_SUSPEND |
211 | */ | 211 | */ |
212 | ctrl_outw(0xAABC, PORT_PSELA); | 212 | __raw_writew(0xAABC, PORT_PSELA); |
213 | /* set Pin Select Register B: | 213 | /* set Pin Select Register B: |
214 | * /SCIF0_RTS, /SCIF0_CTS, LCD_VCPWC, | 214 | * /SCIF0_RTS, /SCIF0_CTS, LCD_VCPWC, |
215 | * LCD_VEPWC, IIC_SDA, IIC_SCL, Reserved | 215 | * LCD_VEPWC, IIC_SDA, IIC_SCL, Reserved |
216 | */ | 216 | */ |
217 | ctrl_outw(0x3C00, PORT_PSELB); | 217 | __raw_writew(0x3C00, PORT_PSELB); |
218 | /* set Pin Select Register C: | 218 | /* set Pin Select Register C: |
219 | * SIOF1_SCK, SIOF1_RxD, SCIF1_RxD, SCIF1_TxD, Reserved | 219 | * SIOF1_SCK, SIOF1_RxD, SCIF1_RxD, SCIF1_TxD, Reserved |
220 | */ | 220 | */ |
221 | ctrl_outw(0x0000, PORT_PSELC); | 221 | __raw_writew(0x0000, PORT_PSELC); |
222 | /* set Pin Select Register D: Reserved, SIOF1_TxD, Reserved, SIOF1_MCLK, | 222 | /* set Pin Select Register D: Reserved, SIOF1_TxD, Reserved, SIOF1_MCLK, |
223 | * Reserved, SIOF1_SYNC, Reserved, SCIF1_SCK, Reserved | 223 | * Reserved, SIOF1_SYNC, Reserved, SCIF1_SCK, Reserved |
224 | */ | 224 | */ |
225 | ctrl_outw(0x0000, PORT_PSELD); | 225 | __raw_writew(0x0000, PORT_PSELD); |
226 | /* set USB TxRx Control: Reserved, DRV, Reserved, USB_TRANS, USB_SEL */ | 226 | /* set USB TxRx Control: Reserved, DRV, Reserved, USB_TRANS, USB_SEL */ |
227 | ctrl_outw(0x0101, PORT_UTRCTL); | 227 | __raw_writew(0x0101, PORT_UTRCTL); |
228 | /* set USB Clock Control: USSCS, USSTB, Reserved (HighByte always A5) */ | 228 | /* set USB Clock Control: USSCS, USSTB, Reserved (HighByte always A5) */ |
229 | ctrl_outw(0xA5C0, PORT_UCLKCR_W); | 229 | __raw_writew(0xA5C0, PORT_UCLKCR_W); |
230 | 230 | ||
231 | setup_chip_select(); | 231 | setup_chip_select(); |
232 | 232 | ||
diff --git a/arch/sh/boards/board-polaris.c b/arch/sh/boards/board-polaris.c index 62607eb51004..594866356c24 100644 --- a/arch/sh/boards/board-polaris.c +++ b/arch/sh/boards/board-polaris.c | |||
@@ -59,15 +59,12 @@ static unsigned char heartbeat_bit_pos[] = { 0, 1, 2, 3 }; | |||
59 | static struct heartbeat_data heartbeat_data = { | 59 | static struct heartbeat_data heartbeat_data = { |
60 | .bit_pos = heartbeat_bit_pos, | 60 | .bit_pos = heartbeat_bit_pos, |
61 | .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), | 61 | .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), |
62 | .regsize = 8, | ||
63 | }; | 62 | }; |
64 | 63 | ||
65 | static struct resource heartbeat_resources[] = { | 64 | static struct resource heartbeat_resource = { |
66 | [0] = { | 65 | .start = PORT_PCDR, |
67 | .start = PORT_PCDR, | 66 | .end = PORT_PCDR, |
68 | .end = PORT_PCDR, | 67 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_8BIT, |
69 | .flags = IORESOURCE_MEM, | ||
70 | }, | ||
71 | }; | 68 | }; |
72 | 69 | ||
73 | static struct platform_device heartbeat_device = { | 70 | static struct platform_device heartbeat_device = { |
@@ -76,8 +73,8 @@ static struct platform_device heartbeat_device = { | |||
76 | .dev = { | 73 | .dev = { |
77 | .platform_data = &heartbeat_data, | 74 | .platform_data = &heartbeat_data, |
78 | }, | 75 | }, |
79 | .num_resources = ARRAY_SIZE(heartbeat_resources), | 76 | .num_resources = 1, |
80 | .resource = heartbeat_resources, | 77 | .resource = &heartbeat_resource, |
81 | }; | 78 | }; |
82 | 79 | ||
83 | static struct platform_device *polaris_devices[] __initdata = { | 80 | static struct platform_device *polaris_devices[] __initdata = { |
@@ -92,15 +89,15 @@ static int __init polaris_initialise(void) | |||
92 | printk(KERN_INFO "Configuring Polaris external bus\n"); | 89 | printk(KERN_INFO "Configuring Polaris external bus\n"); |
93 | 90 | ||
94 | /* Configure area 5 with 2 wait states */ | 91 | /* Configure area 5 with 2 wait states */ |
95 | wcr = ctrl_inw(WCR2); | 92 | wcr = __raw_readw(WCR2); |
96 | wcr &= (~AREA5_WAIT_CTRL); | 93 | wcr &= (~AREA5_WAIT_CTRL); |
97 | wcr |= (WAIT_STATES_10 << 10); | 94 | wcr |= (WAIT_STATES_10 << 10); |
98 | ctrl_outw(wcr, WCR2); | 95 | __raw_writew(wcr, WCR2); |
99 | 96 | ||
100 | /* Configure area 5 for 32-bit access */ | 97 | /* Configure area 5 for 32-bit access */ |
101 | bcr_mask = ctrl_inw(BCR2); | 98 | bcr_mask = __raw_readw(BCR2); |
102 | bcr_mask |= 1 << 10; | 99 | bcr_mask |= 1 << 10; |
103 | ctrl_outw(bcr_mask, BCR2); | 100 | __raw_writew(bcr_mask, BCR2); |
104 | 101 | ||
105 | return platform_add_devices(polaris_devices, | 102 | return platform_add_devices(polaris_devices, |
106 | ARRAY_SIZE(polaris_devices)); | 103 | ARRAY_SIZE(polaris_devices)); |
@@ -131,13 +128,13 @@ static struct ipr_desc ipr_irq_desc = { | |||
131 | static void __init init_polaris_irq(void) | 128 | static void __init init_polaris_irq(void) |
132 | { | 129 | { |
133 | /* Disable all interrupts */ | 130 | /* Disable all interrupts */ |
134 | ctrl_outw(0, BCR_ILCRA); | 131 | __raw_writew(0, BCR_ILCRA); |
135 | ctrl_outw(0, BCR_ILCRB); | 132 | __raw_writew(0, BCR_ILCRB); |
136 | ctrl_outw(0, BCR_ILCRC); | 133 | __raw_writew(0, BCR_ILCRC); |
137 | ctrl_outw(0, BCR_ILCRD); | 134 | __raw_writew(0, BCR_ILCRD); |
138 | ctrl_outw(0, BCR_ILCRE); | 135 | __raw_writew(0, BCR_ILCRE); |
139 | ctrl_outw(0, BCR_ILCRF); | 136 | __raw_writew(0, BCR_ILCRF); |
140 | ctrl_outw(0, BCR_ILCRG); | 137 | __raw_writew(0, BCR_ILCRG); |
141 | 138 | ||
142 | register_ipr_controller(&ipr_irq_desc); | 139 | register_ipr_controller(&ipr_irq_desc); |
143 | } | 140 | } |
diff --git a/arch/sh/boards/board-sh7785lcr.c b/arch/sh/boards/board-sh7785lcr.c index e5a8a2fde39c..fe7e686c94ac 100644 --- a/arch/sh/boards/board-sh7785lcr.c +++ b/arch/sh/boards/board-sh7785lcr.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/i2c-algo-pca.h> | 21 | #include <linux/i2c-algo-pca.h> |
22 | #include <linux/usb/r8a66597.h> | 22 | #include <linux/usb/r8a66597.h> |
23 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
24 | #include <linux/io.h> | ||
24 | #include <linux/clk.h> | 25 | #include <linux/clk.h> |
25 | #include <linux/errno.h> | 26 | #include <linux/errno.h> |
26 | #include <mach/sh7785lcr.h> | 27 | #include <mach/sh7785lcr.h> |
@@ -32,26 +33,17 @@ | |||
32 | * NOTE: This board has 2 physical memory maps. | 33 | * NOTE: This board has 2 physical memory maps. |
33 | * Please look at include/asm-sh/sh7785lcr.h or hardware manual. | 34 | * Please look at include/asm-sh/sh7785lcr.h or hardware manual. |
34 | */ | 35 | */ |
35 | static struct resource heartbeat_resources[] = { | 36 | static struct resource heartbeat_resource = { |
36 | [0] = { | 37 | .start = PLD_LEDCR, |
37 | .start = PLD_LEDCR, | 38 | .end = PLD_LEDCR, |
38 | .end = PLD_LEDCR, | 39 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_8BIT, |
39 | .flags = IORESOURCE_MEM, | ||
40 | }, | ||
41 | }; | ||
42 | |||
43 | static struct heartbeat_data heartbeat_data = { | ||
44 | .regsize = 8, | ||
45 | }; | 40 | }; |
46 | 41 | ||
47 | static struct platform_device heartbeat_device = { | 42 | static struct platform_device heartbeat_device = { |
48 | .name = "heartbeat", | 43 | .name = "heartbeat", |
49 | .id = -1, | 44 | .id = -1, |
50 | .dev = { | 45 | .num_resources = 1, |
51 | .platform_data = &heartbeat_data, | 46 | .resource = &heartbeat_resource, |
52 | }, | ||
53 | .num_resources = ARRAY_SIZE(heartbeat_resources), | ||
54 | .resource = heartbeat_resources, | ||
55 | }; | 47 | }; |
56 | 48 | ||
57 | static struct mtd_partition nor_flash_partitions[] = { | 49 | static struct mtd_partition nor_flash_partitions[] = { |
@@ -341,8 +333,14 @@ static void __init sh7785lcr_setup(char **cmdline_p) | |||
341 | pm_power_off = sh7785lcr_power_off; | 333 | pm_power_off = sh7785lcr_power_off; |
342 | 334 | ||
343 | /* sm501 DRAM configuration */ | 335 | /* sm501 DRAM configuration */ |
344 | sm501_reg = (void __iomem *)0xb3e00000 + SM501_DRAM_CONTROL; | 336 | sm501_reg = ioremap_nocache(SM107_REG_ADDR, SM501_DRAM_CONTROL); |
345 | writel(0x000307c2, sm501_reg); | 337 | if (!sm501_reg) { |
338 | printk(KERN_ERR "%s: ioremap error.\n", __func__); | ||
339 | return; | ||
340 | } | ||
341 | |||
342 | writel(0x000307c2, sm501_reg + SM501_DRAM_CONTROL); | ||
343 | iounmap(sm501_reg); | ||
346 | } | 344 | } |
347 | 345 | ||
348 | /* Return the board specific boot mode pin configuration */ | 346 | /* Return the board specific boot mode pin configuration */ |
diff --git a/arch/sh/boards/board-shmin.c b/arch/sh/boards/board-shmin.c index b1dcbbc89188..325bed53b87e 100644 --- a/arch/sh/boards/board-shmin.c +++ b/arch/sh/boards/board-shmin.c | |||
@@ -17,8 +17,8 @@ | |||
17 | 17 | ||
18 | static void __init init_shmin_irq(void) | 18 | static void __init init_shmin_irq(void) |
19 | { | 19 | { |
20 | ctrl_outw(0x2a00, PFC_PHCR); // IRQ0-3=IRQ | 20 | __raw_writew(0x2a00, PFC_PHCR); // IRQ0-3=IRQ |
21 | ctrl_outw(0x0aaa, INTC_ICR1); // IRQ0-3=IRQ-mode,Low-active. | 21 | __raw_writew(0x0aaa, INTC_ICR1); // IRQ0-3=IRQ-mode,Low-active. |
22 | plat_irq_setup_pins(IRQ_MODE_IRQ); | 22 | plat_irq_setup_pins(IRQ_MODE_IRQ); |
23 | } | 23 | } |
24 | 24 | ||
diff --git a/arch/sh/boards/mach-titan/setup.c b/arch/sh/boards/board-titan.c index 81e7e0f03863..94c36c7bc0b3 100644 --- a/arch/sh/boards/mach-titan/setup.c +++ b/arch/sh/boards/board-titan.c | |||
@@ -19,26 +19,6 @@ static void __init init_titan_irq(void) | |||
19 | } | 19 | } |
20 | 20 | ||
21 | static struct sh_machine_vector mv_titan __initmv = { | 21 | static struct sh_machine_vector mv_titan __initmv = { |
22 | .mv_name = "Titan", | 22 | .mv_name = "Titan", |
23 | 23 | .mv_init_irq = init_titan_irq, | |
24 | .mv_inb = titan_inb, | ||
25 | .mv_inw = titan_inw, | ||
26 | .mv_inl = titan_inl, | ||
27 | .mv_outb = titan_outb, | ||
28 | .mv_outw = titan_outw, | ||
29 | .mv_outl = titan_outl, | ||
30 | |||
31 | .mv_inb_p = titan_inb_p, | ||
32 | .mv_inw_p = titan_inw, | ||
33 | .mv_inl_p = titan_inl, | ||
34 | .mv_outb_p = titan_outb_p, | ||
35 | .mv_outw_p = titan_outw, | ||
36 | .mv_outl_p = titan_outl, | ||
37 | |||
38 | .mv_insl = titan_insl, | ||
39 | .mv_outsl = titan_outsl, | ||
40 | |||
41 | .mv_ioport_map = titan_ioport_map, | ||
42 | |||
43 | .mv_init_irq = init_titan_irq, | ||
44 | }; | 24 | }; |
diff --git a/arch/sh/boards/board-urquell.c b/arch/sh/boards/board-urquell.c index 36b8bac9b124..a9bd6e3ee10b 100644 --- a/arch/sh/boards/board-urquell.c +++ b/arch/sh/boards/board-urquell.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Renesas Technology Corp. SH7786 Urquell Support. | 2 | * Renesas Technology Corp. SH7786 Urquell Support. |
3 | * | 3 | * |
4 | * Copyright (C) 2008 Kuninori Morimoto <morimoto.kuninori@renesas.com> | 4 | * Copyright (C) 2008 Kuninori Morimoto <morimoto.kuninori@renesas.com> |
5 | * Copyright (C) 2009 Paul Mundt | 5 | * Copyright (C) 2009, 2010 Paul Mundt |
6 | * | 6 | * |
7 | * Based on board-sh7785lcr.c | 7 | * Based on board-sh7785lcr.c |
8 | * Copyright (C) 2008 Yoshihiro Shimoda | 8 | * Copyright (C) 2008 Yoshihiro Shimoda |
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/delay.h> | 19 | #include <linux/delay.h> |
20 | #include <linux/gpio.h> | 20 | #include <linux/gpio.h> |
21 | #include <linux/irq.h> | 21 | #include <linux/irq.h> |
22 | #include <linux/clk.h> | ||
22 | #include <mach/urquell.h> | 23 | #include <mach/urquell.h> |
23 | #include <cpu/sh7786.h> | 24 | #include <cpu/sh7786.h> |
24 | #include <asm/heartbeat.h> | 25 | #include <asm/heartbeat.h> |
@@ -50,26 +51,17 @@ | |||
50 | */ | 51 | */ |
51 | 52 | ||
52 | /* HeartBeat */ | 53 | /* HeartBeat */ |
53 | static struct resource heartbeat_resources[] = { | 54 | static struct resource heartbeat_resource = { |
54 | [0] = { | 55 | .start = BOARDREG(SLEDR), |
55 | .start = BOARDREG(SLEDR), | 56 | .end = BOARDREG(SLEDR), |
56 | .end = BOARDREG(SLEDR), | 57 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, |
57 | .flags = IORESOURCE_MEM, | ||
58 | }, | ||
59 | }; | ||
60 | |||
61 | static struct heartbeat_data heartbeat_data = { | ||
62 | .regsize = 16, | ||
63 | }; | 58 | }; |
64 | 59 | ||
65 | static struct platform_device heartbeat_device = { | 60 | static struct platform_device heartbeat_device = { |
66 | .name = "heartbeat", | 61 | .name = "heartbeat", |
67 | .id = -1, | 62 | .id = -1, |
68 | .dev = { | 63 | .num_resources = 1, |
69 | .platform_data = &heartbeat_data, | 64 | .resource = &heartbeat_resource, |
70 | }, | ||
71 | .num_resources = ARRAY_SIZE(heartbeat_resources), | ||
72 | .resource = heartbeat_resources, | ||
73 | }; | 65 | }; |
74 | 66 | ||
75 | /* LAN91C111 */ | 67 | /* LAN91C111 */ |
@@ -184,6 +176,27 @@ static int urquell_mode_pins(void) | |||
184 | return __raw_readw(UBOARDREG(MDSWMR)); | 176 | return __raw_readw(UBOARDREG(MDSWMR)); |
185 | } | 177 | } |
186 | 178 | ||
179 | static int urquell_clk_init(void) | ||
180 | { | ||
181 | struct clk *clk; | ||
182 | int ret; | ||
183 | |||
184 | /* | ||
185 | * Only handle the EXTAL case, anyone interfacing a crystal | ||
186 | * resonator will need to provide their own input clock. | ||
187 | */ | ||
188 | if (test_mode_pin(MODE_PIN9)) | ||
189 | return -EINVAL; | ||
190 | |||
191 | clk = clk_get(NULL, "extal"); | ||
192 | if (!clk || IS_ERR(clk)) | ||
193 | return PTR_ERR(clk); | ||
194 | ret = clk_set_rate(clk, 33333333); | ||
195 | clk_put(clk); | ||
196 | |||
197 | return ret; | ||
198 | } | ||
199 | |||
187 | /* Initialize the board */ | 200 | /* Initialize the board */ |
188 | static void __init urquell_setup(char **cmdline_p) | 201 | static void __init urquell_setup(char **cmdline_p) |
189 | { | 202 | { |
@@ -200,4 +213,5 @@ static struct sh_machine_vector mv_urquell __initmv = { | |||
200 | .mv_setup = urquell_setup, | 213 | .mv_setup = urquell_setup, |
201 | .mv_init_irq = urquell_init_irq, | 214 | .mv_init_irq = urquell_init_irq, |
202 | .mv_mode_pins = urquell_mode_pins, | 215 | .mv_mode_pins = urquell_mode_pins, |
216 | .mv_clk_init = urquell_clk_init, | ||
203 | }; | 217 | }; |
diff --git a/arch/sh/boards/mach-ap325rxa/setup.c b/arch/sh/boards/mach-ap325rxa/setup.c index 1f5fa5c44f6d..b5980696abbe 100644 --- a/arch/sh/boards/mach-ap325rxa/setup.c +++ b/arch/sh/boards/mach-ap325rxa/setup.c | |||
@@ -159,21 +159,21 @@ static void ap320_wvga_power_on(void *board_data) | |||
159 | msleep(100); | 159 | msleep(100); |
160 | 160 | ||
161 | /* ASD AP-320/325 LCD ON */ | 161 | /* ASD AP-320/325 LCD ON */ |
162 | ctrl_outw(FPGA_LCDREG_VAL, FPGA_LCDREG); | 162 | __raw_writew(FPGA_LCDREG_VAL, FPGA_LCDREG); |
163 | 163 | ||
164 | /* backlight */ | 164 | /* backlight */ |
165 | gpio_set_value(GPIO_PTS3, 0); | 165 | gpio_set_value(GPIO_PTS3, 0); |
166 | ctrl_outw(0x100, FPGA_BKLREG); | 166 | __raw_writew(0x100, FPGA_BKLREG); |
167 | } | 167 | } |
168 | 168 | ||
169 | static void ap320_wvga_power_off(void *board_data) | 169 | static void ap320_wvga_power_off(void *board_data) |
170 | { | 170 | { |
171 | /* backlight */ | 171 | /* backlight */ |
172 | ctrl_outw(0, FPGA_BKLREG); | 172 | __raw_writew(0, FPGA_BKLREG); |
173 | gpio_set_value(GPIO_PTS3, 1); | 173 | gpio_set_value(GPIO_PTS3, 1); |
174 | 174 | ||
175 | /* ASD AP-320/325 LCD OFF */ | 175 | /* ASD AP-320/325 LCD OFF */ |
176 | ctrl_outw(0, FPGA_LCDREG); | 176 | __raw_writew(0, FPGA_LCDREG); |
177 | } | 177 | } |
178 | 178 | ||
179 | static struct sh_mobile_lcdc_info lcdc_info = { | 179 | static struct sh_mobile_lcdc_info lcdc_info = { |
@@ -420,7 +420,7 @@ static struct resource sdhi0_cn3_resources[] = { | |||
420 | .flags = IORESOURCE_MEM, | 420 | .flags = IORESOURCE_MEM, |
421 | }, | 421 | }, |
422 | [1] = { | 422 | [1] = { |
423 | .start = 101, | 423 | .start = 100, |
424 | .flags = IORESOURCE_IRQ, | 424 | .flags = IORESOURCE_IRQ, |
425 | }, | 425 | }, |
426 | }; | 426 | }; |
@@ -443,7 +443,7 @@ static struct resource sdhi1_cn7_resources[] = { | |||
443 | .flags = IORESOURCE_MEM, | 443 | .flags = IORESOURCE_MEM, |
444 | }, | 444 | }, |
445 | [1] = { | 445 | [1] = { |
446 | .start = 24, | 446 | .start = 23, |
447 | .flags = IORESOURCE_IRQ, | 447 | .flags = IORESOURCE_IRQ, |
448 | }, | 448 | }, |
449 | }; | 449 | }; |
@@ -595,7 +595,7 @@ static int __init ap325rxa_devices_setup(void) | |||
595 | gpio_request(GPIO_PTZ4, NULL); | 595 | gpio_request(GPIO_PTZ4, NULL); |
596 | gpio_direction_output(GPIO_PTZ4, 0); /* SADDR */ | 596 | gpio_direction_output(GPIO_PTZ4, 0); /* SADDR */ |
597 | 597 | ||
598 | ctrl_outw(ctrl_inw(PORT_MSELCRB) & ~0x0001, PORT_MSELCRB); | 598 | __raw_writew(__raw_readw(PORT_MSELCRB) & ~0x0001, PORT_MSELCRB); |
599 | 599 | ||
600 | /* FLCTL */ | 600 | /* FLCTL */ |
601 | gpio_request(GPIO_FN_FCE, NULL); | 601 | gpio_request(GPIO_FN_FCE, NULL); |
@@ -613,9 +613,9 @@ static int __init ap325rxa_devices_setup(void) | |||
613 | gpio_request(GPIO_FN_FWE, NULL); | 613 | gpio_request(GPIO_FN_FWE, NULL); |
614 | gpio_request(GPIO_FN_FRB, NULL); | 614 | gpio_request(GPIO_FN_FRB, NULL); |
615 | 615 | ||
616 | ctrl_outw(0, PORT_HIZCRC); | 616 | __raw_writew(0, PORT_HIZCRC); |
617 | ctrl_outw(0xFFFF, PORT_DRVCRA); | 617 | __raw_writew(0xFFFF, PORT_DRVCRA); |
618 | ctrl_outw(0xFFFF, PORT_DRVCRB); | 618 | __raw_writew(0xFFFF, PORT_DRVCRB); |
619 | 619 | ||
620 | platform_resource_setup_memory(&ceu_device, "ceu", 4 << 20); | 620 | platform_resource_setup_memory(&ceu_device, "ceu", 4 << 20); |
621 | 621 | ||
diff --git a/arch/sh/boards/mach-cayman/irq.c b/arch/sh/boards/mach-cayman/irq.c index 33f770856319..1394b078db36 100644 --- a/arch/sh/boards/mach-cayman/irq.c +++ b/arch/sh/boards/mach-cayman/irq.c | |||
@@ -66,9 +66,9 @@ static void enable_cayman_irq(unsigned int irq) | |||
66 | reg = EPLD_MASK_BASE + ((irq / 8) << 2); | 66 | reg = EPLD_MASK_BASE + ((irq / 8) << 2); |
67 | bit = 1<<(irq % 8); | 67 | bit = 1<<(irq % 8); |
68 | local_irq_save(flags); | 68 | local_irq_save(flags); |
69 | mask = ctrl_inl(reg); | 69 | mask = __raw_readl(reg); |
70 | mask |= bit; | 70 | mask |= bit; |
71 | ctrl_outl(mask, reg); | 71 | __raw_writel(mask, reg); |
72 | local_irq_restore(flags); | 72 | local_irq_restore(flags); |
73 | } | 73 | } |
74 | 74 | ||
@@ -83,9 +83,9 @@ void disable_cayman_irq(unsigned int irq) | |||
83 | reg = EPLD_MASK_BASE + ((irq / 8) << 2); | 83 | reg = EPLD_MASK_BASE + ((irq / 8) << 2); |
84 | bit = 1<<(irq % 8); | 84 | bit = 1<<(irq % 8); |
85 | local_irq_save(flags); | 85 | local_irq_save(flags); |
86 | mask = ctrl_inl(reg); | 86 | mask = __raw_readl(reg); |
87 | mask &= ~bit; | 87 | mask &= ~bit; |
88 | ctrl_outl(mask, reg); | 88 | __raw_writel(mask, reg); |
89 | local_irq_restore(flags); | 89 | local_irq_restore(flags); |
90 | } | 90 | } |
91 | 91 | ||
@@ -109,8 +109,8 @@ int cayman_irq_demux(int evt) | |||
109 | unsigned long status; | 109 | unsigned long status; |
110 | int i; | 110 | int i; |
111 | 111 | ||
112 | status = ctrl_inl(EPLD_STATUS_BASE) & | 112 | status = __raw_readl(EPLD_STATUS_BASE) & |
113 | ctrl_inl(EPLD_MASK_BASE) & 0xff; | 113 | __raw_readl(EPLD_MASK_BASE) & 0xff; |
114 | if (status == 0) { | 114 | if (status == 0) { |
115 | irq = -1; | 115 | irq = -1; |
116 | } else { | 116 | } else { |
@@ -126,8 +126,8 @@ int cayman_irq_demux(int evt) | |||
126 | unsigned long status; | 126 | unsigned long status; |
127 | int i; | 127 | int i; |
128 | 128 | ||
129 | status = ctrl_inl(EPLD_STATUS_BASE + 3 * sizeof(u32)) & | 129 | status = __raw_readl(EPLD_STATUS_BASE + 3 * sizeof(u32)) & |
130 | ctrl_inl(EPLD_MASK_BASE + 3 * sizeof(u32)) & 0xff; | 130 | __raw_readl(EPLD_MASK_BASE + 3 * sizeof(u32)) & 0xff; |
131 | if (status == 0) { | 131 | if (status == 0) { |
132 | irq = -1; | 132 | irq = -1; |
133 | } else { | 133 | } else { |
diff --git a/arch/sh/boards/mach-dreamcast/irq.c b/arch/sh/boards/mach-dreamcast/irq.c index f55fc8e795e9..d932667410ab 100644 --- a/arch/sh/boards/mach-dreamcast/irq.c +++ b/arch/sh/boards/mach-dreamcast/irq.c | |||
@@ -135,3 +135,30 @@ int systemasic_irq_demux(int irq) | |||
135 | /* Not reached */ | 135 | /* Not reached */ |
136 | return irq; | 136 | return irq; |
137 | } | 137 | } |
138 | |||
139 | void systemasic_irq_init(void) | ||
140 | { | ||
141 | int i, nid = cpu_to_node(boot_cpu_data); | ||
142 | |||
143 | /* Assign all virtual IRQs to the System ASIC int. handler */ | ||
144 | for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) { | ||
145 | unsigned int irq; | ||
146 | |||
147 | irq = create_irq_nr(i, nid); | ||
148 | if (unlikely(irq == 0)) { | ||
149 | pr_err("%s: failed hooking irq %d for systemasic\n", | ||
150 | __func__, i); | ||
151 | return; | ||
152 | } | ||
153 | |||
154 | if (unlikely(irq != i)) { | ||
155 | pr_err("%s: got irq %d but wanted %d, bailing.\n", | ||
156 | __func__, irq, i); | ||
157 | destroy_irq(irq); | ||
158 | return; | ||
159 | } | ||
160 | |||
161 | set_irq_chip_and_handler(i, &systemasic_int, | ||
162 | handle_level_irq); | ||
163 | } | ||
164 | } | ||
diff --git a/arch/sh/boards/mach-dreamcast/rtc.c b/arch/sh/boards/mach-dreamcast/rtc.c index a7433685798d..061d65714fcc 100644 --- a/arch/sh/boards/mach-dreamcast/rtc.c +++ b/arch/sh/boards/mach-dreamcast/rtc.c | |||
@@ -35,11 +35,11 @@ static void aica_rtc_gettimeofday(struct timespec *ts) | |||
35 | unsigned long val1, val2; | 35 | unsigned long val1, val2; |
36 | 36 | ||
37 | do { | 37 | do { |
38 | val1 = ((ctrl_inl(AICA_RTC_SECS_H) & 0xffff) << 16) | | 38 | val1 = ((__raw_readl(AICA_RTC_SECS_H) & 0xffff) << 16) | |
39 | (ctrl_inl(AICA_RTC_SECS_L) & 0xffff); | 39 | (__raw_readl(AICA_RTC_SECS_L) & 0xffff); |
40 | 40 | ||
41 | val2 = ((ctrl_inl(AICA_RTC_SECS_H) & 0xffff) << 16) | | 41 | val2 = ((__raw_readl(AICA_RTC_SECS_H) & 0xffff) << 16) | |
42 | (ctrl_inl(AICA_RTC_SECS_L) & 0xffff); | 42 | (__raw_readl(AICA_RTC_SECS_L) & 0xffff); |
43 | } while (val1 != val2); | 43 | } while (val1 != val2); |
44 | 44 | ||
45 | ts->tv_sec = val1 - TWENTY_YEARS; | 45 | ts->tv_sec = val1 - TWENTY_YEARS; |
@@ -60,14 +60,14 @@ static int aica_rtc_settimeofday(const time_t secs) | |||
60 | unsigned long adj = secs + TWENTY_YEARS; | 60 | unsigned long adj = secs + TWENTY_YEARS; |
61 | 61 | ||
62 | do { | 62 | do { |
63 | ctrl_outl((adj & 0xffff0000) >> 16, AICA_RTC_SECS_H); | 63 | __raw_writel((adj & 0xffff0000) >> 16, AICA_RTC_SECS_H); |
64 | ctrl_outl((adj & 0xffff), AICA_RTC_SECS_L); | 64 | __raw_writel((adj & 0xffff), AICA_RTC_SECS_L); |
65 | 65 | ||
66 | val1 = ((ctrl_inl(AICA_RTC_SECS_H) & 0xffff) << 16) | | 66 | val1 = ((__raw_readl(AICA_RTC_SECS_H) & 0xffff) << 16) | |
67 | (ctrl_inl(AICA_RTC_SECS_L) & 0xffff); | 67 | (__raw_readl(AICA_RTC_SECS_L) & 0xffff); |
68 | 68 | ||
69 | val2 = ((ctrl_inl(AICA_RTC_SECS_H) & 0xffff) << 16) | | 69 | val2 = ((__raw_readl(AICA_RTC_SECS_H) & 0xffff) << 16) | |
70 | (ctrl_inl(AICA_RTC_SECS_L) & 0xffff); | 70 | (__raw_readl(AICA_RTC_SECS_L) & 0xffff); |
71 | } while (val1 != val2); | 71 | } while (val1 != val2); |
72 | 72 | ||
73 | return 0; | 73 | return 0; |
diff --git a/arch/sh/boards/mach-dreamcast/setup.c b/arch/sh/boards/mach-dreamcast/setup.c index a4b7402d6176..ad1a4db72e04 100644 --- a/arch/sh/boards/mach-dreamcast/setup.c +++ b/arch/sh/boards/mach-dreamcast/setup.c | |||
@@ -28,25 +28,8 @@ | |||
28 | #include <asm/machvec.h> | 28 | #include <asm/machvec.h> |
29 | #include <mach/sysasic.h> | 29 | #include <mach/sysasic.h> |
30 | 30 | ||
31 | extern struct irq_chip systemasic_int; | ||
32 | extern void aica_time_init(void); | ||
33 | extern int systemasic_irq_demux(int); | ||
34 | |||
35 | static void __init dreamcast_setup(char **cmdline_p) | 31 | static void __init dreamcast_setup(char **cmdline_p) |
36 | { | 32 | { |
37 | int i; | ||
38 | |||
39 | /* Mask all hardware events */ | ||
40 | /* XXX */ | ||
41 | |||
42 | /* Acknowledge any previous events */ | ||
43 | /* XXX */ | ||
44 | |||
45 | /* Assign all virtual IRQs to the System ASIC int. handler */ | ||
46 | for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) | ||
47 | set_irq_chip_and_handler(i, &systemasic_int, | ||
48 | handle_level_irq); | ||
49 | |||
50 | board_time_init = aica_time_init; | 33 | board_time_init = aica_time_init; |
51 | } | 34 | } |
52 | 35 | ||
@@ -54,4 +37,5 @@ static struct sh_machine_vector mv_dreamcast __initmv = { | |||
54 | .mv_name = "Sega Dreamcast", | 37 | .mv_name = "Sega Dreamcast", |
55 | .mv_setup = dreamcast_setup, | 38 | .mv_setup = dreamcast_setup, |
56 | .mv_irq_demux = systemasic_irq_demux, | 39 | .mv_irq_demux = systemasic_irq_demux, |
40 | .mv_init_irq = systemasic_irq_init, | ||
57 | }; | 41 | }; |
diff --git a/arch/sh/boards/mach-ecovec24/sdram.S b/arch/sh/boards/mach-ecovec24/sdram.S index 833440044407..3963c6f23d52 100644 --- a/arch/sh/boards/mach-ecovec24/sdram.S +++ b/arch/sh/boards/mach-ecovec24/sdram.S | |||
@@ -37,6 +37,10 @@ ENTRY(ecovec24_sdram_enter_end) | |||
37 | .balign 4 | 37 | .balign 4 |
38 | ENTRY(ecovec24_sdram_leave_start) | 38 | ENTRY(ecovec24_sdram_leave_start) |
39 | 39 | ||
40 | mov.l @(SH_SLEEP_MODE, r5), r0 | ||
41 | tst #SUSP_SH_RSTANDBY, r0 | ||
42 | bf resume_rstandby | ||
43 | |||
40 | /* DBSC: put memory in auto-refresh mode */ | 44 | /* DBSC: put memory in auto-refresh mode */ |
41 | 45 | ||
42 | ED 0xFD000040, 0x00000000 /* DBRFPDN0 */ | 46 | ED 0xFD000040, 0x00000000 /* DBRFPDN0 */ |
@@ -49,4 +53,59 @@ ENTRY(ecovec24_sdram_leave_start) | |||
49 | rts | 53 | rts |
50 | nop | 54 | nop |
51 | 55 | ||
56 | resume_rstandby: | ||
57 | |||
58 | /* DBSC: re-initialize and put in auto-refresh */ | ||
59 | |||
60 | ED 0xFD000108, 0x00000181 /* DBPDCNT0 */ | ||
61 | ED 0xFD000020, 0x015B0002 /* DBCONF */ | ||
62 | ED 0xFD000030, 0x03071502 /* DBTR0 */ | ||
63 | ED 0xFD000034, 0x02020102 /* DBTR1 */ | ||
64 | ED 0xFD000038, 0x01090405 /* DBTR2 */ | ||
65 | ED 0xFD00003C, 0x00000002 /* DBTR3 */ | ||
66 | ED 0xFD000008, 0x00000005 /* DBKIND */ | ||
67 | ED 0xFD000040, 0x00000001 /* DBRFPDN0 */ | ||
68 | ED 0xFD000040, 0x00000000 /* DBRFPDN0 */ | ||
69 | ED 0xFD000018, 0x00000001 /* DBCKECNT */ | ||
70 | |||
71 | mov #100,r0 | ||
72 | WAIT_400NS: | ||
73 | dt r0 | ||
74 | bf WAIT_400NS | ||
75 | |||
76 | ED 0xFD000014, 0x00000002 /* DBCMDCNT (PALL) */ | ||
77 | ED 0xFD000060, 0x00020000 /* DBMRCNT (EMR2) */ | ||
78 | ED 0xFD000060, 0x00030000 /* DBMRCNT (EMR3) */ | ||
79 | ED 0xFD000060, 0x00010004 /* DBMRCNT (EMR) */ | ||
80 | ED 0xFD000060, 0x00000532 /* DBMRCNT (MRS) */ | ||
81 | ED 0xFD000014, 0x00000002 /* DBCMDCNT (PALL) */ | ||
82 | ED 0xFD000014, 0x00000004 /* DBCMDCNT (REF) */ | ||
83 | ED 0xFD000014, 0x00000004 /* DBCMDCNT (REF) */ | ||
84 | ED 0xFD000060, 0x00000432 /* DBMRCNT (MRS) */ | ||
85 | ED 0xFD000060, 0x000103c0 /* DBMRCNT (EMR) */ | ||
86 | ED 0xFD000060, 0x00010040 /* DBMRCNT (EMR) */ | ||
87 | |||
88 | mov #100,r0 | ||
89 | WAIT_400NS_2: | ||
90 | dt r0 | ||
91 | bf WAIT_400NS_2 | ||
92 | |||
93 | ED 0xFD000010, 0x00000001 /* DBEN */ | ||
94 | ED 0xFD000044, 0x0000050f /* DBRFPDN1 */ | ||
95 | ED 0xFD000048, 0x236800e6 /* DBRFPDN2 */ | ||
96 | |||
97 | mov.l DUMMY,r0 | ||
98 | mov.l @r0, r1 /* force single dummy read */ | ||
99 | |||
100 | ED 0xFD000014, 0x00000002 /* DBCMDCNT (PALL) */ | ||
101 | ED 0xFD000014, 0x00000004 /* DBCMDCNT (REF) */ | ||
102 | ED 0xFD000108, 0x00000080 /* DBPDCNT0 */ | ||
103 | ED 0xFD000040, 0x00010000 /* DBRFPDN0 */ | ||
104 | |||
105 | rts | ||
106 | nop | ||
107 | |||
108 | .balign 4 | ||
109 | DUMMY: .long 0xac400000 | ||
110 | |||
52 | ENTRY(ecovec24_sdram_leave_end) | 111 | ENTRY(ecovec24_sdram_leave_end) |
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 5c246289b4f0..39ed8722d11a 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
@@ -64,18 +64,16 @@ | |||
64 | 64 | ||
65 | /* Heartbeat */ | 65 | /* Heartbeat */ |
66 | static unsigned char led_pos[] = { 0, 1, 2, 3 }; | 66 | static unsigned char led_pos[] = { 0, 1, 2, 3 }; |
67 | |||
67 | static struct heartbeat_data heartbeat_data = { | 68 | static struct heartbeat_data heartbeat_data = { |
68 | .regsize = 8, | ||
69 | .nr_bits = 4, | 69 | .nr_bits = 4, |
70 | .bit_pos = led_pos, | 70 | .bit_pos = led_pos, |
71 | }; | 71 | }; |
72 | 72 | ||
73 | static struct resource heartbeat_resources[] = { | 73 | static struct resource heartbeat_resource = { |
74 | [0] = { | 74 | .start = 0xA405012C, /* PTG */ |
75 | .start = 0xA405012C, /* PTG */ | 75 | .end = 0xA405012E - 1, |
76 | .end = 0xA405012E - 1, | 76 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_8BIT, |
77 | .flags = IORESOURCE_MEM, | ||
78 | }, | ||
79 | }; | 77 | }; |
80 | 78 | ||
81 | static struct platform_device heartbeat_device = { | 79 | static struct platform_device heartbeat_device = { |
@@ -84,8 +82,8 @@ static struct platform_device heartbeat_device = { | |||
84 | .dev = { | 82 | .dev = { |
85 | .platform_data = &heartbeat_data, | 83 | .platform_data = &heartbeat_data, |
86 | }, | 84 | }, |
87 | .num_resources = ARRAY_SIZE(heartbeat_resources), | 85 | .num_resources = 1, |
88 | .resource = heartbeat_resources, | 86 | .resource = &heartbeat_resource, |
89 | }; | 87 | }; |
90 | 88 | ||
91 | /* MTD */ | 89 | /* MTD */ |
@@ -455,7 +453,7 @@ static struct resource sdhi0_resources[] = { | |||
455 | .flags = IORESOURCE_MEM, | 453 | .flags = IORESOURCE_MEM, |
456 | }, | 454 | }, |
457 | [1] = { | 455 | [1] = { |
458 | .start = 101, | 456 | .start = 100, |
459 | .flags = IORESOURCE_IRQ, | 457 | .flags = IORESOURCE_IRQ, |
460 | }, | 458 | }, |
461 | }; | 459 | }; |
@@ -491,7 +489,7 @@ static struct resource sdhi1_resources[] = { | |||
491 | .flags = IORESOURCE_MEM, | 489 | .flags = IORESOURCE_MEM, |
492 | }, | 490 | }, |
493 | [1] = { | 491 | [1] = { |
494 | .start = 24, | 492 | .start = 23, |
495 | .flags = IORESOURCE_IRQ, | 493 | .flags = IORESOURCE_IRQ, |
496 | }, | 494 | }, |
497 | }; | 495 | }; |
@@ -698,13 +696,13 @@ static struct platform_device camera_devices[] = { | |||
698 | #define FCLKBCR 0xa415000c | 696 | #define FCLKBCR 0xa415000c |
699 | static void fsimck_init(struct clk *clk) | 697 | static void fsimck_init(struct clk *clk) |
700 | { | 698 | { |
701 | u32 status = ctrl_inl(clk->enable_reg); | 699 | u32 status = __raw_readl(clk->enable_reg); |
702 | 700 | ||
703 | /* use external clock */ | 701 | /* use external clock */ |
704 | status &= ~0x000000ff; | 702 | status &= ~0x000000ff; |
705 | status |= 0x00000080; | 703 | status |= 0x00000080; |
706 | 704 | ||
707 | ctrl_outl(status, clk->enable_reg); | 705 | __raw_writel(status, clk->enable_reg); |
708 | } | 706 | } |
709 | 707 | ||
710 | static struct clk_ops fsimck_clk_ops = { | 708 | static struct clk_ops fsimck_clk_ops = { |
@@ -753,6 +751,26 @@ static struct platform_device fsi_device = { | |||
753 | }, | 751 | }, |
754 | }; | 752 | }; |
755 | 753 | ||
754 | /* IrDA */ | ||
755 | static struct resource irda_resources[] = { | ||
756 | [0] = { | ||
757 | .name = "IrDA", | ||
758 | .start = 0xA45D0000, | ||
759 | .end = 0xA45D0049, | ||
760 | .flags = IORESOURCE_MEM, | ||
761 | }, | ||
762 | [1] = { | ||
763 | .start = 20, | ||
764 | .flags = IORESOURCE_IRQ, | ||
765 | }, | ||
766 | }; | ||
767 | |||
768 | static struct platform_device irda_device = { | ||
769 | .name = "sh_sir", | ||
770 | .num_resources = ARRAY_SIZE(irda_resources), | ||
771 | .resource = irda_resources, | ||
772 | }; | ||
773 | |||
756 | static struct platform_device *ecovec_devices[] __initdata = { | 774 | static struct platform_device *ecovec_devices[] __initdata = { |
757 | &heartbeat_device, | 775 | &heartbeat_device, |
758 | &nor_flash_device, | 776 | &nor_flash_device, |
@@ -773,8 +791,10 @@ static struct platform_device *ecovec_devices[] __initdata = { | |||
773 | &camera_devices[1], | 791 | &camera_devices[1], |
774 | &camera_devices[2], | 792 | &camera_devices[2], |
775 | &fsi_device, | 793 | &fsi_device, |
794 | &irda_device, | ||
776 | }; | 795 | }; |
777 | 796 | ||
797 | #ifdef CONFIG_I2C | ||
778 | #define EEPROM_ADDR 0x50 | 798 | #define EEPROM_ADDR 0x50 |
779 | static u8 mac_read(struct i2c_adapter *a, u8 command) | 799 | static u8 mac_read(struct i2c_adapter *a, u8 command) |
780 | { | 800 | { |
@@ -817,6 +837,12 @@ static void __init sh_eth_init(struct sh_eth_plat_data *pd) | |||
817 | msleep(10); | 837 | msleep(10); |
818 | } | 838 | } |
819 | } | 839 | } |
840 | #else | ||
841 | static void __init sh_eth_init(struct sh_eth_plat_data *pd) | ||
842 | { | ||
843 | pr_err("unable to read sh_eth MAC address\n"); | ||
844 | } | ||
845 | #endif | ||
820 | 846 | ||
821 | #define PORT_HIZA 0xA4050158 | 847 | #define PORT_HIZA 0xA4050158 |
822 | #define IODRIVEA 0xA405018A | 848 | #define IODRIVEA 0xA405018A |
@@ -831,7 +857,8 @@ static int __init arch_setup(void) | |||
831 | struct clk *clk; | 857 | struct clk *clk; |
832 | 858 | ||
833 | /* register board specific self-refresh code */ | 859 | /* register board specific self-refresh code */ |
834 | sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF, | 860 | sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF | |
861 | SUSP_SH_RSTANDBY, | ||
835 | &ecovec24_sdram_enter_start, | 862 | &ecovec24_sdram_enter_start, |
836 | &ecovec24_sdram_enter_end, | 863 | &ecovec24_sdram_enter_end, |
837 | &ecovec24_sdram_leave_start, | 864 | &ecovec24_sdram_leave_start, |
@@ -855,7 +882,7 @@ static int __init arch_setup(void) | |||
855 | gpio_direction_output(GPIO_PTG1, 0); | 882 | gpio_direction_output(GPIO_PTG1, 0); |
856 | gpio_direction_output(GPIO_PTG2, 0); | 883 | gpio_direction_output(GPIO_PTG2, 0); |
857 | gpio_direction_output(GPIO_PTG3, 0); | 884 | gpio_direction_output(GPIO_PTG3, 0); |
858 | ctrl_outw((ctrl_inw(PORT_HIZA) & ~(0x1 << 1)) , PORT_HIZA); | 885 | __raw_writew((__raw_readw(PORT_HIZA) & ~(0x1 << 1)) , PORT_HIZA); |
859 | 886 | ||
860 | /* enable SH-Eth */ | 887 | /* enable SH-Eth */ |
861 | gpio_request(GPIO_PTA1, NULL); | 888 | gpio_request(GPIO_PTA1, NULL); |
@@ -875,16 +902,16 @@ static int __init arch_setup(void) | |||
875 | gpio_request(GPIO_FN_LNKSTA, NULL); | 902 | gpio_request(GPIO_FN_LNKSTA, NULL); |
876 | 903 | ||
877 | /* enable USB */ | 904 | /* enable USB */ |
878 | ctrl_outw(0x0000, 0xA4D80000); | 905 | __raw_writew(0x0000, 0xA4D80000); |
879 | ctrl_outw(0x0000, 0xA4D90000); | 906 | __raw_writew(0x0000, 0xA4D90000); |
880 | gpio_request(GPIO_PTB3, NULL); | 907 | gpio_request(GPIO_PTB3, NULL); |
881 | gpio_request(GPIO_PTB4, NULL); | 908 | gpio_request(GPIO_PTB4, NULL); |
882 | gpio_request(GPIO_PTB5, NULL); | 909 | gpio_request(GPIO_PTB5, NULL); |
883 | gpio_direction_input(GPIO_PTB3); | 910 | gpio_direction_input(GPIO_PTB3); |
884 | gpio_direction_output(GPIO_PTB4, 0); | 911 | gpio_direction_output(GPIO_PTB4, 0); |
885 | gpio_direction_output(GPIO_PTB5, 0); | 912 | gpio_direction_output(GPIO_PTB5, 0); |
886 | ctrl_outw(0x0600, 0xa40501d4); | 913 | __raw_writew(0x0600, 0xa40501d4); |
887 | ctrl_outw(0x0600, 0xa4050192); | 914 | __raw_writew(0x0600, 0xa4050192); |
888 | 915 | ||
889 | if (gpio_get_value(GPIO_PTB3)) { | 916 | if (gpio_get_value(GPIO_PTB3)) { |
890 | printk(KERN_INFO "USB1 function is selected\n"); | 917 | printk(KERN_INFO "USB1 function is selected\n"); |
@@ -925,7 +952,7 @@ static int __init arch_setup(void) | |||
925 | gpio_request(GPIO_FN_LCDVSYN, NULL); | 952 | gpio_request(GPIO_FN_LCDVSYN, NULL); |
926 | gpio_request(GPIO_FN_LCDDON, NULL); | 953 | gpio_request(GPIO_FN_LCDDON, NULL); |
927 | gpio_request(GPIO_FN_LCDLCLK, NULL); | 954 | gpio_request(GPIO_FN_LCDLCLK, NULL); |
928 | ctrl_outw((ctrl_inw(PORT_HIZA) & ~0x0001), PORT_HIZA); | 955 | __raw_writew((__raw_readw(PORT_HIZA) & ~0x0001), PORT_HIZA); |
929 | 956 | ||
930 | gpio_request(GPIO_PTE6, NULL); | 957 | gpio_request(GPIO_PTE6, NULL); |
931 | gpio_request(GPIO_PTU1, NULL); | 958 | gpio_request(GPIO_PTU1, NULL); |
@@ -937,7 +964,7 @@ static int __init arch_setup(void) | |||
937 | gpio_direction_output(GPIO_PTA2, 0); | 964 | gpio_direction_output(GPIO_PTA2, 0); |
938 | 965 | ||
939 | /* I/O buffer drive ability is high */ | 966 | /* I/O buffer drive ability is high */ |
940 | ctrl_outw((ctrl_inw(IODRIVEA) & ~0x00c0) | 0x0080 , IODRIVEA); | 967 | __raw_writew((__raw_readw(IODRIVEA) & ~0x00c0) | 0x0080 , IODRIVEA); |
941 | 968 | ||
942 | if (gpio_get_value(GPIO_PTE6)) { | 969 | if (gpio_get_value(GPIO_PTE6)) { |
943 | /* DVI */ | 970 | /* DVI */ |
@@ -1069,7 +1096,7 @@ static int __init arch_setup(void) | |||
1069 | gpio_direction_output(GPIO_PTB7, 0); | 1096 | gpio_direction_output(GPIO_PTB7, 0); |
1070 | 1097 | ||
1071 | /* I/O buffer drive ability is high for SDHI1 */ | 1098 | /* I/O buffer drive ability is high for SDHI1 */ |
1072 | ctrl_outw((ctrl_inw(IODRIVEA) & ~0x3000) | 0x2000 , IODRIVEA); | 1099 | __raw_writew((__raw_readw(IODRIVEA) & ~0x3000) | 0x2000 , IODRIVEA); |
1073 | #else | 1100 | #else |
1074 | /* enable MSIOF0 on CN11 (needs DS2.4 set to OFF) */ | 1101 | /* enable MSIOF0 on CN11 (needs DS2.4 set to OFF) */ |
1075 | gpio_request(GPIO_FN_MSIOF0_TXD, NULL); | 1102 | gpio_request(GPIO_FN_MSIOF0_TXD, NULL); |
@@ -1107,6 +1134,11 @@ static int __init arch_setup(void) | |||
1107 | gpio_request(GPIO_FN_FSIOBLRCK, NULL); | 1134 | gpio_request(GPIO_FN_FSIOBLRCK, NULL); |
1108 | gpio_request(GPIO_FN_CLKAUDIOBO, NULL); | 1135 | gpio_request(GPIO_FN_CLKAUDIOBO, NULL); |
1109 | 1136 | ||
1137 | /* set SPU2 clock to 83.4 MHz */ | ||
1138 | clk = clk_get(NULL, "spu_clk"); | ||
1139 | clk_set_rate(clk, clk_round_rate(clk, 83333333)); | ||
1140 | clk_put(clk); | ||
1141 | |||
1110 | /* change parent of FSI B */ | 1142 | /* change parent of FSI B */ |
1111 | clk = clk_get(NULL, "fsib_clk"); | 1143 | clk = clk_get(NULL, "fsib_clk"); |
1112 | clk_register(&fsimckb_clk); | 1144 | clk_register(&fsimckb_clk); |
@@ -1123,6 +1155,17 @@ static int __init arch_setup(void) | |||
1123 | gpio_request(GPIO_FN_INTC_IRQ1, NULL); | 1155 | gpio_request(GPIO_FN_INTC_IRQ1, NULL); |
1124 | gpio_direction_input(GPIO_FN_INTC_IRQ1); | 1156 | gpio_direction_input(GPIO_FN_INTC_IRQ1); |
1125 | 1157 | ||
1158 | /* set VPU clock to 166 MHz */ | ||
1159 | clk = clk_get(NULL, "vpu_clk"); | ||
1160 | clk_set_rate(clk, clk_round_rate(clk, 166000000)); | ||
1161 | clk_put(clk); | ||
1162 | |||
1163 | /* enable IrDA */ | ||
1164 | gpio_request(GPIO_FN_IRDA_OUT, NULL); | ||
1165 | gpio_request(GPIO_FN_IRDA_IN, NULL); | ||
1166 | gpio_request(GPIO_PTU5, NULL); | ||
1167 | gpio_direction_output(GPIO_PTU5, 0); | ||
1168 | |||
1126 | /* enable I2C device */ | 1169 | /* enable I2C device */ |
1127 | i2c_register_board_info(0, i2c0_devices, | 1170 | i2c_register_board_info(0, i2c0_devices, |
1128 | ARRAY_SIZE(i2c0_devices)); | 1171 | ARRAY_SIZE(i2c0_devices)); |
diff --git a/arch/sh/boards/mach-highlander/irq-r7780mp.c b/arch/sh/boards/mach-highlander/irq-r7780mp.c index 83c28bcd4d2a..9893fd3a1358 100644 --- a/arch/sh/boards/mach-highlander/irq-r7780mp.c +++ b/arch/sh/boards/mach-highlander/irq-r7780mp.c | |||
@@ -64,7 +64,7 @@ static DECLARE_INTC_DESC(intc_desc, "r7780mp", vectors, | |||
64 | 64 | ||
65 | unsigned char * __init highlander_plat_irq_setup(void) | 65 | unsigned char * __init highlander_plat_irq_setup(void) |
66 | { | 66 | { |
67 | if ((ctrl_inw(0xa4000700) & 0xf000) == 0x2000) { | 67 | if ((__raw_readw(0xa4000700) & 0xf000) == 0x2000) { |
68 | printk(KERN_INFO "Using r7780mp interrupt controller.\n"); | 68 | printk(KERN_INFO "Using r7780mp interrupt controller.\n"); |
69 | register_intc_controller(&intc_desc); | 69 | register_intc_controller(&intc_desc); |
70 | return irl2irq; | 70 | return irl2irq; |
diff --git a/arch/sh/boards/mach-highlander/irq-r7780rp.c b/arch/sh/boards/mach-highlander/irq-r7780rp.c index b721e86b5af4..0805b2151452 100644 --- a/arch/sh/boards/mach-highlander/irq-r7780rp.c +++ b/arch/sh/boards/mach-highlander/irq-r7780rp.c | |||
@@ -57,7 +57,7 @@ static DECLARE_INTC_DESC(intc_desc, "r7780rp", vectors, | |||
57 | 57 | ||
58 | unsigned char * __init highlander_plat_irq_setup(void) | 58 | unsigned char * __init highlander_plat_irq_setup(void) |
59 | { | 59 | { |
60 | if (ctrl_inw(0xa5000600)) { | 60 | if (__raw_readw(0xa5000600)) { |
61 | printk(KERN_INFO "Using r7780rp interrupt controller.\n"); | 61 | printk(KERN_INFO "Using r7780rp interrupt controller.\n"); |
62 | register_intc_controller(&intc_desc); | 62 | register_intc_controller(&intc_desc); |
63 | return irl2irq; | 63 | return irl2irq; |
diff --git a/arch/sh/boards/mach-highlander/irq-r7785rp.c b/arch/sh/boards/mach-highlander/irq-r7785rp.c index 3811b060a39b..558b24862776 100644 --- a/arch/sh/boards/mach-highlander/irq-r7785rp.c +++ b/arch/sh/boards/mach-highlander/irq-r7785rp.c | |||
@@ -66,20 +66,20 @@ static DECLARE_INTC_DESC(intc_desc, "r7785rp", vectors, | |||
66 | 66 | ||
67 | unsigned char * __init highlander_plat_irq_setup(void) | 67 | unsigned char * __init highlander_plat_irq_setup(void) |
68 | { | 68 | { |
69 | if ((ctrl_inw(0xa4000158) & 0xf000) != 0x1000) | 69 | if ((__raw_readw(0xa4000158) & 0xf000) != 0x1000) |
70 | return NULL; | 70 | return NULL; |
71 | 71 | ||
72 | printk(KERN_INFO "Using r7785rp interrupt controller.\n"); | 72 | printk(KERN_INFO "Using r7785rp interrupt controller.\n"); |
73 | 73 | ||
74 | ctrl_outw(0x0000, PA_IRLSSR1); /* FPGA IRLSSR1(CF_CD clear) */ | 74 | __raw_writew(0x0000, PA_IRLSSR1); /* FPGA IRLSSR1(CF_CD clear) */ |
75 | 75 | ||
76 | /* Setup the FPGA IRL */ | 76 | /* Setup the FPGA IRL */ |
77 | ctrl_outw(0x0000, PA_IRLPRA); /* FPGA IRLA */ | 77 | __raw_writew(0x0000, PA_IRLPRA); /* FPGA IRLA */ |
78 | ctrl_outw(0xe598, PA_IRLPRB); /* FPGA IRLB */ | 78 | __raw_writew(0xe598, PA_IRLPRB); /* FPGA IRLB */ |
79 | ctrl_outw(0x7060, PA_IRLPRC); /* FPGA IRLC */ | 79 | __raw_writew(0x7060, PA_IRLPRC); /* FPGA IRLC */ |
80 | ctrl_outw(0x0000, PA_IRLPRD); /* FPGA IRLD */ | 80 | __raw_writew(0x0000, PA_IRLPRD); /* FPGA IRLD */ |
81 | ctrl_outw(0x4321, PA_IRLPRE); /* FPGA IRLE */ | 81 | __raw_writew(0x4321, PA_IRLPRE); /* FPGA IRLE */ |
82 | ctrl_outw(0xdcba, PA_IRLPRF); /* FPGA IRLF */ | 82 | __raw_writew(0xdcba, PA_IRLPRF); /* FPGA IRLF */ |
83 | 83 | ||
84 | register_intc_controller(&intc_desc); | 84 | register_intc_controller(&intc_desc); |
85 | return irl2irq; | 85 | return irl2irq; |
diff --git a/arch/sh/boards/mach-highlander/psw.c b/arch/sh/boards/mach-highlander/psw.c index 37b1a2ee71a5..522786318d36 100644 --- a/arch/sh/boards/mach-highlander/psw.c +++ b/arch/sh/boards/mach-highlander/psw.c | |||
@@ -24,7 +24,7 @@ static irqreturn_t psw_irq_handler(int irq, void *arg) | |||
24 | unsigned int l, mask; | 24 | unsigned int l, mask; |
25 | int ret = 0; | 25 | int ret = 0; |
26 | 26 | ||
27 | l = ctrl_inw(PA_DBSW); | 27 | l = __raw_readw(PA_DBSW); |
28 | 28 | ||
29 | /* Nothing to do if there's no state change */ | 29 | /* Nothing to do if there's no state change */ |
30 | if (psw->state) { | 30 | if (psw->state) { |
@@ -45,7 +45,7 @@ static irqreturn_t psw_irq_handler(int irq, void *arg) | |||
45 | out: | 45 | out: |
46 | /* Clear the switch IRQs */ | 46 | /* Clear the switch IRQs */ |
47 | l |= (0x7 << 12); | 47 | l |= (0x7 << 12); |
48 | ctrl_outw(l, PA_DBSW); | 48 | __raw_writew(l, PA_DBSW); |
49 | 49 | ||
50 | return IRQ_RETVAL(ret); | 50 | return IRQ_RETVAL(ret); |
51 | } | 51 | } |
diff --git a/arch/sh/boards/mach-highlander/setup.c b/arch/sh/boards/mach-highlander/setup.c index f663c14d8885..affd66747ba3 100644 --- a/arch/sh/boards/mach-highlander/setup.c +++ b/arch/sh/boards/mach-highlander/setup.c | |||
@@ -311,13 +311,13 @@ device_initcall(r7780rp_devices_setup); | |||
311 | */ | 311 | */ |
312 | static int ivdr_clk_enable(struct clk *clk) | 312 | static int ivdr_clk_enable(struct clk *clk) |
313 | { | 313 | { |
314 | ctrl_outw(ctrl_inw(PA_IVDRCTL) | (1 << IVDR_CK_ON), PA_IVDRCTL); | 314 | __raw_writew(__raw_readw(PA_IVDRCTL) | (1 << IVDR_CK_ON), PA_IVDRCTL); |
315 | return 0; | 315 | return 0; |
316 | } | 316 | } |
317 | 317 | ||
318 | static void ivdr_clk_disable(struct clk *clk) | 318 | static void ivdr_clk_disable(struct clk *clk) |
319 | { | 319 | { |
320 | ctrl_outw(ctrl_inw(PA_IVDRCTL) & ~(1 << IVDR_CK_ON), PA_IVDRCTL); | 320 | __raw_writew(__raw_readw(PA_IVDRCTL) & ~(1 << IVDR_CK_ON), PA_IVDRCTL); |
321 | } | 321 | } |
322 | 322 | ||
323 | static struct clk_ops ivdr_clk_ops = { | 323 | static struct clk_ops ivdr_clk_ops = { |
@@ -337,7 +337,7 @@ static struct clk *r7780rp_clocks[] = { | |||
337 | static void r7780rp_power_off(void) | 337 | static void r7780rp_power_off(void) |
338 | { | 338 | { |
339 | if (mach_is_r7780mp() || mach_is_r7785rp()) | 339 | if (mach_is_r7780mp() || mach_is_r7785rp()) |
340 | ctrl_outw(0x0001, PA_POFF); | 340 | __raw_writew(0x0001, PA_POFF); |
341 | } | 341 | } |
342 | 342 | ||
343 | /* | 343 | /* |
@@ -345,7 +345,7 @@ static void r7780rp_power_off(void) | |||
345 | */ | 345 | */ |
346 | static void __init highlander_setup(char **cmdline_p) | 346 | static void __init highlander_setup(char **cmdline_p) |
347 | { | 347 | { |
348 | u16 ver = ctrl_inw(PA_VERREG); | 348 | u16 ver = __raw_readw(PA_VERREG); |
349 | int i; | 349 | int i; |
350 | 350 | ||
351 | printk(KERN_INFO "Renesas Solutions Highlander %s support.\n", | 351 | printk(KERN_INFO "Renesas Solutions Highlander %s support.\n", |
@@ -370,12 +370,12 @@ static void __init highlander_setup(char **cmdline_p) | |||
370 | clk_enable(clk); | 370 | clk_enable(clk); |
371 | } | 371 | } |
372 | 372 | ||
373 | ctrl_outw(0x0000, PA_OBLED); /* Clear LED. */ | 373 | __raw_writew(0x0000, PA_OBLED); /* Clear LED. */ |
374 | 374 | ||
375 | if (mach_is_r7780rp()) | 375 | if (mach_is_r7780rp()) |
376 | ctrl_outw(0x0001, PA_SDPOW); /* SD Power ON */ | 376 | __raw_writew(0x0001, PA_SDPOW); /* SD Power ON */ |
377 | 377 | ||
378 | ctrl_outw(ctrl_inw(PA_IVDRCTL) | 0x01, PA_IVDRCTL); /* Si13112 */ | 378 | __raw_writew(__raw_readw(PA_IVDRCTL) | 0x01, PA_IVDRCTL); /* Si13112 */ |
379 | 379 | ||
380 | pm_power_off = r7780rp_power_off; | 380 | pm_power_off = r7780rp_power_off; |
381 | } | 381 | } |
diff --git a/arch/sh/boards/mach-hp6xx/hp6xx_apm.c b/arch/sh/boards/mach-hp6xx/hp6xx_apm.c index e85212faf40a..b49535c0ddd9 100644 --- a/arch/sh/boards/mach-hp6xx/hp6xx_apm.c +++ b/arch/sh/boards/mach-hp6xx/hp6xx_apm.c | |||
@@ -53,7 +53,7 @@ static void hp6x0_apm_get_power_status(struct apm_power_info *info) | |||
53 | info->ac_line_status = (battery > HP680_BATTERY_AC_ON) ? | 53 | info->ac_line_status = (battery > HP680_BATTERY_AC_ON) ? |
54 | APM_AC_ONLINE : APM_AC_OFFLINE; | 54 | APM_AC_ONLINE : APM_AC_OFFLINE; |
55 | 55 | ||
56 | pgdr = ctrl_inb(PGDR); | 56 | pgdr = __raw_readb(PGDR); |
57 | if (pgdr & PGDR_MAIN_BATTERY_OUT) { | 57 | if (pgdr & PGDR_MAIN_BATTERY_OUT) { |
58 | info->battery_status = APM_BATTERY_STATUS_NOT_PRESENT; | 58 | info->battery_status = APM_BATTERY_STATUS_NOT_PRESENT; |
59 | info->battery_flag = 0x80; | 59 | info->battery_flag = 0x80; |
diff --git a/arch/sh/boards/mach-hp6xx/pm.c b/arch/sh/boards/mach-hp6xx/pm.c index d936c1af7620..4499a3749d40 100644 --- a/arch/sh/boards/mach-hp6xx/pm.c +++ b/arch/sh/boards/mach-hp6xx/pm.c | |||
@@ -53,17 +53,17 @@ static void pm_enter(void) | |||
53 | sh_wdt_write_cnt(0); | 53 | sh_wdt_write_cnt(0); |
54 | 54 | ||
55 | /* disable PLL1 */ | 55 | /* disable PLL1 */ |
56 | frqcr = ctrl_inw(FRQCR); | 56 | frqcr = __raw_readw(FRQCR); |
57 | frqcr &= ~(FRQCR_PLLEN | FRQCR_PSTBY); | 57 | frqcr &= ~(FRQCR_PLLEN | FRQCR_PSTBY); |
58 | ctrl_outw(frqcr, FRQCR); | 58 | __raw_writew(frqcr, FRQCR); |
59 | 59 | ||
60 | /* enable standby */ | 60 | /* enable standby */ |
61 | stbcr = ctrl_inb(STBCR); | 61 | stbcr = __raw_readb(STBCR); |
62 | ctrl_outb(stbcr | STBCR_STBY | STBCR_MSTP2, STBCR); | 62 | __raw_writeb(stbcr | STBCR_STBY | STBCR_MSTP2, STBCR); |
63 | 63 | ||
64 | /* set self-refresh */ | 64 | /* set self-refresh */ |
65 | mcr = ctrl_inw(MCR); | 65 | mcr = __raw_readw(MCR); |
66 | ctrl_outw(mcr & ~MCR_RFSH, MCR); | 66 | __raw_writew(mcr & ~MCR_RFSH, MCR); |
67 | 67 | ||
68 | /* set interrupt handler */ | 68 | /* set interrupt handler */ |
69 | asm volatile("stc vbr, %0" : "=r" (vbr_old)); | 69 | asm volatile("stc vbr, %0" : "=r" (vbr_old)); |
@@ -73,8 +73,8 @@ static void pm_enter(void) | |||
73 | &wakeup_start, &wakeup_end - &wakeup_start); | 73 | &wakeup_start, &wakeup_end - &wakeup_start); |
74 | asm volatile("ldc %0, vbr" : : "r" (vbr_new)); | 74 | asm volatile("ldc %0, vbr" : : "r" (vbr_new)); |
75 | 75 | ||
76 | ctrl_outw(0, RTCNT); | 76 | __raw_writew(0, RTCNT); |
77 | ctrl_outw(mcr | MCR_RFSH | MCR_RMODE, MCR); | 77 | __raw_writew(mcr | MCR_RFSH | MCR_RMODE, MCR); |
78 | 78 | ||
79 | cpu_sleep(); | 79 | cpu_sleep(); |
80 | 80 | ||
@@ -83,14 +83,14 @@ static void pm_enter(void) | |||
83 | free_page(vbr_new); | 83 | free_page(vbr_new); |
84 | 84 | ||
85 | /* enable PLL1 */ | 85 | /* enable PLL1 */ |
86 | frqcr = ctrl_inw(FRQCR); | 86 | frqcr = __raw_readw(FRQCR); |
87 | frqcr |= FRQCR_PSTBY; | 87 | frqcr |= FRQCR_PSTBY; |
88 | ctrl_outw(frqcr, FRQCR); | 88 | __raw_writew(frqcr, FRQCR); |
89 | udelay(50); | 89 | udelay(50); |
90 | frqcr |= FRQCR_PLLEN; | 90 | frqcr |= FRQCR_PLLEN; |
91 | ctrl_outw(frqcr, FRQCR); | 91 | __raw_writew(frqcr, FRQCR); |
92 | 92 | ||
93 | ctrl_outb(stbcr, STBCR); | 93 | __raw_writeb(stbcr, STBCR); |
94 | 94 | ||
95 | clear_bl_bit(); | 95 | clear_bl_bit(); |
96 | } | 96 | } |
@@ -115,21 +115,21 @@ static int hp6x0_pm_enter(suspend_state_t state) | |||
115 | outw(hd64461_stbcr, HD64461_STBCR); | 115 | outw(hd64461_stbcr, HD64461_STBCR); |
116 | #endif | 116 | #endif |
117 | 117 | ||
118 | ctrl_outb(0x1f, DACR); | 118 | __raw_writeb(0x1f, DACR); |
119 | 119 | ||
120 | stbcr = ctrl_inb(STBCR); | 120 | stbcr = __raw_readb(STBCR); |
121 | ctrl_outb(0x01, STBCR); | 121 | __raw_writeb(0x01, STBCR); |
122 | 122 | ||
123 | stbcr2 = ctrl_inb(STBCR2); | 123 | stbcr2 = __raw_readb(STBCR2); |
124 | ctrl_outb(0x7f , STBCR2); | 124 | __raw_writeb(0x7f , STBCR2); |
125 | 125 | ||
126 | outw(0xf07f, HD64461_SCPUCR); | 126 | outw(0xf07f, HD64461_SCPUCR); |
127 | 127 | ||
128 | pm_enter(); | 128 | pm_enter(); |
129 | 129 | ||
130 | outw(0, HD64461_SCPUCR); | 130 | outw(0, HD64461_SCPUCR); |
131 | ctrl_outb(stbcr, STBCR); | 131 | __raw_writeb(stbcr, STBCR); |
132 | ctrl_outb(stbcr2, STBCR2); | 132 | __raw_writeb(stbcr2, STBCR2); |
133 | 133 | ||
134 | #ifdef CONFIG_HD64461_ENABLER | 134 | #ifdef CONFIG_HD64461_ENABLER |
135 | hd64461_stbcr = inw(HD64461_STBCR); | 135 | hd64461_stbcr = inw(HD64461_STBCR); |
diff --git a/arch/sh/boards/mach-hp6xx/setup.c b/arch/sh/boards/mach-hp6xx/setup.c index e6dd5e96321e..8c9add5f4cfa 100644 --- a/arch/sh/boards/mach-hp6xx/setup.c +++ b/arch/sh/boards/mach-hp6xx/setup.c | |||
@@ -149,19 +149,19 @@ static void __init hp6xx_setup(char **cmdline_p) | |||
149 | 149 | ||
150 | sh_dac_output(0, DAC_SPEAKER_VOLUME); | 150 | sh_dac_output(0, DAC_SPEAKER_VOLUME); |
151 | sh_dac_disable(DAC_SPEAKER_VOLUME); | 151 | sh_dac_disable(DAC_SPEAKER_VOLUME); |
152 | v8 = ctrl_inb(DACR); | 152 | v8 = __raw_readb(DACR); |
153 | v8 &= ~DACR_DAE; | 153 | v8 &= ~DACR_DAE; |
154 | ctrl_outb(v8,DACR); | 154 | __raw_writeb(v8,DACR); |
155 | 155 | ||
156 | v8 = ctrl_inb(SCPDR); | 156 | v8 = __raw_readb(SCPDR); |
157 | v8 |= SCPDR_TS_SCAN_X | SCPDR_TS_SCAN_Y; | 157 | v8 |= SCPDR_TS_SCAN_X | SCPDR_TS_SCAN_Y; |
158 | v8 &= ~SCPDR_TS_SCAN_ENABLE; | 158 | v8 &= ~SCPDR_TS_SCAN_ENABLE; |
159 | ctrl_outb(v8, SCPDR); | 159 | __raw_writeb(v8, SCPDR); |
160 | 160 | ||
161 | v = ctrl_inw(SCPCR); | 161 | v = __raw_readw(SCPCR); |
162 | v &= ~SCPCR_TS_MASK; | 162 | v &= ~SCPCR_TS_MASK; |
163 | v |= SCPCR_TS_ENABLE; | 163 | v |= SCPCR_TS_ENABLE; |
164 | ctrl_outw(v, SCPCR); | 164 | __raw_writew(v, SCPCR); |
165 | } | 165 | } |
166 | device_initcall(hp6xx_devices_setup); | 166 | device_initcall(hp6xx_devices_setup); |
167 | 167 | ||
diff --git a/arch/sh/boards/mach-kfr2r09/setup.c b/arch/sh/boards/mach-kfr2r09/setup.c index 5d7b5d92475e..b2cd0ed8664e 100644 --- a/arch/sh/boards/mach-kfr2r09/setup.c +++ b/arch/sh/boards/mach-kfr2r09/setup.c | |||
@@ -282,7 +282,7 @@ static int camera_power(struct device *dev, int mode) | |||
282 | * use 1.8 V for VccQ_VIO | 282 | * use 1.8 V for VccQ_VIO |
283 | * use 2.85V for VccQ_SR | 283 | * use 2.85V for VccQ_SR |
284 | */ | 284 | */ |
285 | ctrl_outw((ctrl_inw(DRVCRB) & ~0x0003) | 0x0001, DRVCRB); | 285 | __raw_writew((__raw_readw(DRVCRB) & ~0x0003) | 0x0001, DRVCRB); |
286 | 286 | ||
287 | /* reset clear */ | 287 | /* reset clear */ |
288 | ret = gpio_request(GPIO_PTB4, NULL); | 288 | ret = gpio_request(GPIO_PTB4, NULL); |
@@ -351,7 +351,7 @@ static struct resource kfr2r09_sh_sdhi0_resources[] = { | |||
351 | .flags = IORESOURCE_MEM, | 351 | .flags = IORESOURCE_MEM, |
352 | }, | 352 | }, |
353 | [1] = { | 353 | [1] = { |
354 | .start = 101, | 354 | .start = 100, |
355 | .flags = IORESOURCE_IRQ, | 355 | .flags = IORESOURCE_IRQ, |
356 | }, | 356 | }, |
357 | }; | 357 | }; |
@@ -492,13 +492,13 @@ static int kfr2r09_usb0_gadget_setup(void) | |||
492 | if (kfr2r09_usb0_gadget_i2c_setup() != 0) | 492 | if (kfr2r09_usb0_gadget_i2c_setup() != 0) |
493 | return -ENODEV; /* unable to configure using i2c */ | 493 | return -ENODEV; /* unable to configure using i2c */ |
494 | 494 | ||
495 | ctrl_outw((ctrl_inw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB); | 495 | __raw_writew((__raw_readw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB); |
496 | gpio_request(GPIO_FN_PDSTATUS, NULL); /* R-standby disables USB clock */ | 496 | gpio_request(GPIO_FN_PDSTATUS, NULL); /* R-standby disables USB clock */ |
497 | gpio_request(GPIO_PTV6, NULL); /* USBCLK_ON */ | 497 | gpio_request(GPIO_PTV6, NULL); /* USBCLK_ON */ |
498 | gpio_direction_output(GPIO_PTV6, 1); /* USBCLK_ON = H */ | 498 | gpio_direction_output(GPIO_PTV6, 1); /* USBCLK_ON = H */ |
499 | msleep(20); /* wait 20ms to let the clock settle */ | 499 | msleep(20); /* wait 20ms to let the clock settle */ |
500 | clk_enable(clk_get(NULL, "usb0")); | 500 | clk_enable(clk_get(NULL, "usb0")); |
501 | ctrl_outw(0x0600, 0xa40501d4); | 501 | __raw_writew(0x0600, 0xa40501d4); |
502 | 502 | ||
503 | return 0; | 503 | return 0; |
504 | } | 504 | } |
@@ -526,12 +526,12 @@ static int __init kfr2r09_devices_setup(void) | |||
526 | gpio_direction_output(GPIO_PTG3, 1); /* HPON_ON = H */ | 526 | gpio_direction_output(GPIO_PTG3, 1); /* HPON_ON = H */ |
527 | 527 | ||
528 | /* setup NOR flash at CS0 */ | 528 | /* setup NOR flash at CS0 */ |
529 | ctrl_outl(0x36db0400, BSC_CS0BCR); | 529 | __raw_writel(0x36db0400, BSC_CS0BCR); |
530 | ctrl_outl(0x00000500, BSC_CS0WCR); | 530 | __raw_writel(0x00000500, BSC_CS0WCR); |
531 | 531 | ||
532 | /* setup NAND flash at CS4 */ | 532 | /* setup NAND flash at CS4 */ |
533 | ctrl_outl(0x36db0400, BSC_CS4BCR); | 533 | __raw_writel(0x36db0400, BSC_CS4BCR); |
534 | ctrl_outl(0x00000500, BSC_CS4WCR); | 534 | __raw_writel(0x00000500, BSC_CS4WCR); |
535 | 535 | ||
536 | /* setup KEYSC pins */ | 536 | /* setup KEYSC pins */ |
537 | gpio_request(GPIO_FN_KEYOUT0, NULL); | 537 | gpio_request(GPIO_FN_KEYOUT0, NULL); |
diff --git a/arch/sh/boards/mach-landisk/gio.c b/arch/sh/boards/mach-landisk/gio.c index 528013188196..01e6abb769b9 100644 --- a/arch/sh/boards/mach-landisk/gio.c +++ b/arch/sh/boards/mach-landisk/gio.c | |||
@@ -76,39 +76,39 @@ static long gio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
76 | break; | 76 | break; |
77 | 77 | ||
78 | case GIODRV_IOCSGIODATA1: /* write byte */ | 78 | case GIODRV_IOCSGIODATA1: /* write byte */ |
79 | ctrl_outb((unsigned char)(0x0ff & data), addr); | 79 | __raw_writeb((unsigned char)(0x0ff & data), addr); |
80 | break; | 80 | break; |
81 | 81 | ||
82 | case GIODRV_IOCSGIODATA2: /* write word */ | 82 | case GIODRV_IOCSGIODATA2: /* write word */ |
83 | if (addr & 0x01) { | 83 | if (addr & 0x01) { |
84 | return -EFAULT; | 84 | return -EFAULT; |
85 | } | 85 | } |
86 | ctrl_outw((unsigned short int)(0x0ffff & data), addr); | 86 | __raw_writew((unsigned short int)(0x0ffff & data), addr); |
87 | break; | 87 | break; |
88 | 88 | ||
89 | case GIODRV_IOCSGIODATA4: /* write long */ | 89 | case GIODRV_IOCSGIODATA4: /* write long */ |
90 | if (addr & 0x03) { | 90 | if (addr & 0x03) { |
91 | return -EFAULT; | 91 | return -EFAULT; |
92 | } | 92 | } |
93 | ctrl_outl(data, addr); | 93 | __raw_writel(data, addr); |
94 | break; | 94 | break; |
95 | 95 | ||
96 | case GIODRV_IOCGGIODATA1: /* read byte */ | 96 | case GIODRV_IOCGGIODATA1: /* read byte */ |
97 | data = ctrl_inb(addr); | 97 | data = __raw_readb(addr); |
98 | break; | 98 | break; |
99 | 99 | ||
100 | case GIODRV_IOCGGIODATA2: /* read word */ | 100 | case GIODRV_IOCGGIODATA2: /* read word */ |
101 | if (addr & 0x01) { | 101 | if (addr & 0x01) { |
102 | return -EFAULT; | 102 | return -EFAULT; |
103 | } | 103 | } |
104 | data = ctrl_inw(addr); | 104 | data = __raw_readw(addr); |
105 | break; | 105 | break; |
106 | 106 | ||
107 | case GIODRV_IOCGGIODATA4: /* read long */ | 107 | case GIODRV_IOCGGIODATA4: /* read long */ |
108 | if (addr & 0x03) { | 108 | if (addr & 0x03) { |
109 | return -EFAULT; | 109 | return -EFAULT; |
110 | } | 110 | } |
111 | data = ctrl_inl(addr); | 111 | data = __raw_readl(addr); |
112 | break; | 112 | break; |
113 | default: | 113 | default: |
114 | return -EFAULT; | 114 | return -EFAULT; |
diff --git a/arch/sh/boards/mach-landisk/irq.c b/arch/sh/boards/mach-landisk/irq.c index 7b284cde1f58..96f38a4187d0 100644 --- a/arch/sh/boards/mach-landisk/irq.c +++ b/arch/sh/boards/mach-landisk/irq.c | |||
@@ -22,14 +22,14 @@ static void disable_landisk_irq(unsigned int irq) | |||
22 | { | 22 | { |
23 | unsigned char mask = 0xff ^ (0x01 << (irq - 5)); | 23 | unsigned char mask = 0xff ^ (0x01 << (irq - 5)); |
24 | 24 | ||
25 | ctrl_outb(ctrl_inb(PA_IMASK) & mask, PA_IMASK); | 25 | __raw_writeb(__raw_readb(PA_IMASK) & mask, PA_IMASK); |
26 | } | 26 | } |
27 | 27 | ||
28 | static void enable_landisk_irq(unsigned int irq) | 28 | static void enable_landisk_irq(unsigned int irq) |
29 | { | 29 | { |
30 | unsigned char value = (0x01 << (irq - 5)); | 30 | unsigned char value = (0x01 << (irq - 5)); |
31 | 31 | ||
32 | ctrl_outb(ctrl_inb(PA_IMASK) | value, PA_IMASK); | 32 | __raw_writeb(__raw_readb(PA_IMASK) | value, PA_IMASK); |
33 | } | 33 | } |
34 | 34 | ||
35 | static struct irq_chip landisk_irq_chip __read_mostly = { | 35 | static struct irq_chip landisk_irq_chip __read_mostly = { |
@@ -52,5 +52,5 @@ void __init init_landisk_IRQ(void) | |||
52 | handle_level_irq, "level"); | 52 | handle_level_irq, "level"); |
53 | enable_landisk_irq(i); | 53 | enable_landisk_irq(i); |
54 | } | 54 | } |
55 | ctrl_outb(0x00, PA_PWRINT_CLR); | 55 | __raw_writeb(0x00, PA_PWRINT_CLR); |
56 | } | 56 | } |
diff --git a/arch/sh/boards/mach-landisk/psw.c b/arch/sh/boards/mach-landisk/psw.c index e6b0efa098d1..bef83522f958 100644 --- a/arch/sh/boards/mach-landisk/psw.c +++ b/arch/sh/boards/mach-landisk/psw.c | |||
@@ -25,7 +25,7 @@ static irqreturn_t psw_irq_handler(int irq, void *arg) | |||
25 | unsigned int sw_value; | 25 | unsigned int sw_value; |
26 | int ret = 0; | 26 | int ret = 0; |
27 | 27 | ||
28 | sw_value = (0x0ff & (~ctrl_inb(PA_STATUS))); | 28 | sw_value = (0x0ff & (~__raw_readb(PA_STATUS))); |
29 | 29 | ||
30 | /* Nothing to do if there's no state change */ | 30 | /* Nothing to do if there's no state change */ |
31 | if (psw->state) { | 31 | if (psw->state) { |
@@ -42,7 +42,7 @@ static irqreturn_t psw_irq_handler(int irq, void *arg) | |||
42 | 42 | ||
43 | out: | 43 | out: |
44 | /* Clear the switch IRQs */ | 44 | /* Clear the switch IRQs */ |
45 | ctrl_outb(0x00, PA_PWRINT_CLR); | 45 | __raw_writeb(0x00, PA_PWRINT_CLR); |
46 | 46 | ||
47 | return IRQ_RETVAL(ret); | 47 | return IRQ_RETVAL(ret); |
48 | } | 48 | } |
diff --git a/arch/sh/boards/mach-landisk/setup.c b/arch/sh/boards/mach-landisk/setup.c index db22ea2e6d49..50337acc18c5 100644 --- a/arch/sh/boards/mach-landisk/setup.c +++ b/arch/sh/boards/mach-landisk/setup.c | |||
@@ -25,7 +25,7 @@ void init_landisk_IRQ(void); | |||
25 | 25 | ||
26 | static void landisk_power_off(void) | 26 | static void landisk_power_off(void) |
27 | { | 27 | { |
28 | ctrl_outb(0x01, PA_SHUTDOWN); | 28 | __raw_writeb(0x01, PA_SHUTDOWN); |
29 | } | 29 | } |
30 | 30 | ||
31 | static struct resource cf_ide_resources[3]; | 31 | static struct resource cf_ide_resources[3]; |
@@ -63,7 +63,7 @@ static int __init landisk_devices_setup(void) | |||
63 | /* open I/O area window */ | 63 | /* open I/O area window */ |
64 | paddrbase = virt_to_phys((void *)PA_AREA5_IO); | 64 | paddrbase = virt_to_phys((void *)PA_AREA5_IO); |
65 | prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16); | 65 | prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16); |
66 | cf_ide_base = p3_ioremap(paddrbase, PAGE_SIZE, prot.pgprot); | 66 | cf_ide_base = ioremap_prot(paddrbase, PAGE_SIZE, pgprot_val(prot)); |
67 | if (!cf_ide_base) { | 67 | if (!cf_ide_base) { |
68 | printk("allocate_cf_area : can't open CF I/O window!\n"); | 68 | printk("allocate_cf_area : can't open CF I/O window!\n"); |
69 | return -ENOMEM; | 69 | return -ENOMEM; |
@@ -88,7 +88,7 @@ __initcall(landisk_devices_setup); | |||
88 | static void __init landisk_setup(char **cmdline_p) | 88 | static void __init landisk_setup(char **cmdline_p) |
89 | { | 89 | { |
90 | /* LED ON */ | 90 | /* LED ON */ |
91 | ctrl_outb(ctrl_inb(PA_LED) | 0x03, PA_LED); | 91 | __raw_writeb(__raw_readb(PA_LED) | 0x03, PA_LED); |
92 | 92 | ||
93 | printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n"); | 93 | printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n"); |
94 | pm_power_off = landisk_power_off; | 94 | pm_power_off = landisk_power_off; |
diff --git a/arch/sh/boards/mach-lboxre2/setup.c b/arch/sh/boards/mach-lboxre2/setup.c index 2b0b5818e1e4..79b4e0d77b71 100644 --- a/arch/sh/boards/mach-lboxre2/setup.c +++ b/arch/sh/boards/mach-lboxre2/setup.c | |||
@@ -56,8 +56,8 @@ static int __init lboxre2_devices_setup(void) | |||
56 | /* open I/O area window */ | 56 | /* open I/O area window */ |
57 | paddrbase = virt_to_phys((void*)PA_AREA5_IO); | 57 | paddrbase = virt_to_phys((void*)PA_AREA5_IO); |
58 | psize = PAGE_SIZE; | 58 | psize = PAGE_SIZE; |
59 | prot = PAGE_KERNEL_PCC( 1 , _PAGE_PCC_IO16); | 59 | prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16); |
60 | cf0_io_base = (u32)p3_ioremap(paddrbase, psize, prot.pgprot); | 60 | cf0_io_base = (u32)ioremap_prot(paddrbase, psize, pgprot_val(prot)); |
61 | if (!cf0_io_base) { | 61 | if (!cf0_io_base) { |
62 | printk(KERN_ERR "%s : can't open CF I/O window!\n" , __func__ ); | 62 | printk(KERN_ERR "%s : can't open CF I/O window!\n" , __func__ ); |
63 | return -ENOMEM; | 63 | return -ENOMEM; |
diff --git a/arch/sh/boards/mach-microdev/io.c b/arch/sh/boards/mach-microdev/io.c index 52dd748211c7..2960c659020e 100644 --- a/arch/sh/boards/mach-microdev/io.c +++ b/arch/sh/boards/mach-microdev/io.c | |||
@@ -141,10 +141,10 @@ static inline void delay(void) | |||
141 | #if defined(CONFIG_PCI) | 141 | #if defined(CONFIG_PCI) |
142 | /* System board present, just make a dummy SRAM access. (CS0 will be | 142 | /* System board present, just make a dummy SRAM access. (CS0 will be |
143 | mapped to PCI memory, probably good to avoid it.) */ | 143 | mapped to PCI memory, probably good to avoid it.) */ |
144 | ctrl_inw(0xa6800000); | 144 | __raw_readw(0xa6800000); |
145 | #else | 145 | #else |
146 | /* CS0 will be mapped to flash, ROM etc so safe to access it. */ | 146 | /* CS0 will be mapped to flash, ROM etc so safe to access it. */ |
147 | ctrl_inw(0xa0000000); | 147 | __raw_readw(0xa0000000); |
148 | #endif | 148 | #endif |
149 | } | 149 | } |
150 | 150 | ||
diff --git a/arch/sh/boards/mach-microdev/irq.c b/arch/sh/boards/mach-microdev/irq.c index b551963579c1..a26d16669aa2 100644 --- a/arch/sh/boards/mach-microdev/irq.c +++ b/arch/sh/boards/mach-microdev/irq.c | |||
@@ -88,7 +88,7 @@ static void disable_microdev_irq(unsigned int irq) | |||
88 | fpgaIrq = fpgaIrqTable[irq].fpgaIrq; | 88 | fpgaIrq = fpgaIrqTable[irq].fpgaIrq; |
89 | 89 | ||
90 | /* disable interrupts on the FPGA INTC register */ | 90 | /* disable interrupts on the FPGA INTC register */ |
91 | ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTDSB_REG); | 91 | __raw_writel(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTDSB_REG); |
92 | } | 92 | } |
93 | 93 | ||
94 | static void enable_microdev_irq(unsigned int irq) | 94 | static void enable_microdev_irq(unsigned int irq) |
@@ -107,13 +107,13 @@ static void enable_microdev_irq(unsigned int irq) | |||
107 | priorityReg = MICRODEV_FPGA_INTPRI_REG(fpgaIrq); | 107 | priorityReg = MICRODEV_FPGA_INTPRI_REG(fpgaIrq); |
108 | 108 | ||
109 | /* set priority for the interrupt */ | 109 | /* set priority for the interrupt */ |
110 | priorities = ctrl_inl(priorityReg); | 110 | priorities = __raw_readl(priorityReg); |
111 | priorities &= ~MICRODEV_FPGA_INTPRI_MASK(fpgaIrq); | 111 | priorities &= ~MICRODEV_FPGA_INTPRI_MASK(fpgaIrq); |
112 | priorities |= MICRODEV_FPGA_INTPRI_LEVEL(fpgaIrq, pri); | 112 | priorities |= MICRODEV_FPGA_INTPRI_LEVEL(fpgaIrq, pri); |
113 | ctrl_outl(priorities, priorityReg); | 113 | __raw_writel(priorities, priorityReg); |
114 | 114 | ||
115 | /* enable interrupts on the FPGA INTC register */ | 115 | /* enable interrupts on the FPGA INTC register */ |
116 | ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTENB_REG); | 116 | __raw_writel(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTENB_REG); |
117 | } | 117 | } |
118 | 118 | ||
119 | /* This function sets the desired irq handler to be a MicroDev type */ | 119 | /* This function sets the desired irq handler to be a MicroDev type */ |
@@ -134,7 +134,7 @@ extern void __init init_microdev_irq(void) | |||
134 | int i; | 134 | int i; |
135 | 135 | ||
136 | /* disable interrupts on the FPGA INTC register */ | 136 | /* disable interrupts on the FPGA INTC register */ |
137 | ctrl_outl(~0ul, MICRODEV_FPGA_INTDSB_REG); | 137 | __raw_writel(~0ul, MICRODEV_FPGA_INTDSB_REG); |
138 | 138 | ||
139 | for (i = 0; i < NUM_EXTERNAL_IRQS; i++) | 139 | for (i = 0; i < NUM_EXTERNAL_IRQS; i++) |
140 | make_microdev_irq(i); | 140 | make_microdev_irq(i); |
diff --git a/arch/sh/boards/mach-migor/setup.c b/arch/sh/boards/mach-migor/setup.c index 507c77be476d..e08d5132bb1e 100644 --- a/arch/sh/boards/mach-migor/setup.c +++ b/arch/sh/boards/mach-migor/setup.c | |||
@@ -397,7 +397,7 @@ static struct resource sdhi_cn9_resources[] = { | |||
397 | .flags = IORESOURCE_MEM, | 397 | .flags = IORESOURCE_MEM, |
398 | }, | 398 | }, |
399 | [1] = { | 399 | [1] = { |
400 | .start = 101, | 400 | .start = 100, |
401 | .flags = IORESOURCE_IRQ, | 401 | .flags = IORESOURCE_IRQ, |
402 | }, | 402 | }, |
403 | }; | 403 | }; |
@@ -496,28 +496,16 @@ static int __init migor_devices_setup(void) | |||
496 | &migor_sdram_enter_end, | 496 | &migor_sdram_enter_end, |
497 | &migor_sdram_leave_start, | 497 | &migor_sdram_leave_start, |
498 | &migor_sdram_leave_end); | 498 | &migor_sdram_leave_end); |
499 | #ifdef CONFIG_PM | ||
500 | /* Let D11 LED show STATUS0 */ | 499 | /* Let D11 LED show STATUS0 */ |
501 | gpio_request(GPIO_FN_STATUS0, NULL); | 500 | gpio_request(GPIO_FN_STATUS0, NULL); |
502 | 501 | ||
503 | /* Lit D12 LED show PDSTATUS */ | 502 | /* Lit D12 LED show PDSTATUS */ |
504 | gpio_request(GPIO_FN_PDSTATUS, NULL); | 503 | gpio_request(GPIO_FN_PDSTATUS, NULL); |
505 | #else | ||
506 | /* Lit D11 LED */ | ||
507 | gpio_request(GPIO_PTJ7, NULL); | ||
508 | gpio_direction_output(GPIO_PTJ7, 1); | ||
509 | gpio_export(GPIO_PTJ7, 0); | ||
510 | |||
511 | /* Lit D12 LED */ | ||
512 | gpio_request(GPIO_PTJ5, NULL); | ||
513 | gpio_direction_output(GPIO_PTJ5, 1); | ||
514 | gpio_export(GPIO_PTJ5, 0); | ||
515 | #endif | ||
516 | 504 | ||
517 | /* SMC91C111 - Enable IRQ0, Setup CS4 for 16-bit fast access */ | 505 | /* SMC91C111 - Enable IRQ0, Setup CS4 for 16-bit fast access */ |
518 | gpio_request(GPIO_FN_IRQ0, NULL); | 506 | gpio_request(GPIO_FN_IRQ0, NULL); |
519 | ctrl_outl(0x00003400, BSC_CS4BCR); | 507 | __raw_writel(0x00003400, BSC_CS4BCR); |
520 | ctrl_outl(0x00110080, BSC_CS4WCR); | 508 | __raw_writel(0x00110080, BSC_CS4WCR); |
521 | 509 | ||
522 | /* KEYSC */ | 510 | /* KEYSC */ |
523 | gpio_request(GPIO_FN_KEYOUT0, NULL); | 511 | gpio_request(GPIO_FN_KEYOUT0, NULL); |
@@ -533,7 +521,7 @@ static int __init migor_devices_setup(void) | |||
533 | 521 | ||
534 | /* NAND Flash */ | 522 | /* NAND Flash */ |
535 | gpio_request(GPIO_FN_CS6A_CE2B, NULL); | 523 | gpio_request(GPIO_FN_CS6A_CE2B, NULL); |
536 | ctrl_outl((ctrl_inl(BSC_CS6ABCR) & ~0x0600) | 0x0200, BSC_CS6ABCR); | 524 | __raw_writel((__raw_readl(BSC_CS6ABCR) & ~0x0600) | 0x0200, BSC_CS6ABCR); |
537 | gpio_request(GPIO_PTA1, NULL); | 525 | gpio_request(GPIO_PTA1, NULL); |
538 | gpio_direction_input(GPIO_PTA1); | 526 | gpio_direction_input(GPIO_PTA1); |
539 | 527 | ||
@@ -627,7 +615,7 @@ static int __init migor_devices_setup(void) | |||
627 | #else | 615 | #else |
628 | gpio_direction_output(GPIO_PTT0, 1); | 616 | gpio_direction_output(GPIO_PTT0, 1); |
629 | #endif | 617 | #endif |
630 | ctrl_outw(ctrl_inw(PORT_MSELCRB) | 0x2000, PORT_MSELCRB); /* D15->D8 */ | 618 | __raw_writew(__raw_readw(PORT_MSELCRB) | 0x2000, PORT_MSELCRB); /* D15->D8 */ |
631 | 619 | ||
632 | platform_resource_setup_memory(&migor_ceu_device, "ceu", 4 << 20); | 620 | platform_resource_setup_memory(&migor_ceu_device, "ceu", 4 << 20); |
633 | 621 | ||
diff --git a/arch/sh/boards/mach-r2d/irq.c b/arch/sh/boards/mach-r2d/irq.c index 78d7b27c80da..574f009c3c31 100644 --- a/arch/sh/boards/mach-r2d/irq.c +++ b/arch/sh/boards/mach-r2d/irq.c | |||
@@ -129,7 +129,7 @@ void __init init_rts7751r2d_IRQ(void) | |||
129 | { | 129 | { |
130 | struct intc_desc *d; | 130 | struct intc_desc *d; |
131 | 131 | ||
132 | switch (ctrl_inw(PA_VERREG) & 0xf0) { | 132 | switch (__raw_readw(PA_VERREG) & 0xf0) { |
133 | #ifdef CONFIG_RTS7751R2D_PLUS | 133 | #ifdef CONFIG_RTS7751R2D_PLUS |
134 | case 0x10: | 134 | case 0x10: |
135 | printk(KERN_INFO "Using R2D-PLUS interrupt controller.\n"); | 135 | printk(KERN_INFO "Using R2D-PLUS interrupt controller.\n"); |
@@ -147,7 +147,7 @@ void __init init_rts7751r2d_IRQ(void) | |||
147 | #endif | 147 | #endif |
148 | default: | 148 | default: |
149 | printk(KERN_INFO "Unknown R2D interrupt controller 0x%04x\n", | 149 | printk(KERN_INFO "Unknown R2D interrupt controller 0x%04x\n", |
150 | ctrl_inw(PA_VERREG)); | 150 | __raw_readw(PA_VERREG)); |
151 | return; | 151 | return; |
152 | } | 152 | } |
153 | 153 | ||
diff --git a/arch/sh/boards/mach-r2d/setup.c b/arch/sh/boards/mach-r2d/setup.c index a625ecb93e47..b84df6a3a93c 100644 --- a/arch/sh/boards/mach-r2d/setup.c +++ b/arch/sh/boards/mach-r2d/setup.c | |||
@@ -70,7 +70,7 @@ static struct spi_board_info spi_bus[] = { | |||
70 | static void r2d_chip_select(struct sh_spi_info *spi, int cs, int state) | 70 | static void r2d_chip_select(struct sh_spi_info *spi, int cs, int state) |
71 | { | 71 | { |
72 | BUG_ON(cs != 0); /* Single Epson RTC-9701JE attached on CS0 */ | 72 | BUG_ON(cs != 0); /* Single Epson RTC-9701JE attached on CS0 */ |
73 | ctrl_outw(state == BITBANG_CS_ACTIVE, PA_RTCCE); | 73 | __raw_writew(state == BITBANG_CS_ACTIVE, PA_RTCCE); |
74 | } | 74 | } |
75 | 75 | ||
76 | static struct sh_spi_info spi_info = { | 76 | static struct sh_spi_info spi_info = { |
@@ -262,7 +262,7 @@ __initcall(rts7751r2d_devices_setup); | |||
262 | 262 | ||
263 | static void rts7751r2d_power_off(void) | 263 | static void rts7751r2d_power_off(void) |
264 | { | 264 | { |
265 | ctrl_outw(0x0001, PA_POWOFF); | 265 | __raw_writew(0x0001, PA_POWOFF); |
266 | } | 266 | } |
267 | 267 | ||
268 | /* | 268 | /* |
@@ -271,14 +271,14 @@ static void rts7751r2d_power_off(void) | |||
271 | static void __init rts7751r2d_setup(char **cmdline_p) | 271 | static void __init rts7751r2d_setup(char **cmdline_p) |
272 | { | 272 | { |
273 | void __iomem *sm501_reg; | 273 | void __iomem *sm501_reg; |
274 | u16 ver = ctrl_inw(PA_VERREG); | 274 | u16 ver = __raw_readw(PA_VERREG); |
275 | 275 | ||
276 | printk(KERN_INFO "Renesas Technology Sales RTS7751R2D support.\n"); | 276 | printk(KERN_INFO "Renesas Technology Sales RTS7751R2D support.\n"); |
277 | 277 | ||
278 | printk(KERN_INFO "FPGA version:%d (revision:%d)\n", | 278 | printk(KERN_INFO "FPGA version:%d (revision:%d)\n", |
279 | (ver >> 4) & 0xf, ver & 0xf); | 279 | (ver >> 4) & 0xf, ver & 0xf); |
280 | 280 | ||
281 | ctrl_outw(0x0000, PA_OUTPORT); | 281 | __raw_writew(0x0000, PA_OUTPORT); |
282 | pm_power_off = rts7751r2d_power_off; | 282 | pm_power_off = rts7751r2d_power_off; |
283 | 283 | ||
284 | /* sm501 dram configuration: | 284 | /* sm501 dram configuration: |
diff --git a/arch/sh/boards/mach-rsk/devices-rsk7203.c b/arch/sh/boards/mach-rsk/devices-rsk7203.c index c37617e63220..4fa08ba10253 100644 --- a/arch/sh/boards/mach-rsk/devices-rsk7203.c +++ b/arch/sh/boards/mach-rsk/devices-rsk7203.c | |||
@@ -96,7 +96,7 @@ static int __init rsk7203_devices_setup(void) | |||
96 | gpio_request(GPIO_FN_RXD0, NULL); | 96 | gpio_request(GPIO_FN_RXD0, NULL); |
97 | 97 | ||
98 | /* Setup LAN9118: CS1 in 16-bit Big Endian Mode, IRQ0 at Port B */ | 98 | /* Setup LAN9118: CS1 in 16-bit Big Endian Mode, IRQ0 at Port B */ |
99 | ctrl_outl(0x36db0400, 0xfffc0008); /* CS1BCR */ | 99 | __raw_writel(0x36db0400, 0xfffc0008); /* CS1BCR */ |
100 | gpio_request(GPIO_FN_IRQ0_PB, NULL); | 100 | gpio_request(GPIO_FN_IRQ0_PB, NULL); |
101 | 101 | ||
102 | return platform_add_devices(rsk7203_devices, | 102 | return platform_add_devices(rsk7203_devices, |
diff --git a/arch/sh/boards/mach-sdk7780/irq.c b/arch/sh/boards/mach-sdk7780/irq.c index 855558163c58..e5f7564f2511 100644 --- a/arch/sh/boards/mach-sdk7780/irq.c +++ b/arch/sh/boards/mach-sdk7780/irq.c | |||
@@ -37,9 +37,9 @@ void __init init_sdk7780_IRQ(void) | |||
37 | { | 37 | { |
38 | printk(KERN_INFO "Using SDK7780 interrupt controller.\n"); | 38 | printk(KERN_INFO "Using SDK7780 interrupt controller.\n"); |
39 | 39 | ||
40 | ctrl_outw(0xFFFF, FPGA_IRQ0MR); | 40 | __raw_writew(0xFFFF, FPGA_IRQ0MR); |
41 | /* Setup IRL 0-3 */ | 41 | /* Setup IRL 0-3 */ |
42 | ctrl_outw(0x0003, FPGA_IMSR); | 42 | __raw_writew(0x0003, FPGA_IMSR); |
43 | plat_irq_setup_pins(IRQ_MODE_IRL3210); | 43 | plat_irq_setup_pins(IRQ_MODE_IRL3210); |
44 | 44 | ||
45 | register_intc_controller(&fpga_intc_desc); | 45 | register_intc_controller(&fpga_intc_desc); |
diff --git a/arch/sh/boards/mach-sdk7780/setup.c b/arch/sh/boards/mach-sdk7780/setup.c index aad94a78dc70..4da38db4b5fe 100644 --- a/arch/sh/boards/mach-sdk7780/setup.c +++ b/arch/sh/boards/mach-sdk7780/setup.c | |||
@@ -20,27 +20,18 @@ | |||
20 | 20 | ||
21 | #define GPIO_PECR 0xFFEA0008 | 21 | #define GPIO_PECR 0xFFEA0008 |
22 | 22 | ||
23 | //* Heartbeat */ | 23 | /* Heartbeat */ |
24 | static struct heartbeat_data heartbeat_data = { | 24 | static struct resource heartbeat_resource = { |
25 | .regsize = 16, | 25 | .start = PA_LED, |
26 | }; | 26 | .end = PA_LED, |
27 | 27 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, | |
28 | static struct resource heartbeat_resources[] = { | ||
29 | [0] = { | ||
30 | .start = PA_LED, | ||
31 | .end = PA_LED, | ||
32 | .flags = IORESOURCE_MEM, | ||
33 | }, | ||
34 | }; | 28 | }; |
35 | 29 | ||
36 | static struct platform_device heartbeat_device = { | 30 | static struct platform_device heartbeat_device = { |
37 | .name = "heartbeat", | 31 | .name = "heartbeat", |
38 | .id = -1, | 32 | .id = -1, |
39 | .dev = { | 33 | .num_resources = 1, |
40 | .platform_data = &heartbeat_data, | 34 | .resource = &heartbeat_resource, |
41 | }, | ||
42 | .num_resources = ARRAY_SIZE(heartbeat_resources), | ||
43 | .resource = heartbeat_resources, | ||
44 | }; | 35 | }; |
45 | 36 | ||
46 | /* SMC91x */ | 37 | /* SMC91x */ |
@@ -83,8 +74,8 @@ device_initcall(sdk7780_devices_setup); | |||
83 | 74 | ||
84 | static void __init sdk7780_setup(char **cmdline_p) | 75 | static void __init sdk7780_setup(char **cmdline_p) |
85 | { | 76 | { |
86 | u16 ver = ctrl_inw(FPGA_FPVERR); | 77 | u16 ver = __raw_readw(FPGA_FPVERR); |
87 | u16 dateStamp = ctrl_inw(FPGA_FPDATER); | 78 | u16 dateStamp = __raw_readw(FPGA_FPDATER); |
88 | 79 | ||
89 | printk(KERN_INFO "Renesas Technology Europe SDK7780 support.\n"); | 80 | printk(KERN_INFO "Renesas Technology Europe SDK7780 support.\n"); |
90 | printk(KERN_INFO "Board version: %d (revision %d), " | 81 | printk(KERN_INFO "Board version: %d (revision %d), " |
@@ -94,7 +85,7 @@ static void __init sdk7780_setup(char **cmdline_p) | |||
94 | dateStamp); | 85 | dateStamp); |
95 | 86 | ||
96 | /* Setup pin mux'ing for PCIC */ | 87 | /* Setup pin mux'ing for PCIC */ |
97 | ctrl_outw(0x0000, GPIO_PECR); | 88 | __raw_writew(0x0000, GPIO_PECR); |
98 | } | 89 | } |
99 | 90 | ||
100 | /* | 91 | /* |
diff --git a/arch/sh/boards/mach-sdk7786/Makefile b/arch/sh/boards/mach-sdk7786/Makefile new file mode 100644 index 000000000000..a29f19e85b63 --- /dev/null +++ b/arch/sh/boards/mach-sdk7786/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-y := setup.o fpga.o irq.o | |||
diff --git a/arch/sh/boards/mach-sdk7786/fpga.c b/arch/sh/boards/mach-sdk7786/fpga.c new file mode 100644 index 000000000000..3e4ec66a0417 --- /dev/null +++ b/arch/sh/boards/mach-sdk7786/fpga.c | |||
@@ -0,0 +1,72 @@ | |||
1 | /* | ||
2 | * SDK7786 FPGA Support. | ||
3 | * | ||
4 | * Copyright (C) 2010 Paul Mundt | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | #include <linux/init.h> | ||
11 | #include <linux/io.h> | ||
12 | #include <linux/bcd.h> | ||
13 | #include <mach/fpga.h> | ||
14 | #include <asm/sizes.h> | ||
15 | |||
16 | #define FPGA_REGS_OFFSET 0x03fff800 | ||
17 | #define FPGA_REGS_SIZE 0x490 | ||
18 | |||
19 | /* | ||
20 | * The FPGA can be mapped in any of the generally available areas, | ||
21 | * so we attempt to scan for it using the fixed SRSTR read magic. | ||
22 | * | ||
23 | * Once the FPGA is located, the rest of the mapping data for the other | ||
24 | * components can be determined dynamically from its section mapping | ||
25 | * registers. | ||
26 | */ | ||
27 | static void __iomem *sdk7786_fpga_probe(void) | ||
28 | { | ||
29 | unsigned long area; | ||
30 | void __iomem *base; | ||
31 | |||
32 | /* | ||
33 | * Iterate over all of the areas where the FPGA could be mapped. | ||
34 | * The possible range is anywhere from area 0 through 6, area 7 | ||
35 | * is reserved. | ||
36 | */ | ||
37 | for (area = PA_AREA0; area < PA_AREA7; area += SZ_64M) { | ||
38 | base = ioremap_nocache(area + FPGA_REGS_OFFSET, FPGA_REGS_SIZE); | ||
39 | if (!base) { | ||
40 | /* Failed to remap this area, move along. */ | ||
41 | continue; | ||
42 | } | ||
43 | |||
44 | if (ioread16(base + SRSTR) == SRSTR_MAGIC) | ||
45 | return base; /* Found it! */ | ||
46 | |||
47 | iounmap(base); | ||
48 | } | ||
49 | |||
50 | return NULL; | ||
51 | } | ||
52 | |||
53 | void __iomem *sdk7786_fpga_base; | ||
54 | |||
55 | void __init sdk7786_fpga_init(void) | ||
56 | { | ||
57 | u16 version, date; | ||
58 | |||
59 | sdk7786_fpga_base = sdk7786_fpga_probe(); | ||
60 | if (unlikely(!sdk7786_fpga_base)) { | ||
61 | panic("FPGA detection failed.\n"); | ||
62 | return; | ||
63 | } | ||
64 | |||
65 | version = fpga_read_reg(FPGAVR); | ||
66 | date = fpga_read_reg(FPGADR); | ||
67 | |||
68 | pr_info("\tFPGA version:\t%d.%d (built on %d/%d/%d)\n", | ||
69 | bcd2bin(version >> 8) & 0xf, bcd2bin(version & 0xf), | ||
70 | ((date >> 12) & 0xf) + 2000, | ||
71 | (date >> 8) & 0xf, bcd2bin(date & 0xff)); | ||
72 | } | ||
diff --git a/arch/sh/boards/mach-sdk7786/irq.c b/arch/sh/boards/mach-sdk7786/irq.c new file mode 100644 index 000000000000..46943a0da5b7 --- /dev/null +++ b/arch/sh/boards/mach-sdk7786/irq.c | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * SDK7786 FPGA IRQ Controller Support. | ||
3 | * | ||
4 | * Copyright (C) 2010 Matt Fleming | ||
5 | * Copyright (C) 2010 Paul Mundt | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | #include <linux/irq.h> | ||
12 | #include <mach/fpga.h> | ||
13 | #include <mach/irq.h> | ||
14 | |||
15 | enum { | ||
16 | ATA_IRQ_BIT = 1, | ||
17 | SPI_BUSY_BIT = 2, | ||
18 | LIRQ5_BIT = 3, | ||
19 | LIRQ6_BIT = 4, | ||
20 | LIRQ7_BIT = 5, | ||
21 | LIRQ8_BIT = 6, | ||
22 | KEY_IRQ_BIT = 7, | ||
23 | PEN_IRQ_BIT = 8, | ||
24 | ETH_IRQ_BIT = 9, | ||
25 | RTC_ALARM_BIT = 10, | ||
26 | CRYSTAL_FAIL_BIT = 12, | ||
27 | ETH_PME_BIT = 14, | ||
28 | }; | ||
29 | |||
30 | void __init sdk7786_init_irq(void) | ||
31 | { | ||
32 | unsigned int tmp; | ||
33 | |||
34 | /* Enable priority encoding for all IRLs */ | ||
35 | fpga_write_reg(fpga_read_reg(INTMSR) | 0x0303, INTMSR); | ||
36 | |||
37 | /* Clear FPGA interrupt status registers */ | ||
38 | fpga_write_reg(0x0000, INTASR); | ||
39 | fpga_write_reg(0x0000, INTBSR); | ||
40 | |||
41 | /* Unmask FPGA interrupts */ | ||
42 | tmp = fpga_read_reg(INTAMR); | ||
43 | tmp &= ~(1 << ETH_IRQ_BIT); | ||
44 | fpga_write_reg(tmp, INTAMR); | ||
45 | |||
46 | plat_irq_setup_pins(IRQ_MODE_IRL7654_MASK); | ||
47 | plat_irq_setup_pins(IRQ_MODE_IRL3210_MASK); | ||
48 | } | ||
diff --git a/arch/sh/boards/mach-sdk7786/setup.c b/arch/sh/boards/mach-sdk7786/setup.c new file mode 100644 index 000000000000..f094ea2ee783 --- /dev/null +++ b/arch/sh/boards/mach-sdk7786/setup.c | |||
@@ -0,0 +1,189 @@ | |||
1 | /* | ||
2 | * Renesas Technology Europe SDK7786 Support. | ||
3 | * | ||
4 | * Copyright (C) 2010 Matt Fleming | ||
5 | * Copyright (C) 2010 Paul Mundt | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/platform_device.h> | ||
13 | #include <linux/io.h> | ||
14 | #include <linux/smsc911x.h> | ||
15 | #include <linux/i2c.h> | ||
16 | #include <linux/irq.h> | ||
17 | #include <linux/clk.h> | ||
18 | #include <mach/fpga.h> | ||
19 | #include <mach/irq.h> | ||
20 | #include <asm/machvec.h> | ||
21 | #include <asm/heartbeat.h> | ||
22 | #include <asm/sizes.h> | ||
23 | #include <asm/reboot.h> | ||
24 | |||
25 | static struct resource heartbeat_resource = { | ||
26 | .start = 0x07fff8b0, | ||
27 | .end = 0x07fff8b0 + sizeof(u16) - 1, | ||
28 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, | ||
29 | }; | ||
30 | |||
31 | static struct platform_device heartbeat_device = { | ||
32 | .name = "heartbeat", | ||
33 | .id = -1, | ||
34 | .num_resources = 1, | ||
35 | .resource = &heartbeat_resource, | ||
36 | }; | ||
37 | |||
38 | static struct resource smsc911x_resources[] = { | ||
39 | [0] = { | ||
40 | .name = "smsc911x-memory", | ||
41 | .start = 0x07ffff00, | ||
42 | .end = 0x07ffff00 + SZ_256 - 1, | ||
43 | .flags = IORESOURCE_MEM, | ||
44 | }, | ||
45 | [1] = { | ||
46 | .name = "smsc911x-irq", | ||
47 | .start = evt2irq(0x2c0), | ||
48 | .end = evt2irq(0x2c0), | ||
49 | .flags = IORESOURCE_IRQ, | ||
50 | }, | ||
51 | }; | ||
52 | |||
53 | static struct smsc911x_platform_config smsc911x_config = { | ||
54 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | ||
55 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | ||
56 | .flags = SMSC911X_USE_32BIT, | ||
57 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
58 | }; | ||
59 | |||
60 | static struct platform_device smsc911x_device = { | ||
61 | .name = "smsc911x", | ||
62 | .id = -1, | ||
63 | .num_resources = ARRAY_SIZE(smsc911x_resources), | ||
64 | .resource = smsc911x_resources, | ||
65 | .dev = { | ||
66 | .platform_data = &smsc911x_config, | ||
67 | }, | ||
68 | }; | ||
69 | |||
70 | static struct resource smbus_fpga_resource = { | ||
71 | .start = 0x07fff9e0, | ||
72 | .end = 0x07fff9e0 + SZ_32 - 1, | ||
73 | .flags = IORESOURCE_MEM, | ||
74 | }; | ||
75 | |||
76 | static struct platform_device smbus_fpga_device = { | ||
77 | .name = "i2c-sdk7786", | ||
78 | .id = 0, | ||
79 | .num_resources = 1, | ||
80 | .resource = &smbus_fpga_resource, | ||
81 | }; | ||
82 | |||
83 | static struct resource smbus_pcie_resource = { | ||
84 | .start = 0x07fffc30, | ||
85 | .end = 0x07fffc30 + SZ_32 - 1, | ||
86 | .flags = IORESOURCE_MEM, | ||
87 | }; | ||
88 | |||
89 | static struct platform_device smbus_pcie_device = { | ||
90 | .name = "i2c-sdk7786", | ||
91 | .id = 1, | ||
92 | .num_resources = 1, | ||
93 | .resource = &smbus_pcie_resource, | ||
94 | }; | ||
95 | |||
96 | static struct i2c_board_info __initdata sdk7786_i2c_devices[] = { | ||
97 | { | ||
98 | I2C_BOARD_INFO("max6900", 0x68), | ||
99 | }, | ||
100 | }; | ||
101 | |||
102 | static struct platform_device *sh7786_devices[] __initdata = { | ||
103 | &heartbeat_device, | ||
104 | &smsc911x_device, | ||
105 | &smbus_fpga_device, | ||
106 | &smbus_pcie_device, | ||
107 | }; | ||
108 | |||
109 | static int sdk7786_i2c_setup(void) | ||
110 | { | ||
111 | unsigned int tmp; | ||
112 | |||
113 | /* | ||
114 | * Hand over I2C control to the FPGA. | ||
115 | */ | ||
116 | tmp = fpga_read_reg(SBCR); | ||
117 | tmp &= ~SCBR_I2CCEN; | ||
118 | tmp |= SCBR_I2CMEN; | ||
119 | fpga_write_reg(tmp, SBCR); | ||
120 | |||
121 | return i2c_register_board_info(0, sdk7786_i2c_devices, | ||
122 | ARRAY_SIZE(sdk7786_i2c_devices)); | ||
123 | } | ||
124 | |||
125 | static int __init sdk7786_devices_setup(void) | ||
126 | { | ||
127 | int ret; | ||
128 | |||
129 | ret = platform_add_devices(sh7786_devices, ARRAY_SIZE(sh7786_devices)); | ||
130 | if (unlikely(ret != 0)) | ||
131 | return ret; | ||
132 | |||
133 | return sdk7786_i2c_setup(); | ||
134 | } | ||
135 | __initcall(sdk7786_devices_setup); | ||
136 | |||
137 | static int sdk7786_mode_pins(void) | ||
138 | { | ||
139 | return fpga_read_reg(MODSWR); | ||
140 | } | ||
141 | |||
142 | static int sdk7786_clk_init(void) | ||
143 | { | ||
144 | struct clk *clk; | ||
145 | int ret; | ||
146 | |||
147 | /* | ||
148 | * Only handle the EXTAL case, anyone interfacing a crystal | ||
149 | * resonator will need to provide their own input clock. | ||
150 | */ | ||
151 | if (test_mode_pin(MODE_PIN9)) | ||
152 | return -EINVAL; | ||
153 | |||
154 | clk = clk_get(NULL, "extal"); | ||
155 | if (!clk || IS_ERR(clk)) | ||
156 | return PTR_ERR(clk); | ||
157 | ret = clk_set_rate(clk, 33333333); | ||
158 | clk_put(clk); | ||
159 | |||
160 | return ret; | ||
161 | } | ||
162 | |||
163 | static void sdk7786_restart(char *cmd) | ||
164 | { | ||
165 | fpga_write_reg(0xa5a5, SRSTR); | ||
166 | } | ||
167 | |||
168 | /* Initialize the board */ | ||
169 | static void __init sdk7786_setup(char **cmdline_p) | ||
170 | { | ||
171 | pr_info("Renesas Technology Europe SDK7786 support:\n"); | ||
172 | |||
173 | sdk7786_fpga_init(); | ||
174 | |||
175 | pr_info("\tPCB revision:\t%d\n", fpga_read_reg(PCBRR) & 0xf); | ||
176 | |||
177 | machine_ops.restart = sdk7786_restart; | ||
178 | } | ||
179 | |||
180 | /* | ||
181 | * The Machine Vector | ||
182 | */ | ||
183 | static struct sh_machine_vector mv_sdk7786 __initmv = { | ||
184 | .mv_name = "SDK7786", | ||
185 | .mv_setup = sdk7786_setup, | ||
186 | .mv_mode_pins = sdk7786_mode_pins, | ||
187 | .mv_clk_init = sdk7786_clk_init, | ||
188 | .mv_init_irq = sdk7786_init_irq, | ||
189 | }; | ||
diff --git a/arch/sh/boards/mach-se/7206/io.c b/arch/sh/boards/mach-se/7206/io.c index 180455642a43..adadc77532ee 100644 --- a/arch/sh/boards/mach-se/7206/io.c +++ b/arch/sh/boards/mach-se/7206/io.c | |||
@@ -16,7 +16,7 @@ | |||
16 | 16 | ||
17 | static inline void delay(void) | 17 | static inline void delay(void) |
18 | { | 18 | { |
19 | ctrl_inw(0x20000000); /* P2 ROM Area */ | 19 | __raw_readw(0x20000000); /* P2 ROM Area */ |
20 | } | 20 | } |
21 | 21 | ||
22 | /* MS7750 requires special versions of in*, out* routines, since | 22 | /* MS7750 requires special versions of in*, out* routines, since |
diff --git a/arch/sh/boards/mach-se/7206/irq.c b/arch/sh/boards/mach-se/7206/irq.c index aef7f052851a..8d82175d83ab 100644 --- a/arch/sh/boards/mach-se/7206/irq.c +++ b/arch/sh/boards/mach-se/7206/irq.c | |||
@@ -32,12 +32,12 @@ static void disable_se7206_irq(unsigned int irq) | |||
32 | unsigned short msk0,msk1; | 32 | unsigned short msk0,msk1; |
33 | 33 | ||
34 | /* Set the priority in IPR to 0 */ | 34 | /* Set the priority in IPR to 0 */ |
35 | val = ctrl_inw(INTC_IPR01); | 35 | val = __raw_readw(INTC_IPR01); |
36 | val &= mask; | 36 | val &= mask; |
37 | ctrl_outw(val, INTC_IPR01); | 37 | __raw_writew(val, INTC_IPR01); |
38 | /* FPGA mask set */ | 38 | /* FPGA mask set */ |
39 | msk0 = ctrl_inw(INTMSK0); | 39 | msk0 = __raw_readw(INTMSK0); |
40 | msk1 = ctrl_inw(INTMSK1); | 40 | msk1 = __raw_readw(INTMSK1); |
41 | 41 | ||
42 | switch (irq) { | 42 | switch (irq) { |
43 | case IRQ0_IRQ: | 43 | case IRQ0_IRQ: |
@@ -51,8 +51,8 @@ static void disable_se7206_irq(unsigned int irq) | |||
51 | msk1 |= 0x00ff; | 51 | msk1 |= 0x00ff; |
52 | break; | 52 | break; |
53 | } | 53 | } |
54 | ctrl_outw(msk0, INTMSK0); | 54 | __raw_writew(msk0, INTMSK0); |
55 | ctrl_outw(msk1, INTMSK1); | 55 | __raw_writew(msk1, INTMSK1); |
56 | } | 56 | } |
57 | 57 | ||
58 | static void enable_se7206_irq(unsigned int irq) | 58 | static void enable_se7206_irq(unsigned int irq) |
@@ -62,13 +62,13 @@ static void enable_se7206_irq(unsigned int irq) | |||
62 | unsigned short msk0,msk1; | 62 | unsigned short msk0,msk1; |
63 | 63 | ||
64 | /* Set priority in IPR back to original value */ | 64 | /* Set priority in IPR back to original value */ |
65 | val = ctrl_inw(INTC_IPR01); | 65 | val = __raw_readw(INTC_IPR01); |
66 | val |= value; | 66 | val |= value; |
67 | ctrl_outw(val, INTC_IPR01); | 67 | __raw_writew(val, INTC_IPR01); |
68 | 68 | ||
69 | /* FPGA mask reset */ | 69 | /* FPGA mask reset */ |
70 | msk0 = ctrl_inw(INTMSK0); | 70 | msk0 = __raw_readw(INTMSK0); |
71 | msk1 = ctrl_inw(INTMSK1); | 71 | msk1 = __raw_readw(INTMSK1); |
72 | 72 | ||
73 | switch (irq) { | 73 | switch (irq) { |
74 | case IRQ0_IRQ: | 74 | case IRQ0_IRQ: |
@@ -82,19 +82,20 @@ static void enable_se7206_irq(unsigned int irq) | |||
82 | msk1 &= ~0x00ff; | 82 | msk1 &= ~0x00ff; |
83 | break; | 83 | break; |
84 | } | 84 | } |
85 | ctrl_outw(msk0, INTMSK0); | 85 | __raw_writew(msk0, INTMSK0); |
86 | ctrl_outw(msk1, INTMSK1); | 86 | __raw_writew(msk1, INTMSK1); |
87 | } | 87 | } |
88 | 88 | ||
89 | static void eoi_se7206_irq(unsigned int irq) | 89 | static void eoi_se7206_irq(unsigned int irq) |
90 | { | 90 | { |
91 | unsigned short sts0,sts1; | 91 | unsigned short sts0,sts1; |
92 | struct irq_desc *desc = irq_to_desc(irq); | ||
92 | 93 | ||
93 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | 94 | if (!(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS))) |
94 | enable_se7206_irq(irq); | 95 | enable_se7206_irq(irq); |
95 | /* FPGA isr clear */ | 96 | /* FPGA isr clear */ |
96 | sts0 = ctrl_inw(INTSTS0); | 97 | sts0 = __raw_readw(INTSTS0); |
97 | sts1 = ctrl_inw(INTSTS1); | 98 | sts1 = __raw_readw(INTSTS1); |
98 | 99 | ||
99 | switch (irq) { | 100 | switch (irq) { |
100 | case IRQ0_IRQ: | 101 | case IRQ0_IRQ: |
@@ -108,8 +109,8 @@ static void eoi_se7206_irq(unsigned int irq) | |||
108 | sts1 &= ~0x00ff; | 109 | sts1 &= ~0x00ff; |
109 | break; | 110 | break; |
110 | } | 111 | } |
111 | ctrl_outw(sts0, INTSTS0); | 112 | __raw_writew(sts0, INTSTS0); |
112 | ctrl_outw(sts1, INTSTS1); | 113 | __raw_writew(sts1, INTSTS1); |
113 | } | 114 | } |
114 | 115 | ||
115 | static struct irq_chip se7206_irq_chip __read_mostly = { | 116 | static struct irq_chip se7206_irq_chip __read_mostly = { |
@@ -136,11 +137,11 @@ void __init init_se7206_IRQ(void) | |||
136 | make_se7206_irq(IRQ0_IRQ); /* SMC91C111 */ | 137 | make_se7206_irq(IRQ0_IRQ); /* SMC91C111 */ |
137 | make_se7206_irq(IRQ1_IRQ); /* ATA */ | 138 | make_se7206_irq(IRQ1_IRQ); /* ATA */ |
138 | make_se7206_irq(IRQ3_IRQ); /* SLOT / PCM */ | 139 | make_se7206_irq(IRQ3_IRQ); /* SLOT / PCM */ |
139 | ctrl_outw(inw(INTC_ICR1) | 0x000b ,INTC_ICR1 ) ; /* ICR1 */ | 140 | __raw_writew(inw(INTC_ICR1) | 0x000b ,INTC_ICR1 ) ; /* ICR1 */ |
140 | 141 | ||
141 | /* FPGA System register setup*/ | 142 | /* FPGA System register setup*/ |
142 | ctrl_outw(0x0000,INTSTS0); /* Clear INTSTS0 */ | 143 | __raw_writew(0x0000,INTSTS0); /* Clear INTSTS0 */ |
143 | ctrl_outw(0x0000,INTSTS1); /* Clear INTSTS1 */ | 144 | __raw_writew(0x0000,INTSTS1); /* Clear INTSTS1 */ |
144 | /* IRQ0=LAN, IRQ1=ATA, IRQ3=SLT,PCM */ | 145 | /* IRQ0=LAN, IRQ1=ATA, IRQ3=SLT,PCM */ |
145 | ctrl_outw(0x0001,INTSEL); | 146 | __raw_writew(0x0001,INTSEL); |
146 | } | 147 | } |
diff --git a/arch/sh/boards/mach-se/7206/setup.c b/arch/sh/boards/mach-se/7206/setup.c index f5466384972e..8f5c65d43d1d 100644 --- a/arch/sh/boards/mach-se/7206/setup.c +++ b/arch/sh/boards/mach-se/7206/setup.c | |||
@@ -50,15 +50,12 @@ static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 }; | |||
50 | static struct heartbeat_data heartbeat_data = { | 50 | static struct heartbeat_data heartbeat_data = { |
51 | .bit_pos = heartbeat_bit_pos, | 51 | .bit_pos = heartbeat_bit_pos, |
52 | .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), | 52 | .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), |
53 | .regsize = 32, | ||
54 | }; | 53 | }; |
55 | 54 | ||
56 | static struct resource heartbeat_resources[] = { | 55 | static struct resource heartbeat_resource = { |
57 | [0] = { | 56 | .start = PA_LED, |
58 | .start = PA_LED, | 57 | .end = PA_LED, |
59 | .end = PA_LED, | 58 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, |
60 | .flags = IORESOURCE_MEM, | ||
61 | }, | ||
62 | }; | 59 | }; |
63 | 60 | ||
64 | static struct platform_device heartbeat_device = { | 61 | static struct platform_device heartbeat_device = { |
@@ -67,8 +64,8 @@ static struct platform_device heartbeat_device = { | |||
67 | .dev = { | 64 | .dev = { |
68 | .platform_data = &heartbeat_data, | 65 | .platform_data = &heartbeat_data, |
69 | }, | 66 | }, |
70 | .num_resources = ARRAY_SIZE(heartbeat_resources), | 67 | .num_resources = 1, |
71 | .resource = heartbeat_resources, | 68 | .resource = &heartbeat_resource, |
72 | }; | 69 | }; |
73 | 70 | ||
74 | static struct platform_device *se7206_devices[] __initdata = { | 71 | static struct platform_device *se7206_devices[] __initdata = { |
diff --git a/arch/sh/boards/mach-se/7343/irq.c b/arch/sh/boards/mach-se/7343/irq.c index 051c29d4eae0..d4305c26e9f7 100644 --- a/arch/sh/boards/mach-se/7343/irq.c +++ b/arch/sh/boards/mach-se/7343/irq.c | |||
@@ -16,16 +16,18 @@ | |||
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <mach-se/mach/se7343.h> | 17 | #include <mach-se/mach/se7343.h> |
18 | 18 | ||
19 | unsigned int se7343_fpga_irq[SE7343_FPGA_IRQ_NR] = { 0, }; | ||
20 | |||
19 | static void disable_se7343_irq(unsigned int irq) | 21 | static void disable_se7343_irq(unsigned int irq) |
20 | { | 22 | { |
21 | unsigned int bit = irq - SE7343_FPGA_IRQ_BASE; | 23 | unsigned int bit = (unsigned int)get_irq_chip_data(irq); |
22 | ctrl_outw(ctrl_inw(PA_CPLD_IMSK) | 1 << bit, PA_CPLD_IMSK); | 24 | __raw_writew(__raw_readw(PA_CPLD_IMSK) | 1 << bit, PA_CPLD_IMSK); |
23 | } | 25 | } |
24 | 26 | ||
25 | static void enable_se7343_irq(unsigned int irq) | 27 | static void enable_se7343_irq(unsigned int irq) |
26 | { | 28 | { |
27 | unsigned int bit = irq - SE7343_FPGA_IRQ_BASE; | 29 | unsigned int bit = (unsigned int)get_irq_chip_data(irq); |
28 | ctrl_outw(ctrl_inw(PA_CPLD_IMSK) & ~(1 << bit), PA_CPLD_IMSK); | 30 | __raw_writew(__raw_readw(PA_CPLD_IMSK) & ~(1 << bit), PA_CPLD_IMSK); |
29 | } | 31 | } |
30 | 32 | ||
31 | static struct irq_chip se7343_irq_chip __read_mostly = { | 33 | static struct irq_chip se7343_irq_chip __read_mostly = { |
@@ -37,19 +39,16 @@ static struct irq_chip se7343_irq_chip __read_mostly = { | |||
37 | 39 | ||
38 | static void se7343_irq_demux(unsigned int irq, struct irq_desc *desc) | 40 | static void se7343_irq_demux(unsigned int irq, struct irq_desc *desc) |
39 | { | 41 | { |
40 | unsigned short intv = ctrl_inw(PA_CPLD_ST); | 42 | unsigned short intv = __raw_readw(PA_CPLD_ST); |
41 | struct irq_desc *ext_desc; | 43 | unsigned int ext_irq = 0; |
42 | unsigned int ext_irq = SE7343_FPGA_IRQ_BASE; | ||
43 | 44 | ||
44 | intv &= (1 << SE7343_FPGA_IRQ_NR) - 1; | 45 | intv &= (1 << SE7343_FPGA_IRQ_NR) - 1; |
45 | 46 | ||
46 | while (intv) { | 47 | for (; intv; intv >>= 1, ext_irq++) { |
47 | if (intv & 1) { | 48 | if (!(intv & 1)) |
48 | ext_desc = irq_desc + ext_irq; | 49 | continue; |
49 | handle_level_irq(ext_irq, ext_desc); | 50 | |
50 | } | 51 | generic_handle_irq(se7343_fpga_irq[ext_irq]); |
51 | intv >>= 1; | ||
52 | ext_irq++; | ||
53 | } | 52 | } |
54 | } | 53 | } |
55 | 54 | ||
@@ -58,16 +57,24 @@ static void se7343_irq_demux(unsigned int irq, struct irq_desc *desc) | |||
58 | */ | 57 | */ |
59 | void __init init_7343se_IRQ(void) | 58 | void __init init_7343se_IRQ(void) |
60 | { | 59 | { |
61 | int i; | 60 | int i, irq; |
61 | |||
62 | __raw_writew(0, PA_CPLD_IMSK); /* disable all irqs */ | ||
63 | __raw_writew(0x2000, 0xb03fffec); /* mrshpc irq enable */ | ||
62 | 64 | ||
63 | ctrl_outw(0, PA_CPLD_IMSK); /* disable all irqs */ | 65 | for (i = 0; i < SE7343_FPGA_IRQ_NR; i++) { |
64 | ctrl_outw(0x2000, 0xb03fffec); /* mrshpc irq enable */ | 66 | irq = create_irq(); |
67 | if (irq < 0) | ||
68 | return; | ||
69 | se7343_fpga_irq[i] = irq; | ||
65 | 70 | ||
66 | for (i = 0; i < SE7343_FPGA_IRQ_NR; i++) | 71 | set_irq_chip_and_handler_name(se7343_fpga_irq[i], |
67 | set_irq_chip_and_handler_name(SE7343_FPGA_IRQ_BASE + i, | ||
68 | &se7343_irq_chip, | 72 | &se7343_irq_chip, |
69 | handle_level_irq, "level"); | 73 | handle_level_irq, "level"); |
70 | 74 | ||
75 | set_irq_chip_data(se7343_fpga_irq[i], (void *)i); | ||
76 | } | ||
77 | |||
71 | set_irq_chained_handler(IRQ0_IRQ, se7343_irq_demux); | 78 | set_irq_chained_handler(IRQ0_IRQ, se7343_irq_demux); |
72 | set_irq_type(IRQ0_IRQ, IRQ_TYPE_LEVEL_LOW); | 79 | set_irq_type(IRQ0_IRQ, IRQ_TYPE_LEVEL_LOW); |
73 | set_irq_chained_handler(IRQ1_IRQ, se7343_irq_demux); | 80 | set_irq_chained_handler(IRQ1_IRQ, se7343_irq_demux); |
diff --git a/arch/sh/boards/mach-se/7343/setup.c b/arch/sh/boards/mach-se/7343/setup.c index 4de56f35f419..d2370af56d77 100644 --- a/arch/sh/boards/mach-se/7343/setup.c +++ b/arch/sh/boards/mach-se/7343/setup.c | |||
@@ -11,26 +11,17 @@ | |||
11 | #include <asm/irq.h> | 11 | #include <asm/irq.h> |
12 | #include <asm/io.h> | 12 | #include <asm/io.h> |
13 | 13 | ||
14 | static struct resource heartbeat_resources[] = { | 14 | static struct resource heartbeat_resource = { |
15 | [0] = { | 15 | .start = PA_LED, |
16 | .start = PA_LED, | 16 | .end = PA_LED, |
17 | .end = PA_LED, | 17 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, |
18 | .flags = IORESOURCE_MEM, | ||
19 | }, | ||
20 | }; | ||
21 | |||
22 | static struct heartbeat_data heartbeat_data = { | ||
23 | .regsize = 16, | ||
24 | }; | 18 | }; |
25 | 19 | ||
26 | static struct platform_device heartbeat_device = { | 20 | static struct platform_device heartbeat_device = { |
27 | .name = "heartbeat", | 21 | .name = "heartbeat", |
28 | .id = -1, | 22 | .id = -1, |
29 | .dev = { | 23 | .num_resources = 1, |
30 | .platform_data = &heartbeat_data, | 24 | .resource = &heartbeat_resource, |
31 | }, | ||
32 | .num_resources = ARRAY_SIZE(heartbeat_resources), | ||
33 | .resource = heartbeat_resources, | ||
34 | }; | 25 | }; |
35 | 26 | ||
36 | static struct mtd_partition nor_flash_partitions[] = { | 27 | static struct mtd_partition nor_flash_partitions[] = { |
@@ -82,7 +73,6 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
82 | .mapbase = 0x16000000, | 73 | .mapbase = 0x16000000, |
83 | .regshift = 1, | 74 | .regshift = 1, |
84 | .flags = ST16C2550C_FLAGS, | 75 | .flags = ST16C2550C_FLAGS, |
85 | .irq = UARTA_IRQ, | ||
86 | .uartclk = 7372800, | 76 | .uartclk = 7372800, |
87 | }, | 77 | }, |
88 | [1] = { | 78 | [1] = { |
@@ -90,7 +80,6 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
90 | .mapbase = 0x17000000, | 80 | .mapbase = 0x17000000, |
91 | .regshift = 1, | 81 | .regshift = 1, |
92 | .flags = ST16C2550C_FLAGS, | 82 | .flags = ST16C2550C_FLAGS, |
93 | .irq = UARTB_IRQ, | ||
94 | .uartclk = 7372800, | 83 | .uartclk = 7372800, |
95 | }, | 84 | }, |
96 | { }, | 85 | { }, |
@@ -121,7 +110,7 @@ static struct resource usb_resources[] = { | |||
121 | .flags = IORESOURCE_MEM, | 110 | .flags = IORESOURCE_MEM, |
122 | }, | 111 | }, |
123 | [2] = { | 112 | [2] = { |
124 | .start = USB_IRQ, | 113 | /* Filled in later */ |
125 | .flags = IORESOURCE_IRQ, | 114 | .flags = IORESOURCE_IRQ, |
126 | }, | 115 | }, |
127 | }; | 116 | }; |
@@ -138,8 +127,8 @@ static struct isp116x_platform_data usb_platform_data = { | |||
138 | static struct platform_device usb_device = { | 127 | static struct platform_device usb_device = { |
139 | .name = "isp116x-hcd", | 128 | .name = "isp116x-hcd", |
140 | .id = -1, | 129 | .id = -1, |
141 | .num_resources = ARRAY_SIZE(usb_resources), | 130 | .num_resources = ARRAY_SIZE(usb_resources), |
142 | .resource = usb_resources, | 131 | .resource = usb_resources, |
143 | .dev = { | 132 | .dev = { |
144 | .platform_data = &usb_platform_data, | 133 | .platform_data = &usb_platform_data, |
145 | }, | 134 | }, |
@@ -155,6 +144,13 @@ static struct platform_device *sh7343se_platform_devices[] __initdata = { | |||
155 | 144 | ||
156 | static int __init sh7343se_devices_setup(void) | 145 | static int __init sh7343se_devices_setup(void) |
157 | { | 146 | { |
147 | /* Wire-up dynamic vectors */ | ||
148 | serial_platform_data[0].irq = se7343_fpga_irq[SE7343_FPGA_IRQ_UARTA]; | ||
149 | serial_platform_data[1].irq = se7343_fpga_irq[SE7343_FPGA_IRQ_UARTB]; | ||
150 | |||
151 | usb_resources[2].start = usb_resources[2].end = | ||
152 | se7343_fpga_irq[SE7343_FPGA_IRQ_USB]; | ||
153 | |||
158 | return platform_add_devices(sh7343se_platform_devices, | 154 | return platform_add_devices(sh7343se_platform_devices, |
159 | ARRAY_SIZE(sh7343se_platform_devices)); | 155 | ARRAY_SIZE(sh7343se_platform_devices)); |
160 | } | 156 | } |
@@ -165,10 +161,10 @@ device_initcall(sh7343se_devices_setup); | |||
165 | */ | 161 | */ |
166 | static void __init sh7343se_setup(char **cmdline_p) | 162 | static void __init sh7343se_setup(char **cmdline_p) |
167 | { | 163 | { |
168 | ctrl_outw(0xf900, FPGA_OUT); /* FPGA */ | 164 | __raw_writew(0xf900, FPGA_OUT); /* FPGA */ |
169 | 165 | ||
170 | ctrl_outw(0x0002, PORT_PECR); /* PORT E 1 = IRQ5 */ | 166 | __raw_writew(0x0002, PORT_PECR); /* PORT E 1 = IRQ5 */ |
171 | ctrl_outw(0x0020, PORT_PSELD); | 167 | __raw_writew(0x0020, PORT_PSELD); |
172 | 168 | ||
173 | printk(KERN_INFO "MS7343CP01 Setup...done\n"); | 169 | printk(KERN_INFO "MS7343CP01 Setup...done\n"); |
174 | } | 170 | } |
@@ -179,6 +175,5 @@ static void __init sh7343se_setup(char **cmdline_p) | |||
179 | static struct sh_machine_vector mv_7343se __initmv = { | 175 | static struct sh_machine_vector mv_7343se __initmv = { |
180 | .mv_name = "SolutionEngine 7343", | 176 | .mv_name = "SolutionEngine 7343", |
181 | .mv_setup = sh7343se_setup, | 177 | .mv_setup = sh7343se_setup, |
182 | .mv_nr_irqs = SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_NR, | ||
183 | .mv_init_irq = init_7343se_IRQ, | 178 | .mv_init_irq = init_7343se_IRQ, |
184 | }; | 179 | }; |
diff --git a/arch/sh/boards/mach-se/770x/irq.c b/arch/sh/boards/mach-se/770x/irq.c index ec1fea571b52..1028c17b81bc 100644 --- a/arch/sh/boards/mach-se/770x/irq.c +++ b/arch/sh/boards/mach-se/770x/irq.c | |||
@@ -96,13 +96,13 @@ static struct ipr_desc ipr_irq_desc = { | |||
96 | void __init init_se_IRQ(void) | 96 | void __init init_se_IRQ(void) |
97 | { | 97 | { |
98 | /* Disable all interrupts */ | 98 | /* Disable all interrupts */ |
99 | ctrl_outw(0, BCR_ILCRA); | 99 | __raw_writew(0, BCR_ILCRA); |
100 | ctrl_outw(0, BCR_ILCRB); | 100 | __raw_writew(0, BCR_ILCRB); |
101 | ctrl_outw(0, BCR_ILCRC); | 101 | __raw_writew(0, BCR_ILCRC); |
102 | ctrl_outw(0, BCR_ILCRD); | 102 | __raw_writew(0, BCR_ILCRD); |
103 | ctrl_outw(0, BCR_ILCRE); | 103 | __raw_writew(0, BCR_ILCRE); |
104 | ctrl_outw(0, BCR_ILCRF); | 104 | __raw_writew(0, BCR_ILCRF); |
105 | ctrl_outw(0, BCR_ILCRG); | 105 | __raw_writew(0, BCR_ILCRG); |
106 | 106 | ||
107 | register_ipr_controller(&ipr_irq_desc); | 107 | register_ipr_controller(&ipr_irq_desc); |
108 | } | 108 | } |
diff --git a/arch/sh/boards/mach-se/770x/setup.c b/arch/sh/boards/mach-se/770x/setup.c index 527eb6b12610..66d39d1b0901 100644 --- a/arch/sh/boards/mach-se/770x/setup.c +++ b/arch/sh/boards/mach-se/770x/setup.c | |||
@@ -93,15 +93,12 @@ static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 }; | |||
93 | static struct heartbeat_data heartbeat_data = { | 93 | static struct heartbeat_data heartbeat_data = { |
94 | .bit_pos = heartbeat_bit_pos, | 94 | .bit_pos = heartbeat_bit_pos, |
95 | .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), | 95 | .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), |
96 | .regsize = 16, | ||
97 | }; | 96 | }; |
98 | 97 | ||
99 | static struct resource heartbeat_resources[] = { | 98 | static struct resource heartbeat_resource = { |
100 | [0] = { | 99 | .start = PA_LED, |
101 | .start = PA_LED, | 100 | .end = PA_LED, |
102 | .end = PA_LED, | 101 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, |
103 | .flags = IORESOURCE_MEM, | ||
104 | }, | ||
105 | }; | 102 | }; |
106 | 103 | ||
107 | static struct platform_device heartbeat_device = { | 104 | static struct platform_device heartbeat_device = { |
@@ -110,8 +107,8 @@ static struct platform_device heartbeat_device = { | |||
110 | .dev = { | 107 | .dev = { |
111 | .platform_data = &heartbeat_data, | 108 | .platform_data = &heartbeat_data, |
112 | }, | 109 | }, |
113 | .num_resources = ARRAY_SIZE(heartbeat_resources), | 110 | .num_resources = 1, |
114 | .resource = heartbeat_resources, | 111 | .resource = &heartbeat_resource, |
115 | }; | 112 | }; |
116 | 113 | ||
117 | #if defined(CONFIG_CPU_SUBTYPE_SH7710) ||\ | 114 | #if defined(CONFIG_CPU_SUBTYPE_SH7710) ||\ |
diff --git a/arch/sh/boards/mach-se/7721/irq.c b/arch/sh/boards/mach-se/7721/irq.c index b417acc4dad0..d85022ea3f12 100644 --- a/arch/sh/boards/mach-se/7721/irq.c +++ b/arch/sh/boards/mach-se/7721/irq.c | |||
@@ -38,7 +38,7 @@ static DECLARE_INTC_DESC(intc_desc, "SE7721", vectors, | |||
38 | void __init init_se7721_IRQ(void) | 38 | void __init init_se7721_IRQ(void) |
39 | { | 39 | { |
40 | /* PPCR */ | 40 | /* PPCR */ |
41 | ctrl_outw(ctrl_inw(0xa4050118) & ~0x00ff, 0xa4050118); | 41 | __raw_writew(__raw_readw(0xa4050118) & ~0x00ff, 0xa4050118); |
42 | 42 | ||
43 | register_intc_controller(&intc_desc); | 43 | register_intc_controller(&intc_desc); |
44 | intc_set_priority(MRSHPC_IRQ0, 0xf - MRSHPC_IRQ0); | 44 | intc_set_priority(MRSHPC_IRQ0, 0xf - MRSHPC_IRQ0); |
diff --git a/arch/sh/boards/mach-se/7721/setup.c b/arch/sh/boards/mach-se/7721/setup.c index 55af4c36b43a..7416ad7ee53a 100644 --- a/arch/sh/boards/mach-se/7721/setup.c +++ b/arch/sh/boards/mach-se/7721/setup.c | |||
@@ -23,15 +23,12 @@ static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 }; | |||
23 | static struct heartbeat_data heartbeat_data = { | 23 | static struct heartbeat_data heartbeat_data = { |
24 | .bit_pos = heartbeat_bit_pos, | 24 | .bit_pos = heartbeat_bit_pos, |
25 | .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), | 25 | .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), |
26 | .regsize = 16, | ||
27 | }; | 26 | }; |
28 | 27 | ||
29 | static struct resource heartbeat_resources[] = { | 28 | static struct resource heartbeat_resource = { |
30 | [0] = { | 29 | .start = PA_LED, |
31 | .start = PA_LED, | 30 | .end = PA_LED, |
32 | .end = PA_LED, | 31 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, |
33 | .flags = IORESOURCE_MEM, | ||
34 | }, | ||
35 | }; | 32 | }; |
36 | 33 | ||
37 | static struct platform_device heartbeat_device = { | 34 | static struct platform_device heartbeat_device = { |
@@ -40,8 +37,8 @@ static struct platform_device heartbeat_device = { | |||
40 | .dev = { | 37 | .dev = { |
41 | .platform_data = &heartbeat_data, | 38 | .platform_data = &heartbeat_data, |
42 | }, | 39 | }, |
43 | .num_resources = ARRAY_SIZE(heartbeat_resources), | 40 | .num_resources = 1, |
44 | .resource = heartbeat_resources, | 41 | .resource = &heartbeat_resource, |
45 | }; | 42 | }; |
46 | 43 | ||
47 | static struct resource cf_ide_resources[] = { | 44 | static struct resource cf_ide_resources[] = { |
@@ -83,10 +80,10 @@ device_initcall(se7721_devices_setup); | |||
83 | static void __init se7721_setup(char **cmdline_p) | 80 | static void __init se7721_setup(char **cmdline_p) |
84 | { | 81 | { |
85 | /* for USB */ | 82 | /* for USB */ |
86 | ctrl_outw(0x0000, 0xA405010C); /* PGCR */ | 83 | __raw_writew(0x0000, 0xA405010C); /* PGCR */ |
87 | ctrl_outw(0x0000, 0xA405010E); /* PHCR */ | 84 | __raw_writew(0x0000, 0xA405010E); /* PHCR */ |
88 | ctrl_outw(0x00AA, 0xA4050118); /* PPCR */ | 85 | __raw_writew(0x00AA, 0xA4050118); /* PPCR */ |
89 | ctrl_outw(0x0000, 0xA4050124); /* PSELA */ | 86 | __raw_writew(0x0000, 0xA4050124); /* PSELA */ |
90 | } | 87 | } |
91 | 88 | ||
92 | /* | 89 | /* |
diff --git a/arch/sh/boards/mach-se/7722/irq.c b/arch/sh/boards/mach-se/7722/irq.c index b221b6842b0d..61605db04ee6 100644 --- a/arch/sh/boards/mach-se/7722/irq.c +++ b/arch/sh/boards/mach-se/7722/irq.c | |||
@@ -21,13 +21,13 @@ unsigned int se7722_fpga_irq[SE7722_FPGA_IRQ_NR] = { 0, }; | |||
21 | static void disable_se7722_irq(unsigned int irq) | 21 | static void disable_se7722_irq(unsigned int irq) |
22 | { | 22 | { |
23 | unsigned int bit = (unsigned int)get_irq_chip_data(irq); | 23 | unsigned int bit = (unsigned int)get_irq_chip_data(irq); |
24 | ctrl_outw(ctrl_inw(IRQ01_MASK) | 1 << bit, IRQ01_MASK); | 24 | __raw_writew(__raw_readw(IRQ01_MASK) | 1 << bit, IRQ01_MASK); |
25 | } | 25 | } |
26 | 26 | ||
27 | static void enable_se7722_irq(unsigned int irq) | 27 | static void enable_se7722_irq(unsigned int irq) |
28 | { | 28 | { |
29 | unsigned int bit = (unsigned int)get_irq_chip_data(irq); | 29 | unsigned int bit = (unsigned int)get_irq_chip_data(irq); |
30 | ctrl_outw(ctrl_inw(IRQ01_MASK) & ~(1 << bit), IRQ01_MASK); | 30 | __raw_writew(__raw_readw(IRQ01_MASK) & ~(1 << bit), IRQ01_MASK); |
31 | } | 31 | } |
32 | 32 | ||
33 | static struct irq_chip se7722_irq_chip __read_mostly = { | 33 | static struct irq_chip se7722_irq_chip __read_mostly = { |
@@ -39,7 +39,7 @@ static struct irq_chip se7722_irq_chip __read_mostly = { | |||
39 | 39 | ||
40 | static void se7722_irq_demux(unsigned int irq, struct irq_desc *desc) | 40 | static void se7722_irq_demux(unsigned int irq, struct irq_desc *desc) |
41 | { | 41 | { |
42 | unsigned short intv = ctrl_inw(IRQ01_STS); | 42 | unsigned short intv = __raw_readw(IRQ01_STS); |
43 | unsigned int ext_irq = 0; | 43 | unsigned int ext_irq = 0; |
44 | 44 | ||
45 | intv &= (1 << SE7722_FPGA_IRQ_NR) - 1; | 45 | intv &= (1 << SE7722_FPGA_IRQ_NR) - 1; |
@@ -59,8 +59,8 @@ void __init init_se7722_IRQ(void) | |||
59 | { | 59 | { |
60 | int i, irq; | 60 | int i, irq; |
61 | 61 | ||
62 | ctrl_outw(0, IRQ01_MASK); /* disable all irqs */ | 62 | __raw_writew(0, IRQ01_MASK); /* disable all irqs */ |
63 | ctrl_outw(0x2000, 0xb03fffec); /* mrshpc irq enable */ | 63 | __raw_writew(0x2000, 0xb03fffec); /* mrshpc irq enable */ |
64 | 64 | ||
65 | for (i = 0; i < SE7722_FPGA_IRQ_NR; i++) { | 65 | for (i = 0; i < SE7722_FPGA_IRQ_NR; i++) { |
66 | irq = create_irq(); | 66 | irq = create_irq(); |
diff --git a/arch/sh/boards/mach-se/7722/setup.c b/arch/sh/boards/mach-se/7722/setup.c index b1cb9425b600..80a4e571b310 100644 --- a/arch/sh/boards/mach-se/7722/setup.c +++ b/arch/sh/boards/mach-se/7722/setup.c | |||
@@ -25,26 +25,17 @@ | |||
25 | #include <cpu/sh7722.h> | 25 | #include <cpu/sh7722.h> |
26 | 26 | ||
27 | /* Heartbeat */ | 27 | /* Heartbeat */ |
28 | static struct heartbeat_data heartbeat_data = { | 28 | static struct resource heartbeat_resource = { |
29 | .regsize = 16, | 29 | .start = PA_LED, |
30 | }; | 30 | .end = PA_LED, |
31 | 31 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, | |
32 | static struct resource heartbeat_resources[] = { | ||
33 | [0] = { | ||
34 | .start = PA_LED, | ||
35 | .end = PA_LED, | ||
36 | .flags = IORESOURCE_MEM, | ||
37 | }, | ||
38 | }; | 32 | }; |
39 | 33 | ||
40 | static struct platform_device heartbeat_device = { | 34 | static struct platform_device heartbeat_device = { |
41 | .name = "heartbeat", | 35 | .name = "heartbeat", |
42 | .id = -1, | 36 | .id = -1, |
43 | .dev = { | 37 | .num_resources = 1, |
44 | .platform_data = &heartbeat_data, | 38 | .resource = &heartbeat_resource, |
45 | }, | ||
46 | .num_resources = ARRAY_SIZE(heartbeat_resources), | ||
47 | .resource = heartbeat_resources, | ||
48 | }; | 39 | }; |
49 | 40 | ||
50 | /* SMC91x */ | 41 | /* SMC91x */ |
@@ -165,32 +156,32 @@ device_initcall(se7722_devices_setup); | |||
165 | 156 | ||
166 | static void __init se7722_setup(char **cmdline_p) | 157 | static void __init se7722_setup(char **cmdline_p) |
167 | { | 158 | { |
168 | ctrl_outw(0x010D, FPGA_OUT); /* FPGA */ | 159 | __raw_writew(0x010D, FPGA_OUT); /* FPGA */ |
169 | 160 | ||
170 | ctrl_outw(0x0000, PORT_PECR); /* PORT E 1 = IRQ5 ,E 0 = BS */ | 161 | __raw_writew(0x0000, PORT_PECR); /* PORT E 1 = IRQ5 ,E 0 = BS */ |
171 | ctrl_outw(0x1000, PORT_PJCR); /* PORT J 1 = IRQ1,J 0 =IRQ0 */ | 162 | __raw_writew(0x1000, PORT_PJCR); /* PORT J 1 = IRQ1,J 0 =IRQ0 */ |
172 | 163 | ||
173 | /* LCDC I/O */ | 164 | /* LCDC I/O */ |
174 | ctrl_outw(0x0020, PORT_PSELD); | 165 | __raw_writew(0x0020, PORT_PSELD); |
175 | 166 | ||
176 | /* SIOF1*/ | 167 | /* SIOF1*/ |
177 | ctrl_outw(0x0003, PORT_PSELB); | 168 | __raw_writew(0x0003, PORT_PSELB); |
178 | ctrl_outw(0xe000, PORT_PSELC); | 169 | __raw_writew(0xe000, PORT_PSELC); |
179 | ctrl_outw(0x0000, PORT_PKCR); | 170 | __raw_writew(0x0000, PORT_PKCR); |
180 | 171 | ||
181 | /* LCDC */ | 172 | /* LCDC */ |
182 | ctrl_outw(0x4020, PORT_PHCR); | 173 | __raw_writew(0x4020, PORT_PHCR); |
183 | ctrl_outw(0x0000, PORT_PLCR); | 174 | __raw_writew(0x0000, PORT_PLCR); |
184 | ctrl_outw(0x0000, PORT_PMCR); | 175 | __raw_writew(0x0000, PORT_PMCR); |
185 | ctrl_outw(0x0002, PORT_PRCR); | 176 | __raw_writew(0x0002, PORT_PRCR); |
186 | ctrl_outw(0x0000, PORT_PXCR); /* LCDC,CS6A */ | 177 | __raw_writew(0x0000, PORT_PXCR); /* LCDC,CS6A */ |
187 | 178 | ||
188 | /* KEYSC */ | 179 | /* KEYSC */ |
189 | ctrl_outw(0x0A10, PORT_PSELA); /* BS,SHHID2 */ | 180 | __raw_writew(0x0A10, PORT_PSELA); /* BS,SHHID2 */ |
190 | ctrl_outw(0x0000, PORT_PYCR); | 181 | __raw_writew(0x0000, PORT_PYCR); |
191 | ctrl_outw(0x0000, PORT_PZCR); | 182 | __raw_writew(0x0000, PORT_PZCR); |
192 | ctrl_outw(ctrl_inw(PORT_HIZCRA) & ~0x4000, PORT_HIZCRA); | 183 | __raw_writew(__raw_readw(PORT_HIZCRA) & ~0x4000, PORT_HIZCRA); |
193 | ctrl_outw(ctrl_inw(PORT_HIZCRC) & ~0xc000, PORT_HIZCRC); | 184 | __raw_writew(__raw_readw(PORT_HIZCRC) & ~0xc000, PORT_HIZCRC); |
194 | } | 185 | } |
195 | 186 | ||
196 | /* | 187 | /* |
diff --git a/arch/sh/boards/mach-se/7724/irq.c b/arch/sh/boards/mach-se/7724/irq.c index f76cf3b49f23..0942be2daef6 100644 --- a/arch/sh/boards/mach-se/7724/irq.c +++ b/arch/sh/boards/mach-se/7724/irq.c | |||
@@ -72,14 +72,14 @@ static void disable_se7724_irq(unsigned int irq) | |||
72 | { | 72 | { |
73 | struct fpga_irq set = get_fpga_irq(fpga2irq(irq)); | 73 | struct fpga_irq set = get_fpga_irq(fpga2irq(irq)); |
74 | unsigned int bit = irq - set.base; | 74 | unsigned int bit = irq - set.base; |
75 | ctrl_outw(ctrl_inw(set.mraddr) | 0x0001 << bit, set.mraddr); | 75 | __raw_writew(__raw_readw(set.mraddr) | 0x0001 << bit, set.mraddr); |
76 | } | 76 | } |
77 | 77 | ||
78 | static void enable_se7724_irq(unsigned int irq) | 78 | static void enable_se7724_irq(unsigned int irq) |
79 | { | 79 | { |
80 | struct fpga_irq set = get_fpga_irq(fpga2irq(irq)); | 80 | struct fpga_irq set = get_fpga_irq(fpga2irq(irq)); |
81 | unsigned int bit = irq - set.base; | 81 | unsigned int bit = irq - set.base; |
82 | ctrl_outw(ctrl_inw(set.mraddr) & ~(0x0001 << bit), set.mraddr); | 82 | __raw_writew(__raw_readw(set.mraddr) & ~(0x0001 << bit), set.mraddr); |
83 | } | 83 | } |
84 | 84 | ||
85 | static struct irq_chip se7724_irq_chip __read_mostly = { | 85 | static struct irq_chip se7724_irq_chip __read_mostly = { |
@@ -92,19 +92,16 @@ static struct irq_chip se7724_irq_chip __read_mostly = { | |||
92 | static void se7724_irq_demux(unsigned int irq, struct irq_desc *desc) | 92 | static void se7724_irq_demux(unsigned int irq, struct irq_desc *desc) |
93 | { | 93 | { |
94 | struct fpga_irq set = get_fpga_irq(irq); | 94 | struct fpga_irq set = get_fpga_irq(irq); |
95 | unsigned short intv = ctrl_inw(set.sraddr); | 95 | unsigned short intv = __raw_readw(set.sraddr); |
96 | struct irq_desc *ext_desc; | ||
97 | unsigned int ext_irq = set.base; | 96 | unsigned int ext_irq = set.base; |
98 | 97 | ||
99 | intv &= set.mask; | 98 | intv &= set.mask; |
100 | 99 | ||
101 | while (intv) { | 100 | for (; intv; intv >>= 1, ext_irq++) { |
102 | if (intv & 0x0001) { | 101 | if (!(intv & 1)) |
103 | ext_desc = irq_desc + ext_irq; | 102 | continue; |
104 | handle_level_irq(ext_irq, ext_desc); | 103 | |
105 | } | 104 | generic_handle_irq(ext_irq); |
106 | intv >>= 1; | ||
107 | ext_irq++; | ||
108 | } | 105 | } |
109 | } | 106 | } |
110 | 107 | ||
@@ -113,20 +110,39 @@ static void se7724_irq_demux(unsigned int irq, struct irq_desc *desc) | |||
113 | */ | 110 | */ |
114 | void __init init_se7724_IRQ(void) | 111 | void __init init_se7724_IRQ(void) |
115 | { | 112 | { |
116 | int i; | 113 | int i, nid = cpu_to_node(boot_cpu_data); |
117 | 114 | ||
118 | ctrl_outw(0xffff, IRQ0_MR); /* mask all */ | 115 | __raw_writew(0xffff, IRQ0_MR); /* mask all */ |
119 | ctrl_outw(0xffff, IRQ1_MR); /* mask all */ | 116 | __raw_writew(0xffff, IRQ1_MR); /* mask all */ |
120 | ctrl_outw(0xffff, IRQ2_MR); /* mask all */ | 117 | __raw_writew(0xffff, IRQ2_MR); /* mask all */ |
121 | ctrl_outw(0x0000, IRQ0_SR); /* clear irq */ | 118 | __raw_writew(0x0000, IRQ0_SR); /* clear irq */ |
122 | ctrl_outw(0x0000, IRQ1_SR); /* clear irq */ | 119 | __raw_writew(0x0000, IRQ1_SR); /* clear irq */ |
123 | ctrl_outw(0x0000, IRQ2_SR); /* clear irq */ | 120 | __raw_writew(0x0000, IRQ2_SR); /* clear irq */ |
124 | ctrl_outw(0x002a, IRQ_MODE); /* set irq type */ | 121 | __raw_writew(0x002a, IRQ_MODE); /* set irq type */ |
125 | 122 | ||
126 | for (i = 0; i < SE7724_FPGA_IRQ_NR; i++) | 123 | for (i = 0; i < SE7724_FPGA_IRQ_NR; i++) { |
127 | set_irq_chip_and_handler_name(SE7724_FPGA_IRQ_BASE + i, | 124 | int irq, wanted; |
125 | |||
126 | wanted = SE7724_FPGA_IRQ_BASE + i; | ||
127 | |||
128 | irq = create_irq_nr(wanted, nid); | ||
129 | if (unlikely(irq == 0)) { | ||
130 | pr_err("%s: failed hooking irq %d for FPGA\n", | ||
131 | __func__, wanted); | ||
132 | return; | ||
133 | } | ||
134 | |||
135 | if (unlikely(irq != wanted)) { | ||
136 | pr_err("%s: got irq %d but wanted %d, bailing.\n", | ||
137 | __func__, irq, wanted); | ||
138 | destroy_irq(irq); | ||
139 | return; | ||
140 | } | ||
141 | |||
142 | set_irq_chip_and_handler_name(irq, | ||
128 | &se7724_irq_chip, | 143 | &se7724_irq_chip, |
129 | handle_level_irq, "level"); | 144 | handle_level_irq, "level"); |
145 | } | ||
130 | 146 | ||
131 | set_irq_chained_handler(IRQ0_IRQ, se7724_irq_demux); | 147 | set_irq_chained_handler(IRQ0_IRQ, se7724_irq_demux); |
132 | set_irq_type(IRQ0_IRQ, IRQ_TYPE_LEVEL_LOW); | 148 | set_irq_type(IRQ0_IRQ, IRQ_TYPE_LEVEL_LOW); |
diff --git a/arch/sh/boards/mach-se/7724/sdram.S b/arch/sh/boards/mach-se/7724/sdram.S index 9040167d5022..6fa4734d09c7 100644 --- a/arch/sh/boards/mach-se/7724/sdram.S +++ b/arch/sh/boards/mach-se/7724/sdram.S | |||
@@ -39,6 +39,10 @@ ENTRY(ms7724se_sdram_leave_start) | |||
39 | 39 | ||
40 | /* DBSC: put memory in auto-refresh mode */ | 40 | /* DBSC: put memory in auto-refresh mode */ |
41 | 41 | ||
42 | mov.l @(SH_SLEEP_MODE, r5), r0 | ||
43 | tst #SUSP_SH_RSTANDBY, r0 | ||
44 | bf resume_rstandby | ||
45 | |||
42 | ED 0xFD000040, 0x00000000 /* DBRFPDN0 */ | 46 | ED 0xFD000040, 0x00000000 /* DBRFPDN0 */ |
43 | WAIT 1 | 47 | WAIT 1 |
44 | ED 0xFD000014, 0x00000002 /* DBCMDCNT (PALL) */ | 48 | ED 0xFD000014, 0x00000002 /* DBCMDCNT (PALL) */ |
@@ -49,4 +53,79 @@ ENTRY(ms7724se_sdram_leave_start) | |||
49 | rts | 53 | rts |
50 | nop | 54 | nop |
51 | 55 | ||
56 | resume_rstandby: | ||
57 | |||
58 | /* CPG: setup clocks before restarting external memory */ | ||
59 | |||
60 | ED 0xA4150024, 0x00004000 /* PLLCR */ | ||
61 | |||
62 | mov.l FRQCRA,r0 | ||
63 | mov.l @r0,r3 | ||
64 | mov.l KICK,r1 | ||
65 | or r1, r3 | ||
66 | mov.l r3, @r0 | ||
67 | |||
68 | mov.l LSTATS,r0 | ||
69 | mov #1,r1 | ||
70 | WAIT_LSTATS: | ||
71 | mov.l @r0,r3 | ||
72 | tst r1,r3 | ||
73 | bf WAIT_LSTATS | ||
74 | |||
75 | /* DBSC: re-initialize and put in auto-refresh */ | ||
76 | |||
77 | ED 0xFD000108, 0x00000181 /* DBPDCNT0 */ | ||
78 | ED 0xFD000020, 0x015B0002 /* DBCONF */ | ||
79 | ED 0xFD000030, 0x03071502 /* DBTR0 */ | ||
80 | ED 0xFD000034, 0x02020102 /* DBTR1 */ | ||
81 | ED 0xFD000038, 0x01090405 /* DBTR2 */ | ||
82 | ED 0xFD00003C, 0x00000002 /* DBTR3 */ | ||
83 | ED 0xFD000008, 0x00000005 /* DBKIND */ | ||
84 | ED 0xFD000040, 0x00000001 /* DBRFPDN0 */ | ||
85 | ED 0xFD000040, 0x00000000 /* DBRFPDN0 */ | ||
86 | ED 0xFD000018, 0x00000001 /* DBCKECNT */ | ||
87 | |||
88 | mov #100,r0 | ||
89 | WAIT_400NS: | ||
90 | dt r0 | ||
91 | bf WAIT_400NS | ||
92 | |||
93 | ED 0xFD000014, 0x00000002 /* DBCMDCNT (PALL) */ | ||
94 | ED 0xFD000060, 0x00020000 /* DBMRCNT (EMR2) */ | ||
95 | ED 0xFD000060, 0x00030000 /* DBMRCNT (EMR3) */ | ||
96 | ED 0xFD000060, 0x00010004 /* DBMRCNT (EMR) */ | ||
97 | ED 0xFD000060, 0x00000532 /* DBMRCNT (MRS) */ | ||
98 | ED 0xFD000014, 0x00000002 /* DBCMDCNT (PALL) */ | ||
99 | ED 0xFD000014, 0x00000004 /* DBCMDCNT (REF) */ | ||
100 | ED 0xFD000014, 0x00000004 /* DBCMDCNT (REF) */ | ||
101 | ED 0xFD000060, 0x00000432 /* DBMRCNT (MRS) */ | ||
102 | ED 0xFD000060, 0x000103c0 /* DBMRCNT (EMR) */ | ||
103 | ED 0xFD000060, 0x00010040 /* DBMRCNT (EMR) */ | ||
104 | |||
105 | mov #100,r0 | ||
106 | WAIT_400NS_2: | ||
107 | dt r0 | ||
108 | bf WAIT_400NS_2 | ||
109 | |||
110 | ED 0xFD000010, 0x00000001 /* DBEN */ | ||
111 | ED 0xFD000044, 0x0000050f /* DBRFPDN1 */ | ||
112 | ED 0xFD000048, 0x236800e6 /* DBRFPDN2 */ | ||
113 | |||
114 | mov.l DUMMY,r0 | ||
115 | mov.l @r0, r1 /* force single dummy read */ | ||
116 | |||
117 | ED 0xFD000014, 0x00000002 /* DBCMDCNT (PALL) */ | ||
118 | ED 0xFD000014, 0x00000004 /* DBCMDCNT (REF) */ | ||
119 | ED 0xFD000108, 0x00000080 /* DBPDCNT0 */ | ||
120 | ED 0xFD000040, 0x00010000 /* DBRFPDN0 */ | ||
121 | |||
122 | rts | ||
123 | nop | ||
124 | |||
125 | .balign 4 | ||
126 | DUMMY: .long 0xac400000 | ||
127 | FRQCRA: .long 0xa4150000 | ||
128 | KICK: .long 0x80000000 | ||
129 | LSTATS: .long 0xa4150060 | ||
130 | |||
52 | ENTRY(ms7724se_sdram_leave_end) | 131 | ENTRY(ms7724se_sdram_leave_end) |
diff --git a/arch/sh/boards/mach-se/7724/setup.c b/arch/sh/boards/mach-se/7724/setup.c index 858ecb25d469..66cdbc3c7af9 100644 --- a/arch/sh/boards/mach-se/7724/setup.c +++ b/arch/sh/boards/mach-se/7724/setup.c | |||
@@ -53,26 +53,17 @@ | |||
53 | */ | 53 | */ |
54 | 54 | ||
55 | /* Heartbeat */ | 55 | /* Heartbeat */ |
56 | static struct heartbeat_data heartbeat_data = { | 56 | static struct resource heartbeat_resource = { |
57 | .regsize = 16, | 57 | .start = PA_LED, |
58 | }; | 58 | .end = PA_LED, |
59 | 59 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, | |
60 | static struct resource heartbeat_resources[] = { | ||
61 | [0] = { | ||
62 | .start = PA_LED, | ||
63 | .end = PA_LED, | ||
64 | .flags = IORESOURCE_MEM, | ||
65 | }, | ||
66 | }; | 60 | }; |
67 | 61 | ||
68 | static struct platform_device heartbeat_device = { | 62 | static struct platform_device heartbeat_device = { |
69 | .name = "heartbeat", | 63 | .name = "heartbeat", |
70 | .id = -1, | 64 | .id = -1, |
71 | .dev = { | 65 | .num_resources = 1, |
72 | .platform_data = &heartbeat_data, | 66 | .resource = &heartbeat_resource, |
73 | }, | ||
74 | .num_resources = ARRAY_SIZE(heartbeat_resources), | ||
75 | .resource = heartbeat_resources, | ||
76 | }; | 67 | }; |
77 | 68 | ||
78 | /* LAN91C111 */ | 69 | /* LAN91C111 */ |
@@ -265,12 +256,12 @@ static struct platform_device ceu1_device = { | |||
265 | #define FCLKACR 0xa4150008 | 256 | #define FCLKACR 0xa4150008 |
266 | static void fsimck_init(struct clk *clk) | 257 | static void fsimck_init(struct clk *clk) |
267 | { | 258 | { |
268 | u32 status = ctrl_inl(clk->enable_reg); | 259 | u32 status = __raw_readl(clk->enable_reg); |
269 | 260 | ||
270 | /* use external clock */ | 261 | /* use external clock */ |
271 | status &= ~0x000000ff; | 262 | status &= ~0x000000ff; |
272 | status |= 0x00000080; | 263 | status |= 0x00000080; |
273 | ctrl_outl(status, clk->enable_reg); | 264 | __raw_writel(status, clk->enable_reg); |
274 | } | 265 | } |
275 | 266 | ||
276 | static struct clk_ops fsimck_clk_ops = { | 267 | static struct clk_ops fsimck_clk_ops = { |
@@ -322,7 +313,7 @@ static struct platform_device fsi_device = { | |||
322 | /* KEYSC in SoC (Needs SW33-2 set to ON) */ | 313 | /* KEYSC in SoC (Needs SW33-2 set to ON) */ |
323 | static struct sh_keysc_info keysc_info = { | 314 | static struct sh_keysc_info keysc_info = { |
324 | .mode = SH_KEYSC_MODE_1, | 315 | .mode = SH_KEYSC_MODE_1, |
325 | .scan_timing = 10, | 316 | .scan_timing = 3, |
326 | .delay = 50, | 317 | .delay = 50, |
327 | .keycodes = { | 318 | .keycodes = { |
328 | KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, | 319 | KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, |
@@ -460,7 +451,7 @@ static struct resource sdhi0_cn7_resources[] = { | |||
460 | .flags = IORESOURCE_MEM, | 451 | .flags = IORESOURCE_MEM, |
461 | }, | 452 | }, |
462 | [1] = { | 453 | [1] = { |
463 | .start = 101, | 454 | .start = 100, |
464 | .flags = IORESOURCE_IRQ, | 455 | .flags = IORESOURCE_IRQ, |
465 | }, | 456 | }, |
466 | }; | 457 | }; |
@@ -483,7 +474,7 @@ static struct resource sdhi1_cn8_resources[] = { | |||
483 | .flags = IORESOURCE_MEM, | 474 | .flags = IORESOURCE_MEM, |
484 | }, | 475 | }, |
485 | [1] = { | 476 | [1] = { |
486 | .start = 24, | 477 | .start = 23, |
487 | .flags = IORESOURCE_IRQ, | 478 | .flags = IORESOURCE_IRQ, |
488 | }, | 479 | }, |
489 | }; | 480 | }; |
@@ -498,6 +489,26 @@ static struct platform_device sdhi1_cn8_device = { | |||
498 | }, | 489 | }, |
499 | }; | 490 | }; |
500 | 491 | ||
492 | /* IrDA */ | ||
493 | static struct resource irda_resources[] = { | ||
494 | [0] = { | ||
495 | .name = "IrDA", | ||
496 | .start = 0xA45D0000, | ||
497 | .end = 0xA45D0049, | ||
498 | .flags = IORESOURCE_MEM, | ||
499 | }, | ||
500 | [1] = { | ||
501 | .start = 20, | ||
502 | .flags = IORESOURCE_IRQ, | ||
503 | }, | ||
504 | }; | ||
505 | |||
506 | static struct platform_device irda_device = { | ||
507 | .name = "sh_sir", | ||
508 | .num_resources = ARRAY_SIZE(irda_resources), | ||
509 | .resource = irda_resources, | ||
510 | }; | ||
511 | |||
501 | static struct platform_device *ms7724se_devices[] __initdata = { | 512 | static struct platform_device *ms7724se_devices[] __initdata = { |
502 | &heartbeat_device, | 513 | &heartbeat_device, |
503 | &smc91x_eth_device, | 514 | &smc91x_eth_device, |
@@ -512,6 +523,7 @@ static struct platform_device *ms7724se_devices[] __initdata = { | |||
512 | &fsi_device, | 523 | &fsi_device, |
513 | &sdhi0_cn7_device, | 524 | &sdhi0_cn7_device, |
514 | &sdhi1_cn8_device, | 525 | &sdhi1_cn8_device, |
526 | &irda_device, | ||
515 | }; | 527 | }; |
516 | 528 | ||
517 | /* I2C device */ | 529 | /* I2C device */ |
@@ -531,7 +543,7 @@ static int __init sh_eth_is_eeprom_ready(void) | |||
531 | int t = 10000; | 543 | int t = 10000; |
532 | 544 | ||
533 | while (t--) { | 545 | while (t--) { |
534 | if (!ctrl_inw(EEPROM_STAT)) | 546 | if (!__raw_readw(EEPROM_STAT)) |
535 | return 1; | 547 | return 1; |
536 | udelay(1); | 548 | udelay(1); |
537 | } | 549 | } |
@@ -551,13 +563,13 @@ static void __init sh_eth_init(void) | |||
551 | 563 | ||
552 | /* read MAC addr from EEPROM */ | 564 | /* read MAC addr from EEPROM */ |
553 | for (i = 0 ; i < 3 ; i++) { | 565 | for (i = 0 ; i < 3 ; i++) { |
554 | ctrl_outw(0x0, EEPROM_OP); /* read */ | 566 | __raw_writew(0x0, EEPROM_OP); /* read */ |
555 | ctrl_outw(i*2, EEPROM_ADR); | 567 | __raw_writew(i*2, EEPROM_ADR); |
556 | ctrl_outw(0x1, EEPROM_STRT); | 568 | __raw_writew(0x1, EEPROM_STRT); |
557 | if (!sh_eth_is_eeprom_ready()) | 569 | if (!sh_eth_is_eeprom_ready()) |
558 | return; | 570 | return; |
559 | 571 | ||
560 | mac = ctrl_inw(EEPROM_DATA); | 572 | mac = __raw_readw(EEPROM_DATA); |
561 | sh_eth_plat.mac_addr[i << 1] = mac & 0xff; | 573 | sh_eth_plat.mac_addr[i << 1] = mac & 0xff; |
562 | sh_eth_plat.mac_addr[(i << 1) + 1] = mac >> 8; | 574 | sh_eth_plat.mac_addr[(i << 1) + 1] = mac >> 8; |
563 | } | 575 | } |
@@ -594,28 +606,29 @@ arch_initcall(arch_setup); | |||
594 | 606 | ||
595 | static int __init devices_setup(void) | 607 | static int __init devices_setup(void) |
596 | { | 608 | { |
597 | u16 sw = ctrl_inw(SW4140); /* select camera, monitor */ | 609 | u16 sw = __raw_readw(SW4140); /* select camera, monitor */ |
598 | struct clk *fsia_clk; | 610 | struct clk *clk; |
599 | 611 | ||
600 | /* register board specific self-refresh code */ | 612 | /* register board specific self-refresh code */ |
601 | sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF, | 613 | sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF | |
614 | SUSP_SH_RSTANDBY, | ||
602 | &ms7724se_sdram_enter_start, | 615 | &ms7724se_sdram_enter_start, |
603 | &ms7724se_sdram_enter_end, | 616 | &ms7724se_sdram_enter_end, |
604 | &ms7724se_sdram_leave_start, | 617 | &ms7724se_sdram_leave_start, |
605 | &ms7724se_sdram_leave_end); | 618 | &ms7724se_sdram_leave_end); |
606 | /* Reset Release */ | 619 | /* Reset Release */ |
607 | ctrl_outw(ctrl_inw(FPGA_OUT) & | 620 | __raw_writew(__raw_readw(FPGA_OUT) & |
608 | ~((1 << 1) | /* LAN */ | 621 | ~((1 << 1) | /* LAN */ |
609 | (1 << 6) | /* VIDEO DAC */ | 622 | (1 << 6) | /* VIDEO DAC */ |
610 | (1 << 7) | /* AK4643 */ | 623 | (1 << 7) | /* AK4643 */ |
624 | (1 << 8) | /* IrDA */ | ||
611 | (1 << 12) | /* USB0 */ | 625 | (1 << 12) | /* USB0 */ |
612 | (1 << 14)), /* RMII */ | 626 | (1 << 14)), /* RMII */ |
613 | FPGA_OUT); | 627 | FPGA_OUT); |
614 | 628 | ||
615 | /* turn on USB clocks, use external clock */ | 629 | /* turn on USB clocks, use external clock */ |
616 | ctrl_outw((ctrl_inw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB); | 630 | __raw_writew((__raw_readw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB); |
617 | 631 | ||
618 | #ifdef CONFIG_PM | ||
619 | /* Let LED9 show STATUS2 */ | 632 | /* Let LED9 show STATUS2 */ |
620 | gpio_request(GPIO_FN_STATUS2, NULL); | 633 | gpio_request(GPIO_FN_STATUS2, NULL); |
621 | 634 | ||
@@ -624,28 +637,12 @@ static int __init devices_setup(void) | |||
624 | 637 | ||
625 | /* Lit LED11 show PDSTATUS */ | 638 | /* Lit LED11 show PDSTATUS */ |
626 | gpio_request(GPIO_FN_PDSTATUS, NULL); | 639 | gpio_request(GPIO_FN_PDSTATUS, NULL); |
627 | #else | ||
628 | /* Lit LED9 */ | ||
629 | gpio_request(GPIO_PTJ6, NULL); | ||
630 | gpio_direction_output(GPIO_PTJ6, 1); | ||
631 | gpio_export(GPIO_PTJ6, 0); | ||
632 | |||
633 | /* Lit LED10 */ | ||
634 | gpio_request(GPIO_PTJ5, NULL); | ||
635 | gpio_direction_output(GPIO_PTJ5, 1); | ||
636 | gpio_export(GPIO_PTJ5, 0); | ||
637 | |||
638 | /* Lit LED11 */ | ||
639 | gpio_request(GPIO_PTJ7, NULL); | ||
640 | gpio_direction_output(GPIO_PTJ7, 1); | ||
641 | gpio_export(GPIO_PTJ7, 0); | ||
642 | #endif | ||
643 | 640 | ||
644 | /* enable USB0 port */ | 641 | /* enable USB0 port */ |
645 | ctrl_outw(0x0600, 0xa40501d4); | 642 | __raw_writew(0x0600, 0xa40501d4); |
646 | 643 | ||
647 | /* enable USB1 port */ | 644 | /* enable USB1 port */ |
648 | ctrl_outw(0x0600, 0xa4050192); | 645 | __raw_writew(0x0600, 0xa4050192); |
649 | 646 | ||
650 | /* enable IRQ 0,1,2 */ | 647 | /* enable IRQ 0,1,2 */ |
651 | gpio_request(GPIO_FN_INTC_IRQ0, NULL); | 648 | gpio_request(GPIO_FN_INTC_IRQ0, NULL); |
@@ -693,7 +690,7 @@ static int __init devices_setup(void) | |||
693 | gpio_request(GPIO_FN_LCDVCPWC, NULL); | 690 | gpio_request(GPIO_FN_LCDVCPWC, NULL); |
694 | gpio_request(GPIO_FN_LCDRD, NULL); | 691 | gpio_request(GPIO_FN_LCDRD, NULL); |
695 | gpio_request(GPIO_FN_LCDLCLK, NULL); | 692 | gpio_request(GPIO_FN_LCDLCLK, NULL); |
696 | ctrl_outw((ctrl_inw(PORT_HIZA) & ~0x0001), PORT_HIZA); | 693 | __raw_writew((__raw_readw(PORT_HIZA) & ~0x0001), PORT_HIZA); |
697 | 694 | ||
698 | /* enable CEU0 */ | 695 | /* enable CEU0 */ |
699 | gpio_request(GPIO_FN_VIO0_D15, NULL); | 696 | gpio_request(GPIO_FN_VIO0_D15, NULL); |
@@ -764,13 +761,18 @@ static int __init devices_setup(void) | |||
764 | gpio_request(GPIO_FN_CLKAUDIOBO, NULL); | 761 | gpio_request(GPIO_FN_CLKAUDIOBO, NULL); |
765 | gpio_request(GPIO_FN_FSIIASD, NULL); | 762 | gpio_request(GPIO_FN_FSIIASD, NULL); |
766 | 763 | ||
764 | /* set SPU2 clock to 83.4 MHz */ | ||
765 | clk = clk_get(NULL, "spu_clk"); | ||
766 | clk_set_rate(clk, clk_round_rate(clk, 83333333)); | ||
767 | clk_put(clk); | ||
768 | |||
767 | /* change parent of FSI A */ | 769 | /* change parent of FSI A */ |
768 | fsia_clk = clk_get(NULL, "fsia_clk"); | 770 | clk = clk_get(NULL, "fsia_clk"); |
769 | clk_register(&fsimcka_clk); | 771 | clk_register(&fsimcka_clk); |
770 | clk_set_parent(fsia_clk, &fsimcka_clk); | 772 | clk_set_parent(clk, &fsimcka_clk); |
771 | clk_set_rate(fsia_clk, 11000); | 773 | clk_set_rate(clk, 11000); |
772 | clk_set_rate(&fsimcka_clk, 11000); | 774 | clk_set_rate(&fsimcka_clk, 11000); |
773 | clk_put(fsia_clk); | 775 | clk_put(clk); |
774 | 776 | ||
775 | /* SDHI0 connected to cn7 */ | 777 | /* SDHI0 connected to cn7 */ |
776 | gpio_request(GPIO_FN_SDHI0CD, NULL); | 778 | gpio_request(GPIO_FN_SDHI0CD, NULL); |
@@ -792,6 +794,10 @@ static int __init devices_setup(void) | |||
792 | gpio_request(GPIO_FN_SDHI1CMD, NULL); | 794 | gpio_request(GPIO_FN_SDHI1CMD, NULL); |
793 | gpio_request(GPIO_FN_SDHI1CLK, NULL); | 795 | gpio_request(GPIO_FN_SDHI1CLK, NULL); |
794 | 796 | ||
797 | /* enable IrDA */ | ||
798 | gpio_request(GPIO_FN_IRDA_OUT, NULL); | ||
799 | gpio_request(GPIO_FN_IRDA_IN, NULL); | ||
800 | |||
795 | /* | 801 | /* |
796 | * enable SH-Eth | 802 | * enable SH-Eth |
797 | * | 803 | * |
diff --git a/arch/sh/boards/mach-se/7780/irq.c b/arch/sh/boards/mach-se/7780/irq.c index 121744c08714..d5c9edc172a3 100644 --- a/arch/sh/boards/mach-se/7780/irq.c +++ b/arch/sh/boards/mach-se/7780/irq.c | |||
@@ -24,30 +24,30 @@ | |||
24 | void __init init_se7780_IRQ(void) | 24 | void __init init_se7780_IRQ(void) |
25 | { | 25 | { |
26 | /* enable all interrupt at FPGA */ | 26 | /* enable all interrupt at FPGA */ |
27 | ctrl_outw(0, FPGA_INTMSK1); | 27 | __raw_writew(0, FPGA_INTMSK1); |
28 | /* mask SM501 interrupt */ | 28 | /* mask SM501 interrupt */ |
29 | ctrl_outw((ctrl_inw(FPGA_INTMSK1) | 0x0002), FPGA_INTMSK1); | 29 | __raw_writew((__raw_readw(FPGA_INTMSK1) | 0x0002), FPGA_INTMSK1); |
30 | /* enable all interrupt at FPGA */ | 30 | /* enable all interrupt at FPGA */ |
31 | ctrl_outw(0, FPGA_INTMSK2); | 31 | __raw_writew(0, FPGA_INTMSK2); |
32 | 32 | ||
33 | /* set FPGA INTSEL register */ | 33 | /* set FPGA INTSEL register */ |
34 | /* FPGA + 0x06 */ | 34 | /* FPGA + 0x06 */ |
35 | ctrl_outw( ((IRQPIN_SM501 << IRQPOS_SM501) | | 35 | __raw_writew( ((IRQPIN_SM501 << IRQPOS_SM501) | |
36 | (IRQPIN_SMC91CX << IRQPOS_SMC91CX)), FPGA_INTSEL1); | 36 | (IRQPIN_SMC91CX << IRQPOS_SMC91CX)), FPGA_INTSEL1); |
37 | 37 | ||
38 | /* FPGA + 0x08 */ | 38 | /* FPGA + 0x08 */ |
39 | ctrl_outw(((IRQPIN_EXTINT4 << IRQPOS_EXTINT4) | | 39 | __raw_writew(((IRQPIN_EXTINT4 << IRQPOS_EXTINT4) | |
40 | (IRQPIN_EXTINT3 << IRQPOS_EXTINT3) | | 40 | (IRQPIN_EXTINT3 << IRQPOS_EXTINT3) | |
41 | (IRQPIN_EXTINT2 << IRQPOS_EXTINT2) | | 41 | (IRQPIN_EXTINT2 << IRQPOS_EXTINT2) | |
42 | (IRQPIN_EXTINT1 << IRQPOS_EXTINT1)), FPGA_INTSEL2); | 42 | (IRQPIN_EXTINT1 << IRQPOS_EXTINT1)), FPGA_INTSEL2); |
43 | 43 | ||
44 | /* FPGA + 0x0A */ | 44 | /* FPGA + 0x0A */ |
45 | ctrl_outw((IRQPIN_PCCPW << IRQPOS_PCCPW), FPGA_INTSEL3); | 45 | __raw_writew((IRQPIN_PCCPW << IRQPOS_PCCPW), FPGA_INTSEL3); |
46 | 46 | ||
47 | plat_irq_setup_pins(IRQ_MODE_IRQ); /* install handlers for IRQ0-7 */ | 47 | plat_irq_setup_pins(IRQ_MODE_IRQ); /* install handlers for IRQ0-7 */ |
48 | 48 | ||
49 | /* ICR1: detect low level(for 2ndcut) */ | 49 | /* ICR1: detect low level(for 2ndcut) */ |
50 | ctrl_outl(0xAAAA0000, INTC_ICR1); | 50 | __raw_writel(0xAAAA0000, INTC_ICR1); |
51 | 51 | ||
52 | /* | 52 | /* |
53 | * FPGA PCISEL register initialize | 53 | * FPGA PCISEL register initialize |
@@ -63,6 +63,6 @@ void __init init_se7780_IRQ(void) | |||
63 | * INTD || INTD | INTC | -- | INTA | 63 | * INTD || INTD | INTC | -- | INTA |
64 | * ------------------------------------- | 64 | * ------------------------------------- |
65 | */ | 65 | */ |
66 | ctrl_outw(0x0013, FPGA_PCI_INTSEL1); | 66 | __raw_writew(0x0013, FPGA_PCI_INTSEL1); |
67 | ctrl_outw(0xE402, FPGA_PCI_INTSEL2); | 67 | __raw_writew(0xE402, FPGA_PCI_INTSEL2); |
68 | } | 68 | } |
diff --git a/arch/sh/boards/mach-se/7780/setup.c b/arch/sh/boards/mach-se/7780/setup.c index 1d3a867e94e3..6f7c207138e1 100644 --- a/arch/sh/boards/mach-se/7780/setup.c +++ b/arch/sh/boards/mach-se/7780/setup.c | |||
@@ -17,26 +17,17 @@ | |||
17 | #include <asm/heartbeat.h> | 17 | #include <asm/heartbeat.h> |
18 | 18 | ||
19 | /* Heartbeat */ | 19 | /* Heartbeat */ |
20 | static struct heartbeat_data heartbeat_data = { | 20 | static struct resource heartbeat_resource = { |
21 | .regsize = 16, | 21 | .start = PA_LED, |
22 | }; | 22 | .end = PA_LED, |
23 | 23 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, | |
24 | static struct resource heartbeat_resources[] = { | ||
25 | [0] = { | ||
26 | .start = PA_LED, | ||
27 | .end = PA_LED, | ||
28 | .flags = IORESOURCE_MEM, | ||
29 | }, | ||
30 | }; | 24 | }; |
31 | 25 | ||
32 | static struct platform_device heartbeat_device = { | 26 | static struct platform_device heartbeat_device = { |
33 | .name = "heartbeat", | 27 | .name = "heartbeat", |
34 | .id = -1, | 28 | .id = -1, |
35 | .dev = { | 29 | .num_resources = 1, |
36 | .platform_data = &heartbeat_data, | 30 | .resource = &heartbeat_resource, |
37 | }, | ||
38 | .num_resources = ARRAY_SIZE(heartbeat_resources), | ||
39 | .resource = heartbeat_resources, | ||
40 | }; | 31 | }; |
41 | 32 | ||
42 | /* SMC91x */ | 33 | /* SMC91x */ |
@@ -84,14 +75,14 @@ device_initcall(se7780_devices_setup); | |||
84 | static void __init se7780_setup(char **cmdline_p) | 75 | static void __init se7780_setup(char **cmdline_p) |
85 | { | 76 | { |
86 | /* "SH-Linux" on LED Display */ | 77 | /* "SH-Linux" on LED Display */ |
87 | ctrl_outw( 'S' , PA_LED_DISP + (DISP_SEL0_ADDR << 1) ); | 78 | __raw_writew( 'S' , PA_LED_DISP + (DISP_SEL0_ADDR << 1) ); |
88 | ctrl_outw( 'H' , PA_LED_DISP + (DISP_SEL1_ADDR << 1) ); | 79 | __raw_writew( 'H' , PA_LED_DISP + (DISP_SEL1_ADDR << 1) ); |
89 | ctrl_outw( '-' , PA_LED_DISP + (DISP_SEL2_ADDR << 1) ); | 80 | __raw_writew( '-' , PA_LED_DISP + (DISP_SEL2_ADDR << 1) ); |
90 | ctrl_outw( 'L' , PA_LED_DISP + (DISP_SEL3_ADDR << 1) ); | 81 | __raw_writew( 'L' , PA_LED_DISP + (DISP_SEL3_ADDR << 1) ); |
91 | ctrl_outw( 'i' , PA_LED_DISP + (DISP_SEL4_ADDR << 1) ); | 82 | __raw_writew( 'i' , PA_LED_DISP + (DISP_SEL4_ADDR << 1) ); |
92 | ctrl_outw( 'n' , PA_LED_DISP + (DISP_SEL5_ADDR << 1) ); | 83 | __raw_writew( 'n' , PA_LED_DISP + (DISP_SEL5_ADDR << 1) ); |
93 | ctrl_outw( 'u' , PA_LED_DISP + (DISP_SEL6_ADDR << 1) ); | 84 | __raw_writew( 'u' , PA_LED_DISP + (DISP_SEL6_ADDR << 1) ); |
94 | ctrl_outw( 'x' , PA_LED_DISP + (DISP_SEL7_ADDR << 1) ); | 85 | __raw_writew( 'x' , PA_LED_DISP + (DISP_SEL7_ADDR << 1) ); |
95 | 86 | ||
96 | printk(KERN_INFO "Hitachi UL Solutions Engine 7780SE03 support.\n"); | 87 | printk(KERN_INFO "Hitachi UL Solutions Engine 7780SE03 support.\n"); |
97 | 88 | ||
@@ -102,15 +93,15 @@ static void __init se7780_setup(char **cmdline_p) | |||
102 | * REQ2/GNT2 -> Serial ATA | 93 | * REQ2/GNT2 -> Serial ATA |
103 | * REQ3/GNT3 -> PCI slot | 94 | * REQ3/GNT3 -> PCI slot |
104 | */ | 95 | */ |
105 | ctrl_outw(0x0213, FPGA_REQSEL); | 96 | __raw_writew(0x0213, FPGA_REQSEL); |
106 | 97 | ||
107 | /* GPIO setting */ | 98 | /* GPIO setting */ |
108 | ctrl_outw(0x0000, GPIO_PECR); | 99 | __raw_writew(0x0000, GPIO_PECR); |
109 | ctrl_outw(ctrl_inw(GPIO_PHCR)&0xfff3, GPIO_PHCR); | 100 | __raw_writew(__raw_readw(GPIO_PHCR)&0xfff3, GPIO_PHCR); |
110 | ctrl_outw(0x0c00, GPIO_PMSELR); | 101 | __raw_writew(0x0c00, GPIO_PMSELR); |
111 | 102 | ||
112 | /* iVDR Power ON */ | 103 | /* iVDR Power ON */ |
113 | ctrl_outw(0x0001, FPGA_IVDRPW); | 104 | __raw_writew(0x0001, FPGA_IVDRPW); |
114 | } | 105 | } |
115 | 106 | ||
116 | /* | 107 | /* |
diff --git a/arch/sh/boards/mach-sh03/rtc.c b/arch/sh/boards/mach-sh03/rtc.c index a8b9f844ab5b..1b200990500c 100644 --- a/arch/sh/boards/mach-sh03/rtc.c +++ b/arch/sh/boards/mach-sh03/rtc.c | |||
@@ -44,15 +44,15 @@ unsigned long get_cmos_time(void) | |||
44 | spin_lock(&sh03_rtc_lock); | 44 | spin_lock(&sh03_rtc_lock); |
45 | again: | 45 | again: |
46 | do { | 46 | do { |
47 | sec = (ctrl_inb(RTC_SEC1) & 0xf) + (ctrl_inb(RTC_SEC10) & 0x7) * 10; | 47 | sec = (__raw_readb(RTC_SEC1) & 0xf) + (__raw_readb(RTC_SEC10) & 0x7) * 10; |
48 | min = (ctrl_inb(RTC_MIN1) & 0xf) + (ctrl_inb(RTC_MIN10) & 0xf) * 10; | 48 | min = (__raw_readb(RTC_MIN1) & 0xf) + (__raw_readb(RTC_MIN10) & 0xf) * 10; |
49 | hour = (ctrl_inb(RTC_HOU1) & 0xf) + (ctrl_inb(RTC_HOU10) & 0xf) * 10; | 49 | hour = (__raw_readb(RTC_HOU1) & 0xf) + (__raw_readb(RTC_HOU10) & 0xf) * 10; |
50 | day = (ctrl_inb(RTC_DAY1) & 0xf) + (ctrl_inb(RTC_DAY10) & 0xf) * 10; | 50 | day = (__raw_readb(RTC_DAY1) & 0xf) + (__raw_readb(RTC_DAY10) & 0xf) * 10; |
51 | mon = (ctrl_inb(RTC_MON1) & 0xf) + (ctrl_inb(RTC_MON10) & 0xf) * 10; | 51 | mon = (__raw_readb(RTC_MON1) & 0xf) + (__raw_readb(RTC_MON10) & 0xf) * 10; |
52 | year = (ctrl_inb(RTC_YEA1) & 0xf) + (ctrl_inb(RTC_YEA10) & 0xf) * 10 | 52 | year = (__raw_readb(RTC_YEA1) & 0xf) + (__raw_readb(RTC_YEA10) & 0xf) * 10 |
53 | + (ctrl_inb(RTC_YEA100 ) & 0xf) * 100 | 53 | + (__raw_readb(RTC_YEA100 ) & 0xf) * 100 |
54 | + (ctrl_inb(RTC_YEA1000) & 0xf) * 1000; | 54 | + (__raw_readb(RTC_YEA1000) & 0xf) * 1000; |
55 | } while (sec != (ctrl_inb(RTC_SEC1) & 0xf) + (ctrl_inb(RTC_SEC10) & 0x7) * 10); | 55 | } while (sec != (__raw_readb(RTC_SEC1) & 0xf) + (__raw_readb(RTC_SEC10) & 0x7) * 10); |
56 | if (year == 0 || mon < 1 || mon > 12 || day > 31 || day < 1 || | 56 | if (year == 0 || mon < 1 || mon > 12 || day > 31 || day < 1 || |
57 | hour > 23 || min > 59 || sec > 59) { | 57 | hour > 23 || min > 59 || sec > 59) { |
58 | printk(KERN_ERR | 58 | printk(KERN_ERR |
@@ -60,16 +60,16 @@ unsigned long get_cmos_time(void) | |||
60 | printk("year=%d, mon=%d, day=%d, hour=%d, min=%d, sec=%d\n", | 60 | printk("year=%d, mon=%d, day=%d, hour=%d, min=%d, sec=%d\n", |
61 | year, mon, day, hour, min, sec); | 61 | year, mon, day, hour, min, sec); |
62 | 62 | ||
63 | ctrl_outb(0, RTC_SEC1); ctrl_outb(0, RTC_SEC10); | 63 | __raw_writeb(0, RTC_SEC1); __raw_writeb(0, RTC_SEC10); |
64 | ctrl_outb(0, RTC_MIN1); ctrl_outb(0, RTC_MIN10); | 64 | __raw_writeb(0, RTC_MIN1); __raw_writeb(0, RTC_MIN10); |
65 | ctrl_outb(0, RTC_HOU1); ctrl_outb(0, RTC_HOU10); | 65 | __raw_writeb(0, RTC_HOU1); __raw_writeb(0, RTC_HOU10); |
66 | ctrl_outb(6, RTC_WEE1); | 66 | __raw_writeb(6, RTC_WEE1); |
67 | ctrl_outb(1, RTC_DAY1); ctrl_outb(0, RTC_DAY10); | 67 | __raw_writeb(1, RTC_DAY1); __raw_writeb(0, RTC_DAY10); |
68 | ctrl_outb(1, RTC_MON1); ctrl_outb(0, RTC_MON10); | 68 | __raw_writeb(1, RTC_MON1); __raw_writeb(0, RTC_MON10); |
69 | ctrl_outb(0, RTC_YEA1); ctrl_outb(0, RTC_YEA10); | 69 | __raw_writeb(0, RTC_YEA1); __raw_writeb(0, RTC_YEA10); |
70 | ctrl_outb(0, RTC_YEA100); | 70 | __raw_writeb(0, RTC_YEA100); |
71 | ctrl_outb(2, RTC_YEA1000); | 71 | __raw_writeb(2, RTC_YEA1000); |
72 | ctrl_outb(0, RTC_CTL); | 72 | __raw_writeb(0, RTC_CTL); |
73 | goto again; | 73 | goto again; |
74 | } | 74 | } |
75 | 75 | ||
@@ -93,9 +93,9 @@ static int set_rtc_mmss(unsigned long nowtime) | |||
93 | /* gets recalled with irq locally disabled */ | 93 | /* gets recalled with irq locally disabled */ |
94 | spin_lock(&sh03_rtc_lock); | 94 | spin_lock(&sh03_rtc_lock); |
95 | for (i = 0 ; i < 1000000 ; i++) /* may take up to 1 second... */ | 95 | for (i = 0 ; i < 1000000 ; i++) /* may take up to 1 second... */ |
96 | if (!(ctrl_inb(RTC_CTL) & RTC_BUSY)) | 96 | if (!(__raw_readb(RTC_CTL) & RTC_BUSY)) |
97 | break; | 97 | break; |
98 | cmos_minutes = (ctrl_inb(RTC_MIN1) & 0xf) + (ctrl_inb(RTC_MIN10) & 0xf) * 10; | 98 | cmos_minutes = (__raw_readb(RTC_MIN1) & 0xf) + (__raw_readb(RTC_MIN10) & 0xf) * 10; |
99 | real_seconds = nowtime % 60; | 99 | real_seconds = nowtime % 60; |
100 | real_minutes = nowtime / 60; | 100 | real_minutes = nowtime / 60; |
101 | if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1) | 101 | if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1) |
@@ -103,10 +103,10 @@ static int set_rtc_mmss(unsigned long nowtime) | |||
103 | real_minutes %= 60; | 103 | real_minutes %= 60; |
104 | 104 | ||
105 | if (abs(real_minutes - cmos_minutes) < 30) { | 105 | if (abs(real_minutes - cmos_minutes) < 30) { |
106 | ctrl_outb(real_seconds % 10, RTC_SEC1); | 106 | __raw_writeb(real_seconds % 10, RTC_SEC1); |
107 | ctrl_outb(real_seconds / 10, RTC_SEC10); | 107 | __raw_writeb(real_seconds / 10, RTC_SEC10); |
108 | ctrl_outb(real_minutes % 10, RTC_MIN1); | 108 | __raw_writeb(real_minutes % 10, RTC_MIN1); |
109 | ctrl_outb(real_minutes / 10, RTC_MIN10); | 109 | __raw_writeb(real_minutes / 10, RTC_MIN10); |
110 | } else { | 110 | } else { |
111 | printk(KERN_WARNING | 111 | printk(KERN_WARNING |
112 | "set_rtc_mmss: can't update from %d to %d\n", | 112 | "set_rtc_mmss: can't update from %d to %d\n", |
diff --git a/arch/sh/boards/mach-sh03/setup.c b/arch/sh/boards/mach-sh03/setup.c index 74cfb4b8b03d..af4a0c012a96 100644 --- a/arch/sh/boards/mach-sh03/setup.c +++ b/arch/sh/boards/mach-sh03/setup.c | |||
@@ -82,7 +82,7 @@ static int __init sh03_devices_setup(void) | |||
82 | /* open I/O area window */ | 82 | /* open I/O area window */ |
83 | paddrbase = virt_to_phys((void *)PA_AREA5_IO); | 83 | paddrbase = virt_to_phys((void *)PA_AREA5_IO); |
84 | prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16); | 84 | prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16); |
85 | cf_ide_base = p3_ioremap(paddrbase, PAGE_SIZE, prot.pgprot); | 85 | cf_ide_base = ioremap_prot(paddrbase, PAGE_SIZE, pgprot_val(prot)); |
86 | if (!cf_ide_base) { | 86 | if (!cf_ide_base) { |
87 | printk("allocate_cf_area : can't open CF I/O window!\n"); | 87 | printk("allocate_cf_area : can't open CF I/O window!\n"); |
88 | return -ENOMEM; | 88 | return -ENOMEM; |
diff --git a/arch/sh/boards/mach-sh7763rdp/irq.c b/arch/sh/boards/mach-sh7763rdp/irq.c index d8ebfa7d8c76..add698c8f2b4 100644 --- a/arch/sh/boards/mach-sh7763rdp/irq.c +++ b/arch/sh/boards/mach-sh7763rdp/irq.c | |||
@@ -28,18 +28,18 @@ | |||
28 | void __init init_sh7763rdp_IRQ(void) | 28 | void __init init_sh7763rdp_IRQ(void) |
29 | { | 29 | { |
30 | /* GPIO enabled */ | 30 | /* GPIO enabled */ |
31 | ctrl_outl(1 << 25, INTC_INT2MSKCR); | 31 | __raw_writel(1 << 25, INTC_INT2MSKCR); |
32 | 32 | ||
33 | /* enable GPIO interrupts */ | 33 | /* enable GPIO interrupts */ |
34 | ctrl_outl((ctrl_inl(INTC_INT2PRI7) & 0xFF00FFFF) | 0x000F0000, | 34 | __raw_writel((__raw_readl(INTC_INT2PRI7) & 0xFF00FFFF) | 0x000F0000, |
35 | INTC_INT2PRI7); | 35 | INTC_INT2PRI7); |
36 | 36 | ||
37 | /* USBH enabled */ | 37 | /* USBH enabled */ |
38 | ctrl_outl(1 << 17, INTC_INT2MSKCR1); | 38 | __raw_writel(1 << 17, INTC_INT2MSKCR1); |
39 | 39 | ||
40 | /* GETHER enabled */ | 40 | /* GETHER enabled */ |
41 | ctrl_outl(1 << 16, INTC_INT2MSKCR1); | 41 | __raw_writel(1 << 16, INTC_INT2MSKCR1); |
42 | 42 | ||
43 | /* DMAC enabled */ | 43 | /* DMAC enabled */ |
44 | ctrl_outl(1 << 8, INTC_INT2MSKCR); | 44 | __raw_writel(1 << 8, INTC_INT2MSKCR); |
45 | } | 45 | } |
diff --git a/arch/sh/boards/mach-sh7763rdp/setup.c b/arch/sh/boards/mach-sh7763rdp/setup.c index 390534a0b35c..f64a6918224c 100644 --- a/arch/sh/boards/mach-sh7763rdp/setup.c +++ b/arch/sh/boards/mach-sh7763rdp/setup.c | |||
@@ -158,50 +158,50 @@ device_initcall(sh7763rdp_devices_setup); | |||
158 | static void __init sh7763rdp_setup(char **cmdline_p) | 158 | static void __init sh7763rdp_setup(char **cmdline_p) |
159 | { | 159 | { |
160 | /* Board version check */ | 160 | /* Board version check */ |
161 | if (ctrl_inw(CPLD_BOARD_ID_ERV_REG) == 0xECB1) | 161 | if (__raw_readw(CPLD_BOARD_ID_ERV_REG) == 0xECB1) |
162 | printk(KERN_INFO "RTE Standard Configuration\n"); | 162 | printk(KERN_INFO "RTE Standard Configuration\n"); |
163 | else | 163 | else |
164 | printk(KERN_INFO "RTA Standard Configuration\n"); | 164 | printk(KERN_INFO "RTA Standard Configuration\n"); |
165 | 165 | ||
166 | /* USB pin select bits (clear bit 5-2 to 0) */ | 166 | /* USB pin select bits (clear bit 5-2 to 0) */ |
167 | ctrl_outw((ctrl_inw(PORT_PSEL2) & 0xFFC3), PORT_PSEL2); | 167 | __raw_writew((__raw_readw(PORT_PSEL2) & 0xFFC3), PORT_PSEL2); |
168 | /* USBH setup port I controls to other (clear bits 4-9 to 0) */ | 168 | /* USBH setup port I controls to other (clear bits 4-9 to 0) */ |
169 | ctrl_outw(ctrl_inw(PORT_PICR) & 0xFC0F, PORT_PICR); | 169 | __raw_writew(__raw_readw(PORT_PICR) & 0xFC0F, PORT_PICR); |
170 | 170 | ||
171 | /* Select USB Host controller */ | 171 | /* Select USB Host controller */ |
172 | ctrl_outw(0x00, USB_USBHSC); | 172 | __raw_writew(0x00, USB_USBHSC); |
173 | 173 | ||
174 | /* For LCD */ | 174 | /* For LCD */ |
175 | /* set PTJ7-1, bits 15-2 of PJCR to 0 */ | 175 | /* set PTJ7-1, bits 15-2 of PJCR to 0 */ |
176 | ctrl_outw(ctrl_inw(PORT_PJCR) & 0x0003, PORT_PJCR); | 176 | __raw_writew(__raw_readw(PORT_PJCR) & 0x0003, PORT_PJCR); |
177 | /* set PTI5, bits 11-10 of PICR to 0 */ | 177 | /* set PTI5, bits 11-10 of PICR to 0 */ |
178 | ctrl_outw(ctrl_inw(PORT_PICR) & 0xF3FF, PORT_PICR); | 178 | __raw_writew(__raw_readw(PORT_PICR) & 0xF3FF, PORT_PICR); |
179 | ctrl_outw(0, PORT_PKCR); | 179 | __raw_writew(0, PORT_PKCR); |
180 | ctrl_outw(0, PORT_PLCR); | 180 | __raw_writew(0, PORT_PLCR); |
181 | /* set PSEL2 bits 14-8, 5-4, of PSEL2 to 0 */ | 181 | /* set PSEL2 bits 14-8, 5-4, of PSEL2 to 0 */ |
182 | ctrl_outw((ctrl_inw(PORT_PSEL2) & 0x00C0), PORT_PSEL2); | 182 | __raw_writew((__raw_readw(PORT_PSEL2) & 0x00C0), PORT_PSEL2); |
183 | /* set PSEL3 bits 14-12, 6-4, 2-0 of PSEL3 to 0 */ | 183 | /* set PSEL3 bits 14-12, 6-4, 2-0 of PSEL3 to 0 */ |
184 | ctrl_outw((ctrl_inw(PORT_PSEL3) & 0x0700), PORT_PSEL3); | 184 | __raw_writew((__raw_readw(PORT_PSEL3) & 0x0700), PORT_PSEL3); |
185 | 185 | ||
186 | /* For HAC */ | 186 | /* For HAC */ |
187 | /* bit3-0 0100:HAC & SSI1 enable */ | 187 | /* bit3-0 0100:HAC & SSI1 enable */ |
188 | ctrl_outw((ctrl_inw(PORT_PSEL1) & 0xFFF0) | 0x0004, PORT_PSEL1); | 188 | __raw_writew((__raw_readw(PORT_PSEL1) & 0xFFF0) | 0x0004, PORT_PSEL1); |
189 | /* bit14 1:SSI_HAC_CLK enable */ | 189 | /* bit14 1:SSI_HAC_CLK enable */ |
190 | ctrl_outw(ctrl_inw(PORT_PSEL4) | 0x4000, PORT_PSEL4); | 190 | __raw_writew(__raw_readw(PORT_PSEL4) | 0x4000, PORT_PSEL4); |
191 | 191 | ||
192 | /* SH-Ether */ | 192 | /* SH-Ether */ |
193 | ctrl_outw((ctrl_inw(PORT_PSEL1) & ~0xff00) | 0x2400, PORT_PSEL1); | 193 | __raw_writew((__raw_readw(PORT_PSEL1) & ~0xff00) | 0x2400, PORT_PSEL1); |
194 | ctrl_outw(0x0, PORT_PFCR); | 194 | __raw_writew(0x0, PORT_PFCR); |
195 | ctrl_outw(0x0, PORT_PFCR); | 195 | __raw_writew(0x0, PORT_PFCR); |
196 | ctrl_outw(0x0, PORT_PFCR); | 196 | __raw_writew(0x0, PORT_PFCR); |
197 | 197 | ||
198 | /* MMC */ | 198 | /* MMC */ |
199 | /*selects SCIF and MMC other functions */ | 199 | /*selects SCIF and MMC other functions */ |
200 | ctrl_outw(0x0001, PORT_PSEL0); | 200 | __raw_writew(0x0001, PORT_PSEL0); |
201 | /* MMC clock operates */ | 201 | /* MMC clock operates */ |
202 | ctrl_outl(ctrl_inl(MSTPCR1) & ~0x8, MSTPCR1); | 202 | __raw_writel(__raw_readl(MSTPCR1) & ~0x8, MSTPCR1); |
203 | ctrl_outw(ctrl_inw(PORT_PACR) & ~0x3000, PORT_PACR); | 203 | __raw_writew(__raw_readw(PORT_PACR) & ~0x3000, PORT_PACR); |
204 | ctrl_outw(ctrl_inw(PORT_PCCR) & ~0xCFC3, PORT_PCCR); | 204 | __raw_writew(__raw_readw(PORT_PCCR) & ~0xCFC3, PORT_PCCR); |
205 | } | 205 | } |
206 | 206 | ||
207 | static struct sh_machine_vector mv_sh7763rdp __initmv = { | 207 | static struct sh_machine_vector mv_sh7763rdp __initmv = { |
diff --git a/arch/sh/boards/mach-snapgear/setup.c b/arch/sh/boards/mach-snapgear/setup.c index a3277a23cf14..331745dee379 100644 --- a/arch/sh/boards/mach-snapgear/setup.c +++ b/arch/sh/boards/mach-snapgear/setup.c | |||
@@ -30,7 +30,7 @@ | |||
30 | 30 | ||
31 | static irqreturn_t eraseconfig_interrupt(int irq, void *dev_id) | 31 | static irqreturn_t eraseconfig_interrupt(int irq, void *dev_id) |
32 | { | 32 | { |
33 | (void)ctrl_inb(0xb8000000); /* dummy read */ | 33 | (void)__raw_readb(0xb8000000); /* dummy read */ |
34 | 34 | ||
35 | printk("SnapGear: erase switch interrupt!\n"); | 35 | printk("SnapGear: erase switch interrupt!\n"); |
36 | 36 | ||
diff --git a/arch/sh/boards/mach-systemh/irq.c b/arch/sh/boards/mach-systemh/irq.c index 986a0e71d220..523aea5dc94e 100644 --- a/arch/sh/boards/mach-systemh/irq.c +++ b/arch/sh/boards/mach-systemh/irq.c | |||
@@ -41,13 +41,13 @@ static void disable_systemh_irq(unsigned int irq) | |||
41 | unsigned long val, mask = 0x01 << 1; | 41 | unsigned long val, mask = 0x01 << 1; |
42 | 42 | ||
43 | /* Clear the "irq"th bit in the mask and set it in the request */ | 43 | /* Clear the "irq"th bit in the mask and set it in the request */ |
44 | val = ctrl_inl((unsigned long)systemh_irq_mask_register); | 44 | val = __raw_readl((unsigned long)systemh_irq_mask_register); |
45 | val &= ~mask; | 45 | val &= ~mask; |
46 | ctrl_outl(val, (unsigned long)systemh_irq_mask_register); | 46 | __raw_writel(val, (unsigned long)systemh_irq_mask_register); |
47 | 47 | ||
48 | val = ctrl_inl((unsigned long)systemh_irq_request_register); | 48 | val = __raw_readl((unsigned long)systemh_irq_request_register); |
49 | val |= mask; | 49 | val |= mask; |
50 | ctrl_outl(val, (unsigned long)systemh_irq_request_register); | 50 | __raw_writel(val, (unsigned long)systemh_irq_request_register); |
51 | } | 51 | } |
52 | } | 52 | } |
53 | 53 | ||
@@ -57,9 +57,9 @@ static void enable_systemh_irq(unsigned int irq) | |||
57 | unsigned long val, mask = 0x01 << 1; | 57 | unsigned long val, mask = 0x01 << 1; |
58 | 58 | ||
59 | /* Set "irq"th bit in the mask register */ | 59 | /* Set "irq"th bit in the mask register */ |
60 | val = ctrl_inl((unsigned long)systemh_irq_mask_register); | 60 | val = __raw_readl((unsigned long)systemh_irq_mask_register); |
61 | val |= mask; | 61 | val |= mask; |
62 | ctrl_outl(val, (unsigned long)systemh_irq_mask_register); | 62 | __raw_writel(val, (unsigned long)systemh_irq_mask_register); |
63 | } | 63 | } |
64 | } | 64 | } |
65 | 65 | ||
diff --git a/arch/sh/boards/mach-titan/Makefile b/arch/sh/boards/mach-titan/Makefile deleted file mode 100644 index 08d753700062..000000000000 --- a/arch/sh/boards/mach-titan/Makefile +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for the Nimble Microsystems TITAN specific parts of the kernel | ||
3 | # | ||
4 | |||
5 | obj-y := setup.o io.o | ||
diff --git a/arch/sh/boards/mach-titan/io.c b/arch/sh/boards/mach-titan/io.c deleted file mode 100644 index 0130e9826aca..000000000000 --- a/arch/sh/boards/mach-titan/io.c +++ /dev/null | |||
@@ -1,108 +0,0 @@ | |||
1 | /* | ||
2 | * I/O routines for Titan | ||
3 | */ | ||
4 | #include <linux/pci.h> | ||
5 | #include <asm/machvec.h> | ||
6 | #include <asm/addrspace.h> | ||
7 | #include <mach/titan.h> | ||
8 | #include <asm/io.h> | ||
9 | |||
10 | static inline unsigned int port2adr(unsigned int port) | ||
11 | { | ||
12 | maybebadio((unsigned long)port); | ||
13 | return port; | ||
14 | } | ||
15 | |||
16 | u8 titan_inb(unsigned long port) | ||
17 | { | ||
18 | if (PXSEG(port)) | ||
19 | return ctrl_inb(port); | ||
20 | return ctrl_inw(port2adr(port)) & 0xff; | ||
21 | } | ||
22 | |||
23 | u8 titan_inb_p(unsigned long port) | ||
24 | { | ||
25 | u8 v; | ||
26 | |||
27 | if (PXSEG(port)) | ||
28 | v = ctrl_inb(port); | ||
29 | else | ||
30 | v = ctrl_inw(port2adr(port)) & 0xff; | ||
31 | ctrl_delay(); | ||
32 | return v; | ||
33 | } | ||
34 | |||
35 | u16 titan_inw(unsigned long port) | ||
36 | { | ||
37 | if (PXSEG(port)) | ||
38 | return ctrl_inw(port); | ||
39 | else if (port >= 0x2000) | ||
40 | return ctrl_inw(port2adr(port)); | ||
41 | else | ||
42 | maybebadio(port); | ||
43 | return 0; | ||
44 | } | ||
45 | |||
46 | u32 titan_inl(unsigned long port) | ||
47 | { | ||
48 | if (PXSEG(port)) | ||
49 | return ctrl_inl(port); | ||
50 | else if (port >= 0x2000) | ||
51 | return ctrl_inw(port2adr(port)); | ||
52 | else | ||
53 | maybebadio(port); | ||
54 | return 0; | ||
55 | } | ||
56 | |||
57 | void titan_outb(u8 value, unsigned long port) | ||
58 | { | ||
59 | if (PXSEG(port)) | ||
60 | ctrl_outb(value, port); | ||
61 | else | ||
62 | ctrl_outw(value, port2adr(port)); | ||
63 | } | ||
64 | |||
65 | void titan_outb_p(u8 value, unsigned long port) | ||
66 | { | ||
67 | if (PXSEG(port)) | ||
68 | ctrl_outb(value, port); | ||
69 | else | ||
70 | ctrl_outw(value, port2adr(port)); | ||
71 | ctrl_delay(); | ||
72 | } | ||
73 | |||
74 | void titan_outw(u16 value, unsigned long port) | ||
75 | { | ||
76 | if (PXSEG(port)) | ||
77 | ctrl_outw(value, port); | ||
78 | else if (port >= 0x2000) | ||
79 | ctrl_outw(value, port2adr(port)); | ||
80 | else | ||
81 | maybebadio(port); | ||
82 | } | ||
83 | |||
84 | void titan_outl(u32 value, unsigned long port) | ||
85 | { | ||
86 | if (PXSEG(port)) | ||
87 | ctrl_outl(value, port); | ||
88 | else | ||
89 | maybebadio(port); | ||
90 | } | ||
91 | |||
92 | void titan_insl(unsigned long port, void *dst, unsigned long count) | ||
93 | { | ||
94 | maybebadio(port); | ||
95 | } | ||
96 | |||
97 | void titan_outsl(unsigned long port, const void *src, unsigned long count) | ||
98 | { | ||
99 | maybebadio(port); | ||
100 | } | ||
101 | |||
102 | void __iomem *titan_ioport_map(unsigned long port, unsigned int size) | ||
103 | { | ||
104 | if (PXSEG(port)) | ||
105 | return (void __iomem *)port; | ||
106 | |||
107 | return (void __iomem *)port2adr(port); | ||
108 | } | ||
diff --git a/arch/sh/boards/mach-x3proto/ilsel.c b/arch/sh/boards/mach-x3proto/ilsel.c index b5c673c39337..5c9842704c60 100644 --- a/arch/sh/boards/mach-x3proto/ilsel.c +++ b/arch/sh/boards/mach-x3proto/ilsel.c | |||
@@ -70,10 +70,10 @@ static void __ilsel_enable(ilsel_source_t set, unsigned int bit) | |||
70 | pr_debug("%s: bit#%d: addr - 0x%08lx (shift %d, set %d)\n", | 70 | pr_debug("%s: bit#%d: addr - 0x%08lx (shift %d, set %d)\n", |
71 | __func__, bit, addr, shift, set); | 71 | __func__, bit, addr, shift, set); |
72 | 72 | ||
73 | tmp = ctrl_inw(addr); | 73 | tmp = __raw_readw(addr); |
74 | tmp &= ~(0xf << shift); | 74 | tmp &= ~(0xf << shift); |
75 | tmp |= set << shift; | 75 | tmp |= set << shift; |
76 | ctrl_outw(tmp, addr); | 76 | __raw_writew(tmp, addr); |
77 | } | 77 | } |
78 | 78 | ||
79 | /** | 79 | /** |
@@ -142,9 +142,9 @@ void ilsel_disable(unsigned int irq) | |||
142 | 142 | ||
143 | addr = mk_ilsel_addr(irq); | 143 | addr = mk_ilsel_addr(irq); |
144 | 144 | ||
145 | tmp = ctrl_inw(addr); | 145 | tmp = __raw_readw(addr); |
146 | tmp &= ~(0xf << mk_ilsel_shift(irq)); | 146 | tmp &= ~(0xf << mk_ilsel_shift(irq)); |
147 | ctrl_outw(tmp, addr); | 147 | __raw_writew(tmp, addr); |
148 | 148 | ||
149 | clear_bit(irq, &ilsel_level_map); | 149 | clear_bit(irq, &ilsel_level_map); |
150 | } | 150 | } |
diff --git a/arch/sh/boards/mach-x3proto/setup.c b/arch/sh/boards/mach-x3proto/setup.c index efe4cb9f8a77..e284592fd42a 100644 --- a/arch/sh/boards/mach-x3proto/setup.c +++ b/arch/sh/boards/mach-x3proto/setup.c | |||
@@ -149,7 +149,7 @@ static void __init x3proto_init_irq(void) | |||
149 | plat_irq_setup_pins(IRQ_MODE_IRL3210); | 149 | plat_irq_setup_pins(IRQ_MODE_IRL3210); |
150 | 150 | ||
151 | /* Set ICR0.LVLMODE */ | 151 | /* Set ICR0.LVLMODE */ |
152 | ctrl_outl(ctrl_inl(0xfe410000) | (1 << 21), 0xfe410000); | 152 | __raw_writel(__raw_readl(0xfe410000) | (1 << 21), 0xfe410000); |
153 | } | 153 | } |
154 | 154 | ||
155 | static struct sh_machine_vector mv_x3proto __initmv = { | 155 | static struct sh_machine_vector mv_x3proto __initmv = { |
diff --git a/arch/sh/boot/Makefile b/arch/sh/boot/Makefile index cb8cf5572e79..1ce63624c9b9 100644 --- a/arch/sh/boot/Makefile +++ b/arch/sh/boot/Makefile | |||
@@ -21,12 +21,15 @@ CONFIG_ZERO_PAGE_OFFSET ?= 0x00001000 | |||
21 | CONFIG_ENTRY_OFFSET ?= 0x00001000 | 21 | CONFIG_ENTRY_OFFSET ?= 0x00001000 |
22 | 22 | ||
23 | suffix-y := bin | 23 | suffix-y := bin |
24 | suffix-$(CONFIG_KERNEL_GZIP) := gz | 24 | suffix-$(CONFIG_KERNEL_GZIP) := gz |
25 | suffix-$(CONFIG_KERNEL_BZIP2) := bz2 | 25 | suffix-$(CONFIG_KERNEL_BZIP2) := bz2 |
26 | suffix-$(CONFIG_KERNEL_LZMA) := lzma | 26 | suffix-$(CONFIG_KERNEL_LZMA) := lzma |
27 | 27 | suffix-$(CONFIG_KERNEL_LZO) := lzo | |
28 | targets := zImage vmlinux.srec romImage uImage uImage.srec uImage.gz uImage.bz2 uImage.lzma uImage.bin | 28 | |
29 | extra-y += vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma | 29 | targets := zImage vmlinux.srec romImage uImage uImage.srec uImage.gz \ |
30 | uImage.bz2 uImage.lzma uImage.lzo uImage.bin | ||
31 | extra-y += vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma \ | ||
32 | vmlinux.bin.lzo | ||
30 | subdir- := compressed romimage | 33 | subdir- := compressed romimage |
31 | 34 | ||
32 | $(obj)/zImage: $(obj)/compressed/vmlinux FORCE | 35 | $(obj)/zImage: $(obj)/compressed/vmlinux FORCE |
@@ -43,15 +46,8 @@ $(obj)/romImage: $(obj)/romimage/vmlinux FORCE | |||
43 | $(obj)/romimage/vmlinux: $(obj)/zImage FORCE | 46 | $(obj)/romimage/vmlinux: $(obj)/zImage FORCE |
44 | $(Q)$(MAKE) $(build)=$(obj)/romimage $@ | 47 | $(Q)$(MAKE) $(build)=$(obj)/romimage $@ |
45 | 48 | ||
46 | KERNEL_MEMORY := 0x00000000 | 49 | KERNEL_MEMORY := $(shell /bin/bash -c 'printf "0x%08x" \ |
47 | ifeq ($(CONFIG_PMB_FIXED),y) | ||
48 | KERNEL_MEMORY := $(shell /bin/bash -c 'printf "0x%08x" \ | ||
49 | $$[$(CONFIG_MEMORY_START) & 0x1fffffff]') | 50 | $$[$(CONFIG_MEMORY_START) & 0x1fffffff]') |
50 | endif | ||
51 | ifeq ($(CONFIG_29BIT),y) | ||
52 | KERNEL_MEMORY := $(shell /bin/bash -c 'printf "0x%08x" \ | ||
53 | $$[$(CONFIG_MEMORY_START)]') | ||
54 | endif | ||
55 | 51 | ||
56 | KERNEL_LOAD := $(shell /bin/bash -c 'printf "0x%08x" \ | 52 | KERNEL_LOAD := $(shell /bin/bash -c 'printf "0x%08x" \ |
57 | $$[$(CONFIG_PAGE_OFFSET) + \ | 53 | $$[$(CONFIG_PAGE_OFFSET) + \ |
@@ -80,6 +76,9 @@ $(obj)/vmlinux.bin.bz2: $(obj)/vmlinux.bin FORCE | |||
80 | $(obj)/vmlinux.bin.lzma: $(obj)/vmlinux.bin FORCE | 76 | $(obj)/vmlinux.bin.lzma: $(obj)/vmlinux.bin FORCE |
81 | $(call if_changed,lzma) | 77 | $(call if_changed,lzma) |
82 | 78 | ||
79 | $(obj)/vmlinux.bin.lzo: $(obj)/vmlinux.bin FORCE | ||
80 | $(call if_changed,lzo) | ||
81 | |||
83 | $(obj)/uImage.bz2: $(obj)/vmlinux.bin.bz2 | 82 | $(obj)/uImage.bz2: $(obj)/vmlinux.bin.bz2 |
84 | $(call if_changed,uimage,bzip2) | 83 | $(call if_changed,uimage,bzip2) |
85 | 84 | ||
@@ -89,6 +88,9 @@ $(obj)/uImage.gz: $(obj)/vmlinux.bin.gz | |||
89 | $(obj)/uImage.lzma: $(obj)/vmlinux.bin.lzma | 88 | $(obj)/uImage.lzma: $(obj)/vmlinux.bin.lzma |
90 | $(call if_changed,uimage,lzma) | 89 | $(call if_changed,uimage,lzma) |
91 | 90 | ||
91 | $(obj)/uImage.lzo: $(obj)/vmlinux.bin.lzo | ||
92 | $(call if_changed,uimage,lzo) | ||
93 | |||
92 | $(obj)/uImage.bin: $(obj)/vmlinux.bin | 94 | $(obj)/uImage.bin: $(obj)/vmlinux.bin |
93 | $(call if_changed,uimage,none) | 95 | $(call if_changed,uimage,none) |
94 | 96 | ||
diff --git a/arch/sh/boot/compressed/Makefile b/arch/sh/boot/compressed/Makefile index 6182eca5180a..5d660b90943b 100644 --- a/arch/sh/boot/compressed/Makefile +++ b/arch/sh/boot/compressed/Makefile | |||
@@ -6,14 +6,11 @@ | |||
6 | 6 | ||
7 | targets := vmlinux vmlinux.bin vmlinux.bin.gz \ | 7 | targets := vmlinux vmlinux.bin vmlinux.bin.gz \ |
8 | vmlinux.bin.bz2 vmlinux.bin.lzma \ | 8 | vmlinux.bin.bz2 vmlinux.bin.lzma \ |
9 | vmlinux.bin.lzo \ | ||
9 | head_$(BITS).o misc.o piggy.o | 10 | head_$(BITS).o misc.o piggy.o |
10 | 11 | ||
11 | OBJECTS = $(obj)/head_$(BITS).o $(obj)/misc.o $(obj)/cache.o | 12 | OBJECTS = $(obj)/head_$(BITS).o $(obj)/misc.o $(obj)/cache.o |
12 | 13 | ||
13 | ifdef CONFIG_SH_STANDARD_BIOS | ||
14 | OBJECTS += $(obj)/../../kernel/sh_bios.o | ||
15 | endif | ||
16 | |||
17 | # | 14 | # |
18 | # IMAGE_OFFSET is the load offset of the compression loader | 15 | # IMAGE_OFFSET is the load offset of the compression loader |
19 | # | 16 | # |
@@ -47,6 +44,8 @@ $(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y) FORCE | |||
47 | $(call if_changed,bzip2) | 44 | $(call if_changed,bzip2) |
48 | $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE | 45 | $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE |
49 | $(call if_changed,lzma) | 46 | $(call if_changed,lzma) |
47 | $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE | ||
48 | $(call if_changed,lzo) | ||
50 | 49 | ||
51 | OBJCOPYFLAGS += -R .empty_zero_page | 50 | OBJCOPYFLAGS += -R .empty_zero_page |
52 | 51 | ||
diff --git a/arch/sh/boot/compressed/misc.c b/arch/sh/boot/compressed/misc.c index b51b1fc4baae..27140a6b365d 100644 --- a/arch/sh/boot/compressed/misc.c +++ b/arch/sh/boot/compressed/misc.c | |||
@@ -14,7 +14,6 @@ | |||
14 | #include <asm/uaccess.h> | 14 | #include <asm/uaccess.h> |
15 | #include <asm/addrspace.h> | 15 | #include <asm/addrspace.h> |
16 | #include <asm/page.h> | 16 | #include <asm/page.h> |
17 | #include <asm/sh_bios.h> | ||
18 | 17 | ||
19 | /* | 18 | /* |
20 | * gzip declarations | 19 | * gzip declarations |
@@ -62,29 +61,15 @@ static unsigned long free_mem_end_ptr; | |||
62 | #include "../../../../lib/decompress_unlzma.c" | 61 | #include "../../../../lib/decompress_unlzma.c" |
63 | #endif | 62 | #endif |
64 | 63 | ||
65 | #ifdef CONFIG_SH_STANDARD_BIOS | 64 | #ifdef CONFIG_KERNEL_LZO |
66 | size_t strlen(const char *s) | 65 | #include "../../../../lib/decompress_unlzo.c" |
67 | { | 66 | #endif |
68 | int i = 0; | ||
69 | |||
70 | while (*s++) | ||
71 | i++; | ||
72 | return i; | ||
73 | } | ||
74 | 67 | ||
75 | int puts(const char *s) | 68 | int puts(const char *s) |
76 | { | 69 | { |
77 | int len = strlen(s); | ||
78 | sh_bios_console_write(s, len); | ||
79 | return len; | ||
80 | } | ||
81 | #else | ||
82 | int puts(const char *s) | ||
83 | { | ||
84 | /* This should be updated to use the sh-sci routines */ | 70 | /* This should be updated to use the sh-sci routines */ |
85 | return 0; | 71 | return 0; |
86 | } | 72 | } |
87 | #endif | ||
88 | 73 | ||
89 | void* memset(void* s, int c, size_t n) | 74 | void* memset(void* s, int c, size_t n) |
90 | { | 75 | { |
@@ -132,7 +117,7 @@ void decompress_kernel(void) | |||
132 | output_addr = (CONFIG_MEMORY_START + 0x2000); | 117 | output_addr = (CONFIG_MEMORY_START + 0x2000); |
133 | #else | 118 | #else |
134 | output_addr = __pa((unsigned long)&_text+PAGE_SIZE); | 119 | output_addr = __pa((unsigned long)&_text+PAGE_SIZE); |
135 | #ifdef CONFIG_29BIT | 120 | #if defined(CONFIG_29BIT) |
136 | output_addr |= P2SEG; | 121 | output_addr |= P2SEG; |
137 | #endif | 122 | #endif |
138 | #endif | 123 | #endif |
diff --git a/arch/sh/cchips/hd6446x/hd64461.c b/arch/sh/cchips/hd6446x/hd64461.c index 50aa0c1f76ea..bcb31ae84a51 100644 --- a/arch/sh/cchips/hd6446x/hd64461.c +++ b/arch/sh/cchips/hd6446x/hd64461.c | |||
@@ -55,25 +55,22 @@ static struct irq_chip hd64461_irq_chip = { | |||
55 | 55 | ||
56 | static void hd64461_irq_demux(unsigned int irq, struct irq_desc *desc) | 56 | static void hd64461_irq_demux(unsigned int irq, struct irq_desc *desc) |
57 | { | 57 | { |
58 | unsigned short intv = ctrl_inw(HD64461_NIRR); | 58 | unsigned short intv = __raw_readw(HD64461_NIRR); |
59 | struct irq_desc *ext_desc; | ||
60 | unsigned int ext_irq = HD64461_IRQBASE; | 59 | unsigned int ext_irq = HD64461_IRQBASE; |
61 | 60 | ||
62 | intv &= (1 << HD64461_IRQ_NUM) - 1; | 61 | intv &= (1 << HD64461_IRQ_NUM) - 1; |
63 | 62 | ||
64 | while (intv) { | 63 | for (; intv; intv >>= 1, ext_irq++) { |
65 | if (intv & 1) { | 64 | if (!(intv & 1)) |
66 | ext_desc = irq_desc + ext_irq; | 65 | continue; |
67 | handle_level_irq(ext_irq, ext_desc); | 66 | |
68 | } | 67 | generic_handle_irq(ext_irq); |
69 | intv >>= 1; | ||
70 | ext_irq++; | ||
71 | } | 68 | } |
72 | } | 69 | } |
73 | 70 | ||
74 | int __init setup_hd64461(void) | 71 | int __init setup_hd64461(void) |
75 | { | 72 | { |
76 | int i; | 73 | int i, nid = cpu_to_node(boot_cpu_data); |
77 | 74 | ||
78 | if (!MACH_HD64461) | 75 | if (!MACH_HD64461) |
79 | return 0; | 76 | return 0; |
@@ -90,9 +87,26 @@ int __init setup_hd64461(void) | |||
90 | __raw_writew(0xffff, HD64461_NIMR); | 87 | __raw_writew(0xffff, HD64461_NIMR); |
91 | 88 | ||
92 | /* IRQ 80 -> 95 belongs to HD64461 */ | 89 | /* IRQ 80 -> 95 belongs to HD64461 */ |
93 | for (i = HD64461_IRQBASE; i < HD64461_IRQBASE + 16; i++) | 90 | for (i = HD64461_IRQBASE; i < HD64461_IRQBASE + 16; i++) { |
91 | unsigned int irq; | ||
92 | |||
93 | irq = create_irq_nr(i, nid); | ||
94 | if (unlikely(irq == 0)) { | ||
95 | pr_err("%s: failed hooking irq %d for HD64461\n", | ||
96 | __func__, i); | ||
97 | return -EBUSY; | ||
98 | } | ||
99 | |||
100 | if (unlikely(irq != i)) { | ||
101 | pr_err("%s: got irq %d but wanted %d, bailing.\n", | ||
102 | __func__, irq, i); | ||
103 | destroy_irq(irq); | ||
104 | return -EINVAL; | ||
105 | } | ||
106 | |||
94 | set_irq_chip_and_handler(i, &hd64461_irq_chip, | 107 | set_irq_chip_and_handler(i, &hd64461_irq_chip, |
95 | handle_level_irq); | 108 | handle_level_irq); |
109 | } | ||
96 | 110 | ||
97 | set_irq_chained_handler(CONFIG_HD64461_IRQ, hd64461_irq_demux); | 111 | set_irq_chained_handler(CONFIG_HD64461_IRQ, hd64461_irq_demux); |
98 | set_irq_type(CONFIG_HD64461_IRQ, IRQ_TYPE_LEVEL_LOW); | 112 | set_irq_type(CONFIG_HD64461_IRQ, IRQ_TYPE_LEVEL_LOW); |
diff --git a/arch/sh/configs/sdk7786_defconfig b/arch/sh/configs/sdk7786_defconfig new file mode 100644 index 000000000000..9b331eab968e --- /dev/null +++ b/arch/sh/configs/sdk7786_defconfig | |||
@@ -0,0 +1,1754 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.33-rc7 | ||
4 | # Tue Feb 9 15:27:06 2010 | ||
5 | # | ||
6 | CONFIG_SUPERH=y | ||
7 | CONFIG_SUPERH32=y | ||
8 | # CONFIG_SUPERH64 is not set | ||
9 | CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig" | ||
10 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
11 | CONFIG_GENERIC_BUG=y | ||
12 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
13 | CONFIG_GENERIC_HWEIGHT=y | ||
14 | CONFIG_GENERIC_HARDIRQS=y | ||
15 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
16 | CONFIG_IRQ_PER_CPU=y | ||
17 | CONFIG_SPARSE_IRQ=y | ||
18 | # CONFIG_GENERIC_GPIO is not set | ||
19 | CONFIG_GENERIC_TIME=y | ||
20 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
21 | # CONFIG_ARCH_SUSPEND_POSSIBLE is not set | ||
22 | CONFIG_ARCH_HIBERNATION_POSSIBLE=y | ||
23 | CONFIG_SYS_SUPPORTS_HUGETLBFS=y | ||
24 | CONFIG_SYS_SUPPORTS_SMP=y | ||
25 | CONFIG_SYS_SUPPORTS_NUMA=y | ||
26 | CONFIG_SYS_SUPPORTS_PCI=y | ||
27 | CONFIG_SYS_SUPPORTS_TMU=y | ||
28 | CONFIG_STACKTRACE_SUPPORT=y | ||
29 | CONFIG_LOCKDEP_SUPPORT=y | ||
30 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
31 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
32 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
33 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | ||
34 | CONFIG_ARCH_HAS_DEFAULT_IDLE=y | ||
35 | CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y | ||
36 | CONFIG_DMA_COHERENT=y | ||
37 | # CONFIG_DMA_NONCOHERENT is not set | ||
38 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
39 | CONFIG_CONSTRUCTORS=y | ||
40 | |||
41 | # | ||
42 | # General setup | ||
43 | # | ||
44 | CONFIG_EXPERIMENTAL=y | ||
45 | CONFIG_BROKEN_ON_SMP=y | ||
46 | CONFIG_LOCK_KERNEL=y | ||
47 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
48 | CONFIG_LOCALVERSION="" | ||
49 | CONFIG_LOCALVERSION_AUTO=y | ||
50 | CONFIG_HAVE_KERNEL_GZIP=y | ||
51 | CONFIG_HAVE_KERNEL_BZIP2=y | ||
52 | CONFIG_HAVE_KERNEL_LZMA=y | ||
53 | CONFIG_HAVE_KERNEL_LZO=y | ||
54 | CONFIG_KERNEL_GZIP=y | ||
55 | # CONFIG_KERNEL_BZIP2 is not set | ||
56 | # CONFIG_KERNEL_LZMA is not set | ||
57 | # CONFIG_KERNEL_LZO is not set | ||
58 | CONFIG_SWAP=y | ||
59 | CONFIG_SYSVIPC=y | ||
60 | CONFIG_SYSVIPC_SYSCTL=y | ||
61 | CONFIG_POSIX_MQUEUE=y | ||
62 | CONFIG_POSIX_MQUEUE_SYSCTL=y | ||
63 | CONFIG_BSD_PROCESS_ACCT=y | ||
64 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
65 | # CONFIG_TASKSTATS is not set | ||
66 | # CONFIG_AUDIT is not set | ||
67 | |||
68 | # | ||
69 | # RCU Subsystem | ||
70 | # | ||
71 | CONFIG_TREE_RCU=y | ||
72 | # CONFIG_TREE_PREEMPT_RCU is not set | ||
73 | # CONFIG_TINY_RCU is not set | ||
74 | CONFIG_RCU_TRACE=y | ||
75 | CONFIG_RCU_FANOUT=32 | ||
76 | # CONFIG_RCU_FANOUT_EXACT is not set | ||
77 | CONFIG_TREE_RCU_TRACE=y | ||
78 | CONFIG_IKCONFIG=y | ||
79 | CONFIG_IKCONFIG_PROC=y | ||
80 | CONFIG_LOG_BUF_SHIFT=14 | ||
81 | CONFIG_GROUP_SCHED=y | ||
82 | CONFIG_FAIR_GROUP_SCHED=y | ||
83 | CONFIG_RT_GROUP_SCHED=y | ||
84 | CONFIG_USER_SCHED=y | ||
85 | # CONFIG_CGROUP_SCHED is not set | ||
86 | CONFIG_CGROUPS=y | ||
87 | # CONFIG_CGROUP_DEBUG is not set | ||
88 | CONFIG_CGROUP_NS=y | ||
89 | CONFIG_CGROUP_FREEZER=y | ||
90 | CONFIG_CGROUP_DEVICE=y | ||
91 | # CONFIG_CPUSETS is not set | ||
92 | CONFIG_CGROUP_CPUACCT=y | ||
93 | CONFIG_RESOURCE_COUNTERS=y | ||
94 | CONFIG_CGROUP_MEM_RES_CTLR=y | ||
95 | # CONFIG_CGROUP_MEM_RES_CTLR_SWAP is not set | ||
96 | CONFIG_MM_OWNER=y | ||
97 | # CONFIG_SYSFS_DEPRECATED_V2 is not set | ||
98 | # CONFIG_RELAY is not set | ||
99 | CONFIG_NAMESPACES=y | ||
100 | CONFIG_UTS_NS=y | ||
101 | CONFIG_IPC_NS=y | ||
102 | CONFIG_USER_NS=y | ||
103 | CONFIG_PID_NS=y | ||
104 | CONFIG_NET_NS=y | ||
105 | # CONFIG_BLK_DEV_INITRD is not set | ||
106 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
107 | CONFIG_SYSCTL=y | ||
108 | CONFIG_ANON_INODES=y | ||
109 | CONFIG_EMBEDDED=y | ||
110 | CONFIG_UID16=y | ||
111 | CONFIG_SYSCTL_SYSCALL=y | ||
112 | CONFIG_KALLSYMS=y | ||
113 | CONFIG_KALLSYMS_ALL=y | ||
114 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
115 | CONFIG_HOTPLUG=y | ||
116 | CONFIG_PRINTK=y | ||
117 | CONFIG_BUG=y | ||
118 | CONFIG_ELF_CORE=y | ||
119 | CONFIG_BASE_FULL=y | ||
120 | CONFIG_FUTEX=y | ||
121 | CONFIG_EPOLL=y | ||
122 | CONFIG_SIGNALFD=y | ||
123 | CONFIG_TIMERFD=y | ||
124 | CONFIG_EVENTFD=y | ||
125 | CONFIG_SHMEM=y | ||
126 | CONFIG_AIO=y | ||
127 | CONFIG_HAVE_PERF_EVENTS=y | ||
128 | CONFIG_PERF_USE_VMALLOC=y | ||
129 | |||
130 | # | ||
131 | # Kernel Performance Events And Counters | ||
132 | # | ||
133 | CONFIG_PERF_EVENTS=y | ||
134 | CONFIG_EVENT_PROFILE=y | ||
135 | # CONFIG_PERF_COUNTERS is not set | ||
136 | # CONFIG_DEBUG_PERF_USE_VMALLOC is not set | ||
137 | CONFIG_VM_EVENT_COUNTERS=y | ||
138 | CONFIG_PCI_QUIRKS=y | ||
139 | # CONFIG_COMPAT_BRK is not set | ||
140 | CONFIG_SLAB=y | ||
141 | # CONFIG_SLUB is not set | ||
142 | # CONFIG_SLOB is not set | ||
143 | CONFIG_PROFILING=y | ||
144 | CONFIG_TRACEPOINTS=y | ||
145 | # CONFIG_OPROFILE is not set | ||
146 | CONFIG_HAVE_OPROFILE=y | ||
147 | # CONFIG_KPROBES is not set | ||
148 | CONFIG_HAVE_KPROBES=y | ||
149 | CONFIG_HAVE_KRETPROBES=y | ||
150 | CONFIG_HAVE_ARCH_TRACEHOOK=y | ||
151 | CONFIG_HAVE_DMA_ATTRS=y | ||
152 | CONFIG_HAVE_CLK=y | ||
153 | CONFIG_HAVE_DMA_API_DEBUG=y | ||
154 | CONFIG_HAVE_HW_BREAKPOINT=y | ||
155 | |||
156 | # | ||
157 | # GCOV-based kernel profiling | ||
158 | # | ||
159 | # CONFIG_GCOV_KERNEL is not set | ||
160 | # CONFIG_SLOW_WORK is not set | ||
161 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||
162 | CONFIG_SLABINFO=y | ||
163 | CONFIG_RT_MUTEXES=y | ||
164 | CONFIG_BASE_SMALL=0 | ||
165 | CONFIG_MODULES=y | ||
166 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
167 | CONFIG_MODULE_UNLOAD=y | ||
168 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
169 | # CONFIG_MODVERSIONS is not set | ||
170 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
171 | CONFIG_BLOCK=y | ||
172 | # CONFIG_LBDAF is not set | ||
173 | # CONFIG_BLK_DEV_BSG is not set | ||
174 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
175 | CONFIG_BLK_CGROUP=y | ||
176 | # CONFIG_DEBUG_BLK_CGROUP is not set | ||
177 | |||
178 | # | ||
179 | # IO Schedulers | ||
180 | # | ||
181 | CONFIG_IOSCHED_NOOP=y | ||
182 | CONFIG_IOSCHED_DEADLINE=y | ||
183 | CONFIG_IOSCHED_CFQ=y | ||
184 | CONFIG_CFQ_GROUP_IOSCHED=y | ||
185 | # CONFIG_DEBUG_CFQ_IOSCHED is not set | ||
186 | # CONFIG_DEFAULT_DEADLINE is not set | ||
187 | CONFIG_DEFAULT_CFQ=y | ||
188 | # CONFIG_DEFAULT_NOOP is not set | ||
189 | CONFIG_DEFAULT_IOSCHED="cfq" | ||
190 | # CONFIG_INLINE_SPIN_TRYLOCK is not set | ||
191 | # CONFIG_INLINE_SPIN_TRYLOCK_BH is not set | ||
192 | # CONFIG_INLINE_SPIN_LOCK is not set | ||
193 | # CONFIG_INLINE_SPIN_LOCK_BH is not set | ||
194 | # CONFIG_INLINE_SPIN_LOCK_IRQ is not set | ||
195 | # CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set | ||
196 | # CONFIG_INLINE_SPIN_UNLOCK is not set | ||
197 | # CONFIG_INLINE_SPIN_UNLOCK_BH is not set | ||
198 | # CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set | ||
199 | # CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set | ||
200 | # CONFIG_INLINE_READ_TRYLOCK is not set | ||
201 | # CONFIG_INLINE_READ_LOCK is not set | ||
202 | # CONFIG_INLINE_READ_LOCK_BH is not set | ||
203 | # CONFIG_INLINE_READ_LOCK_IRQ is not set | ||
204 | # CONFIG_INLINE_READ_LOCK_IRQSAVE is not set | ||
205 | # CONFIG_INLINE_READ_UNLOCK is not set | ||
206 | # CONFIG_INLINE_READ_UNLOCK_BH is not set | ||
207 | # CONFIG_INLINE_READ_UNLOCK_IRQ is not set | ||
208 | # CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set | ||
209 | # CONFIG_INLINE_WRITE_TRYLOCK is not set | ||
210 | # CONFIG_INLINE_WRITE_LOCK is not set | ||
211 | # CONFIG_INLINE_WRITE_LOCK_BH is not set | ||
212 | # CONFIG_INLINE_WRITE_LOCK_IRQ is not set | ||
213 | # CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set | ||
214 | # CONFIG_INLINE_WRITE_UNLOCK is not set | ||
215 | # CONFIG_INLINE_WRITE_UNLOCK_BH is not set | ||
216 | # CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set | ||
217 | # CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set | ||
218 | # CONFIG_MUTEX_SPIN_ON_OWNER is not set | ||
219 | CONFIG_FREEZER=y | ||
220 | |||
221 | # | ||
222 | # System type | ||
223 | # | ||
224 | CONFIG_CPU_SH4=y | ||
225 | CONFIG_CPU_SH4A=y | ||
226 | CONFIG_CPU_SHX3=y | ||
227 | # CONFIG_CPU_SUBTYPE_SH7619 is not set | ||
228 | # CONFIG_CPU_SUBTYPE_SH7201 is not set | ||
229 | # CONFIG_CPU_SUBTYPE_SH7203 is not set | ||
230 | # CONFIG_CPU_SUBTYPE_SH7206 is not set | ||
231 | # CONFIG_CPU_SUBTYPE_SH7263 is not set | ||
232 | # CONFIG_CPU_SUBTYPE_MXG is not set | ||
233 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | ||
234 | # CONFIG_CPU_SUBTYPE_SH7706 is not set | ||
235 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | ||
236 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | ||
237 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | ||
238 | # CONFIG_CPU_SUBTYPE_SH7710 is not set | ||
239 | # CONFIG_CPU_SUBTYPE_SH7712 is not set | ||
240 | # CONFIG_CPU_SUBTYPE_SH7720 is not set | ||
241 | # CONFIG_CPU_SUBTYPE_SH7721 is not set | ||
242 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | ||
243 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | ||
244 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | ||
245 | # CONFIG_CPU_SUBTYPE_SH7750S is not set | ||
246 | # CONFIG_CPU_SUBTYPE_SH7751 is not set | ||
247 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | ||
248 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | ||
249 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | ||
250 | # CONFIG_CPU_SUBTYPE_SH7723 is not set | ||
251 | # CONFIG_CPU_SUBTYPE_SH7724 is not set | ||
252 | # CONFIG_CPU_SUBTYPE_SH7757 is not set | ||
253 | # CONFIG_CPU_SUBTYPE_SH7763 is not set | ||
254 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | ||
255 | # CONFIG_CPU_SUBTYPE_SH7780 is not set | ||
256 | # CONFIG_CPU_SUBTYPE_SH7785 is not set | ||
257 | CONFIG_CPU_SUBTYPE_SH7786=y | ||
258 | # CONFIG_CPU_SUBTYPE_SHX3 is not set | ||
259 | # CONFIG_CPU_SUBTYPE_SH7343 is not set | ||
260 | # CONFIG_CPU_SUBTYPE_SH7722 is not set | ||
261 | # CONFIG_CPU_SUBTYPE_SH7366 is not set | ||
262 | |||
263 | # | ||
264 | # Memory management options | ||
265 | # | ||
266 | CONFIG_QUICKLIST=y | ||
267 | CONFIG_MMU=y | ||
268 | CONFIG_PAGE_OFFSET=0x80000000 | ||
269 | CONFIG_FORCE_MAX_ZONEORDER=11 | ||
270 | CONFIG_MEMORY_START=0x60000000 | ||
271 | CONFIG_MEMORY_SIZE=0x20000000 | ||
272 | # CONFIG_29BIT is not set | ||
273 | CONFIG_32BIT=y | ||
274 | CONFIG_PMB=y | ||
275 | # CONFIG_PMB_LEGACY is not set | ||
276 | CONFIG_X2TLB=y | ||
277 | CONFIG_VSYSCALL=y | ||
278 | # CONFIG_NUMA is not set | ||
279 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
280 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
281 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y | ||
282 | CONFIG_MAX_ACTIVE_REGIONS=1 | ||
283 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
284 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||
285 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
286 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||
287 | CONFIG_ARCH_MEMORY_PROBE=y | ||
288 | CONFIG_IOREMAP_FIXED=y | ||
289 | CONFIG_PAGE_SIZE_4KB=y | ||
290 | # CONFIG_PAGE_SIZE_8KB is not set | ||
291 | # CONFIG_PAGE_SIZE_16KB is not set | ||
292 | # CONFIG_PAGE_SIZE_64KB is not set | ||
293 | # CONFIG_HUGETLB_PAGE_SIZE_64K is not set | ||
294 | # CONFIG_HUGETLB_PAGE_SIZE_256K is not set | ||
295 | CONFIG_HUGETLB_PAGE_SIZE_1MB=y | ||
296 | # CONFIG_HUGETLB_PAGE_SIZE_4MB is not set | ||
297 | # CONFIG_HUGETLB_PAGE_SIZE_64MB is not set | ||
298 | # CONFIG_HUGETLB_PAGE_SIZE_512MB is not set | ||
299 | CONFIG_SELECT_MEMORY_MODEL=y | ||
300 | # CONFIG_FLATMEM_MANUAL is not set | ||
301 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
302 | CONFIG_SPARSEMEM_MANUAL=y | ||
303 | CONFIG_SPARSEMEM=y | ||
304 | CONFIG_HAVE_MEMORY_PRESENT=y | ||
305 | CONFIG_SPARSEMEM_STATIC=y | ||
306 | CONFIG_MEMORY_HOTPLUG=y | ||
307 | CONFIG_MEMORY_HOTPLUG_SPARSE=y | ||
308 | CONFIG_MEMORY_HOTREMOVE=y | ||
309 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
310 | CONFIG_MIGRATION=y | ||
311 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
312 | CONFIG_ZONE_DMA_FLAG=0 | ||
313 | CONFIG_NR_QUICK=1 | ||
314 | CONFIG_KSM=y | ||
315 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | ||
316 | |||
317 | # | ||
318 | # Cache configuration | ||
319 | # | ||
320 | CONFIG_CACHE_WRITEBACK=y | ||
321 | # CONFIG_CACHE_WRITETHROUGH is not set | ||
322 | # CONFIG_CACHE_OFF is not set | ||
323 | |||
324 | # | ||
325 | # Processor features | ||
326 | # | ||
327 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
328 | # CONFIG_CPU_BIG_ENDIAN is not set | ||
329 | CONFIG_SH_FPU=y | ||
330 | CONFIG_SH_STORE_QUEUES=y | ||
331 | CONFIG_CPU_HAS_INTEVT=y | ||
332 | CONFIG_CPU_HAS_SR_RB=y | ||
333 | CONFIG_CPU_HAS_PTEAEX=y | ||
334 | CONFIG_CPU_HAS_FPU=y | ||
335 | |||
336 | # | ||
337 | # Board support | ||
338 | # | ||
339 | CONFIG_SH_SDK7786=y | ||
340 | # CONFIG_SH_URQUELL is not set | ||
341 | |||
342 | # | ||
343 | # Timer and clock configuration | ||
344 | # | ||
345 | CONFIG_SH_TIMER_TMU=y | ||
346 | CONFIG_SH_CLK_CPG=y | ||
347 | CONFIG_TICK_ONESHOT=y | ||
348 | CONFIG_NO_HZ=y | ||
349 | CONFIG_HIGH_RES_TIMERS=y | ||
350 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
351 | |||
352 | # | ||
353 | # CPU Frequency scaling | ||
354 | # | ||
355 | CONFIG_CPU_FREQ=y | ||
356 | CONFIG_CPU_FREQ_TABLE=y | ||
357 | # CONFIG_CPU_FREQ_DEBUG is not set | ||
358 | CONFIG_CPU_FREQ_STAT=y | ||
359 | # CONFIG_CPU_FREQ_STAT_DETAILS is not set | ||
360 | CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y | ||
361 | # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set | ||
362 | # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set | ||
363 | # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set | ||
364 | # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set | ||
365 | CONFIG_CPU_FREQ_GOV_PERFORMANCE=y | ||
366 | CONFIG_CPU_FREQ_GOV_POWERSAVE=m | ||
367 | CONFIG_CPU_FREQ_GOV_USERSPACE=m | ||
368 | CONFIG_CPU_FREQ_GOV_ONDEMAND=m | ||
369 | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m | ||
370 | CONFIG_SH_CPU_FREQ=y | ||
371 | |||
372 | # | ||
373 | # DMA support | ||
374 | # | ||
375 | # CONFIG_SH_DMA is not set | ||
376 | |||
377 | # | ||
378 | # Companion Chips | ||
379 | # | ||
380 | |||
381 | # | ||
382 | # Additional SuperH Device Drivers | ||
383 | # | ||
384 | CONFIG_HEARTBEAT=y | ||
385 | # CONFIG_PUSH_SWITCH is not set | ||
386 | |||
387 | # | ||
388 | # Kernel features | ||
389 | # | ||
390 | # CONFIG_HZ_100 is not set | ||
391 | CONFIG_HZ_250=y | ||
392 | # CONFIG_HZ_300 is not set | ||
393 | # CONFIG_HZ_1000 is not set | ||
394 | CONFIG_HZ=250 | ||
395 | CONFIG_SCHED_HRTICK=y | ||
396 | CONFIG_KEXEC=y | ||
397 | # CONFIG_CRASH_DUMP is not set | ||
398 | CONFIG_SECCOMP=y | ||
399 | # CONFIG_SMP is not set | ||
400 | # CONFIG_PREEMPT_NONE is not set | ||
401 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
402 | CONFIG_PREEMPT=y | ||
403 | CONFIG_GUSA=y | ||
404 | |||
405 | # | ||
406 | # Boot options | ||
407 | # | ||
408 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | ||
409 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | ||
410 | CONFIG_ENTRY_OFFSET=0x00001000 | ||
411 | CONFIG_CMDLINE_OVERWRITE=y | ||
412 | # CONFIG_CMDLINE_EXTEND is not set | ||
413 | CONFIG_CMDLINE="console=ttySC1,115200 earlyprintk=sh-sci.1,115200 root=/dev/sda1 nmi_debug=state,debounce rootdelay=10" | ||
414 | |||
415 | # | ||
416 | # Bus options | ||
417 | # | ||
418 | CONFIG_PCI=y | ||
419 | CONFIG_PCI_DOMAINS=y | ||
420 | CONFIG_PCIEPORTBUS=y | ||
421 | CONFIG_PCIEAER=y | ||
422 | # CONFIG_PCIE_ECRC is not set | ||
423 | CONFIG_PCIEAER_INJECT=y | ||
424 | CONFIG_PCIEASPM=y | ||
425 | CONFIG_PCIEASPM_DEBUG=y | ||
426 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
427 | # CONFIG_PCI_LEGACY is not set | ||
428 | CONFIG_PCI_DEBUG=y | ||
429 | # CONFIG_PCI_STUB is not set | ||
430 | # CONFIG_PCI_IOV is not set | ||
431 | # CONFIG_PCCARD is not set | ||
432 | # CONFIG_HOTPLUG_PCI is not set | ||
433 | |||
434 | # | ||
435 | # Executable file formats | ||
436 | # | ||
437 | CONFIG_BINFMT_ELF=y | ||
438 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
439 | # CONFIG_HAVE_AOUT is not set | ||
440 | CONFIG_BINFMT_MISC=y | ||
441 | |||
442 | # | ||
443 | # Power management options (EXPERIMENTAL) | ||
444 | # | ||
445 | CONFIG_PM=y | ||
446 | CONFIG_PM_DEBUG=y | ||
447 | CONFIG_PM_VERBOSE=y | ||
448 | # CONFIG_HIBERNATION is not set | ||
449 | CONFIG_PM_RUNTIME=y | ||
450 | CONFIG_CPU_IDLE=y | ||
451 | CONFIG_CPU_IDLE_GOV_LADDER=y | ||
452 | CONFIG_CPU_IDLE_GOV_MENU=y | ||
453 | CONFIG_NET=y | ||
454 | |||
455 | # | ||
456 | # Networking options | ||
457 | # | ||
458 | CONFIG_PACKET=y | ||
459 | CONFIG_PACKET_MMAP=y | ||
460 | CONFIG_UNIX=y | ||
461 | CONFIG_XFRM=y | ||
462 | # CONFIG_XFRM_USER is not set | ||
463 | # CONFIG_XFRM_SUB_POLICY is not set | ||
464 | # CONFIG_XFRM_MIGRATE is not set | ||
465 | # CONFIG_XFRM_STATISTICS is not set | ||
466 | CONFIG_NET_KEY=y | ||
467 | # CONFIG_NET_KEY_MIGRATE is not set | ||
468 | CONFIG_INET=y | ||
469 | # CONFIG_IP_MULTICAST is not set | ||
470 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
471 | CONFIG_IP_FIB_HASH=y | ||
472 | CONFIG_IP_PNP=y | ||
473 | CONFIG_IP_PNP_DHCP=y | ||
474 | # CONFIG_IP_PNP_BOOTP is not set | ||
475 | # CONFIG_IP_PNP_RARP is not set | ||
476 | # CONFIG_NET_IPIP is not set | ||
477 | # CONFIG_NET_IPGRE is not set | ||
478 | # CONFIG_ARPD is not set | ||
479 | # CONFIG_SYN_COOKIES is not set | ||
480 | # CONFIG_INET_AH is not set | ||
481 | # CONFIG_INET_ESP is not set | ||
482 | # CONFIG_INET_IPCOMP is not set | ||
483 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
484 | # CONFIG_INET_TUNNEL is not set | ||
485 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
486 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
487 | CONFIG_INET_XFRM_MODE_BEET=y | ||
488 | # CONFIG_INET_LRO is not set | ||
489 | CONFIG_INET_DIAG=y | ||
490 | CONFIG_INET_TCP_DIAG=y | ||
491 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
492 | CONFIG_TCP_CONG_CUBIC=y | ||
493 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
494 | # CONFIG_TCP_MD5SIG is not set | ||
495 | # CONFIG_IPV6 is not set | ||
496 | # CONFIG_NETWORK_SECMARK is not set | ||
497 | # CONFIG_NETFILTER is not set | ||
498 | # CONFIG_IP_DCCP is not set | ||
499 | # CONFIG_IP_SCTP is not set | ||
500 | # CONFIG_RDS is not set | ||
501 | # CONFIG_TIPC is not set | ||
502 | # CONFIG_ATM is not set | ||
503 | # CONFIG_BRIDGE is not set | ||
504 | # CONFIG_NET_DSA is not set | ||
505 | # CONFIG_VLAN_8021Q is not set | ||
506 | # CONFIG_DECNET is not set | ||
507 | # CONFIG_LLC2 is not set | ||
508 | # CONFIG_IPX is not set | ||
509 | # CONFIG_ATALK is not set | ||
510 | # CONFIG_X25 is not set | ||
511 | # CONFIG_LAPB is not set | ||
512 | # CONFIG_ECONET is not set | ||
513 | # CONFIG_WAN_ROUTER is not set | ||
514 | # CONFIG_PHONET is not set | ||
515 | # CONFIG_IEEE802154 is not set | ||
516 | # CONFIG_NET_SCHED is not set | ||
517 | # CONFIG_DCB is not set | ||
518 | |||
519 | # | ||
520 | # Network testing | ||
521 | # | ||
522 | # CONFIG_NET_PKTGEN is not set | ||
523 | # CONFIG_NET_DROP_MONITOR is not set | ||
524 | # CONFIG_HAMRADIO is not set | ||
525 | # CONFIG_CAN is not set | ||
526 | # CONFIG_IRDA is not set | ||
527 | # CONFIG_BT is not set | ||
528 | # CONFIG_AF_RXRPC is not set | ||
529 | CONFIG_WIRELESS=y | ||
530 | # CONFIG_CFG80211 is not set | ||
531 | # CONFIG_LIB80211 is not set | ||
532 | |||
533 | # | ||
534 | # CFG80211 needs to be enabled for MAC80211 | ||
535 | # | ||
536 | # CONFIG_WIMAX is not set | ||
537 | # CONFIG_RFKILL is not set | ||
538 | # CONFIG_NET_9P is not set | ||
539 | |||
540 | # | ||
541 | # Device Drivers | ||
542 | # | ||
543 | |||
544 | # | ||
545 | # Generic Driver Options | ||
546 | # | ||
547 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
548 | # CONFIG_DEVTMPFS is not set | ||
549 | CONFIG_STANDALONE=y | ||
550 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
551 | # CONFIG_FW_LOADER is not set | ||
552 | # CONFIG_DEBUG_DRIVER is not set | ||
553 | # CONFIG_DEBUG_DEVRES is not set | ||
554 | # CONFIG_SYS_HYPERVISOR is not set | ||
555 | # CONFIG_CONNECTOR is not set | ||
556 | # CONFIG_MTD is not set | ||
557 | # CONFIG_PARPORT is not set | ||
558 | CONFIG_BLK_DEV=y | ||
559 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
560 | # CONFIG_BLK_DEV_DAC960 is not set | ||
561 | # CONFIG_BLK_DEV_UMEM is not set | ||
562 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
563 | # CONFIG_BLK_DEV_LOOP is not set | ||
564 | |||
565 | # | ||
566 | # DRBD disabled because PROC_FS, INET or CONNECTOR not selected | ||
567 | # | ||
568 | # CONFIG_BLK_DEV_NBD is not set | ||
569 | # CONFIG_BLK_DEV_SX8 is not set | ||
570 | # CONFIG_BLK_DEV_UB is not set | ||
571 | CONFIG_BLK_DEV_RAM=y | ||
572 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
573 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
574 | # CONFIG_BLK_DEV_XIP is not set | ||
575 | # CONFIG_CDROM_PKTCDVD is not set | ||
576 | # CONFIG_ATA_OVER_ETH is not set | ||
577 | # CONFIG_BLK_DEV_HD is not set | ||
578 | CONFIG_MISC_DEVICES=y | ||
579 | # CONFIG_AD525X_DPOT is not set | ||
580 | # CONFIG_PHANTOM is not set | ||
581 | # CONFIG_SGI_IOC4 is not set | ||
582 | # CONFIG_TIFM_CORE is not set | ||
583 | # CONFIG_ICS932S401 is not set | ||
584 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
585 | # CONFIG_HP_ILO is not set | ||
586 | # CONFIG_ISL29003 is not set | ||
587 | # CONFIG_DS1682 is not set | ||
588 | # CONFIG_TI_DAC7512 is not set | ||
589 | # CONFIG_C2PORT is not set | ||
590 | |||
591 | # | ||
592 | # EEPROM support | ||
593 | # | ||
594 | # CONFIG_EEPROM_AT24 is not set | ||
595 | # CONFIG_EEPROM_AT25 is not set | ||
596 | # CONFIG_EEPROM_LEGACY is not set | ||
597 | # CONFIG_EEPROM_MAX6875 is not set | ||
598 | # CONFIG_EEPROM_93CX6 is not set | ||
599 | # CONFIG_CB710_CORE is not set | ||
600 | CONFIG_HAVE_IDE=y | ||
601 | # CONFIG_IDE is not set | ||
602 | |||
603 | # | ||
604 | # SCSI device support | ||
605 | # | ||
606 | # CONFIG_RAID_ATTRS is not set | ||
607 | CONFIG_SCSI=y | ||
608 | CONFIG_SCSI_DMA=y | ||
609 | # CONFIG_SCSI_TGT is not set | ||
610 | # CONFIG_SCSI_NETLINK is not set | ||
611 | CONFIG_SCSI_PROC_FS=y | ||
612 | |||
613 | # | ||
614 | # SCSI support type (disk, tape, CD-ROM) | ||
615 | # | ||
616 | CONFIG_BLK_DEV_SD=y | ||
617 | # CONFIG_CHR_DEV_ST is not set | ||
618 | # CONFIG_CHR_DEV_OSST is not set | ||
619 | # CONFIG_BLK_DEV_SR is not set | ||
620 | # CONFIG_CHR_DEV_SG is not set | ||
621 | # CONFIG_CHR_DEV_SCH is not set | ||
622 | # CONFIG_SCSI_MULTI_LUN is not set | ||
623 | # CONFIG_SCSI_CONSTANTS is not set | ||
624 | # CONFIG_SCSI_LOGGING is not set | ||
625 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
626 | CONFIG_SCSI_WAIT_SCAN=m | ||
627 | |||
628 | # | ||
629 | # SCSI Transports | ||
630 | # | ||
631 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
632 | # CONFIG_SCSI_FC_ATTRS is not set | ||
633 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
634 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
635 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
636 | CONFIG_SCSI_LOWLEVEL=y | ||
637 | # CONFIG_ISCSI_TCP is not set | ||
638 | # CONFIG_SCSI_BNX2_ISCSI is not set | ||
639 | # CONFIG_BE2ISCSI is not set | ||
640 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
641 | # CONFIG_SCSI_HPSA is not set | ||
642 | # CONFIG_SCSI_3W_9XXX is not set | ||
643 | # CONFIG_SCSI_3W_SAS is not set | ||
644 | # CONFIG_SCSI_ACARD is not set | ||
645 | # CONFIG_SCSI_AACRAID is not set | ||
646 | # CONFIG_SCSI_AIC7XXX is not set | ||
647 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
648 | # CONFIG_SCSI_AIC79XX is not set | ||
649 | # CONFIG_SCSI_AIC94XX is not set | ||
650 | # CONFIG_SCSI_MVSAS is not set | ||
651 | # CONFIG_SCSI_ARCMSR is not set | ||
652 | # CONFIG_MEGARAID_NEWGEN is not set | ||
653 | # CONFIG_MEGARAID_LEGACY is not set | ||
654 | # CONFIG_MEGARAID_SAS is not set | ||
655 | # CONFIG_SCSI_MPT2SAS is not set | ||
656 | # CONFIG_SCSI_HPTIOP is not set | ||
657 | # CONFIG_LIBFC is not set | ||
658 | # CONFIG_LIBFCOE is not set | ||
659 | # CONFIG_FCOE is not set | ||
660 | # CONFIG_SCSI_DMX3191D is not set | ||
661 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
662 | # CONFIG_SCSI_IPS is not set | ||
663 | # CONFIG_SCSI_INITIO is not set | ||
664 | # CONFIG_SCSI_INIA100 is not set | ||
665 | # CONFIG_SCSI_STEX is not set | ||
666 | # CONFIG_SCSI_SYM53C8XX_2 is not set | ||
667 | # CONFIG_SCSI_IPR is not set | ||
668 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
669 | # CONFIG_SCSI_QLA_FC is not set | ||
670 | # CONFIG_SCSI_QLA_ISCSI is not set | ||
671 | # CONFIG_SCSI_LPFC is not set | ||
672 | # CONFIG_SCSI_DC395x is not set | ||
673 | # CONFIG_SCSI_DC390T is not set | ||
674 | # CONFIG_SCSI_NSP32 is not set | ||
675 | # CONFIG_SCSI_DEBUG is not set | ||
676 | # CONFIG_SCSI_PMCRAID is not set | ||
677 | # CONFIG_SCSI_PM8001 is not set | ||
678 | # CONFIG_SCSI_SRP is not set | ||
679 | # CONFIG_SCSI_BFA_FC is not set | ||
680 | # CONFIG_SCSI_DH is not set | ||
681 | # CONFIG_SCSI_OSD_INITIATOR is not set | ||
682 | CONFIG_ATA=y | ||
683 | # CONFIG_ATA_NONSTANDARD is not set | ||
684 | CONFIG_ATA_VERBOSE_ERROR=y | ||
685 | CONFIG_SATA_PMP=y | ||
686 | # CONFIG_SATA_AHCI is not set | ||
687 | CONFIG_SATA_SIL24=y | ||
688 | CONFIG_ATA_SFF=y | ||
689 | # CONFIG_SATA_SVW is not set | ||
690 | # CONFIG_ATA_PIIX is not set | ||
691 | # CONFIG_SATA_MV is not set | ||
692 | # CONFIG_SATA_NV is not set | ||
693 | # CONFIG_PDC_ADMA is not set | ||
694 | # CONFIG_SATA_QSTOR is not set | ||
695 | # CONFIG_SATA_PROMISE is not set | ||
696 | # CONFIG_SATA_SX4 is not set | ||
697 | # CONFIG_SATA_SIL is not set | ||
698 | # CONFIG_SATA_SIS is not set | ||
699 | # CONFIG_SATA_ULI is not set | ||
700 | # CONFIG_SATA_VIA is not set | ||
701 | # CONFIG_SATA_VITESSE is not set | ||
702 | # CONFIG_SATA_INIC162X is not set | ||
703 | # CONFIG_PATA_ALI is not set | ||
704 | # CONFIG_PATA_AMD is not set | ||
705 | # CONFIG_PATA_ARTOP is not set | ||
706 | # CONFIG_PATA_ATP867X is not set | ||
707 | # CONFIG_PATA_ATIIXP is not set | ||
708 | # CONFIG_PATA_CMD640_PCI is not set | ||
709 | # CONFIG_PATA_CMD64X is not set | ||
710 | # CONFIG_PATA_CS5520 is not set | ||
711 | # CONFIG_PATA_CS5530 is not set | ||
712 | # CONFIG_PATA_CYPRESS is not set | ||
713 | # CONFIG_PATA_EFAR is not set | ||
714 | # CONFIG_ATA_GENERIC is not set | ||
715 | # CONFIG_PATA_HPT366 is not set | ||
716 | # CONFIG_PATA_HPT37X is not set | ||
717 | # CONFIG_PATA_HPT3X2N is not set | ||
718 | # CONFIG_PATA_HPT3X3 is not set | ||
719 | # CONFIG_PATA_IT821X is not set | ||
720 | # CONFIG_PATA_IT8213 is not set | ||
721 | # CONFIG_PATA_JMICRON is not set | ||
722 | # CONFIG_PATA_TRIFLEX is not set | ||
723 | # CONFIG_PATA_MARVELL is not set | ||
724 | # CONFIG_PATA_MPIIX is not set | ||
725 | # CONFIG_PATA_OLDPIIX is not set | ||
726 | # CONFIG_PATA_NETCELL is not set | ||
727 | # CONFIG_PATA_NINJA32 is not set | ||
728 | # CONFIG_PATA_NS87410 is not set | ||
729 | # CONFIG_PATA_NS87415 is not set | ||
730 | # CONFIG_PATA_OPTI is not set | ||
731 | # CONFIG_PATA_OPTIDMA is not set | ||
732 | # CONFIG_PATA_PDC2027X is not set | ||
733 | # CONFIG_PATA_PDC_OLD is not set | ||
734 | # CONFIG_PATA_RADISYS is not set | ||
735 | # CONFIG_PATA_RDC is not set | ||
736 | # CONFIG_PATA_RZ1000 is not set | ||
737 | # CONFIG_PATA_SC1200 is not set | ||
738 | # CONFIG_PATA_SERVERWORKS is not set | ||
739 | # CONFIG_PATA_SIL680 is not set | ||
740 | # CONFIG_PATA_SIS is not set | ||
741 | # CONFIG_PATA_TOSHIBA is not set | ||
742 | # CONFIG_PATA_VIA is not set | ||
743 | # CONFIG_PATA_WINBOND is not set | ||
744 | CONFIG_PATA_PLATFORM=y | ||
745 | # CONFIG_PATA_SCH is not set | ||
746 | # CONFIG_MD is not set | ||
747 | # CONFIG_FUSION is not set | ||
748 | |||
749 | # | ||
750 | # IEEE 1394 (FireWire) support | ||
751 | # | ||
752 | |||
753 | # | ||
754 | # You can enable one or both FireWire driver stacks. | ||
755 | # | ||
756 | |||
757 | # | ||
758 | # The newer stack is recommended. | ||
759 | # | ||
760 | # CONFIG_FIREWIRE is not set | ||
761 | # CONFIG_IEEE1394 is not set | ||
762 | # CONFIG_I2O is not set | ||
763 | CONFIG_NETDEVICES=y | ||
764 | # CONFIG_DUMMY is not set | ||
765 | # CONFIG_BONDING is not set | ||
766 | # CONFIG_MACVLAN is not set | ||
767 | # CONFIG_EQUALIZER is not set | ||
768 | # CONFIG_TUN is not set | ||
769 | # CONFIG_VETH is not set | ||
770 | # CONFIG_ARCNET is not set | ||
771 | CONFIG_PHYLIB=y | ||
772 | |||
773 | # | ||
774 | # MII PHY device drivers | ||
775 | # | ||
776 | # CONFIG_MARVELL_PHY is not set | ||
777 | # CONFIG_DAVICOM_PHY is not set | ||
778 | # CONFIG_QSEMI_PHY is not set | ||
779 | # CONFIG_LXT_PHY is not set | ||
780 | # CONFIG_CICADA_PHY is not set | ||
781 | # CONFIG_VITESSE_PHY is not set | ||
782 | # CONFIG_SMSC_PHY is not set | ||
783 | # CONFIG_BROADCOM_PHY is not set | ||
784 | # CONFIG_ICPLUS_PHY is not set | ||
785 | # CONFIG_REALTEK_PHY is not set | ||
786 | # CONFIG_NATIONAL_PHY is not set | ||
787 | # CONFIG_STE10XP is not set | ||
788 | # CONFIG_LSI_ET1011C_PHY is not set | ||
789 | # CONFIG_FIXED_PHY is not set | ||
790 | CONFIG_MDIO_BITBANG=y | ||
791 | CONFIG_NET_ETHERNET=y | ||
792 | CONFIG_MII=y | ||
793 | # CONFIG_AX88796 is not set | ||
794 | # CONFIG_STNIC is not set | ||
795 | # CONFIG_HAPPYMEAL is not set | ||
796 | # CONFIG_SUNGEM is not set | ||
797 | # CONFIG_CASSINI is not set | ||
798 | # CONFIG_NET_VENDOR_3COM is not set | ||
799 | CONFIG_SMC91X=y | ||
800 | # CONFIG_ENC28J60 is not set | ||
801 | # CONFIG_ETHOC is not set | ||
802 | # CONFIG_SMC911X is not set | ||
803 | CONFIG_SMSC911X=y | ||
804 | # CONFIG_DNET is not set | ||
805 | # CONFIG_NET_TULIP is not set | ||
806 | # CONFIG_HP100 is not set | ||
807 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
808 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
809 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
810 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
811 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
812 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
813 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
814 | # CONFIG_NET_PCI is not set | ||
815 | # CONFIG_B44 is not set | ||
816 | # CONFIG_KS8842 is not set | ||
817 | # CONFIG_KS8851 is not set | ||
818 | # CONFIG_KS8851_MLL is not set | ||
819 | # CONFIG_ATL2 is not set | ||
820 | # CONFIG_NETDEV_1000 is not set | ||
821 | # CONFIG_NETDEV_10000 is not set | ||
822 | # CONFIG_TR is not set | ||
823 | CONFIG_WLAN=y | ||
824 | # CONFIG_ATMEL is not set | ||
825 | # CONFIG_PRISM54 is not set | ||
826 | # CONFIG_USB_ZD1201 is not set | ||
827 | # CONFIG_HOSTAP is not set | ||
828 | |||
829 | # | ||
830 | # Enable WiMAX (Networking options) to see the WiMAX drivers | ||
831 | # | ||
832 | |||
833 | # | ||
834 | # USB Network Adapters | ||
835 | # | ||
836 | # CONFIG_USB_CATC is not set | ||
837 | # CONFIG_USB_KAWETH is not set | ||
838 | # CONFIG_USB_PEGASUS is not set | ||
839 | # CONFIG_USB_RTL8150 is not set | ||
840 | # CONFIG_USB_USBNET is not set | ||
841 | # CONFIG_WAN is not set | ||
842 | # CONFIG_FDDI is not set | ||
843 | # CONFIG_HIPPI is not set | ||
844 | # CONFIG_PPP is not set | ||
845 | # CONFIG_SLIP is not set | ||
846 | # CONFIG_NET_FC is not set | ||
847 | # CONFIG_NETCONSOLE is not set | ||
848 | # CONFIG_NETPOLL is not set | ||
849 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
850 | # CONFIG_VMXNET3 is not set | ||
851 | # CONFIG_ISDN is not set | ||
852 | # CONFIG_PHONE is not set | ||
853 | |||
854 | # | ||
855 | # Input device support | ||
856 | # | ||
857 | CONFIG_INPUT=y | ||
858 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
859 | # CONFIG_INPUT_POLLDEV is not set | ||
860 | # CONFIG_INPUT_SPARSEKMAP is not set | ||
861 | |||
862 | # | ||
863 | # Userland interfaces | ||
864 | # | ||
865 | CONFIG_INPUT_MOUSEDEV=y | ||
866 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
867 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
868 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
869 | # CONFIG_INPUT_JOYDEV is not set | ||
870 | # CONFIG_INPUT_EVDEV is not set | ||
871 | # CONFIG_INPUT_EVBUG is not set | ||
872 | |||
873 | # | ||
874 | # Input Device Drivers | ||
875 | # | ||
876 | CONFIG_INPUT_KEYBOARD=y | ||
877 | # CONFIG_KEYBOARD_ADP5588 is not set | ||
878 | CONFIG_KEYBOARD_ATKBD=y | ||
879 | # CONFIG_QT2160 is not set | ||
880 | # CONFIG_KEYBOARD_LKKBD is not set | ||
881 | # CONFIG_KEYBOARD_MAX7359 is not set | ||
882 | # CONFIG_KEYBOARD_NEWTON is not set | ||
883 | # CONFIG_KEYBOARD_OPENCORES is not set | ||
884 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
885 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
886 | # CONFIG_KEYBOARD_SH_KEYSC is not set | ||
887 | # CONFIG_KEYBOARD_XTKBD is not set | ||
888 | CONFIG_INPUT_MOUSE=y | ||
889 | CONFIG_MOUSE_PS2=y | ||
890 | CONFIG_MOUSE_PS2_ALPS=y | ||
891 | CONFIG_MOUSE_PS2_LOGIPS2PP=y | ||
892 | CONFIG_MOUSE_PS2_SYNAPTICS=y | ||
893 | CONFIG_MOUSE_PS2_TRACKPOINT=y | ||
894 | # CONFIG_MOUSE_PS2_ELANTECH is not set | ||
895 | # CONFIG_MOUSE_PS2_SENTELIC is not set | ||
896 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | ||
897 | # CONFIG_MOUSE_SERIAL is not set | ||
898 | # CONFIG_MOUSE_APPLETOUCH is not set | ||
899 | # CONFIG_MOUSE_BCM5974 is not set | ||
900 | # CONFIG_MOUSE_VSXXXAA is not set | ||
901 | # CONFIG_MOUSE_SYNAPTICS_I2C is not set | ||
902 | # CONFIG_INPUT_JOYSTICK is not set | ||
903 | # CONFIG_INPUT_TABLET is not set | ||
904 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
905 | # CONFIG_INPUT_MISC is not set | ||
906 | |||
907 | # | ||
908 | # Hardware I/O ports | ||
909 | # | ||
910 | CONFIG_SERIO=y | ||
911 | CONFIG_SERIO_I8042=y | ||
912 | CONFIG_SERIO_SERPORT=y | ||
913 | # CONFIG_SERIO_PCIPS2 is not set | ||
914 | CONFIG_SERIO_LIBPS2=y | ||
915 | # CONFIG_SERIO_RAW is not set | ||
916 | # CONFIG_SERIO_ALTERA_PS2 is not set | ||
917 | # CONFIG_GAMEPORT is not set | ||
918 | |||
919 | # | ||
920 | # Character devices | ||
921 | # | ||
922 | CONFIG_VT=y | ||
923 | CONFIG_CONSOLE_TRANSLATIONS=y | ||
924 | CONFIG_VT_CONSOLE=y | ||
925 | CONFIG_HW_CONSOLE=y | ||
926 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
927 | CONFIG_DEVKMEM=y | ||
928 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
929 | # CONFIG_NOZOMI is not set | ||
930 | |||
931 | # | ||
932 | # Serial drivers | ||
933 | # | ||
934 | # CONFIG_SERIAL_8250 is not set | ||
935 | |||
936 | # | ||
937 | # Non-8250 serial port support | ||
938 | # | ||
939 | # CONFIG_SERIAL_MAX3100 is not set | ||
940 | CONFIG_SERIAL_SH_SCI=y | ||
941 | CONFIG_SERIAL_SH_SCI_NR_UARTS=6 | ||
942 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
943 | CONFIG_SERIAL_CORE=y | ||
944 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
945 | # CONFIG_SERIAL_JSM is not set | ||
946 | CONFIG_UNIX98_PTYS=y | ||
947 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | ||
948 | # CONFIG_LEGACY_PTYS is not set | ||
949 | # CONFIG_IPMI_HANDLER is not set | ||
950 | # CONFIG_HW_RANDOM is not set | ||
951 | # CONFIG_R3964 is not set | ||
952 | # CONFIG_APPLICOM is not set | ||
953 | # CONFIG_RAW_DRIVER is not set | ||
954 | # CONFIG_TCG_TPM is not set | ||
955 | CONFIG_DEVPORT=y | ||
956 | CONFIG_I2C=y | ||
957 | CONFIG_I2C_BOARDINFO=y | ||
958 | # CONFIG_I2C_COMPAT is not set | ||
959 | CONFIG_I2C_CHARDEV=y | ||
960 | CONFIG_I2C_HELPER_AUTO=y | ||
961 | |||
962 | # | ||
963 | # I2C Hardware Bus support | ||
964 | # | ||
965 | |||
966 | # | ||
967 | # PC SMBus host controller drivers | ||
968 | # | ||
969 | # CONFIG_I2C_ALI1535 is not set | ||
970 | # CONFIG_I2C_ALI1563 is not set | ||
971 | # CONFIG_I2C_ALI15X3 is not set | ||
972 | # CONFIG_I2C_AMD756 is not set | ||
973 | # CONFIG_I2C_AMD8111 is not set | ||
974 | # CONFIG_I2C_I801 is not set | ||
975 | # CONFIG_I2C_ISCH is not set | ||
976 | # CONFIG_I2C_PIIX4 is not set | ||
977 | # CONFIG_I2C_NFORCE2 is not set | ||
978 | # CONFIG_I2C_SIS5595 is not set | ||
979 | # CONFIG_I2C_SIS630 is not set | ||
980 | # CONFIG_I2C_SIS96X is not set | ||
981 | # CONFIG_I2C_VIA is not set | ||
982 | # CONFIG_I2C_VIAPRO is not set | ||
983 | |||
984 | # | ||
985 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
986 | # | ||
987 | # CONFIG_I2C_DESIGNWARE is not set | ||
988 | # CONFIG_I2C_OCORES is not set | ||
989 | # CONFIG_I2C_SH_MOBILE is not set | ||
990 | # CONFIG_I2C_SIMTEC is not set | ||
991 | |||
992 | # | ||
993 | # External I2C/SMBus adapter drivers | ||
994 | # | ||
995 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
996 | # CONFIG_I2C_TAOS_EVM is not set | ||
997 | # CONFIG_I2C_TINY_USB is not set | ||
998 | |||
999 | # | ||
1000 | # Other I2C/SMBus bus drivers | ||
1001 | # | ||
1002 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
1003 | # CONFIG_I2C_STUB is not set | ||
1004 | |||
1005 | # | ||
1006 | # Miscellaneous I2C Chip support | ||
1007 | # | ||
1008 | # CONFIG_SENSORS_TSL2550 is not set | ||
1009 | # CONFIG_I2C_DEBUG_CORE is not set | ||
1010 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
1011 | # CONFIG_I2C_DEBUG_BUS is not set | ||
1012 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
1013 | CONFIG_SPI=y | ||
1014 | # CONFIG_SPI_DEBUG is not set | ||
1015 | CONFIG_SPI_MASTER=y | ||
1016 | |||
1017 | # | ||
1018 | # SPI Master Controller Drivers | ||
1019 | # | ||
1020 | # CONFIG_SPI_BITBANG is not set | ||
1021 | # CONFIG_SPI_SH_MSIOF is not set | ||
1022 | # CONFIG_SPI_SH_SCI is not set | ||
1023 | # CONFIG_SPI_XILINX is not set | ||
1024 | # CONFIG_SPI_DESIGNWARE is not set | ||
1025 | |||
1026 | # | ||
1027 | # SPI Protocol Masters | ||
1028 | # | ||
1029 | # CONFIG_SPI_SPIDEV is not set | ||
1030 | # CONFIG_SPI_TLE62X0 is not set | ||
1031 | |||
1032 | # | ||
1033 | # PPS support | ||
1034 | # | ||
1035 | # CONFIG_PPS is not set | ||
1036 | # CONFIG_W1 is not set | ||
1037 | # CONFIG_POWER_SUPPLY is not set | ||
1038 | # CONFIG_HWMON is not set | ||
1039 | # CONFIG_THERMAL is not set | ||
1040 | CONFIG_WATCHDOG=y | ||
1041 | # CONFIG_WATCHDOG_NOWAYOUT is not set | ||
1042 | |||
1043 | # | ||
1044 | # Watchdog Device Drivers | ||
1045 | # | ||
1046 | # CONFIG_SOFT_WATCHDOG is not set | ||
1047 | # CONFIG_ALIM7101_WDT is not set | ||
1048 | # CONFIG_SH_WDT is not set | ||
1049 | |||
1050 | # | ||
1051 | # PCI-based Watchdog Cards | ||
1052 | # | ||
1053 | # CONFIG_PCIPCWATCHDOG is not set | ||
1054 | # CONFIG_WDTPCI is not set | ||
1055 | |||
1056 | # | ||
1057 | # USB-based Watchdog Cards | ||
1058 | # | ||
1059 | # CONFIG_USBPCWATCHDOG is not set | ||
1060 | CONFIG_SSB_POSSIBLE=y | ||
1061 | |||
1062 | # | ||
1063 | # Sonics Silicon Backplane | ||
1064 | # | ||
1065 | # CONFIG_SSB is not set | ||
1066 | |||
1067 | # | ||
1068 | # Multifunction device drivers | ||
1069 | # | ||
1070 | # CONFIG_MFD_CORE is not set | ||
1071 | # CONFIG_MFD_SM501 is not set | ||
1072 | # CONFIG_MFD_SH_MOBILE_SDHI is not set | ||
1073 | # CONFIG_HTC_PASIC3 is not set | ||
1074 | # CONFIG_TWL4030_CORE is not set | ||
1075 | # CONFIG_MFD_TMIO is not set | ||
1076 | # CONFIG_PMIC_DA903X is not set | ||
1077 | # CONFIG_PMIC_ADP5520 is not set | ||
1078 | # CONFIG_MFD_WM8400 is not set | ||
1079 | # CONFIG_MFD_WM831X is not set | ||
1080 | # CONFIG_MFD_WM8350_I2C is not set | ||
1081 | # CONFIG_MFD_PCF50633 is not set | ||
1082 | # CONFIG_MFD_MC13783 is not set | ||
1083 | # CONFIG_AB3100_CORE is not set | ||
1084 | # CONFIG_EZX_PCAP is not set | ||
1085 | # CONFIG_MFD_88PM8607 is not set | ||
1086 | # CONFIG_AB4500_CORE is not set | ||
1087 | # CONFIG_REGULATOR is not set | ||
1088 | # CONFIG_MEDIA_SUPPORT is not set | ||
1089 | |||
1090 | # | ||
1091 | # Graphics support | ||
1092 | # | ||
1093 | CONFIG_VGA_ARB=y | ||
1094 | # CONFIG_DRM is not set | ||
1095 | # CONFIG_VGASTATE is not set | ||
1096 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
1097 | # CONFIG_FB is not set | ||
1098 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
1099 | |||
1100 | # | ||
1101 | # Display device support | ||
1102 | # | ||
1103 | # CONFIG_DISPLAY_SUPPORT is not set | ||
1104 | |||
1105 | # | ||
1106 | # Console display driver support | ||
1107 | # | ||
1108 | CONFIG_DUMMY_CONSOLE=y | ||
1109 | # CONFIG_SOUND is not set | ||
1110 | CONFIG_HID_SUPPORT=y | ||
1111 | CONFIG_HID=y | ||
1112 | # CONFIG_HIDRAW is not set | ||
1113 | |||
1114 | # | ||
1115 | # USB Input Devices | ||
1116 | # | ||
1117 | CONFIG_USB_HID=y | ||
1118 | # CONFIG_HID_PID is not set | ||
1119 | # CONFIG_USB_HIDDEV is not set | ||
1120 | |||
1121 | # | ||
1122 | # Special HID drivers | ||
1123 | # | ||
1124 | # CONFIG_HID_A4TECH is not set | ||
1125 | # CONFIG_HID_APPLE is not set | ||
1126 | # CONFIG_HID_BELKIN is not set | ||
1127 | # CONFIG_HID_CHERRY is not set | ||
1128 | # CONFIG_HID_CHICONY is not set | ||
1129 | # CONFIG_HID_CYPRESS is not set | ||
1130 | # CONFIG_HID_DRAGONRISE is not set | ||
1131 | # CONFIG_HID_EZKEY is not set | ||
1132 | # CONFIG_HID_KYE is not set | ||
1133 | # CONFIG_HID_GYRATION is not set | ||
1134 | # CONFIG_HID_TWINHAN is not set | ||
1135 | # CONFIG_HID_KENSINGTON is not set | ||
1136 | # CONFIG_HID_LOGITECH is not set | ||
1137 | # CONFIG_HID_MICROSOFT is not set | ||
1138 | # CONFIG_HID_MONTEREY is not set | ||
1139 | # CONFIG_HID_NTRIG is not set | ||
1140 | # CONFIG_HID_PANTHERLORD is not set | ||
1141 | # CONFIG_HID_PETALYNX is not set | ||
1142 | # CONFIG_HID_SAMSUNG is not set | ||
1143 | # CONFIG_HID_SONY is not set | ||
1144 | # CONFIG_HID_SUNPLUS is not set | ||
1145 | # CONFIG_HID_GREENASIA is not set | ||
1146 | # CONFIG_HID_SMARTJOYPLUS is not set | ||
1147 | # CONFIG_HID_TOPSEED is not set | ||
1148 | # CONFIG_HID_THRUSTMASTER is not set | ||
1149 | # CONFIG_HID_ZEROPLUS is not set | ||
1150 | CONFIG_USB_SUPPORT=y | ||
1151 | CONFIG_USB_ARCH_HAS_HCD=y | ||
1152 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
1153 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
1154 | CONFIG_USB=y | ||
1155 | # CONFIG_USB_DEBUG is not set | ||
1156 | # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set | ||
1157 | |||
1158 | # | ||
1159 | # Miscellaneous USB options | ||
1160 | # | ||
1161 | # CONFIG_USB_DEVICEFS is not set | ||
1162 | CONFIG_USB_DEVICE_CLASS=y | ||
1163 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
1164 | # CONFIG_USB_SUSPEND is not set | ||
1165 | # CONFIG_USB_OTG is not set | ||
1166 | # CONFIG_USB_OTG_WHITELIST is not set | ||
1167 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | ||
1168 | CONFIG_USB_MON=y | ||
1169 | # CONFIG_USB_WUSB is not set | ||
1170 | # CONFIG_USB_WUSB_CBAF is not set | ||
1171 | |||
1172 | # | ||
1173 | # USB Host Controller Drivers | ||
1174 | # | ||
1175 | # CONFIG_USB_C67X00_HCD is not set | ||
1176 | # CONFIG_USB_XHCI_HCD is not set | ||
1177 | # CONFIG_USB_EHCI_HCD is not set | ||
1178 | # CONFIG_USB_OXU210HP_HCD is not set | ||
1179 | # CONFIG_USB_ISP116X_HCD is not set | ||
1180 | # CONFIG_USB_ISP1760_HCD is not set | ||
1181 | # CONFIG_USB_ISP1362_HCD is not set | ||
1182 | CONFIG_USB_OHCI_HCD=y | ||
1183 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
1184 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
1185 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
1186 | # CONFIG_USB_UHCI_HCD is not set | ||
1187 | # CONFIG_USB_SL811_HCD is not set | ||
1188 | # CONFIG_USB_R8A66597_HCD is not set | ||
1189 | # CONFIG_USB_WHCI_HCD is not set | ||
1190 | # CONFIG_USB_HWA_HCD is not set | ||
1191 | # CONFIG_USB_GADGET_MUSB_HDRC is not set | ||
1192 | |||
1193 | # | ||
1194 | # USB Device Class drivers | ||
1195 | # | ||
1196 | # CONFIG_USB_ACM is not set | ||
1197 | # CONFIG_USB_PRINTER is not set | ||
1198 | # CONFIG_USB_WDM is not set | ||
1199 | # CONFIG_USB_TMC is not set | ||
1200 | |||
1201 | # | ||
1202 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may | ||
1203 | # | ||
1204 | |||
1205 | # | ||
1206 | # also be needed; see USB_STORAGE Help for more info | ||
1207 | # | ||
1208 | CONFIG_USB_STORAGE=y | ||
1209 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
1210 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
1211 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
1212 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
1213 | # CONFIG_USB_STORAGE_USBAT is not set | ||
1214 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
1215 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
1216 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
1217 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
1218 | # CONFIG_USB_STORAGE_ONETOUCH is not set | ||
1219 | # CONFIG_USB_STORAGE_KARMA is not set | ||
1220 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set | ||
1221 | # CONFIG_USB_LIBUSUAL is not set | ||
1222 | |||
1223 | # | ||
1224 | # USB Imaging devices | ||
1225 | # | ||
1226 | # CONFIG_USB_MDC800 is not set | ||
1227 | # CONFIG_USB_MICROTEK is not set | ||
1228 | |||
1229 | # | ||
1230 | # USB port drivers | ||
1231 | # | ||
1232 | # CONFIG_USB_SERIAL is not set | ||
1233 | |||
1234 | # | ||
1235 | # USB Miscellaneous drivers | ||
1236 | # | ||
1237 | # CONFIG_USB_EMI62 is not set | ||
1238 | # CONFIG_USB_EMI26 is not set | ||
1239 | # CONFIG_USB_ADUTUX is not set | ||
1240 | # CONFIG_USB_SEVSEG is not set | ||
1241 | # CONFIG_USB_RIO500 is not set | ||
1242 | # CONFIG_USB_LEGOTOWER is not set | ||
1243 | # CONFIG_USB_LCD is not set | ||
1244 | # CONFIG_USB_BERRY_CHARGE is not set | ||
1245 | # CONFIG_USB_LED is not set | ||
1246 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
1247 | # CONFIG_USB_CYTHERM is not set | ||
1248 | # CONFIG_USB_IDMOUSE is not set | ||
1249 | # CONFIG_USB_FTDI_ELAN is not set | ||
1250 | # CONFIG_USB_APPLEDISPLAY is not set | ||
1251 | # CONFIG_USB_LD is not set | ||
1252 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
1253 | # CONFIG_USB_IOWARRIOR is not set | ||
1254 | # CONFIG_USB_TEST is not set | ||
1255 | # CONFIG_USB_ISIGHTFW is not set | ||
1256 | # CONFIG_USB_VST is not set | ||
1257 | CONFIG_USB_GADGET=y | ||
1258 | # CONFIG_USB_GADGET_DEBUG is not set | ||
1259 | # CONFIG_USB_GADGET_DEBUG_FILES is not set | ||
1260 | # CONFIG_USB_GADGET_DEBUG_FS is not set | ||
1261 | CONFIG_USB_GADGET_VBUS_DRAW=2 | ||
1262 | CONFIG_USB_GADGET_SELECTED=y | ||
1263 | # CONFIG_USB_GADGET_AT91 is not set | ||
1264 | # CONFIG_USB_GADGET_ATMEL_USBA is not set | ||
1265 | # CONFIG_USB_GADGET_FSL_USB2 is not set | ||
1266 | # CONFIG_USB_GADGET_LH7A40X is not set | ||
1267 | # CONFIG_USB_GADGET_OMAP is not set | ||
1268 | # CONFIG_USB_GADGET_PXA25X is not set | ||
1269 | # CONFIG_USB_GADGET_R8A66597 is not set | ||
1270 | # CONFIG_USB_GADGET_PXA27X is not set | ||
1271 | # CONFIG_USB_GADGET_S3C_HSOTG is not set | ||
1272 | # CONFIG_USB_GADGET_IMX is not set | ||
1273 | # CONFIG_USB_GADGET_S3C2410 is not set | ||
1274 | CONFIG_USB_GADGET_M66592=y | ||
1275 | CONFIG_USB_M66592=y | ||
1276 | # CONFIG_USB_GADGET_AMD5536UDC is not set | ||
1277 | # CONFIG_USB_GADGET_FSL_QE is not set | ||
1278 | # CONFIG_USB_GADGET_CI13XXX is not set | ||
1279 | # CONFIG_USB_GADGET_NET2280 is not set | ||
1280 | # CONFIG_USB_GADGET_GOKU is not set | ||
1281 | # CONFIG_USB_GADGET_LANGWELL is not set | ||
1282 | # CONFIG_USB_GADGET_DUMMY_HCD is not set | ||
1283 | CONFIG_USB_GADGET_DUALSPEED=y | ||
1284 | # CONFIG_USB_ZERO is not set | ||
1285 | # CONFIG_USB_AUDIO is not set | ||
1286 | # CONFIG_USB_ETH is not set | ||
1287 | # CONFIG_USB_GADGETFS is not set | ||
1288 | # CONFIG_USB_FILE_STORAGE is not set | ||
1289 | # CONFIG_USB_MASS_STORAGE is not set | ||
1290 | # CONFIG_USB_G_SERIAL is not set | ||
1291 | # CONFIG_USB_MIDI_GADGET is not set | ||
1292 | # CONFIG_USB_G_PRINTER is not set | ||
1293 | # CONFIG_USB_CDC_COMPOSITE is not set | ||
1294 | # CONFIG_USB_G_MULTI is not set | ||
1295 | |||
1296 | # | ||
1297 | # OTG and related infrastructure | ||
1298 | # | ||
1299 | # CONFIG_NOP_USB_XCEIV is not set | ||
1300 | # CONFIG_UWB is not set | ||
1301 | # CONFIG_MMC is not set | ||
1302 | # CONFIG_MEMSTICK is not set | ||
1303 | # CONFIG_NEW_LEDS is not set | ||
1304 | # CONFIG_ACCESSIBILITY is not set | ||
1305 | # CONFIG_INFINIBAND is not set | ||
1306 | CONFIG_RTC_LIB=y | ||
1307 | CONFIG_RTC_CLASS=y | ||
1308 | CONFIG_RTC_HCTOSYS=y | ||
1309 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
1310 | # CONFIG_RTC_DEBUG is not set | ||
1311 | |||
1312 | # | ||
1313 | # RTC interfaces | ||
1314 | # | ||
1315 | CONFIG_RTC_INTF_SYSFS=y | ||
1316 | CONFIG_RTC_INTF_PROC=y | ||
1317 | CONFIG_RTC_INTF_DEV=y | ||
1318 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
1319 | # CONFIG_RTC_DRV_TEST is not set | ||
1320 | |||
1321 | # | ||
1322 | # I2C RTC drivers | ||
1323 | # | ||
1324 | # CONFIG_RTC_DRV_DS1307 is not set | ||
1325 | # CONFIG_RTC_DRV_DS1374 is not set | ||
1326 | # CONFIG_RTC_DRV_DS1672 is not set | ||
1327 | CONFIG_RTC_DRV_MAX6900=y | ||
1328 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
1329 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
1330 | # CONFIG_RTC_DRV_X1205 is not set | ||
1331 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
1332 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
1333 | # CONFIG_RTC_DRV_M41T80 is not set | ||
1334 | # CONFIG_RTC_DRV_BQ32K is not set | ||
1335 | # CONFIG_RTC_DRV_S35390A is not set | ||
1336 | # CONFIG_RTC_DRV_FM3130 is not set | ||
1337 | # CONFIG_RTC_DRV_RX8581 is not set | ||
1338 | # CONFIG_RTC_DRV_RX8025 is not set | ||
1339 | |||
1340 | # | ||
1341 | # SPI RTC drivers | ||
1342 | # | ||
1343 | # CONFIG_RTC_DRV_M41T94 is not set | ||
1344 | # CONFIG_RTC_DRV_DS1305 is not set | ||
1345 | # CONFIG_RTC_DRV_DS1390 is not set | ||
1346 | # CONFIG_RTC_DRV_MAX6902 is not set | ||
1347 | # CONFIG_RTC_DRV_R9701 is not set | ||
1348 | # CONFIG_RTC_DRV_RS5C348 is not set | ||
1349 | # CONFIG_RTC_DRV_DS3234 is not set | ||
1350 | # CONFIG_RTC_DRV_PCF2123 is not set | ||
1351 | |||
1352 | # | ||
1353 | # Platform RTC drivers | ||
1354 | # | ||
1355 | # CONFIG_RTC_DRV_DS1286 is not set | ||
1356 | # CONFIG_RTC_DRV_DS1511 is not set | ||
1357 | # CONFIG_RTC_DRV_DS1553 is not set | ||
1358 | # CONFIG_RTC_DRV_DS1742 is not set | ||
1359 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
1360 | # CONFIG_RTC_DRV_M48T86 is not set | ||
1361 | # CONFIG_RTC_DRV_M48T35 is not set | ||
1362 | # CONFIG_RTC_DRV_M48T59 is not set | ||
1363 | # CONFIG_RTC_DRV_MSM6242 is not set | ||
1364 | # CONFIG_RTC_DRV_BQ4802 is not set | ||
1365 | # CONFIG_RTC_DRV_RP5C01 is not set | ||
1366 | # CONFIG_RTC_DRV_V3020 is not set | ||
1367 | |||
1368 | # | ||
1369 | # on-CPU RTC drivers | ||
1370 | # | ||
1371 | CONFIG_RTC_DRV_SH=y | ||
1372 | # CONFIG_RTC_DRV_GENERIC is not set | ||
1373 | # CONFIG_DMADEVICES is not set | ||
1374 | # CONFIG_AUXDISPLAY is not set | ||
1375 | CONFIG_UIO=m | ||
1376 | # CONFIG_UIO_CIF is not set | ||
1377 | # CONFIG_UIO_PDRV is not set | ||
1378 | # CONFIG_UIO_PDRV_GENIRQ is not set | ||
1379 | # CONFIG_UIO_SMX is not set | ||
1380 | # CONFIG_UIO_AEC is not set | ||
1381 | # CONFIG_UIO_SERCOS3 is not set | ||
1382 | # CONFIG_UIO_PCI_GENERIC is not set | ||
1383 | |||
1384 | # | ||
1385 | # TI VLYNQ | ||
1386 | # | ||
1387 | # CONFIG_STAGING is not set | ||
1388 | |||
1389 | # | ||
1390 | # File systems | ||
1391 | # | ||
1392 | CONFIG_EXT2_FS=y | ||
1393 | # CONFIG_EXT2_FS_XATTR is not set | ||
1394 | # CONFIG_EXT2_FS_XIP is not set | ||
1395 | CONFIG_EXT3_FS=y | ||
1396 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
1397 | CONFIG_EXT3_FS_XATTR=y | ||
1398 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
1399 | # CONFIG_EXT3_FS_SECURITY is not set | ||
1400 | # CONFIG_EXT4_FS is not set | ||
1401 | CONFIG_JBD=y | ||
1402 | # CONFIG_JBD_DEBUG is not set | ||
1403 | CONFIG_FS_MBCACHE=y | ||
1404 | # CONFIG_REISERFS_FS is not set | ||
1405 | # CONFIG_JFS_FS is not set | ||
1406 | # CONFIG_FS_POSIX_ACL is not set | ||
1407 | # CONFIG_XFS_FS is not set | ||
1408 | # CONFIG_OCFS2_FS is not set | ||
1409 | # CONFIG_BTRFS_FS is not set | ||
1410 | # CONFIG_NILFS2_FS is not set | ||
1411 | CONFIG_FILE_LOCKING=y | ||
1412 | CONFIG_FSNOTIFY=y | ||
1413 | CONFIG_DNOTIFY=y | ||
1414 | CONFIG_INOTIFY=y | ||
1415 | CONFIG_INOTIFY_USER=y | ||
1416 | # CONFIG_QUOTA is not set | ||
1417 | # CONFIG_AUTOFS_FS is not set | ||
1418 | # CONFIG_AUTOFS4_FS is not set | ||
1419 | # CONFIG_FUSE_FS is not set | ||
1420 | |||
1421 | # | ||
1422 | # Caches | ||
1423 | # | ||
1424 | # CONFIG_FSCACHE is not set | ||
1425 | |||
1426 | # | ||
1427 | # CD-ROM/DVD Filesystems | ||
1428 | # | ||
1429 | # CONFIG_ISO9660_FS is not set | ||
1430 | # CONFIG_UDF_FS is not set | ||
1431 | |||
1432 | # | ||
1433 | # DOS/FAT/NT Filesystems | ||
1434 | # | ||
1435 | # CONFIG_MSDOS_FS is not set | ||
1436 | # CONFIG_VFAT_FS is not set | ||
1437 | # CONFIG_NTFS_FS is not set | ||
1438 | |||
1439 | # | ||
1440 | # Pseudo filesystems | ||
1441 | # | ||
1442 | CONFIG_PROC_FS=y | ||
1443 | CONFIG_PROC_KCORE=y | ||
1444 | CONFIG_PROC_SYSCTL=y | ||
1445 | CONFIG_PROC_PAGE_MONITOR=y | ||
1446 | CONFIG_SYSFS=y | ||
1447 | CONFIG_TMPFS=y | ||
1448 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
1449 | CONFIG_HUGETLBFS=y | ||
1450 | CONFIG_HUGETLB_PAGE=y | ||
1451 | # CONFIG_CONFIGFS_FS is not set | ||
1452 | CONFIG_MISC_FILESYSTEMS=y | ||
1453 | # CONFIG_ADFS_FS is not set | ||
1454 | # CONFIG_AFFS_FS is not set | ||
1455 | # CONFIG_HFS_FS is not set | ||
1456 | # CONFIG_HFSPLUS_FS is not set | ||
1457 | # CONFIG_BEFS_FS is not set | ||
1458 | # CONFIG_BFS_FS is not set | ||
1459 | # CONFIG_EFS_FS is not set | ||
1460 | # CONFIG_CRAMFS is not set | ||
1461 | # CONFIG_SQUASHFS is not set | ||
1462 | # CONFIG_VXFS_FS is not set | ||
1463 | # CONFIG_MINIX_FS is not set | ||
1464 | # CONFIG_OMFS_FS is not set | ||
1465 | # CONFIG_HPFS_FS is not set | ||
1466 | # CONFIG_QNX4FS_FS is not set | ||
1467 | # CONFIG_ROMFS_FS is not set | ||
1468 | # CONFIG_SYSV_FS is not set | ||
1469 | # CONFIG_UFS_FS is not set | ||
1470 | CONFIG_NETWORK_FILESYSTEMS=y | ||
1471 | CONFIG_NFS_FS=y | ||
1472 | CONFIG_NFS_V3=y | ||
1473 | # CONFIG_NFS_V3_ACL is not set | ||
1474 | # CONFIG_NFS_V4 is not set | ||
1475 | CONFIG_ROOT_NFS=y | ||
1476 | # CONFIG_NFSD is not set | ||
1477 | CONFIG_LOCKD=y | ||
1478 | CONFIG_LOCKD_V4=y | ||
1479 | CONFIG_NFS_COMMON=y | ||
1480 | CONFIG_SUNRPC=y | ||
1481 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
1482 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
1483 | # CONFIG_SMB_FS is not set | ||
1484 | # CONFIG_CIFS is not set | ||
1485 | # CONFIG_NCP_FS is not set | ||
1486 | # CONFIG_CODA_FS is not set | ||
1487 | # CONFIG_AFS_FS is not set | ||
1488 | |||
1489 | # | ||
1490 | # Partition Types | ||
1491 | # | ||
1492 | # CONFIG_PARTITION_ADVANCED is not set | ||
1493 | CONFIG_MSDOS_PARTITION=y | ||
1494 | CONFIG_NLS=y | ||
1495 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1496 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
1497 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
1498 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
1499 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
1500 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
1501 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
1502 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
1503 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
1504 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
1505 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
1506 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
1507 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
1508 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1509 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1510 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1511 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1512 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1513 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
1514 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1515 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1516 | # CONFIG_NLS_ISO8859_8 is not set | ||
1517 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
1518 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
1519 | # CONFIG_NLS_ASCII is not set | ||
1520 | # CONFIG_NLS_ISO8859_1 is not set | ||
1521 | # CONFIG_NLS_ISO8859_2 is not set | ||
1522 | # CONFIG_NLS_ISO8859_3 is not set | ||
1523 | # CONFIG_NLS_ISO8859_4 is not set | ||
1524 | # CONFIG_NLS_ISO8859_5 is not set | ||
1525 | # CONFIG_NLS_ISO8859_6 is not set | ||
1526 | # CONFIG_NLS_ISO8859_7 is not set | ||
1527 | # CONFIG_NLS_ISO8859_9 is not set | ||
1528 | # CONFIG_NLS_ISO8859_13 is not set | ||
1529 | # CONFIG_NLS_ISO8859_14 is not set | ||
1530 | # CONFIG_NLS_ISO8859_15 is not set | ||
1531 | # CONFIG_NLS_KOI8_R is not set | ||
1532 | # CONFIG_NLS_KOI8_U is not set | ||
1533 | # CONFIG_NLS_UTF8 is not set | ||
1534 | # CONFIG_DLM is not set | ||
1535 | |||
1536 | # | ||
1537 | # Kernel hacking | ||
1538 | # | ||
1539 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
1540 | CONFIG_PRINTK_TIME=y | ||
1541 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
1542 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
1543 | CONFIG_FRAME_WARN=1024 | ||
1544 | CONFIG_MAGIC_SYSRQ=y | ||
1545 | # CONFIG_STRIP_ASM_SYMS is not set | ||
1546 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1547 | CONFIG_DEBUG_FS=y | ||
1548 | # CONFIG_HEADERS_CHECK is not set | ||
1549 | CONFIG_DEBUG_KERNEL=y | ||
1550 | CONFIG_DEBUG_SHIRQ=y | ||
1551 | CONFIG_DETECT_SOFTLOCKUP=y | ||
1552 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set | ||
1553 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | ||
1554 | CONFIG_DETECT_HUNG_TASK=y | ||
1555 | # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set | ||
1556 | CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 | ||
1557 | CONFIG_SCHED_DEBUG=y | ||
1558 | # CONFIG_SCHEDSTATS is not set | ||
1559 | # CONFIG_TIMER_STATS is not set | ||
1560 | # CONFIG_DEBUG_OBJECTS is not set | ||
1561 | # CONFIG_DEBUG_SLAB is not set | ||
1562 | CONFIG_DEBUG_PREEMPT=y | ||
1563 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
1564 | # CONFIG_RT_MUTEX_TESTER is not set | ||
1565 | # CONFIG_DEBUG_SPINLOCK is not set | ||
1566 | # CONFIG_DEBUG_MUTEXES is not set | ||
1567 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
1568 | # CONFIG_PROVE_LOCKING is not set | ||
1569 | # CONFIG_LOCK_STAT is not set | ||
1570 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
1571 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
1572 | CONFIG_STACKTRACE=y | ||
1573 | # CONFIG_DEBUG_KOBJECT is not set | ||
1574 | CONFIG_DEBUG_BUGVERBOSE=y | ||
1575 | # CONFIG_DEBUG_INFO is not set | ||
1576 | CONFIG_DEBUG_VM=y | ||
1577 | # CONFIG_DEBUG_WRITECOUNT is not set | ||
1578 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
1579 | # CONFIG_DEBUG_LIST is not set | ||
1580 | # CONFIG_DEBUG_SG is not set | ||
1581 | # CONFIG_DEBUG_NOTIFIERS is not set | ||
1582 | # CONFIG_DEBUG_CREDENTIALS is not set | ||
1583 | CONFIG_FRAME_POINTER=y | ||
1584 | # CONFIG_RCU_TORTURE_TEST is not set | ||
1585 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
1586 | # CONFIG_BACKTRACE_SELF_TEST is not set | ||
1587 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
1588 | # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set | ||
1589 | # CONFIG_FAULT_INJECTION is not set | ||
1590 | # CONFIG_LATENCYTOP is not set | ||
1591 | # CONFIG_SYSCTL_SYSCALL_CHECK is not set | ||
1592 | # CONFIG_PAGE_POISONING is not set | ||
1593 | CONFIG_NOP_TRACER=y | ||
1594 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
1595 | CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y | ||
1596 | CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y | ||
1597 | CONFIG_HAVE_DYNAMIC_FTRACE=y | ||
1598 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | ||
1599 | CONFIG_HAVE_SYSCALL_TRACEPOINTS=y | ||
1600 | CONFIG_RING_BUFFER=y | ||
1601 | CONFIG_EVENT_TRACING=y | ||
1602 | CONFIG_CONTEXT_SWITCH_TRACER=y | ||
1603 | CONFIG_TRACING=y | ||
1604 | CONFIG_TRACING_SUPPORT=y | ||
1605 | CONFIG_FTRACE=y | ||
1606 | # CONFIG_FUNCTION_TRACER is not set | ||
1607 | # CONFIG_IRQSOFF_TRACER is not set | ||
1608 | # CONFIG_PREEMPT_TRACER is not set | ||
1609 | # CONFIG_SCHED_TRACER is not set | ||
1610 | # CONFIG_ENABLE_DEFAULT_TRACERS is not set | ||
1611 | # CONFIG_FTRACE_SYSCALLS is not set | ||
1612 | # CONFIG_BOOT_TRACER is not set | ||
1613 | CONFIG_BRANCH_PROFILE_NONE=y | ||
1614 | # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set | ||
1615 | # CONFIG_PROFILE_ALL_BRANCHES is not set | ||
1616 | CONFIG_KSYM_TRACER=y | ||
1617 | # CONFIG_PROFILE_KSYM_TRACER is not set | ||
1618 | # CONFIG_STACK_TRACER is not set | ||
1619 | # CONFIG_KMEMTRACE is not set | ||
1620 | # CONFIG_WORKQUEUE_TRACER is not set | ||
1621 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
1622 | # CONFIG_RING_BUFFER_BENCHMARK is not set | ||
1623 | # CONFIG_DYNAMIC_DEBUG is not set | ||
1624 | # CONFIG_DMA_API_DEBUG is not set | ||
1625 | # CONFIG_SAMPLES is not set | ||
1626 | CONFIG_HAVE_ARCH_KGDB=y | ||
1627 | # CONFIG_KGDB is not set | ||
1628 | # CONFIG_SH_STANDARD_BIOS is not set | ||
1629 | # CONFIG_STACK_DEBUG is not set | ||
1630 | CONFIG_DEBUG_STACK_USAGE=y | ||
1631 | # CONFIG_4KSTACKS is not set | ||
1632 | CONFIG_DUMP_CODE=y | ||
1633 | CONFIG_DWARF_UNWINDER=y | ||
1634 | # CONFIG_SH_NO_BSS_INIT is not set | ||
1635 | |||
1636 | # | ||
1637 | # Security options | ||
1638 | # | ||
1639 | # CONFIG_KEYS is not set | ||
1640 | # CONFIG_SECURITY is not set | ||
1641 | # CONFIG_SECURITYFS is not set | ||
1642 | # CONFIG_DEFAULT_SECURITY_SELINUX is not set | ||
1643 | # CONFIG_DEFAULT_SECURITY_SMACK is not set | ||
1644 | # CONFIG_DEFAULT_SECURITY_TOMOYO is not set | ||
1645 | CONFIG_DEFAULT_SECURITY_DAC=y | ||
1646 | CONFIG_DEFAULT_SECURITY="" | ||
1647 | CONFIG_CRYPTO=y | ||
1648 | |||
1649 | # | ||
1650 | # Crypto core or helper | ||
1651 | # | ||
1652 | # CONFIG_CRYPTO_MANAGER is not set | ||
1653 | # CONFIG_CRYPTO_MANAGER2 is not set | ||
1654 | # CONFIG_CRYPTO_GF128MUL is not set | ||
1655 | # CONFIG_CRYPTO_NULL is not set | ||
1656 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1657 | # CONFIG_CRYPTO_AUTHENC is not set | ||
1658 | # CONFIG_CRYPTO_TEST is not set | ||
1659 | |||
1660 | # | ||
1661 | # Authenticated Encryption with Associated Data | ||
1662 | # | ||
1663 | # CONFIG_CRYPTO_CCM is not set | ||
1664 | # CONFIG_CRYPTO_GCM is not set | ||
1665 | # CONFIG_CRYPTO_SEQIV is not set | ||
1666 | |||
1667 | # | ||
1668 | # Block modes | ||
1669 | # | ||
1670 | # CONFIG_CRYPTO_CBC is not set | ||
1671 | # CONFIG_CRYPTO_CTR is not set | ||
1672 | # CONFIG_CRYPTO_CTS is not set | ||
1673 | # CONFIG_CRYPTO_ECB is not set | ||
1674 | # CONFIG_CRYPTO_LRW is not set | ||
1675 | # CONFIG_CRYPTO_PCBC is not set | ||
1676 | # CONFIG_CRYPTO_XTS is not set | ||
1677 | |||
1678 | # | ||
1679 | # Hash modes | ||
1680 | # | ||
1681 | # CONFIG_CRYPTO_HMAC is not set | ||
1682 | # CONFIG_CRYPTO_XCBC is not set | ||
1683 | # CONFIG_CRYPTO_VMAC is not set | ||
1684 | |||
1685 | # | ||
1686 | # Digest | ||
1687 | # | ||
1688 | # CONFIG_CRYPTO_CRC32C is not set | ||
1689 | # CONFIG_CRYPTO_GHASH is not set | ||
1690 | # CONFIG_CRYPTO_MD4 is not set | ||
1691 | # CONFIG_CRYPTO_MD5 is not set | ||
1692 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1693 | # CONFIG_CRYPTO_RMD128 is not set | ||
1694 | # CONFIG_CRYPTO_RMD160 is not set | ||
1695 | # CONFIG_CRYPTO_RMD256 is not set | ||
1696 | # CONFIG_CRYPTO_RMD320 is not set | ||
1697 | # CONFIG_CRYPTO_SHA1 is not set | ||
1698 | # CONFIG_CRYPTO_SHA256 is not set | ||
1699 | # CONFIG_CRYPTO_SHA512 is not set | ||
1700 | # CONFIG_CRYPTO_TGR192 is not set | ||
1701 | # CONFIG_CRYPTO_WP512 is not set | ||
1702 | |||
1703 | # | ||
1704 | # Ciphers | ||
1705 | # | ||
1706 | # CONFIG_CRYPTO_AES is not set | ||
1707 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1708 | # CONFIG_CRYPTO_ARC4 is not set | ||
1709 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1710 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1711 | # CONFIG_CRYPTO_CAST5 is not set | ||
1712 | # CONFIG_CRYPTO_CAST6 is not set | ||
1713 | # CONFIG_CRYPTO_DES is not set | ||
1714 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1715 | # CONFIG_CRYPTO_KHAZAD is not set | ||
1716 | # CONFIG_CRYPTO_SALSA20 is not set | ||
1717 | # CONFIG_CRYPTO_SEED is not set | ||
1718 | # CONFIG_CRYPTO_SERPENT is not set | ||
1719 | # CONFIG_CRYPTO_TEA is not set | ||
1720 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1721 | |||
1722 | # | ||
1723 | # Compression | ||
1724 | # | ||
1725 | # CONFIG_CRYPTO_DEFLATE is not set | ||
1726 | # CONFIG_CRYPTO_ZLIB is not set | ||
1727 | # CONFIG_CRYPTO_LZO is not set | ||
1728 | |||
1729 | # | ||
1730 | # Random Number Generation | ||
1731 | # | ||
1732 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
1733 | CONFIG_CRYPTO_HW=y | ||
1734 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set | ||
1735 | CONFIG_BINARY_PRINTF=y | ||
1736 | |||
1737 | # | ||
1738 | # Library routines | ||
1739 | # | ||
1740 | CONFIG_BITREVERSE=y | ||
1741 | CONFIG_GENERIC_FIND_LAST_BIT=y | ||
1742 | # CONFIG_CRC_CCITT is not set | ||
1743 | # CONFIG_CRC16 is not set | ||
1744 | # CONFIG_CRC_T10DIF is not set | ||
1745 | # CONFIG_CRC_ITU_T is not set | ||
1746 | CONFIG_CRC32=y | ||
1747 | # CONFIG_CRC7 is not set | ||
1748 | # CONFIG_LIBCRC32C is not set | ||
1749 | CONFIG_HAS_IOMEM=y | ||
1750 | CONFIG_HAS_IOPORT=y | ||
1751 | CONFIG_HAS_DMA=y | ||
1752 | CONFIG_HAVE_LMB=y | ||
1753 | CONFIG_NLATTR=y | ||
1754 | CONFIG_GENERIC_ATOMIC64=y | ||
diff --git a/arch/sh/drivers/dma/dma-pvr2.c b/arch/sh/drivers/dma/dma-pvr2.c index 391cbe1c2956..3cee58e7f1e5 100644 --- a/arch/sh/drivers/dma/dma-pvr2.c +++ b/arch/sh/drivers/dma/dma-pvr2.c | |||
@@ -40,10 +40,10 @@ static irqreturn_t pvr2_dma_interrupt(int irq, void *dev_id) | |||
40 | 40 | ||
41 | static int pvr2_request_dma(struct dma_channel *chan) | 41 | static int pvr2_request_dma(struct dma_channel *chan) |
42 | { | 42 | { |
43 | if (ctrl_inl(PVR2_DMA_MODE) != 0) | 43 | if (__raw_readl(PVR2_DMA_MODE) != 0) |
44 | return -EBUSY; | 44 | return -EBUSY; |
45 | 45 | ||
46 | ctrl_outl(0, PVR2_DMA_LMMODE0); | 46 | __raw_writel(0, PVR2_DMA_LMMODE0); |
47 | 47 | ||
48 | return 0; | 48 | return 0; |
49 | } | 49 | } |
@@ -60,9 +60,9 @@ static int pvr2_xfer_dma(struct dma_channel *chan) | |||
60 | 60 | ||
61 | xfer_complete = 0; | 61 | xfer_complete = 0; |
62 | 62 | ||
63 | ctrl_outl(chan->dar, PVR2_DMA_ADDR); | 63 | __raw_writel(chan->dar, PVR2_DMA_ADDR); |
64 | ctrl_outl(chan->count, PVR2_DMA_COUNT); | 64 | __raw_writel(chan->count, PVR2_DMA_COUNT); |
65 | ctrl_outl(chan->mode & DMA_MODE_MASK, PVR2_DMA_MODE); | 65 | __raw_writel(chan->mode & DMA_MODE_MASK, PVR2_DMA_MODE); |
66 | 66 | ||
67 | return 0; | 67 | return 0; |
68 | } | 68 | } |
diff --git a/arch/sh/drivers/dma/dma-sh.c b/arch/sh/drivers/dma/dma-sh.c index 37fb5b8bbc3f..827208781ed5 100644 --- a/arch/sh/drivers/dma/dma-sh.c +++ b/arch/sh/drivers/dma/dma-sh.c | |||
@@ -52,11 +52,14 @@ static inline unsigned int get_dmte_irq(unsigned int chan) | |||
52 | * | 52 | * |
53 | * iterations to complete the transfer. | 53 | * iterations to complete the transfer. |
54 | */ | 54 | */ |
55 | static unsigned int ts_shift[] = TS_SHIFT; | ||
55 | static inline unsigned int calc_xmit_shift(struct dma_channel *chan) | 56 | static inline unsigned int calc_xmit_shift(struct dma_channel *chan) |
56 | { | 57 | { |
57 | u32 chcr = ctrl_inl(dma_base_addr[chan->chan] + CHCR); | 58 | u32 chcr = __raw_readl(dma_base_addr[chan->chan] + CHCR); |
59 | int cnt = ((chcr & CHCR_TS_LOW_MASK) >> CHCR_TS_LOW_SHIFT) | | ||
60 | ((chcr & CHCR_TS_HIGH_MASK) >> CHCR_TS_HIGH_SHIFT); | ||
58 | 61 | ||
59 | return ts_shift[(chcr & CHCR_TS_MASK)>>CHCR_TS_SHIFT]; | 62 | return ts_shift[cnt]; |
60 | } | 63 | } |
61 | 64 | ||
62 | /* | 65 | /* |
@@ -70,13 +73,13 @@ static irqreturn_t dma_tei(int irq, void *dev_id) | |||
70 | struct dma_channel *chan = dev_id; | 73 | struct dma_channel *chan = dev_id; |
71 | u32 chcr; | 74 | u32 chcr; |
72 | 75 | ||
73 | chcr = ctrl_inl(dma_base_addr[chan->chan] + CHCR); | 76 | chcr = __raw_readl(dma_base_addr[chan->chan] + CHCR); |
74 | 77 | ||
75 | if (!(chcr & CHCR_TE)) | 78 | if (!(chcr & CHCR_TE)) |
76 | return IRQ_NONE; | 79 | return IRQ_NONE; |
77 | 80 | ||
78 | chcr &= ~(CHCR_IE | CHCR_DE); | 81 | chcr &= ~(CHCR_IE | CHCR_DE); |
79 | ctrl_outl(chcr, (dma_base_addr[chan->chan] + CHCR)); | 82 | __raw_writel(chcr, (dma_base_addr[chan->chan] + CHCR)); |
80 | 83 | ||
81 | wake_up(&chan->wait_queue); | 84 | wake_up(&chan->wait_queue); |
82 | 85 | ||
@@ -115,7 +118,7 @@ sh_dmac_configure_channel(struct dma_channel *chan, unsigned long chcr) | |||
115 | chan->flags &= ~DMA_TEI_CAPABLE; | 118 | chan->flags &= ~DMA_TEI_CAPABLE; |
116 | } | 119 | } |
117 | 120 | ||
118 | ctrl_outl(chcr, (dma_base_addr[chan->chan] + CHCR)); | 121 | __raw_writel(chcr, (dma_base_addr[chan->chan] + CHCR)); |
119 | 122 | ||
120 | chan->flags |= DMA_CONFIGURED; | 123 | chan->flags |= DMA_CONFIGURED; |
121 | return 0; | 124 | return 0; |
@@ -126,13 +129,13 @@ static void sh_dmac_enable_dma(struct dma_channel *chan) | |||
126 | int irq; | 129 | int irq; |
127 | u32 chcr; | 130 | u32 chcr; |
128 | 131 | ||
129 | chcr = ctrl_inl(dma_base_addr[chan->chan] + CHCR); | 132 | chcr = __raw_readl(dma_base_addr[chan->chan] + CHCR); |
130 | chcr |= CHCR_DE; | 133 | chcr |= CHCR_DE; |
131 | 134 | ||
132 | if (chan->flags & DMA_TEI_CAPABLE) | 135 | if (chan->flags & DMA_TEI_CAPABLE) |
133 | chcr |= CHCR_IE; | 136 | chcr |= CHCR_IE; |
134 | 137 | ||
135 | ctrl_outl(chcr, (dma_base_addr[chan->chan] + CHCR)); | 138 | __raw_writel(chcr, (dma_base_addr[chan->chan] + CHCR)); |
136 | 139 | ||
137 | if (chan->flags & DMA_TEI_CAPABLE) { | 140 | if (chan->flags & DMA_TEI_CAPABLE) { |
138 | irq = get_dmte_irq(chan->chan); | 141 | irq = get_dmte_irq(chan->chan); |
@@ -150,9 +153,9 @@ static void sh_dmac_disable_dma(struct dma_channel *chan) | |||
150 | disable_irq(irq); | 153 | disable_irq(irq); |
151 | } | 154 | } |
152 | 155 | ||
153 | chcr = ctrl_inl(dma_base_addr[chan->chan] + CHCR); | 156 | chcr = __raw_readl(dma_base_addr[chan->chan] + CHCR); |
154 | chcr &= ~(CHCR_DE | CHCR_TE | CHCR_IE); | 157 | chcr &= ~(CHCR_DE | CHCR_TE | CHCR_IE); |
155 | ctrl_outl(chcr, (dma_base_addr[chan->chan] + CHCR)); | 158 | __raw_writel(chcr, (dma_base_addr[chan->chan] + CHCR)); |
156 | } | 159 | } |
157 | 160 | ||
158 | static int sh_dmac_xfer_dma(struct dma_channel *chan) | 161 | static int sh_dmac_xfer_dma(struct dma_channel *chan) |
@@ -183,12 +186,12 @@ static int sh_dmac_xfer_dma(struct dma_channel *chan) | |||
183 | */ | 186 | */ |
184 | if (chan->sar || (mach_is_dreamcast() && | 187 | if (chan->sar || (mach_is_dreamcast() && |
185 | chan->chan == PVR2_CASCADE_CHAN)) | 188 | chan->chan == PVR2_CASCADE_CHAN)) |
186 | ctrl_outl(chan->sar, (dma_base_addr[chan->chan]+SAR)); | 189 | __raw_writel(chan->sar, (dma_base_addr[chan->chan]+SAR)); |
187 | if (chan->dar || (mach_is_dreamcast() && | 190 | if (chan->dar || (mach_is_dreamcast() && |
188 | chan->chan == PVR2_CASCADE_CHAN)) | 191 | chan->chan == PVR2_CASCADE_CHAN)) |
189 | ctrl_outl(chan->dar, (dma_base_addr[chan->chan] + DAR)); | 192 | __raw_writel(chan->dar, (dma_base_addr[chan->chan] + DAR)); |
190 | 193 | ||
191 | ctrl_outl(chan->count >> calc_xmit_shift(chan), | 194 | __raw_writel(chan->count >> calc_xmit_shift(chan), |
192 | (dma_base_addr[chan->chan] + TCR)); | 195 | (dma_base_addr[chan->chan] + TCR)); |
193 | 196 | ||
194 | sh_dmac_enable_dma(chan); | 197 | sh_dmac_enable_dma(chan); |
@@ -198,10 +201,10 @@ static int sh_dmac_xfer_dma(struct dma_channel *chan) | |||
198 | 201 | ||
199 | static int sh_dmac_get_dma_residue(struct dma_channel *chan) | 202 | static int sh_dmac_get_dma_residue(struct dma_channel *chan) |
200 | { | 203 | { |
201 | if (!(ctrl_inl(dma_base_addr[chan->chan] + CHCR) & CHCR_DE)) | 204 | if (!(__raw_readl(dma_base_addr[chan->chan] + CHCR) & CHCR_DE)) |
202 | return 0; | 205 | return 0; |
203 | 206 | ||
204 | return ctrl_inl(dma_base_addr[chan->chan] + TCR) | 207 | return __raw_readl(dma_base_addr[chan->chan] + TCR) |
205 | << calc_xmit_shift(chan); | 208 | << calc_xmit_shift(chan); |
206 | } | 209 | } |
207 | 210 | ||
diff --git a/arch/sh/drivers/dma/dmabrg.c b/arch/sh/drivers/dma/dmabrg.c index 5e22689c2fcf..72622e307613 100644 --- a/arch/sh/drivers/dma/dmabrg.c +++ b/arch/sh/drivers/dma/dmabrg.c | |||
@@ -86,8 +86,8 @@ static irqreturn_t dmabrg_irq(int irq, void *data) | |||
86 | unsigned long dcr; | 86 | unsigned long dcr; |
87 | unsigned int i; | 87 | unsigned int i; |
88 | 88 | ||
89 | dcr = ctrl_inl(DMABRGCR); | 89 | dcr = __raw_readl(DMABRGCR); |
90 | ctrl_outl(dcr & ~0x00ff0003, DMABRGCR); /* ack all */ | 90 | __raw_writel(dcr & ~0x00ff0003, DMABRGCR); /* ack all */ |
91 | dcr &= dcr >> 8; /* ignore masked */ | 91 | dcr &= dcr >> 8; /* ignore masked */ |
92 | 92 | ||
93 | /* USB stuff, get it out of the way first */ | 93 | /* USB stuff, get it out of the way first */ |
@@ -109,17 +109,17 @@ static irqreturn_t dmabrg_irq(int irq, void *data) | |||
109 | static void dmabrg_disable_irq(unsigned int dmairq) | 109 | static void dmabrg_disable_irq(unsigned int dmairq) |
110 | { | 110 | { |
111 | unsigned long dcr; | 111 | unsigned long dcr; |
112 | dcr = ctrl_inl(DMABRGCR); | 112 | dcr = __raw_readl(DMABRGCR); |
113 | dcr &= ~(1 << ((dmairq > 1) ? dmairq + 22 : dmairq + 8)); | 113 | dcr &= ~(1 << ((dmairq > 1) ? dmairq + 22 : dmairq + 8)); |
114 | ctrl_outl(dcr, DMABRGCR); | 114 | __raw_writel(dcr, DMABRGCR); |
115 | } | 115 | } |
116 | 116 | ||
117 | static void dmabrg_enable_irq(unsigned int dmairq) | 117 | static void dmabrg_enable_irq(unsigned int dmairq) |
118 | { | 118 | { |
119 | unsigned long dcr; | 119 | unsigned long dcr; |
120 | dcr = ctrl_inl(DMABRGCR); | 120 | dcr = __raw_readl(DMABRGCR); |
121 | dcr |= (1 << ((dmairq > 1) ? dmairq + 22 : dmairq + 8)); | 121 | dcr |= (1 << ((dmairq > 1) ? dmairq + 22 : dmairq + 8)); |
122 | ctrl_outl(dcr, DMABRGCR); | 122 | __raw_writel(dcr, DMABRGCR); |
123 | } | 123 | } |
124 | 124 | ||
125 | int dmabrg_request_irq(unsigned int dmairq, void(*handler)(void*), | 125 | int dmabrg_request_irq(unsigned int dmairq, void(*handler)(void*), |
@@ -165,13 +165,13 @@ static int __init dmabrg_init(void) | |||
165 | printk(KERN_INFO "DMABRG: DMAC ch0 not reserved!\n"); | 165 | printk(KERN_INFO "DMABRG: DMAC ch0 not reserved!\n"); |
166 | #endif | 166 | #endif |
167 | 167 | ||
168 | ctrl_outl(0, DMABRGCR); | 168 | __raw_writel(0, DMABRGCR); |
169 | ctrl_outl(0, DMACHCR0); | 169 | __raw_writel(0, DMACHCR0); |
170 | ctrl_outl(0x94000000, DMARSRA); /* enable DMABRG in DMAC 0 */ | 170 | __raw_writel(0x94000000, DMARSRA); /* enable DMABRG in DMAC 0 */ |
171 | 171 | ||
172 | /* enable DMABRG mode, enable the DMAC */ | 172 | /* enable DMABRG mode, enable the DMAC */ |
173 | or = ctrl_inl(DMAOR); | 173 | or = __raw_readl(DMAOR); |
174 | ctrl_outl(or | DMAOR_BRG | DMAOR_DMEN, DMAOR); | 174 | __raw_writel(or | DMAOR_BRG | DMAOR_DMEN, DMAOR); |
175 | 175 | ||
176 | ret = request_irq(DMABRGI0, dmabrg_irq, IRQF_DISABLED, | 176 | ret = request_irq(DMABRGI0, dmabrg_irq, IRQF_DISABLED, |
177 | "DMABRG USB address error", NULL); | 177 | "DMABRG USB address error", NULL); |
diff --git a/arch/sh/drivers/heartbeat.c b/arch/sh/drivers/heartbeat.c index a9339a6174fc..2acbc793032d 100644 --- a/arch/sh/drivers/heartbeat.c +++ b/arch/sh/drivers/heartbeat.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Generic heartbeat driver for regular LED banks | 2 | * Generic heartbeat driver for regular LED banks |
3 | * | 3 | * |
4 | * Copyright (C) 2007 Paul Mundt | 4 | * Copyright (C) 2007 - 2010 Paul Mundt |
5 | * | 5 | * |
6 | * Most SH reference boards include a number of individual LEDs that can | 6 | * Most SH reference boards include a number of individual LEDs that can |
7 | * be independently controlled (either via a pre-defined hardware | 7 | * be independently controlled (either via a pre-defined hardware |
@@ -27,7 +27,7 @@ | |||
27 | #include <asm/heartbeat.h> | 27 | #include <asm/heartbeat.h> |
28 | 28 | ||
29 | #define DRV_NAME "heartbeat" | 29 | #define DRV_NAME "heartbeat" |
30 | #define DRV_VERSION "0.1.1" | 30 | #define DRV_VERSION "0.1.2" |
31 | 31 | ||
32 | static unsigned char default_bit_pos[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; | 32 | static unsigned char default_bit_pos[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; |
33 | 33 | ||
@@ -98,7 +98,7 @@ static int heartbeat_drv_probe(struct platform_device *pdev) | |||
98 | return -ENOMEM; | 98 | return -ENOMEM; |
99 | } | 99 | } |
100 | 100 | ||
101 | hd->base = ioremap_nocache(res->start, res->end - res->start + 1); | 101 | hd->base = ioremap_nocache(res->start, resource_size(res)); |
102 | if (unlikely(!hd->base)) { | 102 | if (unlikely(!hd->base)) { |
103 | dev_err(&pdev->dev, "ioremap failed\n"); | 103 | dev_err(&pdev->dev, "ioremap failed\n"); |
104 | 104 | ||
@@ -117,8 +117,20 @@ static int heartbeat_drv_probe(struct platform_device *pdev) | |||
117 | for (i = 0; i < hd->nr_bits; i++) | 117 | for (i = 0; i < hd->nr_bits; i++) |
118 | hd->mask |= (1 << hd->bit_pos[i]); | 118 | hd->mask |= (1 << hd->bit_pos[i]); |
119 | 119 | ||
120 | if (!hd->regsize) | 120 | if (!hd->regsize) { |
121 | hd->regsize = 8; /* default access size */ | 121 | switch (res->flags & IORESOURCE_MEM_TYPE_MASK) { |
122 | case IORESOURCE_MEM_32BIT: | ||
123 | hd->regsize = 32; | ||
124 | break; | ||
125 | case IORESOURCE_MEM_16BIT: | ||
126 | hd->regsize = 16; | ||
127 | break; | ||
128 | case IORESOURCE_MEM_8BIT: | ||
129 | default: | ||
130 | hd->regsize = 8; | ||
131 | break; | ||
132 | } | ||
133 | } | ||
122 | 134 | ||
123 | setup_timer(&hd->timer, heartbeat_timer, (unsigned long)hd); | 135 | setup_timer(&hd->timer, heartbeat_timer, (unsigned long)hd); |
124 | platform_set_drvdata(pdev, hd); | 136 | platform_set_drvdata(pdev, hd); |
diff --git a/arch/sh/drivers/pci/Makefile b/arch/sh/drivers/pci/Makefile index 08af1f459756..4a59e6890876 100644 --- a/arch/sh/drivers/pci/Makefile +++ b/arch/sh/drivers/pci/Makefile | |||
@@ -1,14 +1,14 @@ | |||
1 | # | 1 | # |
2 | # Makefile for the PCI specific kernel interface routines under Linux. | 2 | # Makefile for the PCI specific kernel interface routines under Linux. |
3 | # | 3 | # |
4 | obj-y += pci.o | 4 | obj-y += common.o pci.o |
5 | 5 | ||
6 | obj-$(CONFIG_CPU_SUBTYPE_SH7751) += pci-sh7751.o ops-sh4.o | 6 | obj-$(CONFIG_CPU_SUBTYPE_SH7751) += pci-sh7751.o ops-sh4.o |
7 | obj-$(CONFIG_CPU_SUBTYPE_SH7751R) += pci-sh7751.o ops-sh4.o | 7 | obj-$(CONFIG_CPU_SUBTYPE_SH7751R) += pci-sh7751.o ops-sh4.o |
8 | obj-$(CONFIG_CPU_SUBTYPE_SH7763) += pci-sh7780.o ops-sh4.o | 8 | obj-$(CONFIG_CPU_SUBTYPE_SH7763) += pci-sh7780.o ops-sh4.o |
9 | obj-$(CONFIG_CPU_SUBTYPE_SH7780) += pci-sh7780.o ops-sh4.o | 9 | obj-$(CONFIG_CPU_SUBTYPE_SH7780) += pci-sh7780.o ops-sh4.o |
10 | obj-$(CONFIG_CPU_SUBTYPE_SH7785) += pci-sh7780.o ops-sh4.o | 10 | obj-$(CONFIG_CPU_SUBTYPE_SH7785) += pci-sh7780.o ops-sh4.o |
11 | obj-$(CONFIG_CPU_SUBTYPE_SH7786) += ops-sh7786.o | 11 | obj-$(CONFIG_CPU_SUBTYPE_SH7786) += pcie-sh7786.o ops-sh7786.o |
12 | obj-$(CONFIG_CPU_SH5) += pci-sh5.o ops-sh5.o | 12 | obj-$(CONFIG_CPU_SH5) += pci-sh5.o ops-sh5.o |
13 | 13 | ||
14 | obj-$(CONFIG_SH_DREAMCAST) += ops-dreamcast.o fixups-dreamcast.o \ | 14 | obj-$(CONFIG_SH_DREAMCAST) += ops-dreamcast.o fixups-dreamcast.o \ |
@@ -25,4 +25,3 @@ obj-$(CONFIG_SH_TITAN) += fixups-titan.o | |||
25 | obj-$(CONFIG_SH_LANDISK) += fixups-landisk.o | 25 | obj-$(CONFIG_SH_LANDISK) += fixups-landisk.o |
26 | obj-$(CONFIG_SH_LBOX_RE2) += fixups-rts7751r2d.o | 26 | obj-$(CONFIG_SH_LBOX_RE2) += fixups-rts7751r2d.o |
27 | obj-$(CONFIG_SH_CAYMAN) += fixups-cayman.o | 27 | obj-$(CONFIG_SH_CAYMAN) += fixups-cayman.o |
28 | obj-$(CONFIG_SH_URQUELL) += pcie-sh7786.o | ||
diff --git a/arch/sh/drivers/pci/common.c b/arch/sh/drivers/pci/common.c new file mode 100644 index 000000000000..dbf138199871 --- /dev/null +++ b/arch/sh/drivers/pci/common.c | |||
@@ -0,0 +1,162 @@ | |||
1 | #include <linux/pci.h> | ||
2 | #include <linux/interrupt.h> | ||
3 | #include <linux/timer.h> | ||
4 | #include <linux/kernel.h> | ||
5 | |||
6 | /* | ||
7 | * These functions are used early on before PCI scanning is done | ||
8 | * and all of the pci_dev and pci_bus structures have been created. | ||
9 | */ | ||
10 | static struct pci_dev *fake_pci_dev(struct pci_channel *hose, | ||
11 | int top_bus, int busnr, int devfn) | ||
12 | { | ||
13 | static struct pci_dev dev; | ||
14 | static struct pci_bus bus; | ||
15 | |||
16 | dev.bus = &bus; | ||
17 | dev.sysdata = hose; | ||
18 | dev.devfn = devfn; | ||
19 | bus.number = busnr; | ||
20 | bus.sysdata = hose; | ||
21 | bus.ops = hose->pci_ops; | ||
22 | |||
23 | if(busnr != top_bus) | ||
24 | /* Fake a parent bus structure. */ | ||
25 | bus.parent = &bus; | ||
26 | else | ||
27 | bus.parent = NULL; | ||
28 | |||
29 | return &dev; | ||
30 | } | ||
31 | |||
32 | #define EARLY_PCI_OP(rw, size, type) \ | ||
33 | int __init early_##rw##_config_##size(struct pci_channel *hose, \ | ||
34 | int top_bus, int bus, int devfn, int offset, type value) \ | ||
35 | { \ | ||
36 | return pci_##rw##_config_##size( \ | ||
37 | fake_pci_dev(hose, top_bus, bus, devfn), \ | ||
38 | offset, value); \ | ||
39 | } | ||
40 | |||
41 | EARLY_PCI_OP(read, byte, u8 *) | ||
42 | EARLY_PCI_OP(read, word, u16 *) | ||
43 | EARLY_PCI_OP(read, dword, u32 *) | ||
44 | EARLY_PCI_OP(write, byte, u8) | ||
45 | EARLY_PCI_OP(write, word, u16) | ||
46 | EARLY_PCI_OP(write, dword, u32) | ||
47 | |||
48 | int __init pci_is_66mhz_capable(struct pci_channel *hose, | ||
49 | int top_bus, int current_bus) | ||
50 | { | ||
51 | u32 pci_devfn; | ||
52 | unsigned short vid; | ||
53 | int cap66 = -1; | ||
54 | u16 stat; | ||
55 | |||
56 | printk(KERN_INFO "PCI: Checking 66MHz capabilities...\n"); | ||
57 | |||
58 | for (pci_devfn = 0; pci_devfn < 0xff; pci_devfn++) { | ||
59 | if (PCI_FUNC(pci_devfn)) | ||
60 | continue; | ||
61 | if (early_read_config_word(hose, top_bus, current_bus, | ||
62 | pci_devfn, PCI_VENDOR_ID, &vid) != | ||
63 | PCIBIOS_SUCCESSFUL) | ||
64 | continue; | ||
65 | if (vid == 0xffff) | ||
66 | continue; | ||
67 | |||
68 | /* check 66MHz capability */ | ||
69 | if (cap66 < 0) | ||
70 | cap66 = 1; | ||
71 | if (cap66) { | ||
72 | early_read_config_word(hose, top_bus, current_bus, | ||
73 | pci_devfn, PCI_STATUS, &stat); | ||
74 | if (!(stat & PCI_STATUS_66MHZ)) { | ||
75 | printk(KERN_DEBUG | ||
76 | "PCI: %02x:%02x not 66MHz capable.\n", | ||
77 | current_bus, pci_devfn); | ||
78 | cap66 = 0; | ||
79 | break; | ||
80 | } | ||
81 | } | ||
82 | } | ||
83 | |||
84 | return cap66 > 0; | ||
85 | } | ||
86 | |||
87 | static void pcibios_enable_err(unsigned long __data) | ||
88 | { | ||
89 | struct pci_channel *hose = (struct pci_channel *)__data; | ||
90 | |||
91 | del_timer(&hose->err_timer); | ||
92 | printk(KERN_DEBUG "PCI: re-enabling error IRQ.\n"); | ||
93 | enable_irq(hose->err_irq); | ||
94 | } | ||
95 | |||
96 | static void pcibios_enable_serr(unsigned long __data) | ||
97 | { | ||
98 | struct pci_channel *hose = (struct pci_channel *)__data; | ||
99 | |||
100 | del_timer(&hose->serr_timer); | ||
101 | printk(KERN_DEBUG "PCI: re-enabling system error IRQ.\n"); | ||
102 | enable_irq(hose->serr_irq); | ||
103 | } | ||
104 | |||
105 | void pcibios_enable_timers(struct pci_channel *hose) | ||
106 | { | ||
107 | if (hose->err_irq) { | ||
108 | init_timer(&hose->err_timer); | ||
109 | hose->err_timer.data = (unsigned long)hose; | ||
110 | hose->err_timer.function = pcibios_enable_err; | ||
111 | } | ||
112 | |||
113 | if (hose->serr_irq) { | ||
114 | init_timer(&hose->serr_timer); | ||
115 | hose->serr_timer.data = (unsigned long)hose; | ||
116 | hose->serr_timer.function = pcibios_enable_serr; | ||
117 | } | ||
118 | } | ||
119 | |||
120 | /* | ||
121 | * A simple handler for the regular PCI status errors, called from IRQ | ||
122 | * context. | ||
123 | */ | ||
124 | unsigned int pcibios_handle_status_errors(unsigned long addr, | ||
125 | unsigned int status, | ||
126 | struct pci_channel *hose) | ||
127 | { | ||
128 | unsigned int cmd = 0; | ||
129 | |||
130 | if (status & PCI_STATUS_REC_MASTER_ABORT) { | ||
131 | printk(KERN_DEBUG "PCI: master abort, pc=0x%08lx\n", addr); | ||
132 | cmd |= PCI_STATUS_REC_MASTER_ABORT; | ||
133 | } | ||
134 | |||
135 | if (status & PCI_STATUS_REC_TARGET_ABORT) { | ||
136 | printk(KERN_DEBUG "PCI: target abort: "); | ||
137 | pcibios_report_status(PCI_STATUS_REC_TARGET_ABORT | | ||
138 | PCI_STATUS_SIG_TARGET_ABORT | | ||
139 | PCI_STATUS_REC_MASTER_ABORT, 1); | ||
140 | printk("\n"); | ||
141 | |||
142 | cmd |= PCI_STATUS_REC_TARGET_ABORT; | ||
143 | } | ||
144 | |||
145 | if (status & (PCI_STATUS_PARITY | PCI_STATUS_DETECTED_PARITY)) { | ||
146 | printk(KERN_DEBUG "PCI: parity error detected: "); | ||
147 | pcibios_report_status(PCI_STATUS_PARITY | | ||
148 | PCI_STATUS_DETECTED_PARITY, 1); | ||
149 | printk("\n"); | ||
150 | |||
151 | cmd |= PCI_STATUS_PARITY | PCI_STATUS_DETECTED_PARITY; | ||
152 | |||
153 | /* Now back off of the IRQ for awhile */ | ||
154 | if (hose->err_irq) { | ||
155 | disable_irq_nosync(hose->err_irq); | ||
156 | hose->err_timer.expires = jiffies + HZ; | ||
157 | add_timer(&hose->err_timer); | ||
158 | } | ||
159 | } | ||
160 | |||
161 | return cmd; | ||
162 | } | ||
diff --git a/arch/sh/drivers/pci/fixups-dreamcast.c b/arch/sh/drivers/pci/fixups-dreamcast.c index ed7f489936f1..942ef4f155f5 100644 --- a/arch/sh/drivers/pci/fixups-dreamcast.c +++ b/arch/sh/drivers/pci/fixups-dreamcast.c | |||
@@ -39,7 +39,7 @@ static void __init gapspci_fixup_resources(struct pci_dev *dev) | |||
39 | /* | 39 | /* |
40 | * We also assume that dev->devfn == 0 | 40 | * We also assume that dev->devfn == 0 |
41 | */ | 41 | */ |
42 | dev->resource[1].start = p->io_resource->start + 0x100; | 42 | dev->resource[1].start = p->resources[0].start + 0x100; |
43 | dev->resource[1].end = dev->resource[1].start + 0x200 - 1; | 43 | dev->resource[1].end = dev->resource[1].start + 0x200 - 1; |
44 | 44 | ||
45 | /* | 45 | /* |
diff --git a/arch/sh/drivers/pci/fixups-r7780rp.c b/arch/sh/drivers/pci/fixups-r7780rp.c index 15ca65cb667e..08b2d8658a00 100644 --- a/arch/sh/drivers/pci/fixups-r7780rp.c +++ b/arch/sh/drivers/pci/fixups-r7780rp.c | |||
@@ -22,15 +22,3 @@ int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin) | |||
22 | { | 22 | { |
23 | return irq_tab[slot]; | 23 | return irq_tab[slot]; |
24 | } | 24 | } |
25 | |||
26 | int pci_fixup_pcic(struct pci_channel *chan) | ||
27 | { | ||
28 | pci_write_reg(chan, 0x000043ff, SH4_PCIINTM); | ||
29 | pci_write_reg(chan, 0x00000000, SH7780_PCIIBAR); | ||
30 | pci_write_reg(chan, 0x08000000, SH7780_PCICSCR0); | ||
31 | pci_write_reg(chan, 0x0000001b, SH7780_PCICSAR0); | ||
32 | pci_write_reg(chan, 0xfd000000, SH7780_PCICSCR1); | ||
33 | pci_write_reg(chan, 0x0000000f, SH7780_PCICSAR1); | ||
34 | |||
35 | return 0; | ||
36 | } | ||
diff --git a/arch/sh/drivers/pci/fixups-rts7751r2d.c b/arch/sh/drivers/pci/fixups-rts7751r2d.c index 7898f14d6641..e248516118a9 100644 --- a/arch/sh/drivers/pci/fixups-rts7751r2d.c +++ b/arch/sh/drivers/pci/fixups-rts7751r2d.c | |||
@@ -43,7 +43,7 @@ int pci_fixup_pcic(struct pci_channel *chan) | |||
43 | { | 43 | { |
44 | unsigned long bcr1, mcr; | 44 | unsigned long bcr1, mcr; |
45 | 45 | ||
46 | bcr1 = ctrl_inl(SH7751_BCR1); | 46 | bcr1 = __raw_readl(SH7751_BCR1); |
47 | bcr1 |= 0x40080000; /* Enable Bit 19 BREQEN, set PCIC to slave */ | 47 | bcr1 |= 0x40080000; /* Enable Bit 19 BREQEN, set PCIC to slave */ |
48 | pci_write_reg(chan, bcr1, SH4_PCIBCR1); | 48 | pci_write_reg(chan, bcr1, SH4_PCIBCR1); |
49 | 49 | ||
@@ -54,7 +54,7 @@ int pci_fixup_pcic(struct pci_channel *chan) | |||
54 | pci_write_reg(chan, 0xfb900047, SH7751_PCICONF1); | 54 | pci_write_reg(chan, 0xfb900047, SH7751_PCICONF1); |
55 | pci_write_reg(chan, 0xab000001, SH7751_PCICONF4); | 55 | pci_write_reg(chan, 0xab000001, SH7751_PCICONF4); |
56 | 56 | ||
57 | mcr = ctrl_inl(SH7751_MCR); | 57 | mcr = __raw_readl(SH7751_MCR); |
58 | mcr = (mcr & PCIMCR_MRSET_OFF) & PCIMCR_RFSH_OFF; | 58 | mcr = (mcr & PCIMCR_MRSET_OFF) & PCIMCR_RFSH_OFF; |
59 | pci_write_reg(chan, mcr, SH4_PCIMCR); | 59 | pci_write_reg(chan, mcr, SH4_PCIMCR); |
60 | 60 | ||
diff --git a/arch/sh/drivers/pci/fixups-sdk7780.c b/arch/sh/drivers/pci/fixups-sdk7780.c index 250b0edd7365..0930f988ac29 100644 --- a/arch/sh/drivers/pci/fixups-sdk7780.c +++ b/arch/sh/drivers/pci/fixups-sdk7780.c | |||
@@ -31,22 +31,3 @@ int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin) | |||
31 | { | 31 | { |
32 | return sdk7780_irq_tab[pin-1][slot]; | 32 | return sdk7780_irq_tab[pin-1][slot]; |
33 | } | 33 | } |
34 | int pci_fixup_pcic(struct pci_channel *chan) | ||
35 | { | ||
36 | /* Enable all interrupts, so we know what to fix */ | ||
37 | pci_write_reg(chan, 0x0000C3FF, SH7780_PCIIMR); | ||
38 | |||
39 | /* Set up standard PCI config registers */ | ||
40 | pci_write_reg(chan, 0x08000000, SH7780_PCIMBAR0); /* PCI */ | ||
41 | pci_write_reg(chan, 0x08000000, SH4_PCILAR0); /* SHwy */ | ||
42 | pci_write_reg(chan, 0x07F00001, SH4_PCILSR0); /* size 128M w/ MBAR */ | ||
43 | |||
44 | pci_write_reg(chan, 0x00000000, SH7780_PCIMBAR1); | ||
45 | pci_write_reg(chan, 0x00000000, SH4_PCILAR1); | ||
46 | pci_write_reg(chan, 0x00000000, SH4_PCILSR1); | ||
47 | |||
48 | pci_write_reg(chan, 0xAB000801, SH7780_PCIIBAR); | ||
49 | pci_write_reg(chan, 0xA5000C01, SH4_PCICR); | ||
50 | |||
51 | return 0; | ||
52 | } | ||
diff --git a/arch/sh/drivers/pci/fixups-se7751.c b/arch/sh/drivers/pci/fixups-se7751.c index 475fa9f0fe2c..a4c7d3a4efca 100644 --- a/arch/sh/drivers/pci/fixups-se7751.c +++ b/arch/sh/drivers/pci/fixups-se7751.c | |||
@@ -97,12 +97,12 @@ int pci_fixup_pcic(struct pci_channel *chan) | |||
97 | * meaning all calls go straight through... use BUG_ON to | 97 | * meaning all calls go straight through... use BUG_ON to |
98 | * catch erroneous assumption. | 98 | * catch erroneous assumption. |
99 | */ | 99 | */ |
100 | BUG_ON(chan->mem_resource->start != SH7751_PCI_MEMORY_BASE); | 100 | BUG_ON(chan->resources[1].start != SH7751_PCI_MEMORY_BASE); |
101 | 101 | ||
102 | PCIC_WRITE(SH7751_PCIMBR, chan->mem_resource->start); | 102 | PCIC_WRITE(SH7751_PCIMBR, chan->resources[1].start); |
103 | 103 | ||
104 | /* Set IOBR for window containing area specified in pci.h */ | 104 | /* Set IOBR for window containing area specified in pci.h */ |
105 | PCIC_WRITE(SH7751_PCIIOBR, (chan->io_resource->start & SH7751_PCIIOBR_MASK)); | 105 | PCIC_WRITE(SH7751_PCIIOBR, (chan->resources[0].start & SH7751_PCIIOBR_MASK)); |
106 | 106 | ||
107 | /* All done, may as well say so... */ | 107 | /* All done, may as well say so... */ |
108 | printk("SH7751 PCI: Finished initialization of the PCI controller\n"); | 108 | printk("SH7751 PCI: Finished initialization of the PCI controller\n"); |
diff --git a/arch/sh/drivers/pci/ops-sh4.c b/arch/sh/drivers/pci/ops-sh4.c index 78bebebdc99c..0b81999fb88b 100644 --- a/arch/sh/drivers/pci/ops-sh4.c +++ b/arch/sh/drivers/pci/ops-sh4.c | |||
@@ -16,7 +16,7 @@ | |||
16 | * Direct access to PCI hardware... | 16 | * Direct access to PCI hardware... |
17 | */ | 17 | */ |
18 | #define CONFIG_CMD(bus, devfn, where) \ | 18 | #define CONFIG_CMD(bus, devfn, where) \ |
19 | (P1SEG | (bus->number << 16) | (devfn << 8) | (where & ~3)) | 19 | (0x80000000 | (bus->number << 16) | (devfn << 8) | (where & ~3)) |
20 | 20 | ||
21 | static DEFINE_SPINLOCK(sh4_pci_lock); | 21 | static DEFINE_SPINLOCK(sh4_pci_lock); |
22 | 22 | ||
@@ -102,34 +102,6 @@ struct pci_ops sh4_pci_ops = { | |||
102 | .write = sh4_pci_write, | 102 | .write = sh4_pci_write, |
103 | }; | 103 | }; |
104 | 104 | ||
105 | /* | ||
106 | * Not really related to pci_ops, but it's common and not worth shoving | ||
107 | * somewhere else for now.. | ||
108 | */ | ||
109 | int __init sh4_pci_check_direct(struct pci_channel *chan) | ||
110 | { | ||
111 | /* | ||
112 | * Check if configuration works. | ||
113 | */ | ||
114 | unsigned int tmp = pci_read_reg(chan, SH4_PCIPAR); | ||
115 | |||
116 | pci_write_reg(chan, P1SEG, SH4_PCIPAR); | ||
117 | |||
118 | if (pci_read_reg(chan, SH4_PCIPAR) == P1SEG) { | ||
119 | pci_write_reg(chan, tmp, SH4_PCIPAR); | ||
120 | printk(KERN_INFO "PCI: Using configuration type 1\n"); | ||
121 | request_region(chan->reg_base + SH4_PCIPAR, 8, | ||
122 | "PCI conf1"); | ||
123 | return 0; | ||
124 | } | ||
125 | |||
126 | pci_write_reg(chan, tmp, SH4_PCIPAR); | ||
127 | |||
128 | printk(KERN_ERR "PCI: %s failed\n", __func__); | ||
129 | |||
130 | return -EINVAL; | ||
131 | } | ||
132 | |||
133 | int __attribute__((weak)) pci_fixup_pcic(struct pci_channel *chan) | 105 | int __attribute__((weak)) pci_fixup_pcic(struct pci_channel *chan) |
134 | { | 106 | { |
135 | /* Nothing to do. */ | 107 | /* Nothing to do. */ |
diff --git a/arch/sh/drivers/pci/pci-dreamcast.c b/arch/sh/drivers/pci/pci-dreamcast.c index 210f9d4af141..633694193af8 100644 --- a/arch/sh/drivers/pci/pci-dreamcast.c +++ b/arch/sh/drivers/pci/pci-dreamcast.c | |||
@@ -25,25 +25,25 @@ | |||
25 | #include <asm/irq.h> | 25 | #include <asm/irq.h> |
26 | #include <mach/pci.h> | 26 | #include <mach/pci.h> |
27 | 27 | ||
28 | static struct resource gapspci_io_resource = { | 28 | static struct resource gapspci_resources[] = { |
29 | .name = "GAPSPCI IO", | 29 | { |
30 | .start = GAPSPCI_BBA_CONFIG, | 30 | .name = "GAPSPCI IO", |
31 | .end = GAPSPCI_BBA_CONFIG + GAPSPCI_BBA_CONFIG_SIZE - 1, | 31 | .start = GAPSPCI_BBA_CONFIG, |
32 | .flags = IORESOURCE_IO, | 32 | .end = GAPSPCI_BBA_CONFIG + GAPSPCI_BBA_CONFIG_SIZE - 1, |
33 | }; | 33 | .flags = IORESOURCE_IO, |
34 | 34 | }, { | |
35 | static struct resource gapspci_mem_resource = { | 35 | .name = "GAPSPCI mem", |
36 | .name = "GAPSPCI mem", | 36 | .start = GAPSPCI_DMA_BASE, |
37 | .start = GAPSPCI_DMA_BASE, | 37 | .end = GAPSPCI_DMA_BASE + GAPSPCI_DMA_SIZE - 1, |
38 | .end = GAPSPCI_DMA_BASE + GAPSPCI_DMA_SIZE - 1, | 38 | .flags = IORESOURCE_MEM, |
39 | .flags = IORESOURCE_MEM, | 39 | }, |
40 | }; | 40 | }; |
41 | 41 | ||
42 | static struct pci_channel dreamcast_pci_controller = { | 42 | static struct pci_channel dreamcast_pci_controller = { |
43 | .pci_ops = &gapspci_pci_ops, | 43 | .pci_ops = &gapspci_pci_ops, |
44 | .io_resource = &gapspci_io_resource, | 44 | .resources = gapspci_resources, |
45 | .nr_resources = ARRAY_SIZE(gapspci_resources), | ||
45 | .io_offset = 0x00000000, | 46 | .io_offset = 0x00000000, |
46 | .mem_resource = &gapspci_mem_resource, | ||
47 | .mem_offset = 0x00000000, | 47 | .mem_offset = 0x00000000, |
48 | }; | 48 | }; |
49 | 49 | ||
@@ -95,8 +95,6 @@ static int __init gapspci_init(void) | |||
95 | outl(0x00002001, GAPSPCI_BBA_CONFIG+0x10); | 95 | outl(0x00002001, GAPSPCI_BBA_CONFIG+0x10); |
96 | outl(0x01000000, GAPSPCI_BBA_CONFIG+0x14); | 96 | outl(0x01000000, GAPSPCI_BBA_CONFIG+0x14); |
97 | 97 | ||
98 | register_pci_controller(&dreamcast_pci_controller); | 98 | return register_pci_controller(&dreamcast_pci_controller); |
99 | |||
100 | return 0; | ||
101 | } | 99 | } |
102 | arch_initcall(gapspci_init); | 100 | arch_initcall(gapspci_init); |
diff --git a/arch/sh/drivers/pci/pci-sh4.h b/arch/sh/drivers/pci/pci-sh4.h index 3d5296cde622..cbf763b3015e 100644 --- a/arch/sh/drivers/pci/pci-sh4.h +++ b/arch/sh/drivers/pci/pci-sh4.h | |||
@@ -49,6 +49,17 @@ | |||
49 | #define SH4_PCIINT_MWPD 0x00000002 /* Master Write PERR Detect */ | 49 | #define SH4_PCIINT_MWPD 0x00000002 /* Master Write PERR Detect */ |
50 | #define SH4_PCIINT_MRPD 0x00000001 /* Master Read PERR Detect */ | 50 | #define SH4_PCIINT_MRPD 0x00000001 /* Master Read PERR Detect */ |
51 | #define SH4_PCIINTM 0x118 /* PCI Interrupt Mask */ | 51 | #define SH4_PCIINTM 0x118 /* PCI Interrupt Mask */ |
52 | #define SH4_PCIINTM_TTADIM BIT(14) /* Target-target abort interrupt */ | ||
53 | #define SH4_PCIINTM_TMTOIM BIT(9) /* Target retry timeout */ | ||
54 | #define SH4_PCIINTM_MDEIM BIT(8) /* Master function disable error */ | ||
55 | #define SH4_PCIINTM_APEDIM BIT(7) /* Address parity error detection */ | ||
56 | #define SH4_PCIINTM_SDIM BIT(6) /* SERR detection */ | ||
57 | #define SH4_PCIINTM_DPEITWM BIT(5) /* Data parity error for target write */ | ||
58 | #define SH4_PCIINTM_PEDITRM BIT(4) /* PERR detection for target read */ | ||
59 | #define SH4_PCIINTM_TADIMM BIT(3) /* Target abort for master */ | ||
60 | #define SH4_PCIINTM_MADIMM BIT(2) /* Master abort for master */ | ||
61 | #define SH4_PCIINTM_MWPDIM BIT(1) /* Master write data parity error */ | ||
62 | #define SH4_PCIINTM_MRDPEIM BIT(0) /* Master read data parity error */ | ||
52 | #define SH4_PCIALR 0x11C /* Error Address Register */ | 63 | #define SH4_PCIALR 0x11C /* Error Address Register */ |
53 | #define SH4_PCICLR 0x120 /* Error Command/Data */ | 64 | #define SH4_PCICLR 0x120 /* Error Command/Data */ |
54 | #define SH4_PCICLR_MPIO 0x80000000 | 65 | #define SH4_PCICLR_MPIO 0x80000000 |
@@ -61,7 +72,7 @@ | |||
61 | #define SH4_PCIAINT 0x130 /* Arbiter Interrupt Register */ | 72 | #define SH4_PCIAINT 0x130 /* Arbiter Interrupt Register */ |
62 | #define SH4_PCIAINT_MBKN 0x00002000 /* Master Broken Interrupt */ | 73 | #define SH4_PCIAINT_MBKN 0x00002000 /* Master Broken Interrupt */ |
63 | #define SH4_PCIAINT_TBTO 0x00001000 /* Target Bus Time Out */ | 74 | #define SH4_PCIAINT_TBTO 0x00001000 /* Target Bus Time Out */ |
64 | #define SH4_PCIAINT_MBTO 0x00001000 /* Master Bus Time Out */ | 75 | #define SH4_PCIAINT_MBTO 0x00000800 /* Master Bus Time Out */ |
65 | #define SH4_PCIAINT_TABT 0x00000008 /* Target Abort */ | 76 | #define SH4_PCIAINT_TABT 0x00000008 /* Target Abort */ |
66 | #define SH4_PCIAINT_MABT 0x00000004 /* Master Abort */ | 77 | #define SH4_PCIAINT_MABT 0x00000004 /* Master Abort */ |
67 | #define SH4_PCIAINT_RDPE 0x00000002 /* Read Data Parity Error */ | 78 | #define SH4_PCIAINT_RDPE 0x00000002 /* Read Data Parity Error */ |
@@ -151,7 +162,6 @@ | |||
151 | 162 | ||
152 | /* arch/sh/kernel/drivers/pci/ops-sh4.c */ | 163 | /* arch/sh/kernel/drivers/pci/ops-sh4.c */ |
153 | extern struct pci_ops sh4_pci_ops; | 164 | extern struct pci_ops sh4_pci_ops; |
154 | int sh4_pci_check_direct(struct pci_channel *chan); | ||
155 | int pci_fixup_pcic(struct pci_channel *chan); | 165 | int pci_fixup_pcic(struct pci_channel *chan); |
156 | 166 | ||
157 | struct sh4_pci_address_space { | 167 | struct sh4_pci_address_space { |
@@ -167,13 +177,13 @@ struct sh4_pci_address_map { | |||
167 | static inline void pci_write_reg(struct pci_channel *chan, | 177 | static inline void pci_write_reg(struct pci_channel *chan, |
168 | unsigned long val, unsigned long reg) | 178 | unsigned long val, unsigned long reg) |
169 | { | 179 | { |
170 | ctrl_outl(val, chan->reg_base + reg); | 180 | __raw_writel(val, chan->reg_base + reg); |
171 | } | 181 | } |
172 | 182 | ||
173 | static inline unsigned long pci_read_reg(struct pci_channel *chan, | 183 | static inline unsigned long pci_read_reg(struct pci_channel *chan, |
174 | unsigned long reg) | 184 | unsigned long reg) |
175 | { | 185 | { |
176 | return ctrl_inl(chan->reg_base + reg); | 186 | return __raw_readl(chan->reg_base + reg); |
177 | } | 187 | } |
178 | 188 | ||
179 | #endif /* __PCI_SH4_H */ | 189 | #endif /* __PCI_SH4_H */ |
diff --git a/arch/sh/drivers/pci/pci-sh5.c b/arch/sh/drivers/pci/pci-sh5.c index 873ed2b44055..0bf296c78795 100644 --- a/arch/sh/drivers/pci/pci-sh5.c +++ b/arch/sh/drivers/pci/pci-sh5.c | |||
@@ -89,14 +89,13 @@ static irqreturn_t pcish5_serr_irq(int irq, void *dev_id) | |||
89 | return IRQ_NONE; | 89 | return IRQ_NONE; |
90 | } | 90 | } |
91 | 91 | ||
92 | static struct resource sh5_io_resource = { /* place holder */ }; | 92 | static struct resource sh5_pci_resources[2]; |
93 | static struct resource sh5_mem_resource = { /* place holder */ }; | ||
94 | 93 | ||
95 | static struct pci_channel sh5pci_controller = { | 94 | static struct pci_channel sh5pci_controller = { |
96 | .pci_ops = &sh5_pci_ops, | 95 | .pci_ops = &sh5_pci_ops, |
97 | .mem_resource = &sh5_mem_resource, | 96 | .resources = sh5_pci_resources, |
97 | .nr_resources = ARRAY_SIZE(sh5_pci_resources), | ||
98 | .mem_offset = 0x00000000, | 98 | .mem_offset = 0x00000000, |
99 | .io_resource = &sh5_io_resource, | ||
100 | .io_offset = 0x00000000, | 99 | .io_offset = 0x00000000, |
101 | }; | 100 | }; |
102 | 101 | ||
@@ -210,14 +209,12 @@ static int __init sh5pci_init(void) | |||
210 | SH5PCI_WRITE(AINTM, ~0); | 209 | SH5PCI_WRITE(AINTM, ~0); |
211 | SH5PCI_WRITE(PINTM, ~0); | 210 | SH5PCI_WRITE(PINTM, ~0); |
212 | 211 | ||
213 | sh5_io_resource.start = PCI_IO_AREA; | 212 | sh5_pci_resources[0].start = PCI_IO_AREA; |
214 | sh5_io_resource.end = PCI_IO_AREA + 0x10000; | 213 | sh5_pci_resources[0].end = PCI_IO_AREA + 0x10000; |
215 | 214 | ||
216 | sh5_mem_resource.start = memStart; | 215 | sh5_pci_resources[1].start = memStart; |
217 | sh5_mem_resource.end = memStart + memSize; | 216 | sh5_pci_resources[1].end = memStart + memSize; |
218 | 217 | ||
219 | register_pci_controller(&sh5pci_controller); | 218 | return register_pci_controller(&sh5pci_controller); |
220 | |||
221 | return 0; | ||
222 | } | 219 | } |
223 | arch_initcall(sh5pci_init); | 220 | arch_initcall(sh5pci_init); |
diff --git a/arch/sh/drivers/pci/pci-sh5.h b/arch/sh/drivers/pci/pci-sh5.h index f277628221f3..3f01decb4307 100644 --- a/arch/sh/drivers/pci/pci-sh5.h +++ b/arch/sh/drivers/pci/pci-sh5.h | |||
@@ -86,14 +86,14 @@ extern unsigned long pcicr_virt; | |||
86 | /* #define PCISH5_VCR_REG(x) ( SH5PCI_VCR_BASE (PCISH5_VCR_##x)) */ | 86 | /* #define PCISH5_VCR_REG(x) ( SH5PCI_VCR_BASE (PCISH5_VCR_##x)) */ |
87 | 87 | ||
88 | /* Write I/O functions */ | 88 | /* Write I/O functions */ |
89 | #define SH5PCI_WRITE(reg,val) ctrl_outl((u32)(val),PCISH5_ICR_REG(reg)) | 89 | #define SH5PCI_WRITE(reg,val) __raw_writel((u32)(val),PCISH5_ICR_REG(reg)) |
90 | #define SH5PCI_WRITE_SHORT(reg,val) ctrl_outw((u16)(val),PCISH5_ICR_REG(reg)) | 90 | #define SH5PCI_WRITE_SHORT(reg,val) __raw_writew((u16)(val),PCISH5_ICR_REG(reg)) |
91 | #define SH5PCI_WRITE_BYTE(reg,val) ctrl_outb((u8)(val),PCISH5_ICR_REG(reg)) | 91 | #define SH5PCI_WRITE_BYTE(reg,val) __raw_writeb((u8)(val),PCISH5_ICR_REG(reg)) |
92 | 92 | ||
93 | /* Read I/O functions */ | 93 | /* Read I/O functions */ |
94 | #define SH5PCI_READ(reg) ctrl_inl(PCISH5_ICR_REG(reg)) | 94 | #define SH5PCI_READ(reg) __raw_readl(PCISH5_ICR_REG(reg)) |
95 | #define SH5PCI_READ_SHORT(reg) ctrl_inw(PCISH5_ICR_REG(reg)) | 95 | #define SH5PCI_READ_SHORT(reg) __raw_readw(PCISH5_ICR_REG(reg)) |
96 | #define SH5PCI_READ_BYTE(reg) ctrl_inb(PCISH5_ICR_REG(reg)) | 96 | #define SH5PCI_READ_BYTE(reg) __raw_readb(PCISH5_ICR_REG(reg)) |
97 | 97 | ||
98 | /* Set PCI config bits */ | 98 | /* Set PCI config bits */ |
99 | #define SET_CONFIG_BITS(bus,devfn,where) ((((bus) << 16) | ((devfn) << 8) | ((where) & ~3)) | 0x80000000) | 99 | #define SET_CONFIG_BITS(bus,devfn,where) ((((bus) << 16) | ((devfn) << 8) | ((where) & ~3)) | 0x80000000) |
diff --git a/arch/sh/drivers/pci/pci-sh7751.c b/arch/sh/drivers/pci/pci-sh7751.c index 70c1999a0ec4..17811e5d287b 100644 --- a/arch/sh/drivers/pci/pci-sh7751.c +++ b/arch/sh/drivers/pci/pci-sh7751.c | |||
@@ -44,25 +44,25 @@ static int __init __area_sdram_check(struct pci_channel *chan, | |||
44 | return 1; | 44 | return 1; |
45 | } | 45 | } |
46 | 46 | ||
47 | static struct resource sh7751_io_resource = { | 47 | static struct resource sh7751_pci_resources[] = { |
48 | .name = "SH7751_IO", | 48 | { |
49 | .start = SH7751_PCI_IO_BASE, | 49 | .name = "SH7751_IO", |
50 | .end = SH7751_PCI_IO_BASE + SH7751_PCI_IO_SIZE - 1, | 50 | .start = SH7751_PCI_IO_BASE, |
51 | .flags = IORESOURCE_IO | 51 | .end = SH7751_PCI_IO_BASE + SH7751_PCI_IO_SIZE - 1, |
52 | }; | 52 | .flags = IORESOURCE_IO |
53 | 53 | }, { | |
54 | static struct resource sh7751_mem_resource = { | 54 | .name = "SH7751_mem", |
55 | .name = "SH7751_mem", | 55 | .start = SH7751_PCI_MEMORY_BASE, |
56 | .start = SH7751_PCI_MEMORY_BASE, | 56 | .end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1, |
57 | .end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1, | 57 | .flags = IORESOURCE_MEM |
58 | .flags = IORESOURCE_MEM | 58 | }, |
59 | }; | 59 | }; |
60 | 60 | ||
61 | static struct pci_channel sh7751_pci_controller = { | 61 | static struct pci_channel sh7751_pci_controller = { |
62 | .pci_ops = &sh4_pci_ops, | 62 | .pci_ops = &sh4_pci_ops, |
63 | .mem_resource = &sh7751_mem_resource, | 63 | .resources = sh7751_pci_resources, |
64 | .nr_resources = ARRAY_SIZE(sh7751_pci_resources), | ||
64 | .mem_offset = 0x00000000, | 65 | .mem_offset = 0x00000000, |
65 | .io_resource = &sh7751_io_resource, | ||
66 | .io_offset = 0x00000000, | 66 | .io_offset = 0x00000000, |
67 | .io_map_base = SH7751_PCI_IO_BASE, | 67 | .io_map_base = SH7751_PCI_IO_BASE, |
68 | }; | 68 | }; |
@@ -79,7 +79,6 @@ static int __init sh7751_pci_init(void) | |||
79 | struct pci_channel *chan = &sh7751_pci_controller; | 79 | struct pci_channel *chan = &sh7751_pci_controller; |
80 | unsigned int id; | 80 | unsigned int id; |
81 | u32 word, reg; | 81 | u32 word, reg; |
82 | int ret; | ||
83 | 82 | ||
84 | printk(KERN_NOTICE "PCI: Starting intialization.\n"); | 83 | printk(KERN_NOTICE "PCI: Starting intialization.\n"); |
85 | 84 | ||
@@ -93,13 +92,10 @@ static int __init sh7751_pci_init(void) | |||
93 | return -ENODEV; | 92 | return -ENODEV; |
94 | } | 93 | } |
95 | 94 | ||
96 | if ((ret = sh4_pci_check_direct(chan)) != 0) | ||
97 | return ret; | ||
98 | |||
99 | /* Set the BCR's to enable PCI access */ | 95 | /* Set the BCR's to enable PCI access */ |
100 | reg = ctrl_inl(SH7751_BCR1); | 96 | reg = __raw_readl(SH7751_BCR1); |
101 | reg |= 0x80000; | 97 | reg |= 0x80000; |
102 | ctrl_outl(reg, SH7751_BCR1); | 98 | __raw_writel(reg, SH7751_BCR1); |
103 | 99 | ||
104 | /* Turn the clocks back on (not done in reset)*/ | 100 | /* Turn the clocks back on (not done in reset)*/ |
105 | pci_write_reg(chan, 0, SH4_PCICLKR); | 101 | pci_write_reg(chan, 0, SH4_PCICLKR); |
@@ -132,13 +128,13 @@ static int __init sh7751_pci_init(void) | |||
132 | /* Set the local 16MB PCI memory space window to | 128 | /* Set the local 16MB PCI memory space window to |
133 | * the lowest PCI mapped address | 129 | * the lowest PCI mapped address |
134 | */ | 130 | */ |
135 | word = chan->mem_resource->start & SH4_PCIMBR_MASK; | 131 | word = chan->resources[1].start & SH4_PCIMBR_MASK; |
136 | pr_debug("PCI: Setting upper bits of Memory window to 0x%x\n", word); | 132 | pr_debug("PCI: Setting upper bits of Memory window to 0x%x\n", word); |
137 | pci_write_reg(chan, word , SH4_PCIMBR); | 133 | pci_write_reg(chan, word , SH4_PCIMBR); |
138 | 134 | ||
139 | /* Make sure the MSB's of IO window are set to access PCI space | 135 | /* Make sure the MSB's of IO window are set to access PCI space |
140 | * correctly */ | 136 | * correctly */ |
141 | word = chan->io_resource->start & SH4_PCIIOBR_MASK; | 137 | word = chan->resources[0].start & SH4_PCIIOBR_MASK; |
142 | pr_debug("PCI: Setting upper bits of IO window to 0x%x\n", word); | 138 | pr_debug("PCI: Setting upper bits of IO window to 0x%x\n", word); |
143 | pci_write_reg(chan, word, SH4_PCIIOBR); | 139 | pci_write_reg(chan, word, SH4_PCIIOBR); |
144 | 140 | ||
@@ -159,13 +155,13 @@ static int __init sh7751_pci_init(void) | |||
159 | return -1; | 155 | return -1; |
160 | 156 | ||
161 | /* configure the wait control registers */ | 157 | /* configure the wait control registers */ |
162 | word = ctrl_inl(SH7751_WCR1); | 158 | word = __raw_readl(SH7751_WCR1); |
163 | pci_write_reg(chan, word, SH4_PCIWCR1); | 159 | pci_write_reg(chan, word, SH4_PCIWCR1); |
164 | word = ctrl_inl(SH7751_WCR2); | 160 | word = __raw_readl(SH7751_WCR2); |
165 | pci_write_reg(chan, word, SH4_PCIWCR2); | 161 | pci_write_reg(chan, word, SH4_PCIWCR2); |
166 | word = ctrl_inl(SH7751_WCR3); | 162 | word = __raw_readl(SH7751_WCR3); |
167 | pci_write_reg(chan, word, SH4_PCIWCR3); | 163 | pci_write_reg(chan, word, SH4_PCIWCR3); |
168 | word = ctrl_inl(SH7751_MCR); | 164 | word = __raw_readl(SH7751_MCR); |
169 | pci_write_reg(chan, word, SH4_PCIMCR); | 165 | pci_write_reg(chan, word, SH4_PCIMCR); |
170 | 166 | ||
171 | /* NOTE: I'm ignoring the PCI error IRQs for now.. | 167 | /* NOTE: I'm ignoring the PCI error IRQs for now.. |
@@ -180,8 +176,6 @@ static int __init sh7751_pci_init(void) | |||
180 | word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_ARBM; | 176 | word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_ARBM; |
181 | pci_write_reg(chan, word, SH4_PCICR); | 177 | pci_write_reg(chan, word, SH4_PCICR); |
182 | 178 | ||
183 | register_pci_controller(chan); | 179 | return register_pci_controller(chan); |
184 | |||
185 | return 0; | ||
186 | } | 180 | } |
187 | arch_initcall(sh7751_pci_init); | 181 | arch_initcall(sh7751_pci_init); |
diff --git a/arch/sh/drivers/pci/pci-sh7780.c b/arch/sh/drivers/pci/pci-sh7780.c index 323b92d565fe..ffdcbf10b95e 100644 --- a/arch/sh/drivers/pci/pci-sh7780.c +++ b/arch/sh/drivers/pci/pci-sh7780.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Low-Level PCI Support for the SH7780 | 2 | * Low-Level PCI Support for the SH7780 |
3 | * | 3 | * |
4 | * Copyright (C) 2005 - 2009 Paul Mundt | 4 | * Copyright (C) 2005 - 2010 Paul Mundt |
5 | * | 5 | * |
6 | * This file is subject to the terms and conditions of the GNU General Public | 6 | * This file is subject to the terms and conditions of the GNU General Public |
7 | * License. See the file "COPYING" in the main directory of this archive | 7 | * License. See the file "COPYING" in the main directory of this archive |
@@ -11,52 +11,240 @@ | |||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/pci.h> | 13 | #include <linux/pci.h> |
14 | #include <linux/interrupt.h> | ||
15 | #include <linux/timer.h> | ||
16 | #include <linux/irq.h> | ||
14 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
15 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
19 | #include <linux/log2.h> | ||
16 | #include "pci-sh4.h" | 20 | #include "pci-sh4.h" |
21 | #include <asm/mmu.h> | ||
22 | #include <asm/sizes.h> | ||
17 | 23 | ||
18 | static struct resource sh7785_io_resource = { | 24 | static struct resource sh7785_pci_resources[] = { |
19 | .name = "SH7785_IO", | 25 | { |
20 | .start = SH7780_PCI_IO_BASE, | 26 | .name = "PCI IO", |
21 | .end = SH7780_PCI_IO_BASE + SH7780_PCI_IO_SIZE - 1, | 27 | .start = 0x1000, |
22 | .flags = IORESOURCE_IO | 28 | .end = SZ_4M - 1, |
23 | }; | 29 | .flags = IORESOURCE_IO, |
24 | 30 | }, { | |
25 | static struct resource sh7785_mem_resource = { | 31 | .name = "PCI MEM 0", |
26 | .name = "SH7785_mem", | 32 | .start = 0xfd000000, |
27 | .start = SH7780_PCI_MEMORY_BASE, | 33 | .end = 0xfd000000 + SZ_16M - 1, |
28 | .end = SH7780_PCI_MEMORY_BASE + SH7780_PCI_MEM_SIZE - 1, | 34 | .flags = IORESOURCE_MEM, |
29 | .flags = IORESOURCE_MEM | 35 | }, { |
36 | .name = "PCI MEM 1", | ||
37 | .start = 0x10000000, | ||
38 | .end = 0x10000000 + SZ_64M - 1, | ||
39 | .flags = IORESOURCE_MEM, | ||
40 | }, { | ||
41 | /* | ||
42 | * 32-bit only resources must be last. | ||
43 | */ | ||
44 | .name = "PCI MEM 2", | ||
45 | .start = 0xc0000000, | ||
46 | .end = 0xc0000000 + SZ_512M - 1, | ||
47 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, | ||
48 | }, | ||
30 | }; | 49 | }; |
31 | 50 | ||
32 | static struct pci_channel sh7780_pci_controller = { | 51 | static struct pci_channel sh7780_pci_controller = { |
33 | .pci_ops = &sh4_pci_ops, | 52 | .pci_ops = &sh4_pci_ops, |
34 | .mem_resource = &sh7785_mem_resource, | 53 | .resources = sh7785_pci_resources, |
35 | .mem_offset = 0x00000000, | 54 | .nr_resources = ARRAY_SIZE(sh7785_pci_resources), |
36 | .io_resource = &sh7785_io_resource, | 55 | .io_offset = 0, |
37 | .io_offset = 0x00000000, | 56 | .mem_offset = 0, |
38 | .io_map_base = SH7780_PCI_IO_BASE, | 57 | .io_map_base = 0xfe200000, |
58 | .serr_irq = evt2irq(0xa00), | ||
59 | .err_irq = evt2irq(0xaa0), | ||
39 | }; | 60 | }; |
40 | 61 | ||
41 | static struct sh4_pci_address_map sh7780_pci_map = { | 62 | struct pci_errors { |
42 | .window0 = { | 63 | unsigned int mask; |
43 | #if defined(CONFIG_32BIT) | 64 | const char *str; |
44 | .base = SH7780_32BIT_DDR_BASE_ADDR, | 65 | } pci_arbiter_errors[] = { |
45 | .size = 0x40000000, | 66 | { SH4_PCIAINT_MBKN, "master broken" }, |
46 | #else | 67 | { SH4_PCIAINT_TBTO, "target bus time out" }, |
47 | .base = SH7780_CS0_BASE_ADDR, | 68 | { SH4_PCIAINT_MBTO, "master bus time out" }, |
48 | .size = 0x20000000, | 69 | { SH4_PCIAINT_TABT, "target abort" }, |
49 | #endif | 70 | { SH4_PCIAINT_MABT, "master abort" }, |
50 | }, | 71 | { SH4_PCIAINT_RDPE, "read data parity error" }, |
72 | { SH4_PCIAINT_WDPE, "write data parity error" }, | ||
73 | }, pci_interrupt_errors[] = { | ||
74 | { SH4_PCIINT_MLCK, "master lock error" }, | ||
75 | { SH4_PCIINT_TABT, "target-target abort" }, | ||
76 | { SH4_PCIINT_TRET, "target retry time out" }, | ||
77 | { SH4_PCIINT_MFDE, "master function disable erorr" }, | ||
78 | { SH4_PCIINT_PRTY, "address parity error" }, | ||
79 | { SH4_PCIINT_SERR, "SERR" }, | ||
80 | { SH4_PCIINT_TWDP, "data parity error for target write" }, | ||
81 | { SH4_PCIINT_TRDP, "PERR detected for target read" }, | ||
82 | { SH4_PCIINT_MTABT, "target abort for master" }, | ||
83 | { SH4_PCIINT_MMABT, "master abort for master" }, | ||
84 | { SH4_PCIINT_MWPD, "master write data parity error" }, | ||
85 | { SH4_PCIINT_MRPD, "master read data parity error" }, | ||
51 | }; | 86 | }; |
52 | 87 | ||
88 | static irqreturn_t sh7780_pci_err_irq(int irq, void *dev_id) | ||
89 | { | ||
90 | struct pci_channel *hose = dev_id; | ||
91 | unsigned long addr; | ||
92 | unsigned int status; | ||
93 | unsigned int cmd; | ||
94 | int i; | ||
95 | |||
96 | addr = __raw_readl(hose->reg_base + SH4_PCIALR); | ||
97 | |||
98 | /* | ||
99 | * Handle status errors. | ||
100 | */ | ||
101 | status = __raw_readw(hose->reg_base + PCI_STATUS); | ||
102 | if (status & (PCI_STATUS_PARITY | | ||
103 | PCI_STATUS_DETECTED_PARITY | | ||
104 | PCI_STATUS_SIG_TARGET_ABORT | | ||
105 | PCI_STATUS_REC_TARGET_ABORT | | ||
106 | PCI_STATUS_REC_MASTER_ABORT)) { | ||
107 | cmd = pcibios_handle_status_errors(addr, status, hose); | ||
108 | if (likely(cmd)) | ||
109 | __raw_writew(cmd, hose->reg_base + PCI_STATUS); | ||
110 | } | ||
111 | |||
112 | /* | ||
113 | * Handle arbiter errors. | ||
114 | */ | ||
115 | status = __raw_readl(hose->reg_base + SH4_PCIAINT); | ||
116 | for (i = cmd = 0; i < ARRAY_SIZE(pci_arbiter_errors); i++) { | ||
117 | if (status & pci_arbiter_errors[i].mask) { | ||
118 | printk(KERN_DEBUG "PCI: %s, addr=%08lx\n", | ||
119 | pci_arbiter_errors[i].str, addr); | ||
120 | cmd |= pci_arbiter_errors[i].mask; | ||
121 | } | ||
122 | } | ||
123 | __raw_writel(cmd, hose->reg_base + SH4_PCIAINT); | ||
124 | |||
125 | /* | ||
126 | * Handle the remaining PCI errors. | ||
127 | */ | ||
128 | status = __raw_readl(hose->reg_base + SH4_PCIINT); | ||
129 | for (i = cmd = 0; i < ARRAY_SIZE(pci_interrupt_errors); i++) { | ||
130 | if (status & pci_interrupt_errors[i].mask) { | ||
131 | printk(KERN_DEBUG "PCI: %s, addr=%08lx\n", | ||
132 | pci_interrupt_errors[i].str, addr); | ||
133 | cmd |= pci_interrupt_errors[i].mask; | ||
134 | } | ||
135 | } | ||
136 | __raw_writel(cmd, hose->reg_base + SH4_PCIINT); | ||
137 | |||
138 | return IRQ_HANDLED; | ||
139 | } | ||
140 | |||
141 | static irqreturn_t sh7780_pci_serr_irq(int irq, void *dev_id) | ||
142 | { | ||
143 | struct pci_channel *hose = dev_id; | ||
144 | |||
145 | printk(KERN_DEBUG "PCI: system error received: "); | ||
146 | pcibios_report_status(PCI_STATUS_SIG_SYSTEM_ERROR, 1); | ||
147 | printk("\n"); | ||
148 | |||
149 | /* Deassert SERR */ | ||
150 | __raw_writel(SH4_PCIINTM_SDIM, hose->reg_base + SH4_PCIINTM); | ||
151 | |||
152 | /* Back off the IRQ for awhile */ | ||
153 | disable_irq_nosync(irq); | ||
154 | hose->serr_timer.expires = jiffies + HZ; | ||
155 | add_timer(&hose->serr_timer); | ||
156 | |||
157 | return IRQ_HANDLED; | ||
158 | } | ||
159 | |||
160 | static int __init sh7780_pci_setup_irqs(struct pci_channel *hose) | ||
161 | { | ||
162 | int ret; | ||
163 | |||
164 | /* Clear out PCI arbiter IRQs */ | ||
165 | __raw_writel(0, hose->reg_base + SH4_PCIAINT); | ||
166 | |||
167 | /* Clear all error conditions */ | ||
168 | __raw_writew(PCI_STATUS_DETECTED_PARITY | \ | ||
169 | PCI_STATUS_SIG_SYSTEM_ERROR | \ | ||
170 | PCI_STATUS_REC_MASTER_ABORT | \ | ||
171 | PCI_STATUS_REC_TARGET_ABORT | \ | ||
172 | PCI_STATUS_SIG_TARGET_ABORT | \ | ||
173 | PCI_STATUS_PARITY, hose->reg_base + PCI_STATUS); | ||
174 | |||
175 | ret = request_irq(hose->serr_irq, sh7780_pci_serr_irq, IRQF_DISABLED, | ||
176 | "PCI SERR interrupt", hose); | ||
177 | if (unlikely(ret)) { | ||
178 | printk(KERN_ERR "PCI: Failed hooking SERR IRQ\n"); | ||
179 | return ret; | ||
180 | } | ||
181 | |||
182 | /* | ||
183 | * The PCI ERR IRQ needs to be IRQF_SHARED since all of the power | ||
184 | * down IRQ vectors are routed through the ERR IRQ vector. We | ||
185 | * only request_irq() once as there is only a single masking | ||
186 | * source for multiple events. | ||
187 | */ | ||
188 | ret = request_irq(hose->err_irq, sh7780_pci_err_irq, IRQF_SHARED, | ||
189 | "PCI ERR interrupt", hose); | ||
190 | if (unlikely(ret)) { | ||
191 | free_irq(hose->serr_irq, hose); | ||
192 | return ret; | ||
193 | } | ||
194 | |||
195 | /* Unmask all of the arbiter IRQs. */ | ||
196 | __raw_writel(SH4_PCIAINT_MBKN | SH4_PCIAINT_TBTO | SH4_PCIAINT_MBTO | \ | ||
197 | SH4_PCIAINT_TABT | SH4_PCIAINT_MABT | SH4_PCIAINT_RDPE | \ | ||
198 | SH4_PCIAINT_WDPE, hose->reg_base + SH4_PCIAINTM); | ||
199 | |||
200 | /* Unmask all of the PCI IRQs */ | ||
201 | __raw_writel(SH4_PCIINTM_TTADIM | SH4_PCIINTM_TMTOIM | \ | ||
202 | SH4_PCIINTM_MDEIM | SH4_PCIINTM_APEDIM | \ | ||
203 | SH4_PCIINTM_SDIM | SH4_PCIINTM_DPEITWM | \ | ||
204 | SH4_PCIINTM_PEDITRM | SH4_PCIINTM_TADIMM | \ | ||
205 | SH4_PCIINTM_MADIMM | SH4_PCIINTM_MWPDIM | \ | ||
206 | SH4_PCIINTM_MRDPEIM, hose->reg_base + SH4_PCIINTM); | ||
207 | |||
208 | return ret; | ||
209 | } | ||
210 | |||
211 | static inline void __init sh7780_pci_teardown_irqs(struct pci_channel *hose) | ||
212 | { | ||
213 | free_irq(hose->err_irq, hose); | ||
214 | free_irq(hose->serr_irq, hose); | ||
215 | } | ||
216 | |||
217 | static void __init sh7780_pci66_init(struct pci_channel *hose) | ||
218 | { | ||
219 | unsigned int tmp; | ||
220 | |||
221 | if (!pci_is_66mhz_capable(hose, 0, 0)) | ||
222 | return; | ||
223 | |||
224 | /* Enable register access */ | ||
225 | tmp = __raw_readl(hose->reg_base + SH4_PCICR); | ||
226 | tmp |= SH4_PCICR_PREFIX; | ||
227 | __raw_writel(tmp, hose->reg_base + SH4_PCICR); | ||
228 | |||
229 | /* Enable 66MHz operation */ | ||
230 | tmp = __raw_readw(hose->reg_base + PCI_STATUS); | ||
231 | tmp |= PCI_STATUS_66MHZ; | ||
232 | __raw_writew(tmp, hose->reg_base + PCI_STATUS); | ||
233 | |||
234 | /* Done */ | ||
235 | tmp = __raw_readl(hose->reg_base + SH4_PCICR); | ||
236 | tmp |= SH4_PCICR_PREFIX | SH4_PCICR_CFIN; | ||
237 | __raw_writel(tmp, hose->reg_base + SH4_PCICR); | ||
238 | } | ||
239 | |||
53 | static int __init sh7780_pci_init(void) | 240 | static int __init sh7780_pci_init(void) |
54 | { | 241 | { |
55 | struct pci_channel *chan = &sh7780_pci_controller; | 242 | struct pci_channel *chan = &sh7780_pci_controller; |
243 | phys_addr_t memphys; | ||
244 | size_t memsize; | ||
56 | unsigned int id; | 245 | unsigned int id; |
57 | const char *type = NULL; | 246 | const char *type; |
58 | int ret; | 247 | int ret, i; |
59 | u32 word; | ||
60 | 248 | ||
61 | printk(KERN_NOTICE "PCI: Starting intialization.\n"); | 249 | printk(KERN_NOTICE "PCI: Starting intialization.\n"); |
62 | 250 | ||
@@ -65,17 +253,28 @@ static int __init sh7780_pci_init(void) | |||
65 | /* Enable CPU access to the PCIC registers. */ | 253 | /* Enable CPU access to the PCIC registers. */ |
66 | __raw_writel(PCIECR_ENBL, PCIECR); | 254 | __raw_writel(PCIECR_ENBL, PCIECR); |
67 | 255 | ||
68 | id = __raw_readw(chan->reg_base + SH7780_PCIVID); | 256 | /* Reset */ |
69 | if (id != SH7780_VENDOR_ID) { | 257 | __raw_writel(SH4_PCICR_PREFIX | SH4_PCICR_PRST, |
258 | chan->reg_base + SH4_PCICR); | ||
259 | |||
260 | /* | ||
261 | * Wait for it to come back up. The spec says to allow for up to | ||
262 | * 1 second after toggling the reset pin, but in practice 100ms | ||
263 | * is more than enough. | ||
264 | */ | ||
265 | mdelay(100); | ||
266 | |||
267 | id = __raw_readw(chan->reg_base + PCI_VENDOR_ID); | ||
268 | if (id != PCI_VENDOR_ID_RENESAS) { | ||
70 | printk(KERN_ERR "PCI: Unknown vendor ID 0x%04x.\n", id); | 269 | printk(KERN_ERR "PCI: Unknown vendor ID 0x%04x.\n", id); |
71 | return -ENODEV; | 270 | return -ENODEV; |
72 | } | 271 | } |
73 | 272 | ||
74 | id = __raw_readw(chan->reg_base + SH7780_PCIDID); | 273 | id = __raw_readw(chan->reg_base + PCI_DEVICE_ID); |
75 | type = (id == SH7763_DEVICE_ID) ? "SH7763" : | 274 | type = (id == PCI_DEVICE_ID_RENESAS_SH7763) ? "SH7763" : |
76 | (id == SH7780_DEVICE_ID) ? "SH7780" : | 275 | (id == PCI_DEVICE_ID_RENESAS_SH7780) ? "SH7780" : |
77 | (id == SH7781_DEVICE_ID) ? "SH7781" : | 276 | (id == PCI_DEVICE_ID_RENESAS_SH7781) ? "SH7781" : |
78 | (id == SH7785_DEVICE_ID) ? "SH7785" : | 277 | (id == PCI_DEVICE_ID_RENESAS_SH7785) ? "SH7785" : |
79 | NULL; | 278 | NULL; |
80 | if (unlikely(!type)) { | 279 | if (unlikely(!type)) { |
81 | printk(KERN_ERR "PCI: Found an unsupported Renesas host " | 280 | printk(KERN_ERR "PCI: Found an unsupported Renesas host " |
@@ -85,62 +284,119 @@ static int __init sh7780_pci_init(void) | |||
85 | 284 | ||
86 | printk(KERN_NOTICE "PCI: Found a Renesas %s host " | 285 | printk(KERN_NOTICE "PCI: Found a Renesas %s host " |
87 | "controller, revision %d.\n", type, | 286 | "controller, revision %d.\n", type, |
88 | __raw_readb(chan->reg_base + SH7780_PCIRID)); | 287 | __raw_readb(chan->reg_base + PCI_REVISION_ID)); |
89 | 288 | ||
90 | if ((ret = sh4_pci_check_direct(chan)) != 0) | 289 | /* |
290 | * Now throw it in to register initialization mode and | ||
291 | * start the real work. | ||
292 | */ | ||
293 | __raw_writel(SH4_PCICR_PREFIX, chan->reg_base + SH4_PCICR); | ||
294 | |||
295 | memphys = __pa(memory_start); | ||
296 | memsize = roundup_pow_of_two(memory_end - memory_start); | ||
297 | |||
298 | /* | ||
299 | * If there's more than 512MB of memory, we need to roll over to | ||
300 | * LAR1/LSR1. | ||
301 | */ | ||
302 | if (memsize > SZ_512M) { | ||
303 | __raw_writel(memphys + SZ_512M, chan->reg_base + SH4_PCILAR1); | ||
304 | __raw_writel((((memsize - SZ_512M) - SZ_1M) & 0x1ff00000) | 1, | ||
305 | chan->reg_base + SH4_PCILSR1); | ||
306 | memsize = SZ_512M; | ||
307 | } else { | ||
308 | /* | ||
309 | * Otherwise just zero it out and disable it. | ||
310 | */ | ||
311 | __raw_writel(0, chan->reg_base + SH4_PCILAR1); | ||
312 | __raw_writel(0, chan->reg_base + SH4_PCILSR1); | ||
313 | } | ||
314 | |||
315 | /* | ||
316 | * LAR0/LSR0 covers up to the first 512MB, which is enough to | ||
317 | * cover all of lowmem on most platforms. | ||
318 | */ | ||
319 | __raw_writel(memphys, chan->reg_base + SH4_PCILAR0); | ||
320 | __raw_writel(((memsize - SZ_1M) & 0x1ff00000) | 1, | ||
321 | chan->reg_base + SH4_PCILSR0); | ||
322 | |||
323 | /* | ||
324 | * Hook up the ERR and SERR IRQs. | ||
325 | */ | ||
326 | ret = sh7780_pci_setup_irqs(chan); | ||
327 | if (unlikely(ret)) | ||
91 | return ret; | 328 | return ret; |
92 | 329 | ||
93 | /* | 330 | /* |
94 | * Set the class and sub-class codes. | 331 | * Disable the cache snoop controller for non-coherent DMA. |
95 | */ | 332 | */ |
96 | __raw_writeb(PCI_CLASS_BRIDGE_HOST >> 8, | 333 | __raw_writel(0, chan->reg_base + SH7780_PCICSCR0); |
97 | chan->reg_base + SH7780_PCIBCC); | 334 | __raw_writel(0, chan->reg_base + SH7780_PCICSAR0); |
98 | __raw_writeb(PCI_CLASS_BRIDGE_HOST & 0xff, | 335 | __raw_writel(0, chan->reg_base + SH7780_PCICSCR1); |
99 | chan->reg_base + SH7780_PCISUB); | 336 | __raw_writel(0, chan->reg_base + SH7780_PCICSAR1); |
100 | 337 | ||
101 | /* | 338 | /* |
102 | * Set IO and Mem windows to local address | 339 | * Setup the memory BARs |
103 | * Make PCI and local address the same for easy 1 to 1 mapping | ||
104 | */ | 340 | */ |
105 | pci_write_reg(chan, sh7780_pci_map.window0.size - 0xfffff, SH4_PCILSR0); | 341 | for (i = 1; i < chan->nr_resources; i++) { |
106 | /* Set the values on window 0 PCI config registers */ | 342 | struct resource *res = chan->resources + i; |
107 | pci_write_reg(chan, sh7780_pci_map.window0.base, SH4_PCILAR0); | 343 | resource_size_t size; |
108 | pci_write_reg(chan, sh7780_pci_map.window0.base, SH7780_PCIMBAR0); | ||
109 | 344 | ||
110 | pci_write_reg(chan, 0x0000380f, SH4_PCIAINTM); | 345 | if (unlikely(res->flags & IORESOURCE_IO)) |
346 | continue; | ||
111 | 347 | ||
112 | /* Set up standard PCI config registers */ | 348 | /* |
113 | __raw_writew(0xFB00, chan->reg_base + SH7780_PCISTATUS); | 349 | * Make sure we're in the right physical addressing mode |
114 | __raw_writew(0x0047, chan->reg_base + SH7780_PCICMD); | 350 | * for dealing with the resource. |
115 | __raw_writew(0x1912, chan->reg_base + SH7780_PCISVID); | 351 | */ |
116 | __raw_writew(0x0001, chan->reg_base + SH7780_PCISID); | 352 | if ((res->flags & IORESOURCE_MEM_32BIT) && __in_29bit_mode()) { |
353 | chan->nr_resources--; | ||
354 | continue; | ||
355 | } | ||
117 | 356 | ||
118 | __raw_writeb(0x00, chan->reg_base + SH7780_PCIPIF); | 357 | size = resource_size(res); |
358 | |||
359 | /* | ||
360 | * The MBMR mask is calculated in units of 256kB, which | ||
361 | * keeps things pretty simple. | ||
362 | */ | ||
363 | __raw_writel(((roundup_pow_of_two(size) / SZ_256K) - 1) << 18, | ||
364 | chan->reg_base + SH7780_PCIMBMR(i - 1)); | ||
365 | __raw_writel(res->start, chan->reg_base + SH7780_PCIMBR(i - 1)); | ||
366 | } | ||
119 | 367 | ||
120 | /* Apply any last-minute PCIC fixups */ | 368 | /* |
121 | pci_fixup_pcic(chan); | 369 | * And I/O. |
370 | */ | ||
371 | __raw_writel(0, chan->reg_base + PCI_BASE_ADDRESS_0); | ||
372 | __raw_writel(0, chan->reg_base + SH7780_PCIIOBR); | ||
373 | __raw_writel(0, chan->reg_base + SH7780_PCIIOBMR); | ||
122 | 374 | ||
123 | pci_write_reg(chan, 0xfd000000, SH7780_PCIMBR0); | 375 | __raw_writew(PCI_COMMAND_SERR | PCI_COMMAND_WAIT | \ |
124 | pci_write_reg(chan, 0x00fc0000, SH7780_PCIMBMR0); | 376 | PCI_COMMAND_PARITY | PCI_COMMAND_MASTER | \ |
377 | PCI_COMMAND_MEMORY, chan->reg_base + PCI_COMMAND); | ||
125 | 378 | ||
126 | #ifdef CONFIG_32BIT | 379 | /* |
127 | pci_write_reg(chan, 0xc0000000, SH7780_PCIMBR2); | 380 | * Initialization mode complete, release the control register and |
128 | pci_write_reg(chan, 0x20000000 - SH7780_PCI_IO_SIZE, SH7780_PCIMBMR2); | 381 | * enable round robin mode to stop device overruns/starvation. |
129 | #endif | 382 | */ |
383 | __raw_writel(SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_FTO, | ||
384 | chan->reg_base + SH4_PCICR); | ||
130 | 385 | ||
131 | /* Set IOBR for windows containing area specified in pci.h */ | 386 | ret = register_pci_controller(chan); |
132 | pci_write_reg(chan, chan->io_resource->start & ~(SH7780_PCI_IO_SIZE-1), | 387 | if (unlikely(ret)) |
133 | SH7780_PCIIOBR); | 388 | goto err; |
134 | pci_write_reg(chan, ((SH7780_PCI_IO_SIZE-1) & (7<<18)), | ||
135 | SH7780_PCIIOBMR); | ||
136 | 389 | ||
137 | /* SH7780 init done, set central function init complete */ | 390 | sh7780_pci66_init(chan); |
138 | /* use round robin mode to stop a device starving/overruning */ | ||
139 | word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_FTO; | ||
140 | pci_write_reg(chan, word, SH4_PCICR); | ||
141 | 391 | ||
142 | register_pci_controller(chan); | 392 | printk(KERN_NOTICE "PCI: Running at %dMHz.\n", |
393 | (__raw_readw(chan->reg_base + PCI_STATUS) & PCI_STATUS_66MHZ) ? | ||
394 | 66 : 33); | ||
143 | 395 | ||
144 | return 0; | 396 | return 0; |
397 | |||
398 | err: | ||
399 | sh7780_pci_teardown_irqs(chan); | ||
400 | return ret; | ||
145 | } | 401 | } |
146 | arch_initcall(sh7780_pci_init); | 402 | arch_initcall(sh7780_pci_init); |
diff --git a/arch/sh/drivers/pci/pci-sh7780.h b/arch/sh/drivers/pci/pci-sh7780.h index 4a52478c97cf..205dcbefe275 100644 --- a/arch/sh/drivers/pci/pci-sh7780.h +++ b/arch/sh/drivers/pci/pci-sh7780.h | |||
@@ -12,12 +12,11 @@ | |||
12 | #ifndef _PCI_SH7780_H_ | 12 | #ifndef _PCI_SH7780_H_ |
13 | #define _PCI_SH7780_H_ | 13 | #define _PCI_SH7780_H_ |
14 | 14 | ||
15 | /* Platform Specific Values */ | 15 | #define PCI_VENDOR_ID_RENESAS 0x1912 |
16 | #define SH7780_VENDOR_ID 0x1912 | 16 | #define PCI_DEVICE_ID_RENESAS_SH7781 0x0001 |
17 | #define SH7781_DEVICE_ID 0x0001 | 17 | #define PCI_DEVICE_ID_RENESAS_SH7780 0x0002 |
18 | #define SH7780_DEVICE_ID 0x0002 | 18 | #define PCI_DEVICE_ID_RENESAS_SH7763 0x0004 |
19 | #define SH7763_DEVICE_ID 0x0004 | 19 | #define PCI_DEVICE_ID_RENESAS_SH7785 0x0007 |
20 | #define SH7785_DEVICE_ID 0x0007 | ||
21 | 20 | ||
22 | /* SH7780 Control Registers */ | 21 | /* SH7780 Control Registers */ |
23 | #define PCIECR 0xFE000008 | 22 | #define PCIECR 0xFE000008 |
@@ -27,44 +26,9 @@ | |||
27 | #define SH7780_PCI_CONFIG_BASE 0xFD000000 /* Config space base addr */ | 26 | #define SH7780_PCI_CONFIG_BASE 0xFD000000 /* Config space base addr */ |
28 | #define SH7780_PCI_CONFIG_SIZE 0x01000000 /* Config space size */ | 27 | #define SH7780_PCI_CONFIG_SIZE 0x01000000 /* Config space size */ |
29 | 28 | ||
30 | #define SH7780_PCI_MEMORY_BASE 0xFD000000 /* Memory space base addr */ | ||
31 | #define SH7780_PCI_MEM_SIZE 0x01000000 /* Size of Memory window */ | ||
32 | |||
33 | #define SH7780_PCI_IO_BASE 0xFE200000 /* IO space base address */ | ||
34 | #define SH7780_PCI_IO_SIZE 0x00400000 /* Size of IO window */ | ||
35 | |||
36 | #define SH7780_PCIREG_BASE 0xFE040000 /* PCI regs base address */ | 29 | #define SH7780_PCIREG_BASE 0xFE040000 /* PCI regs base address */ |
37 | 30 | ||
38 | /* SH7780 PCI Config Registers */ | 31 | /* SH7780 PCI Config Registers */ |
39 | #define SH7780_PCIVID 0x000 /* Vendor ID */ | ||
40 | #define SH7780_PCIDID 0x002 /* Device ID */ | ||
41 | #define SH7780_PCICMD 0x004 /* Command */ | ||
42 | #define SH7780_PCISTATUS 0x006 /* Status */ | ||
43 | #define SH7780_PCIRID 0x008 /* Revision ID */ | ||
44 | #define SH7780_PCIPIF 0x009 /* Program Interface */ | ||
45 | #define SH7780_PCISUB 0x00a /* Sub class code */ | ||
46 | #define SH7780_PCIBCC 0x00b /* Base class code */ | ||
47 | #define SH7780_PCICLS 0x00c /* Cache line size */ | ||
48 | #define SH7780_PCILTM 0x00d /* latency timer */ | ||
49 | #define SH7780_PCIHDR 0x00e /* Header type */ | ||
50 | #define SH7780_PCIBIST 0x00f /* BIST */ | ||
51 | #define SH7780_PCIIBAR 0x010 /* IO Base address */ | ||
52 | #define SH7780_PCIMBAR0 0x014 /* Memory base address0 */ | ||
53 | #define SH7780_PCIMBAR1 0x018 /* Memory base address1 */ | ||
54 | #define SH7780_PCISVID 0x02c /* Sub system vendor ID */ | ||
55 | #define SH7780_PCISID 0x02e /* Sub system ID */ | ||
56 | #define SH7780_PCICP 0x034 | ||
57 | #define SH7780_PCIINTLINE 0x03c /* Interrupt line */ | ||
58 | #define SH7780_PCIINTPIN 0x03d /* Interrupt pin */ | ||
59 | #define SH7780_PCIMINGNT 0x03e /* Minumum grand */ | ||
60 | #define SH7780_PCIMAXLAT 0x03f /* Maxmum latency */ | ||
61 | #define SH7780_PCICID 0x040 | ||
62 | #define SH7780_PCINIP 0x041 | ||
63 | #define SH7780_PCIPMC 0x042 | ||
64 | #define SH7780_PCIPMCSR 0x044 | ||
65 | #define SH7780_PCIPMCSR_BSE 0x046 | ||
66 | #define SH7780_PCICDD 0x047 | ||
67 | |||
68 | #define SH7780_PCIIR 0x114 /* PCI Interrupt Register */ | 32 | #define SH7780_PCIIR 0x114 /* PCI Interrupt Register */ |
69 | #define SH7780_PCIIMR 0x118 /* PCI Interrupt Mask Register */ | 33 | #define SH7780_PCIIMR 0x118 /* PCI Interrupt Mask Register */ |
70 | #define SH7780_PCIAIR 0x11C /* Error Address Register */ | 34 | #define SH7780_PCIAIR 0x11C /* Error Address Register */ |
@@ -76,10 +40,8 @@ | |||
76 | #define SH7780_PCIPINT 0x1CC /* Power Mgmnt Int. Register */ | 40 | #define SH7780_PCIPINT 0x1CC /* Power Mgmnt Int. Register */ |
77 | #define SH7780_PCIPINTM 0x1D0 /* Power Mgmnt Mask Register */ | 41 | #define SH7780_PCIPINTM 0x1D0 /* Power Mgmnt Mask Register */ |
78 | 42 | ||
79 | #define SH7780_PCIMBR0 0x1E0 | 43 | #define SH7780_PCIMBR(x) (0x1E0 + ((x) * 8)) |
80 | #define SH7780_PCIMBMR0 0x1E4 | 44 | #define SH7780_PCIMBMR(x) (0x1E4 + ((x) * 8)) |
81 | #define SH7780_PCIMBR2 0x1F0 | ||
82 | #define SH7780_PCIMBMR2 0x1F4 | ||
83 | #define SH7780_PCIIOBR 0x1F8 | 45 | #define SH7780_PCIIOBR 0x1F8 |
84 | #define SH7780_PCIIOBMR 0x1FC | 46 | #define SH7780_PCIIOBMR 0x1FC |
85 | #define SH7780_PCICSCR0 0x210 /* Cache Snoop1 Cnt. Register */ | 47 | #define SH7780_PCICSCR0 0x210 /* Cache Snoop1 Cnt. Register */ |
@@ -87,16 +49,4 @@ | |||
87 | #define SH7780_PCICSAR0 0x218 /* Cache Snoop1 Addr. Register */ | 49 | #define SH7780_PCICSAR0 0x218 /* Cache Snoop1 Addr. Register */ |
88 | #define SH7780_PCICSAR1 0x21C /* Cache Snoop2 Addr. Register */ | 50 | #define SH7780_PCICSAR1 0x21C /* Cache Snoop2 Addr. Register */ |
89 | 51 | ||
90 | /* General Memory Config Addresses */ | ||
91 | #define SH7780_CS0_BASE_ADDR 0x0 | ||
92 | #define SH7780_MEM_REGION_SIZE 0x04000000 | ||
93 | #define SH7780_CS1_BASE_ADDR (SH7780_CS0_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
94 | #define SH7780_CS2_BASE_ADDR (SH7780_CS1_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
95 | #define SH7780_CS3_BASE_ADDR (SH7780_CS2_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
96 | #define SH7780_CS4_BASE_ADDR (SH7780_CS3_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
97 | #define SH7780_CS5_BASE_ADDR (SH7780_CS4_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
98 | #define SH7780_CS6_BASE_ADDR (SH7780_CS5_BASE_ADDR + SH7780_MEM_REGION_SIZE) | ||
99 | |||
100 | #define SH7780_32BIT_DDR_BASE_ADDR 0x40000000 | ||
101 | |||
102 | #endif /* _PCI_SH7780_H_ */ | 52 | #endif /* _PCI_SH7780_H_ */ |
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index 96213fd172ce..953af139e230 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
@@ -33,15 +33,22 @@ static int pci_initialized; | |||
33 | static void __devinit pcibios_scanbus(struct pci_channel *hose) | 33 | static void __devinit pcibios_scanbus(struct pci_channel *hose) |
34 | { | 34 | { |
35 | static int next_busno; | 35 | static int next_busno; |
36 | static int need_domain_info; | ||
36 | struct pci_bus *bus; | 37 | struct pci_bus *bus; |
37 | 38 | ||
38 | bus = pci_scan_bus(next_busno, hose->pci_ops, hose); | 39 | bus = pci_scan_bus(next_busno, hose->pci_ops, hose); |
40 | hose->bus = bus; | ||
41 | |||
42 | need_domain_info = need_domain_info || hose->index; | ||
43 | hose->need_domain_info = need_domain_info; | ||
39 | if (bus) { | 44 | if (bus) { |
40 | next_busno = bus->subordinate + 1; | 45 | next_busno = bus->subordinate + 1; |
41 | /* Don't allow 8-bit bus number overflow inside the hose - | 46 | /* Don't allow 8-bit bus number overflow inside the hose - |
42 | reserve some space for bridges. */ | 47 | reserve some space for bridges. */ |
43 | if (next_busno > 224) | 48 | if (next_busno > 224) { |
44 | next_busno = 0; | 49 | next_busno = 0; |
50 | need_domain_info = 1; | ||
51 | } | ||
45 | 52 | ||
46 | pci_bus_size_bridges(bus); | 53 | pci_bus_size_bridges(bus); |
47 | pci_bus_assign_resources(bus); | 54 | pci_bus_assign_resources(bus); |
@@ -51,10 +58,21 @@ static void __devinit pcibios_scanbus(struct pci_channel *hose) | |||
51 | 58 | ||
52 | static DEFINE_MUTEX(pci_scan_mutex); | 59 | static DEFINE_MUTEX(pci_scan_mutex); |
53 | 60 | ||
54 | void __devinit register_pci_controller(struct pci_channel *hose) | 61 | int __devinit register_pci_controller(struct pci_channel *hose) |
55 | { | 62 | { |
56 | request_resource(&iomem_resource, hose->mem_resource); | 63 | int i; |
57 | request_resource(&ioport_resource, hose->io_resource); | 64 | |
65 | for (i = 0; i < hose->nr_resources; i++) { | ||
66 | struct resource *res = hose->resources + i; | ||
67 | |||
68 | if (res->flags & IORESOURCE_IO) { | ||
69 | if (request_resource(&ioport_resource, res) < 0) | ||
70 | goto out; | ||
71 | } else { | ||
72 | if (request_resource(&iomem_resource, res) < 0) | ||
73 | goto out; | ||
74 | } | ||
75 | } | ||
58 | 76 | ||
59 | *hose_tail = hose; | 77 | *hose_tail = hose; |
60 | hose_tail = &hose->next; | 78 | hose_tail = &hose->next; |
@@ -68,6 +86,11 @@ void __devinit register_pci_controller(struct pci_channel *hose) | |||
68 | } | 86 | } |
69 | 87 | ||
70 | /* | 88 | /* |
89 | * Setup the ERR/PERR and SERR timers, if available. | ||
90 | */ | ||
91 | pcibios_enable_timers(hose); | ||
92 | |||
93 | /* | ||
71 | * Scan the bus if it is register after the PCI subsystem | 94 | * Scan the bus if it is register after the PCI subsystem |
72 | * initialization. | 95 | * initialization. |
73 | */ | 96 | */ |
@@ -76,6 +99,15 @@ void __devinit register_pci_controller(struct pci_channel *hose) | |||
76 | pcibios_scanbus(hose); | 99 | pcibios_scanbus(hose); |
77 | mutex_unlock(&pci_scan_mutex); | 100 | mutex_unlock(&pci_scan_mutex); |
78 | } | 101 | } |
102 | |||
103 | return 0; | ||
104 | |||
105 | out: | ||
106 | for (--i; i >= 0; i--) | ||
107 | release_resource(&hose->resources[i]); | ||
108 | |||
109 | printk(KERN_WARNING "Skipping PCI bus scan due to resource conflict\n"); | ||
110 | return -1; | ||
79 | } | 111 | } |
80 | 112 | ||
81 | static int __init pcibios_init(void) | 113 | static int __init pcibios_init(void) |
@@ -127,11 +159,13 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus) | |||
127 | { | 159 | { |
128 | struct pci_dev *dev = bus->self; | 160 | struct pci_dev *dev = bus->self; |
129 | struct list_head *ln; | 161 | struct list_head *ln; |
130 | struct pci_channel *chan = bus->sysdata; | 162 | struct pci_channel *hose = bus->sysdata; |
131 | 163 | ||
132 | if (!dev) { | 164 | if (!dev) { |
133 | bus->resource[0] = chan->io_resource; | 165 | int i; |
134 | bus->resource[1] = chan->mem_resource; | 166 | |
167 | for (i = 0; i < hose->nr_resources; i++) | ||
168 | bus->resource[i] = hose->resources + i; | ||
135 | } | 169 | } |
136 | 170 | ||
137 | for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) { | 171 | for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) { |
@@ -152,30 +186,25 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res, | |||
152 | resource_size_t size, resource_size_t align) | 186 | resource_size_t size, resource_size_t align) |
153 | { | 187 | { |
154 | struct pci_dev *dev = data; | 188 | struct pci_dev *dev = data; |
155 | struct pci_channel *chan = dev->sysdata; | 189 | struct pci_channel *hose = dev->sysdata; |
156 | resource_size_t start = res->start; | 190 | resource_size_t start = res->start; |
157 | 191 | ||
158 | if (res->flags & IORESOURCE_IO) { | 192 | if (res->flags & IORESOURCE_IO) { |
159 | if (start < PCIBIOS_MIN_IO + chan->io_resource->start) | 193 | if (start < PCIBIOS_MIN_IO + hose->resources[0].start) |
160 | start = PCIBIOS_MIN_IO + chan->io_resource->start; | 194 | start = PCIBIOS_MIN_IO + hose->resources[0].start; |
161 | 195 | ||
162 | /* | 196 | /* |
163 | * Put everything into 0x00-0xff region modulo 0x400. | 197 | * Put everything into 0x00-0xff region modulo 0x400. |
164 | */ | 198 | */ |
165 | if (start & 0x300) { | 199 | if (start & 0x300) |
166 | start = (start + 0x3ff) & ~0x3ff; | 200 | start = (start + 0x3ff) & ~0x3ff; |
167 | res->start = start; | ||
168 | } | ||
169 | } else if (res->flags & IORESOURCE_MEM) { | ||
170 | if (start < PCIBIOS_MIN_MEM + chan->mem_resource->start) | ||
171 | start = PCIBIOS_MIN_MEM + chan->mem_resource->start; | ||
172 | } | 201 | } |
173 | 202 | ||
174 | return start; | 203 | return start; |
175 | } | 204 | } |
176 | 205 | ||
177 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | 206 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, |
178 | struct resource *res) | 207 | struct resource *res) |
179 | { | 208 | { |
180 | struct pci_channel *hose = dev->sysdata; | 209 | struct pci_channel *hose = dev->sysdata; |
181 | unsigned long offset = 0; | 210 | unsigned long offset = 0; |
@@ -189,9 +218,8 @@ void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | |||
189 | region->end = res->end - offset; | 218 | region->end = res->end - offset; |
190 | } | 219 | } |
191 | 220 | ||
192 | void __devinit | 221 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, |
193 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | 222 | struct pci_bus_region *region) |
194 | struct pci_bus_region *region) | ||
195 | { | 223 | { |
196 | struct pci_channel *hose = dev->sysdata; | 224 | struct pci_channel *hose = dev->sysdata; |
197 | unsigned long offset = 0; | 225 | unsigned long offset = 0; |
@@ -274,6 +302,86 @@ char * __devinit pcibios_setup(char *str) | |||
274 | return str; | 302 | return str; |
275 | } | 303 | } |
276 | 304 | ||
305 | static void __init | ||
306 | pcibios_bus_report_status_early(struct pci_channel *hose, | ||
307 | int top_bus, int current_bus, | ||
308 | unsigned int status_mask, int warn) | ||
309 | { | ||
310 | unsigned int pci_devfn; | ||
311 | u16 status; | ||
312 | int ret; | ||
313 | |||
314 | for (pci_devfn = 0; pci_devfn < 0xff; pci_devfn++) { | ||
315 | if (PCI_FUNC(pci_devfn)) | ||
316 | continue; | ||
317 | ret = early_read_config_word(hose, top_bus, current_bus, | ||
318 | pci_devfn, PCI_STATUS, &status); | ||
319 | if (ret != PCIBIOS_SUCCESSFUL) | ||
320 | continue; | ||
321 | if (status == 0xffff) | ||
322 | continue; | ||
323 | |||
324 | early_write_config_word(hose, top_bus, current_bus, | ||
325 | pci_devfn, PCI_STATUS, | ||
326 | status & status_mask); | ||
327 | if (warn) | ||
328 | printk("(%02x:%02x: %04X) ", current_bus, | ||
329 | pci_devfn, status); | ||
330 | } | ||
331 | } | ||
332 | |||
333 | /* | ||
334 | * We can't use pci_find_device() here since we are | ||
335 | * called from interrupt context. | ||
336 | */ | ||
337 | static void __init_refok | ||
338 | pcibios_bus_report_status(struct pci_bus *bus, unsigned int status_mask, | ||
339 | int warn) | ||
340 | { | ||
341 | struct pci_dev *dev; | ||
342 | |||
343 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
344 | u16 status; | ||
345 | |||
346 | /* | ||
347 | * ignore host bridge - we handle | ||
348 | * that separately | ||
349 | */ | ||
350 | if (dev->bus->number == 0 && dev->devfn == 0) | ||
351 | continue; | ||
352 | |||
353 | pci_read_config_word(dev, PCI_STATUS, &status); | ||
354 | if (status == 0xffff) | ||
355 | continue; | ||
356 | |||
357 | if ((status & status_mask) == 0) | ||
358 | continue; | ||
359 | |||
360 | /* clear the status errors */ | ||
361 | pci_write_config_word(dev, PCI_STATUS, status & status_mask); | ||
362 | |||
363 | if (warn) | ||
364 | printk("(%s: %04X) ", pci_name(dev), status); | ||
365 | } | ||
366 | |||
367 | list_for_each_entry(dev, &bus->devices, bus_list) | ||
368 | if (dev->subordinate) | ||
369 | pcibios_bus_report_status(dev->subordinate, status_mask, warn); | ||
370 | } | ||
371 | |||
372 | void __init_refok pcibios_report_status(unsigned int status_mask, int warn) | ||
373 | { | ||
374 | struct pci_channel *hose; | ||
375 | |||
376 | for (hose = hose_head; hose; hose = hose->next) { | ||
377 | if (unlikely(!hose->bus)) | ||
378 | pcibios_bus_report_status_early(hose, hose_head->index, | ||
379 | hose->index, status_mask, warn); | ||
380 | else | ||
381 | pcibios_bus_report_status(hose->bus, status_mask, warn); | ||
382 | } | ||
383 | } | ||
384 | |||
277 | int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | 385 | int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, |
278 | enum pci_mmap_state mmap_state, int write_combine) | 386 | enum pci_mmap_state mmap_state, int write_combine) |
279 | { | 387 | { |
@@ -302,9 +410,15 @@ static void __iomem *ioport_map_pci(struct pci_dev *dev, | |||
302 | { | 410 | { |
303 | struct pci_channel *chan = dev->sysdata; | 411 | struct pci_channel *chan = dev->sysdata; |
304 | 412 | ||
305 | if (!chan->io_map_base) | 413 | if (unlikely(!chan->io_map_base)) { |
306 | chan->io_map_base = generic_io_base; | 414 | chan->io_map_base = generic_io_base; |
307 | 415 | ||
416 | if (pci_domains_supported) | ||
417 | panic("To avoid data corruption io_map_base MUST be " | ||
418 | "set with multiple PCI domains."); | ||
419 | } | ||
420 | |||
421 | |||
308 | return (void __iomem *)(chan->io_map_base + port); | 422 | return (void __iomem *)(chan->io_map_base + port); |
309 | } | 423 | } |
310 | 424 | ||
@@ -321,20 +435,9 @@ void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | |||
321 | 435 | ||
322 | if (flags & IORESOURCE_IO) | 436 | if (flags & IORESOURCE_IO) |
323 | return ioport_map_pci(dev, start, len); | 437 | return ioport_map_pci(dev, start, len); |
324 | |||
325 | /* | ||
326 | * Presently the IORESOURCE_MEM case is a bit special, most | ||
327 | * SH7751 style PCI controllers have PCI memory at a fixed | ||
328 | * location in the address space where no remapping is desired. | ||
329 | * With the IORESOURCE_MEM case more care has to be taken | ||
330 | * to inhibit page table mapping for legacy cores, but this is | ||
331 | * punted off to __ioremap(). | ||
332 | * -- PFM. | ||
333 | */ | ||
334 | if (flags & IORESOURCE_MEM) { | 438 | if (flags & IORESOURCE_MEM) { |
335 | if (flags & IORESOURCE_CACHEABLE) | 439 | if (flags & IORESOURCE_CACHEABLE) |
336 | return ioremap(start, len); | 440 | return ioremap(start, len); |
337 | |||
338 | return ioremap_nocache(start, len); | 441 | return ioremap_nocache(start, len); |
339 | } | 442 | } |
340 | 443 | ||
diff --git a/arch/sh/drivers/pci/pcie-sh7786.c b/arch/sh/drivers/pci/pcie-sh7786.c index ac37ee879bab..ae91a2dd9183 100644 --- a/arch/sh/drivers/pci/pcie-sh7786.c +++ b/arch/sh/drivers/pci/pcie-sh7786.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Low-Level PCI Express Support for the SH7786 | 2 | * Low-Level PCI Express Support for the SH7786 |
3 | * | 3 | * |
4 | * Copyright (C) 2009 Paul Mundt | 4 | * Copyright (C) 2009 - 2010 Paul Mundt |
5 | * | 5 | * |
6 | * This file is subject to the terms and conditions of the GNU General Public | 6 | * This file is subject to the terms and conditions of the GNU General Public |
7 | * License. See the file "COPYING" in the main directory of this archive | 7 | * License. See the file "COPYING" in the main directory of this archive |
@@ -30,60 +30,84 @@ static struct sh7786_pcie_hwops { | |||
30 | int (*port_init_hw)(struct sh7786_pcie_port *port); | 30 | int (*port_init_hw)(struct sh7786_pcie_port *port); |
31 | } *sh7786_pcie_hwops; | 31 | } *sh7786_pcie_hwops; |
32 | 32 | ||
33 | static struct resource sh7786_pci_32bit_mem_resources[] = { | 33 | static struct resource sh7786_pci0_resources[] = { |
34 | { | 34 | { |
35 | .name = "pci0_mem", | 35 | .name = "PCIe0 IO", |
36 | .start = SH4A_PCIMEM_BASEA, | 36 | .start = 0xfd000000, |
37 | .end = SH4A_PCIMEM_BASEA + SZ_64M - 1, | 37 | .end = 0xfd000000 + SZ_8M - 1, |
38 | .flags = IORESOURCE_MEM, | 38 | .flags = IORESOURCE_IO, |
39 | }, { | 39 | }, { |
40 | .name = "pci1_mem", | 40 | .name = "PCIe0 MEM 0", |
41 | .start = SH4A_PCIMEM_BASEA1, | 41 | .start = 0xc0000000, |
42 | .end = SH4A_PCIMEM_BASEA1 + SZ_64M - 1, | 42 | .end = 0xc0000000 + SZ_512M - 1, |
43 | .flags = IORESOURCE_MEM, | 43 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, |
44 | }, { | 44 | }, { |
45 | .name = "pci2_mem", | 45 | .name = "PCIe0 MEM 1", |
46 | .start = SH4A_PCIMEM_BASEA2, | 46 | .start = 0x10000000, |
47 | .end = SH4A_PCIMEM_BASEA2 + SZ_64M - 1, | 47 | .end = 0x10000000 + SZ_64M - 1, |
48 | .flags = IORESOURCE_MEM, | 48 | .flags = IORESOURCE_MEM, |
49 | }, { | ||
50 | .name = "PCIe0 MEM 2", | ||
51 | .start = 0xfe100000, | ||
52 | .end = 0xfe100000 + SZ_1M - 1, | ||
49 | }, | 53 | }, |
50 | }; | 54 | }; |
51 | 55 | ||
52 | static struct resource sh7786_pci_29bit_mem_resource = { | 56 | static struct resource sh7786_pci1_resources[] = { |
53 | .start = SH4A_PCIMEM_BASE, | 57 | { |
54 | .end = SH4A_PCIMEM_BASE + SZ_64M - 1, | 58 | .name = "PCIe1 IO", |
55 | .flags = IORESOURCE_MEM, | 59 | .start = 0xfd800000, |
60 | .end = 0xfd800000 + SZ_8M - 1, | ||
61 | .flags = IORESOURCE_IO, | ||
62 | }, { | ||
63 | .name = "PCIe1 MEM 0", | ||
64 | .start = 0xa0000000, | ||
65 | .end = 0xa0000000 + SZ_512M - 1, | ||
66 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, | ||
67 | }, { | ||
68 | .name = "PCIe1 MEM 1", | ||
69 | .start = 0x30000000, | ||
70 | .end = 0x30000000 + SZ_256M - 1, | ||
71 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, | ||
72 | }, { | ||
73 | .name = "PCIe1 MEM 2", | ||
74 | .start = 0xfe300000, | ||
75 | .end = 0xfe300000 + SZ_1M - 1, | ||
76 | }, | ||
56 | }; | 77 | }; |
57 | 78 | ||
58 | static struct resource sh7786_pci_io_resources[] = { | 79 | static struct resource sh7786_pci2_resources[] = { |
59 | { | 80 | { |
60 | .name = "pci0_io", | 81 | .name = "PCIe2 IO", |
61 | .start = SH4A_PCIIO_BASE, | 82 | .start = 0xfc800000, |
62 | .end = SH4A_PCIIO_BASE + SZ_8M - 1, | 83 | .end = 0xfc800000 + SZ_4M - 1, |
63 | .flags = IORESOURCE_IO, | ||
64 | }, { | 84 | }, { |
65 | .name = "pci1_io", | 85 | .name = "PCIe2 MEM 0", |
66 | .start = SH4A_PCIIO_BASE1, | 86 | .start = 0x80000000, |
67 | .end = SH4A_PCIIO_BASE1 + SZ_8M - 1, | 87 | .end = 0x80000000 + SZ_512M - 1, |
68 | .flags = IORESOURCE_IO, | 88 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, |
69 | }, { | 89 | }, { |
70 | .name = "pci2_io", | 90 | .name = "PCIe2 MEM 1", |
71 | .start = SH4A_PCIIO_BASE2, | 91 | .start = 0x20000000, |
72 | .end = SH4A_PCIIO_BASE2 + SZ_4M - 1, | 92 | .end = 0x20000000 + SZ_256M - 1, |
73 | .flags = IORESOURCE_IO, | 93 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, |
94 | }, { | ||
95 | .name = "PCIe2 MEM 2", | ||
96 | .start = 0xfcd00000, | ||
97 | .end = 0xfcd00000 + SZ_1M - 1, | ||
74 | }, | 98 | }, |
75 | }; | 99 | }; |
76 | 100 | ||
77 | extern struct pci_ops sh7786_pci_ops; | 101 | extern struct pci_ops sh7786_pci_ops; |
78 | 102 | ||
79 | #define DEFINE_CONTROLLER(start, idx) \ | 103 | #define DEFINE_CONTROLLER(start, idx) \ |
80 | { \ | 104 | { \ |
81 | .pci_ops = &sh7786_pci_ops, \ | 105 | .pci_ops = &sh7786_pci_ops, \ |
82 | .reg_base = start, \ | 106 | .resources = sh7786_pci##idx##_resources, \ |
83 | /* mem_resource filled in at probe time */ \ | 107 | .nr_resources = ARRAY_SIZE(sh7786_pci##idx##_resources), \ |
84 | .mem_offset = 0, \ | 108 | .reg_base = start, \ |
85 | .io_resource = &sh7786_pci_io_resources[idx], \ | 109 | .mem_offset = 0, \ |
86 | .io_offset = 0, \ | 110 | .io_offset = 0, \ |
87 | } | 111 | } |
88 | 112 | ||
89 | static struct pci_channel sh7786_pci_channels[] = { | 113 | static struct pci_channel sh7786_pci_channels[] = { |
@@ -180,7 +204,9 @@ static int pcie_init(struct sh7786_pcie_port *port) | |||
180 | { | 204 | { |
181 | struct pci_channel *chan = port->hose; | 205 | struct pci_channel *chan = port->hose; |
182 | unsigned int data; | 206 | unsigned int data; |
183 | int ret; | 207 | phys_addr_t memphys; |
208 | size_t memsize; | ||
209 | int ret, i; | ||
184 | 210 | ||
185 | /* Begin initialization */ | 211 | /* Begin initialization */ |
186 | pci_write_reg(chan, 0, SH4A_PCIETCTLR); | 212 | pci_write_reg(chan, 0, SH4A_PCIETCTLR); |
@@ -203,15 +229,24 @@ static int pcie_init(struct sh7786_pcie_port *port) | |||
203 | data |= PCI_CAP_ID_EXP; | 229 | data |= PCI_CAP_ID_EXP; |
204 | pci_write_reg(chan, data, SH4A_PCIEEXPCAP0); | 230 | pci_write_reg(chan, data, SH4A_PCIEEXPCAP0); |
205 | 231 | ||
206 | /* Enable x4 link width and extended sync. */ | 232 | /* Enable data link layer active state reporting */ |
233 | pci_write_reg(chan, PCI_EXP_LNKCAP_DLLLARC, SH4A_PCIEEXPCAP3); | ||
234 | |||
235 | /* Enable extended sync and ASPM L0s support */ | ||
207 | data = pci_read_reg(chan, SH4A_PCIEEXPCAP4); | 236 | data = pci_read_reg(chan, SH4A_PCIEEXPCAP4); |
208 | data &= ~(PCI_EXP_LNKSTA_NLW << 16); | 237 | data &= ~PCI_EXP_LNKCTL_ASPMC; |
209 | data |= (1 << 22) | PCI_EXP_LNKCTL_ES; | 238 | data |= PCI_EXP_LNKCTL_ES | 1; |
210 | pci_write_reg(chan, data, SH4A_PCIEEXPCAP4); | 239 | pci_write_reg(chan, data, SH4A_PCIEEXPCAP4); |
211 | 240 | ||
241 | /* Write out the physical slot number */ | ||
242 | data = pci_read_reg(chan, SH4A_PCIEEXPCAP5); | ||
243 | data &= ~PCI_EXP_SLTCAP_PSN; | ||
244 | data |= (port->index + 1) << 19; | ||
245 | pci_write_reg(chan, data, SH4A_PCIEEXPCAP5); | ||
246 | |||
212 | /* Set the completion timer timeout to the maximum 32ms. */ | 247 | /* Set the completion timer timeout to the maximum 32ms. */ |
213 | data = pci_read_reg(chan, SH4A_PCIETLCTLR); | 248 | data = pci_read_reg(chan, SH4A_PCIETLCTLR); |
214 | data &= ~0xffff; | 249 | data &= ~0x3f00; |
215 | data |= 0x32 << 8; | 250 | data |= 0x32 << 8; |
216 | pci_write_reg(chan, data, SH4A_PCIETLCTLR); | 251 | pci_write_reg(chan, data, SH4A_PCIETLCTLR); |
217 | 252 | ||
@@ -224,6 +259,33 @@ static int pcie_init(struct sh7786_pcie_port *port) | |||
224 | data |= (0xff << 16); | 259 | data |= (0xff << 16); |
225 | pci_write_reg(chan, data, SH4A_PCIEMACCTLR); | 260 | pci_write_reg(chan, data, SH4A_PCIEMACCTLR); |
226 | 261 | ||
262 | memphys = __pa(memory_start); | ||
263 | memsize = roundup_pow_of_two(memory_end - memory_start); | ||
264 | |||
265 | /* | ||
266 | * If there's more than 512MB of memory, we need to roll over to | ||
267 | * LAR1/LAMR1. | ||
268 | */ | ||
269 | if (memsize > SZ_512M) { | ||
270 | __raw_writel(memphys + SZ_512M, chan->reg_base + SH4A_PCIELAR1); | ||
271 | __raw_writel(((memsize - SZ_512M) - SZ_256) | 1, | ||
272 | chan->reg_base + SH4A_PCIELAMR1); | ||
273 | memsize = SZ_512M; | ||
274 | } else { | ||
275 | /* | ||
276 | * Otherwise just zero it out and disable it. | ||
277 | */ | ||
278 | __raw_writel(0, chan->reg_base + SH4A_PCIELAR1); | ||
279 | __raw_writel(0, chan->reg_base + SH4A_PCIELAMR1); | ||
280 | } | ||
281 | |||
282 | /* | ||
283 | * LAR0/LAMR0 covers up to the first 512MB, which is enough to | ||
284 | * cover all of lowmem on most platforms. | ||
285 | */ | ||
286 | __raw_writel(memphys, chan->reg_base + SH4A_PCIELAR0); | ||
287 | __raw_writel((memsize - SZ_256) | 1, chan->reg_base + SH4A_PCIELAMR0); | ||
288 | |||
227 | /* Finish initialization */ | 289 | /* Finish initialization */ |
228 | data = pci_read_reg(chan, SH4A_PCIETCTLR); | 290 | data = pci_read_reg(chan, SH4A_PCIETCTLR); |
229 | data |= 0x1; | 291 | data |= 0x1; |
@@ -243,10 +305,14 @@ static int pcie_init(struct sh7786_pcie_port *port) | |||
243 | if (unlikely(ret != 0)) | 305 | if (unlikely(ret != 0)) |
244 | return -ENODEV; | 306 | return -ENODEV; |
245 | 307 | ||
246 | pci_write_reg(chan, 0x00100007, SH4A_PCIEPCICONF1); | 308 | data = pci_read_reg(chan, SH4A_PCIEPCICONF1); |
309 | data &= ~(PCI_STATUS_DEVSEL_MASK << 16); | ||
310 | data |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | | ||
311 | (PCI_STATUS_CAP_LIST | PCI_STATUS_DEVSEL_FAST) << 16; | ||
312 | pci_write_reg(chan, data, SH4A_PCIEPCICONF1); | ||
313 | |||
247 | pci_write_reg(chan, 0x80888000, SH4A_PCIETXVC0DCTLR); | 314 | pci_write_reg(chan, 0x80888000, SH4A_PCIETXVC0DCTLR); |
248 | pci_write_reg(chan, 0x00222000, SH4A_PCIERXVC0DCTLR); | 315 | pci_write_reg(chan, 0x00222000, SH4A_PCIERXVC0DCTLR); |
249 | pci_write_reg(chan, 0x000050A0, SH4A_PCIEEXPCAP2); | ||
250 | 316 | ||
251 | wmb(); | 317 | wmb(); |
252 | 318 | ||
@@ -254,15 +320,32 @@ static int pcie_init(struct sh7786_pcie_port *port) | |||
254 | printk(KERN_NOTICE "PCI: PCIe#%d link width %d\n", | 320 | printk(KERN_NOTICE "PCI: PCIe#%d link width %d\n", |
255 | port->index, (data >> 20) & 0x3f); | 321 | port->index, (data >> 20) & 0x3f); |
256 | 322 | ||
257 | pci_write_reg(chan, 0x007c0000, SH4A_PCIEPAMR0); | ||
258 | pci_write_reg(chan, 0x00000000, SH4A_PCIEPARH0); | ||
259 | pci_write_reg(chan, 0x00000000, SH4A_PCIEPARL0); | ||
260 | pci_write_reg(chan, 0x80000100, SH4A_PCIEPTCTLR0); | ||
261 | 323 | ||
262 | pci_write_reg(chan, 0x03fc0000, SH4A_PCIEPAMR2); | 324 | for (i = 0; i < chan->nr_resources; i++) { |
263 | pci_write_reg(chan, 0x00000000, SH4A_PCIEPARH2); | 325 | struct resource *res = chan->resources + i; |
264 | pci_write_reg(chan, 0x00000000, SH4A_PCIEPARL2); | 326 | resource_size_t size; |
265 | pci_write_reg(chan, 0x80000000, SH4A_PCIEPTCTLR2); | 327 | u32 enable_mask; |
328 | |||
329 | pci_write_reg(chan, 0x00000000, SH4A_PCIEPTCTLR(i)); | ||
330 | |||
331 | size = resource_size(res); | ||
332 | |||
333 | /* | ||
334 | * The PAMR mask is calculated in units of 256kB, which | ||
335 | * keeps things pretty simple. | ||
336 | */ | ||
337 | __raw_writel(((roundup_pow_of_two(size) / SZ_256K) - 1) << 18, | ||
338 | chan->reg_base + SH4A_PCIEPAMR(i)); | ||
339 | |||
340 | pci_write_reg(chan, 0x00000000, SH4A_PCIEPARH(i)); | ||
341 | pci_write_reg(chan, 0x00000000, SH4A_PCIEPARL(i)); | ||
342 | |||
343 | enable_mask = MASK_PARE; | ||
344 | if (res->flags & IORESOURCE_IO) | ||
345 | enable_mask |= MASK_SPC; | ||
346 | |||
347 | pci_write_reg(chan, enable_mask, SH4A_PCIEPTCTLR(i)); | ||
348 | } | ||
266 | 349 | ||
267 | return 0; | 350 | return 0; |
268 | } | 351 | } |
@@ -296,9 +379,7 @@ static int __devinit sh7786_pcie_init_hw(struct sh7786_pcie_port *port) | |||
296 | if (unlikely(ret < 0)) | 379 | if (unlikely(ret < 0)) |
297 | return ret; | 380 | return ret; |
298 | 381 | ||
299 | register_pci_controller(port->hose); | 382 | return register_pci_controller(port->hose); |
300 | |||
301 | return 0; | ||
302 | } | 383 | } |
303 | 384 | ||
304 | static struct sh7786_pcie_hwops sh7786_65nm_pcie_hwops __initdata = { | 385 | static struct sh7786_pcie_hwops sh7786_65nm_pcie_hwops __initdata = { |
@@ -332,17 +413,7 @@ static int __init sh7786_pcie_init(void) | |||
332 | 413 | ||
333 | port->index = i; | 414 | port->index = i; |
334 | port->hose = sh7786_pci_channels + i; | 415 | port->hose = sh7786_pci_channels + i; |
335 | port->hose->io_map_base = port->hose->io_resource->start; | 416 | port->hose->io_map_base = port->hose->resources[0].start; |
336 | |||
337 | /* | ||
338 | * Check if we are booting in 29 or 32-bit mode | ||
339 | * | ||
340 | * 32-bit mode provides each controller with its own | ||
341 | * memory window, while 29-bit mode uses a shared one. | ||
342 | */ | ||
343 | port->hose->mem_resource = test_mode_pin(MODE_PIN10) ? | ||
344 | &sh7786_pci_32bit_mem_resources[i] : | ||
345 | &sh7786_pci_29bit_mem_resource; | ||
346 | 417 | ||
347 | ret |= sh7786_pcie_hwops->port_init_hw(port); | 418 | ret |= sh7786_pcie_hwops->port_init_hw(port); |
348 | } | 419 | } |
diff --git a/arch/sh/drivers/pci/pcie-sh7786.h b/arch/sh/drivers/pci/pcie-sh7786.h index c655290a7750..90a6992576b0 100644 --- a/arch/sh/drivers/pci/pcie-sh7786.h +++ b/arch/sh/drivers/pci/pcie-sh7786.h | |||
@@ -30,47 +30,9 @@ | |||
30 | * for other(Max Payload Size=4096B,PCIIO_SIZE=8M) | 30 | * for other(Max Payload Size=4096B,PCIIO_SIZE=8M) |
31 | */ | 31 | */ |
32 | 32 | ||
33 | /* PCI0-0: PCI I/O space */ | ||
34 | #define SH4A_PCIIO_BASE 0xFD000000 /* PCI I/O for controller 0 */ | ||
35 | #define SH4A_PCIIO_BASE1 0xFD800000 /* PCI I/O for controller 1 (Rev1.14)*/ | ||
36 | #define SH4A_PCIIO_BASE2 0xFC800000 /* PCI I/O for controller 2 (Rev1.171)*/ | ||
37 | |||
38 | #define SH4A_PCIIO_SIZE64 0x00010000 /* PLX allows only 64K */ | ||
39 | #define SH4A_PCIIO_SIZE 0x00800000 /* 8M */ | ||
40 | #define SH4A_PCIIO_SIZE2 0x00400000 /* 4M (Rev1.171)*/ | ||
41 | |||
42 | /* PCI0-1: PCI memory space 29-bit address */ | ||
43 | #define SH4A_PCIMEM_BASE 0x10000000 | ||
44 | #define SH4A_PCIMEM_SIZE 0x04000000 /* 64M */ | ||
45 | |||
46 | /* PCI0-2: PCI memory space 32-bit address */ | ||
47 | #define SH4A_PCIMEM_BASEA 0xC0000000 /* for controller 0 */ | ||
48 | #define SH4A_PCIMEM_BASEA1 0xA0000000 /* for controller 1 (Rev1.14)*/ | ||
49 | #define SH4A_PCIMEM_BASEA2 0x80000000 /* for controller 2 (Rev1.171)*/ | ||
50 | #define SH4A_PCIMEM_SIZEA 0x20000000 /* 512M */ | ||
51 | |||
52 | /* PCI0: PCI memory target transfer 32-bit address translation value(Rev1.11T)*/ | 33 | /* PCI0: PCI memory target transfer 32-bit address translation value(Rev1.11T)*/ |
53 | #define SH4A_PCIBMSTR_TRANSLATION 0x20000000 | 34 | #define SH4A_PCIBMSTR_TRANSLATION 0x20000000 |
54 | 35 | ||
55 | #define SH4A_PCI_DEVICE_ID 0x0002 | ||
56 | #define SH4A_PCI_VENDOR_ID 0x1912 | ||
57 | |||
58 | // PCI compatible 000-03f | ||
59 | #define PCI_CMD 0x004 | ||
60 | #define PCI_RID 0x008 | ||
61 | #define PCI_IBAR 0x010 | ||
62 | #define PCI_MBAR0 0x014 | ||
63 | #define PCI_MBAR1 0x018 | ||
64 | |||
65 | /* PCI power management/MSI/capablity 040-0ff */ | ||
66 | /* PCIE extended 100-fff */ | ||
67 | |||
68 | /* SH7786 device identification */ // Rev1.171 | ||
69 | #define SH4A_PVR (0xFF000030) | ||
70 | #define SH4A_PVR_SHX3 (0x10400000) | ||
71 | #define SH4A_PRR (0xFF000044) | ||
72 | #define SH4A_PRR_SH7786 (0x00000400) // Rev1.171 | ||
73 | |||
74 | /* SPVCR0 */ | 36 | /* SPVCR0 */ |
75 | #define SH4A_PCIEVCR0 (0x000000) /* R - 0x0000 0000 32 */ | 37 | #define SH4A_PCIEVCR0 (0x000000) /* R - 0x0000 0000 32 */ |
76 | #define BITS_TOP_MB (24) | 38 | #define BITS_TOP_MB (24) |
@@ -350,23 +312,23 @@ | |||
350 | #define SH4A_PCIECSAR5 (0x0202B4) /* R/W R/W 0x0000 0000 32 */ | 312 | #define SH4A_PCIECSAR5 (0x0202B4) /* R/W R/W 0x0000 0000 32 */ |
351 | #define SH4A_PCIESTCTLR5 (0x0202B8) /* R/W R/W 0x0000 0000 32 */ | 313 | #define SH4A_PCIESTCTLR5 (0x0202B8) /* R/W R/W 0x0000 0000 32 */ |
352 | 314 | ||
353 | /* PCIEPARL0 */ | 315 | /* PCIEPARL */ |
354 | #define SH4A_PCIEPARL0 (0x020400) /* R/W R/W 0x0000 0000 32 */ | 316 | #define SH4A_PCIEPARL(x) (0x020400 + ((x) * 0x20)) /* R/W R/W 0x0000 0000 32 */ |
355 | #define BITS_PAL (18) | 317 | #define BITS_PAL (18) |
356 | #define MASK_PAL (0x3fff<<BITS_PAL) | 318 | #define MASK_PAL (0x3fff<<BITS_PAL) |
357 | 319 | ||
358 | /* PCIEPARH0 */ | 320 | /* PCIEPARH */ |
359 | #define SH4A_PCIEPARH0 (0x020404) /* R/W R/W 0x0000 0000 32 */ | 321 | #define SH4A_PCIEPARH(x) (0x020404 + ((x) * 0x20)) /* R/W R/W 0x0000 0000 32 */ |
360 | #define BITS_PAH (0) | 322 | #define BITS_PAH (0) |
361 | #define MASK_PAH (0xffffffff<<BITS_PAH) | 323 | #define MASK_PAH (0xffffffff<<BITS_PAH) |
362 | 324 | ||
363 | /* PCIEPAMR0 */ | 325 | /* PCIEPAMR */ |
364 | #define SH4A_PCIEPAMR0 (0x020408) /* R/W R/W 0x0000 0000 32 */ | 326 | #define SH4A_PCIEPAMR(x) (0x020408 + ((x) * 0x20)) /* R/W R/W 0x0000 0000 32 */ |
365 | #define BITS_PAM (18) | 327 | #define BITS_PAM (18) |
366 | #define MASK_PAM (0x3fff<<BITS_PAM) | 328 | #define MASK_PAM (0x3fff<<BITS_PAM) |
367 | 329 | ||
368 | /* PCIEPTCTLR0 */ | 330 | /* PCIEPTCTLR */ |
369 | #define SH4A_PCIEPTCTLR0 (0x02040C) /* R/W R/W 0x0000 0000 32 */ | 331 | #define SH4A_PCIEPTCTLR(x) (0x02040C + ((x) * 0x20)) |
370 | #define BITS_PARE (31) | 332 | #define BITS_PARE (31) |
371 | #define MASK_PARE (0x1<<BITS_PARE) | 333 | #define MASK_PARE (0x1<<BITS_PARE) |
372 | #define BITS_TC (20) | 334 | #define BITS_TC (20) |
@@ -378,26 +340,6 @@ | |||
378 | #define BITS_SPC (8) | 340 | #define BITS_SPC (8) |
379 | #define MASK_SPC (0x1<<BITS_SPC) | 341 | #define MASK_SPC (0x1<<BITS_SPC) |
380 | 342 | ||
381 | #define SH4A_PCIEPARL1 (0x020420) /* R/W R/W 0x0000 0000 32 */ | ||
382 | #define SH4A_PCIEPARH1 (0x020424) /* R/W R/W 0x0000 0000 32 */ | ||
383 | #define SH4A_PCIEPAMR1 (0x020428) /* R/W R/W 0x0000 0000 32 */ | ||
384 | #define SH4A_PCIEPTCTLR1 (0x02042C) /* R/W R/W 0x0000 0000 32 */ | ||
385 | #define SH4A_PCIEPARL2 (0x020440) /* R/W R/W 0x0000 0000 32 */ | ||
386 | #define SH4A_PCIEPARH2 (0x020444) /* R/W R/W 0x0000 0000 32 */ | ||
387 | #define SH4A_PCIEPAMR2 (0x020448) /* R/W R/W 0x0000 0000 32 */ | ||
388 | #define SH4A_PCIEPTCTLR2 (0x02044C) /* R/W R/W 0x0000 0000 32 */ | ||
389 | #define SH4A_PCIEPARL3 (0x020460) /* R/W R/W 0x0000 0000 32 */ | ||
390 | #define SH4A_PCIEPARH3 (0x020464) /* R/W R/W 0x0000 0000 32 */ | ||
391 | #define SH4A_PCIEPAMR3 (0x020468) /* R/W R/W 0x0000 0000 32 */ | ||
392 | #define SH4A_PCIEPTCTLR3 (0x02046C) /* R/W R/W 0x0000 0000 32 */ | ||
393 | #define SH4A_PCIEPARL4 (0x020480) /* R/W R/W 0x0000 0000 32 */ | ||
394 | #define SH4A_PCIEPARH4 (0x020484) /* R/W R/W 0x0000 0000 32 */ | ||
395 | #define SH4A_PCIEPAMR4 (0x020488) /* R/W R/W 0x0000 0000 32 */ | ||
396 | #define SH4A_PCIEPTCTLR4 (0x02048C) /* R/W R/W 0x0000 0000 32 */ | ||
397 | #define SH4A_PCIEPARL5 (0x0204A0) /* R/W R/W 0x0000 0000 32 */ | ||
398 | #define SH4A_PCIEPARH5 (0x0204A4) /* R/W R/W 0x0000 0000 32 */ | ||
399 | #define SH4A_PCIEPAMR5 (0x0204A8) /* R/W R/W 0x0000 0000 32 */ | ||
400 | #define SH4A_PCIEPTCTLR5 (0x0204AC) /* R/W R/W 0x0000 0000 32 */ | ||
401 | #define SH4A_PCIEDMAOR (0x021000) /* R/W R/W 0x0000 0000 32 */ | 343 | #define SH4A_PCIEDMAOR (0x021000) /* R/W R/W 0x0000 0000 32 */ |
402 | #define SH4A_PCIEDMSAR0 (0x021100) /* R/W R/W 0x0000 0000 32 */ | 344 | #define SH4A_PCIEDMSAR0 (0x021100) /* R/W R/W 0x0000 0000 32 */ |
403 | #define SH4A_PCIEDMSAHR0 (0x021104) /* R/W R/W 0x0000 0000 32 */ | 345 | #define SH4A_PCIEDMSAHR0 (0x021104) /* R/W R/W 0x0000 0000 32 */ |
diff --git a/arch/sh/drivers/superhyway/ops-sh4-202.c b/arch/sh/drivers/superhyway/ops-sh4-202.c index 3b14bf860db6..6da62e9475c4 100644 --- a/arch/sh/drivers/superhyway/ops-sh4-202.c +++ b/arch/sh/drivers/superhyway/ops-sh4-202.c | |||
@@ -134,8 +134,8 @@ static int sh4202_read_vcr(unsigned long base, struct superhyway_vcr_info *vcr) | |||
134 | * | 134 | * |
135 | * Do not trust the documentation, for it is evil. | 135 | * Do not trust the documentation, for it is evil. |
136 | */ | 136 | */ |
137 | vcrh = ctrl_inl(base); | 137 | vcrh = __raw_readl(base); |
138 | vcrl = ctrl_inl(base + sizeof(u32)); | 138 | vcrl = __raw_readl(base + sizeof(u32)); |
139 | 139 | ||
140 | tmp = ((u64)vcrh << 32) | vcrl; | 140 | tmp = ((u64)vcrh << 32) | vcrl; |
141 | memcpy(vcr, &tmp, sizeof(u64)); | 141 | memcpy(vcr, &tmp, sizeof(u64)); |
@@ -147,8 +147,8 @@ static int sh4202_write_vcr(unsigned long base, struct superhyway_vcr_info vcr) | |||
147 | { | 147 | { |
148 | u64 tmp = *(u64 *)&vcr; | 148 | u64 tmp = *(u64 *)&vcr; |
149 | 149 | ||
150 | ctrl_outl((tmp >> 32) & 0xffffffff, base); | 150 | __raw_writel((tmp >> 32) & 0xffffffff, base); |
151 | ctrl_outl(tmp & 0xffffffff, base + sizeof(u32)); | 151 | __raw_writel(tmp & 0xffffffff, base + sizeof(u32)); |
152 | 152 | ||
153 | return 0; | 153 | return 0; |
154 | } | 154 | } |
diff --git a/arch/sh/include/asm/Kbuild b/arch/sh/include/asm/Kbuild index e121c30f797d..46cb93477bcb 100644 --- a/arch/sh/include/asm/Kbuild +++ b/arch/sh/include/asm/Kbuild | |||
@@ -1,6 +1,8 @@ | |||
1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
2 | 2 | ||
3 | header-y += cachectl.h cpu-features.h | 3 | header-y += cachectl.h |
4 | header-y += cpu-features.h | ||
5 | header-y += hw_breakpoint.h | ||
4 | 6 | ||
5 | unifdef-y += unistd_32.h | 7 | unifdef-y += unistd_32.h |
6 | unifdef-y += unistd_64.h | 8 | unifdef-y += unistd_64.h |
diff --git a/arch/sh/include/asm/addrspace.h b/arch/sh/include/asm/addrspace.h index 99d6b3ecbe22..446b3831c214 100644 --- a/arch/sh/include/asm/addrspace.h +++ b/arch/sh/include/asm/addrspace.h | |||
@@ -28,7 +28,7 @@ | |||
28 | /* Returns the privileged segment base of a given address */ | 28 | /* Returns the privileged segment base of a given address */ |
29 | #define PXSEG(a) (((unsigned long)(a)) & 0xe0000000) | 29 | #define PXSEG(a) (((unsigned long)(a)) & 0xe0000000) |
30 | 30 | ||
31 | #if defined(CONFIG_29BIT) || defined(CONFIG_PMB_FIXED) | 31 | #ifdef CONFIG_29BIT |
32 | /* | 32 | /* |
33 | * Map an address to a certain privileged segment | 33 | * Map an address to a certain privileged segment |
34 | */ | 34 | */ |
@@ -40,7 +40,15 @@ | |||
40 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG)) | 40 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG)) |
41 | #define P4SEGADDR(a) \ | 41 | #define P4SEGADDR(a) \ |
42 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG)) | 42 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG)) |
43 | #endif /* 29BIT || PMB_FIXED */ | 43 | #else |
44 | /* | ||
45 | * These will never work in 32-bit, don't even bother. | ||
46 | */ | ||
47 | #define P1SEGADDR(a) __futile_remapping_attempt | ||
48 | #define P2SEGADDR(a) __futile_remapping_attempt | ||
49 | #define P3SEGADDR(a) __futile_remapping_attempt | ||
50 | #define P4SEGADDR(a) __futile_remapping_attempt | ||
51 | #endif | ||
44 | #endif /* P1SEG */ | 52 | #endif /* P1SEG */ |
45 | 53 | ||
46 | /* Check if an address can be reached in 29 bits */ | 54 | /* Check if an address can be reached in 29 bits */ |
@@ -57,11 +65,5 @@ | |||
57 | #define P3_ADDR_MAX P4SEG | 65 | #define P3_ADDR_MAX P4SEG |
58 | #endif | 66 | #endif |
59 | 67 | ||
60 | #ifndef __ASSEMBLY__ | ||
61 | #ifdef CONFIG_PMB | ||
62 | extern int __in_29bit_mode(void); | ||
63 | #endif /* CONFIG_PMB */ | ||
64 | #endif /* __ASSEMBLY__ */ | ||
65 | |||
66 | #endif /* __KERNEL__ */ | 68 | #endif /* __KERNEL__ */ |
67 | #endif /* __ASM_SH_ADDRSPACE_H */ | 69 | #endif /* __ASM_SH_ADDRSPACE_H */ |
diff --git a/arch/sh/include/asm/alignment.h b/arch/sh/include/asm/alignment.h new file mode 100644 index 000000000000..b12efecf5294 --- /dev/null +++ b/arch/sh/include/asm/alignment.h | |||
@@ -0,0 +1,21 @@ | |||
1 | #ifndef __ASM_SH_ALIGNMENT_H | ||
2 | #define __ASM_SH_ALIGNMENT_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | extern void inc_unaligned_byte_access(void); | ||
7 | extern void inc_unaligned_word_access(void); | ||
8 | extern void inc_unaligned_dword_access(void); | ||
9 | extern void inc_unaligned_multi_access(void); | ||
10 | extern void inc_unaligned_user_access(void); | ||
11 | extern void inc_unaligned_kernel_access(void); | ||
12 | |||
13 | #define UM_WARN (1 << 0) | ||
14 | #define UM_FIXUP (1 << 1) | ||
15 | #define UM_SIGNAL (1 << 2) | ||
16 | |||
17 | extern unsigned int unaligned_user_action(void); | ||
18 | |||
19 | extern void unaligned_fixups_notify(struct task_struct *, insn_size_t, struct pt_regs *); | ||
20 | |||
21 | #endif /* __ASM_SH_ALIGNMENT_H */ | ||
diff --git a/arch/sh/include/asm/atomic-grb.h b/arch/sh/include/asm/atomic-grb.h index 4c5b7dbfcedb..a273c88578fc 100644 --- a/arch/sh/include/asm/atomic-grb.h +++ b/arch/sh/include/asm/atomic-grb.h | |||
@@ -120,50 +120,4 @@ static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | |||
120 | : "memory" , "r0", "r1"); | 120 | : "memory" , "r0", "r1"); |
121 | } | 121 | } |
122 | 122 | ||
123 | static inline int atomic_cmpxchg(atomic_t *v, int old, int new) | ||
124 | { | ||
125 | int ret; | ||
126 | |||
127 | __asm__ __volatile__ ( | ||
128 | " .align 2 \n\t" | ||
129 | " mova 1f, r0 \n\t" | ||
130 | " nop \n\t" | ||
131 | " mov r15, r1 \n\t" | ||
132 | " mov #-8, r15 \n\t" | ||
133 | " mov.l @%1, %0 \n\t" | ||
134 | " cmp/eq %2, %0 \n\t" | ||
135 | " bf 1f \n\t" | ||
136 | " mov.l %3, @%1 \n\t" | ||
137 | "1: mov r1, r15 \n\t" | ||
138 | : "=&r" (ret) | ||
139 | : "r" (v), "r" (old), "r" (new) | ||
140 | : "memory" , "r0", "r1" , "t"); | ||
141 | |||
142 | return ret; | ||
143 | } | ||
144 | |||
145 | static inline int atomic_add_unless(atomic_t *v, int a, int u) | ||
146 | { | ||
147 | int ret; | ||
148 | unsigned long tmp; | ||
149 | |||
150 | __asm__ __volatile__ ( | ||
151 | " .align 2 \n\t" | ||
152 | " mova 1f, r0 \n\t" | ||
153 | " nop \n\t" | ||
154 | " mov r15, r1 \n\t" | ||
155 | " mov #-12, r15 \n\t" | ||
156 | " mov.l @%2, %1 \n\t" | ||
157 | " mov %1, %0 \n\t" | ||
158 | " cmp/eq %4, %0 \n\t" | ||
159 | " bt/s 1f \n\t" | ||
160 | " add %3, %1 \n\t" | ||
161 | " mov.l %1, @%2 \n\t" | ||
162 | "1: mov r1, r15 \n\t" | ||
163 | : "=&r" (ret), "=&r" (tmp) | ||
164 | : "r" (v), "r" (a), "r" (u) | ||
165 | : "memory" , "r0", "r1" , "t"); | ||
166 | |||
167 | return ret != u; | ||
168 | } | ||
169 | #endif /* __ASM_SH_ATOMIC_GRB_H */ | 123 | #endif /* __ASM_SH_ATOMIC_GRB_H */ |
diff --git a/arch/sh/include/asm/atomic-llsc.h b/arch/sh/include/asm/atomic-llsc.h index b040e1e08610..4b00b78e3f4f 100644 --- a/arch/sh/include/asm/atomic-llsc.h +++ b/arch/sh/include/asm/atomic-llsc.h | |||
@@ -104,31 +104,4 @@ static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | |||
104 | : "t"); | 104 | : "t"); |
105 | } | 105 | } |
106 | 106 | ||
107 | #define atomic_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n))) | ||
108 | |||
109 | /** | ||
110 | * atomic_add_unless - add unless the number is a given value | ||
111 | * @v: pointer of type atomic_t | ||
112 | * @a: the amount to add to v... | ||
113 | * @u: ...unless v is equal to u. | ||
114 | * | ||
115 | * Atomically adds @a to @v, so long as it was not @u. | ||
116 | * Returns non-zero if @v was not @u, and zero otherwise. | ||
117 | */ | ||
118 | static inline int atomic_add_unless(atomic_t *v, int a, int u) | ||
119 | { | ||
120 | int c, old; | ||
121 | c = atomic_read(v); | ||
122 | for (;;) { | ||
123 | if (unlikely(c == (u))) | ||
124 | break; | ||
125 | old = atomic_cmpxchg((v), c, c + (a)); | ||
126 | if (likely(old == c)) | ||
127 | break; | ||
128 | c = old; | ||
129 | } | ||
130 | |||
131 | return c != (u); | ||
132 | } | ||
133 | |||
134 | #endif /* __ASM_SH_ATOMIC_LLSC_H */ | 107 | #endif /* __ASM_SH_ATOMIC_LLSC_H */ |
diff --git a/arch/sh/include/asm/atomic.h b/arch/sh/include/asm/atomic.h index b16388d71954..275a448ae8c2 100644 --- a/arch/sh/include/asm/atomic.h +++ b/arch/sh/include/asm/atomic.h | |||
@@ -25,58 +25,43 @@ | |||
25 | #endif | 25 | #endif |
26 | 26 | ||
27 | #define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0) | 27 | #define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0) |
28 | #define atomic_dec_return(v) atomic_sub_return(1, (v)) | ||
29 | #define atomic_inc_return(v) atomic_add_return(1, (v)) | ||
30 | #define atomic_inc_and_test(v) (atomic_inc_return(v) == 0) | ||
31 | #define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0) | ||
32 | #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) | ||
33 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | ||
28 | 34 | ||
29 | #define atomic_dec_return(v) atomic_sub_return(1,(v)) | 35 | #define atomic_inc(v) atomic_add(1, (v)) |
30 | #define atomic_inc_return(v) atomic_add_return(1,(v)) | 36 | #define atomic_dec(v) atomic_sub(1, (v)) |
31 | 37 | ||
32 | /* | 38 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) |
33 | * atomic_inc_and_test - increment and test | 39 | #define atomic_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n))) |
40 | |||
41 | /** | ||
42 | * atomic_add_unless - add unless the number is a given value | ||
34 | * @v: pointer of type atomic_t | 43 | * @v: pointer of type atomic_t |
44 | * @a: the amount to add to v... | ||
45 | * @u: ...unless v is equal to u. | ||
35 | * | 46 | * |
36 | * Atomically increments @v by 1 | 47 | * Atomically adds @a to @v, so long as it was not @u. |
37 | * and returns true if the result is zero, or false for all | 48 | * Returns non-zero if @v was not @u, and zero otherwise. |
38 | * other cases. | ||
39 | */ | 49 | */ |
40 | #define atomic_inc_and_test(v) (atomic_inc_return(v) == 0) | ||
41 | |||
42 | #define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0) | ||
43 | #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) | ||
44 | |||
45 | #define atomic_inc(v) atomic_add(1,(v)) | ||
46 | #define atomic_dec(v) atomic_sub(1,(v)) | ||
47 | |||
48 | #if !defined(CONFIG_GUSA_RB) && !defined(CONFIG_CPU_SH4A) | ||
49 | static inline int atomic_cmpxchg(atomic_t *v, int old, int new) | ||
50 | { | ||
51 | int ret; | ||
52 | unsigned long flags; | ||
53 | |||
54 | local_irq_save(flags); | ||
55 | ret = v->counter; | ||
56 | if (likely(ret == old)) | ||
57 | v->counter = new; | ||
58 | local_irq_restore(flags); | ||
59 | |||
60 | return ret; | ||
61 | } | ||
62 | |||
63 | static inline int atomic_add_unless(atomic_t *v, int a, int u) | 50 | static inline int atomic_add_unless(atomic_t *v, int a, int u) |
64 | { | 51 | { |
65 | int ret; | 52 | int c, old; |
66 | unsigned long flags; | 53 | c = atomic_read(v); |
67 | 54 | for (;;) { | |
68 | local_irq_save(flags); | 55 | if (unlikely(c == (u))) |
69 | ret = v->counter; | 56 | break; |
70 | if (ret != u) | 57 | old = atomic_cmpxchg((v), c, c + (a)); |
71 | v->counter += a; | 58 | if (likely(old == c)) |
72 | local_irq_restore(flags); | 59 | break; |
73 | 60 | c = old; | |
74 | return ret != u; | 61 | } |
62 | |||
63 | return c != (u); | ||
75 | } | 64 | } |
76 | #endif /* !CONFIG_GUSA_RB && !CONFIG_CPU_SH4A */ | ||
77 | |||
78 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) | ||
79 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | ||
80 | 65 | ||
81 | #define smp_mb__before_atomic_dec() smp_mb() | 66 | #define smp_mb__before_atomic_dec() smp_mb() |
82 | #define smp_mb__after_atomic_dec() smp_mb() | 67 | #define smp_mb__after_atomic_dec() smp_mb() |
diff --git a/arch/sh/include/asm/clock.h b/arch/sh/include/asm/clock.h index 9fe7d7f8af40..11da4c5beb68 100644 --- a/arch/sh/include/asm/clock.h +++ b/arch/sh/include/asm/clock.h | |||
@@ -146,8 +146,17 @@ int sh_clk_mstp32_register(struct clk *clks, int nr); | |||
146 | .flags = _flags, \ | 146 | .flags = _flags, \ |
147 | } | 147 | } |
148 | 148 | ||
149 | struct clk_div4_table { | ||
150 | struct clk_div_mult_table *div_mult_table; | ||
151 | void (*kick)(struct clk *clk); | ||
152 | }; | ||
153 | |||
149 | int sh_clk_div4_register(struct clk *clks, int nr, | 154 | int sh_clk_div4_register(struct clk *clks, int nr, |
150 | struct clk_div_mult_table *table); | 155 | struct clk_div4_table *table); |
156 | int sh_clk_div4_enable_register(struct clk *clks, int nr, | ||
157 | struct clk_div4_table *table); | ||
158 | int sh_clk_div4_reparent_register(struct clk *clks, int nr, | ||
159 | struct clk_div4_table *table); | ||
151 | 160 | ||
152 | #define SH_CLK_DIV6(_name, _parent, _reg, _flags) \ | 161 | #define SH_CLK_DIV6(_name, _parent, _reg, _flags) \ |
153 | { \ | 162 | { \ |
diff --git a/arch/sh/include/asm/cmpxchg-grb.h b/arch/sh/include/asm/cmpxchg-grb.h index e2681abe764f..4676bf57693a 100644 --- a/arch/sh/include/asm/cmpxchg-grb.h +++ b/arch/sh/include/asm/cmpxchg-grb.h | |||
@@ -57,11 +57,10 @@ static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old, | |||
57 | " mov.l @%1, %0 \n\t" /* load old value */ | 57 | " mov.l @%1, %0 \n\t" /* load old value */ |
58 | " cmp/eq %0, %2 \n\t" | 58 | " cmp/eq %0, %2 \n\t" |
59 | " bf 1f \n\t" /* if not equal */ | 59 | " bf 1f \n\t" /* if not equal */ |
60 | " mov.l %2, @%1 \n\t" /* store new value */ | 60 | " mov.l %3, @%1 \n\t" /* store new value */ |
61 | "1: mov r1, r15 \n\t" /* LOGOUT */ | 61 | "1: mov r1, r15 \n\t" /* LOGOUT */ |
62 | : "=&r" (retval), | 62 | : "=&r" (retval) |
63 | "+r" (m) | 63 | : "r" (m), "r" (old), "r" (new) |
64 | : "r" (new) | ||
65 | : "memory" , "r0", "r1", "t"); | 64 | : "memory" , "r0", "r1", "t"); |
66 | 65 | ||
67 | return retval; | 66 | return retval; |
diff --git a/arch/sh/include/asm/dma-mapping.h b/arch/sh/include/asm/dma-mapping.h index 87ced133a363..bea3337a426a 100644 --- a/arch/sh/include/asm/dma-mapping.h +++ b/arch/sh/include/asm/dma-mapping.h | |||
@@ -89,8 +89,6 @@ static inline void dma_free_coherent(struct device *dev, size_t size, | |||
89 | { | 89 | { |
90 | struct dma_map_ops *ops = get_dma_ops(dev); | 90 | struct dma_map_ops *ops = get_dma_ops(dev); |
91 | 91 | ||
92 | WARN_ON(irqs_disabled()); /* for portability */ | ||
93 | |||
94 | if (dma_release_from_coherent(dev, get_order(size), vaddr)) | 92 | if (dma_release_from_coherent(dev, get_order(size), vaddr)) |
95 | return; | 93 | return; |
96 | 94 | ||
diff --git a/arch/sh/include/asm/dma-sh.h b/arch/sh/include/asm/dma-sh.h index 78eed3e0bdf5..e934a2e66651 100644 --- a/arch/sh/include/asm/dma-sh.h +++ b/arch/sh/include/asm/dma-sh.h | |||
@@ -20,14 +20,14 @@ | |||
20 | defined(CONFIG_CPU_SUBTYPE_SH7780) || \ | 20 | defined(CONFIG_CPU_SUBTYPE_SH7780) || \ |
21 | defined(CONFIG_CPU_SUBTYPE_SH7785) | 21 | defined(CONFIG_CPU_SUBTYPE_SH7785) |
22 | #define dmaor_read_reg(n) \ | 22 | #define dmaor_read_reg(n) \ |
23 | (n ? ctrl_inw(SH_DMAC_BASE1 + DMAOR) \ | 23 | (n ? __raw_readw(SH_DMAC_BASE1 + DMAOR) \ |
24 | : ctrl_inw(SH_DMAC_BASE0 + DMAOR)) | 24 | : __raw_readw(SH_DMAC_BASE0 + DMAOR)) |
25 | #define dmaor_write_reg(n, data) \ | 25 | #define dmaor_write_reg(n, data) \ |
26 | (n ? ctrl_outw(data, SH_DMAC_BASE1 + DMAOR) \ | 26 | (n ? __raw_writew(data, SH_DMAC_BASE1 + DMAOR) \ |
27 | : ctrl_outw(data, SH_DMAC_BASE0 + DMAOR)) | 27 | : __raw_writew(data, SH_DMAC_BASE0 + DMAOR)) |
28 | #else /* Other CPU */ | 28 | #else /* Other CPU */ |
29 | #define dmaor_read_reg(n) ctrl_inw(SH_DMAC_BASE0 + DMAOR) | 29 | #define dmaor_read_reg(n) __raw_readw(SH_DMAC_BASE0 + DMAOR) |
30 | #define dmaor_write_reg(n, data) ctrl_outw(data, SH_DMAC_BASE0 + DMAOR) | 30 | #define dmaor_write_reg(n, data) __raw_writew(data, SH_DMAC_BASE0 + DMAOR) |
31 | #endif | 31 | #endif |
32 | 32 | ||
33 | static int dmte_irq_map[] __maybe_unused = { | 33 | static int dmte_irq_map[] __maybe_unused = { |
@@ -64,8 +64,10 @@ static int dmte_irq_map[] __maybe_unused = { | |||
64 | #define ACK_L 0x00010000 | 64 | #define ACK_L 0x00010000 |
65 | #define DM_INC 0x00004000 | 65 | #define DM_INC 0x00004000 |
66 | #define DM_DEC 0x00008000 | 66 | #define DM_DEC 0x00008000 |
67 | #define DM_FIX 0x0000c000 | ||
67 | #define SM_INC 0x00001000 | 68 | #define SM_INC 0x00001000 |
68 | #define SM_DEC 0x00002000 | 69 | #define SM_DEC 0x00002000 |
70 | #define SM_FIX 0x00003000 | ||
69 | #define RS_IN 0x00000200 | 71 | #define RS_IN 0x00000200 |
70 | #define RS_OUT 0x00000300 | 72 | #define RS_OUT 0x00000300 |
71 | #define TS_BLK 0x00000040 | 73 | #define TS_BLK 0x00000040 |
@@ -83,7 +85,7 @@ static int dmte_irq_map[] __maybe_unused = { | |||
83 | * Define the default configuration for dual address memory-memory transfer. | 85 | * Define the default configuration for dual address memory-memory transfer. |
84 | * The 0x400 value represents auto-request, external->external. | 86 | * The 0x400 value represents auto-request, external->external. |
85 | */ | 87 | */ |
86 | #define RS_DUAL (DM_INC | SM_INC | 0x400 | TS_32) | 88 | #define RS_DUAL (DM_INC | SM_INC | 0x400 | TS_INDEX2VAL(XMIT_SZ_32BIT)) |
87 | 89 | ||
88 | /* DMA base address */ | 90 | /* DMA base address */ |
89 | static u32 dma_base_addr[] __maybe_unused = { | 91 | static u32 dma_base_addr[] __maybe_unused = { |
@@ -123,10 +125,47 @@ static u32 dma_base_addr[] __maybe_unused = { | |||
123 | */ | 125 | */ |
124 | #define SHDMA_MIX_IRQ (1 << 1) | 126 | #define SHDMA_MIX_IRQ (1 << 1) |
125 | #define SHDMA_DMAOR1 (1 << 2) | 127 | #define SHDMA_DMAOR1 (1 << 2) |
126 | #define SHDMA_DMAE1 (1 << 3) | 128 | #define SHDMA_DMAE1 (1 << 3) |
129 | |||
130 | enum sh_dmae_slave_chan_id { | ||
131 | SHDMA_SLAVE_SCIF0_TX, | ||
132 | SHDMA_SLAVE_SCIF0_RX, | ||
133 | SHDMA_SLAVE_SCIF1_TX, | ||
134 | SHDMA_SLAVE_SCIF1_RX, | ||
135 | SHDMA_SLAVE_SCIF2_TX, | ||
136 | SHDMA_SLAVE_SCIF2_RX, | ||
137 | SHDMA_SLAVE_SCIF3_TX, | ||
138 | SHDMA_SLAVE_SCIF3_RX, | ||
139 | SHDMA_SLAVE_SCIF4_TX, | ||
140 | SHDMA_SLAVE_SCIF4_RX, | ||
141 | SHDMA_SLAVE_SCIF5_TX, | ||
142 | SHDMA_SLAVE_SCIF5_RX, | ||
143 | SHDMA_SLAVE_SIUA_TX, | ||
144 | SHDMA_SLAVE_SIUA_RX, | ||
145 | SHDMA_SLAVE_SIUB_TX, | ||
146 | SHDMA_SLAVE_SIUB_RX, | ||
147 | SHDMA_SLAVE_NUMBER, /* Must stay last */ | ||
148 | }; | ||
149 | |||
150 | struct sh_dmae_slave_config { | ||
151 | enum sh_dmae_slave_chan_id slave_id; | ||
152 | dma_addr_t addr; | ||
153 | u32 chcr; | ||
154 | char mid_rid; | ||
155 | }; | ||
127 | 156 | ||
128 | struct sh_dmae_pdata { | 157 | struct sh_dmae_pdata { |
129 | unsigned int mode; | 158 | unsigned int mode; |
159 | struct sh_dmae_slave_config *config; | ||
160 | int config_num; | ||
161 | }; | ||
162 | |||
163 | struct device; | ||
164 | |||
165 | struct sh_dmae_slave { | ||
166 | enum sh_dmae_slave_chan_id slave_id; /* Set by the platform */ | ||
167 | struct device *dma_dev; /* Set by the platform */ | ||
168 | struct sh_dmae_slave_config *config; /* Set by the driver */ | ||
130 | }; | 169 | }; |
131 | 170 | ||
132 | #endif /* __DMA_SH_H */ | 171 | #endif /* __DMA_SH_H */ |
diff --git a/arch/sh/include/asm/dwarf.h b/arch/sh/include/asm/dwarf.h index bdccbbfdc0bd..d62abd1d0c05 100644 --- a/arch/sh/include/asm/dwarf.h +++ b/arch/sh/include/asm/dwarf.h | |||
@@ -243,16 +243,13 @@ struct dwarf_cie { | |||
243 | 243 | ||
244 | unsigned long cie_pointer; | 244 | unsigned long cie_pointer; |
245 | 245 | ||
246 | struct list_head link; | ||
247 | |||
248 | unsigned long flags; | 246 | unsigned long flags; |
249 | #define DWARF_CIE_Z_AUGMENTATION (1 << 0) | 247 | #define DWARF_CIE_Z_AUGMENTATION (1 << 0) |
250 | 248 | ||
251 | /* | 249 | /* linked-list entry if this CIE is from a module */ |
252 | * 'mod' will be non-NULL if this CIE came from a module's | 250 | struct list_head link; |
253 | * .eh_frame section. | 251 | |
254 | */ | 252 | struct rb_node node; |
255 | struct module *mod; | ||
256 | }; | 253 | }; |
257 | 254 | ||
258 | /** | 255 | /** |
@@ -266,13 +263,11 @@ struct dwarf_fde { | |||
266 | unsigned long address_range; | 263 | unsigned long address_range; |
267 | unsigned char *instructions; | 264 | unsigned char *instructions; |
268 | unsigned char *end; | 265 | unsigned char *end; |
266 | |||
267 | /* linked-list entry if this FDE is from a module */ | ||
269 | struct list_head link; | 268 | struct list_head link; |
270 | 269 | ||
271 | /* | 270 | struct rb_node node; |
272 | * 'mod' will be non-NULL if this FDE came from a module's | ||
273 | * .eh_frame section. | ||
274 | */ | ||
275 | struct module *mod; | ||
276 | }; | 271 | }; |
277 | 272 | ||
278 | /** | 273 | /** |
diff --git a/arch/sh/include/asm/fixmap.h b/arch/sh/include/asm/fixmap.h index 5ac1e40a511c..6e7cea453895 100644 --- a/arch/sh/include/asm/fixmap.h +++ b/arch/sh/include/asm/fixmap.h | |||
@@ -55,16 +55,29 @@ enum fixed_addresses { | |||
55 | #define FIX_N_COLOURS 8 | 55 | #define FIX_N_COLOURS 8 |
56 | FIX_CMAP_BEGIN, | 56 | FIX_CMAP_BEGIN, |
57 | FIX_CMAP_END = FIX_CMAP_BEGIN + (FIX_N_COLOURS * NR_CPUS) - 1, | 57 | FIX_CMAP_END = FIX_CMAP_BEGIN + (FIX_N_COLOURS * NR_CPUS) - 1, |
58 | FIX_UNCACHED, | 58 | |
59 | #ifdef CONFIG_HIGHMEM | 59 | #ifdef CONFIG_HIGHMEM |
60 | FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ | 60 | FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ |
61 | FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, | 61 | FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, |
62 | #endif | 62 | #endif |
63 | |||
64 | #ifdef CONFIG_IOREMAP_FIXED | ||
65 | /* | ||
66 | * FIX_IOREMAP entries are useful for mapping physical address | ||
67 | * space before ioremap() is useable, e.g. really early in boot | ||
68 | * before kmalloc() is working. | ||
69 | */ | ||
70 | #define FIX_N_IOREMAPS 32 | ||
71 | FIX_IOREMAP_BEGIN, | ||
72 | FIX_IOREMAP_END = FIX_IOREMAP_BEGIN + FIX_N_IOREMAPS, | ||
73 | #endif | ||
74 | |||
63 | __end_of_fixed_addresses | 75 | __end_of_fixed_addresses |
64 | }; | 76 | }; |
65 | 77 | ||
66 | extern void __set_fixmap(enum fixed_addresses idx, | 78 | extern void __set_fixmap(enum fixed_addresses idx, |
67 | unsigned long phys, pgprot_t flags); | 79 | unsigned long phys, pgprot_t flags); |
80 | extern void __clear_fixmap(enum fixed_addresses idx, pgprot_t flags); | ||
68 | 81 | ||
69 | #define set_fixmap(idx, phys) \ | 82 | #define set_fixmap(idx, phys) \ |
70 | __set_fixmap(idx, phys, PAGE_KERNEL) | 83 | __set_fixmap(idx, phys, PAGE_KERNEL) |
diff --git a/arch/sh/include/asm/fpu.h b/arch/sh/include/asm/fpu.h index fb6bbb9b1cc8..06c4281aab65 100644 --- a/arch/sh/include/asm/fpu.h +++ b/arch/sh/include/asm/fpu.h | |||
@@ -2,8 +2,8 @@ | |||
2 | #define __ASM_SH_FPU_H | 2 | #define __ASM_SH_FPU_H |
3 | 3 | ||
4 | #ifndef __ASSEMBLY__ | 4 | #ifndef __ASSEMBLY__ |
5 | #include <linux/preempt.h> | 5 | |
6 | #include <asm/ptrace.h> | 6 | struct task_struct; |
7 | 7 | ||
8 | #ifdef CONFIG_SH_FPU | 8 | #ifdef CONFIG_SH_FPU |
9 | static inline void release_fpu(struct pt_regs *regs) | 9 | static inline void release_fpu(struct pt_regs *regs) |
@@ -16,22 +16,23 @@ static inline void grab_fpu(struct pt_regs *regs) | |||
16 | regs->sr &= ~SR_FD; | 16 | regs->sr &= ~SR_FD; |
17 | } | 17 | } |
18 | 18 | ||
19 | struct task_struct; | ||
20 | |||
21 | extern void save_fpu(struct task_struct *__tsk); | 19 | extern void save_fpu(struct task_struct *__tsk); |
22 | void fpu_state_restore(struct pt_regs *regs); | 20 | extern void restore_fpu(struct task_struct *__tsk); |
21 | extern void fpu_state_restore(struct pt_regs *regs); | ||
22 | extern void __fpu_state_restore(void); | ||
23 | #else | 23 | #else |
24 | 24 | #define save_fpu(tsk) do { } while (0) | |
25 | #define save_fpu(tsk) do { } while (0) | 25 | #define restore_fpu(tsk) do { } while (0) |
26 | #define release_fpu(regs) do { } while (0) | 26 | #define release_fpu(regs) do { } while (0) |
27 | #define grab_fpu(regs) do { } while (0) | 27 | #define grab_fpu(regs) do { } while (0) |
28 | #define fpu_state_restore(regs) do { } while (0) | 28 | #define fpu_state_restore(regs) do { } while (0) |
29 | 29 | #define __fpu_state_restore(regs) do { } while (0) | |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | struct user_regset; | 32 | struct user_regset; |
33 | 33 | ||
34 | extern int do_fpu_inst(unsigned short, struct pt_regs *); | 34 | extern int do_fpu_inst(unsigned short, struct pt_regs *); |
35 | extern int init_fpu(struct task_struct *); | ||
35 | 36 | ||
36 | extern int fpregs_get(struct task_struct *target, | 37 | extern int fpregs_get(struct task_struct *target, |
37 | const struct user_regset *regset, | 38 | const struct user_regset *regset, |
@@ -65,18 +66,6 @@ static inline void clear_fpu(struct task_struct *tsk, struct pt_regs *regs) | |||
65 | preempt_enable(); | 66 | preempt_enable(); |
66 | } | 67 | } |
67 | 68 | ||
68 | static inline int init_fpu(struct task_struct *tsk) | ||
69 | { | ||
70 | if (tsk_used_math(tsk)) { | ||
71 | if ((boot_cpu_data.flags & CPU_HAS_FPU) && tsk == current) | ||
72 | unlazy_fpu(tsk, task_pt_regs(tsk)); | ||
73 | return 0; | ||
74 | } | ||
75 | |||
76 | set_stopped_child_used_math(tsk); | ||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | #endif /* __ASSEMBLY__ */ | 69 | #endif /* __ASSEMBLY__ */ |
81 | 70 | ||
82 | #endif /* __ASM_SH_FPU_H */ | 71 | #endif /* __ASM_SH_FPU_H */ |
diff --git a/arch/sh/include/asm/hw_breakpoint.h b/arch/sh/include/asm/hw_breakpoint.h new file mode 100644 index 000000000000..965dd780d51b --- /dev/null +++ b/arch/sh/include/asm/hw_breakpoint.h | |||
@@ -0,0 +1,67 @@ | |||
1 | #ifndef __ASM_SH_HW_BREAKPOINT_H | ||
2 | #define __ASM_SH_HW_BREAKPOINT_H | ||
3 | |||
4 | #ifdef __KERNEL__ | ||
5 | #define __ARCH_HW_BREAKPOINT_H | ||
6 | |||
7 | #include <linux/kdebug.h> | ||
8 | #include <linux/types.h> | ||
9 | |||
10 | struct arch_hw_breakpoint { | ||
11 | char *name; /* Contains name of the symbol to set bkpt */ | ||
12 | unsigned long address; | ||
13 | u16 len; | ||
14 | u16 type; | ||
15 | }; | ||
16 | |||
17 | enum { | ||
18 | SH_BREAKPOINT_READ = (1 << 1), | ||
19 | SH_BREAKPOINT_WRITE = (1 << 2), | ||
20 | SH_BREAKPOINT_RW = SH_BREAKPOINT_READ | SH_BREAKPOINT_WRITE, | ||
21 | |||
22 | SH_BREAKPOINT_LEN_1 = (1 << 12), | ||
23 | SH_BREAKPOINT_LEN_2 = (1 << 13), | ||
24 | SH_BREAKPOINT_LEN_4 = SH_BREAKPOINT_LEN_1 | SH_BREAKPOINT_LEN_2, | ||
25 | SH_BREAKPOINT_LEN_8 = (1 << 14), | ||
26 | }; | ||
27 | |||
28 | struct sh_ubc { | ||
29 | const char *name; | ||
30 | unsigned int num_events; | ||
31 | unsigned int trap_nr; | ||
32 | void (*enable)(struct arch_hw_breakpoint *, int); | ||
33 | void (*disable)(struct arch_hw_breakpoint *, int); | ||
34 | void (*enable_all)(unsigned long); | ||
35 | void (*disable_all)(void); | ||
36 | unsigned long (*active_mask)(void); | ||
37 | unsigned long (*triggered_mask)(void); | ||
38 | void (*clear_triggered_mask)(unsigned long); | ||
39 | struct clk *clk; /* optional interface clock / MSTP bit */ | ||
40 | }; | ||
41 | |||
42 | struct perf_event; | ||
43 | struct task_struct; | ||
44 | struct pmu; | ||
45 | |||
46 | /* Maximum number of UBC channels */ | ||
47 | #define HBP_NUM 2 | ||
48 | |||
49 | /* arch/sh/kernel/hw_breakpoint.c */ | ||
50 | extern int arch_check_va_in_userspace(unsigned long va, u16 hbp_len); | ||
51 | extern int arch_validate_hwbkpt_settings(struct perf_event *bp, | ||
52 | struct task_struct *tsk); | ||
53 | extern int hw_breakpoint_exceptions_notify(struct notifier_block *unused, | ||
54 | unsigned long val, void *data); | ||
55 | |||
56 | int arch_install_hw_breakpoint(struct perf_event *bp); | ||
57 | void arch_uninstall_hw_breakpoint(struct perf_event *bp); | ||
58 | void hw_breakpoint_pmu_read(struct perf_event *bp); | ||
59 | void hw_breakpoint_pmu_unthrottle(struct perf_event *bp); | ||
60 | |||
61 | extern void arch_fill_perf_breakpoint(struct perf_event *bp); | ||
62 | extern int register_sh_ubc(struct sh_ubc *); | ||
63 | |||
64 | extern struct pmu perf_ops_bp; | ||
65 | |||
66 | #endif /* __KERNEL__ */ | ||
67 | #endif /* __ASM_SH_HW_BREAKPOINT_H */ | ||
diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h index 026dd659a640..7dab7b23a5ec 100644 --- a/arch/sh/include/asm/io.h +++ b/arch/sh/include/asm/io.h | |||
@@ -22,6 +22,7 @@ | |||
22 | * for old compat code for I/O offseting to SuperIOs, all of which are | 22 | * for old compat code for I/O offseting to SuperIOs, all of which are |
23 | * better handled through the machvec ioport mapping routines these days. | 23 | * better handled through the machvec ioport mapping routines these days. |
24 | */ | 24 | */ |
25 | #include <linux/errno.h> | ||
25 | #include <asm/cache.h> | 26 | #include <asm/cache.h> |
26 | #include <asm/system.h> | 27 | #include <asm/system.h> |
27 | #include <asm/addrspace.h> | 28 | #include <asm/addrspace.h> |
@@ -79,16 +80,51 @@ | |||
79 | #define writel(v,a) ({ __raw_writel((v),(a)); mb(); }) | 80 | #define writel(v,a) ({ __raw_writel((v),(a)); mb(); }) |
80 | #define writeq(v,a) ({ __raw_writeq((v),(a)); mb(); }) | 81 | #define writeq(v,a) ({ __raw_writeq((v),(a)); mb(); }) |
81 | 82 | ||
82 | /* SuperH on-chip I/O functions */ | 83 | /* |
83 | #define ctrl_inb __raw_readb | 84 | * Legacy SuperH on-chip I/O functions |
84 | #define ctrl_inw __raw_readw | 85 | * |
85 | #define ctrl_inl __raw_readl | 86 | * These are all deprecated, all new (and especially cross-platform) code |
86 | #define ctrl_inq __raw_readq | 87 | * should be using the __raw_xxx() routines directly. |
88 | */ | ||
89 | static inline u8 __deprecated ctrl_inb(unsigned long addr) | ||
90 | { | ||
91 | return __raw_readb(addr); | ||
92 | } | ||
93 | |||
94 | static inline u16 __deprecated ctrl_inw(unsigned long addr) | ||
95 | { | ||
96 | return __raw_readw(addr); | ||
97 | } | ||
98 | |||
99 | static inline u32 __deprecated ctrl_inl(unsigned long addr) | ||
100 | { | ||
101 | return __raw_readl(addr); | ||
102 | } | ||
103 | |||
104 | static inline u64 __deprecated ctrl_inq(unsigned long addr) | ||
105 | { | ||
106 | return __raw_readq(addr); | ||
107 | } | ||
108 | |||
109 | static inline void __deprecated ctrl_outb(u8 v, unsigned long addr) | ||
110 | { | ||
111 | __raw_writeb(v, addr); | ||
112 | } | ||
113 | |||
114 | static inline void __deprecated ctrl_outw(u16 v, unsigned long addr) | ||
115 | { | ||
116 | __raw_writew(v, addr); | ||
117 | } | ||
87 | 118 | ||
88 | #define ctrl_outb __raw_writeb | 119 | static inline void __deprecated ctrl_outl(u32 v, unsigned long addr) |
89 | #define ctrl_outw __raw_writew | 120 | { |
90 | #define ctrl_outl __raw_writel | 121 | __raw_writel(v, addr); |
91 | #define ctrl_outq __raw_writeq | 122 | } |
123 | |||
124 | static inline void __deprecated ctrl_outq(u64 v, unsigned long addr) | ||
125 | { | ||
126 | __raw_writeq(v, addr); | ||
127 | } | ||
92 | 128 | ||
93 | extern unsigned long generic_io_base; | 129 | extern unsigned long generic_io_base; |
94 | 130 | ||
@@ -97,6 +133,28 @@ static inline void ctrl_delay(void) | |||
97 | __raw_readw(generic_io_base); | 133 | __raw_readw(generic_io_base); |
98 | } | 134 | } |
99 | 135 | ||
136 | #define __BUILD_UNCACHED_IO(bwlq, type) \ | ||
137 | static inline type read##bwlq##_uncached(unsigned long addr) \ | ||
138 | { \ | ||
139 | type ret; \ | ||
140 | jump_to_uncached(); \ | ||
141 | ret = __raw_read##bwlq(addr); \ | ||
142 | back_to_cached(); \ | ||
143 | return ret; \ | ||
144 | } \ | ||
145 | \ | ||
146 | static inline void write##bwlq##_uncached(type v, unsigned long addr) \ | ||
147 | { \ | ||
148 | jump_to_uncached(); \ | ||
149 | __raw_write##bwlq(v, addr); \ | ||
150 | back_to_cached(); \ | ||
151 | } | ||
152 | |||
153 | __BUILD_UNCACHED_IO(b, u8) | ||
154 | __BUILD_UNCACHED_IO(w, u16) | ||
155 | __BUILD_UNCACHED_IO(l, u32) | ||
156 | __BUILD_UNCACHED_IO(q, u64) | ||
157 | |||
100 | #define __BUILD_MEMORY_STRING(bwlq, type) \ | 158 | #define __BUILD_MEMORY_STRING(bwlq, type) \ |
101 | \ | 159 | \ |
102 | static inline void __raw_writes##bwlq(volatile void __iomem *mem, \ | 160 | static inline void __raw_writes##bwlq(volatile void __iomem *mem, \ |
@@ -234,28 +292,21 @@ unsigned long long poke_real_address_q(unsigned long long addr, | |||
234 | */ | 292 | */ |
235 | #ifdef CONFIG_MMU | 293 | #ifdef CONFIG_MMU |
236 | void __iomem *__ioremap_caller(unsigned long offset, unsigned long size, | 294 | void __iomem *__ioremap_caller(unsigned long offset, unsigned long size, |
237 | unsigned long flags, void *caller); | 295 | pgprot_t prot, void *caller); |
238 | void __iounmap(void __iomem *addr); | 296 | void __iounmap(void __iomem *addr); |
239 | 297 | ||
240 | static inline void __iomem * | 298 | static inline void __iomem * |
241 | __ioremap(unsigned long offset, unsigned long size, unsigned long flags) | 299 | __ioremap(unsigned long offset, unsigned long size, pgprot_t prot) |
242 | { | 300 | { |
243 | return __ioremap_caller(offset, size, flags, __builtin_return_address(0)); | 301 | return __ioremap_caller(offset, size, prot, __builtin_return_address(0)); |
244 | } | 302 | } |
245 | 303 | ||
246 | static inline void __iomem * | 304 | static inline void __iomem * |
247 | __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | 305 | __ioremap_29bit(unsigned long offset, unsigned long size, pgprot_t prot) |
248 | { | 306 | { |
249 | #if defined(CONFIG_SUPERH32) && !defined(CONFIG_PMB_FIXED) && !defined(CONFIG_PMB) | 307 | #ifdef CONFIG_29BIT |
250 | unsigned long last_addr = offset + size - 1; | 308 | unsigned long last_addr = offset + size - 1; |
251 | #endif | ||
252 | void __iomem *ret; | ||
253 | 309 | ||
254 | ret = __ioremap_trapped(offset, size); | ||
255 | if (ret) | ||
256 | return ret; | ||
257 | |||
258 | #if defined(CONFIG_SUPERH32) && !defined(CONFIG_PMB_FIXED) && !defined(CONFIG_PMB) | ||
259 | /* | 310 | /* |
260 | * For P1 and P2 space this is trivial, as everything is already | 311 | * For P1 and P2 space this is trivial, as everything is already |
261 | * mapped. Uncached access for P1 addresses are done through P2. | 312 | * mapped. Uncached access for P1 addresses are done through P2. |
@@ -263,7 +314,7 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | |||
263 | * mapping must be done by the PMB or by using page tables. | 314 | * mapping must be done by the PMB or by using page tables. |
264 | */ | 315 | */ |
265 | if (likely(PXSEG(offset) < P3SEG && PXSEG(last_addr) < P3SEG)) { | 316 | if (likely(PXSEG(offset) < P3SEG && PXSEG(last_addr) < P3SEG)) { |
266 | if (unlikely(flags & _PAGE_CACHABLE)) | 317 | if (unlikely(pgprot_val(prot) & _PAGE_CACHABLE)) |
267 | return (void __iomem *)P1SEGADDR(offset); | 318 | return (void __iomem *)P1SEGADDR(offset); |
268 | 319 | ||
269 | return (void __iomem *)P2SEGADDR(offset); | 320 | return (void __iomem *)P2SEGADDR(offset); |
@@ -274,26 +325,70 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | |||
274 | return (void __iomem *)P4SEGADDR(offset); | 325 | return (void __iomem *)P4SEGADDR(offset); |
275 | #endif | 326 | #endif |
276 | 327 | ||
277 | return __ioremap(offset, size, flags); | 328 | return NULL; |
329 | } | ||
330 | |||
331 | static inline void __iomem * | ||
332 | __ioremap_mode(unsigned long offset, unsigned long size, pgprot_t prot) | ||
333 | { | ||
334 | void __iomem *ret; | ||
335 | |||
336 | ret = __ioremap_trapped(offset, size); | ||
337 | if (ret) | ||
338 | return ret; | ||
339 | |||
340 | ret = __ioremap_29bit(offset, size, prot); | ||
341 | if (ret) | ||
342 | return ret; | ||
343 | |||
344 | return __ioremap(offset, size, prot); | ||
278 | } | 345 | } |
279 | #else | 346 | #else |
280 | #define __ioremap(offset, size, flags) ((void __iomem *)(offset)) | 347 | #define __ioremap(offset, size, prot) ((void __iomem *)(offset)) |
281 | #define __ioremap_mode(offset, size, flags) ((void __iomem *)(offset)) | 348 | #define __ioremap_mode(offset, size, prot) ((void __iomem *)(offset)) |
282 | #define __iounmap(addr) do { } while (0) | 349 | #define __iounmap(addr) do { } while (0) |
283 | #endif /* CONFIG_MMU */ | 350 | #endif /* CONFIG_MMU */ |
284 | 351 | ||
285 | #define ioremap(offset, size) \ | 352 | static inline void __iomem * |
286 | __ioremap_mode((offset), (size), 0) | 353 | ioremap(unsigned long offset, unsigned long size) |
287 | #define ioremap_nocache(offset, size) \ | 354 | { |
288 | __ioremap_mode((offset), (size), 0) | 355 | return __ioremap_mode(offset, size, PAGE_KERNEL_NOCACHE); |
289 | #define ioremap_cache(offset, size) \ | 356 | } |
290 | __ioremap_mode((offset), (size), _PAGE_CACHABLE) | 357 | |
291 | #define p3_ioremap(offset, size, flags) \ | 358 | static inline void __iomem * |
292 | __ioremap((offset), (size), (flags)) | 359 | ioremap_cache(unsigned long offset, unsigned long size) |
293 | #define ioremap_prot(offset, size, flags) \ | 360 | { |
294 | __ioremap_mode((offset), (size), (flags)) | 361 | return __ioremap_mode(offset, size, PAGE_KERNEL); |
295 | #define iounmap(addr) \ | 362 | } |
296 | __iounmap((addr)) | 363 | |
364 | #ifdef CONFIG_HAVE_IOREMAP_PROT | ||
365 | static inline void __iomem * | ||
366 | ioremap_prot(resource_size_t offset, unsigned long size, unsigned long flags) | ||
367 | { | ||
368 | return __ioremap_mode(offset, size, __pgprot(flags)); | ||
369 | } | ||
370 | #endif | ||
371 | |||
372 | #ifdef CONFIG_IOREMAP_FIXED | ||
373 | extern void __iomem *ioremap_fixed(resource_size_t, unsigned long, | ||
374 | unsigned long, pgprot_t); | ||
375 | extern int iounmap_fixed(void __iomem *); | ||
376 | extern void ioremap_fixed_init(void); | ||
377 | #else | ||
378 | static inline void __iomem * | ||
379 | ioremap_fixed(resource_size_t phys_addr, unsigned long offset, | ||
380 | unsigned long size, pgprot_t prot) | ||
381 | { | ||
382 | BUG(); | ||
383 | return NULL; | ||
384 | } | ||
385 | |||
386 | static inline void ioremap_fixed_init(void) { } | ||
387 | static inline int iounmap_fixed(void __iomem *addr) { return -EINVAL; } | ||
388 | #endif | ||
389 | |||
390 | #define ioremap_nocache ioremap | ||
391 | #define iounmap __iounmap | ||
297 | 392 | ||
298 | #define maybebadio(port) \ | 393 | #define maybebadio(port) \ |
299 | printk(KERN_ERR "bad PC-like io %s:%u for port 0x%lx at 0x%08x\n", \ | 394 | printk(KERN_ERR "bad PC-like io %s:%u for port 0x%lx at 0x%08x\n", \ |
diff --git a/arch/sh/include/asm/kdebug.h b/arch/sh/include/asm/kdebug.h index 985219f9759e..5f6d2e9ccb7c 100644 --- a/arch/sh/include/asm/kdebug.h +++ b/arch/sh/include/asm/kdebug.h | |||
@@ -6,6 +6,8 @@ enum die_val { | |||
6 | DIE_TRAP, | 6 | DIE_TRAP, |
7 | DIE_NMI, | 7 | DIE_NMI, |
8 | DIE_OOPS, | 8 | DIE_OOPS, |
9 | DIE_BREAKPOINT, | ||
10 | DIE_SSTEP, | ||
9 | }; | 11 | }; |
10 | 12 | ||
11 | #endif /* __ASM_SH_KDEBUG_H */ | 13 | #endif /* __ASM_SH_KDEBUG_H */ |
diff --git a/arch/sh/include/asm/mmu.h b/arch/sh/include/asm/mmu.h index c7426ad9926e..15a05b615ba7 100644 --- a/arch/sh/include/asm/mmu.h +++ b/arch/sh/include/asm/mmu.h | |||
@@ -11,7 +11,9 @@ | |||
11 | 11 | ||
12 | #define PMB_ADDR 0xf6100000 | 12 | #define PMB_ADDR 0xf6100000 |
13 | #define PMB_DATA 0xf7100000 | 13 | #define PMB_DATA 0xf7100000 |
14 | #define PMB_ENTRY_MAX 16 | 14 | |
15 | #define NR_PMB_ENTRIES 16 | ||
16 | |||
15 | #define PMB_E_MASK 0x0000000f | 17 | #define PMB_E_MASK 0x0000000f |
16 | #define PMB_E_SHIFT 8 | 18 | #define PMB_E_SHIFT 8 |
17 | 19 | ||
@@ -25,11 +27,15 @@ | |||
25 | #define PMB_C 0x00000008 | 27 | #define PMB_C 0x00000008 |
26 | #define PMB_WT 0x00000001 | 28 | #define PMB_WT 0x00000001 |
27 | #define PMB_UB 0x00000200 | 29 | #define PMB_UB 0x00000200 |
30 | #define PMB_CACHE_MASK (PMB_C | PMB_WT | PMB_UB) | ||
28 | #define PMB_V 0x00000100 | 31 | #define PMB_V 0x00000100 |
29 | 32 | ||
30 | #define PMB_NO_ENTRY (-1) | 33 | #define PMB_NO_ENTRY (-1) |
31 | 34 | ||
32 | #ifndef __ASSEMBLY__ | 35 | #ifndef __ASSEMBLY__ |
36 | #include <linux/errno.h> | ||
37 | #include <linux/threads.h> | ||
38 | #include <asm/page.h> | ||
33 | 39 | ||
34 | /* Default "unsigned long" context */ | 40 | /* Default "unsigned long" context */ |
35 | typedef unsigned long mm_context_id_t[NR_CPUS]; | 41 | typedef unsigned long mm_context_id_t[NR_CPUS]; |
@@ -47,29 +53,30 @@ typedef struct { | |||
47 | #endif | 53 | #endif |
48 | } mm_context_t; | 54 | } mm_context_t; |
49 | 55 | ||
50 | struct pmb_entry; | 56 | #ifdef CONFIG_PMB |
51 | |||
52 | struct pmb_entry { | ||
53 | unsigned long vpn; | ||
54 | unsigned long ppn; | ||
55 | unsigned long flags; | ||
56 | |||
57 | /* | ||
58 | * 0 .. NR_PMB_ENTRIES for specific entry selection, or | ||
59 | * PMB_NO_ENTRY to search for a free one | ||
60 | */ | ||
61 | int entry; | ||
62 | |||
63 | struct pmb_entry *next; | ||
64 | /* Adjacent entry link for contiguous multi-entry mappings */ | ||
65 | struct pmb_entry *link; | ||
66 | }; | ||
67 | |||
68 | /* arch/sh/mm/pmb.c */ | 57 | /* arch/sh/mm/pmb.c */ |
69 | long pmb_remap(unsigned long virt, unsigned long phys, | 58 | long pmb_remap(unsigned long virt, unsigned long phys, |
70 | unsigned long size, unsigned long flags); | 59 | unsigned long size, pgprot_t prot); |
71 | void pmb_unmap(unsigned long addr); | 60 | void pmb_unmap(unsigned long addr); |
72 | int pmb_init(void); | 61 | void pmb_init(void); |
62 | bool __in_29bit_mode(void); | ||
63 | #else | ||
64 | static inline long pmb_remap(unsigned long virt, unsigned long phys, | ||
65 | unsigned long size, pgprot_t prot) | ||
66 | { | ||
67 | return -EINVAL; | ||
68 | } | ||
69 | |||
70 | #define pmb_unmap(addr) do { } while (0) | ||
71 | #define pmb_init(addr) do { } while (0) | ||
72 | |||
73 | #ifdef CONFIG_29BIT | ||
74 | #define __in_29bit_mode() (1) | ||
75 | #else | ||
76 | #define __in_29bit_mode() (0) | ||
77 | #endif | ||
78 | |||
79 | #endif /* CONFIG_PMB */ | ||
73 | #endif /* __ASSEMBLY__ */ | 80 | #endif /* __ASSEMBLY__ */ |
74 | 81 | ||
75 | #endif /* __MMU_H */ | 82 | #endif /* __MMU_H */ |
diff --git a/arch/sh/include/asm/mmu_context.h b/arch/sh/include/asm/mmu_context.h index 41080b173a7a..384c7471a374 100644 --- a/arch/sh/include/asm/mmu_context.h +++ b/arch/sh/include/asm/mmu_context.h | |||
@@ -158,7 +158,7 @@ static inline void enable_mmu(void) | |||
158 | unsigned int cpu = smp_processor_id(); | 158 | unsigned int cpu = smp_processor_id(); |
159 | 159 | ||
160 | /* Enable MMU */ | 160 | /* Enable MMU */ |
161 | ctrl_outl(MMU_CONTROL_INIT, MMUCR); | 161 | __raw_writel(MMU_CONTROL_INIT, MMUCR); |
162 | ctrl_barrier(); | 162 | ctrl_barrier(); |
163 | 163 | ||
164 | if (asid_cache(cpu) == NO_CONTEXT) | 164 | if (asid_cache(cpu) == NO_CONTEXT) |
@@ -171,9 +171,9 @@ static inline void disable_mmu(void) | |||
171 | { | 171 | { |
172 | unsigned long cr; | 172 | unsigned long cr; |
173 | 173 | ||
174 | cr = ctrl_inl(MMUCR); | 174 | cr = __raw_readl(MMUCR); |
175 | cr &= ~MMU_CONTROL_INIT; | 175 | cr &= ~MMU_CONTROL_INIT; |
176 | ctrl_outl(cr, MMUCR); | 176 | __raw_writel(cr, MMUCR); |
177 | 177 | ||
178 | ctrl_barrier(); | 178 | ctrl_barrier(); |
179 | } | 179 | } |
diff --git a/arch/sh/include/asm/mmu_context_32.h b/arch/sh/include/asm/mmu_context_32.h index 8ef800c549ab..10e2e17210d2 100644 --- a/arch/sh/include/asm/mmu_context_32.h +++ b/arch/sh/include/asm/mmu_context_32.h | |||
@@ -49,11 +49,11 @@ static inline unsigned long get_asid(void) | |||
49 | /* MMU_TTB is used for optimizing the fault handling. */ | 49 | /* MMU_TTB is used for optimizing the fault handling. */ |
50 | static inline void set_TTB(pgd_t *pgd) | 50 | static inline void set_TTB(pgd_t *pgd) |
51 | { | 51 | { |
52 | ctrl_outl((unsigned long)pgd, MMU_TTB); | 52 | __raw_writel((unsigned long)pgd, MMU_TTB); |
53 | } | 53 | } |
54 | 54 | ||
55 | static inline pgd_t *get_TTB(void) | 55 | static inline pgd_t *get_TTB(void) |
56 | { | 56 | { |
57 | return (pgd_t *)ctrl_inl(MMU_TTB); | 57 | return (pgd_t *)__raw_readl(MMU_TTB); |
58 | } | 58 | } |
59 | #endif /* __ASM_SH_MMU_CONTEXT_32_H */ | 59 | #endif /* __ASM_SH_MMU_CONTEXT_32_H */ |
diff --git a/arch/sh/include/asm/module.h b/arch/sh/include/asm/module.h index 068bf1659750..b7927de86f9f 100644 --- a/arch/sh/include/asm/module.h +++ b/arch/sh/include/asm/module.h | |||
@@ -1,7 +1,22 @@ | |||
1 | #ifndef _ASM_SH_MODULE_H | 1 | #ifndef _ASM_SH_MODULE_H |
2 | #define _ASM_SH_MODULE_H | 2 | #define _ASM_SH_MODULE_H |
3 | 3 | ||
4 | #include <asm-generic/module.h> | 4 | struct mod_arch_specific { |
5 | #ifdef CONFIG_DWARF_UNWINDER | ||
6 | struct list_head fde_list; | ||
7 | struct list_head cie_list; | ||
8 | #endif | ||
9 | }; | ||
10 | |||
11 | #ifdef CONFIG_64BIT | ||
12 | #define Elf_Shdr Elf64_Shdr | ||
13 | #define Elf_Sym Elf64_Sym | ||
14 | #define Elf_Ehdr Elf64_Ehdr | ||
15 | #else | ||
16 | #define Elf_Shdr Elf32_Shdr | ||
17 | #define Elf_Sym Elf32_Sym | ||
18 | #define Elf_Ehdr Elf32_Ehdr | ||
19 | #endif | ||
5 | 20 | ||
6 | #ifdef CONFIG_CPU_LITTLE_ENDIAN | 21 | #ifdef CONFIG_CPU_LITTLE_ENDIAN |
7 | # ifdef CONFIG_CPU_SH2 | 22 | # ifdef CONFIG_CPU_SH2 |
diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h index 81bffc0d6860..d71feb359304 100644 --- a/arch/sh/include/asm/page.h +++ b/arch/sh/include/asm/page.h | |||
@@ -45,6 +45,7 @@ | |||
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | #ifndef __ASSEMBLY__ | 47 | #ifndef __ASSEMBLY__ |
48 | #include <asm/uncached.h> | ||
48 | 49 | ||
49 | extern unsigned long shm_align_mask; | 50 | extern unsigned long shm_align_mask; |
50 | extern unsigned long max_low_pfn, min_low_pfn; | 51 | extern unsigned long max_low_pfn, min_low_pfn; |
@@ -56,7 +57,6 @@ pages_do_alias(unsigned long addr1, unsigned long addr2) | |||
56 | return (addr1 ^ addr2) & shm_align_mask; | 57 | return (addr1 ^ addr2) & shm_align_mask; |
57 | } | 58 | } |
58 | 59 | ||
59 | |||
60 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) | 60 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) |
61 | extern void copy_page(void *to, void *from); | 61 | extern void copy_page(void *to, void *from); |
62 | 62 | ||
@@ -88,7 +88,7 @@ typedef struct { unsigned long pgd; } pgd_t; | |||
88 | #define __pte(x) ((pte_t) { (x) } ) | 88 | #define __pte(x) ((pte_t) { (x) } ) |
89 | #else | 89 | #else |
90 | typedef struct { unsigned long long pte_low; } pte_t; | 90 | typedef struct { unsigned long long pte_low; } pte_t; |
91 | typedef struct { unsigned long pgprot; } pgprot_t; | 91 | typedef struct { unsigned long long pgprot; } pgprot_t; |
92 | typedef struct { unsigned long pgd; } pgd_t; | 92 | typedef struct { unsigned long pgd; } pgd_t; |
93 | #define pte_val(x) ((x).pte_low) | 93 | #define pte_val(x) ((x).pte_low) |
94 | #define __pte(x) ((pte_t) { (x) } ) | 94 | #define __pte(x) ((pte_t) { (x) } ) |
@@ -127,12 +127,7 @@ typedef struct page *pgtable_t; | |||
127 | * is not visible (it is part of the PMB mapping) and so needs to be | 127 | * is not visible (it is part of the PMB mapping) and so needs to be |
128 | * added or subtracted as required. | 128 | * added or subtracted as required. |
129 | */ | 129 | */ |
130 | #if defined(CONFIG_PMB_FIXED) | 130 | #ifdef CONFIG_PMB |
131 | /* phys = virt - PAGE_OFFSET - (__MEMORY_START & 0xe0000000) */ | ||
132 | #define PMB_OFFSET (PAGE_OFFSET - PXSEG(__MEMORY_START)) | ||
133 | #define __pa(x) ((unsigned long)(x) - PMB_OFFSET) | ||
134 | #define __va(x) ((void *)((unsigned long)(x) + PMB_OFFSET)) | ||
135 | #elif defined(CONFIG_32BIT) | ||
136 | #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET+__MEMORY_START) | 131 | #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET+__MEMORY_START) |
137 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET-__MEMORY_START)) | 132 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET-__MEMORY_START)) |
138 | #else | 133 | #else |
@@ -140,6 +135,14 @@ typedef struct page *pgtable_t; | |||
140 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) | 135 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) |
141 | #endif | 136 | #endif |
142 | 137 | ||
138 | #ifdef CONFIG_UNCACHED_MAPPING | ||
139 | #define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + uncached_start) | ||
140 | #define CAC_ADDR(addr) ((addr) - uncached_start + PAGE_OFFSET) | ||
141 | #else | ||
142 | #define UNCAC_ADDR(addr) ((addr)) | ||
143 | #define CAC_ADDR(addr) ((addr)) | ||
144 | #endif | ||
145 | |||
143 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) | 146 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) |
144 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) | 147 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) |
145 | 148 | ||
diff --git a/arch/sh/include/asm/pci.h b/arch/sh/include/asm/pci.h index 67f3999b544e..1042f7f0a48b 100644 --- a/arch/sh/include/asm/pci.h +++ b/arch/sh/include/asm/pci.h | |||
@@ -15,20 +15,49 @@ | |||
15 | */ | 15 | */ |
16 | struct pci_channel { | 16 | struct pci_channel { |
17 | struct pci_channel *next; | 17 | struct pci_channel *next; |
18 | struct pci_bus *bus; | ||
18 | 19 | ||
19 | struct pci_ops *pci_ops; | 20 | struct pci_ops *pci_ops; |
20 | struct resource *io_resource; | 21 | |
21 | struct resource *mem_resource; | 22 | struct resource *resources; |
23 | unsigned int nr_resources; | ||
22 | 24 | ||
23 | unsigned long io_offset; | 25 | unsigned long io_offset; |
24 | unsigned long mem_offset; | 26 | unsigned long mem_offset; |
25 | 27 | ||
26 | unsigned long reg_base; | 28 | unsigned long reg_base; |
27 | |||
28 | unsigned long io_map_base; | 29 | unsigned long io_map_base; |
30 | |||
31 | unsigned int index; | ||
32 | unsigned int need_domain_info; | ||
33 | |||
34 | /* Optional error handling */ | ||
35 | struct timer_list err_timer, serr_timer; | ||
36 | unsigned int err_irq, serr_irq; | ||
29 | }; | 37 | }; |
30 | 38 | ||
31 | extern void register_pci_controller(struct pci_channel *hose); | 39 | /* arch/sh/drivers/pci/pci.c */ |
40 | extern int register_pci_controller(struct pci_channel *hose); | ||
41 | extern void pcibios_report_status(unsigned int status_mask, int warn); | ||
42 | |||
43 | /* arch/sh/drivers/pci/common.c */ | ||
44 | extern int early_read_config_byte(struct pci_channel *hose, int top_bus, | ||
45 | int bus, int devfn, int offset, u8 *value); | ||
46 | extern int early_read_config_word(struct pci_channel *hose, int top_bus, | ||
47 | int bus, int devfn, int offset, u16 *value); | ||
48 | extern int early_read_config_dword(struct pci_channel *hose, int top_bus, | ||
49 | int bus, int devfn, int offset, u32 *value); | ||
50 | extern int early_write_config_byte(struct pci_channel *hose, int top_bus, | ||
51 | int bus, int devfn, int offset, u8 value); | ||
52 | extern int early_write_config_word(struct pci_channel *hose, int top_bus, | ||
53 | int bus, int devfn, int offset, u16 value); | ||
54 | extern int early_write_config_dword(struct pci_channel *hose, int top_bus, | ||
55 | int bus, int devfn, int offset, u32 value); | ||
56 | extern void pcibios_enable_timers(struct pci_channel *hose); | ||
57 | extern unsigned int pcibios_handle_status_errors(unsigned long addr, | ||
58 | unsigned int status, struct pci_channel *hose); | ||
59 | extern int pci_is_66mhz_capable(struct pci_channel *hose, | ||
60 | int top_bus, int current_bus); | ||
32 | 61 | ||
33 | extern unsigned long PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM; | 62 | extern unsigned long PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM; |
34 | 63 | ||
@@ -99,20 +128,6 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev, | |||
99 | } | 128 | } |
100 | #endif | 129 | #endif |
101 | 130 | ||
102 | #ifdef CONFIG_SUPERH32 | ||
103 | /* | ||
104 | * If we're on an SH7751 or SH7780 PCI controller, PCI memory is mapped | ||
105 | * at the end of the address space in a special non-translatable area. | ||
106 | */ | ||
107 | #define PCI_MEM_FIXED_START 0xfd000000 | ||
108 | #define PCI_MEM_FIXED_END (PCI_MEM_FIXED_START + 0x01000000) | ||
109 | |||
110 | #define is_pci_memory_fixed_range(s, e) \ | ||
111 | ((s) >= PCI_MEM_FIXED_START && (e) < PCI_MEM_FIXED_END) | ||
112 | #else | ||
113 | #define is_pci_memory_fixed_range(s, e) (0) | ||
114 | #endif | ||
115 | |||
116 | /* Board-specific fixup routines. */ | 131 | /* Board-specific fixup routines. */ |
117 | int pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin); | 132 | int pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin); |
118 | 133 | ||
@@ -122,6 +137,14 @@ extern void pcibios_resource_to_bus(struct pci_dev *dev, | |||
122 | extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | 137 | extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, |
123 | struct pci_bus_region *region); | 138 | struct pci_bus_region *region); |
124 | 139 | ||
140 | #define pci_domain_nr(bus) ((struct pci_channel *)(bus)->sysdata)->index | ||
141 | |||
142 | static inline int pci_proc_domain(struct pci_bus *bus) | ||
143 | { | ||
144 | struct pci_channel *hose = bus->sysdata; | ||
145 | return hose->need_domain_info; | ||
146 | } | ||
147 | |||
125 | /* Chances are this interrupt is wired PC-style ... */ | 148 | /* Chances are this interrupt is wired PC-style ... */ |
126 | static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) | 149 | static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) |
127 | { | 150 | { |
diff --git a/arch/sh/include/asm/pgalloc.h b/arch/sh/include/asm/pgalloc.h index 63ca37bd9a95..8c00785c60d5 100644 --- a/arch/sh/include/asm/pgalloc.h +++ b/arch/sh/include/asm/pgalloc.h | |||
@@ -4,8 +4,16 @@ | |||
4 | #include <linux/quicklist.h> | 4 | #include <linux/quicklist.h> |
5 | #include <asm/page.h> | 5 | #include <asm/page.h> |
6 | 6 | ||
7 | #define QUICK_PGD 0 /* We preserve special mappings over free */ | 7 | #define QUICK_PT 0 /* Other page table pages that are zero on free */ |
8 | #define QUICK_PT 1 /* Other page table pages that are zero on free */ | 8 | |
9 | extern pgd_t *pgd_alloc(struct mm_struct *); | ||
10 | extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); | ||
11 | |||
12 | #if PAGETABLE_LEVELS > 2 | ||
13 | extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd); | ||
14 | extern pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address); | ||
15 | extern void pmd_free(struct mm_struct *mm, pmd_t *pmd); | ||
16 | #endif | ||
9 | 17 | ||
10 | static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, | 18 | static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, |
11 | pte_t *pte) | 19 | pte_t *pte) |
@@ -20,28 +28,9 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, | |||
20 | } | 28 | } |
21 | #define pmd_pgtable(pmd) pmd_page(pmd) | 29 | #define pmd_pgtable(pmd) pmd_page(pmd) |
22 | 30 | ||
23 | static inline void pgd_ctor(void *x) | ||
24 | { | ||
25 | pgd_t *pgd = x; | ||
26 | |||
27 | memcpy(pgd + USER_PTRS_PER_PGD, | ||
28 | swapper_pg_dir + USER_PTRS_PER_PGD, | ||
29 | (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); | ||
30 | } | ||
31 | |||
32 | /* | 31 | /* |
33 | * Allocate and free page tables. | 32 | * Allocate and free page tables. |
34 | */ | 33 | */ |
35 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) | ||
36 | { | ||
37 | return quicklist_alloc(QUICK_PGD, GFP_KERNEL | __GFP_REPEAT, pgd_ctor); | ||
38 | } | ||
39 | |||
40 | static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) | ||
41 | { | ||
42 | quicklist_free(QUICK_PGD, NULL, pgd); | ||
43 | } | ||
44 | |||
45 | static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, | 34 | static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, |
46 | unsigned long address) | 35 | unsigned long address) |
47 | { | 36 | { |
@@ -81,7 +70,6 @@ do { \ | |||
81 | 70 | ||
82 | static inline void check_pgt_cache(void) | 71 | static inline void check_pgt_cache(void) |
83 | { | 72 | { |
84 | quicklist_trim(QUICK_PGD, NULL, 25, 16); | ||
85 | quicklist_trim(QUICK_PT, NULL, 25, 16); | 73 | quicklist_trim(QUICK_PT, NULL, 25, 16); |
86 | } | 74 | } |
87 | 75 | ||
diff --git a/arch/sh/include/asm/pgtable-2level.h b/arch/sh/include/asm/pgtable-2level.h new file mode 100644 index 000000000000..19bd89db17e7 --- /dev/null +++ b/arch/sh/include/asm/pgtable-2level.h | |||
@@ -0,0 +1,23 @@ | |||
1 | #ifndef __ASM_SH_PGTABLE_2LEVEL_H | ||
2 | #define __ASM_SH_PGTABLE_2LEVEL_H | ||
3 | |||
4 | #include <asm-generic/pgtable-nopmd.h> | ||
5 | |||
6 | /* | ||
7 | * traditional two-level paging structure | ||
8 | */ | ||
9 | #define PAGETABLE_LEVELS 2 | ||
10 | |||
11 | /* PTE bits */ | ||
12 | #define PTE_MAGNITUDE 2 /* 32-bit PTEs */ | ||
13 | |||
14 | #define PTE_SHIFT PAGE_SHIFT | ||
15 | #define PTE_BITS (PTE_SHIFT - PTE_MAGNITUDE) | ||
16 | |||
17 | /* PGD bits */ | ||
18 | #define PGDIR_SHIFT (PTE_SHIFT + PTE_BITS) | ||
19 | |||
20 | #define PTRS_PER_PGD (PAGE_SIZE / (1 << PTE_MAGNITUDE)) | ||
21 | #define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) | ||
22 | |||
23 | #endif /* __ASM_SH_PGTABLE_2LEVEL_H */ | ||
diff --git a/arch/sh/include/asm/pgtable-3level.h b/arch/sh/include/asm/pgtable-3level.h new file mode 100644 index 000000000000..249a985d9648 --- /dev/null +++ b/arch/sh/include/asm/pgtable-3level.h | |||
@@ -0,0 +1,56 @@ | |||
1 | #ifndef __ASM_SH_PGTABLE_3LEVEL_H | ||
2 | #define __ASM_SH_PGTABLE_3LEVEL_H | ||
3 | |||
4 | #include <asm-generic/pgtable-nopud.h> | ||
5 | |||
6 | /* | ||
7 | * Some cores need a 3-level page table layout, for example when using | ||
8 | * 64-bit PTEs and 4K pages. | ||
9 | */ | ||
10 | #define PAGETABLE_LEVELS 3 | ||
11 | |||
12 | #define PTE_MAGNITUDE 3 /* 64-bit PTEs on SH-X2 TLB */ | ||
13 | |||
14 | /* PGD bits */ | ||
15 | #define PGDIR_SHIFT 30 | ||
16 | |||
17 | #define PTRS_PER_PGD 4 | ||
18 | #define USER_PTRS_PER_PGD 2 | ||
19 | |||
20 | /* PMD bits */ | ||
21 | #define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - PTE_MAGNITUDE)) | ||
22 | #define PMD_SIZE (1UL << PMD_SHIFT) | ||
23 | #define PMD_MASK (~(PMD_SIZE-1)) | ||
24 | |||
25 | #define PTRS_PER_PMD ((1 << PGDIR_SHIFT) / PMD_SIZE) | ||
26 | |||
27 | #define pmd_ERROR(e) \ | ||
28 | printk("%s:%d: bad pmd %016llx.\n", __FILE__, __LINE__, pmd_val(e)) | ||
29 | |||
30 | typedef struct { unsigned long long pmd; } pmd_t; | ||
31 | #define pmd_val(x) ((x).pmd) | ||
32 | #define __pmd(x) ((pmd_t) { (x) } ) | ||
33 | |||
34 | static inline unsigned long pud_page_vaddr(pud_t pud) | ||
35 | { | ||
36 | return pud_val(pud); | ||
37 | } | ||
38 | |||
39 | #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) | ||
40 | static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address) | ||
41 | { | ||
42 | return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(address); | ||
43 | } | ||
44 | |||
45 | #define pud_none(x) (!pud_val(x)) | ||
46 | #define pud_present(x) (pud_val(x)) | ||
47 | #define pud_clear(xp) do { set_pud(xp, __pud(0)); } while (0) | ||
48 | #define pud_bad(x) (pud_val(x) & ~PAGE_MASK) | ||
49 | |||
50 | /* | ||
51 | * (puds are folded into pgds so this doesn't get actually called, | ||
52 | * but the define is needed for a generic inline function.) | ||
53 | */ | ||
54 | #define set_pud(pudptr, pudval) do { *(pudptr) = (pudval); } while(0) | ||
55 | |||
56 | #endif /* __ASM_SH_PGTABLE_3LEVEL_H */ | ||
diff --git a/arch/sh/include/asm/pgtable.h b/arch/sh/include/asm/pgtable.h index ba3046e4f06f..aab76528abb9 100644 --- a/arch/sh/include/asm/pgtable.h +++ b/arch/sh/include/asm/pgtable.h | |||
@@ -12,7 +12,11 @@ | |||
12 | #ifndef __ASM_SH_PGTABLE_H | 12 | #ifndef __ASM_SH_PGTABLE_H |
13 | #define __ASM_SH_PGTABLE_H | 13 | #define __ASM_SH_PGTABLE_H |
14 | 14 | ||
15 | #include <asm-generic/pgtable-nopmd.h> | 15 | #ifdef CONFIG_X2TLB |
16 | #include <asm/pgtable-3level.h> | ||
17 | #else | ||
18 | #include <asm/pgtable-2level.h> | ||
19 | #endif | ||
16 | #include <asm/page.h> | 20 | #include <asm/page.h> |
17 | 21 | ||
18 | #ifndef __ASSEMBLY__ | 22 | #ifndef __ASSEMBLY__ |
@@ -51,28 +55,12 @@ static inline unsigned long long neff_sign_extend(unsigned long val) | |||
51 | #define NPHYS_SIGN (1LL << (NPHYS - 1)) | 55 | #define NPHYS_SIGN (1LL << (NPHYS - 1)) |
52 | #define NPHYS_MASK (-1LL << NPHYS) | 56 | #define NPHYS_MASK (-1LL << NPHYS) |
53 | 57 | ||
54 | /* | ||
55 | * traditional two-level paging structure | ||
56 | */ | ||
57 | /* PTE bits */ | ||
58 | #if defined(CONFIG_X2TLB) || defined(CONFIG_SUPERH64) | ||
59 | # define PTE_MAGNITUDE 3 /* 64-bit PTEs on extended mode SH-X2 TLB */ | ||
60 | #else | ||
61 | # define PTE_MAGNITUDE 2 /* 32-bit PTEs */ | ||
62 | #endif | ||
63 | #define PTE_SHIFT PAGE_SHIFT | ||
64 | #define PTE_BITS (PTE_SHIFT - PTE_MAGNITUDE) | ||
65 | |||
66 | /* PGD bits */ | ||
67 | #define PGDIR_SHIFT (PTE_SHIFT + PTE_BITS) | ||
68 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | 58 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) |
69 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) | 59 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) |
70 | 60 | ||
71 | /* Entries per level */ | 61 | /* Entries per level */ |
72 | #define PTRS_PER_PTE (PAGE_SIZE / (1 << PTE_MAGNITUDE)) | 62 | #define PTRS_PER_PTE (PAGE_SIZE / (1 << PTE_MAGNITUDE)) |
73 | #define PTRS_PER_PGD (PAGE_SIZE / sizeof(pgd_t)) | ||
74 | 63 | ||
75 | #define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) | ||
76 | #define FIRST_USER_ADDRESS 0 | 64 | #define FIRST_USER_ADDRESS 0 |
77 | 65 | ||
78 | #define PHYS_ADDR_MASK29 0x1fffffff | 66 | #define PHYS_ADDR_MASK29 0x1fffffff |
@@ -153,9 +141,9 @@ typedef pte_t *pte_addr_t; | |||
153 | #define pte_pfn(x) ((unsigned long)(((x).pte_low >> PAGE_SHIFT))) | 141 | #define pte_pfn(x) ((unsigned long)(((x).pte_low >> PAGE_SHIFT))) |
154 | 142 | ||
155 | /* | 143 | /* |
156 | * No page table caches to initialise | 144 | * Initialise the page table caches |
157 | */ | 145 | */ |
158 | #define pgtable_cache_init() do { } while (0) | 146 | extern void pgtable_cache_init(void); |
159 | 147 | ||
160 | struct vm_area_struct; | 148 | struct vm_area_struct; |
161 | 149 | ||
diff --git a/arch/sh/include/asm/pgtable_32.h b/arch/sh/include/asm/pgtable_32.h index 5003ee86f67b..e172d696e52b 100644 --- a/arch/sh/include/asm/pgtable_32.h +++ b/arch/sh/include/asm/pgtable_32.h | |||
@@ -71,6 +71,8 @@ | |||
71 | #define _PAGE_EXT_KERN_WRITE 0x1000 /* EPR4-bit: Kernel space writable */ | 71 | #define _PAGE_EXT_KERN_WRITE 0x1000 /* EPR4-bit: Kernel space writable */ |
72 | #define _PAGE_EXT_KERN_READ 0x2000 /* EPR5-bit: Kernel space readable */ | 72 | #define _PAGE_EXT_KERN_READ 0x2000 /* EPR5-bit: Kernel space readable */ |
73 | 73 | ||
74 | #define _PAGE_EXT_WIRED 0x4000 /* software: Wire TLB entry */ | ||
75 | |||
74 | /* Wrapper for extended mode pgprot twiddling */ | 76 | /* Wrapper for extended mode pgprot twiddling */ |
75 | #define _PAGE_EXT(x) ((unsigned long long)(x) << 32) | 77 | #define _PAGE_EXT(x) ((unsigned long long)(x) << 32) |
76 | 78 | ||
@@ -141,12 +143,14 @@ static inline unsigned long copy_ptea_attributes(unsigned long x) | |||
141 | # elif defined(CONFIG_HUGETLB_PAGE_SIZE_64MB) | 143 | # elif defined(CONFIG_HUGETLB_PAGE_SIZE_64MB) |
142 | # define _PAGE_SZHUGE (_PAGE_EXT_ESZ2 | _PAGE_EXT_ESZ3) | 144 | # define _PAGE_SZHUGE (_PAGE_EXT_ESZ2 | _PAGE_EXT_ESZ3) |
143 | # endif | 145 | # endif |
146 | # define _PAGE_WIRED (_PAGE_EXT(_PAGE_EXT_WIRED)) | ||
144 | #else | 147 | #else |
145 | # if defined(CONFIG_HUGETLB_PAGE_SIZE_64K) | 148 | # if defined(CONFIG_HUGETLB_PAGE_SIZE_64K) |
146 | # define _PAGE_SZHUGE (_PAGE_SZ1) | 149 | # define _PAGE_SZHUGE (_PAGE_SZ1) |
147 | # elif defined(CONFIG_HUGETLB_PAGE_SIZE_1MB) | 150 | # elif defined(CONFIG_HUGETLB_PAGE_SIZE_1MB) |
148 | # define _PAGE_SZHUGE (_PAGE_SZ0 | _PAGE_SZ1) | 151 | # define _PAGE_SZHUGE (_PAGE_SZ0 | _PAGE_SZ1) |
149 | # endif | 152 | # endif |
153 | # define _PAGE_WIRED (0) | ||
150 | #endif | 154 | #endif |
151 | 155 | ||
152 | /* | 156 | /* |
diff --git a/arch/sh/include/asm/pgtable_64.h b/arch/sh/include/asm/pgtable_64.h index 17cdbecc3adc..0ee46776dad6 100644 --- a/arch/sh/include/asm/pgtable_64.h +++ b/arch/sh/include/asm/pgtable_64.h | |||
@@ -43,11 +43,6 @@ static __inline__ void set_pte(pte_t *pteptr, pte_t pteval) | |||
43 | } | 43 | } |
44 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) | 44 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) |
45 | 45 | ||
46 | static __inline__ void pmd_set(pmd_t *pmdp,pte_t *ptep) | ||
47 | { | ||
48 | pmd_val(*pmdp) = (unsigned long) ptep; | ||
49 | } | ||
50 | |||
51 | /* | 46 | /* |
52 | * PGD defines. Top level. | 47 | * PGD defines. Top level. |
53 | */ | 48 | */ |
@@ -128,8 +123,21 @@ static __inline__ void pmd_set(pmd_t *pmdp,pte_t *ptep) | |||
128 | #define _PAGE_DIRTY 0x400 /* software: page accessed in write */ | 123 | #define _PAGE_DIRTY 0x400 /* software: page accessed in write */ |
129 | #define _PAGE_ACCESSED 0x800 /* software: page referenced */ | 124 | #define _PAGE_ACCESSED 0x800 /* software: page referenced */ |
130 | 125 | ||
126 | /* Wrapper for extended mode pgprot twiddling */ | ||
127 | #define _PAGE_EXT(x) ((unsigned long long)(x) << 32) | ||
128 | |||
129 | /* | ||
130 | * We can use the sign-extended bits in the PTEL to get 32 bits of | ||
131 | * software flags. This works for now because no implementations uses | ||
132 | * anything above the PPN field. | ||
133 | */ | ||
134 | #define _PAGE_WIRED _PAGE_EXT(0x001) /* software: wire the tlb entry */ | ||
135 | |||
136 | #define _PAGE_CLEAR_FLAGS (_PAGE_PRESENT | _PAGE_FILE | _PAGE_SHARED | \ | ||
137 | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_WIRED) | ||
138 | |||
131 | /* Mask which drops software flags */ | 139 | /* Mask which drops software flags */ |
132 | #define _PAGE_FLAGS_HARDWARE_MASK 0xfffffffffffff3dbLL | 140 | #define _PAGE_FLAGS_HARDWARE_MASK (NEFF_MASK & ~(_PAGE_CLEAR_FLAGS)) |
133 | 141 | ||
134 | /* | 142 | /* |
135 | * HugeTLB support | 143 | * HugeTLB support |
@@ -203,12 +211,6 @@ static __inline__ void pmd_set(pmd_t *pmdp,pte_t *ptep) | |||
203 | #define pgprot_writecombine(prot) __pgprot(pgprot_val(prot) & ~_PAGE_CACHABLE) | 211 | #define pgprot_writecombine(prot) __pgprot(pgprot_val(prot) & ~_PAGE_CACHABLE) |
204 | 212 | ||
205 | /* | 213 | /* |
206 | * Handling allocation failures during page table setup. | ||
207 | */ | ||
208 | extern void __handle_bad_pmd_kernel(pmd_t * pmd); | ||
209 | #define __handle_bad_pmd(x) __handle_bad_pmd_kernel(x) | ||
210 | |||
211 | /* | ||
212 | * PTE level access routines. | 214 | * PTE level access routines. |
213 | * | 215 | * |
214 | * Note1: | 216 | * Note1: |
diff --git a/arch/sh/include/asm/processor.h b/arch/sh/include/asm/processor.h index 017e0c1807b2..9605e062840f 100644 --- a/arch/sh/include/asm/processor.h +++ b/arch/sh/include/asm/processor.h | |||
@@ -98,13 +98,34 @@ extern struct sh_cpuinfo cpu_data[]; | |||
98 | 98 | ||
99 | /* Forward decl */ | 99 | /* Forward decl */ |
100 | struct seq_operations; | 100 | struct seq_operations; |
101 | struct task_struct; | ||
101 | 102 | ||
102 | extern struct pt_regs fake_swapper_regs; | 103 | extern struct pt_regs fake_swapper_regs; |
103 | 104 | ||
105 | /* arch/sh/kernel/process.c */ | ||
106 | extern unsigned int xstate_size; | ||
107 | extern void free_thread_xstate(struct task_struct *); | ||
108 | extern struct kmem_cache *task_xstate_cachep; | ||
109 | |||
110 | /* arch/sh/mm/alignment.c */ | ||
111 | extern int get_unalign_ctl(struct task_struct *, unsigned long addr); | ||
112 | extern int set_unalign_ctl(struct task_struct *, unsigned int val); | ||
113 | |||
114 | #define GET_UNALIGN_CTL(tsk, addr) get_unalign_ctl((tsk), (addr)) | ||
115 | #define SET_UNALIGN_CTL(tsk, val) set_unalign_ctl((tsk), (val)) | ||
116 | |||
117 | /* arch/sh/mm/init.c */ | ||
118 | extern unsigned int mem_init_done; | ||
119 | |||
104 | /* arch/sh/kernel/setup.c */ | 120 | /* arch/sh/kernel/setup.c */ |
105 | const char *get_cpu_subtype(struct sh_cpuinfo *c); | 121 | const char *get_cpu_subtype(struct sh_cpuinfo *c); |
106 | extern const struct seq_operations cpuinfo_op; | 122 | extern const struct seq_operations cpuinfo_op; |
107 | 123 | ||
124 | /* thread_struct flags */ | ||
125 | #define SH_THREAD_UAC_NOPRINT (1 << 0) | ||
126 | #define SH_THREAD_UAC_SIGBUS (1 << 1) | ||
127 | #define SH_THREAD_UAC_MASK (SH_THREAD_UAC_NOPRINT | SH_THREAD_UAC_SIGBUS) | ||
128 | |||
108 | /* processor boot mode configuration */ | 129 | /* processor boot mode configuration */ |
109 | #define MODE_PIN0 (1 << 0) | 130 | #define MODE_PIN0 (1 << 0) |
110 | #define MODE_PIN1 (1 << 1) | 131 | #define MODE_PIN1 (1 << 1) |
diff --git a/arch/sh/include/asm/processor_32.h b/arch/sh/include/asm/processor_32.h index 1f3d6fab660c..572b4eb09493 100644 --- a/arch/sh/include/asm/processor_32.h +++ b/arch/sh/include/asm/processor_32.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <asm/page.h> | 14 | #include <asm/page.h> |
15 | #include <asm/types.h> | 15 | #include <asm/types.h> |
16 | #include <asm/ptrace.h> | 16 | #include <asm/ptrace.h> |
17 | #include <asm/hw_breakpoint.h> | ||
17 | 18 | ||
18 | /* | 19 | /* |
19 | * Default implementation of macro that returns current | 20 | * Default implementation of macro that returns current |
@@ -90,9 +91,9 @@ struct sh_fpu_soft_struct { | |||
90 | unsigned long entry_pc; | 91 | unsigned long entry_pc; |
91 | }; | 92 | }; |
92 | 93 | ||
93 | union sh_fpu_union { | 94 | union thread_xstate { |
94 | struct sh_fpu_hard_struct hard; | 95 | struct sh_fpu_hard_struct hardfpu; |
95 | struct sh_fpu_soft_struct soft; | 96 | struct sh_fpu_soft_struct softfpu; |
96 | }; | 97 | }; |
97 | 98 | ||
98 | struct thread_struct { | 99 | struct thread_struct { |
@@ -100,38 +101,30 @@ struct thread_struct { | |||
100 | unsigned long sp; | 101 | unsigned long sp; |
101 | unsigned long pc; | 102 | unsigned long pc; |
102 | 103 | ||
103 | /* Hardware debugging registers */ | 104 | /* Various thread flags, see SH_THREAD_xxx */ |
104 | unsigned long ubc_pc; | 105 | unsigned long flags; |
105 | 106 | ||
106 | /* floating point info */ | 107 | /* Save middle states of ptrace breakpoints */ |
107 | union sh_fpu_union fpu; | 108 | struct perf_event *ptrace_bps[HBP_NUM]; |
108 | 109 | ||
109 | #ifdef CONFIG_SH_DSP | 110 | #ifdef CONFIG_SH_DSP |
110 | /* Dsp status information */ | 111 | /* Dsp status information */ |
111 | struct sh_dsp_struct dsp_status; | 112 | struct sh_dsp_struct dsp_status; |
112 | #endif | 113 | #endif |
113 | }; | ||
114 | 114 | ||
115 | /* Count of active tasks with UBC settings */ | 115 | /* Extended processor state */ |
116 | extern int ubc_usercnt; | 116 | union thread_xstate *xstate; |
117 | }; | ||
117 | 118 | ||
118 | #define INIT_THREAD { \ | 119 | #define INIT_THREAD { \ |
119 | .sp = sizeof(init_stack) + (long) &init_stack, \ | 120 | .sp = sizeof(init_stack) + (long) &init_stack, \ |
121 | .flags = 0, \ | ||
120 | } | 122 | } |
121 | 123 | ||
122 | /* | ||
123 | * Do necessary setup to start up a newly executed thread. | ||
124 | */ | ||
125 | #define start_thread(_regs, new_pc, new_sp) \ | ||
126 | set_fs(USER_DS); \ | ||
127 | _regs->pr = 0; \ | ||
128 | _regs->sr = SR_FD; /* User mode. */ \ | ||
129 | _regs->pc = new_pc; \ | ||
130 | _regs->regs[15] = new_sp | ||
131 | |||
132 | /* Forward declaration, a strange C thing */ | 124 | /* Forward declaration, a strange C thing */ |
133 | struct task_struct; | 125 | struct task_struct; |
134 | struct mm_struct; | 126 | |
127 | extern void start_thread(struct pt_regs *regs, unsigned long new_pc, unsigned long new_sp); | ||
135 | 128 | ||
136 | /* Free all resources held by a thread. */ | 129 | /* Free all resources held by a thread. */ |
137 | extern void release_thread(struct task_struct *); | 130 | extern void release_thread(struct task_struct *); |
diff --git a/arch/sh/include/asm/processor_64.h b/arch/sh/include/asm/processor_64.h index 5727d31b0ccf..621bc4618c6b 100644 --- a/arch/sh/include/asm/processor_64.h +++ b/arch/sh/include/asm/processor_64.h | |||
@@ -87,26 +87,31 @@ struct sh_fpu_hard_struct { | |||
87 | /* long status; * software status information */ | 87 | /* long status; * software status information */ |
88 | }; | 88 | }; |
89 | 89 | ||
90 | #if 0 | ||
91 | /* Dummy fpu emulator */ | 90 | /* Dummy fpu emulator */ |
92 | struct sh_fpu_soft_struct { | 91 | struct sh_fpu_soft_struct { |
93 | unsigned long long fp_regs[32]; | 92 | unsigned long fp_regs[64]; |
94 | unsigned int fpscr; | 93 | unsigned int fpscr; |
95 | unsigned char lookahead; | 94 | unsigned char lookahead; |
96 | unsigned long entry_pc; | 95 | unsigned long entry_pc; |
97 | }; | 96 | }; |
98 | #endif | ||
99 | 97 | ||
100 | union sh_fpu_union { | 98 | union thread_xstate { |
101 | struct sh_fpu_hard_struct hard; | 99 | struct sh_fpu_hard_struct hardfpu; |
102 | /* 'hard' itself only produces 32 bit alignment, yet we need | 100 | struct sh_fpu_soft_struct softfpu; |
103 | to access it using 64 bit load/store as well. */ | 101 | /* |
102 | * The structure definitions only produce 32 bit alignment, yet we need | ||
103 | * to access them using 64 bit load/store as well. | ||
104 | */ | ||
104 | unsigned long long alignment_dummy; | 105 | unsigned long long alignment_dummy; |
105 | }; | 106 | }; |
106 | 107 | ||
107 | struct thread_struct { | 108 | struct thread_struct { |
108 | unsigned long sp; | 109 | unsigned long sp; |
109 | unsigned long pc; | 110 | unsigned long pc; |
111 | |||
112 | /* Various thread flags, see SH_THREAD_xxx */ | ||
113 | unsigned long flags; | ||
114 | |||
110 | /* This stores the address of the pt_regs built during a context | 115 | /* This stores the address of the pt_regs built during a context |
111 | switch, or of the register save area built for a kernel mode | 116 | switch, or of the register save area built for a kernel mode |
112 | exception. It is used for backtracing the stack of a sleeping task | 117 | exception. It is used for backtracing the stack of a sleeping task |
@@ -122,7 +127,7 @@ struct thread_struct { | |||
122 | /* Hardware debugging registers may come here */ | 127 | /* Hardware debugging registers may come here */ |
123 | 128 | ||
124 | /* floating point info */ | 129 | /* floating point info */ |
125 | union sh_fpu_union fpu; | 130 | union thread_xstate *xstate; |
126 | }; | 131 | }; |
127 | 132 | ||
128 | #define INIT_MMAP \ | 133 | #define INIT_MMAP \ |
@@ -137,7 +142,7 @@ struct thread_struct { | |||
137 | .trap_no = 0, \ | 142 | .trap_no = 0, \ |
138 | .error_code = 0, \ | 143 | .error_code = 0, \ |
139 | .address = 0, \ | 144 | .address = 0, \ |
140 | .fpu = { { { 0, } }, } \ | 145 | .flags = 0, \ |
141 | } | 146 | } |
142 | 147 | ||
143 | /* | 148 | /* |
diff --git a/arch/sh/include/asm/ptrace.h b/arch/sh/include/asm/ptrace.h index 1dc12cb44a2d..e11b14ea2c43 100644 --- a/arch/sh/include/asm/ptrace.h +++ b/arch/sh/include/asm/ptrace.h | |||
@@ -102,13 +102,15 @@ struct pt_dspregs { | |||
102 | #define PTRACE_GETDSPREGS 55 /* DSP registers */ | 102 | #define PTRACE_GETDSPREGS 55 /* DSP registers */ |
103 | #define PTRACE_SETDSPREGS 56 | 103 | #define PTRACE_SETDSPREGS 56 |
104 | 104 | ||
105 | #define PT_TEXT_END_ADDR 240 | 105 | #define PT_TEXT_END_ADDR 240 |
106 | #define PT_TEXT_ADDR 244 /* &(struct user)->start_code */ | 106 | #define PT_TEXT_ADDR 244 /* &(struct user)->start_code */ |
107 | #define PT_DATA_ADDR 248 /* &(struct user)->start_data */ | 107 | #define PT_DATA_ADDR 248 /* &(struct user)->start_data */ |
108 | #define PT_TEXT_LEN 252 | 108 | #define PT_TEXT_LEN 252 |
109 | 109 | ||
110 | #ifdef __KERNEL__ | 110 | #ifdef __KERNEL__ |
111 | #include <asm/addrspace.h> | 111 | #include <asm/addrspace.h> |
112 | #include <asm/page.h> | ||
113 | #include <asm/system.h> | ||
112 | 114 | ||
113 | #define user_mode(regs) (((regs)->sr & 0x40000000)==0) | 115 | #define user_mode(regs) (((regs)->sr & 0x40000000)==0) |
114 | #define instruction_pointer(regs) ((unsigned long)(regs)->pc) | 116 | #define instruction_pointer(regs) ((unsigned long)(regs)->pc) |
@@ -124,6 +126,12 @@ struct task_struct; | |||
124 | extern void user_enable_single_step(struct task_struct *); | 126 | extern void user_enable_single_step(struct task_struct *); |
125 | extern void user_disable_single_step(struct task_struct *); | 127 | extern void user_disable_single_step(struct task_struct *); |
126 | 128 | ||
129 | struct perf_event; | ||
130 | struct perf_sample_data; | ||
131 | |||
132 | extern void ptrace_triggered(struct perf_event *bp, int nmi, | ||
133 | struct perf_sample_data *data, struct pt_regs *regs); | ||
134 | |||
127 | #define task_pt_regs(task) \ | 135 | #define task_pt_regs(task) \ |
128 | ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE) - 1) | 136 | ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE) - 1) |
129 | 137 | ||
@@ -131,10 +139,8 @@ static inline unsigned long profile_pc(struct pt_regs *regs) | |||
131 | { | 139 | { |
132 | unsigned long pc = instruction_pointer(regs); | 140 | unsigned long pc = instruction_pointer(regs); |
133 | 141 | ||
134 | #ifdef P2SEG | 142 | if (virt_addr_uncached(pc)) |
135 | if (pc >= P2SEG && pc < P3SEG) | 143 | return CAC_ADDR(pc); |
136 | pc -= 0x20000000; | ||
137 | #endif | ||
138 | 144 | ||
139 | return pc; | 145 | return pc; |
140 | } | 146 | } |
diff --git a/arch/sh/include/asm/reboot.h b/arch/sh/include/asm/reboot.h new file mode 100644 index 000000000000..b3da0c63fc3d --- /dev/null +++ b/arch/sh/include/asm/reboot.h | |||
@@ -0,0 +1,21 @@ | |||
1 | #ifndef __ASM_SH_REBOOT_H | ||
2 | #define __ASM_SH_REBOOT_H | ||
3 | |||
4 | #include <linux/kdebug.h> | ||
5 | |||
6 | struct pt_regs; | ||
7 | |||
8 | struct machine_ops { | ||
9 | void (*restart)(char *cmd); | ||
10 | void (*halt)(void); | ||
11 | void (*power_off)(void); | ||
12 | void (*shutdown)(void); | ||
13 | void (*crash_shutdown)(struct pt_regs *); | ||
14 | }; | ||
15 | |||
16 | extern struct machine_ops machine_ops; | ||
17 | |||
18 | /* arch/sh/kernel/machine_kexec.c */ | ||
19 | void native_machine_crash_shutdown(struct pt_regs *regs); | ||
20 | |||
21 | #endif /* __ASM_SH_REBOOT_H */ | ||
diff --git a/arch/sh/include/asm/setup.h b/arch/sh/include/asm/setup.h index ce3743599b27..4758325bb24a 100644 --- a/arch/sh/include/asm/setup.h +++ b/arch/sh/include/asm/setup.h | |||
@@ -18,7 +18,6 @@ | |||
18 | /* ... */ | 18 | /* ... */ |
19 | #define COMMAND_LINE ((char *) (PARAM+0x100)) | 19 | #define COMMAND_LINE ((char *) (PARAM+0x100)) |
20 | 20 | ||
21 | int setup_early_printk(char *); | ||
22 | void sh_mv_setup(void); | 21 | void sh_mv_setup(void); |
23 | 22 | ||
24 | #endif /* __KERNEL__ */ | 23 | #endif /* __KERNEL__ */ |
diff --git a/arch/sh/include/asm/sh_bios.h b/arch/sh/include/asm/sh_bios.h index d9c96d7cf6c7..95714c28422b 100644 --- a/arch/sh/include/asm/sh_bios.h +++ b/arch/sh/include/asm/sh_bios.h | |||
@@ -1,18 +1,27 @@ | |||
1 | #ifndef __ASM_SH_BIOS_H | 1 | #ifndef __ASM_SH_BIOS_H |
2 | #define __ASM_SH_BIOS_H | 2 | #define __ASM_SH_BIOS_H |
3 | 3 | ||
4 | #ifdef CONFIG_SH_STANDARD_BIOS | ||
5 | |||
4 | /* | 6 | /* |
5 | * Copyright (C) 2000 Greg Banks, Mitch Davis | 7 | * Copyright (C) 2000 Greg Banks, Mitch Davis |
6 | * C API to interface to the standard LinuxSH BIOS | 8 | * C API to interface to the standard LinuxSH BIOS |
7 | * usually from within the early stages of kernel boot. | 9 | * usually from within the early stages of kernel boot. |
8 | */ | 10 | */ |
9 | |||
10 | |||
11 | extern void sh_bios_console_write(const char *buf, unsigned int len); | 11 | extern void sh_bios_console_write(const char *buf, unsigned int len); |
12 | extern void sh_bios_char_out(char ch); | ||
13 | extern void sh_bios_gdb_detach(void); | 12 | extern void sh_bios_gdb_detach(void); |
14 | 13 | ||
15 | extern void sh_bios_get_node_addr(unsigned char *node_addr); | 14 | extern void sh_bios_get_node_addr(unsigned char *node_addr); |
16 | extern void sh_bios_shutdown(unsigned int how); | 15 | extern void sh_bios_shutdown(unsigned int how); |
17 | 16 | ||
17 | extern void sh_bios_vbr_init(void); | ||
18 | extern void sh_bios_vbr_reload(void); | ||
19 | |||
20 | #else | ||
21 | |||
22 | static inline void sh_bios_vbr_init(void) { } | ||
23 | static inline void sh_bios_vbr_reload(void) { } | ||
24 | |||
25 | #endif /* CONFIG_SH_STANDARD_BIOS */ | ||
26 | |||
18 | #endif /* __ASM_SH_BIOS_H */ | 27 | #endif /* __ASM_SH_BIOS_H */ |
diff --git a/arch/sh/include/asm/suspend.h b/arch/sh/include/asm/suspend.h index fe9c2a1ad047..64eb41a063e8 100644 --- a/arch/sh/include/asm/suspend.h +++ b/arch/sh/include/asm/suspend.h | |||
@@ -92,5 +92,6 @@ extern unsigned long sh_mobile_sleep_supported; | |||
92 | #define SUSP_SH_USTANDBY (1 << 3) /* SH-Mobile U-standby mode */ | 92 | #define SUSP_SH_USTANDBY (1 << 3) /* SH-Mobile U-standby mode */ |
93 | #define SUSP_SH_SF (1 << 4) /* Enable self-refresh */ | 93 | #define SUSP_SH_SF (1 << 4) /* Enable self-refresh */ |
94 | #define SUSP_SH_MMU (1 << 5) /* Save/restore MMU and cache */ | 94 | #define SUSP_SH_MMU (1 << 5) /* Save/restore MMU and cache */ |
95 | #define SUSP_SH_REGS (1 << 6) /* Save/restore registers */ | ||
95 | 96 | ||
96 | #endif /* _ASM_SH_SUSPEND_H */ | 97 | #endif /* _ASM_SH_SUSPEND_H */ |
diff --git a/arch/sh/include/asm/system.h b/arch/sh/include/asm/system.h index c15415b4b169..0bd7a17d5e1a 100644 --- a/arch/sh/include/asm/system.h +++ b/arch/sh/include/asm/system.h | |||
@@ -10,7 +10,6 @@ | |||
10 | #include <linux/compiler.h> | 10 | #include <linux/compiler.h> |
11 | #include <linux/linkage.h> | 11 | #include <linux/linkage.h> |
12 | #include <asm/types.h> | 12 | #include <asm/types.h> |
13 | #include <asm/ptrace.h> | ||
14 | 13 | ||
15 | #define AT_VECTOR_SIZE_ARCH 5 /* entries in ARCH_DLINFO */ | 14 | #define AT_VECTOR_SIZE_ARCH 5 /* entries in ARCH_DLINFO */ |
16 | 15 | ||
@@ -32,7 +31,7 @@ | |||
32 | #define mb() __asm__ __volatile__ ("synco": : :"memory") | 31 | #define mb() __asm__ __volatile__ ("synco": : :"memory") |
33 | #define rmb() mb() | 32 | #define rmb() mb() |
34 | #define wmb() __asm__ __volatile__ ("synco": : :"memory") | 33 | #define wmb() __asm__ __volatile__ ("synco": : :"memory") |
35 | #define ctrl_barrier() __icbi(0xa8000000) | 34 | #define ctrl_barrier() __icbi(PAGE_OFFSET) |
36 | #define read_barrier_depends() do { } while(0) | 35 | #define read_barrier_depends() do { } while(0) |
37 | #else | 36 | #else |
38 | #define mb() __asm__ __volatile__ ("": : :"memory") | 37 | #define mb() __asm__ __volatile__ ("": : :"memory") |
@@ -114,6 +113,8 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, | |||
114 | (unsigned long)_n_, sizeof(*(ptr))); \ | 113 | (unsigned long)_n_, sizeof(*(ptr))); \ |
115 | }) | 114 | }) |
116 | 115 | ||
116 | struct pt_regs; | ||
117 | |||
117 | extern void die(const char *str, struct pt_regs *regs, long err) __attribute__ ((noreturn)); | 118 | extern void die(const char *str, struct pt_regs *regs, long err) __attribute__ ((noreturn)); |
118 | void free_initmem(void); | 119 | void free_initmem(void); |
119 | void free_initrd_mem(unsigned long start, unsigned long end); | 120 | void free_initrd_mem(unsigned long start, unsigned long end); |
@@ -137,14 +138,14 @@ extern unsigned int instruction_size(unsigned int insn); | |||
137 | #endif | 138 | #endif |
138 | 139 | ||
139 | extern unsigned long cached_to_uncached; | 140 | extern unsigned long cached_to_uncached; |
141 | extern unsigned long uncached_size; | ||
140 | 142 | ||
141 | extern struct dentry *sh_debugfs_root; | 143 | extern struct dentry *sh_debugfs_root; |
142 | 144 | ||
143 | void per_cpu_trap_init(void); | 145 | void per_cpu_trap_init(void); |
144 | void default_idle(void); | 146 | void default_idle(void); |
145 | void cpu_idle_wait(void); | 147 | void cpu_idle_wait(void); |
146 | 148 | void stop_this_cpu(void *); | |
147 | asmlinkage void break_point_trap(void); | ||
148 | 149 | ||
149 | #ifdef CONFIG_SUPERH32 | 150 | #ifdef CONFIG_SUPERH32 |
150 | #define BUILD_TRAP_HANDLER(name) \ | 151 | #define BUILD_TRAP_HANDLER(name) \ |
diff --git a/arch/sh/include/asm/system_32.h b/arch/sh/include/asm/system_32.h index 06814f5b59c7..51296b36770e 100644 --- a/arch/sh/include/asm/system_32.h +++ b/arch/sh/include/asm/system_32.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define __ASM_SH_SYSTEM_32_H | 2 | #define __ASM_SH_SYSTEM_32_H |
3 | 3 | ||
4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
5 | #include <asm/mmu.h> | ||
5 | 6 | ||
6 | #ifdef CONFIG_SH_DSP | 7 | #ifdef CONFIG_SH_DSP |
7 | 8 | ||
@@ -144,9 +145,6 @@ do { \ | |||
144 | __restore_dsp(prev); \ | 145 | __restore_dsp(prev); \ |
145 | } while (0) | 146 | } while (0) |
146 | 147 | ||
147 | #define __uses_jump_to_uncached \ | ||
148 | noinline __attribute__ ((__section__ (".uncached.text"))) | ||
149 | |||
150 | /* | 148 | /* |
151 | * Jump to uncached area. | 149 | * Jump to uncached area. |
152 | * When handling TLB or caches, we need to do it from an uncached area. | 150 | * When handling TLB or caches, we need to do it from an uncached area. |
@@ -216,6 +214,17 @@ static inline reg_size_t register_align(void *val) | |||
216 | int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs, | 214 | int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs, |
217 | struct mem_access *ma, int); | 215 | struct mem_access *ma, int); |
218 | 216 | ||
217 | static inline void trigger_address_error(void) | ||
218 | { | ||
219 | if (__in_29bit_mode()) | ||
220 | __asm__ __volatile__ ( | ||
221 | "ldc %0, sr\n\t" | ||
222 | "mov.l @%1, %0" | ||
223 | : | ||
224 | : "r" (0x10000000), "r" (0x80000001) | ||
225 | ); | ||
226 | } | ||
227 | |||
219 | asmlinkage void do_address_error(struct pt_regs *regs, | 228 | asmlinkage void do_address_error(struct pt_regs *regs, |
220 | unsigned long writeaccess, | 229 | unsigned long writeaccess, |
221 | unsigned long address); | 230 | unsigned long address); |
diff --git a/arch/sh/include/asm/system_64.h b/arch/sh/include/asm/system_64.h index ab1dd917ea87..36338646dfc8 100644 --- a/arch/sh/include/asm/system_64.h +++ b/arch/sh/include/asm/system_64.h | |||
@@ -18,6 +18,7 @@ | |||
18 | /* | 18 | /* |
19 | * switch_to() should switch tasks to task nr n, first | 19 | * switch_to() should switch tasks to task nr n, first |
20 | */ | 20 | */ |
21 | struct thread_struct; | ||
21 | struct task_struct *sh64_switch_to(struct task_struct *prev, | 22 | struct task_struct *sh64_switch_to(struct task_struct *prev, |
22 | struct thread_struct *prev_thread, | 23 | struct thread_struct *prev_thread, |
23 | struct task_struct *next, | 24 | struct task_struct *next, |
@@ -33,8 +34,6 @@ do { \ | |||
33 | &next->thread); \ | 34 | &next->thread); \ |
34 | } while (0) | 35 | } while (0) |
35 | 36 | ||
36 | #define __uses_jump_to_uncached | ||
37 | |||
38 | #define jump_to_uncached() do { } while (0) | 37 | #define jump_to_uncached() do { } while (0) |
39 | #define back_to_cached() do { } while (0) | 38 | #define back_to_cached() do { } while (0) |
40 | 39 | ||
@@ -48,6 +47,13 @@ static inline reg_size_t register_align(void *val) | |||
48 | return (unsigned long long)(signed long long)(signed long)val; | 47 | return (unsigned long long)(signed long long)(signed long)val; |
49 | } | 48 | } |
50 | 49 | ||
50 | extern void phys_stext(void); | ||
51 | |||
52 | static inline void trigger_address_error(void) | ||
53 | { | ||
54 | phys_stext(); | ||
55 | } | ||
56 | |||
51 | #define SR_BL_LL 0x0000000010000000LL | 57 | #define SR_BL_LL 0x0000000010000000LL |
52 | 58 | ||
53 | static inline void set_bl_bit(void) | 59 | static inline void set_bl_bit(void) |
diff --git a/arch/sh/include/asm/thread_info.h b/arch/sh/include/asm/thread_info.h index 1f3d927e2265..55a36fef6875 100644 --- a/arch/sh/include/asm/thread_info.h +++ b/arch/sh/include/asm/thread_info.h | |||
@@ -93,14 +93,16 @@ static inline struct thread_info *current_thread_info(void) | |||
93 | 93 | ||
94 | #define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) | 94 | #define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) |
95 | 95 | ||
96 | #else /* THREAD_SHIFT < PAGE_SHIFT */ | 96 | #endif |
97 | |||
98 | #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||
99 | 97 | ||
100 | extern struct thread_info *alloc_thread_info(struct task_struct *tsk); | 98 | extern struct thread_info *alloc_thread_info(struct task_struct *tsk); |
101 | extern void free_thread_info(struct thread_info *ti); | 99 | extern void free_thread_info(struct thread_info *ti); |
100 | extern void arch_task_cache_init(void); | ||
101 | #define arch_task_cache_init arch_task_cache_init | ||
102 | extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); | ||
103 | extern void init_thread_xstate(void); | ||
102 | 104 | ||
103 | #endif /* THREAD_SHIFT < PAGE_SHIFT */ | 105 | #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR |
104 | 106 | ||
105 | #endif /* __ASSEMBLY__ */ | 107 | #endif /* __ASSEMBLY__ */ |
106 | 108 | ||
diff --git a/arch/sh/include/asm/tlb.h b/arch/sh/include/asm/tlb.h index da8fe7ab8728..75abb38dffd5 100644 --- a/arch/sh/include/asm/tlb.h +++ b/arch/sh/include/asm/tlb.h | |||
@@ -11,6 +11,7 @@ | |||
11 | #ifdef CONFIG_MMU | 11 | #ifdef CONFIG_MMU |
12 | #include <asm/pgalloc.h> | 12 | #include <asm/pgalloc.h> |
13 | #include <asm/tlbflush.h> | 13 | #include <asm/tlbflush.h> |
14 | #include <asm/mmu_context.h> | ||
14 | 15 | ||
15 | /* | 16 | /* |
16 | * TLB handling. This allows us to remove pages from the page | 17 | * TLB handling. This allows us to remove pages from the page |
@@ -97,6 +98,22 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) | |||
97 | 98 | ||
98 | #define tlb_migrate_finish(mm) do { } while (0) | 99 | #define tlb_migrate_finish(mm) do { } while (0) |
99 | 100 | ||
101 | #if defined(CONFIG_CPU_SH4) || defined(CONFIG_SUPERH64) | ||
102 | extern void tlb_wire_entry(struct vm_area_struct *, unsigned long, pte_t); | ||
103 | extern void tlb_unwire_entry(void); | ||
104 | #else | ||
105 | static inline void tlb_wire_entry(struct vm_area_struct *vma , | ||
106 | unsigned long addr, pte_t pte) | ||
107 | { | ||
108 | BUG(); | ||
109 | } | ||
110 | |||
111 | static inline void tlb_unwire_entry(void) | ||
112 | { | ||
113 | BUG(); | ||
114 | } | ||
115 | #endif | ||
116 | |||
100 | #else /* CONFIG_MMU */ | 117 | #else /* CONFIG_MMU */ |
101 | 118 | ||
102 | #define tlb_start_vma(tlb, vma) do { } while (0) | 119 | #define tlb_start_vma(tlb, vma) do { } while (0) |
diff --git a/arch/sh/include/asm/ubc.h b/arch/sh/include/asm/ubc.h deleted file mode 100644 index 9bf961684431..000000000000 --- a/arch/sh/include/asm/ubc.h +++ /dev/null | |||
@@ -1,64 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-sh/ubc.h | ||
3 | * | ||
4 | * Copyright (C) 1999 Niibe Yutaka | ||
5 | * Copyright (C) 2002, 2003 Paul Mundt | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | #ifndef __ASM_SH_UBC_H | ||
12 | #define __ASM_SH_UBC_H | ||
13 | #ifdef __KERNEL__ | ||
14 | |||
15 | #include <cpu/ubc.h> | ||
16 | |||
17 | /* User Break Controller */ | ||
18 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) | ||
19 | #define UBC_TYPE_SH7729 (current_cpu_data.type == CPU_SH7729) | ||
20 | #else | ||
21 | #define UBC_TYPE_SH7729 0 | ||
22 | #endif | ||
23 | |||
24 | #define BAMR_ASID (1 << 2) | ||
25 | #define BAMR_NONE 0 | ||
26 | #define BAMR_10 0x1 | ||
27 | #define BAMR_12 0x2 | ||
28 | #define BAMR_ALL 0x3 | ||
29 | #define BAMR_16 0x8 | ||
30 | #define BAMR_20 0x9 | ||
31 | |||
32 | #define BBR_INST (1 << 4) | ||
33 | #define BBR_DATA (2 << 4) | ||
34 | #define BBR_READ (1 << 2) | ||
35 | #define BBR_WRITE (2 << 2) | ||
36 | #define BBR_BYTE 0x1 | ||
37 | #define BBR_HALF 0x2 | ||
38 | #define BBR_LONG 0x3 | ||
39 | #define BBR_QUAD (1 << 6) /* SH7750 */ | ||
40 | #define BBR_CPU (1 << 6) /* SH7709A,SH7729 */ | ||
41 | #define BBR_DMA (2 << 6) /* SH7709A,SH7729 */ | ||
42 | |||
43 | #define BRCR_CMFA (1 << 15) | ||
44 | #define BRCR_CMFB (1 << 14) | ||
45 | |||
46 | #if defined CONFIG_CPU_SH2A | ||
47 | #define BRCR_CMFCA (1 << 15) | ||
48 | #define BRCR_CMFCB (1 << 14) | ||
49 | #define BRCR_CMFDA (1 << 13) | ||
50 | #define BRCR_CMFDB (1 << 12) | ||
51 | #define BRCR_PCBB (1 << 6) /* 1: after execution */ | ||
52 | #define BRCR_PCBA (1 << 5) /* 1: after execution */ | ||
53 | #define BRCR_PCTE 0 | ||
54 | #else | ||
55 | #define BRCR_PCTE (1 << 11) | ||
56 | #define BRCR_PCBA (1 << 10) /* 1: after execution */ | ||
57 | #define BRCR_DBEB (1 << 7) | ||
58 | #define BRCR_PCBB (1 << 6) | ||
59 | #define BRCR_SEQ (1 << 3) | ||
60 | #define BRCR_UBDE (1 << 0) | ||
61 | #endif | ||
62 | |||
63 | #endif /* __KERNEL__ */ | ||
64 | #endif /* __ASM_SH_UBC_H */ | ||
diff --git a/arch/sh/include/asm/uncached.h b/arch/sh/include/asm/uncached.h new file mode 100644 index 000000000000..e3419f96626a --- /dev/null +++ b/arch/sh/include/asm/uncached.h | |||
@@ -0,0 +1,18 @@ | |||
1 | #ifndef __ASM_SH_UNCACHED_H | ||
2 | #define __ASM_SH_UNCACHED_H | ||
3 | |||
4 | #include <linux/bug.h> | ||
5 | |||
6 | #ifdef CONFIG_UNCACHED_MAPPING | ||
7 | extern unsigned long uncached_start, uncached_end; | ||
8 | |||
9 | extern int virt_addr_uncached(unsigned long kaddr); | ||
10 | extern void uncached_init(void); | ||
11 | extern void uncached_resize(unsigned long size); | ||
12 | #else | ||
13 | #define virt_addr_uncached(kaddr) (0) | ||
14 | #define uncached_init() do { } while (0) | ||
15 | #define uncached_resize(size) BUG() | ||
16 | #endif | ||
17 | |||
18 | #endif /* __ASM_SH_UNCACHED_H */ | ||
diff --git a/arch/sh/include/asm/vmlinux.lds.h b/arch/sh/include/asm/vmlinux.lds.h index 244ec4ad9a79..d58ad493b3a6 100644 --- a/arch/sh/include/asm/vmlinux.lds.h +++ b/arch/sh/include/asm/vmlinux.lds.h | |||
@@ -14,4 +14,12 @@ | |||
14 | #define DWARF_EH_FRAME | 14 | #define DWARF_EH_FRAME |
15 | #endif | 15 | #endif |
16 | 16 | ||
17 | #ifdef CONFIG_SUPERH64 | ||
18 | #define EXTRA_TEXT \ | ||
19 | *(.text64) \ | ||
20 | *(.text..SHmedia32) | ||
21 | #else | ||
22 | #define EXTRA_TEXT | ||
23 | #endif | ||
24 | |||
17 | #endif /* __ASM_SH_VMLINUX_LDS_H */ | 25 | #endif /* __ASM_SH_VMLINUX_LDS_H */ |
diff --git a/arch/sh/include/asm/watchdog.h b/arch/sh/include/asm/watchdog.h index 19dfff5c8511..85a7aca7fb8f 100644 --- a/arch/sh/include/asm/watchdog.h +++ b/arch/sh/include/asm/watchdog.h | |||
@@ -70,7 +70,7 @@ | |||
70 | */ | 70 | */ |
71 | static inline __u32 sh_wdt_read_cnt(void) | 71 | static inline __u32 sh_wdt_read_cnt(void) |
72 | { | 72 | { |
73 | return ctrl_inl(WTCNT_R); | 73 | return __raw_readl(WTCNT_R); |
74 | } | 74 | } |
75 | 75 | ||
76 | /** | 76 | /** |
@@ -82,7 +82,7 @@ static inline __u32 sh_wdt_read_cnt(void) | |||
82 | */ | 82 | */ |
83 | static inline void sh_wdt_write_cnt(__u32 val) | 83 | static inline void sh_wdt_write_cnt(__u32 val) |
84 | { | 84 | { |
85 | ctrl_outl((WTCNT_HIGH << 24) | (__u32)val, WTCNT); | 85 | __raw_writel((WTCNT_HIGH << 24) | (__u32)val, WTCNT); |
86 | } | 86 | } |
87 | 87 | ||
88 | /** | 88 | /** |
@@ -94,7 +94,7 @@ static inline void sh_wdt_write_cnt(__u32 val) | |||
94 | */ | 94 | */ |
95 | static inline void sh_wdt_write_bst(__u32 val) | 95 | static inline void sh_wdt_write_bst(__u32 val) |
96 | { | 96 | { |
97 | ctrl_outl((WTBST_HIGH << 24) | (__u32)val, WTBST); | 97 | __raw_writel((WTBST_HIGH << 24) | (__u32)val, WTBST); |
98 | } | 98 | } |
99 | /** | 99 | /** |
100 | * sh_wdt_read_csr - Read from Control/Status Register | 100 | * sh_wdt_read_csr - Read from Control/Status Register |
@@ -103,7 +103,7 @@ static inline void sh_wdt_write_bst(__u32 val) | |||
103 | */ | 103 | */ |
104 | static inline __u32 sh_wdt_read_csr(void) | 104 | static inline __u32 sh_wdt_read_csr(void) |
105 | { | 105 | { |
106 | return ctrl_inl(WTCSR_R); | 106 | return __raw_readl(WTCSR_R); |
107 | } | 107 | } |
108 | 108 | ||
109 | /** | 109 | /** |
@@ -115,7 +115,7 @@ static inline __u32 sh_wdt_read_csr(void) | |||
115 | */ | 115 | */ |
116 | static inline void sh_wdt_write_csr(__u32 val) | 116 | static inline void sh_wdt_write_csr(__u32 val) |
117 | { | 117 | { |
118 | ctrl_outl((WTCSR_HIGH << 24) | (__u32)val, WTCSR); | 118 | __raw_writel((WTCSR_HIGH << 24) | (__u32)val, WTCSR); |
119 | } | 119 | } |
120 | #else | 120 | #else |
121 | /** | 121 | /** |
@@ -124,7 +124,7 @@ static inline void sh_wdt_write_csr(__u32 val) | |||
124 | */ | 124 | */ |
125 | static inline __u8 sh_wdt_read_cnt(void) | 125 | static inline __u8 sh_wdt_read_cnt(void) |
126 | { | 126 | { |
127 | return ctrl_inb(WTCNT_R); | 127 | return __raw_readb(WTCNT_R); |
128 | } | 128 | } |
129 | 129 | ||
130 | /** | 130 | /** |
@@ -136,7 +136,7 @@ static inline __u8 sh_wdt_read_cnt(void) | |||
136 | */ | 136 | */ |
137 | static inline void sh_wdt_write_cnt(__u8 val) | 137 | static inline void sh_wdt_write_cnt(__u8 val) |
138 | { | 138 | { |
139 | ctrl_outw((WTCNT_HIGH << 8) | (__u16)val, WTCNT); | 139 | __raw_writew((WTCNT_HIGH << 8) | (__u16)val, WTCNT); |
140 | } | 140 | } |
141 | 141 | ||
142 | /** | 142 | /** |
@@ -146,7 +146,7 @@ static inline void sh_wdt_write_cnt(__u8 val) | |||
146 | */ | 146 | */ |
147 | static inline __u8 sh_wdt_read_csr(void) | 147 | static inline __u8 sh_wdt_read_csr(void) |
148 | { | 148 | { |
149 | return ctrl_inb(WTCSR_R); | 149 | return __raw_readb(WTCSR_R); |
150 | } | 150 | } |
151 | 151 | ||
152 | /** | 152 | /** |
@@ -158,7 +158,7 @@ static inline __u8 sh_wdt_read_csr(void) | |||
158 | */ | 158 | */ |
159 | static inline void sh_wdt_write_csr(__u8 val) | 159 | static inline void sh_wdt_write_csr(__u8 val) |
160 | { | 160 | { |
161 | ctrl_outw((WTCSR_HIGH << 8) | (__u16)val, WTCSR); | 161 | __raw_writew((WTCSR_HIGH << 8) | (__u16)val, WTCSR); |
162 | } | 162 | } |
163 | #endif /* CONFIG_CPU_SUBTYPE_SH7785 || CONFIG_CPU_SUBTYPE_SH7780 */ | 163 | #endif /* CONFIG_CPU_SUBTYPE_SH7785 || CONFIG_CPU_SUBTYPE_SH7780 */ |
164 | #endif /* __KERNEL__ */ | 164 | #endif /* __KERNEL__ */ |
diff --git a/arch/sh/include/cpu-sh2/cpu/ubc.h b/arch/sh/include/cpu-sh2/cpu/ubc.h deleted file mode 100644 index ba0e87f19c7a..000000000000 --- a/arch/sh/include/cpu-sh2/cpu/ubc.h +++ /dev/null | |||
@@ -1,32 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-sh/cpu-sh2/ubc.h | ||
3 | * | ||
4 | * Copyright (C) 2003 Paul Mundt | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | #ifndef __ASM_CPU_SH2_UBC_H | ||
11 | #define __ASM_CPU_SH2_UBC_H | ||
12 | |||
13 | #define UBC_BARA 0xffffff40 | ||
14 | #define UBC_BAMRA 0xffffff44 | ||
15 | #define UBC_BBRA 0xffffff48 | ||
16 | #define UBC_BARB 0xffffff60 | ||
17 | #define UBC_BAMRB 0xffffff64 | ||
18 | #define UBC_BBRB 0xffffff68 | ||
19 | #define UBC_BDRB 0xffffff70 | ||
20 | #define UBC_BDMRB 0xffffff74 | ||
21 | #define UBC_BRCR 0xffffff78 | ||
22 | |||
23 | /* | ||
24 | * We don't have any ASID changes to make in the UBC on the SH-2. | ||
25 | * | ||
26 | * Make these purposely invalid to track misuse. | ||
27 | */ | ||
28 | #define UBC_BASRA 0x00000000 | ||
29 | #define UBC_BASRB 0x00000000 | ||
30 | |||
31 | #endif /* __ASM_CPU_SH2_UBC_H */ | ||
32 | |||
diff --git a/arch/sh/include/cpu-sh2/cpu/watchdog.h b/arch/sh/include/cpu-sh2/cpu/watchdog.h index 393161c9c6d0..1eab8aa63a6d 100644 --- a/arch/sh/include/cpu-sh2/cpu/watchdog.h +++ b/arch/sh/include/cpu-sh2/cpu/watchdog.h | |||
@@ -44,7 +44,7 @@ static inline __u8 sh_wdt_read_rstcsr(void) | |||
44 | /* | 44 | /* |
45 | * Same read/write brain-damage as for WTCNT here.. | 45 | * Same read/write brain-damage as for WTCNT here.. |
46 | */ | 46 | */ |
47 | return ctrl_inb(RSTCSR_R); | 47 | return __raw_readb(RSTCSR_R); |
48 | } | 48 | } |
49 | 49 | ||
50 | /** | 50 | /** |
@@ -62,7 +62,7 @@ static inline void sh_wdt_write_rstcsr(__u8 val) | |||
62 | * we can't presently touch the WOVF bit, since the upper byte | 62 | * we can't presently touch the WOVF bit, since the upper byte |
63 | * has to be swapped for this. So just leave it alone.. | 63 | * has to be swapped for this. So just leave it alone.. |
64 | */ | 64 | */ |
65 | ctrl_outw((WTCNT_HIGH << 8) | (__u16)val, RSTCSR); | 65 | __raw_writeb((WTCNT_HIGH << 8) | (__u16)val, RSTCSR); |
66 | } | 66 | } |
67 | 67 | ||
68 | #endif /* __ASM_CPU_SH2_WATCHDOG_H */ | 68 | #endif /* __ASM_CPU_SH2_WATCHDOG_H */ |
diff --git a/arch/sh/include/cpu-sh3/cpu/dac.h b/arch/sh/include/cpu-sh3/cpu/dac.h index 05fda8316ebc..98f1d15f0ab5 100644 --- a/arch/sh/include/cpu-sh3/cpu/dac.h +++ b/arch/sh/include/cpu-sh3/cpu/dac.h | |||
@@ -17,25 +17,25 @@ | |||
17 | static __inline__ void sh_dac_enable(int channel) | 17 | static __inline__ void sh_dac_enable(int channel) |
18 | { | 18 | { |
19 | unsigned char v; | 19 | unsigned char v; |
20 | v = ctrl_inb(DACR); | 20 | v = __raw_readb(DACR); |
21 | if(channel) v |= DACR_DAOE1; | 21 | if(channel) v |= DACR_DAOE1; |
22 | else v |= DACR_DAOE0; | 22 | else v |= DACR_DAOE0; |
23 | ctrl_outb(v,DACR); | 23 | __raw_writeb(v,DACR); |
24 | } | 24 | } |
25 | 25 | ||
26 | static __inline__ void sh_dac_disable(int channel) | 26 | static __inline__ void sh_dac_disable(int channel) |
27 | { | 27 | { |
28 | unsigned char v; | 28 | unsigned char v; |
29 | v = ctrl_inb(DACR); | 29 | v = __raw_readb(DACR); |
30 | if(channel) v &= ~DACR_DAOE1; | 30 | if(channel) v &= ~DACR_DAOE1; |
31 | else v &= ~DACR_DAOE0; | 31 | else v &= ~DACR_DAOE0; |
32 | ctrl_outb(v,DACR); | 32 | __raw_writeb(v,DACR); |
33 | } | 33 | } |
34 | 34 | ||
35 | static __inline__ void sh_dac_output(u8 value, int channel) | 35 | static __inline__ void sh_dac_output(u8 value, int channel) |
36 | { | 36 | { |
37 | if(channel) ctrl_outb(value,DADR1); | 37 | if(channel) __raw_writeb(value,DADR1); |
38 | else ctrl_outb(value,DADR0); | 38 | else __raw_writeb(value,DADR0); |
39 | } | 39 | } |
40 | 40 | ||
41 | #endif /* __ASM_CPU_SH3_DAC_H */ | 41 | #endif /* __ASM_CPU_SH3_DAC_H */ |
diff --git a/arch/sh/include/cpu-sh3/cpu/dma.h b/arch/sh/include/cpu-sh3/cpu/dma.h index 0ea15f3f2363..207811a7a650 100644 --- a/arch/sh/include/cpu-sh3/cpu/dma.h +++ b/arch/sh/include/cpu-sh3/cpu/dma.h | |||
@@ -20,8 +20,10 @@ | |||
20 | #define TS_32 0x00000010 | 20 | #define TS_32 0x00000010 |
21 | #define TS_128 0x00000018 | 21 | #define TS_128 0x00000018 |
22 | 22 | ||
23 | #define CHCR_TS_MASK 0x18 | 23 | #define CHCR_TS_LOW_MASK 0x18 |
24 | #define CHCR_TS_SHIFT 3 | 24 | #define CHCR_TS_LOW_SHIFT 3 |
25 | #define CHCR_TS_HIGH_MASK 0 | ||
26 | #define CHCR_TS_HIGH_SHIFT 0 | ||
25 | 27 | ||
26 | #define DMAOR_INIT DMAOR_DME | 28 | #define DMAOR_INIT DMAOR_DME |
27 | 29 | ||
@@ -36,11 +38,13 @@ enum { | |||
36 | XMIT_SZ_128BIT, | 38 | XMIT_SZ_128BIT, |
37 | }; | 39 | }; |
38 | 40 | ||
39 | static unsigned int ts_shift[] __maybe_unused = { | 41 | #define TS_SHIFT { \ |
40 | [XMIT_SZ_8BIT] = 0, | 42 | [XMIT_SZ_8BIT] = 0, \ |
41 | [XMIT_SZ_16BIT] = 1, | 43 | [XMIT_SZ_16BIT] = 1, \ |
42 | [XMIT_SZ_32BIT] = 2, | 44 | [XMIT_SZ_32BIT] = 2, \ |
43 | [XMIT_SZ_128BIT] = 4, | 45 | [XMIT_SZ_128BIT] = 4, \ |
44 | }; | 46 | } |
47 | |||
48 | #define TS_INDEX2VAL(i) (((i) & 3) << CHCR_TS_LOW_SHIFT) | ||
45 | 49 | ||
46 | #endif /* __ASM_CPU_SH3_DMA_H */ | 50 | #endif /* __ASM_CPU_SH3_DMA_H */ |
diff --git a/arch/sh/include/cpu-sh3/cpu/ubc.h b/arch/sh/include/cpu-sh3/cpu/ubc.h deleted file mode 100644 index 4e6381d5ff7a..000000000000 --- a/arch/sh/include/cpu-sh3/cpu/ubc.h +++ /dev/null | |||
@@ -1,42 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-sh/cpu-sh3/ubc.h | ||
3 | * | ||
4 | * Copyright (C) 1999 Niibe Yutaka | ||
5 | * Copyright (C) 2003 Paul Mundt | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | #ifndef __ASM_CPU_SH3_UBC_H | ||
12 | #define __ASM_CPU_SH3_UBC_H | ||
13 | |||
14 | #if defined(CONFIG_CPU_SUBTYPE_SH7710) || \ | ||
15 | defined(CONFIG_CPU_SUBTYPE_SH7720) || \ | ||
16 | defined(CONFIG_CPU_SUBTYPE_SH7721) | ||
17 | #define UBC_BARA 0xa4ffffb0 | ||
18 | #define UBC_BAMRA 0xa4ffffb4 | ||
19 | #define UBC_BBRA 0xa4ffffb8 | ||
20 | #define UBC_BASRA 0xffffffe4 | ||
21 | #define UBC_BARB 0xa4ffffa0 | ||
22 | #define UBC_BAMRB 0xa4ffffa4 | ||
23 | #define UBC_BBRB 0xa4ffffa8 | ||
24 | #define UBC_BASRB 0xffffffe8 | ||
25 | #define UBC_BDRB 0xa4ffff90 | ||
26 | #define UBC_BDMRB 0xa4ffff94 | ||
27 | #define UBC_BRCR 0xa4ffff98 | ||
28 | #else | ||
29 | #define UBC_BARA 0xffffffb0 | ||
30 | #define UBC_BAMRA 0xffffffb4 | ||
31 | #define UBC_BBRA 0xffffffb8 | ||
32 | #define UBC_BASRA 0xffffffe4 | ||
33 | #define UBC_BARB 0xffffffa0 | ||
34 | #define UBC_BAMRB 0xffffffa4 | ||
35 | #define UBC_BBRB 0xffffffa8 | ||
36 | #define UBC_BASRB 0xffffffe8 | ||
37 | #define UBC_BDRB 0xffffff90 | ||
38 | #define UBC_BDMRB 0xffffff94 | ||
39 | #define UBC_BRCR 0xffffff98 | ||
40 | #endif | ||
41 | |||
42 | #endif /* __ASM_CPU_SH3_UBC_H */ | ||
diff --git a/arch/sh/include/cpu-sh4/cpu/addrspace.h b/arch/sh/include/cpu-sh4/cpu/addrspace.h index a3fa733c1c7d..d51da25da72c 100644 --- a/arch/sh/include/cpu-sh4/cpu/addrspace.h +++ b/arch/sh/include/cpu-sh4/cpu/addrspace.h | |||
@@ -28,6 +28,15 @@ | |||
28 | #define P4SEG_TLB_DATA 0xf7000000 | 28 | #define P4SEG_TLB_DATA 0xf7000000 |
29 | #define P4SEG_REG_BASE 0xff000000 | 29 | #define P4SEG_REG_BASE 0xff000000 |
30 | 30 | ||
31 | #define PA_AREA0 0x00000000 | ||
32 | #define PA_AREA1 0x04000000 | ||
33 | #define PA_AREA2 0x08000000 | ||
34 | #define PA_AREA3 0x0c000000 | ||
35 | #define PA_AREA4 0x10000000 | ||
36 | #define PA_AREA5 0x14000000 | ||
37 | #define PA_AREA6 0x18000000 | ||
38 | #define PA_AREA7 0x1c000000 | ||
39 | |||
31 | #define PA_AREA5_IO 0xb4000000 /* Area 5 IO Memory */ | 40 | #define PA_AREA5_IO 0xb4000000 /* Area 5 IO Memory */ |
32 | #define PA_AREA6_IO 0xb8000000 /* Area 6 IO Memory */ | 41 | #define PA_AREA6_IO 0xb8000000 /* Area 6 IO Memory */ |
33 | 42 | ||
diff --git a/arch/sh/include/cpu-sh4/cpu/dma-sh4a.h b/arch/sh/include/cpu-sh4/cpu/dma-sh4a.h index c4ed660c14cf..e734ea47d8a0 100644 --- a/arch/sh/include/cpu-sh4/cpu/dma-sh4a.h +++ b/arch/sh/include/cpu-sh4/cpu/dma-sh4a.h | |||
@@ -2,22 +2,38 @@ | |||
2 | #define __ASM_SH_CPU_SH4_DMA_SH7780_H | 2 | #define __ASM_SH_CPU_SH4_DMA_SH7780_H |
3 | 3 | ||
4 | #if defined(CONFIG_CPU_SUBTYPE_SH7343) || \ | 4 | #if defined(CONFIG_CPU_SUBTYPE_SH7343) || \ |
5 | defined(CONFIG_CPU_SUBTYPE_SH7722) || \ | ||
6 | defined(CONFIG_CPU_SUBTYPE_SH7730) | 5 | defined(CONFIG_CPU_SUBTYPE_SH7730) |
7 | #define DMTE0_IRQ 48 | 6 | #define DMTE0_IRQ 48 |
8 | #define DMTE4_IRQ 76 | 7 | #define DMTE4_IRQ 76 |
9 | #define DMAE0_IRQ 78 /* DMA Error IRQ*/ | 8 | #define DMAE0_IRQ 78 /* DMA Error IRQ*/ |
10 | #define SH_DMAC_BASE0 0xFE008020 | 9 | #define SH_DMAC_BASE0 0xFE008020 |
11 | #define SH_DMARS_BASE 0xFE009000 | 10 | #define SH_DMARS_BASE0 0xFE009000 |
11 | #define CHCR_TS_LOW_MASK 0x00000018 | ||
12 | #define CHCR_TS_LOW_SHIFT 3 | ||
13 | #define CHCR_TS_HIGH_MASK 0 | ||
14 | #define CHCR_TS_HIGH_SHIFT 0 | ||
15 | #elif defined(CONFIG_CPU_SUBTYPE_SH7722) | ||
16 | #define DMTE0_IRQ 48 | ||
17 | #define DMTE4_IRQ 76 | ||
18 | #define DMAE0_IRQ 78 /* DMA Error IRQ*/ | ||
19 | #define SH_DMAC_BASE0 0xFE008020 | ||
20 | #define SH_DMARS_BASE0 0xFE009000 | ||
21 | #define CHCR_TS_LOW_MASK 0x00000018 | ||
22 | #define CHCR_TS_LOW_SHIFT 3 | ||
23 | #define CHCR_TS_HIGH_MASK 0x00300000 | ||
24 | #define CHCR_TS_HIGH_SHIFT 20 | ||
12 | #elif defined(CONFIG_CPU_SUBTYPE_SH7763) || \ | 25 | #elif defined(CONFIG_CPU_SUBTYPE_SH7763) || \ |
13 | defined(CONFIG_CPU_SUBTYPE_SH7764) | 26 | defined(CONFIG_CPU_SUBTYPE_SH7764) |
14 | #define DMTE0_IRQ 34 | 27 | #define DMTE0_IRQ 34 |
15 | #define DMTE4_IRQ 44 | 28 | #define DMTE4_IRQ 44 |
16 | #define DMAE0_IRQ 38 | 29 | #define DMAE0_IRQ 38 |
17 | #define SH_DMAC_BASE0 0xFF608020 | 30 | #define SH_DMAC_BASE0 0xFF608020 |
18 | #define SH_DMARS_BASE 0xFF609000 | 31 | #define SH_DMARS_BASE0 0xFF609000 |
19 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) || \ | 32 | #define CHCR_TS_LOW_MASK 0x00000018 |
20 | defined(CONFIG_CPU_SUBTYPE_SH7724) | 33 | #define CHCR_TS_LOW_SHIFT 3 |
34 | #define CHCR_TS_HIGH_MASK 0 | ||
35 | #define CHCR_TS_HIGH_SHIFT 0 | ||
36 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) | ||
21 | #define DMTE0_IRQ 48 /* DMAC0A*/ | 37 | #define DMTE0_IRQ 48 /* DMAC0A*/ |
22 | #define DMTE4_IRQ 76 /* DMAC0B */ | 38 | #define DMTE4_IRQ 76 /* DMAC0B */ |
23 | #define DMTE6_IRQ 40 | 39 | #define DMTE6_IRQ 40 |
@@ -29,7 +45,29 @@ | |||
29 | #define DMAE1_IRQ 74 /* DMA Error IRQ*/ | 45 | #define DMAE1_IRQ 74 /* DMA Error IRQ*/ |
30 | #define SH_DMAC_BASE0 0xFE008020 | 46 | #define SH_DMAC_BASE0 0xFE008020 |
31 | #define SH_DMAC_BASE1 0xFDC08020 | 47 | #define SH_DMAC_BASE1 0xFDC08020 |
32 | #define SH_DMARS_BASE 0xFDC09000 | 48 | #define SH_DMARS_BASE0 0xFDC09000 |
49 | #define CHCR_TS_LOW_MASK 0x00000018 | ||
50 | #define CHCR_TS_LOW_SHIFT 3 | ||
51 | #define CHCR_TS_HIGH_MASK 0 | ||
52 | #define CHCR_TS_HIGH_SHIFT 0 | ||
53 | #elif defined(CONFIG_CPU_SUBTYPE_SH7724) | ||
54 | #define DMTE0_IRQ 48 /* DMAC0A*/ | ||
55 | #define DMTE4_IRQ 76 /* DMAC0B */ | ||
56 | #define DMTE6_IRQ 40 | ||
57 | #define DMTE8_IRQ 42 /* DMAC1A */ | ||
58 | #define DMTE9_IRQ 43 | ||
59 | #define DMTE10_IRQ 72 /* DMAC1B */ | ||
60 | #define DMTE11_IRQ 73 | ||
61 | #define DMAE0_IRQ 78 /* DMA Error IRQ*/ | ||
62 | #define DMAE1_IRQ 74 /* DMA Error IRQ*/ | ||
63 | #define SH_DMAC_BASE0 0xFE008020 | ||
64 | #define SH_DMAC_BASE1 0xFDC08020 | ||
65 | #define SH_DMARS_BASE0 0xFE009000 | ||
66 | #define SH_DMARS_BASE1 0xFDC09000 | ||
67 | #define CHCR_TS_LOW_MASK 0x00000018 | ||
68 | #define CHCR_TS_LOW_SHIFT 3 | ||
69 | #define CHCR_TS_HIGH_MASK 0x00600000 | ||
70 | #define CHCR_TS_HIGH_SHIFT 21 | ||
33 | #elif defined(CONFIG_CPU_SUBTYPE_SH7780) | 71 | #elif defined(CONFIG_CPU_SUBTYPE_SH7780) |
34 | #define DMTE0_IRQ 34 | 72 | #define DMTE0_IRQ 34 |
35 | #define DMTE4_IRQ 44 | 73 | #define DMTE4_IRQ 44 |
@@ -41,7 +79,11 @@ | |||
41 | #define DMAE0_IRQ 38 /* DMA Error IRQ */ | 79 | #define DMAE0_IRQ 38 /* DMA Error IRQ */ |
42 | #define SH_DMAC_BASE0 0xFC808020 | 80 | #define SH_DMAC_BASE0 0xFC808020 |
43 | #define SH_DMAC_BASE1 0xFC818020 | 81 | #define SH_DMAC_BASE1 0xFC818020 |
44 | #define SH_DMARS_BASE 0xFC809000 | 82 | #define SH_DMARS_BASE0 0xFC809000 |
83 | #define CHCR_TS_LOW_MASK 0x00000018 | ||
84 | #define CHCR_TS_LOW_SHIFT 3 | ||
85 | #define CHCR_TS_HIGH_MASK 0 | ||
86 | #define CHCR_TS_HIGH_SHIFT 0 | ||
45 | #else /* SH7785 */ | 87 | #else /* SH7785 */ |
46 | #define DMTE0_IRQ 33 | 88 | #define DMTE0_IRQ 33 |
47 | #define DMTE4_IRQ 37 | 89 | #define DMTE4_IRQ 37 |
@@ -54,18 +96,17 @@ | |||
54 | #define DMAE1_IRQ 58 /* DMA Error IRQ1 */ | 96 | #define DMAE1_IRQ 58 /* DMA Error IRQ1 */ |
55 | #define SH_DMAC_BASE0 0xFC808020 | 97 | #define SH_DMAC_BASE0 0xFC808020 |
56 | #define SH_DMAC_BASE1 0xFCC08020 | 98 | #define SH_DMAC_BASE1 0xFCC08020 |
57 | #define SH_DMARS_BASE 0xFC809000 | 99 | #define SH_DMARS_BASE0 0xFC809000 |
100 | #define CHCR_TS_LOW_MASK 0x00000018 | ||
101 | #define CHCR_TS_LOW_SHIFT 3 | ||
102 | #define CHCR_TS_HIGH_MASK 0 | ||
103 | #define CHCR_TS_HIGH_SHIFT 0 | ||
58 | #endif | 104 | #endif |
59 | 105 | ||
60 | #define REQ_HE 0x000000C0 | 106 | #define REQ_HE 0x000000C0 |
61 | #define REQ_H 0x00000080 | 107 | #define REQ_H 0x00000080 |
62 | #define REQ_LE 0x00000040 | 108 | #define REQ_LE 0x00000040 |
63 | #define TM_BURST 0x0000020 | 109 | #define TM_BURST 0x00000020 |
64 | #define TS_8 0x00000000 | ||
65 | #define TS_16 0x00000008 | ||
66 | #define TS_32 0x00000010 | ||
67 | #define TS_16BLK 0x00000018 | ||
68 | #define TS_32BLK 0x00100000 | ||
69 | 110 | ||
70 | /* | 111 | /* |
71 | * The SuperH DMAC supports a number of transmit sizes, we list them here, | 112 | * The SuperH DMAC supports a number of transmit sizes, we list them here, |
@@ -74,22 +115,31 @@ | |||
74 | * Defaults to a 64-bit transfer size. | 115 | * Defaults to a 64-bit transfer size. |
75 | */ | 116 | */ |
76 | enum { | 117 | enum { |
77 | XMIT_SZ_8BIT, | 118 | XMIT_SZ_8BIT = 0, |
78 | XMIT_SZ_16BIT, | 119 | XMIT_SZ_16BIT = 1, |
79 | XMIT_SZ_32BIT, | 120 | XMIT_SZ_32BIT = 2, |
80 | XMIT_SZ_128BIT, | 121 | XMIT_SZ_64BIT = 7, |
81 | XMIT_SZ_256BIT, | 122 | XMIT_SZ_128BIT = 3, |
123 | XMIT_SZ_256BIT = 4, | ||
124 | XMIT_SZ_128BIT_BLK = 0xb, | ||
125 | XMIT_SZ_256BIT_BLK = 0xc, | ||
82 | }; | 126 | }; |
83 | 127 | ||
84 | /* | 128 | /* |
85 | * The DMA count is defined as the number of bytes to transfer. | 129 | * The DMA count is defined as the number of bytes to transfer. |
86 | */ | 130 | */ |
87 | static unsigned int ts_shift[] __maybe_unused = { | 131 | #define TS_SHIFT { \ |
88 | [XMIT_SZ_8BIT] = 0, | 132 | [XMIT_SZ_8BIT] = 0, \ |
89 | [XMIT_SZ_16BIT] = 1, | 133 | [XMIT_SZ_16BIT] = 1, \ |
90 | [XMIT_SZ_32BIT] = 2, | 134 | [XMIT_SZ_32BIT] = 2, \ |
91 | [XMIT_SZ_128BIT] = 4, | 135 | [XMIT_SZ_64BIT] = 3, \ |
92 | [XMIT_SZ_256BIT] = 5, | 136 | [XMIT_SZ_128BIT] = 4, \ |
93 | }; | 137 | [XMIT_SZ_256BIT] = 5, \ |
138 | [XMIT_SZ_128BIT_BLK] = 4, \ | ||
139 | [XMIT_SZ_256BIT_BLK] = 5, \ | ||
140 | } | ||
141 | |||
142 | #define TS_INDEX2VAL(i) ((((i) & 3) << CHCR_TS_LOW_SHIFT) | \ | ||
143 | ((((i) >> 2) & 3) << CHCR_TS_HIGH_SHIFT)) | ||
94 | 144 | ||
95 | #endif /* __ASM_SH_CPU_SH4_DMA_SH7780_H */ | 145 | #endif /* __ASM_SH_CPU_SH4_DMA_SH7780_H */ |
diff --git a/arch/sh/include/cpu-sh4/cpu/dma.h b/arch/sh/include/cpu-sh4/cpu/dma.h index bcb30246e85c..114a369705bc 100644 --- a/arch/sh/include/cpu-sh4/cpu/dma.h +++ b/arch/sh/include/cpu-sh4/cpu/dma.h | |||
@@ -6,8 +6,6 @@ | |||
6 | #ifdef CONFIG_CPU_SH4A | 6 | #ifdef CONFIG_CPU_SH4A |
7 | 7 | ||
8 | #define DMAOR_INIT (DMAOR_DME) | 8 | #define DMAOR_INIT (DMAOR_DME) |
9 | #define CHCR_TS_MASK 0x18 | ||
10 | #define CHCR_TS_SHIFT 3 | ||
11 | 9 | ||
12 | #include <cpu/dma-sh4a.h> | 10 | #include <cpu/dma-sh4a.h> |
13 | #else /* CONFIG_CPU_SH4A */ | 11 | #else /* CONFIG_CPU_SH4A */ |
@@ -29,8 +27,10 @@ | |||
29 | #define TS_32 0x00000030 | 27 | #define TS_32 0x00000030 |
30 | #define TS_64 0x00000000 | 28 | #define TS_64 0x00000000 |
31 | 29 | ||
32 | #define CHCR_TS_MASK 0x70 | 30 | #define CHCR_TS_LOW_MASK 0x70 |
33 | #define CHCR_TS_SHIFT 4 | 31 | #define CHCR_TS_LOW_SHIFT 4 |
32 | #define CHCR_TS_HIGH_MASK 0 | ||
33 | #define CHCR_TS_HIGH_SHIFT 0 | ||
34 | 34 | ||
35 | #define DMAOR_COD 0x00000008 | 35 | #define DMAOR_COD 0x00000008 |
36 | 36 | ||
@@ -41,23 +41,26 @@ | |||
41 | * Defaults to a 64-bit transfer size. | 41 | * Defaults to a 64-bit transfer size. |
42 | */ | 42 | */ |
43 | enum { | 43 | enum { |
44 | XMIT_SZ_64BIT, | 44 | XMIT_SZ_8BIT = 1, |
45 | XMIT_SZ_8BIT, | 45 | XMIT_SZ_16BIT = 2, |
46 | XMIT_SZ_16BIT, | 46 | XMIT_SZ_32BIT = 3, |
47 | XMIT_SZ_32BIT, | 47 | XMIT_SZ_64BIT = 0, |
48 | XMIT_SZ_256BIT, | 48 | XMIT_SZ_256BIT = 4, |
49 | }; | 49 | }; |
50 | 50 | ||
51 | /* | 51 | /* |
52 | * The DMA count is defined as the number of bytes to transfer. | 52 | * The DMA count is defined as the number of bytes to transfer. |
53 | */ | 53 | */ |
54 | static unsigned int ts_shift[] __maybe_unused = { | 54 | #define TS_SHIFT { \ |
55 | [XMIT_SZ_64BIT] = 3, | 55 | [XMIT_SZ_8BIT] = 0, \ |
56 | [XMIT_SZ_8BIT] = 0, | 56 | [XMIT_SZ_16BIT] = 1, \ |
57 | [XMIT_SZ_16BIT] = 1, | 57 | [XMIT_SZ_32BIT] = 2, \ |
58 | [XMIT_SZ_32BIT] = 2, | 58 | [XMIT_SZ_64BIT] = 3, \ |
59 | [XMIT_SZ_256BIT] = 5, | 59 | [XMIT_SZ_256BIT] = 5, \ |
60 | }; | 60 | } |
61 | |||
62 | #define TS_INDEX2VAL(i) (((i) & 7) << CHCR_TS_LOW_SHIFT) | ||
63 | |||
61 | #endif | 64 | #endif |
62 | 65 | ||
63 | #endif /* __ASM_CPU_SH4_DMA_H */ | 66 | #endif /* __ASM_CPU_SH4_DMA_H */ |
diff --git a/arch/sh/include/cpu-sh4/cpu/mmu_context.h b/arch/sh/include/cpu-sh4/cpu/mmu_context.h index 3ce7ef6c2978..03ea75c5315d 100644 --- a/arch/sh/include/cpu-sh4/cpu/mmu_context.h +++ b/arch/sh/include/cpu-sh4/cpu/mmu_context.h | |||
@@ -25,6 +25,10 @@ | |||
25 | 25 | ||
26 | #define MMUCR_TI (1<<2) | 26 | #define MMUCR_TI (1<<2) |
27 | 27 | ||
28 | #define MMUCR_URB 0x00FC0000 | ||
29 | #define MMUCR_URB_SHIFT 18 | ||
30 | #define MMUCR_URB_NENTRIES 64 | ||
31 | |||
28 | #if defined(CONFIG_32BIT) && defined(CONFIG_CPU_SUBTYPE_ST40) | 32 | #if defined(CONFIG_32BIT) && defined(CONFIG_CPU_SUBTYPE_ST40) |
29 | #define MMUCR_SE (1 << 4) | 33 | #define MMUCR_SE (1 << 4) |
30 | #else | 34 | #else |
diff --git a/arch/sh/include/cpu-sh4/cpu/sq.h b/arch/sh/include/cpu-sh4/cpu/sq.h index 586d6491816a..74716ba2dc3c 100644 --- a/arch/sh/include/cpu-sh4/cpu/sq.h +++ b/arch/sh/include/cpu-sh4/cpu/sq.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #define __ASM_CPU_SH4_SQ_H | 12 | #define __ASM_CPU_SH4_SQ_H |
13 | 13 | ||
14 | #include <asm/addrspace.h> | 14 | #include <asm/addrspace.h> |
15 | #include <asm/page.h> | ||
15 | 16 | ||
16 | /* | 17 | /* |
17 | * Store queues range from e0000000-e3fffffc, allowing approx. 64MB to be | 18 | * Store queues range from e0000000-e3fffffc, allowing approx. 64MB to be |
@@ -28,7 +29,7 @@ | |||
28 | 29 | ||
29 | /* arch/sh/kernel/cpu/sh4/sq.c */ | 30 | /* arch/sh/kernel/cpu/sh4/sq.c */ |
30 | unsigned long sq_remap(unsigned long phys, unsigned int size, | 31 | unsigned long sq_remap(unsigned long phys, unsigned int size, |
31 | const char *name, unsigned long flags); | 32 | const char *name, pgprot_t prot); |
32 | void sq_unmap(unsigned long vaddr); | 33 | void sq_unmap(unsigned long vaddr); |
33 | void sq_flush_range(unsigned long start, unsigned int len); | 34 | void sq_flush_range(unsigned long start, unsigned int len); |
34 | 35 | ||
diff --git a/arch/sh/include/cpu-sh4/cpu/ubc.h b/arch/sh/include/cpu-sh4/cpu/ubc.h deleted file mode 100644 index c86e17050935..000000000000 --- a/arch/sh/include/cpu-sh4/cpu/ubc.h +++ /dev/null | |||
@@ -1,64 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-sh/cpu-sh4/ubc.h | ||
3 | * | ||
4 | * Copyright (C) 1999 Niibe Yutaka | ||
5 | * Copyright (C) 2003 Paul Mundt | ||
6 | * Copyright (C) 2006 Lineo Solutions Inc. support SH4A UBC | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file "COPYING" in the main directory of this archive | ||
10 | * for more details. | ||
11 | */ | ||
12 | #ifndef __ASM_CPU_SH4_UBC_H | ||
13 | #define __ASM_CPU_SH4_UBC_H | ||
14 | |||
15 | #if defined(CONFIG_CPU_SH4A) | ||
16 | #define UBC_CBR0 0xff200000 | ||
17 | #define UBC_CRR0 0xff200004 | ||
18 | #define UBC_CAR0 0xff200008 | ||
19 | #define UBC_CAMR0 0xff20000c | ||
20 | #define UBC_CBR1 0xff200020 | ||
21 | #define UBC_CRR1 0xff200024 | ||
22 | #define UBC_CAR1 0xff200028 | ||
23 | #define UBC_CAMR1 0xff20002c | ||
24 | #define UBC_CDR1 0xff200030 | ||
25 | #define UBC_CDMR1 0xff200034 | ||
26 | #define UBC_CETR1 0xff200038 | ||
27 | #define UBC_CCMFR 0xff200600 | ||
28 | #define UBC_CBCR 0xff200620 | ||
29 | |||
30 | /* CBR */ | ||
31 | #define UBC_CBR_AIE (0x01<<30) | ||
32 | #define UBC_CBR_ID_INST (0x01<<4) | ||
33 | #define UBC_CBR_RW_READ (0x01<<1) | ||
34 | #define UBC_CBR_CE (0x01) | ||
35 | |||
36 | #define UBC_CBR_AIV_MASK (0x00FF0000) | ||
37 | #define UBC_CBR_AIV_SHIFT (16) | ||
38 | #define UBC_CBR_AIV_SET(asid) (((asid)<<UBC_CBR_AIV_SHIFT) & UBC_CBR_AIV_MASK) | ||
39 | |||
40 | #define UBC_CBR_INIT 0x20000000 | ||
41 | |||
42 | /* CRR */ | ||
43 | #define UBC_CRR_RES (0x01<<13) | ||
44 | #define UBC_CRR_PCB (0x01<<1) | ||
45 | #define UBC_CRR_BIE (0x01) | ||
46 | |||
47 | #define UBC_CRR_INIT 0x00002000 | ||
48 | |||
49 | #else /* CONFIG_CPU_SH4 */ | ||
50 | #define UBC_BARA 0xff200000 | ||
51 | #define UBC_BAMRA 0xff200004 | ||
52 | #define UBC_BBRA 0xff200008 | ||
53 | #define UBC_BASRA 0xff000014 | ||
54 | #define UBC_BARB 0xff20000c | ||
55 | #define UBC_BAMRB 0xff200010 | ||
56 | #define UBC_BBRB 0xff200014 | ||
57 | #define UBC_BASRB 0xff000018 | ||
58 | #define UBC_BDRB 0xff200018 | ||
59 | #define UBC_BDMRB 0xff20001c | ||
60 | #define UBC_BRCR 0xff200020 | ||
61 | #endif /* CONFIG_CPU_SH4 */ | ||
62 | |||
63 | #endif /* __ASM_CPU_SH4_UBC_H */ | ||
64 | |||
diff --git a/arch/sh/include/mach-common/mach/magicpanelr2.h b/arch/sh/include/mach-common/mach/magicpanelr2.h index c644a77ee357..183a2f744251 100644 --- a/arch/sh/include/mach-common/mach/magicpanelr2.h +++ b/arch/sh/include/mach-common/mach/magicpanelr2.h | |||
@@ -19,12 +19,12 @@ | |||
19 | #include <asm/io_generic.h> | 19 | #include <asm/io_generic.h> |
20 | 20 | ||
21 | 21 | ||
22 | #define SETBITS_OUTB(mask, reg) ctrl_outb(ctrl_inb(reg) | mask, reg) | 22 | #define SETBITS_OUTB(mask, reg) __raw_writeb(__raw_readb(reg) | mask, reg) |
23 | #define SETBITS_OUTW(mask, reg) ctrl_outw(ctrl_inw(reg) | mask, reg) | 23 | #define SETBITS_OUTW(mask, reg) __raw_writew(__raw_readw(reg) | mask, reg) |
24 | #define SETBITS_OUTL(mask, reg) ctrl_outl(ctrl_inl(reg) | mask, reg) | 24 | #define SETBITS_OUTL(mask, reg) __raw_writel(__raw_readl(reg) | mask, reg) |
25 | #define CLRBITS_OUTB(mask, reg) ctrl_outb(ctrl_inb(reg) & ~mask, reg) | 25 | #define CLRBITS_OUTB(mask, reg) __raw_writeb(__raw_readb(reg) & ~mask, reg) |
26 | #define CLRBITS_OUTW(mask, reg) ctrl_outw(ctrl_inw(reg) & ~mask, reg) | 26 | #define CLRBITS_OUTW(mask, reg) __raw_writew(__raw_readw(reg) & ~mask, reg) |
27 | #define CLRBITS_OUTL(mask, reg) ctrl_outl(ctrl_inl(reg) & ~mask, reg) | 27 | #define CLRBITS_OUTL(mask, reg) __raw_writel(__raw_readl(reg) & ~mask, reg) |
28 | 28 | ||
29 | 29 | ||
30 | #define PA_LED PORT_PADR /* LED */ | 30 | #define PA_LED PORT_PADR /* LED */ |
diff --git a/arch/sh/include/mach-dreamcast/mach/sysasic.h b/arch/sh/include/mach-dreamcast/mach/sysasic.h index f33426608a87..58f710e1ebc2 100644 --- a/arch/sh/include/mach-dreamcast/mach/sysasic.h +++ b/arch/sh/include/mach-dreamcast/mach/sysasic.h | |||
@@ -39,5 +39,10 @@ | |||
39 | 39 | ||
40 | #define HW_EVENT_IRQ_MAX (HW_EVENT_IRQ_BASE + 95) | 40 | #define HW_EVENT_IRQ_MAX (HW_EVENT_IRQ_BASE + 95) |
41 | 41 | ||
42 | /* arch/sh/boards/mach-dreamcast/irq.c */ | ||
43 | extern int systemasic_irq_demux(int); | ||
44 | extern void systemasic_irq_init(void); | ||
45 | extern void aica_time_init(void); | ||
46 | |||
42 | #endif /* __ASM_SH_DREAMCAST_SYSASIC_H */ | 47 | #endif /* __ASM_SH_DREAMCAST_SYSASIC_H */ |
43 | 48 | ||
diff --git a/arch/sh/include/mach-sdk7786/mach/fpga.h b/arch/sh/include/mach-sdk7786/mach/fpga.h new file mode 100644 index 000000000000..2120d67dec70 --- /dev/null +++ b/arch/sh/include/mach-sdk7786/mach/fpga.h | |||
@@ -0,0 +1,114 @@ | |||
1 | #ifndef __MACH_SDK7786_FPGA_H | ||
2 | #define __MACH_SDK7786_FPGA_H | ||
3 | |||
4 | #include <linux/io.h> | ||
5 | #include <linux/types.h> | ||
6 | #include <linux/bitops.h> | ||
7 | |||
8 | #define SRSTR 0x000 | ||
9 | #define SRSTR_MAGIC 0x1971 /* Fixed magical read value */ | ||
10 | |||
11 | #define INTASR 0x010 | ||
12 | #define INTAMR 0x020 | ||
13 | #define MODSWR 0x030 | ||
14 | #define INTTESTR 0x040 | ||
15 | #define SYSSR 0x050 | ||
16 | #define NRGPR 0x060 | ||
17 | #define NMISR 0x070 | ||
18 | |||
19 | #define NMIMR 0x080 | ||
20 | #define NMIMR_MAN_NMIM BIT(0) /* Manual NMI mask */ | ||
21 | #define NMIMR_AUX_NMIM BIT(1) /* Auxiliary NMI mask */ | ||
22 | |||
23 | #define INTBSR 0x090 | ||
24 | #define INTBMR 0x0a0 | ||
25 | #define USRLEDR 0x0b0 | ||
26 | #define MAPSWR 0x0c0 | ||
27 | #define FPGAVR 0x0d0 | ||
28 | #define FPGADR 0x0e0 | ||
29 | #define PCBRR 0x0f0 | ||
30 | #define RSR 0x100 | ||
31 | #define EXTASR 0x110 | ||
32 | #define SPCAR 0x120 | ||
33 | #define INTMSR 0x130 | ||
34 | #define PCIECR 0x140 | ||
35 | #define FAER 0x150 | ||
36 | #define USRGPIR 0x160 | ||
37 | /* 0x170 reserved */ | ||
38 | #define LCLASR 0x180 | ||
39 | |||
40 | #define SBCR 0x190 | ||
41 | #define SCBR_I2CMEN BIT(0) /* FPGA I2C master enable */ | ||
42 | #define SCBR_I2CCEN BIT(1) /* CPU I2C master enable */ | ||
43 | |||
44 | #define PWRCR 0x1a0 | ||
45 | #define SPCBR 0x1b0 | ||
46 | #define SPICR 0x1c0 | ||
47 | #define SPIDR 0x1d0 | ||
48 | #define I2CCR 0x1e0 | ||
49 | #define I2CDR 0x1f0 | ||
50 | #define FPGACR 0x200 | ||
51 | #define IASELR1 0x210 | ||
52 | #define IASELR2 0x220 | ||
53 | #define IASELR3 0x230 | ||
54 | #define IASELR4 0x240 | ||
55 | #define IASELR5 0x250 | ||
56 | #define IASELR6 0x260 | ||
57 | #define IASELR7 0x270 | ||
58 | #define IASELR8 0x280 | ||
59 | #define IASELR9 0x290 | ||
60 | #define IASELR10 0x2a0 | ||
61 | #define IASELR11 0x2b0 | ||
62 | #define IASELR12 0x2c0 | ||
63 | #define IASELR13 0x2d0 | ||
64 | #define IASELR14 0x2e0 | ||
65 | #define IASELR15 0x2f0 | ||
66 | /* 0x300 reserved */ | ||
67 | #define IBSELR1 0x310 | ||
68 | #define IBSELR2 0x320 | ||
69 | #define IBSELR3 0x330 | ||
70 | #define IBSELR4 0x340 | ||
71 | #define IBSELR5 0x350 | ||
72 | #define IBSELR6 0x360 | ||
73 | #define IBSELR7 0x370 | ||
74 | #define IBSELR8 0x380 | ||
75 | #define IBSELR9 0x390 | ||
76 | #define IBSELR10 0x3a0 | ||
77 | #define IBSELR11 0x3b0 | ||
78 | #define IBSELR12 0x3c0 | ||
79 | #define IBSELR13 0x3d0 | ||
80 | #define IBSELR14 0x3e0 | ||
81 | #define IBSELR15 0x3f0 | ||
82 | #define USRACR 0x400 | ||
83 | #define BEEPR 0x410 | ||
84 | #define USRLCDR 0x420 | ||
85 | #define SMBCR 0x430 | ||
86 | #define SMBDR 0x440 | ||
87 | #define USBCR 0x450 | ||
88 | #define AMSR 0x460 | ||
89 | #define ACCR 0x470 | ||
90 | #define SDIFCR 0x480 | ||
91 | |||
92 | /* arch/sh/boards/mach-sdk7786/fpga.c */ | ||
93 | extern void __iomem *sdk7786_fpga_base; | ||
94 | extern void sdk7786_fpga_init(void); | ||
95 | |||
96 | #define SDK7786_FPGA_REGADDR(reg) (sdk7786_fpga_base + (reg)) | ||
97 | |||
98 | /* | ||
99 | * A convenience wrapper from register offset to internal I2C address, | ||
100 | * when the FPGA is in I2C slave mode. | ||
101 | */ | ||
102 | #define SDK7786_FPGA_I2CADDR(reg) ((reg) >> 3) | ||
103 | |||
104 | static inline u16 fpga_read_reg(unsigned int reg) | ||
105 | { | ||
106 | return ioread16(sdk7786_fpga_base + reg); | ||
107 | } | ||
108 | |||
109 | static inline void fpga_write_reg(u16 val, unsigned int reg) | ||
110 | { | ||
111 | iowrite16(val, sdk7786_fpga_base + reg); | ||
112 | } | ||
113 | |||
114 | #endif /* __MACH_SDK7786_FPGA_H */ | ||
diff --git a/arch/sh/include/mach-sdk7786/mach/irq.h b/arch/sh/include/mach-sdk7786/mach/irq.h new file mode 100644 index 000000000000..0f584635e6e5 --- /dev/null +++ b/arch/sh/include/mach-sdk7786/mach/irq.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef __MACH_SDK7786_IRQ_H | ||
2 | #define __MACH_SDK7786_IRQ_H | ||
3 | |||
4 | /* arch/sh/boards/mach-sdk7786/irq.c */ | ||
5 | extern void sdk7786_init_irq(void); | ||
6 | |||
7 | #endif /* __MACH_SDK7786_IRQ_H */ | ||
diff --git a/arch/sh/include/mach-se/mach/se7343.h b/arch/sh/include/mach-se/mach/se7343.h index 749914b400fb..8d8170d6cc43 100644 --- a/arch/sh/include/mach-se/mach/se7343.h +++ b/arch/sh/include/mach-se/mach/se7343.h | |||
@@ -94,26 +94,26 @@ | |||
94 | 94 | ||
95 | #define PORT_DRVCR 0xA4050180 | 95 | #define PORT_DRVCR 0xA4050180 |
96 | 96 | ||
97 | #define PORT_PADR 0xA4050120 | 97 | #define PORT_PADR 0xA4050120 |
98 | #define PORT_PBDR 0xA4050122 | 98 | #define PORT_PBDR 0xA4050122 |
99 | #define PORT_PCDR 0xA4050124 | 99 | #define PORT_PCDR 0xA4050124 |
100 | #define PORT_PDDR 0xA4050126 | 100 | #define PORT_PDDR 0xA4050126 |
101 | #define PORT_PEDR 0xA4050128 | 101 | #define PORT_PEDR 0xA4050128 |
102 | #define PORT_PFDR 0xA405012A | 102 | #define PORT_PFDR 0xA405012A |
103 | #define PORT_PGDR 0xA405012C | 103 | #define PORT_PGDR 0xA405012C |
104 | #define PORT_PHDR 0xA405012E | 104 | #define PORT_PHDR 0xA405012E |
105 | #define PORT_PJDR 0xA4050130 | 105 | #define PORT_PJDR 0xA4050130 |
106 | #define PORT_PKDR 0xA4050132 | 106 | #define PORT_PKDR 0xA4050132 |
107 | #define PORT_PLDR 0xA4050134 | 107 | #define PORT_PLDR 0xA4050134 |
108 | #define PORT_PMDR 0xA4050136 | 108 | #define PORT_PMDR 0xA4050136 |
109 | #define PORT_PNDR 0xA4050138 | 109 | #define PORT_PNDR 0xA4050138 |
110 | #define PORT_PQDR 0xA405013A | 110 | #define PORT_PQDR 0xA405013A |
111 | #define PORT_PRDR 0xA405013C | 111 | #define PORT_PRDR 0xA405013C |
112 | #define PORT_PTDR 0xA4050160 | 112 | #define PORT_PTDR 0xA4050160 |
113 | #define PORT_PUDR 0xA4050162 | 113 | #define PORT_PUDR 0xA4050162 |
114 | #define PORT_PVDR 0xA4050164 | 114 | #define PORT_PVDR 0xA4050164 |
115 | #define PORT_PWDR 0xA4050166 | 115 | #define PORT_PWDR 0xA4050166 |
116 | #define PORT_PYDR 0xA4050168 | 116 | #define PORT_PYDR 0xA4050168 |
117 | 117 | ||
118 | #define FPGA_IN 0xb1400000 | 118 | #define FPGA_IN 0xb1400000 |
119 | #define FPGA_OUT 0xb1400002 | 119 | #define FPGA_OUT 0xb1400002 |
@@ -133,18 +133,10 @@ | |||
133 | #define SE7343_FPGA_IRQ_UARTB 11 | 133 | #define SE7343_FPGA_IRQ_UARTB 11 |
134 | 134 | ||
135 | #define SE7343_FPGA_IRQ_NR 12 | 135 | #define SE7343_FPGA_IRQ_NR 12 |
136 | #define SE7343_FPGA_IRQ_BASE 120 | ||
137 | |||
138 | #define MRSHPC_IRQ3 (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_MRSHPC3) | ||
139 | #define MRSHPC_IRQ2 (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_MRSHPC2) | ||
140 | #define MRSHPC_IRQ1 (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_MRSHPC1) | ||
141 | #define MRSHPC_IRQ0 (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_MRSHPC0) | ||
142 | #define SMC_IRQ (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_SMC) | ||
143 | #define USB_IRQ (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_USB) | ||
144 | #define UARTA_IRQ (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_UARTA) | ||
145 | #define UARTB_IRQ (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_UARTB) | ||
146 | 136 | ||
147 | /* arch/sh/boards/se/7343/irq.c */ | 137 | /* arch/sh/boards/se/7343/irq.c */ |
138 | extern unsigned int se7343_fpga_irq[]; | ||
139 | |||
148 | void init_7343se_IRQ(void); | 140 | void init_7343se_IRQ(void); |
149 | 141 | ||
150 | #endif /* __ASM_SH_HITACHI_SE7343_H */ | 142 | #endif /* __ASM_SH_HITACHI_SE7343_H */ |
diff --git a/arch/sh/kernel/Makefile b/arch/sh/kernel/Makefile index 0d587da1ef12..02fd3ae8b0ee 100644 --- a/arch/sh/kernel/Makefile +++ b/arch/sh/kernel/Makefile | |||
@@ -13,8 +13,9 @@ CFLAGS_REMOVE_return_address.o = -pg | |||
13 | 13 | ||
14 | obj-y := debugtraps.o dma-nommu.o dumpstack.o \ | 14 | obj-y := debugtraps.o dma-nommu.o dumpstack.o \ |
15 | idle.o io.o io_generic.o irq.o \ | 15 | idle.o io.o io_generic.o irq.o \ |
16 | irq_$(BITS).o machvec.o nmi_debug.o process_$(BITS).o \ | 16 | irq_$(BITS).o machvec.o nmi_debug.o process.o \ |
17 | ptrace_$(BITS).o return_address.o \ | 17 | process_$(BITS).o ptrace_$(BITS).o \ |
18 | reboot.o return_address.o \ | ||
18 | setup.o signal_$(BITS).o sys_sh.o sys_sh$(BITS).o \ | 19 | setup.o signal_$(BITS).o sys_sh.o sys_sh$(BITS).o \ |
19 | syscalls_$(BITS).o time.o topology.o traps.o \ | 20 | syscalls_$(BITS).o time.o topology.o traps.o \ |
20 | traps_$(BITS).o unwinder.o | 21 | traps_$(BITS).o unwinder.o |
@@ -22,7 +23,7 @@ obj-y := debugtraps.o dma-nommu.o dumpstack.o \ | |||
22 | obj-y += cpu/ | 23 | obj-y += cpu/ |
23 | obj-$(CONFIG_VSYSCALL) += vsyscall/ | 24 | obj-$(CONFIG_VSYSCALL) += vsyscall/ |
24 | obj-$(CONFIG_SMP) += smp.o | 25 | obj-$(CONFIG_SMP) += smp.o |
25 | obj-$(CONFIG_SH_STANDARD_BIOS) += sh_bios.o early_printk.o | 26 | obj-$(CONFIG_SH_STANDARD_BIOS) += sh_bios.o |
26 | obj-$(CONFIG_KGDB) += kgdb.o | 27 | obj-$(CONFIG_KGDB) += kgdb.o |
27 | obj-$(CONFIG_SH_CPU_FREQ) += cpufreq.o | 28 | obj-$(CONFIG_SH_CPU_FREQ) += cpufreq.o |
28 | obj-$(CONFIG_MODULES) += sh_ksyms_$(BITS).o module.o | 29 | obj-$(CONFIG_MODULES) += sh_ksyms_$(BITS).o module.o |
@@ -39,6 +40,7 @@ obj-$(CONFIG_HIBERNATION) += swsusp.o | |||
39 | obj-$(CONFIG_DWARF_UNWINDER) += dwarf.o | 40 | obj-$(CONFIG_DWARF_UNWINDER) += dwarf.o |
40 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_callchain.o | 41 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_callchain.o |
41 | 42 | ||
43 | obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o | ||
42 | obj-$(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) += localtimer.o | 44 | obj-$(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) += localtimer.o |
43 | 45 | ||
44 | EXTRA_CFLAGS += -Werror | 46 | EXTRA_CFLAGS += -Werror |
diff --git a/arch/sh/kernel/cpu/Makefile b/arch/sh/kernel/cpu/Makefile index d97c803719ec..0e48bc61c272 100644 --- a/arch/sh/kernel/cpu/Makefile +++ b/arch/sh/kernel/cpu/Makefile | |||
@@ -17,5 +17,7 @@ obj-$(CONFIG_ARCH_SHMOBILE) += shmobile/ | |||
17 | 17 | ||
18 | obj-$(CONFIG_SH_ADC) += adc.o | 18 | obj-$(CONFIG_SH_ADC) += adc.o |
19 | obj-$(CONFIG_SH_CLK_CPG) += clock-cpg.o | 19 | obj-$(CONFIG_SH_CLK_CPG) += clock-cpg.o |
20 | obj-$(CONFIG_SH_FPU) += fpu.o | ||
21 | obj-$(CONFIG_SH_FPU_EMU) += fpu.o | ||
20 | 22 | ||
21 | obj-y += irq/ init.o clock.o hwblk.o | 23 | obj-y += irq/ init.o clock.o hwblk.o |
diff --git a/arch/sh/kernel/cpu/adc.c b/arch/sh/kernel/cpu/adc.c index da3d6877f93d..d307571d54b6 100644 --- a/arch/sh/kernel/cpu/adc.c +++ b/arch/sh/kernel/cpu/adc.c | |||
@@ -18,19 +18,19 @@ int adc_single(unsigned int channel) | |||
18 | 18 | ||
19 | off = (channel & 0x03) << 2; | 19 | off = (channel & 0x03) << 2; |
20 | 20 | ||
21 | csr = ctrl_inb(ADCSR); | 21 | csr = __raw_readb(ADCSR); |
22 | csr = channel | ADCSR_ADST | ADCSR_CKS; | 22 | csr = channel | ADCSR_ADST | ADCSR_CKS; |
23 | ctrl_outb(csr, ADCSR); | 23 | __raw_writeb(csr, ADCSR); |
24 | 24 | ||
25 | do { | 25 | do { |
26 | csr = ctrl_inb(ADCSR); | 26 | csr = __raw_readb(ADCSR); |
27 | } while ((csr & ADCSR_ADF) == 0); | 27 | } while ((csr & ADCSR_ADF) == 0); |
28 | 28 | ||
29 | csr &= ~(ADCSR_ADF | ADCSR_ADST); | 29 | csr &= ~(ADCSR_ADF | ADCSR_ADST); |
30 | ctrl_outb(csr, ADCSR); | 30 | __raw_writeb(csr, ADCSR); |
31 | 31 | ||
32 | return (((ctrl_inb(ADDRAH + off) << 8) | | 32 | return (((__raw_readb(ADDRAH + off) << 8) | |
33 | ctrl_inb(ADDRAL + off)) >> 6); | 33 | __raw_readb(ADDRAL + off)) >> 6); |
34 | } | 34 | } |
35 | 35 | ||
36 | EXPORT_SYMBOL(adc_single); | 36 | EXPORT_SYMBOL(adc_single); |
diff --git a/arch/sh/kernel/cpu/clock-cpg.c b/arch/sh/kernel/cpu/clock-cpg.c index 6dfe2cced3fc..eed5eaff96ba 100644 --- a/arch/sh/kernel/cpu/clock-cpg.c +++ b/arch/sh/kernel/cpu/clock-cpg.c | |||
@@ -149,7 +149,8 @@ int __init sh_clk_div6_register(struct clk *clks, int nr) | |||
149 | 149 | ||
150 | static unsigned long sh_clk_div4_recalc(struct clk *clk) | 150 | static unsigned long sh_clk_div4_recalc(struct clk *clk) |
151 | { | 151 | { |
152 | struct clk_div_mult_table *table = clk->priv; | 152 | struct clk_div4_table *d4t = clk->priv; |
153 | struct clk_div_mult_table *table = d4t->div_mult_table; | ||
153 | unsigned int idx; | 154 | unsigned int idx; |
154 | 155 | ||
155 | clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, | 156 | clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, |
@@ -160,17 +161,90 @@ static unsigned long sh_clk_div4_recalc(struct clk *clk) | |||
160 | return clk->freq_table[idx].frequency; | 161 | return clk->freq_table[idx].frequency; |
161 | } | 162 | } |
162 | 163 | ||
164 | static int sh_clk_div4_set_parent(struct clk *clk, struct clk *parent) | ||
165 | { | ||
166 | struct clk_div4_table *d4t = clk->priv; | ||
167 | struct clk_div_mult_table *table = d4t->div_mult_table; | ||
168 | u32 value; | ||
169 | int ret; | ||
170 | |||
171 | if (!strcmp("pll_clk", parent->name)) | ||
172 | value = __raw_readl(clk->enable_reg) & ~(1 << 7); | ||
173 | else | ||
174 | value = __raw_readl(clk->enable_reg) | (1 << 7); | ||
175 | |||
176 | ret = clk_reparent(clk, parent); | ||
177 | if (ret < 0) | ||
178 | return ret; | ||
179 | |||
180 | __raw_writel(value, clk->enable_reg); | ||
181 | |||
182 | /* Rebiuld the frequency table */ | ||
183 | clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, | ||
184 | table, &clk->arch_flags); | ||
185 | |||
186 | return 0; | ||
187 | } | ||
188 | |||
189 | static int sh_clk_div4_set_rate(struct clk *clk, unsigned long rate, int algo_id) | ||
190 | { | ||
191 | struct clk_div4_table *d4t = clk->priv; | ||
192 | unsigned long value; | ||
193 | int idx = clk_rate_table_find(clk, clk->freq_table, rate); | ||
194 | if (idx < 0) | ||
195 | return idx; | ||
196 | |||
197 | value = __raw_readl(clk->enable_reg); | ||
198 | value &= ~(0xf << clk->enable_bit); | ||
199 | value |= (idx << clk->enable_bit); | ||
200 | __raw_writel(value, clk->enable_reg); | ||
201 | |||
202 | if (d4t->kick) | ||
203 | d4t->kick(clk); | ||
204 | |||
205 | return 0; | ||
206 | } | ||
207 | |||
208 | static int sh_clk_div4_enable(struct clk *clk) | ||
209 | { | ||
210 | __raw_writel(__raw_readl(clk->enable_reg) & ~(1 << 8), clk->enable_reg); | ||
211 | return 0; | ||
212 | } | ||
213 | |||
214 | static void sh_clk_div4_disable(struct clk *clk) | ||
215 | { | ||
216 | __raw_writel(__raw_readl(clk->enable_reg) | (1 << 8), clk->enable_reg); | ||
217 | } | ||
218 | |||
163 | static struct clk_ops sh_clk_div4_clk_ops = { | 219 | static struct clk_ops sh_clk_div4_clk_ops = { |
164 | .recalc = sh_clk_div4_recalc, | 220 | .recalc = sh_clk_div4_recalc, |
221 | .set_rate = sh_clk_div4_set_rate, | ||
165 | .round_rate = sh_clk_div_round_rate, | 222 | .round_rate = sh_clk_div_round_rate, |
166 | }; | 223 | }; |
167 | 224 | ||
168 | int __init sh_clk_div4_register(struct clk *clks, int nr, | 225 | static struct clk_ops sh_clk_div4_enable_clk_ops = { |
169 | struct clk_div_mult_table *table) | 226 | .recalc = sh_clk_div4_recalc, |
227 | .set_rate = sh_clk_div4_set_rate, | ||
228 | .round_rate = sh_clk_div_round_rate, | ||
229 | .enable = sh_clk_div4_enable, | ||
230 | .disable = sh_clk_div4_disable, | ||
231 | }; | ||
232 | |||
233 | static struct clk_ops sh_clk_div4_reparent_clk_ops = { | ||
234 | .recalc = sh_clk_div4_recalc, | ||
235 | .set_rate = sh_clk_div4_set_rate, | ||
236 | .round_rate = sh_clk_div_round_rate, | ||
237 | .enable = sh_clk_div4_enable, | ||
238 | .disable = sh_clk_div4_disable, | ||
239 | .set_parent = sh_clk_div4_set_parent, | ||
240 | }; | ||
241 | |||
242 | static int __init sh_clk_div4_register_ops(struct clk *clks, int nr, | ||
243 | struct clk_div4_table *table, struct clk_ops *ops) | ||
170 | { | 244 | { |
171 | struct clk *clkp; | 245 | struct clk *clkp; |
172 | void *freq_table; | 246 | void *freq_table; |
173 | int nr_divs = table->nr_divisors; | 247 | int nr_divs = table->div_mult_table->nr_divisors; |
174 | int freq_table_size = sizeof(struct cpufreq_frequency_table); | 248 | int freq_table_size = sizeof(struct cpufreq_frequency_table); |
175 | int ret = 0; | 249 | int ret = 0; |
176 | int k; | 250 | int k; |
@@ -185,7 +259,7 @@ int __init sh_clk_div4_register(struct clk *clks, int nr, | |||
185 | for (k = 0; !ret && (k < nr); k++) { | 259 | for (k = 0; !ret && (k < nr); k++) { |
186 | clkp = clks + k; | 260 | clkp = clks + k; |
187 | 261 | ||
188 | clkp->ops = &sh_clk_div4_clk_ops; | 262 | clkp->ops = ops; |
189 | clkp->id = -1; | 263 | clkp->id = -1; |
190 | clkp->priv = table; | 264 | clkp->priv = table; |
191 | 265 | ||
@@ -198,6 +272,26 @@ int __init sh_clk_div4_register(struct clk *clks, int nr, | |||
198 | return ret; | 272 | return ret; |
199 | } | 273 | } |
200 | 274 | ||
275 | int __init sh_clk_div4_register(struct clk *clks, int nr, | ||
276 | struct clk_div4_table *table) | ||
277 | { | ||
278 | return sh_clk_div4_register_ops(clks, nr, table, &sh_clk_div4_clk_ops); | ||
279 | } | ||
280 | |||
281 | int __init sh_clk_div4_enable_register(struct clk *clks, int nr, | ||
282 | struct clk_div4_table *table) | ||
283 | { | ||
284 | return sh_clk_div4_register_ops(clks, nr, table, | ||
285 | &sh_clk_div4_enable_clk_ops); | ||
286 | } | ||
287 | |||
288 | int __init sh_clk_div4_reparent_register(struct clk *clks, int nr, | ||
289 | struct clk_div4_table *table) | ||
290 | { | ||
291 | return sh_clk_div4_register_ops(clks, nr, table, | ||
292 | &sh_clk_div4_reparent_clk_ops); | ||
293 | } | ||
294 | |||
201 | #ifdef CONFIG_SH_CLK_CPG_LEGACY | 295 | #ifdef CONFIG_SH_CLK_CPG_LEGACY |
202 | static struct clk master_clk = { | 296 | static struct clk master_clk = { |
203 | .name = "master_clk", | 297 | .name = "master_clk", |
diff --git a/arch/sh/kernel/cpu/fpu.c b/arch/sh/kernel/cpu/fpu.c new file mode 100644 index 000000000000..f059ed62cf57 --- /dev/null +++ b/arch/sh/kernel/cpu/fpu.c | |||
@@ -0,0 +1,84 @@ | |||
1 | #include <linux/sched.h> | ||
2 | #include <asm/processor.h> | ||
3 | #include <asm/fpu.h> | ||
4 | |||
5 | int init_fpu(struct task_struct *tsk) | ||
6 | { | ||
7 | if (tsk_used_math(tsk)) { | ||
8 | if ((boot_cpu_data.flags & CPU_HAS_FPU) && tsk == current) | ||
9 | unlazy_fpu(tsk, task_pt_regs(tsk)); | ||
10 | return 0; | ||
11 | } | ||
12 | |||
13 | /* | ||
14 | * Memory allocation at the first usage of the FPU and other state. | ||
15 | */ | ||
16 | if (!tsk->thread.xstate) { | ||
17 | tsk->thread.xstate = kmem_cache_alloc(task_xstate_cachep, | ||
18 | GFP_KERNEL); | ||
19 | if (!tsk->thread.xstate) | ||
20 | return -ENOMEM; | ||
21 | } | ||
22 | |||
23 | if (boot_cpu_data.flags & CPU_HAS_FPU) { | ||
24 | struct sh_fpu_hard_struct *fp = &tsk->thread.xstate->hardfpu; | ||
25 | memset(fp, 0, xstate_size); | ||
26 | fp->fpscr = FPSCR_INIT; | ||
27 | } else { | ||
28 | struct sh_fpu_soft_struct *fp = &tsk->thread.xstate->softfpu; | ||
29 | memset(fp, 0, xstate_size); | ||
30 | fp->fpscr = FPSCR_INIT; | ||
31 | } | ||
32 | |||
33 | set_stopped_child_used_math(tsk); | ||
34 | return 0; | ||
35 | } | ||
36 | |||
37 | #ifdef CONFIG_SH_FPU | ||
38 | void __fpu_state_restore(void) | ||
39 | { | ||
40 | struct task_struct *tsk = current; | ||
41 | |||
42 | restore_fpu(tsk); | ||
43 | |||
44 | task_thread_info(tsk)->status |= TS_USEDFPU; | ||
45 | tsk->fpu_counter++; | ||
46 | } | ||
47 | |||
48 | void fpu_state_restore(struct pt_regs *regs) | ||
49 | { | ||
50 | struct task_struct *tsk = current; | ||
51 | |||
52 | if (unlikely(!user_mode(regs))) { | ||
53 | printk(KERN_ERR "BUG: FPU is used in kernel mode.\n"); | ||
54 | BUG(); | ||
55 | return; | ||
56 | } | ||
57 | |||
58 | if (!tsk_used_math(tsk)) { | ||
59 | local_irq_enable(); | ||
60 | /* | ||
61 | * does a slab alloc which can sleep | ||
62 | */ | ||
63 | if (init_fpu(tsk)) { | ||
64 | /* | ||
65 | * ran out of memory! | ||
66 | */ | ||
67 | do_group_exit(SIGKILL); | ||
68 | return; | ||
69 | } | ||
70 | local_irq_disable(); | ||
71 | } | ||
72 | |||
73 | grab_fpu(regs); | ||
74 | |||
75 | __fpu_state_restore(); | ||
76 | } | ||
77 | |||
78 | BUILD_TRAP_HANDLER(fpu_state_restore) | ||
79 | { | ||
80 | TRAP_HANDLER_DECL; | ||
81 | |||
82 | fpu_state_restore(regs); | ||
83 | } | ||
84 | #endif /* CONFIG_SH_FPU */ | ||
diff --git a/arch/sh/kernel/cpu/init.c b/arch/sh/kernel/cpu/init.c index 89b4b76c0d76..c736422344eb 100644 --- a/arch/sh/kernel/cpu/init.c +++ b/arch/sh/kernel/cpu/init.c | |||
@@ -24,22 +24,32 @@ | |||
24 | #include <asm/elf.h> | 24 | #include <asm/elf.h> |
25 | #include <asm/io.h> | 25 | #include <asm/io.h> |
26 | #include <asm/smp.h> | 26 | #include <asm/smp.h> |
27 | #ifdef CONFIG_SUPERH32 | 27 | #include <asm/sh_bios.h> |
28 | #include <asm/ubc.h> | 28 | |
29 | #ifdef CONFIG_SH_FPU | ||
30 | #define cpu_has_fpu 1 | ||
31 | #else | ||
32 | #define cpu_has_fpu 0 | ||
33 | #endif | ||
34 | |||
35 | #ifdef CONFIG_SH_DSP | ||
36 | #define cpu_has_dsp 1 | ||
37 | #else | ||
38 | #define cpu_has_dsp 0 | ||
29 | #endif | 39 | #endif |
30 | 40 | ||
31 | /* | 41 | /* |
32 | * Generic wrapper for command line arguments to disable on-chip | 42 | * Generic wrapper for command line arguments to disable on-chip |
33 | * peripherals (nofpu, nodsp, and so forth). | 43 | * peripherals (nofpu, nodsp, and so forth). |
34 | */ | 44 | */ |
35 | #define onchip_setup(x) \ | 45 | #define onchip_setup(x) \ |
36 | static int x##_disabled __initdata = 0; \ | 46 | static int x##_disabled __initdata = !cpu_has_##x; \ |
37 | \ | 47 | \ |
38 | static int __init x##_setup(char *opts) \ | 48 | static int __init x##_setup(char *opts) \ |
39 | { \ | 49 | { \ |
40 | x##_disabled = 1; \ | 50 | x##_disabled = 1; \ |
41 | return 1; \ | 51 | return 1; \ |
42 | } \ | 52 | } \ |
43 | __setup("no" __stringify(x), x##_setup); | 53 | __setup("no" __stringify(x), x##_setup); |
44 | 54 | ||
45 | onchip_setup(fpu); | 55 | onchip_setup(fpu); |
@@ -52,10 +62,10 @@ onchip_setup(dsp); | |||
52 | static void __init speculative_execution_init(void) | 62 | static void __init speculative_execution_init(void) |
53 | { | 63 | { |
54 | /* Clear RABD */ | 64 | /* Clear RABD */ |
55 | ctrl_outl(ctrl_inl(CPUOPM) & ~CPUOPM_RABD, CPUOPM); | 65 | __raw_writel(__raw_readl(CPUOPM) & ~CPUOPM_RABD, CPUOPM); |
56 | 66 | ||
57 | /* Flush the update */ | 67 | /* Flush the update */ |
58 | (void)ctrl_inl(CPUOPM); | 68 | (void)__raw_readl(CPUOPM); |
59 | ctrl_barrier(); | 69 | ctrl_barrier(); |
60 | } | 70 | } |
61 | #else | 71 | #else |
@@ -89,7 +99,7 @@ static void __init expmask_init(void) | |||
89 | #endif | 99 | #endif |
90 | 100 | ||
91 | /* 2nd-level cache init */ | 101 | /* 2nd-level cache init */ |
92 | void __uses_jump_to_uncached __attribute__ ((weak)) l2_cache_init(void) | 102 | void __attribute__ ((weak)) l2_cache_init(void) |
93 | { | 103 | { |
94 | } | 104 | } |
95 | 105 | ||
@@ -97,12 +107,12 @@ void __uses_jump_to_uncached __attribute__ ((weak)) l2_cache_init(void) | |||
97 | * Generic first-level cache init | 107 | * Generic first-level cache init |
98 | */ | 108 | */ |
99 | #ifdef CONFIG_SUPERH32 | 109 | #ifdef CONFIG_SUPERH32 |
100 | static void __uses_jump_to_uncached cache_init(void) | 110 | static void cache_init(void) |
101 | { | 111 | { |
102 | unsigned long ccr, flags; | 112 | unsigned long ccr, flags; |
103 | 113 | ||
104 | jump_to_uncached(); | 114 | jump_to_uncached(); |
105 | ccr = ctrl_inl(CCR); | 115 | ccr = __raw_readl(CCR); |
106 | 116 | ||
107 | /* | 117 | /* |
108 | * At this point we don't know whether the cache is enabled or not - a | 118 | * At this point we don't know whether the cache is enabled or not - a |
@@ -146,7 +156,7 @@ static void __uses_jump_to_uncached cache_init(void) | |||
146 | for (addr = addrstart; | 156 | for (addr = addrstart; |
147 | addr < addrstart + waysize; | 157 | addr < addrstart + waysize; |
148 | addr += current_cpu_data.dcache.linesz) | 158 | addr += current_cpu_data.dcache.linesz) |
149 | ctrl_outl(0, addr); | 159 | __raw_writel(0, addr); |
150 | 160 | ||
151 | addrstart += current_cpu_data.dcache.way_incr; | 161 | addrstart += current_cpu_data.dcache.way_incr; |
152 | } while (--ways); | 162 | } while (--ways); |
@@ -179,7 +189,7 @@ static void __uses_jump_to_uncached cache_init(void) | |||
179 | 189 | ||
180 | l2_cache_init(); | 190 | l2_cache_init(); |
181 | 191 | ||
182 | ctrl_outl(flags, CCR); | 192 | __raw_writel(flags, CCR); |
183 | back_to_cached(); | 193 | back_to_cached(); |
184 | } | 194 | } |
185 | #else | 195 | #else |
@@ -207,6 +217,18 @@ static void detect_cache_shape(void) | |||
207 | l2_cache_shape = -1; /* No S-cache */ | 217 | l2_cache_shape = -1; /* No S-cache */ |
208 | } | 218 | } |
209 | 219 | ||
220 | static void __init fpu_init(void) | ||
221 | { | ||
222 | /* Disable the FPU */ | ||
223 | if (fpu_disabled && (current_cpu_data.flags & CPU_HAS_FPU)) { | ||
224 | printk("FPU Disabled\n"); | ||
225 | current_cpu_data.flags &= ~CPU_HAS_FPU; | ||
226 | } | ||
227 | |||
228 | disable_fpu(); | ||
229 | clear_used_math(); | ||
230 | } | ||
231 | |||
210 | #ifdef CONFIG_SH_DSP | 232 | #ifdef CONFIG_SH_DSP |
211 | static void __init release_dsp(void) | 233 | static void __init release_dsp(void) |
212 | { | 234 | { |
@@ -244,28 +266,35 @@ static void __init dsp_init(void) | |||
244 | if (sr & SR_DSP) | 266 | if (sr & SR_DSP) |
245 | current_cpu_data.flags |= CPU_HAS_DSP; | 267 | current_cpu_data.flags |= CPU_HAS_DSP; |
246 | 268 | ||
269 | /* Disable the DSP */ | ||
270 | if (dsp_disabled && (current_cpu_data.flags & CPU_HAS_DSP)) { | ||
271 | printk("DSP Disabled\n"); | ||
272 | current_cpu_data.flags &= ~CPU_HAS_DSP; | ||
273 | } | ||
274 | |||
247 | /* Now that we've determined the DSP status, clear the DSP bit. */ | 275 | /* Now that we've determined the DSP status, clear the DSP bit. */ |
248 | release_dsp(); | 276 | release_dsp(); |
249 | } | 277 | } |
278 | #else | ||
279 | static inline void __init dsp_init(void) { } | ||
250 | #endif /* CONFIG_SH_DSP */ | 280 | #endif /* CONFIG_SH_DSP */ |
251 | 281 | ||
252 | /** | 282 | /** |
253 | * sh_cpu_init | 283 | * sh_cpu_init |
254 | * | 284 | * |
255 | * This is our initial entry point for each CPU, and is invoked on the boot | 285 | * This is our initial entry point for each CPU, and is invoked on the |
256 | * CPU prior to calling start_kernel(). For SMP, a combination of this and | 286 | * boot CPU prior to calling start_kernel(). For SMP, a combination of |
257 | * start_secondary() will bring up each processor to a ready state prior | 287 | * this and start_secondary() will bring up each processor to a ready |
258 | * to hand forking the idle loop. | 288 | * state prior to hand forking the idle loop. |
259 | * | 289 | * |
260 | * We do all of the basic processor init here, including setting up the | 290 | * We do all of the basic processor init here, including setting up |
261 | * caches, FPU, DSP, kicking the UBC, etc. By the time start_kernel() is | 291 | * the caches, FPU, DSP, etc. By the time start_kernel() is hit (and |
262 | * hit (and subsequently platform_setup()) things like determining the | 292 | * subsequently platform_setup()) things like determining the CPU |
263 | * CPU subtype and initial configuration will all be done. | 293 | * subtype and initial configuration will all be done. |
264 | * | 294 | * |
265 | * Each processor family is still responsible for doing its own probing | 295 | * Each processor family is still responsible for doing its own probing |
266 | * and cache configuration in detect_cpu_and_cache_system(). | 296 | * and cache configuration in detect_cpu_and_cache_system(). |
267 | */ | 297 | */ |
268 | |||
269 | asmlinkage void __init sh_cpu_init(void) | 298 | asmlinkage void __init sh_cpu_init(void) |
270 | { | 299 | { |
271 | current_thread_info()->cpu = hard_smp_processor_id(); | 300 | current_thread_info()->cpu = hard_smp_processor_id(); |
@@ -302,18 +331,8 @@ asmlinkage void __init sh_cpu_init(void) | |||
302 | detect_cache_shape(); | 331 | detect_cache_shape(); |
303 | } | 332 | } |
304 | 333 | ||
305 | /* Disable the FPU */ | 334 | fpu_init(); |
306 | if (fpu_disabled) { | 335 | dsp_init(); |
307 | printk("FPU Disabled\n"); | ||
308 | current_cpu_data.flags &= ~CPU_HAS_FPU; | ||
309 | } | ||
310 | |||
311 | /* FPU initialization */ | ||
312 | disable_fpu(); | ||
313 | if ((current_cpu_data.flags & CPU_HAS_FPU)) { | ||
314 | current_thread_info()->status &= ~TS_USEDFPU; | ||
315 | clear_used_math(); | ||
316 | } | ||
317 | 336 | ||
318 | /* | 337 | /* |
319 | * Initialize the per-CPU ASID cache very early, since the | 338 | * Initialize the per-CPU ASID cache very early, since the |
@@ -321,18 +340,24 @@ asmlinkage void __init sh_cpu_init(void) | |||
321 | */ | 340 | */ |
322 | current_cpu_data.asid_cache = NO_CONTEXT; | 341 | current_cpu_data.asid_cache = NO_CONTEXT; |
323 | 342 | ||
324 | #ifdef CONFIG_SH_DSP | ||
325 | /* Probe for DSP */ | ||
326 | dsp_init(); | ||
327 | |||
328 | /* Disable the DSP */ | ||
329 | if (dsp_disabled) { | ||
330 | printk("DSP Disabled\n"); | ||
331 | current_cpu_data.flags &= ~CPU_HAS_DSP; | ||
332 | release_dsp(); | ||
333 | } | ||
334 | #endif | ||
335 | |||
336 | speculative_execution_init(); | 343 | speculative_execution_init(); |
337 | expmask_init(); | 344 | expmask_init(); |
345 | |||
346 | /* Do the rest of the boot processor setup */ | ||
347 | if (raw_smp_processor_id() == 0) { | ||
348 | /* Save off the BIOS VBR, if there is one */ | ||
349 | sh_bios_vbr_init(); | ||
350 | |||
351 | /* | ||
352 | * Setup VBR for boot CPU. Secondary CPUs do this through | ||
353 | * start_secondary(). | ||
354 | */ | ||
355 | per_cpu_trap_init(); | ||
356 | |||
357 | /* | ||
358 | * Boot processor to setup the FP and extended state | ||
359 | * context info. | ||
360 | */ | ||
361 | init_thread_xstate(); | ||
362 | } | ||
338 | } | 363 | } |
diff --git a/arch/sh/kernel/cpu/irq/intc-sh5.c b/arch/sh/kernel/cpu/irq/intc-sh5.c index 06e7e2959b54..96a239583948 100644 --- a/arch/sh/kernel/cpu/irq/intc-sh5.c +++ b/arch/sh/kernel/cpu/irq/intc-sh5.c | |||
@@ -123,7 +123,7 @@ static void enable_intc_irq(unsigned int irq) | |||
123 | bitmask = 1 << (irq - 32); | 123 | bitmask = 1 << (irq - 32); |
124 | } | 124 | } |
125 | 125 | ||
126 | ctrl_outl(bitmask, reg); | 126 | __raw_writel(bitmask, reg); |
127 | } | 127 | } |
128 | 128 | ||
129 | static void disable_intc_irq(unsigned int irq) | 129 | static void disable_intc_irq(unsigned int irq) |
@@ -139,7 +139,7 @@ static void disable_intc_irq(unsigned int irq) | |||
139 | bitmask = 1 << (irq - 32); | 139 | bitmask = 1 << (irq - 32); |
140 | } | 140 | } |
141 | 141 | ||
142 | ctrl_outl(bitmask, reg); | 142 | __raw_writel(bitmask, reg); |
143 | } | 143 | } |
144 | 144 | ||
145 | static void mask_and_ack_intc(unsigned int irq) | 145 | static void mask_and_ack_intc(unsigned int irq) |
@@ -170,11 +170,11 @@ void __init plat_irq_setup(void) | |||
170 | 170 | ||
171 | 171 | ||
172 | /* Disable all interrupts and set all priorities to 0 to avoid trouble */ | 172 | /* Disable all interrupts and set all priorities to 0 to avoid trouble */ |
173 | ctrl_outl(-1, INTC_INTDSB_0); | 173 | __raw_writel(-1, INTC_INTDSB_0); |
174 | ctrl_outl(-1, INTC_INTDSB_1); | 174 | __raw_writel(-1, INTC_INTDSB_1); |
175 | 175 | ||
176 | for (reg = INTC_INTPRI_0, i = 0; i < INTC_INTPRI_PREGS; i++, reg += 8) | 176 | for (reg = INTC_INTPRI_0, i = 0; i < INTC_INTPRI_PREGS; i++, reg += 8) |
177 | ctrl_outl( NO_PRIORITY, reg); | 177 | __raw_writel( NO_PRIORITY, reg); |
178 | 178 | ||
179 | 179 | ||
180 | #ifdef CONFIG_SH_CAYMAN | 180 | #ifdef CONFIG_SH_CAYMAN |
@@ -199,7 +199,7 @@ void __init plat_irq_setup(void) | |||
199 | reg = INTC_ICR_SET; | 199 | reg = INTC_ICR_SET; |
200 | i = IRQ_IRL0; | 200 | i = IRQ_IRL0; |
201 | } | 201 | } |
202 | ctrl_outl(INTC_ICR_IRLM, reg); | 202 | __raw_writel(INTC_ICR_IRLM, reg); |
203 | 203 | ||
204 | /* Set interrupt priorities according to platform description */ | 204 | /* Set interrupt priorities according to platform description */ |
205 | for (data = 0, reg = INTC_INTPRI_0; i < NR_INTC_IRQS; i++) { | 205 | for (data = 0, reg = INTC_INTPRI_0; i < NR_INTC_IRQS; i++) { |
@@ -207,7 +207,7 @@ void __init plat_irq_setup(void) | |||
207 | ((i % INTC_INTPRI_PPREG) * 4); | 207 | ((i % INTC_INTPRI_PPREG) * 4); |
208 | if ((i % INTC_INTPRI_PPREG) == (INTC_INTPRI_PPREG - 1)) { | 208 | if ((i % INTC_INTPRI_PPREG) == (INTC_INTPRI_PPREG - 1)) { |
209 | /* Upon the 7th, set Priority Register */ | 209 | /* Upon the 7th, set Priority Register */ |
210 | ctrl_outl(data, reg); | 210 | __raw_writel(data, reg); |
211 | data = 0; | 211 | data = 0; |
212 | reg += 8; | 212 | reg += 8; |
213 | } | 213 | } |
diff --git a/arch/sh/kernel/cpu/sh2/clock-sh7619.c b/arch/sh/kernel/cpu/sh2/clock-sh7619.c index 4fe863170e31..0c9f24d7a02f 100644 --- a/arch/sh/kernel/cpu/sh2/clock-sh7619.c +++ b/arch/sh/kernel/cpu/sh2/clock-sh7619.c | |||
@@ -31,7 +31,7 @@ static const int pfc_divisors[] = {1,2,0,4}; | |||
31 | 31 | ||
32 | static void master_clk_init(struct clk *clk) | 32 | static void master_clk_init(struct clk *clk) |
33 | { | 33 | { |
34 | clk->rate *= PLL2 * pll1rate[(ctrl_inw(FREQCR) >> 8) & 7]; | 34 | clk->rate *= PLL2 * pll1rate[(__raw_readw(FREQCR) >> 8) & 7]; |
35 | } | 35 | } |
36 | 36 | ||
37 | static struct clk_ops sh7619_master_clk_ops = { | 37 | static struct clk_ops sh7619_master_clk_ops = { |
@@ -40,7 +40,7 @@ static struct clk_ops sh7619_master_clk_ops = { | |||
40 | 40 | ||
41 | static unsigned long module_clk_recalc(struct clk *clk) | 41 | static unsigned long module_clk_recalc(struct clk *clk) |
42 | { | 42 | { |
43 | int idx = (ctrl_inw(FREQCR) & 0x0007); | 43 | int idx = (__raw_readw(FREQCR) & 0x0007); |
44 | return clk->parent->rate / pfc_divisors[idx]; | 44 | return clk->parent->rate / pfc_divisors[idx]; |
45 | } | 45 | } |
46 | 46 | ||
@@ -50,7 +50,7 @@ static struct clk_ops sh7619_module_clk_ops = { | |||
50 | 50 | ||
51 | static unsigned long bus_clk_recalc(struct clk *clk) | 51 | static unsigned long bus_clk_recalc(struct clk *clk) |
52 | { | 52 | { |
53 | return clk->parent->rate / pll1rate[(ctrl_inw(FREQCR) >> 8) & 7]; | 53 | return clk->parent->rate / pll1rate[(__raw_readw(FREQCR) >> 8) & 7]; |
54 | } | 54 | } |
55 | 55 | ||
56 | static struct clk_ops sh7619_bus_clk_ops = { | 56 | static struct clk_ops sh7619_bus_clk_ops = { |
diff --git a/arch/sh/kernel/cpu/sh2a/clock-sh7201.c b/arch/sh/kernel/cpu/sh2a/clock-sh7201.c index 7814c76159a7..b26264dc2aef 100644 --- a/arch/sh/kernel/cpu/sh2a/clock-sh7201.c +++ b/arch/sh/kernel/cpu/sh2a/clock-sh7201.c | |||
@@ -34,7 +34,7 @@ static const int pfc_divisors[]={1,2,3,4,6,8,12}; | |||
34 | 34 | ||
35 | static void master_clk_init(struct clk *clk) | 35 | static void master_clk_init(struct clk *clk) |
36 | { | 36 | { |
37 | return 10000000 * PLL2 * pll1rate[(ctrl_inw(FREQCR) >> 8) & 0x0007]; | 37 | return 10000000 * PLL2 * pll1rate[(__raw_readw(FREQCR) >> 8) & 0x0007]; |
38 | } | 38 | } |
39 | 39 | ||
40 | static struct clk_ops sh7201_master_clk_ops = { | 40 | static struct clk_ops sh7201_master_clk_ops = { |
@@ -43,7 +43,7 @@ static struct clk_ops sh7201_master_clk_ops = { | |||
43 | 43 | ||
44 | static unsigned long module_clk_recalc(struct clk *clk) | 44 | static unsigned long module_clk_recalc(struct clk *clk) |
45 | { | 45 | { |
46 | int idx = (ctrl_inw(FREQCR) & 0x0007); | 46 | int idx = (__raw_readw(FREQCR) & 0x0007); |
47 | return clk->parent->rate / pfc_divisors[idx]; | 47 | return clk->parent->rate / pfc_divisors[idx]; |
48 | } | 48 | } |
49 | 49 | ||
@@ -53,7 +53,7 @@ static struct clk_ops sh7201_module_clk_ops = { | |||
53 | 53 | ||
54 | static unsigned long bus_clk_recalc(struct clk *clk) | 54 | static unsigned long bus_clk_recalc(struct clk *clk) |
55 | { | 55 | { |
56 | int idx = (ctrl_inw(FREQCR) & 0x0007); | 56 | int idx = (__raw_readw(FREQCR) & 0x0007); |
57 | return clk->parent->rate / pfc_divisors[idx]; | 57 | return clk->parent->rate / pfc_divisors[idx]; |
58 | } | 58 | } |
59 | 59 | ||
@@ -63,7 +63,7 @@ static struct clk_ops sh7201_bus_clk_ops = { | |||
63 | 63 | ||
64 | static unsigned long cpu_clk_recalc(struct clk *clk) | 64 | static unsigned long cpu_clk_recalc(struct clk *clk) |
65 | { | 65 | { |
66 | int idx = ((ctrl_inw(FREQCR) >> 4) & 0x0007); | 66 | int idx = ((__raw_readw(FREQCR) >> 4) & 0x0007); |
67 | return clk->parent->rate / ifc_divisors[idx]; | 67 | return clk->parent->rate / ifc_divisors[idx]; |
68 | } | 68 | } |
69 | 69 | ||
diff --git a/arch/sh/kernel/cpu/sh2a/clock-sh7203.c b/arch/sh/kernel/cpu/sh2a/clock-sh7203.c index 940986965102..7e75d8f79502 100644 --- a/arch/sh/kernel/cpu/sh2a/clock-sh7203.c +++ b/arch/sh/kernel/cpu/sh2a/clock-sh7203.c | |||
@@ -39,7 +39,7 @@ static const int pfc_divisors[]={1,2,3,4,6,8,12}; | |||
39 | 39 | ||
40 | static void master_clk_init(struct clk *clk) | 40 | static void master_clk_init(struct clk *clk) |
41 | { | 41 | { |
42 | clk->rate *= pll1rate[(ctrl_inw(FREQCR) >> 8) & 0x0003] * PLL2 ; | 42 | clk->rate *= pll1rate[(__raw_readw(FREQCR) >> 8) & 0x0003] * PLL2 ; |
43 | } | 43 | } |
44 | 44 | ||
45 | static struct clk_ops sh7203_master_clk_ops = { | 45 | static struct clk_ops sh7203_master_clk_ops = { |
@@ -48,7 +48,7 @@ static struct clk_ops sh7203_master_clk_ops = { | |||
48 | 48 | ||
49 | static unsigned long module_clk_recalc(struct clk *clk) | 49 | static unsigned long module_clk_recalc(struct clk *clk) |
50 | { | 50 | { |
51 | int idx = (ctrl_inw(FREQCR) & 0x0007); | 51 | int idx = (__raw_readw(FREQCR) & 0x0007); |
52 | return clk->parent->rate / pfc_divisors[idx]; | 52 | return clk->parent->rate / pfc_divisors[idx]; |
53 | } | 53 | } |
54 | 54 | ||
@@ -58,7 +58,7 @@ static struct clk_ops sh7203_module_clk_ops = { | |||
58 | 58 | ||
59 | static unsigned long bus_clk_recalc(struct clk *clk) | 59 | static unsigned long bus_clk_recalc(struct clk *clk) |
60 | { | 60 | { |
61 | int idx = (ctrl_inw(FREQCR) & 0x0007); | 61 | int idx = (__raw_readw(FREQCR) & 0x0007); |
62 | return clk->parent->rate / pfc_divisors[idx-2]; | 62 | return clk->parent->rate / pfc_divisors[idx-2]; |
63 | } | 63 | } |
64 | 64 | ||
diff --git a/arch/sh/kernel/cpu/sh2a/clock-sh7206.c b/arch/sh/kernel/cpu/sh2a/clock-sh7206.c index c2268bdeceeb..b27a5e2687ab 100644 --- a/arch/sh/kernel/cpu/sh2a/clock-sh7206.c +++ b/arch/sh/kernel/cpu/sh2a/clock-sh7206.c | |||
@@ -34,7 +34,7 @@ static const int pfc_divisors[]={1,2,3,4,6,8,12}; | |||
34 | 34 | ||
35 | static void master_clk_init(struct clk *clk) | 35 | static void master_clk_init(struct clk *clk) |
36 | { | 36 | { |
37 | clk->rate *= PLL2 * pll1rate[(ctrl_inw(FREQCR) >> 8) & 0x0007]; | 37 | clk->rate *= PLL2 * pll1rate[(__raw_readw(FREQCR) >> 8) & 0x0007]; |
38 | } | 38 | } |
39 | 39 | ||
40 | static struct clk_ops sh7206_master_clk_ops = { | 40 | static struct clk_ops sh7206_master_clk_ops = { |
@@ -43,7 +43,7 @@ static struct clk_ops sh7206_master_clk_ops = { | |||
43 | 43 | ||
44 | static unsigned long module_clk_recalc(struct clk *clk) | 44 | static unsigned long module_clk_recalc(struct clk *clk) |
45 | { | 45 | { |
46 | int idx = (ctrl_inw(FREQCR) & 0x0007); | 46 | int idx = (__raw_readw(FREQCR) & 0x0007); |
47 | return clk->parent->rate / pfc_divisors[idx]; | 47 | return clk->parent->rate / pfc_divisors[idx]; |
48 | } | 48 | } |
49 | 49 | ||
@@ -53,7 +53,7 @@ static struct clk_ops sh7206_module_clk_ops = { | |||
53 | 53 | ||
54 | static unsigned long bus_clk_recalc(struct clk *clk) | 54 | static unsigned long bus_clk_recalc(struct clk *clk) |
55 | { | 55 | { |
56 | return clk->parent->rate / pll1rate[(ctrl_inw(FREQCR) >> 8) & 0x0007]; | 56 | return clk->parent->rate / pll1rate[(__raw_readw(FREQCR) >> 8) & 0x0007]; |
57 | } | 57 | } |
58 | 58 | ||
59 | static struct clk_ops sh7206_bus_clk_ops = { | 59 | static struct clk_ops sh7206_bus_clk_ops = { |
@@ -62,7 +62,7 @@ static struct clk_ops sh7206_bus_clk_ops = { | |||
62 | 62 | ||
63 | static unsigned long cpu_clk_recalc(struct clk *clk) | 63 | static unsigned long cpu_clk_recalc(struct clk *clk) |
64 | { | 64 | { |
65 | int idx = (ctrl_inw(FREQCR) & 0x0007); | 65 | int idx = (__raw_readw(FREQCR) & 0x0007); |
66 | return clk->parent->rate / ifc_divisors[idx]; | 66 | return clk->parent->rate / ifc_divisors[idx]; |
67 | } | 67 | } |
68 | 68 | ||
diff --git a/arch/sh/kernel/cpu/sh2a/fpu.c b/arch/sh/kernel/cpu/sh2a/fpu.c index d395ce5740e7..488d24e0cdf0 100644 --- a/arch/sh/kernel/cpu/sh2a/fpu.c +++ b/arch/sh/kernel/cpu/sh2a/fpu.c | |||
@@ -26,8 +26,7 @@ | |||
26 | /* | 26 | /* |
27 | * Save FPU registers onto task structure. | 27 | * Save FPU registers onto task structure. |
28 | */ | 28 | */ |
29 | void | 29 | void save_fpu(struct task_struct *tsk) |
30 | save_fpu(struct task_struct *tsk) | ||
31 | { | 30 | { |
32 | unsigned long dummy; | 31 | unsigned long dummy; |
33 | 32 | ||
@@ -52,7 +51,7 @@ save_fpu(struct task_struct *tsk) | |||
52 | "fmov.s fr0, @-%0\n\t" | 51 | "fmov.s fr0, @-%0\n\t" |
53 | "lds %3, fpscr\n\t" | 52 | "lds %3, fpscr\n\t" |
54 | : "=r" (dummy) | 53 | : "=r" (dummy) |
55 | : "0" ((char *)(&tsk->thread.fpu.hard.status)), | 54 | : "0" ((char *)(&tsk->thread.xstate->hardfpu.status)), |
56 | "r" (FPSCR_RCHG), | 55 | "r" (FPSCR_RCHG), |
57 | "r" (FPSCR_INIT) | 56 | "r" (FPSCR_INIT) |
58 | : "memory"); | 57 | : "memory"); |
@@ -60,8 +59,7 @@ save_fpu(struct task_struct *tsk) | |||
60 | disable_fpu(); | 59 | disable_fpu(); |
61 | } | 60 | } |
62 | 61 | ||
63 | static void | 62 | void restore_fpu(struct task_struct *tsk) |
64 | restore_fpu(struct task_struct *tsk) | ||
65 | { | 63 | { |
66 | unsigned long dummy; | 64 | unsigned long dummy; |
67 | 65 | ||
@@ -85,45 +83,12 @@ restore_fpu(struct task_struct *tsk) | |||
85 | "lds.l @%0+, fpscr\n\t" | 83 | "lds.l @%0+, fpscr\n\t" |
86 | "lds.l @%0+, fpul\n\t" | 84 | "lds.l @%0+, fpul\n\t" |
87 | : "=r" (dummy) | 85 | : "=r" (dummy) |
88 | : "0" (&tsk->thread.fpu), "r" (FPSCR_RCHG) | 86 | : "0" (tsk->thread.xstate), "r" (FPSCR_RCHG) |
89 | : "memory"); | 87 | : "memory"); |
90 | disable_fpu(); | 88 | disable_fpu(); |
91 | } | 89 | } |
92 | 90 | ||
93 | /* | 91 | /* |
94 | * Load the FPU with signalling NANS. This bit pattern we're using | ||
95 | * has the property that no matter wether considered as single or as | ||
96 | * double precission represents signaling NANS. | ||
97 | */ | ||
98 | |||
99 | static void | ||
100 | fpu_init(void) | ||
101 | { | ||
102 | enable_fpu(); | ||
103 | asm volatile("lds %0, fpul\n\t" | ||
104 | "fsts fpul, fr0\n\t" | ||
105 | "fsts fpul, fr1\n\t" | ||
106 | "fsts fpul, fr2\n\t" | ||
107 | "fsts fpul, fr3\n\t" | ||
108 | "fsts fpul, fr4\n\t" | ||
109 | "fsts fpul, fr5\n\t" | ||
110 | "fsts fpul, fr6\n\t" | ||
111 | "fsts fpul, fr7\n\t" | ||
112 | "fsts fpul, fr8\n\t" | ||
113 | "fsts fpul, fr9\n\t" | ||
114 | "fsts fpul, fr10\n\t" | ||
115 | "fsts fpul, fr11\n\t" | ||
116 | "fsts fpul, fr12\n\t" | ||
117 | "fsts fpul, fr13\n\t" | ||
118 | "fsts fpul, fr14\n\t" | ||
119 | "fsts fpul, fr15\n\t" | ||
120 | "lds %2, fpscr\n\t" | ||
121 | : /* no output */ | ||
122 | : "r" (0), "r" (FPSCR_RCHG), "r" (FPSCR_INIT)); | ||
123 | disable_fpu(); | ||
124 | } | ||
125 | |||
126 | /* | ||
127 | * Emulate arithmetic ops on denormalized number for some FPU insns. | 92 | * Emulate arithmetic ops on denormalized number for some FPU insns. |
128 | */ | 93 | */ |
129 | 94 | ||
@@ -490,9 +455,9 @@ ieee_fpe_handler (struct pt_regs *regs) | |||
490 | if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */ | 455 | if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */ |
491 | struct task_struct *tsk = current; | 456 | struct task_struct *tsk = current; |
492 | 457 | ||
493 | if ((tsk->thread.fpu.hard.fpscr & FPSCR_FPU_ERROR)) { | 458 | if ((tsk->thread.xstate->hardfpu.fpscr & FPSCR_FPU_ERROR)) { |
494 | /* FPU error */ | 459 | /* FPU error */ |
495 | denormal_to_double (&tsk->thread.fpu.hard, | 460 | denormal_to_double (&tsk->thread.xstate->hardfpu, |
496 | (finsn >> 8) & 0xf); | 461 | (finsn >> 8) & 0xf); |
497 | } else | 462 | } else |
498 | return 0; | 463 | return 0; |
@@ -507,9 +472,9 @@ ieee_fpe_handler (struct pt_regs *regs) | |||
507 | 472 | ||
508 | n = (finsn >> 8) & 0xf; | 473 | n = (finsn >> 8) & 0xf; |
509 | m = (finsn >> 4) & 0xf; | 474 | m = (finsn >> 4) & 0xf; |
510 | hx = tsk->thread.fpu.hard.fp_regs[n]; | 475 | hx = tsk->thread.xstate->hardfpu.fp_regs[n]; |
511 | hy = tsk->thread.fpu.hard.fp_regs[m]; | 476 | hy = tsk->thread.xstate->hardfpu.fp_regs[m]; |
512 | fpscr = tsk->thread.fpu.hard.fpscr; | 477 | fpscr = tsk->thread.xstate->hardfpu.fpscr; |
513 | prec = fpscr & (1 << 19); | 478 | prec = fpscr & (1 << 19); |
514 | 479 | ||
515 | if ((fpscr & FPSCR_FPU_ERROR) | 480 | if ((fpscr & FPSCR_FPU_ERROR) |
@@ -519,15 +484,15 @@ ieee_fpe_handler (struct pt_regs *regs) | |||
519 | 484 | ||
520 | /* FPU error because of denormal */ | 485 | /* FPU error because of denormal */ |
521 | llx = ((long long) hx << 32) | 486 | llx = ((long long) hx << 32) |
522 | | tsk->thread.fpu.hard.fp_regs[n+1]; | 487 | | tsk->thread.xstate->hardfpu.fp_regs[n+1]; |
523 | lly = ((long long) hy << 32) | 488 | lly = ((long long) hy << 32) |
524 | | tsk->thread.fpu.hard.fp_regs[m+1]; | 489 | | tsk->thread.xstate->hardfpu.fp_regs[m+1]; |
525 | if ((hx & 0x7fffffff) >= 0x00100000) | 490 | if ((hx & 0x7fffffff) >= 0x00100000) |
526 | llx = denormal_muld(lly, llx); | 491 | llx = denormal_muld(lly, llx); |
527 | else | 492 | else |
528 | llx = denormal_muld(llx, lly); | 493 | llx = denormal_muld(llx, lly); |
529 | tsk->thread.fpu.hard.fp_regs[n] = llx >> 32; | 494 | tsk->thread.xstate->hardfpu.fp_regs[n] = llx >> 32; |
530 | tsk->thread.fpu.hard.fp_regs[n+1] = llx & 0xffffffff; | 495 | tsk->thread.xstate->hardfpu.fp_regs[n+1] = llx & 0xffffffff; |
531 | } else if ((fpscr & FPSCR_FPU_ERROR) | 496 | } else if ((fpscr & FPSCR_FPU_ERROR) |
532 | && (!prec && ((hx & 0x7fffffff) < 0x00800000 | 497 | && (!prec && ((hx & 0x7fffffff) < 0x00800000 |
533 | || (hy & 0x7fffffff) < 0x00800000))) { | 498 | || (hy & 0x7fffffff) < 0x00800000))) { |
@@ -536,7 +501,7 @@ ieee_fpe_handler (struct pt_regs *regs) | |||
536 | hx = denormal_mulf(hy, hx); | 501 | hx = denormal_mulf(hy, hx); |
537 | else | 502 | else |
538 | hx = denormal_mulf(hx, hy); | 503 | hx = denormal_mulf(hx, hy); |
539 | tsk->thread.fpu.hard.fp_regs[n] = hx; | 504 | tsk->thread.xstate->hardfpu.fp_regs[n] = hx; |
540 | } else | 505 | } else |
541 | return 0; | 506 | return 0; |
542 | 507 | ||
@@ -550,9 +515,9 @@ ieee_fpe_handler (struct pt_regs *regs) | |||
550 | 515 | ||
551 | n = (finsn >> 8) & 0xf; | 516 | n = (finsn >> 8) & 0xf; |
552 | m = (finsn >> 4) & 0xf; | 517 | m = (finsn >> 4) & 0xf; |
553 | hx = tsk->thread.fpu.hard.fp_regs[n]; | 518 | hx = tsk->thread.xstate->hardfpu.fp_regs[n]; |
554 | hy = tsk->thread.fpu.hard.fp_regs[m]; | 519 | hy = tsk->thread.xstate->hardfpu.fp_regs[m]; |
555 | fpscr = tsk->thread.fpu.hard.fpscr; | 520 | fpscr = tsk->thread.xstate->hardfpu.fpscr; |
556 | prec = fpscr & (1 << 19); | 521 | prec = fpscr & (1 << 19); |
557 | 522 | ||
558 | if ((fpscr & FPSCR_FPU_ERROR) | 523 | if ((fpscr & FPSCR_FPU_ERROR) |
@@ -562,15 +527,15 @@ ieee_fpe_handler (struct pt_regs *regs) | |||
562 | 527 | ||
563 | /* FPU error because of denormal */ | 528 | /* FPU error because of denormal */ |
564 | llx = ((long long) hx << 32) | 529 | llx = ((long long) hx << 32) |
565 | | tsk->thread.fpu.hard.fp_regs[n+1]; | 530 | | tsk->thread.xstate->hardfpu.fp_regs[n+1]; |
566 | lly = ((long long) hy << 32) | 531 | lly = ((long long) hy << 32) |
567 | | tsk->thread.fpu.hard.fp_regs[m+1]; | 532 | | tsk->thread.xstate->hardfpu.fp_regs[m+1]; |
568 | if ((finsn & 0xf00f) == 0xf000) | 533 | if ((finsn & 0xf00f) == 0xf000) |
569 | llx = denormal_addd(llx, lly); | 534 | llx = denormal_addd(llx, lly); |
570 | else | 535 | else |
571 | llx = denormal_addd(llx, lly ^ (1LL << 63)); | 536 | llx = denormal_addd(llx, lly ^ (1LL << 63)); |
572 | tsk->thread.fpu.hard.fp_regs[n] = llx >> 32; | 537 | tsk->thread.xstate->hardfpu.fp_regs[n] = llx >> 32; |
573 | tsk->thread.fpu.hard.fp_regs[n+1] = llx & 0xffffffff; | 538 | tsk->thread.xstate->hardfpu.fp_regs[n+1] = llx & 0xffffffff; |
574 | } else if ((fpscr & FPSCR_FPU_ERROR) | 539 | } else if ((fpscr & FPSCR_FPU_ERROR) |
575 | && (!prec && ((hx & 0x7fffffff) < 0x00800000 | 540 | && (!prec && ((hx & 0x7fffffff) < 0x00800000 |
576 | || (hy & 0x7fffffff) < 0x00800000))) { | 541 | || (hy & 0x7fffffff) < 0x00800000))) { |
@@ -579,7 +544,7 @@ ieee_fpe_handler (struct pt_regs *regs) | |||
579 | hx = denormal_addf(hx, hy); | 544 | hx = denormal_addf(hx, hy); |
580 | else | 545 | else |
581 | hx = denormal_addf(hx, hy ^ 0x80000000); | 546 | hx = denormal_addf(hx, hy ^ 0x80000000); |
582 | tsk->thread.fpu.hard.fp_regs[n] = hx; | 547 | tsk->thread.xstate->hardfpu.fp_regs[n] = hx; |
583 | } else | 548 | } else |
584 | return 0; | 549 | return 0; |
585 | 550 | ||
@@ -597,7 +562,7 @@ BUILD_TRAP_HANDLER(fpu_error) | |||
597 | 562 | ||
598 | __unlazy_fpu(tsk, regs); | 563 | __unlazy_fpu(tsk, regs); |
599 | if (ieee_fpe_handler(regs)) { | 564 | if (ieee_fpe_handler(regs)) { |
600 | tsk->thread.fpu.hard.fpscr &= | 565 | tsk->thread.xstate->hardfpu.fpscr &= |
601 | ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); | 566 | ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); |
602 | grab_fpu(regs); | 567 | grab_fpu(regs); |
603 | restore_fpu(tsk); | 568 | restore_fpu(tsk); |
@@ -607,33 +572,3 @@ BUILD_TRAP_HANDLER(fpu_error) | |||
607 | 572 | ||
608 | force_sig(SIGFPE, tsk); | 573 | force_sig(SIGFPE, tsk); |
609 | } | 574 | } |
610 | |||
611 | void fpu_state_restore(struct pt_regs *regs) | ||
612 | { | ||
613 | struct task_struct *tsk = current; | ||
614 | |||
615 | grab_fpu(regs); | ||
616 | if (unlikely(!user_mode(regs))) { | ||
617 | printk(KERN_ERR "BUG: FPU is used in kernel mode.\n"); | ||
618 | BUG(); | ||
619 | return; | ||
620 | } | ||
621 | |||
622 | if (likely(used_math())) { | ||
623 | /* Using the FPU again. */ | ||
624 | restore_fpu(tsk); | ||
625 | } else { | ||
626 | /* First time FPU user. */ | ||
627 | fpu_init(); | ||
628 | set_used_math(); | ||
629 | } | ||
630 | task_thread_info(tsk)->status |= TS_USEDFPU; | ||
631 | tsk->fpu_counter++; | ||
632 | } | ||
633 | |||
634 | BUILD_TRAP_HANDLER(fpu_state_restore) | ||
635 | { | ||
636 | TRAP_HANDLER_DECL; | ||
637 | |||
638 | fpu_state_restore(regs); | ||
639 | } | ||
diff --git a/arch/sh/kernel/cpu/sh3/clock-sh3.c b/arch/sh/kernel/cpu/sh3/clock-sh3.c index 27b8738f0b09..b78384afac09 100644 --- a/arch/sh/kernel/cpu/sh3/clock-sh3.c +++ b/arch/sh/kernel/cpu/sh3/clock-sh3.c | |||
@@ -28,7 +28,7 @@ static int pfc_divisors[] = { 1, 2, 3, 4, 6, 1, 1, 1 }; | |||
28 | 28 | ||
29 | static void master_clk_init(struct clk *clk) | 29 | static void master_clk_init(struct clk *clk) |
30 | { | 30 | { |
31 | int frqcr = ctrl_inw(FRQCR); | 31 | int frqcr = __raw_readw(FRQCR); |
32 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); | 32 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); |
33 | 33 | ||
34 | clk->rate *= pfc_divisors[idx]; | 34 | clk->rate *= pfc_divisors[idx]; |
@@ -40,7 +40,7 @@ static struct clk_ops sh3_master_clk_ops = { | |||
40 | 40 | ||
41 | static unsigned long module_clk_recalc(struct clk *clk) | 41 | static unsigned long module_clk_recalc(struct clk *clk) |
42 | { | 42 | { |
43 | int frqcr = ctrl_inw(FRQCR); | 43 | int frqcr = __raw_readw(FRQCR); |
44 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); | 44 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); |
45 | 45 | ||
46 | return clk->parent->rate / pfc_divisors[idx]; | 46 | return clk->parent->rate / pfc_divisors[idx]; |
@@ -52,7 +52,7 @@ static struct clk_ops sh3_module_clk_ops = { | |||
52 | 52 | ||
53 | static unsigned long bus_clk_recalc(struct clk *clk) | 53 | static unsigned long bus_clk_recalc(struct clk *clk) |
54 | { | 54 | { |
55 | int frqcr = ctrl_inw(FRQCR); | 55 | int frqcr = __raw_readw(FRQCR); |
56 | int idx = ((frqcr & 0x8000) >> 13) | ((frqcr & 0x0030) >> 4); | 56 | int idx = ((frqcr & 0x8000) >> 13) | ((frqcr & 0x0030) >> 4); |
57 | 57 | ||
58 | return clk->parent->rate / stc_multipliers[idx]; | 58 | return clk->parent->rate / stc_multipliers[idx]; |
@@ -64,7 +64,7 @@ static struct clk_ops sh3_bus_clk_ops = { | |||
64 | 64 | ||
65 | static unsigned long cpu_clk_recalc(struct clk *clk) | 65 | static unsigned long cpu_clk_recalc(struct clk *clk) |
66 | { | 66 | { |
67 | int frqcr = ctrl_inw(FRQCR); | 67 | int frqcr = __raw_readw(FRQCR); |
68 | int idx = ((frqcr & 0x4000) >> 12) | ((frqcr & 0x000c) >> 2); | 68 | int idx = ((frqcr & 0x4000) >> 12) | ((frqcr & 0x000c) >> 2); |
69 | 69 | ||
70 | return clk->parent->rate / ifc_divisors[idx]; | 70 | return clk->parent->rate / ifc_divisors[idx]; |
diff --git a/arch/sh/kernel/cpu/sh3/clock-sh7705.c b/arch/sh/kernel/cpu/sh3/clock-sh7705.c index 0ca8f2c3646c..0ecea1451c6f 100644 --- a/arch/sh/kernel/cpu/sh3/clock-sh7705.c +++ b/arch/sh/kernel/cpu/sh3/clock-sh7705.c | |||
@@ -32,7 +32,7 @@ static int pfc_divisors[] = { 1, 2, 3, 4, 6, 1, 1, 1 }; | |||
32 | 32 | ||
33 | static void master_clk_init(struct clk *clk) | 33 | static void master_clk_init(struct clk *clk) |
34 | { | 34 | { |
35 | clk->rate *= pfc_divisors[ctrl_inw(FRQCR) & 0x0003]; | 35 | clk->rate *= pfc_divisors[__raw_readw(FRQCR) & 0x0003]; |
36 | } | 36 | } |
37 | 37 | ||
38 | static struct clk_ops sh7705_master_clk_ops = { | 38 | static struct clk_ops sh7705_master_clk_ops = { |
@@ -41,7 +41,7 @@ static struct clk_ops sh7705_master_clk_ops = { | |||
41 | 41 | ||
42 | static unsigned long module_clk_recalc(struct clk *clk) | 42 | static unsigned long module_clk_recalc(struct clk *clk) |
43 | { | 43 | { |
44 | int idx = ctrl_inw(FRQCR) & 0x0003; | 44 | int idx = __raw_readw(FRQCR) & 0x0003; |
45 | return clk->parent->rate / pfc_divisors[idx]; | 45 | return clk->parent->rate / pfc_divisors[idx]; |
46 | } | 46 | } |
47 | 47 | ||
@@ -51,7 +51,7 @@ static struct clk_ops sh7705_module_clk_ops = { | |||
51 | 51 | ||
52 | static unsigned long bus_clk_recalc(struct clk *clk) | 52 | static unsigned long bus_clk_recalc(struct clk *clk) |
53 | { | 53 | { |
54 | int idx = (ctrl_inw(FRQCR) & 0x0300) >> 8; | 54 | int idx = (__raw_readw(FRQCR) & 0x0300) >> 8; |
55 | return clk->parent->rate / stc_multipliers[idx]; | 55 | return clk->parent->rate / stc_multipliers[idx]; |
56 | } | 56 | } |
57 | 57 | ||
@@ -61,7 +61,7 @@ static struct clk_ops sh7705_bus_clk_ops = { | |||
61 | 61 | ||
62 | static unsigned long cpu_clk_recalc(struct clk *clk) | 62 | static unsigned long cpu_clk_recalc(struct clk *clk) |
63 | { | 63 | { |
64 | int idx = (ctrl_inw(FRQCR) & 0x0030) >> 4; | 64 | int idx = (__raw_readw(FRQCR) & 0x0030) >> 4; |
65 | return clk->parent->rate / ifc_divisors[idx]; | 65 | return clk->parent->rate / ifc_divisors[idx]; |
66 | } | 66 | } |
67 | 67 | ||
diff --git a/arch/sh/kernel/cpu/sh3/clock-sh7706.c b/arch/sh/kernel/cpu/sh3/clock-sh7706.c index 4bf7887d310a..6f9ff8b57dd6 100644 --- a/arch/sh/kernel/cpu/sh3/clock-sh7706.c +++ b/arch/sh/kernel/cpu/sh3/clock-sh7706.c | |||
@@ -24,7 +24,7 @@ static int pfc_divisors[] = { 1, 2, 4, 1, 3, 6, 1, 1 }; | |||
24 | 24 | ||
25 | static void master_clk_init(struct clk *clk) | 25 | static void master_clk_init(struct clk *clk) |
26 | { | 26 | { |
27 | int frqcr = ctrl_inw(FRQCR); | 27 | int frqcr = __raw_readw(FRQCR); |
28 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); | 28 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); |
29 | 29 | ||
30 | clk->rate *= pfc_divisors[idx]; | 30 | clk->rate *= pfc_divisors[idx]; |
@@ -36,7 +36,7 @@ static struct clk_ops sh7706_master_clk_ops = { | |||
36 | 36 | ||
37 | static unsigned long module_clk_recalc(struct clk *clk) | 37 | static unsigned long module_clk_recalc(struct clk *clk) |
38 | { | 38 | { |
39 | int frqcr = ctrl_inw(FRQCR); | 39 | int frqcr = __raw_readw(FRQCR); |
40 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); | 40 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); |
41 | 41 | ||
42 | return clk->parent->rate / pfc_divisors[idx]; | 42 | return clk->parent->rate / pfc_divisors[idx]; |
@@ -48,7 +48,7 @@ static struct clk_ops sh7706_module_clk_ops = { | |||
48 | 48 | ||
49 | static unsigned long bus_clk_recalc(struct clk *clk) | 49 | static unsigned long bus_clk_recalc(struct clk *clk) |
50 | { | 50 | { |
51 | int frqcr = ctrl_inw(FRQCR); | 51 | int frqcr = __raw_readw(FRQCR); |
52 | int idx = ((frqcr & 0x8000) >> 13) | ((frqcr & 0x0030) >> 4); | 52 | int idx = ((frqcr & 0x8000) >> 13) | ((frqcr & 0x0030) >> 4); |
53 | 53 | ||
54 | return clk->parent->rate / stc_multipliers[idx]; | 54 | return clk->parent->rate / stc_multipliers[idx]; |
@@ -60,7 +60,7 @@ static struct clk_ops sh7706_bus_clk_ops = { | |||
60 | 60 | ||
61 | static unsigned long cpu_clk_recalc(struct clk *clk) | 61 | static unsigned long cpu_clk_recalc(struct clk *clk) |
62 | { | 62 | { |
63 | int frqcr = ctrl_inw(FRQCR); | 63 | int frqcr = __raw_readw(FRQCR); |
64 | int idx = ((frqcr & 0x4000) >> 12) | ((frqcr & 0x000c) >> 2); | 64 | int idx = ((frqcr & 0x4000) >> 12) | ((frqcr & 0x000c) >> 2); |
65 | 65 | ||
66 | return clk->parent->rate / ifc_divisors[idx]; | 66 | return clk->parent->rate / ifc_divisors[idx]; |
diff --git a/arch/sh/kernel/cpu/sh3/clock-sh7709.c b/arch/sh/kernel/cpu/sh3/clock-sh7709.c index e8749505bd2a..f302ba09e681 100644 --- a/arch/sh/kernel/cpu/sh3/clock-sh7709.c +++ b/arch/sh/kernel/cpu/sh3/clock-sh7709.c | |||
@@ -24,7 +24,7 @@ static int pfc_divisors[] = { 1, 2, 4, 1, 3, 6, 1, 1 }; | |||
24 | 24 | ||
25 | static void master_clk_init(struct clk *clk) | 25 | static void master_clk_init(struct clk *clk) |
26 | { | 26 | { |
27 | int frqcr = ctrl_inw(FRQCR); | 27 | int frqcr = __raw_readw(FRQCR); |
28 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); | 28 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); |
29 | 29 | ||
30 | clk->rate *= pfc_divisors[idx]; | 30 | clk->rate *= pfc_divisors[idx]; |
@@ -36,7 +36,7 @@ static struct clk_ops sh7709_master_clk_ops = { | |||
36 | 36 | ||
37 | static unsigned long module_clk_recalc(struct clk *clk) | 37 | static unsigned long module_clk_recalc(struct clk *clk) |
38 | { | 38 | { |
39 | int frqcr = ctrl_inw(FRQCR); | 39 | int frqcr = __raw_readw(FRQCR); |
40 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); | 40 | int idx = ((frqcr & 0x2000) >> 11) | (frqcr & 0x0003); |
41 | 41 | ||
42 | return clk->parent->rate / pfc_divisors[idx]; | 42 | return clk->parent->rate / pfc_divisors[idx]; |
@@ -48,7 +48,7 @@ static struct clk_ops sh7709_module_clk_ops = { | |||
48 | 48 | ||
49 | static unsigned long bus_clk_recalc(struct clk *clk) | 49 | static unsigned long bus_clk_recalc(struct clk *clk) |
50 | { | 50 | { |
51 | int frqcr = ctrl_inw(FRQCR); | 51 | int frqcr = __raw_readw(FRQCR); |
52 | int idx = (frqcr & 0x0080) ? | 52 | int idx = (frqcr & 0x0080) ? |
53 | ((frqcr & 0x8000) >> 13) | ((frqcr & 0x0030) >> 4) : 1; | 53 | ((frqcr & 0x8000) >> 13) | ((frqcr & 0x0030) >> 4) : 1; |
54 | 54 | ||
@@ -61,7 +61,7 @@ static struct clk_ops sh7709_bus_clk_ops = { | |||
61 | 61 | ||
62 | static unsigned long cpu_clk_recalc(struct clk *clk) | 62 | static unsigned long cpu_clk_recalc(struct clk *clk) |
63 | { | 63 | { |
64 | int frqcr = ctrl_inw(FRQCR); | 64 | int frqcr = __raw_readw(FRQCR); |
65 | int idx = ((frqcr & 0x4000) >> 12) | ((frqcr & 0x000c) >> 2); | 65 | int idx = ((frqcr & 0x4000) >> 12) | ((frqcr & 0x000c) >> 2); |
66 | 66 | ||
67 | return clk->parent->rate / ifc_divisors[idx]; | 67 | return clk->parent->rate / ifc_divisors[idx]; |
diff --git a/arch/sh/kernel/cpu/sh3/clock-sh7710.c b/arch/sh/kernel/cpu/sh3/clock-sh7710.c index 030a58ba18a5..29a87d8946a4 100644 --- a/arch/sh/kernel/cpu/sh3/clock-sh7710.c +++ b/arch/sh/kernel/cpu/sh3/clock-sh7710.c | |||
@@ -26,7 +26,7 @@ static int md_table[] = { 1, 2, 3, 4, 6, 8, 12 }; | |||
26 | 26 | ||
27 | static void master_clk_init(struct clk *clk) | 27 | static void master_clk_init(struct clk *clk) |
28 | { | 28 | { |
29 | clk->rate *= md_table[ctrl_inw(FRQCR) & 0x0007]; | 29 | clk->rate *= md_table[__raw_readw(FRQCR) & 0x0007]; |
30 | } | 30 | } |
31 | 31 | ||
32 | static struct clk_ops sh7710_master_clk_ops = { | 32 | static struct clk_ops sh7710_master_clk_ops = { |
@@ -35,7 +35,7 @@ static struct clk_ops sh7710_master_clk_ops = { | |||
35 | 35 | ||
36 | static unsigned long module_clk_recalc(struct clk *clk) | 36 | static unsigned long module_clk_recalc(struct clk *clk) |
37 | { | 37 | { |
38 | int idx = (ctrl_inw(FRQCR) & 0x0007); | 38 | int idx = (__raw_readw(FRQCR) & 0x0007); |
39 | return clk->parent->rate / md_table[idx]; | 39 | return clk->parent->rate / md_table[idx]; |
40 | } | 40 | } |
41 | 41 | ||
@@ -45,7 +45,7 @@ static struct clk_ops sh7710_module_clk_ops = { | |||
45 | 45 | ||
46 | static unsigned long bus_clk_recalc(struct clk *clk) | 46 | static unsigned long bus_clk_recalc(struct clk *clk) |
47 | { | 47 | { |
48 | int idx = (ctrl_inw(FRQCR) & 0x0700) >> 8; | 48 | int idx = (__raw_readw(FRQCR) & 0x0700) >> 8; |
49 | return clk->parent->rate / md_table[idx]; | 49 | return clk->parent->rate / md_table[idx]; |
50 | } | 50 | } |
51 | 51 | ||
@@ -55,7 +55,7 @@ static struct clk_ops sh7710_bus_clk_ops = { | |||
55 | 55 | ||
56 | static unsigned long cpu_clk_recalc(struct clk *clk) | 56 | static unsigned long cpu_clk_recalc(struct clk *clk) |
57 | { | 57 | { |
58 | int idx = (ctrl_inw(FRQCR) & 0x0070) >> 4; | 58 | int idx = (__raw_readw(FRQCR) & 0x0070) >> 4; |
59 | return clk->parent->rate / md_table[idx]; | 59 | return clk->parent->rate / md_table[idx]; |
60 | } | 60 | } |
61 | 61 | ||
diff --git a/arch/sh/kernel/cpu/sh3/clock-sh7712.c b/arch/sh/kernel/cpu/sh3/clock-sh7712.c index 6428ee6c77ed..b0d0c5203996 100644 --- a/arch/sh/kernel/cpu/sh3/clock-sh7712.c +++ b/arch/sh/kernel/cpu/sh3/clock-sh7712.c | |||
@@ -23,7 +23,7 @@ static int divisors[] = { 1, 2, 3, 4, 6 }; | |||
23 | 23 | ||
24 | static void master_clk_init(struct clk *clk) | 24 | static void master_clk_init(struct clk *clk) |
25 | { | 25 | { |
26 | int frqcr = ctrl_inw(FRQCR); | 26 | int frqcr = __raw_readw(FRQCR); |
27 | int idx = (frqcr & 0x0300) >> 8; | 27 | int idx = (frqcr & 0x0300) >> 8; |
28 | 28 | ||
29 | clk->rate *= multipliers[idx]; | 29 | clk->rate *= multipliers[idx]; |
@@ -35,7 +35,7 @@ static struct clk_ops sh7712_master_clk_ops = { | |||
35 | 35 | ||
36 | static unsigned long module_clk_recalc(struct clk *clk) | 36 | static unsigned long module_clk_recalc(struct clk *clk) |
37 | { | 37 | { |
38 | int frqcr = ctrl_inw(FRQCR); | 38 | int frqcr = __raw_readw(FRQCR); |
39 | int idx = frqcr & 0x0007; | 39 | int idx = frqcr & 0x0007; |
40 | 40 | ||
41 | return clk->parent->rate / divisors[idx]; | 41 | return clk->parent->rate / divisors[idx]; |
@@ -47,7 +47,7 @@ static struct clk_ops sh7712_module_clk_ops = { | |||
47 | 47 | ||
48 | static unsigned long cpu_clk_recalc(struct clk *clk) | 48 | static unsigned long cpu_clk_recalc(struct clk *clk) |
49 | { | 49 | { |
50 | int frqcr = ctrl_inw(FRQCR); | 50 | int frqcr = __raw_readw(FRQCR); |
51 | int idx = (frqcr & 0x0030) >> 4; | 51 | int idx = (frqcr & 0x0030) >> 4; |
52 | 52 | ||
53 | return clk->parent->rate / divisors[idx]; | 53 | return clk->parent->rate / divisors[idx]; |
diff --git a/arch/sh/kernel/cpu/sh3/ex.S b/arch/sh/kernel/cpu/sh3/ex.S index 46610c35c232..99b4d020179a 100644 --- a/arch/sh/kernel/cpu/sh3/ex.S +++ b/arch/sh/kernel/cpu/sh3/ex.S | |||
@@ -49,7 +49,7 @@ ENTRY(exception_handling_table) | |||
49 | .long exception_error ! reserved_instruction (filled by trap_init) /* 180 */ | 49 | .long exception_error ! reserved_instruction (filled by trap_init) /* 180 */ |
50 | .long exception_error ! illegal_slot_instruction (filled by trap_init) /*1A0*/ | 50 | .long exception_error ! illegal_slot_instruction (filled by trap_init) /*1A0*/ |
51 | .long nmi_trap_handler /* 1C0 */ ! Allow trap to debugger | 51 | .long nmi_trap_handler /* 1C0 */ ! Allow trap to debugger |
52 | .long break_point_trap /* 1E0 */ | 52 | .long breakpoint_trap_handler /* 1E0 */ |
53 | 53 | ||
54 | /* | 54 | /* |
55 | * Pad the remainder of the table out, exceptions residing in far | 55 | * Pad the remainder of the table out, exceptions residing in far |
diff --git a/arch/sh/kernel/cpu/sh3/probe.c b/arch/sh/kernel/cpu/sh3/probe.c index f9c7df64eb01..295ec4c99e98 100644 --- a/arch/sh/kernel/cpu/sh3/probe.c +++ b/arch/sh/kernel/cpu/sh3/probe.c | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <asm/cache.h> | 16 | #include <asm/cache.h> |
17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
18 | 18 | ||
19 | int __uses_jump_to_uncached detect_cpu_and_cache_system(void) | 19 | int detect_cpu_and_cache_system(void) |
20 | { | 20 | { |
21 | unsigned long addr0, addr1, data0, data1, data2, data3; | 21 | unsigned long addr0, addr1, data0, data1, data2, data3; |
22 | 22 | ||
@@ -30,23 +30,23 @@ int __uses_jump_to_uncached detect_cpu_and_cache_system(void) | |||
30 | addr1 = CACHE_OC_ADDRESS_ARRAY + (1 << 12); | 30 | addr1 = CACHE_OC_ADDRESS_ARRAY + (1 << 12); |
31 | 31 | ||
32 | /* First, write back & invalidate */ | 32 | /* First, write back & invalidate */ |
33 | data0 = ctrl_inl(addr0); | 33 | data0 = __raw_readl(addr0); |
34 | ctrl_outl(data0&~(SH_CACHE_VALID|SH_CACHE_UPDATED), addr0); | 34 | __raw_writel(data0&~(SH_CACHE_VALID|SH_CACHE_UPDATED), addr0); |
35 | data1 = ctrl_inl(addr1); | 35 | data1 = __raw_readl(addr1); |
36 | ctrl_outl(data1&~(SH_CACHE_VALID|SH_CACHE_UPDATED), addr1); | 36 | __raw_writel(data1&~(SH_CACHE_VALID|SH_CACHE_UPDATED), addr1); |
37 | 37 | ||
38 | /* Next, check if there's shadow or not */ | 38 | /* Next, check if there's shadow or not */ |
39 | data0 = ctrl_inl(addr0); | 39 | data0 = __raw_readl(addr0); |
40 | data0 ^= SH_CACHE_VALID; | 40 | data0 ^= SH_CACHE_VALID; |
41 | ctrl_outl(data0, addr0); | 41 | __raw_writel(data0, addr0); |
42 | data1 = ctrl_inl(addr1); | 42 | data1 = __raw_readl(addr1); |
43 | data2 = data1 ^ SH_CACHE_VALID; | 43 | data2 = data1 ^ SH_CACHE_VALID; |
44 | ctrl_outl(data2, addr1); | 44 | __raw_writel(data2, addr1); |
45 | data3 = ctrl_inl(addr0); | 45 | data3 = __raw_readl(addr0); |
46 | 46 | ||
47 | /* Lastly, invaliate them. */ | 47 | /* Lastly, invaliate them. */ |
48 | ctrl_outl(data0&~SH_CACHE_VALID, addr0); | 48 | __raw_writel(data0&~SH_CACHE_VALID, addr0); |
49 | ctrl_outl(data2&~SH_CACHE_VALID, addr1); | 49 | __raw_writel(data2&~SH_CACHE_VALID, addr1); |
50 | 50 | ||
51 | back_to_cached(); | 51 | back_to_cached(); |
52 | 52 | ||
@@ -94,9 +94,9 @@ int __uses_jump_to_uncached detect_cpu_and_cache_system(void) | |||
94 | boot_cpu_data.dcache.way_incr = (1 << 13); | 94 | boot_cpu_data.dcache.way_incr = (1 << 13); |
95 | boot_cpu_data.dcache.entry_mask = 0x1ff0; | 95 | boot_cpu_data.dcache.entry_mask = 0x1ff0; |
96 | boot_cpu_data.dcache.sets = 512; | 96 | boot_cpu_data.dcache.sets = 512; |
97 | ctrl_outl(CCR_CACHE_32KB, CCR3_REG); | 97 | __raw_writel(CCR_CACHE_32KB, CCR3_REG); |
98 | #else | 98 | #else |
99 | ctrl_outl(CCR_CACHE_16KB, CCR3_REG); | 99 | __raw_writel(CCR_CACHE_16KB, CCR3_REG); |
100 | #endif | 100 | #endif |
101 | #endif | 101 | #endif |
102 | } | 102 | } |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh3.c b/arch/sh/kernel/cpu/sh3/setup-sh3.c index c98846857855..53be70b98116 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh3.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh3.c | |||
@@ -58,7 +58,7 @@ static DECLARE_INTC_DESC_ACK(intc_desc_irq45, "sh3-irq45", | |||
58 | void __init plat_irq_setup_pins(int mode) | 58 | void __init plat_irq_setup_pins(int mode) |
59 | { | 59 | { |
60 | if (mode == IRQ_MODE_IRQ) { | 60 | if (mode == IRQ_MODE_IRQ) { |
61 | ctrl_outw(ctrl_inw(INTC_ICR1) & ~INTC_ICR1_IRQLVL, INTC_ICR1); | 61 | __raw_writew(__raw_readw(INTC_ICR1) & ~INTC_ICR1_IRQLVL, INTC_ICR1); |
62 | register_intc_controller(&intc_desc_irq0123); | 62 | register_intc_controller(&intc_desc_irq0123); |
63 | return; | 63 | return; |
64 | } | 64 | } |
diff --git a/arch/sh/kernel/cpu/sh4/clock-sh4-202.c b/arch/sh/kernel/cpu/sh4/clock-sh4-202.c index 21421e34e7d5..6b80850294da 100644 --- a/arch/sh/kernel/cpu/sh4/clock-sh4-202.c +++ b/arch/sh/kernel/cpu/sh4/clock-sh4-202.c | |||
@@ -23,7 +23,7 @@ static int frqcr3_values[] = { 0, 1, 2, 3, 4, 5, 6 }; | |||
23 | 23 | ||
24 | static unsigned long emi_clk_recalc(struct clk *clk) | 24 | static unsigned long emi_clk_recalc(struct clk *clk) |
25 | { | 25 | { |
26 | int idx = ctrl_inl(CPG2_FRQCR3) & 0x0007; | 26 | int idx = __raw_readl(CPG2_FRQCR3) & 0x0007; |
27 | return clk->parent->rate / frqcr3_divisors[idx]; | 27 | return clk->parent->rate / frqcr3_divisors[idx]; |
28 | } | 28 | } |
29 | 29 | ||
@@ -52,7 +52,7 @@ static struct clk sh4202_emi_clk = { | |||
52 | 52 | ||
53 | static unsigned long femi_clk_recalc(struct clk *clk) | 53 | static unsigned long femi_clk_recalc(struct clk *clk) |
54 | { | 54 | { |
55 | int idx = (ctrl_inl(CPG2_FRQCR3) >> 3) & 0x0007; | 55 | int idx = (__raw_readl(CPG2_FRQCR3) >> 3) & 0x0007; |
56 | return clk->parent->rate / frqcr3_divisors[idx]; | 56 | return clk->parent->rate / frqcr3_divisors[idx]; |
57 | } | 57 | } |
58 | 58 | ||
@@ -92,7 +92,7 @@ static void shoc_clk_init(struct clk *clk) | |||
92 | 92 | ||
93 | static unsigned long shoc_clk_recalc(struct clk *clk) | 93 | static unsigned long shoc_clk_recalc(struct clk *clk) |
94 | { | 94 | { |
95 | int idx = (ctrl_inl(CPG2_FRQCR3) >> 6) & 0x0007; | 95 | int idx = (__raw_readl(CPG2_FRQCR3) >> 6) & 0x0007; |
96 | return clk->parent->rate / frqcr3_divisors[idx]; | 96 | return clk->parent->rate / frqcr3_divisors[idx]; |
97 | } | 97 | } |
98 | 98 | ||
@@ -122,10 +122,10 @@ static int shoc_clk_set_rate(struct clk *clk, unsigned long rate, int algo_id) | |||
122 | 122 | ||
123 | tmp = frqcr3_lookup(clk, rate); | 123 | tmp = frqcr3_lookup(clk, rate); |
124 | 124 | ||
125 | frqcr3 = ctrl_inl(CPG2_FRQCR3); | 125 | frqcr3 = __raw_readl(CPG2_FRQCR3); |
126 | frqcr3 &= ~(0x0007 << 6); | 126 | frqcr3 &= ~(0x0007 << 6); |
127 | frqcr3 |= tmp << 6; | 127 | frqcr3 |= tmp << 6; |
128 | ctrl_outl(frqcr3, CPG2_FRQCR3); | 128 | __raw_writel(frqcr3, CPG2_FRQCR3); |
129 | 129 | ||
130 | clk->rate = clk->parent->rate / frqcr3_divisors[tmp]; | 130 | clk->rate = clk->parent->rate / frqcr3_divisors[tmp]; |
131 | 131 | ||
diff --git a/arch/sh/kernel/cpu/sh4/clock-sh4.c b/arch/sh/kernel/cpu/sh4/clock-sh4.c index 73294d9cd049..5add75c1f539 100644 --- a/arch/sh/kernel/cpu/sh4/clock-sh4.c +++ b/arch/sh/kernel/cpu/sh4/clock-sh4.c | |||
@@ -28,7 +28,7 @@ static int pfc_divisors[] = { 2, 3, 4, 6, 8, 2, 2, 2 }; | |||
28 | 28 | ||
29 | static void master_clk_init(struct clk *clk) | 29 | static void master_clk_init(struct clk *clk) |
30 | { | 30 | { |
31 | clk->rate *= pfc_divisors[ctrl_inw(FRQCR) & 0x0007]; | 31 | clk->rate *= pfc_divisors[__raw_readw(FRQCR) & 0x0007]; |
32 | } | 32 | } |
33 | 33 | ||
34 | static struct clk_ops sh4_master_clk_ops = { | 34 | static struct clk_ops sh4_master_clk_ops = { |
@@ -37,7 +37,7 @@ static struct clk_ops sh4_master_clk_ops = { | |||
37 | 37 | ||
38 | static unsigned long module_clk_recalc(struct clk *clk) | 38 | static unsigned long module_clk_recalc(struct clk *clk) |
39 | { | 39 | { |
40 | int idx = (ctrl_inw(FRQCR) & 0x0007); | 40 | int idx = (__raw_readw(FRQCR) & 0x0007); |
41 | return clk->parent->rate / pfc_divisors[idx]; | 41 | return clk->parent->rate / pfc_divisors[idx]; |
42 | } | 42 | } |
43 | 43 | ||
@@ -47,7 +47,7 @@ static struct clk_ops sh4_module_clk_ops = { | |||
47 | 47 | ||
48 | static unsigned long bus_clk_recalc(struct clk *clk) | 48 | static unsigned long bus_clk_recalc(struct clk *clk) |
49 | { | 49 | { |
50 | int idx = (ctrl_inw(FRQCR) >> 3) & 0x0007; | 50 | int idx = (__raw_readw(FRQCR) >> 3) & 0x0007; |
51 | return clk->parent->rate / bfc_divisors[idx]; | 51 | return clk->parent->rate / bfc_divisors[idx]; |
52 | } | 52 | } |
53 | 53 | ||
@@ -57,7 +57,7 @@ static struct clk_ops sh4_bus_clk_ops = { | |||
57 | 57 | ||
58 | static unsigned long cpu_clk_recalc(struct clk *clk) | 58 | static unsigned long cpu_clk_recalc(struct clk *clk) |
59 | { | 59 | { |
60 | int idx = (ctrl_inw(FRQCR) >> 6) & 0x0007; | 60 | int idx = (__raw_readw(FRQCR) >> 6) & 0x0007; |
61 | return clk->parent->rate / ifc_divisors[idx]; | 61 | return clk->parent->rate / ifc_divisors[idx]; |
62 | } | 62 | } |
63 | 63 | ||
diff --git a/arch/sh/kernel/cpu/sh4/fpu.c b/arch/sh/kernel/cpu/sh4/fpu.c index e97857aec8a0..447482d7f65e 100644 --- a/arch/sh/kernel/cpu/sh4/fpu.c +++ b/arch/sh/kernel/cpu/sh4/fpu.c | |||
@@ -85,14 +85,14 @@ void save_fpu(struct task_struct *tsk) | |||
85 | "fmov.s fr1, @-%0\n\t" | 85 | "fmov.s fr1, @-%0\n\t" |
86 | "fmov.s fr0, @-%0\n\t" | 86 | "fmov.s fr0, @-%0\n\t" |
87 | "lds %3, fpscr\n\t":"=r" (dummy) | 87 | "lds %3, fpscr\n\t":"=r" (dummy) |
88 | :"0"((char *)(&tsk->thread.fpu.hard.status)), | 88 | :"0"((char *)(&tsk->thread.xstate->hardfpu.status)), |
89 | "r"(FPSCR_RCHG), "r"(FPSCR_INIT) | 89 | "r"(FPSCR_RCHG), "r"(FPSCR_INIT) |
90 | :"memory"); | 90 | :"memory"); |
91 | 91 | ||
92 | disable_fpu(); | 92 | disable_fpu(); |
93 | } | 93 | } |
94 | 94 | ||
95 | static void restore_fpu(struct task_struct *tsk) | 95 | void restore_fpu(struct task_struct *tsk) |
96 | { | 96 | { |
97 | unsigned long dummy; | 97 | unsigned long dummy; |
98 | 98 | ||
@@ -135,62 +135,11 @@ static void restore_fpu(struct task_struct *tsk) | |||
135 | "lds.l @%0+, fpscr\n\t" | 135 | "lds.l @%0+, fpscr\n\t" |
136 | "lds.l @%0+, fpul\n\t" | 136 | "lds.l @%0+, fpul\n\t" |
137 | :"=r" (dummy) | 137 | :"=r" (dummy) |
138 | :"0"(&tsk->thread.fpu), "r"(FPSCR_RCHG) | 138 | :"0" (tsk->thread.xstate), "r" (FPSCR_RCHG) |
139 | :"memory"); | 139 | :"memory"); |
140 | disable_fpu(); | 140 | disable_fpu(); |
141 | } | 141 | } |
142 | 142 | ||
143 | /* | ||
144 | * Load the FPU with signalling NANS. This bit pattern we're using | ||
145 | * has the property that no matter wether considered as single or as | ||
146 | * double precision represents signaling NANS. | ||
147 | */ | ||
148 | |||
149 | static void fpu_init(void) | ||
150 | { | ||
151 | enable_fpu(); | ||
152 | asm volatile ( "lds %0, fpul\n\t" | ||
153 | "lds %1, fpscr\n\t" | ||
154 | "fsts fpul, fr0\n\t" | ||
155 | "fsts fpul, fr1\n\t" | ||
156 | "fsts fpul, fr2\n\t" | ||
157 | "fsts fpul, fr3\n\t" | ||
158 | "fsts fpul, fr4\n\t" | ||
159 | "fsts fpul, fr5\n\t" | ||
160 | "fsts fpul, fr6\n\t" | ||
161 | "fsts fpul, fr7\n\t" | ||
162 | "fsts fpul, fr8\n\t" | ||
163 | "fsts fpul, fr9\n\t" | ||
164 | "fsts fpul, fr10\n\t" | ||
165 | "fsts fpul, fr11\n\t" | ||
166 | "fsts fpul, fr12\n\t" | ||
167 | "fsts fpul, fr13\n\t" | ||
168 | "fsts fpul, fr14\n\t" | ||
169 | "fsts fpul, fr15\n\t" | ||
170 | "frchg\n\t" | ||
171 | "fsts fpul, fr0\n\t" | ||
172 | "fsts fpul, fr1\n\t" | ||
173 | "fsts fpul, fr2\n\t" | ||
174 | "fsts fpul, fr3\n\t" | ||
175 | "fsts fpul, fr4\n\t" | ||
176 | "fsts fpul, fr5\n\t" | ||
177 | "fsts fpul, fr6\n\t" | ||
178 | "fsts fpul, fr7\n\t" | ||
179 | "fsts fpul, fr8\n\t" | ||
180 | "fsts fpul, fr9\n\t" | ||
181 | "fsts fpul, fr10\n\t" | ||
182 | "fsts fpul, fr11\n\t" | ||
183 | "fsts fpul, fr12\n\t" | ||
184 | "fsts fpul, fr13\n\t" | ||
185 | "fsts fpul, fr14\n\t" | ||
186 | "fsts fpul, fr15\n\t" | ||
187 | "frchg\n\t" | ||
188 | "lds %2, fpscr\n\t" | ||
189 | : /* no output */ | ||
190 | :"r" (0), "r"(FPSCR_RCHG), "r"(FPSCR_INIT)); | ||
191 | disable_fpu(); | ||
192 | } | ||
193 | |||
194 | /** | 143 | /** |
195 | * denormal_to_double - Given denormalized float number, | 144 | * denormal_to_double - Given denormalized float number, |
196 | * store double float | 145 | * store double float |
@@ -282,9 +231,9 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
282 | /* fcnvsd */ | 231 | /* fcnvsd */ |
283 | struct task_struct *tsk = current; | 232 | struct task_struct *tsk = current; |
284 | 233 | ||
285 | if ((tsk->thread.fpu.hard.fpscr & FPSCR_CAUSE_ERROR)) | 234 | if ((tsk->thread.xstate->hardfpu.fpscr & FPSCR_CAUSE_ERROR)) |
286 | /* FPU error */ | 235 | /* FPU error */ |
287 | denormal_to_double(&tsk->thread.fpu.hard, | 236 | denormal_to_double(&tsk->thread.xstate->hardfpu, |
288 | (finsn >> 8) & 0xf); | 237 | (finsn >> 8) & 0xf); |
289 | else | 238 | else |
290 | return 0; | 239 | return 0; |
@@ -300,9 +249,9 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
300 | 249 | ||
301 | n = (finsn >> 8) & 0xf; | 250 | n = (finsn >> 8) & 0xf; |
302 | m = (finsn >> 4) & 0xf; | 251 | m = (finsn >> 4) & 0xf; |
303 | hx = tsk->thread.fpu.hard.fp_regs[n]; | 252 | hx = tsk->thread.xstate->hardfpu.fp_regs[n]; |
304 | hy = tsk->thread.fpu.hard.fp_regs[m]; | 253 | hy = tsk->thread.xstate->hardfpu.fp_regs[m]; |
305 | fpscr = tsk->thread.fpu.hard.fpscr; | 254 | fpscr = tsk->thread.xstate->hardfpu.fpscr; |
306 | prec = fpscr & FPSCR_DBL_PRECISION; | 255 | prec = fpscr & FPSCR_DBL_PRECISION; |
307 | 256 | ||
308 | if ((fpscr & FPSCR_CAUSE_ERROR) | 257 | if ((fpscr & FPSCR_CAUSE_ERROR) |
@@ -312,18 +261,18 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
312 | 261 | ||
313 | /* FPU error because of denormal (doubles) */ | 262 | /* FPU error because of denormal (doubles) */ |
314 | llx = ((long long)hx << 32) | 263 | llx = ((long long)hx << 32) |
315 | | tsk->thread.fpu.hard.fp_regs[n + 1]; | 264 | | tsk->thread.xstate->hardfpu.fp_regs[n + 1]; |
316 | lly = ((long long)hy << 32) | 265 | lly = ((long long)hy << 32) |
317 | | tsk->thread.fpu.hard.fp_regs[m + 1]; | 266 | | tsk->thread.xstate->hardfpu.fp_regs[m + 1]; |
318 | llx = float64_mul(llx, lly); | 267 | llx = float64_mul(llx, lly); |
319 | tsk->thread.fpu.hard.fp_regs[n] = llx >> 32; | 268 | tsk->thread.xstate->hardfpu.fp_regs[n] = llx >> 32; |
320 | tsk->thread.fpu.hard.fp_regs[n + 1] = llx & 0xffffffff; | 269 | tsk->thread.xstate->hardfpu.fp_regs[n + 1] = llx & 0xffffffff; |
321 | } else if ((fpscr & FPSCR_CAUSE_ERROR) | 270 | } else if ((fpscr & FPSCR_CAUSE_ERROR) |
322 | && (!prec && ((hx & 0x7fffffff) < 0x00800000 | 271 | && (!prec && ((hx & 0x7fffffff) < 0x00800000 |
323 | || (hy & 0x7fffffff) < 0x00800000))) { | 272 | || (hy & 0x7fffffff) < 0x00800000))) { |
324 | /* FPU error because of denormal (floats) */ | 273 | /* FPU error because of denormal (floats) */ |
325 | hx = float32_mul(hx, hy); | 274 | hx = float32_mul(hx, hy); |
326 | tsk->thread.fpu.hard.fp_regs[n] = hx; | 275 | tsk->thread.xstate->hardfpu.fp_regs[n] = hx; |
327 | } else | 276 | } else |
328 | return 0; | 277 | return 0; |
329 | 278 | ||
@@ -338,9 +287,9 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
338 | 287 | ||
339 | n = (finsn >> 8) & 0xf; | 288 | n = (finsn >> 8) & 0xf; |
340 | m = (finsn >> 4) & 0xf; | 289 | m = (finsn >> 4) & 0xf; |
341 | hx = tsk->thread.fpu.hard.fp_regs[n]; | 290 | hx = tsk->thread.xstate->hardfpu.fp_regs[n]; |
342 | hy = tsk->thread.fpu.hard.fp_regs[m]; | 291 | hy = tsk->thread.xstate->hardfpu.fp_regs[m]; |
343 | fpscr = tsk->thread.fpu.hard.fpscr; | 292 | fpscr = tsk->thread.xstate->hardfpu.fpscr; |
344 | prec = fpscr & FPSCR_DBL_PRECISION; | 293 | prec = fpscr & FPSCR_DBL_PRECISION; |
345 | 294 | ||
346 | if ((fpscr & FPSCR_CAUSE_ERROR) | 295 | if ((fpscr & FPSCR_CAUSE_ERROR) |
@@ -350,15 +299,15 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
350 | 299 | ||
351 | /* FPU error because of denormal (doubles) */ | 300 | /* FPU error because of denormal (doubles) */ |
352 | llx = ((long long)hx << 32) | 301 | llx = ((long long)hx << 32) |
353 | | tsk->thread.fpu.hard.fp_regs[n + 1]; | 302 | | tsk->thread.xstate->hardfpu.fp_regs[n + 1]; |
354 | lly = ((long long)hy << 32) | 303 | lly = ((long long)hy << 32) |
355 | | tsk->thread.fpu.hard.fp_regs[m + 1]; | 304 | | tsk->thread.xstate->hardfpu.fp_regs[m + 1]; |
356 | if ((finsn & 0xf00f) == 0xf000) | 305 | if ((finsn & 0xf00f) == 0xf000) |
357 | llx = float64_add(llx, lly); | 306 | llx = float64_add(llx, lly); |
358 | else | 307 | else |
359 | llx = float64_sub(llx, lly); | 308 | llx = float64_sub(llx, lly); |
360 | tsk->thread.fpu.hard.fp_regs[n] = llx >> 32; | 309 | tsk->thread.xstate->hardfpu.fp_regs[n] = llx >> 32; |
361 | tsk->thread.fpu.hard.fp_regs[n + 1] = llx & 0xffffffff; | 310 | tsk->thread.xstate->hardfpu.fp_regs[n + 1] = llx & 0xffffffff; |
362 | } else if ((fpscr & FPSCR_CAUSE_ERROR) | 311 | } else if ((fpscr & FPSCR_CAUSE_ERROR) |
363 | && (!prec && ((hx & 0x7fffffff) < 0x00800000 | 312 | && (!prec && ((hx & 0x7fffffff) < 0x00800000 |
364 | || (hy & 0x7fffffff) < 0x00800000))) { | 313 | || (hy & 0x7fffffff) < 0x00800000))) { |
@@ -367,7 +316,7 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
367 | hx = float32_add(hx, hy); | 316 | hx = float32_add(hx, hy); |
368 | else | 317 | else |
369 | hx = float32_sub(hx, hy); | 318 | hx = float32_sub(hx, hy); |
370 | tsk->thread.fpu.hard.fp_regs[n] = hx; | 319 | tsk->thread.xstate->hardfpu.fp_regs[n] = hx; |
371 | } else | 320 | } else |
372 | return 0; | 321 | return 0; |
373 | 322 | ||
@@ -382,9 +331,9 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
382 | 331 | ||
383 | n = (finsn >> 8) & 0xf; | 332 | n = (finsn >> 8) & 0xf; |
384 | m = (finsn >> 4) & 0xf; | 333 | m = (finsn >> 4) & 0xf; |
385 | hx = tsk->thread.fpu.hard.fp_regs[n]; | 334 | hx = tsk->thread.xstate->hardfpu.fp_regs[n]; |
386 | hy = tsk->thread.fpu.hard.fp_regs[m]; | 335 | hy = tsk->thread.xstate->hardfpu.fp_regs[m]; |
387 | fpscr = tsk->thread.fpu.hard.fpscr; | 336 | fpscr = tsk->thread.xstate->hardfpu.fpscr; |
388 | prec = fpscr & FPSCR_DBL_PRECISION; | 337 | prec = fpscr & FPSCR_DBL_PRECISION; |
389 | 338 | ||
390 | if ((fpscr & FPSCR_CAUSE_ERROR) | 339 | if ((fpscr & FPSCR_CAUSE_ERROR) |
@@ -394,20 +343,20 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
394 | 343 | ||
395 | /* FPU error because of denormal (doubles) */ | 344 | /* FPU error because of denormal (doubles) */ |
396 | llx = ((long long)hx << 32) | 345 | llx = ((long long)hx << 32) |
397 | | tsk->thread.fpu.hard.fp_regs[n + 1]; | 346 | | tsk->thread.xstate->hardfpu.fp_regs[n + 1]; |
398 | lly = ((long long)hy << 32) | 347 | lly = ((long long)hy << 32) |
399 | | tsk->thread.fpu.hard.fp_regs[m + 1]; | 348 | | tsk->thread.xstate->hardfpu.fp_regs[m + 1]; |
400 | 349 | ||
401 | llx = float64_div(llx, lly); | 350 | llx = float64_div(llx, lly); |
402 | 351 | ||
403 | tsk->thread.fpu.hard.fp_regs[n] = llx >> 32; | 352 | tsk->thread.xstate->hardfpu.fp_regs[n] = llx >> 32; |
404 | tsk->thread.fpu.hard.fp_regs[n + 1] = llx & 0xffffffff; | 353 | tsk->thread.xstate->hardfpu.fp_regs[n + 1] = llx & 0xffffffff; |
405 | } else if ((fpscr & FPSCR_CAUSE_ERROR) | 354 | } else if ((fpscr & FPSCR_CAUSE_ERROR) |
406 | && (!prec && ((hx & 0x7fffffff) < 0x00800000 | 355 | && (!prec && ((hx & 0x7fffffff) < 0x00800000 |
407 | || (hy & 0x7fffffff) < 0x00800000))) { | 356 | || (hy & 0x7fffffff) < 0x00800000))) { |
408 | /* FPU error because of denormal (floats) */ | 357 | /* FPU error because of denormal (floats) */ |
409 | hx = float32_div(hx, hy); | 358 | hx = float32_div(hx, hy); |
410 | tsk->thread.fpu.hard.fp_regs[n] = hx; | 359 | tsk->thread.xstate->hardfpu.fp_regs[n] = hx; |
411 | } else | 360 | } else |
412 | return 0; | 361 | return 0; |
413 | 362 | ||
@@ -420,17 +369,17 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
420 | unsigned int hx; | 369 | unsigned int hx; |
421 | 370 | ||
422 | m = (finsn >> 8) & 0x7; | 371 | m = (finsn >> 8) & 0x7; |
423 | hx = tsk->thread.fpu.hard.fp_regs[m]; | 372 | hx = tsk->thread.xstate->hardfpu.fp_regs[m]; |
424 | 373 | ||
425 | if ((tsk->thread.fpu.hard.fpscr & FPSCR_CAUSE_ERROR) | 374 | if ((tsk->thread.xstate->hardfpu.fpscr & FPSCR_CAUSE_ERROR) |
426 | && ((hx & 0x7fffffff) < 0x00100000)) { | 375 | && ((hx & 0x7fffffff) < 0x00100000)) { |
427 | /* subnormal double to float conversion */ | 376 | /* subnormal double to float conversion */ |
428 | long long llx; | 377 | long long llx; |
429 | 378 | ||
430 | llx = ((long long)tsk->thread.fpu.hard.fp_regs[m] << 32) | 379 | llx = ((long long)tsk->thread.xstate->hardfpu.fp_regs[m] << 32) |
431 | | tsk->thread.fpu.hard.fp_regs[m + 1]; | 380 | | tsk->thread.xstate->hardfpu.fp_regs[m + 1]; |
432 | 381 | ||
433 | tsk->thread.fpu.hard.fpul = float64_to_float32(llx); | 382 | tsk->thread.xstate->hardfpu.fpul = float64_to_float32(llx); |
434 | } else | 383 | } else |
435 | return 0; | 384 | return 0; |
436 | 385 | ||
@@ -449,7 +398,7 @@ void float_raise(unsigned int flags) | |||
449 | int float_rounding_mode(void) | 398 | int float_rounding_mode(void) |
450 | { | 399 | { |
451 | struct task_struct *tsk = current; | 400 | struct task_struct *tsk = current; |
452 | int roundingMode = FPSCR_ROUNDING_MODE(tsk->thread.fpu.hard.fpscr); | 401 | int roundingMode = FPSCR_ROUNDING_MODE(tsk->thread.xstate->hardfpu.fpscr); |
453 | return roundingMode; | 402 | return roundingMode; |
454 | } | 403 | } |
455 | 404 | ||
@@ -461,16 +410,16 @@ BUILD_TRAP_HANDLER(fpu_error) | |||
461 | __unlazy_fpu(tsk, regs); | 410 | __unlazy_fpu(tsk, regs); |
462 | fpu_exception_flags = 0; | 411 | fpu_exception_flags = 0; |
463 | if (ieee_fpe_handler(regs)) { | 412 | if (ieee_fpe_handler(regs)) { |
464 | tsk->thread.fpu.hard.fpscr &= | 413 | tsk->thread.xstate->hardfpu.fpscr &= |
465 | ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); | 414 | ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); |
466 | tsk->thread.fpu.hard.fpscr |= fpu_exception_flags; | 415 | tsk->thread.xstate->hardfpu.fpscr |= fpu_exception_flags; |
467 | /* Set the FPSCR flag as well as cause bits - simply | 416 | /* Set the FPSCR flag as well as cause bits - simply |
468 | * replicate the cause */ | 417 | * replicate the cause */ |
469 | tsk->thread.fpu.hard.fpscr |= (fpu_exception_flags >> 10); | 418 | tsk->thread.xstate->hardfpu.fpscr |= (fpu_exception_flags >> 10); |
470 | grab_fpu(regs); | 419 | grab_fpu(regs); |
471 | restore_fpu(tsk); | 420 | restore_fpu(tsk); |
472 | task_thread_info(tsk)->status |= TS_USEDFPU; | 421 | task_thread_info(tsk)->status |= TS_USEDFPU; |
473 | if ((((tsk->thread.fpu.hard.fpscr & FPSCR_ENABLE_MASK) >> 7) & | 422 | if ((((tsk->thread.xstate->hardfpu.fpscr & FPSCR_ENABLE_MASK) >> 7) & |
474 | (fpu_exception_flags >> 2)) == 0) { | 423 | (fpu_exception_flags >> 2)) == 0) { |
475 | return; | 424 | return; |
476 | } | 425 | } |
@@ -478,33 +427,3 @@ BUILD_TRAP_HANDLER(fpu_error) | |||
478 | 427 | ||
479 | force_sig(SIGFPE, tsk); | 428 | force_sig(SIGFPE, tsk); |
480 | } | 429 | } |
481 | |||
482 | void fpu_state_restore(struct pt_regs *regs) | ||
483 | { | ||
484 | struct task_struct *tsk = current; | ||
485 | |||
486 | grab_fpu(regs); | ||
487 | if (unlikely(!user_mode(regs))) { | ||
488 | printk(KERN_ERR "BUG: FPU is used in kernel mode.\n"); | ||
489 | BUG(); | ||
490 | return; | ||
491 | } | ||
492 | |||
493 | if (likely(used_math())) { | ||
494 | /* Using the FPU again. */ | ||
495 | restore_fpu(tsk); | ||
496 | } else { | ||
497 | /* First time FPU user. */ | ||
498 | fpu_init(); | ||
499 | set_used_math(); | ||
500 | } | ||
501 | task_thread_info(tsk)->status |= TS_USEDFPU; | ||
502 | tsk->fpu_counter++; | ||
503 | } | ||
504 | |||
505 | BUILD_TRAP_HANDLER(fpu_state_restore) | ||
506 | { | ||
507 | TRAP_HANDLER_DECL; | ||
508 | |||
509 | fpu_state_restore(regs); | ||
510 | } | ||
diff --git a/arch/sh/kernel/cpu/sh4/probe.c b/arch/sh/kernel/cpu/sh4/probe.c index d36f0c45f55f..822977a06d84 100644 --- a/arch/sh/kernel/cpu/sh4/probe.c +++ b/arch/sh/kernel/cpu/sh4/probe.c | |||
@@ -28,9 +28,9 @@ int __init detect_cpu_and_cache_system(void) | |||
28 | [9] = (1 << 16) | 28 | [9] = (1 << 16) |
29 | }; | 29 | }; |
30 | 30 | ||
31 | pvr = (ctrl_inl(CCN_PVR) >> 8) & 0xffffff; | 31 | pvr = (__raw_readl(CCN_PVR) >> 8) & 0xffffff; |
32 | prr = (ctrl_inl(CCN_PRR) >> 4) & 0xff; | 32 | prr = (__raw_readl(CCN_PRR) >> 4) & 0xff; |
33 | cvr = (ctrl_inl(CCN_CVR)); | 33 | cvr = (__raw_readl(CCN_CVR)); |
34 | 34 | ||
35 | /* | 35 | /* |
36 | * Setup some sane SH-4 defaults for the icache | 36 | * Setup some sane SH-4 defaults for the icache |
@@ -71,11 +71,11 @@ int __init detect_cpu_and_cache_system(void) | |||
71 | boot_cpu_data.dcache.ways = 4; | 71 | boot_cpu_data.dcache.ways = 4; |
72 | } else { | 72 | } else { |
73 | /* And some SH-4 defaults.. */ | 73 | /* And some SH-4 defaults.. */ |
74 | boot_cpu_data.flags |= CPU_HAS_PTEA; | 74 | boot_cpu_data.flags |= CPU_HAS_PTEA | CPU_HAS_FPU; |
75 | boot_cpu_data.family = CPU_FAMILY_SH4; | 75 | boot_cpu_data.family = CPU_FAMILY_SH4; |
76 | } | 76 | } |
77 | 77 | ||
78 | /* FPU detection works for everyone */ | 78 | /* FPU detection works for almost everyone */ |
79 | if ((cvr & 0x20000000)) | 79 | if ((cvr & 0x20000000)) |
80 | boot_cpu_data.flags |= CPU_HAS_FPU; | 80 | boot_cpu_data.flags |= CPU_HAS_FPU; |
81 | 81 | ||
@@ -124,6 +124,7 @@ int __init detect_cpu_and_cache_system(void) | |||
124 | boot_cpu_data.type = CPU_SH7785; | 124 | boot_cpu_data.type = CPU_SH7785; |
125 | break; | 125 | break; |
126 | case 0x4004: | 126 | case 0x4004: |
127 | case 0x4005: | ||
127 | boot_cpu_data.type = CPU_SH7786; | 128 | boot_cpu_data.type = CPU_SH7786; |
128 | boot_cpu_data.flags |= CPU_HAS_PTEAEX | CPU_HAS_L2_CACHE; | 129 | boot_cpu_data.flags |= CPU_HAS_PTEAEX | CPU_HAS_L2_CACHE; |
129 | break; | 130 | break; |
@@ -160,6 +161,7 @@ int __init detect_cpu_and_cache_system(void) | |||
160 | break; | 161 | break; |
161 | case 0x700: | 162 | case 0x700: |
162 | boot_cpu_data.type = CPU_SH4_501; | 163 | boot_cpu_data.type = CPU_SH4_501; |
164 | boot_cpu_data.flags &= ~CPU_HAS_FPU; | ||
163 | boot_cpu_data.icache.ways = 2; | 165 | boot_cpu_data.icache.ways = 2; |
164 | boot_cpu_data.dcache.ways = 2; | 166 | boot_cpu_data.dcache.ways = 2; |
165 | break; | 167 | break; |
@@ -227,7 +229,7 @@ int __init detect_cpu_and_cache_system(void) | |||
227 | * Size calculation is much more sensible | 229 | * Size calculation is much more sensible |
228 | * than it is for the L1. | 230 | * than it is for the L1. |
229 | * | 231 | * |
230 | * Sizes are 128KB, 258KB, 512KB, and 1MB. | 232 | * Sizes are 128KB, 256KB, 512KB, and 1MB. |
231 | */ | 233 | */ |
232 | size = (cvr & 0xf) << 17; | 234 | size = (cvr & 0xf) << 17; |
233 | 235 | ||
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh4-202.c b/arch/sh/kernel/cpu/sh4/setup-sh4-202.c index 4b733715cdb5..b9b7e10ad68f 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh4-202.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh4-202.c | |||
@@ -198,7 +198,7 @@ void __init plat_irq_setup_pins(int mode) | |||
198 | { | 198 | { |
199 | switch (mode) { | 199 | switch (mode) { |
200 | case IRQ_MODE_IRQ: /* individual interrupt mode for IRL3-0 */ | 200 | case IRQ_MODE_IRQ: /* individual interrupt mode for IRL3-0 */ |
201 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); | 201 | __raw_writew(__raw_readw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); |
202 | register_intc_controller(&intc_desc_irlm); | 202 | register_intc_controller(&intc_desc_irlm); |
203 | break; | 203 | break; |
204 | default: | 204 | default: |
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7750.c b/arch/sh/kernel/cpu/sh4/setup-sh7750.c index b2a9df1af64c..ffd79e57254f 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7750.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7750.c | |||
@@ -442,7 +442,7 @@ void __init plat_irq_setup_pins(int mode) | |||
442 | 442 | ||
443 | switch (mode) { | 443 | switch (mode) { |
444 | case IRQ_MODE_IRQ: /* individual interrupt mode for IRL3-0 */ | 444 | case IRQ_MODE_IRQ: /* individual interrupt mode for IRL3-0 */ |
445 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); | 445 | __raw_writew(__raw_readw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); |
446 | register_intc_controller(&intc_desc_irlm); | 446 | register_intc_controller(&intc_desc_irlm); |
447 | break; | 447 | break; |
448 | default: | 448 | default: |
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7760.c b/arch/sh/kernel/cpu/sh4/setup-sh7760.c index 5b74cc0b43da..a16eb3656f4b 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7760.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7760.c | |||
@@ -319,7 +319,7 @@ void __init plat_irq_setup_pins(int mode) | |||
319 | { | 319 | { |
320 | switch (mode) { | 320 | switch (mode) { |
321 | case IRQ_MODE_IRQ: | 321 | case IRQ_MODE_IRQ: |
322 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); | 322 | __raw_writew(__raw_readw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); |
323 | register_intc_controller(&intc_desc_irq); | 323 | register_intc_controller(&intc_desc_irq); |
324 | break; | 324 | break; |
325 | default: | 325 | default: |
diff --git a/arch/sh/kernel/cpu/sh4/sq.c b/arch/sh/kernel/cpu/sh4/sq.c index 8a8a993f55ea..fc065f9da6e5 100644 --- a/arch/sh/kernel/cpu/sh4/sq.c +++ b/arch/sh/kernel/cpu/sh4/sq.c | |||
@@ -43,9 +43,9 @@ static unsigned long *sq_bitmap; | |||
43 | 43 | ||
44 | #define store_queue_barrier() \ | 44 | #define store_queue_barrier() \ |
45 | do { \ | 45 | do { \ |
46 | (void)ctrl_inl(P4SEG_STORE_QUE); \ | 46 | (void)__raw_readl(P4SEG_STORE_QUE); \ |
47 | ctrl_outl(0, P4SEG_STORE_QUE + 0); \ | 47 | __raw_writel(0, P4SEG_STORE_QUE + 0); \ |
48 | ctrl_outl(0, P4SEG_STORE_QUE + 8); \ | 48 | __raw_writel(0, P4SEG_STORE_QUE + 8); \ |
49 | } while (0); | 49 | } while (0); |
50 | 50 | ||
51 | /** | 51 | /** |
@@ -100,7 +100,7 @@ static inline void sq_mapping_list_del(struct sq_mapping *map) | |||
100 | spin_unlock_irq(&sq_mapping_lock); | 100 | spin_unlock_irq(&sq_mapping_lock); |
101 | } | 101 | } |
102 | 102 | ||
103 | static int __sq_remap(struct sq_mapping *map, unsigned long flags) | 103 | static int __sq_remap(struct sq_mapping *map, pgprot_t prot) |
104 | { | 104 | { |
105 | #if defined(CONFIG_MMU) | 105 | #if defined(CONFIG_MMU) |
106 | struct vm_struct *vma; | 106 | struct vm_struct *vma; |
@@ -113,7 +113,7 @@ static int __sq_remap(struct sq_mapping *map, unsigned long flags) | |||
113 | 113 | ||
114 | if (ioremap_page_range((unsigned long)vma->addr, | 114 | if (ioremap_page_range((unsigned long)vma->addr, |
115 | (unsigned long)vma->addr + map->size, | 115 | (unsigned long)vma->addr + map->size, |
116 | vma->phys_addr, __pgprot(flags))) { | 116 | vma->phys_addr, prot)) { |
117 | vunmap(vma->addr); | 117 | vunmap(vma->addr); |
118 | return -EAGAIN; | 118 | return -EAGAIN; |
119 | } | 119 | } |
@@ -123,8 +123,8 @@ static int __sq_remap(struct sq_mapping *map, unsigned long flags) | |||
123 | * straightforward, as we can just load up each queue's QACR with | 123 | * straightforward, as we can just load up each queue's QACR with |
124 | * the physical address appropriately masked. | 124 | * the physical address appropriately masked. |
125 | */ | 125 | */ |
126 | ctrl_outl(((map->addr >> 26) << 2) & 0x1c, SQ_QACR0); | 126 | __raw_writel(((map->addr >> 26) << 2) & 0x1c, SQ_QACR0); |
127 | ctrl_outl(((map->addr >> 26) << 2) & 0x1c, SQ_QACR1); | 127 | __raw_writel(((map->addr >> 26) << 2) & 0x1c, SQ_QACR1); |
128 | #endif | 128 | #endif |
129 | 129 | ||
130 | return 0; | 130 | return 0; |
@@ -135,14 +135,14 @@ static int __sq_remap(struct sq_mapping *map, unsigned long flags) | |||
135 | * @phys: Physical address of mapping. | 135 | * @phys: Physical address of mapping. |
136 | * @size: Length of mapping. | 136 | * @size: Length of mapping. |
137 | * @name: User invoking mapping. | 137 | * @name: User invoking mapping. |
138 | * @flags: Protection flags. | 138 | * @prot: Protection bits. |
139 | * | 139 | * |
140 | * Remaps the physical address @phys through the next available store queue | 140 | * Remaps the physical address @phys through the next available store queue |
141 | * address of @size length. @name is logged at boot time as well as through | 141 | * address of @size length. @name is logged at boot time as well as through |
142 | * the sysfs interface. | 142 | * the sysfs interface. |
143 | */ | 143 | */ |
144 | unsigned long sq_remap(unsigned long phys, unsigned int size, | 144 | unsigned long sq_remap(unsigned long phys, unsigned int size, |
145 | const char *name, unsigned long flags) | 145 | const char *name, pgprot_t prot) |
146 | { | 146 | { |
147 | struct sq_mapping *map; | 147 | struct sq_mapping *map; |
148 | unsigned long end; | 148 | unsigned long end; |
@@ -177,7 +177,7 @@ unsigned long sq_remap(unsigned long phys, unsigned int size, | |||
177 | 177 | ||
178 | map->sq_addr = P4SEG_STORE_QUE + (page << PAGE_SHIFT); | 178 | map->sq_addr = P4SEG_STORE_QUE + (page << PAGE_SHIFT); |
179 | 179 | ||
180 | ret = __sq_remap(map, pgprot_val(PAGE_KERNEL_NOCACHE) | flags); | 180 | ret = __sq_remap(map, prot); |
181 | if (unlikely(ret != 0)) | 181 | if (unlikely(ret != 0)) |
182 | goto out; | 182 | goto out; |
183 | 183 | ||
@@ -309,8 +309,7 @@ static ssize_t mapping_store(const char *buf, size_t count) | |||
309 | return -EIO; | 309 | return -EIO; |
310 | 310 | ||
311 | if (likely(len)) { | 311 | if (likely(len)) { |
312 | int ret = sq_remap(base, len, "Userspace", | 312 | int ret = sq_remap(base, len, "Userspace", PAGE_SHARED); |
313 | pgprot_val(PAGE_SHARED)); | ||
314 | if (ret < 0) | 313 | if (ret < 0) |
315 | return ret; | 314 | return ret; |
316 | } else | 315 | } else |
diff --git a/arch/sh/kernel/cpu/sh4a/Makefile b/arch/sh/kernel/cpu/sh4a/Makefile index 33bab477d2e2..b144e8af89dc 100644 --- a/arch/sh/kernel/cpu/sh4a/Makefile +++ b/arch/sh/kernel/cpu/sh4a/Makefile | |||
@@ -41,7 +41,8 @@ pinmux-$(CONFIG_CPU_SUBTYPE_SH7757) := pinmux-sh7757.o | |||
41 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7785) := pinmux-sh7785.o | 41 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7785) := pinmux-sh7785.o |
42 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7786) := pinmux-sh7786.o | 42 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7786) := pinmux-sh7786.o |
43 | 43 | ||
44 | obj-y += $(clock-y) | 44 | obj-y += $(clock-y) |
45 | obj-$(CONFIG_SMP) += $(smp-y) | 45 | obj-$(CONFIG_SMP) += $(smp-y) |
46 | obj-$(CONFIG_GENERIC_GPIO) += $(pinmux-y) | 46 | obj-$(CONFIG_GENERIC_GPIO) += $(pinmux-y) |
47 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o | 47 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o |
48 | obj-$(CONFIG_HAVE_HW_BREAKPOINT) += ubc.o | ||
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7343.c b/arch/sh/kernel/cpu/sh4a/clock-sh7343.c index 0ee3ee861252..2c16df37eda6 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7343.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7343.c | |||
@@ -107,13 +107,17 @@ struct clk *main_clks[] = { | |||
107 | static int multipliers[] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; | 107 | static int multipliers[] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; |
108 | static int divisors[] = { 1, 3, 2, 5, 3, 4, 5, 6, 8, 10, 12, 16, 20 }; | 108 | static int divisors[] = { 1, 3, 2, 5, 3, 4, 5, 6, 8, 10, 12, 16, 20 }; |
109 | 109 | ||
110 | static struct clk_div_mult_table div4_table = { | 110 | static struct clk_div_mult_table div4_div_mult_table = { |
111 | .divisors = divisors, | 111 | .divisors = divisors, |
112 | .nr_divisors = ARRAY_SIZE(divisors), | 112 | .nr_divisors = ARRAY_SIZE(divisors), |
113 | .multipliers = multipliers, | 113 | .multipliers = multipliers, |
114 | .nr_multipliers = ARRAY_SIZE(multipliers), | 114 | .nr_multipliers = ARRAY_SIZE(multipliers), |
115 | }; | 115 | }; |
116 | 116 | ||
117 | static struct clk_div4_table div4_table = { | ||
118 | .div_mult_table = &div4_div_mult_table, | ||
119 | }; | ||
120 | |||
117 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_B3, DIV4_P, | 121 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_B3, DIV4_P, |
118 | DIV4_SIUA, DIV4_SIUB, DIV4_NR }; | 122 | DIV4_SIUA, DIV4_SIUB, DIV4_NR }; |
119 | 123 | ||
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7366.c b/arch/sh/kernel/cpu/sh4a/clock-sh7366.c index a95ebaba095c..91588d280cd8 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7366.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7366.c | |||
@@ -110,13 +110,17 @@ struct clk *main_clks[] = { | |||
110 | static int multipliers[] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; | 110 | static int multipliers[] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; |
111 | static int divisors[] = { 1, 3, 2, 5, 3, 4, 5, 6, 8, 10, 12, 16, 20 }; | 111 | static int divisors[] = { 1, 3, 2, 5, 3, 4, 5, 6, 8, 10, 12, 16, 20 }; |
112 | 112 | ||
113 | static struct clk_div_mult_table div4_table = { | 113 | static struct clk_div_mult_table div4_div_mult_table = { |
114 | .divisors = divisors, | 114 | .divisors = divisors, |
115 | .nr_divisors = ARRAY_SIZE(divisors), | 115 | .nr_divisors = ARRAY_SIZE(divisors), |
116 | .multipliers = multipliers, | 116 | .multipliers = multipliers, |
117 | .nr_multipliers = ARRAY_SIZE(multipliers), | 117 | .nr_multipliers = ARRAY_SIZE(multipliers), |
118 | }; | 118 | }; |
119 | 119 | ||
120 | static struct clk_div4_table div4_table = { | ||
121 | .div_mult_table = &div4_div_mult_table, | ||
122 | }; | ||
123 | |||
120 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_B3, DIV4_P, | 124 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_B3, DIV4_P, |
121 | DIV4_SIUA, DIV4_SIUB, DIV4_NR }; | 125 | DIV4_SIUA, DIV4_SIUB, DIV4_NR }; |
122 | 126 | ||
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7722.c b/arch/sh/kernel/cpu/sh4a/clock-sh7722.c index ea38b554dc05..15db6d521c5c 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7722.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7722.c | |||
@@ -110,19 +110,22 @@ struct clk *main_clks[] = { | |||
110 | static int multipliers[] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; | 110 | static int multipliers[] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; |
111 | static int divisors[] = { 1, 3, 2, 5, 3, 4, 5, 6, 8, 10, 12, 16, 20 }; | 111 | static int divisors[] = { 1, 3, 2, 5, 3, 4, 5, 6, 8, 10, 12, 16, 20 }; |
112 | 112 | ||
113 | static struct clk_div_mult_table div4_table = { | 113 | static struct clk_div_mult_table div4_div_mult_table = { |
114 | .divisors = divisors, | 114 | .divisors = divisors, |
115 | .nr_divisors = ARRAY_SIZE(divisors), | 115 | .nr_divisors = ARRAY_SIZE(divisors), |
116 | .multipliers = multipliers, | 116 | .multipliers = multipliers, |
117 | .nr_multipliers = ARRAY_SIZE(multipliers), | 117 | .nr_multipliers = ARRAY_SIZE(multipliers), |
118 | }; | 118 | }; |
119 | 119 | ||
120 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_B3, DIV4_P, | 120 | static struct clk_div4_table div4_table = { |
121 | DIV4_SIUA, DIV4_SIUB, DIV4_IRDA, DIV4_NR }; | 121 | .div_mult_table = &div4_div_mult_table, |
122 | }; | ||
122 | 123 | ||
123 | #define DIV4(_str, _reg, _bit, _mask, _flags) \ | 124 | #define DIV4(_str, _reg, _bit, _mask, _flags) \ |
124 | SH_CLK_DIV4(_str, &pll_clk, _reg, _bit, _mask, _flags) | 125 | SH_CLK_DIV4(_str, &pll_clk, _reg, _bit, _mask, _flags) |
125 | 126 | ||
127 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_B3, DIV4_P, DIV4_NR }; | ||
128 | |||
126 | struct clk div4_clks[DIV4_NR] = { | 129 | struct clk div4_clks[DIV4_NR] = { |
127 | [DIV4_I] = DIV4("cpu_clk", FRQCR, 20, 0x1fef, CLK_ENABLE_ON_INIT), | 130 | [DIV4_I] = DIV4("cpu_clk", FRQCR, 20, 0x1fef, CLK_ENABLE_ON_INIT), |
128 | [DIV4_U] = DIV4("umem_clk", FRQCR, 16, 0x1fff, CLK_ENABLE_ON_INIT), | 131 | [DIV4_U] = DIV4("umem_clk", FRQCR, 16, 0x1fff, CLK_ENABLE_ON_INIT), |
@@ -130,9 +133,19 @@ struct clk div4_clks[DIV4_NR] = { | |||
130 | [DIV4_B] = DIV4("bus_clk", FRQCR, 8, 0x1fff, CLK_ENABLE_ON_INIT), | 133 | [DIV4_B] = DIV4("bus_clk", FRQCR, 8, 0x1fff, CLK_ENABLE_ON_INIT), |
131 | [DIV4_B3] = DIV4("b3_clk", FRQCR, 4, 0x1fff, CLK_ENABLE_ON_INIT), | 134 | [DIV4_B3] = DIV4("b3_clk", FRQCR, 4, 0x1fff, CLK_ENABLE_ON_INIT), |
132 | [DIV4_P] = DIV4("peripheral_clk", FRQCR, 0, 0x1fff, 0), | 135 | [DIV4_P] = DIV4("peripheral_clk", FRQCR, 0, 0x1fff, 0), |
136 | }; | ||
137 | |||
138 | enum { DIV4_IRDA, DIV4_ENABLE_NR }; | ||
139 | |||
140 | struct clk div4_enable_clks[DIV4_ENABLE_NR] = { | ||
141 | [DIV4_IRDA] = DIV4("irda_clk", IRDACLKCR, 0, 0x1fff, 0), | ||
142 | }; | ||
143 | |||
144 | enum { DIV4_SIUA, DIV4_SIUB, DIV4_REPARENT_NR }; | ||
145 | |||
146 | struct clk div4_reparent_clks[DIV4_REPARENT_NR] = { | ||
133 | [DIV4_SIUA] = DIV4("siua_clk", SCLKACR, 0, 0x1fff, 0), | 147 | [DIV4_SIUA] = DIV4("siua_clk", SCLKACR, 0, 0x1fff, 0), |
134 | [DIV4_SIUB] = DIV4("siub_clk", SCLKBCR, 0, 0x1fff, 0), | 148 | [DIV4_SIUB] = DIV4("siub_clk", SCLKBCR, 0, 0x1fff, 0), |
135 | [DIV4_IRDA] = DIV4("irda_clk", IRDACLKCR, 0, 0x1fff, 0), | ||
136 | }; | 149 | }; |
137 | 150 | ||
138 | struct clk div6_clks[] = { | 151 | struct clk div6_clks[] = { |
@@ -189,6 +202,14 @@ int __init arch_clk_init(void) | |||
189 | ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table); | 202 | ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table); |
190 | 203 | ||
191 | if (!ret) | 204 | if (!ret) |
205 | ret = sh_clk_div4_enable_register(div4_enable_clks, | ||
206 | DIV4_ENABLE_NR, &div4_table); | ||
207 | |||
208 | if (!ret) | ||
209 | ret = sh_clk_div4_reparent_register(div4_reparent_clks, | ||
210 | DIV4_REPARENT_NR, &div4_table); | ||
211 | |||
212 | if (!ret) | ||
192 | ret = sh_clk_div6_register(div6_clks, ARRAY_SIZE(div6_clks)); | 213 | ret = sh_clk_div6_register(div6_clks, ARRAY_SIZE(div6_clks)); |
193 | 214 | ||
194 | if (!ret) | 215 | if (!ret) |
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7723.c b/arch/sh/kernel/cpu/sh4a/clock-sh7723.c index 20a31c2255a8..50babe01fe44 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7723.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7723.c | |||
@@ -110,15 +110,18 @@ struct clk *main_clks[] = { | |||
110 | static int multipliers[] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; | 110 | static int multipliers[] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; |
111 | static int divisors[] = { 1, 3, 2, 5, 3, 4, 5, 6, 8, 10, 12, 16, 20 }; | 111 | static int divisors[] = { 1, 3, 2, 5, 3, 4, 5, 6, 8, 10, 12, 16, 20 }; |
112 | 112 | ||
113 | static struct clk_div_mult_table div4_table = { | 113 | static struct clk_div_mult_table div4_div_mult_table = { |
114 | .divisors = divisors, | 114 | .divisors = divisors, |
115 | .nr_divisors = ARRAY_SIZE(divisors), | 115 | .nr_divisors = ARRAY_SIZE(divisors), |
116 | .multipliers = multipliers, | 116 | .multipliers = multipliers, |
117 | .nr_multipliers = ARRAY_SIZE(multipliers), | 117 | .nr_multipliers = ARRAY_SIZE(multipliers), |
118 | }; | 118 | }; |
119 | 119 | ||
120 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_B3, DIV4_P, | 120 | static struct clk_div4_table div4_table = { |
121 | DIV4_SIUA, DIV4_SIUB, DIV4_IRDA, DIV4_NR }; | 121 | .div_mult_table = &div4_div_mult_table, |
122 | }; | ||
123 | |||
124 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_B3, DIV4_P, DIV4_NR }; | ||
122 | 125 | ||
123 | #define DIV4(_str, _reg, _bit, _mask, _flags) \ | 126 | #define DIV4(_str, _reg, _bit, _mask, _flags) \ |
124 | SH_CLK_DIV4(_str, &pll_clk, _reg, _bit, _mask, _flags) | 127 | SH_CLK_DIV4(_str, &pll_clk, _reg, _bit, _mask, _flags) |
@@ -130,11 +133,20 @@ struct clk div4_clks[DIV4_NR] = { | |||
130 | [DIV4_B] = DIV4("bus_clk", FRQCR, 8, 0x0dbf, CLK_ENABLE_ON_INIT), | 133 | [DIV4_B] = DIV4("bus_clk", FRQCR, 8, 0x0dbf, CLK_ENABLE_ON_INIT), |
131 | [DIV4_B3] = DIV4("b3_clk", FRQCR, 4, 0x0db4, CLK_ENABLE_ON_INIT), | 134 | [DIV4_B3] = DIV4("b3_clk", FRQCR, 4, 0x0db4, CLK_ENABLE_ON_INIT), |
132 | [DIV4_P] = DIV4("peripheral_clk", FRQCR, 0, 0x0dbf, 0), | 135 | [DIV4_P] = DIV4("peripheral_clk", FRQCR, 0, 0x0dbf, 0), |
133 | [DIV4_SIUA] = DIV4("siua_clk", SCLKACR, 0, 0x0dbf, 0), | 136 | }; |
134 | [DIV4_SIUB] = DIV4("siub_clk", SCLKBCR, 0, 0x0dbf, 0), | 137 | |
138 | enum { DIV4_IRDA, DIV4_ENABLE_NR }; | ||
139 | |||
140 | struct clk div4_enable_clks[DIV4_ENABLE_NR] = { | ||
135 | [DIV4_IRDA] = DIV4("irda_clk", IRDACLKCR, 0, 0x0dbf, 0), | 141 | [DIV4_IRDA] = DIV4("irda_clk", IRDACLKCR, 0, 0x0dbf, 0), |
136 | }; | 142 | }; |
137 | 143 | ||
144 | enum { DIV4_SIUA, DIV4_SIUB, DIV4_REPARENT_NR }; | ||
145 | |||
146 | struct clk div4_reparent_clks[DIV4_REPARENT_NR] = { | ||
147 | [DIV4_SIUA] = DIV4("siua_clk", SCLKACR, 0, 0x0dbf, 0), | ||
148 | [DIV4_SIUB] = DIV4("siub_clk", SCLKBCR, 0, 0x0dbf, 0), | ||
149 | }; | ||
138 | struct clk div6_clks[] = { | 150 | struct clk div6_clks[] = { |
139 | SH_CLK_DIV6("video_clk", &pll_clk, VCLKCR, 0), | 151 | SH_CLK_DIV6("video_clk", &pll_clk, VCLKCR, 0), |
140 | }; | 152 | }; |
@@ -216,6 +228,14 @@ int __init arch_clk_init(void) | |||
216 | ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table); | 228 | ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table); |
217 | 229 | ||
218 | if (!ret) | 230 | if (!ret) |
231 | ret = sh_clk_div4_enable_register(div4_enable_clks, | ||
232 | DIV4_ENABLE_NR, &div4_table); | ||
233 | |||
234 | if (!ret) | ||
235 | ret = sh_clk_div4_reparent_register(div4_reparent_clks, | ||
236 | DIV4_REPARENT_NR, &div4_table); | ||
237 | |||
238 | if (!ret) | ||
219 | ret = sh_clk_div6_register(div6_clks, ARRAY_SIZE(div6_clks)); | 239 | ret = sh_clk_div6_register(div6_clks, ARRAY_SIZE(div6_clks)); |
220 | 240 | ||
221 | if (!ret) | 241 | if (!ret) |
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7724.c b/arch/sh/kernel/cpu/sh4a/clock-sh7724.c index 9db743802f06..6707061fbf54 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7724.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7724.c | |||
@@ -127,13 +127,28 @@ struct clk *main_clks[] = { | |||
127 | &div3_clk, | 127 | &div3_clk, |
128 | }; | 128 | }; |
129 | 129 | ||
130 | static void div4_kick(struct clk *clk) | ||
131 | { | ||
132 | unsigned long value; | ||
133 | |||
134 | /* set KICK bit in FRQCRA to update hardware setting */ | ||
135 | value = __raw_readl(FRQCRA); | ||
136 | value |= (1 << 31); | ||
137 | __raw_writel(value, FRQCRA); | ||
138 | } | ||
139 | |||
130 | static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 0, 24, 32, 36, 48, 0, 72 }; | 140 | static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 0, 24, 32, 36, 48, 0, 72 }; |
131 | 141 | ||
132 | static struct clk_div_mult_table div4_table = { | 142 | static struct clk_div_mult_table div4_div_mult_table = { |
133 | .divisors = divisors, | 143 | .divisors = divisors, |
134 | .nr_divisors = ARRAY_SIZE(divisors), | 144 | .nr_divisors = ARRAY_SIZE(divisors), |
135 | }; | 145 | }; |
136 | 146 | ||
147 | static struct clk_div4_table div4_table = { | ||
148 | .div_mult_table = &div4_div_mult_table, | ||
149 | .kick = div4_kick, | ||
150 | }; | ||
151 | |||
137 | enum { DIV4_I, DIV4_SH, DIV4_B, DIV4_P, DIV4_M1, DIV4_NR }; | 152 | enum { DIV4_I, DIV4_SH, DIV4_B, DIV4_P, DIV4_M1, DIV4_NR }; |
138 | 153 | ||
139 | #define DIV4(_str, _reg, _bit, _mask, _flags) \ | 154 | #define DIV4(_str, _reg, _bit, _mask, _flags) \ |
@@ -144,7 +159,7 @@ struct clk div4_clks[DIV4_NR] = { | |||
144 | [DIV4_SH] = DIV4("shyway_clk", FRQCRA, 12, 0x2f7c, CLK_ENABLE_ON_INIT), | 159 | [DIV4_SH] = DIV4("shyway_clk", FRQCRA, 12, 0x2f7c, CLK_ENABLE_ON_INIT), |
145 | [DIV4_B] = DIV4("bus_clk", FRQCRA, 8, 0x2f7c, CLK_ENABLE_ON_INIT), | 160 | [DIV4_B] = DIV4("bus_clk", FRQCRA, 8, 0x2f7c, CLK_ENABLE_ON_INIT), |
146 | [DIV4_P] = DIV4("peripheral_clk", FRQCRA, 0, 0x2f7c, 0), | 161 | [DIV4_P] = DIV4("peripheral_clk", FRQCRA, 0, 0x2f7c, 0), |
147 | [DIV4_M1] = DIV4("vpu_clk", FRQCRB, 4, 0x2f7c, 0), | 162 | [DIV4_M1] = DIV4("vpu_clk", FRQCRB, 4, 0x2f7c, CLK_ENABLE_ON_INIT), |
148 | }; | 163 | }; |
149 | 164 | ||
150 | struct clk div6_clks[] = { | 165 | struct clk div6_clks[] = { |
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7757.c b/arch/sh/kernel/cpu/sh4a/clock-sh7757.c index ddc235ca9664..86aae60677dc 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7757.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7757.c | |||
@@ -35,7 +35,7 @@ static struct clk_ops sh7757_master_clk_ops = { | |||
35 | 35 | ||
36 | static void module_clk_recalc(struct clk *clk) | 36 | static void module_clk_recalc(struct clk *clk) |
37 | { | 37 | { |
38 | int idx = ctrl_inl(FRQCR) & 0x0000000f; | 38 | int idx = __raw_readl(FRQCR) & 0x0000000f; |
39 | clk->rate = clk->parent->rate / p1fc_divisors[idx]; | 39 | clk->rate = clk->parent->rate / p1fc_divisors[idx]; |
40 | } | 40 | } |
41 | 41 | ||
@@ -45,7 +45,7 @@ static struct clk_ops sh7757_module_clk_ops = { | |||
45 | 45 | ||
46 | static void bus_clk_recalc(struct clk *clk) | 46 | static void bus_clk_recalc(struct clk *clk) |
47 | { | 47 | { |
48 | int idx = (ctrl_inl(FRQCR) >> 8) & 0x0000000f; | 48 | int idx = (__raw_readl(FRQCR) >> 8) & 0x0000000f; |
49 | clk->rate = clk->parent->rate / bfc_divisors[idx]; | 49 | clk->rate = clk->parent->rate / bfc_divisors[idx]; |
50 | } | 50 | } |
51 | 51 | ||
@@ -55,7 +55,7 @@ static struct clk_ops sh7757_bus_clk_ops = { | |||
55 | 55 | ||
56 | static void cpu_clk_recalc(struct clk *clk) | 56 | static void cpu_clk_recalc(struct clk *clk) |
57 | { | 57 | { |
58 | int idx = (ctrl_inl(FRQCR) >> 20) & 0x0000000f; | 58 | int idx = (__raw_readl(FRQCR) >> 20) & 0x0000000f; |
59 | clk->rate = clk->parent->rate / ifc_divisors[idx]; | 59 | clk->rate = clk->parent->rate / ifc_divisors[idx]; |
60 | } | 60 | } |
61 | 61 | ||
@@ -78,7 +78,7 @@ void __init arch_init_clk_ops(struct clk_ops **ops, int idx) | |||
78 | 78 | ||
79 | static void shyway_clk_recalc(struct clk *clk) | 79 | static void shyway_clk_recalc(struct clk *clk) |
80 | { | 80 | { |
81 | int idx = (ctrl_inl(FRQCR) >> 12) & 0x0000000f; | 81 | int idx = (__raw_readl(FRQCR) >> 12) & 0x0000000f; |
82 | clk->rate = clk->parent->rate / sfc_divisors[idx]; | 82 | clk->rate = clk->parent->rate / sfc_divisors[idx]; |
83 | } | 83 | } |
84 | 84 | ||
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7763.c b/arch/sh/kernel/cpu/sh4a/clock-sh7763.c index 370cd47642ef..9f401163e71e 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7763.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7763.c | |||
@@ -22,7 +22,7 @@ static int cfc_divisors[] = { 1, 1, 4, 1, 1, 1, 1, 1 }; | |||
22 | 22 | ||
23 | static void master_clk_init(struct clk *clk) | 23 | static void master_clk_init(struct clk *clk) |
24 | { | 24 | { |
25 | clk->rate *= p0fc_divisors[(ctrl_inl(FRQCR) >> 4) & 0x07]; | 25 | clk->rate *= p0fc_divisors[(__raw_readl(FRQCR) >> 4) & 0x07]; |
26 | } | 26 | } |
27 | 27 | ||
28 | static struct clk_ops sh7763_master_clk_ops = { | 28 | static struct clk_ops sh7763_master_clk_ops = { |
@@ -31,7 +31,7 @@ static struct clk_ops sh7763_master_clk_ops = { | |||
31 | 31 | ||
32 | static unsigned long module_clk_recalc(struct clk *clk) | 32 | static unsigned long module_clk_recalc(struct clk *clk) |
33 | { | 33 | { |
34 | int idx = ((ctrl_inl(FRQCR) >> 4) & 0x07); | 34 | int idx = ((__raw_readl(FRQCR) >> 4) & 0x07); |
35 | return clk->parent->rate / p0fc_divisors[idx]; | 35 | return clk->parent->rate / p0fc_divisors[idx]; |
36 | } | 36 | } |
37 | 37 | ||
@@ -41,7 +41,7 @@ static struct clk_ops sh7763_module_clk_ops = { | |||
41 | 41 | ||
42 | static unsigned long bus_clk_recalc(struct clk *clk) | 42 | static unsigned long bus_clk_recalc(struct clk *clk) |
43 | { | 43 | { |
44 | int idx = ((ctrl_inl(FRQCR) >> 16) & 0x07); | 44 | int idx = ((__raw_readl(FRQCR) >> 16) & 0x07); |
45 | return clk->parent->rate / bfc_divisors[idx]; | 45 | return clk->parent->rate / bfc_divisors[idx]; |
46 | } | 46 | } |
47 | 47 | ||
@@ -68,7 +68,7 @@ void __init arch_init_clk_ops(struct clk_ops **ops, int idx) | |||
68 | 68 | ||
69 | static unsigned long shyway_clk_recalc(struct clk *clk) | 69 | static unsigned long shyway_clk_recalc(struct clk *clk) |
70 | { | 70 | { |
71 | int idx = ((ctrl_inl(FRQCR) >> 20) & 0x07); | 71 | int idx = ((__raw_readl(FRQCR) >> 20) & 0x07); |
72 | return clk->parent->rate / cfc_divisors[idx]; | 72 | return clk->parent->rate / cfc_divisors[idx]; |
73 | } | 73 | } |
74 | 74 | ||
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7770.c b/arch/sh/kernel/cpu/sh4a/clock-sh7770.c index e0b896769205..9e3354365d40 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7770.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7770.c | |||
@@ -21,7 +21,7 @@ static int pfc_divisors[] = { 1, 8, 1,10,12,16, 1, 1 }; | |||
21 | 21 | ||
22 | static void master_clk_init(struct clk *clk) | 22 | static void master_clk_init(struct clk *clk) |
23 | { | 23 | { |
24 | clk->rate *= pfc_divisors[(ctrl_inl(FRQCR) >> 28) & 0x000f]; | 24 | clk->rate *= pfc_divisors[(__raw_readl(FRQCR) >> 28) & 0x000f]; |
25 | } | 25 | } |
26 | 26 | ||
27 | static struct clk_ops sh7770_master_clk_ops = { | 27 | static struct clk_ops sh7770_master_clk_ops = { |
@@ -30,7 +30,7 @@ static struct clk_ops sh7770_master_clk_ops = { | |||
30 | 30 | ||
31 | static unsigned long module_clk_recalc(struct clk *clk) | 31 | static unsigned long module_clk_recalc(struct clk *clk) |
32 | { | 32 | { |
33 | int idx = ((ctrl_inl(FRQCR) >> 28) & 0x000f); | 33 | int idx = ((__raw_readl(FRQCR) >> 28) & 0x000f); |
34 | return clk->parent->rate / pfc_divisors[idx]; | 34 | return clk->parent->rate / pfc_divisors[idx]; |
35 | } | 35 | } |
36 | 36 | ||
@@ -40,7 +40,7 @@ static struct clk_ops sh7770_module_clk_ops = { | |||
40 | 40 | ||
41 | static unsigned long bus_clk_recalc(struct clk *clk) | 41 | static unsigned long bus_clk_recalc(struct clk *clk) |
42 | { | 42 | { |
43 | int idx = (ctrl_inl(FRQCR) & 0x000f); | 43 | int idx = (__raw_readl(FRQCR) & 0x000f); |
44 | return clk->parent->rate / bfc_divisors[idx]; | 44 | return clk->parent->rate / bfc_divisors[idx]; |
45 | } | 45 | } |
46 | 46 | ||
@@ -50,7 +50,7 @@ static struct clk_ops sh7770_bus_clk_ops = { | |||
50 | 50 | ||
51 | static unsigned long cpu_clk_recalc(struct clk *clk) | 51 | static unsigned long cpu_clk_recalc(struct clk *clk) |
52 | { | 52 | { |
53 | int idx = ((ctrl_inl(FRQCR) >> 24) & 0x000f); | 53 | int idx = ((__raw_readl(FRQCR) >> 24) & 0x000f); |
54 | return clk->parent->rate / ifc_divisors[idx]; | 54 | return clk->parent->rate / ifc_divisors[idx]; |
55 | } | 55 | } |
56 | 56 | ||
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7780.c b/arch/sh/kernel/cpu/sh4a/clock-sh7780.c index a249d823578e..150963a6001e 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7780.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7780.c | |||
@@ -22,7 +22,7 @@ static int cfc_divisors[] = { 1, 1, 4, 1, 6, 1, 1, 1 }; | |||
22 | 22 | ||
23 | static void master_clk_init(struct clk *clk) | 23 | static void master_clk_init(struct clk *clk) |
24 | { | 24 | { |
25 | clk->rate *= pfc_divisors[ctrl_inl(FRQCR) & 0x0003]; | 25 | clk->rate *= pfc_divisors[__raw_readl(FRQCR) & 0x0003]; |
26 | } | 26 | } |
27 | 27 | ||
28 | static struct clk_ops sh7780_master_clk_ops = { | 28 | static struct clk_ops sh7780_master_clk_ops = { |
@@ -31,7 +31,7 @@ static struct clk_ops sh7780_master_clk_ops = { | |||
31 | 31 | ||
32 | static unsigned long module_clk_recalc(struct clk *clk) | 32 | static unsigned long module_clk_recalc(struct clk *clk) |
33 | { | 33 | { |
34 | int idx = (ctrl_inl(FRQCR) & 0x0003); | 34 | int idx = (__raw_readl(FRQCR) & 0x0003); |
35 | return clk->parent->rate / pfc_divisors[idx]; | 35 | return clk->parent->rate / pfc_divisors[idx]; |
36 | } | 36 | } |
37 | 37 | ||
@@ -41,7 +41,7 @@ static struct clk_ops sh7780_module_clk_ops = { | |||
41 | 41 | ||
42 | static unsigned long bus_clk_recalc(struct clk *clk) | 42 | static unsigned long bus_clk_recalc(struct clk *clk) |
43 | { | 43 | { |
44 | int idx = ((ctrl_inl(FRQCR) >> 16) & 0x0007); | 44 | int idx = ((__raw_readl(FRQCR) >> 16) & 0x0007); |
45 | return clk->parent->rate / bfc_divisors[idx]; | 45 | return clk->parent->rate / bfc_divisors[idx]; |
46 | } | 46 | } |
47 | 47 | ||
@@ -51,7 +51,7 @@ static struct clk_ops sh7780_bus_clk_ops = { | |||
51 | 51 | ||
52 | static unsigned long cpu_clk_recalc(struct clk *clk) | 52 | static unsigned long cpu_clk_recalc(struct clk *clk) |
53 | { | 53 | { |
54 | int idx = ((ctrl_inl(FRQCR) >> 24) & 0x0001); | 54 | int idx = ((__raw_readl(FRQCR) >> 24) & 0x0001); |
55 | return clk->parent->rate / ifc_divisors[idx]; | 55 | return clk->parent->rate / ifc_divisors[idx]; |
56 | } | 56 | } |
57 | 57 | ||
@@ -74,7 +74,7 @@ void __init arch_init_clk_ops(struct clk_ops **ops, int idx) | |||
74 | 74 | ||
75 | static unsigned long shyway_clk_recalc(struct clk *clk) | 75 | static unsigned long shyway_clk_recalc(struct clk *clk) |
76 | { | 76 | { |
77 | int idx = ((ctrl_inl(FRQCR) >> 20) & 0x0007); | 77 | int idx = ((__raw_readl(FRQCR) >> 20) & 0x0007); |
78 | return clk->parent->rate / cfc_divisors[idx]; | 78 | return clk->parent->rate / cfc_divisors[idx]; |
79 | } | 79 | } |
80 | 80 | ||
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c b/arch/sh/kernel/cpu/sh4a/clock-sh7785.c index 73abfbf2f16d..d997f0a25b10 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7785.c | |||
@@ -57,11 +57,15 @@ static struct clk *clks[] = { | |||
57 | static unsigned int div2[] = { 1, 2, 4, 6, 8, 12, 16, 18, | 57 | static unsigned int div2[] = { 1, 2, 4, 6, 8, 12, 16, 18, |
58 | 24, 32, 36, 48 }; | 58 | 24, 32, 36, 48 }; |
59 | 59 | ||
60 | static struct clk_div_mult_table div4_table = { | 60 | static struct clk_div_mult_table div4_div_mult_table = { |
61 | .divisors = div2, | 61 | .divisors = div2, |
62 | .nr_divisors = ARRAY_SIZE(div2), | 62 | .nr_divisors = ARRAY_SIZE(div2), |
63 | }; | 63 | }; |
64 | 64 | ||
65 | static struct clk_div4_table div4_table = { | ||
66 | .div_mult_table = &div4_div_mult_table, | ||
67 | }; | ||
68 | |||
65 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_DDR, DIV4_GA, | 69 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_DDR, DIV4_GA, |
66 | DIV4_DU, DIV4_P, DIV4_NR }; | 70 | DIV4_DU, DIV4_P, DIV4_NR }; |
67 | 71 | ||
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7786.c b/arch/sh/kernel/cpu/sh4a/clock-sh7786.c index a0e8869071ac..af69fd468703 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7786.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7786.c | |||
@@ -3,11 +3,7 @@ | |||
3 | * | 3 | * |
4 | * SH7786 support for the clock framework | 4 | * SH7786 support for the clock framework |
5 | * | 5 | * |
6 | * Copyright (C) 2008, 2009 Renesas Solutions Corp. | 6 | * Copyright (C) 2010 Paul Mundt |
7 | * Kuninori Morimoto <morimoto.kuninori@renesas.com> | ||
8 | * | ||
9 | * Based on SH7785 | ||
10 | * Copyright (C) 2007 Paul Mundt | ||
11 | * | 7 | * |
12 | * This file is subject to the terms and conditions of the GNU General Public | 8 | * This file is subject to the terms and conditions of the GNU General Public |
13 | * License. See the file "COPYING" in the main directory of this archive | 9 | * License. See the file "COPYING" in the main directory of this archive |
@@ -15,127 +11,127 @@ | |||
15 | */ | 11 | */ |
16 | #include <linux/init.h> | 12 | #include <linux/init.h> |
17 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/clk.h> | ||
15 | #include <linux/io.h> | ||
18 | #include <asm/clock.h> | 16 | #include <asm/clock.h> |
19 | #include <asm/freq.h> | 17 | #include <asm/freq.h> |
20 | #include <asm/io.h> | ||
21 | |||
22 | static int ifc_divisors[] = { 1, 2, 4, 1 }; | ||
23 | static int sfc_divisors[] = { 1, 1, 4, 1 }; | ||
24 | static int bfc_divisors[] = { 1, 1, 1, 1, 1, 12, 16, 1, | ||
25 | 24, 32, 1, 1, 1, 1, 1, 1 }; | ||
26 | static int mfc_divisors[] = { 1, 1, 4, 1 }; | ||
27 | static int pfc_divisors[] = { 1, 1, 1, 1, 1, 1, 16, 1, | ||
28 | 24, 32, 1, 48, 1, 1, 1, 1 }; | ||
29 | 18 | ||
30 | static void master_clk_init(struct clk *clk) | 19 | /* |
31 | { | 20 | * Default rate for the root input clock, reset this with clk_set_rate() |
32 | clk->rate *= pfc_divisors[ctrl_inl(FRQMR1) & 0x000f]; | 21 | * from the platform code. |
33 | } | 22 | */ |
34 | 23 | static struct clk extal_clk = { | |
35 | static struct clk_ops sh7786_master_clk_ops = { | 24 | .name = "extal", |
36 | .init = master_clk_init, | 25 | .id = -1, |
26 | .rate = 33333333, | ||
37 | }; | 27 | }; |
38 | 28 | ||
39 | static unsigned long module_clk_recalc(struct clk *clk) | 29 | static unsigned long pll_recalc(struct clk *clk) |
40 | { | 30 | { |
41 | int idx = (ctrl_inl(FRQMR1) & 0x000f); | 31 | int multiplier; |
42 | return clk->parent->rate / pfc_divisors[idx]; | ||
43 | } | ||
44 | 32 | ||
45 | static struct clk_ops sh7786_module_clk_ops = { | 33 | /* |
46 | .recalc = module_clk_recalc, | 34 | * Clock modes 0, 1, and 2 use an x64 multiplier against PLL1, |
47 | }; | 35 | * while modes 3, 4, and 5 use an x32. |
36 | */ | ||
37 | multiplier = (sh_mv.mv_mode_pins() & 0xf) < 3 ? 64 : 32; | ||
48 | 38 | ||
49 | static unsigned long bus_clk_recalc(struct clk *clk) | 39 | return clk->parent->rate * multiplier; |
50 | { | ||
51 | int idx = ((ctrl_inl(FRQMR1) >> 16) & 0x000f); | ||
52 | return clk->parent->rate / bfc_divisors[idx]; | ||
53 | } | 40 | } |
54 | 41 | ||
55 | static struct clk_ops sh7786_bus_clk_ops = { | 42 | static struct clk_ops pll_clk_ops = { |
56 | .recalc = bus_clk_recalc, | 43 | .recalc = pll_recalc, |
57 | }; | 44 | }; |
58 | 45 | ||
59 | static unsigned long cpu_clk_recalc(struct clk *clk) | 46 | static struct clk pll_clk = { |
60 | { | 47 | .name = "pll_clk", |
61 | int idx = ((ctrl_inl(FRQMR1) >> 28) & 0x0003); | 48 | .id = -1, |
62 | return clk->parent->rate / ifc_divisors[idx]; | 49 | .ops = &pll_clk_ops, |
63 | } | 50 | .parent = &extal_clk, |
64 | 51 | .flags = CLK_ENABLE_ON_INIT, | |
65 | static struct clk_ops sh7786_cpu_clk_ops = { | ||
66 | .recalc = cpu_clk_recalc, | ||
67 | }; | 52 | }; |
68 | 53 | ||
69 | static struct clk_ops *sh7786_clk_ops[] = { | 54 | static struct clk *clks[] = { |
70 | &sh7786_master_clk_ops, | 55 | &extal_clk, |
71 | &sh7786_module_clk_ops, | 56 | &pll_clk, |
72 | &sh7786_bus_clk_ops, | ||
73 | &sh7786_cpu_clk_ops, | ||
74 | }; | 57 | }; |
75 | 58 | ||
76 | void __init arch_init_clk_ops(struct clk_ops **ops, int idx) | 59 | static unsigned int div2[] = { 1, 2, 4, 6, 8, 12, 16, 18, |
77 | { | 60 | 24, 32, 36, 48 }; |
78 | if (idx < ARRAY_SIZE(sh7786_clk_ops)) | ||
79 | *ops = sh7786_clk_ops[idx]; | ||
80 | } | ||
81 | 61 | ||
82 | static unsigned long shyway_clk_recalc(struct clk *clk) | 62 | static struct clk_div_mult_table div4_div_mult_table = { |
83 | { | 63 | .divisors = div2, |
84 | int idx = ((ctrl_inl(FRQMR1) >> 20) & 0x0003); | 64 | .nr_divisors = ARRAY_SIZE(div2), |
85 | return clk->parent->rate / sfc_divisors[idx]; | ||
86 | } | ||
87 | |||
88 | static struct clk_ops sh7786_shyway_clk_ops = { | ||
89 | .recalc = shyway_clk_recalc, | ||
90 | }; | 65 | }; |
91 | 66 | ||
92 | static struct clk sh7786_shyway_clk = { | 67 | static struct clk_div4_table div4_table = { |
93 | .name = "shyway_clk", | 68 | .div_mult_table = &div4_div_mult_table, |
94 | .flags = CLK_ENABLE_ON_INIT, | ||
95 | .ops = &sh7786_shyway_clk_ops, | ||
96 | }; | 69 | }; |
97 | 70 | ||
98 | static unsigned long ddr_clk_recalc(struct clk *clk) | 71 | enum { DIV4_I, DIV4_SH, DIV4_B, DIV4_DDR, DIV4_DU, DIV4_P, DIV4_NR }; |
99 | { | ||
100 | int idx = ((ctrl_inl(FRQMR1) >> 12) & 0x0003); | ||
101 | return clk->parent->rate / mfc_divisors[idx]; | ||
102 | } | ||
103 | 72 | ||
104 | static struct clk_ops sh7786_ddr_clk_ops = { | 73 | #define DIV4(_str, _bit, _mask, _flags) \ |
105 | .recalc = ddr_clk_recalc, | 74 | SH_CLK_DIV4(_str, &pll_clk, FRQMR1, _bit, _mask, _flags) |
106 | }; | ||
107 | 75 | ||
108 | static struct clk sh7786_ddr_clk = { | 76 | struct clk div4_clks[DIV4_NR] = { |
109 | .name = "ddr_clk", | 77 | [DIV4_P] = DIV4("peripheral_clk", 0, 0x0b40, 0), |
110 | .flags = CLK_ENABLE_ON_INIT, | 78 | [DIV4_DU] = DIV4("du_clk", 4, 0x0010, 0), |
111 | .ops = &sh7786_ddr_clk_ops, | 79 | [DIV4_DDR] = DIV4("ddr_clk", 12, 0x0002, CLK_ENABLE_ON_INIT), |
80 | [DIV4_B] = DIV4("bus_clk", 16, 0x0360, CLK_ENABLE_ON_INIT), | ||
81 | [DIV4_SH] = DIV4("shyway_clk", 20, 0x0002, CLK_ENABLE_ON_INIT), | ||
82 | [DIV4_I] = DIV4("cpu_clk", 28, 0x0006, CLK_ENABLE_ON_INIT), | ||
112 | }; | 83 | }; |
113 | 84 | ||
114 | /* | 85 | #define MSTPCR0 0xffc40030 |
115 | * Additional SH7786-specific on-chip clocks that aren't already part of the | 86 | #define MSTPCR1 0xffc40034 |
116 | * clock framework | 87 | |
117 | */ | 88 | static struct clk mstp_clks[] = { |
118 | static struct clk *sh7786_onchip_clocks[] = { | 89 | /* MSTPCR0 */ |
119 | &sh7786_shyway_clk, | 90 | SH_CLK_MSTP32("scif_fck", 5, &div4_clks[DIV4_P], MSTPCR0, 29, 0), |
120 | &sh7786_ddr_clk, | 91 | SH_CLK_MSTP32("scif_fck", 4, &div4_clks[DIV4_P], MSTPCR0, 28, 0), |
92 | SH_CLK_MSTP32("scif_fck", 3, &div4_clks[DIV4_P], MSTPCR0, 27, 0), | ||
93 | SH_CLK_MSTP32("scif_fck", 2, &div4_clks[DIV4_P], MSTPCR0, 26, 0), | ||
94 | SH_CLK_MSTP32("scif_fck", 1, &div4_clks[DIV4_P], MSTPCR0, 25, 0), | ||
95 | SH_CLK_MSTP32("scif_fck", 0, &div4_clks[DIV4_P], MSTPCR0, 24, 0), | ||
96 | SH_CLK_MSTP32("ssi_fck", 3, &div4_clks[DIV4_P], MSTPCR0, 23, 0), | ||
97 | SH_CLK_MSTP32("ssi_fck", 2, &div4_clks[DIV4_P], MSTPCR0, 22, 0), | ||
98 | SH_CLK_MSTP32("ssi_fck", 1, &div4_clks[DIV4_P], MSTPCR0, 21, 0), | ||
99 | SH_CLK_MSTP32("ssi_fck", 0, &div4_clks[DIV4_P], MSTPCR0, 20, 0), | ||
100 | SH_CLK_MSTP32("hac_fck", 1, &div4_clks[DIV4_P], MSTPCR0, 17, 0), | ||
101 | SH_CLK_MSTP32("hac_fck", 0, &div4_clks[DIV4_P], MSTPCR0, 16, 0), | ||
102 | SH_CLK_MSTP32("i2c_fck", 1, &div4_clks[DIV4_P], MSTPCR0, 15, 0), | ||
103 | SH_CLK_MSTP32("i2c_fck", 0, &div4_clks[DIV4_P], MSTPCR0, 14, 0), | ||
104 | SH_CLK_MSTP32("tmu9_11_fck", -1, &div4_clks[DIV4_P], MSTPCR0, 11, 0), | ||
105 | SH_CLK_MSTP32("tmu678_fck", -1, &div4_clks[DIV4_P], MSTPCR0, 10, 0), | ||
106 | SH_CLK_MSTP32("tmu345_fck", -1, &div4_clks[DIV4_P], MSTPCR0, 9, 0), | ||
107 | SH_CLK_MSTP32("tmu012_fck", -1, &div4_clks[DIV4_P], MSTPCR0, 8, 0), | ||
108 | SH_CLK_MSTP32("sdif_fck", 1, &div4_clks[DIV4_P], MSTPCR0, 5, 0), | ||
109 | SH_CLK_MSTP32("sdif_fck", 0, &div4_clks[DIV4_P], MSTPCR0, 4, 0), | ||
110 | SH_CLK_MSTP32("hspi_fck", -1, &div4_clks[DIV4_P], MSTPCR0, 2, 0), | ||
111 | |||
112 | /* MSTPCR1 */ | ||
113 | SH_CLK_MSTP32("usb_fck", -1, NULL, MSTPCR1, 12, 0), | ||
114 | SH_CLK_MSTP32("pcie_fck", 2, NULL, MSTPCR1, 10, 0), | ||
115 | SH_CLK_MSTP32("pcie_fck", 1, NULL, MSTPCR1, 9, 0), | ||
116 | SH_CLK_MSTP32("pcie_fck", 0, NULL, MSTPCR1, 8, 0), | ||
117 | SH_CLK_MSTP32("dmac_11_6_fck", -1, NULL, MSTPCR1, 5, 0), | ||
118 | SH_CLK_MSTP32("dmac_5_0_fck", -1, NULL, MSTPCR1, 4, 0), | ||
119 | SH_CLK_MSTP32("du_fck", -1, NULL, MSTPCR1, 3, 0), | ||
120 | SH_CLK_MSTP32("ether_fck", -1, NULL, MSTPCR1, 2, 0), | ||
121 | }; | 121 | }; |
122 | 122 | ||
123 | int __init arch_clk_init(void) | 123 | int __init arch_clk_init(void) |
124 | { | 124 | { |
125 | struct clk *clk; | ||
126 | int i, ret = 0; | 125 | int i, ret = 0; |
127 | 126 | ||
128 | cpg_clk_init(); | 127 | for (i = 0; i < ARRAY_SIZE(clks); i++) |
129 | 128 | ret |= clk_register(clks[i]); | |
130 | clk = clk_get(NULL, "master_clk"); | ||
131 | for (i = 0; i < ARRAY_SIZE(sh7786_onchip_clocks); i++) { | ||
132 | struct clk *clkp = sh7786_onchip_clocks[i]; | ||
133 | |||
134 | clkp->parent = clk; | ||
135 | ret |= clk_register(clkp); | ||
136 | } | ||
137 | 129 | ||
138 | clk_put(clk); | 130 | if (!ret) |
131 | ret = sh_clk_div4_register(div4_clks, ARRAY_SIZE(div4_clks), | ||
132 | &div4_table); | ||
133 | if (!ret) | ||
134 | ret = sh_clk_mstp32_register(mstp_clks, ARRAY_SIZE(mstp_clks)); | ||
139 | 135 | ||
140 | return ret; | 136 | return ret; |
141 | } | 137 | } |
diff --git a/arch/sh/kernel/cpu/sh4a/clock-shx3.c b/arch/sh/kernel/cpu/sh4a/clock-shx3.c index 23c27d32d982..e75c57bdfa5e 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-shx3.c +++ b/arch/sh/kernel/cpu/sh4a/clock-shx3.c | |||
@@ -33,7 +33,7 @@ static int cfc_divisors[] = { 1, 1, 4, 6 }; | |||
33 | 33 | ||
34 | static void master_clk_init(struct clk *clk) | 34 | static void master_clk_init(struct clk *clk) |
35 | { | 35 | { |
36 | clk->rate *= pfc_divisors[(ctrl_inl(FRQCR) >> PFC_POS) & PFC_MSK]; | 36 | clk->rate *= pfc_divisors[(__raw_readl(FRQCR) >> PFC_POS) & PFC_MSK]; |
37 | } | 37 | } |
38 | 38 | ||
39 | static struct clk_ops shx3_master_clk_ops = { | 39 | static struct clk_ops shx3_master_clk_ops = { |
@@ -42,7 +42,7 @@ static struct clk_ops shx3_master_clk_ops = { | |||
42 | 42 | ||
43 | static unsigned long module_clk_recalc(struct clk *clk) | 43 | static unsigned long module_clk_recalc(struct clk *clk) |
44 | { | 44 | { |
45 | int idx = ((ctrl_inl(FRQCR) >> PFC_POS) & PFC_MSK); | 45 | int idx = ((__raw_readl(FRQCR) >> PFC_POS) & PFC_MSK); |
46 | return clk->parent->rate / pfc_divisors[idx]; | 46 | return clk->parent->rate / pfc_divisors[idx]; |
47 | } | 47 | } |
48 | 48 | ||
@@ -52,7 +52,7 @@ static struct clk_ops shx3_module_clk_ops = { | |||
52 | 52 | ||
53 | static unsigned long bus_clk_recalc(struct clk *clk) | 53 | static unsigned long bus_clk_recalc(struct clk *clk) |
54 | { | 54 | { |
55 | int idx = ((ctrl_inl(FRQCR) >> BFC_POS) & BFC_MSK); | 55 | int idx = ((__raw_readl(FRQCR) >> BFC_POS) & BFC_MSK); |
56 | return clk->parent->rate / bfc_divisors[idx]; | 56 | return clk->parent->rate / bfc_divisors[idx]; |
57 | } | 57 | } |
58 | 58 | ||
@@ -62,7 +62,7 @@ static struct clk_ops shx3_bus_clk_ops = { | |||
62 | 62 | ||
63 | static unsigned long cpu_clk_recalc(struct clk *clk) | 63 | static unsigned long cpu_clk_recalc(struct clk *clk) |
64 | { | 64 | { |
65 | int idx = ((ctrl_inl(FRQCR) >> IFC_POS) & IFC_MSK); | 65 | int idx = ((__raw_readl(FRQCR) >> IFC_POS) & IFC_MSK); |
66 | return clk->parent->rate / ifc_divisors[idx]; | 66 | return clk->parent->rate / ifc_divisors[idx]; |
67 | } | 67 | } |
68 | 68 | ||
@@ -85,7 +85,7 @@ void __init arch_init_clk_ops(struct clk_ops **ops, int idx) | |||
85 | 85 | ||
86 | static unsigned long shyway_clk_recalc(struct clk *clk) | 86 | static unsigned long shyway_clk_recalc(struct clk *clk) |
87 | { | 87 | { |
88 | int idx = ((ctrl_inl(FRQCR) >> CFC_POS) & CFC_MSK); | 88 | int idx = ((__raw_readl(FRQCR) >> CFC_POS) & CFC_MSK); |
89 | return clk->parent->rate / cfc_divisors[idx]; | 89 | return clk->parent->rate / cfc_divisors[idx]; |
90 | } | 90 | } |
91 | 91 | ||
diff --git a/arch/sh/kernel/cpu/sh4a/pinmux-sh7722.c b/arch/sh/kernel/cpu/sh4a/pinmux-sh7722.c index cb9d07bd59f8..0688a7502f86 100644 --- a/arch/sh/kernel/cpu/sh4a/pinmux-sh7722.c +++ b/arch/sh/kernel/cpu/sh4a/pinmux-sh7722.c | |||
@@ -278,6 +278,7 @@ enum { | |||
278 | HIZA8_LCDC, HIZA8_HIZ, | 278 | HIZA8_LCDC, HIZA8_HIZ, |
279 | HIZA7_LCDC, HIZA7_HIZ, | 279 | HIZA7_LCDC, HIZA7_HIZ, |
280 | HIZA6_LCDC, HIZA6_HIZ, | 280 | HIZA6_LCDC, HIZA6_HIZ, |
281 | HIZB4_SIUA, HIZB4_HIZ, | ||
281 | HIZB1_VIO, HIZB1_HIZ, | 282 | HIZB1_VIO, HIZB1_HIZ, |
282 | HIZB0_VIO, HIZB0_HIZ, | 283 | HIZB0_VIO, HIZB0_HIZ, |
283 | HIZC15_IRQ7, HIZC15_HIZ, | 284 | HIZC15_IRQ7, HIZC15_HIZ, |
@@ -546,7 +547,7 @@ static pinmux_enum_t pinmux_data[] = { | |||
546 | PINMUX_DATA(VIO_VD2_MARK, PSE3_VIO, MSELB9_VIO2, | 547 | PINMUX_DATA(VIO_VD2_MARK, PSE3_VIO, MSELB9_VIO2, |
547 | HIZB0_VIO, FOE_VIO_VD2), | 548 | HIZB0_VIO, FOE_VIO_VD2), |
548 | PINMUX_DATA(VIO_HD2_MARK, PSE3_VIO, MSELB9_VIO2, | 549 | PINMUX_DATA(VIO_HD2_MARK, PSE3_VIO, MSELB9_VIO2, |
549 | HIZB1_VIO, HIZB1_VIO, FCE_VIO_HD2), | 550 | HIZB1_VIO, FCE_VIO_HD2), |
550 | PINMUX_DATA(VIO_CLK2_MARK, PSE3_VIO, MSELB9_VIO2, | 551 | PINMUX_DATA(VIO_CLK2_MARK, PSE3_VIO, MSELB9_VIO2, |
551 | HIZB1_VIO, FRB_VIO_CLK2), | 552 | HIZB1_VIO, FRB_VIO_CLK2), |
552 | 553 | ||
@@ -658,14 +659,14 @@ static pinmux_enum_t pinmux_data[] = { | |||
658 | PINMUX_DATA(SDHICLK_MARK, SDHICLK), | 659 | PINMUX_DATA(SDHICLK_MARK, SDHICLK), |
659 | 660 | ||
660 | /* SIU - Port A */ | 661 | /* SIU - Port A */ |
661 | PINMUX_DATA(SIUAOLR_MARK, PSC13_SIUAOLR, SIUAOLR_SIOF1_SYNC), | 662 | PINMUX_DATA(SIUAOLR_MARK, PSC13_SIUAOLR, HIZB4_SIUA, SIUAOLR_SIOF1_SYNC), |
662 | PINMUX_DATA(SIUAOBT_MARK, PSC14_SIUAOBT, SIUAOBT_SIOF1_SCK), | 663 | PINMUX_DATA(SIUAOBT_MARK, PSC14_SIUAOBT, HIZB4_SIUA, SIUAOBT_SIOF1_SCK), |
663 | PINMUX_DATA(SIUAISLD_MARK, PSC15_SIUAISLD, SIUAISLD_SIOF1_RXD), | 664 | PINMUX_DATA(SIUAISLD_MARK, PSC15_SIUAISLD, HIZB4_SIUA, SIUAISLD_SIOF1_RXD), |
664 | PINMUX_DATA(SIUAILR_MARK, PSC11_SIUAILR, SIUAILR_SIOF1_SS2), | 665 | PINMUX_DATA(SIUAILR_MARK, PSC11_SIUAILR, HIZB4_SIUA, SIUAILR_SIOF1_SS2), |
665 | PINMUX_DATA(SIUAIBT_MARK, PSC12_SIUAIBT, SIUAIBT_SIOF1_SS1), | 666 | PINMUX_DATA(SIUAIBT_MARK, PSC12_SIUAIBT, HIZB4_SIUA, SIUAIBT_SIOF1_SS1), |
666 | PINMUX_DATA(SIUAOSLD_MARK, PSB0_SIUAOSLD, SIUAOSLD_SIOF1_TXD), | 667 | PINMUX_DATA(SIUAOSLD_MARK, PSB0_SIUAOSLD, HIZB4_SIUA, SIUAOSLD_SIOF1_TXD), |
667 | PINMUX_DATA(SIUMCKA_MARK, PSE11_SIUMCKA_SIOF1_MCK, PSB1_SIUMCKA, PTK0), | 668 | PINMUX_DATA(SIUMCKA_MARK, PSE11_SIUMCKA_SIOF1_MCK, HIZB4_SIUA, PSB1_SIUMCKA, PTK0), |
668 | PINMUX_DATA(SIUFCKA_MARK, PSE11_SIUFCKA, PTK0), | 669 | PINMUX_DATA(SIUFCKA_MARK, PSE11_SIUFCKA, HIZB4_SIUA, PTK0), |
669 | 670 | ||
670 | /* SIU - Port B */ | 671 | /* SIU - Port B */ |
671 | PINMUX_DATA(SIUBOLR_MARK, PSB11_SIUBOLR, SIOSTRB1_SIUBOLR), | 672 | PINMUX_DATA(SIUBOLR_MARK, PSB11_SIUBOLR, SIOSTRB1_SIUBOLR), |
@@ -1612,7 +1613,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = { | |||
1612 | 0, 0, | 1613 | 0, 0, |
1613 | 0, 0, | 1614 | 0, 0, |
1614 | 0, 0, | 1615 | 0, 0, |
1615 | 0, 0, | 1616 | HIZB4_SIUA, HIZB4_HIZ, |
1616 | 0, 0, | 1617 | 0, 0, |
1617 | 0, 0, | 1618 | 0, 0, |
1618 | HIZB1_VIO, HIZB1_HIZ, | 1619 | HIZB1_VIO, HIZB1_HIZ, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c index b5335b5e309c..ef3f97827808 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c | |||
@@ -446,6 +446,8 @@ void __init plat_early_device_setup(void) | |||
446 | 446 | ||
447 | enum { | 447 | enum { |
448 | UNUSED=0, | 448 | UNUSED=0, |
449 | ENABLED, | ||
450 | DISABLED, | ||
449 | 451 | ||
450 | /* interrupt sources */ | 452 | /* interrupt sources */ |
451 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, | 453 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, |
@@ -461,7 +463,6 @@ enum { | |||
461 | SCIF0, SCIF1, SCIF2, SIOF0, SIOF1, SIO, | 463 | SCIF0, SCIF1, SCIF2, SIOF0, SIOF1, SIO, |
462 | FLCTL_FLSTEI, FLCTL_FLENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, | 464 | FLCTL_FLSTEI, FLCTL_FLENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, |
463 | I2C_ALI, I2C_TACKI, I2C_WAITI, I2C_DTEI, | 465 | I2C_ALI, I2C_TACKI, I2C_WAITI, I2C_DTEI, |
464 | SDHI0, SDHI1, SDHI2, SDHI3, | ||
465 | CMT, TSIF, SIU, TWODG, | 466 | CMT, TSIF, SIU, TWODG, |
466 | TMU0, TMU1, TMU2, | 467 | TMU0, TMU1, TMU2, |
467 | IRDA, JPU, LCDC, | 468 | IRDA, JPU, LCDC, |
@@ -494,8 +495,8 @@ static struct intc_vect vectors[] __initdata = { | |||
494 | INTC_VECT(FLCTL_FLTREQ0I, 0xdc0), INTC_VECT(FLCTL_FLTREQ1I, 0xde0), | 495 | INTC_VECT(FLCTL_FLTREQ0I, 0xdc0), INTC_VECT(FLCTL_FLTREQ1I, 0xde0), |
495 | INTC_VECT(I2C_ALI, 0xe00), INTC_VECT(I2C_TACKI, 0xe20), | 496 | INTC_VECT(I2C_ALI, 0xe00), INTC_VECT(I2C_TACKI, 0xe20), |
496 | INTC_VECT(I2C_WAITI, 0xe40), INTC_VECT(I2C_DTEI, 0xe60), | 497 | INTC_VECT(I2C_WAITI, 0xe40), INTC_VECT(I2C_DTEI, 0xe60), |
497 | INTC_VECT(SDHI0, 0xe80), INTC_VECT(SDHI1, 0xea0), | 498 | INTC_VECT(SDHI, 0xe80), INTC_VECT(SDHI, 0xea0), |
498 | INTC_VECT(SDHI2, 0xec0), INTC_VECT(SDHI3, 0xee0), | 499 | INTC_VECT(SDHI, 0xec0), INTC_VECT(SDHI, 0xee0), |
499 | INTC_VECT(CMT, 0xf00), INTC_VECT(TSIF, 0xf20), | 500 | INTC_VECT(CMT, 0xf00), INTC_VECT(TSIF, 0xf20), |
500 | INTC_VECT(SIU, 0xf80), INTC_VECT(TWODG, 0xfa0), | 501 | INTC_VECT(SIU, 0xf80), INTC_VECT(TWODG, 0xfa0), |
501 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), | 502 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), |
@@ -513,7 +514,6 @@ static struct intc_group groups[] __initdata = { | |||
513 | INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLENDI, | 514 | INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLENDI, |
514 | FLCTL_FLTREQ0I, FLCTL_FLTREQ1I), | 515 | FLCTL_FLTREQ0I, FLCTL_FLTREQ1I), |
515 | INTC_GROUP(I2C, I2C_ALI, I2C_TACKI, I2C_WAITI, I2C_DTEI), | 516 | INTC_GROUP(I2C, I2C_ALI, I2C_TACKI, I2C_WAITI, I2C_DTEI), |
516 | INTC_GROUP(SDHI, SDHI0, SDHI1, SDHI2, SDHI3), | ||
517 | }; | 517 | }; |
518 | 518 | ||
519 | static struct intc_mask_reg mask_registers[] __initdata = { | 519 | static struct intc_mask_reg mask_registers[] __initdata = { |
@@ -535,7 +535,7 @@ static struct intc_mask_reg mask_registers[] __initdata = { | |||
535 | { I2C_DTEI, I2C_WAITI, I2C_TACKI, I2C_ALI, | 535 | { I2C_DTEI, I2C_WAITI, I2C_TACKI, I2C_ALI, |
536 | FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLENDI, FLCTL_FLSTEI } }, | 536 | FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLENDI, FLCTL_FLSTEI } }, |
537 | { 0xa40800a0, 0xa40800e0, 8, /* IMR8 / IMCR8 */ | 537 | { 0xa40800a0, 0xa40800e0, 8, /* IMR8 / IMCR8 */ |
538 | { SDHI3, SDHI2, SDHI1, SDHI0, 0, 0, TWODG, SIU } }, | 538 | { DISABLED, DISABLED, ENABLED, ENABLED, 0, 0, TWODG, SIU } }, |
539 | { 0xa40800a4, 0xa40800e4, 8, /* IMR9 / IMCR9 */ | 539 | { 0xa40800a4, 0xa40800e4, 8, /* IMR9 / IMCR9 */ |
540 | { 0, 0, 0, CMT, 0, USB_USBI1, USB_USBI0, } }, | 540 | { 0, 0, 0, CMT, 0, USB_USBI1, USB_USBI0, } }, |
541 | { 0xa40800a8, 0xa40800e8, 8, /* IMR10 / IMCR10 */ | 541 | { 0xa40800a8, 0xa40800e8, 8, /* IMR10 / IMCR10 */ |
@@ -573,9 +573,13 @@ static struct intc_mask_reg ack_registers[] __initdata = { | |||
573 | { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } }, | 573 | { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } }, |
574 | }; | 574 | }; |
575 | 575 | ||
576 | static DECLARE_INTC_DESC_ACK(intc_desc, "sh7722", vectors, groups, | 576 | static struct intc_desc intc_desc __initdata = { |
577 | mask_registers, prio_registers, sense_registers, | 577 | .name = "sh7722", |
578 | ack_registers); | 578 | .force_enable = ENABLED, |
579 | .force_disable = DISABLED, | ||
580 | .hw = INTC_HW_DESC(vectors, groups, mask_registers, | ||
581 | prio_registers, sense_registers, ack_registers), | ||
582 | }; | ||
579 | 583 | ||
580 | void __init plat_irq_setup(void) | 584 | void __init plat_irq_setup(void) |
581 | { | 585 | { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c index 772b9265d0e4..85c61f624702 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c | |||
@@ -592,14 +592,17 @@ void __init plat_early_device_setup(void) | |||
592 | #define RAMCR_CACHE_L2FC 0x0002 | 592 | #define RAMCR_CACHE_L2FC 0x0002 |
593 | #define RAMCR_CACHE_L2E 0x0001 | 593 | #define RAMCR_CACHE_L2E 0x0001 |
594 | #define L2_CACHE_ENABLE (RAMCR_CACHE_L2E|RAMCR_CACHE_L2FC) | 594 | #define L2_CACHE_ENABLE (RAMCR_CACHE_L2E|RAMCR_CACHE_L2FC) |
595 | void __uses_jump_to_uncached l2_cache_init(void) | 595 | |
596 | void l2_cache_init(void) | ||
596 | { | 597 | { |
597 | /* Enable L2 cache */ | 598 | /* Enable L2 cache */ |
598 | ctrl_outl(L2_CACHE_ENABLE, RAMCR); | 599 | __raw_writel(L2_CACHE_ENABLE, RAMCR); |
599 | } | 600 | } |
600 | 601 | ||
601 | enum { | 602 | enum { |
602 | UNUSED=0, | 603 | UNUSED=0, |
604 | ENABLED, | ||
605 | DISABLED, | ||
603 | 606 | ||
604 | /* interrupt sources */ | 607 | /* interrupt sources */ |
605 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, | 608 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, |
@@ -622,7 +625,6 @@ enum { | |||
622 | SCIFA_SCIFA1, | 625 | SCIFA_SCIFA1, |
623 | FLCTL_FLSTEI,FLCTL_FLTENDI,FLCTL_FLTREQ0I,FLCTL_FLTREQ1I, | 626 | FLCTL_FLSTEI,FLCTL_FLTENDI,FLCTL_FLTREQ0I,FLCTL_FLTREQ1I, |
624 | I2C_ALI,I2C_TACKI,I2C_WAITI,I2C_DTEI, | 627 | I2C_ALI,I2C_TACKI,I2C_WAITI,I2C_DTEI, |
625 | SDHI0_SDHII0,SDHI0_SDHII1,SDHI0_SDHII2, | ||
626 | CMT_CMTI, | 628 | CMT_CMTI, |
627 | TSIF_TSIFI, | 629 | TSIF_TSIFI, |
628 | SIU_SIUI, | 630 | SIU_SIUI, |
@@ -630,7 +632,6 @@ enum { | |||
630 | TMU0_TUNI0, TMU0_TUNI1, TMU0_TUNI2, | 632 | TMU0_TUNI0, TMU0_TUNI1, TMU0_TUNI2, |
631 | IRDA_IRDAI, | 633 | IRDA_IRDAI, |
632 | ATAPI_ATAPII, | 634 | ATAPI_ATAPII, |
633 | SDHI1_SDHII0,SDHI1_SDHII1,SDHI1_SDHII2, | ||
634 | VEU2H1_VEU2HI, | 635 | VEU2H1_VEU2HI, |
635 | LCDC_LCDCI, | 636 | LCDC_LCDCI, |
636 | TMU1_TUNI0,TMU1_TUNI1,TMU1_TUNI2, | 637 | TMU1_TUNI0,TMU1_TUNI1,TMU1_TUNI2, |
@@ -701,9 +702,9 @@ static struct intc_vect vectors[] __initdata = { | |||
701 | INTC_VECT(I2C_WAITI,0xE40), | 702 | INTC_VECT(I2C_WAITI,0xE40), |
702 | INTC_VECT(I2C_DTEI,0xE60), | 703 | INTC_VECT(I2C_DTEI,0xE60), |
703 | 704 | ||
704 | INTC_VECT(SDHI0_SDHII0,0xE80), | 705 | INTC_VECT(SDHI0, 0xE80), |
705 | INTC_VECT(SDHI0_SDHII1,0xEA0), | 706 | INTC_VECT(SDHI0, 0xEA0), |
706 | INTC_VECT(SDHI0_SDHII2,0xEC0), | 707 | INTC_VECT(SDHI0, 0xEC0), |
707 | 708 | ||
708 | INTC_VECT(CMT_CMTI,0xF00), | 709 | INTC_VECT(CMT_CMTI,0xF00), |
709 | INTC_VECT(TSIF_TSIFI,0xF20), | 710 | INTC_VECT(TSIF_TSIFI,0xF20), |
@@ -717,9 +718,9 @@ static struct intc_vect vectors[] __initdata = { | |||
717 | INTC_VECT(IRDA_IRDAI,0x480), | 718 | INTC_VECT(IRDA_IRDAI,0x480), |
718 | INTC_VECT(ATAPI_ATAPII,0x4A0), | 719 | INTC_VECT(ATAPI_ATAPII,0x4A0), |
719 | 720 | ||
720 | INTC_VECT(SDHI1_SDHII0,0x4E0), | 721 | INTC_VECT(SDHI1, 0x4E0), |
721 | INTC_VECT(SDHI1_SDHII1,0x500), | 722 | INTC_VECT(SDHI1, 0x500), |
722 | INTC_VECT(SDHI1_SDHII2,0x520), | 723 | INTC_VECT(SDHI1, 0x520), |
723 | 724 | ||
724 | INTC_VECT(VEU2H1_VEU2HI,0x560), | 725 | INTC_VECT(VEU2H1_VEU2HI,0x560), |
725 | INTC_VECT(LCDC_LCDCI,0x580), | 726 | INTC_VECT(LCDC_LCDCI,0x580), |
@@ -738,15 +739,14 @@ static struct intc_group groups[] __initdata = { | |||
738 | INTC_GROUP(FLCTL,FLCTL_FLSTEI,FLCTL_FLTENDI,FLCTL_FLTREQ0I,FLCTL_FLTREQ1I), | 739 | INTC_GROUP(FLCTL,FLCTL_FLSTEI,FLCTL_FLTENDI,FLCTL_FLTREQ0I,FLCTL_FLTREQ1I), |
739 | INTC_GROUP(I2C,I2C_ALI,I2C_TACKI,I2C_WAITI,I2C_DTEI), | 740 | INTC_GROUP(I2C,I2C_ALI,I2C_TACKI,I2C_WAITI,I2C_DTEI), |
740 | INTC_GROUP(_2DG, _2DG_TRI,_2DG_INI,_2DG_CEI), | 741 | INTC_GROUP(_2DG, _2DG_TRI,_2DG_INI,_2DG_CEI), |
741 | INTC_GROUP(SDHI1, SDHI1_SDHII0,SDHI1_SDHII1,SDHI1_SDHII2), | ||
742 | INTC_GROUP(RTC, RTC_ATI,RTC_PRI,RTC_CUI), | 742 | INTC_GROUP(RTC, RTC_ATI,RTC_PRI,RTC_CUI), |
743 | INTC_GROUP(DMAC1B, DMAC1B_DEI4,DMAC1B_DEI5,DMAC1B_DADERR), | 743 | INTC_GROUP(DMAC1B, DMAC1B_DEI4,DMAC1B_DEI5,DMAC1B_DADERR), |
744 | INTC_GROUP(SDHI0,SDHI0_SDHII0,SDHI0_SDHII1,SDHI0_SDHII2), | ||
745 | }; | 744 | }; |
746 | 745 | ||
747 | static struct intc_mask_reg mask_registers[] __initdata = { | 746 | static struct intc_mask_reg mask_registers[] __initdata = { |
748 | { 0xa4080080, 0xa40800c0, 8, /* IMR0 / IMCR0 */ | 747 | { 0xa4080080, 0xa40800c0, 8, /* IMR0 / IMCR0 */ |
749 | { 0, TMU1_TUNI2,TMU1_TUNI1,TMU1_TUNI0,0,SDHI1_SDHII2,SDHI1_SDHII1,SDHI1_SDHII0} }, | 748 | { 0, TMU1_TUNI2, TMU1_TUNI1, TMU1_TUNI0, |
749 | 0, DISABLED, ENABLED, ENABLED } }, | ||
750 | { 0xa4080084, 0xa40800c4, 8, /* IMR1 / IMCR1 */ | 750 | { 0xa4080084, 0xa40800c4, 8, /* IMR1 / IMCR1 */ |
751 | { VIO_VOUI, VIO_VEU2HI,VIO_BEUI,VIO_CEUI,DMAC0A_DEI3,DMAC0A_DEI2,DMAC0A_DEI1,DMAC0A_DEI0 } }, | 751 | { VIO_VOUI, VIO_VEU2HI,VIO_BEUI,VIO_CEUI,DMAC0A_DEI3,DMAC0A_DEI2,DMAC0A_DEI1,DMAC0A_DEI0 } }, |
752 | { 0xa4080088, 0xa40800c8, 8, /* IMR2 / IMCR2 */ | 752 | { 0xa4080088, 0xa40800c8, 8, /* IMR2 / IMCR2 */ |
@@ -763,7 +763,8 @@ static struct intc_mask_reg mask_registers[] __initdata = { | |||
763 | { I2C_DTEI, I2C_WAITI, I2C_TACKI, I2C_ALI, | 763 | { I2C_DTEI, I2C_WAITI, I2C_TACKI, I2C_ALI, |
764 | FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } }, | 764 | FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } }, |
765 | { 0xa40800a0, 0xa40800e0, 8, /* IMR8 / IMCR8 */ | 765 | { 0xa40800a0, 0xa40800e0, 8, /* IMR8 / IMCR8 */ |
766 | { 0,SDHI0_SDHII2,SDHI0_SDHII1,SDHI0_SDHII0,0,0,SCIFA_SCIFA2,SIU_SIUI } }, | 766 | { 0, DISABLED, ENABLED, ENABLED, |
767 | 0, 0, SCIFA_SCIFA2, SIU_SIUI } }, | ||
767 | { 0xa40800a4, 0xa40800e4, 8, /* IMR9 / IMCR9 */ | 768 | { 0xa40800a4, 0xa40800e4, 8, /* IMR9 / IMCR9 */ |
768 | { 0, 0, 0, CMT_CMTI, 0, 0, USB_USI0,0 } }, | 769 | { 0, 0, 0, CMT_CMTI, 0, 0, USB_USI0,0 } }, |
769 | { 0xa40800a8, 0xa40800e8, 8, /* IMR10 / IMCR10 */ | 770 | { 0xa40800a8, 0xa40800e8, 8, /* IMR10 / IMCR10 */ |
@@ -803,9 +804,13 @@ static struct intc_mask_reg ack_registers[] __initdata = { | |||
803 | { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } }, | 804 | { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } }, |
804 | }; | 805 | }; |
805 | 806 | ||
806 | static DECLARE_INTC_DESC_ACK(intc_desc, "sh7723", vectors, groups, | 807 | static struct intc_desc intc_desc __initdata = { |
807 | mask_registers, prio_registers, sense_registers, | 808 | .name = "sh7723", |
808 | ack_registers); | 809 | .force_enable = ENABLED, |
810 | .force_disable = DISABLED, | ||
811 | .hw = INTC_HW_DESC(vectors, groups, mask_registers, | ||
812 | prio_registers, sense_registers, ack_registers), | ||
813 | }; | ||
809 | 814 | ||
810 | void __init plat_irq_setup(void) | 815 | void __init plat_irq_setup(void) |
811 | { | 816 | { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7724.c b/arch/sh/kernel/cpu/sh4a/setup-sh7724.c index d32f96c1cc15..31e3451f7e3d 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7724.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7724.c | |||
@@ -714,14 +714,17 @@ void __init plat_early_device_setup(void) | |||
714 | #define RAMCR_CACHE_L2FC 0x0002 | 714 | #define RAMCR_CACHE_L2FC 0x0002 |
715 | #define RAMCR_CACHE_L2E 0x0001 | 715 | #define RAMCR_CACHE_L2E 0x0001 |
716 | #define L2_CACHE_ENABLE (RAMCR_CACHE_L2E|RAMCR_CACHE_L2FC) | 716 | #define L2_CACHE_ENABLE (RAMCR_CACHE_L2E|RAMCR_CACHE_L2FC) |
717 | void __uses_jump_to_uncached l2_cache_init(void) | 717 | |
718 | void l2_cache_init(void) | ||
718 | { | 719 | { |
719 | /* Enable L2 cache */ | 720 | /* Enable L2 cache */ |
720 | ctrl_outl(L2_CACHE_ENABLE, RAMCR); | 721 | __raw_writel(L2_CACHE_ENABLE, RAMCR); |
721 | } | 722 | } |
722 | 723 | ||
723 | enum { | 724 | enum { |
724 | UNUSED = 0, | 725 | UNUSED = 0, |
726 | ENABLED, | ||
727 | DISABLED, | ||
725 | 728 | ||
726 | /* interrupt sources */ | 729 | /* interrupt sources */ |
727 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, | 730 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, |
@@ -750,14 +753,12 @@ enum { | |||
750 | ETHI, | 753 | ETHI, |
751 | I2C1_ALI, I2C1_TACKI, I2C1_WAITI, I2C1_DTEI, | 754 | I2C1_ALI, I2C1_TACKI, I2C1_WAITI, I2C1_DTEI, |
752 | I2C0_ALI, I2C0_TACKI, I2C0_WAITI, I2C0_DTEI, | 755 | I2C0_ALI, I2C0_TACKI, I2C0_WAITI, I2C0_DTEI, |
753 | SDHI0_SDHII0, SDHI0_SDHII1, SDHI0_SDHII2, SDHI0_SDHII3, | ||
754 | CMT, | 756 | CMT, |
755 | TSIF, | 757 | TSIF, |
756 | FSI, | 758 | FSI, |
757 | SCIFA5, | 759 | SCIFA5, |
758 | TMU0_TUNI0, TMU0_TUNI1, TMU0_TUNI2, | 760 | TMU0_TUNI0, TMU0_TUNI1, TMU0_TUNI2, |
759 | IRDA, | 761 | IRDA, |
760 | SDHI1_SDHII0, SDHI1_SDHII1, SDHI1_SDHII2, | ||
761 | JPU, | 762 | JPU, |
762 | _2DDMAC, | 763 | _2DDMAC, |
763 | MMC_MMC2I, MMC_MMC3I, | 764 | MMC_MMC2I, MMC_MMC3I, |
@@ -839,10 +840,10 @@ static struct intc_vect vectors[] __initdata = { | |||
839 | INTC_VECT(I2C0_WAITI, 0xE40), | 840 | INTC_VECT(I2C0_WAITI, 0xE40), |
840 | INTC_VECT(I2C0_DTEI, 0xE60), | 841 | INTC_VECT(I2C0_DTEI, 0xE60), |
841 | 842 | ||
842 | INTC_VECT(SDHI0_SDHII0, 0xE80), | 843 | INTC_VECT(SDHI0, 0xE80), |
843 | INTC_VECT(SDHI0_SDHII1, 0xEA0), | 844 | INTC_VECT(SDHI0, 0xEA0), |
844 | INTC_VECT(SDHI0_SDHII2, 0xEC0), | 845 | INTC_VECT(SDHI0, 0xEC0), |
845 | INTC_VECT(SDHI0_SDHII3, 0xEE0), | 846 | INTC_VECT(SDHI0, 0xEE0), |
846 | 847 | ||
847 | INTC_VECT(CMT, 0xF00), | 848 | INTC_VECT(CMT, 0xF00), |
848 | INTC_VECT(TSIF, 0xF20), | 849 | INTC_VECT(TSIF, 0xF20), |
@@ -855,9 +856,9 @@ static struct intc_vect vectors[] __initdata = { | |||
855 | 856 | ||
856 | INTC_VECT(IRDA, 0x480), | 857 | INTC_VECT(IRDA, 0x480), |
857 | 858 | ||
858 | INTC_VECT(SDHI1_SDHII0, 0x4E0), | 859 | INTC_VECT(SDHI1, 0x4E0), |
859 | INTC_VECT(SDHI1_SDHII1, 0x500), | 860 | INTC_VECT(SDHI1, 0x500), |
860 | INTC_VECT(SDHI1_SDHII2, 0x520), | 861 | INTC_VECT(SDHI1, 0x520), |
861 | 862 | ||
862 | INTC_VECT(JPU, 0x560), | 863 | INTC_VECT(JPU, 0x560), |
863 | INTC_VECT(_2DDMAC, 0x4A0), | 864 | INTC_VECT(_2DDMAC, 0x4A0), |
@@ -883,8 +884,6 @@ static struct intc_group groups[] __initdata = { | |||
883 | INTC_GROUP(DMAC0B, DMAC0B_DEI4, DMAC0B_DEI5, DMAC0B_DADERR), | 884 | INTC_GROUP(DMAC0B, DMAC0B_DEI4, DMAC0B_DEI5, DMAC0B_DADERR), |
884 | INTC_GROUP(I2C0, I2C0_ALI, I2C0_TACKI, I2C0_WAITI, I2C0_DTEI), | 885 | INTC_GROUP(I2C0, I2C0_ALI, I2C0_TACKI, I2C0_WAITI, I2C0_DTEI), |
885 | INTC_GROUP(I2C1, I2C1_ALI, I2C1_TACKI, I2C1_WAITI, I2C1_DTEI), | 886 | INTC_GROUP(I2C1, I2C1_ALI, I2C1_TACKI, I2C1_WAITI, I2C1_DTEI), |
886 | INTC_GROUP(SDHI0, SDHI0_SDHII0, SDHI0_SDHII1, SDHI0_SDHII2, SDHI0_SDHII3), | ||
887 | INTC_GROUP(SDHI1, SDHI1_SDHII0, SDHI1_SDHII1, SDHI1_SDHII2), | ||
888 | INTC_GROUP(SPU, SPU_SPUI0, SPU_SPUI1), | 887 | INTC_GROUP(SPU, SPU_SPUI0, SPU_SPUI1), |
889 | INTC_GROUP(MMCIF, MMC_MMC2I, MMC_MMC3I), | 888 | INTC_GROUP(MMCIF, MMC_MMC2I, MMC_MMC3I), |
890 | }; | 889 | }; |
@@ -892,7 +891,7 @@ static struct intc_group groups[] __initdata = { | |||
892 | static struct intc_mask_reg mask_registers[] __initdata = { | 891 | static struct intc_mask_reg mask_registers[] __initdata = { |
893 | { 0xa4080080, 0xa40800c0, 8, /* IMR0 / IMCR0 */ | 892 | { 0xa4080080, 0xa40800c0, 8, /* IMR0 / IMCR0 */ |
894 | { 0, TMU1_TUNI2, TMU1_TUNI1, TMU1_TUNI0, | 893 | { 0, TMU1_TUNI2, TMU1_TUNI1, TMU1_TUNI0, |
895 | 0, SDHI1_SDHII2, SDHI1_SDHII1, SDHI1_SDHII0 } }, | 894 | 0, DISABLED, ENABLED, ENABLED } }, |
896 | { 0xa4080084, 0xa40800c4, 8, /* IMR1 / IMCR1 */ | 895 | { 0xa4080084, 0xa40800c4, 8, /* IMR1 / IMCR1 */ |
897 | { VIO_VOU, VIO_VEU1, VIO_BEU0, VIO_CEU0, | 896 | { VIO_VOU, VIO_VEU1, VIO_BEU0, VIO_CEU0, |
898 | DMAC0A_DEI3, DMAC0A_DEI2, DMAC0A_DEI1, DMAC0A_DEI0 } }, | 897 | DMAC0A_DEI3, DMAC0A_DEI2, DMAC0A_DEI1, DMAC0A_DEI0 } }, |
@@ -914,7 +913,7 @@ static struct intc_mask_reg mask_registers[] __initdata = { | |||
914 | { I2C0_DTEI, I2C0_WAITI, I2C0_TACKI, I2C0_ALI, | 913 | { I2C0_DTEI, I2C0_WAITI, I2C0_TACKI, I2C0_ALI, |
915 | I2C1_DTEI, I2C1_WAITI, I2C1_TACKI, I2C1_ALI } }, | 914 | I2C1_DTEI, I2C1_WAITI, I2C1_TACKI, I2C1_ALI } }, |
916 | { 0xa40800a0, 0xa40800e0, 8, /* IMR8 / IMCR8 */ | 915 | { 0xa40800a0, 0xa40800e0, 8, /* IMR8 / IMCR8 */ |
917 | { SDHI0_SDHII3, SDHI0_SDHII2, SDHI0_SDHII1, SDHI0_SDHII0, | 916 | { DISABLED, DISABLED, ENABLED, ENABLED, |
918 | 0, 0, SCIFA5, FSI } }, | 917 | 0, 0, SCIFA5, FSI } }, |
919 | { 0xa40800a4, 0xa40800e4, 8, /* IMR9 / IMCR9 */ | 918 | { 0xa40800a4, 0xa40800e4, 8, /* IMR9 / IMCR9 */ |
920 | { 0, 0, 0, CMT, 0, USB1, USB0, 0 } }, | 919 | { 0, 0, 0, CMT, 0, USB1, USB0, 0 } }, |
@@ -961,9 +960,13 @@ static struct intc_mask_reg ack_registers[] __initdata = { | |||
961 | { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } }, | 960 | { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } }, |
962 | }; | 961 | }; |
963 | 962 | ||
964 | static DECLARE_INTC_DESC_ACK(intc_desc, "sh7724", vectors, groups, | 963 | static struct intc_desc intc_desc __initdata = { |
965 | mask_registers, prio_registers, sense_registers, | 964 | .name = "sh7724", |
966 | ack_registers); | 965 | .force_enable = ENABLED, |
966 | .force_disable = DISABLED, | ||
967 | .hw = INTC_HW_DESC(vectors, groups, mask_registers, | ||
968 | prio_registers, sense_registers, ack_registers), | ||
969 | }; | ||
967 | 970 | ||
968 | void __init plat_irq_setup(void) | 971 | void __init plat_irq_setup(void) |
969 | { | 972 | { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c index 37e32efbbaa7..e75edf58796a 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c | |||
@@ -487,17 +487,17 @@ static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7757-irl4567", vectors_irl4567, | |||
487 | void __init plat_irq_setup(void) | 487 | void __init plat_irq_setup(void) |
488 | { | 488 | { |
489 | /* disable IRQ3-0 + IRQ7-4 */ | 489 | /* disable IRQ3-0 + IRQ7-4 */ |
490 | ctrl_outl(0xff000000, INTC_INTMSK0); | 490 | __raw_writel(0xff000000, INTC_INTMSK0); |
491 | 491 | ||
492 | /* disable IRL3-0 + IRL7-4 */ | 492 | /* disable IRL3-0 + IRL7-4 */ |
493 | ctrl_outl(0xc0000000, INTC_INTMSK1); | 493 | __raw_writel(0xc0000000, INTC_INTMSK1); |
494 | ctrl_outl(0xfffefffe, INTC_INTMSK2); | 494 | __raw_writel(0xfffefffe, INTC_INTMSK2); |
495 | 495 | ||
496 | /* select IRL mode for IRL3-0 + IRL7-4 */ | 496 | /* select IRL mode for IRL3-0 + IRL7-4 */ |
497 | ctrl_outl(ctrl_inl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); | 497 | __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); |
498 | 498 | ||
499 | /* disable holding function, ie enable "SH-4 Mode" */ | 499 | /* disable holding function, ie enable "SH-4 Mode" */ |
500 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00200000, INTC_ICR0); | 500 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0); |
501 | 501 | ||
502 | register_intc_controller(&intc_desc); | 502 | register_intc_controller(&intc_desc); |
503 | } | 503 | } |
@@ -507,32 +507,32 @@ void __init plat_irq_setup_pins(int mode) | |||
507 | switch (mode) { | 507 | switch (mode) { |
508 | case IRQ_MODE_IRQ7654: | 508 | case IRQ_MODE_IRQ7654: |
509 | /* select IRQ mode for IRL7-4 */ | 509 | /* select IRQ mode for IRL7-4 */ |
510 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00400000, INTC_ICR0); | 510 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0); |
511 | register_intc_controller(&intc_desc_irq4567); | 511 | register_intc_controller(&intc_desc_irq4567); |
512 | break; | 512 | break; |
513 | case IRQ_MODE_IRQ3210: | 513 | case IRQ_MODE_IRQ3210: |
514 | /* select IRQ mode for IRL3-0 */ | 514 | /* select IRQ mode for IRL3-0 */ |
515 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00800000, INTC_ICR0); | 515 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0); |
516 | register_intc_controller(&intc_desc_irq0123); | 516 | register_intc_controller(&intc_desc_irq0123); |
517 | break; | 517 | break; |
518 | case IRQ_MODE_IRL7654: | 518 | case IRQ_MODE_IRL7654: |
519 | /* enable IRL7-4 but don't provide any masking */ | 519 | /* enable IRL7-4 but don't provide any masking */ |
520 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 520 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
521 | ctrl_outl(0x0000fffe, INTC_INTMSKCLR2); | 521 | __raw_writel(0x0000fffe, INTC_INTMSKCLR2); |
522 | break; | 522 | break; |
523 | case IRQ_MODE_IRL3210: | 523 | case IRQ_MODE_IRL3210: |
524 | /* enable IRL0-3 but don't provide any masking */ | 524 | /* enable IRL0-3 but don't provide any masking */ |
525 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 525 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
526 | ctrl_outl(0xfffe0000, INTC_INTMSKCLR2); | 526 | __raw_writel(0xfffe0000, INTC_INTMSKCLR2); |
527 | break; | 527 | break; |
528 | case IRQ_MODE_IRL7654_MASK: | 528 | case IRQ_MODE_IRL7654_MASK: |
529 | /* enable IRL7-4 and mask using cpu intc controller */ | 529 | /* enable IRL7-4 and mask using cpu intc controller */ |
530 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 530 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
531 | register_intc_controller(&intc_desc_irl4567); | 531 | register_intc_controller(&intc_desc_irl4567); |
532 | break; | 532 | break; |
533 | case IRQ_MODE_IRL3210_MASK: | 533 | case IRQ_MODE_IRL3210_MASK: |
534 | /* enable IRL0-3 and mask using cpu intc controller */ | 534 | /* enable IRL0-3 and mask using cpu intc controller */ |
535 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 535 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
536 | register_intc_controller(&intc_desc_irl0123); | 536 | register_intc_controller(&intc_desc_irl0123); |
537 | break; | 537 | break; |
538 | default: | 538 | default: |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c index 6aba26fec416..7f6b0a5f7f82 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c | |||
@@ -538,11 +538,11 @@ static DECLARE_INTC_DESC(intc_irl3210_desc, "sh7763-irl3210", irl_vectors, | |||
538 | void __init plat_irq_setup(void) | 538 | void __init plat_irq_setup(void) |
539 | { | 539 | { |
540 | /* disable IRQ7-0 */ | 540 | /* disable IRQ7-0 */ |
541 | ctrl_outl(0xff000000, INTC_INTMSK0); | 541 | __raw_writel(0xff000000, INTC_INTMSK0); |
542 | 542 | ||
543 | /* disable IRL3-0 + IRL7-4 */ | 543 | /* disable IRL3-0 + IRL7-4 */ |
544 | ctrl_outl(0xc0000000, INTC_INTMSK1); | 544 | __raw_writel(0xc0000000, INTC_INTMSK1); |
545 | ctrl_outl(0xfffefffe, INTC_INTMSK2); | 545 | __raw_writel(0xfffefffe, INTC_INTMSK2); |
546 | 546 | ||
547 | register_intc_controller(&intc_desc); | 547 | register_intc_controller(&intc_desc); |
548 | } | 548 | } |
@@ -552,27 +552,27 @@ void __init plat_irq_setup_pins(int mode) | |||
552 | switch (mode) { | 552 | switch (mode) { |
553 | case IRQ_MODE_IRQ: | 553 | case IRQ_MODE_IRQ: |
554 | /* select IRQ mode for IRL3-0 + IRL7-4 */ | 554 | /* select IRQ mode for IRL3-0 + IRL7-4 */ |
555 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00c00000, INTC_ICR0); | 555 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00c00000, INTC_ICR0); |
556 | register_intc_controller(&intc_irq_desc); | 556 | register_intc_controller(&intc_irq_desc); |
557 | break; | 557 | break; |
558 | case IRQ_MODE_IRL7654: | 558 | case IRQ_MODE_IRL7654: |
559 | /* enable IRL7-4 but don't provide any masking */ | 559 | /* enable IRL7-4 but don't provide any masking */ |
560 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 560 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
561 | ctrl_outl(0x0000fffe, INTC_INTMSKCLR2); | 561 | __raw_writel(0x0000fffe, INTC_INTMSKCLR2); |
562 | break; | 562 | break; |
563 | case IRQ_MODE_IRL3210: | 563 | case IRQ_MODE_IRL3210: |
564 | /* enable IRL0-3 but don't provide any masking */ | 564 | /* enable IRL0-3 but don't provide any masking */ |
565 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 565 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
566 | ctrl_outl(0xfffe0000, INTC_INTMSKCLR2); | 566 | __raw_writel(0xfffe0000, INTC_INTMSKCLR2); |
567 | break; | 567 | break; |
568 | case IRQ_MODE_IRL7654_MASK: | 568 | case IRQ_MODE_IRL7654_MASK: |
569 | /* enable IRL7-4 and mask using cpu intc controller */ | 569 | /* enable IRL7-4 and mask using cpu intc controller */ |
570 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 570 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
571 | register_intc_controller(&intc_irl7654_desc); | 571 | register_intc_controller(&intc_irl7654_desc); |
572 | break; | 572 | break; |
573 | case IRQ_MODE_IRL3210_MASK: | 573 | case IRQ_MODE_IRL3210_MASK: |
574 | /* enable IRL0-3 and mask using cpu intc controller */ | 574 | /* enable IRL0-3 and mask using cpu intc controller */ |
575 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 575 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
576 | register_intc_controller(&intc_irl3210_desc); | 576 | register_intc_controller(&intc_irl3210_desc); |
577 | break; | 577 | break; |
578 | default: | 578 | default: |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7770.c b/arch/sh/kernel/cpu/sh4a/setup-sh7770.c index c1643bc9590d..86d681ecf90e 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7770.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7770.c | |||
@@ -694,17 +694,17 @@ static DECLARE_INTC_DESC(intc_irl3210_desc, "sh7780-irl3210", irl_vectors, | |||
694 | void __init plat_irq_setup(void) | 694 | void __init plat_irq_setup(void) |
695 | { | 695 | { |
696 | /* disable IRQ7-0 */ | 696 | /* disable IRQ7-0 */ |
697 | ctrl_outl(0xff000000, INTC_INTMSK0); | 697 | __raw_writel(0xff000000, INTC_INTMSK0); |
698 | 698 | ||
699 | /* disable IRL3-0 + IRL7-4 */ | 699 | /* disable IRL3-0 + IRL7-4 */ |
700 | ctrl_outl(0xc0000000, INTC_INTMSK1); | 700 | __raw_writel(0xc0000000, INTC_INTMSK1); |
701 | ctrl_outl(0xfffefffe, INTC_INTMSK2); | 701 | __raw_writel(0xfffefffe, INTC_INTMSK2); |
702 | 702 | ||
703 | /* select IRL mode for IRL3-0 + IRL7-4 */ | 703 | /* select IRL mode for IRL3-0 + IRL7-4 */ |
704 | ctrl_outl(ctrl_inl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); | 704 | __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); |
705 | 705 | ||
706 | /* disable holding function, ie enable "SH-4 Mode" */ | 706 | /* disable holding function, ie enable "SH-4 Mode" */ |
707 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00200000, INTC_ICR0); | 707 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0); |
708 | 708 | ||
709 | register_intc_controller(&intc_desc); | 709 | register_intc_controller(&intc_desc); |
710 | } | 710 | } |
@@ -714,27 +714,27 @@ void __init plat_irq_setup_pins(int mode) | |||
714 | switch (mode) { | 714 | switch (mode) { |
715 | case IRQ_MODE_IRQ: | 715 | case IRQ_MODE_IRQ: |
716 | /* select IRQ mode for IRL3-0 + IRL7-4 */ | 716 | /* select IRQ mode for IRL3-0 + IRL7-4 */ |
717 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00c00000, INTC_ICR0); | 717 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00c00000, INTC_ICR0); |
718 | register_intc_controller(&intc_irq_desc); | 718 | register_intc_controller(&intc_irq_desc); |
719 | break; | 719 | break; |
720 | case IRQ_MODE_IRL7654: | 720 | case IRQ_MODE_IRL7654: |
721 | /* enable IRL7-4 but don't provide any masking */ | 721 | /* enable IRL7-4 but don't provide any masking */ |
722 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 722 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
723 | ctrl_outl(0x0000fffe, INTC_INTMSKCLR2); | 723 | __raw_writel(0x0000fffe, INTC_INTMSKCLR2); |
724 | break; | 724 | break; |
725 | case IRQ_MODE_IRL3210: | 725 | case IRQ_MODE_IRL3210: |
726 | /* enable IRL0-3 but don't provide any masking */ | 726 | /* enable IRL0-3 but don't provide any masking */ |
727 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 727 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
728 | ctrl_outl(0xfffe0000, INTC_INTMSKCLR2); | 728 | __raw_writel(0xfffe0000, INTC_INTMSKCLR2); |
729 | break; | 729 | break; |
730 | case IRQ_MODE_IRL7654_MASK: | 730 | case IRQ_MODE_IRL7654_MASK: |
731 | /* enable IRL7-4 and mask using cpu intc controller */ | 731 | /* enable IRL7-4 and mask using cpu intc controller */ |
732 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 732 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
733 | register_intc_controller(&intc_irl7654_desc); | 733 | register_intc_controller(&intc_irl7654_desc); |
734 | break; | 734 | break; |
735 | case IRQ_MODE_IRL3210_MASK: | 735 | case IRQ_MODE_IRL3210_MASK: |
736 | /* enable IRL0-3 and mask using cpu intc controller */ | 736 | /* enable IRL0-3 and mask using cpu intc controller */ |
737 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 737 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
738 | register_intc_controller(&intc_irl3210_desc); | 738 | register_intc_controller(&intc_irl3210_desc); |
739 | break; | 739 | break; |
740 | default: | 740 | default: |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7780.c b/arch/sh/kernel/cpu/sh4a/setup-sh7780.c index c310558490d5..f8f21618d785 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7780.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7780.c | |||
@@ -461,17 +461,17 @@ static DECLARE_INTC_DESC(intc_irl3210_desc, "sh7780-irl3210", irl_vectors, | |||
461 | void __init plat_irq_setup(void) | 461 | void __init plat_irq_setup(void) |
462 | { | 462 | { |
463 | /* disable IRQ7-0 */ | 463 | /* disable IRQ7-0 */ |
464 | ctrl_outl(0xff000000, INTC_INTMSK0); | 464 | __raw_writel(0xff000000, INTC_INTMSK0); |
465 | 465 | ||
466 | /* disable IRL3-0 + IRL7-4 */ | 466 | /* disable IRL3-0 + IRL7-4 */ |
467 | ctrl_outl(0xc0000000, INTC_INTMSK1); | 467 | __raw_writel(0xc0000000, INTC_INTMSK1); |
468 | ctrl_outl(0xfffefffe, INTC_INTMSK2); | 468 | __raw_writel(0xfffefffe, INTC_INTMSK2); |
469 | 469 | ||
470 | /* select IRL mode for IRL3-0 + IRL7-4 */ | 470 | /* select IRL mode for IRL3-0 + IRL7-4 */ |
471 | ctrl_outl(ctrl_inl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); | 471 | __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); |
472 | 472 | ||
473 | /* disable holding function, ie enable "SH-4 Mode" */ | 473 | /* disable holding function, ie enable "SH-4 Mode" */ |
474 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00200000, INTC_ICR0); | 474 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0); |
475 | 475 | ||
476 | register_intc_controller(&intc_desc); | 476 | register_intc_controller(&intc_desc); |
477 | } | 477 | } |
@@ -481,27 +481,27 @@ void __init plat_irq_setup_pins(int mode) | |||
481 | switch (mode) { | 481 | switch (mode) { |
482 | case IRQ_MODE_IRQ: | 482 | case IRQ_MODE_IRQ: |
483 | /* select IRQ mode for IRL3-0 + IRL7-4 */ | 483 | /* select IRQ mode for IRL3-0 + IRL7-4 */ |
484 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00c00000, INTC_ICR0); | 484 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00c00000, INTC_ICR0); |
485 | register_intc_controller(&intc_irq_desc); | 485 | register_intc_controller(&intc_irq_desc); |
486 | break; | 486 | break; |
487 | case IRQ_MODE_IRL7654: | 487 | case IRQ_MODE_IRL7654: |
488 | /* enable IRL7-4 but don't provide any masking */ | 488 | /* enable IRL7-4 but don't provide any masking */ |
489 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 489 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
490 | ctrl_outl(0x0000fffe, INTC_INTMSKCLR2); | 490 | __raw_writel(0x0000fffe, INTC_INTMSKCLR2); |
491 | break; | 491 | break; |
492 | case IRQ_MODE_IRL3210: | 492 | case IRQ_MODE_IRL3210: |
493 | /* enable IRL0-3 but don't provide any masking */ | 493 | /* enable IRL0-3 but don't provide any masking */ |
494 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 494 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
495 | ctrl_outl(0xfffe0000, INTC_INTMSKCLR2); | 495 | __raw_writel(0xfffe0000, INTC_INTMSKCLR2); |
496 | break; | 496 | break; |
497 | case IRQ_MODE_IRL7654_MASK: | 497 | case IRQ_MODE_IRL7654_MASK: |
498 | /* enable IRL7-4 and mask using cpu intc controller */ | 498 | /* enable IRL7-4 and mask using cpu intc controller */ |
499 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 499 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
500 | register_intc_controller(&intc_irl7654_desc); | 500 | register_intc_controller(&intc_irl7654_desc); |
501 | break; | 501 | break; |
502 | case IRQ_MODE_IRL3210_MASK: | 502 | case IRQ_MODE_IRL3210_MASK: |
503 | /* enable IRL0-3 and mask using cpu intc controller */ | 503 | /* enable IRL0-3 and mask using cpu intc controller */ |
504 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 504 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
505 | register_intc_controller(&intc_irl3210_desc); | 505 | register_intc_controller(&intc_irl3210_desc); |
506 | break; | 506 | break; |
507 | default: | 507 | default: |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7785.c b/arch/sh/kernel/cpu/sh4a/setup-sh7785.c index f685b9b21999..23448d8c6711 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7785.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7785.c | |||
@@ -541,17 +541,17 @@ static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7785-irl4567", vectors_irl4567, | |||
541 | void __init plat_irq_setup(void) | 541 | void __init plat_irq_setup(void) |
542 | { | 542 | { |
543 | /* disable IRQ3-0 + IRQ7-4 */ | 543 | /* disable IRQ3-0 + IRQ7-4 */ |
544 | ctrl_outl(0xff000000, INTC_INTMSK0); | 544 | __raw_writel(0xff000000, INTC_INTMSK0); |
545 | 545 | ||
546 | /* disable IRL3-0 + IRL7-4 */ | 546 | /* disable IRL3-0 + IRL7-4 */ |
547 | ctrl_outl(0xc0000000, INTC_INTMSK1); | 547 | __raw_writel(0xc0000000, INTC_INTMSK1); |
548 | ctrl_outl(0xfffefffe, INTC_INTMSK2); | 548 | __raw_writel(0xfffefffe, INTC_INTMSK2); |
549 | 549 | ||
550 | /* select IRL mode for IRL3-0 + IRL7-4 */ | 550 | /* select IRL mode for IRL3-0 + IRL7-4 */ |
551 | ctrl_outl(ctrl_inl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); | 551 | __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); |
552 | 552 | ||
553 | /* disable holding function, ie enable "SH-4 Mode" */ | 553 | /* disable holding function, ie enable "SH-4 Mode" */ |
554 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00200000, INTC_ICR0); | 554 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0); |
555 | 555 | ||
556 | register_intc_controller(&intc_desc); | 556 | register_intc_controller(&intc_desc); |
557 | } | 557 | } |
@@ -561,32 +561,32 @@ void __init plat_irq_setup_pins(int mode) | |||
561 | switch (mode) { | 561 | switch (mode) { |
562 | case IRQ_MODE_IRQ7654: | 562 | case IRQ_MODE_IRQ7654: |
563 | /* select IRQ mode for IRL7-4 */ | 563 | /* select IRQ mode for IRL7-4 */ |
564 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00400000, INTC_ICR0); | 564 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0); |
565 | register_intc_controller(&intc_desc_irq4567); | 565 | register_intc_controller(&intc_desc_irq4567); |
566 | break; | 566 | break; |
567 | case IRQ_MODE_IRQ3210: | 567 | case IRQ_MODE_IRQ3210: |
568 | /* select IRQ mode for IRL3-0 */ | 568 | /* select IRQ mode for IRL3-0 */ |
569 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00800000, INTC_ICR0); | 569 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0); |
570 | register_intc_controller(&intc_desc_irq0123); | 570 | register_intc_controller(&intc_desc_irq0123); |
571 | break; | 571 | break; |
572 | case IRQ_MODE_IRL7654: | 572 | case IRQ_MODE_IRL7654: |
573 | /* enable IRL7-4 but don't provide any masking */ | 573 | /* enable IRL7-4 but don't provide any masking */ |
574 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 574 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
575 | ctrl_outl(0x0000fffe, INTC_INTMSKCLR2); | 575 | __raw_writel(0x0000fffe, INTC_INTMSKCLR2); |
576 | break; | 576 | break; |
577 | case IRQ_MODE_IRL3210: | 577 | case IRQ_MODE_IRL3210: |
578 | /* enable IRL0-3 but don't provide any masking */ | 578 | /* enable IRL0-3 but don't provide any masking */ |
579 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 579 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
580 | ctrl_outl(0xfffe0000, INTC_INTMSKCLR2); | 580 | __raw_writel(0xfffe0000, INTC_INTMSKCLR2); |
581 | break; | 581 | break; |
582 | case IRQ_MODE_IRL7654_MASK: | 582 | case IRQ_MODE_IRL7654_MASK: |
583 | /* enable IRL7-4 and mask using cpu intc controller */ | 583 | /* enable IRL7-4 and mask using cpu intc controller */ |
584 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 584 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
585 | register_intc_controller(&intc_desc_irl4567); | 585 | register_intc_controller(&intc_desc_irl4567); |
586 | break; | 586 | break; |
587 | case IRQ_MODE_IRL3210_MASK: | 587 | case IRQ_MODE_IRL3210_MASK: |
588 | /* enable IRL0-3 and mask using cpu intc controller */ | 588 | /* enable IRL0-3 and mask using cpu intc controller */ |
589 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 589 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
590 | register_intc_controller(&intc_desc_irl0123); | 590 | register_intc_controller(&intc_desc_irl0123); |
591 | break; | 591 | break; |
592 | default: | 592 | default: |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c index 71673487ace0..7e585320710a 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c | |||
@@ -867,14 +867,14 @@ static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7786-irl4567", vectors_irl4567, | |||
867 | void __init plat_irq_setup(void) | 867 | void __init plat_irq_setup(void) |
868 | { | 868 | { |
869 | /* disable IRQ3-0 + IRQ7-4 */ | 869 | /* disable IRQ3-0 + IRQ7-4 */ |
870 | ctrl_outl(0xff000000, INTC_INTMSK0); | 870 | __raw_writel(0xff000000, INTC_INTMSK0); |
871 | 871 | ||
872 | /* disable IRL3-0 + IRL7-4 */ | 872 | /* disable IRL3-0 + IRL7-4 */ |
873 | ctrl_outl(0xc0000000, INTC_INTMSK1); | 873 | __raw_writel(0xc0000000, INTC_INTMSK1); |
874 | ctrl_outl(0xfffefffe, INTC_INTMSK2); | 874 | __raw_writel(0xfffefffe, INTC_INTMSK2); |
875 | 875 | ||
876 | /* select IRL mode for IRL3-0 + IRL7-4 */ | 876 | /* select IRL mode for IRL3-0 + IRL7-4 */ |
877 | ctrl_outl(ctrl_inl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); | 877 | __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); |
878 | 878 | ||
879 | register_intc_controller(&intc_desc); | 879 | register_intc_controller(&intc_desc); |
880 | } | 880 | } |
@@ -884,32 +884,32 @@ void __init plat_irq_setup_pins(int mode) | |||
884 | switch (mode) { | 884 | switch (mode) { |
885 | case IRQ_MODE_IRQ7654: | 885 | case IRQ_MODE_IRQ7654: |
886 | /* select IRQ mode for IRL7-4 */ | 886 | /* select IRQ mode for IRL7-4 */ |
887 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00400000, INTC_ICR0); | 887 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0); |
888 | register_intc_controller(&intc_desc_irq4567); | 888 | register_intc_controller(&intc_desc_irq4567); |
889 | break; | 889 | break; |
890 | case IRQ_MODE_IRQ3210: | 890 | case IRQ_MODE_IRQ3210: |
891 | /* select IRQ mode for IRL3-0 */ | 891 | /* select IRQ mode for IRL3-0 */ |
892 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00800000, INTC_ICR0); | 892 | __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0); |
893 | register_intc_controller(&intc_desc_irq0123); | 893 | register_intc_controller(&intc_desc_irq0123); |
894 | break; | 894 | break; |
895 | case IRQ_MODE_IRL7654: | 895 | case IRQ_MODE_IRL7654: |
896 | /* enable IRL7-4 but don't provide any masking */ | 896 | /* enable IRL7-4 but don't provide any masking */ |
897 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 897 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
898 | ctrl_outl(0x0000fffe, INTC_INTMSKCLR2); | 898 | __raw_writel(0x0000fffe, INTC_INTMSKCLR2); |
899 | break; | 899 | break; |
900 | case IRQ_MODE_IRL3210: | 900 | case IRQ_MODE_IRL3210: |
901 | /* enable IRL0-3 but don't provide any masking */ | 901 | /* enable IRL0-3 but don't provide any masking */ |
902 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 902 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
903 | ctrl_outl(0xfffe0000, INTC_INTMSKCLR2); | 903 | __raw_writel(0xfffe0000, INTC_INTMSKCLR2); |
904 | break; | 904 | break; |
905 | case IRQ_MODE_IRL7654_MASK: | 905 | case IRQ_MODE_IRL7654_MASK: |
906 | /* enable IRL7-4 and mask using cpu intc controller */ | 906 | /* enable IRL7-4 and mask using cpu intc controller */ |
907 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | 907 | __raw_writel(0x40000000, INTC_INTMSKCLR1); |
908 | register_intc_controller(&intc_desc_irl4567); | 908 | register_intc_controller(&intc_desc_irl4567); |
909 | break; | 909 | break; |
910 | case IRQ_MODE_IRL3210_MASK: | 910 | case IRQ_MODE_IRL3210_MASK: |
911 | /* enable IRL0-3 and mask using cpu intc controller */ | 911 | /* enable IRL0-3 and mask using cpu intc controller */ |
912 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | 912 | __raw_writel(0x80000000, INTC_INTMSKCLR1); |
913 | register_intc_controller(&intc_desc_irl0123); | 913 | register_intc_controller(&intc_desc_irl0123); |
914 | break; | 914 | break; |
915 | default: | 915 | default: |
diff --git a/arch/sh/kernel/cpu/sh4a/smp-shx3.c b/arch/sh/kernel/cpu/sh4a/smp-shx3.c index 5863e0c4d02f..11bf4c1e25c0 100644 --- a/arch/sh/kernel/cpu/sh4a/smp-shx3.c +++ b/arch/sh/kernel/cpu/sh4a/smp-shx3.c | |||
@@ -78,7 +78,10 @@ void __init plat_prepare_cpus(unsigned int max_cpus) | |||
78 | 78 | ||
79 | void plat_start_cpu(unsigned int cpu, unsigned long entry_point) | 79 | void plat_start_cpu(unsigned int cpu, unsigned long entry_point) |
80 | { | 80 | { |
81 | __raw_writel(entry_point, RESET_REG(cpu)); | 81 | if (__in_29bit_mode()) |
82 | __raw_writel(entry_point, RESET_REG(cpu)); | ||
83 | else | ||
84 | __raw_writel(virt_to_phys(entry_point), RESET_REG(cpu)); | ||
82 | 85 | ||
83 | if (!(__raw_readl(STBCR_REG(cpu)) & STBCR_MSTP)) | 86 | if (!(__raw_readl(STBCR_REG(cpu)) & STBCR_MSTP)) |
84 | __raw_writel(STBCR_MSTP, STBCR_REG(cpu)); | 87 | __raw_writel(STBCR_MSTP, STBCR_REG(cpu)); |
diff --git a/arch/sh/kernel/cpu/sh4a/ubc.c b/arch/sh/kernel/cpu/sh4a/ubc.c new file mode 100644 index 000000000000..efb2745bcb36 --- /dev/null +++ b/arch/sh/kernel/cpu/sh4a/ubc.c | |||
@@ -0,0 +1,133 @@ | |||
1 | /* | ||
2 | * arch/sh/kernel/cpu/sh4a/ubc.c | ||
3 | * | ||
4 | * On-chip UBC support for SH-4A CPUs. | ||
5 | * | ||
6 | * Copyright (C) 2009 - 2010 Paul Mundt | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file "COPYING" in the main directory of this archive | ||
10 | * for more details. | ||
11 | */ | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/err.h> | ||
14 | #include <linux/clk.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <asm/hw_breakpoint.h> | ||
17 | |||
18 | #define UBC_CBR(idx) (0xff200000 + (0x20 * idx)) | ||
19 | #define UBC_CRR(idx) (0xff200004 + (0x20 * idx)) | ||
20 | #define UBC_CAR(idx) (0xff200008 + (0x20 * idx)) | ||
21 | #define UBC_CAMR(idx) (0xff20000c + (0x20 * idx)) | ||
22 | |||
23 | #define UBC_CCMFR 0xff200600 | ||
24 | #define UBC_CBCR 0xff200620 | ||
25 | |||
26 | /* CRR */ | ||
27 | #define UBC_CRR_PCB (1 << 1) | ||
28 | #define UBC_CRR_BIE (1 << 0) | ||
29 | |||
30 | /* CBR */ | ||
31 | #define UBC_CBR_CE (1 << 0) | ||
32 | |||
33 | static struct sh_ubc sh4a_ubc; | ||
34 | |||
35 | static void sh4a_ubc_enable(struct arch_hw_breakpoint *info, int idx) | ||
36 | { | ||
37 | __raw_writel(UBC_CBR_CE | info->len | info->type, UBC_CBR(idx)); | ||
38 | __raw_writel(info->address, UBC_CAR(idx)); | ||
39 | } | ||
40 | |||
41 | static void sh4a_ubc_disable(struct arch_hw_breakpoint *info, int idx) | ||
42 | { | ||
43 | __raw_writel(0, UBC_CBR(idx)); | ||
44 | __raw_writel(0, UBC_CAR(idx)); | ||
45 | } | ||
46 | |||
47 | static void sh4a_ubc_enable_all(unsigned long mask) | ||
48 | { | ||
49 | int i; | ||
50 | |||
51 | for (i = 0; i < sh4a_ubc.num_events; i++) | ||
52 | if (mask & (1 << i)) | ||
53 | __raw_writel(__raw_readl(UBC_CBR(i)) | UBC_CBR_CE, | ||
54 | UBC_CBR(i)); | ||
55 | } | ||
56 | |||
57 | static void sh4a_ubc_disable_all(void) | ||
58 | { | ||
59 | int i; | ||
60 | |||
61 | for (i = 0; i < sh4a_ubc.num_events; i++) | ||
62 | __raw_writel(__raw_readl(UBC_CBR(i)) & ~UBC_CBR_CE, | ||
63 | UBC_CBR(i)); | ||
64 | } | ||
65 | |||
66 | static unsigned long sh4a_ubc_active_mask(void) | ||
67 | { | ||
68 | unsigned long active = 0; | ||
69 | int i; | ||
70 | |||
71 | for (i = 0; i < sh4a_ubc.num_events; i++) | ||
72 | if (__raw_readl(UBC_CBR(i)) & UBC_CBR_CE) | ||
73 | active |= (1 << i); | ||
74 | |||
75 | return active; | ||
76 | } | ||
77 | |||
78 | static unsigned long sh4a_ubc_triggered_mask(void) | ||
79 | { | ||
80 | return __raw_readl(UBC_CCMFR); | ||
81 | } | ||
82 | |||
83 | static void sh4a_ubc_clear_triggered_mask(unsigned long mask) | ||
84 | { | ||
85 | __raw_writel(__raw_readl(UBC_CCMFR) & ~mask, UBC_CCMFR); | ||
86 | } | ||
87 | |||
88 | static struct sh_ubc sh4a_ubc = { | ||
89 | .name = "SH-4A", | ||
90 | .num_events = 2, | ||
91 | .trap_nr = 0x1e0, | ||
92 | .enable = sh4a_ubc_enable, | ||
93 | .disable = sh4a_ubc_disable, | ||
94 | .enable_all = sh4a_ubc_enable_all, | ||
95 | .disable_all = sh4a_ubc_disable_all, | ||
96 | .active_mask = sh4a_ubc_active_mask, | ||
97 | .triggered_mask = sh4a_ubc_triggered_mask, | ||
98 | .clear_triggered_mask = sh4a_ubc_clear_triggered_mask, | ||
99 | }; | ||
100 | |||
101 | static int __init sh4a_ubc_init(void) | ||
102 | { | ||
103 | struct clk *ubc_iclk = clk_get(NULL, "ubc0"); | ||
104 | int i; | ||
105 | |||
106 | /* | ||
107 | * The UBC MSTP bit is optional, as not all platforms will have | ||
108 | * it. Just ignore it if we can't find it. | ||
109 | */ | ||
110 | if (IS_ERR(ubc_iclk)) | ||
111 | ubc_iclk = NULL; | ||
112 | |||
113 | clk_enable(ubc_iclk); | ||
114 | |||
115 | __raw_writel(0, UBC_CBCR); | ||
116 | |||
117 | for (i = 0; i < sh4a_ubc.num_events; i++) { | ||
118 | __raw_writel(0, UBC_CAMR(i)); | ||
119 | __raw_writel(0, UBC_CBR(i)); | ||
120 | |||
121 | __raw_writel(UBC_CRR_BIE | UBC_CRR_PCB, UBC_CRR(i)); | ||
122 | |||
123 | /* dummy read for write posting */ | ||
124 | (void)__raw_readl(UBC_CRR(i)); | ||
125 | } | ||
126 | |||
127 | clk_disable(ubc_iclk); | ||
128 | |||
129 | sh4a_ubc.clk = ubc_iclk; | ||
130 | |||
131 | return register_sh_ubc(&sh4a_ubc); | ||
132 | } | ||
133 | arch_initcall(sh4a_ubc_init); | ||
diff --git a/arch/sh/kernel/cpu/sh5/clock-sh5.c b/arch/sh/kernel/cpu/sh5/clock-sh5.c index 7f864ebc51d3..9cfc19b8dbe4 100644 --- a/arch/sh/kernel/cpu/sh5/clock-sh5.c +++ b/arch/sh/kernel/cpu/sh5/clock-sh5.c | |||
@@ -24,7 +24,7 @@ static unsigned long cprc_base; | |||
24 | 24 | ||
25 | static void master_clk_init(struct clk *clk) | 25 | static void master_clk_init(struct clk *clk) |
26 | { | 26 | { |
27 | int idx = (ctrl_inl(cprc_base + 0x00) >> 6) & 0x0007; | 27 | int idx = (__raw_readl(cprc_base + 0x00) >> 6) & 0x0007; |
28 | clk->rate *= ifc_table[idx]; | 28 | clk->rate *= ifc_table[idx]; |
29 | } | 29 | } |
30 | 30 | ||
@@ -34,7 +34,7 @@ static struct clk_ops sh5_master_clk_ops = { | |||
34 | 34 | ||
35 | static unsigned long module_clk_recalc(struct clk *clk) | 35 | static unsigned long module_clk_recalc(struct clk *clk) |
36 | { | 36 | { |
37 | int idx = (ctrl_inw(cprc_base) >> 12) & 0x0007; | 37 | int idx = (__raw_readw(cprc_base) >> 12) & 0x0007; |
38 | return clk->parent->rate / ifc_table[idx]; | 38 | return clk->parent->rate / ifc_table[idx]; |
39 | } | 39 | } |
40 | 40 | ||
@@ -44,7 +44,7 @@ static struct clk_ops sh5_module_clk_ops = { | |||
44 | 44 | ||
45 | static unsigned long bus_clk_recalc(struct clk *clk) | 45 | static unsigned long bus_clk_recalc(struct clk *clk) |
46 | { | 46 | { |
47 | int idx = (ctrl_inw(cprc_base) >> 3) & 0x0007; | 47 | int idx = (__raw_readw(cprc_base) >> 3) & 0x0007; |
48 | return clk->parent->rate / ifc_table[idx]; | 48 | return clk->parent->rate / ifc_table[idx]; |
49 | } | 49 | } |
50 | 50 | ||
@@ -54,7 +54,7 @@ static struct clk_ops sh5_bus_clk_ops = { | |||
54 | 54 | ||
55 | static unsigned long cpu_clk_recalc(struct clk *clk) | 55 | static unsigned long cpu_clk_recalc(struct clk *clk) |
56 | { | 56 | { |
57 | int idx = (ctrl_inw(cprc_base) & 0x0007); | 57 | int idx = (__raw_readw(cprc_base) & 0x0007); |
58 | return clk->parent->rate / ifc_table[idx]; | 58 | return clk->parent->rate / ifc_table[idx]; |
59 | } | 59 | } |
60 | 60 | ||
diff --git a/arch/sh/kernel/cpu/sh5/entry.S b/arch/sh/kernel/cpu/sh5/entry.S index 8f13f73cb2cb..6b80295dd7a4 100644 --- a/arch/sh/kernel/cpu/sh5/entry.S +++ b/arch/sh/kernel/cpu/sh5/entry.S | |||
@@ -187,7 +187,7 @@ trap_jtable: | |||
187 | .rept 6 | 187 | .rept 6 |
188 | .long do_exception_error /* 0x880 - 0x920 */ | 188 | .long do_exception_error /* 0x880 - 0x920 */ |
189 | .endr | 189 | .endr |
190 | .long do_software_break_point /* 0x940 */ | 190 | .long breakpoint_trap_handler /* 0x940 */ |
191 | .long do_exception_error /* 0x960 */ | 191 | .long do_exception_error /* 0x960 */ |
192 | .long do_single_step /* 0x980 */ | 192 | .long do_single_step /* 0x980 */ |
193 | 193 | ||
@@ -1124,7 +1124,7 @@ fpu_error_or_IRQA: | |||
1124 | pta its_IRQ, tr0 | 1124 | pta its_IRQ, tr0 |
1125 | beqi/l r4, EVENT_INTERRUPT, tr0 | 1125 | beqi/l r4, EVENT_INTERRUPT, tr0 |
1126 | #ifdef CONFIG_SH_FPU | 1126 | #ifdef CONFIG_SH_FPU |
1127 | movi do_fpu_state_restore, r6 | 1127 | movi fpu_state_restore_trap_handler, r6 |
1128 | #else | 1128 | #else |
1129 | movi do_exception_error, r6 | 1129 | movi do_exception_error, r6 |
1130 | #endif | 1130 | #endif |
@@ -1135,7 +1135,7 @@ fpu_error_or_IRQB: | |||
1135 | pta its_IRQ, tr0 | 1135 | pta its_IRQ, tr0 |
1136 | beqi/l r4, EVENT_INTERRUPT, tr0 | 1136 | beqi/l r4, EVENT_INTERRUPT, tr0 |
1137 | #ifdef CONFIG_SH_FPU | 1137 | #ifdef CONFIG_SH_FPU |
1138 | movi do_fpu_state_restore, r6 | 1138 | movi fpu_state_restore_trap_handler, r6 |
1139 | #else | 1139 | #else |
1140 | movi do_exception_error, r6 | 1140 | movi do_exception_error, r6 |
1141 | #endif | 1141 | #endif |
diff --git a/arch/sh/kernel/cpu/sh5/fpu.c b/arch/sh/kernel/cpu/sh5/fpu.c index 4648ccee6c4d..4b3bb35e99f3 100644 --- a/arch/sh/kernel/cpu/sh5/fpu.c +++ b/arch/sh/kernel/cpu/sh5/fpu.c | |||
@@ -15,24 +15,6 @@ | |||
15 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
16 | #include <linux/signal.h> | 16 | #include <linux/signal.h> |
17 | #include <asm/processor.h> | 17 | #include <asm/processor.h> |
18 | #include <asm/user.h> | ||
19 | #include <asm/io.h> | ||
20 | #include <asm/fpu.h> | ||
21 | |||
22 | /* | ||
23 | * Initially load the FPU with signalling NANS. This bit pattern | ||
24 | * has the property that no matter whether considered as single or as | ||
25 | * double precision, it still represents a signalling NAN. | ||
26 | */ | ||
27 | #define sNAN64 0xFFFFFFFFFFFFFFFFULL | ||
28 | #define sNAN32 0xFFFFFFFFUL | ||
29 | |||
30 | static union sh_fpu_union init_fpuregs = { | ||
31 | .hard = { | ||
32 | .fp_regs = { [0 ... 63] = sNAN32 }, | ||
33 | .fpscr = FPSCR_INIT | ||
34 | } | ||
35 | }; | ||
36 | 18 | ||
37 | void save_fpu(struct task_struct *tsk) | 19 | void save_fpu(struct task_struct *tsk) |
38 | { | 20 | { |
@@ -72,12 +54,11 @@ void save_fpu(struct task_struct *tsk) | |||
72 | "fgetscr fr63\n\t" | 54 | "fgetscr fr63\n\t" |
73 | "fst.s %0, (32*8), fr63\n\t" | 55 | "fst.s %0, (32*8), fr63\n\t" |
74 | : /* no output */ | 56 | : /* no output */ |
75 | : "r" (&tsk->thread.fpu.hard) | 57 | : "r" (&tsk->thread.xstate->hardfpu) |
76 | : "memory"); | 58 | : "memory"); |
77 | } | 59 | } |
78 | 60 | ||
79 | static inline void | 61 | void restore_fpu(struct task_struct *tsk) |
80 | fpload(struct sh_fpu_hard_struct *fpregs) | ||
81 | { | 62 | { |
82 | asm volatile("fld.p %0, (0*8), fp0\n\t" | 63 | asm volatile("fld.p %0, (0*8), fp0\n\t" |
83 | "fld.p %0, (1*8), fp2\n\t" | 64 | "fld.p %0, (1*8), fp2\n\t" |
@@ -116,16 +97,11 @@ fpload(struct sh_fpu_hard_struct *fpregs) | |||
116 | 97 | ||
117 | "fld.p %0, (31*8), fp62\n\t" | 98 | "fld.p %0, (31*8), fp62\n\t" |
118 | : /* no output */ | 99 | : /* no output */ |
119 | : "r" (fpregs) ); | 100 | : "r" (&tsk->thread.xstate->hardfpu) |
120 | } | 101 | : "memory"); |
121 | |||
122 | void fpinit(struct sh_fpu_hard_struct *fpregs) | ||
123 | { | ||
124 | *fpregs = init_fpuregs.hard; | ||
125 | } | 102 | } |
126 | 103 | ||
127 | asmlinkage void | 104 | asmlinkage void do_fpu_error(unsigned long ex, struct pt_regs *regs) |
128 | do_fpu_error(unsigned long ex, struct pt_regs *regs) | ||
129 | { | 105 | { |
130 | struct task_struct *tsk = current; | 106 | struct task_struct *tsk = current; |
131 | 107 | ||
@@ -133,35 +109,6 @@ do_fpu_error(unsigned long ex, struct pt_regs *regs) | |||
133 | 109 | ||
134 | tsk->thread.trap_no = 11; | 110 | tsk->thread.trap_no = 11; |
135 | tsk->thread.error_code = 0; | 111 | tsk->thread.error_code = 0; |
136 | force_sig(SIGFPE, tsk); | ||
137 | } | ||
138 | |||
139 | |||
140 | asmlinkage void | ||
141 | do_fpu_state_restore(unsigned long ex, struct pt_regs *regs) | ||
142 | { | ||
143 | void die(const char *str, struct pt_regs *regs, long err); | ||
144 | |||
145 | if (! user_mode(regs)) | ||
146 | die("FPU used in kernel", regs, ex); | ||
147 | 112 | ||
148 | regs->sr &= ~SR_FD; | 113 | force_sig(SIGFPE, tsk); |
149 | |||
150 | if (last_task_used_math == current) | ||
151 | return; | ||
152 | |||
153 | enable_fpu(); | ||
154 | if (last_task_used_math != NULL) | ||
155 | /* Other processes fpu state, save away */ | ||
156 | save_fpu(last_task_used_math); | ||
157 | |||
158 | last_task_used_math = current; | ||
159 | if (used_math()) { | ||
160 | fpload(¤t->thread.fpu.hard); | ||
161 | } else { | ||
162 | /* First time FPU user. */ | ||
163 | fpload(&init_fpuregs.hard); | ||
164 | set_used_math(); | ||
165 | } | ||
166 | disable_fpu(); | ||
167 | } | 114 | } |
diff --git a/arch/sh/kernel/cpu/shmobile/pm.c b/arch/sh/kernel/cpu/shmobile/pm.c index ca029a44743c..e55968712706 100644 --- a/arch/sh/kernel/cpu/shmobile/pm.c +++ b/arch/sh/kernel/cpu/shmobile/pm.c | |||
@@ -33,7 +33,8 @@ ATOMIC_NOTIFIER_HEAD(sh_mobile_post_sleep_notifier_list); | |||
33 | #define SUSP_MODE_SLEEP (SUSP_SH_SLEEP) | 33 | #define SUSP_MODE_SLEEP (SUSP_SH_SLEEP) |
34 | #define SUSP_MODE_SLEEP_SF (SUSP_SH_SLEEP | SUSP_SH_SF) | 34 | #define SUSP_MODE_SLEEP_SF (SUSP_SH_SLEEP | SUSP_SH_SF) |
35 | #define SUSP_MODE_STANDBY_SF (SUSP_SH_STANDBY | SUSP_SH_SF) | 35 | #define SUSP_MODE_STANDBY_SF (SUSP_SH_STANDBY | SUSP_SH_SF) |
36 | #define SUSP_MODE_RSTANDBY (SUSP_SH_RSTANDBY | SUSP_SH_MMU | SUSP_SH_SF) | 36 | #define SUSP_MODE_RSTANDBY_SF \ |
37 | (SUSP_SH_RSTANDBY | SUSP_SH_MMU | SUSP_SH_REGS | SUSP_SH_SF) | ||
37 | /* | 38 | /* |
38 | * U-standby mode is unsupported since it needs bootloader hacks | 39 | * U-standby mode is unsupported since it needs bootloader hacks |
39 | */ | 40 | */ |
diff --git a/arch/sh/kernel/cpu/shmobile/sleep.S b/arch/sh/kernel/cpu/shmobile/sleep.S index e9dd7fa0abd2..e6aac65f5750 100644 --- a/arch/sh/kernel/cpu/shmobile/sleep.S +++ b/arch/sh/kernel/cpu/shmobile/sleep.S | |||
@@ -48,8 +48,48 @@ ENTRY(sh_mobile_sleep_enter_start) | |||
48 | stc sr, r0 | 48 | stc sr, r0 |
49 | mov.l r0, @(SH_SLEEP_SR, r5) | 49 | mov.l r0, @(SH_SLEEP_SR, r5) |
50 | 50 | ||
51 | /* save sp */ | 51 | /* save general purpose registers to stack if needed */ |
52 | mov.l @(SH_SLEEP_MODE, r5), r0 | ||
53 | tst #SUSP_SH_REGS, r0 | ||
54 | bt skip_regs_save | ||
55 | |||
56 | sts.l pr, @-r15 | ||
57 | mov.l r14, @-r15 | ||
58 | mov.l r13, @-r15 | ||
59 | mov.l r12, @-r15 | ||
60 | mov.l r11, @-r15 | ||
61 | mov.l r10, @-r15 | ||
62 | mov.l r9, @-r15 | ||
63 | mov.l r8, @-r15 | ||
64 | |||
65 | /* make sure bank0 is selected, save low registers */ | ||
66 | mov.l rb_bit, r9 | ||
67 | not r9, r9 | ||
68 | bsr set_sr | ||
69 | mov #0, r10 | ||
70 | |||
71 | bsr save_low_regs | ||
72 | nop | ||
73 | |||
74 | /* switch to bank 1, save low registers */ | ||
75 | mov.l rb_bit, r10 | ||
76 | bsr set_sr | ||
77 | mov #-1, r9 | ||
78 | |||
79 | bsr save_low_regs | ||
80 | nop | ||
81 | |||
82 | /* switch back to bank 0 */ | ||
83 | mov.l rb_bit, r9 | ||
84 | not r9, r9 | ||
85 | bsr set_sr | ||
86 | mov #0, r10 | ||
87 | |||
88 | skip_regs_save: | ||
89 | |||
90 | /* save sp, also set to internal ram */ | ||
52 | mov.l r15, @(SH_SLEEP_SP, r5) | 91 | mov.l r15, @(SH_SLEEP_SP, r5) |
92 | mov r5, r15 | ||
53 | 93 | ||
54 | /* save stbcr */ | 94 | /* save stbcr */ |
55 | bsr save_register | 95 | bsr save_register |
@@ -60,7 +100,7 @@ ENTRY(sh_mobile_sleep_enter_start) | |||
60 | tst #SUSP_SH_MMU, r0 | 100 | tst #SUSP_SH_MMU, r0 |
61 | bt skip_mmu_save_disable | 101 | bt skip_mmu_save_disable |
62 | 102 | ||
63 | /* save mmu state */ | 103 | /* save mmu state */ |
64 | bsr save_register | 104 | bsr save_register |
65 | mov #SH_SLEEP_REG_PTEH, r0 | 105 | mov #SH_SLEEP_REG_PTEH, r0 |
66 | 106 | ||
@@ -177,6 +217,29 @@ get_register: | |||
177 | mov.l @(r0, r5), r0 | 217 | mov.l @(r0, r5), r0 |
178 | rts | 218 | rts |
179 | nop | 219 | nop |
220 | |||
221 | set_sr: | ||
222 | stc sr, r8 | ||
223 | and r9, r8 | ||
224 | or r10, r8 | ||
225 | ldc r8, sr | ||
226 | rts | ||
227 | nop | ||
228 | |||
229 | save_low_regs: | ||
230 | mov.l r7, @-r15 | ||
231 | mov.l r6, @-r15 | ||
232 | mov.l r5, @-r15 | ||
233 | mov.l r4, @-r15 | ||
234 | mov.l r3, @-r15 | ||
235 | mov.l r2, @-r15 | ||
236 | mov.l r1, @-r15 | ||
237 | rts | ||
238 | mov.l r0, @-r15 | ||
239 | |||
240 | .balign 4 | ||
241 | rb_bit: .long 0x20000000 ! RB=1 | ||
242 | |||
180 | ENTRY(sh_mobile_sleep_enter_end) | 243 | ENTRY(sh_mobile_sleep_enter_end) |
181 | 244 | ||
182 | .balign 4 | 245 | .balign 4 |
@@ -270,6 +333,40 @@ skip_restore_sf: | |||
270 | icbi @r0 | 333 | icbi @r0 |
271 | 334 | ||
272 | skip_restore_mmu: | 335 | skip_restore_mmu: |
336 | |||
337 | /* restore general purpose registers if needed */ | ||
338 | mov.l @(SH_SLEEP_MODE, r5), r0 | ||
339 | tst #SUSP_SH_REGS, r0 | ||
340 | bt skip_restore_regs | ||
341 | |||
342 | /* switch to bank 1, restore low registers */ | ||
343 | mov.l _rb_bit, r10 | ||
344 | bsr _set_sr | ||
345 | mov #-1, r9 | ||
346 | |||
347 | bsr restore_low_regs | ||
348 | nop | ||
349 | |||
350 | /* switch to bank0, restore low registers */ | ||
351 | mov.l _rb_bit, r9 | ||
352 | not r9, r9 | ||
353 | bsr _set_sr | ||
354 | mov #0, r10 | ||
355 | |||
356 | bsr restore_low_regs | ||
357 | nop | ||
358 | |||
359 | /* restore the rest of the registers */ | ||
360 | mov.l @r15+, r8 | ||
361 | mov.l @r15+, r9 | ||
362 | mov.l @r15+, r10 | ||
363 | mov.l @r15+, r11 | ||
364 | mov.l @r15+, r12 | ||
365 | mov.l @r15+, r13 | ||
366 | mov.l @r15+, r14 | ||
367 | lds.l @r15+, pr | ||
368 | |||
369 | skip_restore_regs: | ||
273 | rte | 370 | rte |
274 | nop | 371 | nop |
275 | 372 | ||
@@ -283,6 +380,26 @@ restore_register: | |||
283 | rts | 380 | rts |
284 | nop | 381 | nop |
285 | 382 | ||
383 | _set_sr: | ||
384 | stc sr, r8 | ||
385 | and r9, r8 | ||
386 | or r10, r8 | ||
387 | ldc r8, sr | ||
388 | rts | ||
389 | nop | ||
390 | |||
391 | restore_low_regs: | ||
392 | mov.l @r15+, r0 | ||
393 | mov.l @r15+, r1 | ||
394 | mov.l @r15+, r2 | ||
395 | mov.l @r15+, r3 | ||
396 | mov.l @r15+, r4 | ||
397 | mov.l @r15+, r5 | ||
398 | mov.l @r15+, r6 | ||
399 | rts | ||
400 | mov.l @r15+, r7 | ||
401 | |||
286 | .balign 4 | 402 | .balign 4 |
403 | _rb_bit: .long 0x20000000 ! RB=1 | ||
287 | 1: .long ~0x7ff | 404 | 1: .long ~0x7ff |
288 | ENTRY(sh_mobile_sleep_resume_end) | 405 | ENTRY(sh_mobile_sleep_resume_end) |
diff --git a/arch/sh/kernel/debugtraps.S b/arch/sh/kernel/debugtraps.S index 591741383ee6..7a1b46fec0f4 100644 --- a/arch/sh/kernel/debugtraps.S +++ b/arch/sh/kernel/debugtraps.S | |||
@@ -13,7 +13,6 @@ | |||
13 | #include <linux/linkage.h> | 13 | #include <linux/linkage.h> |
14 | 14 | ||
15 | #if !defined(CONFIG_KGDB) | 15 | #if !defined(CONFIG_KGDB) |
16 | #define breakpoint_trap_handler debug_trap_handler | ||
17 | #define singlestep_trap_handler debug_trap_handler | 16 | #define singlestep_trap_handler debug_trap_handler |
18 | #endif | 17 | #endif |
19 | 18 | ||
diff --git a/arch/sh/kernel/dwarf.c b/arch/sh/kernel/dwarf.c index e51168064e56..bd1c497280a6 100644 --- a/arch/sh/kernel/dwarf.c +++ b/arch/sh/kernel/dwarf.c | |||
@@ -39,10 +39,10 @@ static mempool_t *dwarf_frame_pool; | |||
39 | static struct kmem_cache *dwarf_reg_cachep; | 39 | static struct kmem_cache *dwarf_reg_cachep; |
40 | static mempool_t *dwarf_reg_pool; | 40 | static mempool_t *dwarf_reg_pool; |
41 | 41 | ||
42 | static LIST_HEAD(dwarf_cie_list); | 42 | static struct rb_root cie_root; |
43 | static DEFINE_SPINLOCK(dwarf_cie_lock); | 43 | static DEFINE_SPINLOCK(dwarf_cie_lock); |
44 | 44 | ||
45 | static LIST_HEAD(dwarf_fde_list); | 45 | static struct rb_root fde_root; |
46 | static DEFINE_SPINLOCK(dwarf_fde_lock); | 46 | static DEFINE_SPINLOCK(dwarf_fde_lock); |
47 | 47 | ||
48 | static struct dwarf_cie *cached_cie; | 48 | static struct dwarf_cie *cached_cie; |
@@ -301,7 +301,8 @@ static inline int dwarf_entry_len(char *addr, unsigned long *len) | |||
301 | */ | 301 | */ |
302 | static struct dwarf_cie *dwarf_lookup_cie(unsigned long cie_ptr) | 302 | static struct dwarf_cie *dwarf_lookup_cie(unsigned long cie_ptr) |
303 | { | 303 | { |
304 | struct dwarf_cie *cie; | 304 | struct rb_node **rb_node = &cie_root.rb_node; |
305 | struct dwarf_cie *cie = NULL; | ||
305 | unsigned long flags; | 306 | unsigned long flags; |
306 | 307 | ||
307 | spin_lock_irqsave(&dwarf_cie_lock, flags); | 308 | spin_lock_irqsave(&dwarf_cie_lock, flags); |
@@ -315,16 +316,24 @@ static struct dwarf_cie *dwarf_lookup_cie(unsigned long cie_ptr) | |||
315 | goto out; | 316 | goto out; |
316 | } | 317 | } |
317 | 318 | ||
318 | list_for_each_entry(cie, &dwarf_cie_list, link) { | 319 | while (*rb_node) { |
319 | if (cie->cie_pointer == cie_ptr) { | 320 | struct dwarf_cie *cie_tmp; |
320 | cached_cie = cie; | 321 | |
321 | break; | 322 | cie_tmp = rb_entry(*rb_node, struct dwarf_cie, node); |
323 | BUG_ON(!cie_tmp); | ||
324 | |||
325 | if (cie_ptr == cie_tmp->cie_pointer) { | ||
326 | cie = cie_tmp; | ||
327 | cached_cie = cie_tmp; | ||
328 | goto out; | ||
329 | } else { | ||
330 | if (cie_ptr < cie_tmp->cie_pointer) | ||
331 | rb_node = &(*rb_node)->rb_left; | ||
332 | else | ||
333 | rb_node = &(*rb_node)->rb_right; | ||
322 | } | 334 | } |
323 | } | 335 | } |
324 | 336 | ||
325 | /* Couldn't find the entry in the list. */ | ||
326 | if (&cie->link == &dwarf_cie_list) | ||
327 | cie = NULL; | ||
328 | out: | 337 | out: |
329 | spin_unlock_irqrestore(&dwarf_cie_lock, flags); | 338 | spin_unlock_irqrestore(&dwarf_cie_lock, flags); |
330 | return cie; | 339 | return cie; |
@@ -336,25 +345,34 @@ out: | |||
336 | */ | 345 | */ |
337 | struct dwarf_fde *dwarf_lookup_fde(unsigned long pc) | 346 | struct dwarf_fde *dwarf_lookup_fde(unsigned long pc) |
338 | { | 347 | { |
339 | struct dwarf_fde *fde; | 348 | struct rb_node **rb_node = &fde_root.rb_node; |
349 | struct dwarf_fde *fde = NULL; | ||
340 | unsigned long flags; | 350 | unsigned long flags; |
341 | 351 | ||
342 | spin_lock_irqsave(&dwarf_fde_lock, flags); | 352 | spin_lock_irqsave(&dwarf_fde_lock, flags); |
343 | 353 | ||
344 | list_for_each_entry(fde, &dwarf_fde_list, link) { | 354 | while (*rb_node) { |
345 | unsigned long start, end; | 355 | struct dwarf_fde *fde_tmp; |
356 | unsigned long tmp_start, tmp_end; | ||
346 | 357 | ||
347 | start = fde->initial_location; | 358 | fde_tmp = rb_entry(*rb_node, struct dwarf_fde, node); |
348 | end = fde->initial_location + fde->address_range; | 359 | BUG_ON(!fde_tmp); |
349 | 360 | ||
350 | if (pc >= start && pc < end) | 361 | tmp_start = fde_tmp->initial_location; |
351 | break; | 362 | tmp_end = fde_tmp->initial_location + fde_tmp->address_range; |
352 | } | ||
353 | 363 | ||
354 | /* Couldn't find the entry in the list. */ | 364 | if (pc < tmp_start) { |
355 | if (&fde->link == &dwarf_fde_list) | 365 | rb_node = &(*rb_node)->rb_left; |
356 | fde = NULL; | 366 | } else { |
367 | if (pc < tmp_end) { | ||
368 | fde = fde_tmp; | ||
369 | goto out; | ||
370 | } else | ||
371 | rb_node = &(*rb_node)->rb_right; | ||
372 | } | ||
373 | } | ||
357 | 374 | ||
375 | out: | ||
358 | spin_unlock_irqrestore(&dwarf_fde_lock, flags); | 376 | spin_unlock_irqrestore(&dwarf_fde_lock, flags); |
359 | 377 | ||
360 | return fde; | 378 | return fde; |
@@ -552,8 +570,8 @@ extern void ret_from_irq(void); | |||
552 | * on the callstack. Each of the lower (older) stack frames are | 570 | * on the callstack. Each of the lower (older) stack frames are |
553 | * linked via the "prev" member. | 571 | * linked via the "prev" member. |
554 | */ | 572 | */ |
555 | struct dwarf_frame * dwarf_unwind_stack(unsigned long pc, | 573 | struct dwarf_frame *dwarf_unwind_stack(unsigned long pc, |
556 | struct dwarf_frame *prev) | 574 | struct dwarf_frame *prev) |
557 | { | 575 | { |
558 | struct dwarf_frame *frame; | 576 | struct dwarf_frame *frame; |
559 | struct dwarf_cie *cie; | 577 | struct dwarf_cie *cie; |
@@ -708,6 +726,8 @@ bail: | |||
708 | static int dwarf_parse_cie(void *entry, void *p, unsigned long len, | 726 | static int dwarf_parse_cie(void *entry, void *p, unsigned long len, |
709 | unsigned char *end, struct module *mod) | 727 | unsigned char *end, struct module *mod) |
710 | { | 728 | { |
729 | struct rb_node **rb_node = &cie_root.rb_node; | ||
730 | struct rb_node *parent; | ||
711 | struct dwarf_cie *cie; | 731 | struct dwarf_cie *cie; |
712 | unsigned long flags; | 732 | unsigned long flags; |
713 | int count; | 733 | int count; |
@@ -802,11 +822,30 @@ static int dwarf_parse_cie(void *entry, void *p, unsigned long len, | |||
802 | cie->initial_instructions = p; | 822 | cie->initial_instructions = p; |
803 | cie->instructions_end = end; | 823 | cie->instructions_end = end; |
804 | 824 | ||
805 | cie->mod = mod; | ||
806 | |||
807 | /* Add to list */ | 825 | /* Add to list */ |
808 | spin_lock_irqsave(&dwarf_cie_lock, flags); | 826 | spin_lock_irqsave(&dwarf_cie_lock, flags); |
809 | list_add_tail(&cie->link, &dwarf_cie_list); | 827 | |
828 | while (*rb_node) { | ||
829 | struct dwarf_cie *cie_tmp; | ||
830 | |||
831 | cie_tmp = rb_entry(*rb_node, struct dwarf_cie, node); | ||
832 | |||
833 | parent = *rb_node; | ||
834 | |||
835 | if (cie->cie_pointer < cie_tmp->cie_pointer) | ||
836 | rb_node = &parent->rb_left; | ||
837 | else if (cie->cie_pointer >= cie_tmp->cie_pointer) | ||
838 | rb_node = &parent->rb_right; | ||
839 | else | ||
840 | WARN_ON(1); | ||
841 | } | ||
842 | |||
843 | rb_link_node(&cie->node, parent, rb_node); | ||
844 | rb_insert_color(&cie->node, &cie_root); | ||
845 | |||
846 | if (mod != NULL) | ||
847 | list_add_tail(&cie->link, &mod->arch.cie_list); | ||
848 | |||
810 | spin_unlock_irqrestore(&dwarf_cie_lock, flags); | 849 | spin_unlock_irqrestore(&dwarf_cie_lock, flags); |
811 | 850 | ||
812 | return 0; | 851 | return 0; |
@@ -816,6 +855,8 @@ static int dwarf_parse_fde(void *entry, u32 entry_type, | |||
816 | void *start, unsigned long len, | 855 | void *start, unsigned long len, |
817 | unsigned char *end, struct module *mod) | 856 | unsigned char *end, struct module *mod) |
818 | { | 857 | { |
858 | struct rb_node **rb_node = &fde_root.rb_node; | ||
859 | struct rb_node *parent; | ||
819 | struct dwarf_fde *fde; | 860 | struct dwarf_fde *fde; |
820 | struct dwarf_cie *cie; | 861 | struct dwarf_cie *cie; |
821 | unsigned long flags; | 862 | unsigned long flags; |
@@ -863,11 +904,38 @@ static int dwarf_parse_fde(void *entry, u32 entry_type, | |||
863 | fde->instructions = p; | 904 | fde->instructions = p; |
864 | fde->end = end; | 905 | fde->end = end; |
865 | 906 | ||
866 | fde->mod = mod; | ||
867 | |||
868 | /* Add to list. */ | 907 | /* Add to list. */ |
869 | spin_lock_irqsave(&dwarf_fde_lock, flags); | 908 | spin_lock_irqsave(&dwarf_fde_lock, flags); |
870 | list_add_tail(&fde->link, &dwarf_fde_list); | 909 | |
910 | while (*rb_node) { | ||
911 | struct dwarf_fde *fde_tmp; | ||
912 | unsigned long tmp_start, tmp_end; | ||
913 | unsigned long start, end; | ||
914 | |||
915 | fde_tmp = rb_entry(*rb_node, struct dwarf_fde, node); | ||
916 | |||
917 | start = fde->initial_location; | ||
918 | end = fde->initial_location + fde->address_range; | ||
919 | |||
920 | tmp_start = fde_tmp->initial_location; | ||
921 | tmp_end = fde_tmp->initial_location + fde_tmp->address_range; | ||
922 | |||
923 | parent = *rb_node; | ||
924 | |||
925 | if (start < tmp_start) | ||
926 | rb_node = &parent->rb_left; | ||
927 | else if (start >= tmp_end) | ||
928 | rb_node = &parent->rb_right; | ||
929 | else | ||
930 | WARN_ON(1); | ||
931 | } | ||
932 | |||
933 | rb_link_node(&fde->node, parent, rb_node); | ||
934 | rb_insert_color(&fde->node, &fde_root); | ||
935 | |||
936 | if (mod != NULL) | ||
937 | list_add_tail(&fde->link, &mod->arch.fde_list); | ||
938 | |||
871 | spin_unlock_irqrestore(&dwarf_fde_lock, flags); | 939 | spin_unlock_irqrestore(&dwarf_fde_lock, flags); |
872 | 940 | ||
873 | return 0; | 941 | return 0; |
@@ -912,19 +980,29 @@ static struct unwinder dwarf_unwinder = { | |||
912 | 980 | ||
913 | static void dwarf_unwinder_cleanup(void) | 981 | static void dwarf_unwinder_cleanup(void) |
914 | { | 982 | { |
915 | struct dwarf_cie *cie, *cie_tmp; | 983 | struct rb_node **fde_rb_node = &fde_root.rb_node; |
916 | struct dwarf_fde *fde, *fde_tmp; | 984 | struct rb_node **cie_rb_node = &cie_root.rb_node; |
917 | 985 | ||
918 | /* | 986 | /* |
919 | * Deallocate all the memory allocated for the DWARF unwinder. | 987 | * Deallocate all the memory allocated for the DWARF unwinder. |
920 | * Traverse all the FDE/CIE lists and remove and free all the | 988 | * Traverse all the FDE/CIE lists and remove and free all the |
921 | * memory associated with those data structures. | 989 | * memory associated with those data structures. |
922 | */ | 990 | */ |
923 | list_for_each_entry_safe(cie, cie_tmp, &dwarf_cie_list, link) | 991 | while (*fde_rb_node) { |
924 | kfree(cie); | 992 | struct dwarf_fde *fde; |
925 | 993 | ||
926 | list_for_each_entry_safe(fde, fde_tmp, &dwarf_fde_list, link) | 994 | fde = rb_entry(*fde_rb_node, struct dwarf_fde, node); |
995 | rb_erase(*fde_rb_node, &fde_root); | ||
927 | kfree(fde); | 996 | kfree(fde); |
997 | } | ||
998 | |||
999 | while (*cie_rb_node) { | ||
1000 | struct dwarf_cie *cie; | ||
1001 | |||
1002 | cie = rb_entry(*cie_rb_node, struct dwarf_cie, node); | ||
1003 | rb_erase(*cie_rb_node, &cie_root); | ||
1004 | kfree(cie); | ||
1005 | } | ||
928 | 1006 | ||
929 | kmem_cache_destroy(dwarf_reg_cachep); | 1007 | kmem_cache_destroy(dwarf_reg_cachep); |
930 | kmem_cache_destroy(dwarf_frame_cachep); | 1008 | kmem_cache_destroy(dwarf_frame_cachep); |
@@ -1024,6 +1102,8 @@ int module_dwarf_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, | |||
1024 | 1102 | ||
1025 | /* Did we find the .eh_frame section? */ | 1103 | /* Did we find the .eh_frame section? */ |
1026 | if (i != hdr->e_shnum) { | 1104 | if (i != hdr->e_shnum) { |
1105 | INIT_LIST_HEAD(&me->arch.cie_list); | ||
1106 | INIT_LIST_HEAD(&me->arch.fde_list); | ||
1027 | err = dwarf_parse_section((char *)start, (char *)end, me); | 1107 | err = dwarf_parse_section((char *)start, (char *)end, me); |
1028 | if (err) { | 1108 | if (err) { |
1029 | printk(KERN_WARNING "%s: failed to parse DWARF info\n", | 1109 | printk(KERN_WARNING "%s: failed to parse DWARF info\n", |
@@ -1044,38 +1124,26 @@ int module_dwarf_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, | |||
1044 | */ | 1124 | */ |
1045 | void module_dwarf_cleanup(struct module *mod) | 1125 | void module_dwarf_cleanup(struct module *mod) |
1046 | { | 1126 | { |
1047 | struct dwarf_fde *fde; | 1127 | struct dwarf_fde *fde, *ftmp; |
1048 | struct dwarf_cie *cie; | 1128 | struct dwarf_cie *cie, *ctmp; |
1049 | unsigned long flags; | 1129 | unsigned long flags; |
1050 | 1130 | ||
1051 | spin_lock_irqsave(&dwarf_cie_lock, flags); | 1131 | spin_lock_irqsave(&dwarf_cie_lock, flags); |
1052 | 1132 | ||
1053 | again_cie: | 1133 | list_for_each_entry_safe(cie, ctmp, &mod->arch.cie_list, link) { |
1054 | list_for_each_entry(cie, &dwarf_cie_list, link) { | ||
1055 | if (cie->mod == mod) | ||
1056 | break; | ||
1057 | } | ||
1058 | |||
1059 | if (&cie->link != &dwarf_cie_list) { | ||
1060 | list_del(&cie->link); | 1134 | list_del(&cie->link); |
1135 | rb_erase(&cie->node, &cie_root); | ||
1061 | kfree(cie); | 1136 | kfree(cie); |
1062 | goto again_cie; | ||
1063 | } | 1137 | } |
1064 | 1138 | ||
1065 | spin_unlock_irqrestore(&dwarf_cie_lock, flags); | 1139 | spin_unlock_irqrestore(&dwarf_cie_lock, flags); |
1066 | 1140 | ||
1067 | spin_lock_irqsave(&dwarf_fde_lock, flags); | 1141 | spin_lock_irqsave(&dwarf_fde_lock, flags); |
1068 | 1142 | ||
1069 | again_fde: | 1143 | list_for_each_entry_safe(fde, ftmp, &mod->arch.fde_list, link) { |
1070 | list_for_each_entry(fde, &dwarf_fde_list, link) { | ||
1071 | if (fde->mod == mod) | ||
1072 | break; | ||
1073 | } | ||
1074 | |||
1075 | if (&fde->link != &dwarf_fde_list) { | ||
1076 | list_del(&fde->link); | 1144 | list_del(&fde->link); |
1145 | rb_erase(&fde->node, &fde_root); | ||
1077 | kfree(fde); | 1146 | kfree(fde); |
1078 | goto again_fde; | ||
1079 | } | 1147 | } |
1080 | 1148 | ||
1081 | spin_unlock_irqrestore(&dwarf_fde_lock, flags); | 1149 | spin_unlock_irqrestore(&dwarf_fde_lock, flags); |
@@ -1094,8 +1162,6 @@ again_fde: | |||
1094 | static int __init dwarf_unwinder_init(void) | 1162 | static int __init dwarf_unwinder_init(void) |
1095 | { | 1163 | { |
1096 | int err; | 1164 | int err; |
1097 | INIT_LIST_HEAD(&dwarf_cie_list); | ||
1098 | INIT_LIST_HEAD(&dwarf_fde_list); | ||
1099 | 1165 | ||
1100 | dwarf_frame_cachep = kmem_cache_create("dwarf_frames", | 1166 | dwarf_frame_cachep = kmem_cache_create("dwarf_frames", |
1101 | sizeof(struct dwarf_frame), 0, | 1167 | sizeof(struct dwarf_frame), 0, |
diff --git a/arch/sh/kernel/early_printk.c b/arch/sh/kernel/early_printk.c deleted file mode 100644 index f8bb50c6e050..000000000000 --- a/arch/sh/kernel/early_printk.c +++ /dev/null | |||
@@ -1,85 +0,0 @@ | |||
1 | /* | ||
2 | * arch/sh/kernel/early_printk.c | ||
3 | * | ||
4 | * Copyright (C) 1999, 2000 Niibe Yutaka | ||
5 | * Copyright (C) 2002 M. R. Brown | ||
6 | * Copyright (C) 2004 - 2007 Paul Mundt | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file "COPYING" in the main directory of this archive | ||
10 | * for more details. | ||
11 | */ | ||
12 | #include <linux/console.h> | ||
13 | #include <linux/tty.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/delay.h> | ||
17 | |||
18 | #include <asm/sh_bios.h> | ||
19 | |||
20 | /* | ||
21 | * Print a string through the BIOS | ||
22 | */ | ||
23 | static void sh_console_write(struct console *co, const char *s, | ||
24 | unsigned count) | ||
25 | { | ||
26 | sh_bios_console_write(s, count); | ||
27 | } | ||
28 | |||
29 | /* | ||
30 | * Setup initial baud/bits/parity. We do two things here: | ||
31 | * - construct a cflag setting for the first rs_open() | ||
32 | * - initialize the serial port | ||
33 | * Return non-zero if we didn't find a serial port. | ||
34 | */ | ||
35 | static int __init sh_console_setup(struct console *co, char *options) | ||
36 | { | ||
37 | int cflag = CREAD | HUPCL | CLOCAL; | ||
38 | |||
39 | /* | ||
40 | * Now construct a cflag setting. | ||
41 | * TODO: this is a totally bogus cflag, as we have | ||
42 | * no idea what serial settings the BIOS is using, or | ||
43 | * even if its using the serial port at all. | ||
44 | */ | ||
45 | cflag |= B115200 | CS8 | /*no parity*/0; | ||
46 | |||
47 | co->cflag = cflag; | ||
48 | |||
49 | return 0; | ||
50 | } | ||
51 | |||
52 | static struct console bios_console = { | ||
53 | .name = "bios", | ||
54 | .write = sh_console_write, | ||
55 | .setup = sh_console_setup, | ||
56 | .flags = CON_PRINTBUFFER, | ||
57 | .index = -1, | ||
58 | }; | ||
59 | |||
60 | static struct console *early_console; | ||
61 | |||
62 | static int __init setup_early_printk(char *buf) | ||
63 | { | ||
64 | int keep_early = 0; | ||
65 | |||
66 | if (!buf) | ||
67 | return 0; | ||
68 | |||
69 | if (strstr(buf, "keep")) | ||
70 | keep_early = 1; | ||
71 | |||
72 | if (!strncmp(buf, "bios", 4)) | ||
73 | early_console = &bios_console; | ||
74 | |||
75 | if (likely(early_console)) { | ||
76 | if (keep_early) | ||
77 | early_console->flags &= ~CON_BOOT; | ||
78 | else | ||
79 | early_console->flags |= CON_BOOT; | ||
80 | register_console(early_console); | ||
81 | } | ||
82 | |||
83 | return 0; | ||
84 | } | ||
85 | early_param("earlyprintk", setup_early_printk); | ||
diff --git a/arch/sh/kernel/head_32.S b/arch/sh/kernel/head_32.S index 1151ecdffa71..fe0b743881b0 100644 --- a/arch/sh/kernel/head_32.S +++ b/arch/sh/kernel/head_32.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * arch/sh/kernel/head.S | 3 | * arch/sh/kernel/head.S |
4 | * | 4 | * |
5 | * Copyright (C) 1999, 2000 Niibe Yutaka & Kaz Kojima | 5 | * Copyright (C) 1999, 2000 Niibe Yutaka & Kaz Kojima |
6 | * Copyright (C) 2010 Matt Fleming | ||
6 | * | 7 | * |
7 | * This file is subject to the terms and conditions of the GNU General Public | 8 | * This file is subject to the terms and conditions of the GNU General Public |
8 | * License. See the file "COPYING" in the main directory of this archive | 9 | * License. See the file "COPYING" in the main directory of this archive |
@@ -13,6 +14,8 @@ | |||
13 | #include <linux/init.h> | 14 | #include <linux/init.h> |
14 | #include <linux/linkage.h> | 15 | #include <linux/linkage.h> |
15 | #include <asm/thread_info.h> | 16 | #include <asm/thread_info.h> |
17 | #include <asm/mmu.h> | ||
18 | #include <cpu/mmu_context.h> | ||
16 | 19 | ||
17 | #ifdef CONFIG_CPU_SH4A | 20 | #ifdef CONFIG_CPU_SH4A |
18 | #define SYNCO() synco | 21 | #define SYNCO() synco |
@@ -33,7 +36,7 @@ ENTRY(empty_zero_page) | |||
33 | .long 1 /* LOADER_TYPE */ | 36 | .long 1 /* LOADER_TYPE */ |
34 | .long 0x00000000 /* INITRD_START */ | 37 | .long 0x00000000 /* INITRD_START */ |
35 | .long 0x00000000 /* INITRD_SIZE */ | 38 | .long 0x00000000 /* INITRD_SIZE */ |
36 | #if defined(CONFIG_32BIT) && defined(CONFIG_PMB_FIXED) | 39 | #ifdef CONFIG_32BIT |
37 | .long 0x53453f00 + 32 /* "SE?" = 32 bit */ | 40 | .long 0x53453f00 + 32 /* "SE?" = 32 bit */ |
38 | #else | 41 | #else |
39 | .long 0x53453f00 + 29 /* "SE?" = 29 bit */ | 42 | .long 0x53453f00 + 29 /* "SE?" = 29 bit */ |
@@ -82,6 +85,209 @@ ENTRY(_stext) | |||
82 | ldc r0, r7_bank ! ... and initial thread_info | 85 | ldc r0, r7_bank ! ... and initial thread_info |
83 | #endif | 86 | #endif |
84 | 87 | ||
88 | #ifdef CONFIG_PMB | ||
89 | /* | ||
90 | * Reconfigure the initial PMB mappings setup by the hardware. | ||
91 | * | ||
92 | * When we boot in 32-bit MMU mode there are 2 PMB entries already | ||
93 | * setup for us. | ||
94 | * | ||
95 | * Entry VPN PPN V SZ C UB WT | ||
96 | * --------------------------------------------------------------- | ||
97 | * 0 0x80000000 0x00000000 1 512MB 1 0 1 | ||
98 | * 1 0xA0000000 0x00000000 1 512MB 0 0 0 | ||
99 | * | ||
100 | * But we reprogram them here because we want complete control over | ||
101 | * our address space and the initial mappings may not map PAGE_OFFSET | ||
102 | * to __MEMORY_START (or even map all of our RAM). | ||
103 | * | ||
104 | * Once we've setup cached and uncached mappings we clear the rest of the | ||
105 | * PMB entries. This clearing also deals with the fact that PMB entries | ||
106 | * can persist across reboots. The PMB could have been left in any state | ||
107 | * when the reboot occurred, so to be safe we clear all entries and start | ||
108 | * with with a clean slate. | ||
109 | * | ||
110 | * The uncached mapping is constructed using the smallest possible | ||
111 | * mapping with a single unbufferable page. Only the kernel text needs to | ||
112 | * be covered via the uncached mapping so that certain functions can be | ||
113 | * run uncached. | ||
114 | * | ||
115 | * Drivers and the like that have previously abused the 1:1 identity | ||
116 | * mapping are unsupported in 32-bit mode and must specify their caching | ||
117 | * preference when page tables are constructed. | ||
118 | * | ||
119 | * This frees up the P2 space for more nefarious purposes. | ||
120 | * | ||
121 | * Register utilization is as follows: | ||
122 | * | ||
123 | * r0 = PMB_DATA data field | ||
124 | * r1 = PMB_DATA address field | ||
125 | * r2 = PMB_ADDR data field | ||
126 | * r3 = PMB_ADDR address field | ||
127 | * r4 = PMB_E_SHIFT | ||
128 | * r5 = remaining amount of RAM to map | ||
129 | * r6 = PMB mapping size we're trying to use | ||
130 | * r7 = cached_to_uncached | ||
131 | * r8 = scratch register | ||
132 | * r9 = scratch register | ||
133 | * r10 = number of PMB entries we've setup | ||
134 | */ | ||
135 | |||
136 | mov.l .LMMUCR, r1 /* Flush the TLB */ | ||
137 | mov.l @r1, r0 | ||
138 | or #MMUCR_TI, r0 | ||
139 | mov.l r0, @r1 | ||
140 | |||
141 | mov.l .LMEMORY_SIZE, r5 | ||
142 | |||
143 | mov #PMB_E_SHIFT, r0 | ||
144 | mov #0x1, r4 | ||
145 | shld r0, r4 | ||
146 | |||
147 | mov.l .LFIRST_DATA_ENTRY, r0 | ||
148 | mov.l .LPMB_DATA, r1 | ||
149 | mov.l .LFIRST_ADDR_ENTRY, r2 | ||
150 | mov.l .LPMB_ADDR, r3 | ||
151 | |||
152 | /* | ||
153 | * First we need to walk the PMB and figure out if there are any | ||
154 | * existing mappings that match the initial mappings VPN/PPN. | ||
155 | * If these have already been established by the bootloader, we | ||
156 | * don't bother setting up new entries here, and let the late PMB | ||
157 | * initialization take care of things instead. | ||
158 | * | ||
159 | * Note that we may need to coalesce and merge entries in order | ||
160 | * to reclaim more available PMB slots, which is much more than | ||
161 | * we want to do at this early stage. | ||
162 | */ | ||
163 | mov #0, r10 | ||
164 | mov #NR_PMB_ENTRIES, r9 | ||
165 | |||
166 | mov r1, r7 /* temporary PMB_DATA iter */ | ||
167 | |||
168 | .Lvalidate_existing_mappings: | ||
169 | |||
170 | mov.l @r7, r8 | ||
171 | and r0, r8 | ||
172 | cmp/eq r0, r8 /* Check for valid __MEMORY_START mappings */ | ||
173 | bt .Lpmb_done | ||
174 | |||
175 | add #1, r10 /* Increment the loop counter */ | ||
176 | cmp/eq r9, r10 | ||
177 | bf/s .Lvalidate_existing_mappings | ||
178 | add r4, r7 /* Increment to the next PMB_DATA entry */ | ||
179 | |||
180 | /* | ||
181 | * If we've fallen through, continue with setting up the initial | ||
182 | * mappings. | ||
183 | */ | ||
184 | |||
185 | mov r5, r7 /* cached_to_uncached */ | ||
186 | mov #0, r10 | ||
187 | |||
188 | #ifdef CONFIG_UNCACHED_MAPPING | ||
189 | /* | ||
190 | * Uncached mapping | ||
191 | */ | ||
192 | mov #(PMB_SZ_16M >> 2), r9 | ||
193 | shll2 r9 | ||
194 | |||
195 | mov #(PMB_UB >> 8), r8 | ||
196 | shll8 r8 | ||
197 | |||
198 | or r0, r8 | ||
199 | or r9, r8 | ||
200 | mov.l r8, @r1 | ||
201 | mov r2, r8 | ||
202 | add r7, r8 | ||
203 | mov.l r8, @r3 | ||
204 | |||
205 | add r4, r1 | ||
206 | add r4, r3 | ||
207 | add #1, r10 | ||
208 | #endif | ||
209 | |||
210 | /* | ||
211 | * Iterate over all of the available sizes from largest to | ||
212 | * smallest for constructing the cached mapping. | ||
213 | */ | ||
214 | #define __PMB_ITER_BY_SIZE(size) \ | ||
215 | .L##size: \ | ||
216 | mov #(size >> 4), r6; \ | ||
217 | shll16 r6; \ | ||
218 | shll8 r6; \ | ||
219 | \ | ||
220 | cmp/hi r5, r6; \ | ||
221 | bt 9999f; \ | ||
222 | \ | ||
223 | mov #(PMB_SZ_##size##M >> 2), r9; \ | ||
224 | shll2 r9; \ | ||
225 | \ | ||
226 | /* \ | ||
227 | * Cached mapping \ | ||
228 | */ \ | ||
229 | mov #PMB_C, r8; \ | ||
230 | or r0, r8; \ | ||
231 | or r9, r8; \ | ||
232 | mov.l r8, @r1; \ | ||
233 | mov.l r2, @r3; \ | ||
234 | \ | ||
235 | /* Increment to the next PMB_DATA entry */ \ | ||
236 | add r4, r1; \ | ||
237 | /* Increment to the next PMB_ADDR entry */ \ | ||
238 | add r4, r3; \ | ||
239 | /* Increment number of PMB entries */ \ | ||
240 | add #1, r10; \ | ||
241 | \ | ||
242 | sub r6, r5; \ | ||
243 | add r6, r0; \ | ||
244 | add r6, r2; \ | ||
245 | \ | ||
246 | bra .L##size; \ | ||
247 | 9999: | ||
248 | |||
249 | __PMB_ITER_BY_SIZE(512) | ||
250 | __PMB_ITER_BY_SIZE(128) | ||
251 | __PMB_ITER_BY_SIZE(64) | ||
252 | __PMB_ITER_BY_SIZE(16) | ||
253 | |||
254 | #ifdef CONFIG_UNCACHED_MAPPING | ||
255 | /* | ||
256 | * Now that we can access it, update cached_to_uncached and | ||
257 | * uncached_size. | ||
258 | */ | ||
259 | mov.l .Lcached_to_uncached, r0 | ||
260 | mov.l r7, @r0 | ||
261 | |||
262 | mov.l .Luncached_size, r0 | ||
263 | mov #1, r7 | ||
264 | shll16 r7 | ||
265 | shll8 r7 | ||
266 | mov.l r7, @r0 | ||
267 | #endif | ||
268 | |||
269 | /* | ||
270 | * Clear the remaining PMB entries. | ||
271 | * | ||
272 | * r3 = entry to begin clearing from | ||
273 | * r10 = number of entries we've setup so far | ||
274 | */ | ||
275 | mov #0, r1 | ||
276 | mov #NR_PMB_ENTRIES, r0 | ||
277 | |||
278 | .Lagain: | ||
279 | mov.l r1, @r3 /* Clear PMB_ADDR entry */ | ||
280 | add #1, r10 /* Increment the loop counter */ | ||
281 | cmp/eq r0, r10 | ||
282 | bf/s .Lagain | ||
283 | add r4, r3 /* Increment to the next PMB_ADDR entry */ | ||
284 | |||
285 | mov.l 6f, r0 | ||
286 | icbi @r0 | ||
287 | |||
288 | .Lpmb_done: | ||
289 | #endif /* CONFIG_PMB */ | ||
290 | |||
85 | #ifndef CONFIG_SH_NO_BSS_INIT | 291 | #ifndef CONFIG_SH_NO_BSS_INIT |
86 | /* | 292 | /* |
87 | * Don't clear BSS if running on slow platforms such as an RTL simulation, | 293 | * Don't clear BSS if running on slow platforms such as an RTL simulation, |
@@ -131,3 +337,16 @@ ENTRY(stack_start) | |||
131 | 5: .long start_kernel | 337 | 5: .long start_kernel |
132 | 6: .long sh_cpu_init | 338 | 6: .long sh_cpu_init |
133 | 7: .long init_thread_union | 339 | 7: .long init_thread_union |
340 | |||
341 | #ifdef CONFIG_PMB | ||
342 | .LPMB_ADDR: .long PMB_ADDR | ||
343 | .LPMB_DATA: .long PMB_DATA | ||
344 | .LFIRST_ADDR_ENTRY: .long PAGE_OFFSET | PMB_V | ||
345 | .LFIRST_DATA_ENTRY: .long __MEMORY_START | PMB_V | ||
346 | .LMMUCR: .long MMUCR | ||
347 | .LMEMORY_SIZE: .long __MEMORY_SIZE | ||
348 | #ifdef CONFIG_UNCACHED_MAPPING | ||
349 | .Lcached_to_uncached: .long cached_to_uncached | ||
350 | .Luncached_size: .long uncached_size | ||
351 | #endif | ||
352 | #endif | ||
diff --git a/arch/sh/kernel/head_64.S b/arch/sh/kernel/head_64.S index 3ea765844c74..defd851abefa 100644 --- a/arch/sh/kernel/head_64.S +++ b/arch/sh/kernel/head_64.S | |||
@@ -220,7 +220,6 @@ clear_DTLB: | |||
220 | add.l r22, r63, r22 /* Sign extend */ | 220 | add.l r22, r63, r22 /* Sign extend */ |
221 | putcfg r21, 0, r22 /* Set MMUDR[0].PTEH */ | 221 | putcfg r21, 0, r22 /* Set MMUDR[0].PTEH */ |
222 | 222 | ||
223 | #ifdef CONFIG_EARLY_PRINTK | ||
224 | /* | 223 | /* |
225 | * Setup a DTLB translation for SCIF phys. | 224 | * Setup a DTLB translation for SCIF phys. |
226 | */ | 225 | */ |
@@ -231,7 +230,6 @@ clear_DTLB: | |||
231 | movi 0xfa03, r22 /* 0xfa030000, fixed SCIF virt */ | 230 | movi 0xfa03, r22 /* 0xfa030000, fixed SCIF virt */ |
232 | shori 0x0003, r22 | 231 | shori 0x0003, r22 |
233 | putcfg r21, 0, r22 /* PTEH last */ | 232 | putcfg r21, 0, r22 /* PTEH last */ |
234 | #endif | ||
235 | 233 | ||
236 | /* | 234 | /* |
237 | * Set cache behaviours. | 235 | * Set cache behaviours. |
diff --git a/arch/sh/kernel/hw_breakpoint.c b/arch/sh/kernel/hw_breakpoint.c new file mode 100644 index 000000000000..e2f1753d275c --- /dev/null +++ b/arch/sh/kernel/hw_breakpoint.c | |||
@@ -0,0 +1,463 @@ | |||
1 | /* | ||
2 | * arch/sh/kernel/hw_breakpoint.c | ||
3 | * | ||
4 | * Unified kernel/user-space hardware breakpoint facility for the on-chip UBC. | ||
5 | * | ||
6 | * Copyright (C) 2009 - 2010 Paul Mundt | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file "COPYING" in the main directory of this archive | ||
10 | * for more details. | ||
11 | */ | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/perf_event.h> | ||
14 | #include <linux/hw_breakpoint.h> | ||
15 | #include <linux/percpu.h> | ||
16 | #include <linux/kallsyms.h> | ||
17 | #include <linux/notifier.h> | ||
18 | #include <linux/kprobes.h> | ||
19 | #include <linux/kdebug.h> | ||
20 | #include <linux/io.h> | ||
21 | #include <linux/clk.h> | ||
22 | #include <asm/hw_breakpoint.h> | ||
23 | #include <asm/mmu_context.h> | ||
24 | #include <asm/ptrace.h> | ||
25 | |||
26 | /* | ||
27 | * Stores the breakpoints currently in use on each breakpoint address | ||
28 | * register for each cpus | ||
29 | */ | ||
30 | static DEFINE_PER_CPU(struct perf_event *, bp_per_reg[HBP_NUM]); | ||
31 | |||
32 | /* | ||
33 | * A dummy placeholder for early accesses until the CPUs get a chance to | ||
34 | * register their UBCs later in the boot process. | ||
35 | */ | ||
36 | static struct sh_ubc ubc_dummy = { .num_events = 0 }; | ||
37 | |||
38 | static struct sh_ubc *sh_ubc __read_mostly = &ubc_dummy; | ||
39 | |||
40 | /* | ||
41 | * Install a perf counter breakpoint. | ||
42 | * | ||
43 | * We seek a free UBC channel and use it for this breakpoint. | ||
44 | * | ||
45 | * Atomic: we hold the counter->ctx->lock and we only handle variables | ||
46 | * and registers local to this cpu. | ||
47 | */ | ||
48 | int arch_install_hw_breakpoint(struct perf_event *bp) | ||
49 | { | ||
50 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); | ||
51 | int i; | ||
52 | |||
53 | for (i = 0; i < sh_ubc->num_events; i++) { | ||
54 | struct perf_event **slot = &__get_cpu_var(bp_per_reg[i]); | ||
55 | |||
56 | if (!*slot) { | ||
57 | *slot = bp; | ||
58 | break; | ||
59 | } | ||
60 | } | ||
61 | |||
62 | if (WARN_ONCE(i == sh_ubc->num_events, "Can't find any breakpoint slot")) | ||
63 | return -EBUSY; | ||
64 | |||
65 | clk_enable(sh_ubc->clk); | ||
66 | sh_ubc->enable(info, i); | ||
67 | |||
68 | return 0; | ||
69 | } | ||
70 | |||
71 | /* | ||
72 | * Uninstall the breakpoint contained in the given counter. | ||
73 | * | ||
74 | * First we search the debug address register it uses and then we disable | ||
75 | * it. | ||
76 | * | ||
77 | * Atomic: we hold the counter->ctx->lock and we only handle variables | ||
78 | * and registers local to this cpu. | ||
79 | */ | ||
80 | void arch_uninstall_hw_breakpoint(struct perf_event *bp) | ||
81 | { | ||
82 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); | ||
83 | int i; | ||
84 | |||
85 | for (i = 0; i < sh_ubc->num_events; i++) { | ||
86 | struct perf_event **slot = &__get_cpu_var(bp_per_reg[i]); | ||
87 | |||
88 | if (*slot == bp) { | ||
89 | *slot = NULL; | ||
90 | break; | ||
91 | } | ||
92 | } | ||
93 | |||
94 | if (WARN_ONCE(i == sh_ubc->num_events, "Can't find any breakpoint slot")) | ||
95 | return; | ||
96 | |||
97 | sh_ubc->disable(info, i); | ||
98 | clk_disable(sh_ubc->clk); | ||
99 | } | ||
100 | |||
101 | static int get_hbp_len(u16 hbp_len) | ||
102 | { | ||
103 | unsigned int len_in_bytes = 0; | ||
104 | |||
105 | switch (hbp_len) { | ||
106 | case SH_BREAKPOINT_LEN_1: | ||
107 | len_in_bytes = 1; | ||
108 | break; | ||
109 | case SH_BREAKPOINT_LEN_2: | ||
110 | len_in_bytes = 2; | ||
111 | break; | ||
112 | case SH_BREAKPOINT_LEN_4: | ||
113 | len_in_bytes = 4; | ||
114 | break; | ||
115 | case SH_BREAKPOINT_LEN_8: | ||
116 | len_in_bytes = 8; | ||
117 | break; | ||
118 | } | ||
119 | return len_in_bytes; | ||
120 | } | ||
121 | |||
122 | /* | ||
123 | * Check for virtual address in user space. | ||
124 | */ | ||
125 | int arch_check_va_in_userspace(unsigned long va, u16 hbp_len) | ||
126 | { | ||
127 | unsigned int len; | ||
128 | |||
129 | len = get_hbp_len(hbp_len); | ||
130 | |||
131 | return (va <= TASK_SIZE - len); | ||
132 | } | ||
133 | |||
134 | /* | ||
135 | * Check for virtual address in kernel space. | ||
136 | */ | ||
137 | static int arch_check_va_in_kernelspace(unsigned long va, u8 hbp_len) | ||
138 | { | ||
139 | unsigned int len; | ||
140 | |||
141 | len = get_hbp_len(hbp_len); | ||
142 | |||
143 | return (va >= TASK_SIZE) && ((va + len - 1) >= TASK_SIZE); | ||
144 | } | ||
145 | |||
146 | /* | ||
147 | * Store a breakpoint's encoded address, length, and type. | ||
148 | */ | ||
149 | static int arch_store_info(struct perf_event *bp) | ||
150 | { | ||
151 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); | ||
152 | |||
153 | /* | ||
154 | * User-space requests will always have the address field populated | ||
155 | * For kernel-addresses, either the address or symbol name can be | ||
156 | * specified. | ||
157 | */ | ||
158 | if (info->name) | ||
159 | info->address = (unsigned long)kallsyms_lookup_name(info->name); | ||
160 | if (info->address) | ||
161 | return 0; | ||
162 | |||
163 | return -EINVAL; | ||
164 | } | ||
165 | |||
166 | int arch_bp_generic_fields(int sh_len, int sh_type, | ||
167 | int *gen_len, int *gen_type) | ||
168 | { | ||
169 | /* Len */ | ||
170 | switch (sh_len) { | ||
171 | case SH_BREAKPOINT_LEN_1: | ||
172 | *gen_len = HW_BREAKPOINT_LEN_1; | ||
173 | break; | ||
174 | case SH_BREAKPOINT_LEN_2: | ||
175 | *gen_len = HW_BREAKPOINT_LEN_2; | ||
176 | break; | ||
177 | case SH_BREAKPOINT_LEN_4: | ||
178 | *gen_len = HW_BREAKPOINT_LEN_4; | ||
179 | break; | ||
180 | case SH_BREAKPOINT_LEN_8: | ||
181 | *gen_len = HW_BREAKPOINT_LEN_8; | ||
182 | break; | ||
183 | default: | ||
184 | return -EINVAL; | ||
185 | } | ||
186 | |||
187 | /* Type */ | ||
188 | switch (sh_type) { | ||
189 | case SH_BREAKPOINT_READ: | ||
190 | *gen_type = HW_BREAKPOINT_R; | ||
191 | case SH_BREAKPOINT_WRITE: | ||
192 | *gen_type = HW_BREAKPOINT_W; | ||
193 | break; | ||
194 | case SH_BREAKPOINT_RW: | ||
195 | *gen_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R; | ||
196 | break; | ||
197 | default: | ||
198 | return -EINVAL; | ||
199 | } | ||
200 | |||
201 | return 0; | ||
202 | } | ||
203 | |||
204 | static int arch_build_bp_info(struct perf_event *bp) | ||
205 | { | ||
206 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); | ||
207 | |||
208 | info->address = bp->attr.bp_addr; | ||
209 | |||
210 | /* Len */ | ||
211 | switch (bp->attr.bp_len) { | ||
212 | case HW_BREAKPOINT_LEN_1: | ||
213 | info->len = SH_BREAKPOINT_LEN_1; | ||
214 | break; | ||
215 | case HW_BREAKPOINT_LEN_2: | ||
216 | info->len = SH_BREAKPOINT_LEN_2; | ||
217 | break; | ||
218 | case HW_BREAKPOINT_LEN_4: | ||
219 | info->len = SH_BREAKPOINT_LEN_4; | ||
220 | break; | ||
221 | case HW_BREAKPOINT_LEN_8: | ||
222 | info->len = SH_BREAKPOINT_LEN_8; | ||
223 | break; | ||
224 | default: | ||
225 | return -EINVAL; | ||
226 | } | ||
227 | |||
228 | /* Type */ | ||
229 | switch (bp->attr.bp_type) { | ||
230 | case HW_BREAKPOINT_R: | ||
231 | info->type = SH_BREAKPOINT_READ; | ||
232 | break; | ||
233 | case HW_BREAKPOINT_W: | ||
234 | info->type = SH_BREAKPOINT_WRITE; | ||
235 | break; | ||
236 | case HW_BREAKPOINT_W | HW_BREAKPOINT_R: | ||
237 | info->type = SH_BREAKPOINT_RW; | ||
238 | break; | ||
239 | default: | ||
240 | return -EINVAL; | ||
241 | } | ||
242 | |||
243 | return 0; | ||
244 | } | ||
245 | |||
246 | /* | ||
247 | * Validate the arch-specific HW Breakpoint register settings | ||
248 | */ | ||
249 | int arch_validate_hwbkpt_settings(struct perf_event *bp, | ||
250 | struct task_struct *tsk) | ||
251 | { | ||
252 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); | ||
253 | unsigned int align; | ||
254 | int ret; | ||
255 | |||
256 | ret = arch_build_bp_info(bp); | ||
257 | if (ret) | ||
258 | return ret; | ||
259 | |||
260 | ret = -EINVAL; | ||
261 | |||
262 | switch (info->len) { | ||
263 | case SH_BREAKPOINT_LEN_1: | ||
264 | align = 0; | ||
265 | break; | ||
266 | case SH_BREAKPOINT_LEN_2: | ||
267 | align = 1; | ||
268 | break; | ||
269 | case SH_BREAKPOINT_LEN_4: | ||
270 | align = 3; | ||
271 | break; | ||
272 | case SH_BREAKPOINT_LEN_8: | ||
273 | align = 7; | ||
274 | break; | ||
275 | default: | ||
276 | return ret; | ||
277 | } | ||
278 | |||
279 | ret = arch_store_info(bp); | ||
280 | |||
281 | if (ret < 0) | ||
282 | return ret; | ||
283 | |||
284 | /* | ||
285 | * Check that the low-order bits of the address are appropriate | ||
286 | * for the alignment implied by len. | ||
287 | */ | ||
288 | if (info->address & align) | ||
289 | return -EINVAL; | ||
290 | |||
291 | /* Check that the virtual address is in the proper range */ | ||
292 | if (tsk) { | ||
293 | if (!arch_check_va_in_userspace(info->address, info->len)) | ||
294 | return -EFAULT; | ||
295 | } else { | ||
296 | if (!arch_check_va_in_kernelspace(info->address, info->len)) | ||
297 | return -EFAULT; | ||
298 | } | ||
299 | |||
300 | return 0; | ||
301 | } | ||
302 | |||
303 | /* | ||
304 | * Release the user breakpoints used by ptrace | ||
305 | */ | ||
306 | void flush_ptrace_hw_breakpoint(struct task_struct *tsk) | ||
307 | { | ||
308 | int i; | ||
309 | struct thread_struct *t = &tsk->thread; | ||
310 | |||
311 | for (i = 0; i < sh_ubc->num_events; i++) { | ||
312 | unregister_hw_breakpoint(t->ptrace_bps[i]); | ||
313 | t->ptrace_bps[i] = NULL; | ||
314 | } | ||
315 | } | ||
316 | |||
317 | static int __kprobes hw_breakpoint_handler(struct die_args *args) | ||
318 | { | ||
319 | int cpu, i, rc = NOTIFY_STOP; | ||
320 | struct perf_event *bp; | ||
321 | unsigned int cmf, resume_mask; | ||
322 | |||
323 | /* | ||
324 | * Do an early return if none of the channels triggered. | ||
325 | */ | ||
326 | cmf = sh_ubc->triggered_mask(); | ||
327 | if (unlikely(!cmf)) | ||
328 | return NOTIFY_DONE; | ||
329 | |||
330 | /* | ||
331 | * By default, resume all of the active channels. | ||
332 | */ | ||
333 | resume_mask = sh_ubc->active_mask(); | ||
334 | |||
335 | /* | ||
336 | * Disable breakpoints during exception handling. | ||
337 | */ | ||
338 | sh_ubc->disable_all(); | ||
339 | |||
340 | cpu = get_cpu(); | ||
341 | for (i = 0; i < sh_ubc->num_events; i++) { | ||
342 | unsigned long event_mask = (1 << i); | ||
343 | |||
344 | if (likely(!(cmf & event_mask))) | ||
345 | continue; | ||
346 | |||
347 | /* | ||
348 | * The counter may be concurrently released but that can only | ||
349 | * occur from a call_rcu() path. We can then safely fetch | ||
350 | * the breakpoint, use its callback, touch its counter | ||
351 | * while we are in an rcu_read_lock() path. | ||
352 | */ | ||
353 | rcu_read_lock(); | ||
354 | |||
355 | bp = per_cpu(bp_per_reg[i], cpu); | ||
356 | if (bp) | ||
357 | rc = NOTIFY_DONE; | ||
358 | |||
359 | /* | ||
360 | * Reset the condition match flag to denote completion of | ||
361 | * exception handling. | ||
362 | */ | ||
363 | sh_ubc->clear_triggered_mask(event_mask); | ||
364 | |||
365 | /* | ||
366 | * bp can be NULL due to concurrent perf counter | ||
367 | * removing. | ||
368 | */ | ||
369 | if (!bp) { | ||
370 | rcu_read_unlock(); | ||
371 | break; | ||
372 | } | ||
373 | |||
374 | /* | ||
375 | * Don't restore the channel if the breakpoint is from | ||
376 | * ptrace, as it always operates in one-shot mode. | ||
377 | */ | ||
378 | if (bp->overflow_handler == ptrace_triggered) | ||
379 | resume_mask &= ~(1 << i); | ||
380 | |||
381 | perf_bp_event(bp, args->regs); | ||
382 | |||
383 | /* Deliver the signal to userspace */ | ||
384 | if (arch_check_va_in_userspace(bp->attr.bp_addr, | ||
385 | bp->attr.bp_len)) { | ||
386 | siginfo_t info; | ||
387 | |||
388 | info.si_signo = args->signr; | ||
389 | info.si_errno = notifier_to_errno(rc); | ||
390 | info.si_code = TRAP_HWBKPT; | ||
391 | |||
392 | force_sig_info(args->signr, &info, current); | ||
393 | } | ||
394 | |||
395 | rcu_read_unlock(); | ||
396 | } | ||
397 | |||
398 | if (cmf == 0) | ||
399 | rc = NOTIFY_DONE; | ||
400 | |||
401 | sh_ubc->enable_all(resume_mask); | ||
402 | |||
403 | put_cpu(); | ||
404 | |||
405 | return rc; | ||
406 | } | ||
407 | |||
408 | BUILD_TRAP_HANDLER(breakpoint) | ||
409 | { | ||
410 | unsigned long ex = lookup_exception_vector(); | ||
411 | TRAP_HANDLER_DECL; | ||
412 | |||
413 | notify_die(DIE_BREAKPOINT, "breakpoint", regs, 0, ex, SIGTRAP); | ||
414 | } | ||
415 | |||
416 | /* | ||
417 | * Handle debug exception notifications. | ||
418 | */ | ||
419 | int __kprobes hw_breakpoint_exceptions_notify(struct notifier_block *unused, | ||
420 | unsigned long val, void *data) | ||
421 | { | ||
422 | struct die_args *args = data; | ||
423 | |||
424 | if (val != DIE_BREAKPOINT) | ||
425 | return NOTIFY_DONE; | ||
426 | |||
427 | /* | ||
428 | * If the breakpoint hasn't been triggered by the UBC, it's | ||
429 | * probably from a debugger, so don't do anything more here. | ||
430 | * | ||
431 | * This also permits the UBC interface clock to remain off for | ||
432 | * non-UBC breakpoints, as we don't need to check the triggered | ||
433 | * or active channel masks. | ||
434 | */ | ||
435 | if (args->trapnr != sh_ubc->trap_nr) | ||
436 | return NOTIFY_DONE; | ||
437 | |||
438 | return hw_breakpoint_handler(data); | ||
439 | } | ||
440 | |||
441 | void hw_breakpoint_pmu_read(struct perf_event *bp) | ||
442 | { | ||
443 | /* TODO */ | ||
444 | } | ||
445 | |||
446 | void hw_breakpoint_pmu_unthrottle(struct perf_event *bp) | ||
447 | { | ||
448 | /* TODO */ | ||
449 | } | ||
450 | |||
451 | int register_sh_ubc(struct sh_ubc *ubc) | ||
452 | { | ||
453 | /* Bail if it's already assigned */ | ||
454 | if (sh_ubc != &ubc_dummy) | ||
455 | return -EBUSY; | ||
456 | sh_ubc = ubc; | ||
457 | |||
458 | pr_info("HW Breakpoints: %s UBC support registered\n", ubc->name); | ||
459 | |||
460 | WARN_ON(ubc->num_events > HBP_NUM); | ||
461 | |||
462 | return 0; | ||
463 | } | ||
diff --git a/arch/sh/kernel/idle.c b/arch/sh/kernel/idle.c index 6b3d706deac1..0fd7b41f0a22 100644 --- a/arch/sh/kernel/idle.c +++ b/arch/sh/kernel/idle.c | |||
@@ -20,10 +20,9 @@ | |||
20 | #include <asm/system.h> | 20 | #include <asm/system.h> |
21 | #include <asm/atomic.h> | 21 | #include <asm/atomic.h> |
22 | 22 | ||
23 | static int hlt_counter; | ||
24 | void (*pm_idle)(void) = NULL; | 23 | void (*pm_idle)(void) = NULL; |
25 | void (*pm_power_off)(void); | 24 | |
26 | EXPORT_SYMBOL(pm_power_off); | 25 | static int hlt_counter; |
27 | 26 | ||
28 | static int __init nohlt_setup(char *__unused) | 27 | static int __init nohlt_setup(char *__unused) |
29 | { | 28 | { |
@@ -131,6 +130,15 @@ static void do_nothing(void *unused) | |||
131 | { | 130 | { |
132 | } | 131 | } |
133 | 132 | ||
133 | void stop_this_cpu(void *unused) | ||
134 | { | ||
135 | local_irq_disable(); | ||
136 | cpu_clear(smp_processor_id(), cpu_online_map); | ||
137 | |||
138 | for (;;) | ||
139 | cpu_sleep(); | ||
140 | } | ||
141 | |||
134 | /* | 142 | /* |
135 | * cpu_idle_wait - Used to ensure that all the CPUs discard old value of | 143 | * cpu_idle_wait - Used to ensure that all the CPUs discard old value of |
136 | * pm_idle and update to new pm_idle value. Required while changing pm_idle | 144 | * pm_idle and update to new pm_idle value. Required while changing pm_idle |
diff --git a/arch/sh/kernel/io_trapped.c b/arch/sh/kernel/io_trapped.c index 69be603aa2d7..4a8bb4eeb8ad 100644 --- a/arch/sh/kernel/io_trapped.c +++ b/arch/sh/kernel/io_trapped.c | |||
@@ -184,31 +184,31 @@ static unsigned long long copy_word(unsigned long src_addr, int src_len, | |||
184 | 184 | ||
185 | switch (src_len) { | 185 | switch (src_len) { |
186 | case 1: | 186 | case 1: |
187 | tmp = ctrl_inb(src_addr); | 187 | tmp = __raw_readb(src_addr); |
188 | break; | 188 | break; |
189 | case 2: | 189 | case 2: |
190 | tmp = ctrl_inw(src_addr); | 190 | tmp = __raw_readw(src_addr); |
191 | break; | 191 | break; |
192 | case 4: | 192 | case 4: |
193 | tmp = ctrl_inl(src_addr); | 193 | tmp = __raw_readl(src_addr); |
194 | break; | 194 | break; |
195 | case 8: | 195 | case 8: |
196 | tmp = ctrl_inq(src_addr); | 196 | tmp = __raw_readq(src_addr); |
197 | break; | 197 | break; |
198 | } | 198 | } |
199 | 199 | ||
200 | switch (dst_len) { | 200 | switch (dst_len) { |
201 | case 1: | 201 | case 1: |
202 | ctrl_outb(tmp, dst_addr); | 202 | __raw_writeb(tmp, dst_addr); |
203 | break; | 203 | break; |
204 | case 2: | 204 | case 2: |
205 | ctrl_outw(tmp, dst_addr); | 205 | __raw_writew(tmp, dst_addr); |
206 | break; | 206 | break; |
207 | case 4: | 207 | case 4: |
208 | ctrl_outl(tmp, dst_addr); | 208 | __raw_writel(tmp, dst_addr); |
209 | break; | 209 | break; |
210 | case 8: | 210 | case 8: |
211 | ctrl_outq(tmp, dst_addr); | 211 | __raw_writeq(tmp, dst_addr); |
212 | break; | 212 | break; |
213 | } | 213 | } |
214 | 214 | ||
@@ -271,6 +271,8 @@ int handle_trapped_io(struct pt_regs *regs, unsigned long address) | |||
271 | insn_size_t instruction; | 271 | insn_size_t instruction; |
272 | int tmp; | 272 | int tmp; |
273 | 273 | ||
274 | if (trapped_io_disable) | ||
275 | return 0; | ||
274 | if (!lookup_tiop(address)) | 276 | if (!lookup_tiop(address)) |
275 | return 0; | 277 | return 0; |
276 | 278 | ||
diff --git a/arch/sh/kernel/kgdb.c b/arch/sh/kernel/kgdb.c index 3e532d0d4a5c..70c69659b846 100644 --- a/arch/sh/kernel/kgdb.c +++ b/arch/sh/kernel/kgdb.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * SuperH KGDB support | 2 | * SuperH KGDB support |
3 | * | 3 | * |
4 | * Copyright (C) 2008 Paul Mundt | 4 | * Copyright (C) 2008 - 2009 Paul Mundt |
5 | * | 5 | * |
6 | * Single stepping taken from the old stub by Henry Bell and Jeremy Siegel. | 6 | * Single stepping taken from the old stub by Henry Bell and Jeremy Siegel. |
7 | * | 7 | * |
@@ -251,24 +251,60 @@ BUILD_TRAP_HANDLER(singlestep) | |||
251 | local_irq_restore(flags); | 251 | local_irq_restore(flags); |
252 | } | 252 | } |
253 | 253 | ||
254 | static int __kgdb_notify(struct die_args *args, unsigned long cmd) | ||
255 | { | ||
256 | int ret; | ||
257 | |||
258 | switch (cmd) { | ||
259 | case DIE_BREAKPOINT: | ||
260 | /* | ||
261 | * This means a user thread is single stepping | ||
262 | * a system call which should be ignored | ||
263 | */ | ||
264 | if (test_thread_flag(TIF_SINGLESTEP)) | ||
265 | return NOTIFY_DONE; | ||
266 | |||
267 | ret = kgdb_handle_exception(args->trapnr & 0xff, args->signr, | ||
268 | args->err, args->regs); | ||
269 | if (ret) | ||
270 | return NOTIFY_DONE; | ||
271 | |||
272 | break; | ||
273 | } | ||
254 | 274 | ||
255 | BUILD_TRAP_HANDLER(breakpoint) | 275 | return NOTIFY_STOP; |
276 | } | ||
277 | |||
278 | static int | ||
279 | kgdb_notify(struct notifier_block *self, unsigned long cmd, void *ptr) | ||
256 | { | 280 | { |
257 | unsigned long flags; | 281 | unsigned long flags; |
258 | TRAP_HANDLER_DECL; | 282 | int ret; |
259 | 283 | ||
260 | local_irq_save(flags); | 284 | local_irq_save(flags); |
261 | kgdb_handle_exception(vec >> 2, SIGTRAP, 0, regs); | 285 | ret = __kgdb_notify(ptr, cmd); |
262 | local_irq_restore(flags); | 286 | local_irq_restore(flags); |
287 | |||
288 | return ret; | ||
263 | } | 289 | } |
264 | 290 | ||
291 | static struct notifier_block kgdb_notifier = { | ||
292 | .notifier_call = kgdb_notify, | ||
293 | |||
294 | /* | ||
295 | * Lowest-prio notifier priority, we want to be notified last: | ||
296 | */ | ||
297 | .priority = -INT_MAX, | ||
298 | }; | ||
299 | |||
265 | int kgdb_arch_init(void) | 300 | int kgdb_arch_init(void) |
266 | { | 301 | { |
267 | return 0; | 302 | return register_die_notifier(&kgdb_notifier); |
268 | } | 303 | } |
269 | 304 | ||
270 | void kgdb_arch_exit(void) | 305 | void kgdb_arch_exit(void) |
271 | { | 306 | { |
307 | unregister_die_notifier(&kgdb_notifier); | ||
272 | } | 308 | } |
273 | 309 | ||
274 | struct kgdb_arch arch_kgdb_ops = { | 310 | struct kgdb_arch arch_kgdb_ops = { |
diff --git a/arch/sh/kernel/machine_kexec.c b/arch/sh/kernel/machine_kexec.c index 76f280223ebd..7672141c841b 100644 --- a/arch/sh/kernel/machine_kexec.c +++ b/arch/sh/kernel/machine_kexec.c | |||
@@ -21,6 +21,8 @@ | |||
21 | #include <asm/mmu_context.h> | 21 | #include <asm/mmu_context.h> |
22 | #include <asm/io.h> | 22 | #include <asm/io.h> |
23 | #include <asm/cacheflush.h> | 23 | #include <asm/cacheflush.h> |
24 | #include <asm/sh_bios.h> | ||
25 | #include <asm/reboot.h> | ||
24 | 26 | ||
25 | typedef void (*relocate_new_kernel_t)(unsigned long indirection_page, | 27 | typedef void (*relocate_new_kernel_t)(unsigned long indirection_page, |
26 | unsigned long reboot_code_buffer, | 28 | unsigned long reboot_code_buffer, |
@@ -28,15 +30,11 @@ typedef void (*relocate_new_kernel_t)(unsigned long indirection_page, | |||
28 | 30 | ||
29 | extern const unsigned char relocate_new_kernel[]; | 31 | extern const unsigned char relocate_new_kernel[]; |
30 | extern const unsigned int relocate_new_kernel_size; | 32 | extern const unsigned int relocate_new_kernel_size; |
31 | extern void *gdb_vbr_vector; | ||
32 | extern void *vbr_base; | 33 | extern void *vbr_base; |
33 | 34 | ||
34 | void machine_shutdown(void) | 35 | void native_machine_crash_shutdown(struct pt_regs *regs) |
35 | { | ||
36 | } | ||
37 | |||
38 | void machine_crash_shutdown(struct pt_regs *regs) | ||
39 | { | 36 | { |
37 | /* Nothing to do for UP, but definitely broken for SMP.. */ | ||
40 | } | 38 | } |
41 | 39 | ||
42 | /* | 40 | /* |
@@ -117,11 +115,7 @@ void machine_kexec(struct kimage *image) | |||
117 | kexec_info(image); | 115 | kexec_info(image); |
118 | flush_cache_all(); | 116 | flush_cache_all(); |
119 | 117 | ||
120 | #if defined(CONFIG_SH_STANDARD_BIOS) | 118 | sh_bios_vbr_reload(); |
121 | asm volatile("ldc %0, vbr" : | ||
122 | : "r" (((unsigned long) gdb_vbr_vector) - 0x100) | ||
123 | : "memory"); | ||
124 | #endif | ||
125 | 119 | ||
126 | /* now call it */ | 120 | /* now call it */ |
127 | rnk = (relocate_new_kernel_t) reboot_code_buffer; | 121 | rnk = (relocate_new_kernel_t) reboot_code_buffer; |
diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c new file mode 100644 index 000000000000..81add9b9ea6e --- /dev/null +++ b/arch/sh/kernel/process.c | |||
@@ -0,0 +1,100 @@ | |||
1 | #include <linux/mm.h> | ||
2 | #include <linux/kernel.h> | ||
3 | #include <linux/sched.h> | ||
4 | |||
5 | struct kmem_cache *task_xstate_cachep = NULL; | ||
6 | unsigned int xstate_size; | ||
7 | |||
8 | int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) | ||
9 | { | ||
10 | *dst = *src; | ||
11 | |||
12 | if (src->thread.xstate) { | ||
13 | dst->thread.xstate = kmem_cache_alloc(task_xstate_cachep, | ||
14 | GFP_KERNEL); | ||
15 | if (!dst->thread.xstate) | ||
16 | return -ENOMEM; | ||
17 | memcpy(dst->thread.xstate, src->thread.xstate, xstate_size); | ||
18 | } | ||
19 | |||
20 | return 0; | ||
21 | } | ||
22 | |||
23 | void free_thread_xstate(struct task_struct *tsk) | ||
24 | { | ||
25 | if (tsk->thread.xstate) { | ||
26 | kmem_cache_free(task_xstate_cachep, tsk->thread.xstate); | ||
27 | tsk->thread.xstate = NULL; | ||
28 | } | ||
29 | } | ||
30 | |||
31 | #if THREAD_SHIFT < PAGE_SHIFT | ||
32 | static struct kmem_cache *thread_info_cache; | ||
33 | |||
34 | struct thread_info *alloc_thread_info(struct task_struct *tsk) | ||
35 | { | ||
36 | struct thread_info *ti; | ||
37 | |||
38 | ti = kmem_cache_alloc(thread_info_cache, GFP_KERNEL); | ||
39 | if (unlikely(ti == NULL)) | ||
40 | return NULL; | ||
41 | #ifdef CONFIG_DEBUG_STACK_USAGE | ||
42 | memset(ti, 0, THREAD_SIZE); | ||
43 | #endif | ||
44 | return ti; | ||
45 | } | ||
46 | |||
47 | void free_thread_info(struct thread_info *ti) | ||
48 | { | ||
49 | free_thread_xstate(ti->task); | ||
50 | kmem_cache_free(thread_info_cache, ti); | ||
51 | } | ||
52 | |||
53 | void thread_info_cache_init(void) | ||
54 | { | ||
55 | thread_info_cache = kmem_cache_create("thread_info", THREAD_SIZE, | ||
56 | THREAD_SIZE, SLAB_PANIC, NULL); | ||
57 | } | ||
58 | #else | ||
59 | struct thread_info *alloc_thread_info(struct task_struct *tsk) | ||
60 | { | ||
61 | #ifdef CONFIG_DEBUG_STACK_USAGE | ||
62 | gfp_t mask = GFP_KERNEL | __GFP_ZERO; | ||
63 | #else | ||
64 | gfp_t mask = GFP_KERNEL; | ||
65 | #endif | ||
66 | return (struct thread_info *)__get_free_pages(mask, THREAD_SIZE_ORDER); | ||
67 | } | ||
68 | |||
69 | void free_thread_info(struct thread_info *ti) | ||
70 | { | ||
71 | free_thread_xstate(ti->task); | ||
72 | free_pages((unsigned long)ti, THREAD_SIZE_ORDER); | ||
73 | } | ||
74 | #endif /* THREAD_SHIFT < PAGE_SHIFT */ | ||
75 | |||
76 | void arch_task_cache_init(void) | ||
77 | { | ||
78 | if (!xstate_size) | ||
79 | return; | ||
80 | |||
81 | task_xstate_cachep = kmem_cache_create("task_xstate", xstate_size, | ||
82 | __alignof__(union thread_xstate), | ||
83 | SLAB_PANIC | SLAB_NOTRACK, NULL); | ||
84 | } | ||
85 | |||
86 | #ifdef CONFIG_SH_FPU_EMU | ||
87 | # define HAVE_SOFTFP 1 | ||
88 | #else | ||
89 | # define HAVE_SOFTFP 0 | ||
90 | #endif | ||
91 | |||
92 | void init_thread_xstate(void) | ||
93 | { | ||
94 | if (boot_cpu_data.flags & CPU_HAS_FPU) | ||
95 | xstate_size = sizeof(struct sh_fpu_hard_struct); | ||
96 | else if (HAVE_SOFTFP) | ||
97 | xstate_size = sizeof(struct sh_fpu_soft_struct); | ||
98 | else | ||
99 | xstate_size = 0; | ||
100 | } | ||
diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c index d8af889366a4..3cb88f114d7a 100644 --- a/arch/sh/kernel/process_32.c +++ b/arch/sh/kernel/process_32.c | |||
@@ -16,65 +16,15 @@ | |||
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
18 | #include <linux/elfcore.h> | 18 | #include <linux/elfcore.h> |
19 | #include <linux/pm.h> | ||
20 | #include <linux/kallsyms.h> | 19 | #include <linux/kallsyms.h> |
21 | #include <linux/kexec.h> | ||
22 | #include <linux/kdebug.h> | ||
23 | #include <linux/tick.h> | ||
24 | #include <linux/reboot.h> | ||
25 | #include <linux/fs.h> | 20 | #include <linux/fs.h> |
26 | #include <linux/ftrace.h> | 21 | #include <linux/ftrace.h> |
27 | #include <linux/preempt.h> | 22 | #include <linux/hw_breakpoint.h> |
28 | #include <asm/uaccess.h> | 23 | #include <asm/uaccess.h> |
29 | #include <asm/mmu_context.h> | 24 | #include <asm/mmu_context.h> |
30 | #include <asm/pgalloc.h> | ||
31 | #include <asm/system.h> | 25 | #include <asm/system.h> |
32 | #include <asm/ubc.h> | ||
33 | #include <asm/fpu.h> | 26 | #include <asm/fpu.h> |
34 | #include <asm/syscalls.h> | 27 | #include <asm/syscalls.h> |
35 | #include <asm/watchdog.h> | ||
36 | |||
37 | int ubc_usercnt = 0; | ||
38 | |||
39 | #ifdef CONFIG_32BIT | ||
40 | static void watchdog_trigger_immediate(void) | ||
41 | { | ||
42 | sh_wdt_write_cnt(0xFF); | ||
43 | sh_wdt_write_csr(0xC2); | ||
44 | } | ||
45 | |||
46 | void machine_restart(char * __unused) | ||
47 | { | ||
48 | local_irq_disable(); | ||
49 | |||
50 | /* Use watchdog timer to trigger reset */ | ||
51 | watchdog_trigger_immediate(); | ||
52 | |||
53 | while (1) | ||
54 | cpu_sleep(); | ||
55 | } | ||
56 | #else | ||
57 | void machine_restart(char * __unused) | ||
58 | { | ||
59 | /* SR.BL=1 and invoke address error to let CPU reset (manual reset) */ | ||
60 | asm volatile("ldc %0, sr\n\t" | ||
61 | "mov.l @%1, %0" : : "r" (0x10000000), "r" (0x80000001)); | ||
62 | } | ||
63 | #endif | ||
64 | |||
65 | void machine_halt(void) | ||
66 | { | ||
67 | local_irq_disable(); | ||
68 | |||
69 | while (1) | ||
70 | cpu_sleep(); | ||
71 | } | ||
72 | |||
73 | void machine_power_off(void) | ||
74 | { | ||
75 | if (pm_power_off) | ||
76 | pm_power_off(); | ||
77 | } | ||
78 | 28 | ||
79 | void show_regs(struct pt_regs * regs) | 29 | void show_regs(struct pt_regs * regs) |
80 | { | 30 | { |
@@ -91,7 +41,7 @@ void show_regs(struct pt_regs * regs) | |||
91 | printk("PC : %08lx SP : %08lx SR : %08lx ", | 41 | printk("PC : %08lx SP : %08lx SR : %08lx ", |
92 | regs->pc, regs->regs[15], regs->sr); | 42 | regs->pc, regs->regs[15], regs->sr); |
93 | #ifdef CONFIG_MMU | 43 | #ifdef CONFIG_MMU |
94 | printk("TEA : %08x\n", ctrl_inl(MMU_TEA)); | 44 | printk("TEA : %08x\n", __raw_readl(MMU_TEA)); |
95 | #else | 45 | #else |
96 | printk("\n"); | 46 | printk("\n"); |
97 | #endif | 47 | #endif |
@@ -147,21 +97,34 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) | |||
147 | } | 97 | } |
148 | EXPORT_SYMBOL(kernel_thread); | 98 | EXPORT_SYMBOL(kernel_thread); |
149 | 99 | ||
100 | void start_thread(struct pt_regs *regs, unsigned long new_pc, | ||
101 | unsigned long new_sp) | ||
102 | { | ||
103 | set_fs(USER_DS); | ||
104 | |||
105 | regs->pr = 0; | ||
106 | regs->sr = SR_FD; | ||
107 | regs->pc = new_pc; | ||
108 | regs->regs[15] = new_sp; | ||
109 | |||
110 | free_thread_xstate(current); | ||
111 | } | ||
112 | EXPORT_SYMBOL(start_thread); | ||
113 | |||
150 | /* | 114 | /* |
151 | * Free current thread data structures etc.. | 115 | * Free current thread data structures etc.. |
152 | */ | 116 | */ |
153 | void exit_thread(void) | 117 | void exit_thread(void) |
154 | { | 118 | { |
155 | if (current->thread.ubc_pc) { | ||
156 | current->thread.ubc_pc = 0; | ||
157 | ubc_usercnt -= 1; | ||
158 | } | ||
159 | } | 119 | } |
160 | 120 | ||
161 | void flush_thread(void) | 121 | void flush_thread(void) |
162 | { | 122 | { |
163 | #if defined(CONFIG_SH_FPU) | ||
164 | struct task_struct *tsk = current; | 123 | struct task_struct *tsk = current; |
124 | |||
125 | flush_ptrace_hw_breakpoint(tsk); | ||
126 | |||
127 | #if defined(CONFIG_SH_FPU) | ||
165 | /* Forget lazy FPU state */ | 128 | /* Forget lazy FPU state */ |
166 | clear_fpu(tsk, task_pt_regs(tsk)); | 129 | clear_fpu(tsk, task_pt_regs(tsk)); |
167 | clear_used_math(); | 130 | clear_used_math(); |
@@ -209,11 +172,10 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
209 | { | 172 | { |
210 | struct thread_info *ti = task_thread_info(p); | 173 | struct thread_info *ti = task_thread_info(p); |
211 | struct pt_regs *childregs; | 174 | struct pt_regs *childregs; |
175 | |||
212 | #if defined(CONFIG_SH_DSP) | 176 | #if defined(CONFIG_SH_DSP) |
213 | struct task_struct *tsk = current; | 177 | struct task_struct *tsk = current; |
214 | #endif | ||
215 | 178 | ||
216 | #if defined(CONFIG_SH_DSP) | ||
217 | if (is_dsp_enabled(tsk)) { | 179 | if (is_dsp_enabled(tsk)) { |
218 | /* We can use the __save_dsp or just copy the struct: | 180 | /* We can use the __save_dsp or just copy the struct: |
219 | * __save_dsp(p); | 181 | * __save_dsp(p); |
@@ -244,53 +206,11 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
244 | p->thread.sp = (unsigned long) childregs; | 206 | p->thread.sp = (unsigned long) childregs; |
245 | p->thread.pc = (unsigned long) ret_from_fork; | 207 | p->thread.pc = (unsigned long) ret_from_fork; |
246 | 208 | ||
247 | p->thread.ubc_pc = 0; | 209 | memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps)); |
248 | 210 | ||
249 | return 0; | 211 | return 0; |
250 | } | 212 | } |
251 | 213 | ||
252 | /* Tracing by user break controller. */ | ||
253 | static void ubc_set_tracing(int asid, unsigned long pc) | ||
254 | { | ||
255 | #if defined(CONFIG_CPU_SH4A) | ||
256 | unsigned long val; | ||
257 | |||
258 | val = (UBC_CBR_ID_INST | UBC_CBR_RW_READ | UBC_CBR_CE); | ||
259 | val |= (UBC_CBR_AIE | UBC_CBR_AIV_SET(asid)); | ||
260 | |||
261 | ctrl_outl(val, UBC_CBR0); | ||
262 | ctrl_outl(pc, UBC_CAR0); | ||
263 | ctrl_outl(0x0, UBC_CAMR0); | ||
264 | ctrl_outl(0x0, UBC_CBCR); | ||
265 | |||
266 | val = (UBC_CRR_RES | UBC_CRR_PCB | UBC_CRR_BIE); | ||
267 | ctrl_outl(val, UBC_CRR0); | ||
268 | |||
269 | /* Read UBC register that we wrote last, for checking update */ | ||
270 | val = ctrl_inl(UBC_CRR0); | ||
271 | |||
272 | #else /* CONFIG_CPU_SH4A */ | ||
273 | ctrl_outl(pc, UBC_BARA); | ||
274 | |||
275 | #ifdef CONFIG_MMU | ||
276 | ctrl_outb(asid, UBC_BASRA); | ||
277 | #endif | ||
278 | |||
279 | ctrl_outl(0, UBC_BAMRA); | ||
280 | |||
281 | if (current_cpu_data.type == CPU_SH7729 || | ||
282 | current_cpu_data.type == CPU_SH7710 || | ||
283 | current_cpu_data.type == CPU_SH7712 || | ||
284 | current_cpu_data.type == CPU_SH7203){ | ||
285 | ctrl_outw(BBR_INST | BBR_READ | BBR_CPU, UBC_BBRA); | ||
286 | ctrl_outl(BRCR_PCBA | BRCR_PCTE, UBC_BRCR); | ||
287 | } else { | ||
288 | ctrl_outw(BBR_INST | BBR_READ, UBC_BBRA); | ||
289 | ctrl_outw(BRCR_PCBA, UBC_BRCR); | ||
290 | } | ||
291 | #endif /* CONFIG_CPU_SH4A */ | ||
292 | } | ||
293 | |||
294 | /* | 214 | /* |
295 | * switch_to(x,y) should switch tasks from x to y. | 215 | * switch_to(x,y) should switch tasks from x to y. |
296 | * | 216 | * |
@@ -304,7 +224,7 @@ __switch_to(struct task_struct *prev, struct task_struct *next) | |||
304 | 224 | ||
305 | /* we're going to use this soon, after a few expensive things */ | 225 | /* we're going to use this soon, after a few expensive things */ |
306 | if (next->fpu_counter > 5) | 226 | if (next->fpu_counter > 5) |
307 | prefetch(&next_t->fpu.hard); | 227 | prefetch(next_t->xstate); |
308 | 228 | ||
309 | #ifdef CONFIG_MMU | 229 | #ifdef CONFIG_MMU |
310 | /* | 230 | /* |
@@ -316,32 +236,13 @@ __switch_to(struct task_struct *prev, struct task_struct *next) | |||
316 | : "r" (task_thread_info(next))); | 236 | : "r" (task_thread_info(next))); |
317 | #endif | 237 | #endif |
318 | 238 | ||
319 | /* If no tasks are using the UBC, we're done */ | ||
320 | if (ubc_usercnt == 0) | ||
321 | /* If no tasks are using the UBC, we're done */; | ||
322 | else if (next->thread.ubc_pc && next->mm) { | ||
323 | int asid = 0; | ||
324 | #ifdef CONFIG_MMU | ||
325 | asid |= cpu_asid(smp_processor_id(), next->mm); | ||
326 | #endif | ||
327 | ubc_set_tracing(asid, next->thread.ubc_pc); | ||
328 | } else { | ||
329 | #if defined(CONFIG_CPU_SH4A) | ||
330 | ctrl_outl(UBC_CBR_INIT, UBC_CBR0); | ||
331 | ctrl_outl(UBC_CRR_INIT, UBC_CRR0); | ||
332 | #else | ||
333 | ctrl_outw(0, UBC_BBRA); | ||
334 | ctrl_outw(0, UBC_BBRB); | ||
335 | #endif | ||
336 | } | ||
337 | |||
338 | /* | 239 | /* |
339 | * If the task has used fpu the last 5 timeslices, just do a full | 240 | * If the task has used fpu the last 5 timeslices, just do a full |
340 | * restore of the math state immediately to avoid the trap; the | 241 | * restore of the math state immediately to avoid the trap; the |
341 | * chances of needing FPU soon are obviously high now | 242 | * chances of needing FPU soon are obviously high now |
342 | */ | 243 | */ |
343 | if (next->fpu_counter > 5) | 244 | if (next->fpu_counter > 5) |
344 | fpu_state_restore(task_pt_regs(next)); | 245 | __fpu_state_restore(); |
345 | 246 | ||
346 | return prev; | 247 | return prev; |
347 | } | 248 | } |
@@ -434,20 +335,3 @@ unsigned long get_wchan(struct task_struct *p) | |||
434 | 335 | ||
435 | return pc; | 336 | return pc; |
436 | } | 337 | } |
437 | |||
438 | asmlinkage void break_point_trap(void) | ||
439 | { | ||
440 | /* Clear tracing. */ | ||
441 | #if defined(CONFIG_CPU_SH4A) | ||
442 | ctrl_outl(UBC_CBR_INIT, UBC_CBR0); | ||
443 | ctrl_outl(UBC_CRR_INIT, UBC_CRR0); | ||
444 | #else | ||
445 | ctrl_outw(0, UBC_BBRA); | ||
446 | ctrl_outw(0, UBC_BBRB); | ||
447 | ctrl_outl(0, UBC_BRCR); | ||
448 | #endif | ||
449 | current->thread.ubc_pc = 0; | ||
450 | ubc_usercnt -= 1; | ||
451 | |||
452 | force_sig(SIGTRAP, current); | ||
453 | } | ||
diff --git a/arch/sh/kernel/process_64.c b/arch/sh/kernel/process_64.c index ec79faf6f021..c90957a459ac 100644 --- a/arch/sh/kernel/process_64.c +++ b/arch/sh/kernel/process_64.c | |||
@@ -32,30 +32,7 @@ | |||
32 | 32 | ||
33 | struct task_struct *last_task_used_math = NULL; | 33 | struct task_struct *last_task_used_math = NULL; |
34 | 34 | ||
35 | void machine_restart(char * __unused) | 35 | void show_regs(struct pt_regs *regs) |
36 | { | ||
37 | extern void phys_stext(void); | ||
38 | |||
39 | phys_stext(); | ||
40 | } | ||
41 | |||
42 | void machine_halt(void) | ||
43 | { | ||
44 | for (;;); | ||
45 | } | ||
46 | |||
47 | void machine_power_off(void) | ||
48 | { | ||
49 | __asm__ __volatile__ ( | ||
50 | "sleep\n\t" | ||
51 | "synci\n\t" | ||
52 | "nop;nop;nop;nop\n\t" | ||
53 | ); | ||
54 | |||
55 | panic("Unexpected wakeup!\n"); | ||
56 | } | ||
57 | |||
58 | void show_regs(struct pt_regs * regs) | ||
59 | { | 36 | { |
60 | unsigned long long ah, al, bh, bl, ch, cl; | 37 | unsigned long long ah, al, bh, bl, ch, cl; |
61 | 38 | ||
@@ -410,7 +387,7 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu) | |||
410 | regs->sr |= SR_FD; | 387 | regs->sr |= SR_FD; |
411 | } | 388 | } |
412 | 389 | ||
413 | memcpy(fpu, &tsk->thread.fpu.hard, sizeof(*fpu)); | 390 | memcpy(fpu, &tsk->thread.xstate->hardfpu, sizeof(*fpu)); |
414 | } | 391 | } |
415 | 392 | ||
416 | return fpvalid; | 393 | return fpvalid; |
diff --git a/arch/sh/kernel/ptrace_32.c b/arch/sh/kernel/ptrace_32.c index 9be35f348093..c625cdab76dd 100644 --- a/arch/sh/kernel/ptrace_32.c +++ b/arch/sh/kernel/ptrace_32.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * SuperH process tracing | 2 | * SuperH process tracing |
3 | * | 3 | * |
4 | * Copyright (C) 1999, 2000 Kaz Kojima & Niibe Yutaka | 4 | * Copyright (C) 1999, 2000 Kaz Kojima & Niibe Yutaka |
5 | * Copyright (C) 2002 - 2008 Paul Mundt | 5 | * Copyright (C) 2002 - 2009 Paul Mundt |
6 | * | 6 | * |
7 | * Audit support by Yuichi Nakamura <ynakam@hitachisoft.jp> | 7 | * Audit support by Yuichi Nakamura <ynakam@hitachisoft.jp> |
8 | * | 8 | * |
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/tracehook.h> | 26 | #include <linux/tracehook.h> |
27 | #include <linux/elf.h> | 27 | #include <linux/elf.h> |
28 | #include <linux/regset.h> | 28 | #include <linux/regset.h> |
29 | #include <linux/hw_breakpoint.h> | ||
29 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
30 | #include <asm/pgtable.h> | 31 | #include <asm/pgtable.h> |
31 | #include <asm/system.h> | 32 | #include <asm/system.h> |
@@ -63,33 +64,64 @@ static inline int put_stack_long(struct task_struct *task, int offset, | |||
63 | return 0; | 64 | return 0; |
64 | } | 65 | } |
65 | 66 | ||
66 | void user_enable_single_step(struct task_struct *child) | 67 | void ptrace_triggered(struct perf_event *bp, int nmi, |
68 | struct perf_sample_data *data, struct pt_regs *regs) | ||
67 | { | 69 | { |
68 | /* Next scheduling will set up UBC */ | 70 | struct perf_event_attr attr; |
69 | if (child->thread.ubc_pc == 0) | 71 | |
70 | ubc_usercnt += 1; | 72 | /* |
73 | * Disable the breakpoint request here since ptrace has defined a | ||
74 | * one-shot behaviour for breakpoint exceptions. | ||
75 | */ | ||
76 | attr = bp->attr; | ||
77 | attr.disabled = true; | ||
78 | modify_user_hw_breakpoint(bp, &attr); | ||
79 | } | ||
80 | |||
81 | static int set_single_step(struct task_struct *tsk, unsigned long addr) | ||
82 | { | ||
83 | struct thread_struct *thread = &tsk->thread; | ||
84 | struct perf_event *bp; | ||
85 | struct perf_event_attr attr; | ||
86 | |||
87 | bp = thread->ptrace_bps[0]; | ||
88 | if (!bp) { | ||
89 | hw_breakpoint_init(&attr); | ||
90 | |||
91 | attr.bp_addr = addr; | ||
92 | attr.bp_len = HW_BREAKPOINT_LEN_2; | ||
93 | attr.bp_type = HW_BREAKPOINT_R; | ||
94 | |||
95 | bp = register_user_hw_breakpoint(&attr, ptrace_triggered, tsk); | ||
96 | if (IS_ERR(bp)) | ||
97 | return PTR_ERR(bp); | ||
98 | |||
99 | thread->ptrace_bps[0] = bp; | ||
100 | } else { | ||
101 | int err; | ||
102 | |||
103 | attr = bp->attr; | ||
104 | attr.bp_addr = addr; | ||
105 | err = modify_user_hw_breakpoint(bp, &attr); | ||
106 | if (unlikely(err)) | ||
107 | return err; | ||
108 | } | ||
109 | |||
110 | return 0; | ||
111 | } | ||
71 | 112 | ||
72 | child->thread.ubc_pc = get_stack_long(child, | 113 | void user_enable_single_step(struct task_struct *child) |
73 | offsetof(struct pt_regs, pc)); | 114 | { |
115 | unsigned long pc = get_stack_long(child, offsetof(struct pt_regs, pc)); | ||
74 | 116 | ||
75 | set_tsk_thread_flag(child, TIF_SINGLESTEP); | 117 | set_tsk_thread_flag(child, TIF_SINGLESTEP); |
118 | |||
119 | set_single_step(child, pc); | ||
76 | } | 120 | } |
77 | 121 | ||
78 | void user_disable_single_step(struct task_struct *child) | 122 | void user_disable_single_step(struct task_struct *child) |
79 | { | 123 | { |
80 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); | 124 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); |
81 | |||
82 | /* | ||
83 | * Ensure the UBC is not programmed at the next context switch. | ||
84 | * | ||
85 | * Normally this is not needed but there are sequences such as | ||
86 | * singlestep, signal delivery, and continue that leave the | ||
87 | * ubc_pc non-zero leading to spurious SIGTRAPs. | ||
88 | */ | ||
89 | if (child->thread.ubc_pc != 0) { | ||
90 | ubc_usercnt -= 1; | ||
91 | child->thread.ubc_pc = 0; | ||
92 | } | ||
93 | } | 125 | } |
94 | 126 | ||
95 | /* | 127 | /* |
@@ -163,10 +195,10 @@ int fpregs_get(struct task_struct *target, | |||
163 | 195 | ||
164 | if ((boot_cpu_data.flags & CPU_HAS_FPU)) | 196 | if ((boot_cpu_data.flags & CPU_HAS_FPU)) |
165 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, | 197 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, |
166 | &target->thread.fpu.hard, 0, -1); | 198 | &target->thread.xstate->hardfpu, 0, -1); |
167 | 199 | ||
168 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, | 200 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, |
169 | &target->thread.fpu.soft, 0, -1); | 201 | &target->thread.xstate->softfpu, 0, -1); |
170 | } | 202 | } |
171 | 203 | ||
172 | static int fpregs_set(struct task_struct *target, | 204 | static int fpregs_set(struct task_struct *target, |
@@ -184,10 +216,10 @@ static int fpregs_set(struct task_struct *target, | |||
184 | 216 | ||
185 | if ((boot_cpu_data.flags & CPU_HAS_FPU)) | 217 | if ((boot_cpu_data.flags & CPU_HAS_FPU)) |
186 | return user_regset_copyin(&pos, &count, &kbuf, &ubuf, | 218 | return user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
187 | &target->thread.fpu.hard, 0, -1); | 219 | &target->thread.xstate->hardfpu, 0, -1); |
188 | 220 | ||
189 | return user_regset_copyin(&pos, &count, &kbuf, &ubuf, | 221 | return user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
190 | &target->thread.fpu.soft, 0, -1); | 222 | &target->thread.xstate->softfpu, 0, -1); |
191 | } | 223 | } |
192 | 224 | ||
193 | static int fpregs_active(struct task_struct *target, | 225 | static int fpregs_active(struct task_struct *target, |
@@ -333,7 +365,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
333 | else | 365 | else |
334 | tmp = 0; | 366 | tmp = 0; |
335 | } else | 367 | } else |
336 | tmp = ((long *)&child->thread.fpu) | 368 | tmp = ((long *)child->thread.xstate) |
337 | [(addr - (long)&dummy->fpu) >> 2]; | 369 | [(addr - (long)&dummy->fpu) >> 2]; |
338 | } else if (addr == (long) &dummy->u_fpvalid) | 370 | } else if (addr == (long) &dummy->u_fpvalid) |
339 | tmp = !!tsk_used_math(child); | 371 | tmp = !!tsk_used_math(child); |
@@ -362,7 +394,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
362 | else if (addr >= (long) &dummy->fpu && | 394 | else if (addr >= (long) &dummy->fpu && |
363 | addr < (long) &dummy->u_fpvalid) { | 395 | addr < (long) &dummy->u_fpvalid) { |
364 | set_stopped_child_used_math(child); | 396 | set_stopped_child_used_math(child); |
365 | ((long *)&child->thread.fpu) | 397 | ((long *)child->thread.xstate) |
366 | [(addr - (long)&dummy->fpu) >> 2] = data; | 398 | [(addr - (long)&dummy->fpu) >> 2] = data; |
367 | ret = 0; | 399 | ret = 0; |
368 | } else if (addr == (long) &dummy->u_fpvalid) { | 400 | } else if (addr == (long) &dummy->u_fpvalid) { |
diff --git a/arch/sh/kernel/ptrace_64.c b/arch/sh/kernel/ptrace_64.c index b063eb8b18e3..5fd644da7f02 100644 --- a/arch/sh/kernel/ptrace_64.c +++ b/arch/sh/kernel/ptrace_64.c | |||
@@ -88,7 +88,7 @@ get_fpu_long(struct task_struct *task, unsigned long addr) | |||
88 | regs->sr |= SR_FD; | 88 | regs->sr |= SR_FD; |
89 | } | 89 | } |
90 | 90 | ||
91 | tmp = ((long *)&task->thread.fpu)[addr / sizeof(unsigned long)]; | 91 | tmp = ((long *)task->thread.xstate)[addr / sizeof(unsigned long)]; |
92 | return tmp; | 92 | return tmp; |
93 | } | 93 | } |
94 | 94 | ||
@@ -114,8 +114,7 @@ put_fpu_long(struct task_struct *task, unsigned long addr, unsigned long data) | |||
114 | regs = (struct pt_regs*)((unsigned char *)task + THREAD_SIZE) - 1; | 114 | regs = (struct pt_regs*)((unsigned char *)task + THREAD_SIZE) - 1; |
115 | 115 | ||
116 | if (!tsk_used_math(task)) { | 116 | if (!tsk_used_math(task)) { |
117 | fpinit(&task->thread.fpu.hard); | 117 | init_fpu(task); |
118 | set_stopped_child_used_math(task); | ||
119 | } else if (last_task_used_math == task) { | 118 | } else if (last_task_used_math == task) { |
120 | enable_fpu(); | 119 | enable_fpu(); |
121 | save_fpu(task); | 120 | save_fpu(task); |
@@ -124,7 +123,7 @@ put_fpu_long(struct task_struct *task, unsigned long addr, unsigned long data) | |||
124 | regs->sr |= SR_FD; | 123 | regs->sr |= SR_FD; |
125 | } | 124 | } |
126 | 125 | ||
127 | ((long *)&task->thread.fpu)[addr / sizeof(unsigned long)] = data; | 126 | ((long *)task->thread.xstate)[addr / sizeof(unsigned long)] = data; |
128 | return 0; | 127 | return 0; |
129 | } | 128 | } |
130 | 129 | ||
@@ -226,7 +225,7 @@ int fpregs_get(struct task_struct *target, | |||
226 | return ret; | 225 | return ret; |
227 | 226 | ||
228 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, | 227 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, |
229 | &target->thread.fpu.hard, 0, -1); | 228 | &target->thread.xstate->hardfpu, 0, -1); |
230 | } | 229 | } |
231 | 230 | ||
232 | static int fpregs_set(struct task_struct *target, | 231 | static int fpregs_set(struct task_struct *target, |
@@ -243,7 +242,7 @@ static int fpregs_set(struct task_struct *target, | |||
243 | set_stopped_child_used_math(target); | 242 | set_stopped_child_used_math(target); |
244 | 243 | ||
245 | return user_regset_copyin(&pos, &count, &kbuf, &ubuf, | 244 | return user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
246 | &target->thread.fpu.hard, 0, -1); | 245 | &target->thread.xstate->hardfpu, 0, -1); |
247 | } | 246 | } |
248 | 247 | ||
249 | static int fpregs_active(struct task_struct *target, | 248 | static int fpregs_active(struct task_struct *target, |
@@ -486,9 +485,10 @@ asmlinkage void do_single_step(unsigned long long vec, struct pt_regs *regs) | |||
486 | } | 485 | } |
487 | 486 | ||
488 | /* Called with interrupts disabled */ | 487 | /* Called with interrupts disabled */ |
489 | asmlinkage void do_software_break_point(unsigned long long vec, | 488 | BUILD_TRAP_HANDLER(breakpoint) |
490 | struct pt_regs *regs) | ||
491 | { | 489 | { |
490 | TRAP_HANDLER_DECL; | ||
491 | |||
492 | /* We need to forward step the PC, to counteract the backstep done | 492 | /* We need to forward step the PC, to counteract the backstep done |
493 | in signal.c. */ | 493 | in signal.c. */ |
494 | local_irq_enable(); | 494 | local_irq_enable(); |
diff --git a/arch/sh/kernel/reboot.c b/arch/sh/kernel/reboot.c new file mode 100644 index 000000000000..b1fca66bb92e --- /dev/null +++ b/arch/sh/kernel/reboot.c | |||
@@ -0,0 +1,98 @@ | |||
1 | #include <linux/pm.h> | ||
2 | #include <linux/kexec.h> | ||
3 | #include <linux/kernel.h> | ||
4 | #include <linux/reboot.h> | ||
5 | #include <linux/module.h> | ||
6 | #ifdef CONFIG_SUPERH32 | ||
7 | #include <asm/watchdog.h> | ||
8 | #endif | ||
9 | #include <asm/addrspace.h> | ||
10 | #include <asm/reboot.h> | ||
11 | #include <asm/system.h> | ||
12 | |||
13 | void (*pm_power_off)(void); | ||
14 | EXPORT_SYMBOL(pm_power_off); | ||
15 | |||
16 | #ifdef CONFIG_SUPERH32 | ||
17 | static void watchdog_trigger_immediate(void) | ||
18 | { | ||
19 | sh_wdt_write_cnt(0xFF); | ||
20 | sh_wdt_write_csr(0xC2); | ||
21 | } | ||
22 | #endif | ||
23 | |||
24 | static void native_machine_restart(char * __unused) | ||
25 | { | ||
26 | local_irq_disable(); | ||
27 | |||
28 | /* Address error with SR.BL=1 first. */ | ||
29 | trigger_address_error(); | ||
30 | |||
31 | #ifdef CONFIG_SUPERH32 | ||
32 | /* If that fails or is unsupported, go for the watchdog next. */ | ||
33 | watchdog_trigger_immediate(); | ||
34 | #endif | ||
35 | |||
36 | /* | ||
37 | * Give up and sleep. | ||
38 | */ | ||
39 | while (1) | ||
40 | cpu_sleep(); | ||
41 | } | ||
42 | |||
43 | static void native_machine_shutdown(void) | ||
44 | { | ||
45 | smp_send_stop(); | ||
46 | } | ||
47 | |||
48 | static void native_machine_power_off(void) | ||
49 | { | ||
50 | if (pm_power_off) | ||
51 | pm_power_off(); | ||
52 | } | ||
53 | |||
54 | static void native_machine_halt(void) | ||
55 | { | ||
56 | /* stop other cpus */ | ||
57 | machine_shutdown(); | ||
58 | |||
59 | /* stop this cpu */ | ||
60 | stop_this_cpu(NULL); | ||
61 | } | ||
62 | |||
63 | struct machine_ops machine_ops = { | ||
64 | .power_off = native_machine_power_off, | ||
65 | .shutdown = native_machine_shutdown, | ||
66 | .restart = native_machine_restart, | ||
67 | .halt = native_machine_halt, | ||
68 | #ifdef CONFIG_KEXEC | ||
69 | .crash_shutdown = native_machine_crash_shutdown, | ||
70 | #endif | ||
71 | }; | ||
72 | |||
73 | void machine_power_off(void) | ||
74 | { | ||
75 | machine_ops.power_off(); | ||
76 | } | ||
77 | |||
78 | void machine_shutdown(void) | ||
79 | { | ||
80 | machine_ops.shutdown(); | ||
81 | } | ||
82 | |||
83 | void machine_restart(char *cmd) | ||
84 | { | ||
85 | machine_ops.restart(cmd); | ||
86 | } | ||
87 | |||
88 | void machine_halt(void) | ||
89 | { | ||
90 | machine_ops.halt(); | ||
91 | } | ||
92 | |||
93 | #ifdef CONFIG_KEXEC | ||
94 | void machine_crash_shutdown(struct pt_regs *regs) | ||
95 | { | ||
96 | machine_ops.crash_shutdown(regs); | ||
97 | } | ||
98 | #endif | ||
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index 8b0e69792cf4..3459e70eed72 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c | |||
@@ -421,6 +421,8 @@ void __init setup_arch(char **cmdline_p) | |||
421 | 421 | ||
422 | parse_early_param(); | 422 | parse_early_param(); |
423 | 423 | ||
424 | uncached_init(); | ||
425 | |||
424 | plat_early_device_setup(); | 426 | plat_early_device_setup(); |
425 | 427 | ||
426 | /* Let earlyprintk output early console messages */ | 428 | /* Let earlyprintk output early console messages */ |
@@ -449,17 +451,15 @@ void __init setup_arch(char **cmdline_p) | |||
449 | #ifdef CONFIG_DUMMY_CONSOLE | 451 | #ifdef CONFIG_DUMMY_CONSOLE |
450 | conswitchp = &dummy_con; | 452 | conswitchp = &dummy_con; |
451 | #endif | 453 | #endif |
454 | paging_init(); | ||
455 | pmb_init(); | ||
456 | |||
457 | ioremap_fixed_init(); | ||
452 | 458 | ||
453 | /* Perform the machine specific initialisation */ | 459 | /* Perform the machine specific initialisation */ |
454 | if (likely(sh_mv.mv_setup)) | 460 | if (likely(sh_mv.mv_setup)) |
455 | sh_mv.mv_setup(cmdline_p); | 461 | sh_mv.mv_setup(cmdline_p); |
456 | 462 | ||
457 | paging_init(); | ||
458 | |||
459 | #ifdef CONFIG_PMB_ENABLE | ||
460 | pmb_init(); | ||
461 | #endif | ||
462 | |||
463 | #ifdef CONFIG_SMP | 463 | #ifdef CONFIG_SMP |
464 | plat_smp_setup(); | 464 | plat_smp_setup(); |
465 | #endif | 465 | #endif |
diff --git a/arch/sh/kernel/sh_bios.c b/arch/sh/kernel/sh_bios.c index c852f7805728..47475cca068a 100644 --- a/arch/sh/kernel/sh_bios.c +++ b/arch/sh/kernel/sh_bios.c | |||
@@ -1,19 +1,30 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/sh/kernel/sh_bios.c | ||
3 | * C interface for trapping into the standard LinuxSH BIOS. | 2 | * C interface for trapping into the standard LinuxSH BIOS. |
4 | * | 3 | * |
5 | * Copyright (C) 2000 Greg Banks, Mitch Davis | 4 | * Copyright (C) 2000 Greg Banks, Mitch Davis |
5 | * Copyright (C) 1999, 2000 Niibe Yutaka | ||
6 | * Copyright (C) 2002 M. R. Brown | ||
7 | * Copyright (C) 2004 - 2010 Paul Mundt | ||
6 | * | 8 | * |
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file "COPYING" in the main directory of this archive | ||
11 | * for more details. | ||
7 | */ | 12 | */ |
8 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/console.h> | ||
15 | #include <linux/tty.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/delay.h> | ||
9 | #include <asm/sh_bios.h> | 19 | #include <asm/sh_bios.h> |
10 | 20 | ||
11 | #define BIOS_CALL_CONSOLE_WRITE 0 | 21 | #define BIOS_CALL_CONSOLE_WRITE 0 |
12 | #define BIOS_CALL_ETH_NODE_ADDR 10 | 22 | #define BIOS_CALL_ETH_NODE_ADDR 10 |
13 | #define BIOS_CALL_SHUTDOWN 11 | 23 | #define BIOS_CALL_SHUTDOWN 11 |
14 | #define BIOS_CALL_CHAR_OUT 0x1f /* TODO: hack */ | ||
15 | #define BIOS_CALL_GDB_DETACH 0xff | 24 | #define BIOS_CALL_GDB_DETACH 0xff |
16 | 25 | ||
26 | void *gdb_vbr_vector = NULL; | ||
27 | |||
17 | static inline long sh_bios_call(long func, long arg0, long arg1, long arg2, | 28 | static inline long sh_bios_call(long func, long arg0, long arg1, long arg2, |
18 | long arg3) | 29 | long arg3) |
19 | { | 30 | { |
@@ -23,6 +34,9 @@ static inline long sh_bios_call(long func, long arg0, long arg1, long arg2, | |||
23 | register long r6 __asm__("r6") = arg2; | 34 | register long r6 __asm__("r6") = arg2; |
24 | register long r7 __asm__("r7") = arg3; | 35 | register long r7 __asm__("r7") = arg3; |
25 | 36 | ||
37 | if (!gdb_vbr_vector) | ||
38 | return -ENOSYS; | ||
39 | |||
26 | __asm__ __volatile__("trapa #0x3f":"=z"(r0) | 40 | __asm__ __volatile__("trapa #0x3f":"=z"(r0) |
27 | :"0"(r0), "r"(r4), "r"(r5), "r"(r6), "r"(r7) | 41 | :"0"(r0), "r"(r4), "r"(r5), "r"(r6), "r"(r7) |
28 | :"memory"); | 42 | :"memory"); |
@@ -34,11 +48,6 @@ void sh_bios_console_write(const char *buf, unsigned int len) | |||
34 | sh_bios_call(BIOS_CALL_CONSOLE_WRITE, (long)buf, (long)len, 0, 0); | 48 | sh_bios_call(BIOS_CALL_CONSOLE_WRITE, (long)buf, (long)len, 0, 0); |
35 | } | 49 | } |
36 | 50 | ||
37 | void sh_bios_char_out(char ch) | ||
38 | { | ||
39 | sh_bios_call(BIOS_CALL_CHAR_OUT, ch, 0, 0, 0); | ||
40 | } | ||
41 | |||
42 | void sh_bios_gdb_detach(void) | 51 | void sh_bios_gdb_detach(void) |
43 | { | 52 | { |
44 | sh_bios_call(BIOS_CALL_GDB_DETACH, 0, 0, 0, 0); | 53 | sh_bios_call(BIOS_CALL_GDB_DETACH, 0, 0, 0, 0); |
@@ -55,3 +64,109 @@ void sh_bios_shutdown(unsigned int how) | |||
55 | { | 64 | { |
56 | sh_bios_call(BIOS_CALL_SHUTDOWN, how, 0, 0, 0); | 65 | sh_bios_call(BIOS_CALL_SHUTDOWN, how, 0, 0, 0); |
57 | } | 66 | } |
67 | |||
68 | /* | ||
69 | * Read the old value of the VBR register to initialise the vector | ||
70 | * through which debug and BIOS traps are delegated by the Linux trap | ||
71 | * handler. | ||
72 | */ | ||
73 | void sh_bios_vbr_init(void) | ||
74 | { | ||
75 | unsigned long vbr; | ||
76 | |||
77 | if (unlikely(gdb_vbr_vector)) | ||
78 | return; | ||
79 | |||
80 | __asm__ __volatile__ ("stc vbr, %0" : "=r" (vbr)); | ||
81 | |||
82 | if (vbr) { | ||
83 | gdb_vbr_vector = (void *)(vbr + 0x100); | ||
84 | printk(KERN_NOTICE "Setting GDB trap vector to %p\n", | ||
85 | gdb_vbr_vector); | ||
86 | } else | ||
87 | printk(KERN_NOTICE "SH-BIOS not detected\n"); | ||
88 | } | ||
89 | |||
90 | /** | ||
91 | * sh_bios_vbr_reload - Re-load the system VBR from the BIOS vector. | ||
92 | * | ||
93 | * This can be used by save/restore code to reinitialize the system VBR | ||
94 | * from the fixed BIOS VBR. A no-op if no BIOS VBR is known. | ||
95 | */ | ||
96 | void sh_bios_vbr_reload(void) | ||
97 | { | ||
98 | if (gdb_vbr_vector) | ||
99 | __asm__ __volatile__ ( | ||
100 | "ldc %0, vbr" | ||
101 | : | ||
102 | : "r" (((unsigned long) gdb_vbr_vector) - 0x100) | ||
103 | : "memory" | ||
104 | ); | ||
105 | } | ||
106 | |||
107 | /* | ||
108 | * Print a string through the BIOS | ||
109 | */ | ||
110 | static void sh_console_write(struct console *co, const char *s, | ||
111 | unsigned count) | ||
112 | { | ||
113 | sh_bios_console_write(s, count); | ||
114 | } | ||
115 | |||
116 | /* | ||
117 | * Setup initial baud/bits/parity. We do two things here: | ||
118 | * - construct a cflag setting for the first rs_open() | ||
119 | * - initialize the serial port | ||
120 | * Return non-zero if we didn't find a serial port. | ||
121 | */ | ||
122 | static int __init sh_console_setup(struct console *co, char *options) | ||
123 | { | ||
124 | int cflag = CREAD | HUPCL | CLOCAL; | ||
125 | |||
126 | /* | ||
127 | * Now construct a cflag setting. | ||
128 | * TODO: this is a totally bogus cflag, as we have | ||
129 | * no idea what serial settings the BIOS is using, or | ||
130 | * even if its using the serial port at all. | ||
131 | */ | ||
132 | cflag |= B115200 | CS8 | /*no parity*/0; | ||
133 | |||
134 | co->cflag = cflag; | ||
135 | |||
136 | return 0; | ||
137 | } | ||
138 | |||
139 | static struct console bios_console = { | ||
140 | .name = "bios", | ||
141 | .write = sh_console_write, | ||
142 | .setup = sh_console_setup, | ||
143 | .flags = CON_PRINTBUFFER, | ||
144 | .index = -1, | ||
145 | }; | ||
146 | |||
147 | static struct console *early_console; | ||
148 | |||
149 | static int __init setup_early_printk(char *buf) | ||
150 | { | ||
151 | int keep_early = 0; | ||
152 | |||
153 | if (!buf) | ||
154 | return 0; | ||
155 | |||
156 | if (strstr(buf, "keep")) | ||
157 | keep_early = 1; | ||
158 | |||
159 | if (!strncmp(buf, "bios", 4)) | ||
160 | early_console = &bios_console; | ||
161 | |||
162 | if (likely(early_console)) { | ||
163 | if (keep_early) | ||
164 | early_console->flags &= ~CON_BOOT; | ||
165 | else | ||
166 | early_console->flags |= CON_BOOT; | ||
167 | register_console(early_console); | ||
168 | } | ||
169 | |||
170 | return 0; | ||
171 | } | ||
172 | early_param("earlyprintk", setup_early_printk); | ||
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c index 12815ce01ecd..579cd2ca358d 100644 --- a/arch/sh/kernel/signal_32.c +++ b/arch/sh/kernel/signal_32.c | |||
@@ -150,7 +150,7 @@ static inline int restore_sigcontext_fpu(struct sigcontext __user *sc) | |||
150 | return 0; | 150 | return 0; |
151 | 151 | ||
152 | set_used_math(); | 152 | set_used_math(); |
153 | return __copy_from_user(&tsk->thread.fpu.hard, &sc->sc_fpregs[0], | 153 | return __copy_from_user(&tsk->thread.xstate->hardfpu, &sc->sc_fpregs[0], |
154 | sizeof(long)*(16*2+2)); | 154 | sizeof(long)*(16*2+2)); |
155 | } | 155 | } |
156 | 156 | ||
@@ -175,7 +175,7 @@ static inline int save_sigcontext_fpu(struct sigcontext __user *sc, | |||
175 | clear_used_math(); | 175 | clear_used_math(); |
176 | 176 | ||
177 | unlazy_fpu(tsk, regs); | 177 | unlazy_fpu(tsk, regs); |
178 | return __copy_to_user(&sc->sc_fpregs[0], &tsk->thread.fpu.hard, | 178 | return __copy_to_user(&sc->sc_fpregs[0], &tsk->thread.xstate->hardfpu, |
179 | sizeof(long)*(16*2+2)); | 179 | sizeof(long)*(16*2+2)); |
180 | } | 180 | } |
181 | #endif /* CONFIG_SH_FPU */ | 181 | #endif /* CONFIG_SH_FPU */ |
@@ -528,7 +528,7 @@ handle_syscall_restart(unsigned long save_r0, struct pt_regs *regs, | |||
528 | /* fallthrough */ | 528 | /* fallthrough */ |
529 | case -ERESTARTNOINTR: | 529 | case -ERESTARTNOINTR: |
530 | regs->regs[0] = save_r0; | 530 | regs->regs[0] = save_r0; |
531 | regs->pc -= instruction_size(ctrl_inw(regs->pc - 4)); | 531 | regs->pc -= instruction_size(__raw_readw(regs->pc - 4)); |
532 | break; | 532 | break; |
533 | } | 533 | } |
534 | } | 534 | } |
@@ -626,9 +626,9 @@ no_signal: | |||
626 | regs->regs[0] == -ERESTARTSYS || | 626 | regs->regs[0] == -ERESTARTSYS || |
627 | regs->regs[0] == -ERESTARTNOINTR) { | 627 | regs->regs[0] == -ERESTARTNOINTR) { |
628 | regs->regs[0] = save_r0; | 628 | regs->regs[0] = save_r0; |
629 | regs->pc -= instruction_size(ctrl_inw(regs->pc - 4)); | 629 | regs->pc -= instruction_size(__raw_readw(regs->pc - 4)); |
630 | } else if (regs->regs[0] == -ERESTART_RESTARTBLOCK) { | 630 | } else if (regs->regs[0] == -ERESTART_RESTARTBLOCK) { |
631 | regs->pc -= instruction_size(ctrl_inw(regs->pc - 4)); | 631 | regs->pc -= instruction_size(__raw_readw(regs->pc - 4)); |
632 | regs->regs[3] = __NR_restart_syscall; | 632 | regs->regs[3] = __NR_restart_syscall; |
633 | } | 633 | } |
634 | } | 634 | } |
diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c index 580e97d46ca5..5a9f1f10ebf4 100644 --- a/arch/sh/kernel/signal_64.c +++ b/arch/sh/kernel/signal_64.c | |||
@@ -297,7 +297,7 @@ restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc) | |||
297 | regs->sr |= SR_FD; | 297 | regs->sr |= SR_FD; |
298 | } | 298 | } |
299 | 299 | ||
300 | err |= __copy_from_user(¤t->thread.fpu.hard, &sc->sc_fpregs[0], | 300 | err |= __copy_from_user(¤t->thread.xstate->hardfpu, &sc->sc_fpregs[0], |
301 | (sizeof(long long) * 32) + (sizeof(int) * 1)); | 301 | (sizeof(long long) * 32) + (sizeof(int) * 1)); |
302 | 302 | ||
303 | return err; | 303 | return err; |
@@ -322,7 +322,7 @@ setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc) | |||
322 | regs->sr |= SR_FD; | 322 | regs->sr |= SR_FD; |
323 | } | 323 | } |
324 | 324 | ||
325 | err |= __copy_to_user(&sc->sc_fpregs[0], ¤t->thread.fpu.hard, | 325 | err |= __copy_to_user(&sc->sc_fpregs[0], ¤t->thread.xstate->hardfpu, |
326 | (sizeof(long long) * 32) + (sizeof(int) * 1)); | 326 | (sizeof(long long) * 32) + (sizeof(int) * 1)); |
327 | clear_used_math(); | 327 | clear_used_math(); |
328 | 328 | ||
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c index 983e0792d5f3..e124cf7008df 100644 --- a/arch/sh/kernel/smp.c +++ b/arch/sh/kernel/smp.c | |||
@@ -161,15 +161,6 @@ void smp_send_reschedule(int cpu) | |||
161 | plat_send_ipi(cpu, SMP_MSG_RESCHEDULE); | 161 | plat_send_ipi(cpu, SMP_MSG_RESCHEDULE); |
162 | } | 162 | } |
163 | 163 | ||
164 | static void stop_this_cpu(void *unused) | ||
165 | { | ||
166 | cpu_clear(smp_processor_id(), cpu_online_map); | ||
167 | local_irq_disable(); | ||
168 | |||
169 | for (;;) | ||
170 | cpu_relax(); | ||
171 | } | ||
172 | |||
173 | void smp_send_stop(void) | 164 | void smp_send_stop(void) |
174 | { | 165 | { |
175 | smp_call_function(stop_this_cpu, 0, 0); | 166 | smp_call_function(stop_this_cpu, 0, 0); |
diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c index 7b036339dc92..0830c2a9f712 100644 --- a/arch/sh/kernel/traps.c +++ b/arch/sh/kernel/traps.c | |||
@@ -58,7 +58,7 @@ BUILD_TRAP_HANDLER(debug) | |||
58 | TRAP_HANDLER_DECL; | 58 | TRAP_HANDLER_DECL; |
59 | 59 | ||
60 | /* Rewind */ | 60 | /* Rewind */ |
61 | regs->pc -= instruction_size(ctrl_inw(regs->pc - 4)); | 61 | regs->pc -= instruction_size(__raw_readw(regs->pc - 4)); |
62 | 62 | ||
63 | if (notify_die(DIE_TRAP, "debug trap", regs, 0, vec & 0xff, | 63 | if (notify_die(DIE_TRAP, "debug trap", regs, 0, vec & 0xff, |
64 | SIGTRAP) == NOTIFY_STOP) | 64 | SIGTRAP) == NOTIFY_STOP) |
@@ -75,7 +75,7 @@ BUILD_TRAP_HANDLER(bug) | |||
75 | TRAP_HANDLER_DECL; | 75 | TRAP_HANDLER_DECL; |
76 | 76 | ||
77 | /* Rewind */ | 77 | /* Rewind */ |
78 | regs->pc -= instruction_size(ctrl_inw(regs->pc - 4)); | 78 | regs->pc -= instruction_size(__raw_readw(regs->pc - 4)); |
79 | 79 | ||
80 | if (notify_die(DIE_TRAP, "bug trap", regs, 0, TRAPA_BUG_OPCODE & 0xff, | 80 | if (notify_die(DIE_TRAP, "bug trap", regs, 0, TRAPA_BUG_OPCODE & 0xff, |
81 | SIGTRAP) == NOTIFY_STOP) | 81 | SIGTRAP) == NOTIFY_STOP) |
diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c index 86639beac3a2..c3d86fa71ddf 100644 --- a/arch/sh/kernel/traps_32.c +++ b/arch/sh/kernel/traps_32.c | |||
@@ -24,11 +24,10 @@ | |||
24 | #include <linux/kdebug.h> | 24 | #include <linux/kdebug.h> |
25 | #include <linux/kexec.h> | 25 | #include <linux/kexec.h> |
26 | #include <linux/limits.h> | 26 | #include <linux/limits.h> |
27 | #include <linux/proc_fs.h> | ||
28 | #include <linux/seq_file.h> | ||
29 | #include <linux/sysfs.h> | 27 | #include <linux/sysfs.h> |
28 | #include <linux/uaccess.h> | ||
30 | #include <asm/system.h> | 29 | #include <asm/system.h> |
31 | #include <asm/uaccess.h> | 30 | #include <asm/alignment.h> |
32 | #include <asm/fpu.h> | 31 | #include <asm/fpu.h> |
33 | #include <asm/kprobes.h> | 32 | #include <asm/kprobes.h> |
34 | 33 | ||
@@ -47,73 +46,6 @@ | |||
47 | #define TRAP_ILLEGAL_SLOT_INST 13 | 46 | #define TRAP_ILLEGAL_SLOT_INST 13 |
48 | #endif | 47 | #endif |
49 | 48 | ||
50 | static unsigned long se_user; | ||
51 | static unsigned long se_sys; | ||
52 | static unsigned long se_half; | ||
53 | static unsigned long se_word; | ||
54 | static unsigned long se_dword; | ||
55 | static unsigned long se_multi; | ||
56 | /* bitfield: 1: warn 2: fixup 4: signal -> combinations 2|4 && 1|2|4 are not | ||
57 | valid! */ | ||
58 | static int se_usermode = 3; | ||
59 | /* 0: no warning 1: print a warning message, disabled by default */ | ||
60 | static int se_kernmode_warn; | ||
61 | |||
62 | #ifdef CONFIG_PROC_FS | ||
63 | static const char *se_usermode_action[] = { | ||
64 | "ignored", | ||
65 | "warn", | ||
66 | "fixup", | ||
67 | "fixup+warn", | ||
68 | "signal", | ||
69 | "signal+warn" | ||
70 | }; | ||
71 | |||
72 | static int alignment_proc_show(struct seq_file *m, void *v) | ||
73 | { | ||
74 | seq_printf(m, "User:\t\t%lu\n", se_user); | ||
75 | seq_printf(m, "System:\t\t%lu\n", se_sys); | ||
76 | seq_printf(m, "Half:\t\t%lu\n", se_half); | ||
77 | seq_printf(m, "Word:\t\t%lu\n", se_word); | ||
78 | seq_printf(m, "DWord:\t\t%lu\n", se_dword); | ||
79 | seq_printf(m, "Multi:\t\t%lu\n", se_multi); | ||
80 | seq_printf(m, "User faults:\t%i (%s)\n", se_usermode, | ||
81 | se_usermode_action[se_usermode]); | ||
82 | seq_printf(m, "Kernel faults:\t%i (fixup%s)\n", se_kernmode_warn, | ||
83 | se_kernmode_warn ? "+warn" : ""); | ||
84 | return 0; | ||
85 | } | ||
86 | |||
87 | static int alignment_proc_open(struct inode *inode, struct file *file) | ||
88 | { | ||
89 | return single_open(file, alignment_proc_show, NULL); | ||
90 | } | ||
91 | |||
92 | static ssize_t alignment_proc_write(struct file *file, | ||
93 | const char __user *buffer, size_t count, loff_t *pos) | ||
94 | { | ||
95 | int *data = PDE(file->f_path.dentry->d_inode)->data; | ||
96 | char mode; | ||
97 | |||
98 | if (count > 0) { | ||
99 | if (get_user(mode, buffer)) | ||
100 | return -EFAULT; | ||
101 | if (mode >= '0' && mode <= '5') | ||
102 | *data = mode - '0'; | ||
103 | } | ||
104 | return count; | ||
105 | } | ||
106 | |||
107 | static const struct file_operations alignment_proc_fops = { | ||
108 | .owner = THIS_MODULE, | ||
109 | .open = alignment_proc_open, | ||
110 | .read = seq_read, | ||
111 | .llseek = seq_lseek, | ||
112 | .release = single_release, | ||
113 | .write = alignment_proc_write, | ||
114 | }; | ||
115 | #endif | ||
116 | |||
117 | static void dump_mem(const char *str, unsigned long bottom, unsigned long top) | 49 | static void dump_mem(const char *str, unsigned long bottom, unsigned long top) |
118 | { | 50 | { |
119 | unsigned long p; | 51 | unsigned long p; |
@@ -265,10 +197,10 @@ static int handle_unaligned_ins(insn_size_t instruction, struct pt_regs *regs, | |||
265 | count = 1<<(instruction&3); | 197 | count = 1<<(instruction&3); |
266 | 198 | ||
267 | switch (count) { | 199 | switch (count) { |
268 | case 1: se_half += 1; break; | 200 | case 1: inc_unaligned_byte_access(); break; |
269 | case 2: se_word += 1; break; | 201 | case 2: inc_unaligned_word_access(); break; |
270 | case 4: se_dword += 1; break; | 202 | case 4: inc_unaligned_dword_access(); break; |
271 | case 8: se_multi += 1; break; /* ??? */ | 203 | case 8: inc_unaligned_multi_access(); break; |
272 | } | 204 | } |
273 | 205 | ||
274 | ret = -EFAULT; | 206 | ret = -EFAULT; |
@@ -452,18 +384,8 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs, | |||
452 | rm = regs->regs[index]; | 384 | rm = regs->regs[index]; |
453 | 385 | ||
454 | /* shout about fixups */ | 386 | /* shout about fixups */ |
455 | if (!expected) { | 387 | if (!expected) |
456 | if (user_mode(regs) && (se_usermode & 1) && printk_ratelimit()) | 388 | unaligned_fixups_notify(current, instruction, regs); |
457 | pr_notice("Fixing up unaligned userspace access " | ||
458 | "in \"%s\" pid=%d pc=0x%p ins=0x%04hx\n", | ||
459 | current->comm, task_pid_nr(current), | ||
460 | (void *)regs->pc, instruction); | ||
461 | else if (se_kernmode_warn && printk_ratelimit()) | ||
462 | pr_notice("Fixing up unaligned kernel access " | ||
463 | "in \"%s\" pid=%d pc=0x%p ins=0x%04hx\n", | ||
464 | current->comm, task_pid_nr(current), | ||
465 | (void *)regs->pc, instruction); | ||
466 | } | ||
467 | 389 | ||
468 | ret = -EFAULT; | 390 | ret = -EFAULT; |
469 | switch (instruction&0xF000) { | 391 | switch (instruction&0xF000) { |
@@ -616,10 +538,10 @@ asmlinkage void do_address_error(struct pt_regs *regs, | |||
616 | 538 | ||
617 | if (user_mode(regs)) { | 539 | if (user_mode(regs)) { |
618 | int si_code = BUS_ADRERR; | 540 | int si_code = BUS_ADRERR; |
541 | unsigned int user_action; | ||
619 | 542 | ||
620 | local_irq_enable(); | 543 | local_irq_enable(); |
621 | 544 | inc_unaligned_user_access(); | |
622 | se_user += 1; | ||
623 | 545 | ||
624 | set_fs(USER_DS); | 546 | set_fs(USER_DS); |
625 | if (copy_from_user(&instruction, (insn_size_t *)(regs->pc & ~1), | 547 | if (copy_from_user(&instruction, (insn_size_t *)(regs->pc & ~1), |
@@ -630,16 +552,12 @@ asmlinkage void do_address_error(struct pt_regs *regs, | |||
630 | set_fs(oldfs); | 552 | set_fs(oldfs); |
631 | 553 | ||
632 | /* shout about userspace fixups */ | 554 | /* shout about userspace fixups */ |
633 | if (se_usermode & 1) | 555 | unaligned_fixups_notify(current, instruction, regs); |
634 | printk(KERN_NOTICE "Unaligned userspace access " | ||
635 | "in \"%s\" pid=%d pc=0x%p ins=0x%04hx\n", | ||
636 | current->comm, current->pid, (void *)regs->pc, | ||
637 | instruction); | ||
638 | 556 | ||
639 | if (se_usermode & 2) | 557 | user_action = unaligned_user_action(); |
558 | if (user_action & UM_FIXUP) | ||
640 | goto fixup; | 559 | goto fixup; |
641 | 560 | if (user_action & UM_SIGNAL) | |
642 | if (se_usermode & 4) | ||
643 | goto uspace_segv; | 561 | goto uspace_segv; |
644 | else { | 562 | else { |
645 | /* ignore */ | 563 | /* ignore */ |
@@ -659,7 +577,7 @@ fixup: | |||
659 | &user_mem_access, 0); | 577 | &user_mem_access, 0); |
660 | set_fs(oldfs); | 578 | set_fs(oldfs); |
661 | 579 | ||
662 | if (tmp==0) | 580 | if (tmp == 0) |
663 | return; /* sorted */ | 581 | return; /* sorted */ |
664 | uspace_segv: | 582 | uspace_segv: |
665 | printk(KERN_NOTICE "Sending SIGBUS to \"%s\" due to unaligned " | 583 | printk(KERN_NOTICE "Sending SIGBUS to \"%s\" due to unaligned " |
@@ -672,7 +590,7 @@ uspace_segv: | |||
672 | info.si_addr = (void __user *)address; | 590 | info.si_addr = (void __user *)address; |
673 | force_sig_info(SIGBUS, &info, current); | 591 | force_sig_info(SIGBUS, &info, current); |
674 | } else { | 592 | } else { |
675 | se_sys += 1; | 593 | inc_unaligned_kernel_access(); |
676 | 594 | ||
677 | if (regs->pc & 1) | 595 | if (regs->pc & 1) |
678 | die("unaligned program counter", regs, error_code); | 596 | die("unaligned program counter", regs, error_code); |
@@ -687,11 +605,7 @@ uspace_segv: | |||
687 | die("insn faulting in do_address_error", regs, 0); | 605 | die("insn faulting in do_address_error", regs, 0); |
688 | } | 606 | } |
689 | 607 | ||
690 | if (se_kernmode_warn) | 608 | unaligned_fixups_notify(current, instruction, regs); |
691 | printk(KERN_NOTICE "Unaligned kernel access " | ||
692 | "on behalf of \"%s\" pid=%d pc=0x%p ins=0x%04hx\n", | ||
693 | current->comm, current->pid, (void *)regs->pc, | ||
694 | instruction); | ||
695 | 609 | ||
696 | handle_unaligned_access(instruction, regs, | 610 | handle_unaligned_access(instruction, regs, |
697 | &user_mem_access, 0); | 611 | &user_mem_access, 0); |
@@ -876,35 +790,10 @@ asmlinkage void do_exception_error(unsigned long r4, unsigned long r5, | |||
876 | die_if_kernel("exception", regs, ex); | 790 | die_if_kernel("exception", regs, ex); |
877 | } | 791 | } |
878 | 792 | ||
879 | #if defined(CONFIG_SH_STANDARD_BIOS) | ||
880 | void *gdb_vbr_vector; | ||
881 | |||
882 | static inline void __init gdb_vbr_init(void) | ||
883 | { | ||
884 | register unsigned long vbr; | ||
885 | |||
886 | /* | ||
887 | * Read the old value of the VBR register to initialise | ||
888 | * the vector through which debug and BIOS traps are | ||
889 | * delegated by the Linux trap handler. | ||
890 | */ | ||
891 | asm volatile("stc vbr, %0" : "=r" (vbr)); | ||
892 | |||
893 | gdb_vbr_vector = (void *)(vbr + 0x100); | ||
894 | printk("Setting GDB trap vector to 0x%08lx\n", | ||
895 | (unsigned long)gdb_vbr_vector); | ||
896 | } | ||
897 | #endif | ||
898 | |||
899 | void __cpuinit per_cpu_trap_init(void) | 793 | void __cpuinit per_cpu_trap_init(void) |
900 | { | 794 | { |
901 | extern void *vbr_base; | 795 | extern void *vbr_base; |
902 | 796 | ||
903 | #ifdef CONFIG_SH_STANDARD_BIOS | ||
904 | if (raw_smp_processor_id() == 0) | ||
905 | gdb_vbr_init(); | ||
906 | #endif | ||
907 | |||
908 | /* NOTE: The VBR value should be at P1 | 797 | /* NOTE: The VBR value should be at P1 |
909 | (or P2, virtural "fixed" address space). | 798 | (or P2, virtural "fixed" address space). |
910 | It's definitely should not in physical address. */ | 799 | It's definitely should not in physical address. */ |
@@ -956,11 +845,8 @@ void __init trap_init(void) | |||
956 | #endif | 845 | #endif |
957 | 846 | ||
958 | #ifdef TRAP_UBC | 847 | #ifdef TRAP_UBC |
959 | set_exception_table_vec(TRAP_UBC, break_point_trap); | 848 | set_exception_table_vec(TRAP_UBC, breakpoint_trap_handler); |
960 | #endif | 849 | #endif |
961 | |||
962 | /* Setup VBR for boot cpu */ | ||
963 | per_cpu_trap_init(); | ||
964 | } | 850 | } |
965 | 851 | ||
966 | void show_stack(struct task_struct *tsk, unsigned long *sp) | 852 | void show_stack(struct task_struct *tsk, unsigned long *sp) |
@@ -985,34 +871,3 @@ void dump_stack(void) | |||
985 | show_stack(NULL, NULL); | 871 | show_stack(NULL, NULL); |
986 | } | 872 | } |
987 | EXPORT_SYMBOL(dump_stack); | 873 | EXPORT_SYMBOL(dump_stack); |
988 | |||
989 | #ifdef CONFIG_PROC_FS | ||
990 | /* | ||
991 | * This needs to be done after sysctl_init, otherwise sys/ will be | ||
992 | * overwritten. Actually, this shouldn't be in sys/ at all since | ||
993 | * it isn't a sysctl, and it doesn't contain sysctl information. | ||
994 | * We now locate it in /proc/cpu/alignment instead. | ||
995 | */ | ||
996 | static int __init alignment_init(void) | ||
997 | { | ||
998 | struct proc_dir_entry *dir, *res; | ||
999 | |||
1000 | dir = proc_mkdir("cpu", NULL); | ||
1001 | if (!dir) | ||
1002 | return -ENOMEM; | ||
1003 | |||
1004 | res = proc_create_data("alignment", S_IWUSR | S_IRUGO, dir, | ||
1005 | &alignment_proc_fops, &se_usermode); | ||
1006 | if (!res) | ||
1007 | return -ENOMEM; | ||
1008 | |||
1009 | res = proc_create_data("kernel_alignment", S_IWUSR | S_IRUGO, dir, | ||
1010 | &alignment_proc_fops, &se_kernmode_warn); | ||
1011 | if (!res) | ||
1012 | return -ENOMEM; | ||
1013 | |||
1014 | return 0; | ||
1015 | } | ||
1016 | |||
1017 | fs_initcall(alignment_init); | ||
1018 | #endif | ||
diff --git a/arch/sh/kernel/traps_64.c b/arch/sh/kernel/traps_64.c index d86f5315a0c1..e3f92eb05ffd 100644 --- a/arch/sh/kernel/traps_64.c +++ b/arch/sh/kernel/traps_64.c | |||
@@ -611,19 +611,19 @@ static int misaligned_fpu_load(struct pt_regs *regs, | |||
611 | 611 | ||
612 | switch (width_shift) { | 612 | switch (width_shift) { |
613 | case 2: | 613 | case 2: |
614 | current->thread.fpu.hard.fp_regs[destreg] = buflo; | 614 | current->thread.xstate->hardfpu.fp_regs[destreg] = buflo; |
615 | break; | 615 | break; |
616 | case 3: | 616 | case 3: |
617 | if (do_paired_load) { | 617 | if (do_paired_load) { |
618 | current->thread.fpu.hard.fp_regs[destreg] = buflo; | 618 | current->thread.xstate->hardfpu.fp_regs[destreg] = buflo; |
619 | current->thread.fpu.hard.fp_regs[destreg+1] = bufhi; | 619 | current->thread.xstate->hardfpu.fp_regs[destreg+1] = bufhi; |
620 | } else { | 620 | } else { |
621 | #if defined(CONFIG_CPU_LITTLE_ENDIAN) | 621 | #if defined(CONFIG_CPU_LITTLE_ENDIAN) |
622 | current->thread.fpu.hard.fp_regs[destreg] = bufhi; | 622 | current->thread.xstate->hardfpu.fp_regs[destreg] = bufhi; |
623 | current->thread.fpu.hard.fp_regs[destreg+1] = buflo; | 623 | current->thread.xstate->hardfpu.fp_regs[destreg+1] = buflo; |
624 | #else | 624 | #else |
625 | current->thread.fpu.hard.fp_regs[destreg] = buflo; | 625 | current->thread.xstate->hardfpu.fp_regs[destreg] = buflo; |
626 | current->thread.fpu.hard.fp_regs[destreg+1] = bufhi; | 626 | current->thread.xstate->hardfpu.fp_regs[destreg+1] = bufhi; |
627 | #endif | 627 | #endif |
628 | } | 628 | } |
629 | break; | 629 | break; |
@@ -681,19 +681,19 @@ static int misaligned_fpu_store(struct pt_regs *regs, | |||
681 | 681 | ||
682 | switch (width_shift) { | 682 | switch (width_shift) { |
683 | case 2: | 683 | case 2: |
684 | buflo = current->thread.fpu.hard.fp_regs[srcreg]; | 684 | buflo = current->thread.xstate->hardfpu.fp_regs[srcreg]; |
685 | break; | 685 | break; |
686 | case 3: | 686 | case 3: |
687 | if (do_paired_load) { | 687 | if (do_paired_load) { |
688 | buflo = current->thread.fpu.hard.fp_regs[srcreg]; | 688 | buflo = current->thread.xstate->hardfpu.fp_regs[srcreg]; |
689 | bufhi = current->thread.fpu.hard.fp_regs[srcreg+1]; | 689 | bufhi = current->thread.xstate->hardfpu.fp_regs[srcreg+1]; |
690 | } else { | 690 | } else { |
691 | #if defined(CONFIG_CPU_LITTLE_ENDIAN) | 691 | #if defined(CONFIG_CPU_LITTLE_ENDIAN) |
692 | bufhi = current->thread.fpu.hard.fp_regs[srcreg]; | 692 | bufhi = current->thread.xstate->hardfpu.fp_regs[srcreg]; |
693 | buflo = current->thread.fpu.hard.fp_regs[srcreg+1]; | 693 | buflo = current->thread.xstate->hardfpu.fp_regs[srcreg+1]; |
694 | #else | 694 | #else |
695 | buflo = current->thread.fpu.hard.fp_regs[srcreg]; | 695 | buflo = current->thread.xstate->hardfpu.fp_regs[srcreg]; |
696 | bufhi = current->thread.fpu.hard.fp_regs[srcreg+1]; | 696 | bufhi = current->thread.xstate->hardfpu.fp_regs[srcreg+1]; |
697 | #endif | 697 | #endif |
698 | } | 698 | } |
699 | break; | 699 | break; |
diff --git a/arch/sh/kernel/vmlinux.lds.S b/arch/sh/kernel/vmlinux.lds.S index a1e4ec24f1f5..7f8a709c3ada 100644 --- a/arch/sh/kernel/vmlinux.lds.S +++ b/arch/sh/kernel/vmlinux.lds.S | |||
@@ -3,7 +3,7 @@ | |||
3 | * Written by Niibe Yutaka and Paul Mundt | 3 | * Written by Niibe Yutaka and Paul Mundt |
4 | */ | 4 | */ |
5 | #ifdef CONFIG_SUPERH64 | 5 | #ifdef CONFIG_SUPERH64 |
6 | #define LOAD_OFFSET CONFIG_PAGE_OFFSET | 6 | #define LOAD_OFFSET PAGE_OFFSET |
7 | OUTPUT_ARCH(sh:sh5) | 7 | OUTPUT_ARCH(sh:sh5) |
8 | #else | 8 | #else |
9 | #define LOAD_OFFSET 0 | 9 | #define LOAD_OFFSET 0 |
@@ -14,17 +14,16 @@ OUTPUT_ARCH(sh) | |||
14 | #include <asm/cache.h> | 14 | #include <asm/cache.h> |
15 | #include <asm/vmlinux.lds.h> | 15 | #include <asm/vmlinux.lds.h> |
16 | 16 | ||
17 | #ifdef CONFIG_PMB | ||
18 | #define MEMORY_OFFSET 0 | ||
19 | #else | ||
20 | #define MEMORY_OFFSET __MEMORY_START | ||
21 | #endif | ||
22 | |||
17 | ENTRY(_start) | 23 | ENTRY(_start) |
18 | SECTIONS | 24 | SECTIONS |
19 | { | 25 | { |
20 | #ifdef CONFIG_PMB_FIXED | 26 | . = PAGE_OFFSET + MEMORY_OFFSET + CONFIG_ZERO_PAGE_OFFSET; |
21 | . = CONFIG_PAGE_OFFSET + (CONFIG_MEMORY_START & 0x1fffffff) + | ||
22 | CONFIG_ZERO_PAGE_OFFSET; | ||
23 | #elif defined(CONFIG_32BIT) | ||
24 | . = CONFIG_PAGE_OFFSET + CONFIG_ZERO_PAGE_OFFSET; | ||
25 | #else | ||
26 | . = CONFIG_PAGE_OFFSET + CONFIG_MEMORY_START + CONFIG_ZERO_PAGE_OFFSET; | ||
27 | #endif | ||
28 | 27 | ||
29 | _text = .; /* Text and read-only data */ | 28 | _text = .; /* Text and read-only data */ |
30 | 29 | ||
@@ -35,12 +34,7 @@ SECTIONS | |||
35 | .text : AT(ADDR(.text) - LOAD_OFFSET) { | 34 | .text : AT(ADDR(.text) - LOAD_OFFSET) { |
36 | HEAD_TEXT | 35 | HEAD_TEXT |
37 | TEXT_TEXT | 36 | TEXT_TEXT |
38 | 37 | EXTRA_TEXT | |
39 | #ifdef CONFIG_SUPERH64 | ||
40 | *(.text64) | ||
41 | *(.text..SHmedia32) | ||
42 | #endif | ||
43 | |||
44 | SCHED_TEXT | 38 | SCHED_TEXT |
45 | LOCK_TEXT | 39 | LOCK_TEXT |
46 | KPROBES_TEXT | 40 | KPROBES_TEXT |
@@ -51,24 +45,12 @@ SECTIONS | |||
51 | } = 0x0009 | 45 | } = 0x0009 |
52 | 46 | ||
53 | EXCEPTION_TABLE(16) | 47 | EXCEPTION_TABLE(16) |
54 | |||
55 | NOTES | 48 | NOTES |
56 | RO_DATA(PAGE_SIZE) | ||
57 | |||
58 | /* | ||
59 | * Code which must be executed uncached and the associated data | ||
60 | */ | ||
61 | . = ALIGN(PAGE_SIZE); | ||
62 | .uncached : AT(ADDR(.uncached) - LOAD_OFFSET) { | ||
63 | __uncached_start = .; | ||
64 | *(.uncached.text) | ||
65 | *(.uncached.data) | ||
66 | __uncached_end = .; | ||
67 | } | ||
68 | 49 | ||
50 | _sdata = .; | ||
51 | RO_DATA(PAGE_SIZE) | ||
69 | RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE) | 52 | RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE) |
70 | 53 | _edata = .; | |
71 | _edata = .; /* End of data section */ | ||
72 | 54 | ||
73 | DWARF_EH_FRAME | 55 | DWARF_EH_FRAME |
74 | 56 | ||
diff --git a/arch/sh/math-emu/math.c b/arch/sh/math-emu/math.c index d6c15cae0912..1fcdb1220975 100644 --- a/arch/sh/math-emu/math.c +++ b/arch/sh/math-emu/math.c | |||
@@ -471,10 +471,10 @@ static int fpu_emulate(u16 code, struct sh_fpu_soft_struct *fregs, struct pt_reg | |||
471 | * denormal_to_double - Given denormalized float number, | 471 | * denormal_to_double - Given denormalized float number, |
472 | * store double float | 472 | * store double float |
473 | * | 473 | * |
474 | * @fpu: Pointer to sh_fpu_hard structure | 474 | * @fpu: Pointer to sh_fpu_soft structure |
475 | * @n: Index to FP register | 475 | * @n: Index to FP register |
476 | */ | 476 | */ |
477 | static void denormal_to_double(struct sh_fpu_hard_struct *fpu, int n) | 477 | static void denormal_to_double(struct sh_fpu_soft_struct *fpu, int n) |
478 | { | 478 | { |
479 | unsigned long du, dl; | 479 | unsigned long du, dl; |
480 | unsigned long x = fpu->fpul; | 480 | unsigned long x = fpu->fpul; |
@@ -552,11 +552,11 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
552 | if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */ | 552 | if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */ |
553 | struct task_struct *tsk = current; | 553 | struct task_struct *tsk = current; |
554 | 554 | ||
555 | if ((tsk->thread.fpu.hard.fpscr & (1 << 17))) { | 555 | if ((tsk->thread.xstate->softfpu.fpscr & (1 << 17))) { |
556 | /* FPU error */ | 556 | /* FPU error */ |
557 | denormal_to_double (&tsk->thread.fpu.hard, | 557 | denormal_to_double (&tsk->thread.xstate->softfpu, |
558 | (finsn >> 8) & 0xf); | 558 | (finsn >> 8) & 0xf); |
559 | tsk->thread.fpu.hard.fpscr &= | 559 | tsk->thread.xstate->softfpu.fpscr &= |
560 | ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); | 560 | ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); |
561 | task_thread_info(tsk)->status |= TS_USEDFPU; | 561 | task_thread_info(tsk)->status |= TS_USEDFPU; |
562 | } else { | 562 | } else { |
@@ -617,7 +617,7 @@ static void fpu_init(struct sh_fpu_soft_struct *fpu) | |||
617 | int do_fpu_inst(unsigned short inst, struct pt_regs *regs) | 617 | int do_fpu_inst(unsigned short inst, struct pt_regs *regs) |
618 | { | 618 | { |
619 | struct task_struct *tsk = current; | 619 | struct task_struct *tsk = current; |
620 | struct sh_fpu_soft_struct *fpu = &(tsk->thread.fpu.soft); | 620 | struct sh_fpu_soft_struct *fpu = &(tsk->thread.xstate->softfpu); |
621 | 621 | ||
622 | if (!(task_thread_info(tsk)->status & TS_USEDFPU)) { | 622 | if (!(task_thread_info(tsk)->status & TS_USEDFPU)) { |
623 | /* initialize once. */ | 623 | /* initialize once. */ |
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index 986a71b88ca3..1445ca6257df 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
@@ -75,52 +75,25 @@ config MEMORY_SIZE | |||
75 | config 29BIT | 75 | config 29BIT |
76 | def_bool !32BIT | 76 | def_bool !32BIT |
77 | depends on SUPERH32 | 77 | depends on SUPERH32 |
78 | select UNCACHED_MAPPING | ||
78 | 79 | ||
79 | config 32BIT | 80 | config 32BIT |
80 | bool | 81 | bool |
81 | default y if CPU_SH5 | 82 | default y if CPU_SH5 |
82 | 83 | ||
83 | config PMB_ENABLE | ||
84 | bool "Support 32-bit physical addressing through PMB" | ||
85 | depends on MMU && EXPERIMENTAL && CPU_SH4A && !CPU_SH4AL_DSP | ||
86 | help | ||
87 | If you say Y here, physical addressing will be extended to | ||
88 | 32-bits through the SH-4A PMB. If this is not set, legacy | ||
89 | 29-bit physical addressing will be used. | ||
90 | |||
91 | choice | ||
92 | prompt "PMB handling type" | ||
93 | depends on PMB_ENABLE | ||
94 | default PMB_FIXED | ||
95 | |||
96 | config PMB | 84 | config PMB |
97 | bool "PMB" | 85 | bool "Support 32-bit physical addressing through PMB" |
98 | depends on MMU && EXPERIMENTAL && CPU_SH4A && !CPU_SH4AL_DSP | 86 | depends on MMU && EXPERIMENTAL && CPU_SH4A && !CPU_SH4AL_DSP |
87 | select 32BIT | ||
88 | select UNCACHED_MAPPING | ||
99 | help | 89 | help |
100 | If you say Y here, physical addressing will be extended to | 90 | If you say Y here, physical addressing will be extended to |
101 | 32-bits through the SH-4A PMB. If this is not set, legacy | 91 | 32-bits through the SH-4A PMB. If this is not set, legacy |
102 | 29-bit physical addressing will be used. | 92 | 29-bit physical addressing will be used. |
103 | 93 | ||
104 | config PMB_FIXED | ||
105 | bool "fixed PMB" | ||
106 | depends on MMU && EXPERIMENTAL && CPU_SH4A && !CPU_SH4AL_DSP | ||
107 | select 32BIT | ||
108 | help | ||
109 | If this option is enabled, fixed PMB mappings are inherited | ||
110 | from the boot loader, and the kernel does not attempt dynamic | ||
111 | management. This is the closest to legacy 29-bit physical mode, | ||
112 | and allows systems to support up to 512MiB of system memory. | ||
113 | |||
114 | endchoice | ||
115 | |||
116 | config X2TLB | 94 | config X2TLB |
117 | bool "Enable extended TLB mode" | 95 | def_bool y |
118 | depends on (CPU_SHX2 || CPU_SHX3) && MMU && EXPERIMENTAL | 96 | depends on (CPU_SHX2 || CPU_SHX3) && MMU |
119 | help | ||
120 | Selecting this option will enable the extended mode of the SH-X2 | ||
121 | TLB. For legacy SH-X behaviour and interoperability, say N. For | ||
122 | all of the fun new features and a willingless to submit bug reports, | ||
123 | say Y. | ||
124 | 97 | ||
125 | config VSYSCALL | 98 | config VSYSCALL |
126 | bool "Support vsyscall page" | 99 | bool "Support vsyscall page" |
@@ -188,14 +161,19 @@ config ARCH_MEMORY_PROBE | |||
188 | def_bool y | 161 | def_bool y |
189 | depends on MEMORY_HOTPLUG | 162 | depends on MEMORY_HOTPLUG |
190 | 163 | ||
164 | config IOREMAP_FIXED | ||
165 | def_bool y | ||
166 | depends on X2TLB || SUPERH64 | ||
167 | |||
168 | config UNCACHED_MAPPING | ||
169 | bool | ||
170 | |||
191 | choice | 171 | choice |
192 | prompt "Kernel page size" | 172 | prompt "Kernel page size" |
193 | default PAGE_SIZE_8KB if X2TLB | ||
194 | default PAGE_SIZE_4KB | 173 | default PAGE_SIZE_4KB |
195 | 174 | ||
196 | config PAGE_SIZE_4KB | 175 | config PAGE_SIZE_4KB |
197 | bool "4kB" | 176 | bool "4kB" |
198 | depends on !MMU || !X2TLB | ||
199 | help | 177 | help |
200 | This is the default page size used by all SuperH CPUs. | 178 | This is the default page size used by all SuperH CPUs. |
201 | 179 | ||
diff --git a/arch/sh/mm/Makefile b/arch/sh/mm/Makefile index 8a70535fa7ce..3dc8a8a63822 100644 --- a/arch/sh/mm/Makefile +++ b/arch/sh/mm/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for the Linux SuperH-specific parts of the memory manager. | 2 | # Makefile for the Linux SuperH-specific parts of the memory manager. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := cache.o init.o consistent.o mmap.o | 5 | obj-y := alignment.o cache.o init.o consistent.o mmap.o |
6 | 6 | ||
7 | cacheops-$(CONFIG_CPU_SH2) := cache-sh2.o | 7 | cacheops-$(CONFIG_CPU_SH2) := cache-sh2.o |
8 | cacheops-$(CONFIG_CPU_SH2A) := cache-sh2a.o | 8 | cacheops-$(CONFIG_CPU_SH2A) := cache-sh2a.o |
@@ -15,7 +15,7 @@ obj-y += $(cacheops-y) | |||
15 | 15 | ||
16 | mmu-y := nommu.o extable_32.o | 16 | mmu-y := nommu.o extable_32.o |
17 | mmu-$(CONFIG_MMU) := extable_$(BITS).o fault_$(BITS).o \ | 17 | mmu-$(CONFIG_MMU) := extable_$(BITS).o fault_$(BITS).o \ |
18 | ioremap_$(BITS).o kmap.o tlbflush_$(BITS).o | 18 | ioremap.o kmap.o pgtable.o tlbflush_$(BITS).o |
19 | 19 | ||
20 | obj-y += $(mmu-y) | 20 | obj-y += $(mmu-y) |
21 | obj-$(CONFIG_DEBUG_FS) += asids-debugfs.o | 21 | obj-$(CONFIG_DEBUG_FS) += asids-debugfs.o |
@@ -26,15 +26,17 @@ endif | |||
26 | 26 | ||
27 | ifdef CONFIG_MMU | 27 | ifdef CONFIG_MMU |
28 | tlb-$(CONFIG_CPU_SH3) := tlb-sh3.o | 28 | tlb-$(CONFIG_CPU_SH3) := tlb-sh3.o |
29 | tlb-$(CONFIG_CPU_SH4) := tlb-sh4.o | 29 | tlb-$(CONFIG_CPU_SH4) := tlb-sh4.o tlb-urb.o |
30 | tlb-$(CONFIG_CPU_SH5) := tlb-sh5.o | 30 | tlb-$(CONFIG_CPU_SH5) := tlb-sh5.o |
31 | tlb-$(CONFIG_CPU_HAS_PTEAEX) := tlb-pteaex.o | 31 | tlb-$(CONFIG_CPU_HAS_PTEAEX) := tlb-pteaex.o tlb-urb.o |
32 | obj-y += $(tlb-y) | 32 | obj-y += $(tlb-y) |
33 | endif | 33 | endif |
34 | 34 | ||
35 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | 35 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o |
36 | obj-$(CONFIG_PMB_ENABLE) += pmb.o | 36 | obj-$(CONFIG_PMB) += pmb.o |
37 | obj-$(CONFIG_NUMA) += numa.o | 37 | obj-$(CONFIG_NUMA) += numa.o |
38 | obj-$(CONFIG_IOREMAP_FIXED) += ioremap_fixed.o | ||
39 | obj-$(CONFIG_UNCACHED_MAPPING) += uncached.o | ||
38 | 40 | ||
39 | # Special flags for fault_64.o. This puts restrictions on the number of | 41 | # Special flags for fault_64.o. This puts restrictions on the number of |
40 | # caller-save registers that the compiler can target when building this file. | 42 | # caller-save registers that the compiler can target when building this file. |
diff --git a/arch/sh/mm/alignment.c b/arch/sh/mm/alignment.c new file mode 100644 index 000000000000..b2595b8548ee --- /dev/null +++ b/arch/sh/mm/alignment.c | |||
@@ -0,0 +1,189 @@ | |||
1 | /* | ||
2 | * Alignment access counters and corresponding user-space interfaces. | ||
3 | * | ||
4 | * Copyright (C) 2009 ST Microelectronics | ||
5 | * Copyright (C) 2009 - 2010 Paul Mundt | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | #include <linux/module.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/seq_file.h> | ||
14 | #include <linux/proc_fs.h> | ||
15 | #include <linux/uaccess.h> | ||
16 | #include <asm/alignment.h> | ||
17 | #include <asm/processor.h> | ||
18 | |||
19 | static unsigned long se_user; | ||
20 | static unsigned long se_sys; | ||
21 | static unsigned long se_half; | ||
22 | static unsigned long se_word; | ||
23 | static unsigned long se_dword; | ||
24 | static unsigned long se_multi; | ||
25 | /* bitfield: 1: warn 2: fixup 4: signal -> combinations 2|4 && 1|2|4 are not | ||
26 | valid! */ | ||
27 | static int se_usermode = UM_WARN | UM_FIXUP; | ||
28 | /* 0: no warning 1: print a warning message, disabled by default */ | ||
29 | static int se_kernmode_warn; | ||
30 | |||
31 | core_param(alignment, se_usermode, int, 0600); | ||
32 | |||
33 | void inc_unaligned_byte_access(void) | ||
34 | { | ||
35 | se_half++; | ||
36 | } | ||
37 | |||
38 | void inc_unaligned_word_access(void) | ||
39 | { | ||
40 | se_word++; | ||
41 | } | ||
42 | |||
43 | void inc_unaligned_dword_access(void) | ||
44 | { | ||
45 | se_dword++; | ||
46 | } | ||
47 | |||
48 | void inc_unaligned_multi_access(void) | ||
49 | { | ||
50 | se_multi++; | ||
51 | } | ||
52 | |||
53 | void inc_unaligned_user_access(void) | ||
54 | { | ||
55 | se_user++; | ||
56 | } | ||
57 | |||
58 | void inc_unaligned_kernel_access(void) | ||
59 | { | ||
60 | se_sys++; | ||
61 | } | ||
62 | |||
63 | /* | ||
64 | * This defaults to the global policy which can be set from the command | ||
65 | * line, while processes can overload their preferences via prctl(). | ||
66 | */ | ||
67 | unsigned int unaligned_user_action(void) | ||
68 | { | ||
69 | unsigned int action = se_usermode; | ||
70 | |||
71 | if (current->thread.flags & SH_THREAD_UAC_SIGBUS) { | ||
72 | action &= ~UM_FIXUP; | ||
73 | action |= UM_SIGNAL; | ||
74 | } | ||
75 | |||
76 | if (current->thread.flags & SH_THREAD_UAC_NOPRINT) | ||
77 | action &= ~UM_WARN; | ||
78 | |||
79 | return action; | ||
80 | } | ||
81 | |||
82 | int get_unalign_ctl(struct task_struct *tsk, unsigned long addr) | ||
83 | { | ||
84 | return put_user(tsk->thread.flags & SH_THREAD_UAC_MASK, | ||
85 | (unsigned int __user *)addr); | ||
86 | } | ||
87 | |||
88 | int set_unalign_ctl(struct task_struct *tsk, unsigned int val) | ||
89 | { | ||
90 | tsk->thread.flags = (tsk->thread.flags & ~SH_THREAD_UAC_MASK) | | ||
91 | (val & SH_THREAD_UAC_MASK); | ||
92 | return 0; | ||
93 | } | ||
94 | |||
95 | void unaligned_fixups_notify(struct task_struct *tsk, insn_size_t insn, | ||
96 | struct pt_regs *regs) | ||
97 | { | ||
98 | if (user_mode(regs) && (se_usermode & UM_WARN) && printk_ratelimit()) | ||
99 | pr_notice("Fixing up unaligned userspace access " | ||
100 | "in \"%s\" pid=%d pc=0x%p ins=0x%04hx\n", | ||
101 | tsk->comm, task_pid_nr(tsk), | ||
102 | (void *)instruction_pointer(regs), insn); | ||
103 | else if (se_kernmode_warn && printk_ratelimit()) | ||
104 | pr_notice("Fixing up unaligned kernel access " | ||
105 | "in \"%s\" pid=%d pc=0x%p ins=0x%04hx\n", | ||
106 | tsk->comm, task_pid_nr(tsk), | ||
107 | (void *)instruction_pointer(regs), insn); | ||
108 | } | ||
109 | |||
110 | static const char *se_usermode_action[] = { | ||
111 | "ignored", | ||
112 | "warn", | ||
113 | "fixup", | ||
114 | "fixup+warn", | ||
115 | "signal", | ||
116 | "signal+warn" | ||
117 | }; | ||
118 | |||
119 | static int alignment_proc_show(struct seq_file *m, void *v) | ||
120 | { | ||
121 | seq_printf(m, "User:\t\t%lu\n", se_user); | ||
122 | seq_printf(m, "System:\t\t%lu\n", se_sys); | ||
123 | seq_printf(m, "Half:\t\t%lu\n", se_half); | ||
124 | seq_printf(m, "Word:\t\t%lu\n", se_word); | ||
125 | seq_printf(m, "DWord:\t\t%lu\n", se_dword); | ||
126 | seq_printf(m, "Multi:\t\t%lu\n", se_multi); | ||
127 | seq_printf(m, "User faults:\t%i (%s)\n", se_usermode, | ||
128 | se_usermode_action[se_usermode]); | ||
129 | seq_printf(m, "Kernel faults:\t%i (fixup%s)\n", se_kernmode_warn, | ||
130 | se_kernmode_warn ? "+warn" : ""); | ||
131 | return 0; | ||
132 | } | ||
133 | |||
134 | static int alignment_proc_open(struct inode *inode, struct file *file) | ||
135 | { | ||
136 | return single_open(file, alignment_proc_show, NULL); | ||
137 | } | ||
138 | |||
139 | static ssize_t alignment_proc_write(struct file *file, | ||
140 | const char __user *buffer, size_t count, loff_t *pos) | ||
141 | { | ||
142 | int *data = PDE(file->f_path.dentry->d_inode)->data; | ||
143 | char mode; | ||
144 | |||
145 | if (count > 0) { | ||
146 | if (get_user(mode, buffer)) | ||
147 | return -EFAULT; | ||
148 | if (mode >= '0' && mode <= '5') | ||
149 | *data = mode - '0'; | ||
150 | } | ||
151 | return count; | ||
152 | } | ||
153 | |||
154 | static const struct file_operations alignment_proc_fops = { | ||
155 | .owner = THIS_MODULE, | ||
156 | .open = alignment_proc_open, | ||
157 | .read = seq_read, | ||
158 | .llseek = seq_lseek, | ||
159 | .release = single_release, | ||
160 | .write = alignment_proc_write, | ||
161 | }; | ||
162 | |||
163 | /* | ||
164 | * This needs to be done after sysctl_init, otherwise sys/ will be | ||
165 | * overwritten. Actually, this shouldn't be in sys/ at all since | ||
166 | * it isn't a sysctl, and it doesn't contain sysctl information. | ||
167 | * We now locate it in /proc/cpu/alignment instead. | ||
168 | */ | ||
169 | static int __init alignment_init(void) | ||
170 | { | ||
171 | struct proc_dir_entry *dir, *res; | ||
172 | |||
173 | dir = proc_mkdir("cpu", NULL); | ||
174 | if (!dir) | ||
175 | return -ENOMEM; | ||
176 | |||
177 | res = proc_create_data("alignment", S_IWUSR | S_IRUGO, dir, | ||
178 | &alignment_proc_fops, &se_usermode); | ||
179 | if (!res) | ||
180 | return -ENOMEM; | ||
181 | |||
182 | res = proc_create_data("kernel_alignment", S_IWUSR | S_IRUGO, dir, | ||
183 | &alignment_proc_fops, &se_kernmode_warn); | ||
184 | if (!res) | ||
185 | return -ENOMEM; | ||
186 | |||
187 | return 0; | ||
188 | } | ||
189 | fs_initcall(alignment_init); | ||
diff --git a/arch/sh/mm/cache-debugfs.c b/arch/sh/mm/cache-debugfs.c index 5ba067b26591..690ed010d002 100644 --- a/arch/sh/mm/cache-debugfs.c +++ b/arch/sh/mm/cache-debugfs.c | |||
@@ -22,8 +22,7 @@ enum cache_type { | |||
22 | CACHE_TYPE_UNIFIED, | 22 | CACHE_TYPE_UNIFIED, |
23 | }; | 23 | }; |
24 | 24 | ||
25 | static int __uses_jump_to_uncached cache_seq_show(struct seq_file *file, | 25 | static int cache_seq_show(struct seq_file *file, void *iter) |
26 | void *iter) | ||
27 | { | 26 | { |
28 | unsigned int cache_type = (unsigned int)file->private; | 27 | unsigned int cache_type = (unsigned int)file->private; |
29 | struct cache_info *cache; | 28 | struct cache_info *cache; |
@@ -37,7 +36,7 @@ static int __uses_jump_to_uncached cache_seq_show(struct seq_file *file, | |||
37 | */ | 36 | */ |
38 | jump_to_uncached(); | 37 | jump_to_uncached(); |
39 | 38 | ||
40 | ccr = ctrl_inl(CCR); | 39 | ccr = __raw_readl(CCR); |
41 | if ((ccr & CCR_CACHE_ENABLE) == 0) { | 40 | if ((ccr & CCR_CACHE_ENABLE) == 0) { |
42 | back_to_cached(); | 41 | back_to_cached(); |
43 | 42 | ||
@@ -90,7 +89,7 @@ static int __uses_jump_to_uncached cache_seq_show(struct seq_file *file, | |||
90 | for (addr = addrstart, line = 0; | 89 | for (addr = addrstart, line = 0; |
91 | addr < addrstart + waysize; | 90 | addr < addrstart + waysize; |
92 | addr += cache->linesz, line++) { | 91 | addr += cache->linesz, line++) { |
93 | unsigned long data = ctrl_inl(addr); | 92 | unsigned long data = __raw_readl(addr); |
94 | 93 | ||
95 | /* Check the V bit, ignore invalid cachelines */ | 94 | /* Check the V bit, ignore invalid cachelines */ |
96 | if ((data & 1) == 0) | 95 | if ((data & 1) == 0) |
diff --git a/arch/sh/mm/cache-sh2.c b/arch/sh/mm/cache-sh2.c index 699a71f46327..defcf719f2e8 100644 --- a/arch/sh/mm/cache-sh2.c +++ b/arch/sh/mm/cache-sh2.c | |||
@@ -28,10 +28,10 @@ static void sh2__flush_wback_region(void *start, int size) | |||
28 | unsigned long addr = CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0); | 28 | unsigned long addr = CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0); |
29 | int way; | 29 | int way; |
30 | for (way = 0; way < 4; way++) { | 30 | for (way = 0; way < 4; way++) { |
31 | unsigned long data = ctrl_inl(addr | (way << 12)); | 31 | unsigned long data = __raw_readl(addr | (way << 12)); |
32 | if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) { | 32 | if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) { |
33 | data &= ~SH_CACHE_UPDATED; | 33 | data &= ~SH_CACHE_UPDATED; |
34 | ctrl_outl(data, addr | (way << 12)); | 34 | __raw_writel(data, addr | (way << 12)); |
35 | } | 35 | } |
36 | } | 36 | } |
37 | } | 37 | } |
@@ -47,7 +47,7 @@ static void sh2__flush_purge_region(void *start, int size) | |||
47 | & ~(L1_CACHE_BYTES-1); | 47 | & ~(L1_CACHE_BYTES-1); |
48 | 48 | ||
49 | for (v = begin; v < end; v+=L1_CACHE_BYTES) | 49 | for (v = begin; v < end; v+=L1_CACHE_BYTES) |
50 | ctrl_outl((v & CACHE_PHYSADDR_MASK), | 50 | __raw_writel((v & CACHE_PHYSADDR_MASK), |
51 | CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0) | 0x00000008); | 51 | CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0) | 0x00000008); |
52 | } | 52 | } |
53 | 53 | ||
@@ -63,9 +63,9 @@ static void sh2__flush_invalidate_region(void *start, int size) | |||
63 | local_irq_save(flags); | 63 | local_irq_save(flags); |
64 | jump_to_uncached(); | 64 | jump_to_uncached(); |
65 | 65 | ||
66 | ccr = ctrl_inl(CCR); | 66 | ccr = __raw_readl(CCR); |
67 | ccr |= CCR_CACHE_INVALIDATE; | 67 | ccr |= CCR_CACHE_INVALIDATE; |
68 | ctrl_outl(ccr, CCR); | 68 | __raw_writel(ccr, CCR); |
69 | 69 | ||
70 | back_to_cached(); | 70 | back_to_cached(); |
71 | local_irq_restore(flags); | 71 | local_irq_restore(flags); |
@@ -78,7 +78,7 @@ static void sh2__flush_invalidate_region(void *start, int size) | |||
78 | & ~(L1_CACHE_BYTES-1); | 78 | & ~(L1_CACHE_BYTES-1); |
79 | 79 | ||
80 | for (v = begin; v < end; v+=L1_CACHE_BYTES) | 80 | for (v = begin; v < end; v+=L1_CACHE_BYTES) |
81 | ctrl_outl((v & CACHE_PHYSADDR_MASK), | 81 | __raw_writel((v & CACHE_PHYSADDR_MASK), |
82 | CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0) | 0x00000008); | 82 | CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0) | 0x00000008); |
83 | #endif | 83 | #endif |
84 | } | 84 | } |
diff --git a/arch/sh/mm/cache-sh2a.c b/arch/sh/mm/cache-sh2a.c index 975899d83564..1f51225426a2 100644 --- a/arch/sh/mm/cache-sh2a.c +++ b/arch/sh/mm/cache-sh2a.c | |||
@@ -32,10 +32,10 @@ static void sh2a__flush_wback_region(void *start, int size) | |||
32 | unsigned long addr = CACHE_OC_ADDRESS_ARRAY | (v & 0x000007f0); | 32 | unsigned long addr = CACHE_OC_ADDRESS_ARRAY | (v & 0x000007f0); |
33 | int way; | 33 | int way; |
34 | for (way = 0; way < 4; way++) { | 34 | for (way = 0; way < 4; way++) { |
35 | unsigned long data = ctrl_inl(addr | (way << 11)); | 35 | unsigned long data = __raw_readl(addr | (way << 11)); |
36 | if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) { | 36 | if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) { |
37 | data &= ~SH_CACHE_UPDATED; | 37 | data &= ~SH_CACHE_UPDATED; |
38 | ctrl_outl(data, addr | (way << 11)); | 38 | __raw_writel(data, addr | (way << 11)); |
39 | } | 39 | } |
40 | } | 40 | } |
41 | } | 41 | } |
@@ -58,7 +58,7 @@ static void sh2a__flush_purge_region(void *start, int size) | |||
58 | jump_to_uncached(); | 58 | jump_to_uncached(); |
59 | 59 | ||
60 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { | 60 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { |
61 | ctrl_outl((v & CACHE_PHYSADDR_MASK), | 61 | __raw_writel((v & CACHE_PHYSADDR_MASK), |
62 | CACHE_OC_ADDRESS_ARRAY | (v & 0x000007f0) | 0x00000008); | 62 | CACHE_OC_ADDRESS_ARRAY | (v & 0x000007f0) | 0x00000008); |
63 | } | 63 | } |
64 | back_to_cached(); | 64 | back_to_cached(); |
@@ -78,17 +78,17 @@ static void sh2a__flush_invalidate_region(void *start, int size) | |||
78 | jump_to_uncached(); | 78 | jump_to_uncached(); |
79 | 79 | ||
80 | #ifdef CONFIG_CACHE_WRITEBACK | 80 | #ifdef CONFIG_CACHE_WRITEBACK |
81 | ctrl_outl(ctrl_inl(CCR) | CCR_OCACHE_INVALIDATE, CCR); | 81 | __raw_writel(__raw_readl(CCR) | CCR_OCACHE_INVALIDATE, CCR); |
82 | /* I-cache invalidate */ | 82 | /* I-cache invalidate */ |
83 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { | 83 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { |
84 | ctrl_outl((v & CACHE_PHYSADDR_MASK), | 84 | __raw_writel((v & CACHE_PHYSADDR_MASK), |
85 | CACHE_IC_ADDRESS_ARRAY | (v & 0x000007f0) | 0x00000008); | 85 | CACHE_IC_ADDRESS_ARRAY | (v & 0x000007f0) | 0x00000008); |
86 | } | 86 | } |
87 | #else | 87 | #else |
88 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { | 88 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { |
89 | ctrl_outl((v & CACHE_PHYSADDR_MASK), | 89 | __raw_writel((v & CACHE_PHYSADDR_MASK), |
90 | CACHE_IC_ADDRESS_ARRAY | (v & 0x000007f0) | 0x00000008); | 90 | CACHE_IC_ADDRESS_ARRAY | (v & 0x000007f0) | 0x00000008); |
91 | ctrl_outl((v & CACHE_PHYSADDR_MASK), | 91 | __raw_writel((v & CACHE_PHYSADDR_MASK), |
92 | CACHE_OC_ADDRESS_ARRAY | (v & 0x000007f0) | 0x00000008); | 92 | CACHE_OC_ADDRESS_ARRAY | (v & 0x000007f0) | 0x00000008); |
93 | } | 93 | } |
94 | #endif | 94 | #endif |
@@ -115,14 +115,14 @@ static void sh2a_flush_icache_range(void *args) | |||
115 | int way; | 115 | int way; |
116 | /* O-Cache writeback */ | 116 | /* O-Cache writeback */ |
117 | for (way = 0; way < 4; way++) { | 117 | for (way = 0; way < 4; way++) { |
118 | unsigned long data = ctrl_inl(CACHE_OC_ADDRESS_ARRAY | addr | (way << 11)); | 118 | unsigned long data = __raw_readl(CACHE_OC_ADDRESS_ARRAY | addr | (way << 11)); |
119 | if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) { | 119 | if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) { |
120 | data &= ~SH_CACHE_UPDATED; | 120 | data &= ~SH_CACHE_UPDATED; |
121 | ctrl_outl(data, CACHE_OC_ADDRESS_ARRAY | addr | (way << 11)); | 121 | __raw_writel(data, CACHE_OC_ADDRESS_ARRAY | addr | (way << 11)); |
122 | } | 122 | } |
123 | } | 123 | } |
124 | /* I-Cache invalidate */ | 124 | /* I-Cache invalidate */ |
125 | ctrl_outl(addr, | 125 | __raw_writel(addr, |
126 | CACHE_IC_ADDRESS_ARRAY | addr | 0x00000008); | 126 | CACHE_IC_ADDRESS_ARRAY | addr | 0x00000008); |
127 | } | 127 | } |
128 | 128 | ||
diff --git a/arch/sh/mm/cache-sh3.c b/arch/sh/mm/cache-sh3.c index faef80c98134..e37523f65195 100644 --- a/arch/sh/mm/cache-sh3.c +++ b/arch/sh/mm/cache-sh3.c | |||
@@ -50,12 +50,12 @@ static void sh3__flush_wback_region(void *start, int size) | |||
50 | p = __pa(v); | 50 | p = __pa(v); |
51 | addr = addrstart | (v & current_cpu_data.dcache.entry_mask); | 51 | addr = addrstart | (v & current_cpu_data.dcache.entry_mask); |
52 | local_irq_save(flags); | 52 | local_irq_save(flags); |
53 | data = ctrl_inl(addr); | 53 | data = __raw_readl(addr); |
54 | 54 | ||
55 | if ((data & CACHE_PHYSADDR_MASK) == | 55 | if ((data & CACHE_PHYSADDR_MASK) == |
56 | (p & CACHE_PHYSADDR_MASK)) { | 56 | (p & CACHE_PHYSADDR_MASK)) { |
57 | data &= ~SH_CACHE_UPDATED; | 57 | data &= ~SH_CACHE_UPDATED; |
58 | ctrl_outl(data, addr); | 58 | __raw_writel(data, addr); |
59 | local_irq_restore(flags); | 59 | local_irq_restore(flags); |
60 | break; | 60 | break; |
61 | } | 61 | } |
@@ -86,7 +86,7 @@ static void sh3__flush_purge_region(void *start, int size) | |||
86 | data = (v & 0xfffffc00); /* _Virtual_ address, ~U, ~V */ | 86 | data = (v & 0xfffffc00); /* _Virtual_ address, ~U, ~V */ |
87 | addr = CACHE_OC_ADDRESS_ARRAY | | 87 | addr = CACHE_OC_ADDRESS_ARRAY | |
88 | (v & current_cpu_data.dcache.entry_mask) | SH_CACHE_ASSOC; | 88 | (v & current_cpu_data.dcache.entry_mask) | SH_CACHE_ASSOC; |
89 | ctrl_outl(data, addr); | 89 | __raw_writel(data, addr); |
90 | } | 90 | } |
91 | } | 91 | } |
92 | 92 | ||
diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c index 560ddb6bc8a7..2cfae81914aa 100644 --- a/arch/sh/mm/cache-sh4.c +++ b/arch/sh/mm/cache-sh4.c | |||
@@ -36,7 +36,7 @@ static void __flush_cache_one(unsigned long addr, unsigned long phys, | |||
36 | * Called from kernel/module.c:sys_init_module and routine for a.out format, | 36 | * Called from kernel/module.c:sys_init_module and routine for a.out format, |
37 | * signal handler code and kprobes code | 37 | * signal handler code and kprobes code |
38 | */ | 38 | */ |
39 | static void __uses_jump_to_uncached sh4_flush_icache_range(void *args) | 39 | static void sh4_flush_icache_range(void *args) |
40 | { | 40 | { |
41 | struct flusher_data *data = args; | 41 | struct flusher_data *data = args; |
42 | unsigned long start, end; | 42 | unsigned long start, end; |
@@ -109,6 +109,7 @@ static inline void flush_cache_one(unsigned long start, unsigned long phys) | |||
109 | static void sh4_flush_dcache_page(void *arg) | 109 | static void sh4_flush_dcache_page(void *arg) |
110 | { | 110 | { |
111 | struct page *page = arg; | 111 | struct page *page = arg; |
112 | unsigned long addr = (unsigned long)page_address(page); | ||
112 | #ifndef CONFIG_SMP | 113 | #ifndef CONFIG_SMP |
113 | struct address_space *mapping = page_mapping(page); | 114 | struct address_space *mapping = page_mapping(page); |
114 | 115 | ||
@@ -116,22 +117,14 @@ static void sh4_flush_dcache_page(void *arg) | |||
116 | set_bit(PG_dcache_dirty, &page->flags); | 117 | set_bit(PG_dcache_dirty, &page->flags); |
117 | else | 118 | else |
118 | #endif | 119 | #endif |
119 | { | 120 | flush_cache_one(CACHE_OC_ADDRESS_ARRAY | |
120 | unsigned long phys = page_to_phys(page); | 121 | (addr & shm_align_mask), page_to_phys(page)); |
121 | unsigned long addr = CACHE_OC_ADDRESS_ARRAY; | ||
122 | int i, n; | ||
123 | |||
124 | /* Loop all the D-cache */ | ||
125 | n = boot_cpu_data.dcache.n_aliases; | ||
126 | for (i = 0; i < n; i++, addr += PAGE_SIZE) | ||
127 | flush_cache_one(addr, phys); | ||
128 | } | ||
129 | 122 | ||
130 | wmb(); | 123 | wmb(); |
131 | } | 124 | } |
132 | 125 | ||
133 | /* TODO: Selective icache invalidation through IC address array.. */ | 126 | /* TODO: Selective icache invalidation through IC address array.. */ |
134 | static void __uses_jump_to_uncached flush_icache_all(void) | 127 | static void flush_icache_all(void) |
135 | { | 128 | { |
136 | unsigned long flags, ccr; | 129 | unsigned long flags, ccr; |
137 | 130 | ||
@@ -139,9 +132,9 @@ static void __uses_jump_to_uncached flush_icache_all(void) | |||
139 | jump_to_uncached(); | 132 | jump_to_uncached(); |
140 | 133 | ||
141 | /* Flush I-cache */ | 134 | /* Flush I-cache */ |
142 | ccr = ctrl_inl(CCR); | 135 | ccr = __raw_readl(CCR); |
143 | ccr |= CCR_CACHE_ICI; | 136 | ccr |= CCR_CACHE_ICI; |
144 | ctrl_outl(ccr, CCR); | 137 | __raw_writel(ccr, CCR); |
145 | 138 | ||
146 | /* | 139 | /* |
147 | * back_to_cached() will take care of the barrier for us, don't add | 140 | * back_to_cached() will take care of the barrier for us, don't add |
@@ -384,9 +377,9 @@ extern void __weak sh4__flush_region_init(void); | |||
384 | void __init sh4_cache_init(void) | 377 | void __init sh4_cache_init(void) |
385 | { | 378 | { |
386 | printk("PVR=%08x CVR=%08x PRR=%08x\n", | 379 | printk("PVR=%08x CVR=%08x PRR=%08x\n", |
387 | ctrl_inl(CCN_PVR), | 380 | __raw_readl(CCN_PVR), |
388 | ctrl_inl(CCN_CVR), | 381 | __raw_readl(CCN_CVR), |
389 | ctrl_inl(CCN_PRR)); | 382 | __raw_readl(CCN_PRR)); |
390 | 383 | ||
391 | local_flush_icache_range = sh4_flush_icache_range; | 384 | local_flush_icache_range = sh4_flush_icache_range; |
392 | local_flush_dcache_page = sh4_flush_dcache_page; | 385 | local_flush_dcache_page = sh4_flush_dcache_page; |
diff --git a/arch/sh/mm/cache-sh7705.c b/arch/sh/mm/cache-sh7705.c index f527fb70fce6..f498da1cce7a 100644 --- a/arch/sh/mm/cache-sh7705.c +++ b/arch/sh/mm/cache-sh7705.c | |||
@@ -48,10 +48,10 @@ static inline void cache_wback_all(void) | |||
48 | unsigned long data; | 48 | unsigned long data; |
49 | int v = SH_CACHE_UPDATED | SH_CACHE_VALID; | 49 | int v = SH_CACHE_UPDATED | SH_CACHE_VALID; |
50 | 50 | ||
51 | data = ctrl_inl(addr); | 51 | data = __raw_readl(addr); |
52 | 52 | ||
53 | if ((data & v) == v) | 53 | if ((data & v) == v) |
54 | ctrl_outl(data & ~v, addr); | 54 | __raw_writel(data & ~v, addr); |
55 | 55 | ||
56 | } | 56 | } |
57 | 57 | ||
@@ -78,7 +78,7 @@ static void sh7705_flush_icache_range(void *args) | |||
78 | /* | 78 | /* |
79 | * Writeback&Invalidate the D-cache of the page | 79 | * Writeback&Invalidate the D-cache of the page |
80 | */ | 80 | */ |
81 | static void __uses_jump_to_uncached __flush_dcache_page(unsigned long phys) | 81 | static void __flush_dcache_page(unsigned long phys) |
82 | { | 82 | { |
83 | unsigned long ways, waysize, addrstart; | 83 | unsigned long ways, waysize, addrstart; |
84 | unsigned long flags; | 84 | unsigned long flags; |
@@ -115,10 +115,10 @@ static void __uses_jump_to_uncached __flush_dcache_page(unsigned long phys) | |||
115 | addr += current_cpu_data.dcache.linesz) { | 115 | addr += current_cpu_data.dcache.linesz) { |
116 | unsigned long data; | 116 | unsigned long data; |
117 | 117 | ||
118 | data = ctrl_inl(addr) & (0x1ffffC00 | SH_CACHE_VALID); | 118 | data = __raw_readl(addr) & (0x1ffffC00 | SH_CACHE_VALID); |
119 | if (data == phys) { | 119 | if (data == phys) { |
120 | data &= ~(SH_CACHE_VALID | SH_CACHE_UPDATED); | 120 | data &= ~(SH_CACHE_VALID | SH_CACHE_UPDATED); |
121 | ctrl_outl(data, addr); | 121 | __raw_writel(data, addr); |
122 | } | 122 | } |
123 | } | 123 | } |
124 | 124 | ||
@@ -144,7 +144,7 @@ static void sh7705_flush_dcache_page(void *arg) | |||
144 | __flush_dcache_page(__pa(page_address(page))); | 144 | __flush_dcache_page(__pa(page_address(page))); |
145 | } | 145 | } |
146 | 146 | ||
147 | static void __uses_jump_to_uncached sh7705_flush_cache_all(void *args) | 147 | static void sh7705_flush_cache_all(void *args) |
148 | { | 148 | { |
149 | unsigned long flags; | 149 | unsigned long flags; |
150 | 150 | ||
diff --git a/arch/sh/mm/cache.c b/arch/sh/mm/cache.c index b8607fa7ae12..0f4095d7ac8b 100644 --- a/arch/sh/mm/cache.c +++ b/arch/sh/mm/cache.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * arch/sh/mm/cache.c | 2 | * arch/sh/mm/cache.c |
3 | * | 3 | * |
4 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka | 4 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka |
5 | * Copyright (C) 2002 - 2009 Paul Mundt | 5 | * Copyright (C) 2002 - 2010 Paul Mundt |
6 | * | 6 | * |
7 | * Released under the terms of the GNU GPL v2.0. | 7 | * Released under the terms of the GNU GPL v2.0. |
8 | */ | 8 | */ |
@@ -41,8 +41,17 @@ static inline void cacheop_on_each_cpu(void (*func) (void *info), void *info, | |||
41 | int wait) | 41 | int wait) |
42 | { | 42 | { |
43 | preempt_disable(); | 43 | preempt_disable(); |
44 | smp_call_function(func, info, wait); | 44 | |
45 | /* | ||
46 | * It's possible that this gets called early on when IRQs are | ||
47 | * still disabled due to ioremapping by the boot CPU, so don't | ||
48 | * even attempt IPIs unless there are other CPUs online. | ||
49 | */ | ||
50 | if (num_online_cpus() > 1) | ||
51 | smp_call_function(func, info, wait); | ||
52 | |||
45 | func(info); | 53 | func(info); |
54 | |||
46 | preempt_enable(); | 55 | preempt_enable(); |
47 | } | 56 | } |
48 | 57 | ||
diff --git a/arch/sh/mm/fault_32.c b/arch/sh/mm/fault_32.c index 47530104e0ad..28e22839c665 100644 --- a/arch/sh/mm/fault_32.c +++ b/arch/sh/mm/fault_32.c | |||
@@ -53,6 +53,9 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address) | |||
53 | if (!pud_present(*pud_k)) | 53 | if (!pud_present(*pud_k)) |
54 | return NULL; | 54 | return NULL; |
55 | 55 | ||
56 | if (!pud_present(*pud)) | ||
57 | set_pud(pud, *pud_k); | ||
58 | |||
56 | pmd = pmd_offset(pud, address); | 59 | pmd = pmd_offset(pud, address); |
57 | pmd_k = pmd_offset(pud_k, address); | 60 | pmd_k = pmd_offset(pud_k, address); |
58 | if (!pmd_present(*pmd_k)) | 61 | if (!pmd_present(*pmd_k)) |
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index 432acd07e76a..68028e8f26ce 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
@@ -21,25 +21,13 @@ | |||
21 | #include <asm/cacheflush.h> | 21 | #include <asm/cacheflush.h> |
22 | #include <asm/sections.h> | 22 | #include <asm/sections.h> |
23 | #include <asm/cache.h> | 23 | #include <asm/cache.h> |
24 | #include <asm/sizes.h> | ||
24 | 25 | ||
25 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 26 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
26 | pgd_t swapper_pg_dir[PTRS_PER_PGD]; | 27 | pgd_t swapper_pg_dir[PTRS_PER_PGD]; |
27 | 28 | ||
28 | #ifdef CONFIG_SUPERH32 | ||
29 | /* | ||
30 | * Handle trivial transitions between cached and uncached | ||
31 | * segments, making use of the 1:1 mapping relationship in | ||
32 | * 512MB lowmem. | ||
33 | * | ||
34 | * This is the offset of the uncached section from its cached alias. | ||
35 | * Default value only valid in 29 bit mode, in 32bit mode will be | ||
36 | * overridden in pmb_init. | ||
37 | */ | ||
38 | unsigned long cached_to_uncached = P2SEG - P1SEG; | ||
39 | #endif | ||
40 | |||
41 | #ifdef CONFIG_MMU | 29 | #ifdef CONFIG_MMU |
42 | static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | 30 | static pte_t *__get_pte_phys(unsigned long addr) |
43 | { | 31 | { |
44 | pgd_t *pgd; | 32 | pgd_t *pgd; |
45 | pud_t *pud; | 33 | pud_t *pud; |
@@ -49,22 +37,30 @@ static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | |||
49 | pgd = pgd_offset_k(addr); | 37 | pgd = pgd_offset_k(addr); |
50 | if (pgd_none(*pgd)) { | 38 | if (pgd_none(*pgd)) { |
51 | pgd_ERROR(*pgd); | 39 | pgd_ERROR(*pgd); |
52 | return; | 40 | return NULL; |
53 | } | 41 | } |
54 | 42 | ||
55 | pud = pud_alloc(NULL, pgd, addr); | 43 | pud = pud_alloc(NULL, pgd, addr); |
56 | if (unlikely(!pud)) { | 44 | if (unlikely(!pud)) { |
57 | pud_ERROR(*pud); | 45 | pud_ERROR(*pud); |
58 | return; | 46 | return NULL; |
59 | } | 47 | } |
60 | 48 | ||
61 | pmd = pmd_alloc(NULL, pud, addr); | 49 | pmd = pmd_alloc(NULL, pud, addr); |
62 | if (unlikely(!pmd)) { | 50 | if (unlikely(!pmd)) { |
63 | pmd_ERROR(*pmd); | 51 | pmd_ERROR(*pmd); |
64 | return; | 52 | return NULL; |
65 | } | 53 | } |
66 | 54 | ||
67 | pte = pte_offset_kernel(pmd, addr); | 55 | pte = pte_offset_kernel(pmd, addr); |
56 | return pte; | ||
57 | } | ||
58 | |||
59 | static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | ||
60 | { | ||
61 | pte_t *pte; | ||
62 | |||
63 | pte = __get_pte_phys(addr); | ||
68 | if (!pte_none(*pte)) { | 64 | if (!pte_none(*pte)) { |
69 | pte_ERROR(*pte); | 65 | pte_ERROR(*pte); |
70 | return; | 66 | return; |
@@ -72,23 +68,24 @@ static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | |||
72 | 68 | ||
73 | set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, prot)); | 69 | set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, prot)); |
74 | local_flush_tlb_one(get_asid(), addr); | 70 | local_flush_tlb_one(get_asid(), addr); |
71 | |||
72 | if (pgprot_val(prot) & _PAGE_WIRED) | ||
73 | tlb_wire_entry(NULL, addr, *pte); | ||
74 | } | ||
75 | |||
76 | static void clear_pte_phys(unsigned long addr, pgprot_t prot) | ||
77 | { | ||
78 | pte_t *pte; | ||
79 | |||
80 | pte = __get_pte_phys(addr); | ||
81 | |||
82 | if (pgprot_val(prot) & _PAGE_WIRED) | ||
83 | tlb_unwire_entry(); | ||
84 | |||
85 | set_pte(pte, pfn_pte(0, __pgprot(0))); | ||
86 | local_flush_tlb_one(get_asid(), addr); | ||
75 | } | 87 | } |
76 | 88 | ||
77 | /* | ||
78 | * As a performance optimization, other platforms preserve the fixmap mapping | ||
79 | * across a context switch, we don't presently do this, but this could be done | ||
80 | * in a similar fashion as to the wired TLB interface that sh64 uses (by way | ||
81 | * of the memory mapped UTLB configuration) -- this unfortunately forces us to | ||
82 | * give up a TLB entry for each mapping we want to preserve. While this may be | ||
83 | * viable for a small number of fixmaps, it's not particularly useful for | ||
84 | * everything and needs to be carefully evaluated. (ie, we may want this for | ||
85 | * the vsyscall page). | ||
86 | * | ||
87 | * XXX: Perhaps add a _PAGE_WIRED flag or something similar that we can pass | ||
88 | * in at __set_fixmap() time to determine the appropriate behavior to follow. | ||
89 | * | ||
90 | * -- PFM. | ||
91 | */ | ||
92 | void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot) | 89 | void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot) |
93 | { | 90 | { |
94 | unsigned long address = __fix_to_virt(idx); | 91 | unsigned long address = __fix_to_virt(idx); |
@@ -101,6 +98,18 @@ void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot) | |||
101 | set_pte_phys(address, phys, prot); | 98 | set_pte_phys(address, phys, prot); |
102 | } | 99 | } |
103 | 100 | ||
101 | void __clear_fixmap(enum fixed_addresses idx, pgprot_t prot) | ||
102 | { | ||
103 | unsigned long address = __fix_to_virt(idx); | ||
104 | |||
105 | if (idx >= __end_of_fixed_addresses) { | ||
106 | BUG(); | ||
107 | return; | ||
108 | } | ||
109 | |||
110 | clear_pte_phys(address, prot); | ||
111 | } | ||
112 | |||
104 | void __init page_table_range_init(unsigned long start, unsigned long end, | 113 | void __init page_table_range_init(unsigned long start, unsigned long end, |
105 | pgd_t *pgd_base) | 114 | pgd_t *pgd_base) |
106 | { | 115 | { |
@@ -120,7 +129,13 @@ void __init page_table_range_init(unsigned long start, unsigned long end, | |||
120 | for ( ; (i < PTRS_PER_PGD) && (vaddr != end); pgd++, i++) { | 129 | for ( ; (i < PTRS_PER_PGD) && (vaddr != end); pgd++, i++) { |
121 | pud = (pud_t *)pgd; | 130 | pud = (pud_t *)pgd; |
122 | for ( ; (j < PTRS_PER_PUD) && (vaddr != end); pud++, j++) { | 131 | for ( ; (j < PTRS_PER_PUD) && (vaddr != end); pud++, j++) { |
132 | #ifdef __PAGETABLE_PMD_FOLDED | ||
123 | pmd = (pmd_t *)pud; | 133 | pmd = (pmd_t *)pud; |
134 | #else | ||
135 | pmd = (pmd_t *)alloc_bootmem_low_pages(PAGE_SIZE); | ||
136 | pud_populate(&init_mm, pud, pmd); | ||
137 | pmd += k; | ||
138 | #endif | ||
124 | for (; (k < PTRS_PER_PMD) && (vaddr != end); pmd++, k++) { | 139 | for (; (k < PTRS_PER_PMD) && (vaddr != end); pmd++, k++) { |
125 | if (pmd_none(*pmd)) { | 140 | if (pmd_none(*pmd)) { |
126 | pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); | 141 | pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); |
@@ -182,9 +197,6 @@ void __init paging_init(void) | |||
182 | } | 197 | } |
183 | 198 | ||
184 | free_area_init_nodes(max_zone_pfns); | 199 | free_area_init_nodes(max_zone_pfns); |
185 | |||
186 | /* Set up the uncached fixmap */ | ||
187 | set_fixmap_nocache(FIX_UNCACHED, __pa(&__uncached_start)); | ||
188 | } | 200 | } |
189 | 201 | ||
190 | /* | 202 | /* |
@@ -195,6 +207,8 @@ static void __init iommu_init(void) | |||
195 | no_iommu_init(); | 207 | no_iommu_init(); |
196 | } | 208 | } |
197 | 209 | ||
210 | unsigned int mem_init_done = 0; | ||
211 | |||
198 | void __init mem_init(void) | 212 | void __init mem_init(void) |
199 | { | 213 | { |
200 | int codesize, datasize, initsize; | 214 | int codesize, datasize, initsize; |
@@ -231,6 +245,8 @@ void __init mem_init(void) | |||
231 | memset(empty_zero_page, 0, PAGE_SIZE); | 245 | memset(empty_zero_page, 0, PAGE_SIZE); |
232 | __flush_wback_region(empty_zero_page, PAGE_SIZE); | 246 | __flush_wback_region(empty_zero_page, PAGE_SIZE); |
233 | 247 | ||
248 | vsyscall_init(); | ||
249 | |||
234 | codesize = (unsigned long) &_etext - (unsigned long) &_text; | 250 | codesize = (unsigned long) &_etext - (unsigned long) &_text; |
235 | datasize = (unsigned long) &_edata - (unsigned long) &_etext; | 251 | datasize = (unsigned long) &_edata - (unsigned long) &_etext; |
236 | initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; | 252 | initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; |
@@ -243,8 +259,48 @@ void __init mem_init(void) | |||
243 | datasize >> 10, | 259 | datasize >> 10, |
244 | initsize >> 10); | 260 | initsize >> 10); |
245 | 261 | ||
246 | /* Initialize the vDSO */ | 262 | printk(KERN_INFO "virtual kernel memory layout:\n" |
247 | vsyscall_init(); | 263 | " fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n" |
264 | #ifdef CONFIG_HIGHMEM | ||
265 | " pkmap : 0x%08lx - 0x%08lx (%4ld kB)\n" | ||
266 | #endif | ||
267 | " vmalloc : 0x%08lx - 0x%08lx (%4ld MB)\n" | ||
268 | " lowmem : 0x%08lx - 0x%08lx (%4ld MB) (cached)\n" | ||
269 | #ifdef CONFIG_UNCACHED_MAPPING | ||
270 | " : 0x%08lx - 0x%08lx (%4ld MB) (uncached)\n" | ||
271 | #endif | ||
272 | " .init : 0x%08lx - 0x%08lx (%4ld kB)\n" | ||
273 | " .data : 0x%08lx - 0x%08lx (%4ld kB)\n" | ||
274 | " .text : 0x%08lx - 0x%08lx (%4ld kB)\n", | ||
275 | FIXADDR_START, FIXADDR_TOP, | ||
276 | (FIXADDR_TOP - FIXADDR_START) >> 10, | ||
277 | |||
278 | #ifdef CONFIG_HIGHMEM | ||
279 | PKMAP_BASE, PKMAP_BASE+LAST_PKMAP*PAGE_SIZE, | ||
280 | (LAST_PKMAP*PAGE_SIZE) >> 10, | ||
281 | #endif | ||
282 | |||
283 | (unsigned long)VMALLOC_START, VMALLOC_END, | ||
284 | (VMALLOC_END - VMALLOC_START) >> 20, | ||
285 | |||
286 | (unsigned long)memory_start, (unsigned long)high_memory, | ||
287 | ((unsigned long)high_memory - (unsigned long)memory_start) >> 20, | ||
288 | |||
289 | #ifdef CONFIG_UNCACHED_MAPPING | ||
290 | uncached_start, uncached_end, uncached_size >> 20, | ||
291 | #endif | ||
292 | |||
293 | (unsigned long)&__init_begin, (unsigned long)&__init_end, | ||
294 | ((unsigned long)&__init_end - | ||
295 | (unsigned long)&__init_begin) >> 10, | ||
296 | |||
297 | (unsigned long)&_etext, (unsigned long)&_edata, | ||
298 | ((unsigned long)&_edata - (unsigned long)&_etext) >> 10, | ||
299 | |||
300 | (unsigned long)&_text, (unsigned long)&_etext, | ||
301 | ((unsigned long)&_etext - (unsigned long)&_text) >> 10); | ||
302 | |||
303 | mem_init_done = 1; | ||
248 | } | 304 | } |
249 | 305 | ||
250 | void free_initmem(void) | 306 | void free_initmem(void) |
@@ -277,35 +333,6 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
277 | } | 333 | } |
278 | #endif | 334 | #endif |
279 | 335 | ||
280 | #if THREAD_SHIFT < PAGE_SHIFT | ||
281 | static struct kmem_cache *thread_info_cache; | ||
282 | |||
283 | struct thread_info *alloc_thread_info(struct task_struct *tsk) | ||
284 | { | ||
285 | struct thread_info *ti; | ||
286 | |||
287 | ti = kmem_cache_alloc(thread_info_cache, GFP_KERNEL); | ||
288 | if (unlikely(ti == NULL)) | ||
289 | return NULL; | ||
290 | #ifdef CONFIG_DEBUG_STACK_USAGE | ||
291 | memset(ti, 0, THREAD_SIZE); | ||
292 | #endif | ||
293 | return ti; | ||
294 | } | ||
295 | |||
296 | void free_thread_info(struct thread_info *ti) | ||
297 | { | ||
298 | kmem_cache_free(thread_info_cache, ti); | ||
299 | } | ||
300 | |||
301 | void thread_info_cache_init(void) | ||
302 | { | ||
303 | thread_info_cache = kmem_cache_create("thread_info", THREAD_SIZE, | ||
304 | THREAD_SIZE, 0, NULL); | ||
305 | BUG_ON(thread_info_cache == NULL); | ||
306 | } | ||
307 | #endif /* THREAD_SHIFT < PAGE_SHIFT */ | ||
308 | |||
309 | #ifdef CONFIG_MEMORY_HOTPLUG | 336 | #ifdef CONFIG_MEMORY_HOTPLUG |
310 | int arch_add_memory(int nid, u64 start, u64 size) | 337 | int arch_add_memory(int nid, u64 start, u64 size) |
311 | { | 338 | { |
@@ -336,10 +363,3 @@ EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); | |||
336 | #endif | 363 | #endif |
337 | 364 | ||
338 | #endif /* CONFIG_MEMORY_HOTPLUG */ | 365 | #endif /* CONFIG_MEMORY_HOTPLUG */ |
339 | |||
340 | #ifdef CONFIG_PMB | ||
341 | int __in_29bit_mode(void) | ||
342 | { | ||
343 | return !(ctrl_inl(PMB_PASCR) & PASCR_SE); | ||
344 | } | ||
345 | #endif /* CONFIG_PMB */ | ||
diff --git a/arch/sh/mm/ioremap_32.c b/arch/sh/mm/ioremap.c index 2141befb4f91..c68d2d7d00a9 100644 --- a/arch/sh/mm/ioremap_32.c +++ b/arch/sh/mm/ioremap.c | |||
@@ -1,13 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * arch/sh/mm/ioremap.c | 2 | * arch/sh/mm/ioremap.c |
3 | * | 3 | * |
4 | * (C) Copyright 1995 1996 Linus Torvalds | ||
5 | * (C) Copyright 2005 - 2010 Paul Mundt | ||
6 | * | ||
4 | * Re-map IO memory to kernel address space so that we can access it. | 7 | * Re-map IO memory to kernel address space so that we can access it. |
5 | * This is needed for high PCI addresses that aren't mapped in the | 8 | * This is needed for high PCI addresses that aren't mapped in the |
6 | * 640k-1MB IO memory area on PC's | 9 | * 640k-1MB IO memory area on PC's |
7 | * | 10 | * |
8 | * (C) Copyright 1995 1996 Linus Torvalds | ||
9 | * (C) Copyright 2005, 2006 Paul Mundt | ||
10 | * | ||
11 | * This file is subject to the terms and conditions of the GNU General | 11 | * This file is subject to the terms and conditions of the GNU General |
12 | * Public License. See the file "COPYING" in the main directory of this | 12 | * Public License. See the file "COPYING" in the main directory of this |
13 | * archive for more details. | 13 | * archive for more details. |
@@ -33,12 +33,12 @@ | |||
33 | * have to convert them into an offset in a page-aligned mapping, but the | 33 | * have to convert them into an offset in a page-aligned mapping, but the |
34 | * caller shouldn't need to know that small detail. | 34 | * caller shouldn't need to know that small detail. |
35 | */ | 35 | */ |
36 | void __iomem *__ioremap_caller(unsigned long phys_addr, unsigned long size, | 36 | void __iomem * __init_refok |
37 | unsigned long flags, void *caller) | 37 | __ioremap_caller(unsigned long phys_addr, unsigned long size, |
38 | pgprot_t pgprot, void *caller) | ||
38 | { | 39 | { |
39 | struct vm_struct *area; | 40 | struct vm_struct *area; |
40 | unsigned long offset, last_addr, addr, orig_addr; | 41 | unsigned long offset, last_addr, addr, orig_addr; |
41 | pgprot_t pgprot; | ||
42 | 42 | ||
43 | /* Don't allow wraparound or zero size */ | 43 | /* Don't allow wraparound or zero size */ |
44 | last_addr = phys_addr + size - 1; | 44 | last_addr = phys_addr + size - 1; |
@@ -46,18 +46,6 @@ void __iomem *__ioremap_caller(unsigned long phys_addr, unsigned long size, | |||
46 | return NULL; | 46 | return NULL; |
47 | 47 | ||
48 | /* | 48 | /* |
49 | * If we're in the fixed PCI memory range, mapping through page | ||
50 | * tables is not only pointless, but also fundamentally broken. | ||
51 | * Just return the physical address instead. | ||
52 | * | ||
53 | * For boards that map a small PCI memory aperture somewhere in | ||
54 | * P1/P2 space, ioremap() will already do the right thing, | ||
55 | * and we'll never get this far. | ||
56 | */ | ||
57 | if (is_pci_memory_fixed_range(phys_addr, size)) | ||
58 | return (void __iomem *)phys_addr; | ||
59 | |||
60 | /* | ||
61 | * Mappings have to be page-aligned | 49 | * Mappings have to be page-aligned |
62 | */ | 50 | */ |
63 | offset = phys_addr & ~PAGE_MASK; | 51 | offset = phys_addr & ~PAGE_MASK; |
@@ -65,6 +53,12 @@ void __iomem *__ioremap_caller(unsigned long phys_addr, unsigned long size, | |||
65 | size = PAGE_ALIGN(last_addr+1) - phys_addr; | 53 | size = PAGE_ALIGN(last_addr+1) - phys_addr; |
66 | 54 | ||
67 | /* | 55 | /* |
56 | * If we can't yet use the regular approach, go the fixmap route. | ||
57 | */ | ||
58 | if (!mem_init_done) | ||
59 | return ioremap_fixed(phys_addr, offset, size, pgprot); | ||
60 | |||
61 | /* | ||
68 | * Ok, go for it.. | 62 | * Ok, go for it.. |
69 | */ | 63 | */ |
70 | area = get_vm_area_caller(size, VM_IOREMAP, caller); | 64 | area = get_vm_area_caller(size, VM_IOREMAP, caller); |
@@ -84,8 +78,9 @@ void __iomem *__ioremap_caller(unsigned long phys_addr, unsigned long size, | |||
84 | * PMB entries are all pre-faulted. | 78 | * PMB entries are all pre-faulted. |
85 | */ | 79 | */ |
86 | if (unlikely(phys_addr >= P1SEG)) { | 80 | if (unlikely(phys_addr >= P1SEG)) { |
87 | unsigned long mapped = pmb_remap(addr, phys_addr, size, flags); | 81 | unsigned long mapped; |
88 | 82 | ||
83 | mapped = pmb_remap(addr, phys_addr, size, pgprot); | ||
89 | if (likely(mapped)) { | 84 | if (likely(mapped)) { |
90 | addr += mapped; | 85 | addr += mapped; |
91 | phys_addr += mapped; | 86 | phys_addr += mapped; |
@@ -94,7 +89,6 @@ void __iomem *__ioremap_caller(unsigned long phys_addr, unsigned long size, | |||
94 | } | 89 | } |
95 | #endif | 90 | #endif |
96 | 91 | ||
97 | pgprot = __pgprot(pgprot_val(PAGE_KERNEL_NOCACHE) | flags); | ||
98 | if (likely(size)) | 92 | if (likely(size)) |
99 | if (ioremap_page_range(addr, addr + size, phys_addr, pgprot)) { | 93 | if (ioremap_page_range(addr, addr + size, phys_addr, pgprot)) { |
100 | vunmap((void *)orig_addr); | 94 | vunmap((void *)orig_addr); |
@@ -105,15 +99,38 @@ void __iomem *__ioremap_caller(unsigned long phys_addr, unsigned long size, | |||
105 | } | 99 | } |
106 | EXPORT_SYMBOL(__ioremap_caller); | 100 | EXPORT_SYMBOL(__ioremap_caller); |
107 | 101 | ||
102 | /* | ||
103 | * Simple checks for non-translatable mappings. | ||
104 | */ | ||
105 | static inline int iomapping_nontranslatable(unsigned long offset) | ||
106 | { | ||
107 | #ifdef CONFIG_29BIT | ||
108 | /* | ||
109 | * In 29-bit mode this includes the fixed P1/P2 areas, as well as | ||
110 | * parts of P3. | ||
111 | */ | ||
112 | if (PXSEG(offset) < P3SEG || offset >= P3_ADDR_MAX) | ||
113 | return 1; | ||
114 | #endif | ||
115 | |||
116 | return 0; | ||
117 | } | ||
118 | |||
108 | void __iounmap(void __iomem *addr) | 119 | void __iounmap(void __iomem *addr) |
109 | { | 120 | { |
110 | unsigned long vaddr = (unsigned long __force)addr; | 121 | unsigned long vaddr = (unsigned long __force)addr; |
111 | unsigned long seg = PXSEG(vaddr); | ||
112 | struct vm_struct *p; | 122 | struct vm_struct *p; |
113 | 123 | ||
114 | if (seg < P3SEG || vaddr >= P3_ADDR_MAX) | 124 | /* |
125 | * Nothing to do if there is no translatable mapping. | ||
126 | */ | ||
127 | if (iomapping_nontranslatable(vaddr)) | ||
115 | return; | 128 | return; |
116 | if (is_pci_memory_fixed_range(vaddr, 0)) | 129 | |
130 | /* | ||
131 | * There's no VMA if it's from an early fixed mapping. | ||
132 | */ | ||
133 | if (iounmap_fixed(addr) == 0) | ||
117 | return; | 134 | return; |
118 | 135 | ||
119 | #ifdef CONFIG_PMB | 136 | #ifdef CONFIG_PMB |
diff --git a/arch/sh/mm/ioremap_64.c b/arch/sh/mm/ioremap_64.c deleted file mode 100644 index ef434657d428..000000000000 --- a/arch/sh/mm/ioremap_64.c +++ /dev/null | |||
@@ -1,326 +0,0 @@ | |||
1 | /* | ||
2 | * arch/sh/mm/ioremap_64.c | ||
3 | * | ||
4 | * Copyright (C) 2000, 2001 Paolo Alberelli | ||
5 | * Copyright (C) 2003 - 2007 Paul Mundt | ||
6 | * | ||
7 | * Mostly derived from arch/sh/mm/ioremap.c which, in turn is mostly | ||
8 | * derived from arch/i386/mm/ioremap.c . | ||
9 | * | ||
10 | * (C) Copyright 1995 1996 Linus Torvalds | ||
11 | * | ||
12 | * This file is subject to the terms and conditions of the GNU General Public | ||
13 | * License. See the file "COPYING" in the main directory of this archive | ||
14 | * for more details. | ||
15 | */ | ||
16 | #include <linux/vmalloc.h> | ||
17 | #include <linux/ioport.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/mm.h> | ||
20 | #include <linux/io.h> | ||
21 | #include <linux/bootmem.h> | ||
22 | #include <linux/proc_fs.h> | ||
23 | #include <linux/slab.h> | ||
24 | #include <asm/page.h> | ||
25 | #include <asm/pgalloc.h> | ||
26 | #include <asm/addrspace.h> | ||
27 | #include <asm/cacheflush.h> | ||
28 | #include <asm/tlbflush.h> | ||
29 | #include <asm/mmu.h> | ||
30 | |||
31 | static struct resource shmedia_iomap = { | ||
32 | .name = "shmedia_iomap", | ||
33 | .start = IOBASE_VADDR + PAGE_SIZE, | ||
34 | .end = IOBASE_END - 1, | ||
35 | }; | ||
36 | |||
37 | static void shmedia_mapioaddr(unsigned long pa, unsigned long va, | ||
38 | unsigned long flags); | ||
39 | static void shmedia_unmapioaddr(unsigned long vaddr); | ||
40 | static void __iomem *shmedia_ioremap(struct resource *res, u32 pa, | ||
41 | int sz, unsigned long flags); | ||
42 | |||
43 | /* | ||
44 | * We have the same problem as the SPARC, so lets have the same comment: | ||
45 | * Our mini-allocator... | ||
46 | * Boy this is gross! We need it because we must map I/O for | ||
47 | * timers and interrupt controller before the kmalloc is available. | ||
48 | */ | ||
49 | |||
50 | #define XNMLN 15 | ||
51 | #define XNRES 10 | ||
52 | |||
53 | struct xresource { | ||
54 | struct resource xres; /* Must be first */ | ||
55 | int xflag; /* 1 == used */ | ||
56 | char xname[XNMLN+1]; | ||
57 | }; | ||
58 | |||
59 | static struct xresource xresv[XNRES]; | ||
60 | |||
61 | static struct xresource *xres_alloc(void) | ||
62 | { | ||
63 | struct xresource *xrp; | ||
64 | int n; | ||
65 | |||
66 | xrp = xresv; | ||
67 | for (n = 0; n < XNRES; n++) { | ||
68 | if (xrp->xflag == 0) { | ||
69 | xrp->xflag = 1; | ||
70 | return xrp; | ||
71 | } | ||
72 | xrp++; | ||
73 | } | ||
74 | return NULL; | ||
75 | } | ||
76 | |||
77 | static void xres_free(struct xresource *xrp) | ||
78 | { | ||
79 | xrp->xflag = 0; | ||
80 | } | ||
81 | |||
82 | static struct resource *shmedia_find_resource(struct resource *root, | ||
83 | unsigned long vaddr) | ||
84 | { | ||
85 | struct resource *res; | ||
86 | |||
87 | for (res = root->child; res; res = res->sibling) | ||
88 | if (res->start <= vaddr && res->end >= vaddr) | ||
89 | return res; | ||
90 | |||
91 | return NULL; | ||
92 | } | ||
93 | |||
94 | static void __iomem *shmedia_alloc_io(unsigned long phys, unsigned long size, | ||
95 | const char *name, unsigned long flags) | ||
96 | { | ||
97 | struct xresource *xres; | ||
98 | struct resource *res; | ||
99 | char *tack; | ||
100 | int tlen; | ||
101 | |||
102 | if (name == NULL) | ||
103 | name = "???"; | ||
104 | |||
105 | xres = xres_alloc(); | ||
106 | if (xres != 0) { | ||
107 | tack = xres->xname; | ||
108 | res = &xres->xres; | ||
109 | } else { | ||
110 | printk_once(KERN_NOTICE "%s: done with statics, " | ||
111 | "switching to kmalloc\n", __func__); | ||
112 | tlen = strlen(name); | ||
113 | tack = kmalloc(sizeof(struct resource) + tlen + 1, GFP_KERNEL); | ||
114 | if (!tack) | ||
115 | return NULL; | ||
116 | memset(tack, 0, sizeof(struct resource)); | ||
117 | res = (struct resource *) tack; | ||
118 | tack += sizeof(struct resource); | ||
119 | } | ||
120 | |||
121 | strncpy(tack, name, XNMLN); | ||
122 | tack[XNMLN] = 0; | ||
123 | res->name = tack; | ||
124 | |||
125 | return shmedia_ioremap(res, phys, size, flags); | ||
126 | } | ||
127 | |||
128 | static void __iomem *shmedia_ioremap(struct resource *res, u32 pa, int sz, | ||
129 | unsigned long flags) | ||
130 | { | ||
131 | unsigned long offset = ((unsigned long) pa) & (~PAGE_MASK); | ||
132 | unsigned long round_sz = (offset + sz + PAGE_SIZE-1) & PAGE_MASK; | ||
133 | unsigned long va; | ||
134 | unsigned int psz; | ||
135 | |||
136 | if (allocate_resource(&shmedia_iomap, res, round_sz, | ||
137 | shmedia_iomap.start, shmedia_iomap.end, | ||
138 | PAGE_SIZE, NULL, NULL) != 0) { | ||
139 | panic("alloc_io_res(%s): cannot occupy\n", | ||
140 | (res->name != NULL) ? res->name : "???"); | ||
141 | } | ||
142 | |||
143 | va = res->start; | ||
144 | pa &= PAGE_MASK; | ||
145 | |||
146 | psz = (res->end - res->start + (PAGE_SIZE - 1)) / PAGE_SIZE; | ||
147 | |||
148 | for (psz = res->end - res->start + 1; psz != 0; psz -= PAGE_SIZE) { | ||
149 | shmedia_mapioaddr(pa, va, flags); | ||
150 | va += PAGE_SIZE; | ||
151 | pa += PAGE_SIZE; | ||
152 | } | ||
153 | |||
154 | return (void __iomem *)(unsigned long)(res->start + offset); | ||
155 | } | ||
156 | |||
157 | static void shmedia_free_io(struct resource *res) | ||
158 | { | ||
159 | unsigned long len = res->end - res->start + 1; | ||
160 | |||
161 | BUG_ON((len & (PAGE_SIZE - 1)) != 0); | ||
162 | |||
163 | while (len) { | ||
164 | len -= PAGE_SIZE; | ||
165 | shmedia_unmapioaddr(res->start + len); | ||
166 | } | ||
167 | |||
168 | release_resource(res); | ||
169 | } | ||
170 | |||
171 | static __init_refok void *sh64_get_page(void) | ||
172 | { | ||
173 | void *page; | ||
174 | |||
175 | if (slab_is_available()) | ||
176 | page = (void *)get_zeroed_page(GFP_KERNEL); | ||
177 | else | ||
178 | page = alloc_bootmem_pages(PAGE_SIZE); | ||
179 | |||
180 | if (!page || ((unsigned long)page & ~PAGE_MASK)) | ||
181 | panic("sh64_get_page: Out of memory already?\n"); | ||
182 | |||
183 | return page; | ||
184 | } | ||
185 | |||
186 | static void shmedia_mapioaddr(unsigned long pa, unsigned long va, | ||
187 | unsigned long flags) | ||
188 | { | ||
189 | pgd_t *pgdp; | ||
190 | pud_t *pudp; | ||
191 | pmd_t *pmdp; | ||
192 | pte_t *ptep, pte; | ||
193 | pgprot_t prot; | ||
194 | |||
195 | pr_debug("shmedia_mapiopage pa %08lx va %08lx\n", pa, va); | ||
196 | |||
197 | if (!flags) | ||
198 | flags = 1; /* 1 = CB0-1 device */ | ||
199 | |||
200 | pgdp = pgd_offset_k(va); | ||
201 | if (pgd_none(*pgdp) || !pgd_present(*pgdp)) { | ||
202 | pudp = (pud_t *)sh64_get_page(); | ||
203 | set_pgd(pgdp, __pgd((unsigned long)pudp | _KERNPG_TABLE)); | ||
204 | } | ||
205 | |||
206 | pudp = pud_offset(pgdp, va); | ||
207 | if (pud_none(*pudp) || !pud_present(*pudp)) { | ||
208 | pmdp = (pmd_t *)sh64_get_page(); | ||
209 | set_pud(pudp, __pud((unsigned long)pmdp | _KERNPG_TABLE)); | ||
210 | } | ||
211 | |||
212 | pmdp = pmd_offset(pudp, va); | ||
213 | if (pmd_none(*pmdp) || !pmd_present(*pmdp)) { | ||
214 | ptep = (pte_t *)sh64_get_page(); | ||
215 | set_pmd(pmdp, __pmd((unsigned long)ptep + _PAGE_TABLE)); | ||
216 | } | ||
217 | |||
218 | prot = __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | | ||
219 | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_SHARED | flags); | ||
220 | |||
221 | pte = pfn_pte(pa >> PAGE_SHIFT, prot); | ||
222 | ptep = pte_offset_kernel(pmdp, va); | ||
223 | |||
224 | if (!pte_none(*ptep) && | ||
225 | pte_val(*ptep) != pte_val(pte)) | ||
226 | pte_ERROR(*ptep); | ||
227 | |||
228 | set_pte(ptep, pte); | ||
229 | |||
230 | flush_tlb_kernel_range(va, PAGE_SIZE); | ||
231 | } | ||
232 | |||
233 | static void shmedia_unmapioaddr(unsigned long vaddr) | ||
234 | { | ||
235 | pgd_t *pgdp; | ||
236 | pud_t *pudp; | ||
237 | pmd_t *pmdp; | ||
238 | pte_t *ptep; | ||
239 | |||
240 | pgdp = pgd_offset_k(vaddr); | ||
241 | if (pgd_none(*pgdp) || pgd_bad(*pgdp)) | ||
242 | return; | ||
243 | |||
244 | pudp = pud_offset(pgdp, vaddr); | ||
245 | if (pud_none(*pudp) || pud_bad(*pudp)) | ||
246 | return; | ||
247 | |||
248 | pmdp = pmd_offset(pudp, vaddr); | ||
249 | if (pmd_none(*pmdp) || pmd_bad(*pmdp)) | ||
250 | return; | ||
251 | |||
252 | ptep = pte_offset_kernel(pmdp, vaddr); | ||
253 | |||
254 | if (pte_none(*ptep) || !pte_present(*ptep)) | ||
255 | return; | ||
256 | |||
257 | clear_page((void *)ptep); | ||
258 | pte_clear(&init_mm, vaddr, ptep); | ||
259 | } | ||
260 | |||
261 | void __iomem *__ioremap_caller(unsigned long offset, unsigned long size, | ||
262 | unsigned long flags, void *caller) | ||
263 | { | ||
264 | char name[14]; | ||
265 | |||
266 | sprintf(name, "phys_%08x", (u32)offset); | ||
267 | return shmedia_alloc_io(offset, size, name, flags); | ||
268 | } | ||
269 | EXPORT_SYMBOL(__ioremap_caller); | ||
270 | |||
271 | void __iounmap(void __iomem *virtual) | ||
272 | { | ||
273 | unsigned long vaddr = (unsigned long)virtual & PAGE_MASK; | ||
274 | struct resource *res; | ||
275 | unsigned int psz; | ||
276 | |||
277 | res = shmedia_find_resource(&shmedia_iomap, vaddr); | ||
278 | if (!res) { | ||
279 | printk(KERN_ERR "%s: Failed to free 0x%08lx\n", | ||
280 | __func__, vaddr); | ||
281 | return; | ||
282 | } | ||
283 | |||
284 | psz = (res->end - res->start + (PAGE_SIZE - 1)) / PAGE_SIZE; | ||
285 | |||
286 | shmedia_free_io(res); | ||
287 | |||
288 | if ((char *)res >= (char *)xresv && | ||
289 | (char *)res < (char *)&xresv[XNRES]) { | ||
290 | xres_free((struct xresource *)res); | ||
291 | } else { | ||
292 | kfree(res); | ||
293 | } | ||
294 | } | ||
295 | EXPORT_SYMBOL(__iounmap); | ||
296 | |||
297 | static int | ||
298 | ioremap_proc_info(char *buf, char **start, off_t fpos, int length, int *eof, | ||
299 | void *data) | ||
300 | { | ||
301 | char *p = buf, *e = buf + length; | ||
302 | struct resource *r; | ||
303 | const char *nm; | ||
304 | |||
305 | for (r = ((struct resource *)data)->child; r != NULL; r = r->sibling) { | ||
306 | if (p + 32 >= e) /* Better than nothing */ | ||
307 | break; | ||
308 | nm = r->name; | ||
309 | if (nm == NULL) | ||
310 | nm = "???"; | ||
311 | |||
312 | p += sprintf(p, "%08lx-%08lx: %s\n", | ||
313 | (unsigned long)r->start, | ||
314 | (unsigned long)r->end, nm); | ||
315 | } | ||
316 | |||
317 | return p-buf; | ||
318 | } | ||
319 | |||
320 | static int __init register_proc_onchip(void) | ||
321 | { | ||
322 | create_proc_read_entry("io_map", 0, 0, ioremap_proc_info, | ||
323 | &shmedia_iomap); | ||
324 | return 0; | ||
325 | } | ||
326 | late_initcall(register_proc_onchip); | ||
diff --git a/arch/sh/mm/ioremap_fixed.c b/arch/sh/mm/ioremap_fixed.c new file mode 100644 index 000000000000..0b78b1e20ef1 --- /dev/null +++ b/arch/sh/mm/ioremap_fixed.c | |||
@@ -0,0 +1,128 @@ | |||
1 | /* | ||
2 | * Re-map IO memory to kernel address space so that we can access it. | ||
3 | * | ||
4 | * These functions should only be used when it is necessary to map a | ||
5 | * physical address space into the kernel address space before ioremap() | ||
6 | * can be used, e.g. early in boot before paging_init(). | ||
7 | * | ||
8 | * Copyright (C) 2009 Matt Fleming | ||
9 | */ | ||
10 | |||
11 | #include <linux/vmalloc.h> | ||
12 | #include <linux/ioport.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <linux/mm.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/bootmem.h> | ||
17 | #include <linux/proc_fs.h> | ||
18 | #include <linux/slab.h> | ||
19 | #include <asm/fixmap.h> | ||
20 | #include <asm/page.h> | ||
21 | #include <asm/pgalloc.h> | ||
22 | #include <asm/addrspace.h> | ||
23 | #include <asm/cacheflush.h> | ||
24 | #include <asm/tlbflush.h> | ||
25 | #include <asm/mmu.h> | ||
26 | #include <asm/mmu_context.h> | ||
27 | |||
28 | struct ioremap_map { | ||
29 | void __iomem *addr; | ||
30 | unsigned long size; | ||
31 | unsigned long fixmap_addr; | ||
32 | }; | ||
33 | |||
34 | static struct ioremap_map ioremap_maps[FIX_N_IOREMAPS]; | ||
35 | |||
36 | void __init ioremap_fixed_init(void) | ||
37 | { | ||
38 | struct ioremap_map *map; | ||
39 | int i; | ||
40 | |||
41 | for (i = 0; i < FIX_N_IOREMAPS; i++) { | ||
42 | map = &ioremap_maps[i]; | ||
43 | map->fixmap_addr = __fix_to_virt(FIX_IOREMAP_BEGIN + i); | ||
44 | } | ||
45 | } | ||
46 | |||
47 | void __init __iomem * | ||
48 | ioremap_fixed(resource_size_t phys_addr, unsigned long offset, | ||
49 | unsigned long size, pgprot_t prot) | ||
50 | { | ||
51 | enum fixed_addresses idx0, idx; | ||
52 | struct ioremap_map *map; | ||
53 | unsigned int nrpages; | ||
54 | int i, slot; | ||
55 | |||
56 | slot = -1; | ||
57 | for (i = 0; i < FIX_N_IOREMAPS; i++) { | ||
58 | map = &ioremap_maps[i]; | ||
59 | if (!map->addr) { | ||
60 | map->size = size; | ||
61 | slot = i; | ||
62 | break; | ||
63 | } | ||
64 | } | ||
65 | |||
66 | if (slot < 0) | ||
67 | return NULL; | ||
68 | |||
69 | /* | ||
70 | * Mappings have to fit in the FIX_IOREMAP area. | ||
71 | */ | ||
72 | nrpages = size >> PAGE_SHIFT; | ||
73 | if (nrpages > FIX_N_IOREMAPS) | ||
74 | return NULL; | ||
75 | |||
76 | /* | ||
77 | * Ok, go for it.. | ||
78 | */ | ||
79 | idx0 = FIX_IOREMAP_BEGIN + slot; | ||
80 | idx = idx0; | ||
81 | while (nrpages > 0) { | ||
82 | pgprot_val(prot) |= _PAGE_WIRED; | ||
83 | __set_fixmap(idx, phys_addr, prot); | ||
84 | phys_addr += PAGE_SIZE; | ||
85 | idx++; | ||
86 | --nrpages; | ||
87 | } | ||
88 | |||
89 | map->addr = (void __iomem *)(offset + map->fixmap_addr); | ||
90 | return map->addr; | ||
91 | } | ||
92 | |||
93 | int iounmap_fixed(void __iomem *addr) | ||
94 | { | ||
95 | enum fixed_addresses idx; | ||
96 | struct ioremap_map *map; | ||
97 | unsigned int nrpages; | ||
98 | int i, slot; | ||
99 | |||
100 | slot = -1; | ||
101 | for (i = 0; i < FIX_N_IOREMAPS; i++) { | ||
102 | map = &ioremap_maps[i]; | ||
103 | if (map->addr == addr) { | ||
104 | slot = i; | ||
105 | break; | ||
106 | } | ||
107 | } | ||
108 | |||
109 | /* | ||
110 | * If we don't match, it's not for us. | ||
111 | */ | ||
112 | if (slot < 0) | ||
113 | return -EINVAL; | ||
114 | |||
115 | nrpages = map->size >> PAGE_SHIFT; | ||
116 | |||
117 | idx = FIX_IOREMAP_BEGIN + slot + nrpages - 1; | ||
118 | while (nrpages > 0) { | ||
119 | __clear_fixmap(idx, __pgprot(_PAGE_WIRED)); | ||
120 | --idx; | ||
121 | --nrpages; | ||
122 | } | ||
123 | |||
124 | map->size = 0; | ||
125 | map->addr = NULL; | ||
126 | |||
127 | return 0; | ||
128 | } | ||
diff --git a/arch/sh/mm/nommu.c b/arch/sh/mm/nommu.c index ac16c05917ef..7694f50c9034 100644 --- a/arch/sh/mm/nommu.c +++ b/arch/sh/mm/nommu.c | |||
@@ -94,3 +94,7 @@ void __init page_table_range_init(unsigned long start, unsigned long end, | |||
94 | void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot) | 94 | void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot) |
95 | { | 95 | { |
96 | } | 96 | } |
97 | |||
98 | void pgtable_cache_init(void) | ||
99 | { | ||
100 | } | ||
diff --git a/arch/sh/mm/pgtable.c b/arch/sh/mm/pgtable.c new file mode 100644 index 000000000000..6f21fb1d8726 --- /dev/null +++ b/arch/sh/mm/pgtable.c | |||
@@ -0,0 +1,56 @@ | |||
1 | #include <linux/mm.h> | ||
2 | |||
3 | #define PGALLOC_GFP GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO | ||
4 | |||
5 | static struct kmem_cache *pgd_cachep; | ||
6 | #if PAGETABLE_LEVELS > 2 | ||
7 | static struct kmem_cache *pmd_cachep; | ||
8 | #endif | ||
9 | |||
10 | void pgd_ctor(void *x) | ||
11 | { | ||
12 | pgd_t *pgd = x; | ||
13 | |||
14 | memcpy(pgd + USER_PTRS_PER_PGD, | ||
15 | swapper_pg_dir + USER_PTRS_PER_PGD, | ||
16 | (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); | ||
17 | } | ||
18 | |||
19 | void pgtable_cache_init(void) | ||
20 | { | ||
21 | pgd_cachep = kmem_cache_create("pgd_cache", | ||
22 | PTRS_PER_PGD * (1<<PTE_MAGNITUDE), | ||
23 | PAGE_SIZE, SLAB_PANIC, pgd_ctor); | ||
24 | #if PAGETABLE_LEVELS > 2 | ||
25 | pmd_cachep = kmem_cache_create("pmd_cache", | ||
26 | PTRS_PER_PMD * (1<<PTE_MAGNITUDE), | ||
27 | PAGE_SIZE, SLAB_PANIC, NULL); | ||
28 | #endif | ||
29 | } | ||
30 | |||
31 | pgd_t *pgd_alloc(struct mm_struct *mm) | ||
32 | { | ||
33 | return kmem_cache_alloc(pgd_cachep, PGALLOC_GFP); | ||
34 | } | ||
35 | |||
36 | void pgd_free(struct mm_struct *mm, pgd_t *pgd) | ||
37 | { | ||
38 | kmem_cache_free(pgd_cachep, pgd); | ||
39 | } | ||
40 | |||
41 | #if PAGETABLE_LEVELS > 2 | ||
42 | void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) | ||
43 | { | ||
44 | set_pud(pud, __pud((unsigned long)pmd)); | ||
45 | } | ||
46 | |||
47 | pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) | ||
48 | { | ||
49 | return kmem_cache_alloc(pmd_cachep, PGALLOC_GFP); | ||
50 | } | ||
51 | |||
52 | void pmd_free(struct mm_struct *mm, pmd_t *pmd) | ||
53 | { | ||
54 | kmem_cache_free(pmd_cachep, pmd); | ||
55 | } | ||
56 | #endif /* PAGETABLE_LEVELS > 2 */ | ||
diff --git a/arch/sh/mm/pmb.c b/arch/sh/mm/pmb.c index 280f6a166035..198bcff5e96f 100644 --- a/arch/sh/mm/pmb.c +++ b/arch/sh/mm/pmb.c | |||
@@ -3,11 +3,8 @@ | |||
3 | * | 3 | * |
4 | * Privileged Space Mapping Buffer (PMB) Support. | 4 | * Privileged Space Mapping Buffer (PMB) Support. |
5 | * | 5 | * |
6 | * Copyright (C) 2005, 2006, 2007 Paul Mundt | 6 | * Copyright (C) 2005 - 2010 Paul Mundt |
7 | * | 7 | * Copyright (C) 2010 Matt Fleming |
8 | * P1/P2 Section mapping definitions from map32.h, which was: | ||
9 | * | ||
10 | * Copyright 2003 (c) Lineo Solutions,Inc. | ||
11 | * | 8 | * |
12 | * This file is subject to the terms and conditions of the GNU General Public | 9 | * This file is subject to the terms and conditions of the GNU General Public |
13 | * License. See the file "COPYING" in the main directory of this archive | 10 | * License. See the file "COPYING" in the main directory of this archive |
@@ -24,47 +21,67 @@ | |||
24 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
25 | #include <linux/seq_file.h> | 22 | #include <linux/seq_file.h> |
26 | #include <linux/err.h> | 23 | #include <linux/err.h> |
24 | #include <linux/io.h> | ||
25 | #include <linux/spinlock.h> | ||
26 | #include <linux/rwlock.h> | ||
27 | #include <asm/sizes.h> | ||
27 | #include <asm/system.h> | 28 | #include <asm/system.h> |
28 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
29 | #include <asm/pgtable.h> | 30 | #include <asm/pgtable.h> |
31 | #include <asm/page.h> | ||
30 | #include <asm/mmu.h> | 32 | #include <asm/mmu.h> |
31 | #include <asm/io.h> | ||
32 | #include <asm/mmu_context.h> | 33 | #include <asm/mmu_context.h> |
33 | 34 | ||
34 | #define NR_PMB_ENTRIES 16 | 35 | struct pmb_entry; |
36 | |||
37 | struct pmb_entry { | ||
38 | unsigned long vpn; | ||
39 | unsigned long ppn; | ||
40 | unsigned long flags; | ||
41 | unsigned long size; | ||
35 | 42 | ||
36 | static void __pmb_unmap(struct pmb_entry *); | 43 | spinlock_t lock; |
44 | |||
45 | /* | ||
46 | * 0 .. NR_PMB_ENTRIES for specific entry selection, or | ||
47 | * PMB_NO_ENTRY to search for a free one | ||
48 | */ | ||
49 | int entry; | ||
37 | 50 | ||
51 | /* Adjacent entry link for contiguous multi-entry mappings */ | ||
52 | struct pmb_entry *link; | ||
53 | }; | ||
54 | |||
55 | static void pmb_unmap_entry(struct pmb_entry *, int depth); | ||
56 | |||
57 | static DEFINE_RWLOCK(pmb_rwlock); | ||
38 | static struct pmb_entry pmb_entry_list[NR_PMB_ENTRIES]; | 58 | static struct pmb_entry pmb_entry_list[NR_PMB_ENTRIES]; |
39 | static unsigned long pmb_map; | 59 | static DECLARE_BITMAP(pmb_map, NR_PMB_ENTRIES); |
40 | 60 | ||
41 | static inline unsigned long mk_pmb_entry(unsigned int entry) | 61 | static __always_inline unsigned long mk_pmb_entry(unsigned int entry) |
42 | { | 62 | { |
43 | return (entry & PMB_E_MASK) << PMB_E_SHIFT; | 63 | return (entry & PMB_E_MASK) << PMB_E_SHIFT; |
44 | } | 64 | } |
45 | 65 | ||
46 | static inline unsigned long mk_pmb_addr(unsigned int entry) | 66 | static __always_inline unsigned long mk_pmb_addr(unsigned int entry) |
47 | { | 67 | { |
48 | return mk_pmb_entry(entry) | PMB_ADDR; | 68 | return mk_pmb_entry(entry) | PMB_ADDR; |
49 | } | 69 | } |
50 | 70 | ||
51 | static inline unsigned long mk_pmb_data(unsigned int entry) | 71 | static __always_inline unsigned long mk_pmb_data(unsigned int entry) |
52 | { | 72 | { |
53 | return mk_pmb_entry(entry) | PMB_DATA; | 73 | return mk_pmb_entry(entry) | PMB_DATA; |
54 | } | 74 | } |
55 | 75 | ||
56 | static int pmb_alloc_entry(void) | 76 | static int pmb_alloc_entry(void) |
57 | { | 77 | { |
58 | unsigned int pos; | 78 | int pos; |
59 | |||
60 | repeat: | ||
61 | pos = find_first_zero_bit(&pmb_map, NR_PMB_ENTRIES); | ||
62 | |||
63 | if (unlikely(pos > NR_PMB_ENTRIES)) | ||
64 | return -ENOSPC; | ||
65 | 79 | ||
66 | if (test_and_set_bit(pos, &pmb_map)) | 80 | pos = find_first_zero_bit(pmb_map, NR_PMB_ENTRIES); |
67 | goto repeat; | 81 | if (pos >= 0 && pos < NR_PMB_ENTRIES) |
82 | __set_bit(pos, pmb_map); | ||
83 | else | ||
84 | pos = -ENOSPC; | ||
68 | 85 | ||
69 | return pos; | 86 | return pos; |
70 | } | 87 | } |
@@ -73,21 +90,34 @@ static struct pmb_entry *pmb_alloc(unsigned long vpn, unsigned long ppn, | |||
73 | unsigned long flags, int entry) | 90 | unsigned long flags, int entry) |
74 | { | 91 | { |
75 | struct pmb_entry *pmbe; | 92 | struct pmb_entry *pmbe; |
93 | unsigned long irqflags; | ||
94 | void *ret = NULL; | ||
76 | int pos; | 95 | int pos; |
77 | 96 | ||
97 | write_lock_irqsave(&pmb_rwlock, irqflags); | ||
98 | |||
78 | if (entry == PMB_NO_ENTRY) { | 99 | if (entry == PMB_NO_ENTRY) { |
79 | pos = pmb_alloc_entry(); | 100 | pos = pmb_alloc_entry(); |
80 | if (pos < 0) | 101 | if (unlikely(pos < 0)) { |
81 | return ERR_PTR(pos); | 102 | ret = ERR_PTR(pos); |
103 | goto out; | ||
104 | } | ||
82 | } else { | 105 | } else { |
83 | if (test_bit(entry, &pmb_map)) | 106 | if (__test_and_set_bit(entry, pmb_map)) { |
84 | return ERR_PTR(-ENOSPC); | 107 | ret = ERR_PTR(-ENOSPC); |
108 | goto out; | ||
109 | } | ||
110 | |||
85 | pos = entry; | 111 | pos = entry; |
86 | } | 112 | } |
87 | 113 | ||
114 | write_unlock_irqrestore(&pmb_rwlock, irqflags); | ||
115 | |||
88 | pmbe = &pmb_entry_list[pos]; | 116 | pmbe = &pmb_entry_list[pos]; |
89 | if (!pmbe) | 117 | |
90 | return ERR_PTR(-ENOMEM); | 118 | memset(pmbe, 0, sizeof(struct pmb_entry)); |
119 | |||
120 | spin_lock_init(&pmbe->lock); | ||
91 | 121 | ||
92 | pmbe->vpn = vpn; | 122 | pmbe->vpn = vpn; |
93 | pmbe->ppn = ppn; | 123 | pmbe->ppn = ppn; |
@@ -95,101 +125,113 @@ static struct pmb_entry *pmb_alloc(unsigned long vpn, unsigned long ppn, | |||
95 | pmbe->entry = pos; | 125 | pmbe->entry = pos; |
96 | 126 | ||
97 | return pmbe; | 127 | return pmbe; |
128 | |||
129 | out: | ||
130 | write_unlock_irqrestore(&pmb_rwlock, irqflags); | ||
131 | return ret; | ||
98 | } | 132 | } |
99 | 133 | ||
100 | static void pmb_free(struct pmb_entry *pmbe) | 134 | static void pmb_free(struct pmb_entry *pmbe) |
101 | { | 135 | { |
102 | int pos = pmbe->entry; | 136 | __clear_bit(pmbe->entry, pmb_map); |
103 | |||
104 | pmbe->vpn = 0; | ||
105 | pmbe->ppn = 0; | ||
106 | pmbe->flags = 0; | ||
107 | pmbe->entry = 0; | ||
108 | 137 | ||
109 | clear_bit(pos, &pmb_map); | 138 | pmbe->entry = PMB_NO_ENTRY; |
139 | pmbe->link = NULL; | ||
110 | } | 140 | } |
111 | 141 | ||
112 | /* | 142 | /* |
113 | * Must be in P2 for __set_pmb_entry() | 143 | * Ensure that the PMB entries match our cache configuration. |
144 | * | ||
145 | * When we are in 32-bit address extended mode, CCR.CB becomes | ||
146 | * invalid, so care must be taken to manually adjust cacheable | ||
147 | * translations. | ||
114 | */ | 148 | */ |
115 | static void __set_pmb_entry(unsigned long vpn, unsigned long ppn, | 149 | static __always_inline unsigned long pmb_cache_flags(void) |
116 | unsigned long flags, int pos) | ||
117 | { | 150 | { |
118 | ctrl_outl(vpn | PMB_V, mk_pmb_addr(pos)); | 151 | unsigned long flags = 0; |
119 | 152 | ||
120 | #ifdef CONFIG_CACHE_WRITETHROUGH | 153 | #if defined(CONFIG_CACHE_WRITETHROUGH) |
121 | /* | 154 | flags |= PMB_C | PMB_WT | PMB_UB; |
122 | * When we are in 32-bit address extended mode, CCR.CB becomes | 155 | #elif defined(CONFIG_CACHE_WRITEBACK) |
123 | * invalid, so care must be taken to manually adjust cacheable | 156 | flags |= PMB_C; |
124 | * translations. | ||
125 | */ | ||
126 | if (likely(flags & PMB_C)) | ||
127 | flags |= PMB_WT; | ||
128 | #endif | 157 | #endif |
129 | 158 | ||
130 | ctrl_outl(ppn | flags | PMB_V, mk_pmb_data(pos)); | 159 | return flags; |
131 | } | 160 | } |
132 | 161 | ||
133 | static void __uses_jump_to_uncached set_pmb_entry(struct pmb_entry *pmbe) | 162 | /* |
163 | * Must be run uncached. | ||
164 | */ | ||
165 | static void __set_pmb_entry(struct pmb_entry *pmbe) | ||
134 | { | 166 | { |
135 | jump_to_uncached(); | 167 | writel_uncached(pmbe->vpn | PMB_V, mk_pmb_addr(pmbe->entry)); |
136 | __set_pmb_entry(pmbe->vpn, pmbe->ppn, pmbe->flags, pmbe->entry); | 168 | writel_uncached(pmbe->ppn | pmbe->flags | PMB_V, |
137 | back_to_cached(); | 169 | mk_pmb_data(pmbe->entry)); |
138 | } | 170 | } |
139 | 171 | ||
140 | static void __uses_jump_to_uncached clear_pmb_entry(struct pmb_entry *pmbe) | 172 | static void __clear_pmb_entry(struct pmb_entry *pmbe) |
141 | { | 173 | { |
142 | unsigned int entry = pmbe->entry; | 174 | unsigned long addr, data; |
143 | unsigned long addr; | 175 | unsigned long addr_val, data_val; |
144 | 176 | ||
145 | if (unlikely(entry >= NR_PMB_ENTRIES)) | 177 | addr = mk_pmb_addr(pmbe->entry); |
146 | return; | 178 | data = mk_pmb_data(pmbe->entry); |
147 | 179 | ||
148 | jump_to_uncached(); | 180 | addr_val = __raw_readl(addr); |
181 | data_val = __raw_readl(data); | ||
149 | 182 | ||
150 | /* Clear V-bit */ | 183 | /* Clear V-bit */ |
151 | addr = mk_pmb_addr(entry); | 184 | writel_uncached(addr_val & ~PMB_V, addr); |
152 | ctrl_outl(ctrl_inl(addr) & ~PMB_V, addr); | 185 | writel_uncached(data_val & ~PMB_V, data); |
186 | } | ||
153 | 187 | ||
154 | addr = mk_pmb_data(entry); | 188 | static void set_pmb_entry(struct pmb_entry *pmbe) |
155 | ctrl_outl(ctrl_inl(addr) & ~PMB_V, addr); | 189 | { |
190 | unsigned long flags; | ||
156 | 191 | ||
157 | back_to_cached(); | 192 | spin_lock_irqsave(&pmbe->lock, flags); |
193 | __set_pmb_entry(pmbe); | ||
194 | spin_unlock_irqrestore(&pmbe->lock, flags); | ||
158 | } | 195 | } |
159 | 196 | ||
160 | |||
161 | static struct { | 197 | static struct { |
162 | unsigned long size; | 198 | unsigned long size; |
163 | int flag; | 199 | int flag; |
164 | } pmb_sizes[] = { | 200 | } pmb_sizes[] = { |
165 | { .size = 0x20000000, .flag = PMB_SZ_512M, }, | 201 | { .size = SZ_512M, .flag = PMB_SZ_512M, }, |
166 | { .size = 0x08000000, .flag = PMB_SZ_128M, }, | 202 | { .size = SZ_128M, .flag = PMB_SZ_128M, }, |
167 | { .size = 0x04000000, .flag = PMB_SZ_64M, }, | 203 | { .size = SZ_64M, .flag = PMB_SZ_64M, }, |
168 | { .size = 0x01000000, .flag = PMB_SZ_16M, }, | 204 | { .size = SZ_16M, .flag = PMB_SZ_16M, }, |
169 | }; | 205 | }; |
170 | 206 | ||
171 | long pmb_remap(unsigned long vaddr, unsigned long phys, | 207 | long pmb_remap(unsigned long vaddr, unsigned long phys, |
172 | unsigned long size, unsigned long flags) | 208 | unsigned long size, pgprot_t prot) |
173 | { | 209 | { |
174 | struct pmb_entry *pmbp, *pmbe; | 210 | struct pmb_entry *pmbp, *pmbe; |
175 | unsigned long wanted; | 211 | unsigned long wanted; |
176 | int pmb_flags, i; | 212 | int pmb_flags, i; |
177 | long err; | 213 | long err; |
214 | u64 flags; | ||
215 | |||
216 | flags = pgprot_val(prot); | ||
217 | |||
218 | pmb_flags = PMB_WT | PMB_UB; | ||
178 | 219 | ||
179 | /* Convert typical pgprot value to the PMB equivalent */ | 220 | /* Convert typical pgprot value to the PMB equivalent */ |
180 | if (flags & _PAGE_CACHABLE) { | 221 | if (flags & _PAGE_CACHABLE) { |
181 | if (flags & _PAGE_WT) | 222 | pmb_flags |= PMB_C; |
182 | pmb_flags = PMB_WT; | 223 | |
183 | else | 224 | if ((flags & _PAGE_WT) == 0) |
184 | pmb_flags = PMB_C; | 225 | pmb_flags &= ~(PMB_WT | PMB_UB); |
185 | } else | 226 | } |
186 | pmb_flags = PMB_WT | PMB_UB; | ||
187 | 227 | ||
188 | pmbp = NULL; | 228 | pmbp = NULL; |
189 | wanted = size; | 229 | wanted = size; |
190 | 230 | ||
191 | again: | 231 | again: |
192 | for (i = 0; i < ARRAY_SIZE(pmb_sizes); i++) { | 232 | for (i = 0; i < ARRAY_SIZE(pmb_sizes); i++) { |
233 | unsigned long flags; | ||
234 | |||
193 | if (size < pmb_sizes[i].size) | 235 | if (size < pmb_sizes[i].size) |
194 | continue; | 236 | continue; |
195 | 237 | ||
@@ -200,18 +242,25 @@ again: | |||
200 | goto out; | 242 | goto out; |
201 | } | 243 | } |
202 | 244 | ||
203 | set_pmb_entry(pmbe); | 245 | spin_lock_irqsave(&pmbe->lock, flags); |
246 | |||
247 | __set_pmb_entry(pmbe); | ||
204 | 248 | ||
205 | phys += pmb_sizes[i].size; | 249 | phys += pmb_sizes[i].size; |
206 | vaddr += pmb_sizes[i].size; | 250 | vaddr += pmb_sizes[i].size; |
207 | size -= pmb_sizes[i].size; | 251 | size -= pmb_sizes[i].size; |
208 | 252 | ||
253 | pmbe->size = pmb_sizes[i].size; | ||
254 | |||
209 | /* | 255 | /* |
210 | * Link adjacent entries that span multiple PMB entries | 256 | * Link adjacent entries that span multiple PMB entries |
211 | * for easier tear-down. | 257 | * for easier tear-down. |
212 | */ | 258 | */ |
213 | if (likely(pmbp)) | 259 | if (likely(pmbp)) { |
260 | spin_lock(&pmbp->lock); | ||
214 | pmbp->link = pmbe; | 261 | pmbp->link = pmbe; |
262 | spin_unlock(&pmbp->lock); | ||
263 | } | ||
215 | 264 | ||
216 | pmbp = pmbe; | 265 | pmbp = pmbe; |
217 | 266 | ||
@@ -221,16 +270,17 @@ again: | |||
221 | * pmb_sizes[i].size again. | 270 | * pmb_sizes[i].size again. |
222 | */ | 271 | */ |
223 | i--; | 272 | i--; |
273 | |||
274 | spin_unlock_irqrestore(&pmbe->lock, flags); | ||
224 | } | 275 | } |
225 | 276 | ||
226 | if (size >= 0x1000000) | 277 | if (size >= SZ_16M) |
227 | goto again; | 278 | goto again; |
228 | 279 | ||
229 | return wanted - size; | 280 | return wanted - size; |
230 | 281 | ||
231 | out: | 282 | out: |
232 | if (pmbp) | 283 | pmb_unmap_entry(pmbp, NR_PMB_ENTRIES); |
233 | __pmb_unmap(pmbp); | ||
234 | 284 | ||
235 | return err; | 285 | return err; |
236 | } | 286 | } |
@@ -240,24 +290,52 @@ void pmb_unmap(unsigned long addr) | |||
240 | struct pmb_entry *pmbe = NULL; | 290 | struct pmb_entry *pmbe = NULL; |
241 | int i; | 291 | int i; |
242 | 292 | ||
293 | read_lock(&pmb_rwlock); | ||
294 | |||
243 | for (i = 0; i < ARRAY_SIZE(pmb_entry_list); i++) { | 295 | for (i = 0; i < ARRAY_SIZE(pmb_entry_list); i++) { |
244 | if (test_bit(i, &pmb_map)) { | 296 | if (test_bit(i, pmb_map)) { |
245 | pmbe = &pmb_entry_list[i]; | 297 | pmbe = &pmb_entry_list[i]; |
246 | if (pmbe->vpn == addr) | 298 | if (pmbe->vpn == addr) |
247 | break; | 299 | break; |
248 | } | 300 | } |
249 | } | 301 | } |
250 | 302 | ||
251 | if (unlikely(!pmbe)) | 303 | read_unlock(&pmb_rwlock); |
252 | return; | ||
253 | 304 | ||
254 | __pmb_unmap(pmbe); | 305 | pmb_unmap_entry(pmbe, NR_PMB_ENTRIES); |
255 | } | 306 | } |
256 | 307 | ||
257 | static void __pmb_unmap(struct pmb_entry *pmbe) | 308 | static bool pmb_can_merge(struct pmb_entry *a, struct pmb_entry *b) |
258 | { | 309 | { |
259 | BUG_ON(!test_bit(pmbe->entry, &pmb_map)); | 310 | return (b->vpn == (a->vpn + a->size)) && |
311 | (b->ppn == (a->ppn + a->size)) && | ||
312 | (b->flags == a->flags); | ||
313 | } | ||
260 | 314 | ||
315 | static bool pmb_size_valid(unsigned long size) | ||
316 | { | ||
317 | int i; | ||
318 | |||
319 | for (i = 0; i < ARRAY_SIZE(pmb_sizes); i++) | ||
320 | if (pmb_sizes[i].size == size) | ||
321 | return true; | ||
322 | |||
323 | return false; | ||
324 | } | ||
325 | |||
326 | static int pmb_size_to_flags(unsigned long size) | ||
327 | { | ||
328 | int i; | ||
329 | |||
330 | for (i = 0; i < ARRAY_SIZE(pmb_sizes); i++) | ||
331 | if (pmb_sizes[i].size == size) | ||
332 | return pmb_sizes[i].flag; | ||
333 | |||
334 | return 0; | ||
335 | } | ||
336 | |||
337 | static void __pmb_unmap_entry(struct pmb_entry *pmbe, int depth) | ||
338 | { | ||
261 | do { | 339 | do { |
262 | struct pmb_entry *pmblink = pmbe; | 340 | struct pmb_entry *pmblink = pmbe; |
263 | 341 | ||
@@ -268,102 +346,312 @@ static void __pmb_unmap(struct pmb_entry *pmbe) | |||
268 | * this entry in pmb_alloc() (even if we haven't filled | 346 | * this entry in pmb_alloc() (even if we haven't filled |
269 | * it yet). | 347 | * it yet). |
270 | * | 348 | * |
271 | * Therefore, calling clear_pmb_entry() is safe as no | 349 | * Therefore, calling __clear_pmb_entry() is safe as no |
272 | * other mapping can be using that slot. | 350 | * other mapping can be using that slot. |
273 | */ | 351 | */ |
274 | clear_pmb_entry(pmbe); | 352 | __clear_pmb_entry(pmbe); |
275 | 353 | ||
276 | pmbe = pmblink->link; | 354 | pmbe = pmblink->link; |
277 | 355 | ||
278 | pmb_free(pmblink); | 356 | pmb_free(pmblink); |
279 | } while (pmbe); | 357 | } while (pmbe && --depth); |
358 | } | ||
359 | |||
360 | static void pmb_unmap_entry(struct pmb_entry *pmbe, int depth) | ||
361 | { | ||
362 | unsigned long flags; | ||
363 | |||
364 | if (unlikely(!pmbe)) | ||
365 | return; | ||
366 | |||
367 | write_lock_irqsave(&pmb_rwlock, flags); | ||
368 | __pmb_unmap_entry(pmbe, depth); | ||
369 | write_unlock_irqrestore(&pmb_rwlock, flags); | ||
370 | } | ||
371 | |||
372 | static __always_inline unsigned int pmb_ppn_in_range(unsigned long ppn) | ||
373 | { | ||
374 | return ppn >= __pa(memory_start) && ppn < __pa(memory_end); | ||
280 | } | 375 | } |
281 | 376 | ||
282 | #ifdef CONFIG_PMB | 377 | static void __init pmb_notify(void) |
283 | int __uses_jump_to_uncached pmb_init(void) | ||
284 | { | 378 | { |
285 | unsigned int i; | 379 | int i; |
286 | long size, ret; | ||
287 | 380 | ||
288 | jump_to_uncached(); | 381 | pr_info("PMB: boot mappings:\n"); |
382 | |||
383 | read_lock(&pmb_rwlock); | ||
384 | |||
385 | for (i = 0; i < ARRAY_SIZE(pmb_entry_list); i++) { | ||
386 | struct pmb_entry *pmbe; | ||
387 | |||
388 | if (!test_bit(i, pmb_map)) | ||
389 | continue; | ||
390 | |||
391 | pmbe = &pmb_entry_list[i]; | ||
392 | |||
393 | pr_info(" 0x%08lx -> 0x%08lx [ %4ldMB %2scached ]\n", | ||
394 | pmbe->vpn >> PAGE_SHIFT, pmbe->ppn >> PAGE_SHIFT, | ||
395 | pmbe->size >> 20, (pmbe->flags & PMB_C) ? "" : "un"); | ||
396 | } | ||
397 | |||
398 | read_unlock(&pmb_rwlock); | ||
399 | } | ||
400 | |||
401 | /* | ||
402 | * Sync our software copy of the PMB mappings with those in hardware. The | ||
403 | * mappings in the hardware PMB were either set up by the bootloader or | ||
404 | * very early on by the kernel. | ||
405 | */ | ||
406 | static void __init pmb_synchronize(void) | ||
407 | { | ||
408 | struct pmb_entry *pmbp = NULL; | ||
409 | int i, j; | ||
289 | 410 | ||
290 | /* | 411 | /* |
291 | * Insert PMB entries for the P1 and P2 areas so that, after | 412 | * Run through the initial boot mappings, log the established |
292 | * we've switched the MMU to 32-bit mode, the semantics of P1 | 413 | * ones, and blow away anything that falls outside of the valid |
293 | * and P2 are the same as in 29-bit mode, e.g. | 414 | * PPN range. Specifically, we only care about existing mappings |
415 | * that impact the cached/uncached sections. | ||
294 | * | 416 | * |
295 | * P1 - provides a cached window onto physical memory | 417 | * Note that touching these can be a bit of a minefield; the boot |
296 | * P2 - provides an uncached window onto physical memory | 418 | * loader can establish multi-page mappings with the same caching |
419 | * attributes, so we need to ensure that we aren't modifying a | ||
420 | * mapping that we're presently executing from, or may execute | ||
421 | * from in the case of straddling page boundaries. | ||
422 | * | ||
423 | * In the future we will have to tidy up after the boot loader by | ||
424 | * jumping between the cached and uncached mappings and tearing | ||
425 | * down alternating mappings while executing from the other. | ||
297 | */ | 426 | */ |
298 | size = __MEMORY_START + __MEMORY_SIZE; | 427 | for (i = 0; i < NR_PMB_ENTRIES; i++) { |
428 | unsigned long addr, data; | ||
429 | unsigned long addr_val, data_val; | ||
430 | unsigned long ppn, vpn, flags; | ||
431 | unsigned long irqflags; | ||
432 | unsigned int size; | ||
433 | struct pmb_entry *pmbe; | ||
299 | 434 | ||
300 | ret = pmb_remap(P1SEG, 0x00000000, size, PMB_C); | 435 | addr = mk_pmb_addr(i); |
301 | BUG_ON(ret != size); | 436 | data = mk_pmb_data(i); |
302 | 437 | ||
303 | ret = pmb_remap(P2SEG, 0x00000000, size, PMB_WT | PMB_UB); | 438 | addr_val = __raw_readl(addr); |
304 | BUG_ON(ret != size); | 439 | data_val = __raw_readl(data); |
305 | 440 | ||
306 | ctrl_outl(0, PMB_IRMCR); | 441 | /* |
442 | * Skip over any bogus entries | ||
443 | */ | ||
444 | if (!(data_val & PMB_V) || !(addr_val & PMB_V)) | ||
445 | continue; | ||
307 | 446 | ||
308 | /* PMB.SE and UB[7] */ | 447 | ppn = data_val & PMB_PFN_MASK; |
309 | ctrl_outl(PASCR_SE | (1 << 7), PMB_PASCR); | 448 | vpn = addr_val & PMB_PFN_MASK; |
310 | 449 | ||
311 | /* Flush out the TLB */ | 450 | /* |
312 | i = ctrl_inl(MMUCR); | 451 | * Only preserve in-range mappings. |
313 | i |= MMUCR_TI; | 452 | */ |
314 | ctrl_outl(i, MMUCR); | 453 | if (!pmb_ppn_in_range(ppn)) { |
454 | /* | ||
455 | * Invalidate anything out of bounds. | ||
456 | */ | ||
457 | writel_uncached(addr_val & ~PMB_V, addr); | ||
458 | writel_uncached(data_val & ~PMB_V, data); | ||
459 | continue; | ||
460 | } | ||
315 | 461 | ||
316 | back_to_cached(); | 462 | /* |
463 | * Update the caching attributes if necessary | ||
464 | */ | ||
465 | if (data_val & PMB_C) { | ||
466 | data_val &= ~PMB_CACHE_MASK; | ||
467 | data_val |= pmb_cache_flags(); | ||
317 | 468 | ||
318 | return 0; | 469 | writel_uncached(data_val, data); |
470 | } | ||
471 | |||
472 | size = data_val & PMB_SZ_MASK; | ||
473 | flags = size | (data_val & PMB_CACHE_MASK); | ||
474 | |||
475 | pmbe = pmb_alloc(vpn, ppn, flags, i); | ||
476 | if (IS_ERR(pmbe)) { | ||
477 | WARN_ON_ONCE(1); | ||
478 | continue; | ||
479 | } | ||
480 | |||
481 | spin_lock_irqsave(&pmbe->lock, irqflags); | ||
482 | |||
483 | for (j = 0; j < ARRAY_SIZE(pmb_sizes); j++) | ||
484 | if (pmb_sizes[j].flag == size) | ||
485 | pmbe->size = pmb_sizes[j].size; | ||
486 | |||
487 | if (pmbp) { | ||
488 | spin_lock(&pmbp->lock); | ||
489 | |||
490 | /* | ||
491 | * Compare the previous entry against the current one to | ||
492 | * see if the entries span a contiguous mapping. If so, | ||
493 | * setup the entry links accordingly. Compound mappings | ||
494 | * are later coalesced. | ||
495 | */ | ||
496 | if (pmb_can_merge(pmbp, pmbe)) | ||
497 | pmbp->link = pmbe; | ||
498 | |||
499 | spin_unlock(&pmbp->lock); | ||
500 | } | ||
501 | |||
502 | pmbp = pmbe; | ||
503 | |||
504 | spin_unlock_irqrestore(&pmbe->lock, irqflags); | ||
505 | } | ||
506 | } | ||
507 | |||
508 | static void __init pmb_merge(struct pmb_entry *head) | ||
509 | { | ||
510 | unsigned long span, newsize; | ||
511 | struct pmb_entry *tail; | ||
512 | int i = 1, depth = 0; | ||
513 | |||
514 | span = newsize = head->size; | ||
515 | |||
516 | tail = head->link; | ||
517 | while (tail) { | ||
518 | span += tail->size; | ||
519 | |||
520 | if (pmb_size_valid(span)) { | ||
521 | newsize = span; | ||
522 | depth = i; | ||
523 | } | ||
524 | |||
525 | /* This is the end of the line.. */ | ||
526 | if (!tail->link) | ||
527 | break; | ||
528 | |||
529 | tail = tail->link; | ||
530 | i++; | ||
531 | } | ||
532 | |||
533 | /* | ||
534 | * The merged page size must be valid. | ||
535 | */ | ||
536 | if (!pmb_size_valid(newsize)) | ||
537 | return; | ||
538 | |||
539 | head->flags &= ~PMB_SZ_MASK; | ||
540 | head->flags |= pmb_size_to_flags(newsize); | ||
541 | |||
542 | head->size = newsize; | ||
543 | |||
544 | __pmb_unmap_entry(head->link, depth); | ||
545 | __set_pmb_entry(head); | ||
319 | } | 546 | } |
320 | #else | 547 | |
321 | int __uses_jump_to_uncached pmb_init(void) | 548 | static void __init pmb_coalesce(void) |
322 | { | 549 | { |
550 | unsigned long flags; | ||
323 | int i; | 551 | int i; |
324 | unsigned long addr, data; | ||
325 | 552 | ||
326 | jump_to_uncached(); | 553 | write_lock_irqsave(&pmb_rwlock, flags); |
327 | 554 | ||
328 | for (i = 0; i < PMB_ENTRY_MAX; i++) { | 555 | for (i = 0; i < ARRAY_SIZE(pmb_entry_list); i++) { |
329 | struct pmb_entry *pmbe; | 556 | struct pmb_entry *pmbe; |
330 | unsigned long vpn, ppn, flags; | ||
331 | 557 | ||
332 | addr = PMB_DATA + (i << PMB_E_SHIFT); | 558 | if (!test_bit(i, pmb_map)) |
333 | data = ctrl_inl(addr); | ||
334 | if (!(data & PMB_V)) | ||
335 | continue; | 559 | continue; |
336 | 560 | ||
337 | if (data & PMB_C) { | 561 | pmbe = &pmb_entry_list[i]; |
338 | #if defined(CONFIG_CACHE_WRITETHROUGH) | ||
339 | data |= PMB_WT; | ||
340 | #elif defined(CONFIG_CACHE_WRITEBACK) | ||
341 | data &= ~PMB_WT; | ||
342 | #else | ||
343 | data &= ~(PMB_C | PMB_WT); | ||
344 | #endif | ||
345 | } | ||
346 | ctrl_outl(data, addr); | ||
347 | 562 | ||
348 | ppn = data & PMB_PFN_MASK; | 563 | /* |
564 | * We're only interested in compound mappings | ||
565 | */ | ||
566 | if (!pmbe->link) | ||
567 | continue; | ||
349 | 568 | ||
350 | flags = data & (PMB_C | PMB_WT | PMB_UB); | 569 | /* |
351 | flags |= data & PMB_SZ_MASK; | 570 | * Nothing to do if it already uses the largest possible |
571 | * page size. | ||
572 | */ | ||
573 | if (pmbe->size == SZ_512M) | ||
574 | continue; | ||
352 | 575 | ||
353 | addr = PMB_ADDR + (i << PMB_E_SHIFT); | 576 | pmb_merge(pmbe); |
354 | data = ctrl_inl(addr); | 577 | } |
355 | 578 | ||
356 | vpn = data & PMB_PFN_MASK; | 579 | write_unlock_irqrestore(&pmb_rwlock, flags); |
580 | } | ||
357 | 581 | ||
358 | pmbe = pmb_alloc(vpn, ppn, flags, i); | 582 | #ifdef CONFIG_UNCACHED_MAPPING |
359 | WARN_ON(IS_ERR(pmbe)); | 583 | static void __init pmb_resize(void) |
584 | { | ||
585 | int i; | ||
586 | |||
587 | /* | ||
588 | * If the uncached mapping was constructed by the kernel, it will | ||
589 | * already be a reasonable size. | ||
590 | */ | ||
591 | if (uncached_size == SZ_16M) | ||
592 | return; | ||
593 | |||
594 | read_lock(&pmb_rwlock); | ||
595 | |||
596 | for (i = 0; i < ARRAY_SIZE(pmb_entry_list); i++) { | ||
597 | struct pmb_entry *pmbe; | ||
598 | unsigned long flags; | ||
599 | |||
600 | if (!test_bit(i, pmb_map)) | ||
601 | continue; | ||
602 | |||
603 | pmbe = &pmb_entry_list[i]; | ||
604 | |||
605 | if (pmbe->vpn != uncached_start) | ||
606 | continue; | ||
607 | |||
608 | /* | ||
609 | * Found it, now resize it. | ||
610 | */ | ||
611 | spin_lock_irqsave(&pmbe->lock, flags); | ||
612 | |||
613 | pmbe->size = SZ_16M; | ||
614 | pmbe->flags &= ~PMB_SZ_MASK; | ||
615 | pmbe->flags |= pmb_size_to_flags(pmbe->size); | ||
616 | |||
617 | uncached_resize(pmbe->size); | ||
618 | |||
619 | __set_pmb_entry(pmbe); | ||
620 | |||
621 | spin_unlock_irqrestore(&pmbe->lock, flags); | ||
360 | } | 622 | } |
361 | 623 | ||
362 | back_to_cached(); | 624 | read_lock(&pmb_rwlock); |
625 | } | ||
626 | #endif | ||
627 | |||
628 | void __init pmb_init(void) | ||
629 | { | ||
630 | /* Synchronize software state */ | ||
631 | pmb_synchronize(); | ||
363 | 632 | ||
364 | return 0; | 633 | /* Attempt to combine compound mappings */ |
634 | pmb_coalesce(); | ||
635 | |||
636 | #ifdef CONFIG_UNCACHED_MAPPING | ||
637 | /* Resize initial mappings, if necessary */ | ||
638 | pmb_resize(); | ||
639 | #endif | ||
640 | |||
641 | /* Log them */ | ||
642 | pmb_notify(); | ||
643 | |||
644 | writel_uncached(0, PMB_IRMCR); | ||
645 | |||
646 | /* Flush out the TLB */ | ||
647 | __raw_writel(__raw_readl(MMUCR) | MMUCR_TI, MMUCR); | ||
648 | ctrl_barrier(); | ||
649 | } | ||
650 | |||
651 | bool __in_29bit_mode(void) | ||
652 | { | ||
653 | return (__raw_readl(PMB_PASCR) & PASCR_SE) == 0; | ||
365 | } | 654 | } |
366 | #endif /* CONFIG_PMB */ | ||
367 | 655 | ||
368 | static int pmb_seq_show(struct seq_file *file, void *iter) | 656 | static int pmb_seq_show(struct seq_file *file, void *iter) |
369 | { | 657 | { |
@@ -378,8 +666,8 @@ static int pmb_seq_show(struct seq_file *file, void *iter) | |||
378 | unsigned int size; | 666 | unsigned int size; |
379 | char *sz_str = NULL; | 667 | char *sz_str = NULL; |
380 | 668 | ||
381 | addr = ctrl_inl(mk_pmb_addr(i)); | 669 | addr = __raw_readl(mk_pmb_addr(i)); |
382 | data = ctrl_inl(mk_pmb_data(i)); | 670 | data = __raw_readl(mk_pmb_data(i)); |
383 | 671 | ||
384 | size = data & PMB_SZ_MASK; | 672 | size = data & PMB_SZ_MASK; |
385 | sz_str = (size == PMB_SZ_16M) ? " 16MB": | 673 | sz_str = (size == PMB_SZ_16M) ? " 16MB": |
@@ -437,14 +725,21 @@ static int pmb_sysdev_suspend(struct sys_device *dev, pm_message_t state) | |||
437 | if (state.event == PM_EVENT_ON && | 725 | if (state.event == PM_EVENT_ON && |
438 | prev_state.event == PM_EVENT_FREEZE) { | 726 | prev_state.event == PM_EVENT_FREEZE) { |
439 | struct pmb_entry *pmbe; | 727 | struct pmb_entry *pmbe; |
728 | |||
729 | read_lock(&pmb_rwlock); | ||
730 | |||
440 | for (i = 0; i < ARRAY_SIZE(pmb_entry_list); i++) { | 731 | for (i = 0; i < ARRAY_SIZE(pmb_entry_list); i++) { |
441 | if (test_bit(i, &pmb_map)) { | 732 | if (test_bit(i, pmb_map)) { |
442 | pmbe = &pmb_entry_list[i]; | 733 | pmbe = &pmb_entry_list[i]; |
443 | set_pmb_entry(pmbe); | 734 | set_pmb_entry(pmbe); |
444 | } | 735 | } |
445 | } | 736 | } |
737 | |||
738 | read_unlock(&pmb_rwlock); | ||
446 | } | 739 | } |
740 | |||
447 | prev_state = state; | 741 | prev_state = state; |
742 | |||
448 | return 0; | 743 | return 0; |
449 | } | 744 | } |
450 | 745 | ||
@@ -462,6 +757,5 @@ static int __init pmb_sysdev_init(void) | |||
462 | { | 757 | { |
463 | return sysdev_driver_register(&cpu_sysdev_class, &pmb_sysdev_driver); | 758 | return sysdev_driver_register(&cpu_sysdev_class, &pmb_sysdev_driver); |
464 | } | 759 | } |
465 | |||
466 | subsys_initcall(pmb_sysdev_init); | 760 | subsys_initcall(pmb_sysdev_init); |
467 | #endif | 761 | #endif |
diff --git a/arch/sh/mm/tlb-pteaex.c b/arch/sh/mm/tlb-pteaex.c index 409b7c2b4b9d..32dc674c550c 100644 --- a/arch/sh/mm/tlb-pteaex.c +++ b/arch/sh/mm/tlb-pteaex.c | |||
@@ -68,8 +68,7 @@ void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte) | |||
68 | * in extended mode, the legacy 8-bit ASID field in address array 1 has | 68 | * in extended mode, the legacy 8-bit ASID field in address array 1 has |
69 | * undefined behaviour. | 69 | * undefined behaviour. |
70 | */ | 70 | */ |
71 | void __uses_jump_to_uncached local_flush_tlb_one(unsigned long asid, | 71 | void local_flush_tlb_one(unsigned long asid, unsigned long page) |
72 | unsigned long page) | ||
73 | { | 72 | { |
74 | jump_to_uncached(); | 73 | jump_to_uncached(); |
75 | __raw_writel(page, MMU_UTLB_ADDRESS_ARRAY | MMU_PAGE_ASSOC_BIT); | 74 | __raw_writel(page, MMU_UTLB_ADDRESS_ARRAY | MMU_PAGE_ASSOC_BIT); |
diff --git a/arch/sh/mm/tlb-sh3.c b/arch/sh/mm/tlb-sh3.c index ace8e6d2f59d..4f5f7cbdd508 100644 --- a/arch/sh/mm/tlb-sh3.c +++ b/arch/sh/mm/tlb-sh3.c | |||
@@ -41,14 +41,14 @@ void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte) | |||
41 | 41 | ||
42 | /* Set PTEH register */ | 42 | /* Set PTEH register */ |
43 | vpn = (address & MMU_VPN_MASK) | get_asid(); | 43 | vpn = (address & MMU_VPN_MASK) | get_asid(); |
44 | ctrl_outl(vpn, MMU_PTEH); | 44 | __raw_writel(vpn, MMU_PTEH); |
45 | 45 | ||
46 | pteval = pte_val(pte); | 46 | pteval = pte_val(pte); |
47 | 47 | ||
48 | /* Set PTEL register */ | 48 | /* Set PTEL register */ |
49 | pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */ | 49 | pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */ |
50 | /* conveniently, we want all the software flags to be 0 anyway */ | 50 | /* conveniently, we want all the software flags to be 0 anyway */ |
51 | ctrl_outl(pteval, MMU_PTEL); | 51 | __raw_writel(pteval, MMU_PTEL); |
52 | 52 | ||
53 | /* Load the TLB */ | 53 | /* Load the TLB */ |
54 | asm volatile("ldtlb": /* no output */ : /* no input */ : "memory"); | 54 | asm volatile("ldtlb": /* no output */ : /* no input */ : "memory"); |
@@ -75,5 +75,5 @@ void local_flush_tlb_one(unsigned long asid, unsigned long page) | |||
75 | } | 75 | } |
76 | 76 | ||
77 | for (i = 0; i < ways; i++) | 77 | for (i = 0; i < ways; i++) |
78 | ctrl_outl(data, addr + (i << 8)); | 78 | __raw_writel(data, addr + (i << 8)); |
79 | } | 79 | } |
diff --git a/arch/sh/mm/tlb-sh4.c b/arch/sh/mm/tlb-sh4.c index 8cf550e2570f..ccac77f504a8 100644 --- a/arch/sh/mm/tlb-sh4.c +++ b/arch/sh/mm/tlb-sh4.c | |||
@@ -29,7 +29,7 @@ void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte) | |||
29 | 29 | ||
30 | /* Set PTEH register */ | 30 | /* Set PTEH register */ |
31 | vpn = (address & MMU_VPN_MASK) | get_asid(); | 31 | vpn = (address & MMU_VPN_MASK) | get_asid(); |
32 | ctrl_outl(vpn, MMU_PTEH); | 32 | __raw_writel(vpn, MMU_PTEH); |
33 | 33 | ||
34 | pteval = pte.pte_low; | 34 | pteval = pte.pte_low; |
35 | 35 | ||
@@ -41,13 +41,13 @@ void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte) | |||
41 | * the protection bits (with the exception of the compat-mode SZ | 41 | * the protection bits (with the exception of the compat-mode SZ |
42 | * and PR bits, which are cleared) being written out in PTEL. | 42 | * and PR bits, which are cleared) being written out in PTEL. |
43 | */ | 43 | */ |
44 | ctrl_outl(pte.pte_high, MMU_PTEA); | 44 | __raw_writel(pte.pte_high, MMU_PTEA); |
45 | #else | 45 | #else |
46 | if (cpu_data->flags & CPU_HAS_PTEA) { | 46 | if (cpu_data->flags & CPU_HAS_PTEA) { |
47 | /* The last 3 bits and the first one of pteval contains | 47 | /* The last 3 bits and the first one of pteval contains |
48 | * the PTEA timing control and space attribute bits | 48 | * the PTEA timing control and space attribute bits |
49 | */ | 49 | */ |
50 | ctrl_outl(copy_ptea_attributes(pteval), MMU_PTEA); | 50 | __raw_writel(copy_ptea_attributes(pteval), MMU_PTEA); |
51 | } | 51 | } |
52 | #endif | 52 | #endif |
53 | 53 | ||
@@ -57,15 +57,14 @@ void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte) | |||
57 | pteval |= _PAGE_WT; | 57 | pteval |= _PAGE_WT; |
58 | #endif | 58 | #endif |
59 | /* conveniently, we want all the software flags to be 0 anyway */ | 59 | /* conveniently, we want all the software flags to be 0 anyway */ |
60 | ctrl_outl(pteval, MMU_PTEL); | 60 | __raw_writel(pteval, MMU_PTEL); |
61 | 61 | ||
62 | /* Load the TLB */ | 62 | /* Load the TLB */ |
63 | asm volatile("ldtlb": /* no output */ : /* no input */ : "memory"); | 63 | asm volatile("ldtlb": /* no output */ : /* no input */ : "memory"); |
64 | local_irq_restore(flags); | 64 | local_irq_restore(flags); |
65 | } | 65 | } |
66 | 66 | ||
67 | void __uses_jump_to_uncached local_flush_tlb_one(unsigned long asid, | 67 | void local_flush_tlb_one(unsigned long asid, unsigned long page) |
68 | unsigned long page) | ||
69 | { | 68 | { |
70 | unsigned long addr, data; | 69 | unsigned long addr, data; |
71 | 70 | ||
@@ -78,6 +77,6 @@ void __uses_jump_to_uncached local_flush_tlb_one(unsigned long asid, | |||
78 | addr = MMU_UTLB_ADDRESS_ARRAY | MMU_PAGE_ASSOC_BIT; | 77 | addr = MMU_UTLB_ADDRESS_ARRAY | MMU_PAGE_ASSOC_BIT; |
79 | data = page | asid; /* VALID bit is off */ | 78 | data = page | asid; /* VALID bit is off */ |
80 | jump_to_uncached(); | 79 | jump_to_uncached(); |
81 | ctrl_outl(data, addr); | 80 | __raw_writel(data, addr); |
82 | back_to_cached(); | 81 | back_to_cached(); |
83 | } | 82 | } |
diff --git a/arch/sh/mm/tlb-sh5.c b/arch/sh/mm/tlb-sh5.c index fdb64e41ec50..f27dbe1c1599 100644 --- a/arch/sh/mm/tlb-sh5.c +++ b/arch/sh/mm/tlb-sh5.c | |||
@@ -143,3 +143,42 @@ void sh64_setup_tlb_slot(unsigned long long config_addr, unsigned long eaddr, | |||
143 | */ | 143 | */ |
144 | void sh64_teardown_tlb_slot(unsigned long long config_addr) | 144 | void sh64_teardown_tlb_slot(unsigned long long config_addr) |
145 | __attribute__ ((alias("__flush_tlb_slot"))); | 145 | __attribute__ ((alias("__flush_tlb_slot"))); |
146 | |||
147 | static int dtlb_entry; | ||
148 | static unsigned long long dtlb_entries[64]; | ||
149 | |||
150 | void tlb_wire_entry(struct vm_area_struct *vma, unsigned long addr, pte_t pte) | ||
151 | { | ||
152 | unsigned long long entry; | ||
153 | unsigned long paddr, flags; | ||
154 | |||
155 | BUG_ON(dtlb_entry == ARRAY_SIZE(dtlb_entries)); | ||
156 | |||
157 | local_irq_save(flags); | ||
158 | |||
159 | entry = sh64_get_wired_dtlb_entry(); | ||
160 | dtlb_entries[dtlb_entry++] = entry; | ||
161 | |||
162 | paddr = pte_val(pte) & _PAGE_FLAGS_HARDWARE_MASK; | ||
163 | paddr &= ~PAGE_MASK; | ||
164 | |||
165 | sh64_setup_tlb_slot(entry, addr, get_asid(), paddr); | ||
166 | |||
167 | local_irq_restore(flags); | ||
168 | } | ||
169 | |||
170 | void tlb_unwire_entry(void) | ||
171 | { | ||
172 | unsigned long long entry; | ||
173 | unsigned long flags; | ||
174 | |||
175 | BUG_ON(!dtlb_entry); | ||
176 | |||
177 | local_irq_save(flags); | ||
178 | entry = dtlb_entries[dtlb_entry--]; | ||
179 | |||
180 | sh64_teardown_tlb_slot(entry); | ||
181 | sh64_put_wired_dtlb_entry(entry); | ||
182 | |||
183 | local_irq_restore(flags); | ||
184 | } | ||
diff --git a/arch/sh/mm/tlb-urb.c b/arch/sh/mm/tlb-urb.c new file mode 100644 index 000000000000..bb5b9098956d --- /dev/null +++ b/arch/sh/mm/tlb-urb.c | |||
@@ -0,0 +1,81 @@ | |||
1 | /* | ||
2 | * arch/sh/mm/tlb-urb.c | ||
3 | * | ||
4 | * TLB entry wiring helpers for URB-equipped parts. | ||
5 | * | ||
6 | * Copyright (C) 2010 Matt Fleming | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file "COPYING" in the main directory of this archive | ||
10 | * for more details. | ||
11 | */ | ||
12 | #include <linux/mm.h> | ||
13 | #include <linux/io.h> | ||
14 | #include <asm/tlb.h> | ||
15 | #include <asm/mmu_context.h> | ||
16 | |||
17 | /* | ||
18 | * Load the entry for 'addr' into the TLB and wire the entry. | ||
19 | */ | ||
20 | void tlb_wire_entry(struct vm_area_struct *vma, unsigned long addr, pte_t pte) | ||
21 | { | ||
22 | unsigned long status, flags; | ||
23 | int urb; | ||
24 | |||
25 | local_irq_save(flags); | ||
26 | |||
27 | /* Load the entry into the TLB */ | ||
28 | __update_tlb(vma, addr, pte); | ||
29 | |||
30 | /* ... and wire it up. */ | ||
31 | status = __raw_readl(MMUCR); | ||
32 | urb = (status & MMUCR_URB) >> MMUCR_URB_SHIFT; | ||
33 | status &= ~MMUCR_URB; | ||
34 | |||
35 | /* | ||
36 | * Make sure we're not trying to wire the last TLB entry slot. | ||
37 | */ | ||
38 | BUG_ON(!--urb); | ||
39 | |||
40 | urb = urb % MMUCR_URB_NENTRIES; | ||
41 | |||
42 | status |= (urb << MMUCR_URB_SHIFT); | ||
43 | __raw_writel(status, MMUCR); | ||
44 | ctrl_barrier(); | ||
45 | |||
46 | local_irq_restore(flags); | ||
47 | } | ||
48 | |||
49 | /* | ||
50 | * Unwire the last wired TLB entry. | ||
51 | * | ||
52 | * It should also be noted that it is not possible to wire and unwire | ||
53 | * TLB entries in an arbitrary order. If you wire TLB entry N, followed | ||
54 | * by entry N+1, you must unwire entry N+1 first, then entry N. In this | ||
55 | * respect, it works like a stack or LIFO queue. | ||
56 | */ | ||
57 | void tlb_unwire_entry(void) | ||
58 | { | ||
59 | unsigned long status, flags; | ||
60 | int urb; | ||
61 | |||
62 | local_irq_save(flags); | ||
63 | |||
64 | status = __raw_readl(MMUCR); | ||
65 | urb = (status & MMUCR_URB) >> MMUCR_URB_SHIFT; | ||
66 | status &= ~MMUCR_URB; | ||
67 | |||
68 | /* | ||
69 | * Make sure we're not trying to unwire a TLB entry when none | ||
70 | * have been wired. | ||
71 | */ | ||
72 | BUG_ON(urb++ == MMUCR_URB_NENTRIES); | ||
73 | |||
74 | urb = urb % MMUCR_URB_NENTRIES; | ||
75 | |||
76 | status |= (urb << MMUCR_URB_SHIFT); | ||
77 | __raw_writel(status, MMUCR); | ||
78 | ctrl_barrier(); | ||
79 | |||
80 | local_irq_restore(flags); | ||
81 | } | ||
diff --git a/arch/sh/mm/tlbflush_32.c b/arch/sh/mm/tlbflush_32.c index 6f45c1f8a7fe..004bb3f25b5f 100644 --- a/arch/sh/mm/tlbflush_32.c +++ b/arch/sh/mm/tlbflush_32.c | |||
@@ -132,9 +132,9 @@ void local_flush_tlb_all(void) | |||
132 | * It's same position, bit #2. | 132 | * It's same position, bit #2. |
133 | */ | 133 | */ |
134 | local_irq_save(flags); | 134 | local_irq_save(flags); |
135 | status = ctrl_inl(MMUCR); | 135 | status = __raw_readl(MMUCR); |
136 | status |= 0x04; | 136 | status |= 0x04; |
137 | ctrl_outl(status, MMUCR); | 137 | __raw_writel(status, MMUCR); |
138 | ctrl_barrier(); | 138 | ctrl_barrier(); |
139 | local_irq_restore(flags); | 139 | local_irq_restore(flags); |
140 | } | 140 | } |
diff --git a/arch/sh/mm/tlbflush_64.c b/arch/sh/mm/tlbflush_64.c index de0b0e881823..706da1d3a67a 100644 --- a/arch/sh/mm/tlbflush_64.c +++ b/arch/sh/mm/tlbflush_64.c | |||
@@ -36,7 +36,7 @@ extern void die(const char *,struct pt_regs *,long); | |||
36 | 36 | ||
37 | static inline void print_prots(pgprot_t prot) | 37 | static inline void print_prots(pgprot_t prot) |
38 | { | 38 | { |
39 | printk("prot is 0x%08lx\n",pgprot_val(prot)); | 39 | printk("prot is 0x%016llx\n",pgprot_val(prot)); |
40 | 40 | ||
41 | printk("%s %s %s %s %s\n",PPROT(_PAGE_SHARED),PPROT(_PAGE_READ), | 41 | printk("%s %s %s %s %s\n",PPROT(_PAGE_SHARED),PPROT(_PAGE_READ), |
42 | PPROT(_PAGE_EXECUTE),PPROT(_PAGE_WRITE),PPROT(_PAGE_USER)); | 42 | PPROT(_PAGE_EXECUTE),PPROT(_PAGE_WRITE),PPROT(_PAGE_USER)); |
diff --git a/arch/sh/mm/uncached.c b/arch/sh/mm/uncached.c new file mode 100644 index 000000000000..cf20a5c5136a --- /dev/null +++ b/arch/sh/mm/uncached.c | |||
@@ -0,0 +1,34 @@ | |||
1 | #include <linux/init.h> | ||
2 | #include <asm/sizes.h> | ||
3 | #include <asm/page.h> | ||
4 | |||
5 | /* | ||
6 | * This is the offset of the uncached section from its cached alias. | ||
7 | * | ||
8 | * Legacy platforms handle trivial transitions between cached and | ||
9 | * uncached segments by making use of the 1:1 mapping relationship in | ||
10 | * 512MB lowmem, others via a special uncached mapping. | ||
11 | * | ||
12 | * Default value only valid in 29 bit mode, in 32bit mode this will be | ||
13 | * updated by the early PMB initialization code. | ||
14 | */ | ||
15 | unsigned long cached_to_uncached = SZ_512M; | ||
16 | unsigned long uncached_size = SZ_512M; | ||
17 | unsigned long uncached_start, uncached_end; | ||
18 | |||
19 | int virt_addr_uncached(unsigned long kaddr) | ||
20 | { | ||
21 | return (kaddr >= uncached_start) && (kaddr < uncached_end); | ||
22 | } | ||
23 | |||
24 | void __init uncached_init(void) | ||
25 | { | ||
26 | uncached_start = memory_end; | ||
27 | uncached_end = uncached_start + uncached_size; | ||
28 | } | ||
29 | |||
30 | void __init uncached_resize(unsigned long size) | ||
31 | { | ||
32 | uncached_size = size; | ||
33 | uncached_end = uncached_start + uncached_size; | ||
34 | } | ||
diff --git a/arch/sh/tools/mach-types b/arch/sh/tools/mach-types index 6639b25d8d57..b25aa554ee5e 100644 --- a/arch/sh/tools/mach-types +++ b/arch/sh/tools/mach-types | |||
@@ -32,6 +32,7 @@ DREAMCAST SH_DREAMCAST | |||
32 | SNAPGEAR SH_SECUREEDGE5410 | 32 | SNAPGEAR SH_SECUREEDGE5410 |
33 | EDOSK7705 SH_EDOSK7705 | 33 | EDOSK7705 SH_EDOSK7705 |
34 | EDOSK7760 SH_EDOSK7760 | 34 | EDOSK7760 SH_EDOSK7760 |
35 | SDK7786 SH_SDK7786 | ||
35 | SH4202_MICRODEV SH_SH4202_MICRODEV | 36 | SH4202_MICRODEV SH_SH4202_MICRODEV |
36 | SH03 SH_SH03 | 37 | SH03 SH_SH03 |
37 | LANDISK SH_LANDISK | 38 | LANDISK SH_LANDISK |
diff --git a/drivers/clocksource/sh_cmt.c b/drivers/clocksource/sh_cmt.c index 6b3e0c2f33e2..6fe4f7701188 100644 --- a/drivers/clocksource/sh_cmt.c +++ b/drivers/clocksource/sh_cmt.c | |||
@@ -603,18 +603,13 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev) | |||
603 | p->irqaction.handler = sh_cmt_interrupt; | 603 | p->irqaction.handler = sh_cmt_interrupt; |
604 | p->irqaction.dev_id = p; | 604 | p->irqaction.dev_id = p; |
605 | p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL; | 605 | p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL; |
606 | ret = setup_irq(irq, &p->irqaction); | ||
607 | if (ret) { | ||
608 | pr_err("sh_cmt: failed to request irq %d\n", irq); | ||
609 | goto err1; | ||
610 | } | ||
611 | 606 | ||
612 | /* get hold of clock */ | 607 | /* get hold of clock */ |
613 | p->clk = clk_get(&p->pdev->dev, cfg->clk); | 608 | p->clk = clk_get(&p->pdev->dev, cfg->clk); |
614 | if (IS_ERR(p->clk)) { | 609 | if (IS_ERR(p->clk)) { |
615 | pr_err("sh_cmt: cannot get clock \"%s\"\n", cfg->clk); | 610 | pr_err("sh_cmt: cannot get clock \"%s\"\n", cfg->clk); |
616 | ret = PTR_ERR(p->clk); | 611 | ret = PTR_ERR(p->clk); |
617 | goto err2; | 612 | goto err1; |
618 | } | 613 | } |
619 | 614 | ||
620 | if (resource_size(res) == 6) { | 615 | if (resource_size(res) == 6) { |
@@ -627,14 +622,25 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev) | |||
627 | p->clear_bits = ~0xc000; | 622 | p->clear_bits = ~0xc000; |
628 | } | 623 | } |
629 | 624 | ||
630 | return sh_cmt_register(p, cfg->name, | 625 | ret = sh_cmt_register(p, cfg->name, |
631 | cfg->clockevent_rating, | 626 | cfg->clockevent_rating, |
632 | cfg->clocksource_rating); | 627 | cfg->clocksource_rating); |
633 | err2: | 628 | if (ret) { |
634 | remove_irq(irq, &p->irqaction); | 629 | pr_err("sh_cmt: registration failed\n"); |
635 | err1: | 630 | goto err1; |
631 | } | ||
632 | |||
633 | ret = setup_irq(irq, &p->irqaction); | ||
634 | if (ret) { | ||
635 | pr_err("sh_cmt: failed to request irq %d\n", irq); | ||
636 | goto err1; | ||
637 | } | ||
638 | |||
639 | return 0; | ||
640 | |||
641 | err1: | ||
636 | iounmap(p->mapbase); | 642 | iounmap(p->mapbase); |
637 | err0: | 643 | err0: |
638 | return ret; | 644 | return ret; |
639 | } | 645 | } |
640 | 646 | ||
diff --git a/drivers/clocksource/sh_mtu2.c b/drivers/clocksource/sh_mtu2.c index 973e714d6051..4c8a759e60cd 100644 --- a/drivers/clocksource/sh_mtu2.c +++ b/drivers/clocksource/sh_mtu2.c | |||
@@ -221,15 +221,15 @@ static void sh_mtu2_register_clockevent(struct sh_mtu2_priv *p, | |||
221 | ced->cpumask = cpumask_of(0); | 221 | ced->cpumask = cpumask_of(0); |
222 | ced->set_mode = sh_mtu2_clock_event_mode; | 222 | ced->set_mode = sh_mtu2_clock_event_mode; |
223 | 223 | ||
224 | pr_info("sh_mtu2: %s used for clock events\n", ced->name); | ||
225 | clockevents_register_device(ced); | ||
226 | |||
224 | ret = setup_irq(p->irqaction.irq, &p->irqaction); | 227 | ret = setup_irq(p->irqaction.irq, &p->irqaction); |
225 | if (ret) { | 228 | if (ret) { |
226 | pr_err("sh_mtu2: failed to request irq %d\n", | 229 | pr_err("sh_mtu2: failed to request irq %d\n", |
227 | p->irqaction.irq); | 230 | p->irqaction.irq); |
228 | return; | 231 | return; |
229 | } | 232 | } |
230 | |||
231 | pr_info("sh_mtu2: %s used for clock events\n", ced->name); | ||
232 | clockevents_register_device(ced); | ||
233 | } | 233 | } |
234 | 234 | ||
235 | static int sh_mtu2_register(struct sh_mtu2_priv *p, char *name, | 235 | static int sh_mtu2_register(struct sh_mtu2_priv *p, char *name, |
diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c index 93c2322feab7..961f5b5ef6a3 100644 --- a/drivers/clocksource/sh_tmu.c +++ b/drivers/clocksource/sh_tmu.c | |||
@@ -323,15 +323,15 @@ static void sh_tmu_register_clockevent(struct sh_tmu_priv *p, | |||
323 | ced->set_next_event = sh_tmu_clock_event_next; | 323 | ced->set_next_event = sh_tmu_clock_event_next; |
324 | ced->set_mode = sh_tmu_clock_event_mode; | 324 | ced->set_mode = sh_tmu_clock_event_mode; |
325 | 325 | ||
326 | pr_info("sh_tmu: %s used for clock events\n", ced->name); | ||
327 | clockevents_register_device(ced); | ||
328 | |||
326 | ret = setup_irq(p->irqaction.irq, &p->irqaction); | 329 | ret = setup_irq(p->irqaction.irq, &p->irqaction); |
327 | if (ret) { | 330 | if (ret) { |
328 | pr_err("sh_tmu: failed to request irq %d\n", | 331 | pr_err("sh_tmu: failed to request irq %d\n", |
329 | p->irqaction.irq); | 332 | p->irqaction.irq); |
330 | return; | 333 | return; |
331 | } | 334 | } |
332 | |||
333 | pr_info("sh_tmu: %s used for clock events\n", ced->name); | ||
334 | clockevents_register_device(ced); | ||
335 | } | 335 | } |
336 | 336 | ||
337 | static int sh_tmu_register(struct sh_tmu_priv *p, char *name, | 337 | static int sh_tmu_register(struct sh_tmu_priv *p, char *name, |
diff --git a/drivers/dma/shdma.c b/drivers/dma/shdma.c index d10cc899c460..b75ce8b84c46 100644 --- a/drivers/dma/shdma.c +++ b/drivers/dma/shdma.c | |||
@@ -48,23 +48,20 @@ enum sh_dmae_desc_status { | |||
48 | */ | 48 | */ |
49 | #define RS_DEFAULT (RS_DUAL) | 49 | #define RS_DEFAULT (RS_DUAL) |
50 | 50 | ||
51 | /* A bitmask with bits enough for enum sh_dmae_slave_chan_id */ | ||
52 | static unsigned long sh_dmae_slave_used[BITS_TO_LONGS(SHDMA_SLAVE_NUMBER)]; | ||
53 | |||
51 | static void sh_dmae_chan_ld_cleanup(struct sh_dmae_chan *sh_chan, bool all); | 54 | static void sh_dmae_chan_ld_cleanup(struct sh_dmae_chan *sh_chan, bool all); |
52 | 55 | ||
53 | #define SH_DMAC_CHAN_BASE(id) (dma_base_addr[id]) | 56 | #define SH_DMAC_CHAN_BASE(id) (dma_base_addr[id]) |
54 | static void sh_dmae_writel(struct sh_dmae_chan *sh_dc, u32 data, u32 reg) | 57 | static void sh_dmae_writel(struct sh_dmae_chan *sh_dc, u32 data, u32 reg) |
55 | { | 58 | { |
56 | ctrl_outl(data, (SH_DMAC_CHAN_BASE(sh_dc->id) + reg)); | 59 | ctrl_outl(data, SH_DMAC_CHAN_BASE(sh_dc->id) + reg); |
57 | } | 60 | } |
58 | 61 | ||
59 | static u32 sh_dmae_readl(struct sh_dmae_chan *sh_dc, u32 reg) | 62 | static u32 sh_dmae_readl(struct sh_dmae_chan *sh_dc, u32 reg) |
60 | { | 63 | { |
61 | return ctrl_inl((SH_DMAC_CHAN_BASE(sh_dc->id) + reg)); | 64 | return ctrl_inl(SH_DMAC_CHAN_BASE(sh_dc->id) + reg); |
62 | } | ||
63 | |||
64 | static void dmae_init(struct sh_dmae_chan *sh_chan) | ||
65 | { | ||
66 | u32 chcr = RS_DEFAULT; /* default is DUAL mode */ | ||
67 | sh_dmae_writel(sh_chan, chcr, CHCR); | ||
68 | } | 65 | } |
69 | 66 | ||
70 | /* | 67 | /* |
@@ -95,27 +92,30 @@ static int sh_dmae_rst(int id) | |||
95 | return 0; | 92 | return 0; |
96 | } | 93 | } |
97 | 94 | ||
98 | static int dmae_is_busy(struct sh_dmae_chan *sh_chan) | 95 | static bool dmae_is_busy(struct sh_dmae_chan *sh_chan) |
99 | { | 96 | { |
100 | u32 chcr = sh_dmae_readl(sh_chan, CHCR); | 97 | u32 chcr = sh_dmae_readl(sh_chan, CHCR); |
101 | if (chcr & CHCR_DE) { | 98 | |
102 | if (!(chcr & CHCR_TE)) | 99 | if ((chcr & (CHCR_DE | CHCR_TE)) == CHCR_DE) |
103 | return -EBUSY; /* working */ | 100 | return true; /* working */ |
104 | } | 101 | |
105 | return 0; /* waiting */ | 102 | return false; /* waiting */ |
106 | } | 103 | } |
107 | 104 | ||
108 | static inline unsigned int calc_xmit_shift(struct sh_dmae_chan *sh_chan) | 105 | static unsigned int ts_shift[] = TS_SHIFT; |
106 | static inline unsigned int calc_xmit_shift(u32 chcr) | ||
109 | { | 107 | { |
110 | u32 chcr = sh_dmae_readl(sh_chan, CHCR); | 108 | int cnt = ((chcr & CHCR_TS_LOW_MASK) >> CHCR_TS_LOW_SHIFT) | |
111 | return ts_shift[(chcr & CHCR_TS_MASK) >> CHCR_TS_SHIFT]; | 109 | ((chcr & CHCR_TS_HIGH_MASK) >> CHCR_TS_HIGH_SHIFT); |
110 | |||
111 | return ts_shift[cnt]; | ||
112 | } | 112 | } |
113 | 113 | ||
114 | static void dmae_set_reg(struct sh_dmae_chan *sh_chan, struct sh_dmae_regs *hw) | 114 | static void dmae_set_reg(struct sh_dmae_chan *sh_chan, struct sh_dmae_regs *hw) |
115 | { | 115 | { |
116 | sh_dmae_writel(sh_chan, hw->sar, SAR); | 116 | sh_dmae_writel(sh_chan, hw->sar, SAR); |
117 | sh_dmae_writel(sh_chan, hw->dar, DAR); | 117 | sh_dmae_writel(sh_chan, hw->dar, DAR); |
118 | sh_dmae_writel(sh_chan, hw->tcr >> calc_xmit_shift(sh_chan), TCR); | 118 | sh_dmae_writel(sh_chan, hw->tcr >> sh_chan->xmit_shift, TCR); |
119 | } | 119 | } |
120 | 120 | ||
121 | static void dmae_start(struct sh_dmae_chan *sh_chan) | 121 | static void dmae_start(struct sh_dmae_chan *sh_chan) |
@@ -123,7 +123,7 @@ static void dmae_start(struct sh_dmae_chan *sh_chan) | |||
123 | u32 chcr = sh_dmae_readl(sh_chan, CHCR); | 123 | u32 chcr = sh_dmae_readl(sh_chan, CHCR); |
124 | 124 | ||
125 | chcr |= CHCR_DE | CHCR_IE; | 125 | chcr |= CHCR_DE | CHCR_IE; |
126 | sh_dmae_writel(sh_chan, chcr, CHCR); | 126 | sh_dmae_writel(sh_chan, chcr & ~CHCR_TE, CHCR); |
127 | } | 127 | } |
128 | 128 | ||
129 | static void dmae_halt(struct sh_dmae_chan *sh_chan) | 129 | static void dmae_halt(struct sh_dmae_chan *sh_chan) |
@@ -134,55 +134,50 @@ static void dmae_halt(struct sh_dmae_chan *sh_chan) | |||
134 | sh_dmae_writel(sh_chan, chcr, CHCR); | 134 | sh_dmae_writel(sh_chan, chcr, CHCR); |
135 | } | 135 | } |
136 | 136 | ||
137 | static void dmae_init(struct sh_dmae_chan *sh_chan) | ||
138 | { | ||
139 | u32 chcr = RS_DEFAULT; /* default is DUAL mode */ | ||
140 | sh_chan->xmit_shift = calc_xmit_shift(chcr); | ||
141 | sh_dmae_writel(sh_chan, chcr, CHCR); | ||
142 | } | ||
143 | |||
137 | static int dmae_set_chcr(struct sh_dmae_chan *sh_chan, u32 val) | 144 | static int dmae_set_chcr(struct sh_dmae_chan *sh_chan, u32 val) |
138 | { | 145 | { |
139 | int ret = dmae_is_busy(sh_chan); | ||
140 | /* When DMA was working, can not set data to CHCR */ | 146 | /* When DMA was working, can not set data to CHCR */ |
141 | if (ret) | 147 | if (dmae_is_busy(sh_chan)) |
142 | return ret; | 148 | return -EBUSY; |
143 | 149 | ||
150 | sh_chan->xmit_shift = calc_xmit_shift(val); | ||
144 | sh_dmae_writel(sh_chan, val, CHCR); | 151 | sh_dmae_writel(sh_chan, val, CHCR); |
152 | |||
145 | return 0; | 153 | return 0; |
146 | } | 154 | } |
147 | 155 | ||
148 | #define DMARS1_ADDR 0x04 | 156 | #define DMARS_SHIFT 8 |
149 | #define DMARS2_ADDR 0x08 | 157 | #define DMARS_CHAN_MSK 0x01 |
150 | #define DMARS_SHIFT 8 | ||
151 | #define DMARS_CHAN_MSK 0x01 | ||
152 | static int dmae_set_dmars(struct sh_dmae_chan *sh_chan, u16 val) | 158 | static int dmae_set_dmars(struct sh_dmae_chan *sh_chan, u16 val) |
153 | { | 159 | { |
154 | u32 addr; | 160 | u32 addr; |
155 | int shift = 0; | 161 | int shift = 0; |
156 | int ret = dmae_is_busy(sh_chan); | 162 | |
157 | if (ret) | 163 | if (dmae_is_busy(sh_chan)) |
158 | return ret; | 164 | return -EBUSY; |
159 | 165 | ||
160 | if (sh_chan->id & DMARS_CHAN_MSK) | 166 | if (sh_chan->id & DMARS_CHAN_MSK) |
161 | shift = DMARS_SHIFT; | 167 | shift = DMARS_SHIFT; |
162 | 168 | ||
163 | switch (sh_chan->id) { | 169 | if (sh_chan->id < 6) |
164 | /* DMARS0 */ | 170 | /* DMA0RS0 - DMA0RS2 */ |
165 | case 0: | 171 | addr = SH_DMARS_BASE0 + (sh_chan->id / 2) * 4; |
166 | case 1: | 172 | #ifdef SH_DMARS_BASE1 |
167 | addr = SH_DMARS_BASE; | 173 | else if (sh_chan->id < 12) |
168 | break; | 174 | /* DMA1RS0 - DMA1RS2 */ |
169 | /* DMARS1 */ | 175 | addr = SH_DMARS_BASE1 + ((sh_chan->id - 6) / 2) * 4; |
170 | case 2: | 176 | #endif |
171 | case 3: | 177 | else |
172 | addr = (SH_DMARS_BASE + DMARS1_ADDR); | ||
173 | break; | ||
174 | /* DMARS2 */ | ||
175 | case 4: | ||
176 | case 5: | ||
177 | addr = (SH_DMARS_BASE + DMARS2_ADDR); | ||
178 | break; | ||
179 | default: | ||
180 | return -EINVAL; | 178 | return -EINVAL; |
181 | } | ||
182 | 179 | ||
183 | ctrl_outw((val << shift) | | 180 | ctrl_outw((val << shift) | (ctrl_inw(addr) & (0xFF00 >> shift)), addr); |
184 | (ctrl_inw(addr) & (shift ? 0xFF00 : 0x00FF)), | ||
185 | addr); | ||
186 | 181 | ||
187 | return 0; | 182 | return 0; |
188 | } | 183 | } |
@@ -250,10 +245,53 @@ static struct sh_desc *sh_dmae_get_desc(struct sh_dmae_chan *sh_chan) | |||
250 | return NULL; | 245 | return NULL; |
251 | } | 246 | } |
252 | 247 | ||
248 | static struct sh_dmae_slave_config *sh_dmae_find_slave( | ||
249 | struct sh_dmae_chan *sh_chan, enum sh_dmae_slave_chan_id slave_id) | ||
250 | { | ||
251 | struct dma_device *dma_dev = sh_chan->common.device; | ||
252 | struct sh_dmae_device *shdev = container_of(dma_dev, | ||
253 | struct sh_dmae_device, common); | ||
254 | struct sh_dmae_pdata *pdata = &shdev->pdata; | ||
255 | int i; | ||
256 | |||
257 | if ((unsigned)slave_id >= SHDMA_SLAVE_NUMBER) | ||
258 | return NULL; | ||
259 | |||
260 | for (i = 0; i < pdata->config_num; i++) | ||
261 | if (pdata->config[i].slave_id == slave_id) | ||
262 | return pdata->config + i; | ||
263 | |||
264 | return NULL; | ||
265 | } | ||
266 | |||
253 | static int sh_dmae_alloc_chan_resources(struct dma_chan *chan) | 267 | static int sh_dmae_alloc_chan_resources(struct dma_chan *chan) |
254 | { | 268 | { |
255 | struct sh_dmae_chan *sh_chan = to_sh_chan(chan); | 269 | struct sh_dmae_chan *sh_chan = to_sh_chan(chan); |
256 | struct sh_desc *desc; | 270 | struct sh_desc *desc; |
271 | struct sh_dmae_slave *param = chan->private; | ||
272 | |||
273 | /* | ||
274 | * This relies on the guarantee from dmaengine that alloc_chan_resources | ||
275 | * never runs concurrently with itself or free_chan_resources. | ||
276 | */ | ||
277 | if (param) { | ||
278 | struct sh_dmae_slave_config *cfg; | ||
279 | |||
280 | cfg = sh_dmae_find_slave(sh_chan, param->slave_id); | ||
281 | if (!cfg) | ||
282 | return -EINVAL; | ||
283 | |||
284 | if (test_and_set_bit(param->slave_id, sh_dmae_slave_used)) | ||
285 | return -EBUSY; | ||
286 | |||
287 | param->config = cfg; | ||
288 | |||
289 | dmae_set_dmars(sh_chan, cfg->mid_rid); | ||
290 | dmae_set_chcr(sh_chan, cfg->chcr); | ||
291 | } else { | ||
292 | if ((sh_dmae_readl(sh_chan, CHCR) & 0x700) != 0x400) | ||
293 | dmae_set_chcr(sh_chan, RS_DEFAULT); | ||
294 | } | ||
257 | 295 | ||
258 | spin_lock_bh(&sh_chan->desc_lock); | 296 | spin_lock_bh(&sh_chan->desc_lock); |
259 | while (sh_chan->descs_allocated < NR_DESCS_PER_CHANNEL) { | 297 | while (sh_chan->descs_allocated < NR_DESCS_PER_CHANNEL) { |
@@ -286,10 +324,18 @@ static void sh_dmae_free_chan_resources(struct dma_chan *chan) | |||
286 | struct sh_desc *desc, *_desc; | 324 | struct sh_desc *desc, *_desc; |
287 | LIST_HEAD(list); | 325 | LIST_HEAD(list); |
288 | 326 | ||
327 | dmae_halt(sh_chan); | ||
328 | |||
289 | /* Prepared and not submitted descriptors can still be on the queue */ | 329 | /* Prepared and not submitted descriptors can still be on the queue */ |
290 | if (!list_empty(&sh_chan->ld_queue)) | 330 | if (!list_empty(&sh_chan->ld_queue)) |
291 | sh_dmae_chan_ld_cleanup(sh_chan, true); | 331 | sh_dmae_chan_ld_cleanup(sh_chan, true); |
292 | 332 | ||
333 | if (chan->private) { | ||
334 | /* The caller is holding dma_list_mutex */ | ||
335 | struct sh_dmae_slave *param = chan->private; | ||
336 | clear_bit(param->slave_id, sh_dmae_slave_used); | ||
337 | } | ||
338 | |||
293 | spin_lock_bh(&sh_chan->desc_lock); | 339 | spin_lock_bh(&sh_chan->desc_lock); |
294 | 340 | ||
295 | list_splice_init(&sh_chan->ld_free, &list); | 341 | list_splice_init(&sh_chan->ld_free, &list); |
@@ -301,23 +347,97 @@ static void sh_dmae_free_chan_resources(struct dma_chan *chan) | |||
301 | kfree(desc); | 347 | kfree(desc); |
302 | } | 348 | } |
303 | 349 | ||
304 | static struct dma_async_tx_descriptor *sh_dmae_prep_memcpy( | 350 | /** |
305 | struct dma_chan *chan, dma_addr_t dma_dest, dma_addr_t dma_src, | 351 | * sh_dmae_add_desc - get, set up and return one transfer descriptor |
306 | size_t len, unsigned long flags) | 352 | * @sh_chan: DMA channel |
353 | * @flags: DMA transfer flags | ||
354 | * @dest: destination DMA address, incremented when direction equals | ||
355 | * DMA_FROM_DEVICE or DMA_BIDIRECTIONAL | ||
356 | * @src: source DMA address, incremented when direction equals | ||
357 | * DMA_TO_DEVICE or DMA_BIDIRECTIONAL | ||
358 | * @len: DMA transfer length | ||
359 | * @first: if NULL, set to the current descriptor and cookie set to -EBUSY | ||
360 | * @direction: needed for slave DMA to decide which address to keep constant, | ||
361 | * equals DMA_BIDIRECTIONAL for MEMCPY | ||
362 | * Returns 0 or an error | ||
363 | * Locks: called with desc_lock held | ||
364 | */ | ||
365 | static struct sh_desc *sh_dmae_add_desc(struct sh_dmae_chan *sh_chan, | ||
366 | unsigned long flags, dma_addr_t *dest, dma_addr_t *src, size_t *len, | ||
367 | struct sh_desc **first, enum dma_data_direction direction) | ||
307 | { | 368 | { |
308 | struct sh_dmae_chan *sh_chan; | 369 | struct sh_desc *new; |
309 | struct sh_desc *first = NULL, *prev = NULL, *new; | ||
310 | size_t copy_size; | 370 | size_t copy_size; |
311 | LIST_HEAD(tx_list); | ||
312 | int chunks = (len + SH_DMA_TCR_MAX) / (SH_DMA_TCR_MAX + 1); | ||
313 | 371 | ||
314 | if (!chan) | 372 | if (!*len) |
315 | return NULL; | 373 | return NULL; |
316 | 374 | ||
317 | if (!len) | 375 | /* Allocate the link descriptor from the free list */ |
376 | new = sh_dmae_get_desc(sh_chan); | ||
377 | if (!new) { | ||
378 | dev_err(sh_chan->dev, "No free link descriptor available\n"); | ||
318 | return NULL; | 379 | return NULL; |
380 | } | ||
319 | 381 | ||
320 | sh_chan = to_sh_chan(chan); | 382 | copy_size = min(*len, (size_t)SH_DMA_TCR_MAX + 1); |
383 | |||
384 | new->hw.sar = *src; | ||
385 | new->hw.dar = *dest; | ||
386 | new->hw.tcr = copy_size; | ||
387 | |||
388 | if (!*first) { | ||
389 | /* First desc */ | ||
390 | new->async_tx.cookie = -EBUSY; | ||
391 | *first = new; | ||
392 | } else { | ||
393 | /* Other desc - invisible to the user */ | ||
394 | new->async_tx.cookie = -EINVAL; | ||
395 | } | ||
396 | |||
397 | dev_dbg(sh_chan->dev, | ||
398 | "chaining (%u/%u)@%x -> %x with %p, cookie %d, shift %d\n", | ||
399 | copy_size, *len, *src, *dest, &new->async_tx, | ||
400 | new->async_tx.cookie, sh_chan->xmit_shift); | ||
401 | |||
402 | new->mark = DESC_PREPARED; | ||
403 | new->async_tx.flags = flags; | ||
404 | new->direction = direction; | ||
405 | |||
406 | *len -= copy_size; | ||
407 | if (direction == DMA_BIDIRECTIONAL || direction == DMA_TO_DEVICE) | ||
408 | *src += copy_size; | ||
409 | if (direction == DMA_BIDIRECTIONAL || direction == DMA_FROM_DEVICE) | ||
410 | *dest += copy_size; | ||
411 | |||
412 | return new; | ||
413 | } | ||
414 | |||
415 | /* | ||
416 | * sh_dmae_prep_sg - prepare transfer descriptors from an SG list | ||
417 | * | ||
418 | * Common routine for public (MEMCPY) and slave DMA. The MEMCPY case is also | ||
419 | * converted to scatter-gather to guarantee consistent locking and a correct | ||
420 | * list manipulation. For slave DMA direction carries the usual meaning, and, | ||
421 | * logically, the SG list is RAM and the addr variable contains slave address, | ||
422 | * e.g., the FIFO I/O register. For MEMCPY direction equals DMA_BIDIRECTIONAL | ||
423 | * and the SG list contains only one element and points at the source buffer. | ||
424 | */ | ||
425 | static struct dma_async_tx_descriptor *sh_dmae_prep_sg(struct sh_dmae_chan *sh_chan, | ||
426 | struct scatterlist *sgl, unsigned int sg_len, dma_addr_t *addr, | ||
427 | enum dma_data_direction direction, unsigned long flags) | ||
428 | { | ||
429 | struct scatterlist *sg; | ||
430 | struct sh_desc *first = NULL, *new = NULL /* compiler... */; | ||
431 | LIST_HEAD(tx_list); | ||
432 | int chunks = 0; | ||
433 | int i; | ||
434 | |||
435 | if (!sg_len) | ||
436 | return NULL; | ||
437 | |||
438 | for_each_sg(sgl, sg, sg_len, i) | ||
439 | chunks += (sg_dma_len(sg) + SH_DMA_TCR_MAX) / | ||
440 | (SH_DMA_TCR_MAX + 1); | ||
321 | 441 | ||
322 | /* Have to lock the whole loop to protect against concurrent release */ | 442 | /* Have to lock the whole loop to protect against concurrent release */ |
323 | spin_lock_bh(&sh_chan->desc_lock); | 443 | spin_lock_bh(&sh_chan->desc_lock); |
@@ -333,49 +453,32 @@ static struct dma_async_tx_descriptor *sh_dmae_prep_memcpy( | |||
333 | * only during this function, then they are immediately spliced | 453 | * only during this function, then they are immediately spliced |
334 | * back onto the free list in form of a chain | 454 | * back onto the free list in form of a chain |
335 | */ | 455 | */ |
336 | do { | 456 | for_each_sg(sgl, sg, sg_len, i) { |
337 | /* Allocate the link descriptor from the free list */ | 457 | dma_addr_t sg_addr = sg_dma_address(sg); |
338 | new = sh_dmae_get_desc(sh_chan); | 458 | size_t len = sg_dma_len(sg); |
339 | if (!new) { | 459 | |
340 | dev_err(sh_chan->dev, | 460 | if (!len) |
341 | "No free memory for link descriptor\n"); | 461 | goto err_get_desc; |
342 | list_for_each_entry(new, &tx_list, node) | 462 | |
343 | new->mark = DESC_IDLE; | 463 | do { |
344 | list_splice(&tx_list, &sh_chan->ld_free); | 464 | dev_dbg(sh_chan->dev, "Add SG #%d@%p[%d], dma %llx\n", |
345 | spin_unlock_bh(&sh_chan->desc_lock); | 465 | i, sg, len, (unsigned long long)sg_addr); |
346 | return NULL; | 466 | |
347 | } | 467 | if (direction == DMA_FROM_DEVICE) |
348 | 468 | new = sh_dmae_add_desc(sh_chan, flags, | |
349 | copy_size = min(len, (size_t)SH_DMA_TCR_MAX + 1); | 469 | &sg_addr, addr, &len, &first, |
350 | 470 | direction); | |
351 | new->hw.sar = dma_src; | 471 | else |
352 | new->hw.dar = dma_dest; | 472 | new = sh_dmae_add_desc(sh_chan, flags, |
353 | new->hw.tcr = copy_size; | 473 | addr, &sg_addr, &len, &first, |
354 | if (!first) { | 474 | direction); |
355 | /* First desc */ | 475 | if (!new) |
356 | new->async_tx.cookie = -EBUSY; | 476 | goto err_get_desc; |
357 | first = new; | 477 | |
358 | } else { | 478 | new->chunks = chunks--; |
359 | /* Other desc - invisible to the user */ | 479 | list_add_tail(&new->node, &tx_list); |
360 | new->async_tx.cookie = -EINVAL; | 480 | } while (len); |
361 | } | 481 | } |
362 | |||
363 | dev_dbg(sh_chan->dev, | ||
364 | "chaining %u of %u with %p, dst %x, cookie %d\n", | ||
365 | copy_size, len, &new->async_tx, dma_dest, | ||
366 | new->async_tx.cookie); | ||
367 | |||
368 | new->mark = DESC_PREPARED; | ||
369 | new->async_tx.flags = flags; | ||
370 | new->chunks = chunks--; | ||
371 | |||
372 | prev = new; | ||
373 | len -= copy_size; | ||
374 | dma_src += copy_size; | ||
375 | dma_dest += copy_size; | ||
376 | /* Insert the link descriptor to the LD ring */ | ||
377 | list_add_tail(&new->node, &tx_list); | ||
378 | } while (len); | ||
379 | 482 | ||
380 | if (new != first) | 483 | if (new != first) |
381 | new->async_tx.cookie = -ENOSPC; | 484 | new->async_tx.cookie = -ENOSPC; |
@@ -386,6 +489,77 @@ static struct dma_async_tx_descriptor *sh_dmae_prep_memcpy( | |||
386 | spin_unlock_bh(&sh_chan->desc_lock); | 489 | spin_unlock_bh(&sh_chan->desc_lock); |
387 | 490 | ||
388 | return &first->async_tx; | 491 | return &first->async_tx; |
492 | |||
493 | err_get_desc: | ||
494 | list_for_each_entry(new, &tx_list, node) | ||
495 | new->mark = DESC_IDLE; | ||
496 | list_splice(&tx_list, &sh_chan->ld_free); | ||
497 | |||
498 | spin_unlock_bh(&sh_chan->desc_lock); | ||
499 | |||
500 | return NULL; | ||
501 | } | ||
502 | |||
503 | static struct dma_async_tx_descriptor *sh_dmae_prep_memcpy( | ||
504 | struct dma_chan *chan, dma_addr_t dma_dest, dma_addr_t dma_src, | ||
505 | size_t len, unsigned long flags) | ||
506 | { | ||
507 | struct sh_dmae_chan *sh_chan; | ||
508 | struct scatterlist sg; | ||
509 | |||
510 | if (!chan || !len) | ||
511 | return NULL; | ||
512 | |||
513 | chan->private = NULL; | ||
514 | |||
515 | sh_chan = to_sh_chan(chan); | ||
516 | |||
517 | sg_init_table(&sg, 1); | ||
518 | sg_set_page(&sg, pfn_to_page(PFN_DOWN(dma_src)), len, | ||
519 | offset_in_page(dma_src)); | ||
520 | sg_dma_address(&sg) = dma_src; | ||
521 | sg_dma_len(&sg) = len; | ||
522 | |||
523 | return sh_dmae_prep_sg(sh_chan, &sg, 1, &dma_dest, DMA_BIDIRECTIONAL, | ||
524 | flags); | ||
525 | } | ||
526 | |||
527 | static struct dma_async_tx_descriptor *sh_dmae_prep_slave_sg( | ||
528 | struct dma_chan *chan, struct scatterlist *sgl, unsigned int sg_len, | ||
529 | enum dma_data_direction direction, unsigned long flags) | ||
530 | { | ||
531 | struct sh_dmae_slave *param; | ||
532 | struct sh_dmae_chan *sh_chan; | ||
533 | |||
534 | if (!chan) | ||
535 | return NULL; | ||
536 | |||
537 | sh_chan = to_sh_chan(chan); | ||
538 | param = chan->private; | ||
539 | |||
540 | /* Someone calling slave DMA on a public channel? */ | ||
541 | if (!param || !sg_len) { | ||
542 | dev_warn(sh_chan->dev, "%s: bad parameter: %p, %d, %d\n", | ||
543 | __func__, param, sg_len, param ? param->slave_id : -1); | ||
544 | return NULL; | ||
545 | } | ||
546 | |||
547 | /* | ||
548 | * if (param != NULL), this is a successfully requested slave channel, | ||
549 | * therefore param->config != NULL too. | ||
550 | */ | ||
551 | return sh_dmae_prep_sg(sh_chan, sgl, sg_len, ¶m->config->addr, | ||
552 | direction, flags); | ||
553 | } | ||
554 | |||
555 | static void sh_dmae_terminate_all(struct dma_chan *chan) | ||
556 | { | ||
557 | struct sh_dmae_chan *sh_chan = to_sh_chan(chan); | ||
558 | |||
559 | if (!chan) | ||
560 | return; | ||
561 | |||
562 | sh_dmae_chan_ld_cleanup(sh_chan, true); | ||
389 | } | 563 | } |
390 | 564 | ||
391 | static dma_async_tx_callback __ld_cleanup(struct sh_dmae_chan *sh_chan, bool all) | 565 | static dma_async_tx_callback __ld_cleanup(struct sh_dmae_chan *sh_chan, bool all) |
@@ -419,7 +593,11 @@ static dma_async_tx_callback __ld_cleanup(struct sh_dmae_chan *sh_chan, bool all | |||
419 | cookie = tx->cookie; | 593 | cookie = tx->cookie; |
420 | 594 | ||
421 | if (desc->mark == DESC_COMPLETED && desc->chunks == 1) { | 595 | if (desc->mark == DESC_COMPLETED && desc->chunks == 1) { |
422 | BUG_ON(sh_chan->completed_cookie != desc->cookie - 1); | 596 | if (sh_chan->completed_cookie != desc->cookie - 1) |
597 | dev_dbg(sh_chan->dev, | ||
598 | "Completing cookie %d, expected %d\n", | ||
599 | desc->cookie, | ||
600 | sh_chan->completed_cookie + 1); | ||
423 | sh_chan->completed_cookie = desc->cookie; | 601 | sh_chan->completed_cookie = desc->cookie; |
424 | } | 602 | } |
425 | 603 | ||
@@ -492,7 +670,7 @@ static void sh_chan_xfer_ld_queue(struct sh_dmae_chan *sh_chan) | |||
492 | return; | 670 | return; |
493 | } | 671 | } |
494 | 672 | ||
495 | /* Find the first un-transfer desciptor */ | 673 | /* Find the first not transferred desciptor */ |
496 | list_for_each_entry(sd, &sh_chan->ld_queue, node) | 674 | list_for_each_entry(sd, &sh_chan->ld_queue, node) |
497 | if (sd->mark == DESC_SUBMITTED) { | 675 | if (sd->mark == DESC_SUBMITTED) { |
498 | /* Get the ld start address from ld_queue */ | 676 | /* Get the ld start address from ld_queue */ |
@@ -559,7 +737,7 @@ static irqreturn_t sh_dmae_err(int irq, void *data) | |||
559 | 737 | ||
560 | /* IRQ Multi */ | 738 | /* IRQ Multi */ |
561 | if (shdev->pdata.mode & SHDMA_MIX_IRQ) { | 739 | if (shdev->pdata.mode & SHDMA_MIX_IRQ) { |
562 | int cnt = 0; | 740 | int __maybe_unused cnt = 0; |
563 | switch (irq) { | 741 | switch (irq) { |
564 | #if defined(DMTE6_IRQ) && defined(DMAE1_IRQ) | 742 | #if defined(DMTE6_IRQ) && defined(DMAE1_IRQ) |
565 | case DMTE6_IRQ: | 743 | case DMTE6_IRQ: |
@@ -596,11 +774,14 @@ static void dmae_do_tasklet(unsigned long data) | |||
596 | struct sh_dmae_chan *sh_chan = (struct sh_dmae_chan *)data; | 774 | struct sh_dmae_chan *sh_chan = (struct sh_dmae_chan *)data; |
597 | struct sh_desc *desc; | 775 | struct sh_desc *desc; |
598 | u32 sar_buf = sh_dmae_readl(sh_chan, SAR); | 776 | u32 sar_buf = sh_dmae_readl(sh_chan, SAR); |
777 | u32 dar_buf = sh_dmae_readl(sh_chan, DAR); | ||
599 | 778 | ||
600 | spin_lock(&sh_chan->desc_lock); | 779 | spin_lock(&sh_chan->desc_lock); |
601 | list_for_each_entry(desc, &sh_chan->ld_queue, node) { | 780 | list_for_each_entry(desc, &sh_chan->ld_queue, node) { |
602 | if ((desc->hw.sar + desc->hw.tcr) == sar_buf && | 781 | if (desc->mark == DESC_SUBMITTED && |
603 | desc->mark == DESC_SUBMITTED) { | 782 | ((desc->direction == DMA_FROM_DEVICE && |
783 | (desc->hw.dar + desc->hw.tcr) == dar_buf) || | ||
784 | (desc->hw.sar + desc->hw.tcr) == sar_buf)) { | ||
604 | dev_dbg(sh_chan->dev, "done #%d@%p dst %u\n", | 785 | dev_dbg(sh_chan->dev, "done #%d@%p dst %u\n", |
605 | desc->async_tx.cookie, &desc->async_tx, | 786 | desc->async_tx.cookie, &desc->async_tx, |
606 | desc->hw.dar); | 787 | desc->hw.dar); |
@@ -673,7 +854,7 @@ static int __devinit sh_dmae_chan_probe(struct sh_dmae_device *shdev, int id) | |||
673 | } | 854 | } |
674 | 855 | ||
675 | snprintf(new_sh_chan->dev_id, sizeof(new_sh_chan->dev_id), | 856 | snprintf(new_sh_chan->dev_id, sizeof(new_sh_chan->dev_id), |
676 | "sh-dmae%d", new_sh_chan->id); | 857 | "sh-dmae%d", new_sh_chan->id); |
677 | 858 | ||
678 | /* set up channel irq */ | 859 | /* set up channel irq */ |
679 | err = request_irq(irq, &sh_dmae_interrupt, irqflags, | 860 | err = request_irq(irq, &sh_dmae_interrupt, irqflags, |
@@ -684,11 +865,6 @@ static int __devinit sh_dmae_chan_probe(struct sh_dmae_device *shdev, int id) | |||
684 | goto err_no_irq; | 865 | goto err_no_irq; |
685 | } | 866 | } |
686 | 867 | ||
687 | /* CHCR register control function */ | ||
688 | new_sh_chan->set_chcr = dmae_set_chcr; | ||
689 | /* DMARS register control function */ | ||
690 | new_sh_chan->set_dmars = dmae_set_dmars; | ||
691 | |||
692 | shdev->chan[id] = new_sh_chan; | 868 | shdev->chan[id] = new_sh_chan; |
693 | return 0; | 869 | return 0; |
694 | 870 | ||
@@ -759,12 +935,19 @@ static int __init sh_dmae_probe(struct platform_device *pdev) | |||
759 | INIT_LIST_HEAD(&shdev->common.channels); | 935 | INIT_LIST_HEAD(&shdev->common.channels); |
760 | 936 | ||
761 | dma_cap_set(DMA_MEMCPY, shdev->common.cap_mask); | 937 | dma_cap_set(DMA_MEMCPY, shdev->common.cap_mask); |
938 | dma_cap_set(DMA_SLAVE, shdev->common.cap_mask); | ||
939 | |||
762 | shdev->common.device_alloc_chan_resources | 940 | shdev->common.device_alloc_chan_resources |
763 | = sh_dmae_alloc_chan_resources; | 941 | = sh_dmae_alloc_chan_resources; |
764 | shdev->common.device_free_chan_resources = sh_dmae_free_chan_resources; | 942 | shdev->common.device_free_chan_resources = sh_dmae_free_chan_resources; |
765 | shdev->common.device_prep_dma_memcpy = sh_dmae_prep_memcpy; | 943 | shdev->common.device_prep_dma_memcpy = sh_dmae_prep_memcpy; |
766 | shdev->common.device_is_tx_complete = sh_dmae_is_complete; | 944 | shdev->common.device_is_tx_complete = sh_dmae_is_complete; |
767 | shdev->common.device_issue_pending = sh_dmae_memcpy_issue_pending; | 945 | shdev->common.device_issue_pending = sh_dmae_memcpy_issue_pending; |
946 | |||
947 | /* Compulsory for DMA_SLAVE fields */ | ||
948 | shdev->common.device_prep_slave_sg = sh_dmae_prep_slave_sg; | ||
949 | shdev->common.device_terminate_all = sh_dmae_terminate_all; | ||
950 | |||
768 | shdev->common.dev = &pdev->dev; | 951 | shdev->common.dev = &pdev->dev; |
769 | /* Default transfer size of 32 bytes requires 32-byte alignment */ | 952 | /* Default transfer size of 32 bytes requires 32-byte alignment */ |
770 | shdev->common.copy_align = 5; | 953 | shdev->common.copy_align = 5; |
diff --git a/drivers/dma/shdma.h b/drivers/dma/shdma.h index 108f1cffb6f5..7e227f3c87c4 100644 --- a/drivers/dma/shdma.h +++ b/drivers/dma/shdma.h | |||
@@ -29,6 +29,7 @@ struct sh_desc { | |||
29 | struct sh_dmae_regs hw; | 29 | struct sh_dmae_regs hw; |
30 | struct list_head node; | 30 | struct list_head node; |
31 | struct dma_async_tx_descriptor async_tx; | 31 | struct dma_async_tx_descriptor async_tx; |
32 | enum dma_data_direction direction; | ||
32 | dma_cookie_t cookie; | 33 | dma_cookie_t cookie; |
33 | int chunks; | 34 | int chunks; |
34 | int mark; | 35 | int mark; |
@@ -45,13 +46,9 @@ struct sh_dmae_chan { | |||
45 | struct device *dev; /* Channel device */ | 46 | struct device *dev; /* Channel device */ |
46 | struct tasklet_struct tasklet; /* Tasklet */ | 47 | struct tasklet_struct tasklet; /* Tasklet */ |
47 | int descs_allocated; /* desc count */ | 48 | int descs_allocated; /* desc count */ |
49 | int xmit_shift; /* log_2(bytes_per_xfer) */ | ||
48 | int id; /* Raw id of this channel */ | 50 | int id; /* Raw id of this channel */ |
49 | char dev_id[16]; /* unique name per DMAC of channel */ | 51 | char dev_id[16]; /* unique name per DMAC of channel */ |
50 | |||
51 | /* Set chcr */ | ||
52 | int (*set_chcr)(struct sh_dmae_chan *sh_chan, u32 regs); | ||
53 | /* Set DMA resource */ | ||
54 | int (*set_dmars)(struct sh_dmae_chan *sh_chan, u16 res); | ||
55 | }; | 52 | }; |
56 | 53 | ||
57 | struct sh_dmae_device { | 54 | struct sh_dmae_device { |
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index 677cd53f18c3..bb6465604235 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig | |||
@@ -457,10 +457,10 @@ config MTD_NAND_NOMADIK | |||
457 | 457 | ||
458 | config MTD_NAND_SH_FLCTL | 458 | config MTD_NAND_SH_FLCTL |
459 | tristate "Support for NAND on Renesas SuperH FLCTL" | 459 | tristate "Support for NAND on Renesas SuperH FLCTL" |
460 | depends on MTD_NAND && SUPERH && CPU_SUBTYPE_SH7723 | 460 | depends on MTD_NAND && SUPERH |
461 | help | 461 | help |
462 | Several Renesas SuperH CPU has FLCTL. This option enables support | 462 | Several Renesas SuperH CPU has FLCTL. This option enables support |
463 | for NAND Flash using FLCTL. This driver support SH7723. | 463 | for NAND Flash using FLCTL. |
464 | 464 | ||
465 | config MTD_NAND_DAVINCI | 465 | config MTD_NAND_DAVINCI |
466 | tristate "Support NAND on DaVinci SoC" | 466 | tristate "Support NAND on DaVinci SoC" |
diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c index 02bef21f2e4b..1842df8bdd93 100644 --- a/drivers/mtd/nand/sh_flctl.c +++ b/drivers/mtd/nand/sh_flctl.c | |||
@@ -1,10 +1,10 @@ | |||
1 | /* | 1 | /* |
2 | * SuperH FLCTL nand controller | 2 | * SuperH FLCTL nand controller |
3 | * | 3 | * |
4 | * Copyright © 2008 Renesas Solutions Corp. | 4 | * Copyright (c) 2008 Renesas Solutions Corp. |
5 | * Copyright © 2008 Atom Create Engineering Co., Ltd. | 5 | * Copyright (c) 2008 Atom Create Engineering Co., Ltd. |
6 | * | 6 | * |
7 | * Based on fsl_elbc_nand.c, Copyright © 2006-2007 Freescale Semiconductor | 7 | * Based on fsl_elbc_nand.c, Copyright (c) 2006-2007 Freescale Semiconductor |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or modify | 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 | 10 | * it under the terms of the GNU General Public License as published by |
@@ -75,6 +75,11 @@ static void start_translation(struct sh_flctl *flctl) | |||
75 | writeb(TRSTRT, FLTRCR(flctl)); | 75 | writeb(TRSTRT, FLTRCR(flctl)); |
76 | } | 76 | } |
77 | 77 | ||
78 | static void timeout_error(struct sh_flctl *flctl, const char *str) | ||
79 | { | ||
80 | dev_err(&flctl->pdev->dev, "Timeout occured in %s\n", str); | ||
81 | } | ||
82 | |||
78 | static void wait_completion(struct sh_flctl *flctl) | 83 | static void wait_completion(struct sh_flctl *flctl) |
79 | { | 84 | { |
80 | uint32_t timeout = LOOP_TIMEOUT_MAX; | 85 | uint32_t timeout = LOOP_TIMEOUT_MAX; |
@@ -87,7 +92,7 @@ static void wait_completion(struct sh_flctl *flctl) | |||
87 | udelay(1); | 92 | udelay(1); |
88 | } | 93 | } |
89 | 94 | ||
90 | printk(KERN_ERR "wait_completion(): Timeout occured \n"); | 95 | timeout_error(flctl, __func__); |
91 | writeb(0x0, FLTRCR(flctl)); | 96 | writeb(0x0, FLTRCR(flctl)); |
92 | } | 97 | } |
93 | 98 | ||
@@ -100,6 +105,8 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr) | |||
100 | addr = page_addr; /* ERASE1 */ | 105 | addr = page_addr; /* ERASE1 */ |
101 | } else if (page_addr != -1) { | 106 | } else if (page_addr != -1) { |
102 | /* SEQIN, READ0, etc.. */ | 107 | /* SEQIN, READ0, etc.. */ |
108 | if (flctl->chip.options & NAND_BUSWIDTH_16) | ||
109 | column >>= 1; | ||
103 | if (flctl->page_size) { | 110 | if (flctl->page_size) { |
104 | addr = column & 0x0FFF; | 111 | addr = column & 0x0FFF; |
105 | addr |= (page_addr & 0xff) << 16; | 112 | addr |= (page_addr & 0xff) << 16; |
@@ -132,7 +139,7 @@ static void wait_rfifo_ready(struct sh_flctl *flctl) | |||
132 | return; | 139 | return; |
133 | udelay(1); | 140 | udelay(1); |
134 | } | 141 | } |
135 | printk(KERN_ERR "wait_rfifo_ready(): Timeout occured \n"); | 142 | timeout_error(flctl, __func__); |
136 | } | 143 | } |
137 | 144 | ||
138 | static void wait_wfifo_ready(struct sh_flctl *flctl) | 145 | static void wait_wfifo_ready(struct sh_flctl *flctl) |
@@ -146,7 +153,7 @@ static void wait_wfifo_ready(struct sh_flctl *flctl) | |||
146 | return; | 153 | return; |
147 | udelay(1); | 154 | udelay(1); |
148 | } | 155 | } |
149 | printk(KERN_ERR "wait_wfifo_ready(): Timeout occured \n"); | 156 | timeout_error(flctl, __func__); |
150 | } | 157 | } |
151 | 158 | ||
152 | static int wait_recfifo_ready(struct sh_flctl *flctl, int sector_number) | 159 | static int wait_recfifo_ready(struct sh_flctl *flctl, int sector_number) |
@@ -198,7 +205,7 @@ static int wait_recfifo_ready(struct sh_flctl *flctl, int sector_number) | |||
198 | writel(0, FL4ECCCR(flctl)); | 205 | writel(0, FL4ECCCR(flctl)); |
199 | } | 206 | } |
200 | 207 | ||
201 | printk(KERN_ERR "wait_recfifo_ready(): Timeout occured \n"); | 208 | timeout_error(flctl, __func__); |
202 | return 1; /* timeout */ | 209 | return 1; /* timeout */ |
203 | } | 210 | } |
204 | 211 | ||
@@ -214,7 +221,7 @@ static void wait_wecfifo_ready(struct sh_flctl *flctl) | |||
214 | return; | 221 | return; |
215 | udelay(1); | 222 | udelay(1); |
216 | } | 223 | } |
217 | printk(KERN_ERR "wait_wecfifo_ready(): Timeout occured \n"); | 224 | timeout_error(flctl, __func__); |
218 | } | 225 | } |
219 | 226 | ||
220 | static void read_datareg(struct sh_flctl *flctl, int offset) | 227 | static void read_datareg(struct sh_flctl *flctl, int offset) |
@@ -275,7 +282,7 @@ static void write_fiforeg(struct sh_flctl *flctl, int rlen, int offset) | |||
275 | static void set_cmd_regs(struct mtd_info *mtd, uint32_t cmd, uint32_t flcmcdr_val) | 282 | static void set_cmd_regs(struct mtd_info *mtd, uint32_t cmd, uint32_t flcmcdr_val) |
276 | { | 283 | { |
277 | struct sh_flctl *flctl = mtd_to_flctl(mtd); | 284 | struct sh_flctl *flctl = mtd_to_flctl(mtd); |
278 | uint32_t flcmncr_val = readl(FLCMNCR(flctl)); | 285 | uint32_t flcmncr_val = readl(FLCMNCR(flctl)) & ~SEL_16BIT; |
279 | uint32_t flcmdcr_val, addr_len_bytes = 0; | 286 | uint32_t flcmdcr_val, addr_len_bytes = 0; |
280 | 287 | ||
281 | /* Set SNAND bit if page size is 2048byte */ | 288 | /* Set SNAND bit if page size is 2048byte */ |
@@ -297,6 +304,8 @@ static void set_cmd_regs(struct mtd_info *mtd, uint32_t cmd, uint32_t flcmcdr_va | |||
297 | case NAND_CMD_READOOB: | 304 | case NAND_CMD_READOOB: |
298 | addr_len_bytes = flctl->rw_ADRCNT; | 305 | addr_len_bytes = flctl->rw_ADRCNT; |
299 | flcmdcr_val |= CDSRC_E; | 306 | flcmdcr_val |= CDSRC_E; |
307 | if (flctl->chip.options & NAND_BUSWIDTH_16) | ||
308 | flcmncr_val |= SEL_16BIT; | ||
300 | break; | 309 | break; |
301 | case NAND_CMD_SEQIN: | 310 | case NAND_CMD_SEQIN: |
302 | /* This case is that cmd is READ0 or READ1 or READ00 */ | 311 | /* This case is that cmd is READ0 or READ1 or READ00 */ |
@@ -305,6 +314,8 @@ static void set_cmd_regs(struct mtd_info *mtd, uint32_t cmd, uint32_t flcmcdr_va | |||
305 | case NAND_CMD_PAGEPROG: | 314 | case NAND_CMD_PAGEPROG: |
306 | addr_len_bytes = flctl->rw_ADRCNT; | 315 | addr_len_bytes = flctl->rw_ADRCNT; |
307 | flcmdcr_val |= DOCMD2_E | CDSRC_E | SELRW; | 316 | flcmdcr_val |= DOCMD2_E | CDSRC_E | SELRW; |
317 | if (flctl->chip.options & NAND_BUSWIDTH_16) | ||
318 | flcmncr_val |= SEL_16BIT; | ||
308 | break; | 319 | break; |
309 | case NAND_CMD_READID: | 320 | case NAND_CMD_READID: |
310 | flcmncr_val &= ~SNAND_E; | 321 | flcmncr_val &= ~SNAND_E; |
@@ -523,6 +534,8 @@ static void flctl_cmdfunc(struct mtd_info *mtd, unsigned int command, | |||
523 | set_addr(mtd, 0, page_addr); | 534 | set_addr(mtd, 0, page_addr); |
524 | 535 | ||
525 | flctl->read_bytes = mtd->writesize + mtd->oobsize; | 536 | flctl->read_bytes = mtd->writesize + mtd->oobsize; |
537 | if (flctl->chip.options & NAND_BUSWIDTH_16) | ||
538 | column >>= 1; | ||
526 | flctl->index += column; | 539 | flctl->index += column; |
527 | goto read_normal_exit; | 540 | goto read_normal_exit; |
528 | 541 | ||
@@ -686,6 +699,18 @@ static uint8_t flctl_read_byte(struct mtd_info *mtd) | |||
686 | return data; | 699 | return data; |
687 | } | 700 | } |
688 | 701 | ||
702 | static uint16_t flctl_read_word(struct mtd_info *mtd) | ||
703 | { | ||
704 | struct sh_flctl *flctl = mtd_to_flctl(mtd); | ||
705 | int index = flctl->index; | ||
706 | uint16_t data; | ||
707 | uint16_t *buf = (uint16_t *)&flctl->done_buff[index]; | ||
708 | |||
709 | data = *buf; | ||
710 | flctl->index += 2; | ||
711 | return data; | ||
712 | } | ||
713 | |||
689 | static void flctl_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) | 714 | static void flctl_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) |
690 | { | 715 | { |
691 | int i; | 716 | int i; |
@@ -769,38 +794,36 @@ static int flctl_chip_init_tail(struct mtd_info *mtd) | |||
769 | return 0; | 794 | return 0; |
770 | } | 795 | } |
771 | 796 | ||
772 | static int __init flctl_probe(struct platform_device *pdev) | 797 | static int __devinit flctl_probe(struct platform_device *pdev) |
773 | { | 798 | { |
774 | struct resource *res; | 799 | struct resource *res; |
775 | struct sh_flctl *flctl; | 800 | struct sh_flctl *flctl; |
776 | struct mtd_info *flctl_mtd; | 801 | struct mtd_info *flctl_mtd; |
777 | struct nand_chip *nand; | 802 | struct nand_chip *nand; |
778 | struct sh_flctl_platform_data *pdata; | 803 | struct sh_flctl_platform_data *pdata; |
779 | int ret; | 804 | int ret = -ENXIO; |
780 | 805 | ||
781 | pdata = pdev->dev.platform_data; | 806 | pdata = pdev->dev.platform_data; |
782 | if (pdata == NULL) { | 807 | if (pdata == NULL) { |
783 | printk(KERN_ERR "sh_flctl platform_data not found.\n"); | 808 | dev_err(&pdev->dev, "no platform data defined\n"); |
784 | return -ENODEV; | 809 | return -EINVAL; |
785 | } | 810 | } |
786 | 811 | ||
787 | flctl = kzalloc(sizeof(struct sh_flctl), GFP_KERNEL); | 812 | flctl = kzalloc(sizeof(struct sh_flctl), GFP_KERNEL); |
788 | if (!flctl) { | 813 | if (!flctl) { |
789 | printk(KERN_ERR "Unable to allocate NAND MTD dev structure.\n"); | 814 | dev_err(&pdev->dev, "failed to allocate driver data\n"); |
790 | return -ENOMEM; | 815 | return -ENOMEM; |
791 | } | 816 | } |
792 | 817 | ||
793 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 818 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
794 | if (!res) { | 819 | if (!res) { |
795 | printk(KERN_ERR "%s: resource not found.\n", __func__); | 820 | dev_err(&pdev->dev, "failed to get I/O memory\n"); |
796 | ret = -ENODEV; | ||
797 | goto err; | 821 | goto err; |
798 | } | 822 | } |
799 | 823 | ||
800 | flctl->reg = ioremap(res->start, res->end - res->start + 1); | 824 | flctl->reg = ioremap(res->start, resource_size(res)); |
801 | if (flctl->reg == NULL) { | 825 | if (flctl->reg == NULL) { |
802 | printk(KERN_ERR "%s: ioremap error.\n", __func__); | 826 | dev_err(&pdev->dev, "failed to remap I/O memory\n"); |
803 | ret = -ENOMEM; | ||
804 | goto err; | 827 | goto err; |
805 | } | 828 | } |
806 | 829 | ||
@@ -808,6 +831,7 @@ static int __init flctl_probe(struct platform_device *pdev) | |||
808 | flctl_mtd = &flctl->mtd; | 831 | flctl_mtd = &flctl->mtd; |
809 | nand = &flctl->chip; | 832 | nand = &flctl->chip; |
810 | flctl_mtd->priv = nand; | 833 | flctl_mtd->priv = nand; |
834 | flctl->pdev = pdev; | ||
811 | flctl->hwecc = pdata->has_hwecc; | 835 | flctl->hwecc = pdata->has_hwecc; |
812 | 836 | ||
813 | flctl_register_init(flctl, pdata->flcmncr_val); | 837 | flctl_register_init(flctl, pdata->flcmncr_val); |
@@ -825,6 +849,11 @@ static int __init flctl_probe(struct platform_device *pdev) | |||
825 | nand->select_chip = flctl_select_chip; | 849 | nand->select_chip = flctl_select_chip; |
826 | nand->cmdfunc = flctl_cmdfunc; | 850 | nand->cmdfunc = flctl_cmdfunc; |
827 | 851 | ||
852 | if (pdata->flcmncr_val & SEL_16BIT) { | ||
853 | nand->options |= NAND_BUSWIDTH_16; | ||
854 | nand->read_word = flctl_read_word; | ||
855 | } | ||
856 | |||
828 | ret = nand_scan_ident(flctl_mtd, 1); | 857 | ret = nand_scan_ident(flctl_mtd, 1); |
829 | if (ret) | 858 | if (ret) |
830 | goto err; | 859 | goto err; |
@@ -846,7 +875,7 @@ err: | |||
846 | return ret; | 875 | return ret; |
847 | } | 876 | } |
848 | 877 | ||
849 | static int __exit flctl_remove(struct platform_device *pdev) | 878 | static int __devexit flctl_remove(struct platform_device *pdev) |
850 | { | 879 | { |
851 | struct sh_flctl *flctl = platform_get_drvdata(pdev); | 880 | struct sh_flctl *flctl = platform_get_drvdata(pdev); |
852 | 881 | ||
diff --git a/drivers/serial/sh-sci.h b/drivers/serial/sh-sci.h index 0efcded59ae6..f7d2589926d2 100644 --- a/drivers/serial/sh-sci.h +++ b/drivers/serial/sh-sci.h | |||
@@ -518,34 +518,6 @@ static inline int sci_rxd_in(struct uart_port *port) | |||
518 | { | 518 | { |
519 | if (port->mapbase == 0xfffffe80) | 519 | if (port->mapbase == 0xfffffe80) |
520 | return __raw_readb(SCPDR)&0x01 ? 1 : 0; /* SCI */ | 520 | return __raw_readb(SCPDR)&0x01 ? 1 : 0; /* SCI */ |
521 | if (port->mapbase == 0xa4000150) | ||
522 | return __raw_readb(SCPDR)&0x10 ? 1 : 0; /* SCIF */ | ||
523 | if (port->mapbase == 0xa4000140) | ||
524 | return __raw_readb(SCPDR)&0x04 ? 1 : 0; /* IRDA */ | ||
525 | return 1; | ||
526 | } | ||
527 | #elif defined(CONFIG_CPU_SUBTYPE_SH7705) | ||
528 | static inline int sci_rxd_in(struct uart_port *port) | ||
529 | { | ||
530 | if (port->mapbase == SCIF0) | ||
531 | return __raw_readb(SCPDR)&0x04 ? 1 : 0; /* IRDA */ | ||
532 | if (port->mapbase == SCIF2) | ||
533 | return __raw_readb(SCPDR)&0x10 ? 1 : 0; /* SCIF */ | ||
534 | return 1; | ||
535 | } | ||
536 | #elif defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712) | ||
537 | static inline int sci_rxd_in(struct uart_port *port) | ||
538 | { | ||
539 | return sci_in(port,SCxSR)&0x0010 ? 1 : 0; | ||
540 | } | ||
541 | #elif defined(CONFIG_CPU_SUBTYPE_SH7720) || \ | ||
542 | defined(CONFIG_CPU_SUBTYPE_SH7721) | ||
543 | static inline int sci_rxd_in(struct uart_port *port) | ||
544 | { | ||
545 | if (port->mapbase == 0xa4430000) | ||
546 | return sci_in(port, SCxSR) & 0x0003 ? 1 : 0; | ||
547 | else if (port->mapbase == 0xa4438000) | ||
548 | return sci_in(port, SCxSR) & 0x0003 ? 1 : 0; | ||
549 | return 1; | 521 | return 1; |
550 | } | 522 | } |
551 | #elif defined(CONFIG_CPU_SUBTYPE_SH7750) || \ | 523 | #elif defined(CONFIG_CPU_SUBTYPE_SH7750) || \ |
@@ -558,207 +530,17 @@ static inline int sci_rxd_in(struct uart_port *port) | |||
558 | { | 530 | { |
559 | if (port->mapbase == 0xffe00000) | 531 | if (port->mapbase == 0xffe00000) |
560 | return __raw_readb(SCSPTR1)&0x01 ? 1 : 0; /* SCI */ | 532 | return __raw_readb(SCSPTR1)&0x01 ? 1 : 0; /* SCI */ |
561 | if (port->mapbase == 0xffe80000) | ||
562 | return __raw_readw(SCSPTR2)&0x0001 ? 1 : 0; /* SCIF */ | ||
563 | return 1; | ||
564 | } | ||
565 | #elif defined(CONFIG_CPU_SUBTYPE_SH4_202) | ||
566 | static inline int sci_rxd_in(struct uart_port *port) | ||
567 | { | ||
568 | if (port->mapbase == 0xffe80000) | ||
569 | return __raw_readw(SCSPTR2)&0x0001 ? 1 : 0; /* SCIF */ | ||
570 | return 1; | 533 | return 1; |
571 | } | 534 | } |
572 | #elif defined(CONFIG_CPU_SUBTYPE_SH7757) | ||
573 | static inline int sci_rxd_in(struct uart_port *port) | ||
574 | { | ||
575 | if (port->mapbase == 0xfe4b0000) | ||
576 | return __raw_readw(SCSPTR0) & 0x0001 ? 1 : 0; | ||
577 | if (port->mapbase == 0xfe4c0000) | ||
578 | return __raw_readw(SCSPTR1) & 0x0001 ? 1 : 0; | ||
579 | if (port->mapbase == 0xfe4d0000) | ||
580 | return __raw_readw(SCSPTR2) & 0x0001 ? 1 : 0; | ||
581 | } | ||
582 | #elif defined(CONFIG_CPU_SUBTYPE_SH7760) | ||
583 | static inline int sci_rxd_in(struct uart_port *port) | ||
584 | { | ||
585 | if (port->mapbase == 0xfe600000) | ||
586 | return __raw_readw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */ | ||
587 | if (port->mapbase == 0xfe610000) | ||
588 | return __raw_readw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */ | ||
589 | if (port->mapbase == 0xfe620000) | ||
590 | return __raw_readw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */ | ||
591 | return 1; | ||
592 | } | ||
593 | #elif defined(CONFIG_CPU_SUBTYPE_SH7343) | ||
594 | static inline int sci_rxd_in(struct uart_port *port) | ||
595 | { | ||
596 | if (port->mapbase == 0xffe00000) | ||
597 | return __raw_readw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */ | ||
598 | if (port->mapbase == 0xffe10000) | ||
599 | return __raw_readw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */ | ||
600 | if (port->mapbase == 0xffe20000) | ||
601 | return __raw_readw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */ | ||
602 | if (port->mapbase == 0xffe30000) | ||
603 | return __raw_readw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */ | ||
604 | return 1; | ||
605 | } | ||
606 | #elif defined(CONFIG_CPU_SUBTYPE_SH7366) | ||
607 | static inline int sci_rxd_in(struct uart_port *port) | ||
608 | { | ||
609 | if (port->mapbase == 0xffe00000) | ||
610 | return __raw_readb(SCPDR0) & 0x0001 ? 1 : 0; /* SCIF0 */ | ||
611 | return 1; | ||
612 | } | ||
613 | #elif defined(CONFIG_CPU_SUBTYPE_SH7722) | ||
614 | static inline int sci_rxd_in(struct uart_port *port) | ||
615 | { | ||
616 | if (port->mapbase == 0xffe00000) | ||
617 | return __raw_readb(PSDR) & 0x02 ? 1 : 0; /* SCIF0 */ | ||
618 | if (port->mapbase == 0xffe10000) | ||
619 | return __raw_readb(PADR) & 0x40 ? 1 : 0; /* SCIF1 */ | ||
620 | if (port->mapbase == 0xffe20000) | ||
621 | return __raw_readb(PWDR) & 0x04 ? 1 : 0; /* SCIF2 */ | ||
622 | |||
623 | return 1; | ||
624 | } | ||
625 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) | ||
626 | static inline int sci_rxd_in(struct uart_port *port) | ||
627 | { | ||
628 | if (port->mapbase == 0xffe00000) | ||
629 | return __raw_readb(SCSPTR0) & 0x0008 ? 1 : 0; /* SCIF0 */ | ||
630 | if (port->mapbase == 0xffe10000) | ||
631 | return __raw_readb(SCSPTR1) & 0x0020 ? 1 : 0; /* SCIF1 */ | ||
632 | if (port->mapbase == 0xffe20000) | ||
633 | return __raw_readb(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF2 */ | ||
634 | if (port->mapbase == 0xa4e30000) | ||
635 | return __raw_readb(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF3 */ | ||
636 | if (port->mapbase == 0xa4e40000) | ||
637 | return __raw_readb(SCSPTR4) & 0x0001 ? 1 : 0; /* SCIF4 */ | ||
638 | if (port->mapbase == 0xa4e50000) | ||
639 | return __raw_readb(SCSPTR5) & 0x0008 ? 1 : 0; /* SCIF5 */ | ||
640 | return 1; | ||
641 | } | ||
642 | #elif defined(CONFIG_CPU_SUBTYPE_SH7724) | ||
643 | # define SCFSR 0x0010 | ||
644 | # define SCASSR 0x0014 | ||
645 | static inline int sci_rxd_in(struct uart_port *port) | ||
646 | { | ||
647 | if (port->type == PORT_SCIF) | ||
648 | return __raw_readw((port->mapbase + SCFSR)) & SCIF_BRK ? 1 : 0; | ||
649 | if (port->type == PORT_SCIFA) | ||
650 | return __raw_readw((port->mapbase + SCASSR)) & SCIF_BRK ? 1 : 0; | ||
651 | return 1; | ||
652 | } | ||
653 | #elif defined(CONFIG_CPU_SUBTYPE_SH5_101) || defined(CONFIG_CPU_SUBTYPE_SH5_103) | ||
654 | static inline int sci_rxd_in(struct uart_port *port) | ||
655 | { | ||
656 | return sci_in(port, SCSPTR)&0x0001 ? 1 : 0; /* SCIF */ | ||
657 | } | ||
658 | #elif defined(__H8300H__) || defined(__H8300S__) | 535 | #elif defined(__H8300H__) || defined(__H8300S__) |
659 | static inline int sci_rxd_in(struct uart_port *port) | 536 | static inline int sci_rxd_in(struct uart_port *port) |
660 | { | 537 | { |
661 | int ch = (port->mapbase - SMR0) >> 3; | 538 | int ch = (port->mapbase - SMR0) >> 3; |
662 | return (H8300_SCI_DR(ch) & h8300_sci_pins[ch].rx) ? 1 : 0; | 539 | return (H8300_SCI_DR(ch) & h8300_sci_pins[ch].rx) ? 1 : 0; |
663 | } | 540 | } |
664 | #elif defined(CONFIG_CPU_SUBTYPE_SH7763) | 541 | #else /* default case for non-SCI processors */ |
665 | static inline int sci_rxd_in(struct uart_port *port) | ||
666 | { | ||
667 | if (port->mapbase == 0xffe00000) | ||
668 | return __raw_readw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */ | ||
669 | if (port->mapbase == 0xffe08000) | ||
670 | return __raw_readw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */ | ||
671 | if (port->mapbase == 0xffe10000) | ||
672 | return __raw_readw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF/IRDA */ | ||
673 | |||
674 | return 1; | ||
675 | } | ||
676 | #elif defined(CONFIG_CPU_SUBTYPE_SH7770) | ||
677 | static inline int sci_rxd_in(struct uart_port *port) | ||
678 | { | ||
679 | if (port->mapbase == 0xff923000) | ||
680 | return __raw_readw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */ | ||
681 | if (port->mapbase == 0xff924000) | ||
682 | return __raw_readw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */ | ||
683 | if (port->mapbase == 0xff925000) | ||
684 | return __raw_readw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */ | ||
685 | return 1; | ||
686 | } | ||
687 | #elif defined(CONFIG_CPU_SUBTYPE_SH7780) | ||
688 | static inline int sci_rxd_in(struct uart_port *port) | ||
689 | { | ||
690 | if (port->mapbase == 0xffe00000) | ||
691 | return __raw_readw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */ | ||
692 | if (port->mapbase == 0xffe10000) | ||
693 | return __raw_readw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */ | ||
694 | return 1; | ||
695 | } | ||
696 | #elif defined(CONFIG_CPU_SUBTYPE_SH7785) || \ | ||
697 | defined(CONFIG_CPU_SUBTYPE_SH7786) | ||
698 | static inline int sci_rxd_in(struct uart_port *port) | ||
699 | { | ||
700 | if (port->mapbase == 0xffea0000) | ||
701 | return __raw_readw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */ | ||
702 | if (port->mapbase == 0xffeb0000) | ||
703 | return __raw_readw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */ | ||
704 | if (port->mapbase == 0xffec0000) | ||
705 | return __raw_readw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */ | ||
706 | if (port->mapbase == 0xffed0000) | ||
707 | return __raw_readw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */ | ||
708 | if (port->mapbase == 0xffee0000) | ||
709 | return __raw_readw(SCSPTR4) & 0x0001 ? 1 : 0; /* SCIF */ | ||
710 | if (port->mapbase == 0xffef0000) | ||
711 | return __raw_readw(SCSPTR5) & 0x0001 ? 1 : 0; /* SCIF */ | ||
712 | return 1; | ||
713 | } | ||
714 | #elif defined(CONFIG_CPU_SUBTYPE_SH7201) || \ | ||
715 | defined(CONFIG_CPU_SUBTYPE_SH7203) || \ | ||
716 | defined(CONFIG_CPU_SUBTYPE_SH7206) || \ | ||
717 | defined(CONFIG_CPU_SUBTYPE_SH7263) | ||
718 | static inline int sci_rxd_in(struct uart_port *port) | ||
719 | { | ||
720 | if (port->mapbase == 0xfffe8000) | ||
721 | return __raw_readw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */ | ||
722 | if (port->mapbase == 0xfffe8800) | ||
723 | return __raw_readw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */ | ||
724 | if (port->mapbase == 0xfffe9000) | ||
725 | return __raw_readw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */ | ||
726 | if (port->mapbase == 0xfffe9800) | ||
727 | return __raw_readw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */ | ||
728 | #if defined(CONFIG_CPU_SUBTYPE_SH7201) | ||
729 | if (port->mapbase == 0xfffeA000) | ||
730 | return __raw_readw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */ | ||
731 | if (port->mapbase == 0xfffeA800) | ||
732 | return __raw_readw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */ | ||
733 | if (port->mapbase == 0xfffeB000) | ||
734 | return __raw_readw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */ | ||
735 | if (port->mapbase == 0xfffeB800) | ||
736 | return __raw_readw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */ | ||
737 | #endif | ||
738 | return 1; | ||
739 | } | ||
740 | #elif defined(CONFIG_CPU_SUBTYPE_SH7619) | ||
741 | static inline int sci_rxd_in(struct uart_port *port) | ||
742 | { | ||
743 | if (port->mapbase == 0xf8400000) | ||
744 | return __raw_readw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */ | ||
745 | if (port->mapbase == 0xf8410000) | ||
746 | return __raw_readw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */ | ||
747 | if (port->mapbase == 0xf8420000) | ||
748 | return __raw_readw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */ | ||
749 | return 1; | ||
750 | } | ||
751 | #elif defined(CONFIG_CPU_SUBTYPE_SHX3) | ||
752 | static inline int sci_rxd_in(struct uart_port *port) | 542 | static inline int sci_rxd_in(struct uart_port *port) |
753 | { | 543 | { |
754 | if (port->mapbase == 0xffc30000) | ||
755 | return __raw_readw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */ | ||
756 | if (port->mapbase == 0xffc40000) | ||
757 | return __raw_readw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */ | ||
758 | if (port->mapbase == 0xffc50000) | ||
759 | return __raw_readw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */ | ||
760 | if (port->mapbase == 0xffc60000) | ||
761 | return __raw_readw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */ | ||
762 | return 1; | 544 | return 1; |
763 | } | 545 | } |
764 | #endif | 546 | #endif |
diff --git a/drivers/sh/intc.c b/drivers/sh/intc.c index d5d7f23c19a5..3a5a17db9474 100644 --- a/drivers/sh/intc.c +++ b/drivers/sh/intc.c | |||
@@ -259,6 +259,43 @@ static void intc_disable(unsigned int irq) | |||
259 | } | 259 | } |
260 | } | 260 | } |
261 | 261 | ||
262 | static void (*intc_enable_noprio_fns[])(unsigned long addr, | ||
263 | unsigned long handle, | ||
264 | void (*fn)(unsigned long, | ||
265 | unsigned long, | ||
266 | unsigned long), | ||
267 | unsigned int irq) = { | ||
268 | [MODE_ENABLE_REG] = intc_mode_field, | ||
269 | [MODE_MASK_REG] = intc_mode_zero, | ||
270 | [MODE_DUAL_REG] = intc_mode_field, | ||
271 | [MODE_PRIO_REG] = intc_mode_field, | ||
272 | [MODE_PCLR_REG] = intc_mode_field, | ||
273 | }; | ||
274 | |||
275 | static void intc_enable_disable(struct intc_desc_int *d, | ||
276 | unsigned long handle, int do_enable) | ||
277 | { | ||
278 | unsigned long addr; | ||
279 | unsigned int cpu; | ||
280 | void (*fn)(unsigned long, unsigned long, | ||
281 | void (*)(unsigned long, unsigned long, unsigned long), | ||
282 | unsigned int); | ||
283 | |||
284 | if (do_enable) { | ||
285 | for (cpu = 0; cpu < SMP_NR(d, _INTC_ADDR_E(handle)); cpu++) { | ||
286 | addr = INTC_REG(d, _INTC_ADDR_E(handle), cpu); | ||
287 | fn = intc_enable_noprio_fns[_INTC_MODE(handle)]; | ||
288 | fn(addr, handle, intc_reg_fns[_INTC_FN(handle)], 0); | ||
289 | } | ||
290 | } else { | ||
291 | for (cpu = 0; cpu < SMP_NR(d, _INTC_ADDR_D(handle)); cpu++) { | ||
292 | addr = INTC_REG(d, _INTC_ADDR_D(handle), cpu); | ||
293 | fn = intc_disable_fns[_INTC_MODE(handle)]; | ||
294 | fn(addr, handle, intc_reg_fns[_INTC_FN(handle)], 0); | ||
295 | } | ||
296 | } | ||
297 | } | ||
298 | |||
262 | static int intc_set_wake(unsigned int irq, unsigned int on) | 299 | static int intc_set_wake(unsigned int irq, unsigned int on) |
263 | { | 300 | { |
264 | return 0; /* allow wakeup, but setup hardware in intc_suspend() */ | 301 | return 0; /* allow wakeup, but setup hardware in intc_suspend() */ |
@@ -400,11 +437,11 @@ static unsigned int __init intc_get_reg(struct intc_desc_int *d, | |||
400 | static intc_enum __init intc_grp_id(struct intc_desc *desc, | 437 | static intc_enum __init intc_grp_id(struct intc_desc *desc, |
401 | intc_enum enum_id) | 438 | intc_enum enum_id) |
402 | { | 439 | { |
403 | struct intc_group *g = desc->groups; | 440 | struct intc_group *g = desc->hw.groups; |
404 | unsigned int i, j; | 441 | unsigned int i, j; |
405 | 442 | ||
406 | for (i = 0; g && enum_id && i < desc->nr_groups; i++) { | 443 | for (i = 0; g && enum_id && i < desc->hw.nr_groups; i++) { |
407 | g = desc->groups + i; | 444 | g = desc->hw.groups + i; |
408 | 445 | ||
409 | for (j = 0; g->enum_ids[j]; j++) { | 446 | for (j = 0; g->enum_ids[j]; j++) { |
410 | if (g->enum_ids[j] != enum_id) | 447 | if (g->enum_ids[j] != enum_id) |
@@ -417,19 +454,21 @@ static intc_enum __init intc_grp_id(struct intc_desc *desc, | |||
417 | return 0; | 454 | return 0; |
418 | } | 455 | } |
419 | 456 | ||
420 | static unsigned int __init intc_mask_data(struct intc_desc *desc, | 457 | static unsigned int __init _intc_mask_data(struct intc_desc *desc, |
421 | struct intc_desc_int *d, | 458 | struct intc_desc_int *d, |
422 | intc_enum enum_id, int do_grps) | 459 | intc_enum enum_id, |
460 | unsigned int *reg_idx, | ||
461 | unsigned int *fld_idx) | ||
423 | { | 462 | { |
424 | struct intc_mask_reg *mr = desc->mask_regs; | 463 | struct intc_mask_reg *mr = desc->hw.mask_regs; |
425 | unsigned int i, j, fn, mode; | 464 | unsigned int fn, mode; |
426 | unsigned long reg_e, reg_d; | 465 | unsigned long reg_e, reg_d; |
427 | 466 | ||
428 | for (i = 0; mr && enum_id && i < desc->nr_mask_regs; i++) { | 467 | while (mr && enum_id && *reg_idx < desc->hw.nr_mask_regs) { |
429 | mr = desc->mask_regs + i; | 468 | mr = desc->hw.mask_regs + *reg_idx; |
430 | 469 | ||
431 | for (j = 0; j < ARRAY_SIZE(mr->enum_ids); j++) { | 470 | for (; *fld_idx < ARRAY_SIZE(mr->enum_ids); (*fld_idx)++) { |
432 | if (mr->enum_ids[j] != enum_id) | 471 | if (mr->enum_ids[*fld_idx] != enum_id) |
433 | continue; | 472 | continue; |
434 | 473 | ||
435 | if (mr->set_reg && mr->clr_reg) { | 474 | if (mr->set_reg && mr->clr_reg) { |
@@ -455,29 +494,49 @@ static unsigned int __init intc_mask_data(struct intc_desc *desc, | |||
455 | intc_get_reg(d, reg_e), | 494 | intc_get_reg(d, reg_e), |
456 | intc_get_reg(d, reg_d), | 495 | intc_get_reg(d, reg_d), |
457 | 1, | 496 | 1, |
458 | (mr->reg_width - 1) - j); | 497 | (mr->reg_width - 1) - *fld_idx); |
459 | } | 498 | } |
499 | |||
500 | *fld_idx = 0; | ||
501 | (*reg_idx)++; | ||
460 | } | 502 | } |
461 | 503 | ||
504 | return 0; | ||
505 | } | ||
506 | |||
507 | static unsigned int __init intc_mask_data(struct intc_desc *desc, | ||
508 | struct intc_desc_int *d, | ||
509 | intc_enum enum_id, int do_grps) | ||
510 | { | ||
511 | unsigned int i = 0; | ||
512 | unsigned int j = 0; | ||
513 | unsigned int ret; | ||
514 | |||
515 | ret = _intc_mask_data(desc, d, enum_id, &i, &j); | ||
516 | if (ret) | ||
517 | return ret; | ||
518 | |||
462 | if (do_grps) | 519 | if (do_grps) |
463 | return intc_mask_data(desc, d, intc_grp_id(desc, enum_id), 0); | 520 | return intc_mask_data(desc, d, intc_grp_id(desc, enum_id), 0); |
464 | 521 | ||
465 | return 0; | 522 | return 0; |
466 | } | 523 | } |
467 | 524 | ||
468 | static unsigned int __init intc_prio_data(struct intc_desc *desc, | 525 | static unsigned int __init _intc_prio_data(struct intc_desc *desc, |
469 | struct intc_desc_int *d, | 526 | struct intc_desc_int *d, |
470 | intc_enum enum_id, int do_grps) | 527 | intc_enum enum_id, |
528 | unsigned int *reg_idx, | ||
529 | unsigned int *fld_idx) | ||
471 | { | 530 | { |
472 | struct intc_prio_reg *pr = desc->prio_regs; | 531 | struct intc_prio_reg *pr = desc->hw.prio_regs; |
473 | unsigned int i, j, fn, mode, bit; | 532 | unsigned int fn, n, mode, bit; |
474 | unsigned long reg_e, reg_d; | 533 | unsigned long reg_e, reg_d; |
475 | 534 | ||
476 | for (i = 0; pr && enum_id && i < desc->nr_prio_regs; i++) { | 535 | while (pr && enum_id && *reg_idx < desc->hw.nr_prio_regs) { |
477 | pr = desc->prio_regs + i; | 536 | pr = desc->hw.prio_regs + *reg_idx; |
478 | 537 | ||
479 | for (j = 0; j < ARRAY_SIZE(pr->enum_ids); j++) { | 538 | for (; *fld_idx < ARRAY_SIZE(pr->enum_ids); (*fld_idx)++) { |
480 | if (pr->enum_ids[j] != enum_id) | 539 | if (pr->enum_ids[*fld_idx] != enum_id) |
481 | continue; | 540 | continue; |
482 | 541 | ||
483 | if (pr->set_reg && pr->clr_reg) { | 542 | if (pr->set_reg && pr->clr_reg) { |
@@ -495,34 +554,79 @@ static unsigned int __init intc_prio_data(struct intc_desc *desc, | |||
495 | } | 554 | } |
496 | 555 | ||
497 | fn += (pr->reg_width >> 3) - 1; | 556 | fn += (pr->reg_width >> 3) - 1; |
557 | n = *fld_idx + 1; | ||
498 | 558 | ||
499 | BUG_ON((j + 1) * pr->field_width > pr->reg_width); | 559 | BUG_ON(n * pr->field_width > pr->reg_width); |
500 | 560 | ||
501 | bit = pr->reg_width - ((j + 1) * pr->field_width); | 561 | bit = pr->reg_width - (n * pr->field_width); |
502 | 562 | ||
503 | return _INTC_MK(fn, mode, | 563 | return _INTC_MK(fn, mode, |
504 | intc_get_reg(d, reg_e), | 564 | intc_get_reg(d, reg_e), |
505 | intc_get_reg(d, reg_d), | 565 | intc_get_reg(d, reg_d), |
506 | pr->field_width, bit); | 566 | pr->field_width, bit); |
507 | } | 567 | } |
568 | |||
569 | *fld_idx = 0; | ||
570 | (*reg_idx)++; | ||
508 | } | 571 | } |
509 | 572 | ||
573 | return 0; | ||
574 | } | ||
575 | |||
576 | static unsigned int __init intc_prio_data(struct intc_desc *desc, | ||
577 | struct intc_desc_int *d, | ||
578 | intc_enum enum_id, int do_grps) | ||
579 | { | ||
580 | unsigned int i = 0; | ||
581 | unsigned int j = 0; | ||
582 | unsigned int ret; | ||
583 | |||
584 | ret = _intc_prio_data(desc, d, enum_id, &i, &j); | ||
585 | if (ret) | ||
586 | return ret; | ||
587 | |||
510 | if (do_grps) | 588 | if (do_grps) |
511 | return intc_prio_data(desc, d, intc_grp_id(desc, enum_id), 0); | 589 | return intc_prio_data(desc, d, intc_grp_id(desc, enum_id), 0); |
512 | 590 | ||
513 | return 0; | 591 | return 0; |
514 | } | 592 | } |
515 | 593 | ||
594 | static void __init intc_enable_disable_enum(struct intc_desc *desc, | ||
595 | struct intc_desc_int *d, | ||
596 | intc_enum enum_id, int enable) | ||
597 | { | ||
598 | unsigned int i, j, data; | ||
599 | |||
600 | /* go through and enable/disable all mask bits */ | ||
601 | i = j = 0; | ||
602 | do { | ||
603 | data = _intc_mask_data(desc, d, enum_id, &i, &j); | ||
604 | if (data) | ||
605 | intc_enable_disable(d, data, enable); | ||
606 | j++; | ||
607 | } while (data); | ||
608 | |||
609 | /* go through and enable/disable all priority fields */ | ||
610 | i = j = 0; | ||
611 | do { | ||
612 | data = _intc_prio_data(desc, d, enum_id, &i, &j); | ||
613 | if (data) | ||
614 | intc_enable_disable(d, data, enable); | ||
615 | |||
616 | j++; | ||
617 | } while (data); | ||
618 | } | ||
619 | |||
516 | static unsigned int __init intc_ack_data(struct intc_desc *desc, | 620 | static unsigned int __init intc_ack_data(struct intc_desc *desc, |
517 | struct intc_desc_int *d, | 621 | struct intc_desc_int *d, |
518 | intc_enum enum_id) | 622 | intc_enum enum_id) |
519 | { | 623 | { |
520 | struct intc_mask_reg *mr = desc->ack_regs; | 624 | struct intc_mask_reg *mr = desc->hw.ack_regs; |
521 | unsigned int i, j, fn, mode; | 625 | unsigned int i, j, fn, mode; |
522 | unsigned long reg_e, reg_d; | 626 | unsigned long reg_e, reg_d; |
523 | 627 | ||
524 | for (i = 0; mr && enum_id && i < desc->nr_ack_regs; i++) { | 628 | for (i = 0; mr && enum_id && i < desc->hw.nr_ack_regs; i++) { |
525 | mr = desc->ack_regs + i; | 629 | mr = desc->hw.ack_regs + i; |
526 | 630 | ||
527 | for (j = 0; j < ARRAY_SIZE(mr->enum_ids); j++) { | 631 | for (j = 0; j < ARRAY_SIZE(mr->enum_ids); j++) { |
528 | if (mr->enum_ids[j] != enum_id) | 632 | if (mr->enum_ids[j] != enum_id) |
@@ -549,11 +653,11 @@ static unsigned int __init intc_sense_data(struct intc_desc *desc, | |||
549 | struct intc_desc_int *d, | 653 | struct intc_desc_int *d, |
550 | intc_enum enum_id) | 654 | intc_enum enum_id) |
551 | { | 655 | { |
552 | struct intc_sense_reg *sr = desc->sense_regs; | 656 | struct intc_sense_reg *sr = desc->hw.sense_regs; |
553 | unsigned int i, j, fn, bit; | 657 | unsigned int i, j, fn, bit; |
554 | 658 | ||
555 | for (i = 0; sr && enum_id && i < desc->nr_sense_regs; i++) { | 659 | for (i = 0; sr && enum_id && i < desc->hw.nr_sense_regs; i++) { |
556 | sr = desc->sense_regs + i; | 660 | sr = desc->hw.sense_regs + i; |
557 | 661 | ||
558 | for (j = 0; j < ARRAY_SIZE(sr->enum_ids); j++) { | 662 | for (j = 0; j < ARRAY_SIZE(sr->enum_ids); j++) { |
559 | if (sr->enum_ids[j] != enum_id) | 663 | if (sr->enum_ids[j] != enum_id) |
@@ -656,7 +760,7 @@ static void __init intc_register_irq(struct intc_desc *desc, | |||
656 | /* irq should be disabled by default */ | 760 | /* irq should be disabled by default */ |
657 | d->chip.mask(irq); | 761 | d->chip.mask(irq); |
658 | 762 | ||
659 | if (desc->ack_regs) | 763 | if (desc->hw.ack_regs) |
660 | ack_handle[irq] = intc_ack_data(desc, d, enum_id); | 764 | ack_handle[irq] = intc_ack_data(desc, d, enum_id); |
661 | } | 765 | } |
662 | 766 | ||
@@ -684,6 +788,7 @@ static void intc_redirect_irq(unsigned int irq, struct irq_desc *desc) | |||
684 | void __init register_intc_controller(struct intc_desc *desc) | 788 | void __init register_intc_controller(struct intc_desc *desc) |
685 | { | 789 | { |
686 | unsigned int i, k, smp; | 790 | unsigned int i, k, smp; |
791 | struct intc_hw_desc *hw = &desc->hw; | ||
687 | struct intc_desc_int *d; | 792 | struct intc_desc_int *d; |
688 | 793 | ||
689 | d = kzalloc(sizeof(*d), GFP_NOWAIT); | 794 | d = kzalloc(sizeof(*d), GFP_NOWAIT); |
@@ -691,10 +796,10 @@ void __init register_intc_controller(struct intc_desc *desc) | |||
691 | INIT_LIST_HEAD(&d->list); | 796 | INIT_LIST_HEAD(&d->list); |
692 | list_add(&d->list, &intc_list); | 797 | list_add(&d->list, &intc_list); |
693 | 798 | ||
694 | d->nr_reg = desc->mask_regs ? desc->nr_mask_regs * 2 : 0; | 799 | d->nr_reg = hw->mask_regs ? hw->nr_mask_regs * 2 : 0; |
695 | d->nr_reg += desc->prio_regs ? desc->nr_prio_regs * 2 : 0; | 800 | d->nr_reg += hw->prio_regs ? hw->nr_prio_regs * 2 : 0; |
696 | d->nr_reg += desc->sense_regs ? desc->nr_sense_regs : 0; | 801 | d->nr_reg += hw->sense_regs ? hw->nr_sense_regs : 0; |
697 | d->nr_reg += desc->ack_regs ? desc->nr_ack_regs : 0; | 802 | d->nr_reg += hw->ack_regs ? hw->nr_ack_regs : 0; |
698 | 803 | ||
699 | d->reg = kzalloc(d->nr_reg * sizeof(*d->reg), GFP_NOWAIT); | 804 | d->reg = kzalloc(d->nr_reg * sizeof(*d->reg), GFP_NOWAIT); |
700 | #ifdef CONFIG_SMP | 805 | #ifdef CONFIG_SMP |
@@ -702,30 +807,31 @@ void __init register_intc_controller(struct intc_desc *desc) | |||
702 | #endif | 807 | #endif |
703 | k = 0; | 808 | k = 0; |
704 | 809 | ||
705 | if (desc->mask_regs) { | 810 | if (hw->mask_regs) { |
706 | for (i = 0; i < desc->nr_mask_regs; i++) { | 811 | for (i = 0; i < hw->nr_mask_regs; i++) { |
707 | smp = IS_SMP(desc->mask_regs[i]); | 812 | smp = IS_SMP(hw->mask_regs[i]); |
708 | k += save_reg(d, k, desc->mask_regs[i].set_reg, smp); | 813 | k += save_reg(d, k, hw->mask_regs[i].set_reg, smp); |
709 | k += save_reg(d, k, desc->mask_regs[i].clr_reg, smp); | 814 | k += save_reg(d, k, hw->mask_regs[i].clr_reg, smp); |
710 | } | 815 | } |
711 | } | 816 | } |
712 | 817 | ||
713 | if (desc->prio_regs) { | 818 | if (hw->prio_regs) { |
714 | d->prio = kzalloc(desc->nr_vectors * sizeof(*d->prio), GFP_NOWAIT); | 819 | d->prio = kzalloc(hw->nr_vectors * sizeof(*d->prio), |
820 | GFP_NOWAIT); | ||
715 | 821 | ||
716 | for (i = 0; i < desc->nr_prio_regs; i++) { | 822 | for (i = 0; i < hw->nr_prio_regs; i++) { |
717 | smp = IS_SMP(desc->prio_regs[i]); | 823 | smp = IS_SMP(hw->prio_regs[i]); |
718 | k += save_reg(d, k, desc->prio_regs[i].set_reg, smp); | 824 | k += save_reg(d, k, hw->prio_regs[i].set_reg, smp); |
719 | k += save_reg(d, k, desc->prio_regs[i].clr_reg, smp); | 825 | k += save_reg(d, k, hw->prio_regs[i].clr_reg, smp); |
720 | } | 826 | } |
721 | } | 827 | } |
722 | 828 | ||
723 | if (desc->sense_regs) { | 829 | if (hw->sense_regs) { |
724 | d->sense = kzalloc(desc->nr_vectors * sizeof(*d->sense), GFP_NOWAIT); | 830 | d->sense = kzalloc(hw->nr_vectors * sizeof(*d->sense), |
831 | GFP_NOWAIT); | ||
725 | 832 | ||
726 | for (i = 0; i < desc->nr_sense_regs; i++) { | 833 | for (i = 0; i < hw->nr_sense_regs; i++) |
727 | k += save_reg(d, k, desc->sense_regs[i].reg, 0); | 834 | k += save_reg(d, k, hw->sense_regs[i].reg, 0); |
728 | } | ||
729 | } | 835 | } |
730 | 836 | ||
731 | d->chip.name = desc->name; | 837 | d->chip.name = desc->name; |
@@ -738,18 +844,26 @@ void __init register_intc_controller(struct intc_desc *desc) | |||
738 | d->chip.set_type = intc_set_sense; | 844 | d->chip.set_type = intc_set_sense; |
739 | d->chip.set_wake = intc_set_wake; | 845 | d->chip.set_wake = intc_set_wake; |
740 | 846 | ||
741 | if (desc->ack_regs) { | 847 | if (hw->ack_regs) { |
742 | for (i = 0; i < desc->nr_ack_regs; i++) | 848 | for (i = 0; i < hw->nr_ack_regs; i++) |
743 | k += save_reg(d, k, desc->ack_regs[i].set_reg, 0); | 849 | k += save_reg(d, k, hw->ack_regs[i].set_reg, 0); |
744 | 850 | ||
745 | d->chip.mask_ack = intc_mask_ack; | 851 | d->chip.mask_ack = intc_mask_ack; |
746 | } | 852 | } |
747 | 853 | ||
854 | /* disable bits matching force_disable before registering irqs */ | ||
855 | if (desc->force_disable) | ||
856 | intc_enable_disable_enum(desc, d, desc->force_disable, 0); | ||
857 | |||
858 | /* disable bits matching force_enable before registering irqs */ | ||
859 | if (desc->force_enable) | ||
860 | intc_enable_disable_enum(desc, d, desc->force_enable, 0); | ||
861 | |||
748 | BUG_ON(k > 256); /* _INTC_ADDR_E() and _INTC_ADDR_D() are 8 bits */ | 862 | BUG_ON(k > 256); /* _INTC_ADDR_E() and _INTC_ADDR_D() are 8 bits */ |
749 | 863 | ||
750 | /* register the vectors one by one */ | 864 | /* register the vectors one by one */ |
751 | for (i = 0; i < desc->nr_vectors; i++) { | 865 | for (i = 0; i < hw->nr_vectors; i++) { |
752 | struct intc_vect *vect = desc->vectors + i; | 866 | struct intc_vect *vect = hw->vectors + i; |
753 | unsigned int irq = evt2irq(vect->vect); | 867 | unsigned int irq = evt2irq(vect->vect); |
754 | struct irq_desc *irq_desc; | 868 | struct irq_desc *irq_desc; |
755 | 869 | ||
@@ -764,8 +878,8 @@ void __init register_intc_controller(struct intc_desc *desc) | |||
764 | 878 | ||
765 | intc_register_irq(desc, d, vect->enum_id, irq); | 879 | intc_register_irq(desc, d, vect->enum_id, irq); |
766 | 880 | ||
767 | for (k = i + 1; k < desc->nr_vectors; k++) { | 881 | for (k = i + 1; k < hw->nr_vectors; k++) { |
768 | struct intc_vect *vect2 = desc->vectors + k; | 882 | struct intc_vect *vect2 = hw->vectors + k; |
769 | unsigned int irq2 = evt2irq(vect2->vect); | 883 | unsigned int irq2 = evt2irq(vect2->vect); |
770 | 884 | ||
771 | if (vect->enum_id != vect2->enum_id) | 885 | if (vect->enum_id != vect2->enum_id) |
@@ -785,11 +899,15 @@ void __init register_intc_controller(struct intc_desc *desc) | |||
785 | vect2->enum_id = 0; | 899 | vect2->enum_id = 0; |
786 | 900 | ||
787 | /* redirect this interrupts to the first one */ | 901 | /* redirect this interrupts to the first one */ |
788 | set_irq_chip_and_handler_name(irq2, &d->chip, | 902 | set_irq_chip(irq2, &dummy_irq_chip); |
789 | intc_redirect_irq, "redirect"); | 903 | set_irq_chained_handler(irq2, intc_redirect_irq); |
790 | set_irq_data(irq2, (void *)irq); | 904 | set_irq_data(irq2, (void *)irq); |
791 | } | 905 | } |
792 | } | 906 | } |
907 | |||
908 | /* enable bits matching force_enable after registering irqs */ | ||
909 | if (desc->force_enable) | ||
910 | intc_enable_disable_enum(desc, d, desc->force_enable, 1); | ||
793 | } | 911 | } |
794 | 912 | ||
795 | static int intc_suspend(struct sys_device *dev, pm_message_t state) | 913 | static int intc_suspend(struct sys_device *dev, pm_message_t state) |
@@ -872,7 +990,7 @@ device_initcall(register_intc_sysdevs); | |||
872 | /* | 990 | /* |
873 | * Dynamic IRQ allocation and deallocation | 991 | * Dynamic IRQ allocation and deallocation |
874 | */ | 992 | */ |
875 | static unsigned int create_irq_on_node(unsigned int irq_want, int node) | 993 | unsigned int create_irq_nr(unsigned int irq_want, int node) |
876 | { | 994 | { |
877 | unsigned int irq = 0, new; | 995 | unsigned int irq = 0, new; |
878 | unsigned long flags; | 996 | unsigned long flags; |
@@ -881,24 +999,28 @@ static unsigned int create_irq_on_node(unsigned int irq_want, int node) | |||
881 | spin_lock_irqsave(&vector_lock, flags); | 999 | spin_lock_irqsave(&vector_lock, flags); |
882 | 1000 | ||
883 | /* | 1001 | /* |
884 | * First try the wanted IRQ, then scan. | 1002 | * First try the wanted IRQ |
885 | */ | 1003 | */ |
886 | if (test_and_set_bit(irq_want, intc_irq_map)) { | 1004 | if (test_and_set_bit(irq_want, intc_irq_map) == 0) { |
1005 | new = irq_want; | ||
1006 | } else { | ||
1007 | /* .. then fall back to scanning. */ | ||
887 | new = find_first_zero_bit(intc_irq_map, nr_irqs); | 1008 | new = find_first_zero_bit(intc_irq_map, nr_irqs); |
888 | if (unlikely(new == nr_irqs)) | 1009 | if (unlikely(new == nr_irqs)) |
889 | goto out_unlock; | 1010 | goto out_unlock; |
890 | 1011 | ||
891 | desc = irq_to_desc_alloc_node(new, node); | ||
892 | if (unlikely(!desc)) { | ||
893 | pr_info("can't get irq_desc for %d\n", new); | ||
894 | goto out_unlock; | ||
895 | } | ||
896 | |||
897 | desc = move_irq_desc(desc, node); | ||
898 | __set_bit(new, intc_irq_map); | 1012 | __set_bit(new, intc_irq_map); |
899 | irq = new; | ||
900 | } | 1013 | } |
901 | 1014 | ||
1015 | desc = irq_to_desc_alloc_node(new, node); | ||
1016 | if (unlikely(!desc)) { | ||
1017 | pr_info("can't get irq_desc for %d\n", new); | ||
1018 | goto out_unlock; | ||
1019 | } | ||
1020 | |||
1021 | desc = move_irq_desc(desc, node); | ||
1022 | irq = new; | ||
1023 | |||
902 | out_unlock: | 1024 | out_unlock: |
903 | spin_unlock_irqrestore(&vector_lock, flags); | 1025 | spin_unlock_irqrestore(&vector_lock, flags); |
904 | 1026 | ||
@@ -913,7 +1035,7 @@ int create_irq(void) | |||
913 | int nid = cpu_to_node(smp_processor_id()); | 1035 | int nid = cpu_to_node(smp_processor_id()); |
914 | int irq; | 1036 | int irq; |
915 | 1037 | ||
916 | irq = create_irq_on_node(NR_IRQS_LEGACY, nid); | 1038 | irq = create_irq_nr(NR_IRQS_LEGACY, nid); |
917 | if (irq == 0) | 1039 | if (irq == 0) |
918 | irq = -1; | 1040 | irq = -1; |
919 | 1041 | ||
diff --git a/drivers/sh/pfc.c b/drivers/sh/pfc.c index 082604edc4c2..cf0303acab8e 100644 --- a/drivers/sh/pfc.c +++ b/drivers/sh/pfc.c | |||
@@ -337,12 +337,39 @@ static int pinmux_config_gpio(struct pinmux_info *gpioc, unsigned gpio, | |||
337 | if (!enum_id) | 337 | if (!enum_id) |
338 | break; | 338 | break; |
339 | 339 | ||
340 | /* first check if this is a function enum */ | ||
340 | in_range = enum_in_range(enum_id, &gpioc->function); | 341 | in_range = enum_in_range(enum_id, &gpioc->function); |
341 | if (!in_range && range) { | 342 | if (!in_range) { |
342 | in_range = enum_in_range(enum_id, range); | 343 | /* not a function enum */ |
343 | 344 | if (range) { | |
344 | if (in_range && enum_id == range->force) | 345 | /* |
345 | continue; | 346 | * other range exists, so this pin is |
347 | * a regular GPIO pin that now is being | ||
348 | * bound to a specific direction. | ||
349 | * | ||
350 | * for this case we only allow function enums | ||
351 | * and the enums that match the other range. | ||
352 | */ | ||
353 | in_range = enum_in_range(enum_id, range); | ||
354 | |||
355 | /* | ||
356 | * special case pass through for fixed | ||
357 | * input-only or output-only pins without | ||
358 | * function enum register association. | ||
359 | */ | ||
360 | if (in_range && enum_id == range->force) | ||
361 | continue; | ||
362 | } else { | ||
363 | /* | ||
364 | * no other range exists, so this pin | ||
365 | * must then be of the function type. | ||
366 | * | ||
367 | * allow function type pins to select | ||
368 | * any combination of function/in/out | ||
369 | * in their MARK lists. | ||
370 | */ | ||
371 | in_range = 1; | ||
372 | } | ||
346 | } | 373 | } |
347 | 374 | ||
348 | if (!in_range) | 375 | if (!in_range) |
diff --git a/drivers/video/pvr2fb.c b/drivers/video/pvr2fb.c index 53f8f1100e81..f9975100d56d 100644 --- a/drivers/video/pvr2fb.c +++ b/drivers/video/pvr2fb.c | |||
@@ -831,7 +831,7 @@ static int __devinit pvr2fb_common_init(void) | |||
831 | printk(KERN_NOTICE "fb%d: registering with SQ API\n", fb_info->node); | 831 | printk(KERN_NOTICE "fb%d: registering with SQ API\n", fb_info->node); |
832 | 832 | ||
833 | pvr2fb_map = sq_remap(fb_info->fix.smem_start, fb_info->fix.smem_len, | 833 | pvr2fb_map = sq_remap(fb_info->fix.smem_start, fb_info->fix.smem_len, |
834 | fb_info->fix.id, pgprot_val(PAGE_SHARED)); | 834 | fb_info->fix.id, PAGE_SHARED); |
835 | 835 | ||
836 | printk(KERN_NOTICE "fb%d: Mapped video memory to SQ addr 0x%lx\n", | 836 | printk(KERN_NOTICE "fb%d: Mapped video memory to SQ addr 0x%lx\n", |
837 | fb_info->node, pvr2fb_map); | 837 | fb_info->node, pvr2fb_map); |
diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c index a69830d26f7f..8d7653e56df5 100644 --- a/drivers/video/sh_mobile_lcdcfb.c +++ b/drivers/video/sh_mobile_lcdcfb.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/dma-mapping.h> | 19 | #include <linux/dma-mapping.h> |
20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
21 | #include <linux/vmalloc.h> | 21 | #include <linux/vmalloc.h> |
22 | #include <linux/ioctl.h> | ||
22 | #include <video/sh_mobile_lcdc.h> | 23 | #include <video/sh_mobile_lcdc.h> |
23 | #include <asm/atomic.h> | 24 | #include <asm/atomic.h> |
24 | 25 | ||
@@ -106,6 +107,7 @@ static unsigned long lcdc_offs_sublcd[NR_CH_REGS] = { | |||
106 | #define LDRCNTR_SRC 0x00010000 | 107 | #define LDRCNTR_SRC 0x00010000 |
107 | #define LDRCNTR_MRS 0x00000002 | 108 | #define LDRCNTR_MRS 0x00000002 |
108 | #define LDRCNTR_MRC 0x00000001 | 109 | #define LDRCNTR_MRC 0x00000001 |
110 | #define LDSR_MRS 0x00000100 | ||
109 | 111 | ||
110 | struct sh_mobile_lcdc_priv; | 112 | struct sh_mobile_lcdc_priv; |
111 | struct sh_mobile_lcdc_chan { | 113 | struct sh_mobile_lcdc_chan { |
@@ -122,8 +124,8 @@ struct sh_mobile_lcdc_chan { | |||
122 | struct scatterlist *sglist; | 124 | struct scatterlist *sglist; |
123 | unsigned long frame_end; | 125 | unsigned long frame_end; |
124 | unsigned long pan_offset; | 126 | unsigned long pan_offset; |
125 | unsigned long new_pan_offset; | ||
126 | wait_queue_head_t frame_end_wait; | 127 | wait_queue_head_t frame_end_wait; |
128 | struct completion vsync_completion; | ||
127 | }; | 129 | }; |
128 | 130 | ||
129 | struct sh_mobile_lcdc_priv { | 131 | struct sh_mobile_lcdc_priv { |
@@ -366,19 +368,8 @@ static irqreturn_t sh_mobile_lcdc_irq(int irq, void *data) | |||
366 | } | 368 | } |
367 | 369 | ||
368 | /* VSYNC End */ | 370 | /* VSYNC End */ |
369 | if (ldintr & LDINTR_VES) { | 371 | if (ldintr & LDINTR_VES) |
370 | unsigned long ldrcntr = lcdc_read(priv, _LDRCNTR); | 372 | complete(&ch->vsync_completion); |
371 | /* Set the source address for the next refresh */ | ||
372 | lcdc_write_chan_mirror(ch, LDSA1R, ch->dma_handle + | ||
373 | ch->new_pan_offset); | ||
374 | if (lcdc_chan_is_sublcd(ch)) | ||
375 | lcdc_write(ch->lcdc, _LDRCNTR, | ||
376 | ldrcntr ^ LDRCNTR_SRS); | ||
377 | else | ||
378 | lcdc_write(ch->lcdc, _LDRCNTR, | ||
379 | ldrcntr ^ LDRCNTR_MRS); | ||
380 | ch->pan_offset = ch->new_pan_offset; | ||
381 | } | ||
382 | } | 373 | } |
383 | 374 | ||
384 | return IRQ_HANDLED; | 375 | return IRQ_HANDLED; |
@@ -767,25 +758,69 @@ static int sh_mobile_fb_pan_display(struct fb_var_screeninfo *var, | |||
767 | struct fb_info *info) | 758 | struct fb_info *info) |
768 | { | 759 | { |
769 | struct sh_mobile_lcdc_chan *ch = info->par; | 760 | struct sh_mobile_lcdc_chan *ch = info->par; |
761 | struct sh_mobile_lcdc_priv *priv = ch->lcdc; | ||
762 | unsigned long ldrcntr; | ||
763 | unsigned long new_pan_offset; | ||
764 | |||
765 | new_pan_offset = (var->yoffset * info->fix.line_length) + | ||
766 | (var->xoffset * (info->var.bits_per_pixel / 8)); | ||
770 | 767 | ||
771 | if (info->var.xoffset == var->xoffset && | 768 | if (new_pan_offset == ch->pan_offset) |
772 | info->var.yoffset == var->yoffset) | ||
773 | return 0; /* No change, do nothing */ | 769 | return 0; /* No change, do nothing */ |
774 | 770 | ||
775 | ch->new_pan_offset = (var->yoffset * info->fix.line_length) + | 771 | ldrcntr = lcdc_read(priv, _LDRCNTR); |
776 | (var->xoffset * (info->var.bits_per_pixel / 8)); | ||
777 | 772 | ||
778 | if (ch->new_pan_offset != ch->pan_offset) { | 773 | /* Set the source address for the next refresh */ |
779 | unsigned long ldintr; | 774 | lcdc_write_chan_mirror(ch, LDSA1R, ch->dma_handle + new_pan_offset); |
780 | ldintr = lcdc_read(ch->lcdc, _LDINTR); | 775 | if (lcdc_chan_is_sublcd(ch)) |
781 | ldintr |= LDINTR_VEE; | 776 | lcdc_write(ch->lcdc, _LDRCNTR, ldrcntr ^ LDRCNTR_SRS); |
782 | lcdc_write(ch->lcdc, _LDINTR, ldintr); | 777 | else |
783 | sh_mobile_lcdc_deferred_io_touch(info); | 778 | lcdc_write(ch->lcdc, _LDRCNTR, ldrcntr ^ LDRCNTR_MRS); |
784 | } | 779 | |
780 | ch->pan_offset = new_pan_offset; | ||
781 | |||
782 | sh_mobile_lcdc_deferred_io_touch(info); | ||
783 | |||
784 | return 0; | ||
785 | } | ||
786 | |||
787 | static int sh_mobile_wait_for_vsync(struct fb_info *info) | ||
788 | { | ||
789 | struct sh_mobile_lcdc_chan *ch = info->par; | ||
790 | unsigned long ldintr; | ||
791 | int ret; | ||
792 | |||
793 | /* Enable VSync End interrupt */ | ||
794 | ldintr = lcdc_read(ch->lcdc, _LDINTR); | ||
795 | ldintr |= LDINTR_VEE; | ||
796 | lcdc_write(ch->lcdc, _LDINTR, ldintr); | ||
797 | |||
798 | ret = wait_for_completion_interruptible_timeout(&ch->vsync_completion, | ||
799 | msecs_to_jiffies(100)); | ||
800 | if (!ret) | ||
801 | return -ETIMEDOUT; | ||
785 | 802 | ||
786 | return 0; | 803 | return 0; |
787 | } | 804 | } |
788 | 805 | ||
806 | static int sh_mobile_ioctl(struct fb_info *info, unsigned int cmd, | ||
807 | unsigned long arg) | ||
808 | { | ||
809 | int retval; | ||
810 | |||
811 | switch (cmd) { | ||
812 | case FBIO_WAITFORVSYNC: | ||
813 | retval = sh_mobile_wait_for_vsync(info); | ||
814 | break; | ||
815 | |||
816 | default: | ||
817 | retval = -ENOIOCTLCMD; | ||
818 | break; | ||
819 | } | ||
820 | return retval; | ||
821 | } | ||
822 | |||
823 | |||
789 | static struct fb_ops sh_mobile_lcdc_ops = { | 824 | static struct fb_ops sh_mobile_lcdc_ops = { |
790 | .owner = THIS_MODULE, | 825 | .owner = THIS_MODULE, |
791 | .fb_setcolreg = sh_mobile_lcdc_setcolreg, | 826 | .fb_setcolreg = sh_mobile_lcdc_setcolreg, |
@@ -795,6 +830,7 @@ static struct fb_ops sh_mobile_lcdc_ops = { | |||
795 | .fb_copyarea = sh_mobile_lcdc_copyarea, | 830 | .fb_copyarea = sh_mobile_lcdc_copyarea, |
796 | .fb_imageblit = sh_mobile_lcdc_imageblit, | 831 | .fb_imageblit = sh_mobile_lcdc_imageblit, |
797 | .fb_pan_display = sh_mobile_fb_pan_display, | 832 | .fb_pan_display = sh_mobile_fb_pan_display, |
833 | .fb_ioctl = sh_mobile_ioctl, | ||
798 | }; | 834 | }; |
799 | 835 | ||
800 | static int sh_mobile_lcdc_set_bpp(struct fb_var_screeninfo *var, int bpp) | 836 | static int sh_mobile_lcdc_set_bpp(struct fb_var_screeninfo *var, int bpp) |
@@ -962,8 +998,8 @@ static int __init sh_mobile_lcdc_probe(struct platform_device *pdev) | |||
962 | goto err1; | 998 | goto err1; |
963 | } | 999 | } |
964 | init_waitqueue_head(&priv->ch[i].frame_end_wait); | 1000 | init_waitqueue_head(&priv->ch[i].frame_end_wait); |
1001 | init_completion(&priv->ch[i].vsync_completion); | ||
965 | priv->ch[j].pan_offset = 0; | 1002 | priv->ch[j].pan_offset = 0; |
966 | priv->ch[j].new_pan_offset = 0; | ||
967 | 1003 | ||
968 | switch (pdata->ch[i].chan) { | 1004 | switch (pdata->ch[i].chan) { |
969 | case LCDC_CHAN_MAINLCD: | 1005 | case LCDC_CHAN_MAINLCD: |
diff --git a/include/linux/mtd/sh_flctl.h b/include/linux/mtd/sh_flctl.h index e77c1cea404d..ab77609ec337 100644 --- a/include/linux/mtd/sh_flctl.h +++ b/include/linux/mtd/sh_flctl.h | |||
@@ -51,6 +51,8 @@ | |||
51 | #define _4ECCCNTEN (0x1 << 24) | 51 | #define _4ECCCNTEN (0x1 << 24) |
52 | #define _4ECCEN (0x1 << 23) | 52 | #define _4ECCEN (0x1 << 23) |
53 | #define _4ECCCORRECT (0x1 << 22) | 53 | #define _4ECCCORRECT (0x1 << 22) |
54 | #define SHBUSSEL (0x1 << 20) | ||
55 | #define SEL_16BIT (0x1 << 19) | ||
54 | #define SNAND_E (0x1 << 18) /* SNAND (0=512 1=2048)*/ | 56 | #define SNAND_E (0x1 << 18) /* SNAND (0=512 1=2048)*/ |
55 | #define QTSEL_E (0x1 << 17) | 57 | #define QTSEL_E (0x1 << 17) |
56 | #define ENDIAN (0x1 << 16) /* 1 = little endian */ | 58 | #define ENDIAN (0x1 << 16) /* 1 = little endian */ |
@@ -96,6 +98,7 @@ | |||
96 | struct sh_flctl { | 98 | struct sh_flctl { |
97 | struct mtd_info mtd; | 99 | struct mtd_info mtd; |
98 | struct nand_chip chip; | 100 | struct nand_chip chip; |
101 | struct platform_device *pdev; | ||
99 | void __iomem *reg; | 102 | void __iomem *reg; |
100 | 103 | ||
101 | uint8_t done_buff[2048 + 64]; /* max size 2048 + 64 */ | 104 | uint8_t done_buff[2048 + 64]; /* max size 2048 + 64 */ |
diff --git a/include/linux/sh_intc.h b/include/linux/sh_intc.h index 4ef246f14654..51d288d8ac88 100644 --- a/include/linux/sh_intc.h +++ b/include/linux/sh_intc.h | |||
@@ -45,7 +45,7 @@ struct intc_sense_reg { | |||
45 | #define INTC_SMP(stride, nr) | 45 | #define INTC_SMP(stride, nr) |
46 | #endif | 46 | #endif |
47 | 47 | ||
48 | struct intc_desc { | 48 | struct intc_hw_desc { |
49 | struct intc_vect *vectors; | 49 | struct intc_vect *vectors; |
50 | unsigned int nr_vectors; | 50 | unsigned int nr_vectors; |
51 | struct intc_group *groups; | 51 | struct intc_group *groups; |
@@ -56,29 +56,40 @@ struct intc_desc { | |||
56 | unsigned int nr_prio_regs; | 56 | unsigned int nr_prio_regs; |
57 | struct intc_sense_reg *sense_regs; | 57 | struct intc_sense_reg *sense_regs; |
58 | unsigned int nr_sense_regs; | 58 | unsigned int nr_sense_regs; |
59 | char *name; | ||
60 | struct intc_mask_reg *ack_regs; | 59 | struct intc_mask_reg *ack_regs; |
61 | unsigned int nr_ack_regs; | 60 | unsigned int nr_ack_regs; |
62 | }; | 61 | }; |
63 | 62 | ||
64 | #define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a) | 63 | #define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a) |
64 | #define INTC_HW_DESC(vectors, groups, mask_regs, \ | ||
65 | prio_regs, sense_regs, ack_regs) \ | ||
66 | { \ | ||
67 | _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ | ||
68 | _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ | ||
69 | _INTC_ARRAY(sense_regs), _INTC_ARRAY(ack_regs), \ | ||
70 | } | ||
71 | |||
72 | struct intc_desc { | ||
73 | char *name; | ||
74 | intc_enum force_enable; | ||
75 | intc_enum force_disable; | ||
76 | struct intc_hw_desc hw; | ||
77 | }; | ||
78 | |||
65 | #define DECLARE_INTC_DESC(symbol, chipname, vectors, groups, \ | 79 | #define DECLARE_INTC_DESC(symbol, chipname, vectors, groups, \ |
66 | mask_regs, prio_regs, sense_regs) \ | 80 | mask_regs, prio_regs, sense_regs) \ |
67 | struct intc_desc symbol __initdata = { \ | 81 | struct intc_desc symbol __initdata = { \ |
68 | _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ | 82 | .name = chipname, \ |
69 | _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ | 83 | .hw = INTC_HW_DESC(vectors, groups, mask_regs, \ |
70 | _INTC_ARRAY(sense_regs), \ | 84 | prio_regs, sense_regs, NULL), \ |
71 | chipname, \ | ||
72 | } | 85 | } |
73 | 86 | ||
74 | #define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups, \ | 87 | #define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups, \ |
75 | mask_regs, prio_regs, sense_regs, ack_regs) \ | 88 | mask_regs, prio_regs, sense_regs, ack_regs) \ |
76 | struct intc_desc symbol __initdata = { \ | 89 | struct intc_desc symbol __initdata = { \ |
77 | _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ | 90 | .name = chipname, \ |
78 | _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ | 91 | .hw = INTC_HW_DESC(vectors, groups, mask_regs, \ |
79 | _INTC_ARRAY(sense_regs), \ | 92 | prio_regs, sense_regs, ack_regs), \ |
80 | chipname, \ | ||
81 | _INTC_ARRAY(ack_regs), \ | ||
82 | } | 93 | } |
83 | 94 | ||
84 | void __init register_intc_controller(struct intc_desc *desc); | 95 | void __init register_intc_controller(struct intc_desc *desc); |
diff --git a/include/video/sh_mobile_lcdc.h b/include/video/sh_mobile_lcdc.h index 288205457713..2cc893fc1f85 100644 --- a/include/video/sh_mobile_lcdc.h +++ b/include/video/sh_mobile_lcdc.h | |||
@@ -34,6 +34,8 @@ enum { LCDC_CLK_BUS, LCDC_CLK_PERIPHERAL, LCDC_CLK_EXTERNAL }; | |||
34 | #define LCDC_FLAGS_HSCNT (1 << 3) /* Disable HSYNC during VBLANK */ | 34 | #define LCDC_FLAGS_HSCNT (1 << 3) /* Disable HSYNC during VBLANK */ |
35 | #define LCDC_FLAGS_DWCNT (1 << 4) /* Disable dotclock during blanking */ | 35 | #define LCDC_FLAGS_DWCNT (1 << 4) /* Disable dotclock during blanking */ |
36 | 36 | ||
37 | #define FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32) | ||
38 | |||
37 | struct sh_mobile_lcdc_sys_bus_cfg { | 39 | struct sh_mobile_lcdc_sys_bus_cfg { |
38 | unsigned long ldmt2r; | 40 | unsigned long ldmt2r; |
39 | unsigned long ldmt3r; | 41 | unsigned long ldmt3r; |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 25c3ed594c54..d62e3cdab357 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -355,7 +355,7 @@ config SLUB_STATS | |||
355 | config DEBUG_KMEMLEAK | 355 | config DEBUG_KMEMLEAK |
356 | bool "Kernel memory leak detector" | 356 | bool "Kernel memory leak detector" |
357 | depends on DEBUG_KERNEL && EXPERIMENTAL && !MEMORY_HOTPLUG && \ | 357 | depends on DEBUG_KERNEL && EXPERIMENTAL && !MEMORY_HOTPLUG && \ |
358 | (X86 || ARM || PPC || S390) | 358 | (X86 || ARM || PPC || S390 || SUPERH) |
359 | 359 | ||
360 | select DEBUG_FS if SYSFS | 360 | select DEBUG_FS if SYSFS |
361 | select STACKTRACE if STACKTRACE_SUPPORT | 361 | select STACKTRACE if STACKTRACE_SUPPORT |
diff --git a/mm/Kconfig b/mm/Kconfig index 17b8947aa7da..d34c2b971032 100644 --- a/mm/Kconfig +++ b/mm/Kconfig | |||
@@ -195,7 +195,7 @@ config BOUNCE | |||
195 | config NR_QUICK | 195 | config NR_QUICK |
196 | int | 196 | int |
197 | depends on QUICKLIST | 197 | depends on QUICKLIST |
198 | default "2" if SUPERH || AVR32 | 198 | default "2" if AVR32 |
199 | default "1" | 199 | default "1" |
200 | 200 | ||
201 | config VIRT_TO_BUS | 201 | config VIRT_TO_BUS |