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
28c426c7
Commit
28c426c7
authored
Nov 10, 2017
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'regulator/topic/axp20x' into regulator-next
parents
46294d66
ad92ceaf
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
91 additions
and
4 deletions
+91
-4
drivers/regulator/axp20x-regulator.c
drivers/regulator/axp20x-regulator.c
+88
-4
include/linux/mfd/axp20x.h
include/linux/mfd/axp20x.h
+3
-0
No files found.
drivers/regulator/axp20x-regulator.c
View file @
28c426c7
...
@@ -244,6 +244,7 @@ static const struct regulator_desc axp22x_drivevbus_regulator = {
...
@@ -244,6 +244,7 @@ static const struct regulator_desc axp22x_drivevbus_regulator = {
.
ops
=
&
axp20x_ops_sw
,
.
ops
=
&
axp20x_ops_sw
,
};
};
/* DCDC ranges shared with AXP813 */
static
const
struct
regulator_linear_range
axp803_dcdc234_ranges
[]
=
{
static
const
struct
regulator_linear_range
axp803_dcdc234_ranges
[]
=
{
REGULATOR_LINEAR_RANGE
(
500000
,
0x0
,
0x46
,
10000
),
REGULATOR_LINEAR_RANGE
(
500000
,
0x0
,
0x46
,
10000
),
REGULATOR_LINEAR_RANGE
(
1220000
,
0x47
,
0x4b
,
20000
),
REGULATOR_LINEAR_RANGE
(
1220000
,
0x47
,
0x4b
,
20000
),
...
@@ -426,6 +427,69 @@ static const struct regulator_desc axp809_regulators[] = {
...
@@ -426,6 +427,69 @@ static const struct regulator_desc axp809_regulators[] = {
AXP_DESC_SW
(
AXP809
,
SW
,
"sw"
,
"swin"
,
AXP22X_PWR_OUT_CTRL2
,
BIT
(
6
)),
AXP_DESC_SW
(
AXP809
,
SW
,
"sw"
,
"swin"
,
AXP22X_PWR_OUT_CTRL2
,
BIT
(
6
)),
};
};
static
const
struct
regulator_desc
axp813_regulators
[]
=
{
AXP_DESC
(
AXP813
,
DCDC1
,
"dcdc1"
,
"vin1"
,
1600
,
3400
,
100
,
AXP803_DCDC1_V_OUT
,
0x1f
,
AXP22X_PWR_OUT_CTRL1
,
BIT
(
0
)),
AXP_DESC_RANGES
(
AXP813
,
DCDC2
,
"dcdc2"
,
"vin2"
,
axp803_dcdc234_ranges
,
76
,
AXP803_DCDC2_V_OUT
,
0x7f
,
AXP22X_PWR_OUT_CTRL1
,
BIT
(
1
)),
AXP_DESC_RANGES
(
AXP813
,
DCDC3
,
"dcdc3"
,
"vin3"
,
axp803_dcdc234_ranges
,
76
,
AXP803_DCDC3_V_OUT
,
0x7f
,
AXP22X_PWR_OUT_CTRL1
,
BIT
(
2
)),
AXP_DESC_RANGES
(
AXP813
,
DCDC4
,
"dcdc4"
,
"vin4"
,
axp803_dcdc234_ranges
,
76
,
AXP803_DCDC4_V_OUT
,
0x7f
,
AXP22X_PWR_OUT_CTRL1
,
BIT
(
3
)),
AXP_DESC_RANGES
(
AXP813
,
DCDC5
,
"dcdc5"
,
"vin5"
,
axp803_dcdc5_ranges
,
68
,
AXP803_DCDC5_V_OUT
,
0x7f
,
AXP22X_PWR_OUT_CTRL1
,
BIT
(
4
)),
AXP_DESC_RANGES
(
AXP813
,
DCDC6
,
"dcdc6"
,
"vin6"
,
axp803_dcdc6_ranges
,
72
,
AXP803_DCDC6_V_OUT
,
0x7f
,
AXP22X_PWR_OUT_CTRL1
,
BIT
(
5
)),
AXP_DESC_RANGES
(
AXP813
,
DCDC7
,
"dcdc7"
,
"vin7"
,
axp803_dcdc6_ranges
,
72
,
AXP813_DCDC7_V_OUT
,
0x7f
,
AXP22X_PWR_OUT_CTRL1
,
BIT
(
6
)),
AXP_DESC
(
AXP813
,
ALDO1
,
"aldo1"
,
"aldoin"
,
700
,
3300
,
100
,
AXP22X_ALDO1_V_OUT
,
0x1f
,
AXP22X_PWR_OUT_CTRL3
,
BIT
(
5
)),
AXP_DESC
(
AXP813
,
ALDO2
,
"aldo2"
,
"aldoin"
,
700
,
3300
,
100
,
AXP22X_ALDO2_V_OUT
,
0x1f
,
AXP22X_PWR_OUT_CTRL3
,
BIT
(
6
)),
AXP_DESC
(
AXP813
,
ALDO3
,
"aldo3"
,
"aldoin"
,
700
,
3300
,
100
,
AXP22X_ALDO3_V_OUT
,
0x1f
,
AXP22X_PWR_OUT_CTRL3
,
BIT
(
7
)),
AXP_DESC
(
AXP813
,
DLDO1
,
"dldo1"
,
"dldoin"
,
700
,
3300
,
100
,
AXP22X_DLDO1_V_OUT
,
0x1f
,
AXP22X_PWR_OUT_CTRL2
,
BIT
(
3
)),
AXP_DESC_RANGES
(
AXP813
,
DLDO2
,
"dldo2"
,
"dldoin"
,
axp803_dldo2_ranges
,
32
,
AXP22X_DLDO2_V_OUT
,
0x1f
,
AXP22X_PWR_OUT_CTRL2
,
BIT
(
4
)),
AXP_DESC
(
AXP813
,
DLDO3
,
"dldo3"
,
"dldoin"
,
700
,
3300
,
100
,
AXP22X_DLDO3_V_OUT
,
0x1f
,
AXP22X_PWR_OUT_CTRL2
,
BIT
(
5
)),
AXP_DESC
(
AXP813
,
DLDO4
,
"dldo4"
,
"dldoin"
,
700
,
3300
,
100
,
AXP22X_DLDO4_V_OUT
,
0x1f
,
AXP22X_PWR_OUT_CTRL2
,
BIT
(
6
)),
AXP_DESC
(
AXP813
,
ELDO1
,
"eldo1"
,
"eldoin"
,
700
,
1900
,
50
,
AXP22X_ELDO1_V_OUT
,
0x1f
,
AXP22X_PWR_OUT_CTRL2
,
BIT
(
0
)),
AXP_DESC
(
AXP813
,
ELDO2
,
"eldo2"
,
"eldoin"
,
700
,
1900
,
50
,
AXP22X_ELDO2_V_OUT
,
0x1f
,
AXP22X_PWR_OUT_CTRL2
,
BIT
(
1
)),
AXP_DESC
(
AXP813
,
ELDO3
,
"eldo3"
,
"eldoin"
,
700
,
1900
,
50
,
AXP22X_ELDO3_V_OUT
,
0x1f
,
AXP22X_PWR_OUT_CTRL2
,
BIT
(
2
)),
/* to do / check ... */
AXP_DESC
(
AXP813
,
FLDO1
,
"fldo1"
,
"fldoin"
,
700
,
1450
,
50
,
AXP803_FLDO1_V_OUT
,
0x0f
,
AXP22X_PWR_OUT_CTRL3
,
BIT
(
2
)),
AXP_DESC
(
AXP813
,
FLDO2
,
"fldo2"
,
"fldoin"
,
700
,
1450
,
50
,
AXP803_FLDO2_V_OUT
,
0x0f
,
AXP22X_PWR_OUT_CTRL3
,
BIT
(
3
)),
/*
* TODO: FLDO3 = {DCDC5, FLDOIN} / 2
*
* This means FLDO3 effectively switches supplies at runtime,
* something the regulator subsystem does not support.
*/
AXP_DESC_FIXED
(
AXP813
,
RTC_LDO
,
"rtc-ldo"
,
"ips"
,
1800
),
AXP_DESC_IO
(
AXP813
,
LDO_IO0
,
"ldo-io0"
,
"ips"
,
700
,
3300
,
100
,
AXP22X_LDO_IO0_V_OUT
,
0x1f
,
AXP20X_GPIO0_CTRL
,
0x07
,
AXP22X_IO_ENABLED
,
AXP22X_IO_DISABLED
),
AXP_DESC_IO
(
AXP813
,
LDO_IO1
,
"ldo-io1"
,
"ips"
,
700
,
3300
,
100
,
AXP22X_LDO_IO1_V_OUT
,
0x1f
,
AXP20X_GPIO1_CTRL
,
0x07
,
AXP22X_IO_ENABLED
,
AXP22X_IO_DISABLED
),
AXP_DESC_SW
(
AXP813
,
SW
,
"sw"
,
"swin"
,
AXP22X_PWR_OUT_CTRL2
,
BIT
(
7
)),
};
static
int
axp20x_set_dcdc_freq
(
struct
platform_device
*
pdev
,
u32
dcdcfreq
)
static
int
axp20x_set_dcdc_freq
(
struct
platform_device
*
pdev
,
u32
dcdcfreq
)
{
{
struct
axp20x_dev
*
axp20x
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
axp20x_dev
*
axp20x
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
...
@@ -441,9 +505,10 @@ static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq)
...
@@ -441,9 +505,10 @@ static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq)
step
=
75
;
step
=
75
;
break
;
break
;
case
AXP803_ID
:
case
AXP803_ID
:
case
AXP813_ID
:
/*
/*
* AXP803
DCDC work frequency setting has the same range and
* AXP803
/AXP813 DCDC work frequency setting has the same
* step as AXP22X, but at a different register.
*
range and
step as AXP22X, but at a different register.
* Fall through to the check below.
* Fall through to the check below.
* (See include/linux/mfd/axp20x.h)
* (See include/linux/mfd/axp20x.h)
*/
*/
...
@@ -561,6 +626,14 @@ static int axp20x_set_dcdc_workmode(struct regulator_dev *rdev, int id, u32 work
...
@@ -561,6 +626,14 @@ static int axp20x_set_dcdc_workmode(struct regulator_dev *rdev, int id, u32 work
workmode
<<=
id
-
AXP803_DCDC1
;
workmode
<<=
id
-
AXP803_DCDC1
;
break
;
break
;
case
AXP813_ID
:
if
(
id
<
AXP813_DCDC1
||
id
>
AXP813_DCDC7
)
return
-
EINVAL
;
mask
=
AXP22X_WORKMODE_DCDCX_MASK
(
id
-
AXP813_DCDC1
);
workmode
<<=
id
-
AXP813_DCDC1
;
break
;
default:
default:
/* should not happen */
/* should not happen */
WARN_ON
(
1
);
WARN_ON
(
1
);
...
@@ -579,11 +652,12 @@ static bool axp20x_is_polyphase_slave(struct axp20x_dev *axp20x, int id)
...
@@ -579,11 +652,12 @@ static bool axp20x_is_polyphase_slave(struct axp20x_dev *axp20x, int id)
u32
reg
=
0
;
u32
reg
=
0
;
/*
/*
* Currently in our supported AXP variants, only AXP803
and AXP806
* Currently in our supported AXP variants, only AXP803
, AXP806,
* have polyphase regulators.
*
and AXP813
have polyphase regulators.
*/
*/
switch
(
axp20x
->
variant
)
{
switch
(
axp20x
->
variant
)
{
case
AXP803_ID
:
case
AXP803_ID
:
case
AXP813_ID
:
regmap_read
(
axp20x
->
regmap
,
AXP803_POLYPHASE_CTRL
,
&
reg
);
regmap_read
(
axp20x
->
regmap
,
AXP803_POLYPHASE_CTRL
,
&
reg
);
switch
(
id
)
{
switch
(
id
)
{
...
@@ -656,6 +730,12 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
...
@@ -656,6 +730,12 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
regulators
=
axp809_regulators
;
regulators
=
axp809_regulators
;
nregulators
=
AXP809_REG_ID_MAX
;
nregulators
=
AXP809_REG_ID_MAX
;
break
;
break
;
case
AXP813_ID
:
regulators
=
axp813_regulators
;
nregulators
=
AXP813_REG_ID_MAX
;
drivevbus
=
of_property_read_bool
(
pdev
->
dev
.
parent
->
of_node
,
"x-powers,drive-vbus-en"
);
break
;
default:
default:
dev_err
(
&
pdev
->
dev
,
"Unsupported AXP variant: %ld
\n
"
,
dev_err
(
&
pdev
->
dev
,
"Unsupported AXP variant: %ld
\n
"
,
axp20x
->
variant
);
axp20x
->
variant
);
...
@@ -677,6 +757,10 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
...
@@ -677,6 +757,10 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
if
(
axp20x_is_polyphase_slave
(
axp20x
,
i
))
if
(
axp20x_is_polyphase_slave
(
axp20x
,
i
))
continue
;
continue
;
/* Support for AXP813's FLDO3 is not implemented */
if
(
axp20x
->
variant
==
AXP813_ID
&&
i
==
AXP813_FLDO3
)
continue
;
/*
/*
* Regulators DC1SW and DC5LDO are connected internally,
* Regulators DC1SW and DC5LDO are connected internally,
* so we have to handle their supply names separately.
* so we have to handle their supply names separately.
...
...
include/linux/mfd/axp20x.h
View file @
28c426c7
...
@@ -131,6 +131,9 @@ enum axp20x_variants {
...
@@ -131,6 +131,9 @@ enum axp20x_variants {
#define AXP803_DCDC6_V_OUT 0x25
#define AXP803_DCDC6_V_OUT 0x25
#define AXP803_DCDC_FREQ_CTRL 0x3b
#define AXP803_DCDC_FREQ_CTRL 0x3b
/* Other DCDC regulator control registers are the same as AXP803 */
#define AXP813_DCDC7_V_OUT 0x26
/* Interrupt */
/* Interrupt */
#define AXP152_IRQ1_EN 0x40
#define AXP152_IRQ1_EN 0x40
#define AXP152_IRQ2_EN 0x41
#define AXP152_IRQ2_EN 0x41
...
...
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