usbgadget: lpc32xx: Various fixes and improvements
[linux-2.6.34-lpc32xx.git] / drivers / usb / gadget / lpc32xx_udc.h
1 /*
2  * drivers/usb/gadget/lpc32xx_udc.h
3  *
4  * Author: Kevin Wells <kevin.wells@nxp.com>
5  *
6  * Copyright (C) 2009 NXP Semiconductors
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22
23 #ifndef LPC32XX_UDC_H
24 #define LPC32XX_UDC_H
25
26 /*
27  * controller driver data structures
28  */
29
30 /* 16 endpoints (not to be confused with 32 hardware endpoints) */
31 #define NUM_ENDPOINTS   16
32
33 /*
34  * IRQ indices make reading the code a little easier
35  */
36 #define IRQ_USB_LP      0
37 #define IRQ_USB_HP      1
38 #define IRQ_USB_DEVDMA  2
39 #define IRQ_USB_ATX     3
40
41 #define EP_OUT 0 /* RX (from host) */
42 #define EP_IN 1 /* TX (to host) */
43
44 /* Returns the interrupt mask for the selected hardware endpoint */
45 #define EP_MASK_SEL(ep, dir) (1 << (((ep) * 2) + dir))
46
47 #define EP_INT_TYPE 0
48 #define EP_ISO_TYPE 1
49 #define EP_BLK_TYPE 2
50 #define EP_CTL_TYPE 3
51
52 /* EP0 states */
53 #define WAIT_FOR_SETUP 0 /* Wait for setup packet */
54 #define DATA_IN        1 /* Expect dev->host transfer */
55 #define DATA_OUT       2 /* Expect host->dev transfer */
56
57 /* DD (DMA Descriptor) structure, requires word alignment, this is already defined
58    in the LPC32XX USB device header file, but this version si slightly modified to
59    tag some work data with each DMA descriptor. */
60 struct lpc32xx_usbd_dd_gad;
61 struct lpc32xx_usbd_dd_gad
62 {
63         struct lpc32xx_usbd_dd_gad *dd_next_phy;
64         u32 dd_setup;
65         u32 dd_buffer_addr;
66         u32 dd_status;
67         u32 *dd_iso_ps_mem_addr;
68         dma_addr_t this_dma;
69         u32 iso_status[6]; /* 5 spare */
70         struct lpc32xx_usbd_dd_gad *dd_next_v;
71 };
72
73 /*
74  * Logical endpoint structure
75  */
76 struct lpc32xx_ep {
77         struct usb_ep           ep;
78         struct list_head        queue;
79         struct lpc32xx_udc      *udc;
80
81         u32                     hwep_num_base; /* Physical hardware EP */
82         u32                     hwep_num; /* Maps to hardware endpoint */
83         u32                     maxpacket;
84         u32                     lep;
85
86         u32                     is_in:1;
87         volatile u32            req_pending:1;
88         u32                     eptype;
89
90         u32                     totalints;
91
92         const struct usb_endpoint_descriptor *desc;
93 };
94
95 /*
96  * Common UDC structure
97  */
98 struct lpc32xx_udc {
99         struct usb_gadget       gadget;
100         struct usb_gadget_driver *driver;
101         struct platform_device  *pdev;
102         struct device           *dev;
103         struct proc_dir_entry   *pde;
104         spinlock_t              lock;
105
106         /* Board and device specific */
107         struct lpc32xx_usbd_cfg *board;
108         u32                     io_p_start;
109         u32                     io_p_size;
110         void __iomem            *udp_baseaddr;
111         int                     udp_irq[4];
112         struct clk              *usb_pll_clk;
113         struct clk              *usb_slv_clk;
114
115         /* DMA support */
116         u32                     *udca_v_base;
117         u32                     *udca_p_base;
118         struct dma_pool         *dd_cache;
119
120         /* Common EP and control data */
121         u32                     enabled_devints;
122         u32                     enabled_hwepints;
123         u32                     dev_status;
124         u32                     realized_eps;
125
126         /* VBUS detection, pullup, and power flags */
127         u8                      vbus;
128         u8                      last_vbus;
129         int                     pullup;
130         int                     poweron;
131
132         /* Work queues related to I2C support */
133         struct work_struct      pullup_wq;
134         struct work_struct      vbus_wq;
135         struct work_struct      power_wq;
136
137         /* USB device peripheral - various */
138         struct lpc32xx_ep       ep[NUM_ENDPOINTS];
139         u32                     enabled:1;
140         u32                     clocked:1;
141         u32                     suspended:1;
142         u32                     selfpowered:1;
143         int                     ep0state;
144         atomic_t                enabled_ep_cnt;
145         wait_queue_head_t       ep_disable_wait_queue;
146 };
147
148 /*
149  * Endpoint request
150  */
151 struct lpc32xx_request {
152         struct usb_request      req;
153         struct list_head        queue;
154         struct lpc32xx_usbd_dd_gad *dd_desc_ptr;
155         u32                     mapped:1;
156         u32                     send_zlp:1;
157 };
158
159 static inline struct lpc32xx_udc *to_udc(struct usb_gadget *g)
160 {
161         return container_of(g, struct lpc32xx_udc, gadget);
162 }
163
164 #define ep_dbg(epp, fmt, arg...) \
165         dev_dbg(epp->udc->dev, "%s:%s: " fmt, epp->ep.name, __func__, ## arg)
166 #define ep_err(epp, fmt, arg...) \
167         dev_err(epp->udc->dev, "%s:%s: " fmt, epp->ep.name, __func__, ## arg)
168 #define ep_info(epp, fmt, arg...) \
169         dev_info(epp->udc->dev, "%s:%s: " fmt, epp->ep.name, __func__, ## arg)
170 #define ep_warn(epp, fmt, arg...) \
171         dev_warn(epp->udc->dev, "%s:%s:" fmt, epp->ep.name, __func__, ## arg)
172
173 #endif
174