usb: ohci-nxp: enable compile-testing
authorArnd Bergmann <arnd@arndb.de>
Fri, 9 Aug 2019 14:40:27 +0000 (16:40 +0200)
committerArnd Bergmann <arnd@arndb.de>
Thu, 15 Aug 2019 19:32:56 +0000 (21:32 +0200)
The driver hardcodes a hardware I/O address the way one should
generally not do, and this prevents both compile-testing, and
moving the platform to CONFIG_ARCH_MULTIPLATFORM.

Change the code to be independent of the machine headers
to allow those two. Removing the hardcoded address would
be hard and is not necessary, so leave that in place for now.

Link: https://lore.kernel.org/r/20190809144043.476786-2-arnd@arndb.de
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
drivers/usb/host/Kconfig
drivers/usb/host/ohci-nxp.c

index 40b5de5..73d233d 100644 (file)
@@ -441,7 +441,8 @@ config USB_OHCI_HCD_S3C2410
 
 config USB_OHCI_HCD_LPC32XX
        tristate "Support for LPC on-chip OHCI USB controller"
-       depends on USB_OHCI_HCD && ARCH_LPC32XX
+       depends on USB_OHCI_HCD
+       depends on ARCH_LPC32XX || COMPILE_TEST
        depends on USB_ISP1301
        default y
        ---help---
index f5f5326..c561881 100644 (file)
 
 #include "ohci.h"
 
-#include <mach/hardware.h>
-
 #define USB_CONFIG_BASE                0x31020000
-#define USB_OTG_STAT_CONTROL   IO_ADDRESS(USB_CONFIG_BASE + 0x110)
 
 /* USB_OTG_STAT_CONTROL bit defines */
 #define TRANSPARENT_I2C_EN     (1 << 7)
@@ -122,19 +119,33 @@ static inline void isp1301_vbus_off(void)
 
 static void ohci_nxp_start_hc(void)
 {
-       unsigned long tmp = __raw_readl(USB_OTG_STAT_CONTROL) | HOST_EN;
+       void __iomem *usb_otg_stat_control = ioremap(USB_CONFIG_BASE + 0x110, 4);
+       unsigned long tmp;
+
+       if (WARN_ON(!usb_otg_stat_control))
+               return;
+
+       tmp = __raw_readl(usb_otg_stat_control) | HOST_EN;
 
-       __raw_writel(tmp, USB_OTG_STAT_CONTROL);
+       __raw_writel(tmp, usb_otg_stat_control);
        isp1301_vbus_on();
+
+       iounmap(usb_otg_stat_control);
 }
 
 static void ohci_nxp_stop_hc(void)
 {
+       void __iomem *usb_otg_stat_control = ioremap(USB_CONFIG_BASE + 0x110, 4);
        unsigned long tmp;
 
+       if (WARN_ON(!usb_otg_stat_control))
+               return;
+
        isp1301_vbus_off();
-       tmp = __raw_readl(USB_OTG_STAT_CONTROL) & ~HOST_EN;
-       __raw_writel(tmp, USB_OTG_STAT_CONTROL);
+       tmp = __raw_readl(usb_otg_stat_control) & ~HOST_EN;
+       __raw_writel(tmp, usb_otg_stat_control);
+
+       iounmap(usb_otg_stat_control);
 }
 
 static int ohci_hcd_nxp_probe(struct platform_device *pdev)