Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
bttv-audio-hook.c
Go to the documentation of this file.
1 /*
2  * Handlers for board audio hooks, splitted from bttv-cards
3  *
4  * Copyright (c) 2006 Mauro Carvalho Chehab ([email protected])
5  * This code is placed under the terms of the GNU General Public License
6  */
7 
8 #include "bttv-audio-hook.h"
9 
10 #include <linux/delay.h>
11 
12 /* ----------------------------------------------------------------------- */
13 /* winview */
14 
15 void winview_volume(struct bttv *btv, __u16 volume)
16 {
17  /* PT2254A programming Jon Tombs, [email protected] */
18  int bits_out, loops, vol, data;
19 
20  /* 32 levels logarithmic */
21  vol = 32 - ((volume>>11));
22  /* units */
23  bits_out = (PT2254_DBS_IN_2>>(vol%5));
24  /* tens */
25  bits_out |= (PT2254_DBS_IN_10>>(vol/5));
26  bits_out |= PT2254_L_CHANNEL | PT2254_R_CHANNEL;
27  data = gpio_read();
30  for (loops = 17; loops >= 0 ; loops--) {
31  if (bits_out & (1<<loops))
32  data |= WINVIEW_PT2254_DATA;
33  else
34  data &= ~WINVIEW_PT2254_DATA;
35  gpio_write(data);
36  udelay(5);
37  data |= WINVIEW_PT2254_CLK;
38  gpio_write(data);
39  udelay(5);
40  data &= ~WINVIEW_PT2254_CLK;
41  gpio_write(data);
42  }
43  data |= WINVIEW_PT2254_STROBE;
44  data &= ~WINVIEW_PT2254_DATA;
45  gpio_write(data);
46  udelay(10);
47  data &= ~WINVIEW_PT2254_STROBE;
48  gpio_write(data);
49 }
50 
51 /* ----------------------------------------------------------------------- */
52 /* mono/stereo control for various cards (which don't use i2c chips but */
53 /* connect something to the GPIO pins */
54 
55 void gvbctv3pci_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
56 {
57  unsigned int con = 0;
58 
59  if (set) {
60  gpio_inout(0x300, 0x300);
62  con = 0x000;
64  con = 0x300;
66  con = 0x200;
67 /* if (t->audmode & V4L2_TUNER_MODE_MONO)
68  * con = 0x100; */
69  gpio_bits(0x300, con);
70  } else {
73  }
74 }
75 
76 void gvbctv5pci_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
77 {
78  unsigned int val, con;
79 
80  if (btv->radio_user)
81  return;
82 
83  val = gpio_read();
84  if (set) {
85  con = 0x000;
86  if (t->audmode & V4L2_TUNER_MODE_LANG2) {
87  if (t->audmode & V4L2_TUNER_MODE_LANG1) {
88  /* LANG1 + LANG2 */
89  con = 0x100;
90  }
91  else {
92  /* LANG2 */
93  con = 0x300;
94  }
95  }
96  if (con != (val & 0x300)) {
97  gpio_bits(0x300, con);
98  if (bttv_gpio)
99  bttv_gpio_tracking(btv,"gvbctv5pci");
100  }
101  } else {
102  switch (val & 0x70) {
103  case 0x10:
105  break;
106  case 0x30:
108  break;
109  case 0x50:
111  break;
112  case 0x60:
114  break;
115  case 0x70:
117  break;
118  default:
123  }
126  }
127 }
128 
129 /*
130  * Mario Medina Nussbaum <[email protected]>
131  * I discover that on BT848_GPIO_DATA address a byte 0xcce enable stereo,
132  * 0xdde enables mono and 0xccd enables sap
133  *
134  * Petr Vandrovec <[email protected]>
135  * P.S.: At least mask in line above is wrong - GPIO pins 3,2 select
136  * input/output sound connection, so both must be set for output mode.
137  *
138  * Looks like it's needed only for the "tvphone", the "tvphone 98"
139  * handles this with a tda9840
140  *
141  */
142 
143 void avermedia_tvphone_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
144 {
145  int val = 0;
146 
147  if (set) {
148  if (t->audmode & V4L2_TUNER_MODE_LANG2) /* SAP */
149  val = 0x02;
151  val = 0x01;
152  if (val) {
153  gpio_bits(0x03,val);
154  if (bttv_gpio)
155  bttv_gpio_tracking(btv,"avermedia");
156  }
157  } else {
160  return;
161  }
162 }
163 
164 
165 void avermedia_tv_stereo_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
166 {
167  int val = 0;
168 
169  if (set) {
170  if (t->audmode & V4L2_TUNER_MODE_LANG2) /* SAP */
171  val = 0x01;
172  if (t->audmode & V4L2_TUNER_MODE_STEREO) /* STEREO */
173  val = 0x02;
174  btaor(val, ~0x03, BT848_GPIO_DATA);
175  if (bttv_gpio)
176  bttv_gpio_tracking(btv,"avermedia");
177  } else {
180  return;
181  }
182 }
183 
184 /* Lifetec 9415 handling */
185 
186 void lt9415_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
187 {
188  int val = 0;
189 
190  if (gpio_read() & 0x4000) {
192  return;
193  }
194 
195  if (set) {
196  if (t->audmode & V4L2_TUNER_MODE_LANG2) /* A2 SAP */
197  val = 0x0080;
198  if (t->audmode & V4L2_TUNER_MODE_STEREO) /* A2 stereo */
199  val = 0x0880;
200  if ((t->audmode & V4L2_TUNER_MODE_LANG1) ||
202  val = 0;
203  gpio_bits(0x0880, val);
204  if (bttv_gpio)
205  bttv_gpio_tracking(btv,"lt9415");
206  } else {
207  /* autodetect doesn't work with this card :-( */
210  return;
211  }
212 }
213 
214 /* TDA9821 on TerraTV+ Bt848, Bt878 */
215 void terratv_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
216 {
217  unsigned int con = 0;
218 
219  if (set) {
220  gpio_inout(0x180000,0x180000);
222  con = 0x080000;
224  con = 0x180000;
225  gpio_bits(0x180000, con);
226  if (bttv_gpio)
227  bttv_gpio_tracking(btv,"terratv");
228  } else {
231  }
232 }
233 
234 
235 void winfast2000_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
236 {
237  unsigned long val = 0;
238 
239  if (set) {
240  /*btor (0xc32000, BT848_GPIO_OUT_EN);*/
241  if (t->audmode & V4L2_TUNER_MODE_MONO) /* Mono */
242  val = 0x420000;
243  if (t->audmode & V4L2_TUNER_MODE_LANG1) /* Mono */
244  val = 0x420000;
245  if (t->audmode & V4L2_TUNER_MODE_LANG2) /* SAP */
246  val = 0x410000;
247  if (t->audmode & V4L2_TUNER_MODE_STEREO) /* Stereo */
248  val = 0x020000;
249  if (val) {
250  gpio_bits(0x430000, val);
251  if (bttv_gpio)
252  bttv_gpio_tracking(btv,"winfast2000");
253  }
254  } else {
257  }
258 }
259 
260 /*
261  * Dariusz Kowalewski <[email protected]>
262  * sound control for Prolink PV-BT878P+9B (PixelView PlayTV Pro FM+NICAM
263  * revision 9B has on-board TDA9874A sound decoder).
264  *
265  * Note: There are card variants without tda9874a. Forcing the "stereo sound route"
266  * will mute this cards.
267  */
268 void pvbt878p9b_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
269 {
270  unsigned int val = 0;
271 
272  if (btv->radio_user)
273  return;
274 
275  if (set) {
276  if (t->audmode & V4L2_TUNER_MODE_MONO) {
277  val = 0x01;
278  }
280  || (t->audmode & V4L2_TUNER_MODE_STEREO)) {
281  val = 0x02;
282  }
283  if (val) {
284  gpio_bits(0x03,val);
285  if (bttv_gpio)
286  bttv_gpio_tracking(btv,"pvbt878p9b");
287  }
288  } else {
291  }
292 }
293 
294 /*
295  * Dariusz Kowalewski <[email protected]>
296  * sound control for FlyVideo 2000S (with tda9874 decoder)
297  * based on pvbt878p9b_audio() - this is not tested, please fix!!!
298  */
299 void fv2000s_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
300 {
301  unsigned int val = 0xffff;
302 
303  if (btv->radio_user)
304  return;
305 
306  if (set) {
307  if (t->audmode & V4L2_TUNER_MODE_MONO) {
308  val = 0x0000;
309  }
311  || (t->audmode & V4L2_TUNER_MODE_STEREO)) {
312  val = 0x1080; /*-dk-???: 0x0880, 0x0080, 0x1800 ... */
313  }
314  if (val != 0xffff) {
315  gpio_bits(0x1800, val);
316  if (bttv_gpio)
317  bttv_gpio_tracking(btv,"fv2000s");
318  }
319  } else {
322  }
323 }
324 
325 /*
326  * sound control for Canopus WinDVR PCI
327  * Masaki Suzuki <[email protected]>
328  */
329 void windvr_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
330 {
331  unsigned long val = 0;
332 
333  if (set) {
334  if (t->audmode & V4L2_TUNER_MODE_MONO)
335  val = 0x040000;
337  val = 0;
339  val = 0x100000;
341  val = 0;
342  if (val) {
343  gpio_bits(0x140000, val);
344  if (bttv_gpio)
345  bttv_gpio_tracking(btv,"windvr");
346  }
347  } else {
350  }
351 }
352 
353 /*
354  * sound control for AD-TVK503
355  * Hiroshi Takekawa <[email protected]>
356  */
357 void adtvk503_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
358 {
359  unsigned int con = 0xffffff;
360 
361  /* btaor(0x1e0000, ~0x1e0000, BT848_GPIO_OUT_EN); */
362 
363  if (set) {
364  /* btor(***, BT848_GPIO_OUT_EN); */
366  con = 0x00000000;
368  con = 0x00180000;
370  con = 0x00000000;
371  if (t->audmode & V4L2_TUNER_MODE_MONO)
372  con = 0x00060000;
373  if (con != 0xffffff) {
374  gpio_bits(0x1e0000,con);
375  if (bttv_gpio)
376  bttv_gpio_tracking(btv, "adtvk503");
377  }
378  } else {
381  }
382 }