GNU Linux-libre 4.19.286-gnu1
[releases.git] / drivers / usb / isp1760 / isp1760-udc.h
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
20 struct isp1760_device;
21 struct isp1760_udc;
22
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 */
28 };
29
30 struct 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  */
61 struct 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
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)
94 {
95         return 0;
96 }
97
98 static inline void isp1760_udc_unregister(struct isp1760_device *isp)
99 {
100 }
101 #endif
102
103 #endif