diff options
Diffstat (limited to 'drivers/media/usb/au0828/au0828.h')
-rw-r--r-- | drivers/media/usb/au0828/au0828.h | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/drivers/media/usb/au0828/au0828.h b/drivers/media/usb/au0828/au0828.h new file mode 100644 index 000000000000..66a56ef7bbe4 --- /dev/null +++ b/drivers/media/usb/au0828/au0828.h | |||
@@ -0,0 +1,304 @@ | |||
1 | /* | ||
2 | * Driver for the Auvitek AU0828 USB bridge | ||
3 | * | ||
4 | * Copyright (c) 2008 Steven Toth <stoth@linuxtv.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | ||
21 | |||
22 | #include <linux/usb.h> | ||
23 | #include <linux/i2c.h> | ||
24 | #include <linux/i2c-algo-bit.h> | ||
25 | #include <media/tveeprom.h> | ||
26 | |||
27 | /* Analog */ | ||
28 | #include <linux/videodev2.h> | ||
29 | #include <media/videobuf-vmalloc.h> | ||
30 | #include <media/v4l2-device.h> | ||
31 | |||
32 | /* DVB */ | ||
33 | #include "demux.h" | ||
34 | #include "dmxdev.h" | ||
35 | #include "dvb_demux.h" | ||
36 | #include "dvb_frontend.h" | ||
37 | #include "dvb_net.h" | ||
38 | #include "dvbdev.h" | ||
39 | |||
40 | #include "au0828-reg.h" | ||
41 | #include "au0828-cards.h" | ||
42 | |||
43 | #define DRIVER_NAME "au0828" | ||
44 | #define URB_COUNT 16 | ||
45 | #define URB_BUFSIZE (0xe522) | ||
46 | |||
47 | /* Analog constants */ | ||
48 | #define NTSC_STD_W 720 | ||
49 | #define NTSC_STD_H 480 | ||
50 | |||
51 | #define AU0828_INTERLACED_DEFAULT 1 | ||
52 | #define V4L2_CID_PRIVATE_SHARPNESS (V4L2_CID_PRIVATE_BASE + 0) | ||
53 | |||
54 | /* Defination for AU0828 USB transfer */ | ||
55 | #define AU0828_MAX_ISO_BUFS 12 /* maybe resize this value in the future */ | ||
56 | #define AU0828_ISO_PACKETS_PER_URB 128 | ||
57 | |||
58 | #define AU0828_MIN_BUF 4 | ||
59 | #define AU0828_DEF_BUF 8 | ||
60 | |||
61 | #define AU0828_MAX_INPUT 4 | ||
62 | |||
63 | /* au0828 resource types (used for res_get/res_lock etc */ | ||
64 | #define AU0828_RESOURCE_VIDEO 0x01 | ||
65 | #define AU0828_RESOURCE_VBI 0x02 | ||
66 | |||
67 | enum au0828_itype { | ||
68 | AU0828_VMUX_UNDEFINED = 0, | ||
69 | AU0828_VMUX_COMPOSITE, | ||
70 | AU0828_VMUX_SVIDEO, | ||
71 | AU0828_VMUX_CABLE, | ||
72 | AU0828_VMUX_TELEVISION, | ||
73 | AU0828_VMUX_DVB, | ||
74 | AU0828_VMUX_DEBUG | ||
75 | }; | ||
76 | |||
77 | struct au0828_input { | ||
78 | enum au0828_itype type; | ||
79 | unsigned int vmux; | ||
80 | unsigned int amux; | ||
81 | void (*audio_setup) (void *priv, int enable); | ||
82 | }; | ||
83 | |||
84 | struct au0828_board { | ||
85 | char *name; | ||
86 | unsigned int tuner_type; | ||
87 | unsigned char tuner_addr; | ||
88 | unsigned char i2c_clk_divider; | ||
89 | struct au0828_input input[AU0828_MAX_INPUT]; | ||
90 | |||
91 | }; | ||
92 | |||
93 | struct au0828_dvb { | ||
94 | struct mutex lock; | ||
95 | struct dvb_adapter adapter; | ||
96 | struct dvb_frontend *frontend; | ||
97 | struct dvb_demux demux; | ||
98 | struct dmxdev dmxdev; | ||
99 | struct dmx_frontend fe_hw; | ||
100 | struct dmx_frontend fe_mem; | ||
101 | struct dvb_net net; | ||
102 | int feeding; | ||
103 | }; | ||
104 | |||
105 | enum au0828_stream_state { | ||
106 | STREAM_OFF, | ||
107 | STREAM_INTERRUPT, | ||
108 | STREAM_ON | ||
109 | }; | ||
110 | |||
111 | #define AUVI_INPUT(nr) (dev->board.input[nr]) | ||
112 | |||
113 | /* device state */ | ||
114 | enum au0828_dev_state { | ||
115 | DEV_INITIALIZED = 0x01, | ||
116 | DEV_DISCONNECTED = 0x02, | ||
117 | DEV_MISCONFIGURED = 0x04 | ||
118 | }; | ||
119 | |||
120 | struct au0828_fh { | ||
121 | struct au0828_dev *dev; | ||
122 | unsigned int resources; | ||
123 | |||
124 | struct videobuf_queue vb_vidq; | ||
125 | struct videobuf_queue vb_vbiq; | ||
126 | enum v4l2_buf_type type; | ||
127 | }; | ||
128 | |||
129 | struct au0828_usb_isoc_ctl { | ||
130 | /* max packet size of isoc transaction */ | ||
131 | int max_pkt_size; | ||
132 | |||
133 | /* number of allocated urbs */ | ||
134 | int num_bufs; | ||
135 | |||
136 | /* urb for isoc transfers */ | ||
137 | struct urb **urb; | ||
138 | |||
139 | /* transfer buffers for isoc transfer */ | ||
140 | char **transfer_buffer; | ||
141 | |||
142 | /* Last buffer command and region */ | ||
143 | u8 cmd; | ||
144 | int pos, size, pktsize; | ||
145 | |||
146 | /* Last field: ODD or EVEN? */ | ||
147 | int field; | ||
148 | |||
149 | /* Stores incomplete commands */ | ||
150 | u32 tmp_buf; | ||
151 | int tmp_buf_len; | ||
152 | |||
153 | /* Stores already requested buffers */ | ||
154 | struct au0828_buffer *buf; | ||
155 | struct au0828_buffer *vbi_buf; | ||
156 | |||
157 | /* Stores the number of received fields */ | ||
158 | int nfields; | ||
159 | |||
160 | /* isoc urb callback */ | ||
161 | int (*isoc_copy) (struct au0828_dev *dev, struct urb *urb); | ||
162 | |||
163 | }; | ||
164 | |||
165 | /* buffer for one video frame */ | ||
166 | struct au0828_buffer { | ||
167 | /* common v4l buffer stuff -- must be first */ | ||
168 | struct videobuf_buffer vb; | ||
169 | |||
170 | struct list_head frame; | ||
171 | int top_field; | ||
172 | int receiving; | ||
173 | }; | ||
174 | |||
175 | struct au0828_dmaqueue { | ||
176 | struct list_head active; | ||
177 | struct list_head queued; | ||
178 | |||
179 | wait_queue_head_t wq; | ||
180 | |||
181 | /* Counters to control buffer fill */ | ||
182 | int pos; | ||
183 | }; | ||
184 | |||
185 | struct au0828_dev { | ||
186 | struct mutex mutex; | ||
187 | struct usb_device *usbdev; | ||
188 | int boardnr; | ||
189 | struct au0828_board board; | ||
190 | u8 ctrlmsg[64]; | ||
191 | |||
192 | /* I2C */ | ||
193 | struct i2c_adapter i2c_adap; | ||
194 | struct i2c_algorithm i2c_algo; | ||
195 | struct i2c_client i2c_client; | ||
196 | u32 i2c_rc; | ||
197 | |||
198 | /* Digital */ | ||
199 | struct au0828_dvb dvb; | ||
200 | struct work_struct restart_streaming; | ||
201 | |||
202 | /* Analog */ | ||
203 | struct v4l2_device v4l2_dev; | ||
204 | int users; | ||
205 | unsigned int resources; /* resources in use */ | ||
206 | struct video_device *vdev; | ||
207 | struct video_device *vbi_dev; | ||
208 | struct timer_list vid_timeout; | ||
209 | int vid_timeout_running; | ||
210 | struct timer_list vbi_timeout; | ||
211 | int vbi_timeout_running; | ||
212 | int width; | ||
213 | int height; | ||
214 | int vbi_width; | ||
215 | int vbi_height; | ||
216 | u32 vbi_read; | ||
217 | u32 field_size; | ||
218 | u32 frame_size; | ||
219 | u32 bytesperline; | ||
220 | int type; | ||
221 | u8 ctrl_ainput; | ||
222 | __u8 isoc_in_endpointaddr; | ||
223 | u8 isoc_init_ok; | ||
224 | int greenscreen_detected; | ||
225 | unsigned int frame_count; | ||
226 | int ctrl_freq; | ||
227 | int input_type; | ||
228 | int std_set_in_tuner_core; | ||
229 | unsigned int ctrl_input; | ||
230 | enum au0828_dev_state dev_state; | ||
231 | enum au0828_stream_state stream_state; | ||
232 | wait_queue_head_t open; | ||
233 | |||
234 | struct mutex lock; | ||
235 | |||
236 | /* Isoc control struct */ | ||
237 | struct au0828_dmaqueue vidq; | ||
238 | struct au0828_dmaqueue vbiq; | ||
239 | struct au0828_usb_isoc_ctl isoc_ctl; | ||
240 | spinlock_t slock; | ||
241 | |||
242 | /* usb transfer */ | ||
243 | int alt; /* alternate */ | ||
244 | int max_pkt_size; /* max packet size of isoc transaction */ | ||
245 | int num_alt; /* Number of alternative settings */ | ||
246 | unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ | ||
247 | struct urb *urb[AU0828_MAX_ISO_BUFS]; /* urb for isoc transfers */ | ||
248 | char *transfer_buffer[AU0828_MAX_ISO_BUFS];/* transfer buffers for isoc | ||
249 | transfer */ | ||
250 | |||
251 | /* USB / URB Related */ | ||
252 | int urb_streaming; | ||
253 | struct urb *urbs[URB_COUNT]; | ||
254 | }; | ||
255 | |||
256 | /* ----------------------------------------------------------- */ | ||
257 | #define au0828_read(dev, reg) au0828_readreg(dev, reg) | ||
258 | #define au0828_write(dev, reg, value) au0828_writereg(dev, reg, value) | ||
259 | #define au0828_andor(dev, reg, mask, value) \ | ||
260 | au0828_writereg(dev, reg, \ | ||
261 | (au0828_readreg(dev, reg) & ~(mask)) | ((value) & (mask))) | ||
262 | |||
263 | #define au0828_set(dev, reg, bit) au0828_andor(dev, (reg), (bit), (bit)) | ||
264 | #define au0828_clear(dev, reg, bit) au0828_andor(dev, (reg), (bit), 0) | ||
265 | |||
266 | /* ----------------------------------------------------------- */ | ||
267 | /* au0828-core.c */ | ||
268 | extern u32 au0828_read(struct au0828_dev *dev, u16 reg); | ||
269 | extern u32 au0828_write(struct au0828_dev *dev, u16 reg, u32 val); | ||
270 | extern int au0828_debug; | ||
271 | |||
272 | /* ----------------------------------------------------------- */ | ||
273 | /* au0828-cards.c */ | ||
274 | extern struct au0828_board au0828_boards[]; | ||
275 | extern struct usb_device_id au0828_usb_id_table[]; | ||
276 | extern void au0828_gpio_setup(struct au0828_dev *dev); | ||
277 | extern int au0828_tuner_callback(void *priv, int component, | ||
278 | int command, int arg); | ||
279 | extern void au0828_card_setup(struct au0828_dev *dev); | ||
280 | |||
281 | /* ----------------------------------------------------------- */ | ||
282 | /* au0828-i2c.c */ | ||
283 | extern int au0828_i2c_register(struct au0828_dev *dev); | ||
284 | extern int au0828_i2c_unregister(struct au0828_dev *dev); | ||
285 | |||
286 | /* ----------------------------------------------------------- */ | ||
287 | /* au0828-video.c */ | ||
288 | int au0828_analog_register(struct au0828_dev *dev, | ||
289 | struct usb_interface *interface); | ||
290 | int au0828_analog_stream_disable(struct au0828_dev *d); | ||
291 | void au0828_analog_unregister(struct au0828_dev *dev); | ||
292 | |||
293 | /* ----------------------------------------------------------- */ | ||
294 | /* au0828-dvb.c */ | ||
295 | extern int au0828_dvb_register(struct au0828_dev *dev); | ||
296 | extern void au0828_dvb_unregister(struct au0828_dev *dev); | ||
297 | |||
298 | /* au0828-vbi.c */ | ||
299 | extern struct videobuf_queue_ops au0828_vbi_qops; | ||
300 | |||
301 | #define dprintk(level, fmt, arg...)\ | ||
302 | do { if (au0828_debug & level)\ | ||
303 | printk(KERN_DEBUG DRIVER_NAME "/0: " fmt, ## arg);\ | ||
304 | } while (0) | ||