]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blob - drivers/media/video/cx25840/cx25840-core.c
loop: mutex already unlocked in loop_clr_fd()
[mirror_ubuntu-kernels.git] / drivers / media / video / cx25840 / cx25840-core.c
1 /* cx25840 - Conexant CX25840 audio/video decoder driver
2 *
3 * Copyright (C) 2004 Ulf Eklund
4 *
5 * Based on the saa7115 driver and on the first verison of Chris Kennedy's
6 * cx25840 driver.
7 *
8 * Changes by Tyler Trafford <tatrafford@comcast.net>
9 * - cleanup/rewrite for V4L2 API (2005)
10 *
11 * VBI support by Hans Verkuil <hverkuil@xs4all.nl>.
12 *
13 * NTSC sliced VBI support by Christopher Neufeld <television@cneufeld.ca>
14 * with additional fixes by Hans Verkuil <hverkuil@xs4all.nl>.
15 *
16 * CX23885 support by Steven Toth <stoth@linuxtv.org>.
17 *
18 * This program is free software; you can redistribute it and/or
19 * modify it under the terms of the GNU General Public License
20 * as published by the Free Software Foundation; either version 2
21 * of the License, or (at your option) any later version.
22 *
23 * This program is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
27 *
28 * You should have received a copy of the GNU General Public License
29 * along with this program; if not, write to the Free Software
30 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
31 */
32
33
34 #include <linux/kernel.h>
35 #include <linux/module.h>
36 #include <linux/slab.h>
37 #include <linux/videodev2.h>
38 #include <linux/i2c.h>
39 #include <linux/delay.h>
40 #include <media/v4l2-common.h>
41 #include <media/v4l2-chip-ident.h>
42 #include <media/v4l2-i2c-drv.h>
43 #include <media/cx25840.h>
44
45 #include "cx25840-core.h"
46
47 MODULE_DESCRIPTION("Conexant CX25840 audio/video decoder driver");
48 MODULE_AUTHOR("Ulf Eklund, Chris Kennedy, Hans Verkuil, Tyler Trafford");
49 MODULE_LICENSE("GPL");
50
51 static int cx25840_debug;
52
53 module_param_named(debug,cx25840_debug, int, 0644);
54
55 MODULE_PARM_DESC(debug, "Debugging messages [0=Off (default) 1=On]");
56
57
58 /* ----------------------------------------------------------------------- */
59
60 int cx25840_write(struct i2c_client *client, u16 addr, u8 value)
61 {
62 u8 buffer[3];
63 buffer[0] = addr >> 8;
64 buffer[1] = addr & 0xff;
65 buffer[2] = value;
66 return i2c_master_send(client, buffer, 3);
67 }
68
69 int cx25840_write4(struct i2c_client *client, u16 addr, u32 value)
70 {
71 u8 buffer[6];
72 buffer[0] = addr >> 8;
73 buffer[1] = addr & 0xff;
74 buffer[2] = value & 0xff;
75 buffer[3] = (value >> 8) & 0xff;
76 buffer[4] = (value >> 16) & 0xff;
77 buffer[5] = value >> 24;
78 return i2c_master_send(client, buffer, 6);
79 }
80
81 u8 cx25840_read(struct i2c_client * client, u16 addr)
82 {
83 u8 buffer[2];
84 buffer[0] = addr >> 8;
85 buffer[1] = addr & 0xff;
86
87 if (i2c_master_send(client, buffer, 2) < 2)
88 return 0;
89
90 if (i2c_master_recv(client, buffer, 1) < 1)
91 return 0;
92
93 return buffer[0];
94 }
95
96 u32 cx25840_read4(struct i2c_client * client, u16 addr)
97 {
98 u8 buffer[4];
99 buffer[0] = addr >> 8;
100 buffer[1] = addr & 0xff;
101
102 if (i2c_master_send(client, buffer, 2) < 2)
103 return 0;
104
105 if (i2c_master_recv(client, buffer, 4) < 4)
106 return 0;
107
108 return (buffer[3] << 24) | (buffer[2] << 16) |
109 (buffer[1] << 8) | buffer[0];
110 }
111
112 int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned and_mask,
113 u8 or_value)
114 {
115 return cx25840_write(client, addr,
116 (cx25840_read(client, addr) & and_mask) |
117 or_value);
118 }
119
120 /* ----------------------------------------------------------------------- */
121
122 static int set_input(struct i2c_client *client, enum cx25840_video_input vid_input,
123 enum cx25840_audio_input aud_input);
124
125 /* ----------------------------------------------------------------------- */
126
127 static void init_dll1(struct i2c_client *client)
128 {
129 /* This is the Hauppauge sequence used to
130 * initialize the Delay Lock Loop 1 (ADC DLL). */
131 cx25840_write(client, 0x159, 0x23);
132 cx25840_write(client, 0x15a, 0x87);
133 cx25840_write(client, 0x15b, 0x06);
134 udelay(10);
135 cx25840_write(client, 0x159, 0xe1);
136 udelay(10);
137 cx25840_write(client, 0x15a, 0x86);
138 cx25840_write(client, 0x159, 0xe0);
139 cx25840_write(client, 0x159, 0xe1);
140 cx25840_write(client, 0x15b, 0x10);
141 }
142
143 static void init_dll2(struct i2c_client *client)
144 {
145 /* This is the Hauppauge sequence used to
146 * initialize the Delay Lock Loop 2 (ADC DLL). */
147 cx25840_write(client, 0x15d, 0xe3);
148 cx25840_write(client, 0x15e, 0x86);
149 cx25840_write(client, 0x15f, 0x06);
150 udelay(10);
151 cx25840_write(client, 0x15d, 0xe1);
152 cx25840_write(client, 0x15d, 0xe0);
153 cx25840_write(client, 0x15d, 0xe1);
154 }
155
156 static void cx25836_initialize(struct i2c_client *client)
157 {
158 /* reset configuration is described on page 3-77 of the CX25836 datasheet */
159 /* 2. */
160 cx25840_and_or(client, 0x000, ~0x01, 0x01);
161 cx25840_and_or(client, 0x000, ~0x01, 0x00);
162 /* 3a. */
163 cx25840_and_or(client, 0x15a, ~0x70, 0x00);
164 /* 3b. */
165 cx25840_and_or(client, 0x15b, ~0x1e, 0x06);
166 /* 3c. */
167 cx25840_and_or(client, 0x159, ~0x02, 0x02);
168 /* 3d. */
169 udelay(10);
170 /* 3e. */
171 cx25840_and_or(client, 0x159, ~0x02, 0x00);
172 /* 3f. */
173 cx25840_and_or(client, 0x159, ~0xc0, 0xc0);
174 /* 3g. */
175 cx25840_and_or(client, 0x159, ~0x01, 0x00);
176 cx25840_and_or(client, 0x159, ~0x01, 0x01);
177 /* 3h. */
178 cx25840_and_or(client, 0x15b, ~0x1e, 0x10);
179 }
180
181 static void cx25840_work_handler(struct work_struct *work)
182 {
183 struct cx25840_state *state = container_of(work, struct cx25840_state, fw_work);
184 cx25840_loadfw(state->c);
185 wake_up(&state->fw_wait);
186 }
187
188 static void cx25840_initialize(struct i2c_client *client)
189 {
190 DEFINE_WAIT(wait);
191 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
192 struct workqueue_struct *q;
193
194 /* datasheet startup in numbered steps, refer to page 3-77 */
195 /* 2. */
196 cx25840_and_or(client, 0x803, ~0x10, 0x00);
197 /* The default of this register should be 4, but I get 0 instead.
198 * Set this register to 4 manually. */
199 cx25840_write(client, 0x000, 0x04);
200 /* 3. */
201 init_dll1(client);
202 init_dll2(client);
203 cx25840_write(client, 0x136, 0x0a);
204 /* 4. */
205 cx25840_write(client, 0x13c, 0x01);
206 cx25840_write(client, 0x13c, 0x00);
207 /* 5. */
208 /* Do the firmware load in a work handler to prevent.
209 Otherwise the kernel is blocked waiting for the
210 bit-banging i2c interface to finish uploading the
211 firmware. */
212 INIT_WORK(&state->fw_work, cx25840_work_handler);
213 init_waitqueue_head(&state->fw_wait);
214 q = create_singlethread_workqueue("cx25840_fw");
215 prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
216 queue_work(q, &state->fw_work);
217 schedule();
218 finish_wait(&state->fw_wait, &wait);
219 destroy_workqueue(q);
220
221 /* 6. */
222 cx25840_write(client, 0x115, 0x8c);
223 cx25840_write(client, 0x116, 0x07);
224 cx25840_write(client, 0x118, 0x02);
225 /* 7. */
226 cx25840_write(client, 0x4a5, 0x80);
227 cx25840_write(client, 0x4a5, 0x00);
228 cx25840_write(client, 0x402, 0x00);
229 /* 8. */
230 cx25840_and_or(client, 0x401, ~0x18, 0);
231 cx25840_and_or(client, 0x4a2, ~0x10, 0x10);
232 /* steps 8c and 8d are done in change_input() */
233 /* 10. */
234 cx25840_write(client, 0x8d3, 0x1f);
235 cx25840_write(client, 0x8e3, 0x03);
236
237 cx25840_std_setup(client);
238
239 /* trial and error says these are needed to get audio */
240 cx25840_write(client, 0x914, 0xa0);
241 cx25840_write(client, 0x918, 0xa0);
242 cx25840_write(client, 0x919, 0x01);
243
244 /* stereo prefered */
245 cx25840_write(client, 0x809, 0x04);
246 /* AC97 shift */
247 cx25840_write(client, 0x8cf, 0x0f);
248
249 /* (re)set input */
250 set_input(client, state->vid_input, state->aud_input);
251
252 /* start microcontroller */
253 cx25840_and_or(client, 0x803, ~0x10, 0x10);
254 }
255
256 static void cx23885_initialize(struct i2c_client *client)
257 {
258 DEFINE_WAIT(wait);
259 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
260 struct workqueue_struct *q;
261
262 /* Internal Reset */
263 cx25840_and_or(client, 0x102, ~0x01, 0x01);
264 cx25840_and_or(client, 0x102, ~0x01, 0x00);
265
266 /* Stop microcontroller */
267 cx25840_and_or(client, 0x803, ~0x10, 0x00);
268
269 /* DIF in reset? */
270 cx25840_write(client, 0x398, 0);
271
272 /* Trust the default xtal, no division */
273 /* This changes for the cx23888 products */
274 cx25840_write(client, 0x2, 0x76);
275
276 /* Bring down the regulator for AUX clk */
277 cx25840_write(client, 0x1, 0x40);
278
279 /* Sys PLL frac */
280 cx25840_write4(client, 0x11c, 0x01d1744c);
281
282 /* Sys PLL int */
283 cx25840_write4(client, 0x118, 0x00000416);
284
285 /* Disable DIF bypass */
286 cx25840_write4(client, 0x33c, 0x00000001);
287
288 /* DIF Src phase inc */
289 cx25840_write4(client, 0x340, 0x0df7df83);
290
291 /* Vid PLL frac */
292 cx25840_write4(client, 0x10c, 0x01b6db7b);
293
294 /* Vid PLL int */
295 cx25840_write4(client, 0x108, 0x00000512);
296
297 /* Luma */
298 cx25840_write4(client, 0x414, 0x00107d12);
299
300 /* Chroma */
301 cx25840_write4(client, 0x420, 0x3d008282);
302
303 /* Aux PLL frac */
304 cx25840_write4(client, 0x114, 0x017dbf48);
305
306 /* Aux PLL int */
307 cx25840_write4(client, 0x110, 0x000a030e);
308
309 /* ADC2 input select */
310 cx25840_write(client, 0x102, 0x10);
311
312 /* VIN1 & VIN5 */
313 cx25840_write(client, 0x103, 0x11);
314
315 /* Enable format auto detect */
316 cx25840_write(client, 0x400, 0);
317 /* Fast subchroma lock */
318 /* White crush, Chroma AGC & Chroma Killer enabled */
319 cx25840_write(client, 0x401, 0xe8);
320
321 /* Select AFE clock pad output source */
322 cx25840_write(client, 0x144, 0x05);
323
324 /* Do the firmware load in a work handler to prevent.
325 Otherwise the kernel is blocked waiting for the
326 bit-banging i2c interface to finish uploading the
327 firmware. */
328 INIT_WORK(&state->fw_work, cx25840_work_handler);
329 init_waitqueue_head(&state->fw_wait);
330 q = create_singlethread_workqueue("cx25840_fw");
331 prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
332 queue_work(q, &state->fw_work);
333 schedule();
334 finish_wait(&state->fw_wait, &wait);
335 destroy_workqueue(q);
336
337 cx25840_std_setup(client);
338
339 /* (re)set input */
340 set_input(client, state->vid_input, state->aud_input);
341
342 /* start microcontroller */
343 cx25840_and_or(client, 0x803, ~0x10, 0x10);
344 }
345
346 /* ----------------------------------------------------------------------- */
347
348 void cx25840_std_setup(struct i2c_client *client)
349 {
350 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
351 v4l2_std_id std = state->std;
352 int hblank, hactive, burst, vblank, vactive, sc;
353 int vblank656, src_decimation;
354 int luma_lpf, uv_lpf, comb;
355 u32 pll_int, pll_frac, pll_post;
356
357 /* datasheet startup, step 8d */
358 if (std & ~V4L2_STD_NTSC)
359 cx25840_write(client, 0x49f, 0x11);
360 else
361 cx25840_write(client, 0x49f, 0x14);
362
363 if (std & V4L2_STD_625_50) {
364 hblank = 132;
365 hactive = 720;
366 burst = 93;
367 vblank = 36;
368 vactive = 580;
369 vblank656 = 40;
370 src_decimation = 0x21f;
371 luma_lpf = 2;
372
373 if (std & V4L2_STD_SECAM) {
374 uv_lpf = 0;
375 comb = 0;
376 sc = 0x0a425f;
377 } else if (std == V4L2_STD_PAL_Nc) {
378 uv_lpf = 1;
379 comb = 0x20;
380 sc = 556453;
381 } else {
382 uv_lpf = 1;
383 comb = 0x20;
384 sc = 688739;
385 }
386 } else {
387 hactive = 720;
388 hblank = 122;
389 vactive = 487;
390 luma_lpf = 1;
391 uv_lpf = 1;
392
393 src_decimation = 0x21f;
394 if (std == V4L2_STD_PAL_60) {
395 vblank = 26;
396 vblank656 = 26;
397 burst = 0x5b;
398 luma_lpf = 2;
399 comb = 0x20;
400 sc = 688739;
401 } else if (std == V4L2_STD_PAL_M) {
402 vblank = 20;
403 vblank656 = 24;
404 burst = 0x61;
405 comb = 0x20;
406 sc = 555452;
407 } else {
408 vblank = 26;
409 vblank656 = 26;
410 burst = 0x5b;
411 comb = 0x66;
412 sc = 556063;
413 }
414 }
415
416 /* DEBUG: Displays configured PLL frequency */
417 pll_int = cx25840_read(client, 0x108);
418 pll_frac = cx25840_read4(client, 0x10c) & 0x1ffffff;
419 pll_post = cx25840_read(client, 0x109);
420 v4l_dbg(1, cx25840_debug, client,
421 "PLL regs = int: %u, frac: %u, post: %u\n",
422 pll_int, pll_frac, pll_post);
423
424 if (pll_post) {
425 int fin, fsc;
426 int pll = (28636363L * ((((u64)pll_int) << 25L) + pll_frac)) >> 25L;
427
428 pll /= pll_post;
429 v4l_dbg(1, cx25840_debug, client, "PLL = %d.%06d MHz\n",
430 pll / 1000000, pll % 1000000);
431 v4l_dbg(1, cx25840_debug, client, "PLL/8 = %d.%06d MHz\n",
432 pll / 8000000, (pll / 8) % 1000000);
433
434 fin = ((u64)src_decimation * pll) >> 12;
435 v4l_dbg(1, cx25840_debug, client,
436 "ADC Sampling freq = %d.%06d MHz\n",
437 fin / 1000000, fin % 1000000);
438
439 fsc = (((u64)sc) * pll) >> 24L;
440 v4l_dbg(1, cx25840_debug, client,
441 "Chroma sub-carrier freq = %d.%06d MHz\n",
442 fsc / 1000000, fsc % 1000000);
443
444 v4l_dbg(1, cx25840_debug, client, "hblank %i, hactive %i, "
445 "vblank %i, vactive %i, vblank656 %i, src_dec %i, "
446 "burst 0x%02x, luma_lpf %i, uv_lpf %i, comb 0x%02x, "
447 "sc 0x%06x\n",
448 hblank, hactive, vblank, vactive, vblank656,
449 src_decimation, burst, luma_lpf, uv_lpf, comb, sc);
450 }
451
452 /* Sets horizontal blanking delay and active lines */
453 cx25840_write(client, 0x470, hblank);
454 cx25840_write(client, 0x471,
455 0xff & (((hblank >> 8) & 0x3) | (hactive << 4)));
456 cx25840_write(client, 0x472, hactive >> 4);
457
458 /* Sets burst gate delay */
459 cx25840_write(client, 0x473, burst);
460
461 /* Sets vertical blanking delay and active duration */
462 cx25840_write(client, 0x474, vblank);
463 cx25840_write(client, 0x475,
464 0xff & (((vblank >> 8) & 0x3) | (vactive << 4)));
465 cx25840_write(client, 0x476, vactive >> 4);
466 cx25840_write(client, 0x477, vblank656);
467
468 /* Sets src decimation rate */
469 cx25840_write(client, 0x478, 0xff & src_decimation);
470 cx25840_write(client, 0x479, 0xff & (src_decimation >> 8));
471
472 /* Sets Luma and UV Low pass filters */
473 cx25840_write(client, 0x47a, luma_lpf << 6 | ((uv_lpf << 4) & 0x30));
474
475 /* Enables comb filters */
476 cx25840_write(client, 0x47b, comb);
477
478 /* Sets SC Step*/
479 cx25840_write(client, 0x47c, sc);
480 cx25840_write(client, 0x47d, 0xff & sc >> 8);
481 cx25840_write(client, 0x47e, 0xff & sc >> 16);
482
483 /* Sets VBI parameters */
484 if (std & V4L2_STD_625_50) {
485 cx25840_write(client, 0x47f, 0x01);
486 state->vbi_line_offset = 5;
487 } else {
488 cx25840_write(client, 0x47f, 0x00);
489 state->vbi_line_offset = 8;
490 }
491 }
492
493 /* ----------------------------------------------------------------------- */
494
495 static void input_change(struct i2c_client *client)
496 {
497 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
498 v4l2_std_id std = state->std;
499
500 /* Follow step 8c and 8d of section 3.16 in the cx25840 datasheet */
501 if (std & V4L2_STD_SECAM) {
502 cx25840_write(client, 0x402, 0);
503 }
504 else {
505 cx25840_write(client, 0x402, 0x04);
506 cx25840_write(client, 0x49f, (std & V4L2_STD_NTSC) ? 0x14 : 0x11);
507 }
508 cx25840_and_or(client, 0x401, ~0x60, 0);
509 cx25840_and_or(client, 0x401, ~0x60, 0x60);
510 cx25840_and_or(client, 0x810, ~0x01, 1);
511
512 if (state->radio) {
513 cx25840_write(client, 0x808, 0xf9);
514 cx25840_write(client, 0x80b, 0x00);
515 }
516 else if (std & V4L2_STD_525_60) {
517 /* Certain Hauppauge PVR150 models have a hardware bug
518 that causes audio to drop out. For these models the
519 audio standard must be set explicitly.
520 To be precise: it affects cards with tuner models
521 85, 99 and 112 (model numbers from tveeprom). */
522 int hw_fix = state->pvr150_workaround;
523
524 if (std == V4L2_STD_NTSC_M_JP) {
525 /* Japan uses EIAJ audio standard */
526 cx25840_write(client, 0x808, hw_fix ? 0x2f : 0xf7);
527 } else if (std == V4L2_STD_NTSC_M_KR) {
528 /* South Korea uses A2 audio standard */
529 cx25840_write(client, 0x808, hw_fix ? 0x3f : 0xf8);
530 } else {
531 /* Others use the BTSC audio standard */
532 cx25840_write(client, 0x808, hw_fix ? 0x1f : 0xf6);
533 }
534 cx25840_write(client, 0x80b, 0x00);
535 } else if (std & V4L2_STD_PAL) {
536 /* Follow tuner change procedure for PAL */
537 cx25840_write(client, 0x808, 0xff);
538 cx25840_write(client, 0x80b, 0x10);
539 } else if (std & V4L2_STD_SECAM) {
540 /* Select autodetect for SECAM */
541 cx25840_write(client, 0x808, 0xff);
542 cx25840_write(client, 0x80b, 0x10);
543 }
544
545 cx25840_and_or(client, 0x810, ~0x01, 0);
546 }
547
548 static int set_input(struct i2c_client *client, enum cx25840_video_input vid_input,
549 enum cx25840_audio_input aud_input)
550 {
551 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
552 u8 is_composite = (vid_input >= CX25840_COMPOSITE1 &&
553 vid_input <= CX25840_COMPOSITE8);
554 u8 reg;
555
556 v4l_dbg(1, cx25840_debug, client,
557 "decoder set video input %d, audio input %d\n",
558 vid_input, aud_input);
559
560 if (vid_input >= CX25840_VIN1_CH1) {
561 v4l_dbg(1, cx25840_debug, client, "vid_input 0x%x\n",
562 vid_input);
563 reg = vid_input & 0xff;
564 if ((vid_input & CX25840_SVIDEO_ON) == CX25840_SVIDEO_ON)
565 is_composite = 0;
566 else
567 is_composite = 1;
568
569 v4l_dbg(1, cx25840_debug, client, "mux cfg 0x%x comp=%d\n",
570 reg, is_composite);
571 } else
572 if (is_composite) {
573 reg = 0xf0 + (vid_input - CX25840_COMPOSITE1);
574 } else {
575 int luma = vid_input & 0xf0;
576 int chroma = vid_input & 0xf00;
577
578 if ((vid_input & ~0xff0) ||
579 luma < CX25840_SVIDEO_LUMA1 || luma > CX25840_SVIDEO_LUMA8 ||
580 chroma < CX25840_SVIDEO_CHROMA4 || chroma > CX25840_SVIDEO_CHROMA8) {
581 v4l_err(client, "0x%04x is not a valid video input!\n",
582 vid_input);
583 return -EINVAL;
584 }
585 reg = 0xf0 + ((luma - CX25840_SVIDEO_LUMA1) >> 4);
586 if (chroma >= CX25840_SVIDEO_CHROMA7) {
587 reg &= 0x3f;
588 reg |= (chroma - CX25840_SVIDEO_CHROMA7) >> 2;
589 } else {
590 reg &= 0xcf;
591 reg |= (chroma - CX25840_SVIDEO_CHROMA4) >> 4;
592 }
593 }
594
595 /* The caller has previously prepared the correct routing
596 * configuration in reg (for the cx23885) so we have no
597 * need to attempt to flip bits for earlier av decoders.
598 */
599 if (!state->is_cx23885) {
600 switch (aud_input) {
601 case CX25840_AUDIO_SERIAL:
602 /* do nothing, use serial audio input */
603 break;
604 case CX25840_AUDIO4: reg &= ~0x30; break;
605 case CX25840_AUDIO5: reg &= ~0x30; reg |= 0x10; break;
606 case CX25840_AUDIO6: reg &= ~0x30; reg |= 0x20; break;
607 case CX25840_AUDIO7: reg &= ~0xc0; break;
608 case CX25840_AUDIO8: reg &= ~0xc0; reg |= 0x40; break;
609
610 default:
611 v4l_err(client, "0x%04x is not a valid audio input!\n",
612 aud_input);
613 return -EINVAL;
614 }
615 }
616
617 cx25840_write(client, 0x103, reg);
618
619 /* Set INPUT_MODE to Composite (0) or S-Video (1) */
620 cx25840_and_or(client, 0x401, ~0x6, is_composite ? 0 : 0x02);
621
622 if (!state->is_cx23885) {
623 /* Set CH_SEL_ADC2 to 1 if input comes from CH3 */
624 cx25840_and_or(client, 0x102, ~0x2, (reg & 0x80) == 0 ? 2 : 0);
625 /* Set DUAL_MODE_ADC2 to 1 if input comes from both CH2&CH3 */
626 if ((reg & 0xc0) != 0xc0 && (reg & 0x30) != 0x30)
627 cx25840_and_or(client, 0x102, ~0x4, 4);
628 else
629 cx25840_and_or(client, 0x102, ~0x4, 0);
630 } else {
631 if (is_composite)
632 /* ADC2 input select channel 2 */
633 cx25840_and_or(client, 0x102, ~0x2, 0);
634 else
635 /* ADC2 input select channel 3 */
636 cx25840_and_or(client, 0x102, ~0x2, 2);
637 }
638
639 state->vid_input = vid_input;
640 state->aud_input = aud_input;
641 if (!state->is_cx25836) {
642 cx25840_audio_set_path(client);
643 input_change(client);
644 }
645
646 if (state->is_cx23885) {
647 /* Audio channel 1 src : Parallel 1 */
648 cx25840_write(client, 0x124, 0x03);
649
650 /* Select AFE clock pad output source */
651 cx25840_write(client, 0x144, 0x05);
652
653 /* I2S_IN_CTL: I2S_IN_SONY_MODE, LEFT SAMPLE on WS=1 */
654 cx25840_write(client, 0x914, 0xa0);
655
656 /* I2S_OUT_CTL:
657 * I2S_IN_SONY_MODE, LEFT SAMPLE on WS=1
658 * I2S_OUT_MASTER_MODE = Master
659 */
660 cx25840_write(client, 0x918, 0xa0);
661 cx25840_write(client, 0x919, 0x01);
662 }
663
664 return 0;
665 }
666
667 /* ----------------------------------------------------------------------- */
668
669 static int set_v4lstd(struct i2c_client *client)
670 {
671 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
672 u8 fmt = 0; /* zero is autodetect */
673 u8 pal_m = 0;
674
675 /* First tests should be against specific std */
676 if (state->std == V4L2_STD_NTSC_M_JP) {
677 fmt = 0x2;
678 } else if (state->std == V4L2_STD_NTSC_443) {
679 fmt = 0x3;
680 } else if (state->std == V4L2_STD_PAL_M) {
681 pal_m = 1;
682 fmt = 0x5;
683 } else if (state->std == V4L2_STD_PAL_N) {
684 fmt = 0x6;
685 } else if (state->std == V4L2_STD_PAL_Nc) {
686 fmt = 0x7;
687 } else if (state->std == V4L2_STD_PAL_60) {
688 fmt = 0x8;
689 } else {
690 /* Then, test against generic ones */
691 if (state->std & V4L2_STD_NTSC)
692 fmt = 0x1;
693 else if (state->std & V4L2_STD_PAL)
694 fmt = 0x4;
695 else if (state->std & V4L2_STD_SECAM)
696 fmt = 0xc;
697 }
698
699 v4l_dbg(1, cx25840_debug, client, "changing video std to fmt %i\n",fmt);
700
701 /* Follow step 9 of section 3.16 in the cx25840 datasheet.
702 Without this PAL may display a vertical ghosting effect.
703 This happens for example with the Yuan MPC622. */
704 if (fmt >= 4 && fmt < 8) {
705 /* Set format to NTSC-M */
706 cx25840_and_or(client, 0x400, ~0xf, 1);
707 /* Turn off LCOMB */
708 cx25840_and_or(client, 0x47b, ~6, 0);
709 }
710 cx25840_and_or(client, 0x400, ~0xf, fmt);
711 cx25840_and_or(client, 0x403, ~0x3, pal_m);
712 cx25840_std_setup(client);
713 if (!state->is_cx25836)
714 input_change(client);
715 return 0;
716 }
717
718 /* ----------------------------------------------------------------------- */
719
720 static int cx25840_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
721 {
722 struct cx25840_state *state = to_state(sd);
723 struct i2c_client *client = v4l2_get_subdevdata(sd);
724
725 switch (ctrl->id) {
726 case CX25840_CID_ENABLE_PVR150_WORKAROUND:
727 state->pvr150_workaround = ctrl->value;
728 set_input(client, state->vid_input, state->aud_input);
729 break;
730
731 case V4L2_CID_BRIGHTNESS:
732 if (ctrl->value < 0 || ctrl->value > 255) {
733 v4l_err(client, "invalid brightness setting %d\n",
734 ctrl->value);
735 return -ERANGE;
736 }
737
738 cx25840_write(client, 0x414, ctrl->value - 128);
739 break;
740
741 case V4L2_CID_CONTRAST:
742 if (ctrl->value < 0 || ctrl->value > 127) {
743 v4l_err(client, "invalid contrast setting %d\n",
744 ctrl->value);
745 return -ERANGE;
746 }
747
748 cx25840_write(client, 0x415, ctrl->value << 1);
749 break;
750
751 case V4L2_CID_SATURATION:
752 if (ctrl->value < 0 || ctrl->value > 127) {
753 v4l_err(client, "invalid saturation setting %d\n",
754 ctrl->value);
755 return -ERANGE;
756 }
757
758 cx25840_write(client, 0x420, ctrl->value << 1);
759 cx25840_write(client, 0x421, ctrl->value << 1);
760 break;
761
762 case V4L2_CID_HUE:
763 if (ctrl->value < -128 || ctrl->value > 127) {
764 v4l_err(client, "invalid hue setting %d\n", ctrl->value);
765 return -ERANGE;
766 }
767
768 cx25840_write(client, 0x422, ctrl->value);
769 break;
770
771 case V4L2_CID_AUDIO_VOLUME:
772 case V4L2_CID_AUDIO_BASS:
773 case V4L2_CID_AUDIO_TREBLE:
774 case V4L2_CID_AUDIO_BALANCE:
775 case V4L2_CID_AUDIO_MUTE:
776 if (state->is_cx25836)
777 return -EINVAL;
778 return cx25840_audio_s_ctrl(sd, ctrl);
779
780 default:
781 return -EINVAL;
782 }
783
784 return 0;
785 }
786
787 static int cx25840_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
788 {
789 struct cx25840_state *state = to_state(sd);
790 struct i2c_client *client = v4l2_get_subdevdata(sd);
791
792 switch (ctrl->id) {
793 case CX25840_CID_ENABLE_PVR150_WORKAROUND:
794 ctrl->value = state->pvr150_workaround;
795 break;
796 case V4L2_CID_BRIGHTNESS:
797 ctrl->value = (s8)cx25840_read(client, 0x414) + 128;
798 break;
799 case V4L2_CID_CONTRAST:
800 ctrl->value = cx25840_read(client, 0x415) >> 1;
801 break;
802 case V4L2_CID_SATURATION:
803 ctrl->value = cx25840_read(client, 0x420) >> 1;
804 break;
805 case V4L2_CID_HUE:
806 ctrl->value = (s8)cx25840_read(client, 0x422);
807 break;
808 case V4L2_CID_AUDIO_VOLUME:
809 case V4L2_CID_AUDIO_BASS:
810 case V4L2_CID_AUDIO_TREBLE:
811 case V4L2_CID_AUDIO_BALANCE:
812 case V4L2_CID_AUDIO_MUTE:
813 if (state->is_cx25836)
814 return -EINVAL;
815 return cx25840_audio_g_ctrl(sd, ctrl);
816 default:
817 return -EINVAL;
818 }
819
820 return 0;
821 }
822
823 /* ----------------------------------------------------------------------- */
824
825 static int cx25840_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
826 {
827 switch (fmt->type) {
828 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
829 return cx25840_vbi_g_fmt(sd, fmt);
830 default:
831 return -EINVAL;
832 }
833 return 0;
834 }
835
836 static int cx25840_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
837 {
838 struct cx25840_state *state = to_state(sd);
839 struct i2c_client *client = v4l2_get_subdevdata(sd);
840 struct v4l2_pix_format *pix;
841 int HSC, VSC, Vsrc, Hsrc, filter, Vlines;
842 int is_50Hz = !(state->std & V4L2_STD_525_60);
843
844 switch (fmt->type) {
845 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
846 pix = &(fmt->fmt.pix);
847
848 Vsrc = (cx25840_read(client, 0x476) & 0x3f) << 4;
849 Vsrc |= (cx25840_read(client, 0x475) & 0xf0) >> 4;
850
851 Hsrc = (cx25840_read(client, 0x472) & 0x3f) << 4;
852 Hsrc |= (cx25840_read(client, 0x471) & 0xf0) >> 4;
853
854 Vlines = pix->height + (is_50Hz ? 4 : 7);
855
856 if ((pix->width * 16 < Hsrc) || (Hsrc < pix->width) ||
857 (Vlines * 8 < Vsrc) || (Vsrc < Vlines)) {
858 v4l_err(client, "%dx%d is not a valid size!\n",
859 pix->width, pix->height);
860 return -ERANGE;
861 }
862
863 HSC = (Hsrc * (1 << 20)) / pix->width - (1 << 20);
864 VSC = (1 << 16) - (Vsrc * (1 << 9) / Vlines - (1 << 9));
865 VSC &= 0x1fff;
866
867 if (pix->width >= 385)
868 filter = 0;
869 else if (pix->width > 192)
870 filter = 1;
871 else if (pix->width > 96)
872 filter = 2;
873 else
874 filter = 3;
875
876 v4l_dbg(1, cx25840_debug, client, "decoder set size %dx%d -> scale %ux%u\n",
877 pix->width, pix->height, HSC, VSC);
878
879 /* HSCALE=HSC */
880 cx25840_write(client, 0x418, HSC & 0xff);
881 cx25840_write(client, 0x419, (HSC >> 8) & 0xff);
882 cx25840_write(client, 0x41a, HSC >> 16);
883 /* VSCALE=VSC */
884 cx25840_write(client, 0x41c, VSC & 0xff);
885 cx25840_write(client, 0x41d, VSC >> 8);
886 /* VS_INTRLACE=1 VFILT=filter */
887 cx25840_write(client, 0x41e, 0x8 | filter);
888 break;
889
890 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
891 return cx25840_vbi_s_fmt(sd, fmt);
892
893 case V4L2_BUF_TYPE_VBI_CAPTURE:
894 return cx25840_vbi_s_fmt(sd, fmt);
895
896 default:
897 return -EINVAL;
898 }
899
900 return 0;
901 }
902
903 /* ----------------------------------------------------------------------- */
904
905 static void log_video_status(struct i2c_client *client)
906 {
907 static const char *const fmt_strs[] = {
908 "0x0",
909 "NTSC-M", "NTSC-J", "NTSC-4.43",
910 "PAL-BDGHI", "PAL-M", "PAL-N", "PAL-Nc", "PAL-60",
911 "0x9", "0xA", "0xB",
912 "SECAM",
913 "0xD", "0xE", "0xF"
914 };
915
916 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
917 u8 vidfmt_sel = cx25840_read(client, 0x400) & 0xf;
918 u8 gen_stat1 = cx25840_read(client, 0x40d);
919 u8 gen_stat2 = cx25840_read(client, 0x40e);
920 int vid_input = state->vid_input;
921
922 v4l_info(client, "Video signal: %spresent\n",
923 (gen_stat2 & 0x20) ? "" : "not ");
924 v4l_info(client, "Detected format: %s\n",
925 fmt_strs[gen_stat1 & 0xf]);
926
927 v4l_info(client, "Specified standard: %s\n",
928 vidfmt_sel ? fmt_strs[vidfmt_sel] : "automatic detection");
929
930 if (vid_input >= CX25840_COMPOSITE1 &&
931 vid_input <= CX25840_COMPOSITE8) {
932 v4l_info(client, "Specified video input: Composite %d\n",
933 vid_input - CX25840_COMPOSITE1 + 1);
934 } else {
935 v4l_info(client, "Specified video input: S-Video (Luma In%d, Chroma In%d)\n",
936 (vid_input & 0xf0) >> 4, (vid_input & 0xf00) >> 8);
937 }
938
939 v4l_info(client, "Specified audioclock freq: %d Hz\n", state->audclk_freq);
940 }
941
942 /* ----------------------------------------------------------------------- */
943
944 static void log_audio_status(struct i2c_client *client)
945 {
946 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
947 u8 download_ctl = cx25840_read(client, 0x803);
948 u8 mod_det_stat0 = cx25840_read(client, 0x804);
949 u8 mod_det_stat1 = cx25840_read(client, 0x805);
950 u8 audio_config = cx25840_read(client, 0x808);
951 u8 pref_mode = cx25840_read(client, 0x809);
952 u8 afc0 = cx25840_read(client, 0x80b);
953 u8 mute_ctl = cx25840_read(client, 0x8d3);
954 int aud_input = state->aud_input;
955 char *p;
956
957 switch (mod_det_stat0) {
958 case 0x00: p = "mono"; break;
959 case 0x01: p = "stereo"; break;
960 case 0x02: p = "dual"; break;
961 case 0x04: p = "tri"; break;
962 case 0x10: p = "mono with SAP"; break;
963 case 0x11: p = "stereo with SAP"; break;
964 case 0x12: p = "dual with SAP"; break;
965 case 0x14: p = "tri with SAP"; break;
966 case 0xfe: p = "forced mode"; break;
967 default: p = "not defined";
968 }
969 v4l_info(client, "Detected audio mode: %s\n", p);
970
971 switch (mod_det_stat1) {
972 case 0x00: p = "not defined"; break;
973 case 0x01: p = "EIAJ"; break;
974 case 0x02: p = "A2-M"; break;
975 case 0x03: p = "A2-BG"; break;
976 case 0x04: p = "A2-DK1"; break;
977 case 0x05: p = "A2-DK2"; break;
978 case 0x06: p = "A2-DK3"; break;
979 case 0x07: p = "A1 (6.0 MHz FM Mono)"; break;
980 case 0x08: p = "AM-L"; break;
981 case 0x09: p = "NICAM-BG"; break;
982 case 0x0a: p = "NICAM-DK"; break;
983 case 0x0b: p = "NICAM-I"; break;
984 case 0x0c: p = "NICAM-L"; break;
985 case 0x0d: p = "BTSC/EIAJ/A2-M Mono (4.5 MHz FMMono)"; break;
986 case 0x0e: p = "IF FM Radio"; break;
987 case 0x0f: p = "BTSC"; break;
988 case 0x10: p = "high-deviation FM"; break;
989 case 0x11: p = "very high-deviation FM"; break;
990 case 0xfd: p = "unknown audio standard"; break;
991 case 0xfe: p = "forced audio standard"; break;
992 case 0xff: p = "no detected audio standard"; break;
993 default: p = "not defined";
994 }
995 v4l_info(client, "Detected audio standard: %s\n", p);
996 v4l_info(client, "Audio muted: %s\n",
997 (state->unmute_volume >= 0) ? "yes" : "no");
998 v4l_info(client, "Audio microcontroller: %s\n",
999 (download_ctl & 0x10) ?
1000 ((mute_ctl & 0x2) ? "detecting" : "running") : "stopped");
1001
1002 switch (audio_config >> 4) {
1003 case 0x00: p = "undefined"; break;
1004 case 0x01: p = "BTSC"; break;
1005 case 0x02: p = "EIAJ"; break;
1006 case 0x03: p = "A2-M"; break;
1007 case 0x04: p = "A2-BG"; break;
1008 case 0x05: p = "A2-DK1"; break;
1009 case 0x06: p = "A2-DK2"; break;
1010 case 0x07: p = "A2-DK3"; break;
1011 case 0x08: p = "A1 (6.0 MHz FM Mono)"; break;
1012 case 0x09: p = "AM-L"; break;
1013 case 0x0a: p = "NICAM-BG"; break;
1014 case 0x0b: p = "NICAM-DK"; break;
1015 case 0x0c: p = "NICAM-I"; break;
1016 case 0x0d: p = "NICAM-L"; break;
1017 case 0x0e: p = "FM radio"; break;
1018 case 0x0f: p = "automatic detection"; break;
1019 default: p = "undefined";
1020 }
1021 v4l_info(client, "Configured audio standard: %s\n", p);
1022
1023 if ((audio_config >> 4) < 0xF) {
1024 switch (audio_config & 0xF) {
1025 case 0x00: p = "MONO1 (LANGUAGE A/Mono L+R channel for BTSC, EIAJ, A2)"; break;
1026 case 0x01: p = "MONO2 (LANGUAGE B)"; break;
1027 case 0x02: p = "MONO3 (STEREO forced MONO)"; break;
1028 case 0x03: p = "MONO4 (NICAM ANALOG-Language C/Analog Fallback)"; break;
1029 case 0x04: p = "STEREO"; break;
1030 case 0x05: p = "DUAL1 (AB)"; break;
1031 case 0x06: p = "DUAL2 (AC) (FM)"; break;
1032 case 0x07: p = "DUAL3 (BC) (FM)"; break;
1033 case 0x08: p = "DUAL4 (AC) (AM)"; break;
1034 case 0x09: p = "DUAL5 (BC) (AM)"; break;
1035 case 0x0a: p = "SAP"; break;
1036 default: p = "undefined";
1037 }
1038 v4l_info(client, "Configured audio mode: %s\n", p);
1039 } else {
1040 switch (audio_config & 0xF) {
1041 case 0x00: p = "BG"; break;
1042 case 0x01: p = "DK1"; break;
1043 case 0x02: p = "DK2"; break;
1044 case 0x03: p = "DK3"; break;
1045 case 0x04: p = "I"; break;
1046 case 0x05: p = "L"; break;
1047 case 0x06: p = "BTSC"; break;
1048 case 0x07: p = "EIAJ"; break;
1049 case 0x08: p = "A2-M"; break;
1050 case 0x09: p = "FM Radio"; break;
1051 case 0x0f: p = "automatic standard and mode detection"; break;
1052 default: p = "undefined";
1053 }
1054 v4l_info(client, "Configured audio system: %s\n", p);
1055 }
1056
1057 if (aud_input) {
1058 v4l_info(client, "Specified audio input: Tuner (In%d)\n", aud_input);
1059 } else {
1060 v4l_info(client, "Specified audio input: External\n");
1061 }
1062
1063 switch (pref_mode & 0xf) {
1064 case 0: p = "mono/language A"; break;
1065 case 1: p = "language B"; break;
1066 case 2: p = "language C"; break;
1067 case 3: p = "analog fallback"; break;
1068 case 4: p = "stereo"; break;
1069 case 5: p = "language AC"; break;
1070 case 6: p = "language BC"; break;
1071 case 7: p = "language AB"; break;
1072 default: p = "undefined";
1073 }
1074 v4l_info(client, "Preferred audio mode: %s\n", p);
1075
1076 if ((audio_config & 0xf) == 0xf) {
1077 switch ((afc0 >> 3) & 0x3) {
1078 case 0: p = "system DK"; break;
1079 case 1: p = "system L"; break;
1080 case 2: p = "autodetect"; break;
1081 default: p = "undefined";
1082 }
1083 v4l_info(client, "Selected 65 MHz format: %s\n", p);
1084
1085 switch (afc0 & 0x7) {
1086 case 0: p = "chroma"; break;
1087 case 1: p = "BTSC"; break;
1088 case 2: p = "EIAJ"; break;
1089 case 3: p = "A2-M"; break;
1090 case 4: p = "autodetect"; break;
1091 default: p = "undefined";
1092 }
1093 v4l_info(client, "Selected 45 MHz format: %s\n", p);
1094 }
1095 }
1096
1097 /* ----------------------------------------------------------------------- */
1098
1099 /* This init operation must be called to load the driver's firmware.
1100 Without this the audio standard detection will fail and you will
1101 only get mono.
1102
1103 Since loading the firmware is often problematic when the driver is
1104 compiled into the kernel I recommend postponing calling this function
1105 until the first open of the video device. Another reason for
1106 postponing it is that loading this firmware takes a long time (seconds)
1107 due to the slow i2c bus speed. So it will speed up the boot process if
1108 you can avoid loading the fw as long as the video device isn't used. */
1109 static int cx25840_init(struct v4l2_subdev *sd, u32 val)
1110 {
1111 struct cx25840_state *state = to_state(sd);
1112 struct i2c_client *client = v4l2_get_subdevdata(sd);
1113
1114 if (!state->is_initialized) {
1115 /* initialize on first use */
1116 state->is_initialized = 1;
1117 if (state->is_cx25836)
1118 cx25836_initialize(client);
1119 else if (state->is_cx23885)
1120 cx23885_initialize(client);
1121 else
1122 cx25840_initialize(client);
1123 }
1124 return 0;
1125 }
1126
1127 #ifdef CONFIG_VIDEO_ADV_DEBUG
1128 static int cx25840_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg)
1129 {
1130 struct i2c_client *client = v4l2_get_subdevdata(sd);
1131
1132 if (!v4l2_chip_match_i2c_client(client, &reg->match))
1133 return -EINVAL;
1134 if (!capable(CAP_SYS_ADMIN))
1135 return -EPERM;
1136 reg->size = 1;
1137 reg->val = cx25840_read(client, reg->reg & 0x0fff);
1138 return 0;
1139 }
1140
1141 static int cx25840_s_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg)
1142 {
1143 struct i2c_client *client = v4l2_get_subdevdata(sd);
1144
1145 if (!v4l2_chip_match_i2c_client(client, &reg->match))
1146 return -EINVAL;
1147 if (!capable(CAP_SYS_ADMIN))
1148 return -EPERM;
1149 cx25840_write(client, reg->reg & 0x0fff, reg->val & 0xff);
1150 return 0;
1151 }
1152 #endif
1153
1154 static int cx25840_s_stream(struct v4l2_subdev *sd, int enable)
1155 {
1156 struct cx25840_state *state = to_state(sd);
1157 struct i2c_client *client = v4l2_get_subdevdata(sd);
1158
1159 v4l_dbg(1, cx25840_debug, client, "%s output\n",
1160 enable ? "enable" : "disable");
1161 if (enable) {
1162 if (state->is_cx23885) {
1163 u8 v = (cx25840_read(client, 0x421) | 0x0b);
1164 cx25840_write(client, 0x421, v);
1165 } else {
1166 cx25840_write(client, 0x115,
1167 state->is_cx25836 ? 0x0c : 0x8c);
1168 cx25840_write(client, 0x116,
1169 state->is_cx25836 ? 0x04 : 0x07);
1170 }
1171 } else {
1172 if (state->is_cx23885) {
1173 u8 v = cx25840_read(client, 0x421) & ~(0x0b);
1174 cx25840_write(client, 0x421, v);
1175 } else {
1176 cx25840_write(client, 0x115, 0x00);
1177 cx25840_write(client, 0x116, 0x00);
1178 }
1179 }
1180 return 0;
1181 }
1182
1183 static int cx25840_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
1184 {
1185 struct cx25840_state *state = to_state(sd);
1186
1187 switch (qc->id) {
1188 case V4L2_CID_BRIGHTNESS:
1189 return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128);
1190 case V4L2_CID_CONTRAST:
1191 case V4L2_CID_SATURATION:
1192 return v4l2_ctrl_query_fill(qc, 0, 127, 1, 64);
1193 case V4L2_CID_HUE:
1194 return v4l2_ctrl_query_fill(qc, -128, 127, 1, 0);
1195 default:
1196 break;
1197 }
1198 if (state->is_cx25836)
1199 return -EINVAL;
1200
1201 switch (qc->id) {
1202 case V4L2_CID_AUDIO_VOLUME:
1203 return v4l2_ctrl_query_fill(qc, 0, 65535,
1204 65535 / 100, state->default_volume);
1205 case V4L2_CID_AUDIO_MUTE:
1206 return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
1207 case V4L2_CID_AUDIO_BALANCE:
1208 case V4L2_CID_AUDIO_BASS:
1209 case V4L2_CID_AUDIO_TREBLE:
1210 return v4l2_ctrl_query_fill(qc, 0, 65535, 65535 / 100, 32768);
1211 default:
1212 return -EINVAL;
1213 }
1214 return -EINVAL;
1215 }
1216
1217 static int cx25840_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
1218 {
1219 struct cx25840_state *state = to_state(sd);
1220 struct i2c_client *client = v4l2_get_subdevdata(sd);
1221
1222 if (state->radio == 0 && state->std == std)
1223 return 0;
1224 state->radio = 0;
1225 state->std = std;
1226 return set_v4lstd(client);
1227 }
1228
1229 static int cx25840_s_radio(struct v4l2_subdev *sd)
1230 {
1231 struct cx25840_state *state = to_state(sd);
1232
1233 state->radio = 1;
1234 return 0;
1235 }
1236
1237 static int cx25840_s_video_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
1238 {
1239 struct cx25840_state *state = to_state(sd);
1240 struct i2c_client *client = v4l2_get_subdevdata(sd);
1241
1242 return set_input(client, route->input, state->aud_input);
1243 }
1244
1245 static int cx25840_s_audio_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
1246 {
1247 struct cx25840_state *state = to_state(sd);
1248 struct i2c_client *client = v4l2_get_subdevdata(sd);
1249
1250 if (state->is_cx25836)
1251 return -EINVAL;
1252 return set_input(client, state->vid_input, route->input);
1253 }
1254
1255 static int cx25840_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *freq)
1256 {
1257 struct cx25840_state *state = to_state(sd);
1258 struct i2c_client *client = v4l2_get_subdevdata(sd);
1259
1260 if (!state->is_cx25836)
1261 input_change(client);
1262 return 0;
1263 }
1264
1265 static int cx25840_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
1266 {
1267 struct cx25840_state *state = to_state(sd);
1268 struct i2c_client *client = v4l2_get_subdevdata(sd);
1269 u8 vpres = cx25840_read(client, 0x40e) & 0x20;
1270 u8 mode;
1271 int val = 0;
1272
1273 if (state->radio)
1274 return 0;
1275
1276 vt->signal = vpres ? 0xffff : 0x0;
1277 if (state->is_cx25836)
1278 return 0;
1279
1280 vt->capability |=
1281 V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 |
1282 V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
1283
1284 mode = cx25840_read(client, 0x804);
1285
1286 /* get rxsubchans and audmode */
1287 if ((mode & 0xf) == 1)
1288 val |= V4L2_TUNER_SUB_STEREO;
1289 else
1290 val |= V4L2_TUNER_SUB_MONO;
1291
1292 if (mode == 2 || mode == 4)
1293 val = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
1294
1295 if (mode & 0x10)
1296 val |= V4L2_TUNER_SUB_SAP;
1297
1298 vt->rxsubchans = val;
1299 vt->audmode = state->audmode;
1300 return 0;
1301 }
1302
1303 static int cx25840_s_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
1304 {
1305 struct cx25840_state *state = to_state(sd);
1306 struct i2c_client *client = v4l2_get_subdevdata(sd);
1307
1308 if (state->radio || state->is_cx25836)
1309 return 0;
1310
1311 switch (vt->audmode) {
1312 case V4L2_TUNER_MODE_MONO:
1313 /* mono -> mono
1314 stereo -> mono
1315 bilingual -> lang1 */
1316 cx25840_and_or(client, 0x809, ~0xf, 0x00);
1317 break;
1318 case V4L2_TUNER_MODE_STEREO:
1319 case V4L2_TUNER_MODE_LANG1:
1320 /* mono -> mono
1321 stereo -> stereo
1322 bilingual -> lang1 */
1323 cx25840_and_or(client, 0x809, ~0xf, 0x04);
1324 break;
1325 case V4L2_TUNER_MODE_LANG1_LANG2:
1326 /* mono -> mono
1327 stereo -> stereo
1328 bilingual -> lang1/lang2 */
1329 cx25840_and_or(client, 0x809, ~0xf, 0x07);
1330 break;
1331 case V4L2_TUNER_MODE_LANG2:
1332 /* mono -> mono
1333 stereo -> stereo
1334 bilingual -> lang2 */
1335 cx25840_and_or(client, 0x809, ~0xf, 0x01);
1336 break;
1337 default:
1338 return -EINVAL;
1339 }
1340 state->audmode = vt->audmode;
1341 return 0;
1342 }
1343
1344 static int cx25840_reset(struct v4l2_subdev *sd, u32 val)
1345 {
1346 struct cx25840_state *state = to_state(sd);
1347 struct i2c_client *client = v4l2_get_subdevdata(sd);
1348
1349 if (state->is_cx25836)
1350 cx25836_initialize(client);
1351 else if (state->is_cx23885)
1352 cx23885_initialize(client);
1353 else
1354 cx25840_initialize(client);
1355 return 0;
1356 }
1357
1358 static int cx25840_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
1359 {
1360 struct cx25840_state *state = to_state(sd);
1361 struct i2c_client *client = v4l2_get_subdevdata(sd);
1362
1363 return v4l2_chip_ident_i2c_client(client, chip, state->id, state->rev);
1364 }
1365
1366 static int cx25840_log_status(struct v4l2_subdev *sd)
1367 {
1368 struct cx25840_state *state = to_state(sd);
1369 struct i2c_client *client = v4l2_get_subdevdata(sd);
1370
1371 log_video_status(client);
1372 if (!state->is_cx25836)
1373 log_audio_status(client);
1374 return 0;
1375 }
1376
1377 /* ----------------------------------------------------------------------- */
1378
1379 static const struct v4l2_subdev_core_ops cx25840_core_ops = {
1380 .log_status = cx25840_log_status,
1381 .g_chip_ident = cx25840_g_chip_ident,
1382 .g_ctrl = cx25840_g_ctrl,
1383 .s_ctrl = cx25840_s_ctrl,
1384 .queryctrl = cx25840_queryctrl,
1385 .reset = cx25840_reset,
1386 .init = cx25840_init,
1387 #ifdef CONFIG_VIDEO_ADV_DEBUG
1388 .g_register = cx25840_g_register,
1389 .s_register = cx25840_s_register,
1390 #endif
1391 };
1392
1393 static const struct v4l2_subdev_tuner_ops cx25840_tuner_ops = {
1394 .s_frequency = cx25840_s_frequency,
1395 .s_std = cx25840_s_std,
1396 .s_radio = cx25840_s_radio,
1397 .g_tuner = cx25840_g_tuner,
1398 .s_tuner = cx25840_s_tuner,
1399 };
1400
1401 static const struct v4l2_subdev_audio_ops cx25840_audio_ops = {
1402 .s_clock_freq = cx25840_s_clock_freq,
1403 .s_routing = cx25840_s_audio_routing,
1404 };
1405
1406 static const struct v4l2_subdev_video_ops cx25840_video_ops = {
1407 .s_routing = cx25840_s_video_routing,
1408 .g_fmt = cx25840_g_fmt,
1409 .s_fmt = cx25840_s_fmt,
1410 .decode_vbi_line = cx25840_decode_vbi_line,
1411 .s_stream = cx25840_s_stream,
1412 };
1413
1414 static const struct v4l2_subdev_ops cx25840_ops = {
1415 .core = &cx25840_core_ops,
1416 .tuner = &cx25840_tuner_ops,
1417 .audio = &cx25840_audio_ops,
1418 .video = &cx25840_video_ops,
1419 };
1420
1421 /* ----------------------------------------------------------------------- */
1422
1423 static int cx25840_probe(struct i2c_client *client,
1424 const struct i2c_device_id *did)
1425 {
1426 struct cx25840_state *state;
1427 struct v4l2_subdev *sd;
1428 u32 id;
1429 u16 device_id;
1430
1431 /* Check if the adapter supports the needed features */
1432 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1433 return -EIO;
1434
1435 v4l_dbg(1, cx25840_debug, client, "detecting cx25840 client on address 0x%x\n", client->addr << 1);
1436
1437 device_id = cx25840_read(client, 0x101) << 8;
1438 device_id |= cx25840_read(client, 0x100);
1439 v4l_dbg(1, cx25840_debug, client, "device_id = 0x%04x\n", device_id);
1440
1441 /* The high byte of the device ID should be
1442 * 0x83 for the cx2583x and 0x84 for the cx2584x */
1443 if ((device_id & 0xff00) == 0x8300) {
1444 id = V4L2_IDENT_CX25836 + ((device_id >> 4) & 0xf) - 6;
1445 }
1446 else if ((device_id & 0xff00) == 0x8400) {
1447 id = V4L2_IDENT_CX25840 + ((device_id >> 4) & 0xf);
1448 } else if (device_id == 0x0000) {
1449 id = V4L2_IDENT_CX25836 + ((device_id >> 4) & 0xf) - 6;
1450 } else if (device_id == 0x1313) {
1451 id = V4L2_IDENT_CX25836 + ((device_id >> 4) & 0xf) - 6;
1452 }
1453 else {
1454 v4l_dbg(1, cx25840_debug, client, "cx25840 not found\n");
1455 return -ENODEV;
1456 }
1457
1458 state = kzalloc(sizeof(struct cx25840_state), GFP_KERNEL);
1459 if (state == NULL)
1460 return -ENOMEM;
1461
1462 sd = &state->sd;
1463 v4l2_i2c_subdev_init(sd, client, &cx25840_ops);
1464 /* Note: revision '(device_id & 0x0f) == 2' was never built. The
1465 marking skips from 0x1 == 22 to 0x3 == 23. */
1466 v4l_info(client, "cx25%3x-2%x found @ 0x%x (%s)\n",
1467 (device_id & 0xfff0) >> 4,
1468 (device_id & 0x0f) < 3 ? (device_id & 0x0f) + 1 : (device_id & 0x0f),
1469 client->addr << 1, client->adapter->name);
1470
1471 state->c = client;
1472 state->is_cx25836 = ((device_id & 0xff00) == 0x8300);
1473 state->is_cx23885 = (device_id == 0x0000) || (device_id == 0x1313);
1474 state->vid_input = CX25840_COMPOSITE7;
1475 state->aud_input = CX25840_AUDIO8;
1476 state->audclk_freq = 48000;
1477 state->pvr150_workaround = 0;
1478 state->audmode = V4L2_TUNER_MODE_LANG1;
1479 state->unmute_volume = -1;
1480 state->default_volume = 228 - cx25840_read(client, 0x8d4);
1481 state->default_volume = ((state->default_volume / 2) + 23) << 9;
1482 state->vbi_line_offset = 8;
1483 state->id = id;
1484 state->rev = device_id;
1485
1486 if (state->is_cx23885) {
1487 /* Drive GPIO2 direction and values */
1488 cx25840_write(client, 0x160, 0x1d);
1489 cx25840_write(client, 0x164, 0x00);
1490 }
1491
1492 return 0;
1493 }
1494
1495 static int cx25840_remove(struct i2c_client *client)
1496 {
1497 struct v4l2_subdev *sd = i2c_get_clientdata(client);
1498
1499 v4l2_device_unregister_subdev(sd);
1500 kfree(to_state(sd));
1501 return 0;
1502 }
1503
1504 static const struct i2c_device_id cx25840_id[] = {
1505 { "cx25840", 0 },
1506 { }
1507 };
1508 MODULE_DEVICE_TABLE(i2c, cx25840_id);
1509
1510 static struct v4l2_i2c_driver_data v4l2_i2c_data = {
1511 .name = "cx25840",
1512 .probe = cx25840_probe,
1513 .remove = cx25840_remove,
1514 .id_table = cx25840_id,
1515 };