tvaudio.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:40k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * experimental driver for simple i2c audio chips.
  3.  *
  4.  * Copyright (c) 2000 Gerd Knorr
  5.  * based on code by:
  6.  *   Eric Sandeen (eric_sandeen@bigfoot.com) 
  7.  *   Steve VanDeBogart (vandebo@uclink.berkeley.edu)
  8.  *   Greg Alexander (galexand@acm.org)
  9.  *
  10.  * This code is placed under the terms of the GNU General Public License
  11.  * 
  12.  * OPTIONS:
  13.  *   debug - set to 1 if you'd like to see debug messages
  14.  *
  15.  */
  16. #include <linux/config.h>
  17. #include <linux/module.h>
  18. #include <linux/kernel.h>
  19. #include <linux/sched.h>
  20. #include <linux/string.h>
  21. #include <linux/timer.h>
  22. #include <linux/delay.h>
  23. #include <linux/errno.h>
  24. #include <linux/slab.h>
  25. #include <linux/videodev.h>
  26. #include <linux/i2c.h>
  27. #include <linux/i2c-algo-bit.h>
  28. #include <linux/init.h>
  29. #include <linux/smp_lock.h>
  30. #include "audiochip.h"
  31. #include "tvaudio.h"
  32. #include "id.h"
  33. /* ---------------------------------------------------------------------- */
  34. /* insmod args                                                            */
  35. MODULE_PARM(debug,"i");
  36. static int debug = 0; /* insmod parameter */
  37. #define dprintk  if (debug) printk
  38. MODULE_DESCRIPTION("device driver for various i2c TV sound decoder / audiomux chips");
  39. MODULE_AUTHOR("Eric Sandeen, Steve VanDeBogart, Greg Alexander, Gerd Knorr");
  40. MODULE_LICENSE("GPL");
  41. /* ---------------------------------------------------------------------- */
  42. /* our structs                                                            */
  43. #define MAXREGS 64
  44. struct CHIPSTATE;
  45. typedef int  (*getvalue)(int);
  46. typedef int  (*checkit)(struct CHIPSTATE*);
  47. typedef int  (*initialize)(struct CHIPSTATE*);
  48. typedef int  (*getmode)(struct CHIPSTATE*);
  49. typedef void (*setmode)(struct CHIPSTATE*, int mode);
  50. typedef void (*checkmode)(struct CHIPSTATE*);
  51. /* i2c command */
  52. typedef struct AUDIOCMD {
  53. int             count;             /* # of bytes to send */
  54. unsigned char   bytes[MAXREGS+1];  /* addr, data, data, ... */
  55. } audiocmd;
  56. /* chip description */
  57. struct CHIPDESC {
  58. char       *name;             /* chip name         */
  59. int        id;                /* ID */
  60. int        addr_lo, addr_hi;  /* i2c address range */
  61. int        registers;         /* # of registers    */
  62. int        *insmodopt;
  63. checkit    checkit;
  64. initialize initialize;
  65. int        flags;
  66. #define CHIP_HAS_VOLUME      1
  67. #define CHIP_HAS_BASSTREBLE  2
  68. #define CHIP_HAS_INPUTSEL    4
  69. /* various i2c command sequences */
  70. audiocmd   init;
  71. /* which register has which value */
  72. int    leftreg,rightreg,treblereg,bassreg;
  73. /* initialize with (defaults to 65535/65535/32768/32768 */
  74. int    leftinit,rightinit,trebleinit,bassinit;
  75. /* functions to convert the values (v4l -> chip) */
  76. getvalue volfunc,treblefunc,bassfunc;
  77. /* get/set mode */
  78. getmode  getmode;
  79. setmode  setmode;
  80. /* check / autoswitch audio after channel switches */
  81. checkmode  checkmode;
  82. /* input switch register + values for v4l inputs */
  83. int  inputreg;
  84. int  inputmap[8];
  85. int  inputmute;
  86. int  inputmask;
  87. };
  88. static struct CHIPDESC chiplist[];
  89. /* current state of the chip */
  90. struct CHIPSTATE {
  91. struct i2c_client c;
  92. /* index into CHIPDESC array */
  93. int type;
  94. /* shadow register set */
  95. audiocmd   shadow;
  96. /* current settings */
  97. __u16 left,right,treble,bass,mode;
  98. int prevmode;
  99. /* thread */
  100. struct task_struct  *thread;
  101. struct semaphore    *notify;
  102. wait_queue_head_t    wq;
  103. struct timer_list    wt;
  104. int                  done;
  105. };
  106. /* ---------------------------------------------------------------------- */
  107. /* i2c addresses                                                          */
  108. static unsigned short normal_i2c[] = {
  109. I2C_TDA8425   >> 1,
  110. I2C_TEA6300   >> 1,
  111. I2C_TEA6420   >> 1,
  112. I2C_TDA9840   >> 1,
  113. I2C_TDA985x_L >> 1,
  114. I2C_TDA985x_H >> 1,
  115. I2C_TDA9874A  >> 1,
  116. I2C_PIC16C54  >> 1,
  117. I2C_CLIENT_END };
  118. static unsigned short normal_i2c_range[2] = { I2C_CLIENT_END, I2C_CLIENT_END };
  119. static unsigned short probe[2]            = { I2C_CLIENT_END, I2C_CLIENT_END };
  120. static unsigned short probe_range[2]      = { I2C_CLIENT_END, I2C_CLIENT_END };
  121. static unsigned short ignore[2]           = { I2C_CLIENT_END, I2C_CLIENT_END };
  122. static unsigned short ignore_range[2]     = { I2C_CLIENT_END, I2C_CLIENT_END };
  123. static unsigned short force[2]            = { I2C_CLIENT_END, I2C_CLIENT_END };
  124. static struct i2c_client_address_data addr_data = {
  125. normal_i2c, normal_i2c_range, 
  126. probe, probe_range, 
  127. ignore, ignore_range, 
  128. force
  129. };
  130. static struct i2c_driver driver;
  131. static struct i2c_client client_template;
  132. /* ---------------------------------------------------------------------- */
  133. /* i2c I/O functions                                                      */
  134. static int chip_write(struct CHIPSTATE *chip, int subaddr, int val)
  135. {
  136. unsigned char buffer[2];
  137. if (-1 == subaddr) {
  138. dprintk("%s: chip_write: 0x%xn", chip->c.name, val);
  139. chip->shadow.bytes[1] = val;
  140. buffer[0] = val;
  141. if (1 != i2c_master_send(&chip->c,buffer,1)) {
  142. printk(KERN_WARNING "%s: I/O error (write 0x%x)n",
  143.        chip->c.name, val);
  144. return -1;
  145. }
  146. } else {
  147. dprintk("%s: chip_write: reg%d=0x%xn", chip->c.name, subaddr, val);
  148. chip->shadow.bytes[subaddr+1] = val;
  149. buffer[0] = subaddr;
  150. buffer[1] = val;
  151. if (2 != i2c_master_send(&chip->c,buffer,2)) {
  152. printk(KERN_WARNING "%s: I/O error (write reg%d=0x%x)n",
  153.        chip->c.name, subaddr, val);
  154. return -1;
  155. }
  156. }
  157. return 0;
  158. }
  159. static int chip_write_masked(struct CHIPSTATE *chip, int subaddr, int val, int mask)
  160. {
  161. if (mask != 0) {
  162. if (-1 == subaddr) {
  163. val = (chip->shadow.bytes[1] & ~mask) | (val & mask);
  164. } else {
  165. val = (chip->shadow.bytes[subaddr+1] & ~mask) | (val & mask);
  166. }
  167. }
  168. return chip_write(chip, subaddr, val);
  169. }
  170. static int chip_read(struct CHIPSTATE *chip)
  171. {
  172. unsigned char buffer;
  173. if (1 != i2c_master_recv(&chip->c,&buffer,1)) {
  174. printk(KERN_WARNING "%s: I/O error (read)n",
  175.        chip->c.name);
  176. return -1;
  177. }
  178. dprintk("%s: chip_read: 0x%xn",chip->c.name,buffer); 
  179. return buffer;
  180. }
  181. static int chip_read2(struct CHIPSTATE *chip, int subaddr)
  182. {
  183.         unsigned char write[1];
  184.         unsigned char read[1];
  185.         struct i2c_msg msgs[2] = {
  186.                 { chip->c.addr, 0,        1, write },
  187.                 { chip->c.addr, I2C_M_RD, 1, read  }
  188.         };
  189.         write[0] = subaddr;
  190. if (2 != i2c_transfer(chip->c.adapter,msgs,2)) {
  191. printk(KERN_WARNING "%s: I/O error (read2)n",
  192.        chip->c.name);
  193. return -1;
  194. }
  195. dprintk("%s: chip_read2: reg%d=0x%xn",
  196. chip->c.name,subaddr,read[0]); 
  197. return read[0];
  198. }
  199. static int chip_cmd(struct CHIPSTATE *chip, char *name, audiocmd *cmd)
  200. {
  201. int i;
  202. if (0 == cmd->count)
  203. return 0;
  204. /* update our shadow register set; print bytes if (debug > 0) */
  205. dprintk("%s: chip_cmd(%s): reg=%d, data:",
  206. chip->c.name,name,cmd->bytes[0]);
  207. for (i = 1; i < cmd->count; i++) {
  208. dprintk(" 0x%x",cmd->bytes[i]);
  209. chip->shadow.bytes[i+cmd->bytes[0]] = cmd->bytes[i];
  210. }
  211. dprintk("n");
  212. /* send data to the chip */
  213. if (cmd->count != i2c_master_send(&chip->c,cmd->bytes,cmd->count)) {
  214. printk(KERN_WARNING "%s: I/O error (%s)n", chip->c.name, name);
  215. return -1;
  216. }
  217. return 0;
  218. }
  219. /* ---------------------------------------------------------------------- */
  220. /* kernel thread for doing i2c stuff asyncronly
  221.  *   right now it is used only to check the audio mode (mono/stereo/whatever)
  222.  *   some time after switching to another TV channel, then turn on stereo
  223.  *   if available, ...
  224.  */
  225. static void chip_thread_wake(unsigned long data)
  226. {
  227.         struct CHIPSTATE *chip = (struct CHIPSTATE*)data;
  228. wake_up_interruptible(&chip->wq);
  229. }
  230. static int chip_thread(void *data)
  231. {
  232.         struct CHIPSTATE *chip = data;
  233. struct CHIPDESC  *desc = chiplist + chip->type;
  234. #ifdef CONFIG_SMP
  235. lock_kernel();
  236. #endif
  237. daemonize();
  238. sigfillset(&current->blocked);
  239. strcpy(current->comm,chip->c.name);
  240. chip->thread = current;
  241. #ifdef CONFIG_SMP
  242. unlock_kernel();
  243. #endif
  244. dprintk("%s: thread startedn", chip->c.name);
  245. if(chip->notify != NULL)
  246. up(chip->notify);
  247. for (;;) {
  248. interruptible_sleep_on(&chip->wq);
  249. dprintk("%s: thread wakeupn", chip->c.name);
  250. if (chip->done || signal_pending(current))
  251. break;
  252. if (0 != chip->mode)
  253. /* don't do anything if mode != auto */
  254. continue;
  255. /* have a look what's going on */
  256. desc->checkmode(chip);
  257. /* schedule next check */
  258. mod_timer(&chip->wt, jiffies+2*HZ);
  259. }
  260. chip->thread = NULL;
  261. dprintk("%s: thread exitingn", chip->c.name);
  262. if(chip->notify != NULL)
  263. up(chip->notify);
  264. return 0;
  265. }
  266. void generic_checkmode(struct CHIPSTATE *chip)
  267. {
  268. struct CHIPDESC  *desc = chiplist + chip->type;
  269. int mode = desc->getmode(chip);
  270. if (mode == chip->prevmode)
  271.     return;
  272. dprintk("%s: thread checkmoden", chip->c.name);
  273. chip->prevmode = mode;
  274. if (mode & VIDEO_SOUND_LANG1)
  275. desc->setmode(chip,VIDEO_SOUND_LANG1);
  276. else if (mode & VIDEO_SOUND_LANG2)
  277. desc->setmode(chip,VIDEO_SOUND_LANG2);
  278. else if (mode & VIDEO_SOUND_STEREO)
  279. desc->setmode(chip,VIDEO_SOUND_STEREO);
  280. else
  281. desc->setmode(chip,VIDEO_SOUND_MONO);
  282. }
  283. /* ---------------------------------------------------------------------- */
  284. /* audio chip descriptions - defines+functions for tda9840                */
  285. #define TDA9840_SW         0x00
  286. #define TDA9840_LVADJ      0x02
  287. #define TDA9840_STADJ      0x03
  288. #define TDA9840_TEST       0x04
  289. #define TDA9840_MONO       0x10
  290. #define TDA9840_STEREO     0x2a
  291. #define TDA9840_DUALA      0x12
  292. #define TDA9840_DUALB      0x1e
  293. #define TDA9840_DUALAB     0x1a
  294. #define TDA9840_DUALBA     0x16
  295. #define TDA9840_EXTERNAL   0x7a
  296. #define TDA9840_DS_DUAL    0x20 /* Dual sound identified          */
  297. #define TDA9840_ST_STEREO  0x40 /* Stereo sound identified        */
  298. #define TDA9840_PONRES     0x80 /* Power-on reset detected if = 1 */
  299. #define TDA9840_TEST_INT1SN 0x1 /* Integration time 0.5s when set */
  300. #define TDA9840_TEST_INTFU 0x02 /* Disables integrator function */
  301. int  tda9840_getmode(struct CHIPSTATE *chip)
  302. {
  303. int val, mode;
  304. val = chip_read(chip);
  305. mode = VIDEO_SOUND_MONO;
  306. if (val & TDA9840_DS_DUAL)
  307. mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  308. if (val & TDA9840_ST_STEREO)
  309. mode |= VIDEO_SOUND_STEREO;
  310. dprintk ("tda9840_getmode(): raw chip read: %d, return: %dn",
  311.  val, mode);
  312. return mode;
  313. }
  314. void tda9840_setmode(struct CHIPSTATE *chip, int mode)
  315. {
  316. int update = 1;
  317. int t = chip->shadow.bytes[TDA9840_SW + 1] & ~0x7e;
  318. switch (mode) {
  319. case VIDEO_SOUND_MONO:
  320. t |= TDA9840_MONO;
  321. break;
  322. case VIDEO_SOUND_STEREO:
  323. t |= TDA9840_STEREO;
  324. break;
  325. case VIDEO_SOUND_LANG1:
  326. t |= TDA9840_DUALA;
  327. break;
  328. case VIDEO_SOUND_LANG2:
  329. t |= TDA9840_DUALB;
  330. break;
  331. default:
  332. update = 0;
  333. }
  334. if (update)
  335. chip_write(chip, TDA9840_SW, t);
  336. }
  337. /* ---------------------------------------------------------------------- */
  338. /* audio chip descriptions - defines+functions for tda985x                */
  339. /* subaddresses for TDA9855 */
  340. #define TDA9855_VR 0x00 /* Volume, right */
  341. #define TDA9855_VL 0x01 /* Volume, left */
  342. #define TDA9855_BA 0x02 /* Bass */
  343. #define TDA9855_TR 0x03 /* Treble */
  344. #define TDA9855_SW 0x04 /* Subwoofer - not connected on DTV2000 */
  345. /* subaddresses for TDA9850 */
  346. #define TDA9850_C4 0x04 /* Control 1 for TDA9850 */
  347. /* subaddesses for both chips */
  348. #define TDA985x_C5 0x05 /* Control 2 for TDA9850, Control 1 for TDA9855 */
  349. #define TDA985x_C6 0x06 /* Control 3 for TDA9850, Control 2 for TDA9855 */
  350. #define TDA985x_C7 0x07 /* Control 4 for TDA9850, Control 3 for TDA9855 */
  351. #define TDA985x_A1 0x08 /* Alignment 1 for both chips */
  352. #define TDA985x_A2 0x09 /* Alignment 2 for both chips */
  353. #define TDA985x_A3 0x0a /* Alignment 3 for both chips */
  354. /* Masks for bits in TDA9855 subaddresses */
  355. /* 0x00 - VR in TDA9855 */
  356. /* 0x01 - VL in TDA9855 */
  357. /* lower 7 bits control gain from -71dB (0x28) to 16dB (0x7f)
  358.  * in 1dB steps - mute is 0x27 */
  359. /* 0x02 - BA in TDA9855 */ 
  360. /* lower 5 bits control bass gain from -12dB (0x06) to 16.5dB (0x19)
  361.  * in .5dB steps - 0 is 0x0E */
  362. /* 0x03 - TR in TDA9855 */
  363. /* 4 bits << 1 control treble gain from -12dB (0x3) to 12dB (0xb)
  364.  * in 3dB steps - 0 is 0x7 */
  365. /* Masks for bits in both chips' subaddresses */
  366. /* 0x04 - SW in TDA9855, C4/Control 1 in TDA9850 */
  367. /* Unique to TDA9855: */
  368. /* 4 bits << 2 control subwoofer/surround gain from -14db (0x1) to 14db (0xf)
  369.  * in 3dB steps - mute is 0x0 */
  370.  
  371. /* Unique to TDA9850: */
  372. /* lower 4 bits control stereo noise threshold, over which stereo turns off
  373.  * set to values of 0x00 through 0x0f for Ster1 through Ster16 */
  374. /* 0x05 - C5 - Control 1 in TDA9855 , Control 2 in TDA9850*/
  375. /* Unique to TDA9855: */
  376. #define TDA9855_MUTE 1<<7 /* GMU, Mute at outputs */
  377. #define TDA9855_AVL 1<<6 /* AVL, Automatic Volume Level */
  378. #define TDA9855_LOUD 1<<5 /* Loudness, 1==off */
  379. #define TDA9855_SUR 1<<3 /* Surround / Subwoofer 1==.5(L-R) 0==.5(L+R) */
  380.      /* Bits 0 to 3 select various combinations
  381.                               * of line in and line out, only the 
  382.                               * interesting ones are defined */
  383. #define TDA9855_EXT 1<<2 /* Selects inputs LIR and LIL.  Pins 41 & 12 */
  384. #define TDA9855_INT 0    /* Selects inputs LOR and LOL.  (internal) */
  385. /* Unique to TDA9850:  */
  386. /* lower 4 bits contol SAP noise threshold, over which SAP turns off
  387.  * set to values of 0x00 through 0x0f for SAP1 through SAP16 */
  388. /* 0x06 - C6 - Control 2 in TDA9855, Control 3 in TDA9850 */
  389. /* Common to TDA9855 and TDA9850: */
  390. #define TDA985x_SAP 3<<6 /* Selects SAP output, mute if not received */
  391. #define TDA985x_STEREO 1<<6 /* Selects Stereo ouput, mono if not received */
  392. #define TDA985x_MONO 0    /* Forces Mono output */
  393. #define TDA985x_LMU 1<<3 /* Mute (LOR/LOL for 9855, OUTL/OUTR for 9850) */
  394. /* Unique to TDA9855: */
  395. #define TDA9855_TZCM 1<<5 /* If set, don't mute till zero crossing */
  396. #define TDA9855_VZCM 1<<4 /* If set, don't change volume till zero crossing*/
  397. #define TDA9855_LINEAR 0    /* Linear Stereo */
  398. #define TDA9855_PSEUDO 1    /* Pseudo Stereo */
  399. #define TDA9855_SPAT_30 2    /* Spatial Stereo, 30% anti-phase crosstalk */
  400. #define TDA9855_SPAT_50 3    /* Spatial Stereo, 52% anti-phase crosstalk */
  401. #define TDA9855_E_MONO 7    /* Forced mono - mono select elseware, so useless*/
  402. /* 0x07 - C7 - Control 3 in TDA9855, Control 4 in TDA9850 */
  403. /* Common to both TDA9855 and TDA9850: */
  404. /* lower 4 bits control input gain from -3.5dB (0x0) to 4dB (0xF)
  405.  * in .5dB steps -  0dB is 0x7 */
  406. /* 0x08, 0x09 - A1 and A2 (read/write) */
  407. /* Common to both TDA9855 and TDA9850: */
  408. /* lower 5 bites are wideband and spectral expander alignment
  409.  * from 0x00 to 0x1f - nominal at 0x0f and 0x10 (read/write) */
  410. #define TDA985x_STP 1<<5 /* Stereo Pilot/detect (read-only) */
  411. #define TDA985x_SAPP 1<<6 /* SAP Pilot/detect (read-only) */
  412. #define TDA985x_STS 1<<7 /* Stereo trigger 1= <35mV 0= <30mV (write-only)*/
  413. /* 0x0a - A3 */
  414. /* Common to both TDA9855 and TDA9850: */
  415. /* lower 3 bits control timing current for alignment: -30% (0x0), -20% (0x1),
  416.  * -10% (0x2), nominal (0x3), +10% (0x6), +20% (0x5), +30% (0x4) */
  417. #define TDA985x_ADJ 1<<7 /* Stereo adjust on/off (wideband and spectral */
  418. int tda9855_volume(int val) { return val/0x2e8+0x27; }
  419. int tda9855_bass(int val)   { return val/0xccc+0x06; }
  420. int tda9855_treble(int val) { return (val/0x1c71+0x3)<<1; }
  421. int  tda985x_getmode(struct CHIPSTATE *chip)
  422. {
  423. int mode;
  424. mode = ((TDA985x_STP | TDA985x_SAPP) & 
  425. chip_read(chip)) >> 4;
  426. /* Add mono mode regardless of SAP and stereo */
  427. /* Allows forced mono */
  428. return mode | VIDEO_SOUND_MONO;
  429. }
  430. void tda985x_setmode(struct CHIPSTATE *chip, int mode)
  431. {
  432. int update = 1;
  433. int c6 = chip->shadow.bytes[TDA985x_C6+1] & 0x3f;
  434. switch (mode) {
  435. case VIDEO_SOUND_MONO:
  436. c6 |= TDA985x_MONO;
  437. break;
  438. case VIDEO_SOUND_STEREO:
  439. c6 |= TDA985x_STEREO;
  440. break;
  441. case VIDEO_SOUND_LANG1:
  442. c6 |= TDA985x_SAP;
  443. break;
  444. default:
  445. update = 0;
  446. }
  447. if (update)
  448. chip_write(chip,TDA985x_C6,c6);
  449. }
  450. /* ---------------------------------------------------------------------- */
  451. /* audio chip descriptions - defines+functions for tda9873h               */
  452. /* Subaddresses for TDA9873H */
  453. #define TDA9873_SW 0x00 /* Switching                    */
  454. #define TDA9873_AD 0x01 /* Adjust                       */
  455. #define TDA9873_PT 0x02 /* Port                         */
  456. /* Subaddress 0x00: Switching Data 
  457.  * B7..B0:
  458.  *
  459.  * B1, B0: Input source selection
  460.  *  0,  0  internal
  461.  *  1,  0  external stereo
  462.  *  0,  1  external mono
  463.  */
  464. #define TDA9873_INP_MASK    3
  465. #define TDA9873_INTERNAL    0
  466. #define TDA9873_EXT_STEREO  2
  467. #define TDA9873_EXT_MONO    1
  468. /*    B3, B2: output signal select
  469.  * B4    : transmission mode 
  470.  *  0, 0, 1   Mono
  471.  *  1, 0, 0   Stereo
  472.  *  1, 1, 1   Stereo (reversed channel)    
  473.  *  0, 0, 0   Dual AB
  474.  *  0, 0, 1   Dual AA
  475.  *  0, 1, 0   Dual BB
  476.  *  0, 1, 1   Dual BA
  477.  */
  478. #define TDA9873_TR_MASK     (7 << 2)
  479. #define TDA9873_TR_MONO     4
  480. #define TDA9873_TR_STEREO   1 << 4
  481. #define TDA9873_TR_REVERSE  (1 << 3) & (1 << 2)
  482. #define TDA9873_TR_DUALA    1 << 2
  483. #define TDA9873_TR_DUALB    1 << 3
  484. /* output level controls
  485.  * B5:  output level switch (0 = reduced gain, 1 = normal gain)
  486.  * B6:  mute                (1 = muted)
  487.  * B7:  auto-mute           (1 = auto-mute enabled)
  488.  */
  489. #define TDA9873_GAIN_NORMAL 1 << 5
  490. #define TDA9873_MUTE        1 << 6
  491. #define TDA9873_AUTOMUTE    1 << 7
  492. /* Subaddress 0x01:  Adjust/standard */
  493. /* Lower 4 bits (C3..C0) control stereo adjustment on R channel (-0.6 - +0.7 dB)
  494.  * Recommended value is +0 dB
  495.  */
  496. #define TDA9873_STEREO_ADJ 0x06 /* 0dB gain */
  497. /* Bits C6..C4 control FM stantard  
  498.  * C6, C5, C4
  499.  *  0,  0,  0   B/G (PAL FM)
  500.  *  0,  0,  1   M
  501.  *  0,  1,  0   D/K(1)
  502.  *  0,  1,  1   D/K(2)
  503.  *  1,  0,  0   D/K(3)
  504.  *  1,  0,  1   I
  505.  */
  506. #define TDA9873_BG 0
  507. #define TDA9873_M       1
  508. #define TDA9873_DK1     2
  509. #define TDA9873_DK2     3
  510. #define TDA9873_DK3     4
  511. #define TDA9873_I       5
  512. /* C7 controls identification response time (1=fast/0=normal)
  513.  */
  514. #define TDA9873_IDR_NORM 0
  515. #define TDA9873_IDR_FAST 1 << 7
  516. /* Subaddress 0x02: Port data */ 
  517. /* E1, E0   free programmable ports P1/P2
  518.     0,  0   both ports low
  519.     0,  1   P1 high
  520.     1,  0   P2 high
  521.     1,  1   both ports high
  522. */
  523. #define TDA9873_PORTS    3
  524. /* E2: test port */
  525. #define TDA9873_TST_PORT 1 << 2
  526. /* E5..E3 control mono output channel (together with transmission mode bit B4)
  527.  *
  528.  * E5 E4 E3 B4     OUTM
  529.  *  0  0  0  0     mono
  530.  *  0  0  1  0     DUAL B
  531.  *  0  1  0  1     mono (from stereo decoder)
  532.  */
  533. #define TDA9873_MOUT_MONO   0
  534. #define TDA9873_MOUT_FMONO  0
  535. #define TDA9873_MOUT_DUALA  0 
  536. #define TDA9873_MOUT_DUALB  1 << 3 
  537. #define TDA9873_MOUT_ST     1 << 4 
  538. #define TDA9873_MOUT_EXTM   (1 << 4 ) & (1 << 3)
  539. #define TDA9873_MOUT_EXTL   1 << 5 
  540. #define TDA9873_MOUT_EXTR   (1 << 5 ) & (1 << 3)
  541. #define TDA9873_MOUT_EXTLR  (1 << 5 ) & (1 << 4)
  542. #define TDA9873_MOUT_MUTE   (1 << 5 ) & (1 << 4) & (1 << 3)
  543. /* Status bits: (chip read) */
  544. #define TDA9873_PONR        0 /* Power-on reset detected if = 1 */
  545. #define TDA9873_STEREO      2 /* Stereo sound is identified     */
  546. #define TDA9873_DUAL        4 /* Dual sound is identified       */
  547. int tda9873_getmode(struct CHIPSTATE *chip)
  548. {
  549. int val,mode;
  550. val = chip_read(chip);
  551. mode = VIDEO_SOUND_MONO;
  552. if (val & TDA9873_STEREO)
  553. mode |= VIDEO_SOUND_STEREO;
  554. if (val & TDA9873_DUAL)
  555. mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  556. dprintk ("tda9873_getmode(): raw chip read: %d, return: %dn",
  557.  val, mode);
  558. return mode;
  559. }
  560. void tda9873_setmode(struct CHIPSTATE *chip, int mode)
  561. {
  562. int sw_data  = chip->shadow.bytes[TDA9873_SW+1] & ~ TDA9873_TR_MASK;
  563. /* int adj_data = chip->shadow.bytes[TDA9873_AD+1] ; */
  564. if ((sw_data & TDA9873_INP_MASK) != TDA9873_INTERNAL) {
  565. dprintk("tda9873_setmode(): external inputn");
  566. return;
  567. }
  568. dprintk("tda9873_setmode(): chip->shadow.bytes[%d] = %dn", TDA9873_SW+1, chip->shadow.bytes[TDA9873_SW+1]);
  569. dprintk("tda9873_setmode(): sw_data  = %dn", sw_data);
  570. switch (mode) {
  571. case VIDEO_SOUND_MONO:
  572. sw_data |= TDA9873_TR_MONO;   
  573. break;
  574. case VIDEO_SOUND_STEREO:
  575. sw_data |= TDA9873_TR_STEREO;
  576. break;
  577. case VIDEO_SOUND_LANG1:
  578. sw_data |= TDA9873_TR_DUALA;
  579. break;
  580. case VIDEO_SOUND_LANG2:
  581. sw_data |= TDA9873_TR_DUALB;
  582. break;
  583. default:
  584. chip->mode = 0;
  585. return;
  586. }
  587. chip_write(chip, TDA9873_SW, sw_data);
  588. dprintk("tda9873_setmode(): req. mode %d; chip_write: %dn",
  589. mode, sw_data);
  590. }
  591. int tda9873_checkit(struct CHIPSTATE *chip)
  592. {
  593. int rc;
  594. if (-1 == (rc = chip_read2(chip,254)))
  595. return 0;
  596. return (rc & ~0x1f) == 0x80;
  597. }
  598. /* ---------------------------------------------------------------------- */
  599. /* audio chip description - defines+functions for tda9874a                */
  600. /* Dariusz Kowalewski <darekk@automex.pl>                                 */
  601. /* Subaddresses for TDA9874A (slave rx) */
  602. #define TDA9874A_AGCGR 0x00 /* AGC gain */
  603. #define TDA9874A_GCONR 0x01 /* general config */
  604. #define TDA9874A_MSR 0x02 /* monitor select */
  605. #define TDA9874A_C1FRA 0x03 /* carrier 1 freq. */
  606. #define TDA9874A_C1FRB 0x04 /* carrier 1 freq. */
  607. #define TDA9874A_C1FRC 0x05 /* carrier 1 freq. */
  608. #define TDA9874A_C2FRA 0x06 /* carrier 2 freq. */
  609. #define TDA9874A_C2FRB 0x07 /* carrier 2 freq. */
  610. #define TDA9874A_C2FRC 0x08 /* carrier 2 freq. */
  611. #define TDA9874A_DCR 0x09 /* demodulator config */
  612. #define TDA9874A_FMER 0x0a /* FM de-emphasis */
  613. #define TDA9874A_FMMR 0x0b /* FM dematrix */
  614. #define TDA9874A_C1OLAR 0x0c /* ch.1 output level adj. */
  615. #define TDA9874A_C2OLAR 0x0d /* ch.2 output level adj. */
  616. #define TDA9874A_NCONR 0x0e /* NICAM config */
  617. #define TDA9874A_NOLAR 0x0f /* NICAM output level adj. */
  618. #define TDA9874A_NLELR 0x10 /* NICAM lower error limit */
  619. #define TDA9874A_NUELR 0x11 /* NICAM upper error limit */
  620. #define TDA9874A_AMCONR 0x12 /* audio mute control */
  621. #define TDA9874A_SDACOSR 0x13 /* stereo DAC output select */
  622. #define TDA9874A_AOSR 0x14 /* analog output select */
  623. #define TDA9874A_DAICONR 0x15 /* digital audio interface config */
  624. #define TDA9874A_I2SOSR 0x16 /* I2S-bus output select */
  625. #define TDA9874A_I2SOLAR 0x17 /* I2S-bus output level adj. */
  626. #define TDA9874A_MDACOSR 0x18 /* mono DAC output select */
  627. #define TDA9874A_ESP 0xFF /* easy standard progr. */
  628. /* Subaddresses for TDA9874A (slave tx) */
  629. #define TDA9874A_DSR 0x00 /* device status */
  630. #define TDA9874A_NSR 0x01 /* NICAM status */
  631. #define TDA9874A_NECR 0x02 /* NICAM error count */
  632. #define TDA9874A_DR1 0x03 /* add. data LSB */
  633. #define TDA9874A_DR2 0x04 /* add. data MSB */
  634. #define TDA9874A_LLRA 0x05 /* monitor level read-out LSB */
  635. #define TDA9874A_LLRB 0x06 /* monitor level read-out MSB */
  636. #define TDA9874A_SIFLR 0x07 /* SIF level */
  637. #define TDA9874A_TR2 252 /* test reg. 2 */
  638. #define TDA9874A_TR1 253 /* test reg. 1 */
  639. #define TDA9874A_DIC 254 /* device id. code */
  640. #define TDA9874A_SIC 255 /* software id. code */
  641. static int tda9874a_mode = 1; /* 0: A2, 1: NICAM */
  642. static int tda9874a_GCONR = 0xc0; /* default config. input pin: SIFSEL=0 */
  643. static int tda9874a_ESP = 0x07; /* default standard: NICAM D/K */
  644. /* insmod options for tda9874a */
  645. static int tda9874a_SIF = -1;
  646. static int tda9874a_STD = -1;
  647. MODULE_PARM(tda9874a_SIF,"i");
  648. MODULE_PARM(tda9874a_STD,"i");
  649. static int tda9874a_setup(struct CHIPSTATE *chip)
  650. {
  651. chip_write(chip, TDA9874A_AGCGR, 0x00); /* 0 dB */
  652. chip_write(chip, TDA9874A_GCONR, tda9874a_GCONR);
  653. chip_write(chip, TDA9874A_MSR, (tda9874a_mode) ? 0x03:0x02);
  654. chip_write(chip, TDA9874A_FMMR, 0x80);
  655. chip_write(chip, TDA9874A_C1OLAR, 0x00); /* 0 dB */
  656. chip_write(chip, TDA9874A_C2OLAR, 0x00); /* 0 dB */
  657. chip_write(chip, TDA9874A_NCONR, 0x00); /* not 0x04 as doc. table 10 says! */
  658. chip_write(chip, TDA9874A_NOLAR, 0x00); /* 0 dB */
  659. chip_write(chip, TDA9874A_AMCONR, 0xf9);
  660. chip_write(chip, TDA9874A_SDACOSR, (tda9874a_mode) ? 0x81:0x80); /* 0x81 */
  661. chip_write(chip, TDA9874A_AOSR, 0x80);
  662. chip_write(chip, TDA9874A_MDACOSR, (tda9874a_mode) ? 0x82:0x80);
  663. chip_write(chip, TDA9874A_ESP, tda9874a_ESP);
  664. return 1;
  665. }
  666. int tda9874a_getmode(struct CHIPSTATE *chip)
  667. {
  668. int dsr,nsr,mode;
  669. mode = VIDEO_SOUND_MONO;
  670. if(-1 == (dsr = chip_read2(chip,TDA9874A_DSR)))
  671. return mode;
  672. if(-1 == (nsr = chip_read2(chip,TDA9874A_NSR)))
  673. return mode;
  674. if(tda9874a_mode) {
  675. /* check also DSR.RSSF and DSR.AMSTAT bits? */
  676. if(nsr & 0x02) /* NSR.S/MB */
  677. mode |= VIDEO_SOUND_STEREO;
  678. if(nsr & 0x01) /* NSR.D/SB */ 
  679. mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  680. } else {
  681. if(dsr & 0x02) /* DSR.IDSTE */
  682. mode |= VIDEO_SOUND_STEREO;
  683. if(dsr & 0x04) /* DSR.IDDUA */
  684. mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
  685. }
  686. dprintk("tda9874a_getmode(): DSR=0x%X, NSR=0x%X, return: %d.n",
  687.  dsr, nsr, mode);
  688. return mode;
  689. }
  690. void tda9874a_setmode(struct CHIPSTATE *chip, int mode)
  691. {
  692. int aosr=0x80,mdacosr=0x82;
  693. /* note: TDA9874A has auto-select function for audio output */
  694. switch(mode) {
  695. case VIDEO_SOUND_MONO:
  696. case VIDEO_SOUND_STEREO:
  697. break;
  698. case VIDEO_SOUND_LANG1:
  699. aosr = 0x80; /* dual A/A */
  700. mdacosr = (tda9874a_mode) ? 0x82:0x80;
  701. break;
  702. case VIDEO_SOUND_LANG2:
  703. aosr = 0xa0; /* dual B/B */
  704. mdacosr = (tda9874a_mode) ? 0x83:0x81;
  705. break;
  706. default:
  707. chip->mode = 0;
  708. return;
  709. }
  710. chip_write(chip, TDA9874A_AOSR, aosr);
  711. chip_write(chip, TDA9874A_MDACOSR, mdacosr);
  712. dprintk("tda9874a_setmode(): req. mode %d; AOSR=0x%X, MDACOSR=0x%X.n",
  713. mode, aosr, mdacosr);
  714. }
  715. int tda9874a_checkit(struct CHIPSTATE *chip)
  716. {
  717. int dic,sic; /* device id. and software id. codes */
  718. if(-1 == (dic = chip_read2(chip,TDA9874A_DIC)))
  719. return 0;
  720. if(-1 == (sic = chip_read2(chip,TDA9874A_SIC)))
  721. return 0;
  722. dprintk("tda9874a_checkit(): DIC=0x%X, SIC=0x%X.n", dic, sic);
  723. return((dic & 0xff) == 0x11);
  724. }
  725. int tda9874a_initialize(struct CHIPSTATE *chip)
  726. {
  727. if(tda9874a_SIF != -1) {
  728. if(tda9874a_SIF == 1)
  729. tda9874a_GCONR = 0xc0; /* sound IF input 1 */
  730. else if(tda9874a_SIF == 2)
  731. tda9874a_GCONR = 0xc1; /* sound IF input 2 */
  732. else
  733. printk(KERN_WARNING "tda9874a: SIF parameter must be 1 or 2.n");
  734. }
  735. if(tda9874a_STD != -1) {
  736. if((tda9874a_STD >= 0)&&(tda9874a_STD <= 8)) {
  737. tda9874a_ESP = tda9874a_STD;
  738. tda9874a_mode = (tda9874a_STD < 5) ? 0 : 1;
  739. } else {
  740. printk(KERN_WARNING "tda9874a: STD parameter must be between 0 and 8.n");
  741. }
  742. }
  743. tda9874a_setup(chip);
  744. return 0;
  745. }
  746. /* ---------------------------------------------------------------------- */
  747. /* audio chip descriptions - defines+functions for tea6420                */
  748. #define TEA6300_VL         0x00  /* volume left */
  749. #define TEA6300_VR         0x01  /* volume right */
  750. #define TEA6300_BA         0x02  /* bass */
  751. #define TEA6300_TR         0x03  /* treble */
  752. #define TEA6300_FA         0x04  /* fader control */
  753. #define TEA6300_S          0x05  /* switch register */
  754.                                  /* values for those registers: */
  755. #define TEA6300_S_SA       0x01  /* stereo A input */
  756. #define TEA6300_S_SB       0x02  /* stereo B */
  757. #define TEA6300_S_SC       0x04  /* stereo C */
  758. #define TEA6300_S_GMU      0x80  /* general mute */
  759. #define TEA6420_S_SA       0x00  /* stereo A input */
  760. #define TEA6420_S_SB       0x01  /* stereo B */
  761. #define TEA6420_S_SC       0x02  /* stereo C */
  762. #define TEA6420_S_SD       0x03  /* stereo D */
  763. #define TEA6420_S_SE       0x04  /* stereo E */
  764. #define TEA6420_S_GMU      0x05  /* general mute */
  765. int tea6300_shift10(int val) { return val >> 10; }
  766. int tea6300_shift12(int val) { return val >> 12; }
  767. /* ---------------------------------------------------------------------- */
  768. /* audio chip descriptions - defines+functions for tda8425                */
  769. #define TDA8425_VL         0x00  /* volume left */
  770. #define TDA8425_VR         0x01  /* volume right */
  771. #define TDA8425_BA         0x02  /* bass */
  772. #define TDA8425_TR         0x03  /* treble */
  773. #define TDA8425_S1         0x08  /* switch functions */
  774.                                  /* values for those registers: */
  775. #define TDA8425_S1_OFF     0xEE  /* audio off (mute on) */
  776. #define TDA8425_S1_ON      0xCE  /* audio on (mute off) - "linear stereo" mode */
  777. int tda8425_shift10(int val) { return val >> 10 | 0xc0; }
  778. int tda8425_shift12(int val) { return val >> 12 | 0xf0; }
  779. /* ---------------------------------------------------------------------- */
  780. /* audio chip descriptions - defines+functions for pic16c54 (PV951)       */
  781. /* the registers of 16C54, I2C sub address. */
  782. #define PIC16C54_REG_KEY_CODE     0x01        /* Not use. */
  783. #define PIC16C54_REG_MISC         0x02
  784. /* bit definition of the RESET register, I2C data. */
  785. #define PIC16C54_MISC_RESET_REMOTE_CTL 0x01 /* bit 0, Reset to receive the key */
  786.                                             /*        code of remote controller */
  787. #define PIC16C54_MISC_MTS_MAIN         0x02 /* bit 1 */
  788. #define PIC16C54_MISC_MTS_SAP          0x04 /* bit 2 */
  789. #define PIC16C54_MISC_MTS_BOTH         0x08 /* bit 3 */
  790. #define PIC16C54_MISC_SND_MUTE         0x10 /* bit 4, Mute Audio(Line-in and Tuner) */
  791. #define PIC16C54_MISC_SND_NOTMUTE      0x20 /* bit 5 */
  792. #define PIC16C54_MISC_SWITCH_TUNER     0x40 /* bit 6 , Switch to Line-in */
  793. #define PIC16C54_MISC_SWITCH_LINE      0x80 /* bit 7 , Switch to Tuner */
  794. /* ---------------------------------------------------------------------- */
  795. /* audio chip descriptions - struct CHIPDESC                              */
  796. /* insmod options to enable/disable individual audio chips */
  797. int tda8425  = 1;
  798. int tda9840  = 1;
  799. int tda9850  = 1;
  800. int tda9855  = 1;
  801. int tda9873  = 1;
  802. int tda9874a = 1;
  803. int tea6300  = 0;
  804. int tea6420  = 1;
  805. int pic16c54 = 1;
  806. MODULE_PARM(tda8425,"i");
  807. MODULE_PARM(tda9840,"i");
  808. MODULE_PARM(tda9850,"i");
  809. MODULE_PARM(tda9855,"i");
  810. MODULE_PARM(tda9873,"i");
  811. MODULE_PARM(tda9874a,"i");
  812. MODULE_PARM(tea6300,"i");
  813. MODULE_PARM(tea6420,"i");
  814. MODULE_PARM(pic16c54,"i");
  815. static struct CHIPDESC chiplist[] = {
  816. {
  817. name:       "tda9840",
  818. id:         I2C_DRIVERID_TDA9840,
  819. insmodopt:  &tda9840,
  820. addr_lo:    I2C_TDA9840 >> 1,
  821. addr_hi:    I2C_TDA9840 >> 1,
  822. registers:  5,
  823. getmode:    tda9840_getmode,
  824. setmode:    tda9840_setmode,
  825. checkmode:  generic_checkmode,
  826.         init:       { 2, { TDA9840_TEST, TDA9840_TEST_INT1SN
  827. /* ,TDA9840_SW, TDA9840_MONO */} }
  828. },
  829. {
  830. name:       "tda9873h",
  831. id:         I2C_DRIVERID_TDA9873,
  832. checkit:    tda9873_checkit,
  833. insmodopt:  &tda9873,
  834. addr_lo:    I2C_TDA985x_L >> 1,
  835. addr_hi:    I2C_TDA985x_H >> 1,
  836. registers:  3,
  837. flags:      CHIP_HAS_INPUTSEL,
  838. getmode:    tda9873_getmode,
  839. setmode:    tda9873_setmode,
  840. checkmode:  generic_checkmode,
  841. init:       { 4, { TDA9873_SW, 0xa4, 0x06, 0x03 } },
  842. inputreg:   TDA9873_SW,
  843. inputmute:  TDA9873_MUTE | TDA9873_AUTOMUTE,
  844. inputmap:   {0xa0, 0xa2, 0xa0, 0xa0, 0xc0},
  845. inputmask:  TDA9873_INP_MASK | TDA9873_MUTE | TDA9873_AUTOMUTE
  846. },
  847. {
  848. name:       "tda9874a",
  849. id:         I2C_DRIVERID_TDA9874A,
  850. checkit:    tda9874a_checkit,
  851. initialize: tda9874a_initialize,
  852. insmodopt:  &tda9874a,
  853. addr_lo:    I2C_TDA9874A >> 1,
  854. addr_hi:    I2C_TDA9874A >> 1,
  855. getmode:    tda9874a_getmode,
  856. setmode:    tda9874a_setmode,
  857. checkmode:  generic_checkmode,
  858. },
  859. {
  860. name:       "tda9850",
  861. id:         I2C_DRIVERID_TDA9850,
  862. insmodopt:  &tda9850,
  863. addr_lo:    I2C_TDA985x_L >> 1,
  864. addr_hi:    I2C_TDA985x_H >> 1,
  865. registers:  11,
  866. getmode:    tda985x_getmode,
  867. setmode:    tda985x_setmode,
  868. init:       { 8, { TDA9850_C4, 0x08, 0x08, TDA985x_STEREO, 0x07, 0x10, 0x10, 0x03 } }
  869. },
  870. {
  871. name:       "tda9855",
  872. id:         I2C_DRIVERID_TDA9855,
  873. insmodopt:  &tda9855,
  874. addr_lo:    I2C_TDA985x_L >> 1,
  875. addr_hi:    I2C_TDA985x_H >> 1,
  876. registers:  11,
  877. flags:      CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE,
  878. leftreg:    TDA9855_VR,
  879. rightreg:   TDA9855_VL,
  880. bassreg:    TDA9855_BA,
  881. treblereg:  TDA9855_TR,
  882. volfunc:    tda9855_volume,
  883. bassfunc:   tda9855_bass,
  884. treblefunc: tda9855_treble,
  885. getmode:    tda985x_getmode,
  886. setmode:    tda985x_setmode,
  887. init:       { 12, { 0, 0x6f, 0x6f, 0x0e, 0x07<<1, 0x8<<2,
  888.     TDA9855_MUTE | TDA9855_AVL | TDA9855_LOUD | TDA9855_INT,
  889.     TDA985x_STEREO | TDA9855_LINEAR | TDA9855_TZCM | TDA9855_VZCM,
  890.     0x07, 0x10, 0x10, 0x03 }}
  891. },
  892. {
  893. name:       "tea6300",
  894. id:         I2C_DRIVERID_TEA6300,
  895. insmodopt:  &tea6300,
  896. addr_lo:    I2C_TEA6300 >> 1,
  897. addr_hi:    I2C_TEA6300 >> 1,
  898. registers:  6,
  899. flags:      CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE | CHIP_HAS_INPUTSEL,
  900. leftreg:    TEA6300_VR,
  901. rightreg:   TEA6300_VL,
  902. bassreg:    TEA6300_BA,
  903. treblereg:  TEA6300_TR,
  904. volfunc:    tea6300_shift10,
  905. bassfunc:   tea6300_shift12,
  906. treblefunc: tea6300_shift12,
  907. inputreg:   TEA6300_S,
  908. inputmap:   { TEA6300_S_SA, TEA6300_S_SB, TEA6300_S_SC },
  909. inputmute:  TEA6300_S_GMU,
  910. },
  911. {
  912. name:       "tea6420",
  913. id:         I2C_DRIVERID_TEA6420,
  914. insmodopt:  &tea6420,
  915. addr_lo:    I2C_TEA6420 >> 1,
  916. addr_hi:    I2C_TEA6420 >> 1,
  917. registers:  1,
  918. flags:      CHIP_HAS_INPUTSEL,
  919. inputreg:   -1,
  920. inputmap:   { TEA6420_S_SA, TEA6420_S_SB, TEA6420_S_SC },
  921. inputmute:  TEA6300_S_GMU,
  922. },
  923. {
  924. name:       "tda8425",
  925. id:         I2C_DRIVERID_TDA8425,
  926. insmodopt:  &tda8425,
  927. addr_lo:    I2C_TDA8425 >> 1,
  928. addr_hi:    I2C_TDA8425 >> 1,
  929. registers:  9,
  930. flags:      CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE | CHIP_HAS_INPUTSEL,
  931. leftreg:    TDA8425_VR,
  932. rightreg:   TDA8425_VL,
  933. bassreg:    TDA8425_BA,
  934. treblereg:  TDA8425_TR,
  935. volfunc:    tda8425_shift10,
  936. bassfunc:   tda8425_shift12,
  937. treblefunc: tda8425_shift12,
  938. inputreg:   TDA8425_S1,
  939. inputmap:   { TDA8425_S1_ON, TDA8425_S1_ON, TDA8425_S1_ON },
  940. inputmute:  TDA8425_S1_OFF,
  941. },
  942. {
  943. name:       "pic16c54 (PV951)",
  944. id:         I2C_DRIVERID_PIC16C54_PV951,
  945. insmodopt:  &pic16c54,
  946. addr_lo:    I2C_PIC16C54 >> 1,
  947. addr_hi:    I2C_PIC16C54>> 1,
  948. registers:  2,
  949. flags:      CHIP_HAS_INPUTSEL,
  950. inputreg:   PIC16C54_REG_MISC,
  951. inputmap:   {PIC16C54_MISC_SND_NOTMUTE|PIC16C54_MISC_SWITCH_TUNER,
  952.      PIC16C54_MISC_SND_NOTMUTE|PIC16C54_MISC_SWITCH_LINE,
  953.      PIC16C54_MISC_SND_NOTMUTE|PIC16C54_MISC_SWITCH_LINE,
  954.      PIC16C54_MISC_SND_MUTE,PIC16C54_MISC_SND_MUTE,
  955.      PIC16C54_MISC_SND_NOTMUTE},
  956. inputmute:  PIC16C54_MISC_SND_MUTE,
  957. },
  958. { name: NULL } /* EOF */
  959. };
  960. /* ---------------------------------------------------------------------- */
  961. /* i2c registration                                                       */
  962. static int chip_attach(struct i2c_adapter *adap, int addr,
  963.        unsigned short flags, int kind)
  964. {
  965. struct CHIPSTATE *chip;
  966. struct CHIPDESC  *desc;
  967. chip = kmalloc(sizeof(*chip),GFP_KERNEL);
  968. if (!chip)
  969. return -ENOMEM;
  970. memset(chip,0,sizeof(*chip));
  971. memcpy(&chip->c,&client_template,sizeof(struct i2c_client));
  972.         chip->c.adapter = adap;
  973.         chip->c.addr = addr;
  974. chip->c.data = chip;
  975. /* find description for the chip */
  976. dprintk("tvaudio: chip @ addr=0x%xn", addr<<1);
  977. for (desc = chiplist; desc->name != NULL; desc++) {
  978. if (0 == *(desc->insmodopt))
  979. continue;
  980. if (addr < desc->addr_lo ||
  981.     addr > desc->addr_hi)
  982. continue;
  983. if (desc->checkit && !desc->checkit(chip))
  984. continue;
  985. break;
  986. }
  987. if (desc->name == NULL) {
  988. dprintk("tvaudio: no matching chip description foundn");
  989. return -EIO;
  990. }
  991. dprintk("tvaudio: %s matches:%s%s%sn",desc->name,
  992. (desc->flags & CHIP_HAS_VOLUME)     ? " volume"      : "",
  993. (desc->flags & CHIP_HAS_BASSTREBLE) ? " bass/treble" : "",
  994. (desc->flags & CHIP_HAS_INPUTSEL)   ? " audiomux"    : "");
  995. /* fill required data structures */
  996. strcpy(chip->c.name,desc->name);
  997. chip->type = desc-chiplist;
  998. chip->shadow.count = desc->registers+1;
  999.         chip->prevmode = -1;
  1000. /* register */
  1001. MOD_INC_USE_COUNT;
  1002. i2c_attach_client(&chip->c);
  1003. /* initialization  */
  1004. if (desc->initialize != NULL)
  1005. desc->initialize(chip);
  1006. else
  1007. chip_cmd(chip,"init",&desc->init);
  1008. if (desc->flags & CHIP_HAS_VOLUME) {
  1009. chip->left   = desc->leftinit   ? desc->leftinit   : 65536;
  1010. chip->right  = desc->rightinit  ? desc->rightinit  : 65536;
  1011. chip_write(chip,desc->leftreg,desc->volfunc(chip->left));
  1012. chip_write(chip,desc->rightreg,desc->volfunc(chip->right));
  1013. }
  1014. if (desc->flags & CHIP_HAS_BASSTREBLE) {
  1015. chip->treble = desc->trebleinit ? desc->trebleinit : 32768;
  1016. chip->bass   = desc->bassinit   ? desc->bassinit   : 32768;
  1017. chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass));
  1018. chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble));
  1019. }
  1020. if (desc->checkmode) {
  1021. /* start async thread */
  1022. DECLARE_MUTEX_LOCKED(sem);
  1023. chip->notify = &sem;
  1024. chip->wt.function = chip_thread_wake;
  1025. chip->wt.data     = (unsigned long)chip;
  1026. init_waitqueue_head(&chip->wq);
  1027. kernel_thread(chip_thread,(void *)chip,0);
  1028. down(&sem);
  1029. chip->notify = NULL;
  1030. wake_up_interruptible(&chip->wq);
  1031. }
  1032. return 0;
  1033. }
  1034. static int chip_probe(struct i2c_adapter *adap)
  1035. {
  1036. if (adap->id == (I2C_ALGO_BIT | I2C_HW_B_BT848))
  1037. return i2c_probe(adap, &addr_data, chip_attach);
  1038. return 0;
  1039. }
  1040. static int chip_detach(struct i2c_client *client)
  1041. {
  1042. struct CHIPSTATE *chip = client->data;
  1043. del_timer(&chip->wt);
  1044. if (NULL != chip->thread) {
  1045. /* shutdown async thread */
  1046. DECLARE_MUTEX_LOCKED(sem);
  1047. chip->notify = &sem;
  1048. chip->done = 1;
  1049. wake_up_interruptible(&chip->wq);
  1050. down(&sem);
  1051. chip->notify = NULL;
  1052. }
  1053. i2c_detach_client(&chip->c);
  1054. kfree(chip);
  1055. MOD_DEC_USE_COUNT;
  1056. return 0;
  1057. }
  1058. /* ---------------------------------------------------------------------- */
  1059. /* video4linux interface                                                  */
  1060. static int chip_command(struct i2c_client *client,
  1061. unsigned int cmd, void *arg)
  1062. {
  1063.         __u16 *sarg = arg;
  1064. struct CHIPSTATE *chip = client->data;
  1065. struct CHIPDESC  *desc = chiplist + chip->type;
  1066. dprintk("%s: chip_command 0x%xn",chip->c.name,cmd);
  1067. switch (cmd) {
  1068. case AUDC_SET_INPUT:
  1069. if (desc->flags & CHIP_HAS_INPUTSEL) {
  1070. if (*sarg & 0x80)
  1071. chip_write_masked(chip,desc->inputreg,desc->inputmute,desc->inputmask);
  1072. else
  1073. chip_write_masked(chip,desc->inputreg,desc->inputmap[*sarg],desc->inputmask);
  1074. }
  1075. break;
  1076. /* --- v4l ioctls --- */
  1077. /* take care: bttv does userspace copying, we'll get a
  1078.    kernel pointer here... */
  1079. case VIDIOCGAUDIO:
  1080. {
  1081. struct video_audio *va = arg;
  1082. if (desc->flags & CHIP_HAS_VOLUME) {
  1083. va->flags  |= VIDEO_AUDIO_VOLUME;
  1084. va->volume  = MAX(chip->left,chip->right);
  1085. va->balance = (32768*MIN(chip->left,chip->right))/
  1086. (va->volume ? va->volume : 1);
  1087. }
  1088. if (desc->flags & CHIP_HAS_BASSTREBLE) {
  1089. va->flags |= VIDEO_AUDIO_BASS | VIDEO_AUDIO_TREBLE;
  1090. va->bass   = chip->bass;
  1091. va->treble = chip->treble;
  1092. }
  1093. if (desc->getmode)
  1094. va->mode = desc->getmode(chip);
  1095. else
  1096. va->mode = VIDEO_SOUND_MONO;
  1097. break;
  1098. }
  1099. case VIDIOCSAUDIO:
  1100. {
  1101. struct video_audio *va = arg;
  1102. if (desc->flags & CHIP_HAS_VOLUME) {
  1103. chip->left = (MIN(65536 - va->balance,32768) *
  1104.       va->volume) / 32768;
  1105. chip->right = (MIN(va->balance,32768) *
  1106.        va->volume) / 32768;
  1107. chip_write(chip,desc->leftreg,desc->volfunc(chip->left));
  1108. chip_write(chip,desc->rightreg,desc->volfunc(chip->right));
  1109. }
  1110. if (desc->flags & CHIP_HAS_BASSTREBLE) {
  1111. chip->bass = va->bass;
  1112. chip->treble = va->treble;
  1113. chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass));
  1114. chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble));
  1115. }
  1116. if (desc->setmode && va->mode) {
  1117. chip->mode = va->mode;
  1118. desc->setmode(chip,va->mode);
  1119. }
  1120. break;
  1121. }
  1122. case VIDIOCSFREQ:
  1123. {
  1124.      chip->mode = 0; /* automatic */
  1125. if (desc->checkmode) {
  1126. desc->setmode(chip,VIDEO_SOUND_MONO);
  1127.      if (chip->prevmode != VIDEO_SOUND_MONO)
  1128.      chip->prevmode = -1; /* reset previous mode */
  1129. mod_timer(&chip->wt, jiffies+2*HZ);
  1130. /* the thread will call checkmode() later */
  1131. }
  1132. }
  1133. }
  1134. return 0;
  1135. }
  1136. static struct i2c_driver driver = {
  1137.         name:            "generic i2c audio driver",
  1138.         id:              I2C_DRIVERID_TVAUDIO, /* FIXME */
  1139.         flags:           I2C_DF_NOTIFY,
  1140.         attach_adapter:  chip_probe,
  1141.         detach_client:   chip_detach,
  1142.         command:         chip_command,
  1143. };
  1144. static struct i2c_client client_template =
  1145. {
  1146.         name:   "(unset)",
  1147.         driver: &driver,
  1148. };
  1149. int audiochip_init_module(void)
  1150. {
  1151. struct CHIPDESC  *desc;
  1152. printk(KERN_INFO "tvaudio: TV audio decoder + audio/video mux drivern");
  1153. printk(KERN_INFO "tvaudio: known chips: ");
  1154. for (desc = chiplist; desc->name != NULL; desc++)
  1155. printk("%s%s", (desc == chiplist) ? "" : ",",desc->name);
  1156. printk("n");
  1157. i2c_add_driver(&driver);
  1158. return 0;
  1159. }
  1160. void audiochip_cleanup_module(void)
  1161. {
  1162. i2c_del_driver(&driver);
  1163. }
  1164. module_init(audiochip_init_module);
  1165. module_exit(audiochip_cleanup_module);
  1166. /*
  1167.  * Local variables:
  1168.  * c-basic-offset: 8
  1169.  * End:
  1170.  */