1/* ========================================================================== 2 * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.h $ 3 * $Revision: 1.2 $ 4 * $Date: 2008-11-21 05:39:15 $ 5 * $Change: 1103515 $ 6 * 7 * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, 8 * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless 9 * otherwise expressly agreed to in writing between Synopsys and you. 10 * 11 * The Software IS NOT an item of Licensed Software or Licensed Product under 12 * any End User Software License Agreement or Agreement for Licensed Product 13 * with Synopsys or any supplement thereto. You are permitted to use and 14 * redistribute this Software in source and binary forms, with or without 15 * modification, provided that redistributions of source code must retain this 16 * notice. You may not view, use, disclose, copy or distribute this file or 17 * any information contained herein except pursuant to this license grant from 18 * Synopsys. If you do not agree with this notice, including the disclaimer 19 * below, then you are not authorized to use the Software. 20 * 21 * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS 22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT, 25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 31 * DAMAGE. 32 * ========================================================================== */ 33#ifndef DWC_HOST_ONLY 34#if !defined(__DWC_PCD_H__) 35#define __DWC_PCD_H__ 36 37#include <linux/types.h> 38#include <linux/list.h> 39#include <linux/errno.h> 40#include <linux/device.h> 41 42#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21) 43# include <linux/usb/ch9.h> 44#else 45# include <linux/usb_ch9.h> 46#endif 47 48#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) 49#include <linux/usb/gadget.h> 50#else 51#include <linux/usb_gadget.h> 52#endif 53#include <linux/interrupt.h> 54#include <linux/dma-mapping.h> 55 56struct dwc_otg_device; 57 58#include "dwc_otg_cil.h" 59 60/** 61 * @file 62 * 63 * This file contains the structures, constants, and interfaces for 64 * the Perpherial Contoller Driver (PCD). 65 * 66 * The Peripheral Controller Driver (PCD) for Linux will implement the 67 * Gadget API, so that the existing Gadget drivers can be used. For 68 * the Mass Storage Function driver the File-backed USB Storage Gadget 69 * (FBS) driver will be used. The FBS driver supports the 70 * Control-Bulk (CB), Control-Bulk-Interrupt (CBI), and Bulk-Only 71 * transports. 72 * 73 */ 74 75/** Invalid DMA Address */ 76#define DMA_ADDR_INVALID (~(dma_addr_t)0) 77/** Maxpacket size for EP0 */ 78#define MAX_EP0_SIZE 64 79/** Maxpacket size for any EP */ 80#define MAX_PACKET_SIZE 1024 81 82/** Max Transfer size for any EP */ 83#define MAX_TRANSFER_SIZE 65535 84 85/** Max DMA Descriptor count for any EP */ 86#define MAX_DMA_DESC_CNT 64 87 88/** 89 * Get the pointer to the core_if from the pcd pointer. 90 */ 91#define GET_CORE_IF( _pcd ) (_pcd->otg_dev->core_if) 92 93/** 94 * States of EP0. 95 */ 96typedef enum ep0_state 97{ 98 EP0_DISCONNECT, /* no host */ 99 EP0_IDLE, 100 EP0_IN_DATA_PHASE, 101 EP0_OUT_DATA_PHASE, 102 EP0_IN_STATUS_PHASE, 103 EP0_OUT_STATUS_PHASE, 104 EP0_STALL, 105} ep0state_e; 106 107/** Fordward declaration.*/ 108struct dwc_otg_pcd; 109 110/** DWC_otg iso request structure. 111 * 112 */ 113typedef struct usb_iso_request dwc_otg_pcd_iso_request_t; 114 115/** PCD EP structure. 116 * This structure describes an EP, there is an array of EPs in the PCD 117 * structure. 118 */ 119typedef struct dwc_otg_pcd_ep 120{ 121 /** USB EP data */ 122 struct usb_ep ep; 123 /** USB EP Descriptor */ 124 const struct usb_endpoint_descriptor *desc; 125 126 /** queue of dwc_otg_pcd_requests. */ 127 struct list_head queue; 128 unsigned stopped : 1; 129 unsigned disabling : 1; 130 unsigned dma : 1; 131 unsigned queue_sof : 1; 132 133#ifdef DWC_EN_ISOC 134 /** DWC_otg Isochronous Transfer */ 135 struct usb_iso_request* iso_req; 136#endif //DWC_EN_ISOC 137 138 /** DWC_otg ep data. */ 139 dwc_ep_t dwc_ep; 140 141 /** Pointer to PCD */ 142 struct dwc_otg_pcd *pcd; 143}dwc_otg_pcd_ep_t; 144 145 146 147/** DWC_otg PCD Structure. 148 * This structure encapsulates the data for the dwc_otg PCD. 149 */ 150typedef struct dwc_otg_pcd 151{ 152 /** USB gadget */ 153 struct usb_gadget gadget; 154 /** USB gadget driver pointer*/ 155 struct usb_gadget_driver *driver; 156 /** The DWC otg device pointer. */ 157 struct dwc_otg_device *otg_dev; 158 159 /** State of EP0 */ 160 ep0state_e ep0state; 161 /** EP0 Request is pending */ 162 unsigned ep0_pending : 1; 163 /** Indicates when SET CONFIGURATION Request is in process */ 164 unsigned request_config : 1; 165 /** The state of the Remote Wakeup Enable. */ 166 unsigned remote_wakeup_enable : 1; 167 /** The state of the B-Device HNP Enable. */ 168 unsigned b_hnp_enable : 1; 169 /** The state of A-Device HNP Support. */ 170 unsigned a_hnp_support : 1; 171 /** The state of the A-Device Alt HNP support. */ 172 unsigned a_alt_hnp_support : 1; 173 /** Count of pending Requests */ 174 unsigned request_pending; 175 176 /** SETUP packet for EP0 177 * This structure is allocated as a DMA buffer on PCD initialization 178 * with enough space for up to 3 setup packets. 179 */ 180 union 181 { 182 struct usb_ctrlrequest req; 183 uint32_t d32[2]; 184 } *setup_pkt; 185 186 dma_addr_t setup_pkt_dma_handle; 187 188 /** 2-byte dma buffer used to return status from GET_STATUS */ 189 uint16_t *status_buf; 190 dma_addr_t status_buf_dma_handle; 191 192 /** EP0 */ 193 dwc_otg_pcd_ep_t ep0; 194 195 /** Array of IN EPs. */ 196 dwc_otg_pcd_ep_t in_ep[ MAX_EPS_CHANNELS - 1]; 197 /** Array of OUT EPs. */ 198 dwc_otg_pcd_ep_t out_ep[ MAX_EPS_CHANNELS - 1]; 199 /** number of valid EPs in the above array. */ 200// unsigned num_eps : 4; 201 spinlock_t lock; 202 /** Timer for SRP. If it expires before SRP is successful 203 * clear the SRP. */ 204 struct timer_list srp_timer; 205 206 /** Tasklet to defer starting of TEST mode transmissions until 207 * Status Phase has been completed. 208 */ 209 struct tasklet_struct test_mode_tasklet; 210 211 /** Tasklet to delay starting of xfer in DMA mode */ 212 struct tasklet_struct *start_xfer_tasklet; 213 214 /** The test mode to enter when the tasklet is executed. */ 215 unsigned test_mode; 216 217} dwc_otg_pcd_t; 218 219 220/** DWC_otg request structure. 221 * This structure is a list of requests. 222 */ 223typedef struct 224{ 225 struct usb_request req; /**< USB Request. */ 226 struct list_head queue; /**< queue of these requests. */ 227} dwc_otg_pcd_request_t; 228 229 230extern int dwc_otg_pcd_init(struct device *dev); 231 232//extern void dwc_otg_pcd_remove( struct dwc_otg_device *_otg_dev ); 233extern void dwc_otg_pcd_remove( struct device *dev); 234extern int32_t dwc_otg_pcd_handle_intr( dwc_otg_pcd_t *pcd ); 235extern void dwc_otg_pcd_start_srp_timer(dwc_otg_pcd_t *pcd ); 236 237extern void dwc_otg_pcd_initiate_srp(dwc_otg_pcd_t *pcd); 238extern void dwc_otg_pcd_remote_wakeup(dwc_otg_pcd_t *pcd, int set); 239 240extern void dwc_otg_iso_buffer_done(dwc_otg_pcd_ep_t *ep, dwc_otg_pcd_iso_request_t *req); 241extern void dwc_otg_request_done(dwc_otg_pcd_ep_t *_ep, dwc_otg_pcd_request_t *req, 242 int status); 243extern void dwc_otg_request_nuke(dwc_otg_pcd_ep_t *_ep); 244extern void dwc_otg_pcd_update_otg(dwc_otg_pcd_t *_pcd, 245 const unsigned reset); 246 247#endif 248#endif /* DWC_HOST_ONLY */ 249