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