diff options
Diffstat (limited to 'arch/sh/kernel')
-rw-r--r-- | arch/sh/kernel/cpu/irq/intc-sh5.c | 1 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4/probe.c | 1 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7722.c | 2 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7723.c | 49 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7763.c | 9 | ||||
-rw-r--r-- | arch/sh/kernel/module.c | 39 |
6 files changed, 55 insertions, 46 deletions
diff --git a/arch/sh/kernel/cpu/irq/intc-sh5.c b/arch/sh/kernel/cpu/irq/intc-sh5.c index de45c6a3e33b..79baa47af977 100644 --- a/arch/sh/kernel/cpu/irq/intc-sh5.c +++ b/arch/sh/kernel/cpu/irq/intc-sh5.c | |||
@@ -242,6 +242,7 @@ void __init plat_irq_setup(void) | |||
242 | reg += 8; | 242 | reg += 8; |
243 | } | 243 | } |
244 | } | 244 | } |
245 | } | ||
245 | #endif | 246 | #endif |
246 | 247 | ||
247 | /* | 248 | /* |
diff --git a/arch/sh/kernel/cpu/sh4/probe.c b/arch/sh/kernel/cpu/sh4/probe.c index ebceb0dadff5..be4926969181 100644 --- a/arch/sh/kernel/cpu/sh4/probe.c +++ b/arch/sh/kernel/cpu/sh4/probe.c | |||
@@ -132,6 +132,7 @@ int __init detect_cpu_and_cache_system(void) | |||
132 | 132 | ||
133 | switch (prr) { | 133 | switch (prr) { |
134 | case 0x50: | 134 | case 0x50: |
135 | case 0x51: | ||
135 | boot_cpu_data.type = CPU_SH7723; | 136 | boot_cpu_data.type = CPU_SH7723; |
136 | boot_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_L2_CACHE; | 137 | boot_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_L2_CACHE; |
137 | break; | 138 | break; |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c index 069314037049..62ebccf18b3c 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c | |||
@@ -16,7 +16,7 @@ | |||
16 | 16 | ||
17 | static struct resource usbf_resources[] = { | 17 | static struct resource usbf_resources[] = { |
18 | [0] = { | 18 | [0] = { |
19 | .name = "USBF", | 19 | .name = "m66592_udc", |
20 | .start = 0x04480000, | 20 | .start = 0x04480000, |
21 | .end = 0x044800FF, | 21 | .end = 0x044800FF, |
22 | .flags = IORESOURCE_MEM, | 22 | .flags = IORESOURCE_MEM, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c index 16925cf28db8..a0470f2f5479 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c | |||
@@ -16,6 +16,21 @@ | |||
16 | 16 | ||
17 | static struct plat_sci_port sci_platform_data[] = { | 17 | static struct plat_sci_port sci_platform_data[] = { |
18 | { | 18 | { |
19 | .mapbase = 0xffe00000, | ||
20 | .flags = UPF_BOOT_AUTOCONF, | ||
21 | .type = PORT_SCIF, | ||
22 | .irqs = { 80, 80, 80, 80 }, | ||
23 | },{ | ||
24 | .mapbase = 0xffe10000, | ||
25 | .flags = UPF_BOOT_AUTOCONF, | ||
26 | .type = PORT_SCIF, | ||
27 | .irqs = { 81, 81, 81, 81 }, | ||
28 | },{ | ||
29 | .mapbase = 0xffe20000, | ||
30 | .flags = UPF_BOOT_AUTOCONF, | ||
31 | .type = PORT_SCIF, | ||
32 | .irqs = { 82, 82, 82, 82 }, | ||
33 | },{ | ||
19 | .mapbase = 0xa4e30000, | 34 | .mapbase = 0xa4e30000, |
20 | .flags = UPF_BOOT_AUTOCONF, | 35 | .flags = UPF_BOOT_AUTOCONF, |
21 | .type = PORT_SCI, | 36 | .type = PORT_SCI, |
@@ -73,9 +88,35 @@ static struct platform_device rtc_device = { | |||
73 | .resource = rtc_resources, | 88 | .resource = rtc_resources, |
74 | }; | 89 | }; |
75 | 90 | ||
91 | static struct resource sh7723_usb_host_resources[] = { | ||
92 | [0] = { | ||
93 | .name = "r8a66597_hcd", | ||
94 | .start = 0xa4d80000, | ||
95 | .end = 0xa4d800ff, | ||
96 | .flags = IORESOURCE_MEM, | ||
97 | }, | ||
98 | [1] = { | ||
99 | .start = 65, | ||
100 | .end = 65, | ||
101 | .flags = IORESOURCE_IRQ, | ||
102 | }, | ||
103 | }; | ||
104 | |||
105 | static struct platform_device sh7723_usb_host_device = { | ||
106 | .name = "r8a66597_hcd", | ||
107 | .id = 0, | ||
108 | .dev = { | ||
109 | .dma_mask = NULL, /* not use dma */ | ||
110 | .coherent_dma_mask = 0xffffffff, | ||
111 | }, | ||
112 | .num_resources = ARRAY_SIZE(sh7723_usb_host_resources), | ||
113 | .resource = sh7723_usb_host_resources, | ||
114 | }; | ||
115 | |||
76 | static struct platform_device *sh7723_devices[] __initdata = { | 116 | static struct platform_device *sh7723_devices[] __initdata = { |
77 | &sci_device, | 117 | &sci_device, |
78 | &rtc_device, | 118 | &rtc_device, |
119 | &sh7723_usb_host_device, | ||
79 | }; | 120 | }; |
80 | 121 | ||
81 | static int __init sh7723_devices_setup(void) | 122 | static int __init sh7723_devices_setup(void) |
@@ -153,7 +194,7 @@ static struct intc_vect vectors[] __initdata = { | |||
153 | INTC_VECT(VIO_VOUI,0x8E0), | 194 | INTC_VECT(VIO_VOUI,0x8E0), |
154 | 195 | ||
155 | INTC_VECT(SCIFA_SCIFA0,0x900), | 196 | INTC_VECT(SCIFA_SCIFA0,0x900), |
156 | INTC_VECT(VPU_VPUI,0x920), | 197 | INTC_VECT(VPU_VPUI,0x980), |
157 | INTC_VECT(TPU_TPUI,0x9A0), | 198 | INTC_VECT(TPU_TPUI,0x9A0), |
158 | INTC_VECT(ADC_ADI,0x9E0), | 199 | INTC_VECT(ADC_ADI,0x9E0), |
159 | INTC_VECT(USB_USI0,0xA20), | 200 | INTC_VECT(USB_USI0,0xA20), |
@@ -292,9 +333,3 @@ void __init plat_irq_setup(void) | |||
292 | { | 333 | { |
293 | register_intc_controller(&intc_desc); | 334 | register_intc_controller(&intc_desc); |
294 | } | 335 | } |
295 | |||
296 | void __init plat_mem_setup(void) | ||
297 | { | ||
298 | /* Register the URAM space as Node 1 */ | ||
299 | setup_bootmem_node(1, 0x055f0000, 0x05610000); | ||
300 | } | ||
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c index ae2b22219f02..f189a559462b 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c | |||
@@ -291,8 +291,9 @@ static struct intc_sense_reg irq_sense_registers[] __initdata = { | |||
291 | }; | 291 | }; |
292 | 292 | ||
293 | static DECLARE_INTC_DESC(intc_irq_desc, "sh7763-irq", irq_vectors, | 293 | static DECLARE_INTC_DESC(intc_irq_desc, "sh7763-irq", irq_vectors, |
294 | NULL, NULL, irq_mask_registers, irq_prio_registers, | 294 | NULL, irq_mask_registers, irq_prio_registers, |
295 | irq_sense_registers); | 295 | irq_sense_registers); |
296 | |||
296 | 297 | ||
297 | /* External interrupt pins in IRL mode */ | 298 | /* External interrupt pins in IRL mode */ |
298 | static struct intc_vect irl_vectors[] __initdata = { | 299 | static struct intc_vect irl_vectors[] __initdata = { |
@@ -324,10 +325,10 @@ static struct intc_mask_reg irl7654_mask_registers[] __initdata = { | |||
324 | }; | 325 | }; |
325 | 326 | ||
326 | static DECLARE_INTC_DESC(intc_irl7654_desc, "sh7763-irl7654", irl_vectors, | 327 | static DECLARE_INTC_DESC(intc_irl7654_desc, "sh7763-irl7654", irl_vectors, |
327 | NULL, NULL, irl7654_mask_registers, NULL, NULL); | 328 | NULL, irl7654_mask_registers, NULL, NULL); |
328 | 329 | ||
329 | static DECLARE_INTC_DESC(intc_irl3210_desc, "sh7763-irl3210", irl_vectors, | 330 | static DECLARE_INTC_DESC(intc_irl3210_desc, "sh7763-irl3210", irl_vectors, |
330 | NULL, NULL, irl3210_mask_registers, NULL, NULL); | 331 | NULL, irl3210_mask_registers, NULL, NULL); |
331 | 332 | ||
332 | #define INTC_ICR0 0xffd00000 | 333 | #define INTC_ICR0 0xffd00000 |
333 | #define INTC_INTMSK0 0xffd00044 | 334 | #define INTC_INTMSK0 0xffd00044 |
diff --git a/arch/sh/kernel/module.c b/arch/sh/kernel/module.c index b3d0a03b4c76..5482e65375a9 100644 --- a/arch/sh/kernel/module.c +++ b/arch/sh/kernel/module.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/fs.h> | 30 | #include <linux/fs.h> |
31 | #include <linux/string.h> | 31 | #include <linux/string.h> |
32 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
33 | #include <asm/unaligned.h> | ||
33 | 34 | ||
34 | void *module_alloc(unsigned long size) | 35 | void *module_alloc(unsigned long size) |
35 | { | 36 | { |
@@ -56,34 +57,6 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, | |||
56 | return 0; | 57 | return 0; |
57 | } | 58 | } |
58 | 59 | ||
59 | #ifdef CONFIG_SUPERH32 | ||
60 | #define COPY_UNALIGNED_WORD(sw, tw, align) \ | ||
61 | { \ | ||
62 | void *__s = &(sw), *__t = &(tw); \ | ||
63 | unsigned short *__s2 = __s, *__t2 = __t; \ | ||
64 | unsigned char *__s1 = __s, *__t1 = __t; \ | ||
65 | switch ((align)) \ | ||
66 | { \ | ||
67 | case 0: \ | ||
68 | *(unsigned long *) __t = *(unsigned long *) __s; \ | ||
69 | break; \ | ||
70 | case 2: \ | ||
71 | *__t2++ = *__s2++; \ | ||
72 | *__t2 = *__s2; \ | ||
73 | break; \ | ||
74 | default: \ | ||
75 | *__t1++ = *__s1++; \ | ||
76 | *__t1++ = *__s1++; \ | ||
77 | *__t1++ = *__s1++; \ | ||
78 | *__t1 = *__s1; \ | ||
79 | break; \ | ||
80 | } \ | ||
81 | } | ||
82 | #else | ||
83 | /* One thing SHmedia doesn't screw up! */ | ||
84 | #define COPY_UNALIGNED_WORD(sw, tw, align) { (tw) = (sw); } | ||
85 | #endif | ||
86 | |||
87 | int apply_relocate_add(Elf32_Shdr *sechdrs, | 60 | int apply_relocate_add(Elf32_Shdr *sechdrs, |
88 | const char *strtab, | 61 | const char *strtab, |
89 | unsigned int symindex, | 62 | unsigned int symindex, |
@@ -96,7 +69,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, | |||
96 | Elf32_Addr relocation; | 69 | Elf32_Addr relocation; |
97 | uint32_t *location; | 70 | uint32_t *location; |
98 | uint32_t value; | 71 | uint32_t value; |
99 | int align; | ||
100 | 72 | ||
101 | pr_debug("Applying relocate section %u to %u\n", relsec, | 73 | pr_debug("Applying relocate section %u to %u\n", relsec, |
102 | sechdrs[relsec].sh_info); | 74 | sechdrs[relsec].sh_info); |
@@ -109,7 +81,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, | |||
109 | sym = (Elf32_Sym *)sechdrs[symindex].sh_addr | 81 | sym = (Elf32_Sym *)sechdrs[symindex].sh_addr |
110 | + ELF32_R_SYM(rel[i].r_info); | 82 | + ELF32_R_SYM(rel[i].r_info); |
111 | relocation = sym->st_value + rel[i].r_addend; | 83 | relocation = sym->st_value + rel[i].r_addend; |
112 | align = (int)location & 3; | ||
113 | 84 | ||
114 | #ifdef CONFIG_SUPERH64 | 85 | #ifdef CONFIG_SUPERH64 |
115 | /* For text addresses, bit2 of the st_other field indicates | 86 | /* For text addresses, bit2 of the st_other field indicates |
@@ -122,15 +93,15 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, | |||
122 | 93 | ||
123 | switch (ELF32_R_TYPE(rel[i].r_info)) { | 94 | switch (ELF32_R_TYPE(rel[i].r_info)) { |
124 | case R_SH_DIR32: | 95 | case R_SH_DIR32: |
125 | COPY_UNALIGNED_WORD (*location, value, align); | 96 | value = get_unaligned(location); |
126 | value += relocation; | 97 | value += relocation; |
127 | COPY_UNALIGNED_WORD (value, *location, align); | 98 | put_unaligned(value, location); |
128 | break; | 99 | break; |
129 | case R_SH_REL32: | 100 | case R_SH_REL32: |
130 | relocation = (relocation - (Elf32_Addr) location); | 101 | relocation = (relocation - (Elf32_Addr) location); |
131 | COPY_UNALIGNED_WORD (*location, value, align); | 102 | value = get_unaligned(location); |
132 | value += relocation; | 103 | value += relocation; |
133 | COPY_UNALIGNED_WORD (value, *location, align); | 104 | put_unaligned(value, location); |
134 | break; | 105 | break; |
135 | case R_SH_IMM_LOW16: | 106 | case R_SH_IMM_LOW16: |
136 | *location = (*location & ~0x3fffc00) | | 107 | *location = (*location & ~0x3fffc00) | |