Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / usb / isp1760 / isp1760-udc.h
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
23 struct isp1760_device;
24 struct isp1760_udc;
25
26 enum 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
33 struct 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  */
64 struct 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
91 int isp1760_udc_register(struct isp1760_device *isp, int irq,
92                          unsigned long irqflags);
93 void isp1760_udc_unregister(struct isp1760_device *isp);
94 #else
95 static inline int isp1760_udc_register(struct isp1760_device *isp, int irq,
96                                        unsigned long irqflags)
97 {
98         return 0;
99 }
100
101 static inline void isp1760_udc_unregister(struct isp1760_device *isp)
102 {
103 }
104 #endif
105
106 #endif