Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
ce326329
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
ce326329
编写于
8月 11, 2010
作者:
D
David Woodhouse
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ideapad: Stop using global variables
Signed-off-by:
N
David Woodhouse
<
David.Woodhouse@intel.com
>
上级
58ac7aa0
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
58 addition
and
34 deletion
+58
-34
drivers/platform/x86/ideapad_acpi.c
drivers/platform/x86/ideapad_acpi.c
+58
-34
未找到文件。
drivers/platform/x86/ideapad_acpi.c
浏览文件 @
ce326329
...
...
@@ -34,13 +34,19 @@
#define IDEAPAD_DEV_3G 3
#define IDEAPAD_DEV_KILLSW 4
static
struct
rfkill
*
ideapad_rfkill
[
5
];
static
const
char
*
ideapad_rfk_names
[]
=
{
"ideapad_camera"
,
"ideapad_wlan"
,
"ideapad_bluetooth"
,
"ideapad_3g"
,
"ideapad_rfkill"
struct
ideapad_private
{
struct
rfkill
*
rfk
[
5
];
};
static
const
int
ideapad_rfk_types
[]
=
{
0
,
RFKILL_TYPE_WLAN
,
RFKILL_TYPE_BLUETOOTH
,
RFKILL_TYPE_WWAN
,
RFKILL_TYPE_WLAN
static
struct
{
char
*
name
;
int
type
;
}
ideapad_rfk_data
[]
=
{
/* camera has no rfkill */
{
"ideapad_wlan"
,
RFKILL_TYPE_WLAN
},
{
"ideapad_bluetooth"
,
RFKILL_TYPE_BLUETOOTH
},
{
"ideapad_3g"
,
RFKILL_TYPE_WWAN
},
{
"ideapad_killsw"
,
RFKILL_TYPE_WLAN
}
};
static
int
ideapad_dev_exists
(
int
device
)
...
...
@@ -155,48 +161,52 @@ static struct rfkill_ops ideapad_rfk_ops = {
.
set_block
=
ideapad_rfk_set
,
};
static
void
ideapad_sync_rfk_state
(
void
)
static
void
ideapad_sync_rfk_state
(
struct
acpi_device
*
adevice
)
{
struct
ideapad_private
*
priv
=
dev_get_drvdata
(
&
adevice
->
dev
);
int
hw_blocked
=
!
ideapad_dev_get_state
(
IDEAPAD_DEV_KILLSW
);
int
i
;
rfkill_set_hw_state
(
ideapad_rfkill
[
IDEAPAD_DEV_KILLSW
],
hw_blocked
);
rfkill_set_hw_state
(
priv
->
rfk
[
IDEAPAD_DEV_KILLSW
],
hw_blocked
);
for
(
i
=
IDEAPAD_DEV_WLAN
;
i
<
IDEAPAD_DEV_KILLSW
;
i
++
)
if
(
ideapad_rfkill
[
i
])
rfkill_set_hw_state
(
ideapad_rfkill
[
i
],
hw_blocked
);
if
(
priv
->
rfk
[
i
])
rfkill_set_hw_state
(
priv
->
rfk
[
i
],
hw_blocked
);
if
(
hw_blocked
)
return
;
for
(
i
=
IDEAPAD_DEV_WLAN
;
i
<
IDEAPAD_DEV_KILLSW
;
i
++
)
if
(
ideapad_rfkill
[
i
])
rfkill_set_sw_state
(
ideapad_rfkill
[
i
],
!
ideapad_dev_get_state
(
i
));
if
(
priv
->
rfk
[
i
])
rfkill_set_sw_state
(
priv
->
rfk
[
i
],
!
ideapad_dev_get_state
(
i
));
}
static
int
ideapad_register_rfkill
(
struct
acpi_device
*
device
,
int
dev
)
static
int
ideapad_register_rfkill
(
struct
acpi_device
*
a
device
,
int
dev
)
{
struct
ideapad_private
*
priv
=
dev_get_drvdata
(
&
adevice
->
dev
);
int
ret
;
ideapad_rfkill
[
dev
]
=
rfkill_alloc
(
ideapad_rfk_names
[
dev
],
&
device
->
dev
,
ideapad_rfk_types
[
dev
]
,
&
ideapad_rfk_ops
,
(
void
*
)(
long
)
dev
);
if
(
!
ideapad_rfkill
[
dev
])
priv
->
rfk
[
dev
]
=
rfkill_alloc
(
ideapad_rfk_data
[
dev
-
1
].
name
,
&
a
device
->
dev
,
ideapad_rfk_data
[
dev
-
1
].
type
,
&
ideapad_rfk_ops
,
(
void
*
)(
long
)
dev
);
if
(
!
priv
->
rfk
[
dev
])
return
-
ENOMEM
;
ret
=
rfkill_register
(
ideapad_rfkill
[
dev
]);
ret
=
rfkill_register
(
priv
->
rfk
[
dev
]);
if
(
ret
)
{
rfkill_destroy
(
ideapad_rfkill
[
dev
]);
rfkill_destroy
(
priv
->
rfk
[
dev
]);
return
ret
;
}
return
0
;
}
static
void
ideapad_unregister_rfkill
(
int
dev
)
static
void
ideapad_unregister_rfkill
(
struct
acpi_device
*
adevice
,
int
dev
)
{
if
(
!
ideapad_rfkill
[
dev
])
struct
ideapad_private
*
priv
=
dev_get_drvdata
(
&
adevice
->
dev
);
if
(
!
priv
->
rfk
[
dev
])
return
;
rfkill_unregister
(
ideapad_rfkill
[
dev
]);
rfkill_destroy
(
ideapad_rfkill
[
dev
]);
rfkill_unregister
(
priv
->
rfk
[
dev
]);
rfkill_destroy
(
priv
->
rfk
[
dev
]);
}
static
const
struct
acpi_device_id
ideapad_device_ids
[]
=
{
...
...
@@ -205,10 +215,11 @@ static const struct acpi_device_id ideapad_device_ids[] = {
};
MODULE_DEVICE_TABLE
(
acpi
,
ideapad_device_ids
);
static
int
ideapad_acpi_add
(
struct
acpi_device
*
device
)
static
int
ideapad_acpi_add
(
struct
acpi_device
*
a
device
)
{
int
i
;
int
devs_present
[
5
];
struct
ideapad_private
*
priv
;
for
(
i
=
IDEAPAD_DEV_CAMERA
;
i
<
IDEAPAD_DEV_KILLSW
;
i
++
)
{
devs_present
[
i
]
=
ideapad_dev_exists
(
i
);
...
...
@@ -219,34 +230,47 @@ static int ideapad_acpi_add(struct acpi_device *device)
/* The hardware switch is always present */
devs_present
[
IDEAPAD_DEV_KILLSW
]
=
1
;
priv
=
kzalloc
(
sizeof
(
*
priv
),
GFP_KERNEL
);
if
(
!
priv
)
return
-
ENOMEM
;
if
(
devs_present
[
IDEAPAD_DEV_CAMERA
])
{
int
ret
=
device_create_file
(
&
device
->
dev
,
&
dev_attr_camera_power
);
if
(
ret
)
int
ret
=
device_create_file
(
&
adevice
->
dev
,
&
dev_attr_camera_power
);
if
(
ret
)
{
kfree
(
priv
);
return
ret
;
}
}
dev_set_drvdata
(
&
adevice
->
dev
,
priv
);
for
(
i
=
IDEAPAD_DEV_WLAN
;
i
<=
IDEAPAD_DEV_KILLSW
;
i
++
)
{
if
(
!
devs_present
[
i
])
continue
;
ideapad_register_rfkill
(
device
,
i
);
ideapad_register_rfkill
(
a
device
,
i
);
}
ideapad_sync_rfk_state
();
ideapad_sync_rfk_state
(
adevice
);
return
0
;
}
static
int
ideapad_acpi_remove
(
struct
acpi_device
*
device
,
int
type
)
static
int
ideapad_acpi_remove
(
struct
acpi_device
*
a
device
,
int
type
)
{
struct
ideapad_private
*
priv
=
dev_get_drvdata
(
&
adevice
->
dev
);
int
i
;
device_remove_file
(
&
device
->
dev
,
&
dev_attr_camera_power
);
for
(
i
=
0
;
i
<
5
;
i
++
)
ideapad_unregister_rfkill
(
i
);
device_remove_file
(
&
adevice
->
dev
,
&
dev_attr_camera_power
);
for
(
i
=
IDEAPAD_DEV_WLAN
;
i
<=
IDEAPAD_DEV_KILLSW
;
i
++
)
ideapad_unregister_rfkill
(
adevice
,
i
);
dev_set_drvdata
(
&
adevice
->
dev
,
NULL
);
kfree
(
priv
);
return
0
;
}
static
void
ideapad_acpi_notify
(
struct
acpi_device
*
device
,
u32
event
)
static
void
ideapad_acpi_notify
(
struct
acpi_device
*
a
device
,
u32
event
)
{
ideapad_sync_rfk_state
();
ideapad_sync_rfk_state
(
adevice
);
}
static
struct
acpi_driver
ideapad_acpi_driver
=
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录