1d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/*
2d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
3d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
4d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  Copyright (C) 2005 Mike Isely <isely@pobox.com>
5d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
6d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  This program is free software; you can redistribute it and/or modify
7d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  it under the terms of the GNU General Public License as published by
8d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  the Free Software Foundation; either version 2 of the License
9d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
10d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  This program is distributed in the hope that it will be useful,
11d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  GNU General Public License for more details.
14d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
15d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  You should have received a copy of the GNU General Public License
16d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  along with this program; if not, write to the Free Software
17d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
19d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely */
20d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#ifndef __PVRUSB2_IO_H
21d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#define __PVRUSB2_IO_H
22d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
23d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include <linux/usb.h>
24d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include <linux/list.h>
25d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
26d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselytypedef void (*pvr2_stream_callback)(void *);
27d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
28d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyenum pvr2_buffer_state {
29d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	pvr2_buffer_state_none = 0,   // Not on any list
30d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	pvr2_buffer_state_idle = 1,   // Buffer is ready to be used again
31d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	pvr2_buffer_state_queued = 2, // Buffer has been queued for filling
32d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	pvr2_buffer_state_ready = 3,  // Buffer has data available
33d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely};
34d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
35d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystruct pvr2_stream;
36d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystruct pvr2_buffer;
37d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
38ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Iselystruct pvr2_stream_stats {
39ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely	unsigned int buffers_in_queue;
40ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely	unsigned int buffers_in_idle;
41ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely	unsigned int buffers_in_ready;
42ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely	unsigned int buffers_processed;
43ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely	unsigned int buffers_failed;
44ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely	unsigned int bytes_processed;
45ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely};
46ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely
47d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* Initialize / tear down stream structure */
48d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystruct pvr2_stream *pvr2_stream_create(void);
49d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyvoid pvr2_stream_destroy(struct pvr2_stream *);
50d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyvoid pvr2_stream_setup(struct pvr2_stream *,
51d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		       struct usb_device *dev,int endpoint,
52d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		       unsigned int tolerance);
53d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyvoid pvr2_stream_set_callback(struct pvr2_stream *,
54d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			      pvr2_stream_callback func,
55d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			      void *data);
56ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Iselyvoid pvr2_stream_get_stats(struct pvr2_stream *,
57ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			   struct pvr2_stream_stats *,
58ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			   int zero_counts);
59d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
60d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* Query / set the nominal buffer count */
61e61b6fc58b4a0b07f1ccfc67bf2b84a2848fcb2cMike Iselyint pvr2_stream_get_buffer_count(struct pvr2_stream *);
62d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyint pvr2_stream_set_buffer_count(struct pvr2_stream *,unsigned int);
63d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
64d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* Get a pointer to a buffer that is either idle, ready, or is specified
65d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely   named. */
66d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystruct pvr2_buffer *pvr2_stream_get_idle_buffer(struct pvr2_stream *);
67d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystruct pvr2_buffer *pvr2_stream_get_ready_buffer(struct pvr2_stream *);
68d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystruct pvr2_buffer *pvr2_stream_get_buffer(struct pvr2_stream *sp,int id);
69d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
70d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* Find out how many buffers are idle or ready */
71d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyint pvr2_stream_get_ready_count(struct pvr2_stream *);
72d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
73e61b6fc58b4a0b07f1ccfc67bf2b84a2848fcb2cMike Isely
74d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* Kill all pending buffers and throw away any ready buffers as well */
75d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyvoid pvr2_stream_kill(struct pvr2_stream *);
76d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
77d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* Set up the actual storage for a buffer */
78d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyint pvr2_buffer_set_buffer(struct pvr2_buffer *,void *ptr,unsigned int cnt);
79d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
80d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* Find out size of data in the given ready buffer */
81d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyunsigned int pvr2_buffer_get_count(struct pvr2_buffer *);
82d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
83d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* Retrieve completion code for given ready buffer */
84d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyint pvr2_buffer_get_status(struct pvr2_buffer *);
85d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
86d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* Retrieve ID of given buffer */
87d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyint pvr2_buffer_get_id(struct pvr2_buffer *);
88d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
89d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* Start reading into given buffer (kill it if needed) */
90d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyint pvr2_buffer_queue(struct pvr2_buffer *);
91d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
92d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#endif /* __PVRUSB2_IO_H */
93d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
94d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/*
95d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  Stuff for Emacs to see, in order to encourage consistent editing style:
96d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** Local Variables: ***
97d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** mode: c ***
98d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** fill-column: 75 ***
99d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** tab-width: 8 ***
100d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** c-basic-offset: 8 ***
101d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** End: ***
102d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  */
103