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