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
nexedi
linux
Commits
e6120461
Commit
e6120461
authored
Dec 10, 2012
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'regulator/topic/palmas' into regulator-next
parents
adca48f7
bdc4baac
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
38 additions
and
83 deletions
+38
-83
drivers/regulator/palmas-regulator.c
drivers/regulator/palmas-regulator.c
+38
-83
No files found.
drivers/regulator/palmas-regulator.c
View file @
e6120461
...
...
@@ -309,68 +309,22 @@ static int palmas_list_voltage_smps(struct regulator_dev *dev,
int
id
=
rdev_get_id
(
dev
);
int
mult
=
1
;
if
(
!
selector
)
return
0
;
/* Read the multiplier set in VSEL register to return
* the correct voltage.
*/
if
(
pmic
->
range
[
id
])
mult
=
2
;
/* Voltage is (0.49V + (selector * 0.01V)) * RANGE
* as defined in data sheet. RANGE is either x1 or x2
*/
return
(
490000
+
(
selector
*
10000
))
*
mult
;
}
static
int
palmas_get_voltage_smps_sel
(
struct
regulator_dev
*
dev
)
{
struct
palmas_pmic
*
pmic
=
rdev_get_drvdata
(
dev
);
int
id
=
rdev_get_id
(
dev
);
int
selector
;
unsigned
int
reg
;
unsigned
int
addr
;
addr
=
palmas_regs_info
[
id
].
vsel_addr
;
palmas_smps_read
(
pmic
->
palmas
,
addr
,
&
reg
);
selector
=
reg
&
PALMAS_SMPS12_VOLTAGE_VSEL_MASK
;
/* Adjust selector to match list_voltage ranges */
if
((
selector
>
0
)
&&
(
selector
<
6
))
selector
=
6
;
if
(
!
selector
)
selector
=
5
;
if
(
selector
>
121
)
selector
=
121
;
selector
-=
5
;
return
selector
;
}
static
int
palmas_set_voltage_smps_sel
(
struct
regulator_dev
*
dev
,
unsigned
selector
)
{
struct
palmas_pmic
*
pmic
=
rdev_get_drvdata
(
dev
);
int
id
=
rdev_get_id
(
dev
);
unsigned
int
reg
=
0
;
unsigned
int
addr
;
addr
=
palmas_regs_info
[
id
].
vsel_addr
;
/* Make sure we don't change the value of RANGE */
if
(
pmic
->
range
[
id
])
reg
|=
PALMAS_SMPS12_VOLTAGE_RANGE
;
/* Adjust the linux selector into range used in VSEL register */
if
(
selector
)
reg
|=
selector
+
5
;
palmas_smps_write
(
pmic
->
palmas
,
addr
,
reg
);
return
0
;
if
(
selector
==
0
)
return
0
;
else
if
(
selector
<
6
)
return
500000
*
mult
;
else
/* Voltage is linear mapping starting from selector 6,
* volt = (0.49V + ((selector - 5) * 0.01V)) * RANGE
* RANGE is either x1 or x2
*/
return
(
490000
+
((
selector
-
5
)
*
10000
))
*
mult
;
}
static
int
palmas_map_voltage_smps
(
struct
regulator_dev
*
rdev
,
...
...
@@ -386,11 +340,11 @@ static int palmas_map_voltage_smps(struct regulator_dev *rdev,
if
(
pmic
->
range
[
id
])
{
/* RANGE is x2 */
if
(
min_uV
<
1000000
)
min_uV
=
1000000
;
ret
=
DIV_ROUND_UP
(
min_uV
-
1000000
,
20000
)
+
1
;
ret
=
DIV_ROUND_UP
(
min_uV
-
1000000
,
20000
)
+
6
;
}
else
{
/* RANGE is x1 */
if
(
min_uV
<
500000
)
min_uV
=
500000
;
ret
=
DIV_ROUND_UP
(
min_uV
-
500000
,
10000
)
+
1
;
ret
=
DIV_ROUND_UP
(
min_uV
-
500000
,
10000
)
+
6
;
}
/* Map back into a voltage to verify we're still in bounds */
...
...
@@ -407,8 +361,8 @@ static struct regulator_ops palmas_ops_smps = {
.
disable
=
palmas_disable_smps
,
.
set_mode
=
palmas_set_mode_smps
,
.
get_mode
=
palmas_get_mode_smps
,
.
get_voltage_sel
=
palmas_get_voltage_smps_sel
,
.
set_voltage_sel
=
palmas_set_voltage_smps_sel
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
list_voltage
=
palmas_list_voltage_smps
,
.
map_voltage
=
palmas_map_voltage_smps
,
};
...
...
@@ -703,6 +657,14 @@ static int palmas_probe(struct platform_device *pdev)
continue
;
}
/* Initialise sleep/init values from platform data */
if
(
pdata
&&
pdata
->
reg_init
[
id
])
{
reg_init
=
pdata
->
reg_init
[
id
];
ret
=
palmas_smps_init
(
palmas
,
id
,
reg_init
);
if
(
ret
)
goto
err_unregister_regulator
;
}
/* Register the regulators */
pmic
->
desc
[
id
].
name
=
palmas_regs_info
[
id
].
name
;
pmic
->
desc
[
id
].
id
=
id
;
...
...
@@ -723,29 +685,11 @@ static int palmas_probe(struct platform_device *pdev)
pmic
->
desc
[
id
].
uV_step
=
1250000
;
break
;
default:
pmic
->
desc
[
id
].
ops
=
&
palmas_ops_smps
;
pmic
->
desc
[
id
].
n_voltages
=
PALMAS_SMPS_NUM_VOLTAGES
;
}
pmic
->
desc
[
id
].
type
=
REGULATOR_VOLTAGE
;
pmic
->
desc
[
id
].
owner
=
THIS_MODULE
;
/* Initialise sleep/init values from platform data */
if
(
pdata
)
{
reg_init
=
pdata
->
reg_init
[
id
];
if
(
reg_init
)
{
ret
=
palmas_smps_init
(
palmas
,
id
,
reg_init
);
if
(
ret
)
goto
err_unregister_regulator
;
}
}
/*
* read and store the RANGE bit for later use
* This must be done before regulator is probed otherwise
* we error in probe with unsuportable ranges.
*/
if
(
id
!=
PALMAS_REG_SMPS10
)
{
/*
* Read and store the RANGE bit for later use
* This must be done before regulator is probed,
* otherwise we error in probe with unsupportable ranges.
*/
addr
=
palmas_regs_info
[
id
].
vsel_addr
;
ret
=
palmas_smps_read
(
pmic
->
palmas
,
addr
,
&
reg
);
...
...
@@ -753,8 +697,19 @@ static int palmas_probe(struct platform_device *pdev)
goto
err_unregister_regulator
;
if
(
reg
&
PALMAS_SMPS12_VOLTAGE_RANGE
)
pmic
->
range
[
id
]
=
1
;
pmic
->
desc
[
id
].
ops
=
&
palmas_ops_smps
;
pmic
->
desc
[
id
].
n_voltages
=
PALMAS_SMPS_NUM_VOLTAGES
;
pmic
->
desc
[
id
].
vsel_reg
=
PALMAS_BASE_TO_REG
(
PALMAS_SMPS_BASE
,
palmas_regs_info
[
id
].
vsel_addr
);
pmic
->
desc
[
id
].
vsel_mask
=
PALMAS_SMPS12_VOLTAGE_VSEL_MASK
;
}
pmic
->
desc
[
id
].
type
=
REGULATOR_VOLTAGE
;
pmic
->
desc
[
id
].
owner
=
THIS_MODULE
;
if
(
pdata
)
config
.
init_data
=
pdata
->
reg_data
[
id
];
else
...
...
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