linux/drivers/usb/chipidea/udc.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * udc.h - ChipIdea UDC structures
   4 *
   5 * Copyright (C) 2008 Chipidea - MIPS Technologies, Inc. All rights reserved.
   6 *
   7 * Author: David Lopo
   8 */
   9
  10#ifndef __DRIVERS_USB_CHIPIDEA_UDC_H
  11#define __DRIVERS_USB_CHIPIDEA_UDC_H
  12
  13#include <linux/list.h>
  14
  15#define CTRL_PAYLOAD_MAX   64
  16#define RX        0  /* similar to USB_DIR_OUT but can be used as an index */
  17#define TX        1  /* similar to USB_DIR_IN  but can be used as an index */
  18
  19/* DMA layout of transfer descriptors */
  20struct ci_hw_td {
  21        /* 0 */
  22        __le32 next;
  23#define TD_TERMINATE          BIT(0)
  24#define TD_ADDR_MASK          (0xFFFFFFEUL << 5)
  25        /* 1 */
  26        __le32 token;
  27#define TD_STATUS             (0x00FFUL <<  0)
  28#define TD_STATUS_TR_ERR      BIT(3)
  29#define TD_STATUS_DT_ERR      BIT(5)
  30#define TD_STATUS_HALTED      BIT(6)
  31#define TD_STATUS_ACTIVE      BIT(7)
  32#define TD_MULTO              (0x0003UL << 10)
  33#define TD_IOC                BIT(15)
  34#define TD_TOTAL_BYTES        (0x7FFFUL << 16)
  35        /* 2 */
  36        __le32 page[5];
  37#define TD_CURR_OFFSET        (0x0FFFUL <<  0)
  38#define TD_FRAME_NUM          (0x07FFUL <<  0)
  39#define TD_RESERVED_MASK      (0x0FFFUL <<  0)
  40} __attribute__ ((packed, aligned(4)));
  41
  42/* DMA layout of queue heads */
  43struct ci_hw_qh {
  44        /* 0 */
  45        __le32 cap;
  46#define QH_IOS                BIT(15)
  47#define QH_MAX_PKT            (0x07FFUL << 16)
  48#define QH_ZLT                BIT(29)
  49#define QH_MULT               (0x0003UL << 30)
  50#define QH_ISO_MULT(x)          ((x >> 11) & 0x03)
  51        /* 1 */
  52        __le32 curr;
  53        /* 2 - 8 */
  54        struct ci_hw_td         td;
  55        /* 9 */
  56        __le32 RESERVED;
  57        struct usb_ctrlrequest   setup;
  58} __attribute__ ((packed, aligned(4)));
  59
  60struct td_node {
  61        struct list_head        td;
  62        dma_addr_t              dma;
  63        struct ci_hw_td         *ptr;
  64        int                     td_remaining_size;
  65};
  66
  67/**
  68 * struct ci_hw_req - usb request representation
  69 * @req: request structure for gadget drivers
  70 * @queue: link to QH list
  71 * @tds: link to TD list
  72 */
  73struct ci_hw_req {
  74        struct usb_request      req;
  75        struct list_head        queue;
  76        struct list_head        tds;
  77};
  78
  79#ifdef CONFIG_USB_CHIPIDEA_UDC
  80
  81int ci_hdrc_gadget_init(struct ci_hdrc *ci);
  82void ci_hdrc_gadget_destroy(struct ci_hdrc *ci);
  83
  84#else
  85
  86static inline int ci_hdrc_gadget_init(struct ci_hdrc *ci)
  87{
  88        return -ENXIO;
  89}
  90
  91static inline void ci_hdrc_gadget_destroy(struct ci_hdrc *ci)
  92{
  93
  94}
  95
  96#endif
  97
  98#endif /* __DRIVERS_USB_CHIPIDEA_UDC_H */
  99