Loading Documentation/devicetree/bindings/regulator/mt6397-regulator.txt 0 → 100644 +217 −0 Original line number Diff line number Diff line Mediatek MT6397 Regulator Driver Required properties: - compatible: "mediatek,mt6397-regulator" - mt6397regulator: List of regulators provided by this controller. It is named according to its regulator type, buck_<name> and ldo_<name>. The definition for each of these nodes is defined using the standard binding for regulators at Documentation/devicetree/bindings/regulator/regulator.txt. The valid names for regulators are:: BUCK: buck_vpca15, buck_vpca7, buck_vsramca15, buck_vsramca7, buck_vcore, buck_vgpu, buck_vdrm, buck_vio18 LDO: ldo_vtcxo, ldo_va28, ldo_vcama, ldo_vio28, ldo_vusb, ldo_vmc, ldo_vmch, ldo_vemc3v3, ldo_vgp1, ldo_vgp2, ldo_vgp3, ldo_vgp4, ldo_vgp5, ldo_vgp6, ldo_vibr Example: pmic { compatible = "mediatek,mt6397"; mt6397regulator: mt6397regulator { compatible = "mediatek,mt6397-regulator"; mt6397_vpca15_reg: buck_vpca15 { regulator-compatible = "buck_vpca15"; regulator-name = "vpca15"; regulator-min-microvolt = < 850000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <200>; }; mt6397_vpca7_reg: buck_vpca7 { regulator-compatible = "buck_vpca7"; regulator-name = "vpca7"; regulator-min-microvolt = < 850000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <115>; }; mt6397_vsramca15_reg: buck_vsramca15 { regulator-compatible = "buck_vsramca15"; regulator-name = "vsramca15"; regulator-min-microvolt = < 850000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <115>; }; mt6397_vsramca7_reg: buck_vsramca7 { regulator-compatible = "buck_vsramca7"; regulator-name = "vsramca7"; regulator-min-microvolt = < 850000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <115>; }; mt6397_vcore_reg: buck_vcore { regulator-compatible = "buck_vcore"; regulator-name = "vcore"; regulator-min-microvolt = < 850000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <115>; }; mt6397_vgpu_reg: buck_vgpu { regulator-compatible = "buck_vgpu"; regulator-name = "vgpu"; regulator-min-microvolt = < 700000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <115>; }; mt6397_vdrm_reg: buck_vdrm { regulator-compatible = "buck_vdrm"; regulator-name = "vdrm"; regulator-min-microvolt = < 800000>; regulator-max-microvolt = <1400000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <500>; }; mt6397_vio18_reg: buck_vio18 { regulator-compatible = "buck_vio18"; regulator-name = "vio18"; regulator-min-microvolt = <1500000>; regulator-max-microvolt = <2120000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <500>; }; mt6397_vtcxo_reg: ldo_vtcxo { regulator-compatible = "ldo_vtcxo"; regulator-name = "vtcxo"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; regulator-enable-ramp-delay = <90>; }; mt6397_va28_reg: ldo_va28 { regulator-compatible = "ldo_va28"; regulator-name = "va28"; /* fixed output 2.8 V */ regulator-enable-ramp-delay = <218>; }; mt6397_vcama_reg: ldo_vcama { regulator-compatible = "ldo_vcama"; regulator-name = "vcama"; regulator-min-microvolt = <1500000>; regulator-max-microvolt = <2800000>; regulator-enable-ramp-delay = <218>; }; mt6397_vio28_reg: ldo_vio28 { regulator-compatible = "ldo_vio28"; regulator-name = "vio28"; /* fixed output 2.8 V */ regulator-enable-ramp-delay = <240>; }; mt6397_usb_reg: ldo_vusb { regulator-compatible = "ldo_vusb"; regulator-name = "vusb"; /* fixed output 3.3 V */ regulator-enable-ramp-delay = <218>; }; mt6397_vmc_reg: ldo_vmc { regulator-compatible = "ldo_vmc"; regulator-name = "vmc"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vmch_reg: ldo_vmch { regulator-compatible = "ldo_vmch"; regulator-name = "vmch"; regulator-min-microvolt = <3000000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vemc_3v3_reg: ldo_vemc3v3 { regulator-compatible = "ldo_vemc3v3"; regulator-name = "vemc_3v3"; regulator-min-microvolt = <3000000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vgp1_reg: ldo_vgp1 { regulator-compatible = "ldo_vgp1"; regulator-name = "vcamd"; regulator-min-microvolt = <1220000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <240>; }; mt6397_vgp2_reg: ldo_vgp2 { egulator-compatible = "ldo_vgp2"; regulator-name = "vcamio"; regulator-min-microvolt = <1000000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vgp3_reg: ldo_vgp3 { regulator-compatible = "ldo_vgp3"; regulator-name = "vcamaf"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vgp4_reg: ldo_vgp4 { regulator-compatible = "ldo_vgp4"; regulator-name = "vgp4"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vgp5_reg: ldo_vgp5 { regulator-compatible = "ldo_vgp5"; regulator-name = "vgp5"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <3000000>; regulator-enable-ramp-delay = <218>; }; mt6397_vgp6_reg: ldo_vgp6 { regulator-compatible = "ldo_vgp6"; regulator-name = "vgp6"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vibr_reg: ldo_vibr { regulator-compatible = "ldo_vibr"; regulator-name = "vibr"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; }; }; Documentation/devicetree/bindings/regulator/pfuze100.txt +93 −1 Original line number Diff line number Diff line PFUZE100 family of regulators Required properties: - compatible: "fsl,pfuze100" or "fsl,pfuze200" - compatible: "fsl,pfuze100", "fsl,pfuze200", "fsl,pfuze3000" - reg: I2C slave address Required child node: Loading @@ -14,6 +14,8 @@ Required child node: sw1ab,sw1c,sw2,sw3a,sw3b,sw4,swbst,vsnvs,vrefddr,vgen1~vgen6 --PFUZE200 sw1ab,sw2,sw3a,sw3b,swbst,vsnvs,vrefddr,vgen1~vgen6 --PFUZE3000 sw1a,sw1b,sw2,sw3,swbst,vsnvs,vrefddr,vldo1,vldo2,vccsd,v33,vldo3,vldo4 Each regulator is defined using the standard binding for regulators. Loading Loading @@ -205,3 +207,93 @@ Example 2: PFUZE200 }; }; }; Example 3: PFUZE3000 pmic: pfuze3000@08 { compatible = "fsl,pfuze3000"; reg = <0x08>; regulators { sw1a_reg: sw1a { regulator-min-microvolt = <700000>; regulator-max-microvolt = <1475000>; regulator-boot-on; regulator-always-on; regulator-ramp-delay = <6250>; }; /* use sw1c_reg to align with pfuze100/pfuze200 */ sw1c_reg: sw1b { regulator-min-microvolt = <700000>; regulator-max-microvolt = <1475000>; regulator-boot-on; regulator-always-on; regulator-ramp-delay = <6250>; }; sw2_reg: sw2 { regulator-min-microvolt = <2500000>; regulator-max-microvolt = <3300000>; regulator-boot-on; regulator-always-on; }; sw3a_reg: sw3 { regulator-min-microvolt = <900000>; regulator-max-microvolt = <1650000>; regulator-boot-on; regulator-always-on; }; swbst_reg: swbst { regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5150000>; }; snvs_reg: vsnvs { regulator-min-microvolt = <1000000>; regulator-max-microvolt = <3000000>; regulator-boot-on; regulator-always-on; }; vref_reg: vrefddr { regulator-boot-on; regulator-always-on; }; vgen1_reg: vldo1 { regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; vgen2_reg: vldo2 { regulator-min-microvolt = <800000>; regulator-max-microvolt = <1550000>; }; vgen3_reg: vccsd { regulator-min-microvolt = <2850000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; vgen4_reg: v33 { regulator-min-microvolt = <2850000>; regulator-max-microvolt = <3300000>; }; vgen5_reg: vldo3 { regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; vgen6_reg: vldo4 { regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; }; }; drivers/regulator/Kconfig +9 −0 Original line number Diff line number Diff line Loading @@ -441,6 +441,15 @@ config REGULATOR_MC13892 Say y here to support the regulators found on the Freescale MC13892 PMIC. config REGULATOR_MT6397 tristate "MediaTek MT6397 PMIC" depends on MFD_MT6397 help Say y here to select this option to enable the power regulator of MediaTek MT6397 PMIC. This driver supports the control of different power rails of device through regulator interface. config REGULATOR_PALMAS tristate "TI Palmas PMIC Regulators" depends on MFD_PALMAS Loading drivers/regulator/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ obj-$(CONFIG_REGULATOR_MAX77843) += max77843.o 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_MT6397) += mt6397-regulator.o obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o obj-$(CONFIG_REGULATOR_PALMAS) += palmas-regulator.o obj-$(CONFIG_REGULATOR_PFUZE100) += pfuze100-regulator.o Loading drivers/regulator/core.c +35 −77 Original line number Diff line number Diff line Loading @@ -634,23 +634,32 @@ static DEVICE_ATTR(bypass, 0444, /* Calculate the new optimum regulator operating mode based on the new total * consumer load. All locks held by caller */ static void drms_uA_update(struct regulator_dev *rdev) static int drms_uA_update(struct regulator_dev *rdev) { struct regulator *sibling; int current_uA = 0, output_uV, input_uV, err; unsigned int mode; /* * first check to see if we can set modes at all, otherwise just * tell the consumer everything is OK. */ err = regulator_check_drms(rdev); if (err < 0 || !rdev->desc->ops->get_optimum_mode || (!rdev->desc->ops->get_voltage && !rdev->desc->ops->get_voltage_sel) || !rdev->desc->ops->set_mode) return; if (err < 0) return 0; if (!rdev->desc->ops->get_optimum_mode) return 0; if (!rdev->desc->ops->set_mode) return -EINVAL; /* get output voltage */ output_uV = _regulator_get_voltage(rdev); if (output_uV <= 0) return; if (output_uV <= 0) { rdev_err(rdev, "invalid output voltage found\n"); return -EINVAL; } /* get input voltage */ input_uV = 0; Loading @@ -658,8 +667,10 @@ static void drms_uA_update(struct regulator_dev *rdev) input_uV = regulator_get_voltage(rdev->supply); if (input_uV <= 0) input_uV = rdev->constraints->input_uV; if (input_uV <= 0) return; if (input_uV <= 0) { rdev_err(rdev, "invalid input voltage found\n"); return -EINVAL; } /* calc total requested load */ list_for_each_entry(sibling, &rdev->consumer_list, list) Loading @@ -671,8 +682,17 @@ static void drms_uA_update(struct regulator_dev *rdev) /* check the new mode is allowed */ err = regulator_mode_constrain(rdev, &mode); if (err == 0) rdev->desc->ops->set_mode(rdev, mode); if (err < 0) { rdev_err(rdev, "failed to get optimum mode @ %d uA %d -> %d uV\n", current_uA, input_uV, output_uV); return err; } err = rdev->desc->ops->set_mode(rdev, mode); if (err < 0) rdev_err(rdev, "failed to set optimum mode %x\n", mode); return err; } static int suspend_set_state(struct regulator_dev *rdev, Loading Loading @@ -3002,75 +3022,13 @@ EXPORT_SYMBOL_GPL(regulator_get_mode); int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) { struct regulator_dev *rdev = regulator->rdev; struct regulator *consumer; int ret, output_uV, input_uV = 0, total_uA_load = 0; unsigned int mode; if (rdev->supply) input_uV = regulator_get_voltage(rdev->supply); int ret; mutex_lock(&rdev->mutex); /* * first check to see if we can set modes at all, otherwise just * tell the consumer everything is OK. */ regulator->uA_load = uA_load; ret = regulator_check_drms(rdev); if (ret < 0) { ret = 0; goto out; } if (!rdev->desc->ops->get_optimum_mode) goto out; /* * we can actually do this so any errors are indicators of * potential real failure. */ ret = -EINVAL; if (!rdev->desc->ops->set_mode) goto out; /* get output voltage */ output_uV = _regulator_get_voltage(rdev); if (output_uV <= 0) { rdev_err(rdev, "invalid output voltage found\n"); goto out; } /* No supply? Use constraint voltage */ if (input_uV <= 0) input_uV = rdev->constraints->input_uV; if (input_uV <= 0) { rdev_err(rdev, "invalid input voltage found\n"); goto out; } /* calc total requested load for this regulator */ list_for_each_entry(consumer, &rdev->consumer_list, list) total_uA_load += consumer->uA_load; mode = rdev->desc->ops->get_optimum_mode(rdev, input_uV, output_uV, total_uA_load); ret = regulator_mode_constrain(rdev, &mode); if (ret < 0) { rdev_err(rdev, "failed to get optimum mode @ %d uA %d -> %d uV\n", total_uA_load, input_uV, output_uV); goto out; } ret = rdev->desc->ops->set_mode(rdev, mode); if (ret < 0) { rdev_err(rdev, "failed to set optimum mode %x\n", mode); goto out; } ret = mode; out: ret = drms_uA_update(rdev); mutex_unlock(&rdev->mutex); return ret; } EXPORT_SYMBOL_GPL(regulator_set_optimum_mode); Loading Loading
Documentation/devicetree/bindings/regulator/mt6397-regulator.txt 0 → 100644 +217 −0 Original line number Diff line number Diff line Mediatek MT6397 Regulator Driver Required properties: - compatible: "mediatek,mt6397-regulator" - mt6397regulator: List of regulators provided by this controller. It is named according to its regulator type, buck_<name> and ldo_<name>. The definition for each of these nodes is defined using the standard binding for regulators at Documentation/devicetree/bindings/regulator/regulator.txt. The valid names for regulators are:: BUCK: buck_vpca15, buck_vpca7, buck_vsramca15, buck_vsramca7, buck_vcore, buck_vgpu, buck_vdrm, buck_vio18 LDO: ldo_vtcxo, ldo_va28, ldo_vcama, ldo_vio28, ldo_vusb, ldo_vmc, ldo_vmch, ldo_vemc3v3, ldo_vgp1, ldo_vgp2, ldo_vgp3, ldo_vgp4, ldo_vgp5, ldo_vgp6, ldo_vibr Example: pmic { compatible = "mediatek,mt6397"; mt6397regulator: mt6397regulator { compatible = "mediatek,mt6397-regulator"; mt6397_vpca15_reg: buck_vpca15 { regulator-compatible = "buck_vpca15"; regulator-name = "vpca15"; regulator-min-microvolt = < 850000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <200>; }; mt6397_vpca7_reg: buck_vpca7 { regulator-compatible = "buck_vpca7"; regulator-name = "vpca7"; regulator-min-microvolt = < 850000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <115>; }; mt6397_vsramca15_reg: buck_vsramca15 { regulator-compatible = "buck_vsramca15"; regulator-name = "vsramca15"; regulator-min-microvolt = < 850000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <115>; }; mt6397_vsramca7_reg: buck_vsramca7 { regulator-compatible = "buck_vsramca7"; regulator-name = "vsramca7"; regulator-min-microvolt = < 850000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <115>; }; mt6397_vcore_reg: buck_vcore { regulator-compatible = "buck_vcore"; regulator-name = "vcore"; regulator-min-microvolt = < 850000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <115>; }; mt6397_vgpu_reg: buck_vgpu { regulator-compatible = "buck_vgpu"; regulator-name = "vgpu"; regulator-min-microvolt = < 700000>; regulator-max-microvolt = <1350000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <115>; }; mt6397_vdrm_reg: buck_vdrm { regulator-compatible = "buck_vdrm"; regulator-name = "vdrm"; regulator-min-microvolt = < 800000>; regulator-max-microvolt = <1400000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <500>; }; mt6397_vio18_reg: buck_vio18 { regulator-compatible = "buck_vio18"; regulator-name = "vio18"; regulator-min-microvolt = <1500000>; regulator-max-microvolt = <2120000>; regulator-ramp-delay = <12500>; regulator-enable-ramp-delay = <500>; }; mt6397_vtcxo_reg: ldo_vtcxo { regulator-compatible = "ldo_vtcxo"; regulator-name = "vtcxo"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; regulator-enable-ramp-delay = <90>; }; mt6397_va28_reg: ldo_va28 { regulator-compatible = "ldo_va28"; regulator-name = "va28"; /* fixed output 2.8 V */ regulator-enable-ramp-delay = <218>; }; mt6397_vcama_reg: ldo_vcama { regulator-compatible = "ldo_vcama"; regulator-name = "vcama"; regulator-min-microvolt = <1500000>; regulator-max-microvolt = <2800000>; regulator-enable-ramp-delay = <218>; }; mt6397_vio28_reg: ldo_vio28 { regulator-compatible = "ldo_vio28"; regulator-name = "vio28"; /* fixed output 2.8 V */ regulator-enable-ramp-delay = <240>; }; mt6397_usb_reg: ldo_vusb { regulator-compatible = "ldo_vusb"; regulator-name = "vusb"; /* fixed output 3.3 V */ regulator-enable-ramp-delay = <218>; }; mt6397_vmc_reg: ldo_vmc { regulator-compatible = "ldo_vmc"; regulator-name = "vmc"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vmch_reg: ldo_vmch { regulator-compatible = "ldo_vmch"; regulator-name = "vmch"; regulator-min-microvolt = <3000000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vemc_3v3_reg: ldo_vemc3v3 { regulator-compatible = "ldo_vemc3v3"; regulator-name = "vemc_3v3"; regulator-min-microvolt = <3000000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vgp1_reg: ldo_vgp1 { regulator-compatible = "ldo_vgp1"; regulator-name = "vcamd"; regulator-min-microvolt = <1220000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <240>; }; mt6397_vgp2_reg: ldo_vgp2 { egulator-compatible = "ldo_vgp2"; regulator-name = "vcamio"; regulator-min-microvolt = <1000000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vgp3_reg: ldo_vgp3 { regulator-compatible = "ldo_vgp3"; regulator-name = "vcamaf"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vgp4_reg: ldo_vgp4 { regulator-compatible = "ldo_vgp4"; regulator-name = "vgp4"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vgp5_reg: ldo_vgp5 { regulator-compatible = "ldo_vgp5"; regulator-name = "vgp5"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <3000000>; regulator-enable-ramp-delay = <218>; }; mt6397_vgp6_reg: ldo_vgp6 { regulator-compatible = "ldo_vgp6"; regulator-name = "vgp6"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; mt6397_vibr_reg: ldo_vibr { regulator-compatible = "ldo_vibr"; regulator-name = "vibr"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <3300000>; regulator-enable-ramp-delay = <218>; }; }; };
Documentation/devicetree/bindings/regulator/pfuze100.txt +93 −1 Original line number Diff line number Diff line PFUZE100 family of regulators Required properties: - compatible: "fsl,pfuze100" or "fsl,pfuze200" - compatible: "fsl,pfuze100", "fsl,pfuze200", "fsl,pfuze3000" - reg: I2C slave address Required child node: Loading @@ -14,6 +14,8 @@ Required child node: sw1ab,sw1c,sw2,sw3a,sw3b,sw4,swbst,vsnvs,vrefddr,vgen1~vgen6 --PFUZE200 sw1ab,sw2,sw3a,sw3b,swbst,vsnvs,vrefddr,vgen1~vgen6 --PFUZE3000 sw1a,sw1b,sw2,sw3,swbst,vsnvs,vrefddr,vldo1,vldo2,vccsd,v33,vldo3,vldo4 Each regulator is defined using the standard binding for regulators. Loading Loading @@ -205,3 +207,93 @@ Example 2: PFUZE200 }; }; }; Example 3: PFUZE3000 pmic: pfuze3000@08 { compatible = "fsl,pfuze3000"; reg = <0x08>; regulators { sw1a_reg: sw1a { regulator-min-microvolt = <700000>; regulator-max-microvolt = <1475000>; regulator-boot-on; regulator-always-on; regulator-ramp-delay = <6250>; }; /* use sw1c_reg to align with pfuze100/pfuze200 */ sw1c_reg: sw1b { regulator-min-microvolt = <700000>; regulator-max-microvolt = <1475000>; regulator-boot-on; regulator-always-on; regulator-ramp-delay = <6250>; }; sw2_reg: sw2 { regulator-min-microvolt = <2500000>; regulator-max-microvolt = <3300000>; regulator-boot-on; regulator-always-on; }; sw3a_reg: sw3 { regulator-min-microvolt = <900000>; regulator-max-microvolt = <1650000>; regulator-boot-on; regulator-always-on; }; swbst_reg: swbst { regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5150000>; }; snvs_reg: vsnvs { regulator-min-microvolt = <1000000>; regulator-max-microvolt = <3000000>; regulator-boot-on; regulator-always-on; }; vref_reg: vrefddr { regulator-boot-on; regulator-always-on; }; vgen1_reg: vldo1 { regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; vgen2_reg: vldo2 { regulator-min-microvolt = <800000>; regulator-max-microvolt = <1550000>; }; vgen3_reg: vccsd { regulator-min-microvolt = <2850000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; vgen4_reg: v33 { regulator-min-microvolt = <2850000>; regulator-max-microvolt = <3300000>; }; vgen5_reg: vldo3 { regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; vgen6_reg: vldo4 { regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; }; };
drivers/regulator/Kconfig +9 −0 Original line number Diff line number Diff line Loading @@ -441,6 +441,15 @@ config REGULATOR_MC13892 Say y here to support the regulators found on the Freescale MC13892 PMIC. config REGULATOR_MT6397 tristate "MediaTek MT6397 PMIC" depends on MFD_MT6397 help Say y here to select this option to enable the power regulator of MediaTek MT6397 PMIC. This driver supports the control of different power rails of device through regulator interface. config REGULATOR_PALMAS tristate "TI Palmas PMIC Regulators" depends on MFD_PALMAS Loading
drivers/regulator/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ obj-$(CONFIG_REGULATOR_MAX77843) += max77843.o 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_MT6397) += mt6397-regulator.o obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o obj-$(CONFIG_REGULATOR_PALMAS) += palmas-regulator.o obj-$(CONFIG_REGULATOR_PFUZE100) += pfuze100-regulator.o Loading
drivers/regulator/core.c +35 −77 Original line number Diff line number Diff line Loading @@ -634,23 +634,32 @@ static DEVICE_ATTR(bypass, 0444, /* Calculate the new optimum regulator operating mode based on the new total * consumer load. All locks held by caller */ static void drms_uA_update(struct regulator_dev *rdev) static int drms_uA_update(struct regulator_dev *rdev) { struct regulator *sibling; int current_uA = 0, output_uV, input_uV, err; unsigned int mode; /* * first check to see if we can set modes at all, otherwise just * tell the consumer everything is OK. */ err = regulator_check_drms(rdev); if (err < 0 || !rdev->desc->ops->get_optimum_mode || (!rdev->desc->ops->get_voltage && !rdev->desc->ops->get_voltage_sel) || !rdev->desc->ops->set_mode) return; if (err < 0) return 0; if (!rdev->desc->ops->get_optimum_mode) return 0; if (!rdev->desc->ops->set_mode) return -EINVAL; /* get output voltage */ output_uV = _regulator_get_voltage(rdev); if (output_uV <= 0) return; if (output_uV <= 0) { rdev_err(rdev, "invalid output voltage found\n"); return -EINVAL; } /* get input voltage */ input_uV = 0; Loading @@ -658,8 +667,10 @@ static void drms_uA_update(struct regulator_dev *rdev) input_uV = regulator_get_voltage(rdev->supply); if (input_uV <= 0) input_uV = rdev->constraints->input_uV; if (input_uV <= 0) return; if (input_uV <= 0) { rdev_err(rdev, "invalid input voltage found\n"); return -EINVAL; } /* calc total requested load */ list_for_each_entry(sibling, &rdev->consumer_list, list) Loading @@ -671,8 +682,17 @@ static void drms_uA_update(struct regulator_dev *rdev) /* check the new mode is allowed */ err = regulator_mode_constrain(rdev, &mode); if (err == 0) rdev->desc->ops->set_mode(rdev, mode); if (err < 0) { rdev_err(rdev, "failed to get optimum mode @ %d uA %d -> %d uV\n", current_uA, input_uV, output_uV); return err; } err = rdev->desc->ops->set_mode(rdev, mode); if (err < 0) rdev_err(rdev, "failed to set optimum mode %x\n", mode); return err; } static int suspend_set_state(struct regulator_dev *rdev, Loading Loading @@ -3002,75 +3022,13 @@ EXPORT_SYMBOL_GPL(regulator_get_mode); int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) { struct regulator_dev *rdev = regulator->rdev; struct regulator *consumer; int ret, output_uV, input_uV = 0, total_uA_load = 0; unsigned int mode; if (rdev->supply) input_uV = regulator_get_voltage(rdev->supply); int ret; mutex_lock(&rdev->mutex); /* * first check to see if we can set modes at all, otherwise just * tell the consumer everything is OK. */ regulator->uA_load = uA_load; ret = regulator_check_drms(rdev); if (ret < 0) { ret = 0; goto out; } if (!rdev->desc->ops->get_optimum_mode) goto out; /* * we can actually do this so any errors are indicators of * potential real failure. */ ret = -EINVAL; if (!rdev->desc->ops->set_mode) goto out; /* get output voltage */ output_uV = _regulator_get_voltage(rdev); if (output_uV <= 0) { rdev_err(rdev, "invalid output voltage found\n"); goto out; } /* No supply? Use constraint voltage */ if (input_uV <= 0) input_uV = rdev->constraints->input_uV; if (input_uV <= 0) { rdev_err(rdev, "invalid input voltage found\n"); goto out; } /* calc total requested load for this regulator */ list_for_each_entry(consumer, &rdev->consumer_list, list) total_uA_load += consumer->uA_load; mode = rdev->desc->ops->get_optimum_mode(rdev, input_uV, output_uV, total_uA_load); ret = regulator_mode_constrain(rdev, &mode); if (ret < 0) { rdev_err(rdev, "failed to get optimum mode @ %d uA %d -> %d uV\n", total_uA_load, input_uV, output_uV); goto out; } ret = rdev->desc->ops->set_mode(rdev, mode); if (ret < 0) { rdev_err(rdev, "failed to set optimum mode %x\n", mode); goto out; } ret = mode; out: ret = drms_uA_update(rdev); mutex_unlock(&rdev->mutex); return ret; } EXPORT_SYMBOL_GPL(regulator_set_optimum_mode); Loading