[PATCH] usb: fix build error when USB=m && USB_OTG=y

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



when any driver using usb_bus_start_enum() is
enabled in a build with CONFIG_USB=m, we will
have a build error because of usb_bus_start_enum()
will be compiled into a module (usbcore) and
the driver (phy-fsm-usb.c or phy-isp1301-omap.c)
will be statically linked to the kernel.

The easiest fix in this situation is to move the
definition of usb_bus_start_enum() to usb-common.c
(since it can be used by both host or gadget roles),
and make that a boolean config option, instead of
tristate.

This is another example where usage of 'select'
creates problems.

Cc: <stable@xxxxxxxxxxxxxxx>
Stephen Rothwell <sfr@xxxxxxxxxxxxxxxx>
Signed-off-by: Felipe Balbi <balbi@xxxxxx>
---

I was originally against hiding CONFIG_USB_OTG (and
CONFIG_USB_PHY for that matter) for this specific reason.

When people rely on select to enable things they want,
there's a rather high probability of some dependencies
getting messed up and linux-next having build problems.

Greg, let me know if this patch is acceptable for you -rc
cycle, note that it fixes a build error with allmodconfig,
possibly in any arch.

 drivers/usb/Kconfig      |  2 +-
 drivers/usb/core/hcd.c   | 41 -----------------------------------------
 drivers/usb/usb-common.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 45 insertions(+), 42 deletions(-)

diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index 2642b8a..42d9970b 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -40,7 +40,7 @@ menuconfig USB_SUPPORT
 if USB_SUPPORT
 
 config USB_COMMON
-	tristate
+	bool
 	default y
 	depends on USB || USB_GADGET
 
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 6bffb8c..bed909f 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -2277,47 +2277,6 @@ EXPORT_SYMBOL_GPL(usb_hcd_resume_root_hub);
 
 /*-------------------------------------------------------------------------*/
 
-#ifdef	CONFIG_USB_OTG
-
-/**
- * usb_bus_start_enum - start immediate enumeration (for OTG)
- * @bus: the bus (must use hcd framework)
- * @port_num: 1-based number of port; usually bus->otg_port
- * Context: in_interrupt()
- *
- * Starts enumeration, with an immediate reset followed later by
- * khubd identifying and possibly configuring the device.
- * This is needed by OTG controller drivers, where it helps meet
- * HNP protocol timing requirements for starting a port reset.
- *
- * Return: 0 if successful.
- */
-int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num)
-{
-	struct usb_hcd		*hcd;
-	int			status = -EOPNOTSUPP;
-
-	/* NOTE: since HNP can't start by grabbing the bus's address0_sem,
-	 * boards with root hubs hooked up to internal devices (instead of
-	 * just the OTG port) may need more attention to resetting...
-	 */
-	hcd = container_of (bus, struct usb_hcd, self);
-	if (port_num && hcd->driver->start_port_reset)
-		status = hcd->driver->start_port_reset(hcd, port_num);
-
-	/* run khubd shortly after (first) root port reset finishes;
-	 * it may issue others, until at least 50 msecs have passed.
-	 */
-	if (status == 0)
-		mod_timer(&hcd->rh_timer, jiffies + msecs_to_jiffies(10));
-	return status;
-}
-EXPORT_SYMBOL_GPL(usb_bus_start_enum);
-
-#endif
-
-/*-------------------------------------------------------------------------*/
-
 /**
  * usb_hcd_irq - hook IRQs to HCD framework (bus glue)
  * @irq: the IRQ being raised
diff --git a/drivers/usb/usb-common.c b/drivers/usb/usb-common.c
index d771870..f6f6f57 100644
--- a/drivers/usb/usb-common.c
+++ b/drivers/usb/usb-common.c
@@ -14,6 +14,8 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/usb.h>
+#include <linux/usb/hcd.h>
 #include <linux/usb/ch9.h>
 #include <linux/usb/of.h>
 #include <linux/usb/otg.h>
@@ -141,4 +143,46 @@ EXPORT_SYMBOL_GPL(of_usb_get_maximum_speed);
 
 #endif
 
+#ifdef	CONFIG_USB_OTG
+
+/**
+ * usb_bus_start_enum - start immediate enumeration (for OTG)
+ * @bus: the bus (must use hcd framework)
+ * @port_num: 1-based number of port; usually bus->otg_port
+ * Context: in_interrupt()
+ *
+ * Starts enumeration, with an immediate reset followed later by
+ * khubd identifying and possibly configuring the device.
+ * This is needed by OTG controller drivers, where it helps meet
+ * HNP protocol timing requirements for starting a port reset.
+ *
+ * Return: 0 if successful.
+ */
+int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num)
+{
+	struct usb_hcd		*hcd;
+	int			status = -EOPNOTSUPP;
+
+	/* NOTE: since HNP can't start by grabbing the bus's address0_sem,
+	 * boards with root hubs hooked up to internal devices (instead of
+	 * just the OTG port) may need more attention to resetting...
+	 */
+	hcd = container_of (bus, struct usb_hcd, self);
+	if (port_num && hcd->driver->start_port_reset)
+		status = hcd->driver->start_port_reset(hcd, port_num);
+
+	/* run khubd shortly after (first) root port reset finishes;
+	 * it may issue others, until at least 50 msecs have passed.
+	 */
+	if (status == 0)
+		mod_timer(&hcd->rh_timer, jiffies + msecs_to_jiffies(10));
+	return status;
+}
+EXPORT_SYMBOL_GPL(usb_bus_start_enum);
+
+#endif
+
+/*-------------------------------------------------------------------------*/
+
+
 MODULE_LICENSE("GPL");
-- 
1.8.4.GIT

--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]