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
107