]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - include/usb.h
net: designware: Make driver independent from DM_GPIO again
[people/ms/u-boot.git] / include / usb.h
index 4c210502031eb0585c863418380e640dfa65aa24..02a0ccdd77b370b4bd62d858a2c797e926fd03f2 100644 (file)
@@ -96,7 +96,7 @@ enum {
  * (the hubs) have this as parent data. Hubs are children of controllers or
  * other hubs and there is always a single root hub for each controller.
  * Therefore struct usb_device can always be accessed with
- * dev_get_parentdata(dev), where dev is a USB device.
+ * dev_get_parent_priv(dev), where dev is a USB device.
  *
  * Pointers exist for obtaining both the device (could be any uclass) and
  * controller (UCLASS_USB) from this structure. The controller does not have
@@ -130,7 +130,7 @@ struct usb_device {
        int string_langid;              /* language ID for strings */
        int (*irq_handle)(struct usb_device *dev);
        unsigned long irq_status;
-       int irq_act_len;                /* transfered bytes */
+       int irq_act_len;                /* transferred bytes */
        void *privptr;
        /*
         * Child devices -  if this is a hub device
@@ -138,7 +138,7 @@ struct usb_device {
         */
        unsigned long status;
        unsigned long int_pending;      /* 1 bit per ep, used by int_queue */
-       int act_len;                    /* transfered bytes */
+       int act_len;                    /* transferred bytes */
        int maxchild;                   /* Number of ports if hub */
        int portnr;                     /* Port number, 1=first */
 #ifndef CONFIG_DM_USB
@@ -171,24 +171,13 @@ enum usb_init_type {
  * this is how the lowlevel part communicate with the outer world
  */
 
-#if defined(CONFIG_USB_UHCI) || defined(CONFIG_USB_OHCI) || \
-       defined(CONFIG_USB_EHCI) || defined(CONFIG_USB_OHCI_NEW) || \
-       defined(CONFIG_USB_SL811HS) || defined(CONFIG_USB_ISP116X_HCD) || \
-       defined(CONFIG_USB_R8A66597_HCD) || defined(CONFIG_USB_DAVINCI) || \
-       defined(CONFIG_USB_OMAP3) || defined(CONFIG_USB_DA8XX) || \
-       defined(CONFIG_USB_BLACKFIN) || defined(CONFIG_USB_AM35X) || \
-       defined(CONFIG_USB_MUSB_DSPS) || defined(CONFIG_USB_MUSB_AM35X) || \
-       defined(CONFIG_USB_MUSB_OMAP2PLUS) || defined(CONFIG_USB_MUSB_SUNXI) || \
-       defined(CONFIG_USB_XHCI) || defined(CONFIG_USB_DWC2) || \
-       defined(CONFIG_USB_EMUL)
-
 int usb_lowlevel_init(int index, enum usb_init_type init, void **controller);
 int usb_lowlevel_stop(int index);
 
-#if defined(CONFIG_MUSB_HOST) || defined(CONFIG_DM_USB)
-int usb_reset_root_port(void);
+#if defined(CONFIG_USB_MUSB_HOST) || defined(CONFIG_DM_USB)
+int usb_reset_root_port(struct usb_device *dev);
 #else
-#define usb_reset_root_port()
+#define usb_reset_root_port(dev)
 #endif
 
 int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
@@ -198,7 +187,7 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
                        int transfer_len, int interval);
 
-#if defined CONFIG_USB_EHCI || defined CONFIG_MUSB_HOST
+#if defined CONFIG_USB_EHCI || defined CONFIG_USB_MUSB_HOST || defined(CONFIG_DM_USB)
 struct int_queue *create_int_queue(struct usb_device *dev, unsigned long pipe,
        int queuesize, int elementsize, void *buffer, int interval);
 int destroy_int_queue(struct usb_device *dev, struct int_queue *queue);
@@ -216,12 +205,8 @@ void *poll_int_queue(struct usb_device *dev, struct int_queue *queue);
  * in boards init functions e.g. udc_disconnect() used for
  * forced device disconnection from host.
  */
-#elif defined(CONFIG_USB_GADGET_PXA2XX)
-
 extern void udc_disconnect(void);
 
-#endif
-
 /*
  * board-specific hardware initialization, called by
  * usb drivers and u-boot commands
@@ -242,8 +227,7 @@ int board_usb_cleanup(int index, enum usb_init_type init);
 
 #ifdef CONFIG_USB_STORAGE
 
-#define USB_MAX_STOR_DEV 5
-block_dev_desc_t *usb_stor_get_dev(int index);
+#define USB_MAX_STOR_DEV 7
 int usb_stor_scan(int mode);
 int usb_stor_info(void);
 
@@ -265,6 +249,7 @@ int usb_kbd_deregister(int force);
 /* routines */
 int usb_init(void); /* initialize the USB Controller */
 int usb_stop(void); /* stop the USB Controller */
+int usb_detect_change(void); /* detect if a USB device has been (un)plugged */
 
 
 int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol);
@@ -280,8 +265,9 @@ int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
                        void *buffer, int transfer_len, int interval);
 int usb_disable_asynch(int disable);
 int usb_maxpacket(struct usb_device *dev, unsigned long pipe);
-int usb_get_configuration_no(struct usb_device *dev, unsigned char *buffer,
-                               int cfgno);
+int usb_get_configuration_no(struct usb_device *dev, int cfgno,
+                       unsigned char *buffer, int length);
+int usb_get_configuration_len(struct usb_device *dev, int cfgno);
 int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
                        unsigned char id, void *buf, int size);
 int usb_get_class_descriptor(struct usb_device *dev, int ifnum,
@@ -290,6 +276,7 @@ int usb_get_class_descriptor(struct usb_device *dev, int ifnum,
 int usb_clear_halt(struct usb_device *dev, int pipe);
 int usb_string(struct usb_device *dev, int index, char *buf, size_t size);
 int usb_set_interface(struct usb_device *dev, int interface, int alternate);
+int usb_get_port_status(struct usb_device *dev, int port, void *data);
 
 /* big endian -> little endian conversion */
 /* some CPUs are already little endian e.g. the ARM920T */
@@ -506,15 +493,31 @@ struct usb_device_id {
 
 /**
  * struct usb_driver_entry - Matches a driver to its usb_device_ids
- * @compatible: Compatible string
- * @data: Data for this compatible string
+ * @driver: Driver to use
+ * @match: List of match records for this driver, terminated by {}
  */
 struct usb_driver_entry {
        struct driver *driver;
        const struct usb_device_id *match;
 };
 
-#define USB_DEVICE(__name, __match)                                    \
+#define USB_DEVICE_ID_MATCH_DEVICE \
+               (USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT)
+
+/**
+ * USB_DEVICE - macro used to describe a specific usb device
+ * @vend: the 16 bit USB Vendor ID
+ * @prod: the 16 bit USB Product ID
+ *
+ * This macro is used to create a struct usb_device_id that matches a
+ * specific device.
+ */
+#define USB_DEVICE(vend, prod) \
+       .match_flags = USB_DEVICE_ID_MATCH_DEVICE, \
+       .idVendor = (vend), \
+       .idProduct = (prod)
+
+#define U_BOOT_USB_DEVICE(__name, __match) \
        ll_entry_declare(struct usb_driver_entry, __name, usb_driver_entry) = {\
                .driver = llsym(struct driver, __name, driver), \
                .match = __match, \
@@ -552,6 +555,10 @@ struct usb_hub_descriptor {
 struct usb_hub_device {
        struct usb_device *pusb_dev;
        struct usb_hub_descriptor desc;
+
+       ulong connect_timeout;          /* Device connection timeout in ms */
+       ulong query_delay;              /* Device query delay in ms */
+       int overcurrent_count[USB_MAXCHILDREN]; /* Over-current counter */
 };
 
 #ifdef CONFIG_DM_USB
@@ -608,10 +615,13 @@ struct usb_dev_platdata {
  * @desc_before_addr:  true if we can read a device descriptor before it
  *             has been assigned an address. For XHCI this is not possible
  *             so this will be false.
+ * @companion:  True if this is a companion controller to another USB
+ *             controller
  */
 struct usb_bus_priv {
        int next_addr;
        bool desc_before_addr;
+       bool companion;
 };
 
 /**
@@ -660,6 +670,52 @@ struct dm_usb_ops {
        int (*interrupt)(struct udevice *bus, struct usb_device *udev,
                         unsigned long pipe, void *buffer, int length,
                         int interval);
+
+       /**
+        * create_int_queue() - Create and queue interrupt packets
+        *
+        * Create and queue @queuesize number of interrupt usb packets of
+        * @elementsize bytes each. @buffer must be atleast @queuesize *
+        * @elementsize bytes.
+        *
+        * Note some controllers only support a queuesize of 1.
+        *
+        * @interval: Interrupt interval
+        *
+        * @return A pointer to the created interrupt queue or NULL on error
+        */
+       struct int_queue * (*create_int_queue)(struct udevice *bus,
+                               struct usb_device *udev, unsigned long pipe,
+                               int queuesize, int elementsize, void *buffer,
+                               int interval);
+
+       /**
+        * poll_int_queue() - Poll an interrupt queue for completed packets
+        *
+        * Poll an interrupt queue for completed packets. The return value
+        * points to the part of the buffer passed to create_int_queue()
+        * corresponding to the completed packet.
+        *
+        * @queue: queue to poll
+        *
+        * @return Pointer to the data of the first completed packet, or
+        *         NULL if no packets are ready
+        */
+       void * (*poll_int_queue)(struct udevice *bus, struct usb_device *udev,
+                                struct int_queue *queue);
+
+       /**
+        * destroy_int_queue() - Destroy an interrupt queue
+        *
+        * Destroy an interrupt queue created by create_int_queue().
+        *
+        * @queue: queue to poll
+        *
+        * @return 0 if OK, -ve on error
+        */
+       int (*destroy_int_queue)(struct udevice *bus, struct usb_device *udev,
+                                struct int_queue *queue);
+
        /**
         * alloc_device() - Allocate a new device context (XHCI)
         *
@@ -669,15 +725,16 @@ struct dm_usb_ops {
         * is read). This should be NULL for EHCI, which does not need this.
         */
        int (*alloc_device)(struct udevice *bus, struct usb_device *udev);
+
+       /**
+        * reset_root_port() - Reset usb root port
+        */
+       int (*reset_root_port)(struct udevice *bus, struct usb_device *udev);
 };
 
 #define usb_get_ops(dev)       ((struct dm_usb_ops *)(dev)->driver->ops)
 #define usb_get_emul_ops(dev)  ((struct dm_usb_ops *)(dev)->driver->ops)
 
-#ifdef CONFIG_MUSB_HOST
-int usb_reset_root_port(void);
-#endif
-
 /**
  * usb_get_dev_index() - look up a device index number
  *
@@ -693,27 +750,19 @@ int usb_reset_root_port(void);
  */
 struct usb_device *usb_get_dev_index(struct udevice *bus, int index);
 
-/**
- * usb_legacy_port_reset() - Legacy function to reset a hub port
- *
- * @hub:       Hub device
- * @portnr:    Port number (1=first)
- */
-int usb_legacy_port_reset(struct usb_device *hub, int portnr);
-
 /**
  * usb_setup_device() - set up a device ready for use
  *
  * @dev:       USB device pointer. This need not be a real device - it is
  *             common for it to just be a local variable with its ->dev
- *             member (i.e. @dev->dev) set to the parent device
+ *             member (i.e. @dev->dev) set to the parent device and
+ *             dev->portnr set to the port number on the hub (1=first)
  * @do_read:   true to read the device descriptor before an address is set
  *             (should be false for XHCI buses, true otherwise)
  * @parent:    Parent device (either UCLASS_USB or UCLASS_USB_HUB)
- * @portnr:    Port number on hub (1=first) or 0 for none
  * @return 0 if OK, -ve on error */
 int usb_setup_device(struct usb_device *dev, bool do_read,
-                    struct usb_device *parent, int portnr);
+                    struct usb_device *parent);
 
 /**
  * usb_hub_scan() - Scan a hub and find its devices
@@ -829,6 +878,18 @@ int legacy_hub_port_reset(struct usb_device *dev, int port,
 
 int hub_port_reset(struct udevice *dev, int port, unsigned short *portstat);
 
+/*
+ * usb_find_usb2_hub_address_port() - Get hub address and port for TT setting
+ *
+ * Searches for the first HS hub above the given device. If a
+ * HS hub is found, the hub address and the port the device is
+ * connected to is return, as required for SPLIT transactions
+ *
+ * @param: udev full speed or low speed device
+ */
+void usb_find_usb2_hub_address_port(struct usb_device *udev,
+                                   uint8_t *hub_address, uint8_t *hub_port);
+
 /**
  * usb_alloc_new_device() - Allocate a new device
  *
@@ -892,6 +953,17 @@ int usb_emul_control(struct udevice *emul, struct usb_device *udev,
 int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
                  unsigned long pipe, void *buffer, int length);
 
+/**
+ * usb_emul_int() - Send an interrupt packet to an emulator
+ *
+ * @emul:      Emulator device
+ * @udev:      USB device (which the emulator is causing to appear)
+ * See struct dm_usb_ops for details on other parameters
+ * @return 0 if OK, -ve on error
+ */
+int usb_emul_int(struct udevice *emul, struct usb_device *udev,
+                 unsigned long pipe, void *buffer, int length, int interval);
+
 /**
  * usb_emul_find() - Find an emulator for a particular device
  *
@@ -904,6 +976,16 @@ int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
  */
 int usb_emul_find(struct udevice *bus, ulong pipe, struct udevice **emulp);
 
+/**
+ * usb_emul_find_for_dev() - Find an emulator for a particular device
+ *
+ * @bus:       USB bus (controller)
+ * @dev:       USB device to check
+ * @emulp:     Returns pointer to emulator, or NULL if not found
+ * @return 0 if found, -ve on error
+ */
+int usb_emul_find_for_dev(struct udevice *dev, struct udevice **emulp);
+
 /**
  * usb_emul_reset() - Reset all emulators ready for use
  *
@@ -912,4 +994,12 @@ int usb_emul_find(struct udevice *bus, ulong pipe, struct udevice **emulp);
  */
 void usb_emul_reset(struct udevice *dev);
 
+/**
+ * usb_show_tree() - show the USB device tree
+ *
+ * This shows a list of active USB devices along with basic information about
+ * each.
+ */
+void usb_show_tree(void);
+
 #endif /*_USB_H_ */