root/drivers/usb/renesas_usbhs/fifo.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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 struct usbhs_pkt *__usbhsf_pkt_get(struct usbhs_pipe *pipe);
 101 
 102 #endif /* RENESAS_USB_FIFO_H */

/* [<][>][^][v][top][bottom][index][help] */