From b2d2b7872249e6816487e95bd9197a9417aa62bb Mon Sep 17 00:00:00 2001 From: Rui Miguel Silva Date: Wed, 29 Jun 2022 11:06:14 +0100 Subject: usb: common: move urb code to common Move urb code from musb only use to a more common scope, so other drivers in the future can use the handling of urb in usb. Signed-off-by: Rui Miguel Silva --- include/linux/usb/usb_urb_compat.h | 114 +++++++++++++++++++++++++++++++++++++ include/usb_defs.h | 32 +++++++++++ 2 files changed, 146 insertions(+) create mode 100644 include/linux/usb/usb_urb_compat.h (limited to 'include') diff --git a/include/linux/usb/usb_urb_compat.h b/include/linux/usb/usb_urb_compat.h new file mode 100644 index 00000000000..2e8c9d8db79 --- /dev/null +++ b/include/linux/usb/usb_urb_compat.h @@ -0,0 +1,114 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +#ifndef __USB_URB_COMPAT_H__ +#define __USB_URB_COMPAT_H__ + +#include +#include + +struct udevice; +struct urb; +struct usb_hcd; + +struct usb_urb_ops { + int (*urb_enqueue)(struct usb_hcd *hcd, struct urb *urb, + gfp_t mem_flags); + int (*urb_dequeue)(struct usb_hcd *hcd, struct urb *urb, int status); + int (*hub_control)(struct usb_hcd *hcd, struct usb_device *dev, + unsigned long pipe, void *buffer, int len, + struct devrequest *setup); + irqreturn_t (*isr)(int irq, void *priv); +}; + +struct usb_hcd { + void *hcd_priv; + const struct usb_urb_ops *urb_ops; +}; + +struct usb_host_endpoint { + struct usb_endpoint_descriptor desc; + struct list_head urb_list; + void *hcpriv; +}; + +/* + * urb->transfer_flags: + * + * Note: URB_DIR_IN/OUT is automatically set in usb_submit_urb(). + */ +#define URB_SHORT_NOT_OK 0x0001 /* report short reads as errors */ +#define URB_ZERO_PACKET 0x0040 /* Finish bulk OUT with short packet */ + +typedef void (*usb_complete_t)(struct urb *); + +struct urb { + void *hcpriv; /* private data for host controller */ + struct list_head urb_list; /* list head for use by the urb's + * current owner */ + struct usb_device *dev; /* (in) pointer to associated device */ + struct usb_host_endpoint *ep; /* (internal) pointer to endpoint */ + unsigned int pipe; /* (in) pipe information */ + int status; /* (return) non-ISO status */ + unsigned int transfer_flags; /* (in) URB_SHORT_NOT_OK | ...*/ + void *transfer_buffer; /* (in) associated data buffer */ + dma_addr_t transfer_dma; /* (in) dma addr for transfer_buffer */ + u32 transfer_buffer_length; /* (in) data buffer length */ + u32 actual_length; /* (return) actual transfer length */ + unsigned char *setup_packet; /* (in) setup packet (control only) */ + int start_frame; /* (modify) start frame (ISO) */ + usb_complete_t complete; /* (in) completion routine */ +}; + +#define usb_hcd_link_urb_to_ep(hcd, urb) ({ \ + int ret = 0; \ + list_add_tail(&urb->urb_list, &urb->ep->urb_list); \ + ret; }) +#define usb_hcd_unlink_urb_from_ep(hcd, urb) list_del_init(&urb->urb_list) +#define usb_hcd_check_unlink_urb(hdc, urb, status) 0 + +static inline void usb_hcd_giveback_urb(struct usb_hcd *hcd, + struct urb *urb, + int status) +{ + urb->status = status; + if (urb->complete) + urb->complete(urb); +} + +static inline int usb_hcd_unmap_urb_for_dma(struct usb_hcd *hcd, + struct urb *urb) +{ + /* TODO: add cache invalidation here */ + return 0; +} + +/** + * usb_dev_get_parent() - Get the parent of a USB device + * + * @udev: USB struct containing information about the device + * Return: associated device for which udev == dev_get_parent_priv(dev) + */ +struct usb_device *usb_dev_get_parent(struct usb_device *udev); + +int usb_urb_submit_control(struct usb_hcd *hcd, struct urb *urb, + struct usb_host_endpoint *hep, + struct usb_device *dev, unsigned long pipe, + void *buffer, int len, struct devrequest *setup, + int interval, enum usb_device_speed speed); + +int usb_urb_submit_bulk(struct usb_hcd *hcd, struct urb *urb, + struct usb_host_endpoint *hep, struct usb_device *dev, + unsigned long pipe, void *buffer, int len); + +int usb_urb_submit_irq(struct usb_hcd *hcd, struct urb *urb, + struct usb_host_endpoint *hep, struct usb_device *dev, + unsigned long pipe, void *buffer, int len, int interval); + +void usb_urb_fill(struct urb *urb, struct usb_host_endpoint *hep, + struct usb_device *dev, int endpoint_type, + unsigned long pipe, void *buffer, int len, + struct devrequest *setup, int interval); + +int usb_urb_submit(struct usb_hcd *hcd, struct urb *urb); + +#endif /* __USB_COMPAT_H__ */ diff --git a/include/usb_defs.h b/include/usb_defs.h index 6dd2c997f9b..ec00161710a 100644 --- a/include/usb_defs.h +++ b/include/usb_defs.h @@ -81,6 +81,32 @@ #define EndpointOutRequest \ ((USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8) +/* class requests from the USB 2.0 hub spec, table 11-15 */ +#define HUB_CLASS_REQ(dir, type, request) ((((dir) | (type)) << 8) | (request)) +/* GetBusState and SetHubDescriptor are optional, omitted */ +#define ClearHubFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_HUB, \ + USB_REQ_CLEAR_FEATURE) +#define ClearPortFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \ + USB_REQ_CLEAR_FEATURE) +#define GetHubDescriptor HUB_CLASS_REQ(USB_DIR_IN, USB_RT_HUB, \ + USB_REQ_GET_DESCRIPTOR) +#define GetHubStatus HUB_CLASS_REQ(USB_DIR_IN, USB_RT_HUB, \ + USB_REQ_GET_STATUS) +#define GetPortStatus HUB_CLASS_REQ(USB_DIR_IN, USB_RT_PORT, \ + USB_REQ_GET_STATUS) +#define SetHubFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_HUB, \ + USB_REQ_SET_FEATURE) +#define SetPortFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \ + USB_REQ_SET_FEATURE) +#define ClearTTBuffer HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \ + HUB_CLEAR_TT_BUFFER) +#define ResetTT HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \ + HUB_RESET_TT) +#define GetTTState HUB_CLASS_REQ(USB_DIR_IN, USB_RT_PORT, \ + HUB_GET_TT_STATE) +#define StopTT HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \ + HUB_STOP_TT) + /* Descriptor types */ #define USB_DT_DEVICE 0x01 #define USB_DT_CONFIG 0x02 @@ -289,10 +315,16 @@ #define USB_SS_PORT_STAT_C_CONFIG_ERROR 0x0080 /* wHubCharacteristics (masks) */ +#define HUB_CHAR_COMMON_OCPM 0x0000 /* All ports Over-Current reporting */ +#define HUB_CHAR_INDV_PORT_LPSM 0x0001 /* per-port power control */ +#define HUB_CHAR_NO_LPSM 0x0002 /* no power switching */ #define HUB_CHAR_LPSM 0x0003 #define HUB_CHAR_COMPOUND 0x0004 +#define HUB_CHAR_INDV_PORT_OCPM 0x0008 /* per-port Over-current reporting */ +#define HUB_CHAR_NO_OCPM 0x0010 /* No Over-current Protection support */ #define HUB_CHAR_OCPM 0x0018 #define HUB_CHAR_TTTT 0x0060 /* TT Think Time mask */ +#define HUB_CHAR_PORTIND 0x0080 /* per-port indicators (LEDs) */ /* * Hub Status & Hub Change bit masks -- cgit v1.2.3 From 018cdfc3d01618d9ec6547d4602c12d3ae6e7c2c Mon Sep 17 00:00:00 2001 From: Rui Miguel Silva Date: Wed, 29 Jun 2022 11:06:16 +0100 Subject: corstone1000: enable isp1763 usb controller and mmc MPS3 board have a ISP1763 usb controller, enable it to be used for mass storage access for example. Enable the usb command also and for the FVP support for mass storage enable the mmc command. Signed-off-by: Rui Miguel Silva --- include/configs/corstone1000.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'include') diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h index 38d7fe8d0d4..8e0230c135e 100644 --- a/include/configs/corstone1000.h +++ b/include/configs/corstone1000.h @@ -24,4 +24,10 @@ #define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1 +#define BOOT_TARGET_DEVICES(func) \ + func(USB, usb, 0) + +#include + + #endif -- cgit v1.2.3