[PATCH 32/50] ARM: omap: usbboot: Enable USB communication when needed

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

 



Instead of activating USB communication unconditionally in an initcall,
let the users activate it once they need it. This gets us rid of an
initcall that is not protected against running on foreign SoCs.

Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx>
---
 arch/arm/boards/archosg9/board.c      | 12 ++++++++----
 arch/arm/mach-omap/omap4_rom_usb.c    |  4 +++-
 drivers/serial/serial_omap4_usbboot.c |  6 ++++++
 fs/omap4_usbbootfs.c                  |  3 ++-
 include/mach/omap/omap4_rom_usb.h     | 13 +++++++++++++
 5 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/arch/arm/boards/archosg9/board.c b/arch/arm/boards/archosg9/board.c
index 8aa35262d3..547d21d6ca 100644
--- a/arch/arm/boards/archosg9/board.c
+++ b/arch/arm/boards/archosg9/board.c
@@ -33,13 +33,17 @@
 
 static int archosg9_console_init(void)
 {
+	int ret;
+
 	barebox_set_model("Archos G9");
 	barebox_set_hostname("g9");
 
-	if (IS_ENABLED(CONFIG_DRIVER_SERIAL_OMAP4_USBBOOT) &&
-			omap4_usbboot_ready()) {
-		add_generic_device("serial_omap4_usbboot", DEVICE_ID_DYNAMIC
-			, NULL, 0, 0, 0, NULL);
+	if (IS_ENABLED(CONFIG_DRIVER_SERIAL_OMAP4_USBBOOT)) {
+		ret = omap4_usbboot_open();
+		if (!ret) {
+			add_generic_device("serial_omap4_usbboot", DEVICE_ID_DYNAMIC
+				, NULL, 0, 0, 0, NULL);
+		}
 	}
 	if (IS_ENABLED(CONFIG_DRIVER_SERIAL_NS16550)) {
 		omap44xx_add_uart1();
diff --git a/arch/arm/mach-omap/omap4_rom_usb.c b/arch/arm/mach-omap/omap4_rom_usb.c
index a3e447128f..01c5565a68 100644
--- a/arch/arm/mach-omap/omap4_rom_usb.c
+++ b/arch/arm/mach-omap/omap4_rom_usb.c
@@ -46,6 +46,9 @@ int omap4_usbboot_open(void)
 	int n;
 	u32 base;
 
+	if (omap4_usbboot_ready())
+		return 0;
+
 	if (omap4_revision() >= OMAP4460_ES1_0)
 		base = PUBLIC_API_BASE_4460;
 	else
@@ -82,7 +85,6 @@ int omap4_usbboot_open(void)
 	omap4_usbboot_puts("USB communications initialized\n");
 	return 0;
 }
-core_initcall(omap4_usbboot_open);
 
 int omap4_usbboot_ready(void){
 	return omap4_usbboot_data.ready;
diff --git a/drivers/serial/serial_omap4_usbboot.c b/drivers/serial/serial_omap4_usbboot.c
index 463d217f97..709398966f 100644
--- a/drivers/serial/serial_omap4_usbboot.c
+++ b/drivers/serial/serial_omap4_usbboot.c
@@ -49,6 +49,12 @@ static int serial_omap4_usbboot_getc(struct console_device *cdev)
 static int serial_omap4_usbboot_probe(struct device *dev)
 {
 	struct serial_omap4_usbboot_priv *priv;
+	int ret;
+
+	ret = omap4_usbboot_open();
+	if (ret)
+		return ret;
+	
 	priv = xzalloc(sizeof(*priv));
 
 	priv->cdev.dev = dev;
diff --git a/fs/omap4_usbbootfs.c b/fs/omap4_usbbootfs.c
index 9b0755d539..30392d1192 100644
--- a/fs/omap4_usbbootfs.c
+++ b/fs/omap4_usbbootfs.c
@@ -143,8 +143,9 @@ static int omap4_usbbootfs_stat(struct device *dev, const char *filename,
 
 static int omap4_usbbootfs_probe(struct device *dev)
 {
-	return 0;
+	return omap4_usbboot_open();
 }
+
 static void omap4_usbbootfs_remove(struct device *dev)
 {
 }
diff --git a/include/mach/omap/omap4_rom_usb.h b/include/mach/omap/omap4_rom_usb.h
index bf8bd159ad..66295eb11e 100644
--- a/include/mach/omap/omap4_rom_usb.h
+++ b/include/mach/omap/omap4_rom_usb.h
@@ -125,8 +125,21 @@ struct omap4_usbboot {
 	int ready;
 };
 
+#ifdef CONFIG_OMAP4_USBBOOT
 int omap4_usbboot_open(void);
 int omap4_usbboot_ready(void);
+#else
+static inline int omap4_usbboot_open(void)
+{
+	return -ENODEV;
+}
+
+static inline int omap4_usbboot_ready(void)
+{
+	return 0;
+}
+#endif
+
 void omap4_usbboot_close(void);
 
 void omap4_usbboot_queue_read(void *data, unsigned len);
-- 
2.30.2





[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux