aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/renesas_usbhs/fifo.h
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2011-06-06 01:19:03 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-06-07 12:10:10 -0400
commite73a9891b3a1c9fc0970e0c9dbe2cc47933ad752 (patch)
treea40457485733fc6a08eae7f0d5efcbc98cf93a7d /drivers/usb/renesas_usbhs/fifo.h
parent0cb7e61d16ac68a2c5dd73a00e211287848d16e7 (diff)
usb: renesas_usbhs: add DMAEngine support
USB DMA was installed on "normal DMAC" when SH7724 or older SuperH, but the "USB-DMAC" was prepared on recent SuperH. These 2 DMAC have a little bit different behavior. This patch add DMAEngine code for "normal DMAC", but it is still using PIO fifo. The DMA fifo will be formally supported in the future. You can enable DMA fifo by local fixup usbhs_fifo_pio_push_handler -> usbhs_fifo_dma_push_handler usbhs_fifo_pio_pop_handler -> usbhs_fifo_dma_pop_handler on usbhsg_ep_enable. This DMAEngine was tested by g_file_storage on SH7724 Ecovec board Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/renesas_usbhs/fifo.h')
-rw-r--r--drivers/usb/renesas_usbhs/fifo.h24
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/usb/renesas_usbhs/fifo.h b/drivers/usb/renesas_usbhs/fifo.h
index 94db269f84c2..ed6d8e56c13c 100644
--- a/drivers/usb/renesas_usbhs/fifo.h
+++ b/drivers/usb/renesas_usbhs/fifo.h
@@ -17,18 +17,33 @@
17#ifndef RENESAS_USB_FIFO_H 17#ifndef RENESAS_USB_FIFO_H
18#define RENESAS_USB_FIFO_H 18#define RENESAS_USB_FIFO_H
19 19
20#include <linux/interrupt.h>
21#include <linux/sh_dma.h>
22#include <asm/dma.h>
20#include "pipe.h" 23#include "pipe.h"
21 24
25#define DMA_ADDR_INVALID (~(dma_addr_t)0)
26
22struct usbhs_fifo { 27struct usbhs_fifo {
28 char *name;
23 u32 port; /* xFIFO */ 29 u32 port; /* xFIFO */
24 u32 sel; /* xFIFOSEL */ 30 u32 sel; /* xFIFOSEL */
25 u32 ctr; /* xFIFOCTR */ 31 u32 ctr; /* xFIFOCTR */
26 32
27 struct usbhs_pipe *pipe; 33 struct usbhs_pipe *pipe;
34 struct tasklet_struct tasklet;
35
36 struct dma_chan *tx_chan;
37 struct dma_chan *rx_chan;
38
39 struct sh_dmae_slave tx_slave;
40 struct sh_dmae_slave rx_slave;
28}; 41};
29 42
30struct usbhs_fifo_info { 43struct usbhs_fifo_info {
31 struct usbhs_fifo cfifo; 44 struct usbhs_fifo cfifo;
45 struct usbhs_fifo d0fifo;
46 struct usbhs_fifo d1fifo;
32}; 47};
33 48
34struct usbhs_pkt_handle; 49struct usbhs_pkt_handle;
@@ -36,8 +51,10 @@ struct usbhs_pkt {
36 struct list_head node; 51 struct list_head node;
37 struct usbhs_pipe *pipe; 52 struct usbhs_pipe *pipe;
38 struct usbhs_pkt_handle *handler; 53 struct usbhs_pkt_handle *handler;
54 dma_addr_t dma;
39 void *buf; 55 void *buf;
40 int length; 56 int length;
57 int trans;
41 int actual; 58 int actual;
42 int zero; 59 int zero;
43}; 60};
@@ -45,6 +62,7 @@ struct usbhs_pkt {
45struct usbhs_pkt_handle { 62struct usbhs_pkt_handle {
46 int (*prepare)(struct usbhs_pkt *pkt, int *is_done); 63 int (*prepare)(struct usbhs_pkt *pkt, int *is_done);
47 int (*try_run)(struct usbhs_pkt *pkt, int *is_done); 64 int (*try_run)(struct usbhs_pkt *pkt, int *is_done);
65 int (*dma_done)(struct usbhs_pkt *pkt, int *is_done);
48}; 66};
49 67
50/* 68/*
@@ -61,12 +79,17 @@ void usbhs_fifo_quit(struct usbhs_priv *priv);
61enum { 79enum {
62 USBHSF_PKT_PREPARE, 80 USBHSF_PKT_PREPARE,
63 USBHSF_PKT_TRY_RUN, 81 USBHSF_PKT_TRY_RUN,
82 USBHSF_PKT_DMA_DONE,
64}; 83};
65 84
66extern struct usbhs_pkt_handle usbhs_fifo_pio_push_handler; 85extern struct usbhs_pkt_handle usbhs_fifo_pio_push_handler;
67extern struct usbhs_pkt_handle usbhs_fifo_pio_pop_handler; 86extern struct usbhs_pkt_handle usbhs_fifo_pio_pop_handler;
68extern struct usbhs_pkt_handle usbhs_ctrl_stage_end_handler; 87extern struct usbhs_pkt_handle usbhs_ctrl_stage_end_handler;
69 88
89extern struct usbhs_pkt_handle usbhs_fifo_dma_push_handler;
90extern struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler;
91
92
70void usbhs_pkt_init(struct usbhs_pkt *pkt); 93void usbhs_pkt_init(struct usbhs_pkt *pkt);
71void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt, 94void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt,
72 struct usbhs_pkt_handle *handler, 95 struct usbhs_pkt_handle *handler,
@@ -76,5 +99,6 @@ int __usbhs_pkt_handler(struct usbhs_pipe *pipe, int type);
76 99
77#define usbhs_pkt_start(p) __usbhs_pkt_handler(p, USBHSF_PKT_PREPARE) 100#define usbhs_pkt_start(p) __usbhs_pkt_handler(p, USBHSF_PKT_PREPARE)
78#define usbhs_pkt_run(p) __usbhs_pkt_handler(p, USBHSF_PKT_TRY_RUN) 101#define usbhs_pkt_run(p) __usbhs_pkt_handler(p, USBHSF_PKT_TRY_RUN)
102#define usbhs_pkt_dmadone(p) __usbhs_pkt_handler(p, USBHSF_PKT_DMA_DONE)
79 103
80#endif /* RENESAS_USB_FIFO_H */ 104#endif /* RENESAS_USB_FIFO_H */