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
d1c3f7ca
Commit
d1c3f7ca
authored
Sep 28, 2014
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'regulator/topic/pwm' into regulator-drivers
Conflicts: drivers/regulator/Kconfig
parents
6a642509
fbf79744
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
232 additions
and
7 deletions
+232
-7
Documentation/devicetree/bindings/regulator/pwm-regulator.txt
...mentation/devicetree/bindings/regulator/pwm-regulator.txt
+27
-0
drivers/regulator/Kconfig
drivers/regulator/Kconfig
+7
-6
drivers/regulator/Makefile
drivers/regulator/Makefile
+1
-1
drivers/regulator/pwm-regulator.c
drivers/regulator/pwm-regulator.c
+197
-0
No files found.
Documentation/devicetree/bindings/regulator/pwm-regulator.txt
0 → 100644
View file @
d1c3f7ca
pwm regulator bindings
Required properties:
- compatible: Should be "pwm-regulator"
- pwms: OF device-tree PWM specification (see PWM binding pwm.txt)
- voltage-table: voltage and duty table, include 2 members in each set of
brackets, first one is voltage(unit: uv), the next is duty(unit: percent)
Any property defined as part of the core regulator binding defined in
regulator.txt can also be used.
Example:
pwm_regulator {
compatible = "pwm-regulator;
pwms = <&pwm1 0 8448 0>;
voltage-table = <1114000 0>,
<1095000 10>,
<1076000 20>,
<1056000 30>,
<1036000 40>,
<1016000 50>;
regulator-min-microvolt = <1016000>;
regulator-max-microvolt = <1114000>;
regulator-name = "vdd_logic";
};
drivers/regulator/Kconfig
View file @
d1c3f7ca
...
...
@@ -449,6 +449,13 @@ config REGULATOR_PFUZE100
Say y here to support the regulators found on the Freescale
PFUZE100/PFUZE200 PMIC.
config REGULATOR_PWM
tristate "PWM voltage regulator"
depends on PWM
help
This driver supports PWM controlled voltage regulators. PWM
duty cycle can increase or decrease the voltage.
config REGULATOR_QCOM_RPM
tristate "Qualcomm RPM regulator driver"
depends on MFD_QCOM_RPM
...
...
@@ -495,12 +502,6 @@ config REGULATOR_S5M8767
via I2C bus. S5M8767A have 9 Bucks and 28 LDOs output and
supports DVS mode with 8bits of output voltage control.
config REGULATOR_ST_PWM
tristate "STMicroelectronics PWM voltage regulator"
depends on ARCH_STI
help
This driver supports ST's PWM controlled voltage regulators.
config REGULATOR_TI_ABB
tristate "TI Adaptive Body Bias on-chip LDO"
depends on ARCH_OMAP
...
...
drivers/regulator/Makefile
View file @
d1c3f7ca
...
...
@@ -58,6 +58,7 @@ obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o
obj-$(CONFIG_REGULATOR_QCOM_RPM)
+=
qcom_rpm-regulator.o
obj-$(CONFIG_REGULATOR_PALMAS)
+=
palmas-regulator.o
obj-$(CONFIG_REGULATOR_PFUZE100)
+=
pfuze100-regulator.o
obj-$(CONFIG_REGULATOR_PWM)
+=
pwm-regulator.o
obj-$(CONFIG_REGULATOR_TPS51632)
+=
tps51632-regulator.o
obj-$(CONFIG_REGULATOR_PBIAS)
+=
pbias-regulator.o
obj-$(CONFIG_REGULATOR_PCAP)
+=
pcap-regulator.o
...
...
@@ -66,7 +67,6 @@ obj-$(CONFIG_REGULATOR_RC5T583) += rc5t583-regulator.o
obj-$(CONFIG_REGULATOR_S2MPA01)
+=
s2mpa01.o
obj-$(CONFIG_REGULATOR_S2MPS11)
+=
s2mps11.o
obj-$(CONFIG_REGULATOR_S5M8767)
+=
s5m8767.o
obj-$(CONFIG_REGULATOR_ST_PWM)
+=
st-pwm.o
obj-$(CONFIG_REGULATOR_STW481X_VMMC)
+=
stw481x-vmmc.o
obj-$(CONFIG_REGULATOR_TI_ABB)
+=
ti-abb-regulator.o
obj-$(CONFIG_REGULATOR_TPS6105X)
+=
tps6105x-regulator.o
...
...
drivers/regulator/
st-pwm
.c
→
drivers/regulator/
pwm-regulator
.c
View file @
d1c3f7ca
/*
* Regulator driver for
ST's
PWM Regulators
* Regulator driver for PWM Regulators
*
* Copyright (C) 2014 - STMicroelectronics Inc.
*
...
...
@@ -20,43 +20,40 @@
#include <linux/of_device.h>
#include <linux/pwm.h>
#define ST_PWM_REG_PERIOD 8448
struct
st_pwm_regulator_pdata
{
const
struct
regulator_desc
*
desc
;
struct
st_pwm_voltages
*
duty_cycle_table
;
};
struct
st_pwm_regulator_data
{
const
struct
st_pwm_regulator_pdata
*
pdata
;
struct
pwm_regulator_data
{
struct
regulator_desc
desc
;
struct
pwm_voltages
*
duty_cycle_table
;
struct
pwm_device
*
pwm
;
bool
enabled
;
int
state
;
};
struct
st_
pwm_voltages
{
struct
pwm_voltages
{
unsigned
int
uV
;
unsigned
int
dutycycle
;
};
static
int
st_
pwm_regulator_get_voltage_sel
(
struct
regulator_dev
*
dev
)
static
int
pwm_regulator_get_voltage_sel
(
struct
regulator_dev
*
dev
)
{
struct
st_
pwm_regulator_data
*
drvdata
=
rdev_get_drvdata
(
dev
);
struct
pwm_regulator_data
*
drvdata
=
rdev_get_drvdata
(
dev
);
return
drvdata
->
state
;
}
static
int
st_
pwm_regulator_set_voltage_sel
(
struct
regulator_dev
*
dev
,
unsigned
selector
)
static
int
pwm_regulator_set_voltage_sel
(
struct
regulator_dev
*
dev
,
unsigned
selector
)
{
struct
st_pwm_regulator_data
*
drvdata
=
rdev_get_drvdata
(
dev
);
struct
pwm_regulator_data
*
drvdata
=
rdev_get_drvdata
(
dev
);
unsigned
int
pwm_reg_period
;
int
dutycycle
;
int
ret
;
dutycycle
=
(
ST_PWM_REG_PERIOD
/
100
)
*
drvdata
->
pdata
->
duty_cycle_table
[
selector
].
dutycycle
;
pwm_reg_period
=
pwm_get_period
(
drvdata
->
pwm
);
ret
=
pwm_config
(
drvdata
->
pwm
,
dutycycle
,
ST_PWM_REG_PERIOD
);
dutycycle
=
(
pwm_reg_period
*
drvdata
->
duty_cycle_table
[
selector
].
dutycycle
)
/
100
;
ret
=
pwm_config
(
drvdata
->
pwm
,
dutycycle
,
pwm_reg_period
);
if
(
ret
)
{
dev_err
(
&
dev
->
dev
,
"Failed to configure PWM
\n
"
);
return
ret
;
...
...
@@ -76,61 +73,40 @@ static int st_pwm_regulator_set_voltage_sel(struct regulator_dev *dev,
return
0
;
}
static
int
st_
pwm_regulator_list_voltage
(
struct
regulator_dev
*
dev
,
unsigned
selector
)
static
int
pwm_regulator_list_voltage
(
struct
regulator_dev
*
dev
,
unsigned
selector
)
{
struct
st_
pwm_regulator_data
*
drvdata
=
rdev_get_drvdata
(
dev
);
struct
pwm_regulator_data
*
drvdata
=
rdev_get_drvdata
(
dev
);
if
(
selector
>=
d
ev
->
desc
->
n_voltages
)
if
(
selector
>=
d
rvdata
->
desc
.
n_voltages
)
return
-
EINVAL
;
return
drvdata
->
pdata
->
duty_cycle_table
[
selector
].
uV
;
return
drvdata
->
duty_cycle_table
[
selector
].
uV
;
}
static
struct
regulator_ops
st_
pwm_regulator_voltage_ops
=
{
.
set_voltage_sel
=
st_
pwm_regulator_set_voltage_sel
,
.
get_voltage_sel
=
st_
pwm_regulator_get_voltage_sel
,
.
list_voltage
=
st_
pwm_regulator_list_voltage
,
static
struct
regulator_ops
pwm_regulator_voltage_ops
=
{
.
set_voltage_sel
=
pwm_regulator_set_voltage_sel
,
.
get_voltage_sel
=
pwm_regulator_get_voltage_sel
,
.
list_voltage
=
pwm_regulator_list_voltage
,
.
map_voltage
=
regulator_map_voltage_iterate
,
};
static
struct
st_pwm_voltages
b2105_duty_cycle_table
[]
=
{
{
.
uV
=
1114000
,
.
dutycycle
=
0
,
},
{
.
uV
=
1095000
,
.
dutycycle
=
10
,
},
{
.
uV
=
1076000
,
.
dutycycle
=
20
,
},
{
.
uV
=
1056000
,
.
dutycycle
=
30
,
},
{
.
uV
=
1036000
,
.
dutycycle
=
40
,
},
{
.
uV
=
1016000
,
.
dutycycle
=
50
,
},
/* WARNING: Values above 50% duty-cycle cause boot failures. */
};
static
const
struct
regulator_desc
b2105_desc
=
{
.
name
=
"b2105-pwm-regulator"
,
.
ops
=
&
st_pwm_regulator_voltage_ops
,
static
const
struct
regulator_desc
pwm_regulator_desc
=
{
.
name
=
"pwm-regulator"
,
.
ops
=
&
pwm_regulator_voltage_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
b2105_duty_cycle_table
),
.
supply_name
=
"pwm"
,
};
static
const
struct
st_pwm_regulator_pdata
b2105_info
=
{
.
desc
=
&
b2105_desc
,
.
duty_cycle_table
=
b2105_duty_cycle_table
,
};
static
const
struct
of_device_id
st_pwm_of_match
[]
=
{
{
.
compatible
=
"st,b2105-pwm-regulator"
,
.
data
=
&
b2105_info
,
},
{
},
};
MODULE_DEVICE_TABLE
(
of
,
st_pwm_of_match
);
static
int
st_pwm_regulator_probe
(
struct
platform_device
*
pdev
)
static
int
pwm_regulator_probe
(
struct
platform_device
*
pdev
)
{
struct
st_pwm_regulator_data
*
drvdata
;
struct
pwm_regulator_data
*
drvdata
;
struct
property
*
prop
;
struct
regulator_dev
*
regulator
;
struct
regulator_config
config
=
{
};
struct
device_node
*
np
=
pdev
->
dev
.
of_node
;
const
struct
of_device_id
*
of_match
;
int
length
,
ret
;
if
(
!
np
)
{
dev_err
(
&
pdev
->
dev
,
"Device Tree node missing
\n
"
);
...
...
@@ -141,12 +117,37 @@ static int st_pwm_regulator_probe(struct platform_device *pdev)
if
(
!
drvdata
)
return
-
ENOMEM
;
of_match
=
of_match_device
(
st_pwm_of_match
,
&
pdev
->
dev
);
if
(
!
of_match
)
{
dev_err
(
&
pdev
->
dev
,
"failed to match of device
\n
"
);
return
-
ENODEV
;
memcpy
(
&
drvdata
->
desc
,
&
pwm_regulator_desc
,
sizeof
(
pwm_regulator_desc
));
/* determine the number of voltage-table */
prop
=
of_find_property
(
np
,
"voltage-table"
,
&
length
);
if
(
!
prop
)
{
dev_err
(
&
pdev
->
dev
,
"No voltage-table
\n
"
);
return
-
EINVAL
;
}
if
((
length
<
sizeof
(
*
drvdata
->
duty_cycle_table
))
||
(
length
%
sizeof
(
*
drvdata
->
duty_cycle_table
)))
{
dev_err
(
&
pdev
->
dev
,
"voltage-table length(%d) is invalid
\n
"
,
length
);
return
-
EINVAL
;
}
drvdata
->
desc
.
n_voltages
=
length
/
sizeof
(
*
drvdata
->
duty_cycle_table
);
drvdata
->
duty_cycle_table
=
devm_kzalloc
(
&
pdev
->
dev
,
length
,
GFP_KERNEL
);
if
(
!
drvdata
->
duty_cycle_table
)
return
-
ENOMEM
;
/* read voltage table from DT property */
ret
=
of_property_read_u32_array
(
np
,
"voltage-table"
,
(
u32
*
)
drvdata
->
duty_cycle_table
,
length
/
sizeof
(
u32
));
if
(
ret
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"read voltage-table failed
\n
"
);
return
ret
;
}
drvdata
->
pdata
=
of_match
->
data
;
config
.
init_data
=
of_get_regulator_init_data
(
&
pdev
->
dev
,
np
);
if
(
!
config
.
init_data
)
...
...
@@ -163,28 +164,34 @@ static int st_pwm_regulator_probe(struct platform_device *pdev)
}
regulator
=
devm_regulator_register
(
&
pdev
->
dev
,
drvdata
->
p
data
->
desc
,
&
config
);
&
drv
data
->
desc
,
&
config
);
if
(
IS_ERR
(
regulator
))
{
dev_err
(
&
pdev
->
dev
,
"Failed to register regulator %s
\n
"
,
drvdata
->
pdata
->
desc
->
name
);
drvdata
->
desc
.
name
);
return
PTR_ERR
(
regulator
);
}
return
0
;
}
static
struct
platform_driver
st_pwm_regulator_driver
=
{
static
const
struct
of_device_id
pwm_of_match
[]
=
{
{
.
compatible
=
"pwm-regulator"
},
{
},
};
MODULE_DEVICE_TABLE
(
of
,
pwm_of_match
);
static
struct
platform_driver
pwm_regulator_driver
=
{
.
driver
=
{
.
name
=
"
st-
pwm-regulator"
,
.
name
=
"pwm-regulator"
,
.
owner
=
THIS_MODULE
,
.
of_match_table
=
of_match_ptr
(
st_
pwm_of_match
),
.
of_match_table
=
of_match_ptr
(
pwm_of_match
),
},
.
probe
=
st_
pwm_regulator_probe
,
.
probe
=
pwm_regulator_probe
,
};
module_platform_driver
(
st_
pwm_regulator_driver
);
module_platform_driver
(
pwm_regulator_driver
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Lee Jones <lee.jones@linaro.org>"
);
MODULE_DESCRIPTION
(
"
ST
PWM Regulator Driver"
);
MODULE_ALIAS
(
"platform:
st_
pwm-regulator"
);
MODULE_DESCRIPTION
(
"PWM Regulator Driver"
);
MODULE_ALIAS
(
"platform:pwm-regulator"
);
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