[media] cx231xx: Fix identation
[deliverable/linux.git] / drivers / media / usb / cx231xx / cx231xx-cards.c
CommitLineData
e0d3bafd 1/*
b9255176
SD
2 cx231xx-cards.c - driver for Conexant Cx23100/101/102
3 USB video capture devices
e0d3bafd
SD
4
5 Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
b9255176 6 Based on em28xx driver
e0d3bafd
SD
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
589dadf2 23#include "cx231xx.h"
e0d3bafd
SD
24#include <linux/init.h>
25#include <linux/module.h>
5a0e3ad6 26#include <linux/slab.h>
e0d3bafd
SD
27#include <linux/delay.h>
28#include <linux/i2c.h>
29#include <linux/usb.h>
30#include <media/tuner.h>
31#include <media/tveeprom.h>
32#include <media/v4l2-common.h>
e0d3bafd
SD
33
34#include <media/cx25840.h>
3bfb317f 35#include "dvb-usb-ids.h"
e0d3bafd 36#include "xc5000.h"
55fa288d 37#include "tda18271.h"
e0d3bafd 38
e0d3bafd
SD
39
40static int tuner = -1;
41module_param(tuner, int, 0444);
42MODULE_PARM_DESC(tuner, "tuner type");
43
64fbf444
PB
44static int transfer_mode = 1;
45module_param(transfer_mode, int, 0444);
46MODULE_PARM_DESC(transfer_mode, "transfer mode (1-ISO or 0-BULK)");
47
e0d3bafd
SD
48static unsigned int disable_ir;
49module_param(disable_ir, int, 0444);
50MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
51
52/* Bitmask marking allocated devices from 0 to CX231XX_MAXBOARDS */
53static unsigned long cx231xx_devused;
54
55/*
56 * Reset sequences for analog/digital modes
57 */
58
59static struct cx231xx_reg_seq RDE250_XCV_TUNER[] = {
84b5dbf3
MCC
60 {0x03, 0x01, 10},
61 {0x03, 0x00, 30},
62 {0x03, 0x01, 10},
63 {-1, -1, -1},
e0d3bafd
SD
64};
65
e0d3bafd
SD
66/*
67 * Board definitions
68 */
69struct cx231xx_board cx231xx_boards[] = {
e0d3bafd 70 [CX231XX_BOARD_UNKNOWN] = {
6e4f574b
SD
71 .name = "Unknown CX231xx video grabber",
72 .tuner_type = TUNER_ABSENT,
73 .input = {{
74 .type = CX231XX_VMUX_TELEVISION,
75 .vmux = CX231XX_VIN_3_1,
76 .amux = CX231XX_AMUX_VIDEO,
7ee0a288 77 .gpio = NULL,
6e4f574b
SD
78 }, {
79 .type = CX231XX_VMUX_COMPOSITE1,
80 .vmux = CX231XX_VIN_2_1,
81 .amux = CX231XX_AMUX_LINE_IN,
7ee0a288 82 .gpio = NULL,
6e4f574b
SD
83 }, {
84 .type = CX231XX_VMUX_SVIDEO,
85 .vmux = CX231XX_VIN_1_1 |
86 (CX231XX_VIN_1_2 << 8) |
87 CX25840_SVIDEO_ON,
88 .amux = CX231XX_AMUX_LINE_IN,
7ee0a288 89 .gpio = NULL,
6e4f574b
SD
90 }
91 },
92 },
64fbf444
PB
93 [CX231XX_BOARD_CNXT_CARRAERA] = {
94 .name = "Conexant Hybrid TV - CARRAERA",
6e4f574b
SD
95 .tuner_type = TUNER_XC5000,
96 .tuner_addr = 0x61,
97 .tuner_gpio = RDE250_XCV_TUNER,
98 .tuner_sif_gpio = 0x05,
99 .tuner_scl_gpio = 0x1a,
100 .tuner_sda_gpio = 0x1b,
101 .decoder = CX231XX_AVDECODER,
88806218 102 .output_mode = OUT_MODE_VIP11,
6e4f574b
SD
103 .demod_xfer_mode = 0,
104 .ctl_pin_status_mask = 0xFFFFFFC4,
105 .agc_analog_digital_select_gpio = 0x0c,
106 .gpio_pin_status_mask = 0x4001000,
b9ce9dfd 107 .tuner_i2c_master = I2C_1_MUX_3,
d032ca12 108 .demod_i2c_master = I2C_2,
6e4f574b
SD
109 .has_dvb = 1,
110 .demod_addr = 0x02,
111 .norm = V4L2_STD_PAL,
112
113 .input = {{
114 .type = CX231XX_VMUX_TELEVISION,
115 .vmux = CX231XX_VIN_3_1,
116 .amux = CX231XX_AMUX_VIDEO,
7ee0a288 117 .gpio = NULL,
6e4f574b
SD
118 }, {
119 .type = CX231XX_VMUX_COMPOSITE1,
120 .vmux = CX231XX_VIN_2_1,
121 .amux = CX231XX_AMUX_LINE_IN,
7ee0a288 122 .gpio = NULL,
6e4f574b
SD
123 }, {
124 .type = CX231XX_VMUX_SVIDEO,
125 .vmux = CX231XX_VIN_1_1 |
126 (CX231XX_VIN_1_2 << 8) |
127 CX25840_SVIDEO_ON,
128 .amux = CX231XX_AMUX_LINE_IN,
7ee0a288 129 .gpio = NULL,
6e4f574b
SD
130 }
131 },
132 },
64fbf444
PB
133 [CX231XX_BOARD_CNXT_SHELBY] = {
134 .name = "Conexant Hybrid TV - SHELBY",
6e4f574b
SD
135 .tuner_type = TUNER_XC5000,
136 .tuner_addr = 0x61,
137 .tuner_gpio = RDE250_XCV_TUNER,
138 .tuner_sif_gpio = 0x05,
139 .tuner_scl_gpio = 0x1a,
140 .tuner_sda_gpio = 0x1b,
141 .decoder = CX231XX_AVDECODER,
88806218 142 .output_mode = OUT_MODE_VIP11,
6e4f574b
SD
143 .demod_xfer_mode = 0,
144 .ctl_pin_status_mask = 0xFFFFFFC4,
145 .agc_analog_digital_select_gpio = 0x0c,
146 .gpio_pin_status_mask = 0x4001000,
b9ce9dfd 147 .tuner_i2c_master = I2C_1_MUX_3,
d032ca12 148 .demod_i2c_master = I2C_2,
6e4f574b
SD
149 .has_dvb = 1,
150 .demod_addr = 0x32,
151 .norm = V4L2_STD_NTSC,
152
153 .input = {{
154 .type = CX231XX_VMUX_TELEVISION,
155 .vmux = CX231XX_VIN_3_1,
156 .amux = CX231XX_AMUX_VIDEO,
7ee0a288 157 .gpio = NULL,
6e4f574b
SD
158 }, {
159 .type = CX231XX_VMUX_COMPOSITE1,
160 .vmux = CX231XX_VIN_2_1,
161 .amux = CX231XX_AMUX_LINE_IN,
7ee0a288 162 .gpio = NULL,
6e4f574b
SD
163 }, {
164 .type = CX231XX_VMUX_SVIDEO,
165 .vmux = CX231XX_VIN_1_1 |
166 (CX231XX_VIN_1_2 << 8) |
167 CX25840_SVIDEO_ON,
168 .amux = CX231XX_AMUX_LINE_IN,
7ee0a288 169 .gpio = NULL,
6e4f574b
SD
170 }
171 },
172 },
64fbf444
PB
173 [CX231XX_BOARD_CNXT_RDE_253S] = {
174 .name = "Conexant Hybrid TV - RDE253S",
175 .tuner_type = TUNER_NXP_TDA18271,
176 .tuner_addr = 0x60,
177 .tuner_gpio = RDE250_XCV_TUNER,
178 .tuner_sif_gpio = 0x05,
179 .tuner_scl_gpio = 0x1a,
180 .tuner_sda_gpio = 0x1b,
181 .decoder = CX231XX_AVDECODER,
88806218 182 .output_mode = OUT_MODE_VIP11,
64fbf444
PB
183 .demod_xfer_mode = 0,
184 .ctl_pin_status_mask = 0xFFFFFFC4,
185 .agc_analog_digital_select_gpio = 0x1c,
186 .gpio_pin_status_mask = 0x4001000,
b9ce9dfd 187 .tuner_i2c_master = I2C_1_MUX_3,
d032ca12 188 .demod_i2c_master = I2C_2,
64fbf444
PB
189 .has_dvb = 1,
190 .demod_addr = 0x02,
191 .norm = V4L2_STD_PAL,
192
193 .input = {{
194 .type = CX231XX_VMUX_TELEVISION,
195 .vmux = CX231XX_VIN_3_1,
196 .amux = CX231XX_AMUX_VIDEO,
197 .gpio = NULL,
198 }, {
199 .type = CX231XX_VMUX_COMPOSITE1,
200 .vmux = CX231XX_VIN_2_1,
201 .amux = CX231XX_AMUX_LINE_IN,
202 .gpio = NULL,
203 }, {
204 .type = CX231XX_VMUX_SVIDEO,
205 .vmux = CX231XX_VIN_1_1 |
206 (CX231XX_VIN_1_2 << 8) |
207 CX25840_SVIDEO_ON,
208 .amux = CX231XX_AMUX_LINE_IN,
209 .gpio = NULL,
210 }
211 },
212 },
213
214 [CX231XX_BOARD_CNXT_RDU_253S] = {
215 .name = "Conexant Hybrid TV - RDU253S",
216 .tuner_type = TUNER_NXP_TDA18271,
217 .tuner_addr = 0x60,
218 .tuner_gpio = RDE250_XCV_TUNER,
219 .tuner_sif_gpio = 0x05,
220 .tuner_scl_gpio = 0x1a,
221 .tuner_sda_gpio = 0x1b,
222 .decoder = CX231XX_AVDECODER,
88806218 223 .output_mode = OUT_MODE_VIP11,
64fbf444
PB
224 .demod_xfer_mode = 0,
225 .ctl_pin_status_mask = 0xFFFFFFC4,
226 .agc_analog_digital_select_gpio = 0x1c,
227 .gpio_pin_status_mask = 0x4001000,
b9ce9dfd 228 .tuner_i2c_master = I2C_1_MUX_3,
d032ca12 229 .demod_i2c_master = I2C_2,
64fbf444
PB
230 .has_dvb = 1,
231 .demod_addr = 0x02,
232 .norm = V4L2_STD_PAL,
233
234 .input = {{
235 .type = CX231XX_VMUX_TELEVISION,
236 .vmux = CX231XX_VIN_3_1,
237 .amux = CX231XX_AMUX_VIDEO,
238 .gpio = NULL,
239 }, {
240 .type = CX231XX_VMUX_COMPOSITE1,
241 .vmux = CX231XX_VIN_2_1,
242 .amux = CX231XX_AMUX_LINE_IN,
243 .gpio = NULL,
244 }, {
245 .type = CX231XX_VMUX_SVIDEO,
246 .vmux = CX231XX_VIN_1_1 |
247 (CX231XX_VIN_1_2 << 8) |
248 CX25840_SVIDEO_ON,
249 .amux = CX231XX_AMUX_LINE_IN,
250 .gpio = NULL,
251 }
252 },
253 },
254 [CX231XX_BOARD_CNXT_VIDEO_GRABBER] = {
255 .name = "Conexant VIDEO GRABBER",
9f51259f 256 .tuner_type = TUNER_ABSENT,
64fbf444 257 .decoder = CX231XX_AVDECODER,
88806218 258 .output_mode = OUT_MODE_VIP11,
64fbf444
PB
259 .ctl_pin_status_mask = 0xFFFFFFC4,
260 .agc_analog_digital_select_gpio = 0x1c,
261 .gpio_pin_status_mask = 0x4001000,
64fbf444 262 .norm = V4L2_STD_PAL,
2f861387
MCC
263 .no_alt_vanc = 1,
264 .external_av = 1,
b31077a8
HV
265 /* Actually, it has a 417, but it isn't working correctly.
266 * So set to 0 for now until someone can manage to get this
267 * to work reliably. */
268 .has_417 = 0,
64fbf444
PB
269
270 .input = {{
271 .type = CX231XX_VMUX_COMPOSITE1,
272 .vmux = CX231XX_VIN_2_1,
273 .amux = CX231XX_AMUX_LINE_IN,
274 .gpio = NULL,
275 }, {
276 .type = CX231XX_VMUX_SVIDEO,
277 .vmux = CX231XX_VIN_1_1 |
278 (CX231XX_VIN_1_2 << 8) |
279 CX25840_SVIDEO_ON,
280 .amux = CX231XX_AMUX_LINE_IN,
281 .gpio = NULL,
64fbf444
PB
282 }
283 },
284 },
285 [CX231XX_BOARD_CNXT_RDE_250] = {
286 .name = "Conexant Hybrid TV - rde 250",
287 .tuner_type = TUNER_XC5000,
288 .tuner_addr = 0x61,
289 .tuner_gpio = RDE250_XCV_TUNER,
290 .tuner_sif_gpio = 0x05,
291 .tuner_scl_gpio = 0x1a,
292 .tuner_sda_gpio = 0x1b,
293 .decoder = CX231XX_AVDECODER,
88806218 294 .output_mode = OUT_MODE_VIP11,
64fbf444
PB
295 .demod_xfer_mode = 0,
296 .ctl_pin_status_mask = 0xFFFFFFC4,
297 .agc_analog_digital_select_gpio = 0x0c,
298 .gpio_pin_status_mask = 0x4001000,
b9ce9dfd 299 .tuner_i2c_master = I2C_1_MUX_3,
d032ca12 300 .demod_i2c_master = I2C_2,
64fbf444
PB
301 .has_dvb = 1,
302 .demod_addr = 0x02,
303 .norm = V4L2_STD_PAL,
304
305 .input = {{
306 .type = CX231XX_VMUX_TELEVISION,
307 .vmux = CX231XX_VIN_2_1,
308 .amux = CX231XX_AMUX_VIDEO,
309 .gpio = NULL,
310 }
311 },
312 },
313 [CX231XX_BOARD_CNXT_RDU_250] = {
314 .name = "Conexant Hybrid TV - RDU 250",
315 .tuner_type = TUNER_XC5000,
316 .tuner_addr = 0x61,
317 .tuner_gpio = RDE250_XCV_TUNER,
318 .tuner_sif_gpio = 0x05,
319 .tuner_scl_gpio = 0x1a,
320 .tuner_sda_gpio = 0x1b,
321 .decoder = CX231XX_AVDECODER,
88806218 322 .output_mode = OUT_MODE_VIP11,
64fbf444
PB
323 .demod_xfer_mode = 0,
324 .ctl_pin_status_mask = 0xFFFFFFC4,
325 .agc_analog_digital_select_gpio = 0x0c,
326 .gpio_pin_status_mask = 0x4001000,
b9ce9dfd 327 .tuner_i2c_master = I2C_1_MUX_3,
d032ca12 328 .demod_i2c_master = I2C_2,
64fbf444
PB
329 .has_dvb = 1,
330 .demod_addr = 0x32,
331 .norm = V4L2_STD_NTSC,
332
333 .input = {{
334 .type = CX231XX_VMUX_TELEVISION,
335 .vmux = CX231XX_VIN_2_1,
336 .amux = CX231XX_AMUX_VIDEO,
337 .gpio = NULL,
338 }
339 },
340 },
1a50fdde
MK
341 [CX231XX_BOARD_HAUPPAUGE_EXETER] = {
342 .name = "Hauppauge EXETER",
343 .tuner_type = TUNER_NXP_TDA18271,
344 .tuner_addr = 0x60,
345 .tuner_gpio = RDE250_XCV_TUNER,
346 .tuner_sif_gpio = 0x05,
347 .tuner_scl_gpio = 0x1a,
348 .tuner_sda_gpio = 0x1b,
349 .decoder = CX231XX_AVDECODER,
88806218 350 .output_mode = OUT_MODE_VIP11,
1a50fdde
MK
351 .demod_xfer_mode = 0,
352 .ctl_pin_status_mask = 0xFFFFFFC4,
353 .agc_analog_digital_select_gpio = 0x0c,
354 .gpio_pin_status_mask = 0x4001000,
b9ce9dfd 355 .tuner_i2c_master = I2C_1_MUX_1,
d032ca12 356 .demod_i2c_master = I2C_2,
1a50fdde
MK
357 .has_dvb = 1,
358 .demod_addr = 0x0e,
359 .norm = V4L2_STD_NTSC,
360
361 .input = {{
362 .type = CX231XX_VMUX_TELEVISION,
363 .vmux = CX231XX_VIN_3_1,
364 .amux = CX231XX_AMUX_VIDEO,
f72cfd85 365 .gpio = NULL,
1a50fdde
MK
366 }, {
367 .type = CX231XX_VMUX_COMPOSITE1,
368 .vmux = CX231XX_VIN_2_1,
369 .amux = CX231XX_AMUX_LINE_IN,
f72cfd85 370 .gpio = NULL,
1a50fdde
MK
371 }, {
372 .type = CX231XX_VMUX_SVIDEO,
373 .vmux = CX231XX_VIN_1_1 |
374 (CX231XX_VIN_1_2 << 8) |
375 CX25840_SVIDEO_ON,
376 .amux = CX231XX_AMUX_LINE_IN,
f72cfd85 377 .gpio = NULL,
1a50fdde
MK
378 } },
379 },
4270c3ca
DH
380 [CX231XX_BOARD_HAUPPAUGE_USBLIVE2] = {
381 .name = "Hauppauge USB Live 2",
382 .tuner_type = TUNER_ABSENT,
383 .decoder = CX231XX_AVDECODER,
88806218 384 .output_mode = OUT_MODE_VIP11,
4270c3ca
DH
385 .demod_xfer_mode = 0,
386 .ctl_pin_status_mask = 0xFFFFFFC4,
387 .agc_analog_digital_select_gpio = 0x0c,
388 .gpio_pin_status_mask = 0x4001000,
389 .norm = V4L2_STD_NTSC,
2f861387
MCC
390 .no_alt_vanc = 1,
391 .external_av = 1,
4270c3ca
DH
392 .input = {{
393 .type = CX231XX_VMUX_COMPOSITE1,
394 .vmux = CX231XX_VIN_2_1,
395 .amux = CX231XX_AMUX_LINE_IN,
f72cfd85 396 .gpio = NULL,
4270c3ca
DH
397 }, {
398 .type = CX231XX_VMUX_SVIDEO,
399 .vmux = CX231XX_VIN_1_1 |
400 (CX231XX_VIN_1_2 << 8) |
401 CX25840_SVIDEO_ON,
402 .amux = CX231XX_AMUX_LINE_IN,
f72cfd85 403 .gpio = NULL,
4270c3ca
DH
404 } },
405 },
eeaaf817
MA
406 [CX231XX_BOARD_KWORLD_UB430_USB_HYBRID] = {
407 .name = "Kworld UB430 USB Hybrid",
408 .tuner_type = TUNER_NXP_TDA18271,
409 .tuner_addr = 0x60,
410 .decoder = CX231XX_AVDECODER,
411 .output_mode = OUT_MODE_VIP11,
412 .demod_xfer_mode = 0,
413 .ctl_pin_status_mask = 0xFFFFFFC4,
414 .agc_analog_digital_select_gpio = 0x11, /* According with PV cxPolaris.inf file */
415 .tuner_sif_gpio = -1,
416 .tuner_scl_gpio = -1,
417 .tuner_sda_gpio = -1,
418 .gpio_pin_status_mask = 0x4001000,
d032ca12 419 .tuner_i2c_master = I2C_2,
b9ce9dfd 420 .demod_i2c_master = I2C_1_MUX_3,
d032ca12 421 .ir_i2c_master = I2C_2,
eeaaf817
MA
422 .has_dvb = 1,
423 .demod_addr = 0x10,
424 .norm = V4L2_STD_PAL_M,
425 .input = {{
426 .type = CX231XX_VMUX_TELEVISION,
427 .vmux = CX231XX_VIN_3_1,
428 .amux = CX231XX_AMUX_VIDEO,
429 .gpio = NULL,
430 }, {
431 .type = CX231XX_VMUX_COMPOSITE1,
432 .vmux = CX231XX_VIN_2_1,
433 .amux = CX231XX_AMUX_LINE_IN,
434 .gpio = NULL,
435 }, {
436 .type = CX231XX_VMUX_SVIDEO,
437 .vmux = CX231XX_VIN_1_1 |
438 (CX231XX_VIN_1_2 << 8) |
439 CX25840_SVIDEO_ON,
440 .amux = CX231XX_AMUX_LINE_IN,
441 .gpio = NULL,
442 } },
443 },
8b1255a2
JE
444 [CX231XX_BOARD_KWORLD_UB445_USB_HYBRID] = {
445 .name = "Kworld UB445 USB Hybrid",
446 .tuner_type = TUNER_NXP_TDA18271,
447 .tuner_addr = 0x60,
448 .decoder = CX231XX_AVDECODER,
449 .output_mode = OUT_MODE_VIP11,
450 .demod_xfer_mode = 0,
451 .ctl_pin_status_mask = 0xFFFFFFC4,
452 .agc_analog_digital_select_gpio = 0x11, /* According with PV cxPolaris.inf file */
453 .tuner_sif_gpio = -1,
454 .tuner_scl_gpio = -1,
455 .tuner_sda_gpio = -1,
456 .gpio_pin_status_mask = 0x4001000,
d032ca12 457 .tuner_i2c_master = I2C_2,
b9ce9dfd 458 .demod_i2c_master = I2C_1_MUX_3,
d032ca12 459 .ir_i2c_master = I2C_2,
8b1255a2
JE
460 .has_dvb = 1,
461 .demod_addr = 0x10,
462 .norm = V4L2_STD_NTSC_M,
463 .input = {{
464 .type = CX231XX_VMUX_TELEVISION,
465 .vmux = CX231XX_VIN_3_1,
466 .amux = CX231XX_AMUX_VIDEO,
467 .gpio = NULL,
468 }, {
469 .type = CX231XX_VMUX_COMPOSITE1,
470 .vmux = CX231XX_VIN_2_1,
471 .amux = CX231XX_AMUX_LINE_IN,
472 .gpio = NULL,
473 }, {
474 .type = CX231XX_VMUX_SVIDEO,
475 .vmux = CX231XX_VIN_1_1 |
476 (CX231XX_VIN_1_2 << 8) |
477 CX25840_SVIDEO_ON,
478 .amux = CX231XX_AMUX_LINE_IN,
479 .gpio = NULL,
480 } },
481 },
9417bc6d
MCC
482 [CX231XX_BOARD_PV_PLAYTV_USB_HYBRID] = {
483 .name = "Pixelview PlayTV USB Hybrid",
484 .tuner_type = TUNER_NXP_TDA18271,
485 .tuner_addr = 0x60,
486 .decoder = CX231XX_AVDECODER,
487 .output_mode = OUT_MODE_VIP11,
488 .demod_xfer_mode = 0,
489 .ctl_pin_status_mask = 0xFFFFFFC4,
490 .agc_analog_digital_select_gpio = 0x00, /* According with PV cxPolaris.inf file */
491 .tuner_sif_gpio = -1,
492 .tuner_scl_gpio = -1,
493 .tuner_sda_gpio = -1,
494 .gpio_pin_status_mask = 0x4001000,
d032ca12 495 .tuner_i2c_master = I2C_2,
b9ce9dfd 496 .demod_i2c_master = I2C_1_MUX_3,
d032ca12 497 .ir_i2c_master = I2C_2,
788e5d4d 498 .rc_map_name = RC_MAP_PIXELVIEW_002T,
ede676c7 499 .has_dvb = 1,
9417bc6d
MCC
500 .demod_addr = 0x10,
501 .norm = V4L2_STD_PAL_M,
502 .input = {{
503 .type = CX231XX_VMUX_TELEVISION,
504 .vmux = CX231XX_VIN_3_1,
505 .amux = CX231XX_AMUX_VIDEO,
f72cfd85 506 .gpio = NULL,
9417bc6d
MCC
507 }, {
508 .type = CX231XX_VMUX_COMPOSITE1,
509 .vmux = CX231XX_VIN_2_1,
510 .amux = CX231XX_AMUX_LINE_IN,
f72cfd85 511 .gpio = NULL,
9417bc6d
MCC
512 }, {
513 .type = CX231XX_VMUX_SVIDEO,
514 .vmux = CX231XX_VIN_1_1 |
515 (CX231XX_VIN_1_2 << 8) |
516 CX25840_SVIDEO_ON,
517 .amux = CX231XX_AMUX_LINE_IN,
f72cfd85 518 .gpio = NULL,
9417bc6d
MCC
519 } },
520 },
4e105039
MCC
521 [CX231XX_BOARD_PV_XCAPTURE_USB] = {
522 .name = "Pixelview Xcapture USB",
523 .tuner_type = TUNER_ABSENT,
524 .decoder = CX231XX_AVDECODER,
525 .output_mode = OUT_MODE_VIP11,
526 .demod_xfer_mode = 0,
527 .ctl_pin_status_mask = 0xFFFFFFC4,
528 .agc_analog_digital_select_gpio = 0x0c,
529 .gpio_pin_status_mask = 0x4001000,
530 .norm = V4L2_STD_NTSC,
531 .no_alt_vanc = 1,
532 .external_av = 1,
4e105039
MCC
533
534 .input = {{
535 .type = CX231XX_VMUX_COMPOSITE1,
536 .vmux = CX231XX_VIN_2_1,
537 .amux = CX231XX_AMUX_LINE_IN,
538 .gpio = NULL,
539 }, {
540 .type = CX231XX_VMUX_SVIDEO,
541 .vmux = CX231XX_VIN_1_1 |
542 (CX231XX_VIN_1_2 << 8) |
543 CX25840_SVIDEO_ON,
544 .amux = CX231XX_AMUX_LINE_IN,
545 .gpio = NULL,
546 }
547 },
548 },
2a7b6a40
IN
549
550 [CX231XX_BOARD_ICONBIT_U100] = {
551 .name = "Iconbit Analog Stick U100 FM",
552 .tuner_type = TUNER_ABSENT,
553 .decoder = CX231XX_AVDECODER,
554 .output_mode = OUT_MODE_VIP11,
555 .demod_xfer_mode = 0,
556 .ctl_pin_status_mask = 0xFFFFFFC4,
557 .agc_analog_digital_select_gpio = 0x1C,
558 .gpio_pin_status_mask = 0x4001000,
559
560 .input = {{
561 .type = CX231XX_VMUX_COMPOSITE1,
562 .vmux = CX231XX_VIN_2_1,
563 .amux = CX231XX_AMUX_LINE_IN,
564 .gpio = NULL,
565 }, {
566 .type = CX231XX_VMUX_SVIDEO,
567 .vmux = CX231XX_VIN_1_1 |
568 (CX231XX_VIN_1_2 << 8) |
569 CX25840_SVIDEO_ON,
570 .amux = CX231XX_AMUX_LINE_IN,
571 .gpio = NULL,
572 } },
573 },
de8ae0d5
PM
574 [CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL] = {
575 .name = "Hauppauge WinTV USB2 FM (PAL)",
576 .tuner_type = TUNER_NXP_TDA18271,
577 .tuner_addr = 0x60,
578 .tuner_gpio = RDE250_XCV_TUNER,
579 .tuner_sif_gpio = 0x05,
580 .tuner_scl_gpio = 0x1a,
581 .tuner_sda_gpio = 0x1b,
582 .decoder = CX231XX_AVDECODER,
583 .output_mode = OUT_MODE_VIP11,
584 .ctl_pin_status_mask = 0xFFFFFFC4,
585 .agc_analog_digital_select_gpio = 0x0c,
586 .gpio_pin_status_mask = 0x4001000,
b9ce9dfd 587 .tuner_i2c_master = I2C_1_MUX_3,
de8ae0d5
PM
588 .norm = V4L2_STD_PAL,
589
590 .input = {{
591 .type = CX231XX_VMUX_TELEVISION,
592 .vmux = CX231XX_VIN_3_1,
593 .amux = CX231XX_AMUX_VIDEO,
594 .gpio = NULL,
595 }, {
596 .type = CX231XX_VMUX_COMPOSITE1,
597 .vmux = CX231XX_VIN_2_1,
598 .amux = CX231XX_AMUX_LINE_IN,
599 .gpio = NULL,
600 }, {
601 .type = CX231XX_VMUX_SVIDEO,
602 .vmux = CX231XX_VIN_1_1 |
603 (CX231XX_VIN_1_2 << 8) |
604 CX25840_SVIDEO_ON,
605 .amux = CX231XX_AMUX_LINE_IN,
606 .gpio = NULL,
607 } },
608 },
609 [CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC] = {
610 .name = "Hauppauge WinTV USB2 FM (NTSC)",
611 .tuner_type = TUNER_NXP_TDA18271,
612 .tuner_addr = 0x60,
613 .tuner_gpio = RDE250_XCV_TUNER,
614 .tuner_sif_gpio = 0x05,
615 .tuner_scl_gpio = 0x1a,
616 .tuner_sda_gpio = 0x1b,
617 .decoder = CX231XX_AVDECODER,
618 .output_mode = OUT_MODE_VIP11,
619 .ctl_pin_status_mask = 0xFFFFFFC4,
620 .agc_analog_digital_select_gpio = 0x0c,
621 .gpio_pin_status_mask = 0x4001000,
b9ce9dfd 622 .tuner_i2c_master = I2C_1_MUX_3,
de8ae0d5
PM
623 .norm = V4L2_STD_NTSC,
624
625 .input = {{
626 .type = CX231XX_VMUX_TELEVISION,
627 .vmux = CX231XX_VIN_3_1,
628 .amux = CX231XX_AMUX_VIDEO,
629 .gpio = NULL,
630 }, {
631 .type = CX231XX_VMUX_COMPOSITE1,
632 .vmux = CX231XX_VIN_2_1,
633 .amux = CX231XX_AMUX_LINE_IN,
634 .gpio = NULL,
635 }, {
636 .type = CX231XX_VMUX_SVIDEO,
637 .vmux = CX231XX_VIN_1_1 |
638 (CX231XX_VIN_1_2 << 8) |
639 CX25840_SVIDEO_ON,
640 .amux = CX231XX_AMUX_LINE_IN,
641 .gpio = NULL,
642 } },
643 },
68c97bf3
AH
644 [CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2] = {
645 .name = "Elgato Video Capture V2",
646 .tuner_type = TUNER_ABSENT,
647 .decoder = CX231XX_AVDECODER,
648 .output_mode = OUT_MODE_VIP11,
649 .demod_xfer_mode = 0,
650 .ctl_pin_status_mask = 0xFFFFFFC4,
651 .agc_analog_digital_select_gpio = 0x0c,
652 .gpio_pin_status_mask = 0x4001000,
653 .norm = V4L2_STD_NTSC,
654 .no_alt_vanc = 1,
655 .external_av = 1,
68c97bf3
AH
656 .input = {{
657 .type = CX231XX_VMUX_COMPOSITE1,
658 .vmux = CX231XX_VIN_2_1,
659 .amux = CX231XX_AMUX_LINE_IN,
660 .gpio = NULL,
661 }, {
662 .type = CX231XX_VMUX_SVIDEO,
663 .vmux = CX231XX_VIN_1_1 |
664 (CX231XX_VIN_1_2 << 8) |
665 CX25840_SVIDEO_ON,
666 .amux = CX231XX_AMUX_LINE_IN,
667 .gpio = NULL,
668 } },
669 },
3ead1ba3
MG
670 [CX231XX_BOARD_OTG102] = {
671 .name = "Geniatech OTG102",
672 .tuner_type = TUNER_ABSENT,
673 .decoder = CX231XX_AVDECODER,
674 .output_mode = OUT_MODE_VIP11,
675 .ctl_pin_status_mask = 0xFFFFFFC4,
589dadf2 676 .agc_analog_digital_select_gpio = 0x0c,
3ead1ba3
MG
677 /* According with PV CxPlrCAP.inf file */
678 .gpio_pin_status_mask = 0x4001000,
679 .norm = V4L2_STD_NTSC,
680 .no_alt_vanc = 1,
681 .external_av = 1,
3ead1ba3
MG
682 /*.has_417 = 1, */
683 /* This board is believed to have a hardware encoding chip
684 * supporting mpeg1/2/4, but as the 417 is apparently not
685 * working for the reference board it is not here either. */
686
687 .input = {{
688 .type = CX231XX_VMUX_COMPOSITE1,
689 .vmux = CX231XX_VIN_2_1,
690 .amux = CX231XX_AMUX_LINE_IN,
691 .gpio = NULL,
692 }, {
693 .type = CX231XX_VMUX_SVIDEO,
694 .vmux = CX231XX_VIN_1_1 |
695 (CX231XX_VIN_1_2 << 8) |
696 CX25840_SVIDEO_ON,
697 .amux = CX231XX_AMUX_LINE_IN,
698 .gpio = NULL,
699 }
700 },
701 },
dd2e7dd2 702 [CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx] = {
57cbf3ef 703 .name = "Hauppauge WinTV 930C-HD (1113xx) / HVR-900H (111xxx) / PCTV QuatroStick 521e",
dd2e7dd2
MS
704 .tuner_type = TUNER_NXP_TDA18271,
705 .tuner_addr = 0x60,
706 .tuner_gpio = RDE250_XCV_TUNER,
707 .tuner_sif_gpio = 0x05,
708 .tuner_scl_gpio = 0x1a,
709 .tuner_sda_gpio = 0x1b,
710 .decoder = CX231XX_AVDECODER,
711 .output_mode = OUT_MODE_VIP11,
712 .demod_xfer_mode = 0,
713 .ctl_pin_status_mask = 0xFFFFFFC4,
714 .agc_analog_digital_select_gpio = 0x0c,
715 .gpio_pin_status_mask = 0x4001000,
b9ce9dfd 716 .tuner_i2c_master = I2C_1_MUX_3,
d032ca12 717 .demod_i2c_master = I2C_2,
dd2e7dd2
MS
718 .has_dvb = 1,
719 .demod_addr = 0x0e,
720 .norm = V4L2_STD_PAL,
721
9e49f7c3
MS
722 .input = {{
723 .type = CX231XX_VMUX_TELEVISION,
724 .vmux = CX231XX_VIN_3_1,
725 .amux = CX231XX_AMUX_VIDEO,
726 .gpio = NULL,
727 }, {
728 .type = CX231XX_VMUX_COMPOSITE1,
729 .vmux = CX231XX_VIN_2_1,
730 .amux = CX231XX_AMUX_LINE_IN,
731 .gpio = NULL,
732 }, {
733 .type = CX231XX_VMUX_SVIDEO,
734 .vmux = CX231XX_VIN_1_1 |
735 (CX231XX_VIN_1_2 << 8) |
736 CX25840_SVIDEO_ON,
737 .amux = CX231XX_AMUX_LINE_IN,
738 .gpio = NULL,
739 } },
740 },
741 [CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx] = {
8618ac4d 742 .name = "Hauppauge WinTV 930C-HD (1114xx) / HVR-901H (1114xx) / PCTV QuatroStick 522e",
9e49f7c3
MS
743 .tuner_type = TUNER_ABSENT,
744 .tuner_addr = 0x60,
745 .tuner_gpio = RDE250_XCV_TUNER,
746 .tuner_sif_gpio = 0x05,
747 .tuner_scl_gpio = 0x1a,
748 .tuner_sda_gpio = 0x1b,
749 .decoder = CX231XX_AVDECODER,
750 .output_mode = OUT_MODE_VIP11,
751 .demod_xfer_mode = 0,
752 .ctl_pin_status_mask = 0xFFFFFFC4,
753 .agc_analog_digital_select_gpio = 0x0c,
754 .gpio_pin_status_mask = 0x4001000,
b9ce9dfd 755 .tuner_i2c_master = I2C_1_MUX_3,
d032ca12 756 .demod_i2c_master = I2C_2,
9e49f7c3
MS
757 .has_dvb = 1,
758 .demod_addr = 0x0e,
759 .norm = V4L2_STD_PAL,
760
dd2e7dd2
MS
761 .input = {{
762 .type = CX231XX_VMUX_TELEVISION,
763 .vmux = CX231XX_VIN_3_1,
764 .amux = CX231XX_AMUX_VIDEO,
765 .gpio = NULL,
766 }, {
767 .type = CX231XX_VMUX_COMPOSITE1,
768 .vmux = CX231XX_VIN_2_1,
769 .amux = CX231XX_AMUX_LINE_IN,
770 .gpio = NULL,
771 }, {
772 .type = CX231XX_VMUX_SVIDEO,
773 .vmux = CX231XX_VIN_1_1 |
774 (CX231XX_VIN_1_2 << 8) |
775 CX25840_SVIDEO_ON,
776 .amux = CX231XX_AMUX_LINE_IN,
777 .gpio = NULL,
778 } },
779 },
e0d3bafd
SD
780};
781const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
782
783/* table of devices that work with this driver */
84b5dbf3 784struct usb_device_id cx231xx_id_table[] = {
dad4c418
LM
785 {USB_DEVICE(0x1D19, 0x6109),
786 .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
ed559edf 787 {USB_DEVICE(0x0572, 0x5A3C),
84b5dbf3
MCC
788 .driver_info = CX231XX_BOARD_UNKNOWN},
789 {USB_DEVICE(0x0572, 0x58A2),
64fbf444 790 .driver_info = CX231XX_BOARD_CNXT_CARRAERA},
ed559edf 791 {USB_DEVICE(0x0572, 0x58A1),
64fbf444
PB
792 .driver_info = CX231XX_BOARD_CNXT_SHELBY},
793 {USB_DEVICE(0x0572, 0x58A4),
794 .driver_info = CX231XX_BOARD_CNXT_RDE_253S},
795 {USB_DEVICE(0x0572, 0x58A5),
796 .driver_info = CX231XX_BOARD_CNXT_RDU_253S},
797 {USB_DEVICE(0x0572, 0x58A6),
798 .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},
799 {USB_DEVICE(0x0572, 0x589E),
800 .driver_info = CX231XX_BOARD_CNXT_RDE_250},
801 {USB_DEVICE(0x0572, 0x58A0),
84b5dbf3 802 .driver_info = CX231XX_BOARD_CNXT_RDU_250},
de8ae0d5
PM
803 {USB_DEVICE(0x2040, 0xb110),
804 .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL},
805 {USB_DEVICE(0x2040, 0xb111),
806 .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC},
1a50fdde
MK
807 {USB_DEVICE(0x2040, 0xb120),
808 .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
dd2e7dd2
MS
809 {USB_DEVICE(0x2040, 0xb130),
810 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
9e49f7c3
MS
811 {USB_DEVICE(0x2040, 0xb131),
812 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
57cbf3ef
MS
813 /* Hauppauge WinTV-HVR-900-H */
814 {USB_DEVICE(0x2040, 0xb138),
815 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
8618ac4d
MS
816 /* Hauppauge WinTV-HVR-901-H */
817 {USB_DEVICE(0x2040, 0xb139),
818 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
d78148fb
DH
819 {USB_DEVICE(0x2040, 0xb140),
820 .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
4270c3ca
DH
821 {USB_DEVICE(0x2040, 0xc200),
822 .driver_info = CX231XX_BOARD_HAUPPAUGE_USBLIVE2},
a141a887
MS
823 /* PCTV QuatroStick 521e */
824 {USB_DEVICE(0x2013, 0x0259),
825 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
140a7987
MS
826 /* PCTV QuatroStick 522e */
827 {USB_DEVICE(0x2013, 0x025e),
828 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
9417bc6d
MCC
829 {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000, 0x4001),
830 .driver_info = CX231XX_BOARD_PV_PLAYTV_USB_HYBRID},
4e105039
MCC
831 {USB_DEVICE(USB_VID_PIXELVIEW, 0x5014),
832 .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
eeaaf817
MA
833 {USB_DEVICE(0x1b80, 0xe424),
834 .driver_info = CX231XX_BOARD_KWORLD_UB430_USB_HYBRID},
8b1255a2
JE
835 {USB_DEVICE(0x1b80, 0xe421),
836 .driver_info = CX231XX_BOARD_KWORLD_UB445_USB_HYBRID},
2a7b6a40
IN
837 {USB_DEVICE(0x1f4d, 0x0237),
838 .driver_info = CX231XX_BOARD_ICONBIT_U100},
68c97bf3
AH
839 {USB_DEVICE(0x0fd9, 0x0037),
840 .driver_info = CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2},
3ead1ba3
MG
841 {USB_DEVICE(0x1f4d, 0x0102),
842 .driver_info = CX231XX_BOARD_OTG102},
84b5dbf3 843 {},
e0d3bafd 844};
84b5dbf3 845
e0d3bafd
SD
846MODULE_DEVICE_TABLE(usb, cx231xx_id_table);
847
848/* cx231xx_tuner_callback
849 * will be used to reset XC5000 tuner using GPIO pin
850 */
851
852int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)
853{
854 int rc = 0;
855 struct cx231xx *dev = ptr;
856
84b5dbf3
MCC
857 if (dev->tuner_type == TUNER_XC5000) {
858 if (command == XC5000_TUNER_RESET) {
589dadf2 859 pr_info
b9255176
SD
860 ("Tuner CB: RESET: cmd %d : tuner type %d \n",
861 command, dev->tuner_type);
84b5dbf3
MCC
862 cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
863 1);
864 msleep(10);
865 cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
866 0);
867 msleep(330);
868 cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
869 1);
870 msleep(10);
871 }
55fa288d
MCC
872 } else if (dev->tuner_type == TUNER_NXP_TDA18271) {
873 switch (command) {
874 case TDA18271_CALLBACK_CMD_AGC_ENABLE:
875 if (dev->model == CX231XX_BOARD_PV_PLAYTV_USB_HYBRID)
876 rc = cx231xx_set_agc_analog_digital_mux_select(dev, arg);
877 break;
878 default:
879 rc = -EINVAL;
880 break;
881 }
84b5dbf3 882 }
e0d3bafd
SD
883 return rc;
884}
885EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
886
d4c06133 887static void cx231xx_reset_out(struct cx231xx *dev)
64fbf444
PB
888{
889 cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
890 msleep(200);
891 cx231xx_set_gpio_value(dev, CX23417_RESET, 0);
892 msleep(200);
893 cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
894}
d4c06133
MCC
895
896static void cx231xx_enable_OSC(struct cx231xx *dev)
64fbf444
PB
897{
898 cx231xx_set_gpio_value(dev, CX23417_OSC_EN, 1);
899}
d4c06133
MCC
900
901static void cx231xx_sleep_s5h1432(struct cx231xx *dev)
64fbf444
PB
902{
903 cx231xx_set_gpio_value(dev, SLEEP_S5H1432, 0);
904}
905
b9255176 906static inline void cx231xx_set_model(struct cx231xx *dev)
e0d3bafd 907{
3724dde9 908 dev->board = cx231xx_boards[dev->model];
e0d3bafd
SD
909}
910
911/* Since cx231xx_pre_card_setup() requires a proper dev->model,
912 * this won't work for boards with generic PCI IDs
913 */
914void cx231xx_pre_card_setup(struct cx231xx *dev)
915{
916
917 cx231xx_set_model(dev);
918
589dadf2 919 pr_info("Identified as %s (card=%d)\n",
84b5dbf3 920 dev->board.name, dev->model);
e0d3bafd 921
6e4f574b 922 /* set the direction for GPIO pins */
c10469c6
MCC
923 if (dev->board.tuner_gpio) {
924 cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
925 cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
78bb6df6
MCC
926 }
927 if (dev->board.tuner_sif_gpio >= 0)
c10469c6 928 cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
e0d3bafd 929
78bb6df6 930 /* request some modules if any required */
e0d3bafd 931
84b5dbf3 932 /* set the mode to Analog mode initially */
e0d3bafd
SD
933 cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
934
935 /* Unlock device */
936 /* cx231xx_set_mode(dev, CX231XX_SUSPEND); */
937
938}
939
e0d3bafd
SD
940static void cx231xx_config_tuner(struct cx231xx *dev)
941{
84b5dbf3
MCC
942 struct tuner_setup tun_setup;
943 struct v4l2_frequency f;
e0d3bafd
SD
944
945 if (dev->tuner_type == TUNER_ABSENT)
946 return;
947
948 tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
949 tun_setup.type = dev->tuner_type;
950 tun_setup.addr = dev->tuner_addr;
951 tun_setup.tuner_callback = cx231xx_tuner_callback;
952
b1196126
SD
953 tuner_call(dev, tuner, s_type_addr, &tun_setup);
954
e0d3bafd 955#if 0
84b5dbf3 956 if (tun_setup.type == TUNER_XC5000) {
e0d3bafd
SD
957 static struct xc2028_ctrl ctrl = {
958 .fname = XC5000_DEFAULT_FIRMWARE,
959 .max_len = 64,
84b5dbf3 960 .demod = 0;
e0d3bafd
SD
961 };
962 struct v4l2_priv_tun_config cfg = {
963 .tuner = dev->tuner_type,
964 .priv = &ctrl,
965 };
b1196126 966 tuner_call(dev, tuner, s_config, &cfg);
e0d3bafd
SD
967 }
968#endif
e0d3bafd
SD
969 /* configure tuner */
970 f.tuner = 0;
971 f.type = V4L2_TUNER_ANALOG_TV;
84b5dbf3 972 f.frequency = 9076; /* just a magic number */
e0d3bafd 973 dev->ctl_freq = f.frequency;
b1196126 974 call_all(dev, tuner, s_frequency, &f);
e0d3bafd 975
b1196126 976}
e0d3bafd 977
9c672890
MS
978static int read_eeprom(struct cx231xx *dev, struct i2c_client *client,
979 u8 *eedata, int len)
dd2e7dd2
MS
980{
981 int ret = 0;
dd2e7dd2
MS
982 u8 start_offset = 0;
983 int len_todo = len;
984 u8 *eedata_cur = eedata;
985 int i;
9c672890 986 struct i2c_msg msg_write = { .addr = client->addr, .flags = 0,
dd2e7dd2 987 .buf = &start_offset, .len = 1 };
9c672890 988 struct i2c_msg msg_read = { .addr = client->addr, .flags = I2C_M_RD };
dd2e7dd2
MS
989
990 /* start reading at offset 0 */
9c672890 991 ret = i2c_transfer(client->adapter, &msg_write, 1);
1f97947c 992 if (ret < 0) {
589dadf2 993 pr_err("Can't read eeprom\n");
1f97947c
MCC
994 return ret;
995 }
dd2e7dd2
MS
996
997 while (len_todo > 0) {
998 msg_read.len = (len_todo > 64) ? 64 : len_todo;
999 msg_read.buf = eedata_cur;
1000
9c672890 1001 ret = i2c_transfer(client->adapter, &msg_read, 1);
1f97947c 1002 if (ret < 0) {
589dadf2 1003 pr_err("Can't read eeprom\n");
1f97947c
MCC
1004 return ret;
1005 }
dd2e7dd2
MS
1006 eedata_cur += msg_read.len;
1007 len_todo -= msg_read.len;
1008 }
1009
dd2e7dd2 1010 for (i = 0; i + 15 < len; i += 16)
589dadf2 1011 pr_info("i2c eeprom %02x: %*ph\n", i, 16, &eedata[i]);
dd2e7dd2
MS
1012
1013 return 0;
1014}
1015
e0d3bafd
SD
1016void cx231xx_card_setup(struct cx231xx *dev)
1017{
b1196126 1018
e0d3bafd
SD
1019 cx231xx_set_model(dev);
1020
1021 dev->tuner_type = cx231xx_boards[dev->model].tuner_type;
1022 if (cx231xx_boards[dev->model].tuner_addr)
1023 dev->tuner_addr = cx231xx_boards[dev->model].tuner_addr;
1024
e0d3bafd 1025 /* request some modules */
84b5dbf3 1026 if (dev->board.decoder == CX231XX_AVDECODER) {
e6574f2f 1027 dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
c3c3f1ae 1028 cx231xx_get_i2c_adap(dev, I2C_0),
9a1f8b34 1029 "cx25840", 0x88 >> 1, NULL);
b1196126 1030 if (dev->sd_cx25840 == NULL)
589dadf2 1031 pr_info("cx25840 subdev registration failure\n");
cc26b076 1032 cx25840_call(dev, core, load_fw);
b1196126 1033
84b5dbf3 1034 }
b1196126 1035
e3e0aaaa
DH
1036 /* Initialize the tuner */
1037 if (dev->board.tuner_type != TUNER_ABSENT) {
c3c3f1ae
MS
1038 struct i2c_adapter *tuner_i2c = cx231xx_get_i2c_adap(dev,
1039 dev->board.tuner_i2c_master);
e3e0aaaa 1040 dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
c3c3f1ae 1041 tuner_i2c,
9a1f8b34 1042 "tuner",
e3e0aaaa
DH
1043 dev->tuner_addr, NULL);
1044 if (dev->sd_tuner == NULL)
589dadf2 1045 pr_info("tuner subdev registration failure\n");
e3e0aaaa 1046 else
64fbf444 1047 cx231xx_config_tuner(dev);
84b5dbf3 1048 }
dd2e7dd2
MS
1049
1050 switch (dev->model) {
1051 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
9e49f7c3 1052 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
dd2e7dd2
MS
1053 {
1054 struct tveeprom tvee;
1055 static u8 eeprom[256];
9c672890
MS
1056 struct i2c_client client;
1057
1058 memset(&client, 0, sizeof(client));
b9ce9dfd 1059 client.adapter = cx231xx_get_i2c_adap(dev, I2C_1_MUX_1);
9c672890 1060 client.addr = 0xa0 >> 1;
dd2e7dd2 1061
9c672890
MS
1062 read_eeprom(dev, &client, eeprom, sizeof(eeprom));
1063 tveeprom_hauppauge_analog(&client,
dd2e7dd2
MS
1064 &tvee, eeprom + 0xc0);
1065 break;
1066 }
1067 }
1068
e0d3bafd
SD
1069}
1070
e0d3bafd
SD
1071/*
1072 * cx231xx_config()
1073 * inits registers with sane defaults
1074 */
1075int cx231xx_config(struct cx231xx *dev)
1076{
84b5dbf3 1077 /* TBD need to add cx231xx specific code */
e0d3bafd
SD
1078
1079 return 0;
1080}
1081
1082/*
1083 * cx231xx_config_i2c()
1084 * configure i2c attached devices
1085 */
1086void cx231xx_config_i2c(struct cx231xx *dev)
1087{
5325b427 1088 /* u32 input = INPUT(dev->video_input)->vmux; */
e0d3bafd 1089
b1196126 1090 call_all(dev, video, s_stream, 1);
e0d3bafd
SD
1091}
1092
1093/*
1094 * cx231xx_realease_resources()
1095 * unregisters the v4l2,i2c and usb devices
1096 * called when the device gets disconected or at module unload
1097*/
1098void cx231xx_release_resources(struct cx231xx *dev)
1099{
e0d3bafd
SD
1100 cx231xx_release_analog_resources(dev);
1101
84b5dbf3 1102 cx231xx_remove_from_devlist(dev);
e0d3bafd 1103
7528cd27
MCC
1104 cx231xx_ir_exit(dev);
1105
9ab66912 1106 /* Release I2C buses */
84b5dbf3 1107 cx231xx_dev_uninit(dev);
e0d3bafd 1108
7528cd27
MCC
1109 /* delete v4l2 device */
1110 v4l2_device_unregister(&dev->v4l2_dev);
9ab66912 1111
e0d3bafd
SD
1112 usb_put_dev(dev->udev);
1113
1114 /* Mark device as unused */
db702a7a 1115 clear_bit(dev->devno, &cx231xx_devused);
e0d3bafd
SD
1116}
1117
e0d3bafd
SD
1118/*
1119 * cx231xx_init_dev()
1120 * allocates and inits the device structs, registers i2c bus and v4l device
1121 */
15cb6af8 1122static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,
84b5dbf3 1123 int minor)
e0d3bafd 1124{
e0d3bafd 1125 int retval = -ENOMEM;
e0d3bafd
SD
1126 unsigned int maxh, maxw;
1127
1128 dev->udev = udev;
1129 mutex_init(&dev->lock);
1130 mutex_init(&dev->ctrl_urb_lock);
84b5dbf3 1131 mutex_init(&dev->gpio_i2c_lock);
64fbf444 1132 mutex_init(&dev->i2c_lock);
e0d3bafd 1133
84b5dbf3
MCC
1134 spin_lock_init(&dev->video_mode.slock);
1135 spin_lock_init(&dev->vbi_mode.slock);
1136 spin_lock_init(&dev->sliced_cc_mode.slock);
e0d3bafd
SD
1137
1138 init_waitqueue_head(&dev->open);
1139 init_waitqueue_head(&dev->wait_frame);
1140 init_waitqueue_head(&dev->wait_stream);
1141
84b5dbf3
MCC
1142 dev->cx231xx_read_ctrl_reg = cx231xx_read_ctrl_reg;
1143 dev->cx231xx_write_ctrl_reg = cx231xx_write_ctrl_reg;
1144 dev->cx231xx_send_usb_command = cx231xx_send_usb_command;
1145 dev->cx231xx_gpio_i2c_read = cx231xx_gpio_i2c_read;
1146 dev->cx231xx_gpio_i2c_write = cx231xx_gpio_i2c_write;
e0d3bafd 1147
84b5dbf3 1148 /* Query cx231xx to find what pcb config it is related to */
52841e5e
MCC
1149 retval = initialize_cx231xx(dev);
1150 if (retval < 0) {
589dadf2 1151 pr_err("Failed to read PCB config\n");
52841e5e
MCC
1152 return retval;
1153 }
e0d3bafd 1154
64fbf444
PB
1155 /*To workaround error number=-71 on EP0 for VideoGrabber,
1156 need set alt here.*/
4270c3ca
DH
1157 if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER ||
1158 dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) {
64fbf444
PB
1159 cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1160 cx231xx_set_alt_setting(dev, INDEX_VANC, 1);
1161 }
84b5dbf3 1162 /* Cx231xx pre card setup */
e0d3bafd
SD
1163 cx231xx_pre_card_setup(dev);
1164
256d013a
AK
1165 retval = cx231xx_config(dev);
1166 if (retval) {
589dadf2 1167 pr_err("error configuring device\n");
e0d3bafd
SD
1168 return -ENOMEM;
1169 }
1170
84b5dbf3 1171 /* set default norm */
e0d3bafd
SD
1172 dev->norm = dev->board.norm;
1173
1174 /* register i2c bus */
256d013a
AK
1175 retval = cx231xx_dev_init(dev);
1176 if (retval) {
589dadf2 1177 pr_err("%s: cx231xx_i2c_register - errCode [%d]!\n",
256d013a
AK
1178 __func__, retval);
1179 goto err_dev_init;
e0d3bafd
SD
1180 }
1181
1182 /* Do board specific init */
1183 cx231xx_card_setup(dev);
1184
1185 /* configure the device */
1186 cx231xx_config_i2c(dev);
1187
1188 maxw = norm_maxw(dev);
1189 maxh = norm_maxh(dev);
1190
1191 /* set default image size */
1192 dev->width = maxw;
1193 dev->height = maxh;
1194 dev->interlaced = 0;
e0d3bafd
SD
1195 dev->video_input = 0;
1196
256d013a
AK
1197 retval = cx231xx_config(dev);
1198 if (retval) {
589dadf2 1199 pr_err("%s: cx231xx_config - errCode [%d]!\n",
256d013a
AK
1200 __func__, retval);
1201 goto err_dev_init;
e0d3bafd
SD
1202 }
1203
1204 /* init video dma queues */
1205 INIT_LIST_HEAD(&dev->video_mode.vidq.active);
1206 INIT_LIST_HEAD(&dev->video_mode.vidq.queued);
1207
84b5dbf3 1208 /* init vbi dma queues */
e0d3bafd
SD
1209 INIT_LIST_HEAD(&dev->vbi_mode.vidq.active);
1210 INIT_LIST_HEAD(&dev->vbi_mode.vidq.queued);
1211
1212 /* Reset other chips required if they are tied up with GPIO pins */
84b5dbf3 1213 cx231xx_add_into_devlist(dev);
e0d3bafd 1214
2f861387 1215 if (dev->board.has_417) {
2b43db32 1216 printk(KERN_INFO "attach 417 %d\n", dev->model);
64fbf444
PB
1217 if (cx231xx_417_register(dev) < 0) {
1218 printk(KERN_ERR
1219 "%s() Failed to register 417 on VID_B\n",
1220 __func__);
1221 }
1222 }
1223
e0d3bafd 1224 retval = cx231xx_register_analog_devices(dev);
256d013a
AK
1225 if (retval) {
1226 cx231xx_release_analog_resources(dev);
1227 goto err_analog;
e0d3bafd
SD
1228 }
1229
9ab66912
MCC
1230 cx231xx_ir_init(dev);
1231
e0d3bafd
SD
1232 cx231xx_init_extension(dev);
1233
1234 return 0;
256d013a
AK
1235err_analog:
1236 cx231xx_remove_from_devlist(dev);
1237err_dev_init:
1238 cx231xx_dev_uninit(dev);
1239 return retval;
e0d3bafd
SD
1240}
1241
1242#if defined(CONFIG_MODULES) && defined(MODULE)
1243static void request_module_async(struct work_struct *work)
1244{
1245 struct cx231xx *dev = container_of(work,
84b5dbf3 1246 struct cx231xx, request_module_wk);
e0d3bafd
SD
1247
1248 if (dev->has_alsa_audio)
1249 request_module("cx231xx-alsa");
1250
1251 if (dev->board.has_dvb)
1252 request_module("cx231xx-dvb");
1253
1254}
1255
1256static void request_modules(struct cx231xx *dev)
1257{
1258 INIT_WORK(&dev->request_module_wk, request_module_async);
1259 schedule_work(&dev->request_module_wk);
1260}
707bcf32
TH
1261
1262static void flush_request_modules(struct cx231xx *dev)
1263{
43829731 1264 flush_work(&dev->request_module_wk);
707bcf32 1265}
e0d3bafd
SD
1266#else
1267#define request_modules(dev)
707bcf32 1268#define flush_request_modules(dev)
e0d3bafd
SD
1269#endif /* CONFIG_MODULES */
1270
4d2a7d35
MCC
1271static int cx231xx_init_v4l2(struct cx231xx *dev,
1272 struct usb_device *udev,
1273 struct usb_interface *interface,
1274 int isoc_pipe)
1275{
1276 struct usb_interface *uif;
1277 int i, idx;
1278
1279 /* Video Init */
1280
1281 /* compute alternate max packet sizes for video */
1282 idx = dev->current_pcb_config.hs_config_info[0].interface_info.video_index + 1;
1283 if (idx >= dev->max_iad_interface_count) {
589dadf2 1284 pr_err("Video PCB interface #%d doesn't exist\n", idx);
4d2a7d35
MCC
1285 return -ENODEV;
1286 }
1287
1288 uif = udev->actconfig->interface[idx];
1289
1290 dev->video_mode.end_point_addr = uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress;
1291 dev->video_mode.num_alt = uif->num_altsetting;
1292
589dadf2 1293 pr_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
4d2a7d35
MCC
1294 dev->video_mode.end_point_addr,
1295 dev->video_mode.num_alt);
1296
1297 dev->video_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->video_mode.num_alt, GFP_KERNEL);
1298 if (dev->video_mode.alt_max_pkt_size == NULL) {
589dadf2 1299 pr_err("out of memory!\n");
4d2a7d35
MCC
1300 return -ENOMEM;
1301 }
1302
1303 for (i = 0; i < dev->video_mode.num_alt; i++) {
1304 u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
1305 dev->video_mode.alt_max_pkt_size[i] = (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
589dadf2 1306 pr_info("Alternate setting %i, max size= %i\n", i,
4d2a7d35
MCC
1307 dev->video_mode.alt_max_pkt_size[i]);
1308 }
1309
1310 /* VBI Init */
1311
1312 idx = dev->current_pcb_config.hs_config_info[0].interface_info.vanc_index + 1;
1313 if (idx >= dev->max_iad_interface_count) {
589dadf2 1314 pr_err("VBI PCB interface #%d doesn't exist\n", idx);
4d2a7d35
MCC
1315 return -ENODEV;
1316 }
1317 uif = udev->actconfig->interface[idx];
1318
1319 dev->vbi_mode.end_point_addr =
1320 uif->altsetting[0].endpoint[isoc_pipe].desc.
1321 bEndpointAddress;
1322
1323 dev->vbi_mode.num_alt = uif->num_altsetting;
589dadf2 1324 pr_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
4d2a7d35
MCC
1325 dev->vbi_mode.end_point_addr,
1326 dev->vbi_mode.num_alt);
1327
1328 /* compute alternate max packet sizes for vbi */
1329 dev->vbi_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->vbi_mode.num_alt, GFP_KERNEL);
1330 if (dev->vbi_mode.alt_max_pkt_size == NULL) {
589dadf2 1331 pr_err("out of memory!\n");
4d2a7d35
MCC
1332 return -ENOMEM;
1333 }
1334
1335 for (i = 0; i < dev->vbi_mode.num_alt; i++) {
1336 u16 tmp =
1337 le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1338 desc.wMaxPacketSize);
1339 dev->vbi_mode.alt_max_pkt_size[i] =
1340 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
589dadf2 1341 pr_info("Alternate setting %i, max size= %i\n", i,
4d2a7d35
MCC
1342 dev->vbi_mode.alt_max_pkt_size[i]);
1343 }
1344
1345 /* Sliced CC VBI init */
1346
1347 /* compute alternate max packet sizes for sliced CC */
1348 idx = dev->current_pcb_config.hs_config_info[0].interface_info.hanc_index + 1;
1349 if (idx >= dev->max_iad_interface_count) {
589dadf2 1350 pr_err("Sliced CC PCB interface #%d doesn't exist\n", idx);
4d2a7d35
MCC
1351 return -ENODEV;
1352 }
1353 uif = udev->actconfig->interface[idx];
1354
1355 dev->sliced_cc_mode.end_point_addr =
1356 uif->altsetting[0].endpoint[isoc_pipe].desc.
1357 bEndpointAddress;
1358
1359 dev->sliced_cc_mode.num_alt = uif->num_altsetting;
589dadf2 1360 pr_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
4d2a7d35
MCC
1361 dev->sliced_cc_mode.end_point_addr,
1362 dev->sliced_cc_mode.num_alt);
1363 dev->sliced_cc_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->sliced_cc_mode.num_alt, GFP_KERNEL);
1364
1365 if (dev->sliced_cc_mode.alt_max_pkt_size == NULL) {
589dadf2 1366 pr_err("out of memory!\n");
4d2a7d35
MCC
1367 return -ENOMEM;
1368 }
1369
1370 for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
1371 u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1372 desc.wMaxPacketSize);
1373 dev->sliced_cc_mode.alt_max_pkt_size[i] =
1374 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
589dadf2 1375 pr_info("Alternate setting %i, max size= %i\n", i,
4d2a7d35
MCC
1376 dev->sliced_cc_mode.alt_max_pkt_size[i]);
1377 }
1378
1379 return 0;
1380}
1381
e0d3bafd
SD
1382/*
1383 * cx231xx_usb_probe()
1384 * checks for supported devices
1385 */
1386static int cx231xx_usb_probe(struct usb_interface *interface,
84b5dbf3 1387 const struct usb_device_id *id)
e0d3bafd
SD
1388{
1389 struct usb_device *udev;
1390 struct usb_interface *uif;
1391 struct cx231xx *dev = NULL;
1392 int retval = -ENODEV;
d73abcff 1393 int nr = 0, ifnum;
e0d3bafd
SD
1394 int i, isoc_pipe = 0;
1395 char *speed;
dcb78ac7 1396 u8 idx;
84b5dbf3 1397 struct usb_interface_assoc_descriptor *assoc_desc;
e0d3bafd 1398
e0d3bafd
SD
1399 ifnum = interface->altsetting[0].desc.bInterfaceNumber;
1400
8bb84227
MCC
1401 /*
1402 * Interface number 0 - IR interface (handled by mceusb driver)
1403 * Interface number 1 - AV interface (handled by this driver)
1404 */
1405 if (ifnum != 1)
1406 return -ENODEV;
84b5dbf3 1407
8bb84227 1408 /* Check to see next free device and mark as used */
db702a7a
MCC
1409 do {
1410 nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);
1411 if (nr >= CX231XX_MAXBOARDS) {
1412 /* No free device slots */
589dadf2 1413 pr_err(DRIVER_NAME ": Supports only %i devices.\n",
db702a7a
MCC
1414 CX231XX_MAXBOARDS);
1415 return -ENOMEM;
1416 }
1417 } while (test_and_set_bit(nr, &cx231xx_devused));
64fbf444 1418
184a8278
MCC
1419 udev = usb_get_dev(interface_to_usbdev(interface));
1420
8bb84227 1421 /* allocate memory for our device state and initialize it */
184a8278 1422 dev = devm_kzalloc(&udev->dev, sizeof(*dev), GFP_KERNEL);
8bb84227 1423 if (dev == NULL) {
589dadf2 1424 pr_err(DRIVER_NAME ": out of memory!\n");
6c2cc5b5 1425 clear_bit(nr, &cx231xx_devused);
8bb84227
MCC
1426 return -ENOMEM;
1427 }
64fbf444 1428
8bb84227
MCC
1429 snprintf(dev->name, 29, "cx231xx #%d", nr);
1430 dev->devno = nr;
1431 dev->model = id->driver_info;
1432 dev->video_mode.alt = -1;
1433
1434 dev->interface_count++;
1435 /* reset gpio dir and value */
1436 dev->gpio_dir = 0;
1437 dev->gpio_val = 0;
1438 dev->xc_fw_load_done = 0;
1439 dev->has_alsa_audio = 1;
1440 dev->power_mode = -1;
1441 atomic_set(&dev->devlist_count, 0);
1442
1443 /* 0 - vbi ; 1 -sliced cc mode */
1444 dev->vbi_or_sliced_cc_mode = 0;
1445
1446 /* get maximum no.of IAD interfaces */
139d2882 1447 dev->max_iad_interface_count = udev->config->desc.bNumInterfaces;
8bb84227
MCC
1448
1449 /* init CIR module TBD */
1450
8bb84227
MCC
1451 /*mode_tv: digital=1 or analog=0*/
1452 dev->mode_tv = 0;
1453
1454 dev->USE_ISO = transfer_mode;
1455
1456 switch (udev->speed) {
1457 case USB_SPEED_LOW:
1458 speed = "1.5";
1459 break;
1460 case USB_SPEED_UNKNOWN:
1461 case USB_SPEED_FULL:
1462 speed = "12";
1463 break;
1464 case USB_SPEED_HIGH:
1465 speed = "480";
1466 break;
1467 default:
1468 speed = "unknown";
1469 }
84b5dbf3 1470
589dadf2 1471 pr_info("New device %s %s @ %s Mbps "
8bb84227 1472 "(%04x:%04x) with %d interfaces\n",
adb60966
PST
1473 udev->manufacturer ? udev->manufacturer : "",
1474 udev->product ? udev->product : "",
8bb84227
MCC
1475 speed,
1476 le16_to_cpu(udev->descriptor.idVendor),
1477 le16_to_cpu(udev->descriptor.idProduct),
1478 dev->max_iad_interface_count);
1479
8bb84227
MCC
1480 /* increment interface count */
1481 dev->interface_count++;
1482
1483 /* get device number */
1484 nr = dev->devno;
1485
1486 assoc_desc = udev->actconfig->intf_assoc[0];
1487 if (assoc_desc->bFirstInterface != ifnum) {
589dadf2 1488 pr_err(DRIVER_NAME ": Not found "
8bb84227 1489 "matching IAD interface\n");
256d013a
AK
1490 retval = -ENODEV;
1491 goto err_if;
10e4ebb6 1492 }
e0d3bafd 1493
589dadf2 1494 pr_info("registering interface %d\n", ifnum);
e0d3bafd 1495
90960744 1496 /* save our data pointer in this interface device */
a116a05c 1497 usb_set_intfdata(interface, dev);
e0d3bafd 1498
90960744 1499 /* Create v4l2 device */
7231748a 1500 retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
90960744 1501 if (retval) {
589dadf2 1502 pr_err("v4l2_device_register failed\n");
256d013a 1503 goto err_v4l2;
90960744 1504 }
4d2a7d35 1505
90960744 1506 /* allocate device struct */
15cb6af8 1507 retval = cx231xx_init_dev(dev, udev, nr);
256d013a
AK
1508 if (retval)
1509 goto err_init;
84b5dbf3 1510
4d2a7d35
MCC
1511 retval = cx231xx_init_v4l2(dev, udev, interface, isoc_pipe);
1512 if (retval)
dcb78ac7 1513 goto err_init;
84b5dbf3 1514
90960744
MCC
1515 if (dev->current_pcb_config.ts1_source != 0xff) {
1516 /* compute alternate max packet sizes for TS1 */
dcb78ac7
MCC
1517 idx = dev->current_pcb_config.hs_config_info[0].interface_info.ts1_index + 1;
1518 if (idx >= dev->max_iad_interface_count) {
589dadf2 1519 pr_err("TS1 PCB interface #%d doesn't exist\n", idx);
dcb78ac7 1520 retval = -ENODEV;
184a8278 1521 goto err_video_alt;
dcb78ac7
MCC
1522 }
1523 uif = udev->actconfig->interface[idx];
84b5dbf3 1524
90960744 1525 dev->ts1_mode.end_point_addr =
69a11a32
HV
1526 uif->altsetting[0].endpoint[isoc_pipe].
1527 desc.bEndpointAddress;
84b5dbf3 1528
90960744 1529 dev->ts1_mode.num_alt = uif->num_altsetting;
589dadf2 1530 pr_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
90960744
MCC
1531 dev->ts1_mode.end_point_addr,
1532 dev->ts1_mode.num_alt);
84b5dbf3 1533
184a8278 1534 dev->ts1_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->ts1_mode.num_alt, GFP_KERNEL);
90960744 1535 if (dev->ts1_mode.alt_max_pkt_size == NULL) {
589dadf2 1536 pr_err("out of memory!\n");
256d013a 1537 retval = -ENOMEM;
184a8278 1538 goto err_video_alt;
84b5dbf3
MCC
1539 }
1540
90960744
MCC
1541 for (i = 0; i < dev->ts1_mode.num_alt; i++) {
1542 u16 tmp = le16_to_cpu(uif->altsetting[i].
84b5dbf3
MCC
1543 endpoint[isoc_pipe].desc.
1544 wMaxPacketSize);
90960744
MCC
1545 dev->ts1_mode.alt_max_pkt_size[i] =
1546 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
589dadf2 1547 pr_info("Alternate setting %i, max size= %i\n", i,
84b5dbf3 1548 dev->ts1_mode.alt_max_pkt_size[i]);
84b5dbf3 1549 }
84b5dbf3 1550 }
e0d3bafd 1551
64fbf444
PB
1552 if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
1553 cx231xx_enable_OSC(dev);
1554 cx231xx_reset_out(dev);
1555 cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1556 }
1557
1558 if (dev->model == CX231XX_BOARD_CNXT_RDE_253S)
1559 cx231xx_sleep_s5h1432(dev);
1560
84b5dbf3 1561 /* load other modules required */
90960744 1562 request_modules(dev);
e0d3bafd
SD
1563
1564 return 0;
256d013a
AK
1565err_video_alt:
1566 /* cx231xx_uninit_dev: */
1567 cx231xx_close_extension(dev);
1568 cx231xx_ir_exit(dev);
1569 cx231xx_release_analog_resources(dev);
1570 cx231xx_417_unregister(dev);
1571 cx231xx_remove_from_devlist(dev);
1572 cx231xx_dev_uninit(dev);
1573err_init:
1574 v4l2_device_unregister(&dev->v4l2_dev);
1575err_v4l2:
1576 usb_set_intfdata(interface, NULL);
1577err_if:
1578 usb_put_dev(udev);
256d013a
AK
1579 clear_bit(dev->devno, &cx231xx_devused);
1580 return retval;
e0d3bafd
SD
1581}
1582
1583/*
1584 * cx231xx_usb_disconnect()
1585 * called when the device gets diconencted
1586 * video device will be unregistered on v4l2_close in case it is still open
1587 */
1588static void cx231xx_usb_disconnect(struct usb_interface *interface)
1589{
1590 struct cx231xx *dev;
1591
84b5dbf3 1592 dev = usb_get_intfdata(interface);
e0d3bafd
SD
1593 usb_set_intfdata(interface, NULL);
1594
1595 if (!dev)
1596 return;
1597
90960744
MCC
1598 if (!dev->udev)
1599 return;
1600
990862a2 1601 dev->state |= DEV_DISCONNECTED;
707bcf32 1602
707bcf32 1603 flush_request_modules(dev);
b1196126 1604
e0d3bafd
SD
1605 /* wait until all current v4l2 io is finished then deallocate
1606 resources */
1607 mutex_lock(&dev->lock);
1608
1609 wake_up_interruptible_all(&dev->open);
1610
1611 if (dev->users) {
589dadf2 1612 pr_warn
38c7c036
LP
1613 ("device %s is open! Deregistration and memory "
1614 "deallocation are deferred on close.\n",
1615 video_device_node_name(dev->vdev));
e0d3bafd 1616
7528cd27
MCC
1617 /* Even having users, it is safe to remove the RC i2c driver */
1618 cx231xx_ir_exit(dev);
1619
64fbf444
PB
1620 if (dev->USE_ISO)
1621 cx231xx_uninit_isoc(dev);
1622 else
1623 cx231xx_uninit_bulk(dev);
e0d3bafd
SD
1624 wake_up_interruptible(&dev->wait_frame);
1625 wake_up_interruptible(&dev->wait_stream);
1626 } else {
e0d3bafd
SD
1627 }
1628
84b5dbf3 1629 cx231xx_close_extension(dev);
e0d3bafd
SD
1630
1631 mutex_unlock(&dev->lock);
1632
7528cd27
MCC
1633 if (!dev->users)
1634 cx231xx_release_resources(dev);
e0d3bafd
SD
1635}
1636
1637static struct usb_driver cx231xx_usb_driver = {
1638 .name = "cx231xx",
1639 .probe = cx231xx_usb_probe,
1640 .disconnect = cx231xx_usb_disconnect,
1641 .id_table = cx231xx_id_table,
1642};
1643
ecb3b2b3 1644module_usb_driver(cx231xx_usb_driver);
This page took 0.503013 seconds and 5 git commands to generate.