OSDN Git Service

sh: Avoid using IRQ0 on SH3 and SH4
authorSergey Shtylyov <s.shtylyov@omp.ru>
Thu, 1 Jun 2023 20:22:17 +0000 (23:22 +0300)
committerJohn Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Sun, 11 Jun 2023 16:22:47 +0000 (18:22 +0200)
IRQ0 is no longer returned by platform_get_irq() and its ilk -- they now
return -EINVAL instead.  However, the kernel code supporting SH3/4-based
SoCs still maps the IRQ #s starting at 0 -- modify that code to start the
IRQ #s from 16 instead.

The patch should mostly affect the AP-SH4A-3A/AP-SH4AD-0A boards as they
indeed are using IRQ0 for the SMSC911x compatible Ethernet chip.

Fixes: ce753ad1549c ("platform: finally disallow IRQ0 in platform_get_irq() and its ilk")
Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Tested-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Link: https://lore.kernel.org/r/71105dbf-cdb0-72e1-f9eb-eeda8e321696@omp.ru
Signed-off-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
arch/sh/include/mach-common/mach/highlander.h
arch/sh/include/mach-common/mach/r2d.h
arch/sh/include/mach-dreamcast/mach/sysasic.h
arch/sh/include/mach-se/mach/se7724.h
arch/sh/kernel/cpu/sh3/entry.S
include/linux/sh_intc.h

index fb44c29..b12c795 100644 (file)
 #define IVDR_CK_ON     4               /* iVDR Clock ON */
 #endif
 
-#define HL_FPGA_IRQ_BASE       200
+#define HL_FPGA_IRQ_BASE       (200 + 16)
 #define HL_NR_IRL              15
 
 #define IRQ_AX88796            (HL_FPGA_IRQ_BASE + 0)
index 0d7e483..69bc190 100644 (file)
@@ -47,7 +47,7 @@
 
 #define IRLCNTR1       (PA_BCR + 0)    /* Interrupt Control Register1 */
 
-#define R2D_FPGA_IRQ_BASE      100
+#define R2D_FPGA_IRQ_BASE      (100 + 16)
 
 #define IRQ_VOYAGER            (R2D_FPGA_IRQ_BASE + 0)
 #define IRQ_EXT                        (R2D_FPGA_IRQ_BASE + 1)
index ed69ce7..3b27be9 100644 (file)
@@ -22,7 +22,7 @@
    takes.
 */
 
-#define HW_EVENT_IRQ_BASE  48
+#define HW_EVENT_IRQ_BASE  (48 + 16)
 
 /* IRQ 13 */
 #define HW_EVENT_VSYNC     (HW_EVENT_IRQ_BASE +  5) /* VSync */
index 1fe2882..ea6c466 100644 (file)
@@ -37,7 +37,7 @@
 #define IRQ2_IRQ        evt2irq(0x640)
 
 /* Bits in IRQ012 registers */
-#define SE7724_FPGA_IRQ_BASE   220
+#define SE7724_FPGA_IRQ_BASE   (220 + 16)
 
 /* IRQ0 */
 #define IRQ0_BASE      SE7724_FPGA_IRQ_BASE
index e48b3dd..b1f5b3c 100644 (file)
@@ -470,9 +470,9 @@ ENTRY(handle_interrupt)
        mov     r4, r0          ! save vector->jmp table offset for later
 
        shlr2   r4              ! vector to IRQ# conversion
-       add     #-0x10, r4
 
-       cmp/pz  r4              ! is it a valid IRQ?
+       mov     #0x10, r5
+       cmp/hs  r5, r4          ! is it a valid IRQ?
        bt      10f
 
        /*
index 37ad810..27ae791 100644 (file)
@@ -13,9 +13,9 @@
 /*
  * Convert back and forth between INTEVT and IRQ values.
  */
-#ifdef CONFIG_CPU_HAS_INTEVT
-#define evt2irq(evt)           (((evt) >> 5) - 16)
-#define irq2evt(irq)           (((irq) + 16) << 5)
+#ifdef CONFIG_CPU_HAS_INTEVT   /* Avoid IRQ0 (invalid for platform devices) */
+#define evt2irq(evt)           ((evt) >> 5)
+#define irq2evt(irq)           ((irq) << 5)
 #else
 #define evt2irq(evt)           (evt)
 #define irq2evt(irq)           (irq)