Linux 4.16.11
[linux/fpc-iii.git] / drivers / usb / isp1760 / isp1760-udc.h
blob2d0b88747701f19ef79eb5d58e5b08cd533432a0
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Driver for the NXP ISP1761 device controller
5 * Copyright 2014 Ideas on Board Oy
7 * Contacts:
8 * Laurent Pinchart <laurent.pinchart@ideasonboard.com>
9 */
11 #ifndef _ISP1760_UDC_H_
12 #define _ISP1760_UDC_H_
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>
20 struct isp1760_device;
21 struct isp1760_udc;
23 enum 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 */
30 struct isp1760_ep {
31 struct isp1760_udc *udc;
32 struct usb_ep ep;
34 struct list_head queue;
36 unsigned int addr;
37 unsigned int maxpacket;
38 char name[7];
40 const struct usb_endpoint_descriptor *desc;
42 bool rx_pending;
43 bool halted;
44 bool wedged;
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
61 struct isp1760_udc {
62 #ifdef CONFIG_USB_ISP1761_UDC
63 struct isp1760_device *isp;
65 int irq;
66 char *irqname;
67 void __iomem *regs;
69 struct usb_gadget_driver *driver;
70 struct usb_gadget gadget;
72 spinlock_t lock;
73 struct timer_list vbus_timer;
75 struct isp1760_ep ep[15];
77 enum isp1760_ctrl_state ep0_state;
78 u8 ep0_dir;
79 u16 ep0_length;
81 bool connected;
83 unsigned int devstatus;
84 #endif
87 #ifdef CONFIG_USB_ISP1761_UDC
88 int isp1760_udc_register(struct isp1760_device *isp, int irq,
89 unsigned long irqflags);
90 void isp1760_udc_unregister(struct isp1760_device *isp);
91 #else
92 static inline int isp1760_udc_register(struct isp1760_device *isp, int irq,
93 unsigned long irqflags)
95 return 0;
98 static inline void isp1760_udc_unregister(struct isp1760_device *isp)
101 #endif
103 #endif