Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
04fcec88
Commit
04fcec88
authored
Sep 01, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'regulator/topic/sec' into regulator-next
parents
a89f5c75
f8f1d48b
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
211 additions
and
45 deletions
+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
No files found.
drivers/regulator/s2mps11.c
View file @
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
View file @
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)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment