2  * epautoconf.c -- endpoint autoconfiguration for usb gadget drivers
 
   4  * Copyright (C) 2004 David Brownell
 
   6  * This program is free software; you can redistribute it and/or modify
 
   7  * it under the terms of the GNU General Public License as published by
 
   8  * the Free Software Foundation; either version 2 of the License, or
 
   9  * (at your option) any later version.
 
  11  * This program is distributed in the hope that it will be useful,
 
  12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  14  * GNU General Public License for more details.
 
  16  * You should have received a copy of the GNU General Public License
 
  17  * along with this program; if not, write to the Free Software
 
  18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
  22 #include <linux/kernel.h>
 
  23 #include <linux/init.h>
 
  24 #include <linux/types.h>
 
  25 #include <linux/device.h>
 
  27 #include <linux/ctype.h>
 
  28 #include <linux/string.h>
 
  30 #include <linux/usb/ch9.h>
 
  31 #include <linux/usb/gadget.h>
 
  33 #include "gadget_chips.h"
 
  36 /* we must assign addresses for configurable endpoints (like net2280) */
 
  37 static __initdata unsigned epnum;
 
  39 // #define MANY_ENDPOINTS
 
  41 /* more than 15 configurable endpoints */
 
  42 static __initdata unsigned in_epnum;
 
  47  * This should work with endpoints from controller drivers sharing the
 
  48  * same endpoint naming convention.  By example:
 
  50  *      - ep1, ep2, ... address is fixed, not direction or type
 
  51  *      - ep1in, ep2out, ... address and direction are fixed, not type
 
  52  *      - ep1-bulk, ep2-bulk, ... address and type are fixed, not direction
 
  53  *      - ep1in-bulk, ep2out-iso, ... all three are fixed
 
  54  *      - ep-* ... no functionality restrictions
 
  56  * Type suffixes are "-bulk", "-iso", or "-int".  Numbers are decimal.
 
  57  * Less common restrictions are implied by gadget_is_*().
 
  59  * NOTE:  each endpoint is unidirectional, as specified by its USB
 
  60  * descriptor; and isn't specific to a configuration or altsetting.
 
  64         struct usb_gadget               *gadget,
 
  66         struct usb_endpoint_descriptor  *desc
 
  73         /* endpoint already claimed? */
 
  74         if (NULL != ep->driver_data)
 
  77         /* only support ep0 for portable CONTROL traffic */
 
  78         type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
 
  79         if (USB_ENDPOINT_XFER_CONTROL == type)
 
  82         /* some other naming convention */
 
  83         if ('e' != ep->name[0])
 
  86         /* type-restriction:  "-iso", "-bulk", or "-int".
 
  87          * direction-restriction:  "in", "out".
 
  89         if ('-' != ep->name[2]) {
 
  90                 tmp = strrchr (ep->name, '-');
 
  93                         case USB_ENDPOINT_XFER_INT:
 
  94                                 /* bulk endpoints handle interrupt transfers,
 
  95                                  * except the toggle-quirky iso-synch kind
 
  97                                 if ('s' == tmp[2])      // == "-iso"
 
  99                                 /* for now, avoid PXA "interrupt-in";
 
 100                                  * it's documented as never using DATA1.
 
 102                                 if (gadget_is_pxa (gadget)
 
 106                         case USB_ENDPOINT_XFER_BULK:
 
 107                                 if ('b' != tmp[1])      // != "-bulk"
 
 110                         case USB_ENDPOINT_XFER_ISOC:
 
 111                                 if ('s' != tmp[2])      // != "-iso"
 
 115                         tmp = ep->name + strlen (ep->name);
 
 118                 /* direction-restriction:  "..in-..", "out-.." */
 
 120                 if (!isdigit (*tmp)) {
 
 121                         if (desc->bEndpointAddress & USB_DIR_IN) {
 
 131         /* endpoint maxpacket size is an input parameter, except for bulk
 
 132          * where it's an output parameter representing the full speed limit.
 
 133          * the usb spec fixes high speed bulk maxpacket at 512 bytes.
 
 135         max = 0x7ff & le16_to_cpu(desc->wMaxPacketSize);
 
 137         case USB_ENDPOINT_XFER_INT:
 
 138                 /* INT:  limit 64 bytes full speed, 1024 high speed */
 
 139                 if (!gadget->is_dualspeed && max > 64)
 
 143         case USB_ENDPOINT_XFER_ISOC:
 
 144                 /* ISO:  limit 1023 bytes full speed, 1024 high speed */
 
 145                 if (ep->maxpacket < max)
 
 147                 if (!gadget->is_dualspeed && max > 1023)
 
 150                 /* BOTH:  "high bandwidth" works only at high speed */
 
 151                 if ((desc->wMaxPacketSize & __constant_cpu_to_le16(3<<11))) {
 
 152                         if (!gadget->is_dualspeed)
 
 154                         /* configure your hardware with enough buffering!! */
 
 162         desc->bEndpointAddress &= USB_DIR_IN;
 
 163         if (isdigit (ep->name [2])) {
 
 164                 u8      num = simple_strtol (&ep->name [2], NULL, 10);
 
 165                 desc->bEndpointAddress |= num;
 
 166 #ifdef  MANY_ENDPOINTS
 
 167         } else if (desc->bEndpointAddress & USB_DIR_IN) {
 
 170                 desc->bEndpointAddress = USB_DIR_IN | in_epnum;
 
 175                 desc->bEndpointAddress |= epnum;
 
 178         /* report (variable) full speed bulk maxpacket */
 
 179         if (USB_ENDPOINT_XFER_BULK == type) {
 
 180                 int size = ep->maxpacket;
 
 182                 /* min() doesn't work on bitfields with gcc-3.5 */
 
 185                 desc->wMaxPacketSize = cpu_to_le16(size);
 
 190 static struct usb_ep * __init
 
 191 find_ep (struct usb_gadget *gadget, const char *name)
 
 195         list_for_each_entry (ep, &gadget->ep_list, ep_list) {
 
 196                 if (0 == strcmp (ep->name, name))
 
 203  * usb_ep_autoconfig - choose an endpoint matching the descriptor
 
 204  * @gadget: The device to which the endpoint must belong.
 
 205  * @desc: Endpoint descriptor, with endpoint direction and transfer mode
 
 206  *      initialized.  For periodic transfers, the maximum packet
 
 207  *      size must also be initialized.  This is modified on success.
 
 209  * By choosing an endpoint to use with the specified descriptor, this
 
 210  * routine simplifies writing gadget drivers that work with multiple
 
 211  * USB device controllers.  The endpoint would be passed later to
 
 212  * usb_ep_enable(), along with some descriptor.
 
 214  * That second descriptor won't always be the same as the first one.
 
 215  * For example, isochronous endpoints can be autoconfigured for high
 
 216  * bandwidth, and then used in several lower bandwidth altsettings.
 
 217  * Also, high and full speed descriptors will be different.
 
 219  * Be sure to examine and test the results of autoconfiguration on your
 
 220  * hardware.  This code may not make the best choices about how to use the
 
 221  * USB controller, and it can't know all the restrictions that may apply.
 
 222  * Some combinations of driver and hardware won't be able to autoconfigure.
 
 224  * On success, this returns an un-claimed usb_ep, and modifies the endpoint
 
 225  * descriptor bEndpointAddress.  For bulk endpoints, the wMaxPacket value
 
 226  * is initialized as if the endpoint were used at full speed.  To prevent
 
 227  * the endpoint from being returned by a later autoconfig call, claim it
 
 228  * by assigning ep->driver_data to some non-null value.
 
 230  * On failure, this returns a null endpoint descriptor.
 
 232 struct usb_ep * __init usb_ep_autoconfig (
 
 233         struct usb_gadget               *gadget,
 
 234         struct usb_endpoint_descriptor  *desc
 
 240         type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
 
 242         /* First, apply chip-specific "best usage" knowledge.
 
 243          * This might make a good usb_gadget_ops hook ...
 
 245         if (gadget_is_net2280 (gadget) && type == USB_ENDPOINT_XFER_INT) {
 
 246                 /* ep-e, ep-f are PIO with only 64 byte fifos */
 
 247                 ep = find_ep (gadget, "ep-e");
 
 248                 if (ep && ep_matches (gadget, ep, desc))
 
 250                 ep = find_ep (gadget, "ep-f");
 
 251                 if (ep && ep_matches (gadget, ep, desc))
 
 254         } else if (gadget_is_goku (gadget)) {
 
 255                 if (USB_ENDPOINT_XFER_INT == type) {
 
 256                         /* single buffering is enough */
 
 257                         ep = find_ep (gadget, "ep3-bulk");
 
 258                         if (ep && ep_matches (gadget, ep, desc))
 
 260                 } else if (USB_ENDPOINT_XFER_BULK == type
 
 261                                 && (USB_DIR_IN & desc->bEndpointAddress)) {
 
 262                         /* DMA may be available */
 
 263                         ep = find_ep (gadget, "ep2-bulk");
 
 264                         if (ep && ep_matches (gadget, ep, desc))
 
 268         } else if (gadget_is_sh (gadget) && USB_ENDPOINT_XFER_INT == type) {
 
 269                 /* single buffering is enough; maybe 8 byte fifo is too */
 
 270                 ep = find_ep (gadget, "ep3in-bulk");
 
 271                 if (ep && ep_matches (gadget, ep, desc))
 
 274         } else if (gadget_is_mq11xx (gadget) && USB_ENDPOINT_XFER_INT == type) {
 
 275                 ep = find_ep (gadget, "ep1-bulk");
 
 276                 if (ep && ep_matches (gadget, ep, desc))
 
 280         /* Second, look at endpoints until an unclaimed one looks usable */
 
 281         list_for_each_entry (ep, &gadget->ep_list, ep_list) {
 
 282                 if (ep_matches (gadget, ep, desc))
 
 291  * usb_ep_autoconfig_reset - reset endpoint autoconfig state
 
 292  * @gadget: device for which autoconfig state will be reset
 
 294  * Use this for devices where one configuration may need to assign
 
 295  * endpoint resources very differently from the next one.  It clears
 
 296  * state such as ep->driver_data and the record of assigned endpoints
 
 297  * used by usb_ep_autoconfig().
 
 299 void __init usb_ep_autoconfig_reset (struct usb_gadget *gadget)
 
 303         list_for_each_entry (ep, &gadget->ep_list, ep_list) {
 
 304                 ep->driver_data = NULL;
 
 306 #ifdef  MANY_ENDPOINTS