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
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