linux/drivers/usb/isp1760/isp1760-udc.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Driver for the NXP ISP1761 device controller
   4 *
   5 * Copyright 2021 Linaro, Rui Miguel Silva
   6 * Copyright 2014 Ideas on Board Oy
   7 *
   8 * Contacts:
   9 *      Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  10 *      Rui Miguel Silva <rui.silva@linaro.org>
  11 */
  12
  13#ifndef _ISP1760_UDC_H_
  14#define _ISP1760_UDC_H_
  15
  16#include <linux/ioport.h>
  17#include <linux/list.h>
  18#include <linux/spinlock.h>
  19#include <linux/timer.h>
  20#include <linux/usb/gadget.h>
  21
  22#include "isp1760-regs.h"
  23
  24struct isp1760_device;
  25struct isp1760_udc;
  26
  27enum isp1760_ctrl_state {
  28        ISP1760_CTRL_SETUP,             /* Waiting for a SETUP transaction */
  29        ISP1760_CTRL_DATA_IN,           /* Setup received, data IN stage */
  30        ISP1760_CTRL_DATA_OUT,          /* Setup received, data OUT stage */
  31        ISP1760_CTRL_STATUS,            /* 0-length request in status stage */
  32};
  33
  34struct isp1760_ep {
  35        struct isp1760_udc *udc;
  36        struct usb_ep ep;
  37
  38        struct list_head queue;
  39
  40        unsigned int addr;
  41        unsigned int maxpacket;
  42        char name[7];
  43
  44        const struct usb_endpoint_descriptor *desc;
  45
  46        bool rx_pending;
  47        bool halted;
  48        bool wedged;
  49};
  50
  51/**
  52 * struct isp1760_udc - UDC state information
  53 * irq: IRQ number
  54 * irqname: IRQ name (as passed to request_irq)
  55 * regs: regmap for UDC registers
  56 * driver: Gadget driver
  57 * gadget: Gadget device
  58 * lock: Protects driver, vbus_timer, ep, ep0_*, DC_EPINDEX register
  59 * ep: Array of endpoints
  60 * ep0_state: Control request state for endpoint 0
  61 * ep0_dir: Direction of the current control request
  62 * ep0_length: Length of the current control request
  63 * connected: Tracks gadget driver bus connection state
  64 */
  65struct isp1760_udc {
  66        struct isp1760_device *isp;
  67
  68        int irq;
  69        char *irqname;
  70
  71        struct regmap *regs;
  72        struct regmap_field *fields[DC_FIELD_MAX];
  73
  74        struct usb_gadget_driver *driver;
  75        struct usb_gadget gadget;
  76
  77        spinlock_t lock;
  78        struct timer_list vbus_timer;
  79
  80        struct isp1760_ep ep[15];
  81
  82        enum isp1760_ctrl_state ep0_state;
  83        u8 ep0_dir;
  84        u16 ep0_length;
  85
  86        bool connected;
  87        bool is_isp1763;
  88
  89        unsigned int devstatus;
  90};
  91
  92#ifdef CONFIG_USB_ISP1761_UDC
  93int isp1760_udc_register(struct isp1760_device *isp, int irq,
  94                         unsigned long irqflags);
  95void isp1760_udc_unregister(struct isp1760_device *isp);
  96#else
  97static inline int isp1760_udc_register(struct isp1760_device *isp, int irq,
  98                                       unsigned long irqflags)
  99{
 100        return 0;
 101}
 102
 103static inline void isp1760_udc_unregister(struct isp1760_device *isp)
 104{
 105}
 106#endif
 107
 108#endif
 109