Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1186177 > unrolled thread

[PATCH 0/5] regulator: 88pm800: Add 88pm860 regulator support

Started byVaibhav Hiremath <vaibhav.hiremath@linaro.org>
First post2015-07-16 20:30 +0200
Last post2015-07-17 07:40 +0200
Articles 10 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 0/5] regulator: 88pm800: Add 88pm860 regulator support Vaibhav Hiremath <vaibhav.hiremath@linaro.org> - 2015-07-16 20:30 +0200
    [PATCH 2/5] regulator: 88pm800: Update driver to use devm_regulator_register fn Vaibhav Hiremath <vaibhav.hiremath@linaro.org> - 2015-07-16 20:30 +0200
    [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support Vaibhav Hiremath <vaibhav.hiremath@linaro.org> - 2015-07-16 20:30 +0200
      Re: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support Mark Brown <broonie@kernel.org> - 2015-07-16 23:40 +0200
        Re: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support Vaibhav Hiremath <vaibhav.hiremath@linaro.org> - 2015-07-17 07:50 +0200
          Re: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support Mark Brown <broonie@kernel.org> - 2015-07-17 13:20 +0200
            Re: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support Vaibhav Hiremath <vaibhav.hiremath@linaro.org> - 2015-07-17 14:50 +0200
    [PATCH 5/5] regulator: 88pm800: Add support for configuration of dual phase on BUCK1 Vaibhav Hiremath <vaibhav.hiremath@linaro.org> - 2015-07-16 20:30 +0200
      Re: [PATCH 5/5] regulator: 88pm800: Add support for configuration of  dual phase on BUCK1 Mark Brown <broonie@kernel.org> - 2015-07-16 22:40 +0200
        Re: [PATCH 5/5] regulator: 88pm800: Add support for configuration  of dual phase on BUCK1 Vaibhav Hiremath <vaibhav.hiremath@linaro.org> - 2015-07-17 07:40 +0200

#1186177 — [PATCH 0/5] regulator: 88pm800: Add 88pm860 regulator support

FromVaibhav Hiremath <vaibhav.hiremath@linaro.org>
Date2015-07-16 20:30 +0200
Subject[PATCH 0/5] regulator: 88pm800: Add 88pm860 regulator support
Message-ID<pMVVf-66m-7@gated-at.bofh.it>
88PM860 falls under 88pm800 family of devices, with additional feature
enhancements, like,
  - 88pm860 had additional BUCK regulator (BUCK6 and BUCK1B)
  - Additional LDO (LDO20)
  - different voltage and current capability

This patch adds 88PM860 related buck/ldo voltage/current data to
the driver, and creates the regulator_desc table.

With addition of new device to the driver, couple of unavoidable
changes,

  - Fixes the code for indentation issue while defining data structures
  - Updated the driver to use devm_regulator_register() fn
  - The table gets referenced using regulator ID (PM800_ID_xxx),
    so table also needs to be created using ID.
  - The naming convention of voltage tables would no longer be
    mapped to respective ldos/bucks, so this patch also renames
    to more generic name.
  - And adds dual phase enable support based on max current constraint,
    resulting in supporting set_current_limit() call back.

V1 => V1:
=========
Please __note__ that, I am starting patch-series all over again, as
only one patch is getting carry-forwarded into this series. All other patches
are newly implemented and 1 patch got already merged to upstream.

Testing:
  - Boot tested on PXA1928 based platform, where all BUCK's and LDO's got
    registered successfully 
  - Verified that MMC driver is getting regulator successfully
  - Printed all LDO and BUCK resgiter before and after regulator registration,
    early boot and late boot, where based on consumer regulator is either enabled
    or disabled.

TODO:
  - Validation on 88PM800 device, looking for some help here, as I do
    not have any platform with 88PM800 device.


Vaibhav Hiremath (5):
  regulator: 88pm800: Fix indentation of assignments of data structures
  regulator: 88pm800: Update driver to use devm_regulator_register fn
  regulator: 88pm800: Use regulator_nodes/of_match in the descriptor
  regulator: 88pm800: Add 88pm860 regulator support
  regulator: 88pm800: Add support for configuration of dual phase on
    BUCK1

 drivers/regulator/88pm800.c | 339 +++++++++++++++++++++++---------------------
 include/linux/mfd/88pm80x.h |   6 +
 2 files changed, 184 insertions(+), 161 deletions(-)

-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1186178 — [PATCH 2/5] regulator: 88pm800: Update driver to use devm_regulator_register fn

FromVaibhav Hiremath <vaibhav.hiremath@linaro.org>
Date2015-07-16 20:30 +0200
Subject[PATCH 2/5] regulator: 88pm800: Update driver to use devm_regulator_register fn
Message-ID<pMW4W-6hv-5@gated-at.bofh.it>
In reply to#1186177
This patch replaces standard regulator_register with
devm_regulator_register() fn, as using devm_regulator_register() fn
simplifies the driver return/exit path.

As part of this update, patch also cleanups up all unnecessary changes
which is result of this patch -

  - Remove _remove() fn, as devm_ variant takes care of it.
  - Remove pm800_regulators.regulators[] field, as it was only
    needed during cleanup, so we no longer need this.
    This also saved some amount of memory.

Signed-off-by: Vaibhav Hiremath <vaibhav.hiremath@linaro.org>
---
 drivers/regulator/88pm800.c | 27 ++++++---------------------
 1 file changed, 6 insertions(+), 21 deletions(-)

diff --git a/drivers/regulator/88pm800.c b/drivers/regulator/88pm800.c
index 11f7ab2..3b37170 100644
--- a/drivers/regulator/88pm800.c
+++ b/drivers/regulator/88pm800.c
@@ -78,7 +78,6 @@ struct pm800_regulator_info {
 };
 
 struct pm800_regulators {
-	struct regulator_dev *regulators[PM800_ID_RG_MAX];
 	struct pm80x_chip *chip;
 	struct regmap *map;
 };
@@ -318,6 +317,8 @@ static int pm800_regulator_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, pm800_data);
 
 	for (i = 0; i < PM800_ID_RG_MAX; i++) {
+		struct regulator_dev *regulator;
+
 		if (!pdata || pdata->num_regulators == 0)
 			init_data = pm800_regulator_matches[i].init_data;
 		else
@@ -331,16 +332,12 @@ static int pm800_regulator_probe(struct platform_device *pdev)
 		config.regmap = pm800_data->map;
 		config.of_node = pm800_regulator_matches[i].of_node;
 
-		pm800_data->regulators[i] =
-				regulator_register(&info->desc, &config);
-		if (IS_ERR(pm800_data->regulators[i])) {
-			ret = PTR_ERR(pm800_data->regulators[i]);
+		regulator = devm_regulator_register(&pdev->dev,
+					&info->desc, &config);
+		if (IS_ERR(regulator)) {
+			ret = PTR_ERR(regulator);
 			dev_err(&pdev->dev, "Failed to register %s\n",
 				info->desc.name);
-
-			while (--i >= 0)
-				regulator_unregister(pm800_data->regulators[i]);
-
 			return ret;
 		}
 	}
@@ -348,23 +345,11 @@ static int pm800_regulator_probe(struct platform_device *pdev)
 	return 0;
 }
 
-static int pm800_regulator_remove(struct platform_device *pdev)
-{
-	struct pm800_regulators *pm800_data = platform_get_drvdata(pdev);
-	int i;
-
-	for (i = 0; i < PM800_ID_RG_MAX; i++)
-		regulator_unregister(pm800_data->regulators[i]);
-
-	return 0;
-}
-
 static struct platform_driver pm800_regulator_driver = {
 	.driver		= {
 		.name	= "88pm80x-regulator",
 	},
 	.probe		= pm800_regulator_probe,
-	.remove		= pm800_regulator_remove,
 };
 
 module_platform_driver(pm800_regulator_driver);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1186180 — [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support

FromVaibhav Hiremath <vaibhav.hiremath@linaro.org>
Date2015-07-16 20:30 +0200
Subject[PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support
Message-ID<pMW4W-6hv-15@gated-at.bofh.it>
In reply to#1186177
88PM860 falls under 88pm800 family of devices, with
additional feature enhancements, like,
  - 88pm860 had additional BUCK regulator (BUCK6 and BUCK1B)
  - Additional LDO (LDO20)
  - different voltage and current capability

This patch adds 88PM860 related buck/ldo voltage/current data to
the driver, and creates the regulator_desc table.

With addition of new device to the driver, couple of unavoidable
changes,

  - The table gets referenced using regulator ID (PM800_ID_xxx),
    so table also needs to be created using ID.

   - The naming convention of voltage tables would no longer be
     mapped to respective ldos/bucks, so this patch also renames
     to more generic name.

TODO:
  - Validation on 88PM800 device, looking for some help here, as I do
    not have any platform with 88PM800 device.

Signed-off-by: Vaibhav Hiremath <vaibhav.hiremath@linaro.org>
---
 drivers/regulator/88pm800.c | 125 ++++++++++++++++++++++++++++++--------------
 include/linux/mfd/88pm80x.h |   3 ++
 2 files changed, 90 insertions(+), 38 deletions(-)

diff --git a/drivers/regulator/88pm800.c b/drivers/regulator/88pm800.c
index 26c277f..e846e4c 100644
--- a/drivers/regulator/88pm800.c
+++ b/drivers/regulator/88pm800.c
@@ -44,6 +44,7 @@
 #define PM800_LDO17_VOUT	(0x1A)
 #define PM800_LDO18_VOUT	(0x1B)
 #define PM800_LDO19_VOUT	(0x1C)
+#define PM800_LDO20_VOUT	(0x1D)
 
 /* BUCK1 with DVC[0..3] */
 #define PM800_BUCK1		(0x3C)
@@ -57,6 +58,8 @@
 #define PM800_BUCK4_2		(0x44)
 #define PM800_BUCK4_3		(0x45)
 #define PM800_BUCK5		(0x46)
+#define PM800_BUCK6		(0x4A)
+#define PM800_BUCK1B		(0x4B)
 
 #define PM800_BUCK_ENA		(0x50)
 #define PM800_LDO_ENA1_1	(0x51)
@@ -92,7 +95,7 @@ struct pm800_regulators {
  * n_volt - Number of available selectors
  */
 #define PM800_BUCK(match, vreg, ereg, ebit, amax, volt_ranges, n_volt)	\
-{									\
+[PM800_ID_##vreg] = {							\
 	.desc	= {							\
 		.name			= #vreg,			\
 		.of_match		= of_match_ptr(#match),		\
@@ -122,7 +125,7 @@ struct pm800_regulators {
  * simpler and faster.
  */
 #define PM800_LDO(match, vreg, ereg, ebit, amax, ldo_volt_table)	\
-{									\
+[PM800_ID_##vreg] = {							\
 	.desc	= {							\
 		.name			= #vreg,			\
 		.of_match		= of_match_ptr(#match),		\
@@ -142,34 +145,36 @@ struct pm800_regulators {
 }
 
 /* Ranges are sorted in ascending order. */
-static const struct regulator_linear_range buck1_volt_range[] = {
+static const struct regulator_linear_range buck_volt_range1[] = {
 	REGULATOR_LINEAR_RANGE(600000, 0, 0x4f, 12500),
 	REGULATOR_LINEAR_RANGE(1600000, 0x50, 0x54, 50000),
 };
 
 /* BUCK 2~5 have same ranges. */
-static const struct regulator_linear_range buck2_5_volt_range[] = {
+static const struct regulator_linear_range buck_volt_range2[] = {
 	REGULATOR_LINEAR_RANGE(600000, 0, 0x4f, 12500),
 	REGULATOR_LINEAR_RANGE(1600000, 0x50, 0x72, 50000),
 };
 
-static const unsigned int ldo1_volt_table[] = {
+/* 88pm800: LDO1, 88pm860: LDO19  */
+static const unsigned int ldo_volt_table1[] = {
 	600000,  650000,  700000,  750000,  800000,  850000,  900000,  950000,
 	1000000, 1050000, 1100000, 1150000, 1200000, 1300000, 1400000, 1500000,
 };
 
-static const unsigned int ldo2_volt_table[] = {
+/* 88pm800: LDO2, 88pm860: LDO20 */
+static const unsigned int ldo_volt_table2[] = {
 	1700000, 1800000, 1900000, 2000000, 2100000, 2500000, 2700000, 2800000,
 };
 
-/* LDO 3~17 have same voltage table. */
-static const unsigned int ldo3_17_volt_table[] = {
+/* 88pm800: LDO 3~17, 88pm860: LDO 4~18 */
+static const unsigned int ldo_volt_table3[] = {
 	1200000, 1250000, 1700000, 1800000, 1850000, 1900000, 2500000, 2600000,
 	2700000, 2750000, 2800000, 2850000, 2900000, 3000000, 3100000, 3300000,
 };
 
-/* LDO 18~19 have same voltage table. */
-static const unsigned int ldo18_19_volt_table[] = {
+/* LDO 18~19, 88pm860: 1~3 */
+static const unsigned int ldo_volt_table4[] = {
 	1700000, 1800000, 1900000, 2500000, 2800000, 2900000, 3100000, 3300000,
 };
 
@@ -204,31 +209,62 @@ static struct regulator_ops pm800_volt_table_ops = {
 
 /* The array is indexed by id(PM800_ID_XXX) */
 static struct pm800_regulator_info pm800_regulator_info[] = {
-	PM800_BUCK(buck1, BUCK1, BUCK_ENA, 0, 3000000, buck1_volt_range, 0x55),
-	PM800_BUCK(buck2, BUCK2, BUCK_ENA, 1, 1200000, buck2_5_volt_range, 0x73),
-	PM800_BUCK(buck3, BUCK3, BUCK_ENA, 2, 1200000, buck2_5_volt_range, 0x73),
-	PM800_BUCK(buck4, BUCK4, BUCK_ENA, 3, 1200000, buck2_5_volt_range, 0x73),
-	PM800_BUCK(buck5, BUCK5, BUCK_ENA, 4, 1200000, buck2_5_volt_range, 0x73),
-
-	PM800_LDO(ldo1, LDO1, LDO_ENA1_1, 0, 200000, ldo1_volt_table),
-	PM800_LDO(ldo2, LDO2, LDO_ENA1_1, 1, 10000, ldo2_volt_table),
-	PM800_LDO(ldo3, LDO3, LDO_ENA1_1, 2, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo4, LDO4, LDO_ENA1_1, 3, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo5, LDO5, LDO_ENA1_1, 4, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo6, LDO6, LDO_ENA1_1, 5, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo7, LDO7, LDO_ENA1_1, 6, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo8, LDO8, LDO_ENA1_1, 7, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo9, LDO9, LDO_ENA1_2, 0, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo10, LDO10, LDO_ENA1_2, 1, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo11, LDO11, LDO_ENA1_2, 2, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo12, LDO12, LDO_ENA1_2, 3, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo13, LDO13, LDO_ENA1_2, 4, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo14, LDO14, LDO_ENA1_2, 5, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo15, LDO15, LDO_ENA1_2, 6, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo16, LDO16, LDO_ENA1_2, 7, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo17, LDO17, LDO_ENA1_3, 0, 300000, ldo3_17_volt_table),
-	PM800_LDO(ldo18, LDO18, LDO_ENA1_3, 1, 200000, ldo18_19_volt_table),
-	PM800_LDO(ldo19, LDO19, LDO_ENA1_3, 2, 200000, ldo18_19_volt_table),
+	PM800_BUCK(buck1, BUCK1, BUCK_ENA, 0, 3000000, buck_volt_range1, 0x55),
+	PM800_BUCK(buck2, BUCK2, BUCK_ENA, 1, 1200000, buck_volt_range2, 0x73),
+	PM800_BUCK(buck3, BUCK3, BUCK_ENA, 2, 1200000, buck_volt_range2, 0x73),
+	PM800_BUCK(buck4, BUCK4, BUCK_ENA, 3, 1200000, buck_volt_range2, 0x73),
+	PM800_BUCK(buck5, BUCK5, BUCK_ENA, 4, 1200000, buck_volt_range2, 0x73),
+
+	PM800_LDO(ldo1, LDO1, LDO_ENA1_1, 0, 200000, ldo_volt_table1),
+	PM800_LDO(ldo2, LDO2, LDO_ENA1_1, 1, 10000, ldo_volt_table2),
+	PM800_LDO(ldo3, LDO3, LDO_ENA1_1, 2, 300000, ldo_volt_table3),
+	PM800_LDO(ldo4, LDO4, LDO_ENA1_1, 3, 300000, ldo_volt_table3),
+	PM800_LDO(ldo5, LDO5, LDO_ENA1_1, 4, 300000, ldo_volt_table3),
+	PM800_LDO(ldo6, LDO6, LDO_ENA1_1, 5, 300000, ldo_volt_table3),
+	PM800_LDO(ldo7, LDO7, LDO_ENA1_1, 6, 300000, ldo_volt_table3),
+	PM800_LDO(ldo8, LDO8, LDO_ENA1_1, 7, 300000, ldo_volt_table3),
+	PM800_LDO(ldo9, LDO9, LDO_ENA1_2, 0, 300000, ldo_volt_table3),
+	PM800_LDO(ldo10, LDO10, LDO_ENA1_2, 1, 300000, ldo_volt_table3),
+	PM800_LDO(ldo11, LDO11, LDO_ENA1_2, 2, 300000, ldo_volt_table3),
+	PM800_LDO(ldo12, LDO12, LDO_ENA1_2, 3, 300000, ldo_volt_table3),
+	PM800_LDO(ldo13, LDO13, LDO_ENA1_2, 4, 300000, ldo_volt_table3),
+	PM800_LDO(ldo14, LDO14, LDO_ENA1_2, 5, 300000, ldo_volt_table3),
+	PM800_LDO(ldo15, LDO15, LDO_ENA1_2, 6, 300000, ldo_volt_table3),
+	PM800_LDO(ldo16, LDO16, LDO_ENA1_2, 7, 300000, ldo_volt_table3),
+	PM800_LDO(ldo17, LDO17, LDO_ENA1_3, 0, 300000, ldo_volt_table3),
+	PM800_LDO(ldo18, LDO18, LDO_ENA1_3, 1, 200000, ldo_volt_table4),
+	PM800_LDO(ldo19, LDO19, LDO_ENA1_3, 2, 200000, ldo_volt_table4),
+};
+
+static struct pm800_regulator_info pm860_regulator_info[] = {
+	PM800_BUCK(buck1, BUCK1, BUCK_ENA, 0, 3000000, buck_volt_range1, 0x55),
+	PM800_BUCK(buck2, BUCK2, BUCK_ENA, 1, 750000, buck_volt_range2, 0x73),
+	PM800_BUCK(buck3, BUCK3, BUCK_ENA, 2, 1500000, buck_volt_range2, 0x73),
+	PM800_BUCK(buck4, BUCK4, BUCK_ENA, 3, 750000, buck_volt_range2, 0x73),
+	PM800_BUCK(buck5, BUCK5, BUCK_ENA, 4, 1500000, buck_volt_range2, 0x73),
+	PM800_BUCK(buck6, BUCK6, BUCK_ENA, 5, 800000, buck_volt_range2, 0x73),
+	PM800_BUCK(buck1b, BUCK1B, BUCK_ENA, 6, 3000000, buck_volt_range2, 0x55),
+
+	PM800_LDO(ldo1, LDO1, LDO_ENA1_1, 0, 100000, ldo_volt_table4),
+	PM800_LDO(ldo2, LDO2, LDO_ENA1_1, 1, 100000, ldo_volt_table4),
+	PM800_LDO(ldo3, LDO3, LDO_ENA1_1, 2, 100000, ldo_volt_table4),
+	PM800_LDO(ldo4, LDO4, LDO_ENA1_1, 3, 400000, ldo_volt_table3),
+	PM800_LDO(ldo5, LDO5, LDO_ENA1_1, 4, 400000, ldo_volt_table3),
+	PM800_LDO(ldo6, LDO6, LDO_ENA1_1, 5, 400000, ldo_volt_table3),
+	PM800_LDO(ldo7, LDO7, LDO_ENA1_1, 6, 400000, ldo_volt_table3),
+	PM800_LDO(ldo8, LDO8, LDO_ENA1_1, 7, 400000, ldo_volt_table3),
+	PM800_LDO(ldo9, LDO9, LDO_ENA1_2, 0, 400000, ldo_volt_table3),
+	PM800_LDO(ldo10, LDO10, LDO_ENA1_2, 1, 200000, ldo_volt_table3),
+	PM800_LDO(ldo11, LDO11, LDO_ENA1_2, 2, 200000, ldo_volt_table3),
+	PM800_LDO(ldo12, LDO12, LDO_ENA1_2, 3, 200000, ldo_volt_table3),
+	PM800_LDO(ldo13, LDO13, LDO_ENA1_2, 4, 200000, ldo_volt_table3),
+	PM800_LDO(ldo14, LDO14, LDO_ENA1_2, 5, 200000, ldo_volt_table3),
+	PM800_LDO(ldo15, LDO15, LDO_ENA1_2, 6, 200000, ldo_volt_table3),
+	PM800_LDO(ldo16, LDO16, LDO_ENA1_2, 7, 200000, ldo_volt_table3),
+	PM800_LDO(ldo17, LDO17, LDO_ENA1_3, 0, 200000, ldo_volt_table3),
+	PM800_LDO(ldo18, LDO18, LDO_ENA1_3, 1, 200000, ldo_volt_table3),
+	PM800_LDO(ldo19, LDO19, LDO_ENA1_3, 2, 400000, ldo_volt_table1),
+	PM800_LDO(ldo20, LDO20, LDO_ENA1_3, 3, 10000, ldo_volt_table2),
 };
 
 static int pm800_regulator_probe(struct platform_device *pdev)
@@ -238,6 +274,7 @@ static int pm800_regulator_probe(struct platform_device *pdev)
 	struct pm800_regulators *pm800_data;
 	struct regulator_config config = { };
 	struct regulator_init_data *init_data;
+	struct pm800_regulator_info *info = NULL;
 	int i, ret;
 
 	if (pdata && pdata->num_regulators) {
@@ -262,6 +299,18 @@ static int pm800_regulator_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, pm800_data);
 
+	switch (chip->type) {
+	case CHIP_PM800:
+	case CHIP_PM805:
+		info = pm800_regulator_info;
+		break;
+	case CHIP_PM860:
+		info = pm860_regulator_info;
+		break;
+	default:
+		return -ENODEV;
+	}
+
 	config.dev = chip->dev;
 	config.regmap = pm800_data->map;
 	for (i = 0; i < PM800_ID_RG_MAX; i++) {
@@ -275,14 +324,14 @@ static int pm800_regulator_probe(struct platform_device *pdev)
 			config.init_data = init_data;
 		}
 
-		config.driver_data = &pm800_regulator_info[i];
+		config.driver_data = &info[i];
 
 		regulator = devm_regulator_register(&pdev->dev,
-				&pm800_regulator_info[i].desc, &config);
+				&info[i].desc, &config);
 		if (IS_ERR(regulator)) {
 			ret = PTR_ERR(regulator);
 			dev_err(&pdev->dev, "Failed to register %s\n",
-					pm800_regulator_info[i].desc.name);
+					info[i].desc.name);
 			return ret;
 		}
 	}
diff --git a/include/linux/mfd/88pm80x.h b/include/linux/mfd/88pm80x.h
index 2ef62af..a92d173 100644
--- a/include/linux/mfd/88pm80x.h
+++ b/include/linux/mfd/88pm80x.h
@@ -31,6 +31,8 @@ enum {
 	PM800_ID_BUCK3,
 	PM800_ID_BUCK4,
 	PM800_ID_BUCK5,
+	PM800_ID_BUCK6,
+	PM800_ID_BUCK1B,
 
 	PM800_ID_LDO1,
 	PM800_ID_LDO2,
@@ -51,6 +53,7 @@ enum {
 	PM800_ID_LDO17,
 	PM800_ID_LDO18,
 	PM800_ID_LDO19,
+	PM800_ID_LDO20,
 
 	PM800_ID_RG_MAX,
 };
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1186273 — Re: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support

FromMark Brown <broonie@kernel.org>
Date2015-07-16 23:40 +0200
SubjectRe: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support
Message-ID<pMZ2O-23i-13@gated-at.bofh.it>
In reply to#1186180

[Multipart message — attachments visible in raw view] — view raw

On Thu, Jul 16, 2015 at 11:46:57PM +0530, Vaibhav Hiremath wrote:
> 88PM860 falls under 88pm800 family of devices, with
> additional feature enhancements, like,
>   - 88pm860 had additional BUCK regulator (BUCK6 and BUCK1B)
>   - Additional LDO (LDO20)
>   - different voltage and current capability

...and reverted since this doesn't build as the kbuild test robot
reported.  :(

[toc] | [prev] | [next] | [standalone]


#1186477 — Re: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support

FromVaibhav Hiremath <vaibhav.hiremath@linaro.org>
Date2015-07-17 07:50 +0200
SubjectRe: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support
Message-ID<pN6GZ-4Li-3@gated-at.bofh.it>
In reply to#1186273

On Friday 17 July 2015 03:04 AM, Mark Brown wrote:
> On Thu, Jul 16, 2015 at 11:46:57PM +0530, Vaibhav Hiremath wrote:
>> 88PM860 falls under 88pm800 family of devices, with
>> additional feature enhancements, like,
>>    - 88pm860 had additional BUCK regulator (BUCK6 and BUCK1B)
>>    - Additional LDO (LDO20)
>>    - different voltage and current capability
>
> ...and reverted since this doesn't build as the kbuild test robot
> reported.  :(
>

How do you suggest to handle dependency between MFD patch and this
patch?

Can you merge this into regulator tree?

Link to MFD - https://lkml.org/lkml/2015/7/16/704

Thanks,
Vaibhav
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1186716 — Re: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support

FromMark Brown <broonie@kernel.org>
Date2015-07-17 13:20 +0200
SubjectRe: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support
Message-ID<pNbQm-3OB-9@gated-at.bofh.it>
In reply to#1186477

[Multipart message — attachments visible in raw view] — view raw

On Fri, Jul 17, 2015 at 11:12:04AM +0530, Vaibhav Hiremath wrote:

> Can you merge this into regulator tree?

> Link to MFD - https://lkml.org/lkml/2015/7/16/704

I need a tag I can pull from Lee.

[toc] | [prev] | [next] | [standalone]


#1186796 — Re: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support

FromVaibhav Hiremath <vaibhav.hiremath@linaro.org>
Date2015-07-17 14:50 +0200
SubjectRe: [PATCH 4/5] regulator: 88pm800: Add 88pm860 regulator support
Message-ID<pNdft-5HQ-27@gated-at.bofh.it>
In reply to#1186716

On Friday 17 July 2015 04:47 PM, Mark Brown wrote:
> On Fri, Jul 17, 2015 at 11:12:04AM +0530, Vaibhav Hiremath wrote:
>
>> Can you merge this into regulator tree?
>
>> Link to MFD - https://lkml.org/lkml/2015/7/16/704
>
> I need a tag I can pull from Lee.
>
Great.

Lee,
It would be helpful, if you could ack below patch,

https://lkml.org/lkml/2015/7/16/704

Thanks,
Vaibhav
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1186181 — [PATCH 5/5] regulator: 88pm800: Add support for configuration of dual phase on BUCK1

FromVaibhav Hiremath <vaibhav.hiremath@linaro.org>
Date2015-07-16 20:30 +0200
Subject[PATCH 5/5] regulator: 88pm800: Add support for configuration of dual phase on BUCK1
Message-ID<pMW4X-6hv-23@gated-at.bofh.it>
In reply to#1186177
88PM860 device supports dual phase mode on BUCK1 output.
In normal usecase, BUCK1A and BUCK1B operates independently with 3A
capacity. And they both can work as a dual phase providing 6A capacity.

This patch adds support for regulator_ops.set_current_limit() callback fn,
in turn enabling support for current min and max supply constraint on BUCK1
(and optionally on BUCK1B). Based on that driver enables dual-phase mode.

Note that, if max current supply constraint is > 3A on BUCK1(A) then driver
enables the dual-phase mode, irrespective of BUCK1B constraint.

Signed-off-by: Vaibhav Hiremath <vaibhav.hiremath@linaro.org>
---
 drivers/regulator/88pm800.c | 38 ++++++++++++++++++++++++++++++++++++++
 include/linux/mfd/88pm80x.h |  3 +++
 2 files changed, 41 insertions(+)

diff --git a/drivers/regulator/88pm800.c b/drivers/regulator/88pm800.c
index e846e4c..1da18fa 100644
--- a/drivers/regulator/88pm800.c
+++ b/drivers/regulator/88pm800.c
@@ -185,6 +185,43 @@ static int pm800_get_current_limit(struct regulator_dev *rdev)
 	return info->max_ua;
 }
 
+/*
+ * 88pm860 device supports dual-phase mode on BUCK1, where BUCK1A and BUCK1B can
+ * be used together to supply 6A current.  Note that, independently, they can
+ * source 3A each.
+ *
+ * So, this function checks for max_uA for BUCK1 (only), and if it is more than
+ * 3A, then enable dual-phase mode.
+ */
+static int pm800_set_current_limit(struct regulator_dev *rdev,
+				int min_uA, int max_uA)
+{
+	struct pm800_regulators *pm800_data =
+				dev_get_drvdata(rdev_get_dev(rdev)->parent);
+	struct pm80x_chip *chip = pm800_data->chip;
+	int ret;
+
+	/* Currently only supported on 88pm860 device */
+	if (chip->type != CHIP_PM860)
+		return 0;
+
+	if (rdev->desc->id == PM800_ID_BUCK1) {
+		/* If max_uA is greater that 3A, enable dual-phase on BUCK1 */
+		if (max_uA > 3000000) {
+			ret = regmap_update_bits(chip->subchip->regmap_power,
+					PM860_BUCK1_MISC,
+					BUCK1_DUAL_PHASE_SEL,
+					BUCK1_DUAL_PHASE_SEL);
+			if (ret) {
+				dev_err(chip->dev, "failed to access registers\n");
+				return ret;
+			}
+		}
+	}
+
+	return 0;
+}
+
 static struct regulator_ops pm800_volt_range_ops = {
 	.list_voltage		= regulator_list_voltage_linear_range,
 	.map_voltage		= regulator_map_voltage_linear_range,
@@ -194,6 +231,7 @@ static struct regulator_ops pm800_volt_range_ops = {
 	.disable		= regulator_disable_regmap,
 	.is_enabled		= regulator_is_enabled_regmap,
 	.get_current_limit	= pm800_get_current_limit,
+	.set_current_limit	= pm800_set_current_limit,
 };
 
 static struct regulator_ops pm800_volt_table_ops = {
diff --git a/include/linux/mfd/88pm80x.h b/include/linux/mfd/88pm80x.h
index a92d173..05d9bad 100644
--- a/include/linux/mfd/88pm80x.h
+++ b/include/linux/mfd/88pm80x.h
@@ -295,6 +295,9 @@ enum {
 #define PM860_BUCK4_MISC2		(0x82)
 #define PM860_BUCK4_FULL_DRV		BIT(2)
 
+#define PM860_BUCK1_MISC		(0x8E)
+#define BUCK1_DUAL_PHASE_SEL		BIT(2)
+
 struct pm80x_rtc_pdata {
 	int		vrtc;
 	int		rtc_wakeup;
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1186230 — Re: [PATCH 5/5] regulator: 88pm800: Add support for configuration of dual phase on BUCK1

FromMark Brown <broonie@kernel.org>
Date2015-07-16 22:40 +0200
SubjectRe: [PATCH 5/5] regulator: 88pm800: Add support for configuration of dual phase on BUCK1
Message-ID<pMY6J-HC-5@gated-at.bofh.it>
In reply to#1186181

[Multipart message — attachments visible in raw view] — view raw

On Thu, Jul 16, 2015 at 11:46:58PM +0530, Vaibhav Hiremath wrote:

>  	.disable		= regulator_disable_regmap,
>  	.is_enabled		= regulator_is_enabled_regmap,
>  	.get_current_limit	= pm800_get_current_limit,
> +	.set_current_limit	= pm800_set_current_limit,

set_current_limit() isn't the right interface to use for this, this is
something that depends on the physical design of the system rather than
something that limits the current.  It should be a DT property of its
own.  There are some other PMICs with similar functions but it's not
clear yet how generic the configuration mechanism is.

[toc] | [prev] | [next] | [standalone]


#1186475 — Re: [PATCH 5/5] regulator: 88pm800: Add support for configuration of dual phase on BUCK1

FromVaibhav Hiremath <vaibhav.hiremath@linaro.org>
Date2015-07-17 07:40 +0200
SubjectRe: [PATCH 5/5] regulator: 88pm800: Add support for configuration of dual phase on BUCK1
Message-ID<pN6xj-4zZ-3@gated-at.bofh.it>
In reply to#1186230

On Friday 17 July 2015 02:02 AM, Mark Brown wrote:
> On Thu, Jul 16, 2015 at 11:46:58PM +0530, Vaibhav Hiremath wrote:
>
>>   	.disable		= regulator_disable_regmap,
>>   	.is_enabled		= regulator_is_enabled_regmap,
>>   	.get_current_limit	= pm800_get_current_limit,
>> +	.set_current_limit	= pm800_set_current_limit,
>
> set_current_limit() isn't the right interface to use for this, this is
> something that depends on the physical design of the system rather than
> something that limits the current.  It should be a DT property of its
> own.  There are some other PMICs with similar functions but it's not
> clear yet how generic the configuration mechanism is.
>

Hmmm,
Yeah, right. This is depends on physical design. And not the regulator
current limit.

Earlier, I had submitted DT based approach, but was MFD DT property.
Which is not correct, do you think regulator DT property is the right
approach?

Below is going to be my approach -

pmic1: 88pm860@30 {
	compatible = "marvell,88pm800";
	...
	regulators {
		compatible = "marvell,88pm80x-regulator";

		marvell,88pm860-buck1-dualphase-en;

		buck1: buck1 {
			...
		};
		...
	};
};


Thanks,
Vaibhav
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web