diff options
| -rw-r--r-- | arch/sh/kernel/cpu/sh3/entry.S | 33 | ||||
| -rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-shx3.c | 17 | ||||
| -rw-r--r-- | arch/sh/kernel/traps_32.c | 5 |
3 files changed, 9 insertions, 46 deletions
diff --git a/arch/sh/kernel/cpu/sh3/entry.S b/arch/sh/kernel/cpu/sh3/entry.S index bb407ef0b91e..3f7e2a22c7c2 100644 --- a/arch/sh/kernel/cpu/sh3/entry.S +++ b/arch/sh/kernel/cpu/sh3/entry.S | |||
| @@ -297,41 +297,8 @@ ENTRY(vbr_base) | |||
| 297 | ! | 297 | ! |
| 298 | .balign 256,0,256 | 298 | .balign 256,0,256 |
| 299 | general_exception: | 299 | general_exception: |
| 300 | #ifndef CONFIG_CPU_SUBTYPE_SHX3 | ||
| 301 | bra handle_exception | 300 | bra handle_exception |
| 302 | sts pr, k3 ! save original pr value in k3 | 301 | sts pr, k3 ! save original pr value in k3 |
| 303 | #else | ||
| 304 | mov.l 1f, k4 | ||
| 305 | mov.l @k4, k4 | ||
| 306 | |||
| 307 | ! Is EXPEVT larger than 0x800? | ||
| 308 | mov #0x8, k0 | ||
| 309 | shll8 k0 | ||
| 310 | cmp/hs k0, k4 | ||
| 311 | bf 0f | ||
| 312 | |||
| 313 | ! then add 0x580 (k2 is 0xd80 or 0xda0) | ||
| 314 | mov #0x58, k0 | ||
| 315 | shll2 k0 | ||
| 316 | shll2 k0 | ||
| 317 | add k0, k4 | ||
| 318 | 0: | ||
| 319 | ! Setup stack and save DSP context (k0 contains original r15 on return) | ||
| 320 | bsr prepare_stack | ||
| 321 | nop | ||
| 322 | |||
| 323 | ! Save registers / Switch to bank 0 | ||
| 324 | mov k4, k2 ! keep vector in k2 | ||
| 325 | mov.l 1f, k4 ! SR bits to clear in k4 | ||
| 326 | bsr save_regs ! needs original pr value in k3 | ||
| 327 | nop | ||
| 328 | |||
| 329 | bra handle_exception_special | ||
| 330 | nop | ||
| 331 | |||
| 332 | .align 2 | ||
| 333 | 1: .long EXPEVT | ||
| 334 | #endif | ||
| 335 | 302 | ||
| 336 | ! prepare_stack() | 303 | ! prepare_stack() |
| 337 | ! - roll back gRB | 304 | ! - roll back gRB |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-shx3.c b/arch/sh/kernel/cpu/sh4a/setup-shx3.c index 485330cf8549..c7ba9166e18a 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-shx3.c +++ b/arch/sh/kernel/cpu/sh4a/setup-shx3.c | |||
| @@ -15,6 +15,15 @@ | |||
| 15 | #include <linux/sh_timer.h> | 15 | #include <linux/sh_timer.h> |
| 16 | #include <asm/mmzone.h> | 16 | #include <asm/mmzone.h> |
| 17 | 17 | ||
| 18 | /* | ||
| 19 | * This intentionally only registers SCIF ports 0, 1, and 3. SCIF 2 | ||
| 20 | * INTEVT values overlap with the FPU EXPEVT ones, requiring special | ||
| 21 | * demuxing in the exception dispatch path. | ||
| 22 | * | ||
| 23 | * As this overlap is something that never should have made it in to | ||
| 24 | * silicon in the first place, we just refuse to deal with the port at | ||
| 25 | * all rather than adding infrastructure to hack around it. | ||
| 26 | */ | ||
| 18 | static struct plat_sci_port sci_platform_data[] = { | 27 | static struct plat_sci_port sci_platform_data[] = { |
| 19 | { | 28 | { |
| 20 | .mapbase = 0xffc30000, | 29 | .mapbase = 0xffc30000, |
| @@ -27,11 +36,6 @@ static struct plat_sci_port sci_platform_data[] = { | |||
| 27 | .type = PORT_SCIF, | 36 | .type = PORT_SCIF, |
| 28 | .irqs = { 44, 45, 47, 46 }, | 37 | .irqs = { 44, 45, 47, 46 }, |
| 29 | }, { | 38 | }, { |
| 30 | .mapbase = 0xffc50000, | ||
| 31 | .flags = UPF_BOOT_AUTOCONF, | ||
| 32 | .type = PORT_SCIF, | ||
| 33 | .irqs = { 48, 49, 51, 50 }, | ||
| 34 | }, { | ||
| 35 | .mapbase = 0xffc60000, | 39 | .mapbase = 0xffc60000, |
| 36 | .flags = UPF_BOOT_AUTOCONF, | 40 | .flags = UPF_BOOT_AUTOCONF, |
| 37 | .type = PORT_SCIF, | 41 | .type = PORT_SCIF, |
| @@ -313,8 +317,6 @@ static struct intc_vect vectors[] __initdata = { | |||
| 313 | INTC_VECT(SCIF0_BRI, 0x740), INTC_VECT(SCIF0_TXI, 0x760), | 317 | INTC_VECT(SCIF0_BRI, 0x740), INTC_VECT(SCIF0_TXI, 0x760), |
| 314 | INTC_VECT(SCIF1_ERI, 0x780), INTC_VECT(SCIF1_RXI, 0x7a0), | 318 | INTC_VECT(SCIF1_ERI, 0x780), INTC_VECT(SCIF1_RXI, 0x7a0), |
| 315 | INTC_VECT(SCIF1_BRI, 0x7c0), INTC_VECT(SCIF1_TXI, 0x7e0), | 319 | INTC_VECT(SCIF1_BRI, 0x7c0), INTC_VECT(SCIF1_TXI, 0x7e0), |
| 316 | INTC_VECT(SCIF2_ERI, 0x800), INTC_VECT(SCIF2_RXI, 0x820), | ||
| 317 | INTC_VECT(SCIF2_BRI, 0x840), INTC_VECT(SCIF2_TXI, 0x860), | ||
| 318 | INTC_VECT(SCIF3_ERI, 0x880), INTC_VECT(SCIF3_RXI, 0x8a0), | 320 | INTC_VECT(SCIF3_ERI, 0x880), INTC_VECT(SCIF3_RXI, 0x8a0), |
| 319 | INTC_VECT(SCIF3_BRI, 0x8c0), INTC_VECT(SCIF3_TXI, 0x8e0), | 321 | INTC_VECT(SCIF3_BRI, 0x8c0), INTC_VECT(SCIF3_TXI, 0x8e0), |
| 320 | INTC_VECT(DMAC0_DMINT0, 0x900), INTC_VECT(DMAC0_DMINT1, 0x920), | 322 | INTC_VECT(DMAC0_DMINT0, 0x900), INTC_VECT(DMAC0_DMINT1, 0x920), |
| @@ -355,7 +357,6 @@ static struct intc_group groups[] __initdata = { | |||
| 355 | INTC_GROUP(PCII56789, PCII5, PCII6, PCII7, PCII8, PCII9), | 357 | INTC_GROUP(PCII56789, PCII5, PCII6, PCII7, PCII8, PCII9), |
| 356 | INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI), | 358 | INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI), |
| 357 | INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI), | 359 | INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI), |
| 358 | INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI), | ||
| 359 | INTC_GROUP(SCIF3, SCIF3_ERI, SCIF3_RXI, SCIF3_BRI, SCIF3_TXI), | 360 | INTC_GROUP(SCIF3, SCIF3_ERI, SCIF3_RXI, SCIF3_BRI, SCIF3_TXI), |
| 360 | INTC_GROUP(DMAC0, DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, | 361 | INTC_GROUP(DMAC0, DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, |
| 361 | DMAC0_DMINT3, DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE), | 362 | DMAC0_DMINT3, DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE), |
diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c index 7a2ee3a6b8e7..114d21761823 100644 --- a/arch/sh/kernel/traps_32.c +++ b/arch/sh/kernel/traps_32.c | |||
| @@ -945,14 +945,9 @@ void __init trap_init(void) | |||
| 945 | set_exception_table_evt(0x800, do_reserved_inst); | 945 | set_exception_table_evt(0x800, do_reserved_inst); |
| 946 | set_exception_table_evt(0x820, do_illegal_slot_inst); | 946 | set_exception_table_evt(0x820, do_illegal_slot_inst); |
| 947 | #elif defined(CONFIG_SH_FPU) | 947 | #elif defined(CONFIG_SH_FPU) |
| 948 | #ifdef CONFIG_CPU_SUBTYPE_SHX3 | ||
| 949 | set_exception_table_evt(0xd80, fpu_state_restore_trap_handler); | ||
| 950 | set_exception_table_evt(0xda0, fpu_state_restore_trap_handler); | ||
| 951 | #else | ||
| 952 | set_exception_table_evt(0x800, fpu_state_restore_trap_handler); | 948 | set_exception_table_evt(0x800, fpu_state_restore_trap_handler); |
| 953 | set_exception_table_evt(0x820, fpu_state_restore_trap_handler); | 949 | set_exception_table_evt(0x820, fpu_state_restore_trap_handler); |
| 954 | #endif | 950 | #endif |
| 955 | #endif | ||
| 956 | 951 | ||
| 957 | #ifdef CONFIG_CPU_SH2 | 952 | #ifdef CONFIG_CPU_SH2 |
| 958 | set_exception_table_vec(TRAP_ADDRESS_ERROR, address_error_trap_handler); | 953 | set_exception_table_vec(TRAP_ADDRESS_ERROR, address_error_trap_handler); |
