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
c7b09482
Commit
c7b09482
authored
Feb 19, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'regulator/topic/lp8788' into regulator-next
parents
800d2901
e69995d3
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
46 additions
and
128 deletions
+46
-128
drivers/regulator/lp8788-buck.c
drivers/regulator/lp8788-buck.c
+18
-23
drivers/regulator/lp8788-ldo.c
drivers/regulator/lp8788-ldo.c
+28
-105
No files found.
drivers/regulator/lp8788-buck.c
View file @
c7b09482
...
...
@@ -103,16 +103,6 @@ static const int lp8788_buck_vtbl[] = {
1950000
,
2000000
,
};
static
const
u8
buck1_vout_addr
[]
=
{
LP8788_BUCK1_VOUT0
,
LP8788_BUCK1_VOUT1
,
LP8788_BUCK1_VOUT2
,
LP8788_BUCK1_VOUT3
,
};
static
const
u8
buck2_vout_addr
[]
=
{
LP8788_BUCK2_VOUT0
,
LP8788_BUCK2_VOUT1
,
LP8788_BUCK2_VOUT2
,
LP8788_BUCK2_VOUT3
,
};
static
void
lp8788_buck1_set_dvs
(
struct
lp8788_buck
*
buck
)
{
struct
lp8788_buck1_dvs
*
dvs
=
(
struct
lp8788_buck1_dvs
*
)
buck
->
dvs
;
...
...
@@ -235,7 +225,7 @@ static u8 lp8788_select_buck_vout_addr(struct lp8788_buck *buck,
lp8788_read_byte
(
buck
->
lp
,
LP8788_BUCK_DVS_SEL
,
&
val
);
idx
=
(
val
&
LP8788_BUCK1_DVS_M
)
>>
LP8788_BUCK1_DVS_S
;
}
addr
=
buck1_vout_addr
[
idx
]
;
addr
=
LP8788_BUCK1_VOUT0
+
idx
;
break
;
case
BUCK2
:
if
(
mode
==
EXTPIN
)
{
...
...
@@ -258,7 +248,7 @@ static u8 lp8788_select_buck_vout_addr(struct lp8788_buck *buck,
lp8788_read_byte
(
buck
->
lp
,
LP8788_BUCK_DVS_SEL
,
&
val
);
idx
=
(
val
&
LP8788_BUCK2_DVS_M
)
>>
LP8788_BUCK2_DVS_S
;
}
addr
=
buck2_vout_addr
[
idx
]
;
addr
=
LP8788_BUCK2_VOUT0
+
idx
;
break
;
default:
goto
err
;
...
...
@@ -429,7 +419,8 @@ static struct regulator_desc lp8788_buck_desc[] = {
},
};
static
int
lp8788_dvs_gpio_request
(
struct
lp8788_buck
*
buck
,
static
int
lp8788_dvs_gpio_request
(
struct
platform_device
*
pdev
,
struct
lp8788_buck
*
buck
,
enum
lp8788_buck_id
id
)
{
struct
lp8788_platform_data
*
pdata
=
buck
->
lp
->
pdata
;
...
...
@@ -440,7 +431,7 @@ static int lp8788_dvs_gpio_request(struct lp8788_buck *buck,
switch
(
id
)
{
case
BUCK1
:
gpio
=
pdata
->
buck1_dvs
->
gpio
;
ret
=
devm_gpio_request_one
(
buck
->
lp
->
dev
,
gpio
,
DVS_LOW
,
ret
=
devm_gpio_request_one
(
&
pdev
->
dev
,
gpio
,
DVS_LOW
,
b1_name
);
if
(
ret
)
return
ret
;
...
...
@@ -448,9 +439,9 @@ static int lp8788_dvs_gpio_request(struct lp8788_buck *buck,
buck
->
dvs
=
pdata
->
buck1_dvs
;
break
;
case
BUCK2
:
for
(
i
=
0
;
i
<
LP8788_NUM_BUCK2_DVS
;
i
++
)
{
for
(
i
=
0
;
i
<
LP8788_NUM_BUCK2_DVS
;
i
++
)
{
gpio
=
pdata
->
buck2_dvs
->
gpio
[
i
];
ret
=
devm_gpio_request_one
(
buck
->
lp
->
dev
,
gpio
,
ret
=
devm_gpio_request_one
(
&
pdev
->
dev
,
gpio
,
DVS_LOW
,
b2_name
[
i
]);
if
(
ret
)
return
ret
;
...
...
@@ -464,7 +455,8 @@ static int lp8788_dvs_gpio_request(struct lp8788_buck *buck,
return
0
;
}
static
int
lp8788_init_dvs
(
struct
lp8788_buck
*
buck
,
enum
lp8788_buck_id
id
)
static
int
lp8788_init_dvs
(
struct
platform_device
*
pdev
,
struct
lp8788_buck
*
buck
,
enum
lp8788_buck_id
id
)
{
struct
lp8788_platform_data
*
pdata
=
buck
->
lp
->
pdata
;
u8
mask
[]
=
{
LP8788_BUCK1_DVS_SEL_M
,
LP8788_BUCK2_DVS_SEL_M
};
...
...
@@ -472,7 +464,7 @@ static int lp8788_init_dvs(struct lp8788_buck *buck, enum lp8788_buck_id id)
u8
default_dvs_mode
[]
=
{
LP8788_BUCK1_DVS_I2C
,
LP8788_BUCK2_DVS_I2C
};
/* no dvs for buck3, 4 */
if
(
id
==
BUCK3
||
id
==
BUCK4
)
if
(
id
>
BUCK2
)
return
0
;
/* no dvs platform data, then dvs will be selected by I2C registers */
...
...
@@ -483,7 +475,7 @@ static int lp8788_init_dvs(struct lp8788_buck *buck, enum lp8788_buck_id id)
(
id
==
BUCK2
&&
!
pdata
->
buck2_dvs
))
goto
set_default_dvs_mode
;
if
(
lp8788_dvs_gpio_request
(
buck
,
id
))
if
(
lp8788_dvs_gpio_request
(
pdev
,
buck
,
id
))
goto
set_default_dvs_mode
;
return
lp8788_update_bits
(
buck
->
lp
,
LP8788_BUCK_DVS_SEL
,
mask
[
id
],
...
...
@@ -503,17 +495,20 @@ static int lp8788_buck_probe(struct platform_device *pdev)
struct
regulator_dev
*
rdev
;
int
ret
;
buck
=
devm_kzalloc
(
lp
->
dev
,
sizeof
(
struct
lp8788_buck
),
GFP_KERNEL
);
if
(
id
>=
LP8788_NUM_BUCKS
)
return
-
EINVAL
;
buck
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
struct
lp8788_buck
),
GFP_KERNEL
);
if
(
!
buck
)
return
-
ENOMEM
;
buck
->
lp
=
lp
;
ret
=
lp8788_init_dvs
(
buck
,
id
);
ret
=
lp8788_init_dvs
(
pdev
,
buck
,
id
);
if
(
ret
)
return
ret
;
cfg
.
dev
=
lp
->
dev
;
cfg
.
dev
=
pdev
->
dev
.
parent
;
cfg
.
init_data
=
lp
->
pdata
?
lp
->
pdata
->
buck_data
[
id
]
:
NULL
;
cfg
.
driver_data
=
buck
;
cfg
.
regmap
=
lp
->
regmap
;
...
...
@@ -521,7 +516,7 @@ static int lp8788_buck_probe(struct platform_device *pdev)
rdev
=
regulator_register
(
&
lp8788_buck_desc
[
id
],
&
cfg
);
if
(
IS_ERR
(
rdev
))
{
ret
=
PTR_ERR
(
rdev
);
dev_err
(
lp
->
dev
,
"BUCK%d regulator register err = %d
\n
"
,
dev_err
(
&
pdev
->
dev
,
"BUCK%d regulator register err = %d
\n
"
,
id
+
1
,
ret
);
return
ret
;
}
...
...
drivers/regulator/lp8788-ldo.c
View file @
c7b09482
...
...
@@ -88,11 +88,6 @@
#define ENABLE GPIOF_OUT_INIT_HIGH
#define DISABLE GPIOF_OUT_INIT_LOW
enum
lp8788_enable_mode
{
REGISTER
,
EXTPIN
,
};
enum
lp8788_ldo_id
{
DLDO1
,
DLDO2
,
...
...
@@ -189,114 +184,38 @@ static enum lp8788_ldo_id lp8788_aldo_id[] = {
ALDO10
,
};
/* DLDO 7, 9 and 11, ALDO 1 ~ 5 and 7
: can be enabled either by external pin or by i2c register */
static
enum
lp8788_enable_mode
lp8788_get_ldo_enable_mode
(
struct
lp8788_ldo
*
ldo
,
enum
lp8788_ldo_id
id
)
{
int
ret
;
u8
val
,
mask
;
ret
=
lp8788_read_byte
(
ldo
->
lp
,
LP8788_EN_SEL
,
&
val
);
if
(
ret
)
return
ret
;
switch
(
id
)
{
case
DLDO7
:
mask
=
LP8788_EN_SEL_DLDO7_M
;
break
;
case
DLDO9
:
case
DLDO11
:
mask
=
LP8788_EN_SEL_DLDO911_M
;
break
;
case
ALDO1
:
mask
=
LP8788_EN_SEL_ALDO1_M
;
break
;
case
ALDO2
...
ALDO4
:
mask
=
LP8788_EN_SEL_ALDO234_M
;
break
;
case
ALDO5
:
mask
=
LP8788_EN_SEL_ALDO5_M
;
break
;
case
ALDO7
:
mask
=
LP8788_EN_SEL_ALDO7_M
;
break
;
default:
return
REGISTER
;
}
return
val
&
mask
?
EXTPIN
:
REGISTER
;
}
static
int
lp8788_ldo_ctrl_by_extern_pin
(
struct
lp8788_ldo
*
ldo
,
int
pinstate
)
{
struct
lp8788_ldo_enable_pin
*
pin
=
ldo
->
en_pin
;
if
(
!
pin
)
return
-
EINVAL
;
if
(
gpio_is_valid
(
pin
->
gpio
))
gpio_set_value
(
pin
->
gpio
,
pinstate
);
return
0
;
}
static
int
lp8788_ldo_is_enabled_by_extern_pin
(
struct
lp8788_ldo
*
ldo
)
{
struct
lp8788_ldo_enable_pin
*
pin
=
ldo
->
en_pin
;
if
(
!
pin
)
return
-
EINVAL
;
return
gpio_get_value
(
pin
->
gpio
)
?
1
:
0
;
}
static
int
lp8788_ldo_enable
(
struct
regulator_dev
*
rdev
)
{
struct
lp8788_ldo
*
ldo
=
rdev_get_drvdata
(
rdev
);
enum
lp8788_ldo_id
id
=
rdev_get_id
(
rdev
);
enum
lp8788_enable_mode
mode
=
lp8788_get_ldo_enable_mode
(
ldo
,
id
);
switch
(
mode
)
{
case
EXTPIN
:
return
lp8788_ldo_ctrl_by_extern_pin
(
ldo
,
ENABLE
)
;
case
REGISTER
:
if
(
ldo
->
en_pin
)
{
gpio_set_value
(
ldo
->
en_pin
->
gpio
,
ENABLE
);
return
0
;
}
else
{
return
regulator_enable_regmap
(
rdev
);
default:
return
-
EINVAL
;
}
}
static
int
lp8788_ldo_disable
(
struct
regulator_dev
*
rdev
)
{
struct
lp8788_ldo
*
ldo
=
rdev_get_drvdata
(
rdev
);
enum
lp8788_ldo_id
id
=
rdev_get_id
(
rdev
);
enum
lp8788_enable_mode
mode
=
lp8788_get_ldo_enable_mode
(
ldo
,
id
);
switch
(
mode
)
{
case
EXTPIN
:
return
lp8788_ldo_ctrl_by_extern_pin
(
ldo
,
DISABLE
)
;
case
REGISTER
:
if
(
ldo
->
en_pin
)
{
gpio_set_value
(
ldo
->
en_pin
->
gpio
,
DISABLE
);
return
0
;
}
else
{
return
regulator_disable_regmap
(
rdev
);
default:
return
-
EINVAL
;
}
}
static
int
lp8788_ldo_is_enabled
(
struct
regulator_dev
*
rdev
)
{
struct
lp8788_ldo
*
ldo
=
rdev_get_drvdata
(
rdev
);
enum
lp8788_ldo_id
id
=
rdev_get_id
(
rdev
);
enum
lp8788_enable_mode
mode
=
lp8788_get_ldo_enable_mode
(
ldo
,
id
);
switch
(
mode
)
{
case
EXTPIN
:
return
lp8788_ldo_is_enabled_by_extern_pin
(
ldo
);
case
REGISTER
:
if
(
ldo
->
en_pin
)
return
gpio_get_value
(
ldo
->
en_pin
->
gpio
)
?
1
:
0
;
else
return
regulator_is_enabled_regmap
(
rdev
);
default:
return
-
EINVAL
;
}
}
static
int
lp8788_ldo_enable_time
(
struct
regulator_dev
*
rdev
)
...
...
@@ -616,10 +535,11 @@ static struct regulator_desc lp8788_aldo_desc[] = {
},
};
static
int
lp8788_gpio_request_ldo_en
(
struct
lp8788_ldo
*
ldo
,
static
int
lp8788_gpio_request_ldo_en
(
struct
platform_device
*
pdev
,
struct
lp8788_ldo
*
ldo
,
enum
lp8788_ext_ldo_en_id
id
)
{
struct
device
*
dev
=
ldo
->
lp
->
dev
;
struct
device
*
dev
=
&
pdev
->
dev
;
struct
lp8788_ldo_enable_pin
*
pin
=
ldo
->
en_pin
;
int
ret
,
gpio
,
pinstate
;
char
*
name
[]
=
{
...
...
@@ -647,7 +567,8 @@ static int lp8788_gpio_request_ldo_en(struct lp8788_ldo *ldo,
return
ret
;
}
static
int
lp8788_config_ldo_enable_mode
(
struct
lp8788_ldo
*
ldo
,
static
int
lp8788_config_ldo_enable_mode
(
struct
platform_device
*
pdev
,
struct
lp8788_ldo
*
ldo
,
enum
lp8788_ldo_id
id
)
{
int
ret
;
...
...
@@ -693,9 +614,11 @@ static int lp8788_config_ldo_enable_mode(struct lp8788_ldo *ldo,
ldo
->
en_pin
=
pdata
->
ldo_pin
[
enable_id
];
ret
=
lp8788_gpio_request_ldo_en
(
ldo
,
enable_id
);
if
(
ret
)
ret
=
lp8788_gpio_request_ldo_en
(
pdev
,
ldo
,
enable_id
);
if
(
ret
)
{
ldo
->
en_pin
=
NULL
;
goto
set_default_ldo_enable_mode
;
}
return
ret
;
...
...
@@ -712,16 +635,16 @@ static int lp8788_dldo_probe(struct platform_device *pdev)
struct
regulator_dev
*
rdev
;
int
ret
;
ldo
=
devm_kzalloc
(
lp
->
dev
,
sizeof
(
struct
lp8788_ldo
),
GFP_KERNEL
);
ldo
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
struct
lp8788_ldo
),
GFP_KERNEL
);
if
(
!
ldo
)
return
-
ENOMEM
;
ldo
->
lp
=
lp
;
ret
=
lp8788_config_ldo_enable_mode
(
ldo
,
lp8788_dldo_id
[
id
]);
ret
=
lp8788_config_ldo_enable_mode
(
pdev
,
ldo
,
lp8788_dldo_id
[
id
]);
if
(
ret
)
return
ret
;
cfg
.
dev
=
lp
->
dev
;
cfg
.
dev
=
pdev
->
dev
.
parent
;
cfg
.
init_data
=
lp
->
pdata
?
lp
->
pdata
->
dldo_data
[
id
]
:
NULL
;
cfg
.
driver_data
=
ldo
;
cfg
.
regmap
=
lp
->
regmap
;
...
...
@@ -729,7 +652,7 @@ static int lp8788_dldo_probe(struct platform_device *pdev)
rdev
=
regulator_register
(
&
lp8788_dldo_desc
[
id
],
&
cfg
);
if
(
IS_ERR
(
rdev
))
{
ret
=
PTR_ERR
(
rdev
);
dev_err
(
lp
->
dev
,
"DLDO%d regulator register err = %d
\n
"
,
dev_err
(
&
pdev
->
dev
,
"DLDO%d regulator register err = %d
\n
"
,
id
+
1
,
ret
);
return
ret
;
}
...
...
@@ -768,16 +691,16 @@ static int lp8788_aldo_probe(struct platform_device *pdev)
struct
regulator_dev
*
rdev
;
int
ret
;
ldo
=
devm_kzalloc
(
lp
->
dev
,
sizeof
(
struct
lp8788_ldo
),
GFP_KERNEL
);
ldo
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
struct
lp8788_ldo
),
GFP_KERNEL
);
if
(
!
ldo
)
return
-
ENOMEM
;
ldo
->
lp
=
lp
;
ret
=
lp8788_config_ldo_enable_mode
(
ldo
,
lp8788_aldo_id
[
id
]);
ret
=
lp8788_config_ldo_enable_mode
(
pdev
,
ldo
,
lp8788_aldo_id
[
id
]);
if
(
ret
)
return
ret
;
cfg
.
dev
=
lp
->
dev
;
cfg
.
dev
=
pdev
->
dev
.
parent
;
cfg
.
init_data
=
lp
->
pdata
?
lp
->
pdata
->
aldo_data
[
id
]
:
NULL
;
cfg
.
driver_data
=
ldo
;
cfg
.
regmap
=
lp
->
regmap
;
...
...
@@ -785,7 +708,7 @@ static int lp8788_aldo_probe(struct platform_device *pdev)
rdev
=
regulator_register
(
&
lp8788_aldo_desc
[
id
],
&
cfg
);
if
(
IS_ERR
(
rdev
))
{
ret
=
PTR_ERR
(
rdev
);
dev_err
(
lp
->
dev
,
"ALDO%d regulator register err = %d
\n
"
,
dev_err
(
&
pdev
->
dev
,
"ALDO%d regulator register err = %d
\n
"
,
id
+
1
,
ret
);
return
ret
;
}
...
...
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