/drivers/usb/renesas_usbhs/fifo.h
C Header | 104 lines | 65 code | 17 blank | 22 comment | 0 complexity | 76d1deadd4921e22ed0ecf0d9bb56265 MD5 | raw file
Possible License(s): LGPL-2.0, AGPL-1.0, GPL-2.0
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 <asm/dma.h> 23#include "pipe.h" 24 25#define DMA_ADDR_INVALID (~(dma_addr_t)0) 26 27struct usbhs_fifo { 28 char *name; 29 u32 port; /* xFIFO */ 30 u32 sel; /* xFIFOSEL */ 31 u32 ctr; /* xFIFOCTR */ 32 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; 41}; 42 43struct usbhs_fifo_info { 44 struct usbhs_fifo cfifo; 45 struct usbhs_fifo d0fifo; 46 struct usbhs_fifo d1fifo; 47}; 48 49struct usbhs_pkt_handle; 50struct usbhs_pkt { 51 struct list_head node; 52 struct usbhs_pipe *pipe; 53 struct usbhs_pkt_handle *handler; 54 dma_addr_t dma; 55 void *buf; 56 int length; 57 int trans; 58 int actual; 59 int zero; 60}; 61 62struct usbhs_pkt_handle { 63 int (*prepare)(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); 66}; 67 68/* 69 * fifo 70 */ 71int usbhs_fifo_probe(struct usbhs_priv *priv); 72void usbhs_fifo_remove(struct usbhs_priv *priv); 73void usbhs_fifo_init(struct usbhs_priv *priv); 74void usbhs_fifo_quit(struct usbhs_priv *priv); 75 76/* 77 * packet info 78 */ 79enum { 80 USBHSF_PKT_PREPARE, 81 USBHSF_PKT_TRY_RUN, 82 USBHSF_PKT_DMA_DONE, 83}; 84 85extern struct usbhs_pkt_handle usbhs_fifo_pio_push_handler; 86extern struct usbhs_pkt_handle usbhs_fifo_pio_pop_handler; 87extern struct usbhs_pkt_handle usbhs_ctrl_stage_end_handler; 88 89extern struct usbhs_pkt_handle usbhs_fifo_dma_push_handler; 90extern struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler; 91 92 93void usbhs_pkt_init(struct usbhs_pkt *pkt); 94void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt, 95 struct usbhs_pkt_handle *handler, 96 void *buf, int len, int zero); 97struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt); 98int __usbhs_pkt_handler(struct usbhs_pipe *pipe, int type); 99 100#define usbhs_pkt_start(p) __usbhs_pkt_handler(p, USBHSF_PKT_PREPARE) 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) 103 104#endif /* RENESAS_USB_FIFO_H */