2 * Handlers for board audio hooks, splitted from bttv-cards
4 * Copyright (c) 2006 Mauro Carvalho Chehab (mchehab@infradead.org)
5 * This code is placed under the terms of the GNU General Public License
8 #include "bttv-audio-hook.h"
10 /* ----------------------------------------------------------------------- */
13 void winview_audio(struct bttv *btv, struct video_audio *v, int set)
15 /* PT2254A programming Jon Tombs, jon@gte.esi.us.es */
16 int bits_out, loops, vol, data;
19 /* Fixed by Leandro Lucarella <luca@linuxmendoza.org.ar (07/31/01) */
20 v->flags |= VIDEO_AUDIO_VOLUME;
24 /* 32 levels logarithmic */
25 vol = 32 - ((v->volume>>11));
27 bits_out = (PT2254_DBS_IN_2>>(vol%5));
29 bits_out |= (PT2254_DBS_IN_10>>(vol/5));
30 bits_out |= PT2254_L_CHANNEL | PT2254_R_CHANNEL;
32 data &= ~(WINVIEW_PT2254_CLK| WINVIEW_PT2254_DATA|
33 WINVIEW_PT2254_STROBE);
34 for (loops = 17; loops >= 0 ; loops--) {
35 if (bits_out & (1<<loops))
36 data |= WINVIEW_PT2254_DATA;
38 data &= ~WINVIEW_PT2254_DATA;
41 data |= WINVIEW_PT2254_CLK;
44 data &= ~WINVIEW_PT2254_CLK;
47 data |= WINVIEW_PT2254_STROBE;
48 data &= ~WINVIEW_PT2254_DATA;
51 data &= ~WINVIEW_PT2254_STROBE;
55 /* ----------------------------------------------------------------------- */
56 /* mono/stereo control for various cards (which don't use i2c chips but */
57 /* connect something to the GPIO pins */
60 gvbctv3pci_audio(struct bttv *btv, struct video_audio *v, int set)
65 gpio_inout(0x300, 0x300);
66 if (v->mode & VIDEO_SOUND_LANG1)
68 if (v->mode & VIDEO_SOUND_LANG2)
70 if (v->mode & VIDEO_SOUND_STEREO)
72 /* if (v->mode & VIDEO_SOUND_MONO)
74 gpio_bits(0x300, con);
76 v->mode = VIDEO_SOUND_STEREO |
77 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
82 gvbctv5pci_audio(struct bttv *btv, struct video_audio *v, int set)
84 unsigned int val, con;
92 if (v->mode & VIDEO_SOUND_LANG2) {
93 if (v->mode & VIDEO_SOUND_LANG1) {
102 if (con != (val & 0x300)) {
103 gpio_bits(0x300, con);
105 bttv_gpio_tracking(btv,"gvbctv5pci");
108 switch (val & 0x70) {
110 v->mode = VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
113 v->mode = VIDEO_SOUND_LANG2;
116 v->mode = VIDEO_SOUND_LANG1;
119 v->mode = VIDEO_SOUND_STEREO;
122 v->mode = VIDEO_SOUND_MONO;
125 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
126 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
132 * Mario Medina Nussbaum <medisoft@alohabbs.org.mx>
133 * I discover that on BT848_GPIO_DATA address a byte 0xcce enable stereo,
134 * 0xdde enables mono and 0xccd enables sap
136 * Petr Vandrovec <VANDROVE@vc.cvut.cz>
137 * P.S.: At least mask in line above is wrong - GPIO pins 3,2 select
138 * input/output sound connection, so both must be set for output mode.
140 * Looks like it's needed only for the "tvphone", the "tvphone 98"
141 * handles this with a tda9840
145 avermedia_tvphone_audio(struct bttv *btv, struct video_audio *v, int set)
150 if (v->mode & VIDEO_SOUND_LANG2) /* SAP */
152 if (v->mode & VIDEO_SOUND_STEREO)
157 bttv_gpio_tracking(btv,"avermedia");
160 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
167 avermedia_tv_stereo_audio(struct bttv *btv, struct video_audio *v, int set)
172 if (v->mode & VIDEO_SOUND_LANG2) /* SAP */
174 if (v->mode & VIDEO_SOUND_STEREO) /* STEREO */
176 btaor(val, ~0x03, BT848_GPIO_DATA);
178 bttv_gpio_tracking(btv,"avermedia");
180 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
181 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
186 /* Lifetec 9415 handling */
188 lt9415_audio(struct bttv *btv, struct video_audio *v, int set)
192 if (gpio_read() & 0x4000) {
193 v->mode = VIDEO_SOUND_MONO;
198 if (v->mode & VIDEO_SOUND_LANG2) /* A2 SAP */
200 if (v->mode & VIDEO_SOUND_STEREO) /* A2 stereo */
202 if ((v->mode & VIDEO_SOUND_LANG1) ||
203 (v->mode & VIDEO_SOUND_MONO))
205 gpio_bits(0x0880, val);
207 bttv_gpio_tracking(btv,"lt9415");
209 /* autodetect doesn't work with this card :-( */
210 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
211 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
216 /* TDA9821 on TerraTV+ Bt848, Bt878 */
218 terratv_audio(struct bttv *btv, struct video_audio *v, int set)
220 unsigned int con = 0;
223 gpio_inout(0x180000,0x180000);
224 if (v->mode & VIDEO_SOUND_LANG2)
226 if (v->mode & VIDEO_SOUND_STEREO)
228 gpio_bits(0x180000, con);
230 bttv_gpio_tracking(btv,"terratv");
232 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
233 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
238 winfast2000_audio(struct bttv *btv, struct video_audio *v, int set)
240 unsigned long val = 0;
243 /*btor (0xc32000, BT848_GPIO_OUT_EN);*/
244 if (v->mode & VIDEO_SOUND_MONO) /* Mono */
246 if (v->mode & VIDEO_SOUND_LANG1) /* Mono */
248 if (v->mode & VIDEO_SOUND_LANG2) /* SAP */
250 if (v->mode & VIDEO_SOUND_STEREO) /* Stereo */
253 gpio_bits(0x430000, val);
255 bttv_gpio_tracking(btv,"winfast2000");
258 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
259 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
264 * Dariusz Kowalewski <darekk@automex.pl>
265 * sound control for Prolink PV-BT878P+9B (PixelView PlayTV Pro FM+NICAM
266 * revision 9B has on-board TDA9874A sound decoder).
268 * Note: There are card variants without tda9874a. Forcing the "stereo sound route"
269 * will mute this cards.
272 pvbt878p9b_audio(struct bttv *btv, struct video_audio *v, int set)
274 unsigned int val = 0;
280 if (v->mode & VIDEO_SOUND_MONO) {
283 if ((v->mode & (VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2))
284 || (v->mode & VIDEO_SOUND_STEREO)) {
290 bttv_gpio_tracking(btv,"pvbt878p9b");
293 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
294 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
299 * Dariusz Kowalewski <darekk@automex.pl>
300 * sound control for FlyVideo 2000S (with tda9874 decoder)
301 * based on pvbt878p9b_audio() - this is not tested, please fix!!!
304 fv2000s_audio(struct bttv *btv, struct video_audio *v, int set)
306 unsigned int val = 0xffff;
312 if (v->mode & VIDEO_SOUND_MONO) {
315 if ((v->mode & (VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2))
316 || (v->mode & VIDEO_SOUND_STEREO)) {
317 val = 0x1080; /*-dk-???: 0x0880, 0x0080, 0x1800 ... */
320 gpio_bits(0x1800, val);
322 bttv_gpio_tracking(btv,"fv2000s");
325 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
326 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
331 * sound control for Canopus WinDVR PCI
332 * Masaki Suzuki <masaki@btree.org>
335 windvr_audio(struct bttv *btv, struct video_audio *v, int set)
337 unsigned long val = 0;
340 if (v->mode & VIDEO_SOUND_MONO)
342 if (v->mode & VIDEO_SOUND_LANG1)
344 if (v->mode & VIDEO_SOUND_LANG2)
346 if (v->mode & VIDEO_SOUND_STEREO)
349 gpio_bits(0x140000, val);
351 bttv_gpio_tracking(btv,"windvr");
354 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
355 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
360 * sound control for AD-TVK503
361 * Hiroshi Takekawa <sian@big.or.jp>
364 adtvk503_audio(struct bttv *btv, struct video_audio *v, int set)
366 unsigned int con = 0xffffff;
368 /* btaor(0x1e0000, ~0x1e0000, BT848_GPIO_OUT_EN); */
371 /* btor(***, BT848_GPIO_OUT_EN); */
372 if (v->mode & VIDEO_SOUND_LANG1)
374 if (v->mode & VIDEO_SOUND_LANG2)
376 if (v->mode & VIDEO_SOUND_STEREO)
378 if (v->mode & VIDEO_SOUND_MONO)
380 if (con != 0xffffff) {
381 gpio_bits(0x1e0000,con);
383 bttv_gpio_tracking(btv, "adtvk503");
386 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
387 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;