| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * udc.h - ChipIdea UDC structures |
| * |
| * Copyright (C) 2008 Chipidea - MIPS Technologies, Inc. All rights reserved. |
| * |
| * Author: David Lopo |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| */ |
| |
| #ifndef __DRIVERS_USB_CHIPIDEA_UDC_H |
| #define __DRIVERS_USB_CHIPIDEA_UDC_H |
| |
| #include <linux/list.h> |
| |
| #define CTRL_PAYLOAD_MAX 64 |
| #define RX 0 /* similar to USB_DIR_OUT but can be used as an index */ |
| #define TX 1 /* similar to USB_DIR_IN but can be used as an index */ |
| |
| /* DMA layout of transfer descriptors */ |
| struct ci_hw_td { |
| /* 0 */ |
| __le32 next; |
| #define TD_TERMINATE BIT(0) |
| #define TD_ADDR_MASK (0xFFFFFFEUL << 5) |
| /* 1 */ |
| __le32 token; |
| #define TD_STATUS (0x00FFUL << 0) |
| #define TD_STATUS_TR_ERR BIT(3) |
| #define TD_STATUS_DT_ERR BIT(5) |
| #define TD_STATUS_HALTED BIT(6) |
| #define TD_STATUS_ACTIVE BIT(7) |
| #define TD_MULTO (0x0003UL << 10) |
| #define TD_IOC BIT(15) |
| #define TD_TOTAL_BYTES (0x7FFFUL << 16) |
| /* 2 */ |
| __le32 page[5]; |
| #define TD_CURR_OFFSET (0x0FFFUL << 0) |
| #define TD_FRAME_NUM (0x07FFUL << 0) |
| #define TD_RESERVED_MASK (0x0FFFUL << 0) |
| } __attribute__ ((packed, aligned(4))); |
| |
| /* DMA layout of queue heads */ |
| struct ci_hw_qh { |
| /* 0 */ |
| __le32 cap; |
| #define QH_IOS BIT(15) |
| #define QH_MAX_PKT (0x07FFUL << 16) |
| #define QH_ZLT BIT(29) |
| #define QH_MULT (0x0003UL << 30) |
| #define QH_ISO_MULT(x) ((x >> 11) & 0x03) |
| /* 1 */ |
| __le32 curr; |
| /* 2 - 8 */ |
| struct ci_hw_td td; |
| /* 9 */ |
| __le32 RESERVED; |
| struct usb_ctrlrequest setup; |
| } __attribute__ ((packed, aligned(4))); |
| |
| struct td_node { |
| struct list_head td; |
| dma_addr_t dma; |
| struct ci_hw_td *ptr; |
| }; |
| |
| /** |
| * struct ci_hw_req - usb request representation |
| * @req: request structure for gadget drivers |
| * @queue: link to QH list |
| * @ptr: transfer descriptor for this request |
| * @dma: dma address for the transfer descriptor |
| * @zptr: transfer descriptor for the zero packet |
| * @zdma: dma address of the zero packet's transfer descriptor |
| */ |
| struct ci_hw_req { |
| struct usb_request req; |
| struct list_head queue; |
| struct list_head tds; |
| }; |
| |
| #ifdef CONFIG_USB_CHIPIDEA_UDC |
| |
| int ci_hdrc_gadget_init(struct ci_hdrc *ci); |
| void ci_hdrc_gadget_destroy(struct ci_hdrc *ci); |
| int ci_usb_charger_connect(struct ci_hdrc *ci, int is_active); |
| void ci_hdrc_gadget_connect(struct usb_gadget *gadget, int is_active); |
| |
| #else |
| |
| static inline int ci_hdrc_gadget_init(struct ci_hdrc *ci) |
| { |
| return -ENXIO; |
| } |
| |
| static inline void ci_hdrc_gadget_destroy(struct ci_hdrc *ci) |
| { |
| |
| } |
| |
| static inline int ci_usb_charger_connect(struct ci_hdrc *ci, int is_active) |
| { |
| return 0; |
| } |
| |
| static inline void ci_hdrc_gadget_connect(struct usb_gadget *gadget, |
| int is_active) |
| { |
| |
| } |
| |
| #endif |
| |
| #endif /* __DRIVERS_USB_CHIPIDEA_UDC_H */ |