Linux Audio

Check our new training course

Loading...
v6.2
  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
v6.8
  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