summaryrefslogtreecommitdiffstats
path: root/drivers/regulator
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/regulator')
-rw-r--r--drivers/regulator/Kconfig316
-rw-r--r--drivers/regulator/Makefile47
-rw-r--r--drivers/regulator/aat2870-regulator.c14
-rw-r--r--drivers/regulator/ab8500.c10
-rw-r--r--drivers/regulator/ad5398.c4
-rw-r--r--drivers/regulator/anatop-regulator.c241
-rw-r--r--drivers/regulator/core.c175
-rw-r--r--drivers/regulator/da903x.c12
-rw-r--r--drivers/regulator/fixed-helper.c53
-rw-r--r--drivers/regulator/fixed.c4
-rw-r--r--drivers/regulator/isl6271a-regulator.c14
-rw-r--r--drivers/regulator/max1586.c4
-rw-r--r--drivers/regulator/max8649.c7
-rw-r--r--drivers/regulator/max8660.c16
-rw-r--r--drivers/regulator/max8925-regulator.c4
-rw-r--r--drivers/regulator/max8997.c29
-rw-r--r--drivers/regulator/max8998.c16
-rw-r--r--drivers/regulator/mc13783-regulator.c3
-rw-r--r--drivers/regulator/pcf50633-regulator.c27
-rw-r--r--drivers/regulator/s5m8767.c130
-rw-r--r--drivers/regulator/tps62360-regulator.c2
-rw-r--r--drivers/regulator/tps65023-regulator.c4
-rw-r--r--drivers/regulator/tps6507x-regulator.c283
-rw-r--r--drivers/regulator/tps65217-regulator.c271
-rw-r--r--drivers/regulator/tps6524x-regulator.c4
-rw-r--r--drivers/regulator/tps6586x-regulator.c2
-rw-r--r--drivers/regulator/tps65910-regulator.c126
-rw-r--r--drivers/regulator/tps65912-regulator.c340
-rw-r--r--drivers/regulator/wm8350-regulator.c2
-rw-r--r--drivers/regulator/wm8400-regulator.c6
-rw-r--r--drivers/regulator/wm8994-regulator.c4
31 files changed, 1045 insertions, 1125 deletions
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 376824b865a4..a229de98ae6f 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -74,13 +74,72 @@ config REGULATOR_GPIO
and the platform has to provide a mapping of GPIO-states
to target volts/amps.
-config REGULATOR_BQ24022
- tristate "TI bq24022 Dual Input 1-Cell Li-Ion Charger IC"
+config REGULATOR_AD5398
+ tristate "Analog Devices AD5398/AD5821 regulators"
+ depends on I2C
help
- This driver controls a TI bq24022 Charger attached via
- GPIOs. The provided current regulator can enable/disable
- charging select between 100 mA and 500 mA charging current
- limit.
+ This driver supports AD5398 and AD5821 current regulator chips.
+ If building into module, its name is ad5398.ko.
+
+config REGULATOR_AAT2870
+ tristate "AnalogicTech AAT2870 Regulators"
+ depends on MFD_AAT2870_CORE
+ help
+ If you have a AnalogicTech AAT2870 say Y to enable the
+ regulator driver.
+
+config REGULATOR_DA903X
+ tristate "Dialog Semiconductor DA9030/DA9034 regulators"
+ depends on PMIC_DA903X
+ help
+ Say y here to support the BUCKs and LDOs regulators found on
+ Dialog Semiconductor DA9030/DA9034 PMIC.
+
+config REGULATOR_DA9052
+ tristate "Dialog Semiconductor DA9052/DA9053 regulators"
+ depends on PMIC_DA9052
+ help
+ This driver supports the voltage regulators of DA9052-BC and
+ DA9053-AA/Bx PMIC.
+
+config REGULATOR_ANATOP
+ tristate "Freescale i.MX on-chip ANATOP LDO regulators"
+ depends on MFD_ANATOP
+ help
+ Say y here to support Freescale i.MX on-chip ANATOP LDOs
+ regulators. It is recommended that this option be
+ enabled on i.MX6 platform.
+
+config REGULATOR_MC13XXX_CORE
+ tristate
+
+config REGULATOR_MC13783
+ tristate "Freescale MC13783 regulator driver"
+ depends on MFD_MC13783
+ select REGULATOR_MC13XXX_CORE
+ help
+ Say y here to support the regulators found on the Freescale MC13783
+ PMIC.
+
+config REGULATOR_MC13892
+ tristate "Freescale MC13892 regulator driver"
+ depends on MFD_MC13XXX
+ select REGULATOR_MC13XXX_CORE
+ help
+ Say y here to support the regulators found on the Freescale MC13892
+ PMIC.
+
+config REGULATOR_ISL6271A
+ tristate "Intersil ISL6271A Power regulator"
+ depends on I2C
+ help
+ This driver supports ISL6271A voltage regulator chip.
+
+config REGULATOR_88PM8607
+ bool "Marvell 88PM8607 Power regulators"
+ depends on MFD_88PM860X=y
+ help
+ This driver supports 88PM8607 voltage regulator chips.
config REGULATOR_MAX1586
tristate "Maxim 1586/1587 voltage regulator"
@@ -136,69 +195,12 @@ config REGULATOR_MAX8998
via I2C bus. The provided regulator is suitable for S3C6410
and S5PC1XX chips to control VCC_CORE and VCC_USIM voltages.
-config REGULATOR_S5M8767
- tristate "Samsung S5M8767A voltage regulator"
- depends on MFD_S5M_CORE
- help
- This driver supports a Samsung S5M8767A voltage output regulator
- via I2C bus. S5M8767A have 9 Bucks and 28 LDOs output and
- supports DVS mode with 8bits of output voltage control.
-
-config REGULATOR_TWL4030
- bool "TI TWL4030/TWL5030/TWL6030/TPS659x0 PMIC"
- depends on TWL4030_CORE
- help
- This driver supports the voltage regulators provided by
- this family of companion chips.
-
-config REGULATOR_WM831X
- tristate "Wolfson Microelcronics WM831x PMIC regulators"
- depends on MFD_WM831X
- help
- Support the voltage and current regulators of the WM831x series
- of PMIC devices.
-
-config REGULATOR_WM8350
- tristate "Wolfson Microelectronics WM8350 AudioPlus PMIC"
- depends on MFD_WM8350
- help
- This driver provides support for the voltage and current regulators
- of the WM8350 AudioPlus PMIC.
-
-config REGULATOR_WM8400
- tristate "Wolfson Microelectronics WM8400 AudioPlus PMIC"
- depends on MFD_WM8400
- help
- This driver provides support for the voltage regulators of the
- WM8400 AudioPlus PMIC.
-
-config REGULATOR_WM8994
- tristate "Wolfson Microelectronics WM8994 CODEC"
- depends on MFD_WM8994
- help
- This driver provides support for the voltage regulators on the
- WM8994 CODEC.
-
-config REGULATOR_DA903X
- tristate "Support regulators on Dialog Semiconductor DA9030/DA9034 PMIC"
- depends on PMIC_DA903X
- help
- Say y here to support the BUCKs and LDOs regulators found on
- Dialog Semiconductor DA9030/DA9034 PMIC.
-
-config REGULATOR_DA9052
- tristate "Dialog DA9052/DA9053 regulators"
- depends on PMIC_DA9052
- help
- This driver supports the voltage regulators of DA9052-BC and
- DA9053-AA/Bx PMIC.
-
-config REGULATOR_PCF50633
- tristate "PCF50633 regulator driver"
- depends on MFD_PCF50633
+config REGULATOR_PCAP
+ tristate "Motorola PCAP2 regulator driver"
+ depends on EZX_PCAP
help
- Say Y here to support the voltage regulators and convertors
- on PCF50633
+ This driver provides support for the voltage regulators of the
+ PCAP2 PMIC.
config REGULATOR_LP3971
tristate "National Semiconductors LP3971 PMIC regulator driver"
@@ -214,31 +216,20 @@ config REGULATOR_LP3972
Say Y here to support the voltage regulators and convertors
on National Semiconductors LP3972 PMIC
-config REGULATOR_PCAP
- tristate "PCAP2 regulator driver"
- depends on EZX_PCAP
- help
- This driver provides support for the voltage regulators of the
- PCAP2 PMIC.
-
-config REGULATOR_MC13XXX_CORE
- tristate
-
-config REGULATOR_MC13783
- tristate "Support regulators on Freescale MC13783 PMIC"
- depends on MFD_MC13783
- select REGULATOR_MC13XXX_CORE
+config REGULATOR_PCF50633
+ tristate "NXP PCF50633 regulator driver"
+ depends on MFD_PCF50633
help
- Say y here to support the regulators found on the Freescale MC13783
- PMIC.
+ Say Y here to support the voltage regulators and convertors
+ on PCF50633
-config REGULATOR_MC13892
- tristate "Support regulators on Freescale MC13892 PMIC"
- depends on MFD_MC13XXX
- select REGULATOR_MC13XXX_CORE
+config REGULATOR_S5M8767
+ tristate "Samsung S5M8767A voltage regulator"
+ depends on MFD_S5M_CORE
help
- Say y here to support the regulators found on the Freescale MC13892
- PMIC.
+ This driver supports a Samsung S5M8767A voltage output regulator
+ via I2C bus. S5M8767A have 9 Bucks and 28 LDOs output and
+ supports DVS mode with 8bits of output voltage control.
config REGULATOR_AB3100
tristate "ST-Ericsson AB3100 Regulator functions"
@@ -249,6 +240,32 @@ config REGULATOR_AB3100
AB3100 analog baseband dealing with power regulators
for the system.
+config REGULATOR_AB8500
+ bool "ST-Ericsson AB8500 Power Regulators"
+ depends on AB8500_CORE
+ help
+ This driver supports the regulators found on the ST-Ericsson mixed
+ signal AB8500 PMIC
+
+config REGULATOR_DBX500_PRCMU
+ bool
+
+config REGULATOR_DB8500_PRCMU
+ bool "ST-Ericsson DB8500 Voltage Domain Regulators"
+ depends on MFD_DB8500_PRCMU
+ select REGULATOR_DBX500_PRCMU
+ help
+ This driver supports the voltage domain regulators controlled by the
+ DB8500 PRCMU
+
+config REGULATOR_BQ24022
+ tristate "TI bq24022 Dual Input 1-Cell Li-Ion Charger IC"
+ help
+ This driver controls a TI bq24022 Charger attached via
+ GPIOs. The provided current regulator can enable/disable
+ charging select between 100 mA and 500 mA charging current
+ limit.
+
config REGULATOR_TPS6105X
tristate "TI TPS6105X Power regulators"
depends on TPS6105X
@@ -258,6 +275,16 @@ config REGULATOR_TPS6105X
It is a single boost converter primarily for white LEDs and
audio amplifiers.
+config REGULATOR_TPS62360
+ tristate "TI TPS62360 Power Regulator"
+ depends on I2C
+ select REGMAP_I2C
+ help
+ This driver supports TPS62360 voltage regulator chip. This
+ regulator is meant for processor core supply. This chip is
+ high-frequency synchronous step down dc-dc converter optimized
+ for battery-powered portable applications.
+
config REGULATOR_TPS65023
tristate "TI TPS65023 Power regulators"
depends on I2C
@@ -284,55 +311,6 @@ config REGULATOR_TPS65217
voltage regulators. It supports software based voltage control
for different voltage domains
-config REGULATOR_TPS65912
- tristate "TI TPS65912 Power regulator"
- depends on (MFD_TPS65912_I2C || MFD_TPS65912_SPI)
- help
- This driver supports TPS65912 voltage regulator chip.
-
-config REGULATOR_88PM8607
- bool "Marvell 88PM8607 Power regulators"
- depends on MFD_88PM860X=y
- help
- This driver supports 88PM8607 voltage regulator chips.
-
-config REGULATOR_ISL6271A
- tristate "Intersil ISL6271A Power regulator"
- depends on I2C
- help
- This driver supports ISL6271A voltage regulator chip.
-
-config REGULATOR_AD5398
- tristate "Analog Devices AD5398/AD5821 regulators"
- depends on I2C
- help
- This driver supports AD5398 and AD5821 current regulator chips.
- If building into module, its name is ad5398.ko.
-
-config REGULATOR_AB8500
- bool "ST-Ericsson AB8500 Power Regulators"
- depends on AB8500_CORE
- help
- This driver supports the regulators found on the ST-Ericsson mixed
- signal AB8500 PMIC
-
-config REGULATOR_DBX500_PRCMU
- bool
-
-config REGULATOR_DB8500_PRCMU
- bool "ST-Ericsson DB8500 Voltage Domain Regulators"
- depends on MFD_DB8500_PRCMU
- select REGULATOR_DBX500_PRCMU
- help
- This driver supports the voltage domain regulators controlled by the
- DB8500 PRCMU
-
-config REGULATOR_TPS6586X
- tristate "TI TPS6586X Power regulators"
- depends on MFD_TPS6586X
- help
- This driver supports TPS6586X voltage regulator chips.
-
config REGULATOR_TPS6524X
tristate "TI TPS6524X Power regulators"
depends on SPI
@@ -343,28 +321,58 @@ config REGULATOR_TPS6524X
serial interface currently supported on the sequencer serial
port controller.
+config REGULATOR_TPS6586X
+ tristate "TI TPS6586X Power regulators"
+ depends on MFD_TPS6586X
+ help
+ This driver supports TPS6586X voltage regulator chips.
+
config REGULATOR_TPS65910
- tristate "TI TPS65910 Power Regulator"
+ tristate "TI TPS65910/TPS65911 Power Regulators"
depends on MFD_TPS65910
help
- This driver supports TPS65910 voltage regulator chips.
+ This driver supports TPS65910/TPS65911 voltage regulator chips.
-config REGULATOR_TPS62360
- tristate "TI TPS62360 Power Regulator"
- depends on I2C
- select REGMAP_I2C
+config REGULATOR_TPS65912
+ tristate "TI TPS65912 Power regulator"
+ depends on (MFD_TPS65912_I2C || MFD_TPS65912_SPI)
help
- This driver supports TPS62360 voltage regulator chip. This
- regulator is meant for processor core supply. This chip is
- high-frequency synchronous step down dc-dc converter optimized
- for battery-powered portable applications.
+ This driver supports TPS65912 voltage regulator chip.
-config REGULATOR_AAT2870
- tristate "AnalogicTech AAT2870 Regulators"
- depends on MFD_AAT2870_CORE
+config REGULATOR_TWL4030
+ bool "TI TWL4030/TWL5030/TWL6030/TPS659x0 PMIC"
+ depends on TWL4030_CORE
help
- If you have a AnalogicTech AAT2870 say Y to enable the
- regulator driver.
+ This driver supports the voltage regulators provided by
+ this family of companion chips.
+
+config REGULATOR_WM831X
+ tristate "Wolfson Microelectronics WM831x PMIC regulators"
+ depends on MFD_WM831X
+ help
+ Support the voltage and current regulators of the WM831x series
+ of PMIC devices.
+
+config REGULATOR_WM8350
+ tristate "Wolfson Microelectronics WM8350 AudioPlus PMIC"
+ depends on MFD_WM8350
+ help
+ This driver provides support for the voltage and current regulators
+ of the WM8350 AudioPlus PMIC.
+
+config REGULATOR_WM8400
+ tristate "Wolfson Microelectronics WM8400 AudioPlus PMIC"
+ depends on MFD_WM8400
+ help
+ This driver provides support for the voltage regulators of the
+ WM8400 AudioPlus PMIC.
+
+config REGULATOR_WM8994
+ tristate "Wolfson Microelectronics WM8994 CODEC"
+ depends on MFD_WM8994
+ help
+ This driver provides support for the voltage regulators on the
+ WM8994 CODEC.
endif
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 4cbf8c55f8a9..b5042c885d89 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -3,55 +3,56 @@
#
-obj-$(CONFIG_REGULATOR) += core.o dummy.o
+obj-$(CONFIG_REGULATOR) += core.o dummy.o fixed-helper.o
obj-$(CONFIG_OF) += of_regulator.o
obj-$(CONFIG_REGULATOR_FIXED_VOLTAGE) += fixed.o
obj-$(CONFIG_REGULATOR_VIRTUAL_CONSUMER) += virtual.o
obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o
obj-$(CONFIG_REGULATOR_GPIO) += gpio-regulator.o
+obj-$(CONFIG_REGULATOR_88PM8607) += 88pm8607.o
+obj-$(CONFIG_REGULATOR_AAT2870) += aat2870-regulator.o
+obj-$(CONFIG_REGULATOR_AB3100) += ab3100.o
+obj-$(CONFIG_REGULATOR_AB8500) += ab8500.o
obj-$(CONFIG_REGULATOR_AD5398) += ad5398.o
+obj-$(CONFIG_REGULATOR_ANATOP) += anatop-regulator.o
obj-$(CONFIG_REGULATOR_BQ24022) += bq24022.o
+obj-$(CONFIG_REGULATOR_DA903X) += da903x.o
+obj-$(CONFIG_REGULATOR_DA9052) += da9052-regulator.o
+obj-$(CONFIG_REGULATOR_DBX500_PRCMU) += dbx500-prcmu.o
+obj-$(CONFIG_REGULATOR_DB8500_PRCMU) += db8500-prcmu.o
+obj-$(CONFIG_REGULATOR_ISL6271A) += isl6271a-regulator.o
obj-$(CONFIG_REGULATOR_LP3971) += lp3971.o
obj-$(CONFIG_REGULATOR_LP3972) += lp3972.o
obj-$(CONFIG_REGULATOR_MAX1586) += max1586.o
-obj-$(CONFIG_REGULATOR_TWL4030) += twl-regulator.o
obj-$(CONFIG_REGULATOR_MAX8649) += max8649.o
obj-$(CONFIG_REGULATOR_MAX8660) += max8660.o
obj-$(CONFIG_REGULATOR_MAX8925) += max8925-regulator.o
obj-$(CONFIG_REGULATOR_MAX8952) += max8952.o
obj-$(CONFIG_REGULATOR_MAX8997) += max8997.o
obj-$(CONFIG_REGULATOR_MAX8998) += max8998.o
-obj-$(CONFIG_REGULATOR_WM831X) += wm831x-dcdc.o
-obj-$(CONFIG_REGULATOR_WM831X) += wm831x-isink.o
-obj-$(CONFIG_REGULATOR_WM831X) += wm831x-ldo.o
-obj-$(CONFIG_REGULATOR_WM8350) += wm8350-regulator.o
-obj-$(CONFIG_REGULATOR_WM8400) += wm8400-regulator.o
-obj-$(CONFIG_REGULATOR_WM8994) += wm8994-regulator.o
-obj-$(CONFIG_REGULATOR_TPS6586X) += tps6586x-regulator.o
-obj-$(CONFIG_REGULATOR_DA903X) += da903x.o
-obj-$(CONFIG_REGULATOR_DA9052) += da9052-regulator.o
-obj-$(CONFIG_REGULATOR_PCF50633) += pcf50633-regulator.o
-obj-$(CONFIG_REGULATOR_PCAP) += pcap-regulator.o
obj-$(CONFIG_REGULATOR_MC13783) += mc13783-regulator.o
obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o
obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o
-obj-$(CONFIG_REGULATOR_AB3100) += ab3100.o
+obj-$(CONFIG_REGULATOR_PCAP) += pcap-regulator.o
+obj-$(CONFIG_REGULATOR_PCF50633) += pcf50633-regulator.o
+obj-$(CONFIG_REGULATOR_S5M8767) += s5m8767.o
obj-$(CONFIG_REGULATOR_TPS6105X) += tps6105x-regulator.o
+obj-$(CONFIG_REGULATOR_TPS62360) += tps62360-regulator.o
obj-$(CONFIG_REGULATOR_TPS65023) += tps65023-regulator.o
obj-$(CONFIG_REGULATOR_TPS6507X) += tps6507x-regulator.o
obj-$(CONFIG_REGULATOR_TPS65217) += tps65217-regulator.o
obj-$(CONFIG_REGULATOR_TPS6524X) += tps6524x-regulator.o
-obj-$(CONFIG_REGULATOR_TPS65912) += tps65912-regulator.o
-obj-$(CONFIG_REGULATOR_88PM8607) += 88pm8607.o
-obj-$(CONFIG_REGULATOR_ISL6271A) += isl6271a-regulator.o
-obj-$(CONFIG_REGULATOR_AB8500) += ab8500.o
-obj-$(CONFIG_REGULATOR_DBX500_PRCMU) += dbx500-prcmu.o
-obj-$(CONFIG_REGULATOR_DB8500_PRCMU) += db8500-prcmu.o
+obj-$(CONFIG_REGULATOR_TPS6586X) += tps6586x-regulator.o
obj-$(CONFIG_REGULATOR_TPS65910) += tps65910-regulator.o
-obj-$(CONFIG_REGULATOR_TPS62360) += tps62360-regulator.o
-obj-$(CONFIG_REGULATOR_AAT2870) += aat2870-regulator.o
-obj-$(CONFIG_REGULATOR_S5M8767) += s5m8767.o
+obj-$(CONFIG_REGULATOR_TPS65912) += tps65912-regulator.o
+obj-$(CONFIG_REGULATOR_TWL4030) += twl-regulator.o
+obj-$(CONFIG_REGULATOR_WM831X) += wm831x-dcdc.o
+obj-$(CONFIG_REGULATOR_WM831X) += wm831x-isink.o
+obj-$(CONFIG_REGULATOR_WM831X) += wm831x-ldo.o
+obj-$(CONFIG_REGULATOR_WM8350) += wm8350-regulator.o
+obj-$(CONFIG_REGULATOR_WM8400) += wm8400-regulator.o
+obj-$(CONFIG_REGULATOR_WM8994) += wm8994-regulator.o
ccflags-$(CONFIG_REGULATOR_DEBUG) += -DDEBUG
diff --git a/drivers/regulator/aat2870-regulator.c b/drivers/regulator/aat2870-regulator.c
index 685ad43b0749..9ed5c5d84e12 100644
--- a/drivers/regulator/aat2870-regulator.c
+++ b/drivers/regulator/aat2870-regulator.c
@@ -31,7 +31,7 @@
#include <linux/mfd/aat2870.h>
struct aat2870_regulator {
- struct platform_device *pdev;
+ struct aat2870_data *aat2870;
struct regulator_desc desc;
const int *voltages; /* uV */
@@ -60,7 +60,7 @@ static int aat2870_ldo_set_voltage_sel(struct regulator_dev *rdev,
unsigned selector)
{
struct aat2870_regulator *ri = rdev_get_drvdata(rdev);
- struct aat2870_data *aat2870 = dev_get_drvdata(ri->pdev->dev.parent);
+ struct aat2870_data *aat2870 = ri->aat2870;
return aat2870->update(aat2870, ri->voltage_addr, ri->voltage_mask,
selector << ri->voltage_shift);
@@ -69,7 +69,7 @@ static int aat2870_ldo_set_voltage_sel(struct regulator_dev *rdev,
static int aat2870_ldo_get_voltage_sel(struct regulator_dev *rdev)
{
struct aat2870_regulator *ri = rdev_get_drvdata(rdev);
- struct aat2870_data *aat2870 = dev_get_drvdata(ri->pdev->dev.parent);
+ struct aat2870_data *aat2870 = ri->aat2870;
u8 val;
int ret;
@@ -83,7 +83,7 @@ static int aat2870_ldo_get_voltage_sel(struct regulator_dev *rdev)
static int aat2870_ldo_enable(struct regulator_dev *rdev)
{
struct aat2870_regulator *ri = rdev_get_drvdata(rdev);
- struct aat2870_data *aat2870 = dev_get_drvdata(ri->pdev->dev.parent);
+ struct aat2870_data *aat2870 = ri->aat2870;
return aat2870->update(aat2870, ri->enable_addr, ri->enable_mask,
ri->enable_mask);
@@ -92,7 +92,7 @@ static int aat2870_ldo_enable(struct regulator_dev *rdev)
static int aat2870_ldo_disable(struct regulator_dev *rdev)
{
struct aat2870_regulator *ri = rdev_get_drvdata(rdev);
- struct aat2870_data *aat2870 = dev_get_drvdata(ri->pdev->dev.parent);
+ struct aat2870_data *aat2870 = ri->aat2870;
return aat2870->update(aat2870, ri->enable_addr, ri->enable_mask, 0);
}
@@ -100,7 +100,7 @@ static int aat2870_ldo_disable(struct regulator_dev *rdev)
static int aat2870_ldo_is_enabled(struct regulator_dev *rdev)
{
struct aat2870_regulator *ri = rdev_get_drvdata(rdev);
- struct aat2870_data *aat2870 = dev_get_drvdata(ri->pdev->dev.parent);
+ struct aat2870_data *aat2870 = ri->aat2870;
u8 val;
int ret;
@@ -185,7 +185,7 @@ static int aat2870_regulator_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "Invalid device ID, %d\n", pdev->id);
return -EINVAL;
}
- ri->pdev = pdev;
+ ri->aat2870 = dev_get_drvdata(pdev->dev.parent);
rdev = regulator_register(&ri->desc, &pdev->dev,
pdev->dev.platform_data, ri, NULL);
diff --git a/drivers/regulator/ab8500.c b/drivers/regulator/ab8500.c
index c9b92531ae60..c7ee4c15d6f5 100644
--- a/drivers/regulator/ab8500.c
+++ b/drivers/regulator/ab8500.c
@@ -201,7 +201,7 @@ static int ab8500_list_voltage(struct regulator_dev *rdev, unsigned selector)
return info->voltages[selector];
}
-static int ab8500_regulator_get_voltage(struct regulator_dev *rdev)
+static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev)
{
int ret, val;
struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
@@ -229,11 +229,9 @@ static int ab8500_regulator_get_voltage(struct regulator_dev *rdev)
/* vintcore has a different layout */
val = regval & info->voltage_mask;
if (info->desc.id == AB8500_LDO_INTCORE)
- ret = info->voltages[val >> 0x3];
+ return val >> 0x3;
else
- ret = info->voltages[val];
-
- return ret;
+ return val;
}
static int ab8500_get_best_voltage_index(struct regulator_dev *rdev,
@@ -320,7 +318,7 @@ static struct regulator_ops ab8500_regulator_ops = {
.enable = ab8500_regulator_enable,
.disable = ab8500_regulator_disable,
.is_enabled = ab8500_regulator_is_enabled,
- .get_voltage = ab8500_regulator_get_voltage,
+ .get_voltage_sel = ab8500_regulator_get_voltage_sel,
.set_voltage = ab8500_regulator_set_voltage,
.list_voltage = ab8500_list_voltage,
.enable_time = ab8500_regulator_enable_time,
diff --git a/drivers/regulator/ad5398.c b/drivers/regulator/ad5398.c
index 483c80930852..26d23adfc66f 100644
--- a/drivers/regulator/ad5398.c
+++ b/drivers/regulator/ad5398.c
@@ -94,8 +94,8 @@ static int ad5398_set_current_limit(struct regulator_dev *rdev, int min_uA, int
if (max_uA > chip->max_uA || max_uA < chip->min_uA)
return -EINVAL;
- selector = ((min_uA - chip->min_uA) * chip->current_level +
- range_uA - 1) / range_uA;
+ selector = DIV_ROUND_UP((min_uA - chip->min_uA) * chip->current_level,
+ range_uA);
if (ad5398_calc_current(chip, selector) > max_uA)
return -EINVAL;
diff --git a/drivers/regulator/anatop-regulator.c b/drivers/regulator/anatop-regulator.c
new file mode 100644
index 000000000000..17499a55113d
--- /dev/null
+++ b/drivers/regulator/anatop-regulator.c
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/slab.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/mfd/anatop.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/of_regulator.h>
+
+struct anatop_regulator {
+ const char *name;
+ u32 control_reg;
+ struct anatop *mfd;
+ int vol_bit_shift;
+ int vol_bit_width;
+ int min_bit_val;
+ int min_voltage;
+ int max_voltage;
+ struct regulator_desc rdesc;
+ struct regulator_init_data *initdata;
+};
+
+static int anatop_set_voltage(struct regulator_dev *reg, int min_uV,
+ int max_uV, unsigned *selector)
+{
+ struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg);
+ u32 val, sel;
+ int uv;
+
+ uv = min_uV;
+ dev_dbg(&reg->dev, "%s: uv %d, min %d, max %d\n", __func__,
+ uv, anatop_reg->min_voltage,
+ anatop_reg->max_voltage);
+
+ if (uv < anatop_reg->min_voltage) {
+ if (max_uV > anatop_reg->min_voltage)
+ uv = anatop_reg->min_voltage;
+ else
+ return -EINVAL;
+ }
+
+ if (!anatop_reg->control_reg)
+ return -ENOTSUPP;
+
+ sel = DIV_ROUND_UP(uv - anatop_reg->min_voltage, 25000);
+ if (sel * 25000 + anatop_reg->min_voltage > anatop_reg->max_voltage)
+ return -EINVAL;
+ val = anatop_reg->min_bit_val + sel;
+ *selector = sel;
+ dev_dbg(&reg->dev, "%s: calculated val %d\n", __func__, val);
+ anatop_set_bits(anatop_reg->mfd,
+ anatop_reg->control_reg,
+ anatop_reg->vol_bit_shift,
+ anatop_reg->vol_bit_width,
+ val);
+
+ return 0;
+}
+
+static int anatop_get_voltage_sel(struct regulator_dev *reg)
+{
+ struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg);
+ u32 val;
+
+ if (!anatop_reg->control_reg)
+ return -ENOTSUPP;
+
+ val = anatop_get_bits(anatop_reg->mfd,
+ anatop_reg->control_reg,
+ anatop_reg->vol_bit_shift,
+ anatop_reg->vol_bit_width);
+
+ return val - anatop_reg->min_bit_val;
+}
+
+static int anatop_list_voltage(struct regulator_dev *reg, unsigned selector)
+{
+ struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg);
+ int uv;
+
+ uv = anatop_reg->min_voltage + selector * 25000;
+ dev_dbg(&reg->dev, "vddio = %d, selector = %u\n", uv, selector);
+
+ return uv;
+}
+
+static struct regulator_ops anatop_rops = {
+ .set_voltage = anatop_set_voltage,
+ .get_voltage_sel = anatop_get_voltage_sel,
+ .list_voltage = anatop_list_voltage,
+};
+
+static int __devinit anatop_regulator_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct device_node *np = dev->of_node;
+ struct regulator_desc *rdesc;
+ struct regulator_dev *rdev;
+ struct anatop_regulator *sreg;
+ struct regulator_init_data *initdata;
+ struct anatop *anatopmfd = dev_get_drvdata(pdev->dev.parent);
+ int ret = 0;
+
+ initdata = of_get_regulator_init_data(dev, np);
+ sreg = devm_kzalloc(dev, sizeof(*sreg), GFP_KERNEL);
+ if (!sreg)
+ return -ENOMEM;
+ sreg->initdata = initdata;
+ sreg->name = kstrdup(of_get_property(np, "regulator-name", NULL),
+ GFP_KERNEL);
+ rdesc = &sreg->rdesc;
+ memset(rdesc, 0, sizeof(*rdesc));
+ rdesc->name = sreg->name;
+ rdesc->ops = &anatop_rops;
+ rdesc->type = REGULATOR_VOLTAGE;
+ rdesc->owner = THIS_MODULE;
+ sreg->mfd = anatopmfd;
+ ret = of_property_read_u32(np, "reg", &sreg->control_reg);
+ if (ret) {
+ dev_err(dev, "no reg property set\n");
+ goto anatop_probe_end;
+ }
+ ret = of_property_read_u32(np, "anatop-vol-bit-width",
+ &sreg->vol_bit_width);
+ if (ret) {
+ dev_err(dev, "no anatop-vol-bit-width property set\n");
+ goto anatop_probe_end;
+ }
+ ret = of_property_read_u32(np, "anatop-vol-bit-shift",
+ &sreg->vol_bit_shift);
+ if (ret) {
+ dev_err(dev, "no anatop-vol-bit-shift property set\n");
+ goto anatop_probe_end;
+ }
+ ret = of_property_read_u32(np, "anatop-min-bit-val",
+ &sreg->min_bit_val);
+ if (ret) {
+ dev_err(dev, "no anatop-min-bit-val property set\n");
+ goto anatop_probe_end;
+ }
+ ret = of_property_read_u32(np, "anatop-min-voltage",
+ &sreg->min_voltage);
+ if (ret) {
+ dev_err(dev, "no anatop-min-voltage property set\n");
+ goto anatop_probe_end;
+ }
+ ret = of_property_read_u32(np, "anatop-max-voltage",
+ &sreg->max_voltage);
+ if (ret) {
+ dev_err(dev, "no anatop-max-voltage property set\n");
+ goto anatop_probe_end;
+ }
+
+ rdesc->n_voltages = (sreg->max_voltage - sreg->min_voltage)
+ / 25000 + 1;
+
+ /* register regulator */
+ rdev = regulator_register(rdesc, dev,
+ initdata, sreg, pdev->dev.of_node);
+ if (IS_ERR(rdev)) {
+ dev_err(dev, "failed to register %s\n",
+ rdesc->name);
+ ret = PTR_ERR(rdev);
+ goto anatop_probe_end;
+ }
+
+ platform_set_drvdata(pdev, rdev);
+
+anatop_probe_end:
+ if (ret)
+ kfree(sreg->name);
+
+ return ret;
+}
+
+static int __devexit anatop_regulator_remove(struct platform_device *pdev)
+{
+ struct regulator_dev *rdev = platform_get_drvdata(pdev);
+ struct anatop_regulator *sreg = rdev_get_drvdata(rdev);
+ const char *name = sreg->name;
+
+ regulator_unregister(rdev);
+ kfree(name);
+
+ return 0;
+}
+
+static struct of_device_id __devinitdata of_anatop_regulator_match_tbl[] = {
+ { .compatible = "fsl,anatop-regulator", },
+ { /* end */ }
+};
+
+static struct platform_driver anatop_regulator = {
+ .driver = {
+ .name = "anatop_regulator",
+ .owner = THIS_MODULE,
+ .of_match_table = of_anatop_regulator_match_tbl,
+ },
+ .probe = anatop_regulator_probe,
+ .remove = anatop_regulator_remove,
+};
+
+static int __init anatop_regulator_init(void)
+{
+ return platform_driver_register(&anatop_regulator);
+}
+postcore_initcall(anatop_regulator_init);
+
+static void __exit anatop_regulator_exit(void)
+{
+ platform_driver_unregister(&anatop_regulator);
+}
+module_exit(anatop_regulator_exit);
+
+MODULE_AUTHOR("Nancy Chen <Nancy.Chen@freescale.com>, "
+ "Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>");
+MODULE_DESCRIPTION("ANATOP Regulator driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 645c122bb5bc..e2f3afa71efb 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -13,8 +13,6 @@
*
*/
-#define pr_fmt(fmt) "%s: " fmt, __func__
-
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/debugfs.h>
@@ -54,9 +52,7 @@ static LIST_HEAD(regulator_map_list);
static bool has_full_constraints;
static bool board_wants_dummy_regulator;
-#ifdef CONFIG_DEBUG_FS
static struct dentry *debugfs_root;
-#endif
/*
* struct regulator_map
@@ -84,9 +80,7 @@ struct regulator {
char *supply_name;
struct device_attribute dev_attr;
struct regulator_dev *rdev;
-#ifdef CONFIG_DEBUG_FS
struct dentry *debugfs;
-#endif
};
static int _regulator_is_enabled(struct regulator_dev *rdev);
@@ -154,7 +148,7 @@ static struct device_node *of_get_regulator(struct device *dev, const char *supp
regnode = of_parse_phandle(dev->of_node, prop_name, 0);
if (!regnode) {
- dev_warn(dev, "%s property in node %s references invalid phandle",
+ dev_dbg(dev, "Looking up %s property in node %s failed",
prop_name, dev->of_node->full_name);
return NULL;
}
@@ -807,6 +801,11 @@ static void print_constraints(struct regulator_dev *rdev)
count += sprintf(buf + count, "standby");
rdev_info(rdev, "%s\n", buf);
+
+ if ((constraints->min_uV != constraints->max_uV) &&
+ !(constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE))
+ rdev_warn(rdev,
+ "Voltage range but no REGULATOR_CHANGE_VOLTAGE\n");
}
static int machine_constraints_voltage(struct regulator_dev *rdev,
@@ -1134,12 +1133,10 @@ static struct regulator *create_regulator(struct regulator_dev *rdev,
goto attr_err;
}
-#ifdef CONFIG_DEBUG_FS
regulator->debugfs = debugfs_create_dir(regulator->supply_name,
rdev->debugfs);
- if (IS_ERR_OR_NULL(regulator->debugfs)) {
+ if (!regulator->debugfs) {
rdev_warn(rdev, "Failed to create debugfs directory\n");
- regulator->debugfs = NULL;
} else {
debugfs_create_u32("uA_load", 0444, regulator->debugfs,
&regulator->uA_load);
@@ -1148,7 +1145,6 @@ static struct regulator *create_regulator(struct regulator_dev *rdev,
debugfs_create_u32("max_uV", 0444, regulator->debugfs,
&regulator->max_uV);
}
-#endif
mutex_unlock(&rdev->mutex);
return regulator;
@@ -1312,6 +1308,40 @@ struct regulator *regulator_get(struct device *dev, const char *id)
}
EXPORT_SYMBOL_GPL(regulator_get);
+static void devm_regulator_release(struct device *dev, void *res)
+{
+ regulator_put(*(struct regulator **)res);
+}
+
+/**
+ * devm_regulator_get - Resource managed regulator_get()
+ * @dev: device for regulator "consumer"
+ * @id: Supply name or regulator ID.
+ *
+ * Managed regulator_get(). Regulators returned from this function are
+ * automatically regulator_put() on driver detach. See regulator_get() for more
+ * information.
+ */
+struct regulator *devm_regulator_get(struct device *dev, const char *id)
+{
+ struct regulator **ptr, *regulator;
+
+ ptr = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
+ if (!ptr)
+ return ERR_PTR(-ENOMEM);
+
+ regulator = regulator_get(dev, id);
+ if (!IS_ERR(regulator)) {
+ *ptr = regulator;
+ devres_add(dev, ptr);
+ } else {
+ devres_free(ptr);
+ }
+
+ return regulator;
+}
+EXPORT_SYMBOL_GPL(devm_regulator_get);
+
/**
* regulator_get_exclusive - obtain exclusive access to a regulator.
* @dev: device for regulator "consumer"
@@ -1357,9 +1387,7 @@ void regulator_put(struct regulator *regulator)
mutex_lock(&regulator_list_mutex);
rdev = regulator->rdev;
-#ifdef CONFIG_DEBUG_FS
debugfs_remove_recursive(regulator->debugfs);
-#endif
/* remove any sysfs entries */
if (regulator->dev) {
@@ -1379,6 +1407,34 @@ void regulator_put(struct regulator *regulator)
}
EXPORT_SYMBOL_GPL(regulator_put);
+static int devm_regulator_match(struct device *dev, void *res, void *data)
+{
+ struct regulator **r = res;
+ if (!r || !*r) {
+ WARN_ON(!r || !*r);
+ return 0;
+ }
+ return *r == data;
+}
+
+/**
+ * devm_regulator_put - Resource managed regulator_put()
+ * @regulator: regulator to free
+ *
+ * Deallocate a regulator allocated with devm_regulator_get(). Normally
+ * this function will not need to be called and the resource management
+ * code will ensure that the resource is freed.
+ */
+void devm_regulator_put(struct regulator *regulator)
+{
+ int rc;
+
+ rc = devres_destroy(regulator->dev, devm_regulator_release,
+ devm_regulator_match, regulator);
+ WARN_ON(rc);
+}
+EXPORT_SYMBOL_GPL(devm_regulator_put);
+
static int _regulator_can_change_status(struct regulator_dev *rdev)
{
if (!rdev->constraints)
@@ -1834,8 +1890,12 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev,
if (ret < 0)
return ret;
old_selector = ret;
- delay = rdev->desc->ops->set_voltage_time_sel(rdev,
+ ret = rdev->desc->ops->set_voltage_time_sel(rdev,
old_selector, selector);
+ if (ret < 0)
+ rdev_warn(rdev, "set_voltage_time_sel() failed: %d\n", ret);
+ else
+ delay = ret;
}
if (best_val != INT_MAX) {
@@ -2386,13 +2446,59 @@ int regulator_bulk_get(struct device *dev, int num_consumers,
return 0;
err:
- for (i = 0; i < num_consumers && consumers[i].consumer; i++)
+ while (--i >= 0)
regulator_put(consumers[i].consumer);
return ret;
}
EXPORT_SYMBOL_GPL(regulator_bulk_get);
+/**
+ * devm_regulator_bulk_get - managed get multiple regulator consumers
+ *
+ * @dev: Device to supply
+ * @num_consumers: Number of consumers to register
+ * @consumers: Configuration of consumers; clients are stored here.
+ *
+ * @return 0 on success, an errno on failure.
+ *
+ * This helper function allows drivers to get several regulator
+ * consumers in one operation with management, the regulators will
+ * automatically be freed when the device is unbound. If any of the
+ * regulators cannot be acquired then any regulators that were
+ * allocated will be freed before returning to the caller.
+ */
+int devm_regulator_bulk_get(struct device *dev, int num_consumers,
+ struct regulator_bulk_data *consumers)
+{
+ int i;
+ int ret;
+
+ for (i = 0; i < num_consumers; i++)
+ consumers[i].consumer = NULL;
+
+ for (i = 0; i < num_consumers; i++) {
+ consumers[i].consumer = devm_regulator_get(dev,
+ consumers[i].supply);
+ if (IS_ERR(consumers[i].consumer)) {
+ ret = PTR_ERR(consumers[i].consumer);
+ dev_err(dev, "Failed to get supply '%s': %d\n",
+ consumers[i].supply, ret);
+ consumers[i].consumer = NULL;
+ goto err;
+ }
+ }
+
+ return 0;
+
+err:
+ for (i = 0; i < num_consumers && consumers[i].consumer; i++)
+ devm_regulator_put(consumers[i].consumer);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(devm_regulator_bulk_get);
+
static void regulator_bulk_enable_async(void *data, async_cookie_t cookie)
{
struct regulator_bulk_data *bulk = data;
@@ -2436,12 +2542,9 @@ int regulator_bulk_enable(int num_consumers,
return 0;
err:
- for (i = 0; i < num_consumers; i++)
- if (consumers[i].ret == 0)
- regulator_disable(consumers[i].consumer);
- else
- pr_err("Failed to enable %s: %d\n",
- consumers[i].supply, consumers[i].ret);
+ pr_err("Failed to enable %s: %d\n", consumers[i].supply, ret);
+ while (--i >= 0)
+ regulator_disable(consumers[i].consumer);
return ret;
}
@@ -2455,8 +2558,8 @@ EXPORT_SYMBOL_GPL(regulator_bulk_enable);
* @return 0 on success, an errno on failure
*
* This convenience API allows consumers to disable multiple regulator
- * clients in a single API call. If any consumers cannot be enabled
- * then any others that were disabled will be disabled again prior to
+ * clients in a single API call. If any consumers cannot be disabled
+ * then any others that were disabled will be enabled again prior to
* return.
*/
int regulator_bulk_disable(int num_consumers,
@@ -2465,7 +2568,7 @@ int regulator_bulk_disable(int num_consumers,
int i;
int ret;
- for (i = 0; i < num_consumers; i++) {
+ for (i = num_consumers - 1; i >= 0; --i) {
ret = regulator_disable(consumers[i].consumer);
if (ret != 0)
goto err;
@@ -2475,7 +2578,7 @@ int regulator_bulk_disable(int num_consumers,
err:
pr_err("Failed to disable %s: %d\n", consumers[i].supply, ret);
- for (--i; i >= 0; --i)
+ for (++i; i < num_consumers; ++i)
regulator_enable(consumers[i].consumer);
return ret;
@@ -2702,11 +2805,9 @@ static int add_regulator_attributes(struct regulator_dev *rdev)
static void rdev_init_debugfs(struct regulator_dev *rdev)
{
-#ifdef CONFIG_DEBUG_FS
rdev->debugfs = debugfs_create_dir(rdev_get_name(rdev), debugfs_root);
- if (IS_ERR(rdev->debugfs) || !rdev->debugfs) {
+ if (!rdev->debugfs) {
rdev_warn(rdev, "Failed to create debugfs directory\n");
- rdev->debugfs = NULL;
return;
}
@@ -2714,7 +2815,6 @@ static void rdev_init_debugfs(struct regulator_dev *rdev)
&rdev->use_count);
debugfs_create_u32("open_count", 0444, rdev->debugfs,
&rdev->open_count);
-#endif
}
/**
@@ -2893,9 +2993,7 @@ void regulator_unregister(struct regulator_dev *rdev)
return;
mutex_lock(&regulator_list_mutex);
-#ifdef CONFIG_DEBUG_FS
debugfs_remove_recursive(rdev->debugfs);
-#endif
flush_work_sync(&rdev->disable_work.work);
WARN_ON(rdev->open_count);
unset_regulator_supplies(rdev);
@@ -3105,12 +3203,14 @@ static ssize_t supply_map_read_file(struct file *file, char __user *user_buf,
return ret;
}
+#endif
static const struct file_operations supply_map_fops = {
+#ifdef CONFIG_DEBUG_FS
.read = supply_map_read_file,
.llseek = default_llseek,
-};
#endif
+};
static int __init regulator_init(void)
{
@@ -3118,17 +3218,12 @@ static int __init regulator_init(void)
ret = class_register(&regulator_class);
-#ifdef CONFIG_DEBUG_FS
debugfs_root = debugfs_create_dir("regulator", NULL);
- if (IS_ERR(debugfs_root) || !debugfs_root) {
+ if (!debugfs_root)
pr_warn("regulator: Failed to create debugfs directory\n");
- debugfs_root = NULL;
- }
- if (IS_ERR(debugfs_create_file("supply_map", 0444, debugfs_root,
- NULL, &supply_map_fops)))
- pr_warn("regulator: Failed to create supplies debugfs\n");
-#endif
+ debugfs_create_file("supply_map", 0444, debugfs_root, NULL,
+ &supply_map_fops);
regulator_dummy_init();
diff --git a/drivers/regulator/da903x.c b/drivers/regulator/da903x.c
index 8dbc54da7d70..1851f0929ef0 100644
--- a/drivers/regulator/da903x.c
+++ b/drivers/regulator/da903x.c
@@ -119,7 +119,7 @@ static int da903x_set_ldo_voltage(struct regulator_dev *rdev,
return -EINVAL;
}
- val = (min_uV - info->min_uV + info->step_uV - 1) / info->step_uV;
+ val = DIV_ROUND_UP(min_uV - info->min_uV, info->step_uV);
*selector = val;
val <<= info->vol_shift;
mask = ((1 << info->vol_nbits) - 1) << info->vol_shift;
@@ -202,7 +202,7 @@ static int da9030_set_ldo1_15_voltage(struct regulator_dev *rdev,
return -EINVAL;
}
- val = (min_uV - info->min_uV + info->step_uV - 1) / info->step_uV;
+ val = DIV_ROUND_UP(min_uV - info->min_uV, info->step_uV);
*selector = val;
val <<= info->vol_shift;
mask = ((1 << info->vol_nbits) - 1) << info->vol_shift;
@@ -233,10 +233,10 @@ static int da9030_set_ldo14_voltage(struct regulator_dev *rdev,
thresh = (info->max_uV + info->min_uV) / 2;
if (min_uV < thresh) {
- val = (thresh - min_uV + info->step_uV - 1) / info->step_uV;
+ val = DIV_ROUND_UP(thresh - min_uV, info->step_uV);
val |= 0x4;
} else {
- val = (min_uV - thresh + info->step_uV - 1) / info->step_uV;
+ val = DIV_ROUND_UP(min_uV - thresh, info->step_uV);
}
*selector = val;
@@ -281,7 +281,7 @@ static int da9034_set_dvc_voltage(struct regulator_dev *rdev,
return -EINVAL;
}
- val = (min_uV - info->min_uV + info->step_uV - 1) / info->step_uV;
+ val = DIV_ROUND_UP(min_uV - info->min_uV, info->step_uV);
*selector = val;
val <<= info->vol_shift;
mask = ((1 << info->vol_nbits) - 1) << info->vol_shift;
@@ -307,7 +307,7 @@ static int da9034_set_ldo12_voltage(struct regulator_dev *rdev,
return -EINVAL;
}
- val = (min_uV - info->min_uV + info->step_uV - 1) / info->step_uV;
+ val = DIV_ROUND_UP(min_uV - info->min_uV, info->step_uV);
val = (val >= 20) ? val - 12 : ((val > 7) ? 8 : val);
*selector = val;
val <<= info->vol_shift;
diff --git a/drivers/regulator/fixed-helper.c b/drivers/regulator/fixed-helper.c
new file mode 100644
index 000000000000..30d0a15b8949
--- /dev/null
+++ b/drivers/regulator/fixed-helper.c
@@ -0,0 +1,53 @@
+#include <linux/slab.h>
+#include <linux/platform_device.h>
+#include <linux/regulator/machine.h>
+#include <linux/regulator/fixed.h>
+
+struct fixed_regulator_data {
+ struct fixed_voltage_config cfg;
+ struct regulator_init_data init_data;
+ struct platform_device pdev;
+};
+
+static void regulator_fixed_release(struct device *dev)
+{
+ struct fixed_regulator_data *data = container_of(dev,
+ struct fixed_regulator_data, pdev.dev);
+ kfree(data);
+}
+
+/**
+ * regulator_register_fixed - register a no-op fixed regulator
+ * @name: supply name
+ * @id: platform device id
+ * @supplies: consumers for this regulator
+ * @num_supplies: number of consumers
+ */
+struct platform_device *regulator_register_fixed(int id,
+ struct regulator_consumer_supply *supplies, int num_supplies)
+{
+ struct fixed_regulator_data *data;
+
+ data = kzalloc(sizeof(*data), GFP_KERNEL);
+ if (!data)
+ return NULL;
+
+ data->cfg.supply_name = "dummy";
+ data->cfg.microvolts = 0;
+ data->cfg.gpio = -EINVAL;
+ data->cfg.enabled_at_boot = 1;
+ data->cfg.init_data = &data->init_data;
+
+ data->init_data.constraints.always_on = 1;
+ data->init_data.consumer_supplies = supplies;
+ data->init_data.num_consumer_supplies = num_supplies;
+
+ data->pdev.name = "reg-fixed-voltage";
+ data->pdev.id = id;
+ data->pdev.dev.platform_data = &data->cfg;
+ data->pdev.dev.release = regulator_fixed_release;
+
+ platform_device_register(&data->pdev);
+
+ return &data->pdev;
+}
diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c
index e24e3a174c4b..40f38030b394 100644
--- a/drivers/regulator/fixed.c
+++ b/drivers/regulator/fixed.c
@@ -192,7 +192,9 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)
drvdata->desc.type = REGULATOR_VOLTAGE;
drvdata->desc.owner = THIS_MODULE;
drvdata->desc.ops = &fixed_voltage_ops;
- drvdata->desc.n_voltages = 1;
+
+ if (config->microvolts)
+ drvdata->desc.n_voltages = 1;
drvdata->microvolts = config->microvolts;
drvdata->gpio = config->gpio;
diff --git a/drivers/regulator/isl6271a-regulator.c b/drivers/regulator/isl6271a-regulator.c
index c1a456c4257c..775f5fd208c3 100644
--- a/drivers/regulator/isl6271a-regulator.c
+++ b/drivers/regulator/isl6271a-regulator.c
@@ -63,23 +63,15 @@ static int isl6271a_set_voltage(struct regulator_dev *dev,
unsigned *selector)
{
struct isl_pmic *pmic = rdev_get_drvdata(dev);
- int vsel, err, data;
+ int err, data;
if (minuV < ISL6271A_VOLTAGE_MIN || minuV > ISL6271A_VOLTAGE_MAX)
return -EINVAL;
if (maxuV < ISL6271A_VOLTAGE_MIN || maxuV > ISL6271A_VOLTAGE_MAX)
return -EINVAL;
- /* Align to 50000 mV */
- vsel = minuV - (minuV % ISL6271A_VOLTAGE_STEP);
-
- /* If the result fell out of [minuV,maxuV] range, put it back */
- if (vsel < minuV)
- vsel += ISL6271A_VOLTAGE_STEP;
-
- /* Convert the microvolts to data for the chip */
- data = (vsel - ISL6271A_VOLTAGE_MIN) / ISL6271A_VOLTAGE_STEP;
-
+ data = DIV_ROUND_UP(minuV - ISL6271A_VOLTAGE_MIN,
+ ISL6271A_VOLTAGE_STEP);
*selector = data;
mutex_lock(&pmic->mtx);
diff --git a/drivers/regulator/max1586.c b/drivers/regulator/max1586.c
index 40e7a4db2853..282d2ee0604e 100644
--- a/drivers/regulator/max1586.c
+++ b/drivers/regulator/max1586.c
@@ -76,8 +76,8 @@ static int max1586_v3_set(struct regulator_dev *rdev, int min_uV, int max_uV,
if (min_uV < max1586->min_uV)
min_uV = max1586->min_uV;
- *selector = ((min_uV - max1586->min_uV) * MAX1586_V3_MAX_VSEL +
- range_uV - 1) / range_uV;
+ *selector = DIV_ROUND_UP((min_uV - max1586->min_uV) *
+ MAX1586_V3_MAX_VSEL, range_uV);
if (max1586_v3_calc_voltage(max1586, *selector) > max_uV)
return -EINVAL;
diff --git a/drivers/regulator/max8649.c b/drivers/regulator/max8649.c
index b06a2399587c..824c650436ed 100644
--- a/drivers/regulator/max8649.c
+++ b/drivers/regulator/max8649.c
@@ -101,8 +101,7 @@ static int max8649_set_voltage(struct regulator_dev *rdev,
min_uV, max_uV);
return -EINVAL;
}
- data = (min_uV - MAX8649_DCDC_VMIN + MAX8649_DCDC_STEP - 1)
- / MAX8649_DCDC_STEP;
+ data = DIV_ROUND_UP(min_uV - MAX8649_DCDC_VMIN, MAX8649_DCDC_STEP);
mask = MAX8649_VOL_MASK;
*selector = data & mask;
@@ -150,7 +149,7 @@ static int max8649_enable_time(struct regulator_dev *rdev)
if (ret != 0)
return ret;
val &= MAX8649_VOL_MASK;
- voltage = max8649_list_voltage(rdev, (unsigned char)ret); /* uV */
+ voltage = max8649_list_voltage(rdev, (unsigned char)val); /* uV */
/* get rate */
ret = regmap_read(info->regmap, MAX8649_RAMP, &val);
@@ -270,7 +269,7 @@ static int __devinit max8649_regulator_probe(struct i2c_client *client,
ret);
goto out;
}
- dev_info(info->dev, "Detected MAX8649 (ID:%x)\n", ret);
+ dev_info(info->dev, "Detected MAX8649 (ID:%x)\n", val);
/* enable VID0 & VID1 */
regmap_update_bits(info->regmap, MAX8649_CONTROL, MAX8649_VID_MASK, 0);
diff --git a/drivers/regulator/max8660.c b/drivers/regulator/max8660.c
index a838e664569f..4c5b05311f47 100644
--- a/drivers/regulator/max8660.c
+++ b/drivers/regulator/max8660.c
@@ -153,14 +153,15 @@ static int max8660_dcdc_set(struct regulator_dev *rdev, int min_uV, int max_uV,
if (max_uV < MAX8660_DCDC_MIN_UV || max_uV > MAX8660_DCDC_MAX_UV)
return -EINVAL;
- selector = (min_uV - (MAX8660_DCDC_MIN_UV - MAX8660_DCDC_STEP + 1))
- / MAX8660_DCDC_STEP;
- *s = selector;
+ selector = DIV_ROUND_UP(min_uV - MAX8660_DCDC_MIN_UV,
+ MAX8660_DCDC_STEP);
ret = max8660_dcdc_list(rdev, selector);
if (ret < 0 || ret > max_uV)
return -EINVAL;
+ *s = selector;
+
reg = (rdev_get_id(rdev) == MAX8660_V3) ? MAX8660_ADTV2 : MAX8660_SDTV2;
ret = max8660_write(max8660, reg, 0, selector);
if (ret)
@@ -210,8 +211,9 @@ static int max8660_ldo5_set(struct regulator_dev *rdev, int min_uV, int max_uV,
if (max_uV < MAX8660_LDO5_MIN_UV || max_uV > MAX8660_LDO5_MAX_UV)
return -EINVAL;
- selector = (min_uV - (MAX8660_LDO5_MIN_UV - MAX8660_LDO5_STEP + 1))
- / MAX8660_LDO5_STEP;
+ selector = DIV_ROUND_UP(min_uV - MAX8660_LDO5_MIN_UV,
+ MAX8660_LDO5_STEP);
+
ret = max8660_ldo5_list(rdev, selector);
if (ret < 0 || ret > max_uV)
return -EINVAL;
@@ -287,8 +289,8 @@ static int max8660_ldo67_set(struct regulator_dev *rdev, int min_uV,
if (max_uV < MAX8660_LDO67_MIN_UV || max_uV > MAX8660_LDO67_MAX_UV)
return -EINVAL;
- selector = (min_uV - (MAX8660_LDO67_MIN_UV - MAX8660_LDO67_STEP + 1))
- / MAX8660_LDO67_STEP;
+ selector = DIV_ROUND_UP(min_uV - MAX8660_LDO67_MIN_UV,
+ MAX8660_LDO67_STEP);
ret = max8660_ldo67_list(rdev, selector);
if (ret < 0 || ret > max_uV)
diff --git a/drivers/regulator/max8925-regulator.c b/drivers/regulator/max8925-regulator.c
index cc290d37c463..2f242f43096e 100644
--- a/drivers/regulator/max8925-regulator.c
+++ b/drivers/regulator/max8925-regulator.c
@@ -73,7 +73,7 @@ static int max8925_set_voltage(struct regulator_dev *rdev,
min_uV, max_uV);
return -EINVAL;
}
- data = (min_uV - info->min_uV + info->step_uV - 1) / info->step_uV;
+ data = DIV_ROUND_UP(min_uV - info->min_uV, info->step_uV);
*selector = data;
data <<= info->vol_shift;
mask = ((1 << info->vol_nbits) - 1) << info->vol_shift;
@@ -140,7 +140,7 @@ static int max8925_set_dvm_voltage(struct regulator_dev *rdev, int uV)
if (uV < SD1_DVM_VMIN || uV > SD1_DVM_VMAX)
return -EINVAL;
- data = (uV - SD1_DVM_VMIN + SD1_DVM_STEP - 1) / SD1_DVM_STEP;
+ data = DIV_ROUND_UP(uV - SD1_DVM_VMIN, SD1_DVM_STEP);
data <<= SD1_DVM_SHIFT;
mask = 3 << SD1_DVM_SHIFT;
diff --git a/drivers/regulator/max8997.c b/drivers/regulator/max8997.c
index bb7cd9df9487..96579296f04d 100644
--- a/drivers/regulator/max8997.c
+++ b/drivers/regulator/max8997.c
@@ -130,15 +130,10 @@ static const struct voltage_map_desc *reg_voltage_map[] = {
[MAX8997_CHARGER_TOPOFF] = &topoff_current_map_desc,
};
-static inline int max8997_get_rid(struct regulator_dev *rdev)
-{
- return rdev_get_id(rdev);
-}
-
static int max8997_list_voltage_safeout(struct regulator_dev *rdev,
unsigned int selector)
{
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
if (rid == MAX8997_ESAFEOUT1 || rid == MAX8997_ESAFEOUT2) {
switch (selector) {
@@ -161,7 +156,7 @@ static int max8997_list_voltage_safeout(struct regulator_dev *rdev,
static int max8997_list_voltage_charger_cv(struct regulator_dev *rdev,
unsigned int selector)
{
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
if (rid != MAX8997_CHARGER_CV)
goto err;
@@ -184,7 +179,7 @@ static int max8997_list_voltage(struct regulator_dev *rdev,
unsigned int selector)
{
const struct voltage_map_desc *desc;
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
int val;
if (rid >= ARRAY_SIZE(reg_voltage_map) ||
@@ -205,7 +200,7 @@ static int max8997_list_voltage(struct regulator_dev *rdev,
static int max8997_get_enable_register(struct regulator_dev *rdev,
int *reg, int *mask, int *pattern)
{
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
switch (rid) {
case MAX8997_LDO1 ... MAX8997_LDO21:
@@ -325,7 +320,7 @@ static int max8997_reg_disable(struct regulator_dev *rdev)
static int max8997_get_voltage_register(struct regulator_dev *rdev,
int *_reg, int *_shift, int *_mask)
{
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
int reg, shift = 0, mask = 0x3f;
switch (rid) {
@@ -386,7 +381,7 @@ static int max8997_get_voltage(struct regulator_dev *rdev)
struct max8997_data *max8997 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8997->iodev->i2c;
int reg, shift, mask, ret;
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
u8 val;
ret = max8997_get_voltage_register(rdev, &reg, &shift, &mask);
@@ -446,7 +441,7 @@ static int max8997_set_voltage_charger_cv(struct regulator_dev *rdev,
{
struct max8997_data *max8997 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8997->iodev->i2c;
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
int lb, ub;
int reg, shift = 0, mask, ret = 0;
u8 val = 0x0;
@@ -503,7 +498,7 @@ static int max8997_set_voltage_ldobuck(struct regulator_dev *rdev,
struct i2c_client *i2c = max8997->iodev->i2c;
int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
const struct voltage_map_desc *desc;
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
int reg, shift = 0, mask, ret;
int i;
u8 org;
@@ -564,7 +559,7 @@ static int max8997_assess_side_effect(struct regulator_dev *rdev,
u8 new_val, int *best)
{
struct max8997_data *max8997 = rdev_get_drvdata(rdev);
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
u8 *buckx_val[3];
bool buckx_gpiodvs[3];
int side_effect[8];
@@ -641,7 +636,7 @@ static int max8997_set_voltage_buck(struct regulator_dev *rdev,
int min_uV, int max_uV, unsigned *selector)
{
struct max8997_data *max8997 = rdev_get_drvdata(rdev);
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
const struct voltage_map_desc *desc;
int new_val, new_idx, damage, tmp_val, tmp_idx, tmp_dmg;
bool gpio_dvs_mode = false;
@@ -724,7 +719,7 @@ static int max8997_set_voltage_safeout(struct regulator_dev *rdev,
{
struct max8997_data *max8997 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8997->iodev->i2c;
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
int reg, shift = 0, mask, ret;
int i = 0;
u8 val;
@@ -766,7 +761,7 @@ static int max8997_reg_disable_suspend(struct regulator_dev *rdev)
struct max8997_data *max8997 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8997->iodev->i2c;
int ret, reg, mask, pattern;
- int rid = max8997_get_rid(rdev);
+ int rid = rdev_get_id(rdev);
ret = max8997_get_enable_register(rdev, &reg, &mask, &pattern);
if (ret)
diff --git a/drivers/regulator/max8998.c b/drivers/regulator/max8998.c
index 2d38c2493a07..5890265eeacc 100644
--- a/drivers/regulator/max8998.c
+++ b/drivers/regulator/max8998.c
@@ -112,16 +112,11 @@ static const struct voltage_map_desc *ldo_voltage_map[] = {
&buck4_voltage_map_desc, /* BUCK4 */
};
-static inline int max8998_get_ldo(struct regulator_dev *rdev)
-{
- return rdev_get_id(rdev);
-}
-
static int max8998_list_voltage(struct regulator_dev *rdev,
unsigned int selector)
{
const struct voltage_map_desc *desc;
- int ldo = max8998_get_ldo(rdev);
+ int ldo = rdev_get_id(rdev);
int val;
if (ldo >= ARRAY_SIZE(ldo_voltage_map))
@@ -141,7 +136,7 @@ static int max8998_list_voltage(struct regulator_dev *rdev,
static int max8998_get_enable_register(struct regulator_dev *rdev,
int *reg, int *shift)
{
- int ldo = max8998_get_ldo(rdev);
+ int ldo = rdev_get_id(rdev);
switch (ldo) {
case MAX8998_LDO2 ... MAX8998_LDO5:
@@ -222,7 +217,7 @@ static int max8998_ldo_disable(struct regulator_dev *rdev)
static int max8998_get_voltage_register(struct regulator_dev *rdev,
int *_reg, int *_shift, int *_mask)
{
- int ldo = max8998_get_ldo(rdev);
+ int ldo = rdev_get_id(rdev);
struct max8998_data *max8998 = rdev_get_drvdata(rdev);
int reg, shift = 0, mask = 0xff;
@@ -310,7 +305,7 @@ static int max8998_set_voltage_ldo(struct regulator_dev *rdev,
struct i2c_client *i2c = max8998->iodev->i2c;
int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
const struct voltage_map_desc *desc;
- int ldo = max8998_get_ldo(rdev);
+ int ldo = rdev_get_id(rdev);
int reg, shift = 0, mask, ret;
int i = 0;
@@ -362,7 +357,7 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,
struct i2c_client *i2c = max8998->iodev->i2c;
int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
const struct voltage_map_desc *desc;
- int buck = max8998_get_ldo(rdev);
+ int buck = rdev_get_id(rdev);
int reg, shift = 0, mask, ret;
int difference = 0, i = 0, j = 0, previous_vol = 0;
u8 val = 0;
@@ -829,7 +824,6 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
buck12_voltage_map_desc.step*i
< (pdata->buck2_voltage2 / 1000))
i++;
- printk(KERN_ERR "i2:%d, buck2_idx:%d\n", i, max8998->buck2_idx);
max8998->buck2_vol[1] = i;
ret = max8998_write_reg(i2c, MAX8998_REG_BUCK2_VOLTAGE2, i);
if (ret)
diff --git a/drivers/regulator/mc13783-regulator.c b/drivers/regulator/mc13783-regulator.c
index 8e9b90ad88ae..6c0face87ffe 100644
--- a/drivers/regulator/mc13783-regulator.c
+++ b/drivers/regulator/mc13783-regulator.c
@@ -344,6 +344,9 @@ static int __devinit mc13783_regulator_probe(struct platform_device *pdev)
dev_dbg(&pdev->dev, "%s id %d\n", __func__, pdev->id);
+ if (!pdata)
+ return -EINVAL;
+
priv = devm_kzalloc(&pdev->dev, sizeof(*priv) +
pdata->num_regulators * sizeof(priv->regulators[0]),
GFP_KERNEL);
diff --git a/drivers/regulator/pcf50633-regulator.c b/drivers/regulator/pcf50633-regulator.c
index 1d1c31056297..6db46c632f13 100644
--- a/drivers/regulator/pcf50633-regulator.c
+++ b/drivers/regulator/pcf50633-regulator.c
@@ -142,6 +142,7 @@ static int pcf50633_regulator_set_voltage(struct regulator_dev *rdev,
case PCF50633_REGULATOR_LDO5:
case PCF50633_REGULATOR_LDO6:
case PCF50633_REGULATOR_HCLDO:
+ case PCF50633_REGULATOR_MEMLDO:
volt_bits = ldo_voltage_bits(millivolts);
break;
default:
@@ -175,6 +176,7 @@ static int pcf50633_regulator_voltage_value(enum pcf50633_regulator_id id,
case PCF50633_REGULATOR_LDO5:
case PCF50633_REGULATOR_LDO6:
case PCF50633_REGULATOR_HCLDO:
+ case PCF50633_REGULATOR_MEMLDO:
millivolts = ldo_voltage_value(bits);
break;
default:
@@ -217,9 +219,6 @@ static int pcf50633_regulator_list_voltage(struct regulator_dev *rdev,
case PCF50633_REGULATOR_AUTO:
index += 0x2f;
break;
- case PCF50633_REGULATOR_HCLDO:
- index += 0x01;
- break;
default:
break;
}
@@ -288,27 +287,27 @@ static struct regulator_ops pcf50633_regulator_ops = {
static struct regulator_desc regulators[] = {
[PCF50633_REGULATOR_AUTO] =
- PCF50633_REGULATOR("auto", PCF50633_REGULATOR_AUTO, 80),
+ PCF50633_REGULATOR("auto", PCF50633_REGULATOR_AUTO, 81),
[PCF50633_REGULATOR_DOWN1] =
- PCF50633_REGULATOR("down1", PCF50633_REGULATOR_DOWN1, 95),
+ PCF50633_REGULATOR("down1", PCF50633_REGULATOR_DOWN1, 96),
[PCF50633_REGULATOR_DOWN2] =
- PCF50633_REGULATOR("down2", PCF50633_REGULATOR_DOWN2, 95),
+ PCF50633_REGULATOR("down2", PCF50633_REGULATOR_DOWN2, 96),
[PCF50633_REGULATOR_LDO1] =
- PCF50633_REGULATOR("ldo1", PCF50633_REGULATOR_LDO1, 27),
+ PCF50633_REGULATOR("ldo1", PCF50633_REGULATOR_LDO1, 28),
[PCF50633_REGULATOR_LDO2] =
- PCF50633_REGULATOR("ldo2", PCF50633_REGULATOR_LDO2, 27),
+ PCF50633_REGULATOR("ldo2", PCF50633_REGULATOR_LDO2, 28),
[PCF50633_REGULATOR_LDO3] =
- PCF50633_REGULATOR("ldo3", PCF50633_REGULATOR_LDO3, 27),
+ PCF50633_REGULATOR("ldo3", PCF50633_REGULATOR_LDO3, 28),
[PCF50633_REGULATOR_LDO4] =
- PCF50633_REGULATOR("ldo4", PCF50633_REGULATOR_LDO4, 27),
+ PCF50633_REGULATOR("ldo4", PCF50633_REGULATOR_LDO4, 28),
[PCF50633_REGULATOR_LDO5] =
- PCF50633_REGULATOR("ldo5", PCF50633_REGULATOR_LDO5, 27),
+ PCF50633_REGULATOR("ldo5", PCF50633_REGULATOR_LDO5, 28),
[PCF50633_REGULATOR_LDO6] =
- PCF50633_REGULATOR("ldo6", PCF50633_REGULATOR_LDO6, 27),
+ PCF50633_REGULATOR("ldo6", PCF50633_REGULATOR_LDO6, 28),
[PCF50633_REGULATOR_HCLDO] =
- PCF50633_REGULATOR("hcldo", PCF50633_REGULATOR_HCLDO, 26),
+ PCF50633_REGULATOR("hcldo", PCF50633_REGULATOR_HCLDO, 28),
[PCF50633_REGULATOR_MEMLDO] =
- PCF50633_REGULATOR("memldo", PCF50633_REGULATOR_MEMLDO, 0),
+ PCF50633_REGULATOR("memldo", PCF50633_REGULATOR_MEMLDO, 28),
};
static int __devinit pcf50633_regulator_probe(struct platform_device *pdev)
diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c
index 5b00e5ac70cd..58447db15de1 100644
--- a/drivers/regulator/s5m8767.c
+++ b/drivers/regulator/s5m8767.c
@@ -219,6 +219,7 @@ static int s5m8767_reg_disable(struct regulator_dev *rdev)
static int s5m8767_get_voltage_register(struct regulator_dev *rdev, int *_reg)
{
+ struct s5m8767_info *s5m8767 = rdev_get_drvdata(rdev);
int reg_id = rdev_get_id(rdev);
int reg;
@@ -234,12 +235,18 @@ static int s5m8767_get_voltage_register(struct regulator_dev *rdev, int *_reg)
break;
case S5M8767_BUCK2:
reg = S5M8767_REG_BUCK2DVS1;
+ if (s5m8767->buck2_gpiodvs)
+ reg += s5m8767->buck_gpioindex;
break;
case S5M8767_BUCK3:
reg = S5M8767_REG_BUCK3DVS1;
+ if (s5m8767->buck3_gpiodvs)
+ reg += s5m8767->buck_gpioindex;
break;
case S5M8767_BUCK4:
reg = S5M8767_REG_BUCK4DVS1;
+ if (s5m8767->buck4_gpiodvs)
+ reg += s5m8767->buck_gpioindex;
break;
case S5M8767_BUCK5:
reg = S5M8767_REG_BUCK5CTRL2;
@@ -259,7 +266,7 @@ static int s5m8767_get_voltage_register(struct regulator_dev *rdev, int *_reg)
static int s5m8767_get_voltage_sel(struct regulator_dev *rdev)
{
struct s5m8767_info *s5m8767 = rdev_get_drvdata(rdev);
- int reg, mask = 0xff, ret;
+ int reg, mask, ret;
int reg_id = rdev_get_id(rdev);
u8 val;
@@ -267,23 +274,7 @@ static int s5m8767_get_voltage_sel(struct regulator_dev *rdev)
if (ret)
return ret;
- switch (reg_id) {
- case S5M8767_LDO1 ... S5M8767_LDO28:
- mask = 0x3f;
- break;
- case S5M8767_BUCK2:
- if (s5m8767->buck2_gpiodvs)
- reg += s5m8767->buck_gpioindex;
- break;
- case S5M8767_BUCK3:
- if (s5m8767->buck3_gpiodvs)
- reg += s5m8767->buck_gpioindex;
- break;
- case S5M8767_BUCK4:
- if (s5m8767->buck4_gpiodvs)
- reg += s5m8767->buck_gpioindex;
- break;
- }
+ mask = (reg_id < S5M8767_BUCK1) ? 0x3f : 0xff;
ret = s5m_reg_read(s5m8767->iodev, reg, &val);
if (ret)
@@ -294,11 +285,11 @@ static int s5m8767_get_voltage_sel(struct regulator_dev *rdev)
return val;
}
-static inline int s5m8767_convert_voltage(
+static int s5m8767_convert_voltage_to_sel(
const struct s5m_voltage_desc *desc,
int min_vol, int max_vol)
{
- int out_vol = 0;
+ int selector = 0;
if (desc == NULL)
return -EINVAL;
@@ -306,19 +297,18 @@ static inline int s5m8767_convert_voltage(
if (max_vol < desc->min || min_vol > desc->max)
return -EINVAL;
- out_vol = (min_vol - desc->min) / desc->step;
+ selector = (min_vol - desc->min) / desc->step;
- if (desc->min + desc->step * out_vol > max_vol)
+ if (desc->min + desc->step * selector > max_vol)
return -EINVAL;
- return out_vol;
+ return selector;
}
static int s5m8767_set_voltage(struct regulator_dev *rdev,
int min_uV, int max_uV, unsigned *selector)
{
struct s5m8767_info *s5m8767 = rdev_get_drvdata(rdev);
- int min_vol = min_uV, max_vol = max_uV;
const struct s5m_voltage_desc *desc;
int reg_id = rdev_get_id(rdev);
int reg, mask, ret;
@@ -343,7 +333,7 @@ static int s5m8767_set_voltage(struct regulator_dev *rdev,
desc = reg_voltage_map[reg_id];
- i = s5m8767_convert_voltage(desc, min_vol, max_vol);
+ i = s5m8767_convert_voltage_to_sel(desc, min_uV, max_uV);
if (i < 0)
return i;
@@ -385,7 +375,6 @@ static int s5m8767_set_voltage_buck(struct regulator_dev *rdev,
int reg_id = rdev_get_id(rdev);
const struct s5m_voltage_desc *desc;
int new_val, old_val, i = 0;
- int min_vol = min_uV, max_vol = max_uV;
if (reg_id < S5M8767_BUCK1 || reg_id > S5M8767_BUCK6)
return -EINVAL;
@@ -402,7 +391,7 @@ static int s5m8767_set_voltage_buck(struct regulator_dev *rdev,
}
desc = reg_voltage_map[reg_id];
- new_val = s5m8767_convert_voltage(desc, min_vol, max_vol);
+ new_val = s5m8767_convert_voltage_to_sel(desc, min_uV, max_uV);
if (new_val < 0)
return new_val;
@@ -452,39 +441,13 @@ static int s5m8767_set_voltage_time_sel(struct regulator_dev *rdev,
struct s5m8767_info *s5m8767 = rdev_get_drvdata(rdev);
const struct s5m_voltage_desc *desc;
int reg_id = rdev_get_id(rdev);
- int mask;
- int new_val, old_val;
- switch (reg_id) {
- case S5M8767_LDO1 ... S5M8767_LDO28:
- mask = 0x3f;
- break;
- case S5M8767_BUCK1 ... S5M8767_BUCK6:
- mask = 0xff;
- break;
- case S5M8767_BUCK7 ... S5M8767_BUCK8:
- return -EINVAL;
- case S5M8767_BUCK9:
- mask = 0xff;
- break;
- default:
- return -EINVAL;
- }
desc = reg_voltage_map[reg_id];
- new_val = s5m8767_convert_voltage(desc, new_sel, new_sel);
- if (new_val < 0)
- return new_val;
-
- old_val = s5m8767_convert_voltage(desc, old_sel, old_sel);
- if (old_val < 0)
- return old_val;
-
if (old_sel < new_sel)
- return DIV_ROUND_UP(desc->step * (new_val - old_val),
- s5m8767->ramp_delay);
- else
- return 0;
+ return DIV_ROUND_UP(desc->step * (new_sel - old_sel),
+ s5m8767->ramp_delay * 1000);
+ return 0;
}
static struct regulator_ops s5m8767_ldo_ops = {
@@ -568,14 +531,34 @@ static __devinit int s5m8767_pmic_probe(struct platform_device *pdev)
struct s5m_platform_data *pdata = dev_get_platdata(iodev->dev);
struct regulator_dev **rdev;
struct s5m8767_info *s5m8767;
- struct i2c_client *i2c;
- int i, ret, size, reg;
+ int i, ret, size;
if (!pdata) {
dev_err(pdev->dev.parent, "Platform data not supplied\n");
return -ENODEV;
}
+ if (pdata->buck2_gpiodvs) {
+ if (pdata->buck3_gpiodvs || pdata->buck4_gpiodvs) {
+ dev_err(&pdev->dev, "S5M8767 GPIO DVS NOT VALID\n");
+ return -EINVAL;
+ }
+ }
+
+ if (pdata->buck3_gpiodvs) {
+ if (pdata->buck2_gpiodvs || pdata->buck4_gpiodvs) {
+ dev_err(&pdev->dev, "S5M8767 GPIO DVS NOT VALID\n");
+ return -EINVAL;
+ }
+ }
+
+ if (pdata->buck4_gpiodvs) {
+ if (pdata->buck2_gpiodvs || pdata->buck3_gpiodvs) {
+ dev_err(&pdev->dev, "S5M8767 GPIO DVS NOT VALID\n");
+ return -EINVAL;
+ }
+ }
+
s5m8767 = devm_kzalloc(&pdev->dev, sizeof(struct s5m8767_info),
GFP_KERNEL);
if (!s5m8767)
@@ -591,7 +574,6 @@ static __devinit int s5m8767_pmic_probe(struct platform_device *pdev)
s5m8767->iodev = iodev;
s5m8767->num_regulators = S5M8767_REG_MAX - 2;
platform_set_drvdata(pdev, s5m8767);
- i2c = s5m8767->iodev->i2c;
s5m8767->buck_gpioindex = pdata->buck_default_idx;
s5m8767->buck2_gpiodvs = pdata->buck2_gpiodvs;
@@ -608,7 +590,7 @@ static __devinit int s5m8767_pmic_probe(struct platform_device *pdev)
for (i = 0; i < 8; i++) {
if (s5m8767->buck2_gpiodvs) {
s5m8767->buck2_vol[i] =
- s5m8767_convert_voltage(
+ s5m8767_convert_voltage_to_sel(
&buck_voltage_val2,
pdata->buck2_voltage[i],
pdata->buck2_voltage[i] +
@@ -617,7 +599,7 @@ static __devinit int s5m8767_pmic_probe(struct platform_device *pdev)
if (s5m8767->buck3_gpiodvs) {
s5m8767->buck3_vol[i] =
- s5m8767_convert_voltage(
+ s5m8767_convert_voltage_to_sel(
&buck_voltage_val2,
pdata->buck3_voltage[i],
pdata->buck3_voltage[i] +
@@ -626,7 +608,7 @@ static __devinit int s5m8767_pmic_probe(struct platform_device *pdev)
if (s5m8767->buck4_gpiodvs) {
s5m8767->buck4_vol[i] =
- s5m8767_convert_voltage(
+ s5m8767_convert_voltage_to_sel(
&buck_voltage_val2,
pdata->buck4_voltage[i],
pdata->buck4_voltage[i] +
@@ -670,30 +652,6 @@ static __devinit int s5m8767_pmic_probe(struct platform_device *pdev)
}
}
- if (pdata->buck2_gpiodvs) {
- if (pdata->buck3_gpiodvs || pdata->buck4_gpiodvs) {
- dev_err(&pdev->dev, "S5M8767 GPIO DVS NOT VALID\n");
- ret = -EINVAL;
- return ret;
- }
- }
-
- if (pdata->buck3_gpiodvs) {
- if (pdata->buck2_gpiodvs || pdata->buck4_gpiodvs) {
- dev_err(&pdev->dev, "S5M8767 GPIO DVS NOT VALID\n");
- ret = -EINVAL;
- return ret;
- }
- }
-
- if (pdata->buck4_gpiodvs) {
- if (pdata->buck2_gpiodvs || pdata->buck3_gpiodvs) {
- dev_err(&pdev->dev, "S5M8767 GPIO DVS NOT VALID\n");
- ret = -EINVAL;
- return ret;
- }
- }
-
s5m_reg_update(s5m8767->iodev, S5M8767_REG_BUCK2CTRL,
(pdata->buck2_gpiodvs) ? (1 << 1) : (0 << 1), 1 << 1);
s5m_reg_update(s5m8767->iodev, S5M8767_REG_BUCK3CTRL,
diff --git a/drivers/regulator/tps62360-regulator.c b/drivers/regulator/tps62360-regulator.c
index f778ef067696..e2ec73068ee2 100644
--- a/drivers/regulator/tps62360-regulator.c
+++ b/drivers/regulator/tps62360-regulator.c
@@ -191,7 +191,7 @@ static int tps62360_dcdc_list_voltage(struct regulator_dev *dev,
{
struct tps62360_chip *tps = rdev_get_drvdata(dev);
- if ((selector < 0) || (selector >= tps->desc.n_voltages))
+ if (selector >= tps->desc.n_voltages)
return -EINVAL;
return (tps->voltage_base + selector * 10) * 1000;
}
diff --git a/drivers/regulator/tps65023-regulator.c b/drivers/regulator/tps65023-regulator.c
index 18d61a0529a9..43e4902d7af8 100644
--- a/drivers/regulator/tps65023-regulator.c
+++ b/drivers/regulator/tps65023-regulator.c
@@ -491,10 +491,6 @@ static int __devinit tps_65023_probe(struct i2c_client *client,
regmap_update_bits(tps->regmap, TPS65023_REG_CON_CTRL2,
TPS65023_REG_CTRL2_CORE_ADJ, TPS65023_REG_CTRL2_CORE_ADJ);
- /* Enable setting output voltage by I2C */
- regmap_update_bits(tps->regmap, TPS65023_REG_CON_CTRL2,
- TPS65023_REG_CTRL2_CORE_ADJ, TPS65023_REG_CTRL2_CORE_ADJ);
-
return 0;
fail:
diff --git a/drivers/regulator/tps6507x-regulator.c b/drivers/regulator/tps6507x-regulator.c
index 0b63ef71a5fe..832833fe8aad 100644
--- a/drivers/regulator/tps6507x-regulator.c
+++ b/drivers/regulator/tps6507x-regulator.c
@@ -238,16 +238,16 @@ static int tps6507x_pmic_reg_write(struct tps6507x_pmic *tps, u8 reg, u8 val)
return err;
}
-static int tps6507x_pmic_dcdc_is_enabled(struct regulator_dev *dev)
+static int tps6507x_pmic_is_enabled(struct regulator_dev *dev)
{
struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int data, dcdc = rdev_get_id(dev);
+ int data, rid = rdev_get_id(dev);
u8 shift;
- if (dcdc < TPS6507X_DCDC_1 || dcdc > TPS6507X_DCDC_3)
+ if (rid < TPS6507X_DCDC_1 || rid > TPS6507X_LDO_2)
return -EINVAL;
- shift = TPS6507X_MAX_REG_ID - dcdc;
+ shift = TPS6507X_MAX_REG_ID - rid;
data = tps6507x_pmic_reg_read(tps, TPS6507X_REG_CON_CTRL1);
if (data < 0)
@@ -256,99 +256,65 @@ static int tps6507x_pmic_dcdc_is_enabled(struct regulator_dev *dev)
return (data & 1<<shift) ? 1 : 0;
}
-static int tps6507x_pmic_ldo_is_enabled(struct regulator_dev *dev)
+static int tps6507x_pmic_enable(struct regulator_dev *dev)
{
struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int data, ldo = rdev_get_id(dev);
+ int rid = rdev_get_id(dev);
u8 shift;
- if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
+ if (rid < TPS6507X_DCDC_1 || rid > TPS6507X_LDO_2)
return -EINVAL;
- shift = TPS6507X_MAX_REG_ID - ldo;
- data = tps6507x_pmic_reg_read(tps, TPS6507X_REG_CON_CTRL1);
-
- if (data < 0)
- return data;
- else
- return (data & 1<<shift) ? 1 : 0;
-}
-
-static int tps6507x_pmic_dcdc_enable(struct regulator_dev *dev)
-{
- struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int dcdc = rdev_get_id(dev);
- u8 shift;
-
- if (dcdc < TPS6507X_DCDC_1 || dcdc > TPS6507X_DCDC_3)
- return -EINVAL;
-
- shift = TPS6507X_MAX_REG_ID - dcdc;
- return tps6507x_pmic_set_bits(tps, TPS6507X_REG_CON_CTRL1, 1 << shift);
-}
-
-static int tps6507x_pmic_dcdc_disable(struct regulator_dev *dev)
-{
- struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int dcdc = rdev_get_id(dev);
- u8 shift;
-
- if (dcdc < TPS6507X_DCDC_1 || dcdc > TPS6507X_DCDC_3)
- return -EINVAL;
-
- shift = TPS6507X_MAX_REG_ID - dcdc;
- return tps6507x_pmic_clear_bits(tps, TPS6507X_REG_CON_CTRL1,
- 1 << shift);
-}
-
-static int tps6507x_pmic_ldo_enable(struct regulator_dev *dev)
-{
- struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int ldo = rdev_get_id(dev);
- u8 shift;
-
- if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
- return -EINVAL;
-
- shift = TPS6507X_MAX_REG_ID - ldo;
+ shift = TPS6507X_MAX_REG_ID - rid;
return tps6507x_pmic_set_bits(tps, TPS6507X_REG_CON_CTRL1, 1 << shift);
}
-static int tps6507x_pmic_ldo_disable(struct regulator_dev *dev)
+static int tps6507x_pmic_disable(struct regulator_dev *dev)
{
struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int ldo = rdev_get_id(dev);
+ int rid = rdev_get_id(dev);
u8 shift;
- if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
+ if (rid < TPS6507X_DCDC_1 || rid > TPS6507X_LDO_2)
return -EINVAL;
- shift = TPS6507X_MAX_REG_ID - ldo;
+ shift = TPS6507X_MAX_REG_ID - rid;
return tps6507x_pmic_clear_bits(tps, TPS6507X_REG_CON_CTRL1,
1 << shift);
}
-static int tps6507x_pmic_dcdc_get_voltage(struct regulator_dev *dev)
+static int tps6507x_pmic_get_voltage(struct regulator_dev *dev)
{
struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int data, dcdc = rdev_get_id(dev);
- u8 reg;
+ int data, rid = rdev_get_id(dev);
+ u8 reg, mask;
- switch (dcdc) {
+ switch (rid) {
case TPS6507X_DCDC_1:
reg = TPS6507X_REG_DEFDCDC1;
+ mask = TPS6507X_DEFDCDCX_DCDC_MASK;
break;
case TPS6507X_DCDC_2:
- if (tps->info[dcdc]->defdcdc_default)
+ if (tps->info[rid]->defdcdc_default)
reg = TPS6507X_REG_DEFDCDC2_HIGH;
else
reg = TPS6507X_REG_DEFDCDC2_LOW;
+ mask = TPS6507X_DEFDCDCX_DCDC_MASK;
break;
case TPS6507X_DCDC_3:
- if (tps->info[dcdc]->defdcdc_default)
+ if (tps->info[rid]->defdcdc_default)
reg = TPS6507X_REG_DEFDCDC3_HIGH;
else
reg = TPS6507X_REG_DEFDCDC3_LOW;
+ mask = TPS6507X_DEFDCDCX_DCDC_MASK;
+ break;
+ case TPS6507X_LDO_1:
+ reg = TPS6507X_REG_LDO_CTRL1;
+ mask = TPS6507X_REG_LDO_CTRL1_LDO1_MASK;
+ break;
+ case TPS6507X_LDO_2:
+ reg = TPS6507X_REG_DEFLDO2;
+ mask = TPS6507X_REG_DEFLDO2_LDO2_MASK;
break;
default:
return -EINVAL;
@@ -358,193 +324,83 @@ static int tps6507x_pmic_dcdc_get_voltage(struct regulator_dev *dev)
if (data < 0)
return data;
- data &= TPS6507X_DEFDCDCX_DCDC_MASK;
- return tps->info[dcdc]->table[data] * 1000;
+ data &= mask;
+ return tps->info[rid]->table[data] * 1000;
}
-static int tps6507x_pmic_dcdc_set_voltage(struct regulator_dev *dev,
- int min_uV, int max_uV,
- unsigned *selector)
+static int tps6507x_pmic_set_voltage_sel(struct regulator_dev *dev,
+ unsigned selector)
{
struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int data, vsel, dcdc = rdev_get_id(dev);
- u8 reg;
+ int data, rid = rdev_get_id(dev);
+ u8 reg, mask;
- switch (dcdc) {
+ switch (rid) {
case TPS6507X_DCDC_1:
reg = TPS6507X_REG_DEFDCDC1;
+ mask = TPS6507X_DEFDCDCX_DCDC_MASK;
break;
case TPS6507X_DCDC_2:
- if (tps->info[dcdc]->defdcdc_default)
+ if (tps->info[rid]->defdcdc_default)
reg = TPS6507X_REG_DEFDCDC2_HIGH;
else
reg = TPS6507X_REG_DEFDCDC2_LOW;
+ mask = TPS6507X_DEFDCDCX_DCDC_MASK;
break;
case TPS6507X_DCDC_3:
- if (tps->info[dcdc]->defdcdc_default)
+ if (tps->info[rid]->defdcdc_default)
reg = TPS6507X_REG_DEFDCDC3_HIGH;
else
reg = TPS6507X_REG_DEFDCDC3_LOW;
+ mask = TPS6507X_DEFDCDCX_DCDC_MASK;
+ break;
+ case TPS6507X_LDO_1:
+ reg = TPS6507X_REG_LDO_CTRL1;
+ mask = TPS6507X_REG_LDO_CTRL1_LDO1_MASK;
+ break;
+ case TPS6507X_LDO_2:
+ reg = TPS6507X_REG_DEFLDO2;
+ mask = TPS6507X_REG_DEFLDO2_LDO2_MASK;
break;
default:
return -EINVAL;
}
- if (min_uV < tps->info[dcdc]->min_uV
- || min_uV > tps->info[dcdc]->max_uV)
- return -EINVAL;
- if (max_uV < tps->info[dcdc]->min_uV
- || max_uV > tps->info[dcdc]->max_uV)
- return -EINVAL;
-
- for (vsel = 0; vsel < tps->info[dcdc]->table_len; vsel++) {
- int mV = tps->info[dcdc]->table[vsel];
- int uV = mV * 1000;
-
- /* Break at the first in-range value */
- if (min_uV <= uV && uV <= max_uV)
- break;
- }
-
- /* write to the register in case we found a match */
- if (vsel == tps->info[dcdc]->table_len)
- return -EINVAL;
-
- *selector = vsel;
-
- data = tps6507x_pmic_reg_read(tps, reg);
- if (data < 0)
- return data;
-
- data &= ~TPS6507X_DEFDCDCX_DCDC_MASK;
- data |= vsel;
-
- return tps6507x_pmic_reg_write(tps, reg, data);
-}
-
-static int tps6507x_pmic_ldo_get_voltage(struct regulator_dev *dev)
-{
- struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int data, ldo = rdev_get_id(dev);
- u8 reg, mask;
-
- if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
- return -EINVAL;
- else {
- reg = (ldo == TPS6507X_LDO_1 ?
- TPS6507X_REG_LDO_CTRL1 : TPS6507X_REG_DEFLDO2);
- mask = (ldo == TPS6507X_LDO_1 ?
- TPS6507X_REG_LDO_CTRL1_LDO1_MASK :
- TPS6507X_REG_DEFLDO2_LDO2_MASK);
- }
-
- data = tps6507x_pmic_reg_read(tps, reg);
- if (data < 0)
- return data;
-
- data &= mask;
- return tps->info[ldo]->table[data] * 1000;
-}
-
-static int tps6507x_pmic_ldo_set_voltage(struct regulator_dev *dev,
- int min_uV, int max_uV,
- unsigned *selector)
-{
- struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int data, vsel, ldo = rdev_get_id(dev);
- u8 reg, mask;
-
- if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
- return -EINVAL;
- else {
- reg = (ldo == TPS6507X_LDO_1 ?
- TPS6507X_REG_LDO_CTRL1 : TPS6507X_REG_DEFLDO2);
- mask = (ldo == TPS6507X_LDO_1 ?
- TPS6507X_REG_LDO_CTRL1_LDO1_MASK :
- TPS6507X_REG_DEFLDO2_LDO2_MASK);
- }
-
- if (min_uV < tps->info[ldo]->min_uV || min_uV > tps->info[ldo]->max_uV)
- return -EINVAL;
- if (max_uV < tps->info[ldo]->min_uV || max_uV > tps->info[ldo]->max_uV)
- return -EINVAL;
-
- for (vsel = 0; vsel < tps->info[ldo]->table_len; vsel++) {
- int mV = tps->info[ldo]->table[vsel];
- int uV = mV * 1000;
-
- /* Break at the first in-range value */
- if (min_uV <= uV && uV <= max_uV)
- break;
- }
-
- if (vsel == tps->info[ldo]->table_len)
- return -EINVAL;
-
- *selector = vsel;
-
data = tps6507x_pmic_reg_read(tps, reg);
if (data < 0)
return data;
data &= ~mask;
- data |= vsel;
+ data |= selector;
return tps6507x_pmic_reg_write(tps, reg, data);
}
-static int tps6507x_pmic_dcdc_list_voltage(struct regulator_dev *dev,
+static int tps6507x_pmic_list_voltage(struct regulator_dev *dev,
unsigned selector)
{
struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int dcdc = rdev_get_id(dev);
+ int rid = rdev_get_id(dev);
- if (dcdc < TPS6507X_DCDC_1 || dcdc > TPS6507X_DCDC_3)
+ if (rid < TPS6507X_DCDC_1 || rid > TPS6507X_LDO_2)
return -EINVAL;
- if (selector >= tps->info[dcdc]->table_len)
+ if (selector >= tps->info[rid]->table_len)
return -EINVAL;
else
- return tps->info[dcdc]->table[selector] * 1000;
+ return tps->info[rid]->table[selector] * 1000;
}
-static int tps6507x_pmic_ldo_list_voltage(struct regulator_dev *dev,
- unsigned selector)
-{
- struct tps6507x_pmic *tps = rdev_get_drvdata(dev);
- int ldo = rdev_get_id(dev);
-
- if (ldo < TPS6507X_LDO_1 || ldo > TPS6507X_LDO_2)
- return -EINVAL;
-
- if (selector >= tps->info[ldo]->table_len)
- return -EINVAL;
- else
- return tps->info[ldo]->table[selector] * 1000;
-}
-
-/* Operations permitted on VDCDCx */
-static struct regulator_ops tps6507x_pmic_dcdc_ops = {
- .is_enabled = tps6507x_pmic_dcdc_is_enabled,
- .enable = tps6507x_pmic_dcdc_enable,
- .disable = tps6507x_pmic_dcdc_disable,
- .get_voltage = tps6507x_pmic_dcdc_get_voltage,
- .set_voltage = tps6507x_pmic_dcdc_set_voltage,
- .list_voltage = tps6507x_pmic_dcdc_list_voltage,
+static struct regulator_ops tps6507x_pmic_ops = {
+ .is_enabled = tps6507x_pmic_is_enabled,
+ .enable = tps6507x_pmic_enable,
+ .disable = tps6507x_pmic_disable,
+ .get_voltage = tps6507x_pmic_get_voltage,
+ .set_voltage_sel = tps6507x_pmic_set_voltage_sel,
+ .list_voltage = tps6507x_pmic_list_voltage,
};
-/* Operations permitted on LDOx */
-static struct regulator_ops tps6507x_pmic_ldo_ops = {
- .is_enabled = tps6507x_pmic_ldo_is_enabled,
- .enable = tps6507x_pmic_ldo_enable,
- .disable = tps6507x_pmic_ldo_disable,
- .get_voltage = tps6507x_pmic_ldo_get_voltage,
- .set_voltage = tps6507x_pmic_ldo_set_voltage,
- .list_voltage = tps6507x_pmic_ldo_list_voltage,
-};
-
-static __devinit
-int tps6507x_pmic_probe(struct platform_device *pdev)
+static __devinit int tps6507x_pmic_probe(struct platform_device *pdev)
{
struct tps6507x_dev *tps6507x_dev = dev_get_drvdata(pdev->dev.parent);
struct tps_info *info = &tps6507x_pmic_regs[0];
@@ -593,8 +449,7 @@ int tps6507x_pmic_probe(struct platform_device *pdev)
tps->desc[i].name = info->name;
tps->desc[i].id = i;
tps->desc[i].n_voltages = info->table_len;
- tps->desc[i].ops = (i > TPS6507X_DCDC_3 ?
- &tps6507x_pmic_ldo_ops : &tps6507x_pmic_dcdc_ops);
+ tps->desc[i].ops = &tps6507x_pmic_ops;
tps->desc[i].type = REGULATOR_VOLTAGE;
tps->desc[i].owner = THIS_MODULE;
@@ -648,22 +503,12 @@ static struct platform_driver tps6507x_pmic_driver = {
.remove = __devexit_p(tps6507x_pmic_remove),
};
-/**
- * tps6507x_pmic_init
- *
- * Module init function
- */
static int __init tps6507x_pmic_init(void)
{
return platform_driver_register(&tps6507x_pmic_driver);
}
subsys_initcall(tps6507x_pmic_init);
-/**
- * tps6507x_pmic_cleanup
- *
- * Module exit function
- */
static void __exit tps6507x_pmic_cleanup(void)
{
platform_driver_unregister(&tps6507x_pmic_driver);
diff --git a/drivers/regulator/tps65217-regulator.c b/drivers/regulator/tps65217-regulator.c
index 28a10eaeda17..e39521b42772 100644
--- a/drivers/regulator/tps65217-regulator.c
+++ b/drivers/regulator/tps65217-regulator.c
@@ -82,11 +82,11 @@ static int tps65217_uv_to_vsel1(int uV, unsigned int *vsel)
return -EINVAL;
if (uV <= 1500000)
- *vsel = (uV - 875001) / 25000;
+ *vsel = DIV_ROUND_UP(uV - 900000, 25000);
else if (uV <= 2900000)
- *vsel = 24 + (uV - 1450001) / 50000;
+ *vsel = 24 + DIV_ROUND_UP(uV - 1500000, 50000);
else if (uV < 3300000)
- *vsel = 52 + (uV - 2800001) / 100000;
+ *vsel = 52 + DIV_ROUND_UP(uV - 2900000, 100000);
else
*vsel = 56;
@@ -116,11 +116,11 @@ static int tps65217_uv_to_vsel2(int uV, unsigned int *vsel)
return -EINVAL;
if (uV <= 1900000)
- *vsel = (uV - 1450001) / 50000;
+ *vsel = DIV_ROUND_UP(uV - 1500000, 50000);
else if (uV <= 2400000)
- *vsel = 8 + (uV - 1800001) / 100000;
+ *vsel = 8 + DIV_ROUND_UP(uV - 1900000, 100000);
else
- *vsel = 13 + (uV - 2350001) / 50000;
+ *vsel = 13 + DIV_ROUND_UP(uV - 2400000, 50000);
return 0;
}
@@ -151,166 +151,69 @@ static struct tps_info tps65217_pmic_regs[] = {
TPS65217_REG_DEFLS2, TPS65217_DEFLDO4_LDO4_MASK),
};
-static int tps65217_pmic_dcdc_is_enabled(struct regulator_dev *dev)
+static int tps65217_pmic_is_enabled(struct regulator_dev *dev)
{
int ret;
struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int data, dcdc = rdev_get_id(dev);
+ unsigned int data, rid = rdev_get_id(dev);
- if (dcdc < TPS65217_DCDC_1 || dcdc > TPS65217_DCDC_3)
+ if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4)
return -EINVAL;
ret = tps65217_reg_read(tps, TPS65217_REG_ENABLE, &data);
if (ret)
return ret;
- return (data & tps->info[dcdc]->enable_mask) ? 1 : 0;
+ return (data & tps->info[rid]->enable_mask) ? 1 : 0;
}
-static int tps65217_pmic_ldo_is_enabled(struct regulator_dev *dev)
+static int tps65217_pmic_enable(struct regulator_dev *dev)
{
- int ret;
struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int data, ldo = rdev_get_id(dev);
+ unsigned int rid = rdev_get_id(dev);
- if (ldo < TPS65217_LDO_1 || ldo > TPS65217_LDO_4)
- return -EINVAL;
-
- ret = tps65217_reg_read(tps, TPS65217_REG_ENABLE, &data);
- if (ret)
- return ret;
-
- return (data & tps->info[ldo]->enable_mask) ? 1 : 0;
-}
-
-static int tps65217_pmic_dcdc_enable(struct regulator_dev *dev)
-{
- struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int dcdc = rdev_get_id(dev);
-
- if (dcdc < TPS65217_DCDC_1 || dcdc > TPS65217_DCDC_3)
+ if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4)
return -EINVAL;
/* Enable the regulator and password protection is level 1 */
return tps65217_set_bits(tps, TPS65217_REG_ENABLE,
- tps->info[dcdc]->enable_mask,
- tps->info[dcdc]->enable_mask,
+ tps->info[rid]->enable_mask,
+ tps->info[rid]->enable_mask,
TPS65217_PROTECT_L1);
}
-static int tps65217_pmic_dcdc_disable(struct regulator_dev *dev)
+static int tps65217_pmic_disable(struct regulator_dev *dev)
{
struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int dcdc = rdev_get_id(dev);
+ unsigned int rid = rdev_get_id(dev);
- if (dcdc < TPS65217_DCDC_1 || dcdc > TPS65217_DCDC_3)
+ if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4)
return -EINVAL;
/* Disable the regulator and password protection is level 1 */
return tps65217_clear_bits(tps, TPS65217_REG_ENABLE,
- tps->info[dcdc]->enable_mask, TPS65217_PROTECT_L1);
-}
-
-static int tps65217_pmic_ldo_enable(struct regulator_dev *dev)
-{
- struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int ldo = rdev_get_id(dev);
-
- if (ldo < TPS65217_LDO_1 || ldo > TPS65217_LDO_4)
- return -EINVAL;
-
- /* Enable the regulator and password protection is level 1 */
- return tps65217_set_bits(tps, TPS65217_REG_ENABLE,
- tps->info[ldo]->enable_mask,
- tps->info[ldo]->enable_mask,
- TPS65217_PROTECT_L1);
-}
-
-static int tps65217_pmic_ldo_disable(struct regulator_dev *dev)
-{
- struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int ldo = rdev_get_id(dev);
-
- if (ldo < TPS65217_LDO_1 || ldo > TPS65217_LDO_4)
- return -EINVAL;
-
- /* Disable the regulator and password protection is level 1 */
- return tps65217_clear_bits(tps, TPS65217_REG_ENABLE,
- tps->info[ldo]->enable_mask, TPS65217_PROTECT_L1);
-}
-
-static int tps65217_pmic_dcdc_get_voltage_sel(struct regulator_dev *dev)
-{
- int ret;
- struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int selector, dcdc = rdev_get_id(dev);
-
- if (dcdc < TPS65217_DCDC_1 || dcdc > TPS65217_DCDC_3)
- return -EINVAL;
-
- ret = tps65217_reg_read(tps, tps->info[dcdc]->set_vout_reg, &selector);
- if (ret)
- return ret;
-
- selector &= tps->info[dcdc]->set_vout_mask;
-
- return selector;
+ tps->info[rid]->enable_mask, TPS65217_PROTECT_L1);
}
-static int tps65217_pmic_dcdc_set_voltage(struct regulator_dev *dev,
- int min_uV, int max_uV, unsigned *selector)
+static int tps65217_pmic_get_voltage_sel(struct regulator_dev *dev)
{
int ret;
struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int dcdc = rdev_get_id(dev);
-
- if (dcdc < TPS65217_DCDC_1 || dcdc > TPS65217_DCDC_3)
- return -EINVAL;
+ unsigned int selector, rid = rdev_get_id(dev);
- if (min_uV < tps->info[dcdc]->min_uV
- || min_uV > tps->info[dcdc]->max_uV)
+ if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4)
return -EINVAL;
- if (max_uV < tps->info[dcdc]->min_uV
- || max_uV > tps->info[dcdc]->max_uV)
- return -EINVAL;
-
- ret = tps->info[dcdc]->uv_to_vsel(min_uV, selector);
+ ret = tps65217_reg_read(tps, tps->info[rid]->set_vout_reg, &selector);
if (ret)
return ret;
- /* Set the voltage based on vsel value and write protect level is 2 */
- ret = tps65217_set_bits(tps, tps->info[dcdc]->set_vout_reg,
- tps->info[dcdc]->set_vout_mask,
- *selector, TPS65217_PROTECT_L2);
- if (ret)
- return ret;
-
- /* Set GO bit to initiate voltage transistion */
- return tps65217_set_bits(tps, TPS65217_REG_DEFSLEW,
- TPS65217_DEFSLEW_GO, TPS65217_DEFSLEW_GO,
- TPS65217_PROTECT_L2);
-}
-
-static int tps65217_pmic_ldo_get_voltage_sel(struct regulator_dev *dev)
-{
- int ret;
- struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int selector, ldo = rdev_get_id(dev);
-
- if (ldo < TPS65217_LDO_1 || ldo > TPS65217_LDO_4)
- return -EINVAL;
-
- ret = tps65217_reg_read(tps, tps->info[ldo]->set_vout_reg, &selector);
- if (ret)
- return ret;
-
- selector &= tps->info[ldo]->set_vout_mask;
+ selector &= tps->info[rid]->set_vout_mask;
return selector;
}
-static int tps65217_pmic_ldo_set_voltage_sel(struct regulator_dev *dev,
+static int tps65217_pmic_ldo1_set_voltage_sel(struct regulator_dev *dev,
unsigned selector)
{
struct tps65217 *tps = rdev_get_drvdata(dev);
@@ -328,112 +231,95 @@ static int tps65217_pmic_ldo_set_voltage_sel(struct regulator_dev *dev,
selector, TPS65217_PROTECT_L2);
}
-static int tps65217_pmic_ldo_set_voltage(struct regulator_dev *dev,
+static int tps65217_pmic_set_voltage(struct regulator_dev *dev,
int min_uV, int max_uV, unsigned *selector)
{
int ret;
struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int ldo = rdev_get_id(dev);
+ unsigned int rid = rdev_get_id(dev);
- if (ldo < TPS65217_LDO_2 || ldo > TPS65217_LDO_4)
+ /* LDO1 implements set_voltage_sel callback */
+ if (rid == TPS65217_LDO_1)
return -EINVAL;
- if (min_uV < tps->info[ldo]->min_uV
- || min_uV > tps->info[ldo]->max_uV)
+ if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4)
return -EINVAL;
- if (max_uV < tps->info[ldo]->min_uV
- || max_uV > tps->info[ldo]->max_uV)
+ if (min_uV < tps->info[rid]->min_uV
+ || min_uV > tps->info[rid]->max_uV)
return -EINVAL;
- ret = tps->info[ldo]->uv_to_vsel(min_uV, selector);
+ if (max_uV < tps->info[rid]->min_uV
+ || max_uV > tps->info[rid]->max_uV)
+ return -EINVAL;
+
+ ret = tps->info[rid]->uv_to_vsel(min_uV, selector);
if (ret)
return ret;
/* Set the voltage based on vsel value and write protect level is 2 */
- return tps65217_set_bits(tps, tps->info[ldo]->set_vout_reg,
- tps->info[ldo]->set_vout_mask,
- *selector, TPS65217_PROTECT_L2);
-}
-
-static int tps65217_pmic_dcdc_list_voltage(struct regulator_dev *dev,
- unsigned selector)
-{
- struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int dcdc = rdev_get_id(dev);
-
- if (dcdc < TPS65217_DCDC_1 || dcdc > TPS65217_DCDC_3)
- return -EINVAL;
-
- if (selector >= tps->info[dcdc]->table_len)
- return -EINVAL;
+ ret = tps65217_set_bits(tps, tps->info[rid]->set_vout_reg,
+ tps->info[rid]->set_vout_mask,
+ *selector, TPS65217_PROTECT_L2);
+
+ /* Set GO bit for DCDCx to initiate voltage transistion */
+ switch (rid) {
+ case TPS65217_DCDC_1 ... TPS65217_DCDC_3:
+ ret = tps65217_set_bits(tps, TPS65217_REG_DEFSLEW,
+ TPS65217_DEFSLEW_GO, TPS65217_DEFSLEW_GO,
+ TPS65217_PROTECT_L2);
+ break;
+ }
- return tps->info[dcdc]->vsel_to_uv(selector);
+ return ret;
}
-static int tps65217_pmic_ldo_list_voltage(struct regulator_dev *dev,
+static int tps65217_pmic_list_voltage(struct regulator_dev *dev,
unsigned selector)
{
struct tps65217 *tps = rdev_get_drvdata(dev);
- unsigned int ldo = rdev_get_id(dev);
+ unsigned int rid = rdev_get_id(dev);
- if (ldo < TPS65217_LDO_1 || ldo > TPS65217_LDO_4)
+ if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4)
return -EINVAL;
- if (selector >= tps->info[ldo]->table_len)
+ if (selector >= tps->info[rid]->table_len)
return -EINVAL;
- if (tps->info[ldo]->table)
- return tps->info[ldo]->table[selector];
+ if (tps->info[rid]->table)
+ return tps->info[rid]->table[selector];
- return tps->info[ldo]->vsel_to_uv(selector);
+ return tps->info[rid]->vsel_to_uv(selector);
}
-/* Operations permitted on DCDCx */
-static struct regulator_ops tps65217_pmic_dcdc_ops = {
- .is_enabled = tps65217_pmic_dcdc_is_enabled,
- .enable = tps65217_pmic_dcdc_enable,
- .disable = tps65217_pmic_dcdc_disable,
- .get_voltage_sel = tps65217_pmic_dcdc_get_voltage_sel,
- .set_voltage = tps65217_pmic_dcdc_set_voltage,
- .list_voltage = tps65217_pmic_dcdc_list_voltage,
+/* Operations permitted on DCDCx, LDO2, LDO3 and LDO4 */
+static struct regulator_ops tps65217_pmic_ops = {
+ .is_enabled = tps65217_pmic_is_enabled,
+ .enable = tps65217_pmic_enable,
+ .disable = tps65217_pmic_disable,
+ .get_voltage_sel = tps65217_pmic_get_voltage_sel,
+ .set_voltage = tps65217_pmic_set_voltage,
+ .list_voltage = tps65217_pmic_list_voltage,
};
/* Operations permitted on LDO1 */
static struct regulator_ops tps65217_pmic_ldo1_ops = {
- .is_enabled = tps65217_pmic_ldo_is_enabled,
- .enable = tps65217_pmic_ldo_enable,
- .disable = tps65217_pmic_ldo_disable,
- .get_voltage_sel = tps65217_pmic_ldo_get_voltage_sel,
- .set_voltage_sel = tps65217_pmic_ldo_set_voltage_sel,
- .list_voltage = tps65217_pmic_ldo_list_voltage,
-};
-
-/* Operations permitted on LDO2, LDO3 and LDO4 */
-static struct regulator_ops tps65217_pmic_ldo234_ops = {
- .is_enabled = tps65217_pmic_ldo_is_enabled,
- .enable = tps65217_pmic_ldo_enable,
- .disable = tps65217_pmic_ldo_disable,
- .get_voltage_sel = tps65217_pmic_ldo_get_voltage_sel,
- .set_voltage = tps65217_pmic_ldo_set_voltage,
- .list_voltage = tps65217_pmic_ldo_list_voltage,
+ .is_enabled = tps65217_pmic_is_enabled,
+ .enable = tps65217_pmic_enable,
+ .disable = tps65217_pmic_disable,
+ .get_voltage_sel = tps65217_pmic_get_voltage_sel,
+ .set_voltage_sel = tps65217_pmic_ldo1_set_voltage_sel,
+ .list_voltage = tps65217_pmic_list_voltage,
};
static struct regulator_desc regulators[] = {
- TPS65217_REGULATOR("DCDC1", TPS65217_DCDC_1,
- tps65217_pmic_dcdc_ops, 64),
- TPS65217_REGULATOR("DCDC2",TPS65217_DCDC_2,
- tps65217_pmic_dcdc_ops, 64),
- TPS65217_REGULATOR("DCDC3", TPS65217_DCDC_3,
- tps65217_pmic_dcdc_ops, 64),
- TPS65217_REGULATOR("LDO1", TPS65217_LDO_1,
- tps65217_pmic_ldo1_ops, 16),
- TPS65217_REGULATOR("LDO2", TPS65217_LDO_2,
- tps65217_pmic_ldo234_ops, 64),
- TPS65217_REGULATOR("LDO3", TPS65217_LDO_3,
- tps65217_pmic_ldo234_ops, 32),
- TPS65217_REGULATOR("LDO4", TPS65217_LDO_4,
- tps65217_pmic_ldo234_ops, 32),
+ TPS65217_REGULATOR("DCDC1", TPS65217_DCDC_1, tps65217_pmic_ops, 64),
+ TPS65217_REGULATOR("DCDC2", TPS65217_DCDC_2, tps65217_pmic_ops, 64),
+ TPS65217_REGULATOR("DCDC3", TPS65217_DCDC_3, tps65217_pmic_ops, 64),
+ TPS65217_REGULATOR("LDO1", TPS65217_LDO_1, tps65217_pmic_ldo1_ops, 16),
+ TPS65217_REGULATOR("LDO2", TPS65217_LDO_2, tps65217_pmic_ops, 64),
+ TPS65217_REGULATOR("LDO3", TPS65217_LDO_3, tps65217_pmic_ops, 32),
+ TPS65217_REGULATOR("LDO4", TPS65217_LDO_4, tps65217_pmic_ops, 32),
};
static int __devinit tps65217_regulator_probe(struct platform_device *pdev)
@@ -486,7 +372,6 @@ static void __exit tps65217_regulator_exit(void)
}
module_exit(tps65217_regulator_exit);
-
MODULE_AUTHOR("AnilKumar Ch <anilkumar@ti.com>");
MODULE_DESCRIPTION("TPS65217 voltage regulator driver");
MODULE_ALIAS("platform:tps65217-pmic");
diff --git a/drivers/regulator/tps6524x-regulator.c b/drivers/regulator/tps6524x-regulator.c
index 70b7b1f4f000..60846e00c167 100644
--- a/drivers/regulator/tps6524x-regulator.c
+++ b/drivers/regulator/tps6524x-regulator.c
@@ -108,9 +108,7 @@
#define N_DCDC 3
#define N_LDO 2
#define N_SWITCH 2
-#define N_REGULATORS (3 /* DCDC */ + \
- 2 /* LDO */ + \
- 2 /* switch */)
+#define N_REGULATORS (N_DCDC + N_LDO + N_SWITCH)
#define FIXED_ILIMSEL BIT(0)
#define FIXED_VOLTAGE BIT(1)
diff --git a/drivers/regulator/tps6586x-regulator.c b/drivers/regulator/tps6586x-regulator.c
index c75fb20faa57..29b615ce3aff 100644
--- a/drivers/regulator/tps6586x-regulator.c
+++ b/drivers/regulator/tps6586x-regulator.c
@@ -383,7 +383,7 @@ static int __devinit tps6586x_regulator_probe(struct platform_device *pdev)
int id = pdev->id;
int err;
- dev_dbg(&pdev->dev, "Probing reulator %d\n", id);
+ dev_dbg(&pdev->dev, "Probing regulator %d\n", id);
ri = find_regulator_info(id);
if (ri == NULL) {
diff --git a/drivers/regulator/tps65910-regulator.c b/drivers/regulator/tps65910-regulator.c
index 9092b7f998c1..3d1370f9bc7f 100644
--- a/drivers/regulator/tps65910-regulator.c
+++ b/drivers/regulator/tps65910-regulator.c
@@ -28,7 +28,8 @@
#define TPS65910_SUPPLY_STATE_ENABLED 0x1
#define EXT_SLEEP_CONTROL (TPS65910_SLEEP_CONTROL_EXT_INPUT_EN1 | \
TPS65910_SLEEP_CONTROL_EXT_INPUT_EN2 | \
- TPS65910_SLEEP_CONTROL_EXT_INPUT_EN3)
+ TPS65910_SLEEP_CONTROL_EXT_INPUT_EN3 | \
+ TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP)
/* supported VIO voltages in milivolts */
static const u16 VIO_VSEL_table[] = {
@@ -88,11 +89,13 @@ struct tps_info {
unsigned max_uV;
u8 n_voltages;
const u16 *voltage_table;
+ int enable_time_us;
};
static struct tps_info tps65910_regs[] = {
{
.name = "VRTC",
+ .enable_time_us = 2200,
},
{
.name = "VIO",
@@ -100,16 +103,19 @@ static struct tps_info tps65910_regs[] = {
.max_uV = 3300000,
.n_voltages = ARRAY_SIZE(VIO_VSEL_table),
.voltage_table = VIO_VSEL_table,
+ .enable_time_us = 350,
},
{
.name = "VDD1",
.min_uV = 600000,
.max_uV = 4500000,
+ .enable_time_us = 350,
},
{
.name = "VDD2",
.min_uV = 600000,
.max_uV = 4500000,
+ .enable_time_us = 350,
},
{
.name = "VDD3",
@@ -117,6 +123,7 @@ static struct tps_info tps65910_regs[] = {
.max_uV = 5000000,
.n_voltages = ARRAY_SIZE(VDD3_VSEL_table),
.voltage_table = VDD3_VSEL_table,
+ .enable_time_us = 200,
},
{
.name = "VDIG1",
@@ -124,6 +131,7 @@ static struct tps_info tps65910_regs[] = {
.max_uV = 2700000,
.n_voltages = ARRAY_SIZE(VDIG1_VSEL_table),
.voltage_table = VDIG1_VSEL_table,
+ .enable_time_us = 100,
},
{
.name = "VDIG2",
@@ -131,6 +139,7 @@ static struct tps_info tps65910_regs[] = {
.max_uV = 1800000,
.n_voltages = ARRAY_SIZE(VDIG2_VSEL_table),
.voltage_table = VDIG2_VSEL_table,
+ .enable_time_us = 100,
},
{
.name = "VPLL",
@@ -138,6 +147,7 @@ static struct tps_info tps65910_regs[] = {
.max_uV = 2500000,
.n_voltages = ARRAY_SIZE(VPLL_VSEL_table),
.voltage_table = VPLL_VSEL_table,
+ .enable_time_us = 100,
},
{
.name = "VDAC",
@@ -145,6 +155,7 @@ static struct tps_info tps65910_regs[] = {
.max_uV = 2850000,
.n_voltages = ARRAY_SIZE(VDAC_VSEL_table),
.voltage_table = VDAC_VSEL_table,
+ .enable_time_us = 100,
},
{
.name = "VAUX1",
@@ -152,6 +163,7 @@ static struct tps_info tps65910_regs[] = {
.max_uV = 2850000,
.n_voltages = ARRAY_SIZE(VAUX1_VSEL_table),
.voltage_table = VAUX1_VSEL_table,
+ .enable_time_us = 100,
},
{
.name = "VAUX2",
@@ -159,6 +171,7 @@ static struct tps_info tps65910_regs[] = {
.max_uV = 3300000,
.n_voltages = ARRAY_SIZE(VAUX2_VSEL_table),
.voltage_table = VAUX2_VSEL_table,
+ .enable_time_us = 100,
},
{
.name = "VAUX33",
@@ -166,6 +179,7 @@ static struct tps_info tps65910_regs[] = {
.max_uV = 3300000,
.n_voltages = ARRAY_SIZE(VAUX33_VSEL_table),
.voltage_table = VAUX33_VSEL_table,
+ .enable_time_us = 100,
},
{
.name = "VMMC",
@@ -173,12 +187,14 @@ static struct tps_info tps65910_regs[] = {
.max_uV = 3300000,
.n_voltages = ARRAY_SIZE(VMMC_VSEL_table),
.voltage_table = VMMC_VSEL_table,
+ .enable_time_us = 100,
},
};
static struct tps_info tps65911_regs[] = {
{
.name = "VRTC",
+ .enable_time_us = 2200,
},
{
.name = "VIO",
@@ -186,72 +202,84 @@ static struct tps_info tps65911_regs[] = {
.max_uV = 3300000,
.n_voltages = ARRAY_SIZE(VIO_VSEL_table),
.voltage_table = VIO_VSEL_table,
+ .enable_time_us = 350,
},
{
.name = "VDD1",
.min_uV = 600000,
.max_uV = 4500000,
.n_voltages = 73,
+ .enable_time_us = 350,
},
{
.name = "VDD2",
.min_uV = 600000,
.max_uV = 4500000,
.n_voltages = 73,
+ .enable_time_us = 350,
},
{
.name = "VDDCTRL",
.min_uV = 600000,
.max_uV = 1400000,
.n_voltages = 65,
+ .enable_time_us = 900,
},
{
.name = "LDO1",
.min_uV = 1000000,
.max_uV = 3300000,
.n_voltages = 47,
+ .enable_time_us = 420,
},
{
.name = "LDO2",
.min_uV = 1000000,
.max_uV = 3300000,
.n_voltages = 47,
+ .enable_time_us = 420,
},
{
.name = "LDO3",
.min_uV = 1000000,
.max_uV = 3300000,
.n_voltages = 24,
+ .enable_time_us = 230,
},
{
.name = "LDO4",
.min_uV = 1000000,
.max_uV = 3300000,
.n_voltages = 47,
+ .enable_time_us = 230,
},
{
.name = "LDO5",
.min_uV = 1000000,
.max_uV = 3300000,
.n_voltages = 24,
+ .enable_time_us = 230,
},
{
.name = "LDO6",
.min_uV = 1000000,
.max_uV = 3300000,
.n_voltages = 24,
+ .enable_time_us = 230,
},
{
.name = "LDO7",
.min_uV = 1000000,
.max_uV = 3300000,
.n_voltages = 24,
+ .enable_time_us = 230,
},
{
.name = "LDO8",
.min_uV = 1000000,
.max_uV = 3300000,
.n_voltages = 24,
+ .enable_time_us = 230,
},
};
@@ -481,6 +509,12 @@ static int tps65910_disable(struct regulator_dev *dev)
return tps65910_clear_bits(mfd, reg, TPS65910_SUPPLY_STATE_ENABLED);
}
+static int tps65910_enable_time(struct regulator_dev *dev)
+{
+ struct tps65910_reg *pmic = rdev_get_drvdata(dev);
+ int id = rdev_get_id(dev);
+ return pmic->info[id]->enable_time_us;
+}
static int tps65910_set_mode(struct regulator_dev *dev, unsigned int mode)
{
@@ -519,7 +553,7 @@ static unsigned int tps65910_get_mode(struct regulator_dev *dev)
if (value < 0)
return value;
- if (value & LDO_ST_ON_BIT)
+ if (!(value & LDO_ST_ON_BIT))
return REGULATOR_MODE_STANDBY;
else if (value & LDO_ST_MODE_BIT)
return REGULATOR_MODE_IDLE;
@@ -527,10 +561,10 @@ static unsigned int tps65910_get_mode(struct regulator_dev *dev)
return REGULATOR_MODE_NORMAL;
}
-static int tps65910_get_voltage_dcdc(struct regulator_dev *dev)
+static int tps65910_get_voltage_dcdc_sel(struct regulator_dev *dev)
{
struct tps65910_reg *pmic = rdev_get_drvdata(dev);
- int id = rdev_get_id(dev), voltage = 0;
+ int id = rdev_get_id(dev);
int opvsel = 0, srvsel = 0, vselmax = 0, mult = 0, sr = 0;
switch (id) {
@@ -574,9 +608,7 @@ static int tps65910_get_voltage_dcdc(struct regulator_dev *dev)
srvsel = 3;
if (srvsel > vselmax)
srvsel = vselmax;
- srvsel -= 3;
-
- voltage = (srvsel * VDD1_2_OFFSET + VDD1_2_MIN_VOLT) * 100;
+ return srvsel - 3;
} else {
/* normalise to valid range*/
@@ -584,14 +616,9 @@ static int tps65910_get_voltage_dcdc(struct regulator_dev *dev)
opvsel = 3;
if (opvsel > vselmax)
opvsel = vselmax;
- opvsel -= 3;
-
- voltage = (opvsel * VDD1_2_OFFSET + VDD1_2_MIN_VOLT) * 100;
+ return opvsel - 3;
}
-
- voltage *= mult;
-
- return voltage;
+ return -EINVAL;
}
static int tps65910_get_voltage(struct regulator_dev *dev)
@@ -674,8 +701,9 @@ static int tps65911_get_voltage(struct regulator_dev *dev)
step_mv = 100;
break;
case TPS65910_REG_VIO:
+ value &= LDO_SEL_MASK;
+ value >>= LDO_SEL_SHIFT;
return pmic->info[id]->voltage_table[value] * 1000;
- break;
default:
return -EINVAL;
}
@@ -683,8 +711,8 @@ static int tps65911_get_voltage(struct regulator_dev *dev)
return (LDO_MIN_VOLT + value * step_mv) * 1000;
}
-static int tps65910_set_voltage_dcdc(struct regulator_dev *dev,
- unsigned selector)
+static int tps65910_set_voltage_dcdc_sel(struct regulator_dev *dev,
+ unsigned selector)
{
struct tps65910_reg *pmic = rdev_get_drvdata(dev);
int id = rdev_get_id(dev), vsel;
@@ -721,7 +749,8 @@ static int tps65910_set_voltage_dcdc(struct regulator_dev *dev,
return 0;
}
-static int tps65910_set_voltage(struct regulator_dev *dev, unsigned selector)
+static int tps65910_set_voltage_sel(struct regulator_dev *dev,
+ unsigned selector)
{
struct tps65910_reg *pmic = rdev_get_drvdata(dev);
int reg, id = rdev_get_id(dev);
@@ -747,7 +776,8 @@ static int tps65910_set_voltage(struct regulator_dev *dev, unsigned selector)
return -EINVAL;
}
-static int tps65911_set_voltage(struct regulator_dev *dev, unsigned selector)
+static int tps65911_set_voltage_sel(struct regulator_dev *dev,
+ unsigned selector)
{
struct tps65910_reg *pmic = rdev_get_drvdata(dev);
int reg, id = rdev_get_id(dev);
@@ -767,9 +797,11 @@ static int tps65911_set_voltage(struct regulator_dev *dev, unsigned selector)
case TPS65911_REG_LDO6:
case TPS65911_REG_LDO7:
case TPS65911_REG_LDO8:
- case TPS65910_REG_VIO:
return tps65910_modify_bits(pmic, reg,
(selector << LDO_SEL_SHIFT), LDO3_SEL_MASK);
+ case TPS65910_REG_VIO:
+ return tps65910_modify_bits(pmic, reg,
+ (selector << LDO_SEL_SHIFT), LDO_SEL_MASK);
}
return -EINVAL;
@@ -855,15 +887,42 @@ static int tps65911_list_voltage(struct regulator_dev *dev, unsigned selector)
return (LDO_MIN_VOLT + selector * step_mv) * 1000;
}
+static int tps65910_set_voltage_dcdc_time_sel(struct regulator_dev *dev,
+ unsigned int old_selector, unsigned int new_selector)
+{
+ int id = rdev_get_id(dev);
+ int old_volt, new_volt;
+
+ old_volt = tps65910_list_voltage_dcdc(dev, old_selector);
+ if (old_volt < 0)
+ return old_volt;
+
+ new_volt = tps65910_list_voltage_dcdc(dev, new_selector);
+ if (new_volt < 0)
+ return new_volt;
+
+ /* VDD1 and VDD2 are 12.5mV/us, VDDCTRL is 100mV/20us */
+ switch (id) {
+ case TPS65910_REG_VDD1:
+ case TPS65910_REG_VDD2:
+ return DIV_ROUND_UP(abs(old_volt - new_volt), 12500);
+ case TPS65911_REG_VDDCTRL:
+ return DIV_ROUND_UP(abs(old_volt - new_volt), 5000);
+ }
+ return -EINVAL;
+}
+
/* Regulator ops (except VRTC) */
static struct regulator_ops tps65910_ops_dcdc = {
.is_enabled = tps65910_is_enabled,
.enable = tps65910_enable,
.disable = tps65910_disable,
+ .enable_time = tps65910_enable_time,
.set_mode = tps65910_set_mode,
.get_mode = tps65910_get_mode,
- .get_voltage = tps65910_get_voltage_dcdc,
- .set_voltage_sel = tps65910_set_voltage_dcdc,
+ .get_voltage_sel = tps65910_get_voltage_dcdc_sel,
+ .set_voltage_sel = tps65910_set_voltage_dcdc_sel,
+ .set_voltage_time_sel = tps65910_set_voltage_dcdc_time_sel,
.list_voltage = tps65910_list_voltage_dcdc,
};
@@ -871,6 +930,7 @@ static struct regulator_ops tps65910_ops_vdd3 = {
.is_enabled = tps65910_is_enabled,
.enable = tps65910_enable,
.disable = tps65910_disable,
+ .enable_time = tps65910_enable_time,
.set_mode = tps65910_set_mode,
.get_mode = tps65910_get_mode,
.get_voltage = tps65910_get_voltage_vdd3,
@@ -881,10 +941,11 @@ static struct regulator_ops tps65910_ops = {
.is_enabled = tps65910_is_enabled,
.enable = tps65910_enable,
.disable = tps65910_disable,
+ .enable_time = tps65910_enable_time,
.set_mode = tps65910_set_mode,
.get_mode = tps65910_get_mode,
.get_voltage = tps65910_get_voltage,
- .set_voltage_sel = tps65910_set_voltage,
+ .set_voltage_sel = tps65910_set_voltage_sel,
.list_voltage = tps65910_list_voltage,
};
@@ -892,10 +953,11 @@ static struct regulator_ops tps65911_ops = {
.is_enabled = tps65910_is_enabled,
.enable = tps65910_enable,
.disable = tps65910_disable,
+ .enable_time = tps65910_enable_time,
.set_mode = tps65910_set_mode,
.get_mode = tps65910_get_mode,
.get_voltage = tps65911_get_voltage,
- .set_voltage_sel = tps65911_set_voltage,
+ .set_voltage_sel = tps65911_set_voltage_sel,
.list_voltage = tps65911_list_voltage,
};
@@ -919,6 +981,8 @@ static int tps65910_set_ext_sleep_config(struct tps65910_reg *pmic,
TPS65910_SLEEP_CONTROL_EXT_INPUT_EN2) != 0);
en_count += ((ext_sleep_config &
TPS65910_SLEEP_CONTROL_EXT_INPUT_EN3) != 0);
+ en_count += ((ext_sleep_config &
+ TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP) != 0);
if (en_count > 1) {
dev_err(mfd->dev,
"External sleep control flag is not proper\n");
@@ -1015,12 +1079,18 @@ static int tps65910_set_ext_sleep_config(struct tps65910_reg *pmic,
ret = tps65910_clear_bits(mfd,
TPS65910_SLEEP_KEEP_LDO_ON + regoffs, bit_pos);
- if (!ret)
- ret = tps65910_set_bits(mfd,
- TPS65910_SLEEP_SET_LDO_OFF + regoffs, bit_pos);
+ if (!ret) {
+ if (ext_sleep_config & TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP)
+ ret = tps65910_set_bits(mfd,
+ TPS65910_SLEEP_SET_LDO_OFF + regoffs, bit_pos);
+ else
+ ret = tps65910_clear_bits(mfd,
+ TPS65910_SLEEP_SET_LDO_OFF + regoffs, bit_pos);
+ }
if (ret < 0)
dev_err(mfd->dev,
"Error in configuring SLEEP register\n");
+
return ret;
}
@@ -1232,6 +1302,6 @@ static void __exit tps65910_cleanup(void)
module_exit(tps65910_cleanup);
MODULE_AUTHOR("Graeme Gregory <gg@slimlogic.co.uk>");
-MODULE_DESCRIPTION("TPS6507x voltage regulator driver");
+MODULE_DESCRIPTION("TPS65910/TPS65911 voltage regulator driver");
MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:tps65910-pmic");
diff --git a/drivers/regulator/tps65912-regulator.c b/drivers/regulator/tps65912-regulator.c
index da00d88f94b7..b36799b1f530 100644
--- a/drivers/regulator/tps65912-regulator.c
+++ b/drivers/regulator/tps65912-regulator.c
@@ -114,10 +114,7 @@ struct tps65912_reg {
struct mutex io_lock;
int mode;
int (*get_ctrl_reg)(int);
- int dcdc1_range;
- int dcdc2_range;
- int dcdc3_range;
- int dcdc4_range;
+ int dcdc_range[TPS65912_NUM_DCDC];
int pwm_mode_reg;
int eco_reg;
};
@@ -125,46 +122,31 @@ struct tps65912_reg {
static int tps65912_get_range(struct tps65912_reg *pmic, int id)
{
struct tps65912 *mfd = pmic->mfd;
-
- if (id > TPS65912_REG_DCDC4)
- return 0;
+ int range;
switch (id) {
case TPS65912_REG_DCDC1:
- pmic->dcdc1_range = tps65912_reg_read(mfd,
- TPS65912_DCDC1_LIMIT);
- if (pmic->dcdc1_range < 0)
- return pmic->dcdc1_range;
- pmic->dcdc1_range = (pmic->dcdc1_range &
- DCDC_LIMIT_RANGE_MASK) >> DCDC_LIMIT_RANGE_SHIFT;
- return pmic->dcdc1_range;
+ range = tps65912_reg_read(mfd, TPS65912_DCDC1_LIMIT);
+ break;
case TPS65912_REG_DCDC2:
- pmic->dcdc2_range = tps65912_reg_read(mfd,
- TPS65912_DCDC2_LIMIT);
- if (pmic->dcdc2_range < 0)
- return pmic->dcdc2_range;
- pmic->dcdc2_range = (pmic->dcdc2_range &
- DCDC_LIMIT_RANGE_MASK) >> DCDC_LIMIT_RANGE_SHIFT;
- return pmic->dcdc2_range;
+ range = tps65912_reg_read(mfd, TPS65912_DCDC2_LIMIT);
+ break;
case TPS65912_REG_DCDC3:
- pmic->dcdc3_range = tps65912_reg_read(mfd,
- TPS65912_DCDC3_LIMIT);
- if (pmic->dcdc3_range < 0)
- return pmic->dcdc3_range;
- pmic->dcdc3_range = (pmic->dcdc3_range &
- DCDC_LIMIT_RANGE_MASK) >> DCDC_LIMIT_RANGE_SHIFT;
- return pmic->dcdc3_range;
+ range = tps65912_reg_read(mfd, TPS65912_DCDC3_LIMIT);
+ break;
case TPS65912_REG_DCDC4:
- pmic->dcdc4_range = tps65912_reg_read(mfd,
- TPS65912_DCDC4_LIMIT);
- if (pmic->dcdc4_range < 0)
- return pmic->dcdc4_range;
- pmic->dcdc4_range = (pmic->dcdc4_range &
- DCDC_LIMIT_RANGE_MASK) >> DCDC_LIMIT_RANGE_SHIFT;
- return pmic->dcdc4_range;
+ range = tps65912_reg_read(mfd, TPS65912_DCDC4_LIMIT);
+ break;
default:
return 0;
}
+
+ if (range >= 0)
+ range = (range & DCDC_LIMIT_RANGE_MASK)
+ >> DCDC_LIMIT_RANGE_SHIFT;
+
+ pmic->dcdc_range[id] = range;
+ return range;
}
static unsigned long tps65912_vsel_to_uv_range0(u8 vsel)
@@ -219,146 +201,30 @@ static unsigned long tps65912_vsel_to_uv_ldo(u8 vsel)
static int tps65912_get_ctrl_register(int id)
{
- switch (id) {
- case TPS65912_REG_DCDC1:
- return TPS65912_DCDC1_AVS;
- case TPS65912_REG_DCDC2:
- return TPS65912_DCDC2_AVS;
- case TPS65912_REG_DCDC3:
- return TPS65912_DCDC3_AVS;
- case TPS65912_REG_DCDC4:
- return TPS65912_DCDC4_AVS;
- case TPS65912_REG_LDO1:
- return TPS65912_LDO1_AVS;
- case TPS65912_REG_LDO2:
- return TPS65912_LDO2_AVS;
- case TPS65912_REG_LDO3:
- return TPS65912_LDO3_AVS;
- case TPS65912_REG_LDO4:
- return TPS65912_LDO4_AVS;
- case TPS65912_REG_LDO5:
- return TPS65912_LDO5;
- case TPS65912_REG_LDO6:
- return TPS65912_LDO6;
- case TPS65912_REG_LDO7:
- return TPS65912_LDO7;
- case TPS65912_REG_LDO8:
- return TPS65912_LDO8;
- case TPS65912_REG_LDO9:
- return TPS65912_LDO9;
- case TPS65912_REG_LDO10:
- return TPS65912_LDO10;
- default:
+ if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4)
+ return id * 3 + TPS65912_DCDC1_AVS;
+ else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10)
+ return id - TPS65912_REG_LDO5 + TPS65912_LDO5;
+ else
return -EINVAL;
- }
}
-static int tps65912_get_dcdc_sel_register(struct tps65912_reg *pmic, int id)
+static int tps65912_get_sel_register(struct tps65912_reg *pmic, int id)
{
struct tps65912 *mfd = pmic->mfd;
- int opvsel = 0, sr = 0;
+ int opvsel;
u8 reg = 0;
- if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_DCDC4)
- return -EINVAL;
-
- switch (id) {
- case TPS65912_REG_DCDC1:
- opvsel = tps65912_reg_read(mfd, TPS65912_DCDC1_OP);
- sr = ((opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT);
- if (sr)
- reg = TPS65912_DCDC1_AVS;
- else
- reg = TPS65912_DCDC1_OP;
- break;
- case TPS65912_REG_DCDC2:
- opvsel = tps65912_reg_read(mfd, TPS65912_DCDC2_OP);
- sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
- if (sr)
- reg = TPS65912_DCDC2_AVS;
- else
- reg = TPS65912_DCDC2_OP;
- break;
- case TPS65912_REG_DCDC3:
- opvsel = tps65912_reg_read(mfd, TPS65912_DCDC3_OP);
- sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
- if (sr)
- reg = TPS65912_DCDC3_AVS;
- else
- reg = TPS65912_DCDC3_OP;
- break;
- case TPS65912_REG_DCDC4:
- opvsel = tps65912_reg_read(mfd, TPS65912_DCDC4_OP);
- sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
- if (sr)
- reg = TPS65912_DCDC4_AVS;
+ if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4) {
+ opvsel = tps65912_reg_read(mfd, id * 3 + TPS65912_DCDC1_OP);
+ if (opvsel & OP_SELREG_MASK)
+ reg = id * 3 + TPS65912_DCDC1_AVS;
else
- reg = TPS65912_DCDC4_OP;
- break;
- }
- return reg;
-}
-
-static int tps65912_get_ldo_sel_register(struct tps65912_reg *pmic, int id)
-{
- struct tps65912 *mfd = pmic->mfd;
- int opvsel = 0, sr = 0;
- u8 reg = 0;
-
- if (id < TPS65912_REG_LDO1 || id > TPS65912_REG_LDO10)
+ reg = id * 3 + TPS65912_DCDC1_OP;
+ } else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10) {
+ reg = id - TPS65912_REG_LDO5 + TPS65912_LDO5;
+ } else {
return -EINVAL;
-
- switch (id) {
- case TPS65912_REG_LDO1:
- opvsel = tps65912_reg_read(mfd, TPS65912_LDO1_OP);
- sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
- if (sr)
- reg = TPS65912_LDO1_AVS;
- else
- reg = TPS65912_LDO1_OP;
- break;
- case TPS65912_REG_LDO2:
- opvsel = tps65912_reg_read(mfd, TPS65912_LDO2_OP);
- sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
- if (sr)
- reg = TPS65912_LDO2_AVS;
- else
- reg = TPS65912_LDO2_OP;
- break;
- case TPS65912_REG_LDO3:
- opvsel = tps65912_reg_read(mfd, TPS65912_LDO3_OP);
- sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
- if (sr)
- reg = TPS65912_LDO3_AVS;
- else
- reg = TPS65912_LDO3_OP;
- break;
- case TPS65912_REG_LDO4:
- opvsel = tps65912_reg_read(mfd, TPS65912_LDO4_OP);
- sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
- if (sr)
- reg = TPS65912_LDO4_AVS;
- else
- reg = TPS65912_LDO4_OP;
- break;
- case TPS65912_REG_LDO5:
- reg = TPS65912_LDO5;
- break;
- case TPS65912_REG_LDO6:
- reg = TPS65912_LDO6;
- break;
- case TPS65912_REG_LDO7:
- reg = TPS65912_LDO7;
- break;
- case TPS65912_REG_LDO8:
- reg = TPS65912_LDO8;
- break;
- case TPS65912_REG_LDO9:
- reg = TPS65912_LDO9;
- break;
- case TPS65912_REG_LDO10:
- reg = TPS65912_LDO10;
- break;
}
return reg;
@@ -506,151 +372,83 @@ static unsigned int tps65912_get_mode(struct regulator_dev *dev)
return mode;
}
-static int tps65912_get_voltage_dcdc(struct regulator_dev *dev)
+static int tps65912_list_voltage_dcdc(struct regulator_dev *dev,
+ unsigned selector)
{
struct tps65912_reg *pmic = rdev_get_drvdata(dev);
- struct tps65912 *mfd = pmic->mfd;
- int id = rdev_get_id(dev), voltage = 0, range;
- int opvsel = 0, avsel = 0, sr, vsel;
+ int range, voltage = 0, id = rdev_get_id(dev);
- switch (id) {
- case TPS65912_REG_DCDC1:
- opvsel = tps65912_reg_read(mfd, TPS65912_DCDC1_OP);
- avsel = tps65912_reg_read(mfd, TPS65912_DCDC1_AVS);
- range = pmic->dcdc1_range;
- break;
- case TPS65912_REG_DCDC2:
- opvsel = tps65912_reg_read(mfd, TPS65912_DCDC2_OP);
- avsel = tps65912_reg_read(mfd, TPS65912_DCDC2_AVS);
- range = pmic->dcdc2_range;
- break;
- case TPS65912_REG_DCDC3:
- opvsel = tps65912_reg_read(mfd, TPS65912_DCDC3_OP);
- avsel = tps65912_reg_read(mfd, TPS65912_DCDC3_AVS);
- range = pmic->dcdc3_range;
- break;
- case TPS65912_REG_DCDC4:
- opvsel = tps65912_reg_read(mfd, TPS65912_DCDC4_OP);
- avsel = tps65912_reg_read(mfd, TPS65912_DCDC4_AVS);
- range = pmic->dcdc4_range;
- break;
- default:
+ if (id > TPS65912_REG_DCDC4)
return -EINVAL;
- }
- sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
- if (sr)
- vsel = avsel;
- else
- vsel = opvsel;
- vsel &= 0x3F;
+ range = pmic->dcdc_range[id];
switch (range) {
case 0:
/* 0.5 - 1.2875V in 12.5mV steps */
- voltage = tps65912_vsel_to_uv_range0(vsel);
+ voltage = tps65912_vsel_to_uv_range0(selector);
break;
case 1:
/* 0.7 - 1.4875V in 12.5mV steps */
- voltage = tps65912_vsel_to_uv_range1(vsel);
+ voltage = tps65912_vsel_to_uv_range1(selector);
break;
case 2:
/* 0.5 - 2.075V in 25mV steps */
- voltage = tps65912_vsel_to_uv_range2(vsel);
+ voltage = tps65912_vsel_to_uv_range2(selector);
break;
case 3:
/* 0.5 - 3.8V in 50mV steps */
- voltage = tps65912_vsel_to_uv_range3(vsel);
+ voltage = tps65912_vsel_to_uv_range3(selector);
break;
}
return voltage;
}
-static int tps65912_set_voltage_dcdc(struct regulator_dev *dev,
- unsigned selector)
+static int tps65912_get_voltage_dcdc(struct regulator_dev *dev)
{
struct tps65912_reg *pmic = rdev_get_drvdata(dev);
struct tps65912 *mfd = pmic->mfd;
int id = rdev_get_id(dev);
- int value;
- u8 reg;
-
- reg = tps65912_get_dcdc_sel_register(pmic, id);
- value = tps65912_reg_read(mfd, reg);
- value &= 0xC0;
- return tps65912_reg_write(mfd, reg, selector | value);
-}
+ int reg, vsel;
-static int tps65912_get_voltage_ldo(struct regulator_dev *dev)
-{
- struct tps65912_reg *pmic = rdev_get_drvdata(dev);
- struct tps65912 *mfd = pmic->mfd;
- int id = rdev_get_id(dev);
- int vsel = 0;
- u8 reg;
+ reg = tps65912_get_sel_register(pmic, id);
+ if (reg < 0)
+ return reg;
- reg = tps65912_get_ldo_sel_register(pmic, id);
vsel = tps65912_reg_read(mfd, reg);
vsel &= 0x3F;
- return tps65912_vsel_to_uv_ldo(vsel);
+ return tps65912_list_voltage_dcdc(dev, vsel);
}
-static int tps65912_set_voltage_ldo(struct regulator_dev *dev,
- unsigned selector)
+static int tps65912_set_voltage_sel(struct regulator_dev *dev,
+ unsigned selector)
{
struct tps65912_reg *pmic = rdev_get_drvdata(dev);
struct tps65912 *mfd = pmic->mfd;
- int id = rdev_get_id(dev), reg, value;
+ int id = rdev_get_id(dev);
+ int value;
+ u8 reg;
- reg = tps65912_get_ldo_sel_register(pmic, id);
+ reg = tps65912_get_sel_register(pmic, id);
value = tps65912_reg_read(mfd, reg);
value &= 0xC0;
return tps65912_reg_write(mfd, reg, selector | value);
}
-static int tps65912_list_voltage_dcdc(struct regulator_dev *dev,
- unsigned selector)
+static int tps65912_get_voltage_ldo(struct regulator_dev *dev)
{
struct tps65912_reg *pmic = rdev_get_drvdata(dev);
- int range, voltage = 0, id = rdev_get_id(dev);
+ struct tps65912 *mfd = pmic->mfd;
+ int id = rdev_get_id(dev);
+ int vsel = 0;
+ u8 reg;
- switch (id) {
- case TPS65912_REG_DCDC1:
- range = pmic->dcdc1_range;
- break;
- case TPS65912_REG_DCDC2:
- range = pmic->dcdc2_range;
- break;
- case TPS65912_REG_DCDC3:
- range = pmic->dcdc3_range;
- break;
- case TPS65912_REG_DCDC4:
- range = pmic->dcdc4_range;
- break;
- default:
- return -EINVAL;
- }
+ reg = tps65912_get_sel_register(pmic, id);
+ vsel = tps65912_reg_read(mfd, reg);
+ vsel &= 0x3F;
- switch (range) {
- case 0:
- /* 0.5 - 1.2875V in 12.5mV steps */
- voltage = tps65912_vsel_to_uv_range0(selector);
- break;
- case 1:
- /* 0.7 - 1.4875V in 12.5mV steps */
- voltage = tps65912_vsel_to_uv_range1(selector);
- break;
- case 2:
- /* 0.5 - 2.075V in 25mV steps */
- voltage = tps65912_vsel_to_uv_range2(selector);
- break;
- case 3:
- /* 0.5 - 3.8V in 50mV steps */
- voltage = tps65912_vsel_to_uv_range3(selector);
- break;
- }
- return voltage;
+ return tps65912_vsel_to_uv_ldo(vsel);
}
static int tps65912_list_voltage_ldo(struct regulator_dev *dev,
@@ -672,7 +470,7 @@ static struct regulator_ops tps65912_ops_dcdc = {
.set_mode = tps65912_set_mode,
.get_mode = tps65912_get_mode,
.get_voltage = tps65912_get_voltage_dcdc,
- .set_voltage_sel = tps65912_set_voltage_dcdc,
+ .set_voltage_sel = tps65912_set_voltage_sel,
.list_voltage = tps65912_list_voltage_dcdc,
};
@@ -682,7 +480,7 @@ static struct regulator_ops tps65912_ops_ldo = {
.enable = tps65912_reg_enable,
.disable = tps65912_reg_disable,
.get_voltage = tps65912_get_voltage_ldo,
- .set_voltage_sel = tps65912_set_voltage_ldo,
+ .set_voltage_sel = tps65912_set_voltage_sel,
.list_voltage = tps65912_list_voltage_ldo,
};
@@ -770,22 +568,12 @@ static struct platform_driver tps65912_driver = {
.remove = __devexit_p(tps65912_remove),
};
-/**
- * tps65912_init
- *
- * Module init function
- */
static int __init tps65912_init(void)
{
return platform_driver_register(&tps65912_driver);
}
subsys_initcall(tps65912_init);
-/**
- * tps65912_cleanup
- *
- * Module exit function
- */
static void __exit tps65912_cleanup(void)
{
platform_driver_unregister(&tps65912_driver);
diff --git a/drivers/regulator/wm8350-regulator.c b/drivers/regulator/wm8350-regulator.c
index 4f46067455c8..ab1e183a74b5 100644
--- a/drivers/regulator/wm8350-regulator.c
+++ b/drivers/regulator/wm8350-regulator.c
@@ -186,7 +186,7 @@ static int wm8350_isink_get_current(struct regulator_dev *rdev)
return 0;
}
- return (isink_cur[val] + 50) / 100;
+ return DIV_ROUND_CLOSEST(isink_cur[val], 100);
}
/* turn on ISINK followed by DCDC */
diff --git a/drivers/regulator/wm8400-regulator.c b/drivers/regulator/wm8400-regulator.c
index 706f39563a7b..8477153780b6 100644
--- a/drivers/regulator/wm8400-regulator.c
+++ b/drivers/regulator/wm8400-regulator.c
@@ -78,14 +78,14 @@ static int wm8400_ldo_set_voltage(struct regulator_dev *dev,
if (min_uV < 1700000) {
/* Steps of 50mV from 900mV; */
- val = (min_uV - 850001) / 50000;
+ val = DIV_ROUND_UP(min_uV - 900000, 50000);
if ((val * 50000) + 900000 > max_uV)
return -EINVAL;
BUG_ON((val * 50000) + 900000 < min_uV);
} else {
/* Steps of 100mV from 1700mV */
- val = ((min_uV - 1600001) / 100000);
+ val = DIV_ROUND_UP(min_uV - 1700000, 100000);
if ((val * 100000) + 1700000 > max_uV)
return -EINVAL;
@@ -168,7 +168,7 @@ static int wm8400_dcdc_set_voltage(struct regulator_dev *dev,
if (min_uV < 850000)
return -EINVAL;
- val = (min_uV - 825001) / 25000;
+ val = DIV_ROUND_UP(min_uV - 850000, 25000);
if (850000 + (25000 * val) > max_uV)
return -EINVAL;
diff --git a/drivers/regulator/wm8994-regulator.c b/drivers/regulator/wm8994-regulator.c
index 435e335d6e67..75ed402d9f43 100644
--- a/drivers/regulator/wm8994-regulator.c
+++ b/drivers/regulator/wm8994-regulator.c
@@ -241,7 +241,7 @@ static __devinit int wm8994_ldo_probe(struct platform_device *pdev)
if (!pdata)
return -ENODEV;
- ldo = kzalloc(sizeof(struct wm8994_ldo), GFP_KERNEL);
+ ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm8994_ldo), GFP_KERNEL);
if (ldo == NULL) {
dev_err(&pdev->dev, "Unable to allocate private data\n");
return -ENOMEM;
@@ -285,7 +285,6 @@ err_gpio:
if (gpio_is_valid(ldo->enable))
gpio_free(ldo->enable);
err:
- kfree(ldo);
return ret;
}
@@ -298,7 +297,6 @@ static __devexit int wm8994_ldo_remove(struct platform_device *pdev)
regulator_unregister(ldo->regulator);
if (gpio_is_valid(ldo->enable))
gpio_free(ldo->enable);
- kfree(ldo);
return 0;
}