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