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
104