Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
media
pci
bt8xx
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
();
28
data &= ~(
WINVIEW_PT2254_CLK
|
WINVIEW_PT2254_DATA
|
29
WINVIEW_PT2254_STROBE
);
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);
61
if
(t->
audmode
&
V4L2_TUNER_MODE_LANG1
)
62
con = 0x000;
63
if
(t->
audmode
&
V4L2_TUNER_MODE_LANG2
)
64
con = 0x300;
65
if
(t->
audmode
&
V4L2_TUNER_MODE_STEREO
)
66
con = 0x200;
67
/* if (t->audmode & V4L2_TUNER_MODE_MONO)
68
* con = 0x100; */
69
gpio_bits
(0x300, con);
70
}
else
{
71
t->
audmode
=
V4L2_TUNER_MODE_STEREO
|
72
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
;
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:
104
t->
rxsubchans
=
V4L2_TUNER_SUB_LANG1
|
V4L2_TUNER_SUB_LANG2
;
105
break
;
106
case
0x30:
107
t->
rxsubchans
=
V4L2_TUNER_SUB_LANG2
;
108
break
;
109
case
0x50:
110
t->
rxsubchans
=
V4L2_TUNER_SUB_LANG1
;
111
break
;
112
case
0x60:
113
t->
rxsubchans
=
V4L2_TUNER_SUB_STEREO
;
114
break
;
115
case
0x70:
116
t->
rxsubchans
=
V4L2_TUNER_SUB_MONO
;
117
break
;
118
default
:
119
t->
rxsubchans
=
V4L2_TUNER_SUB_MONO
|
120
V4L2_TUNER_SUB_STEREO
|
121
V4L2_TUNER_SUB_LANG1
|
122
V4L2_TUNER_SUB_LANG2
;
123
}
124
t->
audmode
=
V4L2_TUNER_MODE_STEREO
|
125
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
;
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;
150
if
(t->
audmode
&
V4L2_TUNER_MODE_STEREO
)
151
val = 0x01;
152
if
(val) {
153
gpio_bits
(0x03,val);
154
if
(
bttv_gpio
)
155
bttv_gpio_tracking
(btv,
"avermedia"
);
156
}
157
}
else
{
158
t->
audmode
=
V4L2_TUNER_MODE_MONO
|
V4L2_TUNER_MODE_STEREO
|
159
V4L2_TUNER_MODE_LANG1
;
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
{
178
t->
audmode
=
V4L2_TUNER_MODE_MONO
|
V4L2_TUNER_MODE_STEREO
|
179
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
;
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) {
191
t->
audmode
=
V4L2_TUNER_MODE_MONO
;
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
) ||
201
(t->
audmode
&
V4L2_TUNER_MODE_MONO
))
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 :-( */
208
t->
audmode
=
V4L2_TUNER_MODE_MONO
|
V4L2_TUNER_MODE_STEREO
|
209
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
;
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);
221
if
(t->
audmode
&
V4L2_TUNER_MODE_LANG2
)
222
con = 0x080000;
223
if
(t->
audmode
&
V4L2_TUNER_MODE_STEREO
)
224
con = 0x180000;
225
gpio_bits
(0x180000, con);
226
if
(
bttv_gpio
)
227
bttv_gpio_tracking
(btv,
"terratv"
);
228
}
else
{
229
t->
audmode
=
V4L2_TUNER_MODE_MONO
|
V4L2_TUNER_MODE_STEREO
|
230
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
;
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
{
255
t->
audmode
=
V4L2_TUNER_MODE_MONO
|
V4L2_TUNER_MODE_STEREO
|
256
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
;
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
}
279
if
((t->
audmode
& (
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
))
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
{
289
t->
audmode
=
V4L2_TUNER_MODE_MONO
|
V4L2_TUNER_MODE_STEREO
|
290
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
;
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
}
310
if
((t->
audmode
& (
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
))
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
{
320
t->
audmode
=
V4L2_TUNER_MODE_MONO
|
V4L2_TUNER_MODE_STEREO
|
321
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
;
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;
336
if
(t->
audmode
&
V4L2_TUNER_MODE_LANG1
)
337
val = 0;
338
if
(t->
audmode
&
V4L2_TUNER_MODE_LANG2
)
339
val = 0x100000;
340
if
(t->
audmode
&
V4L2_TUNER_MODE_STEREO
)
341
val = 0;
342
if
(val) {
343
gpio_bits
(0x140000, val);
344
if
(
bttv_gpio
)
345
bttv_gpio_tracking
(btv,
"windvr"
);
346
}
347
}
else
{
348
t->
audmode
=
V4L2_TUNER_MODE_MONO
|
V4L2_TUNER_MODE_STEREO
|
349
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
;
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); */
365
if
(t->
audmode
&
V4L2_TUNER_MODE_LANG1
)
366
con = 0x00000000;
367
if
(t->
audmode
&
V4L2_TUNER_MODE_LANG2
)
368
con = 0x00180000;
369
if
(t->
audmode
&
V4L2_TUNER_MODE_STEREO
)
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
{
379
t->
audmode
=
V4L2_TUNER_MODE_MONO
|
V4L2_TUNER_MODE_STEREO
|
380
V4L2_TUNER_MODE_LANG1
|
V4L2_TUNER_MODE_LANG2
;
381
}
382
}
Generated on Thu Jan 10 2013 13:47:11 for Linux Kernel by
1.8.2