colibri_imx6: fix video stdout in default environment
[oweals/u-boot.git] / include / usb.h
index fad04016a348fe1a8afb8f3f4783873c18a47678..fa9e09607e2c614ea06265ea67f51b6c040e22d3 100644 (file)
@@ -1,11 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
 /*
  * (C) Copyright 2001
  * Denis Peter, MPL AG Switzerland
  *
  * Adapted for U-Boot driver model
  * (C) Copyright 2015 Google, Inc
- *
- * SPDX-License-Identifier:    GPL-2.0+
  * Note: Part of this code has been derived from linux
  *
  */
@@ -104,7 +103,7 @@ enum {
  */
 struct usb_device {
        int     devnum;                 /* Device number on USB bus */
-       int     speed;                  /* full/low/high */
+       enum usb_device_speed speed;    /* full/low/high */
        char    mf[32];                 /* manufacturer */
        char    prod[32];               /* product */
        char    serial[32];             /* serial number */
@@ -141,7 +140,7 @@ struct usb_device {
        int act_len;                    /* transferred bytes */
        int maxchild;                   /* Number of ports if hub */
        int portnr;                     /* Port number, 1=first */
-#ifndef CONFIG_DM_USB
+#if !CONFIG_IS_ENABLED(DM_USB)
        /* parent hub, or NULL if this is the root hub */
        struct usb_device *parent;
        struct usb_device *children[USB_MAXCHILDREN];
@@ -149,7 +148,7 @@ struct usb_device {
 #endif
        /* slot_id - for xHCI enabled devices */
        unsigned int slot_id;
-#ifdef CONFIG_DM_USB
+#if CONFIG_IS_ENABLED(DM_USB)
        struct udevice *dev;            /* Pointer to associated device */
        struct udevice *controller_dev; /* Pointer to associated controller */
 #endif
@@ -174,7 +173,7 @@ enum usb_init_type {
 int usb_lowlevel_init(int index, enum usb_init_type init, void **controller);
 int usb_lowlevel_stop(int index);
 
-#if defined(CONFIG_USB_MUSB_HOST) || defined(CONFIG_DM_USB)
+#if defined(CONFIG_USB_MUSB_HOST) || CONFIG_IS_ENABLED(DM_USB)
 int usb_reset_root_port(struct usb_device *dev);
 #else
 #define usb_reset_root_port(dev)
@@ -185,10 +184,10 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
 int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
                        int transfer_len, struct devrequest *setup);
 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-                       int transfer_len, int interval);
+                       int transfer_len, int interval, bool nonblock);
 
 #if defined CONFIG_USB_EHCI_HCD || defined CONFIG_USB_MUSB_HOST \
-       || defined(CONFIG_DM_USB)
+       || CONFIG_IS_ENABLED(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);
@@ -243,6 +242,12 @@ int usb_host_eth_scan(int mode);
 
 #ifdef CONFIG_USB_KEYBOARD
 
+/*
+ * USB Keyboard reports are 8 bytes in boot protocol.
+ * Appendix B of HID Device Class Definition 1.11
+ */
+#define USB_KBD_BOOT_REPORT_SIZE 8
+
 int drv_usb_kbd_init(void);
 int usb_kbd_deregister(int force);
 
@@ -262,8 +267,9 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
                        void *data, unsigned short size, int timeout);
 int usb_bulk_msg(struct usb_device *dev, unsigned int pipe,
                        void *data, int len, int *actual_length, int timeout);
-int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
-                       void *buffer, int transfer_len, int interval);
+int usb_int_msg(struct usb_device *dev, unsigned long pipe,
+               void *buffer, int transfer_len, int interval, bool nonblock);
+int usb_lock_async(struct usb_device *dev, int lock);
 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, int cfgno,
@@ -589,7 +595,7 @@ struct usb_hub_device {
        struct usb_tt tt;               /* Transaction Translator */
 };
 
-#ifdef CONFIG_DM_USB
+#if CONFIG_IS_ENABLED(DM_USB)
 /**
  * struct usb_platdata - Platform data about a USB controller
  *
@@ -652,6 +658,18 @@ struct usb_bus_priv {
        bool companion;
 };
 
+/**
+ * struct usb_emul_platdata - platform data about the USB emulator
+ *
+ * Given a USB emulator (UCLASS_USB_EMUL) 'dev', this is
+ * dev_get_uclass_platdata(dev).
+ *
+ * @port1:     USB emulator device port number on the parent hub
+ */
+struct usb_emul_platdata {
+       int port1;      /* Port number (numbered from 1) */
+};
+
 /**
  * struct dm_usb_ops - USB controller operations
  *
@@ -697,7 +715,7 @@ struct dm_usb_ops {
         */
        int (*interrupt)(struct udevice *bus, struct usb_device *udev,
                         unsigned long pipe, void *buffer, int length,
-                        int interval);
+                        int interval, bool nonblock);
 
        /**
         * create_int_queue() - Create and queue interrupt packets
@@ -766,6 +784,24 @@ struct dm_usb_ops {
         * representation of this hub can be updated (xHCI)
         */
        int (*update_hub_device)(struct udevice *bus, struct usb_device *udev);
+
+       /**
+        * get_max_xfer_size() - Get HCD's maximum transfer bytes
+        *
+        * The HCD may have limitation on the maximum bytes to be transferred
+        * in a USB transfer. USB class driver needs to be aware of this.
+        */
+       int (*get_max_xfer_size)(struct udevice *bus, size_t *size);
+
+       /**
+        * lock_async() - Keep async schedule after a transfer
+        *
+        * It may be desired to keep the asynchronous schedule running even
+        * after a transfer finishes, usually when doing multiple transfers
+        * back-to-back. This callback allows signalling the USB controller
+        * driver to do just that.
+        */
+       int (*lock_async)(struct udevice *udev, int lock);
 };
 
 #define usb_get_ops(dev)       ((struct dm_usb_ops *)(dev)->driver->ops)
@@ -893,7 +929,7 @@ int usb_setup_ehci_gadget(struct ehci_ctrl **ctlrp);
  */
 void usb_stor_reset(void);
 
-#else /* !CONFIG_DM_USB */
+#else /* !CONFIG_IS_ENABLED(DM_USB) */
 
 struct usb_device *usb_get_dev_index(int index);
 
@@ -939,7 +975,7 @@ int usb_new_device(struct usb_device *dev);
 int usb_alloc_device(struct usb_device *dev);
 
 /**
- * update_hub_device() - Update HCD's internal representation of hub
+ * usb_update_hub_device() - Update HCD's internal representation of hub
  *
  * After a hub descriptor is fetched, notify HCD so that its internal
  * representation of this hub can be updated.
@@ -949,6 +985,18 @@ int usb_alloc_device(struct usb_device *dev);
  */
 int usb_update_hub_device(struct usb_device *dev);
 
+/**
+ * usb_get_max_xfer_size() - Get HCD's maximum transfer bytes
+ *
+ * The HCD may have limitation on the maximum bytes to be transferred
+ * in a USB transfer. USB class driver needs to be aware of this.
+ *
+ * @dev:               USB device
+ * @size:              maximum transfer bytes
+ * @return 0 if OK, -ve on error
+ */
+int usb_get_max_xfer_size(struct usb_device *dev, size_t *size);
+
 /**
  * usb_emul_setup_device() - Set up a new USB device emulation
  *
@@ -956,7 +1004,6 @@ int usb_update_hub_device(struct usb_device *dev);
  * the USB emulation uclass about the features of the emulator.
  *
  * @dev:               Emulation device
- * @maxpacketsize:     Maximum packet size (e.g. PACKET_SIZE_64)
  * @strings:           List of USB string descriptors, terminated by a NULL
  *                     entry
  * @desc_list:         List of points or USB descriptors, terminated by NULL.
@@ -964,8 +1011,8 @@ int usb_update_hub_device(struct usb_device *dev);
  *                     and others follow on after that.
  * @return 0 if OK, -ENOSYS if not implemented, other -ve on error
  */
-int usb_emul_setup_device(struct udevice *dev, int maxpacketsize,
-                         struct usb_string *strings, void **desc_list);
+int usb_emul_setup_device(struct udevice *dev, struct usb_string *strings,
+                         void **desc_list);
 
 /**
  * usb_emul_control() - Send a control packet to an emulator
@@ -999,24 +1046,26 @@ int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
  * @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);
+                 unsigned long pipe, void *buffer, int length, int interval,
+                 bool nonblock);
 
 /**
  * usb_emul_find() - Find an emulator for a particular device
  *
- * Check @pipe to find a device number on bus @bus and return it.
+ * Check @pipe and @port1 to find a device number on bus @bus and return it.
  *
  * @bus:       USB bus (controller)
  * @pipe:      Describes pipe being used, and includes the device number
+ * @port1:     Describes port number on the parent hub
  * @emulp:     Returns pointer to emulator, or NULL if not found
  * @return 0 if found, -ve on error
  */
-int usb_emul_find(struct udevice *bus, ulong pipe, struct udevice **emulp);
+int usb_emul_find(struct udevice *bus, ulong pipe, int port1,
+                 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
@@ -1024,12 +1073,15 @@ int usb_emul_find(struct udevice *bus, ulong pipe, struct udevice **emulp);
 int usb_emul_find_for_dev(struct udevice *dev, struct udevice **emulp);
 
 /**
- * usb_emul_reset() - Reset all emulators ready for use
+ * usb_emul_find_descriptor() - Find a USB descriptor of a particular device
  *
- * Clear out any address information in the emulators and make then ready for
- * a new USB scan
+ * @ptr:       a pointer to a list of USB descriptor pointers
+ * @type:      type of USB descriptor to find
+ * @index:     if @type is USB_DT_CONFIG, this is the configuration value
+ * @return a pointer to the USB descriptor found, NULL if not found
  */
-void usb_emul_reset(struct udevice *dev);
+struct usb_generic_descriptor **usb_emul_find_descriptor(
+               struct usb_generic_descriptor **ptr, int type, int index);
 
 /**
  * usb_show_tree() - show the USB device tree