fifo.h (2903B)
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 17struct 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 33struct 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 44struct usbhs_pkt_handle; 45struct 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 const struct dmaengine_result *dma_result; 54 void *buf; 55 int length; 56 int trans; 57 int actual; 58 int zero; 59 int sequence; 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); 75void usbhs_fifo_clear_dcp(struct usbhs_pipe *pipe); 76 77/* 78 * packet info 79 */ 80extern const struct usbhs_pkt_handle usbhs_fifo_pio_push_handler; 81extern const struct usbhs_pkt_handle usbhs_fifo_pio_pop_handler; 82extern const struct usbhs_pkt_handle usbhs_ctrl_stage_end_handler; 83 84extern const struct usbhs_pkt_handle usbhs_fifo_dma_push_handler; 85extern const struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler; 86 87extern const struct usbhs_pkt_handle usbhs_dcp_status_stage_in_handler; 88extern const struct usbhs_pkt_handle usbhs_dcp_status_stage_out_handler; 89 90extern const struct usbhs_pkt_handle usbhs_dcp_data_stage_in_handler; 91extern const struct usbhs_pkt_handle usbhs_dcp_data_stage_out_handler; 92 93void usbhs_pkt_init(struct usbhs_pkt *pkt); 94void 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); 98struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt); 99void usbhs_pkt_start(struct usbhs_pipe *pipe); 100struct usbhs_pkt *__usbhsf_pkt_get(struct usbhs_pipe *pipe); 101 102#endif /* RENESAS_USB_FIFO_H */