diff options
Diffstat (limited to 'drivers/usb/isp1760/isp1760-udc.h')
-rw-r--r-- | drivers/usb/isp1760/isp1760-udc.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/drivers/usb/isp1760/isp1760-udc.h b/drivers/usb/isp1760/isp1760-udc.h new file mode 100644 index 000000000000..26899ed81145 --- /dev/null +++ b/drivers/usb/isp1760/isp1760-udc.h | |||
@@ -0,0 +1,106 @@ | |||
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 | ||