| /* SPDX-License-Identifier: GPL-2.0 */ | 
 | /* | 
 |  * Driver for the NXP ISP1761 device controller | 
 |  * | 
 |  * Copyright 2021 Linaro, Rui Miguel Silva | 
 |  * Copyright 2014 Ideas on Board Oy | 
 |  * | 
 |  * Contacts: | 
 |  *	Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 
 |  *	Rui Miguel Silva <rui.silva@linaro.org> | 
 |  */ | 
 |  | 
 | #ifndef _ISP1760_UDC_H_ | 
 | #define _ISP1760_UDC_H_ | 
 |  | 
 | #include <linux/ioport.h> | 
 | #include <linux/list.h> | 
 | #include <linux/spinlock.h> | 
 | #include <linux/timer.h> | 
 | #include <linux/usb/gadget.h> | 
 |  | 
 | #include "isp1760-regs.h" | 
 |  | 
 | struct isp1760_device; | 
 | struct isp1760_udc; | 
 |  | 
 | enum isp1760_ctrl_state { | 
 | 	ISP1760_CTRL_SETUP,		/* Waiting for a SETUP transaction */ | 
 | 	ISP1760_CTRL_DATA_IN,		/* Setup received, data IN stage */ | 
 | 	ISP1760_CTRL_DATA_OUT,		/* Setup received, data OUT stage */ | 
 | 	ISP1760_CTRL_STATUS,		/* 0-length request in status stage */ | 
 | }; | 
 |  | 
 | struct isp1760_ep { | 
 | 	struct isp1760_udc *udc; | 
 | 	struct usb_ep ep; | 
 |  | 
 | 	struct list_head queue; | 
 |  | 
 | 	unsigned int addr; | 
 | 	unsigned int maxpacket; | 
 | 	char name[7]; | 
 |  | 
 | 	const struct usb_endpoint_descriptor *desc; | 
 |  | 
 | 	bool rx_pending; | 
 | 	bool halted; | 
 | 	bool wedged; | 
 | }; | 
 |  | 
 | /** | 
 |  * struct isp1760_udc - UDC state information | 
 |  * irq: IRQ number | 
 |  * irqname: IRQ name (as passed to request_irq) | 
 |  * regs: regmap for UDC registers | 
 |  * driver: Gadget driver | 
 |  * gadget: Gadget device | 
 |  * lock: Protects driver, vbus_timer, ep, ep0_*, DC_EPINDEX register | 
 |  * ep: Array of endpoints | 
 |  * ep0_state: Control request state for endpoint 0 | 
 |  * ep0_dir: Direction of the current control request | 
 |  * ep0_length: Length of the current control request | 
 |  * connected: Tracks gadget driver bus connection state | 
 |  */ | 
 | struct isp1760_udc { | 
 | 	struct isp1760_device *isp; | 
 |  | 
 | 	int irq; | 
 | 	char *irqname; | 
 |  | 
 | 	struct regmap *regs; | 
 | 	struct regmap_field *fields[DC_FIELD_MAX]; | 
 |  | 
 | 	struct usb_gadget_driver *driver; | 
 | 	struct usb_gadget gadget; | 
 |  | 
 | 	spinlock_t lock; | 
 | 	struct timer_list vbus_timer; | 
 |  | 
 | 	struct isp1760_ep ep[15]; | 
 |  | 
 | 	enum isp1760_ctrl_state ep0_state; | 
 | 	u8 ep0_dir; | 
 | 	u16 ep0_length; | 
 |  | 
 | 	bool connected; | 
 | 	bool is_isp1763; | 
 |  | 
 | 	unsigned int devstatus; | 
 | }; | 
 |  | 
 | #ifdef CONFIG_USB_ISP1761_UDC | 
 | int isp1760_udc_register(struct isp1760_device *isp, int irq, | 
 | 			 unsigned long irqflags); | 
 | void isp1760_udc_unregister(struct isp1760_device *isp); | 
 | #else | 
 | static inline int isp1760_udc_register(struct isp1760_device *isp, int irq, | 
 | 				       unsigned long irqflags) | 
 | { | 
 | 	return 0; | 
 | } | 
 |  | 
 | static inline void isp1760_udc_unregister(struct isp1760_device *isp) | 
 | { | 
 | } | 
 | #endif | 
 |  | 
 | #endif |