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 #ifndef RENESAS_USB_FIFO_H 18 #define RENESAS_USB_FIFO_H 19 20 #include <linux/interrupt.h> 21 #include <linux/sh_dma.h> 22 #include <linux/workqueue.h> 23 #include <asm/dma.h> 24 #include "pipe.h" 25 26 struct usbhs_fifo { 27 char *name; 28 u32 port; /* xFIFO */ 29 u32 sel; /* xFIFOSEL */ 30 u32 ctr; /* xFIFOCTR */ 31 32 struct usbhs_pipe *pipe; 33 34 struct dma_chan *tx_chan; 35 struct dma_chan *rx_chan; 36 37 struct sh_dmae_slave tx_slave; 38 struct sh_dmae_slave rx_slave; 39 }; 40 41 #define USBHS_MAX_NUM_DFIFO 4 42 struct usbhs_fifo_info { 43 struct usbhs_fifo cfifo; 44 struct usbhs_fifo dfifo[USBHS_MAX_NUM_DFIFO]; 45 }; 46 #define usbhsf_get_dnfifo(p, n) (&((p)->fifo_info.dfifo[n])) 47 #define usbhs_for_each_dfifo(priv, dfifo, i) \ 48 for ((i) = 0; \ 49 ((i) < USBHS_MAX_NUM_DFIFO) && \ 50 ((dfifo) = usbhsf_get_dnfifo(priv, (i))); \ 51 (i)++) 52 53 struct usbhs_pkt_handle; 54 struct usbhs_pkt { 55 struct list_head node; 56 struct usbhs_pipe *pipe; 57 const struct usbhs_pkt_handle *handler; 58 void (*done)(struct usbhs_priv *priv, 59 struct usbhs_pkt *pkt); 60 struct work_struct work; 61 dma_addr_t dma; 62 dma_cookie_t cookie; 63 void *buf; 64 int length; 65 int trans; 66 int actual; 67 int zero; 68 int sequence; 69 }; 70 71 struct usbhs_pkt_handle { 72 int (*prepare)(struct usbhs_pkt *pkt, int *is_done); 73 int (*try_run)(struct usbhs_pkt *pkt, int *is_done); 74 int (*dma_done)(struct usbhs_pkt *pkt, int *is_done); 75 }; 76 77 /* 78 * fifo 79 */ 80 int usbhs_fifo_probe(struct usbhs_priv *priv); 81 void usbhs_fifo_remove(struct usbhs_priv *priv); 82 void usbhs_fifo_init(struct usbhs_priv *priv); 83 void usbhs_fifo_quit(struct usbhs_priv *priv); 84 void usbhs_fifo_clear_dcp(struct usbhs_pipe *pipe); 85 86 /* 87 * packet info 88 */ 89 extern const struct usbhs_pkt_handle usbhs_fifo_pio_push_handler; 90 extern const struct usbhs_pkt_handle usbhs_fifo_pio_pop_handler; 91 extern const struct usbhs_pkt_handle usbhs_ctrl_stage_end_handler; 92 93 extern const struct usbhs_pkt_handle usbhs_fifo_dma_push_handler; 94 extern const struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler; 95 96 extern const struct usbhs_pkt_handle usbhs_dcp_status_stage_in_handler; 97 extern const struct usbhs_pkt_handle usbhs_dcp_status_stage_out_handler; 98 99 extern const struct usbhs_pkt_handle usbhs_dcp_data_stage_in_handler; 100 extern const struct usbhs_pkt_handle usbhs_dcp_data_stage_out_handler; 101 102 void usbhs_pkt_init(struct usbhs_pkt *pkt); 103 void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt, 104 void (*done)(struct usbhs_priv *priv, 105 struct usbhs_pkt *pkt), 106 void *buf, int len, int zero, int sequence); 107 struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt); 108 void usbhs_pkt_start(struct usbhs_pipe *pipe); 109 110 #endif /* RENESAS_USB_FIFO_H */ 111