2 * experimental driver for simple i2c audio chips.
4 * Copyright (c) 2000 Gerd Knorr
6 * Eric Sandeen (eric_sandeen@bigfoot.com)
7 * Steve VanDeBogart (vandebo@uclink.berkeley.edu)
8 * Greg Alexander (galexand@acm.org)
10 * This code is placed under the terms of the GNU General Public License
13 * debug - set to 1 if you'd like to see debug messages
17 #include <linux/config.h>
18 #include <linux/module.h>
19 #include <linux/moduleparam.h>
20 #include <linux/kernel.h>
21 #include <linux/sched.h>
22 #include <linux/string.h>
23 #include <linux/timer.h>
24 #include <linux/delay.h>
25 #include <linux/errno.h>
26 #include <linux/slab.h>
27 #include <linux/videodev.h>
28 #include <linux/i2c.h>
29 #include <linux/i2c-algo-bit.h>
30 #include <linux/init.h>
31 #include <linux/smp_lock.h>
33 #include <media/audiochip.h>
38 /* ---------------------------------------------------------------------- */
41 static int debug
= 0; /* insmod parameter */
42 module_param(debug
, int, 0644);
44 MODULE_DESCRIPTION("device driver for various i2c TV sound decoder / audiomux chips");
45 MODULE_AUTHOR("Eric Sandeen, Steve VanDeBogart, Greg Alexander, Gerd Knorr");
46 MODULE_LICENSE("GPL");
50 #define tvaudio_info(fmt, arg...) do {\
51 printk(KERN_INFO "tvaudio %d-%04x: " fmt, \
52 chip->c.adapter->nr, chip->c.addr , ##arg); } while (0)
53 #define tvaudio_warn(fmt, arg...) do {\
54 printk(KERN_WARNING "tvaudio %d-%04x: " fmt, \
55 chip->c.adapter->nr, chip->c.addr , ##arg); } while (0)
56 #define tvaudio_dbg(fmt, arg...) do {\
58 printk(KERN_INFO "tvaudio %d-%04x: " fmt, \
59 chip->c.adapter->nr, chip->c.addr , ##arg); } while (0)
61 /* ---------------------------------------------------------------------- */
67 typedef int (*getvalue
)(int);
68 typedef int (*checkit
)(struct CHIPSTATE
*);
69 typedef int (*initialize
)(struct CHIPSTATE
*);
70 typedef int (*getmode
)(struct CHIPSTATE
*);
71 typedef void (*setmode
)(struct CHIPSTATE
*, int mode
);
72 typedef void (*checkmode
)(struct CHIPSTATE
*);
75 typedef struct AUDIOCMD
{
76 int count
; /* # of bytes to send */
77 unsigned char bytes
[MAXREGS
+1]; /* addr, data, data, ... */
80 /* chip description */
82 char *name
; /* chip name */
84 int addr_lo
, addr_hi
; /* i2c address range */
85 int registers
; /* # of registers */
89 initialize initialize
;
91 #define CHIP_HAS_VOLUME 1
92 #define CHIP_HAS_BASSTREBLE 2
93 #define CHIP_HAS_INPUTSEL 4
95 /* various i2c command sequences */
98 /* which register has which value */
99 int leftreg
,rightreg
,treblereg
,bassreg
;
101 /* initialize with (defaults to 65535/65535/32768/32768 */
102 int leftinit
,rightinit
,trebleinit
,bassinit
;
104 /* functions to convert the values (v4l -> chip) */
105 getvalue volfunc
,treblefunc
,bassfunc
;
111 /* check / autoswitch audio after channel switches */
114 /* input switch register + values for v4l inputs */
120 static struct CHIPDESC chiplist
[];
122 /* current state of the chip */
126 /* index into CHIPDESC array */
129 /* shadow register set */
132 /* current settings */
133 __u16 left
,right
,treble
,bass
,mode
;
139 struct completion texit
;
140 wait_queue_head_t wq
;
141 struct timer_list wt
;
146 #define VIDEO_MODE_RADIO 16 /* norm magic for radio mode */
148 /* ---------------------------------------------------------------------- */
151 static unsigned short normal_i2c
[] = {
163 static struct i2c_driver driver
;
164 static struct i2c_client client_template
;
167 /* ---------------------------------------------------------------------- */
168 /* i2c I/O functions */
170 static int chip_write(struct CHIPSTATE
*chip
, int subaddr
, int val
)
172 unsigned char buffer
[2];
175 tvaudio_dbg("%s: chip_write: 0x%x\n",
177 chip
->shadow
.bytes
[1] = val
;
179 if (1 != i2c_master_send(&chip
->c
,buffer
,1)) {
180 tvaudio_warn("%s: I/O error (write 0x%x)\n",
185 tvaudio_dbg("%s: chip_write: reg%d=0x%x\n",
186 chip
->c
.name
, subaddr
, val
);
187 chip
->shadow
.bytes
[subaddr
+1] = val
;
190 if (2 != i2c_master_send(&chip
->c
,buffer
,2)) {
191 tvaudio_warn("%s: I/O error (write reg%d=0x%x)\n",
192 chip
->c
.name
, subaddr
, val
);
199 static int chip_write_masked(struct CHIPSTATE
*chip
, int subaddr
, int val
, int mask
)
203 val
= (chip
->shadow
.bytes
[1] & ~mask
) | (val
& mask
);
205 val
= (chip
->shadow
.bytes
[subaddr
+1] & ~mask
) | (val
& mask
);
208 return chip_write(chip
, subaddr
, val
);
211 static int chip_read(struct CHIPSTATE
*chip
)
213 unsigned char buffer
;
215 if (1 != i2c_master_recv(&chip
->c
,&buffer
,1)) {
216 tvaudio_warn("%s: I/O error (read)\n",
220 tvaudio_dbg("%s: chip_read: 0x%x\n",chip
->c
.name
,buffer
);
224 static int chip_read2(struct CHIPSTATE
*chip
, int subaddr
)
226 unsigned char write
[1];
227 unsigned char read
[1];
228 struct i2c_msg msgs
[2] = {
229 { chip
->c
.addr
, 0, 1, write
},
230 { chip
->c
.addr
, I2C_M_RD
, 1, read
}
234 if (2 != i2c_transfer(chip
->c
.adapter
,msgs
,2)) {
235 tvaudio_warn("%s: I/O error (read2)\n", chip
->c
.name
);
238 tvaudio_dbg("%s: chip_read2: reg%d=0x%x\n",
239 chip
->c
.name
,subaddr
,read
[0]);
243 static int chip_cmd(struct CHIPSTATE
*chip
, char *name
, audiocmd
*cmd
)
250 /* update our shadow register set; print bytes if (debug > 0) */
251 tvaudio_dbg("%s: chip_cmd(%s): reg=%d, data:",
252 chip
->c
.name
,name
,cmd
->bytes
[0]);
253 for (i
= 1; i
< cmd
->count
; i
++) {
255 printk(" 0x%x",cmd
->bytes
[i
]);
256 chip
->shadow
.bytes
[i
+cmd
->bytes
[0]] = cmd
->bytes
[i
];
261 /* send data to the chip */
262 if (cmd
->count
!= i2c_master_send(&chip
->c
,cmd
->bytes
,cmd
->count
)) {
263 tvaudio_warn("%s: I/O error (%s)\n", chip
->c
.name
, name
);
269 /* ---------------------------------------------------------------------- */
270 /* kernel thread for doing i2c stuff asyncronly
271 * right now it is used only to check the audio mode (mono/stereo/whatever)
272 * some time after switching to another TV channel, then turn on stereo
276 static void chip_thread_wake(unsigned long data
)
278 struct CHIPSTATE
*chip
= (struct CHIPSTATE
*)data
;
279 wake_up_interruptible(&chip
->wq
);
282 static int chip_thread(void *data
)
284 DECLARE_WAITQUEUE(wait
, current
);
285 struct CHIPSTATE
*chip
= data
;
286 struct CHIPDESC
*desc
= chiplist
+ chip
->type
;
288 daemonize("%s", chip
->c
.name
);
289 allow_signal(SIGTERM
);
290 tvaudio_dbg("%s: thread started\n", chip
->c
.name
);
293 add_wait_queue(&chip
->wq
, &wait
);
295 set_current_state(TASK_INTERRUPTIBLE
);
298 remove_wait_queue(&chip
->wq
, &wait
);
300 if (chip
->done
|| signal_pending(current
))
302 tvaudio_dbg("%s: thread wakeup\n", chip
->c
.name
);
304 /* don't do anything for radio or if mode != auto */
305 if (chip
->norm
== VIDEO_MODE_RADIO
|| chip
->mode
!= 0)
308 /* have a look what's going on */
309 desc
->checkmode(chip
);
311 /* schedule next check */
312 mod_timer(&chip
->wt
, jiffies
+2*HZ
);
315 tvaudio_dbg("%s: thread exiting\n", chip
->c
.name
);
316 complete_and_exit(&chip
->texit
, 0);
320 static void generic_checkmode(struct CHIPSTATE
*chip
)
322 struct CHIPDESC
*desc
= chiplist
+ chip
->type
;
323 int mode
= desc
->getmode(chip
);
325 if (mode
== chip
->prevmode
)
328 tvaudio_dbg("%s: thread checkmode\n", chip
->c
.name
);
329 chip
->prevmode
= mode
;
331 if (mode
& VIDEO_SOUND_STEREO
)
332 desc
->setmode(chip
,VIDEO_SOUND_STEREO
);
333 else if (mode
& VIDEO_SOUND_LANG1
)
334 desc
->setmode(chip
,VIDEO_SOUND_LANG1
);
335 else if (mode
& VIDEO_SOUND_LANG2
)
336 desc
->setmode(chip
,VIDEO_SOUND_LANG2
);
338 desc
->setmode(chip
,VIDEO_SOUND_MONO
);
341 /* ---------------------------------------------------------------------- */
342 /* audio chip descriptions - defines+functions for tda9840 */
344 #define TDA9840_SW 0x00
345 #define TDA9840_LVADJ 0x02
346 #define TDA9840_STADJ 0x03
347 #define TDA9840_TEST 0x04
349 #define TDA9840_MONO 0x10
350 #define TDA9840_STEREO 0x2a
351 #define TDA9840_DUALA 0x12
352 #define TDA9840_DUALB 0x1e
353 #define TDA9840_DUALAB 0x1a
354 #define TDA9840_DUALBA 0x16
355 #define TDA9840_EXTERNAL 0x7a
357 #define TDA9840_DS_DUAL 0x20 /* Dual sound identified */
358 #define TDA9840_ST_STEREO 0x40 /* Stereo sound identified */
359 #define TDA9840_PONRES 0x80 /* Power-on reset detected if = 1 */
361 #define TDA9840_TEST_INT1SN 0x1 /* Integration time 0.5s when set */
362 #define TDA9840_TEST_INTFU 0x02 /* Disables integrator function */
364 static int tda9840_getmode(struct CHIPSTATE
*chip
)
368 val
= chip_read(chip
);
369 mode
= VIDEO_SOUND_MONO
;
370 if (val
& TDA9840_DS_DUAL
)
371 mode
|= VIDEO_SOUND_LANG1
| VIDEO_SOUND_LANG2
;
372 if (val
& TDA9840_ST_STEREO
)
373 mode
|= VIDEO_SOUND_STEREO
;
375 tvaudio_dbg ("tda9840_getmode(): raw chip read: %d, return: %d\n",
380 static void tda9840_setmode(struct CHIPSTATE
*chip
, int mode
)
383 int t
= chip
->shadow
.bytes
[TDA9840_SW
+ 1] & ~0x7e;
386 case VIDEO_SOUND_MONO
:
389 case VIDEO_SOUND_STEREO
:
392 case VIDEO_SOUND_LANG1
:
395 case VIDEO_SOUND_LANG2
:
403 chip_write(chip
, TDA9840_SW
, t
);
406 /* ---------------------------------------------------------------------- */
407 /* audio chip descriptions - defines+functions for tda985x */
409 /* subaddresses for TDA9855 */
410 #define TDA9855_VR 0x00 /* Volume, right */
411 #define TDA9855_VL 0x01 /* Volume, left */
412 #define TDA9855_BA 0x02 /* Bass */
413 #define TDA9855_TR 0x03 /* Treble */
414 #define TDA9855_SW 0x04 /* Subwoofer - not connected on DTV2000 */
416 /* subaddresses for TDA9850 */
417 #define TDA9850_C4 0x04 /* Control 1 for TDA9850 */
419 /* subaddesses for both chips */
420 #define TDA985x_C5 0x05 /* Control 2 for TDA9850, Control 1 for TDA9855 */
421 #define TDA985x_C6 0x06 /* Control 3 for TDA9850, Control 2 for TDA9855 */
422 #define TDA985x_C7 0x07 /* Control 4 for TDA9850, Control 3 for TDA9855 */
423 #define TDA985x_A1 0x08 /* Alignment 1 for both chips */
424 #define TDA985x_A2 0x09 /* Alignment 2 for both chips */
425 #define TDA985x_A3 0x0a /* Alignment 3 for both chips */
427 /* Masks for bits in TDA9855 subaddresses */
428 /* 0x00 - VR in TDA9855 */
429 /* 0x01 - VL in TDA9855 */
430 /* lower 7 bits control gain from -71dB (0x28) to 16dB (0x7f)
431 * in 1dB steps - mute is 0x27 */
434 /* 0x02 - BA in TDA9855 */
435 /* lower 5 bits control bass gain from -12dB (0x06) to 16.5dB (0x19)
436 * in .5dB steps - 0 is 0x0E */
439 /* 0x03 - TR in TDA9855 */
440 /* 4 bits << 1 control treble gain from -12dB (0x3) to 12dB (0xb)
441 * in 3dB steps - 0 is 0x7 */
443 /* Masks for bits in both chips' subaddresses */
444 /* 0x04 - SW in TDA9855, C4/Control 1 in TDA9850 */
445 /* Unique to TDA9855: */
446 /* 4 bits << 2 control subwoofer/surround gain from -14db (0x1) to 14db (0xf)
447 * in 3dB steps - mute is 0x0 */
449 /* Unique to TDA9850: */
450 /* lower 4 bits control stereo noise threshold, over which stereo turns off
451 * set to values of 0x00 through 0x0f for Ster1 through Ster16 */
454 /* 0x05 - C5 - Control 1 in TDA9855 , Control 2 in TDA9850*/
455 /* Unique to TDA9855: */
456 #define TDA9855_MUTE 1<<7 /* GMU, Mute at outputs */
457 #define TDA9855_AVL 1<<6 /* AVL, Automatic Volume Level */
458 #define TDA9855_LOUD 1<<5 /* Loudness, 1==off */
459 #define TDA9855_SUR 1<<3 /* Surround / Subwoofer 1==.5(L-R) 0==.5(L+R) */
460 /* Bits 0 to 3 select various combinations
461 * of line in and line out, only the
462 * interesting ones are defined */
463 #define TDA9855_EXT 1<<2 /* Selects inputs LIR and LIL. Pins 41 & 12 */
464 #define TDA9855_INT 0 /* Selects inputs LOR and LOL. (internal) */
466 /* Unique to TDA9850: */
467 /* lower 4 bits contol SAP noise threshold, over which SAP turns off
468 * set to values of 0x00 through 0x0f for SAP1 through SAP16 */
471 /* 0x06 - C6 - Control 2 in TDA9855, Control 3 in TDA9850 */
472 /* Common to TDA9855 and TDA9850: */
473 #define TDA985x_SAP 3<<6 /* Selects SAP output, mute if not received */
474 #define TDA985x_STEREO 1<<6 /* Selects Stereo ouput, mono if not received */
475 #define TDA985x_MONO 0 /* Forces Mono output */
476 #define TDA985x_LMU 1<<3 /* Mute (LOR/LOL for 9855, OUTL/OUTR for 9850) */
478 /* Unique to TDA9855: */
479 #define TDA9855_TZCM 1<<5 /* If set, don't mute till zero crossing */
480 #define TDA9855_VZCM 1<<4 /* If set, don't change volume till zero crossing*/
481 #define TDA9855_LINEAR 0 /* Linear Stereo */
482 #define TDA9855_PSEUDO 1 /* Pseudo Stereo */
483 #define TDA9855_SPAT_30 2 /* Spatial Stereo, 30% anti-phase crosstalk */
484 #define TDA9855_SPAT_50 3 /* Spatial Stereo, 52% anti-phase crosstalk */
485 #define TDA9855_E_MONO 7 /* Forced mono - mono select elseware, so useless*/
487 /* 0x07 - C7 - Control 3 in TDA9855, Control 4 in TDA9850 */
488 /* Common to both TDA9855 and TDA9850: */
489 /* lower 4 bits control input gain from -3.5dB (0x0) to 4dB (0xF)
490 * in .5dB steps - 0dB is 0x7 */
492 /* 0x08, 0x09 - A1 and A2 (read/write) */
493 /* Common to both TDA9855 and TDA9850: */
494 /* lower 5 bites are wideband and spectral expander alignment
495 * from 0x00 to 0x1f - nominal at 0x0f and 0x10 (read/write) */
496 #define TDA985x_STP 1<<5 /* Stereo Pilot/detect (read-only) */
497 #define TDA985x_SAPP 1<<6 /* SAP Pilot/detect (read-only) */
498 #define TDA985x_STS 1<<7 /* Stereo trigger 1= <35mV 0= <30mV (write-only)*/
501 /* Common to both TDA9855 and TDA9850: */
502 /* lower 3 bits control timing current for alignment: -30% (0x0), -20% (0x1),
503 * -10% (0x2), nominal (0x3), +10% (0x6), +20% (0x5), +30% (0x4) */
504 #define TDA985x_ADJ 1<<7 /* Stereo adjust on/off (wideband and spectral */
506 static int tda9855_volume(int val
) { return val
/0x2e8+0x27; }
507 static int tda9855_bass(int val
) { return val
/0xccc+0x06; }
508 static int tda9855_treble(int val
) { return (val
/0x1c71+0x3)<<1; }
510 static int tda985x_getmode(struct CHIPSTATE
*chip
)
514 mode
= ((TDA985x_STP
| TDA985x_SAPP
) &
515 chip_read(chip
)) >> 4;
516 /* Add mono mode regardless of SAP and stereo */
517 /* Allows forced mono */
518 return mode
| VIDEO_SOUND_MONO
;
521 static void tda985x_setmode(struct CHIPSTATE
*chip
, int mode
)
524 int c6
= chip
->shadow
.bytes
[TDA985x_C6
+1] & 0x3f;
527 case VIDEO_SOUND_MONO
:
530 case VIDEO_SOUND_STEREO
:
531 c6
|= TDA985x_STEREO
;
533 case VIDEO_SOUND_LANG1
:
540 chip_write(chip
,TDA985x_C6
,c6
);
544 /* ---------------------------------------------------------------------- */
545 /* audio chip descriptions - defines+functions for tda9873h */
547 /* Subaddresses for TDA9873H */
549 #define TDA9873_SW 0x00 /* Switching */
550 #define TDA9873_AD 0x01 /* Adjust */
551 #define TDA9873_PT 0x02 /* Port */
553 /* Subaddress 0x00: Switching Data
556 * B1, B0: Input source selection
558 * 1, 0 external stereo
561 #define TDA9873_INP_MASK 3
562 #define TDA9873_INTERNAL 0
563 #define TDA9873_EXT_STEREO 2
564 #define TDA9873_EXT_MONO 1
566 /* B3, B2: output signal select
567 * B4 : transmission mode
570 * 1, 1, 1 Stereo (reversed channel)
577 #define TDA9873_TR_MASK (7 << 2)
578 #define TDA9873_TR_MONO 4
579 #define TDA9873_TR_STEREO 1 << 4
580 #define TDA9873_TR_REVERSE (1 << 3) & (1 << 2)
581 #define TDA9873_TR_DUALA 1 << 2
582 #define TDA9873_TR_DUALB 1 << 3
584 /* output level controls
585 * B5: output level switch (0 = reduced gain, 1 = normal gain)
586 * B6: mute (1 = muted)
587 * B7: auto-mute (1 = auto-mute enabled)
590 #define TDA9873_GAIN_NORMAL 1 << 5
591 #define TDA9873_MUTE 1 << 6
592 #define TDA9873_AUTOMUTE 1 << 7
594 /* Subaddress 0x01: Adjust/standard */
596 /* Lower 4 bits (C3..C0) control stereo adjustment on R channel (-0.6 - +0.7 dB)
597 * Recommended value is +0 dB
600 #define TDA9873_STEREO_ADJ 0x06 /* 0dB gain */
602 /* Bits C6..C4 control FM stantard
604 * 0, 0, 0 B/G (PAL FM)
613 #define TDA9873_DK1 2
614 #define TDA9873_DK2 3
615 #define TDA9873_DK3 4
618 /* C7 controls identification response time (1=fast/0=normal)
620 #define TDA9873_IDR_NORM 0
621 #define TDA9873_IDR_FAST 1 << 7
624 /* Subaddress 0x02: Port data */
626 /* E1, E0 free programmable ports P1/P2
633 #define TDA9873_PORTS 3
636 #define TDA9873_TST_PORT 1 << 2
638 /* E5..E3 control mono output channel (together with transmission mode bit B4)
643 * 0 1 0 1 mono (from stereo decoder)
645 #define TDA9873_MOUT_MONO 0
646 #define TDA9873_MOUT_FMONO 0
647 #define TDA9873_MOUT_DUALA 0
648 #define TDA9873_MOUT_DUALB 1 << 3
649 #define TDA9873_MOUT_ST 1 << 4
650 #define TDA9873_MOUT_EXTM (1 << 4 ) & (1 << 3)
651 #define TDA9873_MOUT_EXTL 1 << 5
652 #define TDA9873_MOUT_EXTR (1 << 5 ) & (1 << 3)
653 #define TDA9873_MOUT_EXTLR (1 << 5 ) & (1 << 4)
654 #define TDA9873_MOUT_MUTE (1 << 5 ) & (1 << 4) & (1 << 3)
656 /* Status bits: (chip read) */
657 #define TDA9873_PONR 0 /* Power-on reset detected if = 1 */
658 #define TDA9873_STEREO 2 /* Stereo sound is identified */
659 #define TDA9873_DUAL 4 /* Dual sound is identified */
661 static int tda9873_getmode(struct CHIPSTATE
*chip
)
665 val
= chip_read(chip
);
666 mode
= VIDEO_SOUND_MONO
;
667 if (val
& TDA9873_STEREO
)
668 mode
|= VIDEO_SOUND_STEREO
;
669 if (val
& TDA9873_DUAL
)
670 mode
|= VIDEO_SOUND_LANG1
| VIDEO_SOUND_LANG2
;
671 tvaudio_dbg ("tda9873_getmode(): raw chip read: %d, return: %d\n",
676 static void tda9873_setmode(struct CHIPSTATE
*chip
, int mode
)
678 int sw_data
= chip
->shadow
.bytes
[TDA9873_SW
+1] & ~ TDA9873_TR_MASK
;
679 /* int adj_data = chip->shadow.bytes[TDA9873_AD+1] ; */
681 if ((sw_data
& TDA9873_INP_MASK
) != TDA9873_INTERNAL
) {
682 tvaudio_dbg("tda9873_setmode(): external input\n");
686 tvaudio_dbg("tda9873_setmode(): chip->shadow.bytes[%d] = %d\n", TDA9873_SW
+1, chip
->shadow
.bytes
[TDA9873_SW
+1]);
687 tvaudio_dbg("tda9873_setmode(): sw_data = %d\n", sw_data
);
690 case VIDEO_SOUND_MONO
:
691 sw_data
|= TDA9873_TR_MONO
;
693 case VIDEO_SOUND_STEREO
:
694 sw_data
|= TDA9873_TR_STEREO
;
696 case VIDEO_SOUND_LANG1
:
697 sw_data
|= TDA9873_TR_DUALA
;
699 case VIDEO_SOUND_LANG2
:
700 sw_data
|= TDA9873_TR_DUALB
;
707 chip_write(chip
, TDA9873_SW
, sw_data
);
708 tvaudio_dbg("tda9873_setmode(): req. mode %d; chip_write: %d\n",
712 static int tda9873_checkit(struct CHIPSTATE
*chip
)
716 if (-1 == (rc
= chip_read2(chip
,254)))
718 return (rc
& ~0x1f) == 0x80;
722 /* ---------------------------------------------------------------------- */
723 /* audio chip description - defines+functions for tda9874h and tda9874a */
724 /* Dariusz Kowalewski <darekk@automex.pl> */
726 /* Subaddresses for TDA9874H and TDA9874A (slave rx) */
727 #define TDA9874A_AGCGR 0x00 /* AGC gain */
728 #define TDA9874A_GCONR 0x01 /* general config */
729 #define TDA9874A_MSR 0x02 /* monitor select */
730 #define TDA9874A_C1FRA 0x03 /* carrier 1 freq. */
731 #define TDA9874A_C1FRB 0x04 /* carrier 1 freq. */
732 #define TDA9874A_C1FRC 0x05 /* carrier 1 freq. */
733 #define TDA9874A_C2FRA 0x06 /* carrier 2 freq. */
734 #define TDA9874A_C2FRB 0x07 /* carrier 2 freq. */
735 #define TDA9874A_C2FRC 0x08 /* carrier 2 freq. */
736 #define TDA9874A_DCR 0x09 /* demodulator config */
737 #define TDA9874A_FMER 0x0a /* FM de-emphasis */
738 #define TDA9874A_FMMR 0x0b /* FM dematrix */
739 #define TDA9874A_C1OLAR 0x0c /* ch.1 output level adj. */
740 #define TDA9874A_C2OLAR 0x0d /* ch.2 output level adj. */
741 #define TDA9874A_NCONR 0x0e /* NICAM config */
742 #define TDA9874A_NOLAR 0x0f /* NICAM output level adj. */
743 #define TDA9874A_NLELR 0x10 /* NICAM lower error limit */
744 #define TDA9874A_NUELR 0x11 /* NICAM upper error limit */
745 #define TDA9874A_AMCONR 0x12 /* audio mute control */
746 #define TDA9874A_SDACOSR 0x13 /* stereo DAC output select */
747 #define TDA9874A_AOSR 0x14 /* analog output select */
748 #define TDA9874A_DAICONR 0x15 /* digital audio interface config */
749 #define TDA9874A_I2SOSR 0x16 /* I2S-bus output select */
750 #define TDA9874A_I2SOLAR 0x17 /* I2S-bus output level adj. */
751 #define TDA9874A_MDACOSR 0x18 /* mono DAC output select (tda9874a) */
752 #define TDA9874A_ESP 0xFF /* easy standard progr. (tda9874a) */
754 /* Subaddresses for TDA9874H and TDA9874A (slave tx) */
755 #define TDA9874A_DSR 0x00 /* device status */
756 #define TDA9874A_NSR 0x01 /* NICAM status */
757 #define TDA9874A_NECR 0x02 /* NICAM error count */
758 #define TDA9874A_DR1 0x03 /* add. data LSB */
759 #define TDA9874A_DR2 0x04 /* add. data MSB */
760 #define TDA9874A_LLRA 0x05 /* monitor level read-out LSB */
761 #define TDA9874A_LLRB 0x06 /* monitor level read-out MSB */
762 #define TDA9874A_SIFLR 0x07 /* SIF level */
763 #define TDA9874A_TR2 252 /* test reg. 2 */
764 #define TDA9874A_TR1 253 /* test reg. 1 */
765 #define TDA9874A_DIC 254 /* device id. code */
766 #define TDA9874A_SIC 255 /* software id. code */
769 static int tda9874a_mode
= 1; /* 0: A2, 1: NICAM */
770 static int tda9874a_GCONR
= 0xc0; /* default config. input pin: SIFSEL=0 */
771 static int tda9874a_NCONR
= 0x01; /* default NICAM config.: AMSEL=0,AMUTE=1 */
772 static int tda9874a_ESP
= 0x07; /* default standard: NICAM D/K */
773 static int tda9874a_dic
= -1; /* device id. code */
775 /* insmod options for tda9874a */
776 static unsigned int tda9874a_SIF
= UNSET
;
777 static unsigned int tda9874a_AMSEL
= UNSET
;
778 static unsigned int tda9874a_STD
= UNSET
;
779 module_param(tda9874a_SIF
, int, 0444);
780 module_param(tda9874a_AMSEL
, int, 0444);
781 module_param(tda9874a_STD
, int, 0444);
784 * initialization table for tda9874 decoder:
785 * - carrier 1 freq. registers (3 bytes)
786 * - carrier 2 freq. registers (3 bytes)
787 * - demudulator config register
788 * - FM de-emphasis register (slow identification mode)
789 * Note: frequency registers must be written in single i2c transfer.
791 static struct tda9874a_MODES
{
794 } tda9874a_modelist
[9] = {
796 { 9, { TDA9874A_C1FRA
, 0x72,0x95,0x55, 0x77,0xA0,0x00, 0x00,0x00 }} },
798 { 9, { TDA9874A_C1FRA
, 0x5D,0xC0,0x00, 0x62,0x6A,0xAA, 0x20,0x22 }} },
800 { 9, { TDA9874A_C1FRA
, 0x87,0x6A,0xAA, 0x82,0x60,0x00, 0x00,0x00 }} },
802 { 9, { TDA9874A_C1FRA
, 0x87,0x6A,0xAA, 0x8C,0x75,0x55, 0x00,0x00 }} },
804 { 9, { TDA9874A_C1FRA
, 0x87,0x6A,0xAA, 0x77,0xA0,0x00, 0x00,0x00 }} },
806 { 9, { TDA9874A_C1FRA
, 0x7D,0x00,0x00, 0x88,0x8A,0xAA, 0x08,0x33 }} },
808 { 9, { TDA9874A_C1FRA
, 0x72,0x95,0x55, 0x79,0xEA,0xAA, 0x08,0x33 }} },
809 { "NICAM, D/K", /* default */
810 { 9, { TDA9874A_C1FRA
, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x08,0x33 }} },
812 { 9, { TDA9874A_C1FRA
, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x09,0x33 }} }
815 static int tda9874a_setup(struct CHIPSTATE
*chip
)
817 chip_write(chip
, TDA9874A_AGCGR
, 0x00); /* 0 dB */
818 chip_write(chip
, TDA9874A_GCONR
, tda9874a_GCONR
);
819 chip_write(chip
, TDA9874A_MSR
, (tda9874a_mode
) ? 0x03:0x02);
820 if(tda9874a_dic
== 0x11) {
821 chip_write(chip
, TDA9874A_FMMR
, 0x80);
822 } else { /* dic == 0x07 */
823 chip_cmd(chip
,"tda9874_modelist",&tda9874a_modelist
[tda9874a_STD
].cmd
);
824 chip_write(chip
, TDA9874A_FMMR
, 0x00);
826 chip_write(chip
, TDA9874A_C1OLAR
, 0x00); /* 0 dB */
827 chip_write(chip
, TDA9874A_C2OLAR
, 0x00); /* 0 dB */
828 chip_write(chip
, TDA9874A_NCONR
, tda9874a_NCONR
);
829 chip_write(chip
, TDA9874A_NOLAR
, 0x00); /* 0 dB */
830 /* Note: If signal quality is poor you may want to change NICAM */
831 /* error limit registers (NLELR and NUELR) to some greater values. */
832 /* Then the sound would remain stereo, but won't be so clear. */
833 chip_write(chip
, TDA9874A_NLELR
, 0x14); /* default */
834 chip_write(chip
, TDA9874A_NUELR
, 0x50); /* default */
836 if(tda9874a_dic
== 0x11) {
837 chip_write(chip
, TDA9874A_AMCONR
, 0xf9);
838 chip_write(chip
, TDA9874A_SDACOSR
, (tda9874a_mode
) ? 0x81:0x80);
839 chip_write(chip
, TDA9874A_AOSR
, 0x80);
840 chip_write(chip
, TDA9874A_MDACOSR
, (tda9874a_mode
) ? 0x82:0x80);
841 chip_write(chip
, TDA9874A_ESP
, tda9874a_ESP
);
842 } else { /* dic == 0x07 */
843 chip_write(chip
, TDA9874A_AMCONR
, 0xfb);
844 chip_write(chip
, TDA9874A_SDACOSR
, (tda9874a_mode
) ? 0x81:0x80);
845 chip_write(chip
, TDA9874A_AOSR
, 0x00); /* or 0x10 */
847 tvaudio_dbg("tda9874a_setup(): %s [0x%02X].\n",
848 tda9874a_modelist
[tda9874a_STD
].name
,tda9874a_STD
);
852 static int tda9874a_getmode(struct CHIPSTATE
*chip
)
855 int necr
; /* just for debugging */
857 mode
= VIDEO_SOUND_MONO
;
859 if(-1 == (dsr
= chip_read2(chip
,TDA9874A_DSR
)))
861 if(-1 == (nsr
= chip_read2(chip
,TDA9874A_NSR
)))
863 if(-1 == (necr
= chip_read2(chip
,TDA9874A_NECR
)))
866 /* need to store dsr/nsr somewhere */
867 chip
->shadow
.bytes
[MAXREGS
-2] = dsr
;
868 chip
->shadow
.bytes
[MAXREGS
-1] = nsr
;
871 /* Note: DSR.RSSF and DSR.AMSTAT bits are also checked.
872 * If NICAM auto-muting is enabled, DSR.AMSTAT=1 indicates
873 * that sound has (temporarily) switched from NICAM to
874 * mono FM (or AM) on 1st sound carrier due to high NICAM bit
875 * error count. So in fact there is no stereo in this case :-(
876 * But changing the mode to VIDEO_SOUND_MONO would switch
877 * external 4052 multiplexer in audio_hook().
879 if(nsr
& 0x02) /* NSR.S/MB=1 */
880 mode
|= VIDEO_SOUND_STEREO
;
881 if(nsr
& 0x01) /* NSR.D/SB=1 */
882 mode
|= VIDEO_SOUND_LANG1
| VIDEO_SOUND_LANG2
;
884 if(dsr
& 0x02) /* DSR.IDSTE=1 */
885 mode
|= VIDEO_SOUND_STEREO
;
886 if(dsr
& 0x04) /* DSR.IDDUA=1 */
887 mode
|= VIDEO_SOUND_LANG1
| VIDEO_SOUND_LANG2
;
890 tvaudio_dbg("tda9874a_getmode(): DSR=0x%X, NSR=0x%X, NECR=0x%X, return: %d.\n",
891 dsr
, nsr
, necr
, mode
);
895 static void tda9874a_setmode(struct CHIPSTATE
*chip
, int mode
)
897 /* Disable/enable NICAM auto-muting (based on DSR.RSSF status bit). */
898 /* If auto-muting is disabled, we can hear a signal of degrading quality. */
900 if(chip
->shadow
.bytes
[MAXREGS
-2] & 0x20) /* DSR.RSSF=1 */
901 tda9874a_NCONR
&= 0xfe; /* enable */
903 tda9874a_NCONR
|= 0x01; /* disable */
904 chip_write(chip
, TDA9874A_NCONR
, tda9874a_NCONR
);
907 /* Note: TDA9874A supports automatic FM dematrixing (FMMR register)
908 * and has auto-select function for audio output (AOSR register).
909 * Old TDA9874H doesn't support these features.
910 * TDA9874A also has additional mono output pin (OUTM), which
911 * on same (all?) tv-cards is not used, anyway (as well as MONOIN).
913 if(tda9874a_dic
== 0x11) {
915 int mdacosr
= (tda9874a_mode
) ? 0x82:0x80;
918 case VIDEO_SOUND_MONO
:
919 case VIDEO_SOUND_STEREO
:
921 case VIDEO_SOUND_LANG1
:
922 aosr
= 0x80; /* auto-select, dual A/A */
923 mdacosr
= (tda9874a_mode
) ? 0x82:0x80;
925 case VIDEO_SOUND_LANG2
:
926 aosr
= 0xa0; /* auto-select, dual B/B */
927 mdacosr
= (tda9874a_mode
) ? 0x83:0x81;
933 chip_write(chip
, TDA9874A_AOSR
, aosr
);
934 chip_write(chip
, TDA9874A_MDACOSR
, mdacosr
);
936 tvaudio_dbg("tda9874a_setmode(): req. mode %d; AOSR=0x%X, MDACOSR=0x%X.\n",
937 mode
, aosr
, mdacosr
);
939 } else { /* dic == 0x07 */
943 case VIDEO_SOUND_MONO
:
944 fmmr
= 0x00; /* mono */
945 aosr
= 0x10; /* A/A */
947 case VIDEO_SOUND_STEREO
:
950 aosr
= 0x00; /* handled by NICAM auto-mute */
952 fmmr
= (tda9874a_ESP
== 1) ? 0x05 : 0x04; /* stereo */
956 case VIDEO_SOUND_LANG1
:
957 fmmr
= 0x02; /* dual */
958 aosr
= 0x10; /* dual A/A */
960 case VIDEO_SOUND_LANG2
:
961 fmmr
= 0x02; /* dual */
962 aosr
= 0x20; /* dual B/B */
968 chip_write(chip
, TDA9874A_FMMR
, fmmr
);
969 chip_write(chip
, TDA9874A_AOSR
, aosr
);
971 tvaudio_dbg("tda9874a_setmode(): req. mode %d; FMMR=0x%X, AOSR=0x%X.\n",
976 static int tda9874a_checkit(struct CHIPSTATE
*chip
)
978 int dic
,sic
; /* device id. and software id. codes */
980 if(-1 == (dic
= chip_read2(chip
,TDA9874A_DIC
)))
982 if(-1 == (sic
= chip_read2(chip
,TDA9874A_SIC
)))
985 tvaudio_dbg("tda9874a_checkit(): DIC=0x%X, SIC=0x%X.\n", dic
, sic
);
987 if((dic
== 0x11)||(dic
== 0x07)) {
988 tvaudio_info("found tda9874%s.\n", (dic
== 0x11) ? "a":"h");
989 tda9874a_dic
= dic
; /* remember device id. */
992 return 0; /* not found */
995 static int tda9874a_initialize(struct CHIPSTATE
*chip
)
997 if (tda9874a_SIF
> 2)
999 if (tda9874a_STD
> 8)
1001 if(tda9874a_AMSEL
> 1)
1004 if(tda9874a_SIF
== 1)
1005 tda9874a_GCONR
= 0xc0; /* sound IF input 1 */
1007 tda9874a_GCONR
= 0xc1; /* sound IF input 2 */
1009 tda9874a_ESP
= tda9874a_STD
;
1010 tda9874a_mode
= (tda9874a_STD
< 5) ? 0 : 1;
1012 if(tda9874a_AMSEL
== 0)
1013 tda9874a_NCONR
= 0x01; /* auto-mute: analog mono input */
1015 tda9874a_NCONR
= 0x05; /* auto-mute: 1st carrier FM or AM */
1017 tda9874a_setup(chip
);
1022 /* ---------------------------------------------------------------------- */
1023 /* audio chip descriptions - defines+functions for tea6420 */
1025 #define TEA6300_VL 0x00 /* volume left */
1026 #define TEA6300_VR 0x01 /* volume right */
1027 #define TEA6300_BA 0x02 /* bass */
1028 #define TEA6300_TR 0x03 /* treble */
1029 #define TEA6300_FA 0x04 /* fader control */
1030 #define TEA6300_S 0x05 /* switch register */
1031 /* values for those registers: */
1032 #define TEA6300_S_SA 0x01 /* stereo A input */
1033 #define TEA6300_S_SB 0x02 /* stereo B */
1034 #define TEA6300_S_SC 0x04 /* stereo C */
1035 #define TEA6300_S_GMU 0x80 /* general mute */
1037 #define TEA6320_V 0x00 /* volume (0-5)/loudness off (6)/zero crossing mute(7) */
1038 #define TEA6320_FFR 0x01 /* fader front right (0-5) */
1039 #define TEA6320_FFL 0x02 /* fader front left (0-5) */
1040 #define TEA6320_FRR 0x03 /* fader rear right (0-5) */
1041 #define TEA6320_FRL 0x04 /* fader rear left (0-5) */
1042 #define TEA6320_BA 0x05 /* bass (0-4) */
1043 #define TEA6320_TR 0x06 /* treble (0-4) */
1044 #define TEA6320_S 0x07 /* switch register */
1045 /* values for those registers: */
1046 #define TEA6320_S_SA 0x07 /* stereo A input */
1047 #define TEA6320_S_SB 0x06 /* stereo B */
1048 #define TEA6320_S_SC 0x05 /* stereo C */
1049 #define TEA6320_S_SD 0x04 /* stereo D */
1050 #define TEA6320_S_GMU 0x80 /* general mute */
1052 #define TEA6420_S_SA 0x00 /* stereo A input */
1053 #define TEA6420_S_SB 0x01 /* stereo B */
1054 #define TEA6420_S_SC 0x02 /* stereo C */
1055 #define TEA6420_S_SD 0x03 /* stereo D */
1056 #define TEA6420_S_SE 0x04 /* stereo E */
1057 #define TEA6420_S_GMU 0x05 /* general mute */
1059 static int tea6300_shift10(int val
) { return val
>> 10; }
1060 static int tea6300_shift12(int val
) { return val
>> 12; }
1062 /* Assumes 16bit input (values 0x3f to 0x0c are unique, values less than */
1063 /* 0x0c mirror those immediately higher) */
1064 static int tea6320_volume(int val
) { return (val
/ (65535/(63-12)) + 12) & 0x3f; }
1065 static int tea6320_shift11(int val
) { return val
>> 11; }
1066 static int tea6320_initialize(struct CHIPSTATE
* chip
)
1068 chip_write(chip
, TEA6320_FFR
, 0x3f);
1069 chip_write(chip
, TEA6320_FFL
, 0x3f);
1070 chip_write(chip
, TEA6320_FRR
, 0x3f);
1071 chip_write(chip
, TEA6320_FRL
, 0x3f);
1077 /* ---------------------------------------------------------------------- */
1078 /* audio chip descriptions - defines+functions for tda8425 */
1080 #define TDA8425_VL 0x00 /* volume left */
1081 #define TDA8425_VR 0x01 /* volume right */
1082 #define TDA8425_BA 0x02 /* bass */
1083 #define TDA8425_TR 0x03 /* treble */
1084 #define TDA8425_S1 0x08 /* switch functions */
1085 /* values for those registers: */
1086 #define TDA8425_S1_OFF 0xEE /* audio off (mute on) */
1087 #define TDA8425_S1_CH1 0xCE /* audio channel 1 (mute off) - "linear stereo" mode */
1088 #define TDA8425_S1_CH2 0xCF /* audio channel 2 (mute off) - "linear stereo" mode */
1089 #define TDA8425_S1_MU 0x20 /* mute bit */
1090 #define TDA8425_S1_STEREO 0x18 /* stereo bits */
1091 #define TDA8425_S1_STEREO_SPATIAL 0x18 /* spatial stereo */
1092 #define TDA8425_S1_STEREO_LINEAR 0x08 /* linear stereo */
1093 #define TDA8425_S1_STEREO_PSEUDO 0x10 /* pseudo stereo */
1094 #define TDA8425_S1_STEREO_MONO 0x00 /* forced mono */
1095 #define TDA8425_S1_ML 0x06 /* language selector */
1096 #define TDA8425_S1_ML_SOUND_A 0x02 /* sound a */
1097 #define TDA8425_S1_ML_SOUND_B 0x04 /* sound b */
1098 #define TDA8425_S1_ML_STEREO 0x06 /* stereo */
1099 #define TDA8425_S1_IS 0x01 /* channel selector */
1102 static int tda8425_shift10(int val
) { return (val
>> 10) | 0xc0; }
1103 static int tda8425_shift12(int val
) { return (val
>> 12) | 0xf0; }
1105 static int tda8425_initialize(struct CHIPSTATE
*chip
)
1107 struct CHIPDESC
*desc
= chiplist
+ chip
->type
;
1108 int inputmap
[8] = { /* tuner */ TDA8425_S1_CH2
, /* radio */ TDA8425_S1_CH1
,
1109 /* extern */ TDA8425_S1_CH1
, /* intern */ TDA8425_S1_OFF
,
1110 /* off */ TDA8425_S1_OFF
, /* on */ TDA8425_S1_CH2
};
1112 if (chip
->c
.adapter
->id
== I2C_HW_B_RIVA
) {
1113 memcpy (desc
->inputmap
, inputmap
, sizeof (inputmap
));
1118 static void tda8425_setmode(struct CHIPSTATE
*chip
, int mode
)
1120 int s1
= chip
->shadow
.bytes
[TDA8425_S1
+1] & 0xe1;
1122 if (mode
& VIDEO_SOUND_LANG1
) {
1123 s1
|= TDA8425_S1_ML_SOUND_A
;
1124 s1
|= TDA8425_S1_STEREO_PSEUDO
;
1126 } else if (mode
& VIDEO_SOUND_LANG2
) {
1127 s1
|= TDA8425_S1_ML_SOUND_B
;
1128 s1
|= TDA8425_S1_STEREO_PSEUDO
;
1131 s1
|= TDA8425_S1_ML_STEREO
;
1133 if (mode
& VIDEO_SOUND_MONO
)
1134 s1
|= TDA8425_S1_STEREO_MONO
;
1135 if (mode
& VIDEO_SOUND_STEREO
)
1136 s1
|= TDA8425_S1_STEREO_SPATIAL
;
1138 chip_write(chip
,TDA8425_S1
,s1
);
1142 /* ---------------------------------------------------------------------- */
1143 /* audio chip descriptions - defines+functions for pic16c54 (PV951) */
1145 /* the registers of 16C54, I2C sub address. */
1146 #define PIC16C54_REG_KEY_CODE 0x01 /* Not use. */
1147 #define PIC16C54_REG_MISC 0x02
1149 /* bit definition of the RESET register, I2C data. */
1150 #define PIC16C54_MISC_RESET_REMOTE_CTL 0x01 /* bit 0, Reset to receive the key */
1151 /* code of remote controller */
1152 #define PIC16C54_MISC_MTS_MAIN 0x02 /* bit 1 */
1153 #define PIC16C54_MISC_MTS_SAP 0x04 /* bit 2 */
1154 #define PIC16C54_MISC_MTS_BOTH 0x08 /* bit 3 */
1155 #define PIC16C54_MISC_SND_MUTE 0x10 /* bit 4, Mute Audio(Line-in and Tuner) */
1156 #define PIC16C54_MISC_SND_NOTMUTE 0x20 /* bit 5 */
1157 #define PIC16C54_MISC_SWITCH_TUNER 0x40 /* bit 6 , Switch to Line-in */
1158 #define PIC16C54_MISC_SWITCH_LINE 0x80 /* bit 7 , Switch to Tuner */
1160 /* ---------------------------------------------------------------------- */
1161 /* audio chip descriptions - defines+functions for TA8874Z */
1163 /* write 1st byte */
1164 #define TA8874Z_LED_STE 0x80
1165 #define TA8874Z_LED_BIL 0x40
1166 #define TA8874Z_LED_EXT 0x20
1167 #define TA8874Z_MONO_SET 0x10
1168 #define TA8874Z_MUTE 0x08
1169 #define TA8874Z_F_MONO 0x04
1170 #define TA8874Z_MODE_SUB 0x02
1171 #define TA8874Z_MODE_MAIN 0x01
1173 /* write 2nd byte */
1174 /*#define TA8874Z_TI 0x80 */ /* test mode */
1175 #define TA8874Z_SEPARATION 0x3f
1176 #define TA8874Z_SEPARATION_DEFAULT 0x10
1179 #define TA8874Z_B1 0x80
1180 #define TA8874Z_B0 0x40
1181 #define TA8874Z_CHAG_FLAG 0x20
1189 static int ta8874z_getmode(struct CHIPSTATE
*chip
)
1193 val
= chip_read(chip
);
1194 mode
= VIDEO_SOUND_MONO
;
1195 if (val
& TA8874Z_B1
){
1196 mode
|= VIDEO_SOUND_LANG1
| VIDEO_SOUND_LANG2
;
1197 }else if (!(val
& TA8874Z_B0
)){
1198 mode
|= VIDEO_SOUND_STEREO
;
1200 /* tvaudio_dbg ("ta8874z_getmode(): raw chip read: 0x%02x, return: 0x%02x\n", val, mode); */
1204 static audiocmd ta8874z_stereo
= { 2, {0, TA8874Z_SEPARATION_DEFAULT
}};
1205 static audiocmd ta8874z_mono
= {2, { TA8874Z_MONO_SET
, TA8874Z_SEPARATION_DEFAULT
}};
1206 static audiocmd ta8874z_main
= {2, { 0, TA8874Z_SEPARATION_DEFAULT
}};
1207 static audiocmd ta8874z_sub
= {2, { TA8874Z_MODE_SUB
, TA8874Z_SEPARATION_DEFAULT
}};
1209 static void ta8874z_setmode(struct CHIPSTATE
*chip
, int mode
)
1213 tvaudio_dbg("ta8874z_setmode(): mode: 0x%02x\n", mode
);
1216 case VIDEO_SOUND_MONO
:
1219 case VIDEO_SOUND_STEREO
:
1220 t
= &ta8874z_stereo
;
1222 case VIDEO_SOUND_LANG1
:
1225 case VIDEO_SOUND_LANG2
:
1233 chip_cmd(chip
, "TA8874Z", t
);
1236 static int ta8874z_checkit(struct CHIPSTATE
*chip
)
1239 rc
= chip_read(chip
);
1240 return ((rc
& 0x1f) == 0x1f) ? 1 : 0;
1243 /* ---------------------------------------------------------------------- */
1244 /* audio chip descriptions - struct CHIPDESC */
1246 /* insmod options to enable/disable individual audio chips */
1247 static int tda8425
= 1;
1248 static int tda9840
= 1;
1249 static int tda9850
= 1;
1250 static int tda9855
= 1;
1251 static int tda9873
= 1;
1252 static int tda9874a
= 1;
1253 static int tea6300
= 0; /* address clash with msp34xx */
1254 static int tea6320
= 0; /* address clash with msp34xx */
1255 static int tea6420
= 1;
1256 static int pic16c54
= 1;
1257 static int ta8874z
= 0; /* address clash with tda9840 */
1259 module_param(tda8425
, int, 0444);
1260 module_param(tda9840
, int, 0444);
1261 module_param(tda9850
, int, 0444);
1262 module_param(tda9855
, int, 0444);
1263 module_param(tda9873
, int, 0444);
1264 module_param(tda9874a
, int, 0444);
1265 module_param(tea6300
, int, 0444);
1266 module_param(tea6320
, int, 0444);
1267 module_param(tea6420
, int, 0444);
1268 module_param(pic16c54
, int, 0444);
1269 module_param(ta8874z
, int, 0444);
1271 static struct CHIPDESC chiplist
[] = {
1274 .id
= I2C_DRIVERID_TDA9840
,
1275 .insmodopt
= &tda9840
,
1276 .addr_lo
= I2C_TDA9840
>> 1,
1277 .addr_hi
= I2C_TDA9840
>> 1,
1280 .getmode
= tda9840_getmode
,
1281 .setmode
= tda9840_setmode
,
1282 .checkmode
= generic_checkmode
,
1284 .init
= { 2, { TDA9840_TEST
, TDA9840_TEST_INT1SN
1285 /* ,TDA9840_SW, TDA9840_MONO */} }
1289 .id
= I2C_DRIVERID_TDA9873
,
1290 .checkit
= tda9873_checkit
,
1291 .insmodopt
= &tda9873
,
1292 .addr_lo
= I2C_TDA985x_L
>> 1,
1293 .addr_hi
= I2C_TDA985x_H
>> 1,
1295 .flags
= CHIP_HAS_INPUTSEL
,
1297 .getmode
= tda9873_getmode
,
1298 .setmode
= tda9873_setmode
,
1299 .checkmode
= generic_checkmode
,
1301 .init
= { 4, { TDA9873_SW
, 0xa4, 0x06, 0x03 } },
1302 .inputreg
= TDA9873_SW
,
1303 .inputmute
= TDA9873_MUTE
| TDA9873_AUTOMUTE
,
1304 .inputmap
= {0xa0, 0xa2, 0xa0, 0xa0, 0xc0},
1305 .inputmask
= TDA9873_INP_MASK
|TDA9873_MUTE
|TDA9873_AUTOMUTE
,
1309 .name
= "tda9874h/a",
1310 .id
= I2C_DRIVERID_TDA9874
,
1311 .checkit
= tda9874a_checkit
,
1312 .initialize
= tda9874a_initialize
,
1313 .insmodopt
= &tda9874a
,
1314 .addr_lo
= I2C_TDA9874
>> 1,
1315 .addr_hi
= I2C_TDA9874
>> 1,
1317 .getmode
= tda9874a_getmode
,
1318 .setmode
= tda9874a_setmode
,
1319 .checkmode
= generic_checkmode
,
1323 .id
= I2C_DRIVERID_TDA9850
,
1324 .insmodopt
= &tda9850
,
1325 .addr_lo
= I2C_TDA985x_L
>> 1,
1326 .addr_hi
= I2C_TDA985x_H
>> 1,
1329 .getmode
= tda985x_getmode
,
1330 .setmode
= tda985x_setmode
,
1332 .init
= { 8, { TDA9850_C4
, 0x08, 0x08, TDA985x_STEREO
, 0x07, 0x10, 0x10, 0x03 } }
1336 .id
= I2C_DRIVERID_TDA9855
,
1337 .insmodopt
= &tda9855
,
1338 .addr_lo
= I2C_TDA985x_L
>> 1,
1339 .addr_hi
= I2C_TDA985x_H
>> 1,
1341 .flags
= CHIP_HAS_VOLUME
| CHIP_HAS_BASSTREBLE
,
1343 .leftreg
= TDA9855_VL
,
1344 .rightreg
= TDA9855_VR
,
1345 .bassreg
= TDA9855_BA
,
1346 .treblereg
= TDA9855_TR
,
1347 .volfunc
= tda9855_volume
,
1348 .bassfunc
= tda9855_bass
,
1349 .treblefunc
= tda9855_treble
,
1351 .getmode
= tda985x_getmode
,
1352 .setmode
= tda985x_setmode
,
1354 .init
= { 12, { 0, 0x6f, 0x6f, 0x0e, 0x07<<1, 0x8<<2,
1355 TDA9855_MUTE
| TDA9855_AVL
| TDA9855_LOUD
| TDA9855_INT
,
1356 TDA985x_STEREO
| TDA9855_LINEAR
| TDA9855_TZCM
| TDA9855_VZCM
,
1357 0x07, 0x10, 0x10, 0x03 }}
1361 .id
= I2C_DRIVERID_TEA6300
,
1362 .insmodopt
= &tea6300
,
1363 .addr_lo
= I2C_TEA6300
>> 1,
1364 .addr_hi
= I2C_TEA6300
>> 1,
1366 .flags
= CHIP_HAS_VOLUME
| CHIP_HAS_BASSTREBLE
| CHIP_HAS_INPUTSEL
,
1368 .leftreg
= TEA6300_VR
,
1369 .rightreg
= TEA6300_VL
,
1370 .bassreg
= TEA6300_BA
,
1371 .treblereg
= TEA6300_TR
,
1372 .volfunc
= tea6300_shift10
,
1373 .bassfunc
= tea6300_shift12
,
1374 .treblefunc
= tea6300_shift12
,
1376 .inputreg
= TEA6300_S
,
1377 .inputmap
= { TEA6300_S_SA
, TEA6300_S_SB
, TEA6300_S_SC
},
1378 .inputmute
= TEA6300_S_GMU
,
1382 .id
= I2C_DRIVERID_TEA6300
,
1383 .initialize
= tea6320_initialize
,
1384 .insmodopt
= &tea6320
,
1385 .addr_lo
= I2C_TEA6300
>> 1,
1386 .addr_hi
= I2C_TEA6300
>> 1,
1388 .flags
= CHIP_HAS_VOLUME
| CHIP_HAS_BASSTREBLE
| CHIP_HAS_INPUTSEL
,
1390 .leftreg
= TEA6320_V
,
1391 .rightreg
= TEA6320_V
,
1392 .bassreg
= TEA6320_BA
,
1393 .treblereg
= TEA6320_TR
,
1394 .volfunc
= tea6320_volume
,
1395 .bassfunc
= tea6320_shift11
,
1396 .treblefunc
= tea6320_shift11
,
1398 .inputreg
= TEA6320_S
,
1399 .inputmap
= { TEA6320_S_SA
, TEA6420_S_SB
, TEA6300_S_SC
, TEA6320_S_SD
},
1400 .inputmute
= TEA6300_S_GMU
,
1404 .id
= I2C_DRIVERID_TEA6420
,
1405 .insmodopt
= &tea6420
,
1406 .addr_lo
= I2C_TEA6420
>> 1,
1407 .addr_hi
= I2C_TEA6420
>> 1,
1409 .flags
= CHIP_HAS_INPUTSEL
,
1412 .inputmap
= { TEA6420_S_SA
, TEA6420_S_SB
, TEA6420_S_SC
},
1413 .inputmute
= TEA6300_S_GMU
,
1417 .id
= I2C_DRIVERID_TDA8425
,
1418 .insmodopt
= &tda8425
,
1419 .addr_lo
= I2C_TDA8425
>> 1,
1420 .addr_hi
= I2C_TDA8425
>> 1,
1422 .flags
= CHIP_HAS_VOLUME
| CHIP_HAS_BASSTREBLE
| CHIP_HAS_INPUTSEL
,
1424 .leftreg
= TDA8425_VL
,
1425 .rightreg
= TDA8425_VR
,
1426 .bassreg
= TDA8425_BA
,
1427 .treblereg
= TDA8425_TR
,
1428 .volfunc
= tda8425_shift10
,
1429 .bassfunc
= tda8425_shift12
,
1430 .treblefunc
= tda8425_shift12
,
1432 .inputreg
= TDA8425_S1
,
1433 .inputmap
= { TDA8425_S1_CH1
, TDA8425_S1_CH1
, TDA8425_S1_CH1
},
1434 .inputmute
= TDA8425_S1_OFF
,
1436 .setmode
= tda8425_setmode
,
1437 .initialize
= tda8425_initialize
,
1440 .name
= "pic16c54 (PV951)",
1441 .id
= I2C_DRIVERID_PIC16C54_PV951
,
1442 .insmodopt
= &pic16c54
,
1443 .addr_lo
= I2C_PIC16C54
>> 1,
1444 .addr_hi
= I2C_PIC16C54
>> 1,
1446 .flags
= CHIP_HAS_INPUTSEL
,
1448 .inputreg
= PIC16C54_REG_MISC
,
1449 .inputmap
= {PIC16C54_MISC_SND_NOTMUTE
|PIC16C54_MISC_SWITCH_TUNER
,
1450 PIC16C54_MISC_SND_NOTMUTE
|PIC16C54_MISC_SWITCH_LINE
,
1451 PIC16C54_MISC_SND_NOTMUTE
|PIC16C54_MISC_SWITCH_LINE
,
1452 PIC16C54_MISC_SND_MUTE
,PIC16C54_MISC_SND_MUTE
,
1453 PIC16C54_MISC_SND_NOTMUTE
},
1454 .inputmute
= PIC16C54_MISC_SND_MUTE
,
1459 /*.id = I2C_DRIVERID_TA8874Z, */
1460 .checkit
= ta8874z_checkit
,
1461 .insmodopt
= &ta8874z
,
1462 .addr_lo
= I2C_TDA9840
>> 1,
1463 .addr_hi
= I2C_TDA9840
>> 1,
1466 .getmode
= ta8874z_getmode
,
1467 .setmode
= ta8874z_setmode
,
1468 .checkmode
= generic_checkmode
,
1470 .init
= {2, { TA8874Z_MONO_SET
, TA8874Z_SEPARATION_DEFAULT
}},
1472 { .name
= NULL
} /* EOF */
1476 /* ---------------------------------------------------------------------- */
1477 /* i2c registration */
1479 static int chip_attach(struct i2c_adapter
*adap
, int addr
, int kind
)
1481 struct CHIPSTATE
*chip
;
1482 struct CHIPDESC
*desc
;
1484 chip
= kmalloc(sizeof(*chip
),GFP_KERNEL
);
1487 memset(chip
,0,sizeof(*chip
));
1488 memcpy(&chip
->c
,&client_template
,sizeof(struct i2c_client
));
1489 chip
->c
.adapter
= adap
;
1490 chip
->c
.addr
= addr
;
1491 i2c_set_clientdata(&chip
->c
, chip
);
1493 /* find description for the chip */
1494 tvaudio_dbg("chip found @ 0x%x\n", addr
<<1);
1495 for (desc
= chiplist
; desc
->name
!= NULL
; desc
++) {
1496 if (0 == *(desc
->insmodopt
))
1498 if (addr
< desc
->addr_lo
||
1499 addr
> desc
->addr_hi
)
1501 if (desc
->checkit
&& !desc
->checkit(chip
))
1505 if (desc
->name
== NULL
) {
1506 tvaudio_dbg("no matching chip description found\n");
1509 tvaudio_info("%s found @ 0x%x (%s)\n", desc
->name
, addr
<<1, adap
->name
);
1511 tvaudio_dbg("matches:%s%s%s.\n",
1512 (desc
->flags
& CHIP_HAS_VOLUME
) ? " volume" : "",
1513 (desc
->flags
& CHIP_HAS_BASSTREBLE
) ? " bass/treble" : "",
1514 (desc
->flags
& CHIP_HAS_INPUTSEL
) ? " audiomux" : "");
1517 /* fill required data structures */
1518 strcpy(chip
->c
.name
,desc
->name
);
1519 chip
->type
= desc
-chiplist
;
1520 chip
->shadow
.count
= desc
->registers
+1;
1521 chip
->prevmode
= -1;
1523 i2c_attach_client(&chip
->c
);
1525 /* initialization */
1526 if (desc
->initialize
!= NULL
)
1527 desc
->initialize(chip
);
1529 chip_cmd(chip
,"init",&desc
->init
);
1531 if (desc
->flags
& CHIP_HAS_VOLUME
) {
1532 chip
->left
= desc
->leftinit
? desc
->leftinit
: 65535;
1533 chip
->right
= desc
->rightinit
? desc
->rightinit
: 65535;
1534 chip_write(chip
,desc
->leftreg
,desc
->volfunc(chip
->left
));
1535 chip_write(chip
,desc
->rightreg
,desc
->volfunc(chip
->right
));
1537 if (desc
->flags
& CHIP_HAS_BASSTREBLE
) {
1538 chip
->treble
= desc
->trebleinit
? desc
->trebleinit
: 32768;
1539 chip
->bass
= desc
->bassinit
? desc
->bassinit
: 32768;
1540 chip_write(chip
,desc
->bassreg
,desc
->bassfunc(chip
->bass
));
1541 chip_write(chip
,desc
->treblereg
,desc
->treblefunc(chip
->treble
));
1545 if (desc
->checkmode
) {
1546 /* start async thread */
1547 init_timer(&chip
->wt
);
1548 chip
->wt
.function
= chip_thread_wake
;
1549 chip
->wt
.data
= (unsigned long)chip
;
1550 init_waitqueue_head(&chip
->wq
);
1551 init_completion(&chip
->texit
);
1552 chip
->tpid
= kernel_thread(chip_thread
,(void *)chip
,0);
1554 tvaudio_warn("%s: kernel_thread() failed\n",
1556 wake_up_interruptible(&chip
->wq
);
1561 static int chip_probe(struct i2c_adapter
*adap
)
1563 /* don't attach on saa7146 based cards,
1564 because dedicated drivers are used */
1565 if ((adap
->id
== I2C_HW_SAA7146
))
1567 #ifdef I2C_CLASS_TV_ANALOG
1568 if (adap
->class & I2C_CLASS_TV_ANALOG
)
1569 return i2c_probe(adap
, &addr_data
, chip_attach
);
1572 case I2C_HW_B_BT848
:
1574 case I2C_HW_SAA7134
:
1575 return i2c_probe(adap
, &addr_data
, chip_attach
);
1581 static int chip_detach(struct i2c_client
*client
)
1583 struct CHIPSTATE
*chip
= i2c_get_clientdata(client
);
1585 del_timer_sync(&chip
->wt
);
1586 if (chip
->tpid
>= 0) {
1587 /* shutdown async thread */
1589 wake_up_interruptible(&chip
->wq
);
1590 wait_for_completion(&chip
->texit
);
1593 i2c_detach_client(&chip
->c
);
1598 /* ---------------------------------------------------------------------- */
1599 /* video4linux interface */
1601 static int chip_command(struct i2c_client
*client
,
1602 unsigned int cmd
, void *arg
)
1605 struct CHIPSTATE
*chip
= i2c_get_clientdata(client
);
1606 struct CHIPDESC
*desc
= chiplist
+ chip
->type
;
1608 tvaudio_dbg("%s: chip_command 0x%x\n",chip
->c
.name
,cmd
);
1611 case AUDC_SET_INPUT
:
1612 if (desc
->flags
& CHIP_HAS_INPUTSEL
) {
1614 chip_write_masked(chip
,desc
->inputreg
,desc
->inputmute
,desc
->inputmask
);
1616 chip_write_masked(chip
,desc
->inputreg
,desc
->inputmap
[*sarg
],desc
->inputmask
);
1620 case AUDC_SET_RADIO
:
1621 chip
->norm
= VIDEO_MODE_RADIO
;
1622 chip
->watch_stereo
= 0;
1623 /* del_timer(&chip->wt); */
1626 /* --- v4l ioctls --- */
1627 /* take care: bttv does userspace copying, we'll get a
1628 kernel pointer here... */
1631 struct video_audio
*va
= arg
;
1633 if (desc
->flags
& CHIP_HAS_VOLUME
) {
1634 va
->flags
|= VIDEO_AUDIO_VOLUME
;
1635 va
->volume
= max(chip
->left
,chip
->right
);
1637 va
->balance
= (32768*min(chip
->left
,chip
->right
))/
1640 va
->balance
= 32768;
1642 if (desc
->flags
& CHIP_HAS_BASSTREBLE
) {
1643 va
->flags
|= VIDEO_AUDIO_BASS
| VIDEO_AUDIO_TREBLE
;
1644 va
->bass
= chip
->bass
;
1645 va
->treble
= chip
->treble
;
1647 if (chip
->norm
!= VIDEO_MODE_RADIO
) {
1649 va
->mode
= desc
->getmode(chip
);
1651 va
->mode
= VIDEO_SOUND_MONO
;
1658 struct video_audio
*va
= arg
;
1660 if (desc
->flags
& CHIP_HAS_VOLUME
) {
1661 chip
->left
= (min(65536 - va
->balance
,32768) *
1662 va
->volume
) / 32768;
1663 chip
->right
= (min(va
->balance
,(__u16
)32768) *
1664 va
->volume
) / 32768;
1665 chip_write(chip
,desc
->leftreg
,desc
->volfunc(chip
->left
));
1666 chip_write(chip
,desc
->rightreg
,desc
->volfunc(chip
->right
));
1668 if (desc
->flags
& CHIP_HAS_BASSTREBLE
) {
1669 chip
->bass
= va
->bass
;
1670 chip
->treble
= va
->treble
;
1671 chip_write(chip
,desc
->bassreg
,desc
->bassfunc(chip
->bass
));
1672 chip_write(chip
,desc
->treblereg
,desc
->treblefunc(chip
->treble
));
1674 if (desc
->setmode
&& va
->mode
) {
1675 chip
->watch_stereo
= 0;
1676 /* del_timer(&chip->wt); */
1677 chip
->mode
= va
->mode
;
1678 desc
->setmode(chip
,va
->mode
);
1684 struct video_channel
*vc
= arg
;
1686 chip
->norm
= vc
->norm
;
1691 chip
->mode
= 0; /* automatic */
1692 if (desc
->checkmode
) {
1693 desc
->setmode(chip
,VIDEO_SOUND_MONO
);
1694 if (chip
->prevmode
!= VIDEO_SOUND_MONO
)
1695 chip
->prevmode
= -1; /* reset previous mode */
1696 mod_timer(&chip
->wt
, jiffies
+2*HZ
);
1697 /* the thread will call checkmode() later */
1705 static struct i2c_driver driver
= {
1706 .owner
= THIS_MODULE
,
1707 .name
= "generic i2c audio driver",
1708 .id
= I2C_DRIVERID_TVAUDIO
,
1709 .flags
= I2C_DF_NOTIFY
,
1710 .attach_adapter
= chip_probe
,
1711 .detach_client
= chip_detach
,
1712 .command
= chip_command
,
1715 static struct i2c_client client_template
=
1718 .flags
= I2C_CLIENT_ALLOW_USE
,
1722 static int __init
audiochip_init_module(void)
1724 struct CHIPDESC
*desc
;
1727 printk(KERN_INFO
"tvaudio: TV audio decoder + audio/video mux driver\n");
1728 printk(KERN_INFO
"tvaudio: known chips: ");
1729 for (desc
= chiplist
; desc
->name
!= NULL
; desc
++)
1730 printk("%s%s", (desc
== chiplist
) ? "" : ", ", desc
->name
);
1734 return i2c_add_driver(&driver
);
1737 static void __exit
audiochip_cleanup_module(void)
1739 i2c_del_driver(&driver
);
1742 module_init(audiochip_init_module
);
1743 module_exit(audiochip_cleanup_module
);