Loading...
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
24struct isp1760_device;
25struct isp1760_udc;
26
27enum 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
34struct 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 */
65struct 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
93int isp1760_udc_register(struct isp1760_device *isp, int irq,
94 unsigned long irqflags);
95void isp1760_udc_unregister(struct isp1760_device *isp);
96#else
97static inline int isp1760_udc_register(struct isp1760_device *isp, int irq,
98 unsigned long irqflags)
99{
100 return 0;
101}
102
103static inline void isp1760_udc_unregister(struct isp1760_device *isp)
104{
105}
106#endif
107
108#endif
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