* [PATCH 0/4] Add regulator support for mpq7920
@ 2019-12-19 10:37 Saravanan Sekar
2019-12-19 10:37 ` [PATCH 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-19 10:37 UTC (permalink / raw)
To: sravanhome, lgirdwood, broonie, robh+dt, mark.rutland, mripard,
heiko, shawnguo, laurent.pinchart, icenowy, mchehab+samsung,
davem, gregkh, Jonathan.Cameron
Cc: linux-kernel, devicetree
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.
Thanks,
Saravanan
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 | 149 +++++++
.../devicetree/bindings/vendor-prefixes.yaml | 2 +
MAINTAINERS | 7 +
drivers/regulator/Kconfig | 10 +
drivers/regulator/Makefile | 1 +
drivers/regulator/mpq7920.c | 376 ++++++++++++++++++
drivers/regulator/mpq7920.h | 72 ++++
7 files changed, 617 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 1/4] dt-bindings: Add an entry for Monolithic Power System, MPS 2019-12-19 10:37 [PATCH 0/4] Add regulator support for mpq7920 Saravanan Sekar @ 2019-12-19 10:37 ` Saravanan Sekar 2019-12-19 10:37 ` [PATCH 2/4] dt-bindings: regulator: add document bindings for mpq7920 Saravanan Sekar ` (2 subsequent siblings) 3 siblings, 0 replies; 7+ messages in thread From: Saravanan Sekar @ 2019-12-19 10:37 UTC (permalink / raw) To: sravanhome, lgirdwood, broonie, robh+dt, mark.rutland, mripard, heiko, shawnguo, laurent.pinchart, icenowy, mchehab+samsung, davem, gregkh, Jonathan.Cameron Cc: linux-kernel, devicetree 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 2/4] dt-bindings: regulator: add document bindings for mpq7920 2019-12-19 10:37 [PATCH 0/4] Add regulator support for mpq7920 Saravanan Sekar 2019-12-19 10:37 ` [PATCH 1/4] dt-bindings: Add an entry for Monolithic Power System, MPS Saravanan Sekar @ 2019-12-19 10:37 ` Saravanan Sekar 2019-12-19 11:18 ` Maxime Ripard 2019-12-19 10:37 ` [PATCH 3/4] regulator: mpq7920: add mpq7920 regulator driver Saravanan Sekar 2019-12-19 10:37 ` [PATCH 4/4] MAINTAINERS: Add entry for mpq7920 PMIC driver Saravanan Sekar 3 siblings, 1 reply; 7+ messages in thread From: Saravanan Sekar @ 2019-12-19 10:37 UTC (permalink / raw) To: sravanhome, lgirdwood, broonie, robh+dt, mark.rutland, mripard, heiko, shawnguo, laurent.pinchart, icenowy, mchehab+samsung, davem, gregkh, Jonathan.Cameron Cc: linux-kernel, devicetree 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 | 149 ++++++++++++++++++ 1 file changed, 149 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..79000b745cfd --- /dev/null +++ b/Documentation/devicetree/bindings/regulator/mpq7920.yaml @@ -0,0 +1,149 @@ +# 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: "mpq@[0-9a-f]{1,2}" + compatible: + enum: + - mps,mpq7920 + + reg: + maxItems: 1 + + regulators: + type: string + 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 + + properties: + mps,time-slot: + - $ref: "/schemas/types.yaml#/definitions/uint8-array" + description: | + power on/off sequence time slot/interval must be one of following values + With: + * 0: 0.5ms + * 1: 2ms + * 2: 8ms + * 3: 16ms + Defaults to 0.5ms if not specified. + + properties: + mps,fixed-on-time: + - $ref: "/schemas/types.yaml#/definitions/boolean" + description: | + select power on sequence with fixed time interval mentioned in + time-slot reg for all the regulators. + + properties: + mps,fixed-off-time: + - $ref: "/schemas/types.yaml#/definitions/boolean" + description: | + select power off sequence with fixed time interval mentioned in + time-slot reg for all the regulators. + + properties: + mps,inc-off-time: + - $ref: "/schemas/types.yaml#/definitions/uint8-array" + description: | + An array of 8, linearly increase power off sequence time + slot/interval for each regulator must be one of following values + * 0 to 15 + properties: + mps,inc-on-time: + - $ref: "/schemas/types.yaml#/definitions/uint8-array" + description: | + An array of 8, linearly increase power on sequence time + slot/interval for each regulator must be one of following values + * 0 to 15 + + properties: + mps,switch-freq: + - $ref: "/schemas/types.yaml#/definitions/uint8" + description: | + switching frequency must be one of following values + * 0 : 1.1MHz + * 1 : 1.65MHz + * 2 : 2.2MHz + * 3 : 2.75MHz + Defaults to 2.2 MHz if not specified. + + properties: + mps,buck-softstart: + - $ref: "/schemas/types.yaml#/definitions/uint8-array" + description: | + An array of 4 contains soft start time of each buck, must be one of + following values + * 0 : 150us + * 1 : 300us + * 2 : 610us + * 3 : 920us + Defaults to 300us if not specified. + + properties: + mps,buck-ovp: + - $ref: "/schemas/types.yaml#/definitions/uint8-array" + description: | + An array of 4 contains over voltage protection of each buck, must be + one of following values + * 0 : disabled + * 1 : enabled + Defaults is enabled if not specified. + + properties: + mps,buck-phase-delay: + - $ref: "/schemas/types.yaml#/definitions/uint8-array" + description: | + An array of 4 contains each buck phase delay must be one of following + values + * 0: 0deg + * 1: 90deg + * 2: 180deg + * 3: 270deg + Defaults to 0deg for buck1 & buck2, 90deg for buck3 & buck4 if not + specified. + +examples: + - | + i2c { + #address-cells = <1>; + #size-cells = <0>; + + mpq7920@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
* Re: [PATCH 2/4] dt-bindings: regulator: add document bindings for mpq7920 2019-12-19 10:37 ` [PATCH 2/4] dt-bindings: regulator: add document bindings for mpq7920 Saravanan Sekar @ 2019-12-19 11:18 ` Maxime Ripard 0 siblings, 0 replies; 7+ messages in thread From: Maxime Ripard @ 2019-12-19 11:18 UTC (permalink / raw) To: Saravanan Sekar Cc: lgirdwood, broonie, robh+dt, mark.rutland, heiko, shawnguo, laurent.pinchart, icenowy, mchehab+samsung, davem, gregkh, Jonathan.Cameron, linux-kernel, devicetree [-- Attachment #1: Type: text/plain, Size: 5943 bytes --] Hi, On Thu, Dec 19, 2019 at 11:37:19AM +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 | 149 ++++++++++++++++++ > 1 file changed, 149 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..79000b745cfd > --- /dev/null > +++ b/Documentation/devicetree/bindings/regulator/mpq7920.yaml > @@ -0,0 +1,149 @@ > +# 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: "mpq@[0-9a-f]{1,2}" The node name is supposed to be the class of the device, so pmic or regulator seems more suited here. > + compatible: > + enum: > + - mps,mpq7920 > + > + reg: > + maxItems: 1 > + > + regulators: > + type: string > + 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 This should be an enum with the valid values > + > + properties: > + mps,time-slot: I'm not sure what this is supposed to be doing? Is that another property in the regulator node, or regulators is supposed to be a node? > + - $ref: "/schemas/types.yaml#/definitions/uint8-array" > + description: | > + power on/off sequence time slot/interval must be one of following values > + With: > + * 0: 0.5ms > + * 1: 2ms > + * 2: 8ms > + * 3: 16ms > + Defaults to 0.5ms if not specified. So it's not an array, but just a single value? Either wai, the valid values should be an enum, and the default specified using the default keyword. > + > + properties: > + mps,fixed-on-time: You don't need to set properties all the time. > + - $ref: "/schemas/types.yaml#/definitions/boolean" > + description: | > + select power on sequence with fixed time interval mentioned in > + time-slot reg for all the regulators. Can't you just derive that from the fact that time-slot is present? > + properties: > + mps,fixed-off-time: > + - $ref: "/schemas/types.yaml#/definitions/boolean" > + description: | > + select power off sequence with fixed time interval mentioned in > + time-slot reg for all the regulators. Same thing here > + properties: > + mps,inc-off-time: > + - $ref: "/schemas/types.yaml#/definitions/uint8-array" > + description: | > + An array of 8, linearly increase power off sequence time > + slot/interval for each regulator must be one of following values > + * 0 to 15 This should be an enum, or a combination of minimum/maximum. And the size of the array should be fixed too. > + properties: > + mps,inc-on-time: > + - $ref: "/schemas/types.yaml#/definitions/uint8-array" > + description: | > + An array of 8, linearly increase power on sequence time > + slot/interval for each regulator must be one of following values > + * 0 to 15 Ditto, > + properties: > + mps,switch-freq: > + - $ref: "/schemas/types.yaml#/definitions/uint8" > + description: | > + switching frequency must be one of following values > + * 0 : 1.1MHz > + * 1 : 1.65MHz > + * 2 : 2.2MHz > + * 3 : 2.75MHz > + Defaults to 2.2 MHz if not specified. enum and default > + properties: > + mps,buck-softstart: > + - $ref: "/schemas/types.yaml#/definitions/uint8-array" > + description: | > + An array of 4 contains soft start time of each buck, must be one of > + following values > + * 0 : 150us > + * 1 : 300us > + * 2 : 610us > + * 3 : 920us > + Defaults to 300us if not specified. Same story than mps,inc-off-time > + properties: > + mps,buck-ovp: > + - $ref: "/schemas/types.yaml#/definitions/uint8-array" > + description: | > + An array of 4 contains over voltage protection of each buck, must be > + one of following values > + * 0 : disabled > + * 1 : enabled > + Defaults is enabled if not specified. Ditto > + properties: > + mps,buck-phase-delay: > + - $ref: "/schemas/types.yaml#/definitions/uint8-array" > + description: | > + An array of 4 contains each buck phase delay must be one of following > + values > + * 0: 0deg > + * 1: 90deg > + * 2: 180deg > + * 3: 270deg > + Defaults to 0deg for buck1 & buck2, 90deg for buck3 & buck4 if not > + specified. ditto > +examples: > + - | > + i2c { > + #address-cells = <1>; > + #size-cells = <0>; > + > + mpq7920@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 { So regulators isn't a string after all? If it's supposed to be a node, it should be type: object and you can check that the node has a valid value using propertyNames Maxime [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 3/4] regulator: mpq7920: add mpq7920 regulator driver 2019-12-19 10:37 [PATCH 0/4] Add regulator support for mpq7920 Saravanan Sekar 2019-12-19 10:37 ` [PATCH 1/4] dt-bindings: Add an entry for Monolithic Power System, MPS Saravanan Sekar 2019-12-19 10:37 ` [PATCH 2/4] dt-bindings: regulator: add document bindings for mpq7920 Saravanan Sekar @ 2019-12-19 10:37 ` Saravanan Sekar 2019-12-19 12:44 ` Mark Brown 2019-12-19 10:37 ` [PATCH 4/4] MAINTAINERS: Add entry for mpq7920 PMIC driver Saravanan Sekar 3 siblings, 1 reply; 7+ messages in thread From: Saravanan Sekar @ 2019-12-19 10:37 UTC (permalink / raw) To: sravanhome, lgirdwood, broonie, robh+dt, mark.rutland, mripard, heiko, shawnguo, laurent.pinchart, icenowy, mchehab+samsung, davem, gregkh, Jonathan.Cameron Cc: linux-kernel, devicetree 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 | 376 ++++++++++++++++++++++++++++++++++++ drivers/regulator/mpq7920.h | 72 +++++++ 4 files changed, 459 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..6c56183e654e --- /dev/null +++ b/drivers/regulator/mpq7920.c @@ -0,0 +1,376 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * mpq7920.c - 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, \ + .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, \ + .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_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_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_ops, NULL, 0, 0, 0), + MPQ7920LDO("ldo3", 3, &mpq7920_ldo_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 = (ramp_delay <= 4000) ? 3 : 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 int mpq7920_regulator_register(struct mpq7920_regulator_info *info, + struct regulator_config *config) +{ + int i; + struct regulator_desc *rdesc; + struct regulator_ops *ops; + + for (i = 0; i < MPQ7920_MAX_REGULATORS; i++) { + rdesc = &info->rdesc[i]; + ops = rdesc->ops; + if (rdesc->curr_table) { + ops->get_current_limit = + regulator_get_current_limit_regmap; + ops->set_current_limit = + regulator_set_current_limit_regmap; + } + + 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 = { 0 }; + 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
* Re: [PATCH 3/4] regulator: mpq7920: add mpq7920 regulator driver 2019-12-19 10:37 ` [PATCH 3/4] regulator: mpq7920: add mpq7920 regulator driver Saravanan Sekar @ 2019-12-19 12:44 ` Mark Brown 0 siblings, 0 replies; 7+ messages in thread From: Mark Brown @ 2019-12-19 12:44 UTC (permalink / raw) To: Saravanan Sekar Cc: lgirdwood, robh+dt, mark.rutland, mripard, heiko, shawnguo, laurent.pinchart, icenowy, mchehab+samsung, davem, gregkh, Jonathan.Cameron, linux-kernel, devicetree [-- Attachment #1: Type: text/plain, Size: 1461 bytes --] On Thu, Dec 19, 2019 at 11:37:20AM +0100, Saravanan Sekar wrote: This looks pretty good, a few small issues below: > @@ -0,0 +1,376 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * mpq7920.c - mps mpq7920 > + * > + * Copyright 2019 Monolithic Power Systems, Inc Please keep the entire comment a C++ one so things look more intentional. > +static int mpq7920_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) > +{ > + unsigned int ramp_val = (ramp_delay <= 4000) ? 3 : 2; > + > + return regmap_update_bits(rdev->regmap, MPQ7920_REG_CTL0, > + MPQ7920_MASK_DVS_SLEWRATE, ramp_val << 6); > +} This should validate the input. Please also avoid abusing the ternery operator like this, just write normal logic statements to make the code more readable. > + struct regulator_desc *rdesc; > + struct regulator_ops *ops; > + > + for (i = 0; i < MPQ7920_MAX_REGULATORS; i++) { > + rdesc = &info->rdesc[i]; > + ops = rdesc->ops; > + if (rdesc->curr_table) { > + ops->get_current_limit = > + regulator_get_current_limit_regmap; > + ops->set_current_limit = > + regulator_set_current_limit_regmap; > + } It would be better to make these constant at build time rather than patching at runtime, that lets things like static checkers do their thing more easily. > + ret = mpq7920_regulator_register(info, &config); > + if (ret < 0) > + dev_err(dev, "Failed to register regulator!\n"); This function has one caller, just inline it. [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 4/4] MAINTAINERS: Add entry for mpq7920 PMIC driver 2019-12-19 10:37 [PATCH 0/4] Add regulator support for mpq7920 Saravanan Sekar ` (2 preceding siblings ...) 2019-12-19 10:37 ` [PATCH 3/4] regulator: mpq7920: add mpq7920 regulator driver Saravanan Sekar @ 2019-12-19 10:37 ` Saravanan Sekar 3 siblings, 0 replies; 7+ messages in thread From: Saravanan Sekar @ 2019-12-19 10:37 UTC (permalink / raw) To: sravanhome, lgirdwood, broonie, robh+dt, mark.rutland, mripard, heiko, shawnguo, laurent.pinchart, icenowy, mchehab+samsung, davem, gregkh, Jonathan.Cameron Cc: linux-kernel, devicetree 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
end of thread, other threads:[~2019-12-19 12:44 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2019-12-19 10:37 [PATCH 0/4] Add regulator support for mpq7920 Saravanan Sekar 2019-12-19 10:37 ` [PATCH 1/4] dt-bindings: Add an entry for Monolithic Power System, MPS Saravanan Sekar 2019-12-19 10:37 ` [PATCH 2/4] dt-bindings: regulator: add document bindings for mpq7920 Saravanan Sekar 2019-12-19 11:18 ` Maxime Ripard 2019-12-19 10:37 ` [PATCH 3/4] regulator: mpq7920: add mpq7920 regulator driver Saravanan Sekar 2019-12-19 12:44 ` Mark Brown 2019-12-19 10:37 ` [PATCH 4/4] MAINTAINERS: Add entry for mpq7920 PMIC driver Saravanan Sekar
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox