Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 178e43ae authored by Mark Brown's avatar Mark Brown
Browse files

Merge remote-tracking branches 'regulator/topic/core',...

Merge remote-tracking branches 'regulator/topic/core', 'regulator/topic/regmap' and 'regulator/topic/register' into regulator-next
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -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.
+0 −11
Original line number Diff line number Diff line
@@ -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);
+52 −127
Original line number Diff line number Diff line
@@ -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;
	}

	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;
	val = (uint8_t)(selector << (ffs(rdev->desc->vsel_mask) - 1));

	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,					\
	},								\
	.vol_reg	= PM8607_##vreg,				\
	.vol_shift	= (shift),					\
	.vol_nbits	= (nbits),					\
		.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_bit	= (ebit),					\
		.enable_mask = 1 << (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_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_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, 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);
+19 −2
Original line number Diff line number Diff line
@@ -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
+3 −1
Original line number Diff line number Diff line
@@ -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
Loading