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