1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | /* * 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 [31mCONFIG_USB_CHIPIDEA_UDC[0m int ci_hdrc_gadget_init(struct ci_hdrc *ci); void ci_hdrc_gadget_destroy(struct ci_hdrc *ci); #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) { } #endif #endif /* __DRIVERS_USB_CHIPIDEA_UDC_H */ |