Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
c2806d03
Commit
c2806d03
authored
Oct 26, 2007
by
Mauro Carvalho Chehab
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
V4L/DVB (6412): Audio hooks moved to another file
Signed-off-by:
Mauro Carvalho Chehab
<
mchehab@infradead.org
>
parent
c96dd071
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
420 additions
and
399 deletions
+420
-399
drivers/media/video/bt8xx/Makefile
drivers/media/video/bt8xx/Makefile
+1
-1
drivers/media/video/bt8xx/bttv-audio-hook.c
drivers/media/video/bt8xx/bttv-audio-hook.c
+390
-0
drivers/media/video/bt8xx/bttv-audio-hook.h
drivers/media/video/bt8xx/bttv-audio-hook.h
+23
-0
drivers/media/video/bt8xx/bttv-cards.c
drivers/media/video/bt8xx/bttv-cards.c
+2
-397
drivers/media/video/bt8xx/bttv.h
drivers/media/video/bt8xx/bttv.h
+2
-0
drivers/media/video/bt8xx/bttvp.h
drivers/media/video/bt8xx/bttvp.h
+2
-1
No files found.
drivers/media/video/bt8xx/Makefile
View file @
c2806d03
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
bttv-objs
:=
bttv-driver.o bttv-cards.o bttv-if.o
\
bttv-objs
:=
bttv-driver.o bttv-cards.o bttv-if.o
\
bttv-risc.o bttv-vbi.o bttv-i2c.o bttv-gpio.o
\
bttv-risc.o bttv-vbi.o bttv-i2c.o bttv-gpio.o
\
bttv-input.o
bttv-input.o
bttv-audio-hook.o
obj-$(CONFIG_VIDEO_BT848)
+=
bttv.o
obj-$(CONFIG_VIDEO_BT848)
+=
bttv.o
...
...
drivers/media/video/bt8xx/bttv-audio-hook.c
0 → 100644
View file @
c2806d03
/*
* Handlers for board audio hooks, splitted from bttv-cards
*
* Copyright (c) 2006 Mauro Carvalho Chehab (mchehab@infradead.org)
* This code is placed under the terms of the GNU General Public License
*/
/* ----------------------------------------------------------------------- */
/* winview */
#include "bttvp.h"
#include <linux/videodev.h>
static
void
winview_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
/* PT2254A programming Jon Tombs, jon@gte.esi.us.es */
int
bits_out
,
loops
,
vol
,
data
;
if
(
!
set
)
{
/* Fixed by Leandro Lucarella <luca@linuxmendoza.org.ar (07/31/01) */
v
->
flags
|=
VIDEO_AUDIO_VOLUME
;
return
;
}
/* 32 levels logarithmic */
vol
=
32
-
((
v
->
volume
>>
11
));
/* units */
bits_out
=
(
PT2254_DBS_IN_2
>>
(
vol
%
5
));
/* tens */
bits_out
|=
(
PT2254_DBS_IN_10
>>
(
vol
/
5
));
bits_out
|=
PT2254_L_CHANNEL
|
PT2254_R_CHANNEL
;
data
=
gpio_read
();
data
&=
~
(
WINVIEW_PT2254_CLK
|
WINVIEW_PT2254_DATA
|
WINVIEW_PT2254_STROBE
);
for
(
loops
=
17
;
loops
>=
0
;
loops
--
)
{
if
(
bits_out
&
(
1
<<
loops
))
data
|=
WINVIEW_PT2254_DATA
;
else
data
&=
~
WINVIEW_PT2254_DATA
;
gpio_write
(
data
);
udelay
(
5
);
data
|=
WINVIEW_PT2254_CLK
;
gpio_write
(
data
);
udelay
(
5
);
data
&=
~
WINVIEW_PT2254_CLK
;
gpio_write
(
data
);
}
data
|=
WINVIEW_PT2254_STROBE
;
data
&=
~
WINVIEW_PT2254_DATA
;
gpio_write
(
data
);
udelay
(
10
);
data
&=
~
WINVIEW_PT2254_STROBE
;
gpio_write
(
data
);
}
/* ----------------------------------------------------------------------- */
/* mono/stereo control for various cards (which don't use i2c chips but */
/* connect something to the GPIO pins */
static
void
gvbctv3pci_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
con
=
0
;
if
(
set
)
{
gpio_inout
(
0x300
,
0x300
);
if
(
v
->
mode
&
VIDEO_SOUND_LANG1
)
con
=
0x000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
con
=
0x300
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
con
=
0x200
;
/* if (v->mode & VIDEO_SOUND_MONO)
* con = 0x100; */
gpio_bits
(
0x300
,
con
);
}
else
{
v
->
mode
=
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
static
void
gvbctv5pci_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
val
,
con
;
if
(
btv
->
radio_user
)
return
;
val
=
gpio_read
();
if
(
set
)
{
con
=
0x000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
{
if
(
v
->
mode
&
VIDEO_SOUND_LANG1
)
{
/* LANG1 + LANG2 */
con
=
0x100
;
}
else
{
/* LANG2 */
con
=
0x300
;
}
}
if
(
con
!=
(
val
&
0x300
))
{
gpio_bits
(
0x300
,
con
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"gvbctv5pci"
);
}
}
else
{
switch
(
val
&
0x70
)
{
case
0x10
:
v
->
mode
=
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
break
;
case
0x30
:
v
->
mode
=
VIDEO_SOUND_LANG2
;
break
;
case
0x50
:
v
->
mode
=
VIDEO_SOUND_LANG1
;
break
;
case
0x60
:
v
->
mode
=
VIDEO_SOUND_STEREO
;
break
;
case
0x70
:
v
->
mode
=
VIDEO_SOUND_MONO
;
break
;
default:
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
}
/*
* Mario Medina Nussbaum <medisoft@alohabbs.org.mx>
* I discover that on BT848_GPIO_DATA address a byte 0xcce enable stereo,
* 0xdde enables mono and 0xccd enables sap
*
* Petr Vandrovec <VANDROVE@vc.cvut.cz>
* P.S.: At least mask in line above is wrong - GPIO pins 3,2 select
* input/output sound connection, so both must be set for output mode.
*
* Looks like it's needed only for the "tvphone", the "tvphone 98"
* handles this with a tda9840
*
*/
static
void
avermedia_tvphone_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
int
val
=
0
;
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
/* SAP */
val
=
0x02
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
val
=
0x01
;
if
(
val
)
{
gpio_bits
(
0x03
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"avermedia"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
;
return
;
}
}
static
void
avermedia_tv_stereo_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
int
val
=
0
;
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
/* SAP */
val
=
0x01
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
/* STEREO */
val
=
0x02
;
btaor
(
val
,
~
0x03
,
BT848_GPIO_DATA
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"avermedia"
);
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
return
;
}
}
/* Lifetec 9415 handling */
static
void
lt9415_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
int
val
=
0
;
if
(
gpio_read
()
&
0x4000
)
{
v
->
mode
=
VIDEO_SOUND_MONO
;
return
;
}
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
/* A2 SAP */
val
=
0x0080
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
/* A2 stereo */
val
=
0x0880
;
if
((
v
->
mode
&
VIDEO_SOUND_LANG1
)
||
(
v
->
mode
&
VIDEO_SOUND_MONO
))
val
=
0
;
gpio_bits
(
0x0880
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"lt9415"
);
}
else
{
/* autodetect doesn't work with this card :-( */
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
return
;
}
}
/* TDA9821 on TerraTV+ Bt848, Bt878 */
static
void
terratv_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
con
=
0
;
if
(
set
)
{
gpio_inout
(
0x180000
,
0x180000
);
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
con
=
0x080000
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
con
=
0x180000
;
gpio_bits
(
0x180000
,
con
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"terratv"
);
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
static
void
winfast2000_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
long
val
=
0
;
if
(
set
)
{
/*btor (0xc32000, BT848_GPIO_OUT_EN);*/
if
(
v
->
mode
&
VIDEO_SOUND_MONO
)
/* Mono */
val
=
0x420000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG1
)
/* Mono */
val
=
0x420000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
/* SAP */
val
=
0x410000
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
/* Stereo */
val
=
0x020000
;
if
(
val
)
{
gpio_bits
(
0x430000
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"winfast2000"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
/*
* Dariusz Kowalewski <darekk@automex.pl>
* sound control for Prolink PV-BT878P+9B (PixelView PlayTV Pro FM+NICAM
* revision 9B has on-board TDA9874A sound decoder).
*
* Note: There are card variants without tda9874a. Forcing the "stereo sound route"
* will mute this cards.
*/
static
void
pvbt878p9b_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
val
=
0
;
if
(
btv
->
radio_user
)
return
;
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_MONO
)
{
val
=
0x01
;
}
if
((
v
->
mode
&
(
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
))
||
(
v
->
mode
&
VIDEO_SOUND_STEREO
))
{
val
=
0x02
;
}
if
(
val
)
{
gpio_bits
(
0x03
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"pvbt878p9b"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
/*
* Dariusz Kowalewski <darekk@automex.pl>
* sound control for FlyVideo 2000S (with tda9874 decoder)
* based on pvbt878p9b_audio() - this is not tested, please fix!!!
*/
static
void
fv2000s_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
val
=
0xffff
;
if
(
btv
->
radio_user
)
return
;
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_MONO
)
{
val
=
0x0000
;
}
if
((
v
->
mode
&
(
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
))
||
(
v
->
mode
&
VIDEO_SOUND_STEREO
))
{
val
=
0x1080
;
/*-dk-???: 0x0880, 0x0080, 0x1800 ... */
}
if
(
val
!=
0xffff
)
{
gpio_bits
(
0x1800
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"fv2000s"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
/*
* sound control for Canopus WinDVR PCI
* Masaki Suzuki <masaki@btree.org>
*/
static
void
windvr_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
long
val
=
0
;
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_MONO
)
val
=
0x040000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG1
)
val
=
0
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
val
=
0x100000
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
val
=
0
;
if
(
val
)
{
gpio_bits
(
0x140000
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"windvr"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
/*
* sound control for AD-TVK503
* Hiroshi Takekawa <sian@big.or.jp>
*/
static
void
adtvk503_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
con
=
0xffffff
;
/* btaor(0x1e0000, ~0x1e0000, BT848_GPIO_OUT_EN); */
if
(
set
)
{
/* btor(***, BT848_GPIO_OUT_EN); */
if
(
v
->
mode
&
VIDEO_SOUND_LANG1
)
con
=
0x00000000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
con
=
0x00180000
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
con
=
0x00000000
;
if
(
v
->
mode
&
VIDEO_SOUND_MONO
)
con
=
0x00060000
;
if
(
con
!=
0xffffff
)
{
gpio_bits
(
0x1e0000
,
con
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"adtvk503"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
drivers/media/video/bt8xx/bttv-audio-hook.h
0 → 100644
View file @
c2806d03
/*
* Handlers for board audio hooks, splitted from bttv-cards
*
* Copyright (c) 2006 Mauro Carvalho Chehab (mchehab@infradead.org)
* This code is placed under the terms of the GNU General Public License
*/
#include "bttvp.h"
static
void
winview_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
lt9415_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
avermedia_tvphone_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
avermedia_tv_stereo_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
terratv_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
gvbctv3pci_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
gvbctv5pci_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
winfast2000_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
pvbt878p9b_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
fv2000s_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
windvr_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
adtvk503_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
drivers/media/video/bt8xx/bttv-cards.c
View file @
c2806d03
...
@@ -39,6 +39,7 @@
...
@@ -39,6 +39,7 @@
#include "bttvp.h"
#include "bttvp.h"
#include <media/v4l2-common.h>
#include <media/v4l2-common.h>
#include <media/tvaudio.h>
#include <media/tvaudio.h>
#include "bttv-audio-hook.h"
/* fwd decl */
/* fwd decl */
static
void
boot_msp34xx
(
struct
bttv
*
btv
,
int
pin
);
static
void
boot_msp34xx
(
struct
bttv
*
btv
,
int
pin
);
...
@@ -50,20 +51,6 @@ static void modtec_eeprom(struct bttv *btv);
...
@@ -50,20 +51,6 @@ static void modtec_eeprom(struct bttv *btv);
static
void
init_PXC200
(
struct
bttv
*
btv
);
static
void
init_PXC200
(
struct
bttv
*
btv
);
static
void
init_RTV24
(
struct
bttv
*
btv
);
static
void
init_RTV24
(
struct
bttv
*
btv
);
static
void
winview_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
lt9415_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
avermedia_tvphone_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
avermedia_tv_stereo_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
terratv_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
gvbctv3pci_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
gvbctv5pci_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
winfast2000_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
pvbt878p9b_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
fv2000s_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
windvr_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
adtvk503_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
static
void
rv605_muxsel
(
struct
bttv
*
btv
,
unsigned
int
input
);
static
void
rv605_muxsel
(
struct
bttv
*
btv
,
unsigned
int
input
);
static
void
eagle_muxsel
(
struct
bttv
*
btv
,
unsigned
int
input
);
static
void
eagle_muxsel
(
struct
bttv
*
btv
,
unsigned
int
input
);
static
void
xguard_muxsel
(
struct
bttv
*
btv
,
unsigned
int
input
);
static
void
xguard_muxsel
(
struct
bttv
*
btv
,
unsigned
int
input
);
...
@@ -3954,7 +3941,7 @@ static void __devinit avermedia_eeprom(struct bttv *btv)
...
@@ -3954,7 +3941,7 @@ static void __devinit avermedia_eeprom(struct bttv *btv)
void
bttv_tda9880_setnorm
(
struct
bttv
*
btv
,
int
norm
)
void
bttv_tda9880_setnorm
(
struct
bttv
*
btv
,
int
norm
)
{
{
/* fix up our card entry */
/* fix up our card entry */
if
(
norm
==
V
IDEO_MODE
_NTSC
)
{
if
(
norm
==
V
4L2_STD
_NTSC
)
{
bttv_tvcards
[
BTTV_BOARD_VOODOOTV_FM
].
gpiomux
[
TVAUDIO_INPUT_TUNER
]
=
0x957fff
;
bttv_tvcards
[
BTTV_BOARD_VOODOOTV_FM
].
gpiomux
[
TVAUDIO_INPUT_TUNER
]
=
0x957fff
;
bttv_tvcards
[
BTTV_BOARD_VOODOOTV_FM
].
gpiomute
=
0x957fff
;
bttv_tvcards
[
BTTV_BOARD_VOODOOTV_FM
].
gpiomute
=
0x957fff
;
bttv_tvcards
[
BTTV_BOARD_VOODOOTV_200
].
gpiomux
[
TVAUDIO_INPUT_TUNER
]
=
0x957fff
;
bttv_tvcards
[
BTTV_BOARD_VOODOOTV_200
].
gpiomux
[
TVAUDIO_INPUT_TUNER
]
=
0x957fff
;
...
@@ -4323,388 +4310,6 @@ void tea5757_set_freq(struct bttv *btv, unsigned short freq)
...
@@ -4323,388 +4310,6 @@ void tea5757_set_freq(struct bttv *btv, unsigned short freq)
tea5757_write
(
btv
,
5
*
freq
+
0x358
);
/* add 10.7MHz (see docs) */
tea5757_write
(
btv
,
5
*
freq
+
0x358
);
/* add 10.7MHz (see docs) */
}
}
/* ----------------------------------------------------------------------- */
/* winview */
static
void
winview_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
/* PT2254A programming Jon Tombs, jon@gte.esi.us.es */
int
bits_out
,
loops
,
vol
,
data
;
if
(
!
set
)
{
/* Fixed by Leandro Lucarella <luca@linuxmendoza.org.ar (07/31/01) */
v
->
flags
|=
VIDEO_AUDIO_VOLUME
;
return
;
}
/* 32 levels logarithmic */
vol
=
32
-
((
v
->
volume
>>
11
));
/* units */
bits_out
=
(
PT2254_DBS_IN_2
>>
(
vol
%
5
));
/* tens */
bits_out
|=
(
PT2254_DBS_IN_10
>>
(
vol
/
5
));
bits_out
|=
PT2254_L_CHANNEL
|
PT2254_R_CHANNEL
;
data
=
gpio_read
();
data
&=
~
(
WINVIEW_PT2254_CLK
|
WINVIEW_PT2254_DATA
|
WINVIEW_PT2254_STROBE
);
for
(
loops
=
17
;
loops
>=
0
;
loops
--
)
{
if
(
bits_out
&
(
1
<<
loops
))
data
|=
WINVIEW_PT2254_DATA
;
else
data
&=
~
WINVIEW_PT2254_DATA
;
gpio_write
(
data
);
udelay
(
5
);
data
|=
WINVIEW_PT2254_CLK
;
gpio_write
(
data
);
udelay
(
5
);
data
&=
~
WINVIEW_PT2254_CLK
;
gpio_write
(
data
);
}
data
|=
WINVIEW_PT2254_STROBE
;
data
&=
~
WINVIEW_PT2254_DATA
;
gpio_write
(
data
);
udelay
(
10
);
data
&=
~
WINVIEW_PT2254_STROBE
;
gpio_write
(
data
);
}
/* ----------------------------------------------------------------------- */
/* mono/stereo control for various cards (which don't use i2c chips but */
/* connect something to the GPIO pins */
static
void
gvbctv3pci_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
con
=
0
;
if
(
set
)
{
gpio_inout
(
0x300
,
0x300
);
if
(
v
->
mode
&
VIDEO_SOUND_LANG1
)
con
=
0x000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
con
=
0x300
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
con
=
0x200
;
/* if (v->mode & VIDEO_SOUND_MONO)
* con = 0x100; */
gpio_bits
(
0x300
,
con
);
}
else
{
v
->
mode
=
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
static
void
gvbctv5pci_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
val
,
con
;
if
(
btv
->
radio_user
)
return
;
val
=
gpio_read
();
if
(
set
)
{
con
=
0x000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
{
if
(
v
->
mode
&
VIDEO_SOUND_LANG1
)
{
/* LANG1 + LANG2 */
con
=
0x100
;
}
else
{
/* LANG2 */
con
=
0x300
;
}
}
if
(
con
!=
(
val
&
0x300
))
{
gpio_bits
(
0x300
,
con
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"gvbctv5pci"
);
}
}
else
{
switch
(
val
&
0x70
)
{
case
0x10
:
v
->
mode
=
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
break
;
case
0x30
:
v
->
mode
=
VIDEO_SOUND_LANG2
;
break
;
case
0x50
:
v
->
mode
=
VIDEO_SOUND_LANG1
;
break
;
case
0x60
:
v
->
mode
=
VIDEO_SOUND_STEREO
;
break
;
case
0x70
:
v
->
mode
=
VIDEO_SOUND_MONO
;
break
;
default:
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
}
/*
* Mario Medina Nussbaum <medisoft@alohabbs.org.mx>
* I discover that on BT848_GPIO_DATA address a byte 0xcce enable stereo,
* 0xdde enables mono and 0xccd enables sap
*
* Petr Vandrovec <VANDROVE@vc.cvut.cz>
* P.S.: At least mask in line above is wrong - GPIO pins 3,2 select
* input/output sound connection, so both must be set for output mode.
*
* Looks like it's needed only for the "tvphone", the "tvphone 98"
* handles this with a tda9840
*
*/
static
void
avermedia_tvphone_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
int
val
=
0
;
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
/* SAP */
val
=
0x02
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
val
=
0x01
;
if
(
val
)
{
gpio_bits
(
0x03
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"avermedia"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
;
return
;
}
}
static
void
avermedia_tv_stereo_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
int
val
=
0
;
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
/* SAP */
val
=
0x01
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
/* STEREO */
val
=
0x02
;
btaor
(
val
,
~
0x03
,
BT848_GPIO_DATA
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"avermedia"
);
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
return
;
}
}
/* Lifetec 9415 handling */
static
void
lt9415_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
int
val
=
0
;
if
(
gpio_read
()
&
0x4000
)
{
v
->
mode
=
VIDEO_SOUND_MONO
;
return
;
}
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
/* A2 SAP */
val
=
0x0080
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
/* A2 stereo */
val
=
0x0880
;
if
((
v
->
mode
&
VIDEO_SOUND_LANG1
)
||
(
v
->
mode
&
VIDEO_SOUND_MONO
))
val
=
0
;
gpio_bits
(
0x0880
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"lt9415"
);
}
else
{
/* autodetect doesn't work with this card :-( */
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
return
;
}
}
/* TDA9821 on TerraTV+ Bt848, Bt878 */
static
void
terratv_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
con
=
0
;
if
(
set
)
{
gpio_inout
(
0x180000
,
0x180000
);
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
con
=
0x080000
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
con
=
0x180000
;
gpio_bits
(
0x180000
,
con
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"terratv"
);
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
static
void
winfast2000_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
long
val
=
0
;
if
(
set
)
{
/*btor (0xc32000, BT848_GPIO_OUT_EN);*/
if
(
v
->
mode
&
VIDEO_SOUND_MONO
)
/* Mono */
val
=
0x420000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG1
)
/* Mono */
val
=
0x420000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
/* SAP */
val
=
0x410000
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
/* Stereo */
val
=
0x020000
;
if
(
val
)
{
gpio_bits
(
0x430000
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"winfast2000"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
/*
* Dariusz Kowalewski <darekk@automex.pl>
* sound control for Prolink PV-BT878P+9B (PixelView PlayTV Pro FM+NICAM
* revision 9B has on-board TDA9874A sound decoder).
*
* Note: There are card variants without tda9874a. Forcing the "stereo sound route"
* will mute this cards.
*/
static
void
pvbt878p9b_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
val
=
0
;
if
(
btv
->
radio_user
)
return
;
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_MONO
)
{
val
=
0x01
;
}
if
((
v
->
mode
&
(
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
))
||
(
v
->
mode
&
VIDEO_SOUND_STEREO
))
{
val
=
0x02
;
}
if
(
val
)
{
gpio_bits
(
0x03
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"pvbt878p9b"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
/*
* Dariusz Kowalewski <darekk@automex.pl>
* sound control for FlyVideo 2000S (with tda9874 decoder)
* based on pvbt878p9b_audio() - this is not tested, please fix!!!
*/
static
void
fv2000s_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
val
=
0xffff
;
if
(
btv
->
radio_user
)
return
;
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_MONO
)
{
val
=
0x0000
;
}
if
((
v
->
mode
&
(
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
))
||
(
v
->
mode
&
VIDEO_SOUND_STEREO
))
{
val
=
0x1080
;
/*-dk-???: 0x0880, 0x0080, 0x1800 ... */
}
if
(
val
!=
0xffff
)
{
gpio_bits
(
0x1800
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"fv2000s"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
/*
* sound control for Canopus WinDVR PCI
* Masaki Suzuki <masaki@btree.org>
*/
static
void
windvr_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
long
val
=
0
;
if
(
set
)
{
if
(
v
->
mode
&
VIDEO_SOUND_MONO
)
val
=
0x040000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG1
)
val
=
0
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
val
=
0x100000
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
val
=
0
;
if
(
val
)
{
gpio_bits
(
0x140000
,
val
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"windvr"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
/*
* sound control for AD-TVK503
* Hiroshi Takekawa <sian@big.or.jp>
*/
static
void
adtvk503_audio
(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
)
{
unsigned
int
con
=
0xffffff
;
/* btaor(0x1e0000, ~0x1e0000, BT848_GPIO_OUT_EN); */
if
(
set
)
{
/* btor(***, BT848_GPIO_OUT_EN); */
if
(
v
->
mode
&
VIDEO_SOUND_LANG1
)
con
=
0x00000000
;
if
(
v
->
mode
&
VIDEO_SOUND_LANG2
)
con
=
0x00180000
;
if
(
v
->
mode
&
VIDEO_SOUND_STEREO
)
con
=
0x00000000
;
if
(
v
->
mode
&
VIDEO_SOUND_MONO
)
con
=
0x00060000
;
if
(
con
!=
0xffffff
)
{
gpio_bits
(
0x1e0000
,
con
);
if
(
bttv_gpio
)
bttv_gpio_tracking
(
btv
,
"adtvk503"
);
}
}
else
{
v
->
mode
=
VIDEO_SOUND_MONO
|
VIDEO_SOUND_STEREO
|
VIDEO_SOUND_LANG1
|
VIDEO_SOUND_LANG2
;
}
}
/* RemoteVision MX (rv605) muxsel helper [Miguel Freitas]
/* RemoteVision MX (rv605) muxsel helper [Miguel Freitas]
*
*
* This is needed because rv605 don't use a normal multiplex, but a crosspoint
* This is needed because rv605 don't use a normal multiplex, but a crosspoint
...
...
drivers/media/video/bt8xx/bttv.h
View file @
c2806d03
...
@@ -241,7 +241,9 @@ struct tvcard
...
@@ -241,7 +241,9 @@ struct tvcard
unsigned
int
radio_addr
;
unsigned
int
radio_addr
;
unsigned
int
has_radio
;
unsigned
int
has_radio
;
#ifdef CONFIG_VIDEO_V4L1
void
(
*
audio_hook
)(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
void
(
*
audio_hook
)(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
#endif
void
(
*
muxsel_hook
)(
struct
bttv
*
btv
,
unsigned
int
input
);
void
(
*
muxsel_hook
)(
struct
bttv
*
btv
,
unsigned
int
input
);
};
};
...
...
drivers/media/video/bt8xx/bttvp.h
View file @
c2806d03
...
@@ -336,8 +336,9 @@ struct bttv {
...
@@ -336,8 +336,9 @@ struct bttv {
/* old gpio interface */
/* old gpio interface */
wait_queue_head_t
gpioq
;
wait_queue_head_t
gpioq
;
int
shutdown
;
int
shutdown
;
#ifdef CONFIG_VIDEO_V4L1
void
(
*
audio_hook
)(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
void
(
*
audio_hook
)(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
#endif
/* new gpio interface */
/* new gpio interface */
spinlock_t
gpio_lock
;
spinlock_t
gpio_lock
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment