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