Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Apr 14-17, 2025
Register
Loading...
Note: File does not exist in v3.1.
  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