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