You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge remote-tracking branches 'regulator/topic/core', 'regulator/topic/regmap' and 'regulator/topic/register' into regulator-next
This commit is contained in:
@@ -11,8 +11,7 @@ Registration
|
||||
Drivers can register a regulator by calling :-
|
||||
|
||||
struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
|
||||
struct device *dev, struct regulator_init_data *init_data,
|
||||
void *driver_data, struct device_node *of_node);
|
||||
const struct regulator_config *config);
|
||||
|
||||
This will register the regulators capabilities and operations to the regulator
|
||||
core.
|
||||
|
||||
@@ -78,17 +78,6 @@ static struct mfd_cell tps65090s[] = {
|
||||
},
|
||||
};
|
||||
|
||||
struct tps65090 {
|
||||
struct mutex lock;
|
||||
struct device *dev;
|
||||
struct i2c_client *client;
|
||||
struct regmap *rmap;
|
||||
struct irq_chip irq_chip;
|
||||
struct mutex irq_lock;
|
||||
int irq_base;
|
||||
unsigned int id;
|
||||
};
|
||||
|
||||
int tps65090_write(struct device *dev, int reg, uint8_t val)
|
||||
{
|
||||
struct tps65090 *tps = dev_get_drvdata(dev);
|
||||
|
||||
+51
-126
@@ -27,13 +27,8 @@ struct pm8607_regulator_info {
|
||||
unsigned int *vol_table;
|
||||
unsigned int *vol_suspend;
|
||||
|
||||
int vol_reg;
|
||||
int vol_shift;
|
||||
int vol_nbits;
|
||||
int update_reg;
|
||||
int update_bit;
|
||||
int enable_reg;
|
||||
int enable_bit;
|
||||
int slope_double;
|
||||
};
|
||||
|
||||
@@ -216,7 +211,7 @@ static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index)
|
||||
struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (info->vol_table && (index < (1 << info->vol_nbits))) {
|
||||
if (info->vol_table && (index < rdev->desc->n_voltages)) {
|
||||
ret = info->vol_table[index];
|
||||
if (info->slope_double)
|
||||
ret <<= 1;
|
||||
@@ -224,51 +219,16 @@ static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int choose_voltage(struct regulator_dev *rdev, int min_uV, int max_uV)
|
||||
static int pm8607_set_voltage_sel(struct regulator_dev *rdev, unsigned selector)
|
||||
{
|
||||
struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
int i, ret = -ENOENT;
|
||||
|
||||
if (info->slope_double) {
|
||||
min_uV = min_uV >> 1;
|
||||
max_uV = max_uV >> 1;
|
||||
}
|
||||
if (info->vol_table) {
|
||||
for (i = 0; i < (1 << info->vol_nbits); i++) {
|
||||
if (!info->vol_table[i])
|
||||
break;
|
||||
if ((min_uV <= info->vol_table[i])
|
||||
&& (max_uV >= info->vol_table[i])) {
|
||||
ret = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ret < 0)
|
||||
pr_err("invalid voltage range (%d %d) uV\n", min_uV, max_uV);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pm8607_set_voltage(struct regulator_dev *rdev,
|
||||
int min_uV, int max_uV, unsigned *selector)
|
||||
{
|
||||
struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
uint8_t val, mask;
|
||||
uint8_t val;
|
||||
int ret;
|
||||
|
||||
if (min_uV > max_uV) {
|
||||
pr_err("invalid voltage range (%d, %d) uV\n", min_uV, max_uV);
|
||||
return -EINVAL;
|
||||
}
|
||||
val = (uint8_t)(selector << (ffs(rdev->desc->vsel_mask) - 1));
|
||||
|
||||
ret = choose_voltage(rdev, min_uV, max_uV);
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
*selector = ret;
|
||||
val = (uint8_t)(ret << info->vol_shift);
|
||||
mask = ((1 << info->vol_nbits) - 1) << info->vol_shift;
|
||||
|
||||
ret = pm860x_set_bits(info->i2c, info->vol_reg, mask, val);
|
||||
ret = pm860x_set_bits(info->i2c, rdev->desc->vsel_reg,
|
||||
rdev->desc->vsel_mask, val);
|
||||
if (ret)
|
||||
return ret;
|
||||
switch (info->desc.id) {
|
||||
@@ -282,60 +242,16 @@ static int pm8607_set_voltage(struct regulator_dev *rdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pm8607_get_voltage(struct regulator_dev *rdev)
|
||||
{
|
||||
struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
uint8_t val, mask;
|
||||
int ret;
|
||||
|
||||
ret = pm860x_reg_read(info->i2c, info->vol_reg);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
mask = ((1 << info->vol_nbits) - 1) << info->vol_shift;
|
||||
val = ((unsigned char)ret & mask) >> info->vol_shift;
|
||||
|
||||
return pm8607_list_voltage(rdev, val);
|
||||
}
|
||||
|
||||
static int pm8607_enable(struct regulator_dev *rdev)
|
||||
{
|
||||
struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
|
||||
return pm860x_set_bits(info->i2c, info->enable_reg,
|
||||
1 << info->enable_bit,
|
||||
1 << info->enable_bit);
|
||||
}
|
||||
|
||||
static int pm8607_disable(struct regulator_dev *rdev)
|
||||
{
|
||||
struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
|
||||
return pm860x_set_bits(info->i2c, info->enable_reg,
|
||||
1 << info->enable_bit, 0);
|
||||
}
|
||||
|
||||
static int pm8607_is_enabled(struct regulator_dev *rdev)
|
||||
{
|
||||
struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
int ret;
|
||||
|
||||
ret = pm860x_reg_read(info->i2c, info->enable_reg);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return !!((unsigned char)ret & (1 << info->enable_bit));
|
||||
}
|
||||
|
||||
static struct regulator_ops pm8607_regulator_ops = {
|
||||
.set_voltage = pm8607_set_voltage,
|
||||
.get_voltage = pm8607_get_voltage,
|
||||
.enable = pm8607_enable,
|
||||
.disable = pm8607_disable,
|
||||
.is_enabled = pm8607_is_enabled,
|
||||
.list_voltage = pm8607_list_voltage,
|
||||
.set_voltage_sel = pm8607_set_voltage_sel,
|
||||
.get_voltage_sel = regulator_get_voltage_sel_regmap,
|
||||
.enable = regulator_enable_regmap,
|
||||
.disable = regulator_disable_regmap,
|
||||
.is_enabled = regulator_is_enabled_regmap,
|
||||
};
|
||||
|
||||
#define PM8607_DVC(vreg, nbits, ureg, ubit, ereg, ebit) \
|
||||
#define PM8607_DVC(vreg, ureg, ubit, ereg, ebit) \
|
||||
{ \
|
||||
.desc = { \
|
||||
.name = #vreg, \
|
||||
@@ -343,20 +259,20 @@ static struct regulator_ops pm8607_regulator_ops = {
|
||||
.type = REGULATOR_VOLTAGE, \
|
||||
.id = PM8607_ID_##vreg, \
|
||||
.owner = THIS_MODULE, \
|
||||
.n_voltages = ARRAY_SIZE(vreg##_table), \
|
||||
.vsel_reg = PM8607_##vreg, \
|
||||
.vsel_mask = ARRAY_SIZE(vreg##_table) - 1, \
|
||||
.enable_reg = PM8607_##ereg, \
|
||||
.enable_mask = 1 << (ebit), \
|
||||
}, \
|
||||
.vol_reg = PM8607_##vreg, \
|
||||
.vol_shift = (0), \
|
||||
.vol_nbits = (nbits), \
|
||||
.update_reg = PM8607_##ureg, \
|
||||
.update_bit = (ubit), \
|
||||
.enable_reg = PM8607_##ereg, \
|
||||
.enable_bit = (ebit), \
|
||||
.slope_double = (0), \
|
||||
.vol_table = (unsigned int *)&vreg##_table, \
|
||||
.vol_suspend = (unsigned int *)&vreg##_suspend_table, \
|
||||
}
|
||||
|
||||
#define PM8607_LDO(_id, vreg, shift, nbits, ereg, ebit) \
|
||||
#define PM8607_LDO(_id, vreg, shift, ereg, ebit) \
|
||||
{ \
|
||||
.desc = { \
|
||||
.name = "LDO" #_id, \
|
||||
@@ -364,35 +280,35 @@ static struct regulator_ops pm8607_regulator_ops = {
|
||||
.type = REGULATOR_VOLTAGE, \
|
||||
.id = PM8607_ID_LDO##_id, \
|
||||
.owner = THIS_MODULE, \
|
||||
.n_voltages = ARRAY_SIZE(LDO##_id##_table), \
|
||||
.vsel_reg = PM8607_##vreg, \
|
||||
.vsel_mask = (ARRAY_SIZE(LDO##_id##_table) - 1) << (shift), \
|
||||
.enable_reg = PM8607_##ereg, \
|
||||
.enable_mask = 1 << (ebit), \
|
||||
}, \
|
||||
.vol_reg = PM8607_##vreg, \
|
||||
.vol_shift = (shift), \
|
||||
.vol_nbits = (nbits), \
|
||||
.enable_reg = PM8607_##ereg, \
|
||||
.enable_bit = (ebit), \
|
||||
.slope_double = (0), \
|
||||
.vol_table = (unsigned int *)&LDO##_id##_table, \
|
||||
.vol_suspend = (unsigned int *)&LDO##_id##_suspend_table, \
|
||||
}
|
||||
|
||||
static struct pm8607_regulator_info pm8607_regulator_info[] = {
|
||||
PM8607_DVC(BUCK1, 6, GO, 0, SUPPLIES_EN11, 0),
|
||||
PM8607_DVC(BUCK2, 6, GO, 1, SUPPLIES_EN11, 1),
|
||||
PM8607_DVC(BUCK3, 6, GO, 2, SUPPLIES_EN11, 2),
|
||||
PM8607_DVC(BUCK1, GO, 0, SUPPLIES_EN11, 0),
|
||||
PM8607_DVC(BUCK2, GO, 1, SUPPLIES_EN11, 1),
|
||||
PM8607_DVC(BUCK3, GO, 2, SUPPLIES_EN11, 2),
|
||||
|
||||
PM8607_LDO( 1, LDO1, 0, 2, SUPPLIES_EN11, 3),
|
||||
PM8607_LDO( 2, LDO2, 0, 3, SUPPLIES_EN11, 4),
|
||||
PM8607_LDO( 3, LDO3, 0, 3, SUPPLIES_EN11, 5),
|
||||
PM8607_LDO( 4, LDO4, 0, 3, SUPPLIES_EN11, 6),
|
||||
PM8607_LDO( 5, LDO5, 0, 2, SUPPLIES_EN11, 7),
|
||||
PM8607_LDO( 6, LDO6, 0, 3, SUPPLIES_EN12, 0),
|
||||
PM8607_LDO( 7, LDO7, 0, 3, SUPPLIES_EN12, 1),
|
||||
PM8607_LDO( 8, LDO8, 0, 3, SUPPLIES_EN12, 2),
|
||||
PM8607_LDO( 9, LDO9, 0, 3, SUPPLIES_EN12, 3),
|
||||
PM8607_LDO(10, LDO10, 0, 4, SUPPLIES_EN12, 4),
|
||||
PM8607_LDO(12, LDO12, 0, 4, SUPPLIES_EN12, 5),
|
||||
PM8607_LDO(13, VIBRATOR_SET, 1, 3, VIBRATOR_SET, 0),
|
||||
PM8607_LDO(14, LDO14, 0, 3, SUPPLIES_EN12, 6),
|
||||
PM8607_LDO(1, LDO1, 0, SUPPLIES_EN11, 3),
|
||||
PM8607_LDO(2, LDO2, 0, SUPPLIES_EN11, 4),
|
||||
PM8607_LDO(3, LDO3, 0, SUPPLIES_EN11, 5),
|
||||
PM8607_LDO(4, LDO4, 0, SUPPLIES_EN11, 6),
|
||||
PM8607_LDO(5, LDO5, 0, SUPPLIES_EN11, 7),
|
||||
PM8607_LDO(6, LDO6, 0, SUPPLIES_EN12, 0),
|
||||
PM8607_LDO(7, LDO7, 0, SUPPLIES_EN12, 1),
|
||||
PM8607_LDO(8, LDO8, 0, SUPPLIES_EN12, 2),
|
||||
PM8607_LDO(9, LDO9, 0, SUPPLIES_EN12, 3),
|
||||
PM8607_LDO(10, LDO10, 0, SUPPLIES_EN12, 4),
|
||||
PM8607_LDO(12, LDO12, 0, SUPPLIES_EN12, 5),
|
||||
PM8607_LDO(13, VIBRATOR_SET, 1, VIBRATOR_SET, 0),
|
||||
PM8607_LDO(14, LDO14, 0, SUPPLIES_EN12, 6),
|
||||
};
|
||||
|
||||
static int __devinit pm8607_regulator_probe(struct platform_device *pdev)
|
||||
@@ -400,6 +316,7 @@ static int __devinit pm8607_regulator_probe(struct platform_device *pdev)
|
||||
struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
|
||||
struct pm8607_regulator_info *info = NULL;
|
||||
struct regulator_init_data *pdata = pdev->dev.platform_data;
|
||||
struct regulator_config config = { };
|
||||
struct resource *res;
|
||||
int i;
|
||||
|
||||
@@ -425,9 +342,17 @@ static int __devinit pm8607_regulator_probe(struct platform_device *pdev)
|
||||
if ((i == PM8607_ID_BUCK3) && info->chip->buck3_double)
|
||||
info->slope_double = 1;
|
||||
|
||||
config.dev = &pdev->dev;
|
||||
config.init_data = pdata;
|
||||
config.driver_data = info;
|
||||
|
||||
if (chip->id == CHIP_PM8607)
|
||||
config.regmap = chip->regmap;
|
||||
else
|
||||
config.regmap = chip->regmap_companion;
|
||||
|
||||
/* replace driver_data with info */
|
||||
info->regulator = regulator_register(&info->desc, &pdev->dev,
|
||||
pdata, info, NULL);
|
||||
info->regulator = regulator_register(&info->desc, &config);
|
||||
if (IS_ERR(info->regulator)) {
|
||||
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||
info->desc.name);
|
||||
|
||||
@@ -223,6 +223,16 @@ config REGULATOR_PCF50633
|
||||
Say Y here to support the voltage regulators and convertors
|
||||
on PCF50633
|
||||
|
||||
config REGULATOR_RC5T583
|
||||
tristate "RICOH RC5T583 Power regulators"
|
||||
depends on MFD_RC5T583
|
||||
help
|
||||
Select this option to enable the power regulator of RICOH
|
||||
PMIC RC5T583.
|
||||
This driver supports the control of different power rails of device
|
||||
through regulator interface. The device supports multiple DCDC/LDO
|
||||
outputs which can be controlled by i2c communication.
|
||||
|
||||
config REGULATOR_S5M8767
|
||||
tristate "Samsung S5M8767A voltage regulator"
|
||||
depends on MFD_S5M_CORE
|
||||
@@ -268,11 +278,11 @@ config REGULATOR_TPS6105X
|
||||
audio amplifiers.
|
||||
|
||||
config REGULATOR_TPS62360
|
||||
tristate "TI TPS62360 Power Regulator"
|
||||
tristate "TI TPS6236x Power Regulator"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
This driver supports TPS62360 voltage regulator chip. This
|
||||
This driver supports TPS6236x 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.
|
||||
@@ -294,6 +304,13 @@ config REGULATOR_TPS6507X
|
||||
three step-down converters and two general-purpose LDO voltage regulators.
|
||||
It supports TI's software based Class-2 SmartReflex implementation.
|
||||
|
||||
config REGULATOR_TPS65090
|
||||
tristate "TI TPS65090 Power regulator"
|
||||
depends on MFD_TPS65090
|
||||
help
|
||||
This driver provides support for the voltage regulators on the
|
||||
TI TPS65090 PMIC.
|
||||
|
||||
config REGULATOR_TPS65217
|
||||
tristate "TI TPS65217 Power regulators"
|
||||
depends on MFD_TPS65217
|
||||
|
||||
@@ -9,7 +9,6 @@ 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
|
||||
@@ -20,6 +19,7 @@ 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_GPIO) += gpio-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_ISL6271A) += isl6271a-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_LP3971) += lp3971.o
|
||||
obj-$(CONFIG_REGULATOR_LP3972) += lp3972.o
|
||||
@@ -35,11 +35,13 @@ obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o
|
||||
obj-$(CONFIG_REGULATOR_PCAP) += pcap-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_PCF50633) += pcf50633-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_RC5T583) += rc5t583-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_TPS65090) += tps65090-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_TPS65217) += tps65217-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_TPS6524X) += tps6524x-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_TPS6586X) += tps6586x-regulator.o
|
||||
|
||||
@@ -178,6 +178,7 @@ static struct aat2870_regulator *aat2870_get_regulator(int id)
|
||||
static int aat2870_regulator_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct aat2870_regulator *ri;
|
||||
struct regulator_config config = { 0 };
|
||||
struct regulator_dev *rdev;
|
||||
|
||||
ri = aat2870_get_regulator(pdev->id);
|
||||
@@ -187,8 +188,11 @@ static int aat2870_regulator_probe(struct platform_device *pdev)
|
||||
}
|
||||
ri->aat2870 = dev_get_drvdata(pdev->dev.parent);
|
||||
|
||||
rdev = regulator_register(&ri->desc, &pdev->dev,
|
||||
pdev->dev.platform_data, ri, NULL);
|
||||
config.dev = &pdev->dev;
|
||||
config.driver_data = ri;
|
||||
config.init_data = pdev->dev.platform_data;
|
||||
|
||||
rdev = regulator_register(&ri->desc, &config);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(&pdev->dev, "Failed to register regulator %s\n",
|
||||
ri->desc.name);
|
||||
@@ -231,3 +235,4 @@ module_exit(aat2870_regulator_exit);
|
||||
MODULE_DESCRIPTION("AnalogicTech AAT2870 Regulator");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Jin Park <jinyoungp@nvidia.com>");
|
||||
MODULE_ALIAS("platform:aat2870-regulator");
|
||||
|
||||
+11
-18
@@ -338,20 +338,12 @@ static int ab3100_get_best_voltage_index(struct regulator_dev *reg,
|
||||
return bestindex;
|
||||
}
|
||||
|
||||
static int ab3100_set_voltage_regulator(struct regulator_dev *reg,
|
||||
int min_uV, int max_uV,
|
||||
unsigned *selector)
|
||||
static int ab3100_set_voltage_regulator_sel(struct regulator_dev *reg,
|
||||
unsigned selector)
|
||||
{
|
||||
struct ab3100_regulator *abreg = reg->reg_data;
|
||||
u8 regval;
|
||||
int err;
|
||||
int bestindex;
|
||||
|
||||
bestindex = ab3100_get_best_voltage_index(reg, min_uV, max_uV);
|
||||
if (bestindex < 0)
|
||||
return bestindex;
|
||||
|
||||
*selector = bestindex;
|
||||
|
||||
err = abx500_get_register_interruptible(abreg->dev, 0,
|
||||
abreg->regreg, ®val);
|
||||
@@ -364,7 +356,7 @@ static int ab3100_set_voltage_regulator(struct regulator_dev *reg,
|
||||
|
||||
/* The highest three bits control the variable regulators */
|
||||
regval &= ~0xE0;
|
||||
regval |= (bestindex << 5);
|
||||
regval |= (selector << 5);
|
||||
|
||||
err = abx500_set_register_interruptible(abreg->dev, 0,
|
||||
abreg->regreg, regval);
|
||||
@@ -464,7 +456,7 @@ static struct regulator_ops regulator_ops_variable = {
|
||||
.disable = ab3100_disable_regulator,
|
||||
.is_enabled = ab3100_is_enabled_regulator,
|
||||
.get_voltage = ab3100_get_voltage_regulator,
|
||||
.set_voltage = ab3100_set_voltage_regulator,
|
||||
.set_voltage_sel = ab3100_set_voltage_regulator_sel,
|
||||
.list_voltage = ab3100_list_voltage_regulator,
|
||||
.enable_time = ab3100_enable_time_regulator,
|
||||
};
|
||||
@@ -474,7 +466,7 @@ static struct regulator_ops regulator_ops_variable_sleepable = {
|
||||
.disable = ab3100_disable_regulator,
|
||||
.is_enabled = ab3100_is_enabled_regulator,
|
||||
.get_voltage = ab3100_get_voltage_regulator,
|
||||
.set_voltage = ab3100_set_voltage_regulator,
|
||||
.set_voltage_sel = ab3100_set_voltage_regulator_sel,
|
||||
.set_suspend_voltage = ab3100_set_suspend_voltage_regulator,
|
||||
.list_voltage = ab3100_list_voltage_regulator,
|
||||
.enable_time = ab3100_enable_time_regulator,
|
||||
@@ -582,6 +574,7 @@ ab3100_regulator_desc[AB3100_NUM_REGULATORS] = {
|
||||
static int __devinit ab3100_regulators_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ab3100_platform_data *plfdata = pdev->dev.platform_data;
|
||||
struct regulator_config config = { };
|
||||
int err = 0;
|
||||
u8 data;
|
||||
int i;
|
||||
@@ -627,15 +620,15 @@ static int __devinit ab3100_regulators_probe(struct platform_device *pdev)
|
||||
reg->dev = &pdev->dev;
|
||||
reg->plfdata = plfdata;
|
||||
|
||||
config.dev = &pdev->dev;
|
||||
config.driver_data = reg;
|
||||
config.init_data = &plfdata->reg_constraints[i];
|
||||
|
||||
/*
|
||||
* Register the regulator, pass around
|
||||
* the ab3100_regulator struct
|
||||
*/
|
||||
rdev = regulator_register(&ab3100_regulator_desc[i],
|
||||
&pdev->dev,
|
||||
&plfdata->reg_constraints[i],
|
||||
reg, NULL);
|
||||
|
||||
rdev = regulator_register(&ab3100_regulator_desc[i], &config);
|
||||
if (IS_ERR(rdev)) {
|
||||
err = PTR_ERR(rdev);
|
||||
dev_err(&pdev->dev,
|
||||
|
||||
+10
-33
@@ -234,25 +234,8 @@ static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev)
|
||||
return val;
|
||||
}
|
||||
|
||||
static int ab8500_get_best_voltage_index(struct regulator_dev *rdev,
|
||||
int min_uV, int max_uV)
|
||||
{
|
||||
struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
int i;
|
||||
|
||||
/* check the supported voltage */
|
||||
for (i = 0; i < info->voltages_len; i++) {
|
||||
if ((info->voltages[i] >= min_uV) &&
|
||||
(info->voltages[i] <= max_uV))
|
||||
return i;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int ab8500_regulator_set_voltage(struct regulator_dev *rdev,
|
||||
int min_uV, int max_uV,
|
||||
unsigned *selector)
|
||||
static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
|
||||
unsigned selector)
|
||||
{
|
||||
int ret;
|
||||
struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
@@ -263,18 +246,8 @@ static int ab8500_regulator_set_voltage(struct regulator_dev *rdev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* get the appropriate voltages within the range */
|
||||
ret = ab8500_get_best_voltage_index(rdev, min_uV, max_uV);
|
||||
if (ret < 0) {
|
||||
dev_err(rdev_get_dev(rdev),
|
||||
"couldn't get best voltage for regulator\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
*selector = ret;
|
||||
|
||||
/* set the registers for the request */
|
||||
regval = (u8)ret;
|
||||
regval = (u8)selector;
|
||||
ret = abx500_mask_and_set_register_interruptible(info->dev,
|
||||
info->voltage_bank, info->voltage_reg,
|
||||
info->voltage_mask, regval);
|
||||
@@ -319,7 +292,7 @@ static struct regulator_ops ab8500_regulator_ops = {
|
||||
.disable = ab8500_regulator_disable,
|
||||
.is_enabled = ab8500_regulator_is_enabled,
|
||||
.get_voltage_sel = ab8500_regulator_get_voltage_sel,
|
||||
.set_voltage = ab8500_regulator_set_voltage,
|
||||
.set_voltage_sel = ab8500_regulator_set_voltage_sel,
|
||||
.list_voltage = ab8500_list_voltage,
|
||||
.enable_time = ab8500_regulator_enable_time,
|
||||
.set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel,
|
||||
@@ -739,6 +712,7 @@ static __devinit int ab8500_regulator_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
|
||||
struct ab8500_platform_data *pdata;
|
||||
struct regulator_config config = { };
|
||||
int i, err;
|
||||
|
||||
if (!ab8500) {
|
||||
@@ -806,6 +780,10 @@ static __devinit int ab8500_regulator_probe(struct platform_device *pdev)
|
||||
info = &ab8500_regulator_info[i];
|
||||
info->dev = &pdev->dev;
|
||||
|
||||
config.dev = &pdev->dev;
|
||||
config.init_data = &pdata->regulator[i];
|
||||
config.driver_data = info;
|
||||
|
||||
/* fix for hardware before ab8500v2.0 */
|
||||
if (abx500_get_chip_id(info->dev) < 0x20) {
|
||||
if (info->desc.id == AB8500_LDO_AUX3) {
|
||||
@@ -819,8 +797,7 @@ static __devinit int ab8500_regulator_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
/* register regulator with framework */
|
||||
info->regulator = regulator_register(&info->desc, &pdev->dev,
|
||||
&pdata->regulator[i], info, NULL);
|
||||
info->regulator = regulator_register(&info->desc, &config);
|
||||
if (IS_ERR(info->regulator)) {
|
||||
err = PTR_ERR(info->regulator);
|
||||
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||
|
||||
@@ -99,8 +99,8 @@ static int ad5398_set_current_limit(struct regulator_dev *rdev, int min_uA, int
|
||||
if (ad5398_calc_current(chip, selector) > max_uA)
|
||||
return -EINVAL;
|
||||
|
||||
dev_dbg(&client->dev, "changing current %dmA\n",
|
||||
ad5398_calc_current(chip, selector) / 1000);
|
||||
dev_dbg(&client->dev, "changing current %duA\n",
|
||||
ad5398_calc_current(chip, selector));
|
||||
|
||||
/* read chip enable bit */
|
||||
ret = ad5398_read_reg(client, &data);
|
||||
@@ -184,7 +184,7 @@ static struct regulator_ops ad5398_ops = {
|
||||
.is_enabled = ad5398_is_enabled,
|
||||
};
|
||||
|
||||
static struct regulator_desc ad5398_reg = {
|
||||
static const struct regulator_desc ad5398_reg = {
|
||||
.name = "isink",
|
||||
.id = 0,
|
||||
.ops = &ad5398_ops,
|
||||
@@ -212,6 +212,7 @@ static int __devinit ad5398_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct regulator_init_data *init_data = client->dev.platform_data;
|
||||
struct regulator_config config = { };
|
||||
struct ad5398_chip_info *chip;
|
||||
const struct ad5398_current_data_format *df =
|
||||
(struct ad5398_current_data_format *)id->driver_data;
|
||||
@@ -220,10 +221,14 @@ static int __devinit ad5398_probe(struct i2c_client *client,
|
||||
if (!init_data)
|
||||
return -EINVAL;
|
||||
|
||||
chip = kzalloc(sizeof(*chip), GFP_KERNEL);
|
||||
chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
|
||||
if (!chip)
|
||||
return -ENOMEM;
|
||||
|
||||
config.dev = &client->dev;
|
||||
config.init_data = init_data;
|
||||
config.driver_data = chip;
|
||||
|
||||
chip->client = client;
|
||||
|
||||
chip->min_uA = df->min_uA;
|
||||
@@ -232,8 +237,7 @@ static int __devinit ad5398_probe(struct i2c_client *client,
|
||||
chip->current_offset = df->current_offset;
|
||||
chip->current_mask = (chip->current_level - 1) << chip->current_offset;
|
||||
|
||||
chip->rdev = regulator_register(&ad5398_reg, &client->dev,
|
||||
init_data, chip, NULL);
|
||||
chip->rdev = regulator_register(&ad5398_reg, &config);
|
||||
if (IS_ERR(chip->rdev)) {
|
||||
ret = PTR_ERR(chip->rdev);
|
||||
dev_err(&client->dev, "failed to register %s %s\n",
|
||||
@@ -246,7 +250,6 @@ static int __devinit ad5398_probe(struct i2c_client *client,
|
||||
return 0;
|
||||
|
||||
err:
|
||||
kfree(chip);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -255,8 +258,6 @@ static int __devexit ad5398_remove(struct i2c_client *client)
|
||||
struct ad5398_chip_info *chip = i2c_get_clientdata(client);
|
||||
|
||||
regulator_unregister(chip->rdev);
|
||||
kfree(chip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -122,6 +122,7 @@ static int __devinit anatop_regulator_probe(struct platform_device *pdev)
|
||||
struct anatop_regulator *sreg;
|
||||
struct regulator_init_data *initdata;
|
||||
struct anatop *anatopmfd = dev_get_drvdata(pdev->dev.parent);
|
||||
struct regulator_config config = { };
|
||||
int ret = 0;
|
||||
|
||||
initdata = of_get_regulator_init_data(dev, np);
|
||||
@@ -178,9 +179,13 @@ static int __devinit anatop_regulator_probe(struct platform_device *pdev)
|
||||
rdesc->n_voltages = (sreg->max_voltage - sreg->min_voltage)
|
||||
/ 25000 + 1;
|
||||
|
||||
config.dev = &pdev->dev;
|
||||
config.init_data = initdata;
|
||||
config.driver_data = sreg;
|
||||
config.of_node = pdev->dev.of_node;
|
||||
|
||||
/* register regulator */
|
||||
rdev = regulator_register(rdesc, dev,
|
||||
initdata, sreg, pdev->dev.of_node);
|
||||
rdev = regulator_register(rdesc, &config);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(dev, "failed to register %s\n",
|
||||
rdesc->name);
|
||||
|
||||
+236
-92
File diff suppressed because it is too large
Load Diff
@@ -517,6 +517,7 @@ static int __devinit da903x_regulator_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct da903x_regulator_info *ri = NULL;
|
||||
struct regulator_dev *rdev;
|
||||
struct regulator_config config = { };
|
||||
|
||||
ri = find_regulator_info(pdev->id);
|
||||
if (ri == NULL) {
|
||||
@@ -536,8 +537,11 @@ static int __devinit da903x_regulator_probe(struct platform_device *pdev)
|
||||
if (ri->desc.id == DA9030_ID_LDO1 || ri->desc.id == DA9030_ID_LDO15)
|
||||
ri->desc.ops = &da9030_regulator_ldo1_15_ops;
|
||||
|
||||
rdev = regulator_register(&ri->desc, &pdev->dev,
|
||||
pdev->dev.platform_data, ri, NULL);
|
||||
config.dev = &pdev->dev;
|
||||
config.init_data = pdev->dev.platform_data;
|
||||
config.driver_data = ri;
|
||||
|
||||
rdev = regulator_register(&ri->desc, &config);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||
ri->desc.name);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -414,6 +414,7 @@ static int __devinit db8500_regulator_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regulator_init_data *db8500_init_data =
|
||||
dev_get_platdata(&pdev->dev);
|
||||
struct regulator_config config = { };
|
||||
int i, err;
|
||||
|
||||
/* register all regulators */
|
||||
@@ -425,9 +426,12 @@ static int __devinit db8500_regulator_probe(struct platform_device *pdev)
|
||||
info = &dbx500_regulator_info[i];
|
||||
info->dev = &pdev->dev;
|
||||
|
||||
config.dev = &pdev->dev;
|
||||
config.init_data = init_data;
|
||||
config.driver_data = info;
|
||||
|
||||
/* register with the regulator framework */
|
||||
info->rdev = regulator_register(&info->desc, &pdev->dev,
|
||||
init_data, info, NULL);
|
||||
info->rdev = regulator_register(&info->desc, &config);
|
||||
if (IS_ERR(info->rdev)) {
|
||||
err = PTR_ERR(info->rdev);
|
||||
dev_err(&pdev->dev, "failed to register %s: err %i\n",
|
||||
|
||||
@@ -39,10 +39,13 @@ static struct regulator_desc dummy_desc = {
|
||||
|
||||
static int __devinit dummy_regulator_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regulator_config config = { };
|
||||
int ret;
|
||||
|
||||
dummy_regulator_rdev = regulator_register(&dummy_desc, NULL,
|
||||
&dummy_initdata, NULL, NULL);
|
||||
config.dev = &pdev->dev;
|
||||
config.init_data = &dummy_initdata;
|
||||
|
||||
dummy_regulator_rdev = regulator_register(&dummy_desc, &config);
|
||||
if (IS_ERR(dummy_regulator_rdev)) {
|
||||
ret = PTR_ERR(dummy_regulator_rdev);
|
||||
pr_err("Failed to register regulator: %d\n", ret);
|
||||
|
||||
+36
-35
@@ -105,10 +105,8 @@ static int fixed_voltage_enable(struct regulator_dev *dev)
|
||||
{
|
||||
struct fixed_voltage_data *data = rdev_get_drvdata(dev);
|
||||
|
||||
if (gpio_is_valid(data->gpio)) {
|
||||
gpio_set_value_cansleep(data->gpio, data->enable_high);
|
||||
data->is_enabled = true;
|
||||
}
|
||||
gpio_set_value_cansleep(data->gpio, data->enable_high);
|
||||
data->is_enabled = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -117,10 +115,8 @@ static int fixed_voltage_disable(struct regulator_dev *dev)
|
||||
{
|
||||
struct fixed_voltage_data *data = rdev_get_drvdata(dev);
|
||||
|
||||
if (gpio_is_valid(data->gpio)) {
|
||||
gpio_set_value_cansleep(data->gpio, !data->enable_high);
|
||||
data->is_enabled = false;
|
||||
}
|
||||
gpio_set_value_cansleep(data->gpio, !data->enable_high);
|
||||
data->is_enabled = false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -153,7 +149,7 @@ static int fixed_voltage_list_voltage(struct regulator_dev *dev,
|
||||
return data->microvolts;
|
||||
}
|
||||
|
||||
static struct regulator_ops fixed_voltage_ops = {
|
||||
static struct regulator_ops fixed_voltage_gpio_ops = {
|
||||
.is_enabled = fixed_voltage_is_enabled,
|
||||
.enable = fixed_voltage_enable,
|
||||
.disable = fixed_voltage_disable,
|
||||
@@ -162,10 +158,16 @@ static struct regulator_ops fixed_voltage_ops = {
|
||||
.list_voltage = fixed_voltage_list_voltage,
|
||||
};
|
||||
|
||||
static struct regulator_ops fixed_voltage_ops = {
|
||||
.get_voltage = fixed_voltage_get_voltage,
|
||||
.list_voltage = fixed_voltage_list_voltage,
|
||||
};
|
||||
|
||||
static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct fixed_voltage_config *config;
|
||||
struct fixed_voltage_data *drvdata;
|
||||
struct regulator_config cfg = { };
|
||||
int ret;
|
||||
|
||||
if (pdev->dev.of_node)
|
||||
@@ -176,7 +178,8 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)
|
||||
if (!config)
|
||||
return -ENOMEM;
|
||||
|
||||
drvdata = kzalloc(sizeof(struct fixed_voltage_data), GFP_KERNEL);
|
||||
drvdata = devm_kzalloc(&pdev->dev, sizeof(struct fixed_voltage_data),
|
||||
GFP_KERNEL);
|
||||
if (drvdata == NULL) {
|
||||
dev_err(&pdev->dev, "Failed to allocate device data\n");
|
||||
ret = -ENOMEM;
|
||||
@@ -191,7 +194,6 @@ 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;
|
||||
|
||||
if (config->microvolts)
|
||||
drvdata->desc.n_voltages = 1;
|
||||
@@ -201,6 +203,7 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)
|
||||
drvdata->startup_delay = config->startup_delay;
|
||||
|
||||
if (gpio_is_valid(config->gpio)) {
|
||||
int gpio_flag;
|
||||
drvdata->enable_high = config->enable_high;
|
||||
|
||||
/* FIXME: Remove below print warning
|
||||
@@ -218,7 +221,20 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)
|
||||
dev_warn(&pdev->dev,
|
||||
"using GPIO 0 for regulator enable control\n");
|
||||
|
||||
ret = gpio_request(config->gpio, config->supply_name);
|
||||
/*
|
||||
* set output direction without changing state
|
||||
* to prevent glitch
|
||||
*/
|
||||
drvdata->is_enabled = config->enabled_at_boot;
|
||||
ret = drvdata->is_enabled ?
|
||||
config->enable_high : !config->enable_high;
|
||||
gpio_flag = ret ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
|
||||
|
||||
if (config->gpio_is_open_drain)
|
||||
gpio_flag |= GPIOF_OPEN_DRAIN;
|
||||
|
||||
ret = gpio_request_one(config->gpio, gpio_flag,
|
||||
config->supply_name);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"Could not obtain regulator enable GPIO %d: %d\n",
|
||||
@@ -226,31 +242,18 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev)
|
||||
goto err_name;
|
||||
}
|
||||
|
||||
/* set output direction without changing state
|
||||
* to prevent glitch
|
||||
*/
|
||||
drvdata->is_enabled = config->enabled_at_boot;
|
||||
ret = drvdata->is_enabled ?
|
||||
config->enable_high : !config->enable_high;
|
||||
|
||||
ret = gpio_direction_output(config->gpio, ret);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"Could not configure regulator enable GPIO %d direction: %d\n",
|
||||
config->gpio, ret);
|
||||
goto err_gpio;
|
||||
}
|
||||
drvdata->desc.ops = &fixed_voltage_gpio_ops;
|
||||
|
||||
} else {
|
||||
/* Regulator without GPIO control is considered
|
||||
* always enabled
|
||||
*/
|
||||
drvdata->is_enabled = true;
|
||||
drvdata->desc.ops = &fixed_voltage_ops;
|
||||
}
|
||||
|
||||
drvdata->dev = regulator_register(&drvdata->desc, &pdev->dev,
|
||||
config->init_data, drvdata,
|
||||
pdev->dev.of_node);
|
||||
cfg.dev = &pdev->dev;
|
||||
cfg.init_data = config->init_data;
|
||||
cfg.driver_data = drvdata;
|
||||
cfg.of_node = pdev->dev.of_node;
|
||||
|
||||
drvdata->dev = regulator_register(&drvdata->desc, &cfg);
|
||||
if (IS_ERR(drvdata->dev)) {
|
||||
ret = PTR_ERR(drvdata->dev);
|
||||
dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret);
|
||||
@@ -270,7 +273,6 @@ err_gpio:
|
||||
err_name:
|
||||
kfree(drvdata->desc.name);
|
||||
err:
|
||||
kfree(drvdata);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -282,7 +284,6 @@ static int __devexit reg_fixed_voltage_remove(struct platform_device *pdev)
|
||||
if (gpio_is_valid(drvdata->gpio))
|
||||
gpio_free(drvdata->gpio);
|
||||
kfree(drvdata->desc.name);
|
||||
kfree(drvdata);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -105,15 +105,15 @@ static int gpio_regulator_set_value(struct regulator_dev *dev,
|
||||
int min, int max)
|
||||
{
|
||||
struct gpio_regulator_data *data = rdev_get_drvdata(dev);
|
||||
int ptr, target, state;
|
||||
int ptr, target, state, best_val = INT_MAX;
|
||||
|
||||
target = -1;
|
||||
for (ptr = 0; ptr < data->nr_states; ptr++)
|
||||
if (data->states[ptr].value >= min &&
|
||||
if (data->states[ptr].value < best_val &&
|
||||
data->states[ptr].value >= min &&
|
||||
data->states[ptr].value <= max)
|
||||
target = data->states[ptr].gpios;
|
||||
|
||||
if (target < 0)
|
||||
if (best_val == INT_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
for (ptr = 0; ptr < data->nr_gpios; ptr++) {
|
||||
@@ -172,9 +172,11 @@ static int __devinit gpio_regulator_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct gpio_regulator_config *config = pdev->dev.platform_data;
|
||||
struct gpio_regulator_data *drvdata;
|
||||
struct regulator_config cfg = { };
|
||||
int ptr, ret, state;
|
||||
|
||||
drvdata = kzalloc(sizeof(struct gpio_regulator_data), GFP_KERNEL);
|
||||
drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data),
|
||||
GFP_KERNEL);
|
||||
if (drvdata == NULL) {
|
||||
dev_err(&pdev->dev, "Failed to allocate device data\n");
|
||||
return -ENOMEM;
|
||||
@@ -283,8 +285,11 @@ static int __devinit gpio_regulator_probe(struct platform_device *pdev)
|
||||
}
|
||||
drvdata->state = state;
|
||||
|
||||
drvdata->dev = regulator_register(&drvdata->desc, &pdev->dev,
|
||||
config->init_data, drvdata, NULL);
|
||||
cfg.dev = &pdev->dev;
|
||||
cfg.init_data = config->init_data;
|
||||
cfg.driver_data = &drvdata;
|
||||
|
||||
drvdata->dev = regulator_register(&drvdata->desc, &cfg);
|
||||
if (IS_ERR(drvdata->dev)) {
|
||||
ret = PTR_ERR(drvdata->dev);
|
||||
dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret);
|
||||
@@ -307,7 +312,6 @@ err_memgpio:
|
||||
err_name:
|
||||
kfree(drvdata->desc.name);
|
||||
err:
|
||||
kfree(drvdata);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -326,7 +330,6 @@ static int __devexit gpio_regulator_remove(struct platform_device *pdev)
|
||||
gpio_free(drvdata->enable_gpio);
|
||||
|
||||
kfree(drvdata->desc.name);
|
||||
kfree(drvdata);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ static struct regulator_ops isl_fixed_ops = {
|
||||
.list_voltage = isl6271a_list_fixed_voltage,
|
||||
};
|
||||
|
||||
static struct regulator_desc isl_rd[] = {
|
||||
static const struct regulator_desc isl_rd[] = {
|
||||
{
|
||||
.name = "Core Buck",
|
||||
.id = 0,
|
||||
@@ -140,6 +140,7 @@ static struct regulator_desc isl_rd[] = {
|
||||
static int __devinit isl6271a_probe(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct regulator_config config = { };
|
||||
struct regulator_init_data *init_data = i2c->dev.platform_data;
|
||||
struct isl_pmic *pmic;
|
||||
int err, i;
|
||||
@@ -147,12 +148,7 @@ static int __devinit isl6271a_probe(struct i2c_client *i2c,
|
||||
if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return -EIO;
|
||||
|
||||
if (!init_data) {
|
||||
dev_err(&i2c->dev, "no platform data supplied\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
pmic = kzalloc(sizeof(struct isl_pmic), GFP_KERNEL);
|
||||
pmic = devm_kzalloc(&i2c->dev, sizeof(struct isl_pmic), GFP_KERNEL);
|
||||
if (!pmic)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -161,8 +157,14 @@ static int __devinit isl6271a_probe(struct i2c_client *i2c,
|
||||
mutex_init(&pmic->mtx);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
pmic->rdev[i] = regulator_register(&isl_rd[i], &i2c->dev,
|
||||
init_data, pmic, NULL);
|
||||
config.dev = &i2c->dev;
|
||||
if (i == 0)
|
||||
config.init_data = init_data;
|
||||
else
|
||||
config.init_data = 0;
|
||||
config.driver_data = pmic;
|
||||
|
||||
pmic->rdev[i] = regulator_register(&isl_rd[i], &config);
|
||||
if (IS_ERR(pmic->rdev[i])) {
|
||||
dev_err(&i2c->dev, "failed to register %s\n", id->name);
|
||||
err = PTR_ERR(pmic->rdev[i]);
|
||||
@@ -177,8 +179,6 @@ static int __devinit isl6271a_probe(struct i2c_client *i2c,
|
||||
error:
|
||||
while (--i >= 0)
|
||||
regulator_unregister(pmic->rdev[i]);
|
||||
|
||||
kfree(pmic);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -189,9 +189,6 @@ static int __devexit isl6271a_remove(struct i2c_client *i2c)
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
regulator_unregister(pmic->rdev[i]);
|
||||
|
||||
kfree(pmic);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+24
-63
@@ -124,6 +124,10 @@ static const int *ldo_voltage_map[] = {
|
||||
static int lp3971_ldo_list_voltage(struct regulator_dev *dev, unsigned index)
|
||||
{
|
||||
int ldo = rdev_get_id(dev) - LP3971_LDO1;
|
||||
|
||||
if (index > LDO_VOL_MAX_IDX)
|
||||
return -EINVAL;
|
||||
|
||||
return 1000 * LDO_VOL_VALUE_MAP(ldo)[index];
|
||||
}
|
||||
|
||||
@@ -168,32 +172,15 @@ static int lp3971_ldo_get_voltage(struct regulator_dev *dev)
|
||||
return 1000 * LDO_VOL_VALUE_MAP(ldo)[val];
|
||||
}
|
||||
|
||||
static int lp3971_ldo_set_voltage(struct regulator_dev *dev,
|
||||
int min_uV, int max_uV,
|
||||
unsigned int *selector)
|
||||
static int lp3971_ldo_set_voltage_sel(struct regulator_dev *dev,
|
||||
unsigned int selector)
|
||||
{
|
||||
struct lp3971 *lp3971 = rdev_get_drvdata(dev);
|
||||
int ldo = rdev_get_id(dev) - LP3971_LDO1;
|
||||
int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
|
||||
const int *vol_map = LDO_VOL_VALUE_MAP(ldo);
|
||||
u16 val;
|
||||
|
||||
if (min_vol < vol_map[LDO_VOL_MIN_IDX] ||
|
||||
min_vol > vol_map[LDO_VOL_MAX_IDX])
|
||||
return -EINVAL;
|
||||
|
||||
for (val = LDO_VOL_MIN_IDX; val <= LDO_VOL_MAX_IDX; val++)
|
||||
if (vol_map[val] >= min_vol)
|
||||
break;
|
||||
|
||||
if (val > LDO_VOL_MAX_IDX || vol_map[val] > max_vol)
|
||||
return -EINVAL;
|
||||
|
||||
*selector = val;
|
||||
|
||||
return lp3971_set_bits(lp3971, LP3971_LDO_VOL_CONTR_REG(ldo),
|
||||
LDO_VOL_CONTR_MASK << LDO_VOL_CONTR_SHIFT(ldo),
|
||||
val << LDO_VOL_CONTR_SHIFT(ldo));
|
||||
selector << LDO_VOL_CONTR_SHIFT(ldo));
|
||||
}
|
||||
|
||||
static struct regulator_ops lp3971_ldo_ops = {
|
||||
@@ -202,11 +189,14 @@ static struct regulator_ops lp3971_ldo_ops = {
|
||||
.enable = lp3971_ldo_enable,
|
||||
.disable = lp3971_ldo_disable,
|
||||
.get_voltage = lp3971_ldo_get_voltage,
|
||||
.set_voltage = lp3971_ldo_set_voltage,
|
||||
.set_voltage_sel = lp3971_ldo_set_voltage_sel,
|
||||
};
|
||||
|
||||
static int lp3971_dcdc_list_voltage(struct regulator_dev *dev, unsigned index)
|
||||
{
|
||||
if (index < BUCK_TARGET_VOL_MIN_IDX || index > BUCK_TARGET_VOL_MAX_IDX)
|
||||
return -EINVAL;
|
||||
|
||||
return 1000 * buck_voltage_map[index];
|
||||
}
|
||||
|
||||
@@ -259,33 +249,15 @@ static int lp3971_dcdc_get_voltage(struct regulator_dev *dev)
|
||||
return val;
|
||||
}
|
||||
|
||||
static int lp3971_dcdc_set_voltage(struct regulator_dev *dev,
|
||||
int min_uV, int max_uV,
|
||||
unsigned int *selector)
|
||||
static int lp3971_dcdc_set_voltage_sel(struct regulator_dev *dev,
|
||||
unsigned int selector)
|
||||
{
|
||||
struct lp3971 *lp3971 = rdev_get_drvdata(dev);
|
||||
int buck = rdev_get_id(dev) - LP3971_DCDC1;
|
||||
int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
|
||||
const int *vol_map = buck_voltage_map;
|
||||
u16 val;
|
||||
int ret;
|
||||
|
||||
if (min_vol < vol_map[BUCK_TARGET_VOL_MIN_IDX] ||
|
||||
min_vol > vol_map[BUCK_TARGET_VOL_MAX_IDX])
|
||||
return -EINVAL;
|
||||
|
||||
for (val = BUCK_TARGET_VOL_MIN_IDX; val <= BUCK_TARGET_VOL_MAX_IDX;
|
||||
val++)
|
||||
if (vol_map[val] >= min_vol)
|
||||
break;
|
||||
|
||||
if (val > BUCK_TARGET_VOL_MAX_IDX || vol_map[val] > max_vol)
|
||||
return -EINVAL;
|
||||
|
||||
*selector = val;
|
||||
|
||||
ret = lp3971_set_bits(lp3971, LP3971_BUCK_TARGET_VOL1_REG(buck),
|
||||
BUCK_TARGET_VOL_MASK, val);
|
||||
BUCK_TARGET_VOL_MASK, selector);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -306,10 +278,10 @@ static struct regulator_ops lp3971_dcdc_ops = {
|
||||
.enable = lp3971_dcdc_enable,
|
||||
.disable = lp3971_dcdc_disable,
|
||||
.get_voltage = lp3971_dcdc_get_voltage,
|
||||
.set_voltage = lp3971_dcdc_set_voltage,
|
||||
.set_voltage_sel = lp3971_dcdc_set_voltage_sel,
|
||||
};
|
||||
|
||||
static struct regulator_desc regulators[] = {
|
||||
static const struct regulator_desc regulators[] = {
|
||||
{
|
||||
.name = "LDO1",
|
||||
.id = LP3971_LDO1,
|
||||
@@ -449,10 +421,15 @@ static int __devinit setup_regulators(struct lp3971 *lp3971,
|
||||
|
||||
/* Instantiate the regulators */
|
||||
for (i = 0; i < pdata->num_regulators; i++) {
|
||||
struct regulator_config config = { };
|
||||
struct lp3971_regulator_subdev *reg = &pdata->regulators[i];
|
||||
lp3971->rdev[i] = regulator_register(®ulators[reg->id],
|
||||
lp3971->dev, reg->initdata, lp3971, NULL);
|
||||
|
||||
config.dev = lp3971->dev;
|
||||
config.init_data = reg->initdata;
|
||||
config.driver_data = lp3971;
|
||||
|
||||
lp3971->rdev[i] = regulator_register(®ulators[reg->id],
|
||||
&config);
|
||||
if (IS_ERR(lp3971->rdev[i])) {
|
||||
err = PTR_ERR(lp3971->rdev[i]);
|
||||
dev_err(lp3971->dev, "regulator init failed: %d\n",
|
||||
@@ -545,23 +522,7 @@ static struct i2c_driver lp3971_i2c_driver = {
|
||||
.id_table = lp3971_i2c_id,
|
||||
};
|
||||
|
||||
static int __init lp3971_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = i2c_add_driver(&lp3971_i2c_driver);
|
||||
if (ret != 0)
|
||||
pr_err("Failed to register I2C driver: %d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
module_init(lp3971_module_init);
|
||||
|
||||
static void __exit lp3971_module_exit(void)
|
||||
{
|
||||
i2c_del_driver(&lp3971_i2c_driver);
|
||||
}
|
||||
module_exit(lp3971_module_exit);
|
||||
module_i2c_driver(lp3971_i2c_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Marek Szyprowski <m.szyprowski@samsung.com>");
|
||||
|
||||
+26
-48
@@ -245,6 +245,11 @@ static int lp3972_set_bits(struct lp3972 *lp3972, u8 reg, u16 mask, u16 val)
|
||||
static int lp3972_ldo_list_voltage(struct regulator_dev *dev, unsigned index)
|
||||
{
|
||||
int ldo = rdev_get_id(dev) - LP3972_LDO1;
|
||||
|
||||
if (index < LP3972_LDO_VOL_MIN_IDX(ldo) ||
|
||||
index > LP3972_LDO_VOL_MAX_IDX(ldo))
|
||||
return -EINVAL;
|
||||
|
||||
return 1000 * LP3972_LDO_VOL_VALUE_MAP(ldo)[index];
|
||||
}
|
||||
|
||||
@@ -292,34 +297,16 @@ static int lp3972_ldo_get_voltage(struct regulator_dev *dev)
|
||||
return 1000 * LP3972_LDO_VOL_VALUE_MAP(ldo)[val];
|
||||
}
|
||||
|
||||
static int lp3972_ldo_set_voltage(struct regulator_dev *dev,
|
||||
int min_uV, int max_uV,
|
||||
unsigned int *selector)
|
||||
static int lp3972_ldo_set_voltage_sel(struct regulator_dev *dev,
|
||||
unsigned int selector)
|
||||
{
|
||||
struct lp3972 *lp3972 = rdev_get_drvdata(dev);
|
||||
int ldo = rdev_get_id(dev) - LP3972_LDO1;
|
||||
int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
|
||||
const int *vol_map = LP3972_LDO_VOL_VALUE_MAP(ldo);
|
||||
u16 val;
|
||||
int shift, ret;
|
||||
|
||||
if (min_vol < vol_map[LP3972_LDO_VOL_MIN_IDX(ldo)] ||
|
||||
min_vol > vol_map[LP3972_LDO_VOL_MAX_IDX(ldo)])
|
||||
return -EINVAL;
|
||||
|
||||
for (val = LP3972_LDO_VOL_MIN_IDX(ldo);
|
||||
val <= LP3972_LDO_VOL_MAX_IDX(ldo); val++)
|
||||
if (vol_map[val] >= min_vol)
|
||||
break;
|
||||
|
||||
if (val > LP3972_LDO_VOL_MAX_IDX(ldo) || vol_map[val] > max_vol)
|
||||
return -EINVAL;
|
||||
|
||||
*selector = val;
|
||||
|
||||
shift = LP3972_LDO_VOL_CONTR_SHIFT(ldo);
|
||||
ret = lp3972_set_bits(lp3972, LP3972_LDO_VOL_CONTR_REG(ldo),
|
||||
LP3972_LDO_VOL_MASK(ldo) << shift, val << shift);
|
||||
LP3972_LDO_VOL_MASK(ldo) << shift, selector << shift);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -355,12 +342,17 @@ static struct regulator_ops lp3972_ldo_ops = {
|
||||
.enable = lp3972_ldo_enable,
|
||||
.disable = lp3972_ldo_disable,
|
||||
.get_voltage = lp3972_ldo_get_voltage,
|
||||
.set_voltage = lp3972_ldo_set_voltage,
|
||||
.set_voltage_sel = lp3972_ldo_set_voltage_sel,
|
||||
};
|
||||
|
||||
static int lp3972_dcdc_list_voltage(struct regulator_dev *dev, unsigned index)
|
||||
{
|
||||
int buck = rdev_get_id(dev) - LP3972_DCDC1;
|
||||
|
||||
if (index < LP3972_BUCK_VOL_MIN_IDX(buck) ||
|
||||
index > LP3972_BUCK_VOL_MAX_IDX(buck))
|
||||
return -EINVAL;
|
||||
|
||||
return 1000 * buck_voltage_map[buck][index];
|
||||
}
|
||||
|
||||
@@ -419,34 +411,15 @@ static int lp3972_dcdc_get_voltage(struct regulator_dev *dev)
|
||||
return val;
|
||||
}
|
||||
|
||||
static int lp3972_dcdc_set_voltage(struct regulator_dev *dev,
|
||||
int min_uV, int max_uV,
|
||||
unsigned int *selector)
|
||||
static int lp3972_dcdc_set_voltage_sel(struct regulator_dev *dev,
|
||||
unsigned int selector)
|
||||
{
|
||||
struct lp3972 *lp3972 = rdev_get_drvdata(dev);
|
||||
int buck = rdev_get_id(dev) - LP3972_DCDC1;
|
||||
int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
|
||||
const int *vol_map = buck_voltage_map[buck];
|
||||
u16 val;
|
||||
int ret;
|
||||
|
||||
if (min_vol < vol_map[LP3972_BUCK_VOL_MIN_IDX(buck)] ||
|
||||
min_vol > vol_map[LP3972_BUCK_VOL_MAX_IDX(buck)])
|
||||
return -EINVAL;
|
||||
|
||||
for (val = LP3972_BUCK_VOL_MIN_IDX(buck);
|
||||
val <= LP3972_BUCK_VOL_MAX_IDX(buck); val++)
|
||||
if (vol_map[val] >= min_vol)
|
||||
break;
|
||||
|
||||
if (val > LP3972_BUCK_VOL_MAX_IDX(buck) ||
|
||||
vol_map[val] > max_vol)
|
||||
return -EINVAL;
|
||||
|
||||
*selector = val;
|
||||
|
||||
ret = lp3972_set_bits(lp3972, LP3972_BUCK_VOL1_REG(buck),
|
||||
LP3972_BUCK_VOL_MASK, val);
|
||||
LP3972_BUCK_VOL_MASK, selector);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -468,10 +441,10 @@ static struct regulator_ops lp3972_dcdc_ops = {
|
||||
.enable = lp3972_dcdc_enable,
|
||||
.disable = lp3972_dcdc_disable,
|
||||
.get_voltage = lp3972_dcdc_get_voltage,
|
||||
.set_voltage = lp3972_dcdc_set_voltage,
|
||||
.set_voltage_sel = lp3972_dcdc_set_voltage_sel,
|
||||
};
|
||||
|
||||
static struct regulator_desc regulators[] = {
|
||||
static const struct regulator_desc regulators[] = {
|
||||
{
|
||||
.name = "LDO1",
|
||||
.id = LP3972_LDO1,
|
||||
@@ -554,9 +527,14 @@ static int __devinit setup_regulators(struct lp3972 *lp3972,
|
||||
/* Instantiate the regulators */
|
||||
for (i = 0; i < pdata->num_regulators; i++) {
|
||||
struct lp3972_regulator_subdev *reg = &pdata->regulators[i];
|
||||
lp3972->rdev[i] = regulator_register(®ulators[reg->id],
|
||||
lp3972->dev, reg->initdata, lp3972, NULL);
|
||||
struct regulator_config config = { };
|
||||
|
||||
config.dev = lp3972->dev;
|
||||
config.init_data = reg->initdata;
|
||||
config.driver_data = lp3972;
|
||||
|
||||
lp3972->rdev[i] = regulator_register(®ulators[reg->id],
|
||||
&config);
|
||||
if (IS_ERR(lp3972->rdev[i])) {
|
||||
err = PTR_ERR(lp3972->rdev[i]);
|
||||
dev_err(lp3972->dev, "regulator init failed: %d\n",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user