1d28e6171SNishad Kamdar /* SPDX-License-Identifier: GPL-1.0+ */ 2e8d548d5SKuninori Morimoto /* 3e8d548d5SKuninori Morimoto * Renesas USB driver 4e8d548d5SKuninori Morimoto * 5e8d548d5SKuninori Morimoto * Copyright (C) 2011 Renesas Solutions Corp. 6e8d548d5SKuninori Morimoto * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 7e8d548d5SKuninori Morimoto */ 8e8d548d5SKuninori Morimoto #ifndef RENESAS_USB_FIFO_H 9e8d548d5SKuninori Morimoto #define RENESAS_USB_FIFO_H 10e8d548d5SKuninori Morimoto 11e73a9891SKuninori Morimoto #include <linux/interrupt.h> 12e73a9891SKuninori Morimoto #include <linux/sh_dma.h> 136e4b74e4SGuennadi Liakhovetski #include <linux/workqueue.h> 14e73a9891SKuninori Morimoto #include <asm/dma.h> 154bd04811SKuninori Morimoto #include "pipe.h" 164bd04811SKuninori Morimoto 17d3af90a5SKuninori Morimoto struct usbhs_fifo { 18e73a9891SKuninori Morimoto char *name; 19d3af90a5SKuninori Morimoto u32 port; /* xFIFO */ 20d3af90a5SKuninori Morimoto u32 sel; /* xFIFOSEL */ 21d3af90a5SKuninori Morimoto u32 ctr; /* xFIFOCTR */ 22d77e3f4eSKuninori Morimoto 23d77e3f4eSKuninori Morimoto struct usbhs_pipe *pipe; 24e73a9891SKuninori Morimoto 25e73a9891SKuninori Morimoto struct dma_chan *tx_chan; 26e73a9891SKuninori Morimoto struct dma_chan *rx_chan; 27e73a9891SKuninori Morimoto 28e73a9891SKuninori Morimoto struct sh_dmae_slave tx_slave; 29e73a9891SKuninori Morimoto struct sh_dmae_slave rx_slave; 30d3af90a5SKuninori Morimoto }; 31d3af90a5SKuninori Morimoto 32d3cf6a4bSYoshihiro Shimoda #define USBHS_MAX_NUM_DFIFO 4 33d3af90a5SKuninori Morimoto struct usbhs_fifo_info { 34d3af90a5SKuninori Morimoto struct usbhs_fifo cfifo; 35c907e423SYoshihiro Shimoda struct usbhs_fifo dfifo[USBHS_MAX_NUM_DFIFO]; 36d3af90a5SKuninori Morimoto }; 373a2634a5SYoshihiro Shimoda #define usbhsf_get_dnfifo(p, n) (&((p)->fifo_info.dfifo[n])) 383a2634a5SYoshihiro Shimoda #define usbhs_for_each_dfifo(priv, dfifo, i) \ 392d9c7f3cSKuninori Morimoto for ((i) = 0; \ 402d9c7f3cSKuninori Morimoto ((i) < USBHS_MAX_NUM_DFIFO) && \ 412d9c7f3cSKuninori Morimoto ((dfifo) = usbhsf_get_dnfifo(priv, (i))); \ 422d9c7f3cSKuninori Morimoto (i)++) 43d3af90a5SKuninori Morimoto 44dad67397SKuninori Morimoto struct usbhs_pkt_handle; 454bd04811SKuninori Morimoto struct usbhs_pkt { 466acb95d4SKuninori Morimoto struct list_head node; 474bd04811SKuninori Morimoto struct usbhs_pipe *pipe; 48fcb42e23SJulia Lawall const struct usbhs_pkt_handle *handler; 49b331872bSKuninori Morimoto void (*done)(struct usbhs_priv *priv, 50b331872bSKuninori Morimoto struct usbhs_pkt *pkt); 516e4b74e4SGuennadi Liakhovetski struct work_struct work; 52e73a9891SKuninori Morimoto dma_addr_t dma; 53*ea0efd68SYoshihiro Shimoda const struct dmaengine_result *dma_result; 544bd04811SKuninori Morimoto void *buf; 554bd04811SKuninori Morimoto int length; 56e73a9891SKuninori Morimoto int trans; 574bd04811SKuninori Morimoto int actual; 58659d4954SKuninori Morimoto int zero; 593edeee38SKuninori Morimoto int sequence; 604bd04811SKuninori Morimoto }; 61e8d548d5SKuninori Morimoto 62dad67397SKuninori Morimoto struct usbhs_pkt_handle { 6397664a20SKuninori Morimoto int (*prepare)(struct usbhs_pkt *pkt, int *is_done); 6497664a20SKuninori Morimoto int (*try_run)(struct usbhs_pkt *pkt, int *is_done); 65e73a9891SKuninori Morimoto int (*dma_done)(struct usbhs_pkt *pkt, int *is_done); 66dad67397SKuninori Morimoto }; 67dad67397SKuninori Morimoto 68e8d548d5SKuninori Morimoto /* 69e8d548d5SKuninori Morimoto * fifo 70e8d548d5SKuninori Morimoto */ 71d3af90a5SKuninori Morimoto int usbhs_fifo_probe(struct usbhs_priv *priv); 72d3af90a5SKuninori Morimoto void usbhs_fifo_remove(struct usbhs_priv *priv); 73dad67397SKuninori Morimoto void usbhs_fifo_init(struct usbhs_priv *priv); 74dad67397SKuninori Morimoto void usbhs_fifo_quit(struct usbhs_priv *priv); 75cdeb7943SYoshihiro Shimoda void usbhs_fifo_clear_dcp(struct usbhs_pipe *pipe); 76e8d548d5SKuninori Morimoto 774bd04811SKuninori Morimoto /* 784bd04811SKuninori Morimoto * packet info 794bd04811SKuninori Morimoto */ 80fcb42e23SJulia Lawall extern const struct usbhs_pkt_handle usbhs_fifo_pio_push_handler; 81fcb42e23SJulia Lawall extern const struct usbhs_pkt_handle usbhs_fifo_pio_pop_handler; 82fcb42e23SJulia Lawall extern const struct usbhs_pkt_handle usbhs_ctrl_stage_end_handler; 83dad67397SKuninori Morimoto 84fcb42e23SJulia Lawall extern const struct usbhs_pkt_handle usbhs_fifo_dma_push_handler; 85fcb42e23SJulia Lawall extern const struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler; 86e73a9891SKuninori Morimoto 87fcb42e23SJulia Lawall extern const struct usbhs_pkt_handle usbhs_dcp_status_stage_in_handler; 88fcb42e23SJulia Lawall extern const struct usbhs_pkt_handle usbhs_dcp_status_stage_out_handler; 899e74d601SKuninori Morimoto 90fcb42e23SJulia Lawall extern const struct usbhs_pkt_handle usbhs_dcp_data_stage_in_handler; 91fcb42e23SJulia Lawall extern const struct usbhs_pkt_handle usbhs_dcp_data_stage_out_handler; 92e73a9891SKuninori Morimoto 936acb95d4SKuninori Morimoto void usbhs_pkt_init(struct usbhs_pkt *pkt); 94659d4954SKuninori Morimoto void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt, 95b331872bSKuninori Morimoto void (*done)(struct usbhs_priv *priv, 96b331872bSKuninori Morimoto struct usbhs_pkt *pkt), 973edeee38SKuninori Morimoto void *buf, int len, int zero, int sequence); 9897664a20SKuninori Morimoto struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt); 9951b8a021SKuninori Morimoto void usbhs_pkt_start(struct usbhs_pipe *pipe); 1004d599cd3SYoshihiro Shimoda struct usbhs_pkt *__usbhsf_pkt_get(struct usbhs_pipe *pipe); 101dad67397SKuninori Morimoto 102e8d548d5SKuninori Morimoto #endif /* RENESAS_USB_FIFO_H */ 103