Home | History | Annotate | Download | only in musb-new
      1 #ifndef __USB_COMPAT_H__
      2 #define __USB_COMPAT_H__
      3 
      4 #include <dm.h>
      5 #include "usb.h"
      6 
      7 struct usb_hcd {
      8 	void *hcd_priv;
      9 };
     10 
     11 struct usb_host_endpoint {
     12 	struct usb_endpoint_descriptor		desc;
     13 	struct list_head urb_list;
     14 	void *hcpriv;
     15 };
     16 
     17 /*
     18  * urb->transfer_flags:
     19  *
     20  * Note: URB_DIR_IN/OUT is automatically set in usb_submit_urb().
     21  */
     22 #define URB_SHORT_NOT_OK	0x0001	/* report short reads as errors */
     23 #define URB_ZERO_PACKET		0x0040	/* Finish bulk OUT with short packet */
     24 
     25 struct urb;
     26 
     27 typedef void (*usb_complete_t)(struct urb *);
     28 
     29 struct urb {
     30 	void *hcpriv;			/* private data for host controller */
     31 	struct list_head urb_list;	/* list head for use by the urb's
     32 					 * current owner */
     33 	struct usb_device *dev;		/* (in) pointer to associated device */
     34 	struct usb_host_endpoint *ep;	/* (internal) pointer to endpoint */
     35 	unsigned int pipe;		/* (in) pipe information */
     36 	int status;			/* (return) non-ISO status */
     37 	unsigned int transfer_flags;	/* (in) URB_SHORT_NOT_OK | ...*/
     38 	void *transfer_buffer;		/* (in) associated data buffer */
     39 	dma_addr_t transfer_dma;	/* (in) dma addr for transfer_buffer */
     40 	u32 transfer_buffer_length;	/* (in) data buffer length */
     41 	u32 actual_length;		/* (return) actual transfer length */
     42 	unsigned char *setup_packet;	/* (in) setup packet (control only) */
     43 	int start_frame;		/* (modify) start frame (ISO) */
     44 	usb_complete_t complete;	/* (in) completion routine */
     45 };
     46 
     47 #define usb_hcd_link_urb_to_ep(hcd, urb)	({		\
     48 	int ret = 0;						\
     49 	list_add_tail(&urb->urb_list, &urb->ep->urb_list);	\
     50 	ret; })
     51 #define usb_hcd_unlink_urb_from_ep(hcd, urb)	list_del_init(&urb->urb_list)
     52 #define usb_hcd_check_unlink_urb(hdc, urb, status)	0
     53 
     54 static inline void usb_hcd_giveback_urb(struct usb_hcd *hcd,
     55 					struct urb *urb,
     56 					int status)
     57 {
     58 	urb->status = status;
     59 	if (urb->complete)
     60 		urb->complete(urb);
     61 }
     62 
     63 static inline int usb_hcd_unmap_urb_for_dma(struct usb_hcd *hcd,
     64 					struct urb *urb)
     65 {
     66 	/* TODO: add cache invalidation here */
     67 	return 0;
     68 }
     69 
     70 #ifdef CONFIG_DM_USB
     71 static inline struct usb_device *usb_dev_get_parent(struct usb_device *udev)
     72 {
     73 	struct udevice *parent = udev->dev->parent;
     74 
     75 	/*
     76 	 * When called from usb-uclass.c: usb_scan_device() udev->dev points
     77 	 * to the parent udevice, not the actual udevice belonging to the
     78 	 * udev as the device is not instantiated yet.
     79 	 *
     80 	 * If dev is an usb-bus, then we are called from usb_scan_device() for
     81 	 * an usb-device plugged directly into the root port, return NULL.
     82 	 */
     83 	if (device_get_uclass_id(udev->dev) == UCLASS_USB)
     84 		return NULL;
     85 
     86 	/*
     87 	 * If these 2 are not the same we are being called from
     88 	 * usb_scan_device() and udev itself is the parent.
     89 	 */
     90 	if (dev_get_parent_priv(udev->dev) != udev)
     91 		return udev;
     92 
     93 	/* We are being called normally, use the parent pointer */
     94 	if (device_get_uclass_id(parent) == UCLASS_USB_HUB)
     95 		return dev_get_parent_priv(parent);
     96 
     97 	return NULL;
     98 }
     99 #else
    100 static inline struct usb_device *usb_dev_get_parent(struct usb_device *dev)
    101 {
    102 	return dev->parent;
    103 }
    104 #endif
    105 
    106 #endif /* __USB_COMPAT_H__ */
    107