1 /* 2 * Renesas USB driver 3 * 4 * Copyright (C) 2011 Renesas Solutions Corp. 5 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License 13 * along with this program; if not, write to the Free Software 14 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 15 * 16 */ 17 #ifndef RENESAS_USB_PIPE_H 18 #define RENESAS_USB_PIPE_H 19 20 #include "./common.h" 21 22 /* 23 * struct 24 */ 25 struct usbhs_pipe { 26 u32 pipe_type; /* USB_ENDPOINT_XFER_xxx */ 27 28 struct usbhs_priv *priv; 29 30 u32 flags; 31 #define USBHS_PIPE_FLAGS_IS_USED (1 << 0) 32 #define USBHS_PIPE_FLAGS_IS_DIR_IN (1 << 1) 33 34 void *mod_private; 35 }; 36 37 struct usbhs_pipe_info { 38 struct usbhs_pipe *pipe; 39 int size; /* array size of "pipe" */ 40 int bufnmb_last; /* FIXME : driver needs good allocator */ 41 }; 42 43 /* 44 * pipe list 45 */ 46 #define __usbhs_for_each_pipe(start, pos, info, i) \ 47 for (i = start, pos = (info)->pipe; \ 48 i < (info)->size; \ 49 i++, pos = (info)->pipe + i) 50 51 #define usbhs_for_each_pipe(pos, priv, i) \ 52 __usbhs_for_each_pipe(1, pos, &((priv)->pipe_info), i) 53 54 #define usbhs_for_each_pipe_with_dcp(pos, priv, i) \ 55 __usbhs_for_each_pipe(0, pos, &((priv)->pipe_info), i) 56 57 /* 58 * pipe module probe / remove 59 */ 60 int usbhs_pipe_probe(struct usbhs_priv *priv); 61 void usbhs_pipe_remove(struct usbhs_priv *priv); 62 63 /* 64 * cfifo 65 */ 66 int usbhs_fifo_write(struct usbhs_pipe *pipe, u8 *buf, int len); 67 int usbhs_fifo_read(struct usbhs_pipe *pipe, u8 *buf, int len); 68 int usbhs_fifo_prepare_write(struct usbhs_pipe *pipe); 69 int usbhs_fifo_prepare_read(struct usbhs_pipe *pipe); 70 71 void usbhs_fifo_enable(struct usbhs_pipe *pipe); 72 void usbhs_fifo_disable(struct usbhs_pipe *pipe); 73 void usbhs_fifo_stall(struct usbhs_pipe *pipe); 74 75 void usbhs_fifo_send_terminator(struct usbhs_pipe *pipe); 76 77 78 /* 79 * usb request 80 */ 81 void usbhs_usbreq_get_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req); 82 void usbhs_usbreq_set_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req); 83 84 /* 85 * pipe control 86 */ 87 struct usbhs_pipe 88 *usbhs_pipe_malloc(struct usbhs_priv *priv, 89 const struct usb_endpoint_descriptor *desc); 90 91 int usbhs_pipe_is_dir_in(struct usbhs_pipe *pipe); 92 void usbhs_pipe_init(struct usbhs_priv *priv); 93 int usbhs_pipe_get_maxpacket(struct usbhs_pipe *pipe); 94 void usbhs_pipe_clear_sequence(struct usbhs_pipe *pipe); 95 96 #define usbhs_pipe_number(p) (int)((p) - (p)->priv->pipe_info.pipe) 97 98 /* 99 * dcp control 100 */ 101 struct usbhs_pipe *usbhs_dcp_malloc(struct usbhs_priv *priv); 102 void usbhs_dcp_control_transfer_done(struct usbhs_pipe *pipe); 103 104 #endif /* RENESAS_USB_PIPE_H */ 105