From d6e1e759473e3b62bb2a7b906bbb27f1f1f2aff2 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Wed, 19 Aug 2009 14:54:18 +0200 Subject: [PATCH] usb --- drivers/usb/Kconfig | 1 + drivers/usb/core/hub.c | 43 +++++++++++++++++++++++++++++++++++++ drivers/usb/gadget/Kconfig | 18 ++++++++++++++- drivers/usb/gadget/Makefile | 3 ++ drivers/usb/gadget/gadget_chips.h | 9 +++++++ 5 files changed, 73 insertions(+), 1 deletions(-) diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index dcd49f1..a520bed 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig @@ -44,6 +44,7 @@ config USB_ARCH_HAS_OHCI default y if PPC_MPC52xx # MIPS: default y if SOC_AU1X00 + default y if JZSOC # SH: default y if CPU_SUBTYPE_SH7720 default y if CPU_SUBTYPE_SH7721 diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 71f86c6..d3f9344 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -1857,6 +1857,25 @@ static int hub_port_reset(struct usb_hub *hub, int port1, { int i, status; +#ifdef CONFIG_SOC_JZ4730 + /* + * On Jz4730, we assume that the first USB port was used as device. + * If not, please comment next lines. + */ + if (port1 == 1) { + return 0; + } +#endif + +#if defined(CONFIG_SOC_JZ4740) || defined(CONFIG_SOC_JZ4750) || defined(CONFIG_SOC_JZ4750D) + /* + * On Jz4740 and Jz4750, the second USB port was used as device. + */ + if (port1 == 2) { + return 0; + } +#endif + /* Block EHCI CF initialization during the port reset. * Some companion controllers don't like it when they mix. */ @@ -2818,11 +2837,35 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, le16_to_cpu(hub->descriptor->wHubCharacteristics); struct usb_device *udev; int status, i; +#ifdef CONFIG_JZSOC + static char jzhub = 1; /* the hub first to be initialized is jzsoc on-chip hub */ +#endif dev_dbg (hub_dev, "port %d, status %04x, change %04x, %s\n", port1, portstatus, portchange, portspeed (portstatus)); +#ifdef CONFIG_SOC_JZ4730 + /* + * On Jz4730, we assume that the first USB port was used as device. + * If not, please comment next lines. + */ + if ((port1 == 1) && (jzhub)) { + jzhub = 0; + return; + } +#endif + +#if defined(CONFIG_SOC_JZ4740) || defined(CONFIG_SOC_JZ4750) || defined(CONFIG_SOC_JZ4750D) + /* + * On Jz4740 and Jz4750, the second USB port was used as device. + */ + if ((port1 == 2) && (jzhub)) { + jzhub = 0; + return; + } +#endif + if (hub->has_indicators) { set_port_led(hub, port1, HUB_LED_AUTO); hub->indicator[port1-1] = INDICATOR_AUTO; diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 7f8e83a..a973ce7 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -121,11 +121,25 @@ choice # # Integrated controllers # +config USB_GADGET_JZ4740 + boolean "JZ4740 UDC" + depends on SOC_JZ4740 + select USB_GADGET_SELECTED + select USB_GADGET_DUALSPEED + help + Select this to support the Ingenic JZ4740 processor + high speed USB device controller. + +config USB_JZ4740 + tristate + depends on USB_GADGET_JZ4740 + default USB_GADGET config USB_GADGET_AT91 boolean "Atmel AT91 USB Device Port" depends on ARCH_AT91 && !ARCH_AT91SAM9RL && !ARCH_AT91CAP9 select USB_GADGET_SELECTED + help Many Atmel AT91 processors (such as the AT91RM2000) have a full speed USB Device Port with support for five configurable @@ -534,6 +547,10 @@ config USB_DUMMY_HCD endchoice +config USB_JZ_UDC_HOTPLUG + boolean "Ingenic USB Device Controller Hotplug Support" + depends on USB_GADGET_JZ4750 + config USB_GADGET_DUALSPEED bool depends on USB_GADGET @@ -541,7 +558,6 @@ config USB_GADGET_DUALSPEED help Means that gadget drivers should include extra descriptors and code to handle dual-speed controllers. - # # USB Gadget Drivers # diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index e6017e6..b758686 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile @@ -27,6 +27,9 @@ obj-$(CONFIG_USB_FSL_QE) += fsl_qe_udc.o obj-$(CONFIG_USB_CI13XXX) += ci13xxx_udc.o obj-$(CONFIG_USB_S3C_HSOTG) += s3c-hsotg.o obj-$(CONFIG_USB_LANGWELL) += langwell_udc.o +obj-$(CONFIG_USB_JZ4740) += jz4740_udc.o + +obj-$(CONFIG_USB_JZ_UDC_HOTPLUG)+= udc_hotplug_core.o # # USB gadget drivers diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h index 8e0e9a0..d9c0990 100644 --- a/drivers/usb/gadget/gadget_chips.h +++ b/drivers/usb/gadget/gadget_chips.h @@ -15,6 +15,12 @@ #ifndef __GADGET_CHIPS_H #define __GADGET_CHIPS_H +#ifdef CONFIG_USB_GADGET_JZ4740 +#define gadget_is_jz4740(g) !strcmp("ingenic_hsusb", (g)->name) +#else +#define gadget_is_jz4740(g) 0 +#endif + #ifdef CONFIG_USB_GADGET_NET2280 #define gadget_is_net2280(g) !strcmp("net2280", (g)->name) #else @@ -239,6 +245,9 @@ static inline int usb_gadget_controller_number(struct usb_gadget *gadget) return 0x23; else if (gadget_is_langwell(gadget)) return 0x24; + else if (gadget_is_jz4740(gadget)) + return 0x25; + return -ENOENT; } -- 1.5.6.5