All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/4] Add regulator support for mpq7920
@ 2019-12-26 22:29 Saravanan Sekar
  2019-12-26 22:29 ` [PATCH v4 1/4] dt-bindings: Add an entry for Monolithic Power System, MPS Saravanan Sekar
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Saravanan Sekar @ 2019-12-26 22:29 UTC (permalink / raw)
  To: sravanhome, lgirdwood, broonie, robh+dt, mark.rutland, mripard,
	shawnguo, heiko, sam, icenowy, laurent.pinchart, gregkh,
	Jonathan.Cameron, davem, mchehab+samsung
  Cc: devicetree, linux-kernel

Changes in V4:
    - fixed 0-DAY warnings

Changes in V3:
    - fixed review comments in Documentation and dt_bindings_check passed 

Changes in V2:
    - fixed all the review comments in the driver, avoid ternery operator, inline & constant
    - fixed/modifed review comments in Documentation

This patch series add support for PMIC regulator driver for Monolithic
Power System's MPQ7920 chipset. MPQ7920 provides support for 4-BUCK converter,
one fixed voltage RTCLDO and 4-LDO regualtor, accessed over I2C.

Saravanan Sekar (4):
  dt-bindings: Add an entry for Monolithic Power System, MPS
  dt-bindings: regulator: add document bindings for mpq7920
  regulator: mpq7920: add mpq7920 regulator driver
  MAINTAINERS: Add entry for mpq7920 PMIC driver

 .../bindings/regulator/mpq7920.yaml           | 143 +++++++
 .../devicetree/bindings/vendor-prefixes.yaml  |   2 +
 MAINTAINERS                                   |   7 +
 drivers/regulator/Kconfig                     |  10 +
 drivers/regulator/Makefile                    |   1 +
 drivers/regulator/mpq7920.c                   | 392 ++++++++++++++++++
 drivers/regulator/mpq7920.h                   |  72 ++++
 7 files changed, 627 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/regulator/mpq7920.yaml
 create mode 100644 drivers/regulator/mpq7920.c
 create mode 100644 drivers/regulator/mpq7920.h

-- 
2.17.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v4 1/4] dt-bindings: Add an entry for Monolithic Power System, MPS
  2019-12-26 22:29 [PATCH v4 0/4] Add regulator support for mpq7920 Saravanan Sekar
@ 2019-12-26 22:29 ` Saravanan Sekar
  2020-01-03 22:44   ` Rob Herring
  2019-12-26 22:29 ` [PATCH v4 2/4] dt-bindings: regulator: add document bindings for mpq7920 Saravanan Sekar
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 7+ messages in thread
From: Saravanan Sekar @ 2019-12-26 22:29 UTC (permalink / raw)
  To: sravanhome, lgirdwood, broonie, robh+dt, mark.rutland, mripard,
	shawnguo, heiko, sam, icenowy, laurent.pinchart, gregkh,
	Jonathan.Cameron, davem, mchehab+samsung
  Cc: devicetree, linux-kernel

Add an entry for Monolithic Power System, MPS

Signed-off-by: Saravanan Sekar <sravanhome@gmail.com>
---
 Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
index 6046f4555852..5eac9d08bfa8 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
@@ -605,6 +605,8 @@ patternProperties:
     description: MiraMEMS Sensing Technology Co., Ltd.
   "^mitsubishi,.*":
     description: Mitsubishi Electric Corporation
+  "^mps,.*":
+    description: Monolithic Power Systems, Inc.
   "^mosaixtech,.*":
     description: Mosaix Technologies, Inc.
   "^motorola,.*":
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 2/4] dt-bindings: regulator: add document bindings for mpq7920
  2019-12-26 22:29 [PATCH v4 0/4] Add regulator support for mpq7920 Saravanan Sekar
  2019-12-26 22:29 ` [PATCH v4 1/4] dt-bindings: Add an entry for Monolithic Power System, MPS Saravanan Sekar
@ 2019-12-26 22:29 ` Saravanan Sekar
  2020-01-03 23:18   ` Rob Herring
  2019-12-26 22:29 ` [PATCH v4 3/4] regulator: mpq7920: add mpq7920 regulator driver Saravanan Sekar
  2019-12-26 22:29 ` [PATCH v4 4/4] MAINTAINERS: Add entry for mpq7920 PMIC driver Saravanan Sekar
  3 siblings, 1 reply; 7+ messages in thread
From: Saravanan Sekar @ 2019-12-26 22:29 UTC (permalink / raw)
  To: sravanhome, lgirdwood, broonie, robh+dt, mark.rutland, mripard,
	shawnguo, heiko, sam, icenowy, laurent.pinchart, gregkh,
	Jonathan.Cameron, davem, mchehab+samsung
  Cc: devicetree, linux-kernel

Add device tree binding information for mpq7920 regulator driver.
Example bindings for mpq7920 are added.

Signed-off-by: Saravanan Sekar <sravanhome@gmail.com>
---
 .../bindings/regulator/mpq7920.yaml           | 143 ++++++++++++++++++
 1 file changed, 143 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/regulator/mpq7920.yaml

diff --git a/Documentation/devicetree/bindings/regulator/mpq7920.yaml b/Documentation/devicetree/bindings/regulator/mpq7920.yaml
new file mode 100644
index 000000000000..54e9177dfd1b
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/mpq7920.yaml
@@ -0,0 +1,143 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/mpq7920.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Monolithic Power System MPQ7920 PMIC
+
+maintainers:
+  - Saravanan Sekar <sravanhome@gmail.com>
+
+properties:
+  $nodename:
+    pattern: "pmic@[0-9a-f]{1,2}"
+  compatible:
+    enum:
+      - mps,mpq7920
+
+  reg:
+    maxItems: 1
+
+  mps,time-slot:
+    description:
+      each regulator output shall be delayed during power on/off sequence which
+      based on configurable time slot value, must be one of following corresponding
+      value 0.5ms, 2ms, 8ms, 16ms
+    allOf:
+      - $ref: "/schemas/types.yaml#/definitions/uint8"
+      - enum: [ 0, 1, 2, 3 ]
+      - default: 0
+
+  mps,fixed-on-time:
+     description:
+       select power on sequence with fixed time output delay mentioned in
+       time-slot reg for all the regulators.
+     type: boolean
+
+  mps,fixed-off-time:
+     description:
+        select power off sequence with fixed time output delay mentioned in
+        time-slot reg for all the regulators.
+     type: boolean
+
+  mps,inc-off-time:
+     description: |
+        mutually exclusive to mps,fixed-off-time an array of 8, linearly increase
+        output delay during power off sequence based on factor of time slot/interval
+        for each regulator.
+     allOf:
+       - $ref: "/schemas/types.yaml#/definitions/uint8-array"
+       - minimum: 0
+       - maximum: 15
+       - default: [ 0, 6, 0, 6, 7, 7, 7, 9 ]
+
+  mps,inc-on-time:
+     description: |
+        mutually exclusive to mps,fixed-on-time an array of 8, linearly increase
+        output delay during power on sequence based on factor of time slot/interval
+        for each regulator.
+     allOf:
+       - $ref: "/schemas/types.yaml#/definitions/uint8-array"
+       - minimum: 0
+       - maximum: 15
+       - default: [ 0, 6, 0, 6, 7, 7, 7, 9 ]
+
+  mps,switch-freq:
+     description: |
+        switching frequency must be one of following corresponding value
+        1.1MHz, 1.65MHz, 2.2MHz, 2.75MHz
+     allOf:
+       - $ref: "/schemas/types.yaml#/definitions/uint8"
+       - enum: [ 0, 1, 2, 3 ]
+       - default: 2
+
+  mps,buck-softstart:
+     description: |
+        An array of 4 contains soft start time of each buck, must be one of
+        following corresponding values 150us, 300us, 610us, 920us
+     allOf:
+       - $ref: "/schemas/types.yaml#/definitions/uint8-array"
+       - enum: [ 0, 1, 2, 3 ]
+       - default: [ 1, 1, 1, 1 ]
+
+  mps,buck-ovp:
+     description: |
+        An array of 4 contains over voltage protection of each buck, must be
+        one of above values
+     allOf:
+       - $ref: "/schemas/types.yaml#/definitions/uint8-array"
+       - enum: [ 0, 1 ]
+       - default: [ 1, 1, 1, 1 ]
+
+  mps,buck-phase-delay:
+     description: |
+        An array of 4 contains phase delay of each buck must be one of above values
+        corresponding to 0deg, 90deg, 180deg, 270deg
+     allOf:
+       - $ref: "/schemas/types.yaml#/definitions/uint8-array"
+       - enum: [ 0, 1, 2, 3 ]
+       - default: [ 0, 0, 1, 1 ]
+
+  regulators:
+    type: object
+    description:
+      list of regulators provided by this controller, must be named
+      after their hardware counterparts BUCK[1-4], one LDORTC, and LDO[2-5]
+      The valid names for regulators are
+      buck1, buck2, buck3, buck4, ldortc, ldo2, ldo3, ldo4, ldo5
+
+
+examples:
+  - |
+    i2c {
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        pmic@69 {
+          compatible = "mps,mpq7920";
+          reg = <0x69>;
+
+          mps,switch-freq = <1>;
+          mps,buck-softstart = /bits/ 8 <1 2 1 3>;
+          mps,buck-ovp = /bits/ 8 <1 0 1 1>;
+
+          regulators {
+            buck1 {
+             regulator-name = "buck1";
+             regulator-min-microvolt = <400000>;
+             regulator-max-microvolt = <3587500>;
+             regulator-min-microamp  = <460000>;
+             regulator-max-microamp  = <7600000>;
+             regulator-boot-on;
+            };
+
+            ldo2 {
+             regulator-name = "ldo2";
+             regulator-min-microvolt = <650000>;
+             regulator-max-microvolt = <3587500>;
+            };
+         };
+       };
+     };
+...
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 3/4] regulator: mpq7920: add mpq7920 regulator driver
  2019-12-26 22:29 [PATCH v4 0/4] Add regulator support for mpq7920 Saravanan Sekar
  2019-12-26 22:29 ` [PATCH v4 1/4] dt-bindings: Add an entry for Monolithic Power System, MPS Saravanan Sekar
  2019-12-26 22:29 ` [PATCH v4 2/4] dt-bindings: regulator: add document bindings for mpq7920 Saravanan Sekar
@ 2019-12-26 22:29 ` Saravanan Sekar
  2019-12-26 22:29 ` [PATCH v4 4/4] MAINTAINERS: Add entry for mpq7920 PMIC driver Saravanan Sekar
  3 siblings, 0 replies; 7+ messages in thread
From: Saravanan Sekar @ 2019-12-26 22:29 UTC (permalink / raw)
  To: sravanhome, lgirdwood, broonie, robh+dt, mark.rutland, mripard,
	shawnguo, heiko, sam, icenowy, laurent.pinchart, gregkh,
	Jonathan.Cameron, davem, mchehab+samsung
  Cc: devicetree, linux-kernel

Adding regulator driver for the device mpq7920.
The MPQ7920 PMIC device contains four DC-DC buck converters and
five regulators, is designed for automotive and accessed over I2C.

Signed-off-by: Saravanan Sekar <sravanhome@gmail.com>
---
 drivers/regulator/Kconfig   |  10 +
 drivers/regulator/Makefile  |   1 +
 drivers/regulator/mpq7920.c | 392 ++++++++++++++++++++++++++++++++++++
 drivers/regulator/mpq7920.h |  72 +++++++
 4 files changed, 475 insertions(+)
 create mode 100644 drivers/regulator/mpq7920.c
 create mode 100644 drivers/regulator/mpq7920.h

diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 74eb5af7295f..e10adc2e57da 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -600,6 +600,16 @@ config REGULATOR_MCP16502
 	  through the regulator interface. In addition it enables
 	  suspend-to-ram/standby transition.
 
+config REGULATOR_MPQ7920
+	tristate "Monolithic MPQ7920 PMIC"
+	depends on I2C && OF
+	select REGMAP_I2C
+	help
+	  Say y here to support the MPQ7920 PMIC. This will enable supports
+	  the software controllable 4 buck and 5 LDO regulators.
+	  This driver supports the control of different power rails of device
+	  through regulator interface.
+
 config REGULATOR_MT6311
 	tristate "MediaTek MT6311 PMIC"
 	depends on I2C
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 2210ba56f9bd..fd11002507e4 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -77,6 +77,7 @@ 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_MCP16502) += mcp16502.o
+obj-$(CONFIG_REGULATOR_MPQ7920) += mpq7920.o
 obj-$(CONFIG_REGULATOR_MT6311) += mt6311-regulator.o
 obj-$(CONFIG_REGULATOR_MT6323)	+= mt6323-regulator.o
 obj-$(CONFIG_REGULATOR_MT6358)	+= mt6358-regulator.o
diff --git a/drivers/regulator/mpq7920.c b/drivers/regulator/mpq7920.c
new file mode 100644
index 000000000000..5a86dd855b23
--- /dev/null
+++ b/drivers/regulator/mpq7920.c
@@ -0,0 +1,392 @@
+// SPDX-License-Identifier: GPL-2.0+
+//
+// mpq7920.c  - regulator driver for mps mpq7920
+//
+// Copyright 2019 Monolithic Power Systems, Inc
+//
+// Author: Saravanan Sekar <sravanhome@gmail.com>
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/err.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/of_regulator.h>
+#include <linux/i2c.h>
+#include <linux/regmap.h>
+#include "mpq7920.h"
+
+#define MPQ7920_BUCK_VOLT_RANGE \
+	((MPQ7920_VOLT_MAX - MPQ7920_BUCK_VOLT_MIN)/MPQ7920_VOLT_STEP + 1)
+#define MPQ7920_LDO_VOLT_RANGE \
+	((MPQ7920_VOLT_MAX - MPQ7920_LDO_VOLT_MIN)/MPQ7920_VOLT_STEP + 1)
+
+#define MPQ7920BUCK(_name, _id, _ilim)					\
+	[MPQ7920_BUCK ## _id] = {					\
+		.id = MPQ7920_BUCK ## _id,				\
+		.name = _name,						\
+		.of_match = _name,					\
+		.regulators_node = "regulators",			\
+		.ops = &mpq7920_buck_ops,				\
+		.min_uV = MPQ7920_BUCK_VOLT_MIN,			\
+		.uV_step = MPQ7920_VOLT_STEP,				\
+		.n_voltages = MPQ7920_BUCK_VOLT_RANGE,			\
+		.curr_table = _ilim,					\
+		.n_current_limits = ARRAY_SIZE(_ilim),			\
+		.csel_reg = MPQ7920_BUCK ##_id## _REG_C,		\
+		.csel_mask = MPQ7920_MASK_BUCK_ILIM,			\
+		.enable_reg = MPQ7920_REG_REGULATOR_EN,			\
+		.enable_mask = BIT(MPQ7920_REGULATOR_EN_OFFSET -	\
+					 MPQ7920_BUCK ## _id),		\
+		.vsel_reg = MPQ7920_BUCK ##_id## _REG_A,		\
+		.vsel_mask = MPQ7920_MASK_VREF,				\
+		.active_discharge_on	= MPQ7920_DISCHARGE_ON,		\
+		.active_discharge_reg	= MPQ7920_BUCK ##_id## _REG_B,	\
+		.active_discharge_mask	= MPQ7920_MASK_DISCHARGE,	\
+		.soft_start_reg		= MPQ7920_BUCK ##_id## _REG_C,	\
+		.soft_start_mask	= MPQ7920_MASK_SOFTSTART,	\
+		.owner			= THIS_MODULE,			\
+	}
+
+#define MPQ7920LDO(_name, _id, _ops, _ilim, _ilim_sz, _creg, _cmask)	\
+	[MPQ7920_LDO ## _id] = {					\
+		.id = MPQ7920_LDO ## _id,				\
+		.name = _name,						\
+		.of_match = _name,					\
+		.regulators_node = "regulators",			\
+		.ops = _ops,						\
+		.min_uV = MPQ7920_LDO_VOLT_MIN,				\
+		.uV_step = MPQ7920_VOLT_STEP,				\
+		.n_voltages = MPQ7920_LDO_VOLT_RANGE,			\
+		.vsel_reg = MPQ7920_LDO ##_id## _REG_A,			\
+		.vsel_mask = MPQ7920_MASK_VREF,				\
+		.curr_table = _ilim,					\
+		.n_current_limits = _ilim_sz,				\
+		.csel_reg = _creg,					\
+		.csel_mask = _cmask,					\
+		.enable_reg = (_id == 1) ? 0 : MPQ7920_REG_REGULATOR_EN,\
+		.enable_mask = BIT(MPQ7920_REGULATOR_EN_OFFSET -	\
+					MPQ7920_LDO ##_id + 1),		\
+		.active_discharge_on	= MPQ7920_DISCHARGE_ON,		\
+		.active_discharge_mask	= MPQ7920_MASK_DISCHARGE,	\
+		.active_discharge_reg	= MPQ7920_LDO ##_id## _REG_B,	\
+		.type			= REGULATOR_VOLTAGE,		\
+		.owner			= THIS_MODULE,			\
+	}
+
+enum mpq7920_regulators {
+	MPQ7920_BUCK1,
+	MPQ7920_BUCK2,
+	MPQ7920_BUCK3,
+	MPQ7920_BUCK4,
+	MPQ7920_LDO1, /* LDORTC */
+	MPQ7920_LDO2,
+	MPQ7920_LDO3,
+	MPQ7920_LDO4,
+	MPQ7920_LDO5,
+	MPQ7920_MAX_REGULATORS,
+};
+
+struct mpq7920_regulator_info {
+	struct device *dev;
+	struct regmap *regmap;
+	struct regulator_dev *rdev[MPQ7920_MAX_REGULATORS];
+	struct regulator_desc *rdesc;
+};
+
+static const struct regmap_config mpq7920_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+	.max_register = 0x25,
+};
+
+/* Current limits array (in uA)
+ * ILIM1 & ILIM3
+ */
+static const unsigned int mpq7920_I_limits1[] = {
+	4600000, 6600000, 7600000, 9300000
+};
+
+/* ILIM2 & ILIM4 */
+static const unsigned int mpq7920_I_limits2[] = {
+	2700000, 3900000, 5100000, 6100000
+};
+
+/* LDO4 & LDO5 */
+static const unsigned int mpq7920_I_limits3[] = {
+	300000, 700000
+};
+
+static int mpq7920_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay);
+
+/* RTCLDO not controllable, always ON */
+static const struct regulator_ops mpq7920_ldortc_ops = {
+	.list_voltage		= regulator_list_voltage_linear,
+	.map_voltage		= regulator_map_voltage_linear,
+	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
+	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
+};
+
+static const struct regulator_ops mpq7920_ldo_wo_current_ops = {
+	.enable			= regulator_enable_regmap,
+	.disable		= regulator_disable_regmap,
+	.is_enabled		= regulator_is_enabled_regmap,
+	.list_voltage		= regulator_list_voltage_linear,
+	.map_voltage		= regulator_map_voltage_linear,
+	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
+	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
+	.set_active_discharge	= regulator_set_active_discharge_regmap,
+};
+
+static const struct regulator_ops mpq7920_ldo_ops = {
+	.enable			= regulator_enable_regmap,
+	.disable		= regulator_disable_regmap,
+	.is_enabled		= regulator_is_enabled_regmap,
+	.list_voltage		= regulator_list_voltage_linear,
+	.map_voltage		= regulator_map_voltage_linear,
+	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
+	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
+	.set_active_discharge	= regulator_set_active_discharge_regmap,
+	.get_current_limit	= regulator_get_current_limit_regmap,
+	.set_current_limit	= regulator_set_current_limit_regmap,
+};
+
+static const struct regulator_ops mpq7920_buck_ops = {
+	.enable			= regulator_enable_regmap,
+	.disable		= regulator_disable_regmap,
+	.is_enabled		= regulator_is_enabled_regmap,
+	.list_voltage		= regulator_list_voltage_linear,
+	.map_voltage		= regulator_map_voltage_linear,
+	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
+	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
+	.set_active_discharge	= regulator_set_active_discharge_regmap,
+	.set_soft_start		= regulator_set_soft_start_regmap,
+	.set_ramp_delay		= mpq7920_set_ramp_delay,
+};
+
+static struct regulator_desc mpq7920_regulators_desc[MPQ7920_MAX_REGULATORS] = {
+	MPQ7920BUCK("buck1", 1, mpq7920_I_limits1),
+	MPQ7920BUCK("buck2", 2, mpq7920_I_limits2),
+	MPQ7920BUCK("buck3", 3, mpq7920_I_limits1),
+	MPQ7920BUCK("buck4", 4, mpq7920_I_limits2),
+	MPQ7920LDO("ldortc", 1, &mpq7920_ldortc_ops, NULL, 0, 0, 0),
+	MPQ7920LDO("ldo2", 2, &mpq7920_ldo_wo_current_ops, NULL, 0, 0, 0),
+	MPQ7920LDO("ldo3", 3, &mpq7920_ldo_wo_current_ops, NULL, 0, 0, 0),
+	MPQ7920LDO("ldo4", 4, &mpq7920_ldo_ops, mpq7920_I_limits3,
+			ARRAY_SIZE(mpq7920_I_limits3), MPQ7920_LDO4_REG_B,
+			MPQ7920_MASK_LDO_ILIM),
+	MPQ7920LDO("ldo5", 5, &mpq7920_ldo_ops, mpq7920_I_limits3,
+			ARRAY_SIZE(mpq7920_I_limits3), MPQ7920_LDO5_REG_B,
+			MPQ7920_MASK_LDO_ILIM),
+};
+
+/*
+ * DVS ramp rate BUCK1 to BUCK4
+ * 00-01: Reserved
+ * 10: 8mV/us
+ * 11: 4mV/us
+ */
+static int mpq7920_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
+{
+	unsigned int ramp_val;
+
+	if (ramp_delay > 8000 || ramp_delay < 0)
+		return -EINVAL;
+
+	if (ramp_delay <= 4000)
+		ramp_val = 3;
+	else
+		ramp_val = 2;
+
+	return regmap_update_bits(rdev->regmap, MPQ7920_REG_CTL0,
+				  MPQ7920_MASK_DVS_SLEWRATE, ramp_val << 6);
+}
+
+static void mpq7920_parse_dt(struct device *dev,
+			 struct mpq7920_regulator_info *info)
+{
+	int ret, i;
+	struct device_node *np = dev->of_node;
+	uint8_t freq;
+	uint8_t time_slot;
+	uint8_t val[MPQ7920_BUCK4 + 1];
+	uint8_t var_time[MPQ7920_LDO5];
+	bool is_fixed_on_time = 0;
+	bool is_fixed_off_time = 0;
+
+	is_fixed_on_time = of_property_read_bool(np, "mps,fixed-on-time");
+	is_fixed_off_time = of_property_read_bool(np, "mps,fixed-off-time");
+	if (is_fixed_on_time || is_fixed_off_time) {
+		regmap_update_bits(info->regmap, MPQ7920_REG_CTL2,
+				MPQ7920_MASK_FIXED_TIME_SLOT,
+				~(is_fixed_on_time << 1 | is_fixed_off_time));
+	}
+
+	ret = of_property_read_u8(np, "mps,time-slot", &time_slot);
+	if (!ret) {
+		regmap_update_bits(info->regmap, MPQ7920_REG_CTL2,
+					MPQ7920_MASK_TIME_SLOT,
+					(time_slot & 3) << 2);
+	}
+
+	if (!is_fixed_on_time &&
+	    !of_property_read_u8_array(np, "mps,inc-on-time", var_time,
+					ARRAY_SIZE(var_time))) {
+
+		for (i = 0; i < MPQ7920_LDO5; i++) {
+			if (i <= MPQ7920_BUCK4) {
+				regmap_update_bits(info->regmap,
+					MPQ7920_BUCK1_REG_D + (i * 4),
+					MPQ7920_MASK_ON_TIME_SLOT,
+					var_time[i] & 0xF);
+			} else {
+				regmap_update_bits(info->regmap,
+					(MPQ7920_LDO2_REG_C +
+						((i - MPQ7920_LDO1) * 3)),
+					MPQ7920_MASK_ON_TIME_SLOT,
+					var_time[i] & 0xF);
+			}
+		}
+	}
+
+	if (!is_fixed_off_time &&
+	    !of_property_read_u8_array(np, "mps,inc-off-time", var_time,
+					ARRAY_SIZE(var_time))) {
+
+		for (i = 0; i < MPQ7920_LDO5; i++) {
+			if (i <= MPQ7920_BUCK4) {
+				regmap_update_bits(info->regmap,
+					MPQ7920_BUCK1_REG_D + (i * 4),
+					MPQ7920_MASK_OFF_TIME_SLOT,
+					(var_time[i] & 0xF) << 4);
+			} else {
+				regmap_update_bits(info->regmap,
+					(MPQ7920_LDO2_REG_C +
+						((i - MPQ7920_LDO1) * 3)),
+					MPQ7920_MASK_OFF_TIME_SLOT,
+					(var_time[i] & 0xF) << 4);
+			}
+		}
+	}
+
+	ret = of_property_read_u8_array(np, "mps,buck-softstart", val,
+					ARRAY_SIZE(val));
+	if (!ret) {
+		for (i = 0; i < ARRAY_SIZE(val); i++)
+			info->rdesc[i].soft_start_val_on = (val[i] & 3) << 2;
+	}
+
+	ret = of_property_read_u8_array(np, "mps,buck-ovp", val,
+					ARRAY_SIZE(val));
+	if (!ret) {
+		for (i = 0; i <= MPQ7920_BUCK4; i++) {
+			regmap_update_bits(info->regmap,
+					MPQ7920_BUCK1_REG_B + (i * 4),
+					BIT(6), val[i] << 6);
+		}
+	}
+
+	ret = of_property_read_u8_array(np, "mps,buck-phase-delay", val,
+					ARRAY_SIZE(val));
+	if (!ret) {
+		for (i = 0; i <= MPQ7920_BUCK4; i++) {
+			regmap_update_bits(info->regmap,
+					MPQ7920_BUCK1_REG_C + (i * 4),
+					MPQ7920_MASK_BUCK_PHASE_DEALY,
+					(val[i] & 3) << 4);
+		}
+	}
+
+	ret = of_property_read_u8(np, "mps,switch-freq", &freq);
+	if (!ret) {
+		regmap_update_bits(info->regmap, MPQ7920_REG_CTL0,
+					MPQ7920_MASK_SWITCH_FREQ,
+					(freq & 3) << 4);
+	}
+}
+
+static inline int mpq7920_regulator_register(
+				struct mpq7920_regulator_info *info,
+				struct regulator_config *config)
+{
+	int i;
+	struct regulator_desc *rdesc;
+
+	for (i = 0; i < MPQ7920_MAX_REGULATORS; i++) {
+		rdesc = &info->rdesc[i];
+
+		info->rdev[i] = devm_regulator_register(info->dev, rdesc,
+					 config);
+		if (IS_ERR(info->rdev))
+			return PTR_ERR(info->rdev);
+	}
+
+	return 0;
+}
+
+static int mpq7920_i2c_probe(struct i2c_client *client,
+				    const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct mpq7920_regulator_info *info;
+	struct regulator_config config = { NULL, };
+	struct regmap *regmap;
+	int ret;
+
+	info = devm_kzalloc(dev, sizeof(struct mpq7920_regulator_info),
+				GFP_KERNEL);
+	if (!info)
+		return -ENOMEM;
+
+	info->dev = dev;
+	info->rdesc = mpq7920_regulators_desc;
+	regmap = devm_regmap_init_i2c(client, &mpq7920_regmap_config);
+	if (IS_ERR(regmap)) {
+		dev_err(dev, "Failed to allocate regmap!\n");
+		return PTR_ERR(regmap);
+	}
+
+	i2c_set_clientdata(client, info);
+	info->regmap = regmap;
+	if (client->dev.of_node)
+		mpq7920_parse_dt(&client->dev, info);
+
+	config.dev = info->dev;
+	config.regmap = regmap;
+	config.driver_data = info;
+
+	ret = mpq7920_regulator_register(info, &config);
+	if (ret < 0)
+		dev_err(dev, "Failed to register regulator!\n");
+
+	return ret;
+}
+
+static const struct of_device_id mpq7920_of_match[] = {
+	{ .compatible = "mps,mpq7920"},
+	{},
+};
+MODULE_DEVICE_TABLE(of, mpq7920_of_match);
+
+static const struct i2c_device_id mpq7920_id[] = {
+	{ "mpq7920", },
+	{ },
+};
+MODULE_DEVICE_TABLE(i2c, mpq7920_id);
+
+static struct i2c_driver mpq7920_regulator_driver = {
+	.driver = {
+		.name = "mpq7920",
+		.of_match_table = of_match_ptr(mpq7920_of_match),
+	},
+	.probe = mpq7920_i2c_probe,
+	.id_table = mpq7920_id,
+};
+module_i2c_driver(mpq7920_regulator_driver);
+
+MODULE_AUTHOR("Saravanan Sekar <sravanhome@gmail.com>");
+MODULE_DESCRIPTION("MPQ7920 PMIC regulator driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/regulator/mpq7920.h b/drivers/regulator/mpq7920.h
new file mode 100644
index 000000000000..58c64e708f2e
--- /dev/null
+++ b/drivers/regulator/mpq7920.h
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * mpq7920.h  -  Regulator definitions for mpq7920
+ *
+ * Copyright 2019 Monolithic Power Systems, Inc
+ *
+ */
+
+#ifndef __MPQ7920_H__
+#define __MPQ7920_H__
+
+#define MPQ7920_REG_CTL0		0x00
+#define MPQ7920_REG_CTL1		0x01
+#define MPQ7920_REG_CTL2		0x02
+#define MPQ7920_BUCK1_REG_A		0x03
+#define MPQ7920_BUCK1_REG_B		0x04
+#define MPQ7920_BUCK1_REG_C		0x05
+#define MPQ7920_BUCK1_REG_D		0x06
+#define MPQ7920_BUCK2_REG_A		0x07
+#define MPQ7920_BUCK2_REG_B		0x08
+#define MPQ7920_BUCK2_REG_C		0x09
+#define MPQ7920_BUCK2_REG_D		0x0a
+#define MPQ7920_BUCK3_REG_A		0x0b
+#define MPQ7920_BUCK3_REG_B		0x0c
+#define MPQ7920_BUCK3_REG_C		0x0d
+#define MPQ7920_BUCK3_REG_D		0x0e
+#define MPQ7920_BUCK4_REG_A		0x0f
+#define MPQ7920_BUCK4_REG_B		0x10
+#define MPQ7920_BUCK4_REG_C		0x11
+#define MPQ7920_BUCK4_REG_D		0x12
+#define MPQ7920_LDO1_REG_A		0x13
+#define MPQ7920_LDO1_REG_B		0x0
+#define MPQ7920_LDO2_REG_A		0x14
+#define MPQ7920_LDO2_REG_B		0x15
+#define MPQ7920_LDO2_REG_C		0x16
+#define MPQ7920_LDO3_REG_A		0x17
+#define MPQ7920_LDO3_REG_B		0x18
+#define MPQ7920_LDO3_REG_C		0x19
+#define MPQ7920_LDO4_REG_A		0x1a
+#define MPQ7920_LDO4_REG_B		0x1b
+#define MPQ7920_LDO4_REG_C		0x1c
+#define MPQ7920_LDO5_REG_A		0x1d
+#define MPQ7920_LDO5_REG_B		0x1e
+#define MPQ7920_LDO5_REG_C		0x1f
+#define MPQ7920_REG_MODE		0x20
+#define MPQ7920_REG_REGULATOR_EN1	0x22
+#define MPQ7920_REG_REGULATOR_EN	0x22
+
+#define MPQ7920_MASK_VREF		0x7f
+#define MPQ7920_MASK_BUCK_ILIM		0xd0
+#define MPQ7920_MASK_LDO_ILIM		BIT(6)
+#define MPQ7920_MASK_DISCHARGE		BIT(5)
+#define MPQ7920_MASK_MODE		0xc0
+#define MPQ7920_MASK_SOFTSTART		0x0c
+#define MPQ7920_MASK_SWITCH_FREQ	0x30
+#define MPQ7920_MASK_BUCK_PHASE_DEALY	0x30
+#define MPQ7920_MASK_DVS_SLEWRATE	0xc0
+#define MPQ7920_MASK_TIME_SLOT		0x06
+#define MPQ7920_MASK_FIXED_TIME_SLOT	0x03
+#define MPQ7920_MASK_ON_TIME_SLOT	0x0F
+#define MPQ7920_MASK_OFF_TIME_SLOT	0xF0
+#define MPQ7920_DISCHARGE_ON		0x1
+
+#define MPQ7920_REGULATOR_EN_OFFSET	7
+
+/* values in mV */
+#define MPQ7920_BUCK_VOLT_MIN		400000
+#define MPQ7920_LDO_VOLT_MIN		650000
+#define MPQ7920_VOLT_MAX		3587500
+#define MPQ7920_VOLT_STEP		12500
+
+#endif /* __MPQ7920_H__ */
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 4/4] MAINTAINERS: Add entry for mpq7920 PMIC driver
  2019-12-26 22:29 [PATCH v4 0/4] Add regulator support for mpq7920 Saravanan Sekar
                   ` (2 preceding siblings ...)
  2019-12-26 22:29 ` [PATCH v4 3/4] regulator: mpq7920: add mpq7920 regulator driver Saravanan Sekar
@ 2019-12-26 22:29 ` Saravanan Sekar
  3 siblings, 0 replies; 7+ messages in thread
From: Saravanan Sekar @ 2019-12-26 22:29 UTC (permalink / raw)
  To: sravanhome, lgirdwood, broonie, robh+dt, mark.rutland, mripard,
	shawnguo, heiko, sam, icenowy, laurent.pinchart, gregkh,
	Jonathan.Cameron, davem, mchehab+samsung
  Cc: devicetree, linux-kernel

Add MAINTAINERS entry for Monolithic Power Systems mpq7920 PMIC driver.

Signed-off-by: Saravanan Sekar <sravanhome@gmail.com>
---
 MAINTAINERS | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 0fd82e674cf4..8a31285b59c6 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -11128,6 +11128,13 @@ S:	Maintained
 F:	Documentation/driver-api/serial/moxa-smartio.rst
 F:	drivers/tty/mxser.*
 
+MONOLITHIC POWER SYSTEM PMIC DRIVER
+M:	Saravanan Sekar <sravanhome@gmail.com>
+S:	Maintained
+F:	Documentation/devicetree/bindings/regulator/mpq7920.yaml
+F:	drivers/regulator/mpq7920.c
+F:	drivers/regulator/mpq7920.h
+
 MR800 AVERMEDIA USB FM RADIO DRIVER
 M:	Alexey Klimov <klimov.linux@gmail.com>
 L:	linux-media@vger.kernel.org
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 1/4] dt-bindings: Add an entry for Monolithic Power System, MPS
  2019-12-26 22:29 ` [PATCH v4 1/4] dt-bindings: Add an entry for Monolithic Power System, MPS Saravanan Sekar
@ 2020-01-03 22:44   ` Rob Herring
  0 siblings, 0 replies; 7+ messages in thread
From: Rob Herring @ 2020-01-03 22:44 UTC (permalink / raw)
  To: Saravanan Sekar
  Cc: sravanhome, lgirdwood, broonie, robh+dt, mark.rutland, mripard,
	shawnguo, heiko, sam, icenowy, laurent.pinchart, gregkh,
	Jonathan.Cameron, davem, mchehab+samsung, devicetree,
	linux-kernel

On Thu, 26 Dec 2019 23:29:27 +0100, Saravanan Sekar wrote:
> Add an entry for Monolithic Power System, MPS
> 
> Signed-off-by: Saravanan Sekar <sravanhome@gmail.com>
> ---
>  Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
>  1 file changed, 2 insertions(+)
> 

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 2/4] dt-bindings: regulator: add document bindings for mpq7920
  2019-12-26 22:29 ` [PATCH v4 2/4] dt-bindings: regulator: add document bindings for mpq7920 Saravanan Sekar
@ 2020-01-03 23:18   ` Rob Herring
  0 siblings, 0 replies; 7+ messages in thread
From: Rob Herring @ 2020-01-03 23:18 UTC (permalink / raw)
  To: Saravanan Sekar
  Cc: lgirdwood, broonie, mark.rutland, mripard, shawnguo, heiko, sam,
	icenowy, laurent.pinchart, gregkh, Jonathan.Cameron, davem,
	mchehab+samsung, devicetree, linux-kernel

On Thu, Dec 26, 2019 at 11:29:28PM +0100, Saravanan Sekar wrote:
> Add device tree binding information for mpq7920 regulator driver.
> Example bindings for mpq7920 are added.
> 
> Signed-off-by: Saravanan Sekar <sravanhome@gmail.com>
> ---
>  .../bindings/regulator/mpq7920.yaml           | 143 ++++++++++++++++++

Convention is use the compatible string: mps,mpq7920.yaml

>  1 file changed, 143 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/regulator/mpq7920.yaml
> 
> diff --git a/Documentation/devicetree/bindings/regulator/mpq7920.yaml b/Documentation/devicetree/bindings/regulator/mpq7920.yaml
> new file mode 100644
> index 000000000000..54e9177dfd1b
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/regulator/mpq7920.yaml
> @@ -0,0 +1,143 @@
> +# SPDX-License-Identifier: GPL-2.0

Dual license new bindings:

(GPL-2.0-only OR BSD-2-Clause)

> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/regulator/mpq7920.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Monolithic Power System MPQ7920 PMIC
> +
> +maintainers:
> +  - Saravanan Sekar <sravanhome@gmail.com>
> +
> +properties:
> +  $nodename:
> +    pattern: "pmic@[0-9a-f]{1,2}"
> +  compatible:
> +    enum:
> +      - mps,mpq7920
> +
> +  reg:
> +    maxItems: 1
> +
> +  mps,time-slot:
> +    description:
> +      each regulator output shall be delayed during power on/off sequence which
> +      based on configurable time slot value, must be one of following corresponding
> +      value 0.5ms, 2ms, 8ms, 16ms

These values map to 0-3?

This value is how long each time slot is?

> +    allOf:
> +      - $ref: "/schemas/types.yaml#/definitions/uint8"
> +      - enum: [ 0, 1, 2, 3 ]
> +      - default: 0

Only $ref needs to be under the allOf, so move enum and default to same 
level as allOf.

> +
> +  mps,fixed-on-time:
> +     description:
> +       select power on sequence with fixed time output delay mentioned in
> +       time-slot reg for all the regulators.
> +     type: boolean
> +
> +  mps,fixed-off-time:
> +     description:
> +        select power off sequence with fixed time output delay mentioned in
> +        time-slot reg for all the regulators.
> +     type: boolean
> +
> +  mps,inc-off-time:
> +     description: |
> +        mutually exclusive to mps,fixed-off-time an array of 8, linearly increase
> +        output delay during power off sequence based on factor of time slot/interval
> +        for each regulator.
> +     allOf:
> +       - $ref: "/schemas/types.yaml#/definitions/uint8-array"
> +       - minimum: 0
> +       - maximum: 15
> +       - default: [ 0, 6, 0, 6, 7, 7, 7, 9 ]

Each value corresponds to a regulator? Why not a per regulator property?

> +
> +  mps,inc-on-time:
> +     description: |
> +        mutually exclusive to mps,fixed-on-time an array of 8, linearly increase
> +        output delay during power on sequence based on factor of time slot/interval
> +        for each regulator.
> +     allOf:
> +       - $ref: "/schemas/types.yaml#/definitions/uint8-array"
> +       - minimum: 0
> +       - maximum: 15
> +       - default: [ 0, 6, 0, 6, 7, 7, 7, 9 ]
> +
> +  mps,switch-freq:
> +     description: |
> +        switching frequency must be one of following corresponding value
> +        1.1MHz, 1.65MHz, 2.2MHz, 2.75MHz

Seems like this should be a common property.

> +     allOf:
> +       - $ref: "/schemas/types.yaml#/definitions/uint8"
> +       - enum: [ 0, 1, 2, 3 ]
> +       - default: 2
> +
> +  mps,buck-softstart:
> +     description: |
> +        An array of 4 contains soft start time of each buck, must be one of
> +        following corresponding values 150us, 300us, 610us, 920us
> +     allOf:
> +       - $ref: "/schemas/types.yaml#/definitions/uint8-array"
> +       - enum: [ 0, 1, 2, 3 ]

As this is an array, should be:

items:
  enum: ...

Constraints on the size of the array?

Though again, why not a per regulator property? Also, a fairly common 
thing for buck regulators?

> +       - default: [ 1, 1, 1, 1 ]
> +
> +  mps,buck-ovp:
> +     description: |
> +        An array of 4 contains over voltage protection of each buck, must be
> +        one of above values
> +     allOf:
> +       - $ref: "/schemas/types.yaml#/definitions/uint8-array"
> +       - enum: [ 0, 1 ]
> +       - default: [ 1, 1, 1, 1 ]
> +
> +  mps,buck-phase-delay:
> +     description: |
> +        An array of 4 contains phase delay of each buck must be one of above values
> +        corresponding to 0deg, 90deg, 180deg, 270deg
> +     allOf:
> +       - $ref: "/schemas/types.yaml#/definitions/uint8-array"
> +       - enum: [ 0, 1, 2, 3 ]
> +       - default: [ 0, 0, 1, 1 ]
> +
> +  regulators:
> +    type: object
> +    description:
> +      list of regulators provided by this controller, must be named
> +      after their hardware counterparts BUCK[1-4], one LDORTC, and LDO[2-5]
> +      The valid names for regulators are
> +      buck1, buck2, buck3, buck4, ldortc, ldo2, ldo3, ldo4, ldo5

You need buck[1-4] and ldo(rtc|[2-5]) child nodes defined here which 
reference regulators.yaml.

> +
> +
> +examples:
> +  - |
> +    i2c {
> +        #address-cells = <1>;
> +        #size-cells = <0>;
> +
> +        pmic@69 {
> +          compatible = "mps,mpq7920";
> +          reg = <0x69>;
> +
> +          mps,switch-freq = <1>;
> +          mps,buck-softstart = /bits/ 8 <1 2 1 3>;
> +          mps,buck-ovp = /bits/ 8 <1 0 1 1>;
> +
> +          regulators {
> +            buck1 {
> +             regulator-name = "buck1";
> +             regulator-min-microvolt = <400000>;
> +             regulator-max-microvolt = <3587500>;
> +             regulator-min-microamp  = <460000>;
> +             regulator-max-microamp  = <7600000>;
> +             regulator-boot-on;
> +            };
> +
> +            ldo2 {
> +             regulator-name = "ldo2";
> +             regulator-min-microvolt = <650000>;
> +             regulator-max-microvolt = <3587500>;
> +            };
> +         };
> +       };
> +     };
> +...
> -- 
> 2.17.1
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-01-03 23:18 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-12-26 22:29 [PATCH v4 0/4] Add regulator support for mpq7920 Saravanan Sekar
2019-12-26 22:29 ` [PATCH v4 1/4] dt-bindings: Add an entry for Monolithic Power System, MPS Saravanan Sekar
2020-01-03 22:44   ` Rob Herring
2019-12-26 22:29 ` [PATCH v4 2/4] dt-bindings: regulator: add document bindings for mpq7920 Saravanan Sekar
2020-01-03 23:18   ` Rob Herring
2019-12-26 22:29 ` [PATCH v4 3/4] regulator: mpq7920: add mpq7920 regulator driver Saravanan Sekar
2019-12-26 22:29 ` [PATCH v4 4/4] MAINTAINERS: Add entry for mpq7920 PMIC driver Saravanan Sekar

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.