xref: /openbmc/linux/drivers/usb/renesas_usbhs/fifo.c (revision 64405360)
1 /*
2  * Renesas USB driver
3  *
4  * Copyright (C) 2011 Renesas Solutions Corp.
5  * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
15  *
16  */
17 #include <linux/delay.h>
18 #include <linux/io.h>
19 #include <linux/scatterlist.h>
20 #include "./common.h"
21 #include "./pipe.h"
22 
23 #define usbhsf_get_cfifo(p)	(&((p)->fifo_info.cfifo))
24 #define usbhsf_get_d0fifo(p)	(&((p)->fifo_info.d0fifo))
25 #define usbhsf_get_d1fifo(p)	(&((p)->fifo_info.d1fifo))
26 
27 #define usbhsf_fifo_is_busy(f)	((f)->pipe) /* see usbhs_pipe_select_fifo */
28 
29 /*
30  *		packet initialize
31  */
32 void usbhs_pkt_init(struct usbhs_pkt *pkt)
33 {
34 	pkt->dma = DMA_ADDR_INVALID;
35 	INIT_LIST_HEAD(&pkt->node);
36 }
37 
38 /*
39  *		packet control function
40  */
41 static int usbhsf_null_handle(struct usbhs_pkt *pkt, int *is_done)
42 {
43 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pkt->pipe);
44 	struct device *dev = usbhs_priv_to_dev(priv);
45 
46 	dev_err(dev, "null handler\n");
47 
48 	return -EINVAL;
49 }
50 
51 static struct usbhs_pkt_handle usbhsf_null_handler = {
52 	.prepare = usbhsf_null_handle,
53 	.try_run = usbhsf_null_handle,
54 };
55 
56 void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt,
57 		    void (*done)(struct usbhs_priv *priv,
58 				 struct usbhs_pkt *pkt),
59 		    void *buf, int len, int zero, int sequence)
60 {
61 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
62 	struct device *dev = usbhs_priv_to_dev(priv);
63 	unsigned long flags;
64 
65 	if (!done) {
66 		dev_err(dev, "no done function\n");
67 		return;
68 	}
69 
70 	/********************  spin lock ********************/
71 	usbhs_lock(priv, flags);
72 
73 	if (!pipe->handler) {
74 		dev_err(dev, "no handler function\n");
75 		pipe->handler = &usbhsf_null_handler;
76 	}
77 
78 	list_del_init(&pkt->node);
79 	list_add_tail(&pkt->node, &pipe->list);
80 
81 	/*
82 	 * each pkt must hold own handler.
83 	 * because handler might be changed by its situation.
84 	 * dma handler -> pio handler.
85 	 */
86 	pkt->pipe	= pipe;
87 	pkt->buf	= buf;
88 	pkt->handler	= pipe->handler;
89 	pkt->length	= len;
90 	pkt->zero	= zero;
91 	pkt->actual	= 0;
92 	pkt->done	= done;
93 	pkt->sequence	= sequence;
94 
95 	usbhs_unlock(priv, flags);
96 	/********************  spin unlock ******************/
97 }
98 
99 static void __usbhsf_pkt_del(struct usbhs_pkt *pkt)
100 {
101 	list_del_init(&pkt->node);
102 }
103 
104 static struct usbhs_pkt *__usbhsf_pkt_get(struct usbhs_pipe *pipe)
105 {
106 	if (list_empty(&pipe->list))
107 		return NULL;
108 
109 	return list_entry(pipe->list.next, struct usbhs_pkt, node);
110 }
111 
112 struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt)
113 {
114 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
115 	unsigned long flags;
116 
117 	/********************  spin lock ********************/
118 	usbhs_lock(priv, flags);
119 
120 	if (!pkt)
121 		pkt = __usbhsf_pkt_get(pipe);
122 
123 	if (pkt)
124 		__usbhsf_pkt_del(pkt);
125 
126 	usbhs_unlock(priv, flags);
127 	/********************  spin unlock ******************/
128 
129 	return pkt;
130 }
131 
132 enum {
133 	USBHSF_PKT_PREPARE,
134 	USBHSF_PKT_TRY_RUN,
135 	USBHSF_PKT_DMA_DONE,
136 };
137 
138 static int usbhsf_pkt_handler(struct usbhs_pipe *pipe, int type)
139 {
140 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
141 	struct usbhs_pkt *pkt;
142 	struct device *dev = usbhs_priv_to_dev(priv);
143 	int (*func)(struct usbhs_pkt *pkt, int *is_done);
144 	unsigned long flags;
145 	int ret = 0;
146 	int is_done = 0;
147 
148 	/********************  spin lock ********************/
149 	usbhs_lock(priv, flags);
150 
151 	pkt = __usbhsf_pkt_get(pipe);
152 	if (!pkt)
153 		goto __usbhs_pkt_handler_end;
154 
155 	switch (type) {
156 	case USBHSF_PKT_PREPARE:
157 		func = pkt->handler->prepare;
158 		break;
159 	case USBHSF_PKT_TRY_RUN:
160 		func = pkt->handler->try_run;
161 		break;
162 	case USBHSF_PKT_DMA_DONE:
163 		func = pkt->handler->dma_done;
164 		break;
165 	default:
166 		dev_err(dev, "unknown pkt hander\n");
167 		goto __usbhs_pkt_handler_end;
168 	}
169 
170 	ret = func(pkt, &is_done);
171 
172 	if (is_done)
173 		__usbhsf_pkt_del(pkt);
174 
175 __usbhs_pkt_handler_end:
176 	usbhs_unlock(priv, flags);
177 	/********************  spin unlock ******************/
178 
179 	if (is_done) {
180 		pkt->done(priv, pkt);
181 		usbhs_pkt_start(pipe);
182 	}
183 
184 	return ret;
185 }
186 
187 void usbhs_pkt_start(struct usbhs_pipe *pipe)
188 {
189 	usbhsf_pkt_handler(pipe, USBHSF_PKT_PREPARE);
190 }
191 
192 /*
193  *		irq enable/disable function
194  */
195 #define usbhsf_irq_empty_ctrl(p, e) usbhsf_irq_callback_ctrl(p, bempsts, e)
196 #define usbhsf_irq_ready_ctrl(p, e) usbhsf_irq_callback_ctrl(p, brdysts, e)
197 #define usbhsf_irq_callback_ctrl(pipe, status, enable)			\
198 	({								\
199 		struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);	\
200 		struct usbhs_mod *mod = usbhs_mod_get_current(priv);	\
201 		u16 status = (1 << usbhs_pipe_number(pipe));		\
202 		if (!mod)						\
203 			return;						\
204 		if (enable)						\
205 			mod->irq_##status |= status;			\
206 		else							\
207 			mod->irq_##status &= ~status;			\
208 		usbhs_irq_callback_update(priv, mod);			\
209 	})
210 
211 static void usbhsf_tx_irq_ctrl(struct usbhs_pipe *pipe, int enable)
212 {
213 	/*
214 	 * And DCP pipe can NOT use "ready interrupt" for "send"
215 	 * it should use "empty" interrupt.
216 	 * see
217 	 *   "Operation" - "Interrupt Function" - "BRDY Interrupt"
218 	 *
219 	 * on the other hand, normal pipe can use "ready interrupt" for "send"
220 	 * even though it is single/double buffer
221 	 */
222 	if (usbhs_pipe_is_dcp(pipe))
223 		usbhsf_irq_empty_ctrl(pipe, enable);
224 	else
225 		usbhsf_irq_ready_ctrl(pipe, enable);
226 }
227 
228 static void usbhsf_rx_irq_ctrl(struct usbhs_pipe *pipe, int enable)
229 {
230 	usbhsf_irq_ready_ctrl(pipe, enable);
231 }
232 
233 /*
234  *		FIFO ctrl
235  */
236 static void usbhsf_send_terminator(struct usbhs_pipe *pipe,
237 				   struct usbhs_fifo *fifo)
238 {
239 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
240 
241 	usbhs_bset(priv, fifo->ctr, BVAL, BVAL);
242 }
243 
244 static int usbhsf_fifo_barrier(struct usbhs_priv *priv,
245 			       struct usbhs_fifo *fifo)
246 {
247 	int timeout = 1024;
248 
249 	do {
250 		/* The FIFO port is accessible */
251 		if (usbhs_read(priv, fifo->ctr) & FRDY)
252 			return 0;
253 
254 		udelay(10);
255 	} while (timeout--);
256 
257 	return -EBUSY;
258 }
259 
260 static void usbhsf_fifo_clear(struct usbhs_pipe *pipe,
261 			      struct usbhs_fifo *fifo)
262 {
263 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
264 
265 	if (!usbhs_pipe_is_dcp(pipe))
266 		usbhsf_fifo_barrier(priv, fifo);
267 
268 	usbhs_write(priv, fifo->ctr, BCLR);
269 }
270 
271 static int usbhsf_fifo_rcv_len(struct usbhs_priv *priv,
272 			       struct usbhs_fifo *fifo)
273 {
274 	return usbhs_read(priv, fifo->ctr) & DTLN_MASK;
275 }
276 
277 static void usbhsf_fifo_unselect(struct usbhs_pipe *pipe,
278 				 struct usbhs_fifo *fifo)
279 {
280 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
281 
282 	usbhs_pipe_select_fifo(pipe, NULL);
283 	usbhs_write(priv, fifo->sel, 0);
284 }
285 
286 static int usbhsf_fifo_select(struct usbhs_pipe *pipe,
287 			      struct usbhs_fifo *fifo,
288 			      int write)
289 {
290 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
291 	struct device *dev = usbhs_priv_to_dev(priv);
292 	int timeout = 1024;
293 	u16 mask = ((1 << 5) | 0xF);		/* mask of ISEL | CURPIPE */
294 	u16 base = usbhs_pipe_number(pipe);	/* CURPIPE */
295 
296 	if (usbhs_pipe_is_busy(pipe) ||
297 	    usbhsf_fifo_is_busy(fifo))
298 		return -EBUSY;
299 
300 	if (usbhs_pipe_is_dcp(pipe)) {
301 		base |= (1 == write) << 5;	/* ISEL */
302 
303 		if (usbhs_mod_is_host(priv))
304 			usbhs_dcp_dir_for_host(pipe, write);
305 	}
306 
307 	/* "base" will be used below  */
308 	usbhs_write(priv, fifo->sel, base | MBW_32);
309 
310 	/* check ISEL and CURPIPE value */
311 	while (timeout--) {
312 		if (base == (mask & usbhs_read(priv, fifo->sel))) {
313 			usbhs_pipe_select_fifo(pipe, fifo);
314 			return 0;
315 		}
316 		udelay(10);
317 	}
318 
319 	dev_err(dev, "fifo select error\n");
320 
321 	return -EIO;
322 }
323 
324 /*
325  *		DCP status stage
326  */
327 static int usbhs_dcp_dir_switch_to_write(struct usbhs_pkt *pkt, int *is_done)
328 {
329 	struct usbhs_pipe *pipe = pkt->pipe;
330 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
331 	struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv); /* CFIFO */
332 	struct device *dev = usbhs_priv_to_dev(priv);
333 	int ret;
334 
335 	usbhs_pipe_disable(pipe);
336 
337 	ret = usbhsf_fifo_select(pipe, fifo, 1);
338 	if (ret < 0) {
339 		dev_err(dev, "%s() faile\n", __func__);
340 		return ret;
341 	}
342 
343 	usbhs_pipe_sequence_data1(pipe); /* DATA1 */
344 
345 	usbhsf_fifo_clear(pipe, fifo);
346 	usbhsf_send_terminator(pipe, fifo);
347 
348 	usbhsf_fifo_unselect(pipe, fifo);
349 
350 	usbhsf_tx_irq_ctrl(pipe, 1);
351 	usbhs_pipe_enable(pipe);
352 
353 	return ret;
354 }
355 
356 static int usbhs_dcp_dir_switch_to_read(struct usbhs_pkt *pkt, int *is_done)
357 {
358 	struct usbhs_pipe *pipe = pkt->pipe;
359 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
360 	struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv); /* CFIFO */
361 	struct device *dev = usbhs_priv_to_dev(priv);
362 	int ret;
363 
364 	usbhs_pipe_disable(pipe);
365 
366 	ret = usbhsf_fifo_select(pipe, fifo, 0);
367 	if (ret < 0) {
368 		dev_err(dev, "%s() fail\n", __func__);
369 		return ret;
370 	}
371 
372 	usbhs_pipe_sequence_data1(pipe); /* DATA1 */
373 	usbhsf_fifo_clear(pipe, fifo);
374 
375 	usbhsf_fifo_unselect(pipe, fifo);
376 
377 	usbhsf_rx_irq_ctrl(pipe, 1);
378 	usbhs_pipe_enable(pipe);
379 
380 	return ret;
381 
382 }
383 
384 static int usbhs_dcp_dir_switch_done(struct usbhs_pkt *pkt, int *is_done)
385 {
386 	struct usbhs_pipe *pipe = pkt->pipe;
387 
388 	if (pkt->handler == &usbhs_dcp_status_stage_in_handler)
389 		usbhsf_tx_irq_ctrl(pipe, 0);
390 	else
391 		usbhsf_rx_irq_ctrl(pipe, 0);
392 
393 	pkt->actual = pkt->length;
394 	*is_done = 1;
395 
396 	return 0;
397 }
398 
399 struct usbhs_pkt_handle usbhs_dcp_status_stage_in_handler = {
400 	.prepare = usbhs_dcp_dir_switch_to_write,
401 	.try_run = usbhs_dcp_dir_switch_done,
402 };
403 
404 struct usbhs_pkt_handle usbhs_dcp_status_stage_out_handler = {
405 	.prepare = usbhs_dcp_dir_switch_to_read,
406 	.try_run = usbhs_dcp_dir_switch_done,
407 };
408 
409 /*
410  *		DCP data stage (push)
411  */
412 static int usbhsf_dcp_data_stage_try_push(struct usbhs_pkt *pkt, int *is_done)
413 {
414 	struct usbhs_pipe *pipe = pkt->pipe;
415 
416 	usbhs_pipe_sequence_data1(pipe); /* DATA1 */
417 
418 	/*
419 	 * change handler to PIO push
420 	 */
421 	pkt->handler = &usbhs_fifo_pio_push_handler;
422 
423 	return pkt->handler->prepare(pkt, is_done);
424 }
425 
426 struct usbhs_pkt_handle usbhs_dcp_data_stage_out_handler = {
427 	.prepare = usbhsf_dcp_data_stage_try_push,
428 };
429 
430 /*
431  *		DCP data stage (pop)
432  */
433 static int usbhsf_dcp_data_stage_prepare_pop(struct usbhs_pkt *pkt,
434 					     int *is_done)
435 {
436 	struct usbhs_pipe *pipe = pkt->pipe;
437 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
438 	struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv);
439 
440 	if (usbhs_pipe_is_busy(pipe))
441 		return 0;
442 
443 	/*
444 	 * prepare pop for DCP should
445 	 *  - change DCP direction,
446 	 *  - clear fifo
447 	 *  - DATA1
448 	 */
449 	usbhs_pipe_disable(pipe);
450 
451 	usbhs_pipe_sequence_data1(pipe); /* DATA1 */
452 
453 	usbhsf_fifo_select(pipe, fifo, 0);
454 	usbhsf_fifo_clear(pipe, fifo);
455 	usbhsf_fifo_unselect(pipe, fifo);
456 
457 	/*
458 	 * change handler to PIO pop
459 	 */
460 	pkt->handler = &usbhs_fifo_pio_pop_handler;
461 
462 	return pkt->handler->prepare(pkt, is_done);
463 }
464 
465 struct usbhs_pkt_handle usbhs_dcp_data_stage_in_handler = {
466 	.prepare = usbhsf_dcp_data_stage_prepare_pop,
467 };
468 
469 /*
470  *		PIO push handler
471  */
472 static int usbhsf_pio_try_push(struct usbhs_pkt *pkt, int *is_done)
473 {
474 	struct usbhs_pipe *pipe = pkt->pipe;
475 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
476 	struct device *dev = usbhs_priv_to_dev(priv);
477 	struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv); /* CFIFO */
478 	void __iomem *addr = priv->base + fifo->port;
479 	u8 *buf;
480 	int maxp = usbhs_pipe_get_maxpacket(pipe);
481 	int total_len;
482 	int i, ret, len;
483 	int is_short;
484 
485 	usbhs_pipe_data_sequence(pipe, pkt->sequence);
486 	pkt->sequence = -1; /* -1 sequence will be ignored */
487 
488 	ret = usbhsf_fifo_select(pipe, fifo, 1);
489 	if (ret < 0)
490 		return 0;
491 
492 	ret = usbhs_pipe_is_accessible(pipe);
493 	if (ret < 0) {
494 		/* inaccessible pipe is not an error */
495 		ret = 0;
496 		goto usbhs_fifo_write_busy;
497 	}
498 
499 	ret = usbhsf_fifo_barrier(priv, fifo);
500 	if (ret < 0)
501 		goto usbhs_fifo_write_busy;
502 
503 	buf		= pkt->buf    + pkt->actual;
504 	len		= pkt->length - pkt->actual;
505 	len		= min(len, maxp);
506 	total_len	= len;
507 	is_short	= total_len < maxp;
508 
509 	/*
510 	 * FIXME
511 	 *
512 	 * 32-bit access only
513 	 */
514 	if (len >= 4 && !((unsigned long)buf & 0x03)) {
515 		iowrite32_rep(addr, buf, len / 4);
516 		len %= 4;
517 		buf += total_len - len;
518 	}
519 
520 	/* the rest operation */
521 	for (i = 0; i < len; i++)
522 		iowrite8(buf[i], addr + (0x03 - (i & 0x03)));
523 
524 	/*
525 	 * variable update
526 	 */
527 	pkt->actual += total_len;
528 
529 	if (pkt->actual < pkt->length)
530 		*is_done = 0;		/* there are remainder data */
531 	else if (is_short)
532 		*is_done = 1;		/* short packet */
533 	else
534 		*is_done = !pkt->zero;	/* send zero packet ? */
535 
536 	/*
537 	 * pipe/irq handling
538 	 */
539 	if (is_short)
540 		usbhsf_send_terminator(pipe, fifo);
541 
542 	usbhsf_tx_irq_ctrl(pipe, !*is_done);
543 	usbhs_pipe_enable(pipe);
544 
545 	dev_dbg(dev, "  send %d (%d/ %d/ %d/ %d)\n",
546 		usbhs_pipe_number(pipe),
547 		pkt->length, pkt->actual, *is_done, pkt->zero);
548 
549 	/*
550 	 * Transmission end
551 	 */
552 	if (*is_done) {
553 		if (usbhs_pipe_is_dcp(pipe))
554 			usbhs_dcp_control_transfer_done(pipe);
555 	}
556 
557 	usbhsf_fifo_unselect(pipe, fifo);
558 
559 	return 0;
560 
561 usbhs_fifo_write_busy:
562 	usbhsf_fifo_unselect(pipe, fifo);
563 
564 	/*
565 	 * pipe is busy.
566 	 * retry in interrupt
567 	 */
568 	usbhsf_tx_irq_ctrl(pipe, 1);
569 
570 	return ret;
571 }
572 
573 struct usbhs_pkt_handle usbhs_fifo_pio_push_handler = {
574 	.prepare = usbhsf_pio_try_push,
575 	.try_run = usbhsf_pio_try_push,
576 };
577 
578 /*
579  *		PIO pop handler
580  */
581 static int usbhsf_prepare_pop(struct usbhs_pkt *pkt, int *is_done)
582 {
583 	struct usbhs_pipe *pipe = pkt->pipe;
584 
585 	if (usbhs_pipe_is_busy(pipe))
586 		return 0;
587 
588 	/*
589 	 * pipe enable to prepare packet receive
590 	 */
591 	usbhs_pipe_data_sequence(pipe, pkt->sequence);
592 	pkt->sequence = -1; /* -1 sequence will be ignored */
593 
594 	usbhs_pipe_enable(pipe);
595 	usbhsf_rx_irq_ctrl(pipe, 1);
596 
597 	return 0;
598 }
599 
600 static int usbhsf_pio_try_pop(struct usbhs_pkt *pkt, int *is_done)
601 {
602 	struct usbhs_pipe *pipe = pkt->pipe;
603 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
604 	struct device *dev = usbhs_priv_to_dev(priv);
605 	struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv); /* CFIFO */
606 	void __iomem *addr = priv->base + fifo->port;
607 	u8 *buf;
608 	u32 data = 0;
609 	int maxp = usbhs_pipe_get_maxpacket(pipe);
610 	int rcv_len, len;
611 	int i, ret;
612 	int total_len = 0;
613 
614 	ret = usbhsf_fifo_select(pipe, fifo, 0);
615 	if (ret < 0)
616 		return 0;
617 
618 	ret = usbhsf_fifo_barrier(priv, fifo);
619 	if (ret < 0)
620 		goto usbhs_fifo_read_busy;
621 
622 	rcv_len = usbhsf_fifo_rcv_len(priv, fifo);
623 
624 	buf		= pkt->buf    + pkt->actual;
625 	len		= pkt->length - pkt->actual;
626 	len		= min(len, rcv_len);
627 	total_len	= len;
628 
629 	/*
630 	 * update actual length first here to decide disable pipe.
631 	 * if this pipe keeps BUF status and all data were popped,
632 	 * then, next interrupt/token will be issued again
633 	 */
634 	pkt->actual += total_len;
635 
636 	if ((pkt->actual == pkt->length) ||	/* receive all data */
637 	    (total_len < maxp)) {		/* short packet */
638 		*is_done = 1;
639 		usbhsf_rx_irq_ctrl(pipe, 0);
640 		usbhs_pipe_disable(pipe);	/* disable pipe first */
641 	}
642 
643 	/*
644 	 * Buffer clear if Zero-Length packet
645 	 *
646 	 * see
647 	 * "Operation" - "FIFO Buffer Memory" - "FIFO Port Function"
648 	 */
649 	if (0 == rcv_len) {
650 		pkt->zero = 1;
651 		usbhsf_fifo_clear(pipe, fifo);
652 		goto usbhs_fifo_read_end;
653 	}
654 
655 	/*
656 	 * FIXME
657 	 *
658 	 * 32-bit access only
659 	 */
660 	if (len >= 4 && !((unsigned long)buf & 0x03)) {
661 		ioread32_rep(addr, buf, len / 4);
662 		len %= 4;
663 		buf += total_len - len;
664 	}
665 
666 	/* the rest operation */
667 	for (i = 0; i < len; i++) {
668 		if (!(i & 0x03))
669 			data = ioread32(addr);
670 
671 		buf[i] = (data >> ((i & 0x03) * 8)) & 0xff;
672 	}
673 
674 usbhs_fifo_read_end:
675 	dev_dbg(dev, "  recv %d (%d/ %d/ %d/ %d)\n",
676 		usbhs_pipe_number(pipe),
677 		pkt->length, pkt->actual, *is_done, pkt->zero);
678 
679 usbhs_fifo_read_busy:
680 	usbhsf_fifo_unselect(pipe, fifo);
681 
682 	return ret;
683 }
684 
685 struct usbhs_pkt_handle usbhs_fifo_pio_pop_handler = {
686 	.prepare = usbhsf_prepare_pop,
687 	.try_run = usbhsf_pio_try_pop,
688 };
689 
690 /*
691  *		DCP ctrol statge handler
692  */
693 static int usbhsf_ctrl_stage_end(struct usbhs_pkt *pkt, int *is_done)
694 {
695 	usbhs_dcp_control_transfer_done(pkt->pipe);
696 
697 	*is_done = 1;
698 
699 	return 0;
700 }
701 
702 struct usbhs_pkt_handle usbhs_ctrl_stage_end_handler = {
703 	.prepare = usbhsf_ctrl_stage_end,
704 	.try_run = usbhsf_ctrl_stage_end,
705 };
706 
707 /*
708  *		DMA fifo functions
709  */
710 static struct dma_chan *usbhsf_dma_chan_get(struct usbhs_fifo *fifo,
711 					    struct usbhs_pkt *pkt)
712 {
713 	if (&usbhs_fifo_dma_push_handler == pkt->handler)
714 		return fifo->tx_chan;
715 
716 	if (&usbhs_fifo_dma_pop_handler == pkt->handler)
717 		return fifo->rx_chan;
718 
719 	return NULL;
720 }
721 
722 static struct usbhs_fifo *usbhsf_get_dma_fifo(struct usbhs_priv *priv,
723 					      struct usbhs_pkt *pkt)
724 {
725 	struct usbhs_fifo *fifo;
726 
727 	/* DMA :: D0FIFO */
728 	fifo = usbhsf_get_d0fifo(priv);
729 	if (usbhsf_dma_chan_get(fifo, pkt) &&
730 	    !usbhsf_fifo_is_busy(fifo))
731 		return fifo;
732 
733 	/* DMA :: D1FIFO */
734 	fifo = usbhsf_get_d1fifo(priv);
735 	if (usbhsf_dma_chan_get(fifo, pkt) &&
736 	    !usbhsf_fifo_is_busy(fifo))
737 		return fifo;
738 
739 	return NULL;
740 }
741 
742 #define usbhsf_dma_start(p, f)	__usbhsf_dma_ctrl(p, f, DREQE)
743 #define usbhsf_dma_stop(p, f)	__usbhsf_dma_ctrl(p, f, 0)
744 static void __usbhsf_dma_ctrl(struct usbhs_pipe *pipe,
745 			      struct usbhs_fifo *fifo,
746 			      u16 dreqe)
747 {
748 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
749 
750 	usbhs_bset(priv, fifo->sel, DREQE, dreqe);
751 }
752 
753 #define usbhsf_dma_map(p)	__usbhsf_dma_map_ctrl(p, 1)
754 #define usbhsf_dma_unmap(p)	__usbhsf_dma_map_ctrl(p, 0)
755 static int __usbhsf_dma_map_ctrl(struct usbhs_pkt *pkt, int map)
756 {
757 	struct usbhs_pipe *pipe = pkt->pipe;
758 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
759 	struct usbhs_pipe_info *info = usbhs_priv_to_pipeinfo(priv);
760 
761 	return info->dma_map_ctrl(pkt, map);
762 }
763 
764 static void usbhsf_dma_complete(void *arg);
765 static void usbhsf_dma_prepare_tasklet(unsigned long data)
766 {
767 	struct usbhs_pkt *pkt = (struct usbhs_pkt *)data;
768 	struct usbhs_pipe *pipe = pkt->pipe;
769 	struct usbhs_fifo *fifo = usbhs_pipe_to_fifo(pipe);
770 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
771 	struct scatterlist sg;
772 	struct dma_async_tx_descriptor *desc;
773 	struct dma_chan *chan = usbhsf_dma_chan_get(fifo, pkt);
774 	struct device *dev = usbhs_priv_to_dev(priv);
775 	enum dma_transfer_direction dir;
776 	dma_cookie_t cookie;
777 
778 	dir = usbhs_pipe_is_dir_in(pipe) ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV;
779 
780 	sg_init_table(&sg, 1);
781 	sg_set_page(&sg, virt_to_page(pkt->dma),
782 		    pkt->length, offset_in_page(pkt->dma));
783 	sg_dma_address(&sg) = pkt->dma + pkt->actual;
784 	sg_dma_len(&sg) = pkt->trans;
785 
786 	desc = chan->device->device_prep_slave_sg(chan, &sg, 1, dir,
787 						  DMA_PREP_INTERRUPT |
788 						  DMA_CTRL_ACK);
789 	if (!desc)
790 		return;
791 
792 	desc->callback		= usbhsf_dma_complete;
793 	desc->callback_param	= pipe;
794 
795 	cookie = desc->tx_submit(desc);
796 	if (cookie < 0) {
797 		dev_err(dev, "Failed to submit dma descriptor\n");
798 		return;
799 	}
800 
801 	dev_dbg(dev, "  %s %d (%d/ %d)\n",
802 		fifo->name, usbhs_pipe_number(pipe), pkt->length, pkt->zero);
803 
804 	usbhsf_dma_start(pipe, fifo);
805 	dma_async_issue_pending(chan);
806 }
807 
808 /*
809  *		DMA push handler
810  */
811 static int usbhsf_dma_prepare_push(struct usbhs_pkt *pkt, int *is_done)
812 {
813 	struct usbhs_pipe *pipe = pkt->pipe;
814 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
815 	struct usbhs_fifo *fifo;
816 	int len = pkt->length - pkt->actual;
817 	int ret;
818 
819 	if (usbhs_pipe_is_busy(pipe))
820 		return 0;
821 
822 	/* use PIO if packet is less than pio_dma_border or pipe is DCP */
823 	if ((len < usbhs_get_dparam(priv, pio_dma_border)) ||
824 	    usbhs_pipe_is_dcp(pipe))
825 		goto usbhsf_pio_prepare_push;
826 
827 	if (len % 4) /* 32bit alignment */
828 		goto usbhsf_pio_prepare_push;
829 
830 	if ((uintptr_t)(pkt->buf + pkt->actual) & 0x7) /* 8byte alignment */
831 		goto usbhsf_pio_prepare_push;
832 
833 	/* get enable DMA fifo */
834 	fifo = usbhsf_get_dma_fifo(priv, pkt);
835 	if (!fifo)
836 		goto usbhsf_pio_prepare_push;
837 
838 	if (usbhsf_dma_map(pkt) < 0)
839 		goto usbhsf_pio_prepare_push;
840 
841 	ret = usbhsf_fifo_select(pipe, fifo, 0);
842 	if (ret < 0)
843 		goto usbhsf_pio_prepare_push_unmap;
844 
845 	pkt->trans = len;
846 
847 	tasklet_init(&fifo->tasklet,
848 		     usbhsf_dma_prepare_tasklet,
849 		     (unsigned long)pkt);
850 
851 	tasklet_schedule(&fifo->tasklet);
852 
853 	return 0;
854 
855 usbhsf_pio_prepare_push_unmap:
856 	usbhsf_dma_unmap(pkt);
857 usbhsf_pio_prepare_push:
858 	/*
859 	 * change handler to PIO
860 	 */
861 	pkt->handler = &usbhs_fifo_pio_push_handler;
862 
863 	return pkt->handler->prepare(pkt, is_done);
864 }
865 
866 static int usbhsf_dma_push_done(struct usbhs_pkt *pkt, int *is_done)
867 {
868 	struct usbhs_pipe *pipe = pkt->pipe;
869 
870 	pkt->actual = pkt->trans;
871 
872 	*is_done = !pkt->zero;	/* send zero packet ? */
873 
874 	usbhsf_dma_stop(pipe, pipe->fifo);
875 	usbhsf_dma_unmap(pkt);
876 	usbhsf_fifo_unselect(pipe, pipe->fifo);
877 
878 	return 0;
879 }
880 
881 struct usbhs_pkt_handle usbhs_fifo_dma_push_handler = {
882 	.prepare	= usbhsf_dma_prepare_push,
883 	.dma_done	= usbhsf_dma_push_done,
884 };
885 
886 /*
887  *		DMA pop handler
888  */
889 static int usbhsf_dma_try_pop(struct usbhs_pkt *pkt, int *is_done)
890 {
891 	struct usbhs_pipe *pipe = pkt->pipe;
892 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
893 	struct usbhs_fifo *fifo;
894 	int len, ret;
895 
896 	if (usbhs_pipe_is_busy(pipe))
897 		return 0;
898 
899 	if (usbhs_pipe_is_dcp(pipe))
900 		goto usbhsf_pio_prepare_pop;
901 
902 	/* get enable DMA fifo */
903 	fifo = usbhsf_get_dma_fifo(priv, pkt);
904 	if (!fifo)
905 		goto usbhsf_pio_prepare_pop;
906 
907 	if ((uintptr_t)(pkt->buf + pkt->actual) & 0x7) /* 8byte alignment */
908 		goto usbhsf_pio_prepare_pop;
909 
910 	ret = usbhsf_fifo_select(pipe, fifo, 0);
911 	if (ret < 0)
912 		goto usbhsf_pio_prepare_pop;
913 
914 	/* use PIO if packet is less than pio_dma_border */
915 	len = usbhsf_fifo_rcv_len(priv, fifo);
916 	len = min(pkt->length - pkt->actual, len);
917 	if (len % 4) /* 32bit alignment */
918 		goto usbhsf_pio_prepare_pop_unselect;
919 
920 	if (len < usbhs_get_dparam(priv, pio_dma_border))
921 		goto usbhsf_pio_prepare_pop_unselect;
922 
923 	ret = usbhsf_fifo_barrier(priv, fifo);
924 	if (ret < 0)
925 		goto usbhsf_pio_prepare_pop_unselect;
926 
927 	if (usbhsf_dma_map(pkt) < 0)
928 		goto usbhsf_pio_prepare_pop_unselect;
929 
930 	/* DMA */
931 
932 	/*
933 	 * usbhs_fifo_dma_pop_handler :: prepare
934 	 * enabled irq to come here.
935 	 * but it is no longer needed for DMA. disable it.
936 	 */
937 	usbhsf_rx_irq_ctrl(pipe, 0);
938 
939 	pkt->trans = len;
940 
941 	tasklet_init(&fifo->tasklet,
942 		     usbhsf_dma_prepare_tasklet,
943 		     (unsigned long)pkt);
944 
945 	tasklet_schedule(&fifo->tasklet);
946 
947 	return 0;
948 
949 usbhsf_pio_prepare_pop_unselect:
950 	usbhsf_fifo_unselect(pipe, fifo);
951 usbhsf_pio_prepare_pop:
952 
953 	/*
954 	 * change handler to PIO
955 	 */
956 	pkt->handler = &usbhs_fifo_pio_pop_handler;
957 
958 	return pkt->handler->try_run(pkt, is_done);
959 }
960 
961 static int usbhsf_dma_pop_done(struct usbhs_pkt *pkt, int *is_done)
962 {
963 	struct usbhs_pipe *pipe = pkt->pipe;
964 	int maxp = usbhs_pipe_get_maxpacket(pipe);
965 
966 	usbhsf_dma_stop(pipe, pipe->fifo);
967 	usbhsf_dma_unmap(pkt);
968 	usbhsf_fifo_unselect(pipe, pipe->fifo);
969 
970 	pkt->actual += pkt->trans;
971 
972 	if ((pkt->actual == pkt->length) ||	/* receive all data */
973 	    (pkt->trans < maxp)) {		/* short packet */
974 		*is_done = 1;
975 	} else {
976 		/* re-enable */
977 		usbhsf_prepare_pop(pkt, is_done);
978 	}
979 
980 	return 0;
981 }
982 
983 struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler = {
984 	.prepare	= usbhsf_prepare_pop,
985 	.try_run	= usbhsf_dma_try_pop,
986 	.dma_done	= usbhsf_dma_pop_done
987 };
988 
989 /*
990  *		DMA setting
991  */
992 static bool usbhsf_dma_filter(struct dma_chan *chan, void *param)
993 {
994 	struct sh_dmae_slave *slave = param;
995 
996 	/*
997 	 * FIXME
998 	 *
999 	 * usbhs doesn't recognize id = 0 as valid DMA
1000 	 */
1001 	if (0 == slave->slave_id)
1002 		return false;
1003 
1004 	chan->private = slave;
1005 
1006 	return true;
1007 }
1008 
1009 static void usbhsf_dma_quit(struct usbhs_priv *priv, struct usbhs_fifo *fifo)
1010 {
1011 	if (fifo->tx_chan)
1012 		dma_release_channel(fifo->tx_chan);
1013 	if (fifo->rx_chan)
1014 		dma_release_channel(fifo->rx_chan);
1015 
1016 	fifo->tx_chan = NULL;
1017 	fifo->rx_chan = NULL;
1018 }
1019 
1020 static void usbhsf_dma_init(struct usbhs_priv *priv,
1021 			    struct usbhs_fifo *fifo)
1022 {
1023 	struct device *dev = usbhs_priv_to_dev(priv);
1024 	dma_cap_mask_t mask;
1025 
1026 	dma_cap_zero(mask);
1027 	dma_cap_set(DMA_SLAVE, mask);
1028 	fifo->tx_chan = dma_request_channel(mask, usbhsf_dma_filter,
1029 					    &fifo->tx_slave);
1030 
1031 	dma_cap_zero(mask);
1032 	dma_cap_set(DMA_SLAVE, mask);
1033 	fifo->rx_chan = dma_request_channel(mask, usbhsf_dma_filter,
1034 					    &fifo->rx_slave);
1035 
1036 	if (fifo->tx_chan || fifo->rx_chan)
1037 		dev_dbg(dev, "enable DMAEngine (%s%s%s)\n",
1038 			 fifo->name,
1039 			 fifo->tx_chan ? "[TX]" : "    ",
1040 			 fifo->rx_chan ? "[RX]" : "    ");
1041 }
1042 
1043 /*
1044  *		irq functions
1045  */
1046 static int usbhsf_irq_empty(struct usbhs_priv *priv,
1047 			    struct usbhs_irq_state *irq_state)
1048 {
1049 	struct usbhs_pipe *pipe;
1050 	struct device *dev = usbhs_priv_to_dev(priv);
1051 	int i, ret;
1052 
1053 	if (!irq_state->bempsts) {
1054 		dev_err(dev, "debug %s !!\n", __func__);
1055 		return -EIO;
1056 	}
1057 
1058 	dev_dbg(dev, "irq empty [0x%04x]\n", irq_state->bempsts);
1059 
1060 	/*
1061 	 * search interrupted "pipe"
1062 	 * not "uep".
1063 	 */
1064 	usbhs_for_each_pipe_with_dcp(pipe, priv, i) {
1065 		if (!(irq_state->bempsts & (1 << i)))
1066 			continue;
1067 
1068 		ret = usbhsf_pkt_handler(pipe, USBHSF_PKT_TRY_RUN);
1069 		if (ret < 0)
1070 			dev_err(dev, "irq_empty run_error %d : %d\n", i, ret);
1071 	}
1072 
1073 	return 0;
1074 }
1075 
1076 static int usbhsf_irq_ready(struct usbhs_priv *priv,
1077 			    struct usbhs_irq_state *irq_state)
1078 {
1079 	struct usbhs_pipe *pipe;
1080 	struct device *dev = usbhs_priv_to_dev(priv);
1081 	int i, ret;
1082 
1083 	if (!irq_state->brdysts) {
1084 		dev_err(dev, "debug %s !!\n", __func__);
1085 		return -EIO;
1086 	}
1087 
1088 	dev_dbg(dev, "irq ready [0x%04x]\n", irq_state->brdysts);
1089 
1090 	/*
1091 	 * search interrupted "pipe"
1092 	 * not "uep".
1093 	 */
1094 	usbhs_for_each_pipe_with_dcp(pipe, priv, i) {
1095 		if (!(irq_state->brdysts & (1 << i)))
1096 			continue;
1097 
1098 		ret = usbhsf_pkt_handler(pipe, USBHSF_PKT_TRY_RUN);
1099 		if (ret < 0)
1100 			dev_err(dev, "irq_ready run_error %d : %d\n", i, ret);
1101 	}
1102 
1103 	return 0;
1104 }
1105 
1106 static void usbhsf_dma_complete(void *arg)
1107 {
1108 	struct usbhs_pipe *pipe = arg;
1109 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
1110 	struct device *dev = usbhs_priv_to_dev(priv);
1111 	int ret;
1112 
1113 	ret = usbhsf_pkt_handler(pipe, USBHSF_PKT_DMA_DONE);
1114 	if (ret < 0)
1115 		dev_err(dev, "dma_complete run_error %d : %d\n",
1116 			usbhs_pipe_number(pipe), ret);
1117 }
1118 
1119 /*
1120  *		fifo init
1121  */
1122 void usbhs_fifo_init(struct usbhs_priv *priv)
1123 {
1124 	struct usbhs_mod *mod = usbhs_mod_get_current(priv);
1125 	struct usbhs_fifo *cfifo = usbhsf_get_cfifo(priv);
1126 	struct usbhs_fifo *d0fifo = usbhsf_get_d0fifo(priv);
1127 	struct usbhs_fifo *d1fifo = usbhsf_get_d1fifo(priv);
1128 
1129 	mod->irq_empty		= usbhsf_irq_empty;
1130 	mod->irq_ready		= usbhsf_irq_ready;
1131 	mod->irq_bempsts	= 0;
1132 	mod->irq_brdysts	= 0;
1133 
1134 	cfifo->pipe	= NULL;
1135 	cfifo->tx_chan	= NULL;
1136 	cfifo->rx_chan	= NULL;
1137 
1138 	d0fifo->pipe	= NULL;
1139 	d0fifo->tx_chan	= NULL;
1140 	d0fifo->rx_chan	= NULL;
1141 
1142 	d1fifo->pipe	= NULL;
1143 	d1fifo->tx_chan	= NULL;
1144 	d1fifo->rx_chan	= NULL;
1145 
1146 	usbhsf_dma_init(priv, usbhsf_get_d0fifo(priv));
1147 	usbhsf_dma_init(priv, usbhsf_get_d1fifo(priv));
1148 }
1149 
1150 void usbhs_fifo_quit(struct usbhs_priv *priv)
1151 {
1152 	struct usbhs_mod *mod = usbhs_mod_get_current(priv);
1153 
1154 	mod->irq_empty		= NULL;
1155 	mod->irq_ready		= NULL;
1156 	mod->irq_bempsts	= 0;
1157 	mod->irq_brdysts	= 0;
1158 
1159 	usbhsf_dma_quit(priv, usbhsf_get_d0fifo(priv));
1160 	usbhsf_dma_quit(priv, usbhsf_get_d1fifo(priv));
1161 }
1162 
1163 int usbhs_fifo_probe(struct usbhs_priv *priv)
1164 {
1165 	struct usbhs_fifo *fifo;
1166 
1167 	/* CFIFO */
1168 	fifo = usbhsf_get_cfifo(priv);
1169 	fifo->name	= "CFIFO";
1170 	fifo->port	= CFIFO;
1171 	fifo->sel	= CFIFOSEL;
1172 	fifo->ctr	= CFIFOCTR;
1173 
1174 	/* D0FIFO */
1175 	fifo = usbhsf_get_d0fifo(priv);
1176 	fifo->name	= "D0FIFO";
1177 	fifo->port	= D0FIFO;
1178 	fifo->sel	= D0FIFOSEL;
1179 	fifo->ctr	= D0FIFOCTR;
1180 	fifo->tx_slave.slave_id	= usbhs_get_dparam(priv, d0_tx_id);
1181 	fifo->rx_slave.slave_id	= usbhs_get_dparam(priv, d0_rx_id);
1182 
1183 	/* D1FIFO */
1184 	fifo = usbhsf_get_d1fifo(priv);
1185 	fifo->name	= "D1FIFO";
1186 	fifo->port	= D1FIFO;
1187 	fifo->sel	= D1FIFOSEL;
1188 	fifo->ctr	= D1FIFOCTR;
1189 	fifo->tx_slave.slave_id	= usbhs_get_dparam(priv, d1_tx_id);
1190 	fifo->rx_slave.slave_id	= usbhs_get_dparam(priv, d1_rx_id);
1191 
1192 	return 0;
1193 }
1194 
1195 void usbhs_fifo_remove(struct usbhs_priv *priv)
1196 {
1197 }
1198