ARM: pxa: lubbock: pass udc irqs as resource
authorArnd Bergmann <arnd@arndb.de>
Wed, 11 Sep 2019 14:10:33 +0000 (16:10 +0200)
committerArnd Bergmann <arnd@arndb.de>
Sat, 7 May 2022 20:55:47 +0000 (22:55 +0200)
Lubbock is the only machine that has three IRQs for the UDC.
These are currently hardcoded in the driver based on a
machine header file.

Change this to use platform device resources as we use for
the generic IRQ anyway.

Cc: Felipe Balbi <balbi@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-usb@vger.kernel.org
Acked-by: Robert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
arch/arm/mach-pxa/include/mach/lubbock.h [deleted file]
arch/arm/mach-pxa/lubbock.c
arch/arm/mach-pxa/lubbock.h [new file with mode: 0644]
drivers/usb/gadget/udc/pxa25x_udc.c
drivers/usb/gadget/udc/pxa25x_udc.h

diff --git a/arch/arm/mach-pxa/include/mach/lubbock.h b/arch/arm/mach-pxa/include/mach/lubbock.h
deleted file mode 100644 (file)
index a3af4a2..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- *  arch/arm/mach-pxa/include/mach/lubbock.h
- *
- *  Author:    Nicolas Pitre
- *  Created:   Jun 15, 2001
- *  Copyright: MontaVista Software Inc.
- */
-
-#include <mach/irqs.h>
-
-#define LUBBOCK_ETH_PHYS       PXA_CS3_PHYS
-
-#define LUBBOCK_FPGA_PHYS      PXA_CS2_PHYS
-#define LUBBOCK_FPGA_VIRT      (0xf0000000)
-#define LUB_P2V(x)             ((x) - LUBBOCK_FPGA_PHYS + LUBBOCK_FPGA_VIRT)
-#define LUB_V2P(x)             ((x) - LUBBOCK_FPGA_VIRT + LUBBOCK_FPGA_PHYS)
-
-#ifndef __ASSEMBLY__
-#  define __LUB_REG(x)         (*((volatile unsigned long *)LUB_P2V(x)))
-#else
-#  define __LUB_REG(x)         LUB_P2V(x)
-#endif
-
-/* FPGA register virtual addresses */
-#define LUB_WHOAMI             __LUB_REG(LUBBOCK_FPGA_PHYS + 0x000)
-#define LUB_DISC_BLNK_LED      __LUB_REG(LUBBOCK_FPGA_PHYS + 0x040)
-#define LUB_CONF_SWITCHES      __LUB_REG(LUBBOCK_FPGA_PHYS + 0x050)
-#define LUB_USER_SWITCHES      __LUB_REG(LUBBOCK_FPGA_PHYS + 0x060)
-#define LUB_MISC_WR            __LUB_REG(LUBBOCK_FPGA_PHYS + 0x080)
-#define LUB_MISC_RD            __LUB_REG(LUBBOCK_FPGA_PHYS + 0x090)
-#define LUB_IRQ_MASK_EN                __LUB_REG(LUBBOCK_FPGA_PHYS + 0x0c0)
-#define LUB_IRQ_SET_CLR                __LUB_REG(LUBBOCK_FPGA_PHYS + 0x0d0)
-#define LUB_GP                 __LUB_REG(LUBBOCK_FPGA_PHYS + 0x100)
-
-/* Board specific IRQs */
-#define LUBBOCK_NR_IRQS                IRQ_BOARD_START
-
-#define LUBBOCK_IRQ(x)         (LUBBOCK_NR_IRQS + (x))
-#define LUBBOCK_SD_IRQ         LUBBOCK_IRQ(0)
-#define LUBBOCK_SA1111_IRQ     LUBBOCK_IRQ(1)
-#define LUBBOCK_USB_IRQ                LUBBOCK_IRQ(2)  /* usb connect */
-#define LUBBOCK_ETH_IRQ                LUBBOCK_IRQ(3)
-#define LUBBOCK_UCB1400_IRQ    LUBBOCK_IRQ(4)
-#define LUBBOCK_BB_IRQ         LUBBOCK_IRQ(5)
-#define LUBBOCK_USB_DISC_IRQ   LUBBOCK_IRQ(6)  /* usb disconnect */
-#define LUBBOCK_LAST_IRQ       LUBBOCK_IRQ(6)
-
-#define LUBBOCK_SA1111_IRQ_BASE        (LUBBOCK_NR_IRQS + 32)
index 46aef93..201f89f 100644 (file)
@@ -46,7 +46,7 @@
 
 #include "pxa25x.h"
 #include <linux/platform_data/asoc-pxa.h>
-#include <mach/lubbock.h>
+#include "lubbock.h"
 #include "udc.h"
 #include <linux/platform_data/irda-pxaficp.h>
 #include <linux/platform_data/video-pxafb.h>
@@ -131,6 +131,13 @@ static struct pxa2xx_udc_mach_info udc_info __initdata = {
        // no D+ pullup; lubbock can't connect/disconnect in software
 };
 
+static struct resource lubbock_udc_resources[] = {
+       DEFINE_RES_MEM(0x40600000, 0x10000),
+       DEFINE_RES_IRQ(IRQ_USB),
+       DEFINE_RES_IRQ(LUBBOCK_USB_IRQ),
+       DEFINE_RES_IRQ(LUBBOCK_USB_DISC_IRQ),
+};
+
 /* GPIOs for SA1111 PCMCIA */
 static struct gpiod_lookup_table sa1111_pcmcia_gpio_table = {
        .dev_id = "1800",
@@ -496,6 +503,9 @@ static void __init lubbock_init(void)
        lubbock_init_pcmcia();
 
        clk_add_alias("SA1111_CLK", NULL, "GPIO11_CLK", NULL);
+       /* lubbock has two extra IRQs */
+       pxa25x_device_udc.resource = lubbock_udc_resources;
+       pxa25x_device_udc.num_resources = ARRAY_SIZE(lubbock_udc_resources);
        pxa_set_udc_info(&udc_info);
        pxa_set_fb_info(NULL, &sharp_lm8v31);
        pxa_set_mci_info(&lubbock_mci_platform_data);
diff --git a/arch/arm/mach-pxa/lubbock.h b/arch/arm/mach-pxa/lubbock.h
new file mode 100644 (file)
index 0000000..8e3ff7d
--- /dev/null
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ *  Author:    Nicolas Pitre
+ *  Created:   Jun 15, 2001
+ *  Copyright: MontaVista Software Inc.
+ */
+
+#include <mach/irqs.h>
+
+#define LUBBOCK_ETH_PHYS       PXA_CS3_PHYS
+
+#define LUBBOCK_FPGA_PHYS      PXA_CS2_PHYS
+#define LUBBOCK_FPGA_VIRT      (0xf0000000)
+#define LUB_P2V(x)             ((x) - LUBBOCK_FPGA_PHYS + LUBBOCK_FPGA_VIRT)
+#define LUB_V2P(x)             ((x) - LUBBOCK_FPGA_VIRT + LUBBOCK_FPGA_PHYS)
+
+#ifndef __ASSEMBLY__
+#  define __LUB_REG(x)         (*((volatile unsigned long *)LUB_P2V(x)))
+#else
+#  define __LUB_REG(x)         LUB_P2V(x)
+#endif
+
+/* FPGA register virtual addresses */
+#define LUB_WHOAMI             __LUB_REG(LUBBOCK_FPGA_PHYS + 0x000)
+#define LUB_DISC_BLNK_LED      __LUB_REG(LUBBOCK_FPGA_PHYS + 0x040)
+#define LUB_CONF_SWITCHES      __LUB_REG(LUBBOCK_FPGA_PHYS + 0x050)
+#define LUB_USER_SWITCHES      __LUB_REG(LUBBOCK_FPGA_PHYS + 0x060)
+#define LUB_MISC_WR            __LUB_REG(LUBBOCK_FPGA_PHYS + 0x080)
+#define LUB_MISC_RD            __LUB_REG(LUBBOCK_FPGA_PHYS + 0x090)
+#define LUB_IRQ_MASK_EN                __LUB_REG(LUBBOCK_FPGA_PHYS + 0x0c0)
+#define LUB_IRQ_SET_CLR                __LUB_REG(LUBBOCK_FPGA_PHYS + 0x0d0)
+#define LUB_GP                 __LUB_REG(LUBBOCK_FPGA_PHYS + 0x100)
+
+/* Board specific IRQs */
+#define LUBBOCK_NR_IRQS                IRQ_BOARD_START
+
+#define LUBBOCK_IRQ(x)         (LUBBOCK_NR_IRQS + (x))
+#define LUBBOCK_SD_IRQ         LUBBOCK_IRQ(0)
+#define LUBBOCK_SA1111_IRQ     LUBBOCK_IRQ(1)
+#define LUBBOCK_USB_IRQ                LUBBOCK_IRQ(2)  /* usb connect */
+#define LUBBOCK_ETH_IRQ                LUBBOCK_IRQ(3)
+#define LUBBOCK_UCB1400_IRQ    LUBBOCK_IRQ(4)
+#define LUBBOCK_BB_IRQ         LUBBOCK_IRQ(5)
+#define LUBBOCK_USB_DISC_IRQ   LUBBOCK_IRQ(6)  /* usb disconnect */
+#define LUBBOCK_LAST_IRQ       LUBBOCK_IRQ(6)
+
+#define LUBBOCK_SA1111_IRQ_BASE        (LUBBOCK_NR_IRQS + 32)
index 6c414c9..c593fc3 100644 (file)
 #include <linux/usb/gadget.h>
 #include <linux/usb/otg.h>
 
-#ifdef CONFIG_ARCH_LUBBOCK
-#include <mach/lubbock.h>
-#endif
-
 #define UDCCR   0x0000 /* UDC Control Register */
 #define UDC_RES1 0x0004 /* UDC Undocumented - Reserved1 */
 #define UDC_RES2 0x0008 /* UDC Undocumented - Reserved2 */
@@ -1578,18 +1574,15 @@ lubbock_vbus_irq(int irq, void *_dev)
        int                     vbus;
 
        dev->stats.irqs++;
-       switch (irq) {
-       case LUBBOCK_USB_IRQ:
+       if (irq == dev->usb_irq) {
                vbus = 1;
-               disable_irq(LUBBOCK_USB_IRQ);
-               enable_irq(LUBBOCK_USB_DISC_IRQ);
-               break;
-       case LUBBOCK_USB_DISC_IRQ:
+               disable_irq(dev->usb_irq);
+               enable_irq(dev->usb_disc_irq);
+       } else if (irq == dev->usb_disc_irq) {
                vbus = 0;
-               disable_irq(LUBBOCK_USB_DISC_IRQ);
-               enable_irq(LUBBOCK_USB_IRQ);
-               break;
-       default:
+               disable_irq(dev->usb_disc_irq);
+               enable_irq(dev->usb_irq);
+       } else {
                return IRQ_NONE;
        }
 
@@ -2422,20 +2415,28 @@ static int pxa25x_udc_probe(struct platform_device *pdev)
 
 #ifdef CONFIG_ARCH_LUBBOCK
        if (machine_is_lubbock()) {
-               retval = devm_request_irq(&pdev->dev, LUBBOCK_USB_DISC_IRQ,
+               dev->usb_irq = platform_get_irq(pdev, 1);
+               if (dev->usb_irq < 0)
+                       return dev->usb_irq;
+
+               dev->usb_disc_irq = platform_get_irq(pdev, 2);
+               if (dev->usb_disc_irq < 0)
+                       return dev->usb_disc_irq;
+
+               retval = devm_request_irq(&pdev->dev, dev->usb_disc_irq,
                                          lubbock_vbus_irq, 0, driver_name,
                                          dev);
                if (retval != 0) {
                        pr_err("%s: can't get irq %i, err %d\n",
-                               driver_name, LUBBOCK_USB_DISC_IRQ, retval);
+                               driver_name, dev->usb_disc_irq, retval);
                        goto err;
                }
-               retval = devm_request_irq(&pdev->dev, LUBBOCK_USB_IRQ,
+               retval = devm_request_irq(&pdev->dev, dev->usb_irq,
                                          lubbock_vbus_irq, 0, driver_name,
                                          dev);
                if (retval != 0) {
                        pr_err("%s: can't get irq %i, err %d\n",
-                               driver_name, LUBBOCK_USB_IRQ, retval);
+                               driver_name, dev->usb_irq, retval);
                        goto err;
                }
        } else
index aa4b68f..6ab6047 100644 (file)
@@ -117,16 +117,13 @@ struct pxa25x_udc {
        u64                                     dma_mask;
        struct pxa25x_ep                        ep [PXA_UDC_NUM_ENDPOINTS];
        void __iomem                            *regs;
+       int                                     usb_irq;
+       int                                     usb_disc_irq;
 };
 #define to_pxa25x(g)   (container_of((g), struct pxa25x_udc, gadget))
 
 /*-------------------------------------------------------------------------*/
 
-#ifdef CONFIG_ARCH_LUBBOCK
-#include <mach/lubbock.h>
-/* lubbock can also report usb connect/disconnect irqs */
-#endif
-
 static struct pxa25x_udc *the_controller;
 
 /*-------------------------------------------------------------------------*/