linux/drivers/usb/renesas_usbhs/fifo.h
<<
>>
Prefs
   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        dma_cookie_t cookie;
  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);
 100
 101#endif /* RENESAS_USB_FIFO_H */
 102