1
2
3
4
5
6
7
8
9
10#ifndef __MUSB_DMA_H__
11#define __MUSB_DMA_H__
12
13struct musb_hw_ep;
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38#define DMA_ADDR_INVALID (~(dma_addr_t)0)
39
40#ifdef CONFIG_MUSB_PIO_ONLY
41#define is_dma_capable() (0)
42#else
43#define is_dma_capable() (1)
44#endif
45
46#ifdef CONFIG_USB_UX500_DMA
47#define musb_dma_ux500(musb) (musb->io.quirks & MUSB_DMA_UX500)
48#else
49#define musb_dma_ux500(musb) 0
50#endif
51
52#ifdef CONFIG_USB_TI_CPPI41_DMA
53#define musb_dma_cppi41(musb) (musb->io.quirks & MUSB_DMA_CPPI41)
54#else
55#define musb_dma_cppi41(musb) 0
56#endif
57
58#ifdef CONFIG_USB_TI_CPPI_DMA
59#define musb_dma_cppi(musb) (musb->io.quirks & MUSB_DMA_CPPI)
60#else
61#define musb_dma_cppi(musb) 0
62#endif
63
64#ifdef CONFIG_USB_TUSB_OMAP_DMA
65#define tusb_dma_omap(musb) (musb->io.quirks & MUSB_DMA_TUSB_OMAP)
66#else
67#define tusb_dma_omap(musb) 0
68#endif
69
70#ifdef CONFIG_USB_INVENTRA_DMA
71#define musb_dma_inventra(musb) (musb->io.quirks & MUSB_DMA_INVENTRA)
72#else
73#define musb_dma_inventra(musb) 0
74#endif
75
76#if defined(CONFIG_USB_TI_CPPI_DMA) || defined(CONFIG_USB_TI_CPPI41_DMA)
77#define is_cppi_enabled(musb) \
78 (musb_dma_cppi(musb) || musb_dma_cppi41(musb))
79#else
80#define is_cppi_enabled(musb) 0
81#endif
82
83
84
85
86
87#ifdef CONFIG_BLACKFIN
88# undef USE_MODE1
89# if !ANOMALY_05000456
90# define USE_MODE1
91# endif
92#endif
93
94
95
96
97
98enum dma_channel_status {
99
100 MUSB_DMA_STATUS_UNKNOWN,
101
102 MUSB_DMA_STATUS_FREE,
103
104 MUSB_DMA_STATUS_BUSY,
105
106 MUSB_DMA_STATUS_BUS_ABORT,
107
108 MUSB_DMA_STATUS_CORE_ABORT
109};
110
111struct dma_controller;
112
113
114
115
116
117
118
119
120
121
122
123
124
125struct dma_channel {
126 void *private_data;
127
128 size_t max_len;
129 size_t actual_len;
130 enum dma_channel_status status;
131 bool desired_mode;
132 bool rx_packet_done;
133};
134
135
136
137
138
139
140
141
142
143static inline enum dma_channel_status
144dma_channel_status(struct dma_channel *c)
145{
146 return (is_dma_capable() && c) ? c->status : MUSB_DMA_STATUS_UNKNOWN;
147}
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165struct dma_controller {
166 struct musb *musb;
167 struct dma_channel *(*channel_alloc)(struct dma_controller *,
168 struct musb_hw_ep *, u8 is_tx);
169 void (*channel_release)(struct dma_channel *);
170 int (*channel_program)(struct dma_channel *channel,
171 u16 maxpacket, u8 mode,
172 dma_addr_t dma_addr,
173 u32 length);
174 int (*channel_abort)(struct dma_channel *);
175 int (*is_compatible)(struct dma_channel *channel,
176 u16 maxpacket,
177 void *buf, u32 length);
178 void (*dma_callback)(struct dma_controller *);
179};
180
181
182extern void musb_dma_completion(struct musb *musb, u8 epnum, u8 transmit);
183
184#ifdef CONFIG_MUSB_PIO_ONLY
185static inline struct dma_controller *
186musb_dma_controller_create(struct musb *m, void __iomem *io)
187{
188 return NULL;
189}
190
191static inline void musb_dma_controller_destroy(struct dma_controller *d) { }
192
193#else
194
195extern struct dma_controller *
196(*musb_dma_controller_create)(struct musb *, void __iomem *);
197
198extern void (*musb_dma_controller_destroy)(struct dma_controller *);
199#endif
200
201
202extern struct dma_controller *
203musbhs_dma_controller_create(struct musb *musb, void __iomem *base);
204extern void musbhs_dma_controller_destroy(struct dma_controller *c);
205
206extern struct dma_controller *
207tusb_dma_controller_create(struct musb *musb, void __iomem *base);
208extern void tusb_dma_controller_destroy(struct dma_controller *c);
209
210extern struct dma_controller *
211cppi_dma_controller_create(struct musb *musb, void __iomem *base);
212extern void cppi_dma_controller_destroy(struct dma_controller *c);
213
214extern struct dma_controller *
215cppi41_dma_controller_create(struct musb *musb, void __iomem *base);
216extern void cppi41_dma_controller_destroy(struct dma_controller *c);
217
218extern struct dma_controller *
219ux500_dma_controller_create(struct musb *musb, void __iomem *base);
220extern void ux500_dma_controller_destroy(struct dma_controller *c);
221
222#endif
223