2017-11-03 11:28:30 +01:00
// SPDX-License-Identifier: GPL-2.0
2012-05-11 17:25:46 +03:00
/*
* udc . h - ChipIdea UDC structures
*
* Copyright ( C ) 2008 Chipidea - MIPS Technologies , Inc . All rights reserved .
*
* Author : David Lopo
*/
# ifndef __DRIVERS_USB_CHIPIDEA_UDC_H
# define __DRIVERS_USB_CHIPIDEA_UDC_H
# include <linux/list.h>
# define CTRL_PAYLOAD_MAX 64
# define RX 0 /* similar to USB_DIR_OUT but can be used as an index */
# define TX 1 /* similar to USB_DIR_IN but can be used as an index */
/* DMA layout of transfer descriptors */
2013-06-24 14:46:36 +03:00
struct ci_hw_td {
2012-05-11 17:25:46 +03:00
/* 0 */
2016-09-13 22:53:02 -07:00
__le32 next ;
2012-05-11 17:25:46 +03:00
# define TD_TERMINATE BIT(0)
# define TD_ADDR_MASK (0xFFFFFFEUL << 5)
/* 1 */
2016-09-13 22:53:02 -07:00
__le32 token ;
2012-05-11 17:25:46 +03:00
# define TD_STATUS (0x00FFUL << 0)
# define TD_STATUS_TR_ERR BIT(3)
# define TD_STATUS_DT_ERR BIT(5)
# define TD_STATUS_HALTED BIT(6)
# define TD_STATUS_ACTIVE BIT(7)
# define TD_MULTO (0x0003UL << 10)
# define TD_IOC BIT(15)
# define TD_TOTAL_BYTES (0x7FFFUL << 16)
/* 2 */
2016-09-13 22:53:02 -07:00
__le32 page [ 5 ] ;
2012-05-11 17:25:46 +03:00
# define TD_CURR_OFFSET (0x0FFFUL << 0)
# define TD_FRAME_NUM (0x07FFUL << 0)
# define TD_RESERVED_MASK (0x0FFFUL << 0)
2013-04-04 13:13:46 +03:00
} __attribute__ ( ( packed , aligned ( 4 ) ) ) ;
2012-05-11 17:25:46 +03:00
/* DMA layout of queue heads */
2013-06-24 14:46:36 +03:00
struct ci_hw_qh {
2012-05-11 17:25:46 +03:00
/* 0 */
2016-09-13 22:53:02 -07:00
__le32 cap ;
2012-05-11 17:25:46 +03:00
# define QH_IOS BIT(15)
# define QH_MAX_PKT (0x07FFUL << 16)
# define QH_ZLT BIT(29)
# define QH_MULT (0x0003UL << 30)
2013-06-13 17:59:47 +03:00
# define QH_ISO_MULT(x) ((x >> 11) & 0x03)
2012-05-11 17:25:46 +03:00
/* 1 */
2016-09-13 22:53:02 -07:00
__le32 curr ;
2012-05-11 17:25:46 +03:00
/* 2 - 8 */
2013-06-24 14:46:36 +03:00
struct ci_hw_td td ;
2012-05-11 17:25:46 +03:00
/* 9 */
2016-09-13 22:53:02 -07:00
__le32 RESERVED ;
2012-05-11 17:25:46 +03:00
struct usb_ctrlrequest setup ;
2013-04-04 13:13:46 +03:00
} __attribute__ ( ( packed , aligned ( 4 ) ) ) ;
2012-05-11 17:25:46 +03:00
2013-06-13 17:59:53 +03:00
struct td_node {
struct list_head td ;
dma_addr_t dma ;
2013-06-24 14:46:36 +03:00
struct ci_hw_td * ptr ;
2013-06-13 17:59:53 +03:00
} ;
2012-05-11 17:25:49 +03:00
/**
2013-06-24 14:46:36 +03:00
* struct ci_hw_req - usb request representation
2012-05-11 17:25:49 +03:00
* @ req : request structure for gadget drivers
* @ queue : link to QH list
* @ ptr : transfer descriptor for this request
* @ dma : dma address for the transfer descriptor
* @ zptr : transfer descriptor for the zero packet
* @ zdma : dma address of the zero packet ' s transfer descriptor
*/
2013-06-24 14:46:36 +03:00
struct ci_hw_req {
2012-05-11 17:25:49 +03:00
struct usb_request req ;
struct list_head queue ;
2013-06-13 17:59:53 +03:00
struct list_head tds ;
2012-05-11 17:25:46 +03:00
} ;
# ifdef CONFIG_USB_CHIPIDEA_UDC
2012-05-11 17:25:47 +03:00
2013-06-24 14:46:36 +03:00
int ci_hdrc_gadget_init ( struct ci_hdrc * ci ) ;
2013-08-14 12:44:07 +03:00
void ci_hdrc_gadget_destroy ( struct ci_hdrc * ci ) ;
2012-05-11 17:25:47 +03:00
2012-05-11 17:25:46 +03:00
# else
2013-06-24 14:46:36 +03:00
static inline int ci_hdrc_gadget_init ( struct ci_hdrc * ci )
2012-05-11 17:25:46 +03:00
{
2012-05-11 17:25:47 +03:00
return - ENXIO ;
2012-05-11 17:25:46 +03:00
}
2013-08-14 12:44:07 +03:00
static inline void ci_hdrc_gadget_destroy ( struct ci_hdrc * ci )
{
}
2012-05-11 17:25:46 +03:00
# endif
# endif /* __DRIVERS_USB_CHIPIDEA_UDC_H */