1 // SPDX-License-Identifier: GPL-1.0+ 2 /* 3 * Renesas USB driver 4 * 5 * Copyright (C) 2011 Renesas Solutions Corp. 6 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 7 */ 8 #ifndef RENESAS_USB_FIFO_H 9 #define RENESAS_USB_FIFO_H 10 11 #include <linux/interrupt.h> 12 #include <linux/sh_dma.h> 13 #include <linux/workqueue.h> 14 #include <asm/dma.h> 15 #include "pipe.h" 16 17 struct usbhs_fifo { 18 char *name; 19 u32 port; /* xFIFO */ 20 u32 sel; /* xFIFOSEL */ 21 u32 ctr; /* xFIFOCTR */ 22 23 struct usbhs_pipe *pipe; 24 25 struct dma_chan *tx_chan; 26 struct dma_chan *rx_chan; 27 28 struct sh_dmae_slave tx_slave; 29 struct sh_dmae_slave rx_slave; 30 }; 31 32 #define USBHS_MAX_NUM_DFIFO 4 33 struct usbhs_fifo_info { 34 struct usbhs_fifo cfifo; 35 struct usbhs_fifo dfifo[USBHS_MAX_NUM_DFIFO]; 36 }; 37 #define usbhsf_get_dnfifo(p, n) (&((p)->fifo_info.dfifo[n])) 38 #define usbhs_for_each_dfifo(priv, dfifo, i) \ 39 for ((i) = 0; \ 40 ((i) < USBHS_MAX_NUM_DFIFO) && \ 41 ((dfifo) = usbhsf_get_dnfifo(priv, (i))); \ 42 (i)++) 43 44 struct usbhs_pkt_handle; 45 struct usbhs_pkt { 46 struct list_head node; 47 struct usbhs_pipe *pipe; 48 const struct usbhs_pkt_handle *handler; 49 void (*done)(struct usbhs_priv *priv, 50 struct usbhs_pkt *pkt); 51 struct work_struct work; 52 dma_addr_t dma; 53 dma_cookie_t cookie; 54 void *buf; 55 int length; 56 int trans; 57 int actual; 58 int zero; 59 int sequence; 60 }; 61 62 struct 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 */ 71 int usbhs_fifo_probe(struct usbhs_priv *priv); 72 void usbhs_fifo_remove(struct usbhs_priv *priv); 73 void usbhs_fifo_init(struct usbhs_priv *priv); 74 void usbhs_fifo_quit(struct usbhs_priv *priv); 75 void usbhs_fifo_clear_dcp(struct usbhs_pipe *pipe); 76 77 /* 78 * packet info 79 */ 80 extern const struct usbhs_pkt_handle usbhs_fifo_pio_push_handler; 81 extern const struct usbhs_pkt_handle usbhs_fifo_pio_pop_handler; 82 extern const struct usbhs_pkt_handle usbhs_ctrl_stage_end_handler; 83 84 extern const struct usbhs_pkt_handle usbhs_fifo_dma_push_handler; 85 extern const struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler; 86 87 extern const struct usbhs_pkt_handle usbhs_dcp_status_stage_in_handler; 88 extern const struct usbhs_pkt_handle usbhs_dcp_status_stage_out_handler; 89 90 extern const struct usbhs_pkt_handle usbhs_dcp_data_stage_in_handler; 91 extern const struct usbhs_pkt_handle usbhs_dcp_data_stage_out_handler; 92 93 void usbhs_pkt_init(struct usbhs_pkt *pkt); 94 void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt, 95 void (*done)(struct usbhs_priv *priv, 96 struct usbhs_pkt *pkt), 97 void *buf, int len, int zero, int sequence); 98 struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt); 99 void usbhs_pkt_start(struct usbhs_pipe *pipe); 100 101 #endif /* RENESAS_USB_FIFO_H */ 102