--- a/arch/arm/mach-pxa/gumstix.c +++ b/arch/arm/mach-pxa/gumstix.c @@ -22,6 +22,7 @@ #include <asm/mach-types.h> #include <asm/mach/arch.h> #include <asm/mach/irq.h> +#include <asm/arch/ohci.h> #include <asm/arch/udc.h> #include <asm/arch/mmc.h> #include <asm/arch/pxa-regs.h> @@ -178,9 +179,34 @@ static struct platform_device *devices[] &gum_audio_device, }; +#ifdef CONFIG_ARCH_GUMSTIX_VERDEX +static int gumstix_ohci_init(struct device *dev) +{ + /* setup Port1 GPIO pin. */ + //pxa_gpio_mode( 88 | GPIO_ALT_FN_1_IN); /* USBHPWR1 */ + //pxa_gpio_mode( 89 | GPIO_ALT_FN_2_OUT); /* USBHPEN1 */ + + // Turn on port 2 in host mode + UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE; + + UHCHR = (UHCHR) & + ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE); + + return 0; +} + +static struct pxaohci_platform_data gumstix_ohci_platform_data = { + .port_mode = PMM_PERPORT_MODE, + .init = gumstix_ohci_init, +}; +#endif + static void __init gumstix_init(void) { pxa_set_mci_info(&gumstix_mci_platform_data); +#ifdef CONFIG_ARCH_GUMSTIX_VERDEX + pxa_set_ohci_info(&gumstix_ohci_platform_data); +#endif pxa_set_udc_info(&gumstix_udc_info); #if defined(CONFIG_FB_PXA_ALPS_CDOLLAR) | defined(CONFIG_FB_PXA_SHARP_LQ043_PSP) | defined(CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C) set_pxa_fb_info(&gumstix_fb_info); --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c @@ -260,6 +260,8 @@ MODULE_PARM_DESC(host_addr, "Host Ethern #ifdef CONFIG_USB_GADGET_PXA27X #define DEV_CONFIG_CDC +extern struct usb_ep* pxa27x_ep_config(struct usb_gadget *gadget, + struct usb_endpoint_descriptor *desc,int config,int interface,int alt); #endif #ifdef CONFIG_USB_GADGET_S3C2410 @@ -482,15 +484,15 @@ eth_config = { #ifdef CONFIG_USB_ETH_RNDIS static struct usb_config_descriptor rndis_config = { - .bLength = sizeof rndis_config, + .bLength = sizeof rndis_config, .bDescriptorType = USB_DT_CONFIG, /* compute wTotalLength on the fly */ - .bNumInterfaces = 2, + .bNumInterfaces = 2, .bConfigurationValue = DEV_RNDIS_CONFIG_VALUE, - .iConfiguration = STRING_RNDIS, + .iConfiguration = STRING_RNDIS, .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, - .bMaxPower = 50, + .bMaxPower = 50, }; #endif @@ -532,15 +534,15 @@ control_intf = { #ifdef CONFIG_USB_ETH_RNDIS static const struct usb_interface_descriptor rndis_control_intf = { - .bLength = sizeof rndis_control_intf, + .bLength = sizeof rndis_control_intf, .bDescriptorType = USB_DT_INTERFACE, .bInterfaceNumber = 0, - .bNumEndpoints = 1, + .bNumEndpoints = 1, .bInterfaceClass = USB_CLASS_COMM, .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM, .bInterfaceProtocol = USB_CDC_ACM_PROTO_VENDOR, - .iInterface = STRING_RNDIS_CONTROL, + .iInterface = STRING_RNDIS_CONTROL, }; #endif @@ -1342,7 +1344,7 @@ static void rndis_response_complete (str static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req) { - struct eth_dev *dev = ep->driver_data; + struct eth_dev *dev = ep->driver_data; int status; /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */ @@ -1578,7 +1580,7 @@ done_set_intf: /* return the result */ buf = rndis_get_next_response (dev->rndis_config, - &value); + &value); if (buf) { memcpy (req->buf, buf, value); req->complete = rndis_response_complete; @@ -2064,7 +2066,7 @@ static void eth_req_free (struct usb_ep static void rndis_control_ack_complete (struct usb_ep *ep, struct usb_request *req) { - struct eth_dev *dev = ep->driver_data; + struct eth_dev *dev = ep->driver_data; if (req->status || req->actual != req->length) DEBUG (dev, @@ -2415,7 +2417,27 @@ eth_bind (struct usb_gadget *gadget) /* all we really need is bulk IN/OUT */ usb_ep_autoconfig_reset (gadget); +#ifdef CONFIG_USB_GADGET_PXA27X +#ifdef CONFIG_USB_ETH_RNDIS + in_ep = pxa27x_ep_config (gadget, &fs_source_desc, + DEV_RNDIS_CONFIG_VALUE, + (int)rndis_data_intf.bInterfaceNumber, + (int)rndis_data_intf.bAlternateSetting); +#elif defined(DEV_CONFIG_CDC) + in_ep = pxa27x_ep_config (gadget, &fs_source_desc, + DEV_CONFIG_VALUE, + (int)data_intf.bInterfaceNumber, + (int)data_intf.bAlternateSetting); +#elif defined(DEV_CONFIG_SUBSET) + in_ep = pxa27x_ep_config (gadget, &fs_source_desc, + DEV_CONFIG_VALUE, + (int)subset_data_intf.bInterfaceNumber, + (int)subset_data_intf.bAlternateSetting); + +#endif //CONFIG_USB_ETH_RNDIS +#else in_ep = usb_ep_autoconfig (gadget, &fs_source_desc); +#endif //CONFIG_USB_GADGET_PXA27X if (!in_ep) { autoconf_fail: dev_err (&gadget->dev, @@ -2425,7 +2447,26 @@ autoconf_fail: } in_ep->driver_data = in_ep; /* claim */ +#ifdef CONFIG_USB_GADGET_PXA27X +#ifdef CONFIG_USB_ETH_RNDIS + out_ep = pxa27x_ep_config (gadget, &fs_sink_desc, + DEV_RNDIS_CONFIG_VALUE, + (int)rndis_data_intf.bInterfaceNumber, + (int)rndis_data_intf.bAlternateSetting); +#elif defined(DEV_CONFIG_CDC) + out_ep = pxa27x_ep_config (gadget, &fs_sink_desc, + DEV_CONFIG_VALUE, + (int)data_intf.bInterfaceNumber, + (int)data_intf.bAlternateSetting); +#elif defined(DEV_CONFIG_SUBSET) + out_ep = pxa27x_ep_config (gadget, &fs_sink_desc, + DEV_CONFIG_VALUE, + (int)subset_data_intf.bInterfaceNumber, + (int)subset_data_intf.bAlternateSetting); +#endif //CONFIG_USB_ETH_RNDIS +#else out_ep = usb_ep_autoconfig (gadget, &fs_sink_desc); +#endif //CONFIG_USB_GADGET_PXA27X if (!out_ep) goto autoconf_fail; out_ep->driver_data = out_ep; /* claim */ @@ -2435,7 +2476,22 @@ autoconf_fail: * Since some hosts expect one, try to allocate one anyway. */ if (cdc || rndis) { +#ifdef CONFIG_USB_GADGET_PXA27X +#ifdef CONFIG_USB_ETH_RNDIS + status_ep = pxa27x_ep_config (gadget, &fs_status_desc, + DEV_RNDIS_CONFIG_VALUE, + (int)rndis_control_intf.bInterfaceNumber, + (int)rndis_control_intf.bAlternateSetting); +#elif defined(DEV_CONFIG_CDC) + status_ep = pxa27x_ep_config (gadget, &fs_status_desc, + DEV_CONFIG_VALUE, + (int)control_intf.bInterfaceNumber, + (int)control_intf.bAlternateSetting); + +#endif //CONFIG_USB_ETH_RNDIS +#else status_ep = usb_ep_autoconfig (gadget, &fs_status_desc); +#endif //CONFIG_USB_GADGET_PXA27X if (status_ep) { status_ep->driver_data = status_ep; /* claim */ } else if (rndis) { @@ -2444,11 +2500,13 @@ autoconf_fail: gadget->name); return -ENODEV; #ifdef DEV_CONFIG_CDC +#ifndef CONFIG_USB_GADGET_PXA27X /* pxa25x only does CDC subset; often used with RNDIS */ } else if (cdc) { control_intf.bNumEndpoints = 0; /* FIXME remove endpoint from descriptor list */ #endif +#endif } } #endif --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c @@ -280,6 +280,12 @@ MODULE_LICENSE("Dual BSD/GPL"); #define DRIVER_PRODUCT_ID 0xa4a5 // Linux-USB File-backed Storage Gadget + +#ifdef CONFIG_USB_GADGET_PXA27X +extern struct usb_ep* pxa27x_ep_config(struct usb_gadget *gadget, + struct usb_endpoint_descriptor *desc,int config,int interface,int alt); +#endif + /* * This driver assumes self-powered hardware and has no way for users to * trigger remote wakeup. It uses autoconfiguration to select endpoints @@ -3920,20 +3926,32 @@ static int __init fsg_bind(struct usb_ga /* Find all the endpoints we will use */ usb_ep_autoconfig_reset(gadget); +#ifdef CONFIG_USB_GADGET_PXA27X + ep = pxa27x_ep_config(gadget, &fs_bulk_in_desc, CONFIG_VALUE, 0, 0); +#else ep = usb_ep_autoconfig(gadget, &fs_bulk_in_desc); +#endif if (!ep) goto autoconf_fail; ep->driver_data = fsg; // claim the endpoint fsg->bulk_in = ep; +#ifdef CONFIG_USB_GADGET_PXA27X + ep = pxa27x_ep_config(gadget, &fs_bulk_out_desc, CONFIG_VALUE, 0, 0); +#else ep = usb_ep_autoconfig(gadget, &fs_bulk_out_desc); +#endif if (!ep) goto autoconf_fail; ep->driver_data = fsg; // claim the endpoint fsg->bulk_out = ep; if (transport_is_cbi()) { +#ifdef CONFIG_USB_GADGET_PXA27X + ep = pxa27x_ep_config(gadget, &fs_intr_in_desc, CONFIG_VALUE, 0, 0); +#else ep = usb_ep_autoconfig(gadget, &fs_intr_in_desc); +#endif if (!ep) goto autoconf_fail; ep->driver_data = fsg; // claim the endpoint @@ -4063,6 +4081,7 @@ autoconf_fail: rc = -ENOTSUPP; out: + ERROR(fsg, "cleaning up on the way out\n"); fsg->state = FSG_STATE_TERMINATED; // The thread is dead fsg_unbind(gadget); close_all_backing_files(fsg); --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c @@ -126,6 +126,10 @@ static int debug = 1; #define GS_LOG2_NOTIFY_INTERVAL 5 /* 1 << 5 == 32 msec */ #define GS_NOTIFY_MAXPACKET 8 +#ifdef CONFIG_USB_GADGET_PXA27X +extern struct usb_ep* pxa27x_ep_config(struct usb_gadget *gadget, + struct usb_endpoint_descriptor *desc,int config,int interface,int alt); +#endif /* Structures */ @@ -1378,20 +1382,32 @@ static int __init gs_bind(struct usb_gad usb_ep_autoconfig_reset(gadget); +#ifdef CONFIG_USB_GADGET_PXA27X + ep = pxa27x_ep_config(gadget, &gs_fullspeed_in_desc, use_acm ? GS_ACM_CONFIG_ID : GS_BULK_CONFIG_ID, gs_bulk_interface_desc.bInterfaceNumber, gs_bulk_interface_desc.bAlternateSetting); +#else ep = usb_ep_autoconfig(gadget, &gs_fullspeed_in_desc); +#endif if (!ep) goto autoconf_fail; EP_IN_NAME = ep->name; ep->driver_data = ep; /* claim the endpoint */ +#ifdef CONFIG_USB_GADGET_PXA27X + ep = pxa27x_ep_config(gadget, &gs_fullspeed_out_desc, use_acm ? GS_ACM_CONFIG_ID : GS_BULK_CONFIG_ID, gs_bulk_interface_desc.bInterfaceNumber, gs_bulk_interface_desc.bAlternateSetting); +#else ep = usb_ep_autoconfig(gadget, &gs_fullspeed_out_desc); +#endif if (!ep) goto autoconf_fail; EP_OUT_NAME = ep->name; ep->driver_data = ep; /* claim the endpoint */ if (use_acm) { +#ifdef CONFIG_USB_GADGET_PXA27X + ep = pxa27x_ep_config(gadget, &gs_fullspeed_notify_desc, GS_BULK_CONFIG_ID, gs_control_interface_desc.bInterfaceNumber, gs_control_interface_desc.bAlternateSetting); +#else ep = usb_ep_autoconfig(gadget, &gs_fullspeed_notify_desc); +#endif if (!ep) { printk(KERN_ERR "gs_bind: cannot run ACM on %s\n", gadget->name); goto autoconf_fail; --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c @@ -212,6 +212,11 @@ module_param (loopdefault, bool, S_IRUGO #define STRING_SOURCE_SINK 250 #define STRING_LOOPBACK 251 +#ifdef CONFIG_USB_GADGET_PXA27X +extern struct usb_ep* pxa27x_ep_config(struct usb_gadget *gadget, + struct usb_endpoint_descriptor *desc,int config,int interface,int alt); +#endif + /* * This device advertises two configurations; these numbers work * on a pxa250 as well as more flexible hardware. @@ -1155,7 +1160,11 @@ zero_bind (struct usb_gadget *gadget) * but there may also be important quirks to address. */ usb_ep_autoconfig_reset (gadget); +#ifdef CONFIG_USB_GADGET_PXA27X + ep = pxa27x_ep_config(gadget, &fs_source_desc, CONFIG_SOURCE_SINK, source_sink_intf.bInterfaceNumber, source_sink_intf.bAlternateSetting); +#else ep = usb_ep_autoconfig (gadget, &fs_source_desc); +#endif if (!ep) { autoconf_fail: printk (KERN_ERR "%s: can't autoconfigure on %s\n", @@ -1164,8 +1173,12 @@ autoconf_fail: } EP_IN_NAME = ep->name; ep->driver_data = ep; /* claim */ - + +#ifdef CONFIG_USB_GADGET_PXA27X + ep = pxa27x_ep_config(gadget, &fs_sink_desc, CONFIG_SOURCE_SINK, source_sink_intf.bInterfaceNumber, source_sink_intf.bAlternateSetting); +#else ep = usb_ep_autoconfig (gadget, &fs_sink_desc); +#endif if (!ep) goto autoconf_fail; EP_OUT_NAME = ep->name;