1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Driver for the NXP ISP1761 device controller
5 * Copyright 2021 Linaro, Rui Miguel Silva
6 * Copyright 2014 Ideas on Board Oy
9 * Laurent Pinchart <laurent.pinchart@ideasonboard.com>
10 * Rui Miguel Silva <rui.silva@linaro.org>
13 #ifndef _ISP1760_UDC_H_
14 #define _ISP1760_UDC_H_
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>
22 #include "isp1760-regs.h"
24 struct isp1760_device
;
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 */
35 struct isp1760_udc
*udc
;
38 struct list_head queue
;
41 unsigned int maxpacket
;
44 const struct usb_endpoint_descriptor
*desc
;
52 * struct isp1760_udc - UDC state information
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
66 struct isp1760_device
*isp
;
72 struct regmap_field
*fields
[DC_FIELD_MAX
];
74 struct usb_gadget_driver
*driver
;
75 struct usb_gadget gadget
;
78 struct timer_list vbus_timer
;
80 struct isp1760_ep ep
[15];
82 enum isp1760_ctrl_state ep0_state
;
89 unsigned int devstatus
;
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
);
97 static inline int isp1760_udc_register(struct isp1760_device
*isp
, int irq
,
98 unsigned long irqflags
)
103 static inline void isp1760_udc_unregister(struct isp1760_device
*isp
)