1 // SPDX-License-Identifier: GPL-1.0+
5 * Copyright (C) 2011 Renesas Solutions Corp.
6 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
8 #ifndef RENESAS_USB_FIFO_H
9 #define RENESAS_USB_FIFO_H
11 #include <linux/interrupt.h>
12 #include <linux/sh_dma.h>
13 #include <linux/workqueue.h>
20 u32 sel
; /* xFIFOSEL */
21 u32 ctr
; /* xFIFOCTR */
23 struct usbhs_pipe
*pipe
;
25 struct dma_chan
*tx_chan
;
26 struct dma_chan
*rx_chan
;
28 struct sh_dmae_slave tx_slave
;
29 struct sh_dmae_slave rx_slave
;
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
];
37 #define usbhsf_get_dnfifo(p, n) (&((p)->fifo_info.dfifo[n]))
38 #define usbhs_for_each_dfifo(priv, dfifo, i) \
40 ((i) < USBHS_MAX_NUM_DFIFO) && \
41 ((dfifo) = usbhsf_get_dnfifo(priv, (i))); \
44 struct usbhs_pkt_handle
;
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
;
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
);
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
);
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
;
84 extern const struct usbhs_pkt_handle usbhs_fifo_dma_push_handler
;
85 extern const struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler
;
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
;
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
;
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
);
101 #endif /* RENESAS_USB_FIFO_H */