2009-02-08 21:36:13 +02:00
|
|
|
--- a/arch/arm/mach-pxa/gumstix.c
|
|
|
|
+++ b/arch/arm/mach-pxa/gumstix.c
|
2008-04-27 19:56:19 +03:00
|
|
|
@@ -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);
|
2009-02-08 21:36:13 +02:00
|
|
|
--- a/drivers/usb/gadget/ether.c
|
|
|
|
+++ b/drivers/usb/gadget/ether.c
|
2008-04-27 19:56:19 +03:00
|
|
|
@@ -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
|
2009-02-08 21:36:13 +02:00
|
|
|
--- a/drivers/usb/gadget/file_storage.c
|
|
|
|
+++ b/drivers/usb/gadget/file_storage.c
|
2008-04-27 19:56:19 +03:00
|
|
|
@@ -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);
|
2009-02-08 21:36:13 +02:00
|
|
|
--- a/drivers/usb/gadget/serial.c
|
|
|
|
+++ b/drivers/usb/gadget/serial.c
|
2008-04-27 19:56:19 +03:00
|
|
|
@@ -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;
|
2009-02-08 21:36:13 +02:00
|
|
|
--- a/drivers/usb/gadget/zero.c
|
|
|
|
+++ b/drivers/usb/gadget/zero.c
|
2008-04-27 19:56:19 +03:00
|
|
|
@@ -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;
|