Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
c2806d03
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
c2806d03
编写于
10月 26, 2007
作者:
M
Mauro Carvalho Chehab
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
V4L/DVB (6412): Audio hooks moved to another file
Signed-off-by:
N
Mauro Carvalho Chehab
<
mchehab@infradead.org
>
上级
c96dd071
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
420 addition
and
399 deletion
+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
未找到文件。
drivers/media/video/bt8xx/Makefile
浏览文件 @
c2806d03
...
...
@@ -4,7 +4,7 @@
bttv-objs
:=
bttv-driver.o bttv-cards.o bttv-if.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
...
...
drivers/media/video/bt8xx/bttv-audio-hook.c
0 → 100644
浏览文件 @
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
浏览文件 @
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
浏览文件 @
c2806d03
...
...
@@ -39,6 +39,7 @@
#include "bttvp.h"
#include <media/v4l2-common.h>
#include <media/tvaudio.h>
#include "bttv-audio-hook.h"
/* fwd decl */
static
void
boot_msp34xx
(
struct
bttv
*
btv
,
int
pin
);
...
...
@@ -50,20 +51,6 @@ static void modtec_eeprom(struct bttv *btv);
static
void
init_PXC200
(
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
eagle_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)
void
bttv_tda9880_setnorm
(
struct
bttv
*
btv
,
int
norm
)
{
/* 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
].
gpiomute
=
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)
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]
*
* This is needed because rv605 don't use a normal multiplex, but a crosspoint
...
...
drivers/media/video/bt8xx/bttv.h
浏览文件 @
c2806d03
...
...
@@ -241,7 +241,9 @@ struct tvcard
unsigned
int
radio_addr
;
unsigned
int
has_radio
;
#ifdef CONFIG_VIDEO_V4L1
void
(
*
audio_hook
)(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
#endif
void
(
*
muxsel_hook
)(
struct
bttv
*
btv
,
unsigned
int
input
);
};
...
...
drivers/media/video/bt8xx/bttvp.h
浏览文件 @
c2806d03
...
...
@@ -336,8 +336,9 @@ struct bttv {
/* old gpio interface */
wait_queue_head_t
gpioq
;
int
shutdown
;
#ifdef CONFIG_VIDEO_V4L1
void
(
*
audio_hook
)(
struct
bttv
*
btv
,
struct
video_audio
*
v
,
int
set
);
#endif
/* new gpio interface */
spinlock_t
gpio_lock
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录