Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
04fcec88
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看板
提交
04fcec88
编写于
9月 01, 2013
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'regulator/topic/sec' into regulator-next
上级
a89f5c75
f8f1d48b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
211 addition
and
45 deletion
+211
-45
drivers/regulator/s2mps11.c
drivers/regulator/s2mps11.c
+200
-45
include/linux/mfd/samsung/s2mps11.h
include/linux/mfd/samsung/s2mps11.h
+11
-0
未找到文件。
drivers/regulator/s2mps11.c
浏览文件 @
04fcec88
...
...
@@ -16,12 +16,17 @@
#include <linux/gpio.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/regmap.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/samsung/core.h>
#include <linux/mfd/samsung/s2mps11.h>
#define S2MPS11_REGULATOR_CNT ARRAY_SIZE(regulators)
struct
s2mps11_info
{
struct
regulator_dev
*
rdev
[
S2MPS11_REGULATOR_MAX
];
...
...
@@ -31,11 +36,6 @@ struct s2mps11_info {
int
ramp_delay16
;
int
ramp_delay7810
;
int
ramp_delay9
;
bool
buck6_ramp
;
bool
buck2_ramp
;
bool
buck3_ramp
;
bool
buck4_ramp
;
};
static
int
get_ramp_delay
(
int
ramp_delay
)
...
...
@@ -50,9 +50,171 @@ static int get_ramp_delay(int ramp_delay)
break
;
cnt
++
;
}
if
(
cnt
>
3
)
cnt
=
3
;
return
cnt
;
}
static
int
s2mps11_regulator_set_voltage_time_sel
(
struct
regulator_dev
*
rdev
,
unsigned
int
old_selector
,
unsigned
int
new_selector
)
{
struct
s2mps11_info
*
s2mps11
=
rdev_get_drvdata
(
rdev
);
unsigned
int
ramp_delay
=
0
;
int
old_volt
,
new_volt
;
switch
(
rdev
->
desc
->
id
)
{
case
S2MPS11_BUCK2
:
ramp_delay
=
s2mps11
->
ramp_delay2
;
break
;
case
S2MPS11_BUCK3
:
ramp_delay
=
s2mps11
->
ramp_delay34
;
break
;
case
S2MPS11_BUCK4
:
ramp_delay
=
s2mps11
->
ramp_delay34
;
break
;
case
S2MPS11_BUCK5
:
ramp_delay
=
s2mps11
->
ramp_delay5
;
break
;
case
S2MPS11_BUCK6
:
case
S2MPS11_BUCK1
:
ramp_delay
=
s2mps11
->
ramp_delay16
;
break
;
case
S2MPS11_BUCK7
:
case
S2MPS11_BUCK8
:
case
S2MPS11_BUCK10
:
ramp_delay
=
s2mps11
->
ramp_delay7810
;
break
;
case
S2MPS11_BUCK9
:
ramp_delay
=
s2mps11
->
ramp_delay9
;
}
if
(
ramp_delay
==
0
)
ramp_delay
=
rdev
->
desc
->
ramp_delay
;
old_volt
=
rdev
->
desc
->
min_uV
+
(
rdev
->
desc
->
uV_step
*
old_selector
);
new_volt
=
rdev
->
desc
->
min_uV
+
(
rdev
->
desc
->
uV_step
*
new_selector
);
return
DIV_ROUND_UP
(
abs
(
new_volt
-
old_volt
),
ramp_delay
);
}
static
int
s2mps11_set_ramp_delay
(
struct
regulator_dev
*
rdev
,
int
ramp_delay
)
{
struct
s2mps11_info
*
s2mps11
=
rdev_get_drvdata
(
rdev
);
unsigned
int
ramp_val
,
ramp_shift
,
ramp_reg
=
S2MPS11_REG_RAMP_BUCK
;
unsigned
int
ramp_enable
=
1
,
enable_shift
=
0
;
int
ret
;
switch
(
rdev
->
desc
->
id
)
{
case
S2MPS11_BUCK1
:
if
(
ramp_delay
>
s2mps11
->
ramp_delay16
)
s2mps11
->
ramp_delay16
=
ramp_delay
;
else
ramp_delay
=
s2mps11
->
ramp_delay16
;
ramp_shift
=
S2MPS11_BUCK16_RAMP_SHIFT
;
break
;
case
S2MPS11_BUCK2
:
enable_shift
=
S2MPS11_BUCK2_RAMP_EN_SHIFT
;
if
(
!
ramp_delay
)
{
ramp_enable
=
0
;
break
;
}
s2mps11
->
ramp_delay2
=
ramp_delay
;
ramp_shift
=
S2MPS11_BUCK2_RAMP_SHIFT
;
ramp_reg
=
S2MPS11_REG_RAMP
;
break
;
case
S2MPS11_BUCK3
:
enable_shift
=
S2MPS11_BUCK3_RAMP_EN_SHIFT
;
if
(
!
ramp_delay
)
{
ramp_enable
=
0
;
break
;
}
if
(
ramp_delay
>
s2mps11
->
ramp_delay34
)
s2mps11
->
ramp_delay34
=
ramp_delay
;
else
ramp_delay
=
s2mps11
->
ramp_delay34
;
ramp_shift
=
S2MPS11_BUCK34_RAMP_SHIFT
;
ramp_reg
=
S2MPS11_REG_RAMP
;
break
;
case
S2MPS11_BUCK4
:
enable_shift
=
S2MPS11_BUCK4_RAMP_EN_SHIFT
;
if
(
!
ramp_delay
)
{
ramp_enable
=
0
;
break
;
}
if
(
ramp_delay
>
s2mps11
->
ramp_delay34
)
s2mps11
->
ramp_delay34
=
ramp_delay
;
else
ramp_delay
=
s2mps11
->
ramp_delay34
;
ramp_shift
=
S2MPS11_BUCK34_RAMP_SHIFT
;
ramp_reg
=
S2MPS11_REG_RAMP
;
break
;
case
S2MPS11_BUCK5
:
s2mps11
->
ramp_delay5
=
ramp_delay
;
ramp_shift
=
S2MPS11_BUCK5_RAMP_SHIFT
;
break
;
case
S2MPS11_BUCK6
:
enable_shift
=
S2MPS11_BUCK6_RAMP_EN_SHIFT
;
if
(
!
ramp_delay
)
{
ramp_enable
=
0
;
break
;
}
if
(
ramp_delay
>
s2mps11
->
ramp_delay16
)
s2mps11
->
ramp_delay16
=
ramp_delay
;
else
ramp_delay
=
s2mps11
->
ramp_delay16
;
ramp_shift
=
S2MPS11_BUCK16_RAMP_SHIFT
;
break
;
case
S2MPS11_BUCK7
:
case
S2MPS11_BUCK8
:
case
S2MPS11_BUCK10
:
if
(
ramp_delay
>
s2mps11
->
ramp_delay7810
)
s2mps11
->
ramp_delay7810
=
ramp_delay
;
else
ramp_delay
=
s2mps11
->
ramp_delay7810
;
ramp_shift
=
S2MPS11_BUCK7810_RAMP_SHIFT
;
break
;
case
S2MPS11_BUCK9
:
s2mps11
->
ramp_delay9
=
ramp_delay
;
ramp_shift
=
S2MPS11_BUCK9_RAMP_SHIFT
;
break
;
default:
return
0
;
}
if
(
!
ramp_enable
)
goto
ramp_disable
;
if
(
enable_shift
)
{
ret
=
regmap_update_bits
(
rdev
->
regmap
,
S2MPS11_REG_RAMP
,
1
<<
enable_shift
,
1
<<
enable_shift
);
if
(
ret
)
{
dev_err
(
&
rdev
->
dev
,
"failed to enable ramp rate
\n
"
);
return
ret
;
}
}
ramp_val
=
get_ramp_delay
(
ramp_delay
);
return
regmap_update_bits
(
rdev
->
regmap
,
ramp_reg
,
0x3
<<
ramp_shift
,
ramp_val
<<
ramp_shift
);
ramp_disable:
return
regmap_update_bits
(
rdev
->
regmap
,
S2MPS11_REG_RAMP
,
1
<<
enable_shift
,
0
);
}
static
struct
regulator_ops
s2mps11_ldo_ops
=
{
.
list_voltage
=
regulator_list_voltage_linear
,
.
map_voltage
=
regulator_map_voltage_linear
,
...
...
@@ -72,7 +234,8 @@ static struct regulator_ops s2mps11_buck_ops = {
.
disable
=
regulator_disable_regmap
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
set_voltage_time_sel
=
regulator_set_voltage_time_sel
,
.
set_voltage_time_sel
=
s2mps11_regulator_set_voltage_time_sel
,
.
set_ramp_delay
=
s2mps11_set_ramp_delay
,
};
#define regulator_desc_ldo1(num) { \
...
...
@@ -239,59 +402,51 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
{
struct
sec_pmic_dev
*
iodev
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
sec_platform_data
*
pdata
=
dev_get_platdata
(
iodev
->
dev
);
struct
of_regulator_match
rdata
[
S2MPS11_REGULATOR_MAX
];
struct
device_node
*
reg_np
=
NULL
;
struct
regulator_config
config
=
{
};
struct
s2mps11_info
*
s2mps11
;
int
i
,
ret
;
unsigned
char
ramp_enable
,
ramp_reg
=
0
;
if
(
!
pdata
)
{
dev_err
(
pdev
->
dev
.
parent
,
"Platform data not supplied
\n
"
);
return
-
ENODEV
;
}
s2mps11
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
struct
s2mps11_info
),
GFP_KERNEL
);
if
(
!
s2mps11
)
return
-
ENOMEM
;
platform_set_drvdata
(
pdev
,
s2mps11
);
if
(
!
iodev
->
dev
->
of_node
)
{
if
(
pdata
)
{
goto
common_reg
;
}
else
{
dev_err
(
pdev
->
dev
.
parent
,
"Platform data or DT node not supplied
\n
"
);
return
-
ENODEV
;
}
}
s2mps11
->
ramp_delay2
=
pdata
->
buck2_ramp_delay
;
s2mps11
->
ramp_delay34
=
pdata
->
buck34_ramp_delay
;
s2mps11
->
ramp_delay5
=
pdata
->
buck5_ramp_delay
;
s2mps11
->
ramp_delay16
=
pdata
->
buck16_ramp_delay
;
s2mps11
->
ramp_delay7810
=
pdata
->
buck7810_ramp_delay
;
s2mps11
->
ramp_delay9
=
pdata
->
buck9_ramp_delay
;
s2mps11
->
buck6_ramp
=
pdata
->
buck6_ramp_enable
;
s2mps11
->
buck2_ramp
=
pdata
->
buck2_ramp_enable
;
s2mps11
->
buck3_ramp
=
pdata
->
buck3_ramp_enable
;
s2mps11
->
buck4_ramp
=
pdata
->
buck4_ramp_enable
;
ramp_enable
=
(
s2mps11
->
buck2_ramp
<<
3
)
|
(
s2mps11
->
buck3_ramp
<<
2
)
|
(
s2mps11
->
buck4_ramp
<<
1
)
|
s2mps11
->
buck6_ramp
;
if
(
ramp_enable
)
{
if
(
s2mps11
->
buck2_ramp
)
ramp_reg
|=
get_ramp_delay
(
s2mps11
->
ramp_delay2
)
<<
6
;
if
(
s2mps11
->
buck3_ramp
||
s2mps11
->
buck4_ramp
)
ramp_reg
|=
get_ramp_delay
(
s2mps11
->
ramp_delay34
)
<<
4
;
sec_reg_write
(
iodev
,
S2MPS11_REG_RAMP
,
ramp_reg
|
ramp_enable
);
for
(
i
=
0
;
i
<
S2MPS11_REGULATOR_CNT
;
i
++
)
rdata
[
i
].
name
=
regulators
[
i
].
name
;
reg_np
=
of_find_node_by_name
(
iodev
->
dev
->
of_node
,
"regulators"
);
if
(
!
reg_np
)
{
dev_err
(
&
pdev
->
dev
,
"could not find regulators sub-node
\n
"
);
return
-
EINVAL
;
}
ramp_reg
&=
0x00
;
ramp_reg
|=
get_ramp_delay
(
s2mps11
->
ramp_delay5
)
<<
6
;
ramp_reg
|=
get_ramp_delay
(
s2mps11
->
ramp_delay16
)
<<
4
;
ramp_reg
|=
get_ramp_delay
(
s2mps11
->
ramp_delay7810
)
<<
2
;
ramp_reg
|=
get_ramp_delay
(
s2mps11
->
ramp_delay9
);
sec_reg_write
(
iodev
,
S2MPS11_REG_RAMP_BUCK
,
ramp_reg
);
of_regulator_match
(
&
pdev
->
dev
,
reg_np
,
rdata
,
S2MPS11_REGULATOR_MAX
);
for
(
i
=
0
;
i
<
S2MPS11_REGULATOR_MAX
;
i
++
)
{
common_reg:
platform_set_drvdata
(
pdev
,
s2mps11
);
config
.
dev
=
&
pdev
->
dev
;
config
.
regmap
=
iodev
->
regmap
;
config
.
init_data
=
pdata
->
regulators
[
i
].
initdata
;
config
.
driver_data
=
s2mps11
;
config
.
dev
=
&
pdev
->
dev
;
config
.
regmap
=
iodev
->
regmap
;
config
.
driver_data
=
s2mps11
;
for
(
i
=
0
;
i
<
S2MPS11_REGULATOR_MAX
;
i
++
)
{
if
(
!
reg_np
)
{
config
.
init_data
=
pdata
->
regulators
[
i
].
initdata
;
}
else
{
config
.
init_data
=
rdata
[
i
].
init_data
;
config
.
of_node
=
rdata
[
i
].
of_node
;
}
s2mps11
->
rdev
[
i
]
=
regulator_register
(
&
regulators
[
i
],
&
config
);
if
(
IS_ERR
(
s2mps11
->
rdev
[
i
]))
{
...
...
include/linux/mfd/samsung/s2mps11.h
浏览文件 @
04fcec88
...
...
@@ -191,6 +191,17 @@ enum s2mps11_regulators {
#define S2MPS11_BUCK_N_VOLTAGES (S2MPS11_BUCK_VSEL_MASK + 1)
#define S2MPS11_RAMP_DELAY 25000
/* uV/us */
#define S2MPS11_BUCK2_RAMP_SHIFT 6
#define S2MPS11_BUCK34_RAMP_SHIFT 4
#define S2MPS11_BUCK5_RAMP_SHIFT 6
#define S2MPS11_BUCK16_RAMP_SHIFT 4
#define S2MPS11_BUCK7810_RAMP_SHIFT 2
#define S2MPS11_BUCK9_RAMP_SHIFT 0
#define S2MPS11_BUCK2_RAMP_EN_SHIFT 3
#define S2MPS11_BUCK3_RAMP_EN_SHIFT 2
#define S2MPS11_BUCK4_RAMP_EN_SHIFT 1
#define S2MPS11_BUCK6_RAMP_EN_SHIFT 0
#define S2MPS11_PMIC_EN_SHIFT 6
#define S2MPS11_REGULATOR_MAX (S2MPS11_REG_MAX - 3)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录