2017-11-03 13:28:30 +03:00
// SPDX-License-Identifier: GPL-2.0
2008-07-24 13:27:36 +04:00
/*
* MUSB OTG driver host defines
*
* Copyright 2005 Mentor Graphics Corporation
* Copyright ( C ) 2005 - 2006 by Texas Instruments
* Copyright ( C ) 2006 - 2007 Nokia Corporation
*/
# ifndef _MUSB_HOST_H
# define _MUSB_HOST_H
2012-08-07 13:16:20 +04:00
# include <linux/scatterlist.h>
2008-07-24 13:27:36 +04:00
/* stored in "usb_host_endpoint.hcpriv" for scheduled endpoints */
struct musb_qh {
struct usb_host_endpoint * hep ; /* usbcore info */
struct usb_device * dev ;
struct musb_hw_ep * hw_ep ; /* current binding */
struct list_head ring ; /* of musb_qh */
/* struct musb_qh *next; */ /* for periodic tree */
2008-10-29 16:10:35 +03:00
u8 mux ; /* qh multiplexed to hw_ep */
2008-07-24 13:27:36 +04:00
unsigned offset ; /* in urb->transfer_buffer */
unsigned segsize ; /* current xfer fragment */
u8 type_reg ; /* {rx,tx} type register */
u8 intv_reg ; /* {rx,tx} interval register */
u8 addr_reg ; /* device address register */
u8 h_addr_reg ; /* hub address register */
u8 h_port_reg ; /* hub port register */
u8 is_ready ; /* safe to modify hw_ep */
u8 type ; /* XFERTYPE_* */
u8 epnum ;
2009-04-04 03:16:17 +04:00
u8 hb_mult ; /* high bandwidth pkts per uf */
2008-07-24 13:27:36 +04:00
u16 maxpacket ;
u16 frame ; /* for periodic schedule */
unsigned iso_idx ; /* in urb->iso_frame_desc[] */
2012-08-07 13:16:20 +04:00
struct sg_mapping_iter sg_miter ; /* for highmem in PIO mode */
2013-04-24 10:38:48 +04:00
bool use_sg ; /* to track urb using sglist */
2008-07-24 13:27:36 +04:00
} ;
/* map from control or bulk queue head to the first qh on that ring */
static inline struct musb_qh * first_qh ( struct list_head * q )
{
if ( list_empty ( q ) )
return NULL ;
return list_entry ( q - > next , struct musb_qh , ring ) ;
}
2013-04-10 23:55:46 +04:00
# if IS_ENABLED(CONFIG_USB_MUSB_HOST) || IS_ENABLED(CONFIG_USB_MUSB_DUAL_ROLE)
extern struct musb * hcd_to_musb ( struct usb_hcd * ) ;
2013-04-10 23:55:41 +04:00
extern irqreturn_t musb_h_ep0_irq ( struct musb * ) ;
2013-04-10 23:55:45 +04:00
extern int musb_host_alloc ( struct musb * ) ;
2013-04-10 23:55:47 +04:00
extern int musb_host_setup ( struct musb * , int ) ;
extern void musb_host_cleanup ( struct musb * ) ;
2013-04-10 23:55:45 +04:00
extern void musb_host_tx ( struct musb * , u8 ) ;
extern void musb_host_rx ( struct musb * , u8 ) ;
extern void musb_root_disconnect ( struct musb * musb ) ;
extern void musb_host_free ( struct musb * ) ;
extern void musb_host_cleanup ( struct musb * ) ;
2013-04-10 23:55:41 +04:00
extern void musb_host_tx ( struct musb * , u8 ) ;
extern void musb_host_rx ( struct musb * , u8 ) ;
2008-07-24 13:27:36 +04:00
extern void musb_root_disconnect ( struct musb * musb ) ;
2013-04-10 23:55:42 +04:00
extern void musb_host_resume_root_hub ( struct musb * musb ) ;
extern void musb_host_poke_root_hub ( struct musb * musb ) ;
2018-05-14 17:40:05 +03:00
extern int musb_port_suspend ( struct musb * musb , bool do_suspend ) ;
2013-11-26 16:31:14 +04:00
extern void musb_port_reset ( struct musb * musb , bool do_reset ) ;
2013-12-18 23:23:46 +04:00
extern void musb_host_finish_resume ( struct work_struct * work ) ;
2013-04-10 23:55:46 +04:00
# else
static inline struct musb * hcd_to_musb ( struct usb_hcd * hcd )
{
return NULL ;
}
static inline irqreturn_t musb_h_ep0_irq ( struct musb * musb )
{
return 0 ;
}
static inline int musb_host_alloc ( struct musb * musb )
{
return 0 ;
}
2013-04-10 23:55:47 +04:00
static inline int musb_host_setup ( struct musb * musb , int power_budget )
{
return 0 ;
}
static inline void musb_host_cleanup ( struct musb * musb ) { }
2013-04-10 23:55:46 +04:00
static inline void musb_host_free ( struct musb * musb ) { }
static inline void musb_host_tx ( struct musb * musb , u8 epnum ) { }
static inline void musb_host_rx ( struct musb * musb , u8 epnum ) { }
static inline void musb_root_disconnect ( struct musb * musb ) { }
static inline void musb_host_resume_root_hub ( struct musb * musb ) { }
static inline void musb_host_poll_rh_status ( struct musb * musb ) { }
static inline void musb_host_poke_root_hub ( struct musb * musb ) { }
2018-05-14 17:40:05 +03:00
static inline int musb_port_suspend ( struct musb * musb , bool do_suspend )
{
return 0 ;
}
2013-12-20 13:47:14 +04:00
static inline void musb_port_reset ( struct musb * musb , bool do_reset ) { }
2013-12-18 23:23:46 +04:00
static inline void musb_host_finish_resume ( struct work_struct * work ) { }
2013-04-10 23:55:46 +04:00
# endif
2008-07-24 13:27:36 +04:00
struct usb_hcd ;
extern int musb_hub_status_data ( struct usb_hcd * hcd , char * buf ) ;
extern int musb_hub_control ( struct usb_hcd * hcd ,
u16 typeReq , u16 wValue , u16 wIndex ,
char * buf , u16 wLength ) ;
static inline struct urb * next_urb ( struct musb_qh * qh )
{
struct list_head * queue ;
if ( ! qh )
return NULL ;
queue = & qh - > hep - > urb_list ;
if ( list_empty ( queue ) )
return NULL ;
return list_entry ( queue - > next , struct urb , urb_list ) ;
}
# endif /* _MUSB_HOST_H */