V4L/DVB (13087): cx25840: Improve detection of CX2388[578] A/V cores
[linux-block.git] / drivers / media / video / cx25840 / cx25840-core.c
CommitLineData
bd985160
HV
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 *
3e3bf277
CN
13 * NTSC sliced VBI support by Christopher Neufeld <television@cneufeld.ca>
14 * with additional fixes by Hans Verkuil <hverkuil@xs4all.nl>.
15 *
6d897616 16 * CX23885 support by Steven Toth <stoth@linuxtv.org>.
f234081b 17 *
bd985160
HV
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>
f61b48f7 39#include <linux/delay.h>
bd985160 40#include <media/v4l2-common.h>
3434eb7e 41#include <media/v4l2-chip-ident.h>
b6198ade 42#include <media/v4l2-i2c-drv.h>
31bc09b5 43#include <media/cx25840.h>
bd985160 44
31bc09b5 45#include "cx25840-core.h"
bd985160
HV
46
47MODULE_DESCRIPTION("Conexant CX25840 audio/video decoder driver");
1f4b3365 48MODULE_AUTHOR("Ulf Eklund, Chris Kennedy, Hans Verkuil, Tyler Trafford");
bd985160
HV
49MODULE_LICENSE("GPL");
50
fe0d3dff 51static int cx25840_debug;
bd985160 52
b5fc7144 53module_param_named(debug,cx25840_debug, int, 0644);
bd985160 54
fac9e899 55MODULE_PARM_DESC(debug, "Debugging messages [0=Off (default) 1=On]");
bd985160 56
bd985160
HV
57
58/* ----------------------------------------------------------------------- */
59
60int 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
69int 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;
4a56eb3f
HV
74 buffer[2] = value & 0xff;
75 buffer[3] = (value >> 8) & 0xff;
76 buffer[4] = (value >> 16) & 0xff;
77 buffer[5] = value >> 24;
bd985160
HV
78 return i2c_master_send(client, buffer, 6);
79}
80
81u8 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
96u32 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
17531c16
HV
108 return (buffer[3] << 24) | (buffer[2] << 16) |
109 (buffer[1] << 8) | buffer[0];
bd985160
HV
110}
111
e2b8cf4c 112int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned and_mask,
bd985160
HV
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
a8bbf12a
HV
122static int set_input(struct i2c_client *client, enum cx25840_video_input vid_input,
123 enum cx25840_audio_input aud_input);
bd985160
HV
124
125/* ----------------------------------------------------------------------- */
126
d92c20e0 127static void init_dll1(struct i2c_client *client)
bd985160
HV
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);
38051450 134 udelay(10);
bd985160 135 cx25840_write(client, 0x159, 0xe1);
38051450 136 udelay(10);
bd985160
HV
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
d92c20e0 143static void init_dll2(struct i2c_client *client)
bd985160
HV
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);
38051450 150 udelay(10);
bd985160
HV
151 cx25840_write(client, 0x15d, 0xe1);
152 cx25840_write(client, 0x15d, 0xe0);
153 cx25840_write(client, 0x15d, 0xe1);
154}
155
e2b8cf4c
HV
156static 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. */
38051450 169 udelay(10);
e2b8cf4c
HV
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
21340ae0
HV
181static 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
89fc4eb9 188static void cx25840_initialize(struct i2c_client *client)
bd985160 189{
21340ae0 190 DEFINE_WAIT(wait);
9357b31c 191 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
21340ae0 192 struct workqueue_struct *q;
bd985160
HV
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. */
21340ae0
HV
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
bd985160
HV
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. */
73dcddc5
HV
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() */
bd985160
HV
233 /* 10. */
234 cx25840_write(client, 0x8d3, 0x1f);
235 cx25840_write(client, 0x8e3, 0x03);
236
cb5aa1c6 237 cx25840_std_setup(client);
bd985160
HV
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
a8bbf12a
HV
249 /* (re)set input */
250 set_input(client, state->vid_input, state->aud_input);
bd985160
HV
251
252 /* start microcontroller */
253 cx25840_and_or(client, 0x803, ~0x10, 0x10);
254}
255
f234081b
ST
256static void cx23885_initialize(struct i2c_client *client)
257{
258 DEFINE_WAIT(wait);
9357b31c 259 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
f234081b
ST
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
f3d6f633
ST
324 /* Drive GPIO2 direction and values for HVR1700
325 * where an onboard mux selects the output of demodulator
326 * vs the 417. Failure to set this results in no DTV.
327 * It's safe to set this across all Hauppauge boards
328 * currently, regardless of the board type.
329 */
330 cx25840_write(client, 0x160, 0x1d);
331 cx25840_write(client, 0x164, 0x00);
332
f234081b
ST
333 /* Do the firmware load in a work handler to prevent.
334 Otherwise the kernel is blocked waiting for the
335 bit-banging i2c interface to finish uploading the
336 firmware. */
337 INIT_WORK(&state->fw_work, cx25840_work_handler);
338 init_waitqueue_head(&state->fw_wait);
339 q = create_singlethread_workqueue("cx25840_fw");
340 prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
341 queue_work(q, &state->fw_work);
342 schedule();
343 finish_wait(&state->fw_wait, &wait);
344 destroy_workqueue(q);
345
cb5aa1c6 346 cx25840_std_setup(client);
f234081b
ST
347
348 /* (re)set input */
349 set_input(client, state->vid_input, state->aud_input);
350
351 /* start microcontroller */
352 cx25840_and_or(client, 0x803, ~0x10, 0x10);
353}
354
bd985160
HV
355/* ----------------------------------------------------------------------- */
356
149783b5
SD
357static void cx231xx_initialize(struct i2c_client *client)
358{
359 DEFINE_WAIT(wait);
360 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
361 struct workqueue_struct *q;
362
363 /* Internal Reset */
364 cx25840_and_or(client, 0x102, ~0x01, 0x01);
365 cx25840_and_or(client, 0x102, ~0x01, 0x00);
366
367 /* Stop microcontroller */
368 cx25840_and_or(client, 0x803, ~0x10, 0x00);
369
370 /* DIF in reset? */
371 cx25840_write(client, 0x398, 0);
372
373 /* Trust the default xtal, no division */
374 /* This changes for the cx23888 products */
375 cx25840_write(client, 0x2, 0x76);
376
377 /* Bring down the regulator for AUX clk */
378 cx25840_write(client, 0x1, 0x40);
379
380 /* Disable DIF bypass */
381 cx25840_write4(client, 0x33c, 0x00000001);
382
383 /* DIF Src phase inc */
384 cx25840_write4(client, 0x340, 0x0df7df83);
385
149783b5
SD
386 /* Luma */
387 cx25840_write4(client, 0x414, 0x00107d12);
388
389 /* Chroma */
390 cx25840_write4(client, 0x420, 0x3d008282);
391
149783b5
SD
392 /* ADC2 input select */
393 cx25840_write(client, 0x102, 0x10);
394
395 /* VIN1 & VIN5 */
396 cx25840_write(client, 0x103, 0x11);
397
398 /* Enable format auto detect */
399 cx25840_write(client, 0x400, 0);
400 /* Fast subchroma lock */
401 /* White crush, Chroma AGC & Chroma Killer enabled */
402 cx25840_write(client, 0x401, 0xe8);
403
149783b5
SD
404 /* Do the firmware load in a work handler to prevent.
405 Otherwise the kernel is blocked waiting for the
406 bit-banging i2c interface to finish uploading the
407 firmware. */
408 INIT_WORK(&state->fw_work, cx25840_work_handler);
409 init_waitqueue_head(&state->fw_wait);
410 q = create_singlethread_workqueue("cx25840_fw");
411 prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
412 queue_work(q, &state->fw_work);
413 schedule();
414 finish_wait(&state->fw_wait, &wait);
415 destroy_workqueue(q);
416
417 cx25840_std_setup(client);
418
419 /* (re)set input */
420 set_input(client, state->vid_input, state->aud_input);
421
422 /* start microcontroller */
423 cx25840_and_or(client, 0x803, ~0x10, 0x10);
424}
425
426/* ----------------------------------------------------------------------- */
427
cb5aa1c6
HV
428void cx25840_std_setup(struct i2c_client *client)
429{
9357b31c 430 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
cb5aa1c6
HV
431 v4l2_std_id std = state->std;
432 int hblank, hactive, burst, vblank, vactive, sc;
433 int vblank656, src_decimation;
434 int luma_lpf, uv_lpf, comb;
435 u32 pll_int, pll_frac, pll_post;
436
437 /* datasheet startup, step 8d */
438 if (std & ~V4L2_STD_NTSC)
439 cx25840_write(client, 0x49f, 0x11);
440 else
441 cx25840_write(client, 0x49f, 0x14);
442
443 if (std & V4L2_STD_625_50) {
444 hblank = 132;
445 hactive = 720;
446 burst = 93;
447 vblank = 36;
448 vactive = 580;
449 vblank656 = 40;
450 src_decimation = 0x21f;
451 luma_lpf = 2;
452
453 if (std & V4L2_STD_SECAM) {
454 uv_lpf = 0;
455 comb = 0;
456 sc = 0x0a425f;
457 } else if (std == V4L2_STD_PAL_Nc) {
458 uv_lpf = 1;
459 comb = 0x20;
460 sc = 556453;
461 } else {
462 uv_lpf = 1;
463 comb = 0x20;
464 sc = 688739;
465 }
466 } else {
467 hactive = 720;
468 hblank = 122;
469 vactive = 487;
470 luma_lpf = 1;
471 uv_lpf = 1;
472
473 src_decimation = 0x21f;
474 if (std == V4L2_STD_PAL_60) {
475 vblank = 26;
476 vblank656 = 26;
477 burst = 0x5b;
478 luma_lpf = 2;
479 comb = 0x20;
480 sc = 688739;
481 } else if (std == V4L2_STD_PAL_M) {
482 vblank = 20;
483 vblank656 = 24;
484 burst = 0x61;
485 comb = 0x20;
486 sc = 555452;
487 } else {
488 vblank = 26;
489 vblank656 = 26;
490 burst = 0x5b;
491 comb = 0x66;
492 sc = 556063;
493 }
494 }
495
496 /* DEBUG: Displays configured PLL frequency */
95b14fb2
MCC
497 if (!state->is_cx231xx) {
498 pll_int = cx25840_read(client, 0x108);
499 pll_frac = cx25840_read4(client, 0x10c) & 0x1ffffff;
500 pll_post = cx25840_read(client, 0x109);
cb5aa1c6 501 v4l_dbg(1, cx25840_debug, client,
95b14fb2
MCC
502 "PLL regs = int: %u, frac: %u, post: %u\n",
503 pll_int, pll_frac, pll_post);
504
505 if (pll_post) {
506 int fin, fsc;
507 int pll = (28636363L * ((((u64)pll_int) << 25L) + pll_frac)) >> 25L;
508
509 pll /= pll_post;
510 v4l_dbg(1, cx25840_debug, client, "PLL = %d.%06d MHz\n",
511 pll / 1000000, pll % 1000000);
512 v4l_dbg(1, cx25840_debug, client, "PLL/8 = %d.%06d MHz\n",
513 pll / 8000000, (pll / 8) % 1000000);
514
515 fin = ((u64)src_decimation * pll) >> 12;
516 v4l_dbg(1, cx25840_debug, client,
517 "ADC Sampling freq = %d.%06d MHz\n",
518 fin / 1000000, fin % 1000000);
519
520 fsc = (((u64)sc) * pll) >> 24L;
521 v4l_dbg(1, cx25840_debug, client,
522 "Chroma sub-carrier freq = %d.%06d MHz\n",
523 fsc / 1000000, fsc % 1000000);
524
525 v4l_dbg(1, cx25840_debug, client, "hblank %i, hactive %i, "
526 "vblank %i, vactive %i, vblank656 %i, src_dec %i, "
527 "burst 0x%02x, luma_lpf %i, uv_lpf %i, comb 0x%02x, "
528 "sc 0x%06x\n",
529 hblank, hactive, vblank, vactive, vblank656,
530 src_decimation, burst, luma_lpf, uv_lpf, comb, sc);
531 }
cb5aa1c6
HV
532 }
533
534 /* Sets horizontal blanking delay and active lines */
535 cx25840_write(client, 0x470, hblank);
536 cx25840_write(client, 0x471,
537 0xff & (((hblank >> 8) & 0x3) | (hactive << 4)));
538 cx25840_write(client, 0x472, hactive >> 4);
539
540 /* Sets burst gate delay */
541 cx25840_write(client, 0x473, burst);
542
543 /* Sets vertical blanking delay and active duration */
544 cx25840_write(client, 0x474, vblank);
545 cx25840_write(client, 0x475,
546 0xff & (((vblank >> 8) & 0x3) | (vactive << 4)));
547 cx25840_write(client, 0x476, vactive >> 4);
548 cx25840_write(client, 0x477, vblank656);
549
550 /* Sets src decimation rate */
551 cx25840_write(client, 0x478, 0xff & src_decimation);
552 cx25840_write(client, 0x479, 0xff & (src_decimation >> 8));
553
554 /* Sets Luma and UV Low pass filters */
555 cx25840_write(client, 0x47a, luma_lpf << 6 | ((uv_lpf << 4) & 0x30));
556
557 /* Enables comb filters */
558 cx25840_write(client, 0x47b, comb);
559
560 /* Sets SC Step*/
561 cx25840_write(client, 0x47c, sc);
562 cx25840_write(client, 0x47d, 0xff & sc >> 8);
563 cx25840_write(client, 0x47e, 0xff & sc >> 16);
564
565 /* Sets VBI parameters */
566 if (std & V4L2_STD_625_50) {
567 cx25840_write(client, 0x47f, 0x01);
568 state->vbi_line_offset = 5;
569 } else {
570 cx25840_write(client, 0x47f, 0x00);
571 state->vbi_line_offset = 8;
572 }
573}
574
575/* ----------------------------------------------------------------------- */
576
bd985160
HV
577static void input_change(struct i2c_client *client)
578{
9357b31c 579 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
081b496a 580 v4l2_std_id std = state->std;
bd985160 581
73dcddc5
HV
582 /* Follow step 8c and 8d of section 3.16 in the cx25840 datasheet */
583 if (std & V4L2_STD_SECAM) {
584 cx25840_write(client, 0x402, 0);
585 }
586 else {
587 cx25840_write(client, 0x402, 0x04);
588 cx25840_write(client, 0x49f, (std & V4L2_STD_NTSC) ? 0x14 : 0x11);
589 }
590 cx25840_and_or(client, 0x401, ~0x60, 0);
591 cx25840_and_or(client, 0x401, ~0x60, 0x60);
82677618 592 cx25840_and_or(client, 0x810, ~0x01, 1);
73dcddc5 593
39c4ad6a
HV
594 if (state->radio) {
595 cx25840_write(client, 0x808, 0xf9);
596 cx25840_write(client, 0x80b, 0x00);
597 }
598 else if (std & V4L2_STD_525_60) {
d97a11e0
HV
599 /* Certain Hauppauge PVR150 models have a hardware bug
600 that causes audio to drop out. For these models the
601 audio standard must be set explicitly.
602 To be precise: it affects cards with tuner models
603 85, 99 and 112 (model numbers from tveeprom). */
604 int hw_fix = state->pvr150_workaround;
605
606 if (std == V4L2_STD_NTSC_M_JP) {
f95006f8 607 /* Japan uses EIAJ audio standard */
d97a11e0
HV
608 cx25840_write(client, 0x808, hw_fix ? 0x2f : 0xf7);
609 } else if (std == V4L2_STD_NTSC_M_KR) {
610 /* South Korea uses A2 audio standard */
611 cx25840_write(client, 0x808, hw_fix ? 0x3f : 0xf8);
f95006f8
HV
612 } else {
613 /* Others use the BTSC audio standard */
d97a11e0 614 cx25840_write(client, 0x808, hw_fix ? 0x1f : 0xf6);
f95006f8 615 }
bd985160 616 cx25840_write(client, 0x80b, 0x00);
839e4a4a
MCC
617 } else if (std & V4L2_STD_PAL) {
618 /* Follow tuner change procedure for PAL */
619 cx25840_write(client, 0x808, 0xff);
620 cx25840_write(client, 0x80b, 0x10);
621 } else if (std & V4L2_STD_SECAM) {
622 /* Select autodetect for SECAM */
623 cx25840_write(client, 0x808, 0xff);
624 cx25840_write(client, 0x80b, 0x10);
bd985160
HV
625 }
626
82677618 627 cx25840_and_or(client, 0x810, ~0x01, 0);
bd985160
HV
628}
629
a8bbf12a
HV
630static int set_input(struct i2c_client *client, enum cx25840_video_input vid_input,
631 enum cx25840_audio_input aud_input)
bd985160 632{
9357b31c 633 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
a8bbf12a
HV
634 u8 is_composite = (vid_input >= CX25840_COMPOSITE1 &&
635 vid_input <= CX25840_COMPOSITE8);
636 u8 reg;
bd985160 637
f234081b
ST
638 v4l_dbg(1, cx25840_debug, client,
639 "decoder set video input %d, audio input %d\n",
640 vid_input, aud_input);
bd985160 641
f234081b
ST
642 if (vid_input >= CX25840_VIN1_CH1) {
643 v4l_dbg(1, cx25840_debug, client, "vid_input 0x%x\n",
644 vid_input);
645 reg = vid_input & 0xff;
646 if ((vid_input & CX25840_SVIDEO_ON) == CX25840_SVIDEO_ON)
647 is_composite = 0;
648 else
649 is_composite = 1;
650
651 v4l_dbg(1, cx25840_debug, client, "mux cfg 0x%x comp=%d\n",
652 reg, is_composite);
653 } else
a8bbf12a
HV
654 if (is_composite) {
655 reg = 0xf0 + (vid_input - CX25840_COMPOSITE1);
656 } else {
657 int luma = vid_input & 0xf0;
658 int chroma = vid_input & 0xf00;
bd985160 659
a8bbf12a 660 if ((vid_input & ~0xff0) ||
45270a15 661 luma < CX25840_SVIDEO_LUMA1 || luma > CX25840_SVIDEO_LUMA8 ||
a8bbf12a 662 chroma < CX25840_SVIDEO_CHROMA4 || chroma > CX25840_SVIDEO_CHROMA8) {
f234081b
ST
663 v4l_err(client, "0x%04x is not a valid video input!\n",
664 vid_input);
a8bbf12a 665 return -EINVAL;
bd985160 666 }
a8bbf12a
HV
667 reg = 0xf0 + ((luma - CX25840_SVIDEO_LUMA1) >> 4);
668 if (chroma >= CX25840_SVIDEO_CHROMA7) {
669 reg &= 0x3f;
670 reg |= (chroma - CX25840_SVIDEO_CHROMA7) >> 2;
bd985160 671 } else {
a8bbf12a
HV
672 reg &= 0xcf;
673 reg |= (chroma - CX25840_SVIDEO_CHROMA4) >> 4;
bd985160 674 }
a8bbf12a 675 }
bd985160 676
f234081b
ST
677 /* The caller has previously prepared the correct routing
678 * configuration in reg (for the cx23885) so we have no
679 * need to attempt to flip bits for earlier av decoders.
680 */
149783b5 681 if (!state->is_cx23885 && !state->is_cx231xx) {
f234081b
ST
682 switch (aud_input) {
683 case CX25840_AUDIO_SERIAL:
684 /* do nothing, use serial audio input */
685 break;
686 case CX25840_AUDIO4: reg &= ~0x30; break;
687 case CX25840_AUDIO5: reg &= ~0x30; reg |= 0x10; break;
688 case CX25840_AUDIO6: reg &= ~0x30; reg |= 0x20; break;
689 case CX25840_AUDIO7: reg &= ~0xc0; break;
690 case CX25840_AUDIO8: reg &= ~0xc0; reg |= 0x40; break;
bd985160 691
f234081b
ST
692 default:
693 v4l_err(client, "0x%04x is not a valid audio input!\n",
694 aud_input);
695 return -EINVAL;
696 }
bd985160
HV
697 }
698
a8bbf12a 699 cx25840_write(client, 0x103, reg);
f234081b 700
a8bbf12a
HV
701 /* Set INPUT_MODE to Composite (0) or S-Video (1) */
702 cx25840_and_or(client, 0x401, ~0x6, is_composite ? 0 : 0x02);
f234081b 703
149783b5 704 if (!state->is_cx23885 && !state->is_cx231xx) {
f234081b
ST
705 /* Set CH_SEL_ADC2 to 1 if input comes from CH3 */
706 cx25840_and_or(client, 0x102, ~0x2, (reg & 0x80) == 0 ? 2 : 0);
707 /* Set DUAL_MODE_ADC2 to 1 if input comes from both CH2&CH3 */
708 if ((reg & 0xc0) != 0xc0 && (reg & 0x30) != 0x30)
709 cx25840_and_or(client, 0x102, ~0x4, 4);
710 else
711 cx25840_and_or(client, 0x102, ~0x4, 0);
712 } else {
713 if (is_composite)
714 /* ADC2 input select channel 2 */
715 cx25840_and_or(client, 0x102, ~0x2, 0);
716 else
717 /* ADC2 input select channel 3 */
718 cx25840_and_or(client, 0x102, ~0x2, 2);
719 }
a8bbf12a
HV
720
721 state->vid_input = vid_input;
722 state->aud_input = aud_input;
e2b8cf4c
HV
723 if (!state->is_cx25836) {
724 cx25840_audio_set_path(client);
725 input_change(client);
726 }
f234081b
ST
727
728 if (state->is_cx23885) {
729 /* Audio channel 1 src : Parallel 1 */
730 cx25840_write(client, 0x124, 0x03);
731
732 /* Select AFE clock pad output source */
733 cx25840_write(client, 0x144, 0x05);
734
735 /* I2S_IN_CTL: I2S_IN_SONY_MODE, LEFT SAMPLE on WS=1 */
736 cx25840_write(client, 0x914, 0xa0);
737
149783b5
SD
738 /* I2S_OUT_CTL:
739 * I2S_IN_SONY_MODE, LEFT SAMPLE on WS=1
740 * I2S_OUT_MASTER_MODE = Master
741 */
742 cx25840_write(client, 0x918, 0xa0);
743 cx25840_write(client, 0x919, 0x01);
744 } else if (state->is_cx231xx) {
745 /* Audio channel 1 src : Parallel 1 */
746 cx25840_write(client, 0x124, 0x03);
747
748 /* I2S_IN_CTL: I2S_IN_SONY_MODE, LEFT SAMPLE on WS=1 */
749 cx25840_write(client, 0x914, 0xa0);
750
f234081b
ST
751 /* I2S_OUT_CTL:
752 * I2S_IN_SONY_MODE, LEFT SAMPLE on WS=1
753 * I2S_OUT_MASTER_MODE = Master
754 */
755 cx25840_write(client, 0x918, 0xa0);
756 cx25840_write(client, 0x919, 0x01);
757 }
758
bd985160
HV
759 return 0;
760}
761
762/* ----------------------------------------------------------------------- */
763
081b496a 764static int set_v4lstd(struct i2c_client *client)
bd985160 765{
9357b31c 766 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
081b496a
HV
767 u8 fmt = 0; /* zero is autodetect */
768 u8 pal_m = 0;
468a0a54
MCC
769
770 /* First tests should be against specific std */
081b496a
HV
771 if (state->std == V4L2_STD_NTSC_M_JP) {
772 fmt = 0x2;
773 } else if (state->std == V4L2_STD_NTSC_443) {
774 fmt = 0x3;
775 } else if (state->std == V4L2_STD_PAL_M) {
776 pal_m = 1;
777 fmt = 0x5;
778 } else if (state->std == V4L2_STD_PAL_N) {
779 fmt = 0x6;
780 } else if (state->std == V4L2_STD_PAL_Nc) {
781 fmt = 0x7;
782 } else if (state->std == V4L2_STD_PAL_60) {
783 fmt = 0x8;
468a0a54
MCC
784 } else {
785 /* Then, test against generic ones */
081b496a
HV
786 if (state->std & V4L2_STD_NTSC)
787 fmt = 0x1;
788 else if (state->std & V4L2_STD_PAL)
789 fmt = 0x4;
790 else if (state->std & V4L2_STD_SECAM)
791 fmt = 0xc;
bd985160
HV
792 }
793
839e4a4a
MCC
794 v4l_dbg(1, cx25840_debug, client, "changing video std to fmt %i\n",fmt);
795
73dcddc5
HV
796 /* Follow step 9 of section 3.16 in the cx25840 datasheet.
797 Without this PAL may display a vertical ghosting effect.
798 This happens for example with the Yuan MPC622. */
799 if (fmt >= 4 && fmt < 8) {
800 /* Set format to NTSC-M */
801 cx25840_and_or(client, 0x400, ~0xf, 1);
802 /* Turn off LCOMB */
803 cx25840_and_or(client, 0x47b, ~6, 0);
804 }
bd985160 805 cx25840_and_or(client, 0x400, ~0xf, fmt);
081b496a 806 cx25840_and_or(client, 0x403, ~0x3, pal_m);
cb5aa1c6 807 cx25840_std_setup(client);
081b496a
HV
808 if (!state->is_cx25836)
809 input_change(client);
bd985160
HV
810 return 0;
811}
812
bd985160
HV
813/* ----------------------------------------------------------------------- */
814
9357b31c 815static int cx25840_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
bd985160 816{
95b14fb2 817 struct cx25840_state *state = to_state(sd);
9357b31c 818 struct i2c_client *client = v4l2_get_subdevdata(sd);
bd985160
HV
819
820 switch (ctrl->id) {
a8bbf12a
HV
821 case CX25840_CID_ENABLE_PVR150_WORKAROUND:
822 state->pvr150_workaround = ctrl->value;
823 set_input(client, state->vid_input, state->aud_input);
bd985160
HV
824 break;
825
826 case V4L2_CID_BRIGHTNESS:
827 if (ctrl->value < 0 || ctrl->value > 255) {
fac9e899 828 v4l_err(client, "invalid brightness setting %d\n",
bd985160
HV
829 ctrl->value);
830 return -ERANGE;
831 }
832
833 cx25840_write(client, 0x414, ctrl->value - 128);
834 break;
835
836 case V4L2_CID_CONTRAST:
837 if (ctrl->value < 0 || ctrl->value > 127) {
fac9e899 838 v4l_err(client, "invalid contrast setting %d\n",
bd985160
HV
839 ctrl->value);
840 return -ERANGE;
841 }
842
843 cx25840_write(client, 0x415, ctrl->value << 1);
844 break;
845
846 case V4L2_CID_SATURATION:
847 if (ctrl->value < 0 || ctrl->value > 127) {
fac9e899 848 v4l_err(client, "invalid saturation setting %d\n",
bd985160
HV
849 ctrl->value);
850 return -ERANGE;
851 }
852
853 cx25840_write(client, 0x420, ctrl->value << 1);
854 cx25840_write(client, 0x421, ctrl->value << 1);
855 break;
856
857 case V4L2_CID_HUE:
de6476f5 858 if (ctrl->value < -128 || ctrl->value > 127) {
fac9e899 859 v4l_err(client, "invalid hue setting %d\n", ctrl->value);
bd985160
HV
860 return -ERANGE;
861 }
862
863 cx25840_write(client, 0x422, ctrl->value);
864 break;
865
866 case V4L2_CID_AUDIO_VOLUME:
867 case V4L2_CID_AUDIO_BASS:
868 case V4L2_CID_AUDIO_TREBLE:
869 case V4L2_CID_AUDIO_BALANCE:
870 case V4L2_CID_AUDIO_MUTE:
e2b8cf4c
HV
871 if (state->is_cx25836)
872 return -EINVAL;
df1d5ed8 873 return cx25840_audio_s_ctrl(sd, ctrl);
3faeeae4
HV
874
875 default:
876 return -EINVAL;
bd985160
HV
877 }
878
879 return 0;
880}
881
9357b31c 882static int cx25840_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
bd985160 883{
95b14fb2 884 struct cx25840_state *state = to_state(sd);
9357b31c 885 struct i2c_client *client = v4l2_get_subdevdata(sd);
bd985160
HV
886
887 switch (ctrl->id) {
a8bbf12a
HV
888 case CX25840_CID_ENABLE_PVR150_WORKAROUND:
889 ctrl->value = state->pvr150_workaround;
bd985160
HV
890 break;
891 case V4L2_CID_BRIGHTNESS:
0de71224 892 ctrl->value = (s8)cx25840_read(client, 0x414) + 128;
bd985160
HV
893 break;
894 case V4L2_CID_CONTRAST:
895 ctrl->value = cx25840_read(client, 0x415) >> 1;
896 break;
897 case V4L2_CID_SATURATION:
898 ctrl->value = cx25840_read(client, 0x420) >> 1;
899 break;
900 case V4L2_CID_HUE:
c5099a64 901 ctrl->value = (s8)cx25840_read(client, 0x422);
bd985160
HV
902 break;
903 case V4L2_CID_AUDIO_VOLUME:
904 case V4L2_CID_AUDIO_BASS:
905 case V4L2_CID_AUDIO_TREBLE:
906 case V4L2_CID_AUDIO_BALANCE:
907 case V4L2_CID_AUDIO_MUTE:
e2b8cf4c
HV
908 if (state->is_cx25836)
909 return -EINVAL;
df1d5ed8 910 return cx25840_audio_g_ctrl(sd, ctrl);
bd985160
HV
911 default:
912 return -EINVAL;
913 }
914
915 return 0;
916}
917
918/* ----------------------------------------------------------------------- */
919
9357b31c 920static int cx25840_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
bd985160
HV
921{
922 switch (fmt->type) {
923 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
df1d5ed8 924 return cx25840_vbi_g_fmt(sd, fmt);
bd985160
HV
925 default:
926 return -EINVAL;
927 }
bd985160
HV
928 return 0;
929}
930
9357b31c 931static int cx25840_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
bd985160 932{
9357b31c
HV
933 struct cx25840_state *state = to_state(sd);
934 struct i2c_client *client = v4l2_get_subdevdata(sd);
bd985160
HV
935 struct v4l2_pix_format *pix;
936 int HSC, VSC, Vsrc, Hsrc, filter, Vlines;
081b496a 937 int is_50Hz = !(state->std & V4L2_STD_525_60);
bd985160
HV
938
939 switch (fmt->type) {
940 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
941 pix = &(fmt->fmt.pix);
942
943 Vsrc = (cx25840_read(client, 0x476) & 0x3f) << 4;
944 Vsrc |= (cx25840_read(client, 0x475) & 0xf0) >> 4;
945
946 Hsrc = (cx25840_read(client, 0x472) & 0x3f) << 4;
947 Hsrc |= (cx25840_read(client, 0x471) & 0xf0) >> 4;
948
ba70d59b 949 Vlines = pix->height + (is_50Hz ? 4 : 7);
bd985160
HV
950
951 if ((pix->width * 16 < Hsrc) || (Hsrc < pix->width) ||
952 (Vlines * 8 < Vsrc) || (Vsrc < Vlines)) {
fac9e899 953 v4l_err(client, "%dx%d is not a valid size!\n",
bd985160
HV
954 pix->width, pix->height);
955 return -ERANGE;
956 }
957
958 HSC = (Hsrc * (1 << 20)) / pix->width - (1 << 20);
959 VSC = (1 << 16) - (Vsrc * (1 << 9) / Vlines - (1 << 9));
960 VSC &= 0x1fff;
961
962 if (pix->width >= 385)
963 filter = 0;
964 else if (pix->width > 192)
965 filter = 1;
966 else if (pix->width > 96)
967 filter = 2;
968 else
969 filter = 3;
970
b5fc7144 971 v4l_dbg(1, cx25840_debug, client, "decoder set size %dx%d -> scale %ux%u\n",
bd985160
HV
972 pix->width, pix->height, HSC, VSC);
973
974 /* HSCALE=HSC */
975 cx25840_write(client, 0x418, HSC & 0xff);
976 cx25840_write(client, 0x419, (HSC >> 8) & 0xff);
977 cx25840_write(client, 0x41a, HSC >> 16);
978 /* VSCALE=VSC */
979 cx25840_write(client, 0x41c, VSC & 0xff);
980 cx25840_write(client, 0x41d, VSC >> 8);
981 /* VS_INTRLACE=1 VFILT=filter */
982 cx25840_write(client, 0x41e, 0x8 | filter);
983 break;
984
985 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
df1d5ed8 986 return cx25840_vbi_s_fmt(sd, fmt);
bd985160
HV
987
988 case V4L2_BUF_TYPE_VBI_CAPTURE:
df1d5ed8 989 return cx25840_vbi_s_fmt(sd, fmt);
bd985160
HV
990
991 default:
992 return -EINVAL;
993 }
994
995 return 0;
996}
997
998/* ----------------------------------------------------------------------- */
999
1a39275a
HV
1000static void log_video_status(struct i2c_client *client)
1001{
1002 static const char *const fmt_strs[] = {
1003 "0x0",
1004 "NTSC-M", "NTSC-J", "NTSC-4.43",
1005 "PAL-BDGHI", "PAL-M", "PAL-N", "PAL-Nc", "PAL-60",
1006 "0x9", "0xA", "0xB",
1007 "SECAM",
1008 "0xD", "0xE", "0xF"
1009 };
1010
9357b31c 1011 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
1a39275a
HV
1012 u8 vidfmt_sel = cx25840_read(client, 0x400) & 0xf;
1013 u8 gen_stat1 = cx25840_read(client, 0x40d);
1014 u8 gen_stat2 = cx25840_read(client, 0x40e);
1015 int vid_input = state->vid_input;
1016
1017 v4l_info(client, "Video signal: %spresent\n",
1018 (gen_stat2 & 0x20) ? "" : "not ");
1019 v4l_info(client, "Detected format: %s\n",
1020 fmt_strs[gen_stat1 & 0xf]);
1021
1022 v4l_info(client, "Specified standard: %s\n",
1023 vidfmt_sel ? fmt_strs[vidfmt_sel] : "automatic detection");
1024
1025 if (vid_input >= CX25840_COMPOSITE1 &&
1026 vid_input <= CX25840_COMPOSITE8) {
1027 v4l_info(client, "Specified video input: Composite %d\n",
1028 vid_input - CX25840_COMPOSITE1 + 1);
1029 } else {
1030 v4l_info(client, "Specified video input: S-Video (Luma In%d, Chroma In%d)\n",
1031 (vid_input & 0xf0) >> 4, (vid_input & 0xf00) >> 8);
1032 }
1033
1034 v4l_info(client, "Specified audioclock freq: %d Hz\n", state->audclk_freq);
1035}
1036
1037/* ----------------------------------------------------------------------- */
1038
1039static void log_audio_status(struct i2c_client *client)
1040{
9357b31c 1041 struct cx25840_state *state = to_state(i2c_get_clientdata(client));
1a39275a
HV
1042 u8 download_ctl = cx25840_read(client, 0x803);
1043 u8 mod_det_stat0 = cx25840_read(client, 0x804);
1044 u8 mod_det_stat1 = cx25840_read(client, 0x805);
1045 u8 audio_config = cx25840_read(client, 0x808);
1046 u8 pref_mode = cx25840_read(client, 0x809);
1047 u8 afc0 = cx25840_read(client, 0x80b);
1048 u8 mute_ctl = cx25840_read(client, 0x8d3);
1049 int aud_input = state->aud_input;
1050 char *p;
1051
1052 switch (mod_det_stat0) {
1053 case 0x00: p = "mono"; break;
1054 case 0x01: p = "stereo"; break;
1055 case 0x02: p = "dual"; break;
1056 case 0x04: p = "tri"; break;
1057 case 0x10: p = "mono with SAP"; break;
1058 case 0x11: p = "stereo with SAP"; break;
1059 case 0x12: p = "dual with SAP"; break;
1060 case 0x14: p = "tri with SAP"; break;
1061 case 0xfe: p = "forced mode"; break;
1062 default: p = "not defined";
1063 }
1064 v4l_info(client, "Detected audio mode: %s\n", p);
1065
1066 switch (mod_det_stat1) {
1067 case 0x00: p = "not defined"; break;
1068 case 0x01: p = "EIAJ"; break;
1069 case 0x02: p = "A2-M"; break;
1070 case 0x03: p = "A2-BG"; break;
1071 case 0x04: p = "A2-DK1"; break;
1072 case 0x05: p = "A2-DK2"; break;
1073 case 0x06: p = "A2-DK3"; break;
1074 case 0x07: p = "A1 (6.0 MHz FM Mono)"; break;
1075 case 0x08: p = "AM-L"; break;
1076 case 0x09: p = "NICAM-BG"; break;
1077 case 0x0a: p = "NICAM-DK"; break;
1078 case 0x0b: p = "NICAM-I"; break;
1079 case 0x0c: p = "NICAM-L"; break;
1080 case 0x0d: p = "BTSC/EIAJ/A2-M Mono (4.5 MHz FMMono)"; break;
1081 case 0x0e: p = "IF FM Radio"; break;
1082 case 0x0f: p = "BTSC"; break;
1083 case 0x10: p = "high-deviation FM"; break;
1084 case 0x11: p = "very high-deviation FM"; break;
1085 case 0xfd: p = "unknown audio standard"; break;
1086 case 0xfe: p = "forced audio standard"; break;
1087 case 0xff: p = "no detected audio standard"; break;
1088 default: p = "not defined";
1089 }
1090 v4l_info(client, "Detected audio standard: %s\n", p);
1091 v4l_info(client, "Audio muted: %s\n",
1092 (state->unmute_volume >= 0) ? "yes" : "no");
1093 v4l_info(client, "Audio microcontroller: %s\n",
1094 (download_ctl & 0x10) ?
1095 ((mute_ctl & 0x2) ? "detecting" : "running") : "stopped");
1096
1097 switch (audio_config >> 4) {
1098 case 0x00: p = "undefined"; break;
1099 case 0x01: p = "BTSC"; break;
1100 case 0x02: p = "EIAJ"; break;
1101 case 0x03: p = "A2-M"; break;
1102 case 0x04: p = "A2-BG"; break;
1103 case 0x05: p = "A2-DK1"; break;
1104 case 0x06: p = "A2-DK2"; break;
1105 case 0x07: p = "A2-DK3"; break;
1106 case 0x08: p = "A1 (6.0 MHz FM Mono)"; break;
1107 case 0x09: p = "AM-L"; break;
1108 case 0x0a: p = "NICAM-BG"; break;
1109 case 0x0b: p = "NICAM-DK"; break;
1110 case 0x0c: p = "NICAM-I"; break;
1111 case 0x0d: p = "NICAM-L"; break;
1112 case 0x0e: p = "FM radio"; break;
1113 case 0x0f: p = "automatic detection"; break;
1114 default: p = "undefined";
1115 }
1116 v4l_info(client, "Configured audio standard: %s\n", p);
1117
1118 if ((audio_config >> 4) < 0xF) {
1119 switch (audio_config & 0xF) {
1120 case 0x00: p = "MONO1 (LANGUAGE A/Mono L+R channel for BTSC, EIAJ, A2)"; break;
1121 case 0x01: p = "MONO2 (LANGUAGE B)"; break;
1122 case 0x02: p = "MONO3 (STEREO forced MONO)"; break;
1123 case 0x03: p = "MONO4 (NICAM ANALOG-Language C/Analog Fallback)"; break;
1124 case 0x04: p = "STEREO"; break;
1125 case 0x05: p = "DUAL1 (AB)"; break;
1126 case 0x06: p = "DUAL2 (AC) (FM)"; break;
1127 case 0x07: p = "DUAL3 (BC) (FM)"; break;
1128 case 0x08: p = "DUAL4 (AC) (AM)"; break;
1129 case 0x09: p = "DUAL5 (BC) (AM)"; break;
1130 case 0x0a: p = "SAP"; break;
1131 default: p = "undefined";
1132 }
1133 v4l_info(client, "Configured audio mode: %s\n", p);
1134 } else {
1135 switch (audio_config & 0xF) {
1136 case 0x00: p = "BG"; break;
1137 case 0x01: p = "DK1"; break;
1138 case 0x02: p = "DK2"; break;
1139 case 0x03: p = "DK3"; break;
1140 case 0x04: p = "I"; break;
1141 case 0x05: p = "L"; break;
1142 case 0x06: p = "BTSC"; break;
1143 case 0x07: p = "EIAJ"; break;
1144 case 0x08: p = "A2-M"; break;
1145 case 0x09: p = "FM Radio"; break;
1146 case 0x0f: p = "automatic standard and mode detection"; break;
1147 default: p = "undefined";
1148 }
1149 v4l_info(client, "Configured audio system: %s\n", p);
1150 }
1151
1152 if (aud_input) {
1153 v4l_info(client, "Specified audio input: Tuner (In%d)\n", aud_input);
1154 } else {
1155 v4l_info(client, "Specified audio input: External\n");
1156 }
1157
1158 switch (pref_mode & 0xf) {
1159 case 0: p = "mono/language A"; break;
1160 case 1: p = "language B"; break;
1161 case 2: p = "language C"; break;
1162 case 3: p = "analog fallback"; break;
1163 case 4: p = "stereo"; break;
1164 case 5: p = "language AC"; break;
1165 case 6: p = "language BC"; break;
1166 case 7: p = "language AB"; break;
1167 default: p = "undefined";
1168 }
1169 v4l_info(client, "Preferred audio mode: %s\n", p);
1170
1171 if ((audio_config & 0xf) == 0xf) {
1172 switch ((afc0 >> 3) & 0x3) {
1173 case 0: p = "system DK"; break;
1174 case 1: p = "system L"; break;
1175 case 2: p = "autodetect"; break;
1176 default: p = "undefined";
1177 }
1178 v4l_info(client, "Selected 65 MHz format: %s\n", p);
1179
1180 switch (afc0 & 0x7) {
1181 case 0: p = "chroma"; break;
1182 case 1: p = "BTSC"; break;
1183 case 2: p = "EIAJ"; break;
1184 case 3: p = "A2-M"; break;
1185 case 4: p = "autodetect"; break;
1186 default: p = "undefined";
1187 }
1188 v4l_info(client, "Selected 45 MHz format: %s\n", p);
1189 }
1190}
1191
1192/* ----------------------------------------------------------------------- */
1193
cc26b076 1194/* This load_fw operation must be called to load the driver's firmware.
6ca187ab
HV
1195 Without this the audio standard detection will fail and you will
1196 only get mono.
1197
1198 Since loading the firmware is often problematic when the driver is
1199 compiled into the kernel I recommend postponing calling this function
1200 until the first open of the video device. Another reason for
1201 postponing it is that loading this firmware takes a long time (seconds)
1202 due to the slow i2c bus speed. So it will speed up the boot process if
1203 you can avoid loading the fw as long as the video device isn't used. */
cc26b076 1204static int cx25840_load_fw(struct v4l2_subdev *sd)
bd985160 1205{
9357b31c
HV
1206 struct cx25840_state *state = to_state(sd);
1207 struct i2c_client *client = v4l2_get_subdevdata(sd);
c976bc82
HV
1208
1209 if (!state->is_initialized) {
cc26b076 1210 /* initialize and load firmware */
c976bc82
HV
1211 state->is_initialized = 1;
1212 if (state->is_cx25836)
1213 cx25836_initialize(client);
f234081b
ST
1214 else if (state->is_cx23885)
1215 cx23885_initialize(client);
95b14fb2 1216 else if (state->is_cx231xx)
149783b5 1217 cx231xx_initialize(client);
c976bc82 1218 else
89fc4eb9 1219 cx25840_initialize(client);
c976bc82 1220 }
9357b31c
HV
1221 return 0;
1222}
c976bc82 1223
bd985160 1224#ifdef CONFIG_VIDEO_ADV_DEBUG
aecde8b5 1225static int cx25840_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg)
9357b31c
HV
1226{
1227 struct i2c_client *client = v4l2_get_subdevdata(sd);
f234081b 1228
aecde8b5 1229 if (!v4l2_chip_match_i2c_client(client, &reg->match))
9357b31c
HV
1230 return -EINVAL;
1231 if (!capable(CAP_SYS_ADMIN))
1232 return -EPERM;
aecde8b5 1233 reg->size = 1;
9357b31c
HV
1234 reg->val = cx25840_read(client, reg->reg & 0x0fff);
1235 return 0;
1236}
1237
aecde8b5 1238static int cx25840_s_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg)
9357b31c
HV
1239{
1240 struct i2c_client *client = v4l2_get_subdevdata(sd);
1241
aecde8b5 1242 if (!v4l2_chip_match_i2c_client(client, &reg->match))
9357b31c
HV
1243 return -EINVAL;
1244 if (!capable(CAP_SYS_ADMIN))
1245 return -EPERM;
1246 cx25840_write(client, reg->reg & 0x0fff, reg->val & 0xff);
1247 return 0;
1248}
bd985160
HV
1249#endif
1250
9357b31c
HV
1251static int cx25840_s_stream(struct v4l2_subdev *sd, int enable)
1252{
1253 struct cx25840_state *state = to_state(sd);
1254 struct i2c_client *client = v4l2_get_subdevdata(sd);
bd985160 1255
9357b31c
HV
1256 v4l_dbg(1, cx25840_debug, client, "%s output\n",
1257 enable ? "enable" : "disable");
1258 if (enable) {
149783b5 1259 if (state->is_cx23885 || state->is_cx231xx) {
f234081b
ST
1260 u8 v = (cx25840_read(client, 0x421) | 0x0b);
1261 cx25840_write(client, 0x421, v);
1262 } else {
1263 cx25840_write(client, 0x115,
9357b31c 1264 state->is_cx25836 ? 0x0c : 0x8c);
f234081b 1265 cx25840_write(client, 0x116,
9357b31c 1266 state->is_cx25836 ? 0x04 : 0x07);
f234081b 1267 }
9357b31c 1268 } else {
149783b5 1269 if (state->is_cx23885 || state->is_cx231xx) {
f234081b
ST
1270 u8 v = cx25840_read(client, 0x421) & ~(0x0b);
1271 cx25840_write(client, 0x421, v);
1272 } else {
1273 cx25840_write(client, 0x115, 0x00);
1274 cx25840_write(client, 0x116, 0x00);
1275 }
9357b31c
HV
1276 }
1277 return 0;
1278}
bd985160 1279
9357b31c
HV
1280static int cx25840_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
1281{
1282 struct cx25840_state *state = to_state(sd);
bd985160 1283
9357b31c
HV
1284 switch (qc->id) {
1285 case V4L2_CID_BRIGHTNESS:
10afbef1 1286 return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128);
9357b31c
HV
1287 case V4L2_CID_CONTRAST:
1288 case V4L2_CID_SATURATION:
10afbef1 1289 return v4l2_ctrl_query_fill(qc, 0, 127, 1, 64);
9357b31c 1290 case V4L2_CID_HUE:
10afbef1 1291 return v4l2_ctrl_query_fill(qc, -128, 127, 1, 0);
9357b31c
HV
1292 default:
1293 break;
1294 }
1295 if (state->is_cx25836)
1296 return -EINVAL;
bd985160 1297
9357b31c
HV
1298 switch (qc->id) {
1299 case V4L2_CID_AUDIO_VOLUME:
1300 return v4l2_ctrl_query_fill(qc, 0, 65535,
1301 65535 / 100, state->default_volume);
1302 case V4L2_CID_AUDIO_MUTE:
10afbef1 1303 return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
9357b31c
HV
1304 case V4L2_CID_AUDIO_BALANCE:
1305 case V4L2_CID_AUDIO_BASS:
1306 case V4L2_CID_AUDIO_TREBLE:
10afbef1 1307 return v4l2_ctrl_query_fill(qc, 0, 65535, 65535 / 100, 32768);
9357b31c
HV
1308 default:
1309 return -EINVAL;
1310 }
1311 return -EINVAL;
1312}
bd985160 1313
9357b31c
HV
1314static int cx25840_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
1315{
1316 struct cx25840_state *state = to_state(sd);
1317 struct i2c_client *client = v4l2_get_subdevdata(sd);
d92c20e0 1318
9357b31c
HV
1319 if (state->radio == 0 && state->std == std)
1320 return 0;
1321 state->radio = 0;
1322 state->std = std;
1323 return set_v4lstd(client);
1324}
e2b8cf4c 1325
9357b31c
HV
1326static int cx25840_s_radio(struct v4l2_subdev *sd)
1327{
1328 struct cx25840_state *state = to_state(sd);
d92c20e0 1329
9357b31c
HV
1330 state->radio = 1;
1331 return 0;
1332}
bd985160 1333
5325b427
HV
1334static int cx25840_s_video_routing(struct v4l2_subdev *sd,
1335 u32 input, u32 output, u32 config)
9357b31c
HV
1336{
1337 struct cx25840_state *state = to_state(sd);
1338 struct i2c_client *client = v4l2_get_subdevdata(sd);
3faeeae4 1339
5325b427 1340 return set_input(client, input, state->aud_input);
9357b31c 1341}
bd985160 1342
5325b427
HV
1343static int cx25840_s_audio_routing(struct v4l2_subdev *sd,
1344 u32 input, u32 output, u32 config)
9357b31c
HV
1345{
1346 struct cx25840_state *state = to_state(sd);
1347 struct i2c_client *client = v4l2_get_subdevdata(sd);
bd985160 1348
9357b31c
HV
1349 if (state->is_cx25836)
1350 return -EINVAL;
5325b427 1351 return set_input(client, state->vid_input, input);
9357b31c 1352}
bd985160 1353
9357b31c
HV
1354static int cx25840_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *freq)
1355{
1356 struct cx25840_state *state = to_state(sd);
1357 struct i2c_client *client = v4l2_get_subdevdata(sd);
a8bbf12a 1358
9357b31c
HV
1359 if (!state->is_cx25836)
1360 input_change(client);
1361 return 0;
1362}
a8bbf12a 1363
9357b31c
HV
1364static int cx25840_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
1365{
1366 struct cx25840_state *state = to_state(sd);
1367 struct i2c_client *client = v4l2_get_subdevdata(sd);
1368 u8 vpres = cx25840_read(client, 0x40e) & 0x20;
1369 u8 mode;
1370 int val = 0;
bd985160 1371
9357b31c
HV
1372 if (state->radio)
1373 return 0;
bd985160 1374
9357b31c
HV
1375 vt->signal = vpres ? 0xffff : 0x0;
1376 if (state->is_cx25836)
1377 return 0;
3faeeae4 1378
9357b31c
HV
1379 vt->capability |=
1380 V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 |
1381 V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
e2b8cf4c 1382
9357b31c 1383 mode = cx25840_read(client, 0x804);
bd985160 1384
9357b31c
HV
1385 /* get rxsubchans and audmode */
1386 if ((mode & 0xf) == 1)
1387 val |= V4L2_TUNER_SUB_STEREO;
1388 else
1389 val |= V4L2_TUNER_SUB_MONO;
bd985160 1390
9357b31c
HV
1391 if (mode == 2 || mode == 4)
1392 val = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
bd985160 1393
9357b31c
HV
1394 if (mode & 0x10)
1395 val |= V4L2_TUNER_SUB_SAP;
bd985160 1396
9357b31c
HV
1397 vt->rxsubchans = val;
1398 vt->audmode = state->audmode;
1399 return 0;
1400}
bd985160 1401
9357b31c
HV
1402static int cx25840_s_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
1403{
1404 struct cx25840_state *state = to_state(sd);
1405 struct i2c_client *client = v4l2_get_subdevdata(sd);
bd985160 1406
9357b31c
HV
1407 if (state->radio || state->is_cx25836)
1408 return 0;
8a4b275f 1409
9357b31c 1410 switch (vt->audmode) {
bd985160 1411 case V4L2_TUNER_MODE_MONO:
8a4b275f
HV
1412 /* mono -> mono
1413 stereo -> mono
1414 bilingual -> lang1 */
bd985160
HV
1415 cx25840_and_or(client, 0x809, ~0xf, 0x00);
1416 break;
301e22d6 1417 case V4L2_TUNER_MODE_STEREO:
8a4b275f
HV
1418 case V4L2_TUNER_MODE_LANG1:
1419 /* mono -> mono
1420 stereo -> stereo
1421 bilingual -> lang1 */
bd985160
HV
1422 cx25840_and_or(client, 0x809, ~0xf, 0x04);
1423 break;
301e22d6 1424 case V4L2_TUNER_MODE_LANG1_LANG2:
8a4b275f
HV
1425 /* mono -> mono
1426 stereo -> stereo
1427 bilingual -> lang1/lang2 */
1428 cx25840_and_or(client, 0x809, ~0xf, 0x07);
1429 break;
bd985160 1430 case V4L2_TUNER_MODE_LANG2:
8a4b275f 1431 /* mono -> mono
301e22d6 1432 stereo -> stereo
8a4b275f 1433 bilingual -> lang2 */
bd985160
HV
1434 cx25840_and_or(client, 0x809, ~0xf, 0x01);
1435 break;
8a4b275f
HV
1436 default:
1437 return -EINVAL;
9357b31c
HV
1438 }
1439 state->audmode = vt->audmode;
1440 return 0;
1441}
bd985160 1442
9357b31c
HV
1443static int cx25840_reset(struct v4l2_subdev *sd, u32 val)
1444{
1445 struct cx25840_state *state = to_state(sd);
1446 struct i2c_client *client = v4l2_get_subdevdata(sd);
bd985160 1447
9357b31c
HV
1448 if (state->is_cx25836)
1449 cx25836_initialize(client);
1450 else if (state->is_cx23885)
1451 cx23885_initialize(client);
149783b5
SD
1452 else if (state->is_cx231xx)
1453 cx231xx_initialize(client);
9357b31c
HV
1454 else
1455 cx25840_initialize(client);
1456 return 0;
1457}
bd985160 1458
aecde8b5 1459static int cx25840_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
9357b31c
HV
1460{
1461 struct cx25840_state *state = to_state(sd);
1462 struct i2c_client *client = v4l2_get_subdevdata(sd);
bd985160 1463
9357b31c
HV
1464 return v4l2_chip_ident_i2c_client(client, chip, state->id, state->rev);
1465}
bd985160 1466
9357b31c
HV
1467static int cx25840_log_status(struct v4l2_subdev *sd)
1468{
1469 struct cx25840_state *state = to_state(sd);
1470 struct i2c_client *client = v4l2_get_subdevdata(sd);
bd985160 1471
9357b31c
HV
1472 log_video_status(client);
1473 if (!state->is_cx25836)
1474 log_audio_status(client);
3faeeae4 1475 return 0;
bd985160
HV
1476}
1477
9357b31c
HV
1478/* ----------------------------------------------------------------------- */
1479
1480static const struct v4l2_subdev_core_ops cx25840_core_ops = {
1481 .log_status = cx25840_log_status,
1482 .g_chip_ident = cx25840_g_chip_ident,
1483 .g_ctrl = cx25840_g_ctrl,
1484 .s_ctrl = cx25840_s_ctrl,
1485 .queryctrl = cx25840_queryctrl,
f41737ec 1486 .s_std = cx25840_s_std,
9357b31c 1487 .reset = cx25840_reset,
cc26b076 1488 .load_fw = cx25840_load_fw,
9357b31c
HV
1489#ifdef CONFIG_VIDEO_ADV_DEBUG
1490 .g_register = cx25840_g_register,
1491 .s_register = cx25840_s_register,
1492#endif
1493};
1494
1495static const struct v4l2_subdev_tuner_ops cx25840_tuner_ops = {
1496 .s_frequency = cx25840_s_frequency,
9357b31c
HV
1497 .s_radio = cx25840_s_radio,
1498 .g_tuner = cx25840_g_tuner,
1499 .s_tuner = cx25840_s_tuner,
1500};
1501
1502static const struct v4l2_subdev_audio_ops cx25840_audio_ops = {
1503 .s_clock_freq = cx25840_s_clock_freq,
1504 .s_routing = cx25840_s_audio_routing,
1505};
1506
1507static const struct v4l2_subdev_video_ops cx25840_video_ops = {
1508 .s_routing = cx25840_s_video_routing,
1509 .g_fmt = cx25840_g_fmt,
1510 .s_fmt = cx25840_s_fmt,
1511 .decode_vbi_line = cx25840_decode_vbi_line,
1512 .s_stream = cx25840_s_stream,
1513};
1514
1515static const struct v4l2_subdev_ops cx25840_ops = {
1516 .core = &cx25840_core_ops,
1517 .tuner = &cx25840_tuner_ops,
1518 .audio = &cx25840_audio_ops,
1519 .video = &cx25840_video_ops,
1520};
1521
bd985160
HV
1522/* ----------------------------------------------------------------------- */
1523
c7dd1ecd
AW
1524static u32 get_cx2388x_ident(struct i2c_client *client)
1525{
1526 u32 ret;
1527
1528 /* Come out of digital power down */
1529 cx25840_write(client, 0x000, 0);
1530
1531 if (cx25840_read4(client, 0x204) & 0xffff) {
1532 /* IR Tx Clk Divider register exists; chip must be a CX23885 */
1533 ret = V4L2_IDENT_CX23885_AV;
1534 } else if (cx25840_read4(client, 0x300) & 0x0fffffff) {
1535 /* DIF PLL Freq Word reg exists; chip must be a CX23888 */
1536 ret = V4L2_IDENT_CX23888_AV;
1537 } else {
1538 /* A CX23887 A/V core has neither IR nor DIF */
1539 ret = V4L2_IDENT_CX23887_AV;
1540 }
1541
1542 /* Back into digital power down */
1543 cx25840_write(client, 0x000, 2);
1544 return ret;
1545}
1546
d2653e92
JD
1547static int cx25840_probe(struct i2c_client *client,
1548 const struct i2c_device_id *did)
bd985160 1549{
bd985160 1550 struct cx25840_state *state;
9357b31c 1551 struct v4l2_subdev *sd;
c7dd1ecd 1552 u32 id = V4L2_IDENT_NONE;
bd985160
HV
1553 u16 device_id;
1554
188f3457
HV
1555 /* Check if the adapter supports the needed features */
1556 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1557 return -EIO;
1558
21340ae0 1559 v4l_dbg(1, cx25840_debug, client, "detecting cx25840 client on address 0x%x\n", client->addr << 1);
bd985160
HV
1560
1561 device_id = cx25840_read(client, 0x101) << 8;
1562 device_id |= cx25840_read(client, 0x100);
f234081b 1563 v4l_dbg(1, cx25840_debug, client, "device_id = 0x%04x\n", device_id);
bd985160
HV
1564
1565 /* The high byte of the device ID should be
e2b8cf4c
HV
1566 * 0x83 for the cx2583x and 0x84 for the cx2584x */
1567 if ((device_id & 0xff00) == 0x8300) {
1568 id = V4L2_IDENT_CX25836 + ((device_id >> 4) & 0xf) - 6;
c7dd1ecd 1569 } else if ((device_id & 0xff00) == 0x8400) {
e2b8cf4c 1570 id = V4L2_IDENT_CX25840 + ((device_id >> 4) & 0xf);
00ca7324 1571 } else if (device_id == 0x0000) {
c7dd1ecd 1572 id = get_cx2388x_ident(client);
149783b5 1573 } else if ((device_id & 0xfff0) == 0x5A30) {
c7dd1ecd
AW
1574 /* The CX23100 (0x5A3C = 23100) doesn't have an A/V decoder */
1575 id = V4L2_IDENT_CX2310X_AV;
1576 } else if ((device_id & 0xff) == (device_id >> 8)) {
1577 v4l_err(client,
1578 "likely a confused/unresponsive cx2388[578] A/V decoder"
1579 " found @ 0x%x (%s)\n",
1580 client->addr << 1, client->adapter->name);
1581 v4l_err(client, "A method to reset it from the cx25840 driver"
1582 " software is not known at this time\n");
1583 return -ENODEV;
1584 } else {
b5fc7144 1585 v4l_dbg(1, cx25840_debug, client, "cx25840 not found\n");
188f3457 1586 return -ENODEV;
bd985160
HV
1587 }
1588
21340ae0 1589 state = kzalloc(sizeof(struct cx25840_state), GFP_KERNEL);
9357b31c 1590 if (state == NULL)
21340ae0 1591 return -ENOMEM;
21340ae0 1592
9357b31c
HV
1593 sd = &state->sd;
1594 v4l2_i2c_subdev_init(sd, client, &cx25840_ops);
c7dd1ecd
AW
1595 switch (id) {
1596 case V4L2_IDENT_CX23885_AV:
1597 state->is_cx23885 = 1;
1598 v4l_info(client, "cx23885 A/V decoder found @ 0x%x (%s)\n",
1599 client->addr << 1, client->adapter->name);
1600 break;
1601 case V4L2_IDENT_CX23887_AV:
1602 state->is_cx23885 = 1;
1603 v4l_info(client, "cx23887 A/V decoder found @ 0x%x (%s)\n",
1604 client->addr << 1, client->adapter->name);
1605 break;
1606 case V4L2_IDENT_CX23888_AV:
1607 state->is_cx23885 = 1;
1608 v4l_info(client, "cx23888 A/V decoder found @ 0x%x (%s)\n",
1609 client->addr << 1, client->adapter->name);
1610 break;
1611 case V4L2_IDENT_CX2310X_AV:
1612 state->is_cx231xx = 1;
1613 v4l_info(client, "cx%d A/V decoder found @ 0x%x (%s)\n",
1614 device_id, client->addr << 1, client->adapter->name);
1615 break;
1616 case V4L2_IDENT_CX25840:
1617 case V4L2_IDENT_CX25841:
1618 case V4L2_IDENT_CX25842:
1619 case V4L2_IDENT_CX25843:
1620 /* Note: revision '(device_id & 0x0f) == 2' was never built. The
1621 marking skips from 0x1 == 22 to 0x3 == 23. */
1622 v4l_info(client, "cx25%3x-2%x found @ 0x%x (%s)\n",
1623 (device_id & 0xfff0) >> 4,
1624 (device_id & 0x0f) < 3 ? (device_id & 0x0f) + 1
1625 : (device_id & 0x0f),
1626 client->addr << 1, client->adapter->name);
1627 break;
1628 case V4L2_IDENT_CX25836:
1629 case V4L2_IDENT_CX25837:
1630 state->is_cx25836 = 1;
1631 default:
1632 v4l_info(client, "cx25%3x-%x found @ 0x%x (%s)\n",
1633 (device_id & 0xfff0) >> 4, device_id & 0x0f,
1634 client->addr << 1, client->adapter->name);
1635 break;
1636 }
bd985160 1637
21340ae0 1638 state->c = client;
a8bbf12a
HV
1639 state->vid_input = CX25840_COMPOSITE7;
1640 state->aud_input = CX25840_AUDIO8;
3578d3dd 1641 state->audclk_freq = 48000;
a8bbf12a 1642 state->pvr150_workaround = 0;
8a4b275f 1643 state->audmode = V4L2_TUNER_MODE_LANG1;
87410dab 1644 state->unmute_volume = -1;
ca130eef
HV
1645 state->default_volume = 228 - cx25840_read(client, 0x8d4);
1646 state->default_volume = ((state->default_volume / 2) + 23) << 9;
3e3bf277 1647 state->vbi_line_offset = 8;
e2b8cf4c 1648 state->id = id;
3434eb7e 1649 state->rev = device_id;
f234081b 1650
bd985160
HV
1651 return 0;
1652}
1653
1a39275a 1654static int cx25840_remove(struct i2c_client *client)
bd985160 1655{
9357b31c
HV
1656 struct v4l2_subdev *sd = i2c_get_clientdata(client);
1657
1658 v4l2_device_unregister_subdev(sd);
1659 kfree(to_state(sd));
bd985160
HV
1660 return 0;
1661}
1662
af294867
JD
1663static const struct i2c_device_id cx25840_id[] = {
1664 { "cx25840", 0 },
1665 { }
1666};
1667MODULE_DEVICE_TABLE(i2c, cx25840_id);
1668
1a39275a
HV
1669static struct v4l2_i2c_driver_data v4l2_i2c_data = {
1670 .name = "cx25840",
1a39275a
HV
1671 .probe = cx25840_probe,
1672 .remove = cx25840_remove,
af294867 1673 .id_table = cx25840_id,
bd985160 1674};