forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.2 KiB
103 lines
2.2 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
/* |
|
* Driver for the NXP ISP1761 device controller |
|
* |
|
* Copyright 2014 Ideas on Board Oy |
|
* |
|
* Contacts: |
|
* Laurent Pinchart <[email protected]> |
|
*/ |
|
|
|
#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> |
|
|
|
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: Base address of the 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 { |
|
#ifdef CONFIG_USB_ISP1761_UDC |
|
struct isp1760_device *isp; |
|
|
|
int irq; |
|
char *irqname; |
|
void __iomem *regs; |
|
|
|
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; |
|
|
|
unsigned int devstatus; |
|
#endif |
|
}; |
|
|
|
#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
|
|
|