Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
bc9a5c37
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
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看板
提交
bc9a5c37
编写于
4月 06, 2017
作者:
C
Chanwoo Choi
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'ib-extcon-4.12' into HEAD
上级
366380cd
815429b3
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
146 addition
and
5 deletion
+146
-5
drivers/extcon/devres.c
drivers/extcon/devres.c
+61
-0
drivers/extcon/extcon.c
drivers/extcon/extcon.c
+66
-0
drivers/extcon/extcon.h
drivers/extcon/extcon.h
+3
-0
include/linux/extcon.h
include/linux/extcon.h
+16
-5
未找到文件。
drivers/extcon/devres.c
浏览文件 @
bc9a5c37
...
...
@@ -50,6 +50,13 @@ static void devm_extcon_dev_notifier_unreg(struct device *dev, void *res)
extcon_unregister_notifier
(
this
->
edev
,
this
->
id
,
this
->
nb
);
}
static
void
devm_extcon_dev_notifier_all_unreg
(
struct
device
*
dev
,
void
*
res
)
{
struct
extcon_dev_notifier_devres
*
this
=
res
;
extcon_unregister_notifier_all
(
this
->
edev
,
this
->
nb
);
}
/**
* devm_extcon_dev_allocate - Allocate managed extcon device
* @dev: device owning the extcon device being created
...
...
@@ -214,3 +221,57 @@ void devm_extcon_unregister_notifier(struct device *dev,
devm_extcon_dev_match
,
edev
));
}
EXPORT_SYMBOL
(
devm_extcon_unregister_notifier
);
/**
* devm_extcon_register_notifier_all()
* - Resource-managed extcon_register_notifier_all()
* @dev: device to allocate extcon device
* @edev: the extcon device that has the external connecotr.
* @nb: a notifier block to be registered.
*
* This function manages automatically the notifier of extcon device using
* device resource management and simplify the control of unregistering
* the notifier of extcon device. To get more information, refer that function.
*
* Returns 0 if success or negaive error number if failure.
*/
int
devm_extcon_register_notifier_all
(
struct
device
*
dev
,
struct
extcon_dev
*
edev
,
struct
notifier_block
*
nb
)
{
struct
extcon_dev_notifier_devres
*
ptr
;
int
ret
;
ptr
=
devres_alloc
(
devm_extcon_dev_notifier_all_unreg
,
sizeof
(
*
ptr
),
GFP_KERNEL
);
if
(
!
ptr
)
return
-
ENOMEM
;
ret
=
extcon_register_notifier_all
(
edev
,
nb
);
if
(
ret
)
{
devres_free
(
ptr
);
return
ret
;
}
ptr
->
edev
=
edev
;
ptr
->
nb
=
nb
;
devres_add
(
dev
,
ptr
);
return
0
;
}
EXPORT_SYMBOL
(
devm_extcon_register_notifier_all
);
/**
* devm_extcon_unregister_notifier_all()
* - Resource-managed extcon_unregister_notifier_all()
* @dev: device to allocate extcon device
* @edev: the extcon device that has the external connecotr.
* @nb: a notifier block to be registered.
*/
void
devm_extcon_unregister_notifier_all
(
struct
device
*
dev
,
struct
extcon_dev
*
edev
,
struct
notifier_block
*
nb
)
{
WARN_ON
(
devres_release
(
dev
,
devm_extcon_dev_notifier_all_unreg
,
devm_extcon_dev_match
,
edev
));
}
EXPORT_SYMBOL
(
devm_extcon_unregister_notifier_all
);
drivers/extcon/extcon.c
浏览文件 @
bc9a5c37
...
...
@@ -448,8 +448,19 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id)
spin_lock_irqsave
(
&
edev
->
lock
,
flags
);
state
=
!!
(
edev
->
state
&
BIT
(
index
));
/*
* Call functions in a raw notifier chain for the specific one
* external connector.
*/
raw_notifier_call_chain
(
&
edev
->
nh
[
index
],
state
,
edev
);
/*
* Call functions in a raw notifier chain for the all supported
* external connectors.
*/
raw_notifier_call_chain
(
&
edev
->
nh_all
,
state
,
edev
);
/* This could be in interrupt handler */
prop_buf
=
(
char
*
)
get_zeroed_page
(
GFP_ATOMIC
);
if
(
!
prop_buf
)
{
...
...
@@ -954,6 +965,59 @@ int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id,
}
EXPORT_SYMBOL_GPL
(
extcon_unregister_notifier
);
/**
* extcon_register_notifier_all() - Register a notifier block for all connectors
* @edev: the extcon device that has the external connecotr.
* @nb: a notifier block to be registered.
*
* This fucntion registers a notifier block in order to receive the state
* change of all supported external connectors from extcon device.
* And The second parameter given to the callback of nb (val) is
* the current state and third parameter is the edev pointer.
*
* Returns 0 if success or error number if fail
*/
int
extcon_register_notifier_all
(
struct
extcon_dev
*
edev
,
struct
notifier_block
*
nb
)
{
unsigned
long
flags
;
int
ret
;
if
(
!
edev
||
!
nb
)
return
-
EINVAL
;
spin_lock_irqsave
(
&
edev
->
lock
,
flags
);
ret
=
raw_notifier_chain_register
(
&
edev
->
nh_all
,
nb
);
spin_unlock_irqrestore
(
&
edev
->
lock
,
flags
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
extcon_register_notifier_all
);
/**
* extcon_unregister_notifier_all() - Unregister a notifier block from extcon.
* @edev: the extcon device that has the external connecotr.
* @nb: a notifier block to be registered.
*
* Returns 0 if success or error number if fail
*/
int
extcon_unregister_notifier_all
(
struct
extcon_dev
*
edev
,
struct
notifier_block
*
nb
)
{
unsigned
long
flags
;
int
ret
;
if
(
!
edev
||
!
nb
)
return
-
EINVAL
;
spin_lock_irqsave
(
&
edev
->
lock
,
flags
);
ret
=
raw_notifier_chain_unregister
(
&
edev
->
nh_all
,
nb
);
spin_unlock_irqrestore
(
&
edev
->
lock
,
flags
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
extcon_unregister_notifier_all
);
static
struct
attribute
*
extcon_attrs
[]
=
{
&
dev_attr_state
.
attr
,
&
dev_attr_name
.
attr
,
...
...
@@ -1212,6 +1276,8 @@ int extcon_dev_register(struct extcon_dev *edev)
for
(
index
=
0
;
index
<
edev
->
max_supported
;
index
++
)
RAW_INIT_NOTIFIER_HEAD
(
&
edev
->
nh
[
index
]);
RAW_INIT_NOTIFIER_HEAD
(
&
edev
->
nh_all
);
dev_set_drvdata
(
&
edev
->
dev
,
edev
);
edev
->
state
=
0
;
...
...
drivers/extcon/extcon.h
浏览文件 @
bc9a5c37
...
...
@@ -21,6 +21,8 @@
* @dev: Device of this extcon.
* @state: Attach/detach state of this extcon. Do not provide at
* register-time.
* @nh_all: Notifier for the state change events for all supported
* external connectors from this extcon.
* @nh: Notifier for the state change events from this extcon
* @entry: To support list of extcon devices so that users can
* search for extcon devices based on the extcon name.
...
...
@@ -43,6 +45,7 @@ struct extcon_dev {
/* Internal data. Please do not set. */
struct
device
dev
;
struct
raw_notifier_head
nh_all
;
struct
raw_notifier_head
*
nh
;
struct
list_head
entry
;
int
max_supported
;
...
...
include/linux/extcon.h
浏览文件 @
bc9a5c37
...
...
@@ -236,11 +236,11 @@ extern int extcon_set_property_capability(struct extcon_dev *edev,
unsigned
int
id
,
unsigned
int
prop
);
/*
* Following APIs are to monitor
every action of a notifier
.
*
Registrar gets notified for every external port of a connection device.
*
Probably this could be used to debug an action of notifier; however,
*
we do not recommend to use this for normal 'notifiee' device drivers who
*
want to be notified by a specific external port of the notifier
.
* Following APIs are to monitor
the status change of the external connectors
.
*
extcon_register_notifier(*edev, id, *nb) : Register a notifier block
*
for specific external connector of the extcon.
*
extcon_register_notifier_all(*edev, *nb) : Register a notifier block
*
for all supported external connectors of the extcon
.
*/
extern
int
extcon_register_notifier
(
struct
extcon_dev
*
edev
,
unsigned
int
id
,
struct
notifier_block
*
nb
);
...
...
@@ -253,6 +253,17 @@ extern void devm_extcon_unregister_notifier(struct device *dev,
struct
extcon_dev
*
edev
,
unsigned
int
id
,
struct
notifier_block
*
nb
);
extern
int
extcon_register_notifier_all
(
struct
extcon_dev
*
edev
,
struct
notifier_block
*
nb
);
extern
int
extcon_unregister_notifier_all
(
struct
extcon_dev
*
edev
,
struct
notifier_block
*
nb
);
extern
int
devm_extcon_register_notifier_all
(
struct
device
*
dev
,
struct
extcon_dev
*
edev
,
struct
notifier_block
*
nb
);
extern
void
devm_extcon_unregister_notifier_all
(
struct
device
*
dev
,
struct
extcon_dev
*
edev
,
struct
notifier_block
*
nb
);
/*
* Following API get the extcon device from devicetree.
* This function use phandle of devicetree to get extcon device directly.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录