Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
2730fd82
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看板
提交
2730fd82
编写于
2月 19, 2013
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'regulator/topic/tps65090' into regulator-next
上级
da3522f8
09a228e7
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
101 addition
and
5 deletion
+101
-5
drivers/regulator/tps65090-regulator.c
drivers/regulator/tps65090-regulator.c
+101
-5
未找到文件。
drivers/regulator/tps65090-regulator.c
浏览文件 @
2730fd82
...
...
@@ -19,11 +19,13 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/slab.h>
#include <linux/err.h>
#include <linux/platform_device.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/of_regulator.h>
#include <linux/mfd/tps65090.h>
struct
tps65090_regulator
{
...
...
@@ -67,8 +69,8 @@ static struct regulator_desc tps65090_regulator_desc[] = {
tps65090_REG_DESC
(
FET5
,
"infet5"
,
0x13
,
tps65090_reg_contol_ops
),
tps65090_REG_DESC
(
FET6
,
"infet6"
,
0x14
,
tps65090_reg_contol_ops
),
tps65090_REG_DESC
(
FET7
,
"infet7"
,
0x15
,
tps65090_reg_contol_ops
),
tps65090_REG_DESC
(
LDO1
,
"vsys
_
l1"
,
0
,
tps65090_ldo_ops
),
tps65090_REG_DESC
(
LDO2
,
"vsys
_
l2"
,
0
,
tps65090_ldo_ops
),
tps65090_REG_DESC
(
LDO1
,
"vsys
-
l1"
,
0
,
tps65090_ldo_ops
),
tps65090_REG_DESC
(
LDO2
,
"vsys
-
l2"
,
0
,
tps65090_ldo_ops
),
};
static
inline
bool
is_dcdc
(
int
id
)
...
...
@@ -138,6 +140,92 @@ static void tps65090_configure_regulator_config(
}
}
#ifdef CONFIG_OF
static
struct
of_regulator_match
tps65090_matches
[]
=
{
{
.
name
=
"dcdc1"
,
},
{
.
name
=
"dcdc2"
,
},
{
.
name
=
"dcdc3"
,
},
{
.
name
=
"fet1"
,
},
{
.
name
=
"fet2"
,
},
{
.
name
=
"fet3"
,
},
{
.
name
=
"fet4"
,
},
{
.
name
=
"fet5"
,
},
{
.
name
=
"fet6"
,
},
{
.
name
=
"fet7"
,
},
{
.
name
=
"ldo1"
,
},
{
.
name
=
"ldo2"
,
},
};
static
struct
tps65090_platform_data
*
tps65090_parse_dt_reg_data
(
struct
platform_device
*
pdev
,
struct
of_regulator_match
**
tps65090_reg_matches
)
{
struct
tps65090_platform_data
*
tps65090_pdata
;
struct
device_node
*
np
=
pdev
->
dev
.
parent
->
of_node
;
struct
device_node
*
regulators
;
int
idx
=
0
,
ret
;
struct
tps65090_regulator_plat_data
*
reg_pdata
;
tps65090_pdata
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
tps65090_pdata
),
GFP_KERNEL
);
if
(
!
tps65090_pdata
)
{
dev_err
(
&
pdev
->
dev
,
"Memory alloc for tps65090_pdata failed
\n
"
);
return
ERR_PTR
(
-
ENOMEM
);
}
reg_pdata
=
devm_kzalloc
(
&
pdev
->
dev
,
TPS65090_REGULATOR_MAX
*
sizeof
(
*
reg_pdata
),
GFP_KERNEL
);
if
(
!
reg_pdata
)
{
dev_err
(
&
pdev
->
dev
,
"Memory alloc for reg_pdata failed
\n
"
);
return
ERR_PTR
(
-
ENOMEM
);
}
regulators
=
of_find_node_by_name
(
np
,
"regulators"
);
if
(
!
regulators
)
{
dev_err
(
&
pdev
->
dev
,
"regulator node not found
\n
"
);
return
ERR_PTR
(
-
ENODEV
);
}
ret
=
of_regulator_match
(
&
pdev
->
dev
,
regulators
,
tps65090_matches
,
ARRAY_SIZE
(
tps65090_matches
));
if
(
ret
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"Error parsing regulator init data: %d
\n
"
,
ret
);
return
ERR_PTR
(
ret
);
}
*
tps65090_reg_matches
=
tps65090_matches
;
for
(
idx
=
0
;
idx
<
ARRAY_SIZE
(
tps65090_matches
);
idx
++
)
{
struct
regulator_init_data
*
ri_data
;
struct
tps65090_regulator_plat_data
*
rpdata
;
rpdata
=
&
reg_pdata
[
idx
];
ri_data
=
tps65090_matches
[
idx
].
init_data
;
if
(
!
ri_data
||
!
tps65090_matches
[
idx
].
of_node
)
continue
;
rpdata
->
reg_init_data
=
ri_data
;
rpdata
->
enable_ext_control
=
of_property_read_bool
(
tps65090_matches
[
idx
].
of_node
,
"ti,enable-ext-control"
);
if
(
rpdata
->
enable_ext_control
)
rpdata
->
gpio
=
of_get_named_gpio
(
np
,
"dcdc-ext-control-gpios"
,
0
);
tps65090_pdata
->
reg_pdata
[
idx
]
=
rpdata
;
}
return
tps65090_pdata
;
}
#else
static
inline
struct
tps65090_platform_data
*
tps65090_parse_dt_reg_data
(
struct
platform_device
*
pdev
,
struct
of_regulator_match
**
tps65090_reg_matches
)
{
*
tps65090_reg_matches
=
NULL
;
return
NULL
;
}
#endif
static
int
tps65090_regulator_probe
(
struct
platform_device
*
pdev
)
{
struct
tps65090
*
tps65090_mfd
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
...
...
@@ -147,15 +235,19 @@ static int tps65090_regulator_probe(struct platform_device *pdev)
struct
tps65090_regulator_plat_data
*
tps_pdata
;
struct
tps65090_regulator
*
pmic
;
struct
tps65090_platform_data
*
tps65090_pdata
;
struct
of_regulator_match
*
tps65090_reg_matches
=
NULL
;
int
num
;
int
ret
;
dev_dbg
(
&
pdev
->
dev
,
"Probing regulator
\n
"
);
tps65090_pdata
=
dev_get_platdata
(
pdev
->
dev
.
parent
);
if
(
!
tps65090_pdata
)
{
if
(
!
tps65090_pdata
&&
tps65090_mfd
->
dev
->
of_node
)
tps65090_pdata
=
tps65090_parse_dt_reg_data
(
pdev
,
&
tps65090_reg_matches
);
if
(
IS_ERR_OR_NULL
(
tps65090_pdata
))
{
dev_err
(
&
pdev
->
dev
,
"Platform data missing
\n
"
);
return
-
EINVAL
;
return
tps65090_pdata
?
PTR_ERR
(
tps65090_pdata
)
:
-
EINVAL
;
}
pmic
=
devm_kzalloc
(
&
pdev
->
dev
,
TPS65090_REGULATOR_MAX
*
sizeof
(
*
pmic
),
...
...
@@ -192,13 +284,17 @@ static int tps65090_regulator_probe(struct platform_device *pdev)
}
}
config
.
dev
=
&
pdev
->
dev
;
config
.
dev
=
pdev
->
dev
.
parent
;
config
.
driver_data
=
ri
;
config
.
regmap
=
tps65090_mfd
->
rmap
;
if
(
tps_pdata
)
config
.
init_data
=
tps_pdata
->
reg_init_data
;
else
config
.
init_data
=
NULL
;
if
(
tps65090_reg_matches
)
config
.
of_node
=
tps65090_reg_matches
[
num
].
of_node
;
else
config
.
of_node
=
NULL
;
rdev
=
regulator_register
(
ri
->
desc
,
&
config
);
if
(
IS_ERR
(
rdev
))
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录