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