Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
06470ed6
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 3 年多
通知
13
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
06470ed6
编写于
1月 25, 2007
作者:
M
Mauro Carvalho Chehab
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
V4L/DVB (5149): Convert radio-maxiradio to use video_ioctl2
Signed-off-by:
N
Mauro Carvalho Chehab
<
mchehab@infradead.org
>
上级
99218fe4
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
121 addition
and
121 deletion
+121
-121
drivers/media/radio/radio-maxiradio.c
drivers/media/radio/radio-maxiradio.c
+121
-121
未找到文件。
drivers/media/radio/radio-maxiradio.c
浏览文件 @
06470ed6
...
...
@@ -27,7 +27,9 @@
* BUGS:
* - card unmutes if you change frequency
*
* Converted to V4L2 API by Mauro Carvalho Chehab <mchehab@infradead.org>
* (c) 2006, 2007 by Mauro Carvalho Chehab <mchehab@infradead.org>:
* - Conversion to V4L2 API
* - Uses video_ioctl2 for parsing and to add debug support
*/
...
...
@@ -87,24 +89,14 @@ module_param(radio_nr, int, 0);
#define BITS2FREQ(x) ((x) * FREQ_STEP - FREQ_IF)
static
int
radio_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
);
static
const
struct
file_operations
maxiradio_fops
=
{
.
owner
=
THIS_MODULE
,
.
open
=
video_exclusive_open
,
.
release
=
video_exclusive_release
,
.
ioctl
=
radio_ioctl
,
.
ioctl
=
video_ioctl2
,
.
compat_ioctl
=
v4l_compat_ioctl32
,
.
llseek
=
no_llseek
,
};
static
struct
video_device
maxiradio_radio
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Maxi Radio FM2000 radio"
,
.
type
=
VID_TYPE_TUNER
,
.
fops
=
&
maxiradio_fops
,
};
static
struct
radio_device
{
...
...
@@ -181,143 +173,144 @@ static int get_tune(__u16 io)
}
static
inline
int
radio_function
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
void
*
arg
)
static
int
vidioc_querycap
(
struct
file
*
file
,
void
*
priv
,
struct
v4l2_capability
*
v
)
{
strlcpy
(
v
->
driver
,
"radio-maxiradio"
,
sizeof
(
v
->
driver
));
strlcpy
(
v
->
card
,
"Maxi Radio FM2000 radio"
,
sizeof
(
v
->
card
));
sprintf
(
v
->
bus_info
,
"ISA"
);
v
->
version
=
RADIO_VERSION
;
v
->
capabilities
=
V4L2_CAP_TUNER
;
return
0
;
}
static
int
vidioc_g_tuner
(
struct
file
*
file
,
void
*
priv
,
struct
v4l2_tuner
*
v
)
{
struct
video_device
*
dev
=
video_devdata
(
file
);
struct
radio_device
*
card
=
dev
->
priv
;
switch
(
cmd
)
{
case
VIDIOC_QUERYCAP
:
{
struct
v4l2_capability
*
v
=
arg
;
memset
(
v
,
0
,
sizeof
(
*
v
));
strlcpy
(
v
->
driver
,
"radio-maxiradio"
,
sizeof
(
v
->
driver
));
strlcpy
(
v
->
card
,
"Maxi Radio FM2000 radio"
,
sizeof
(
v
->
card
));
sprintf
(
v
->
bus_info
,
"ISA"
);
v
->
version
=
RADIO_VERSION
;
v
->
capabilities
=
V4L2_CAP_TUNER
;
if
(
v
->
index
>
0
)
return
-
EINVAL
;
return
0
;
}
case
VIDIOC_G_TUNER
:
{
struct
v4l2_tuner
*
v
=
arg
;
memset
(
v
,
0
,
sizeof
(
*
v
));
strcpy
(
v
->
name
,
"FM"
);
v
->
type
=
V4L2_TUNER_RADIO
;
if
(
v
->
index
>
0
)
return
-
EINVAL
;
v
->
rangelow
=
FREQ_LO
;
v
->
rangehigh
=
FREQ_HI
;
v
->
rxsubchans
=
V4L2_TUNER_SUB_MONO
|
V4L2_TUNER_SUB_STEREO
;
v
->
capability
=
V4L2_TUNER_CAP_LOW
;
if
(
get_stereo
(
card
->
io
))
v
->
audmode
=
V4L2_TUNER_MODE_STEREO
;
else
v
->
audmode
=
V4L2_TUNER_MODE_MONO
;
v
->
signal
=
0xffff
*
get_tune
(
card
->
io
);
memset
(
v
,
0
,
sizeof
(
*
v
));
strcpy
(
v
->
name
,
"FM"
);
v
->
type
=
V4L2_TUNER_RADIO
;
return
0
;
}
v
->
rangelow
=
FREQ_LO
;
v
->
rangehigh
=
FREQ_HI
;
v
->
rxsubchans
=
V4L2_TUNER_SUB_MONO
|
V4L2_TUNER_SUB_STEREO
;
v
->
capability
=
V4L2_TUNER_CAP_LOW
;
if
(
get_stereo
(
card
->
io
))
v
->
audmode
=
V4L2_TUNER_MODE_STEREO
;
else
v
->
audmode
=
V4L2_TUNER_MODE_MONO
;
v
->
signal
=
0xffff
*
get_tune
(
card
->
io
);
static
int
vidioc_s_tuner
(
struct
file
*
file
,
void
*
priv
,
struct
v4l2_tuner
*
v
)
{
if
(
v
->
index
>
0
)
return
-
EINVAL
;
return
0
;
}
case
VIDIOC_S_TUNER
:
{
struct
v4l2_tuner
*
v
=
arg
;
return
0
;
}
if
(
v
->
index
>
0
)
return
-
EINVAL
;
static
int
vidioc_s_frequency
(
struct
file
*
file
,
void
*
priv
,
struct
v4l2_frequency
*
f
)
{
struct
video_device
*
dev
=
video_devdata
(
file
);
struct
radio_device
*
card
=
dev
->
priv
;
return
0
;
}
case
VIDIOC_S_FREQUENCY
:
{
struct
v4l2_frequency
*
f
=
arg
;
if
(
f
->
frequency
<
FREQ_LO
||
f
->
frequency
>
FREQ_HI
)
return
-
EINVAL
;
if
(
f
->
frequency
<
FREQ_LO
||
f
->
frequency
>
FREQ_HI
)
return
-
EINVAL
;
card
->
freq
=
f
->
frequency
;
set_freq
(
card
->
io
,
FREQ2BITS
(
card
->
freq
));
msleep
(
125
);
card
->
freq
=
f
->
frequency
;
set_freq
(
card
->
io
,
FREQ2BITS
(
card
->
freq
));
msleep
(
125
);
return
0
;
}
case
VIDIOC_G_FREQUENCY
:
{
struct
v4l2_frequency
*
f
=
arg
;
return
0
;
}
f
->
type
=
V4L2_TUNER_RADIO
;
f
->
frequency
=
card
->
freq
;
static
int
vidioc_g_frequency
(
struct
file
*
file
,
void
*
priv
,
struct
v4l2_frequency
*
f
)
{
struct
video_device
*
dev
=
video_devdata
(
file
);
struct
radio_device
*
card
=
dev
->
priv
;
return
0
;
}
case
VIDIOC_QUERYCTRL
:
{
struct
v4l2_queryctrl
*
qc
=
arg
;
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
radio_qctrl
);
i
++
)
{
if
(
qc
->
id
&&
qc
->
id
==
radio_qctrl
[
i
].
id
)
{
memcpy
(
qc
,
&
(
radio_qctrl
[
i
]),
sizeof
(
*
qc
));
return
(
0
);
}
}
return
-
EINVAL
;
}
case
VIDIOC_G_CTRL
:
{
struct
v4l2_control
*
ctrl
=
arg
;
switch
(
ctrl
->
id
)
{
case
V4L2_CID_AUDIO_MUTE
:
ctrl
->
value
=
card
->
muted
;
return
(
0
);
}
return
-
EINVAL
;
}
case
VIDIOC_S_CTRL
:
{
struct
v4l2_control
*
ctrl
=
arg
;
switch
(
ctrl
->
id
)
{
case
V4L2_CID_AUDIO_MUTE
:
card
->
muted
=
ctrl
->
value
;
if
(
card
->
muted
)
turn_power
(
card
->
io
,
0
);
else
set_freq
(
card
->
io
,
FREQ2BITS
(
card
->
freq
));
return
0
;
}
return
-
EINVAL
;
f
->
type
=
V4L2_TUNER_RADIO
;
f
->
frequency
=
card
->
freq
;
return
0
;
}
static
int
vidioc_queryctrl
(
struct
file
*
file
,
void
*
priv
,
struct
v4l2_queryctrl
*
qc
)
{
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
radio_qctrl
);
i
++
)
{
if
(
qc
->
id
&&
qc
->
id
==
radio_qctrl
[
i
].
id
)
{
memcpy
(
qc
,
&
(
radio_qctrl
[
i
]),
sizeof
(
*
qc
));
return
(
0
);
}
}
return
-
EINVAL
;
}
default:
return
v4l_compat_translate_ioctl
(
inode
,
file
,
cmd
,
arg
,
radio_function
);
static
int
vidioc_g_ctrl
(
struct
file
*
file
,
void
*
priv
,
struct
v4l2_control
*
ctrl
)
{
struct
video_device
*
dev
=
video_devdata
(
file
);
struct
radio_device
*
card
=
dev
->
priv
;
switch
(
ctrl
->
id
)
{
case
V4L2_CID_AUDIO_MUTE
:
ctrl
->
value
=
card
->
muted
;
return
(
0
);
}
return
-
EINVAL
;
}
static
int
radio_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
static
int
vidioc_s_ctrl
(
struct
file
*
file
,
void
*
priv
,
struct
v4l2_control
*
ctrl
)
{
struct
video_device
*
dev
=
video_devdata
(
file
);
struct
radio_device
*
card
=
dev
->
priv
;
int
ret
;
mutex_lock
(
&
card
->
lock
);
ret
=
video_usercopy
(
inode
,
file
,
cmd
,
arg
,
radio_function
);
mutex_unlock
(
&
card
->
lock
);
return
ret
;
switch
(
ctrl
->
id
)
{
case
V4L2_CID_AUDIO_MUTE
:
card
->
muted
=
ctrl
->
value
;
if
(
card
->
muted
)
turn_power
(
card
->
io
,
0
);
else
set_freq
(
card
->
io
,
FREQ2BITS
(
card
->
freq
));
return
0
;
}
return
-
EINVAL
;
}
MODULE_AUTHOR
(
"Dimitromanolakis Apostolos, apdim@grecian.net"
);
MODULE_DESCRIPTION
(
"Radio driver for the Guillemot Maxi Radio FM2000 radio."
);
MODULE_LICENSE
(
"GPL"
);
static
struct
video_device
maxiradio_radio
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"Maxi Radio FM2000 radio"
,
.
type
=
VID_TYPE_TUNER
,
.
fops
=
&
maxiradio_fops
,
.
vidioc_querycap
=
vidioc_querycap
,
.
vidioc_g_tuner
=
vidioc_g_tuner
,
.
vidioc_s_tuner
=
vidioc_s_tuner
,
.
vidioc_g_frequency
=
vidioc_g_frequency
,
.
vidioc_s_frequency
=
vidioc_s_frequency
,
.
vidioc_queryctrl
=
vidioc_queryctrl
,
.
vidioc_g_ctrl
=
vidioc_g_ctrl
,
.
vidioc_s_ctrl
=
vidioc_s_ctrl
,
};
static
int
__devinit
maxiradio_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
)
{
...
...
@@ -389,3 +382,10 @@ static void __exit maxiradio_radio_exit(void)
module_init
(
maxiradio_radio_init
);
module_exit
(
maxiradio_radio_exit
);
MODULE_AUTHOR
(
"Dimitromanolakis Apostolos, apdim@grecian.net"
);
MODULE_DESCRIPTION
(
"Radio driver for the Guillemot Maxi Radio FM2000 radio."
);
MODULE_LICENSE
(
"GPL"
);
module_param_named
(
debug
,
maxiradio_radio
.
debug
,
int
,
0644
);
MODULE_PARM_DESC
(
debug
,
"activates debug info"
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录