lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1440420006-31556-3-git-send-email-vaibhav.hiremath@linaro.org>
Date:	Mon, 24 Aug 2015 18:10:06 +0530
From:	Vaibhav Hiremath <vaibhav.hiremath@...aro.org>
To:	linux-arm-kernel@...ts.infradead.org
Cc:	robh+dt@...nel.org, devicetree@...r.kernel.org,
	k.kozlowski@...sung.com, lee.jones@...aro.org, broonie@...nel.org,
	linux-kernel@...r.kernel.org,
	Vaibhav Hiremath <vaibhav.hiremath@...aro.org>
Subject: [PATCH-v3 2/2] regulator: 88pm800: Add support for configuration of dual phase on BUCK1

88PM860 device supports dual phase mode on BUCK1 output.
In normal usecase, BUCK1A and BUCK1B operates independently with 3A
capacity. And they both can work as a dual phase providing 6A capacity.

This patch updates the regulator driver to read the respective
DT property and enable dual-phase mode on BUCK1.
Note that if dual phase mode is enabled, then BUCK1B will not be
registered to the regulator framework and the current capacity of
BUCK1(A) would be set to 6A [3A of BUCK1A + 3A of BUCK1B].

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

diff --git a/drivers/regulator/88pm800.c b/drivers/regulator/88pm800.c
index 365a154..7aca6d17 100644
--- a/drivers/regulator/88pm800.c
+++ b/drivers/regulator/88pm800.c
@@ -267,6 +267,37 @@ static struct pm800_regulator_info pm860_regulator_info[] = {
 	PM800_LDO(ldo20, LDO20, LDO_ENA1_3, 3, 10000, ldo_volt_table2),
 };
 
+static int pm800_regulator_init(struct platform_device *pdev,
+		struct pm800_regulator_info *info)
+{
+	struct pm800_regulators *pm800_data = platform_get_drvdata(pdev);
+	struct pm80x_chip *chip = pm800_data->chip;
+	int ret = 0;
+
+	/* Currently only supported on 88pm860 device */
+	if (chip->type != CHIP_PM860)
+		return 0;
+
+	if (of_property_read_bool(pdev->dev.of_node,
+				"marvell,88pm860-buck1-dualphase-en")) {
+		/* Update the constraint  to [3A (BUCK1A) + 3A (BUCK1B)] */
+		info[PM800_ID_BUCK1].max_ua = 6000000;
+		/* Remove BUCK1B from the list, as we are in dual phase mode */
+		memset(&info[PM800_ID_BUCK1B], 0, sizeof(*info));
+		/* Enable dual phase mode */
+		ret = regmap_update_bits(chip->subchip->regmap_power,
+					PM860_BUCK1_MISC,
+					BUCK1_DUAL_PHASE_SEL,
+					BUCK1_DUAL_PHASE_SEL);
+		if (ret) {
+			dev_err(chip->dev, "failed to set dual-pase mode %d\n", ret);
+			return ret;
+		}
+	}
+
+	return ret;
+}
+
 static int pm800_regulator_probe(struct platform_device *pdev)
 {
 	struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
@@ -311,11 +342,20 @@ static int pm800_regulator_probe(struct platform_device *pdev)
 		return -ENODEV;
 	}
 
+	ret = pm800_regulator_init(pdev, info);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to init 88pm800 regulator device\n");
+		return ret;
+	}
+
 	config.dev = chip->dev;
 	config.regmap = pm800_data->map;
 	for (i = 0; i < PM800_ID_RG_MAX; i++) {
 		struct regulator_dev *regulator;
 
+		if (!info[i].desc.name)
+			continue;
+
 		if (pdata && pdata->num_regulators) {
 			init_data = pdata->regulators[i];
 			if (!init_data)
diff --git a/include/linux/mfd/88pm80x.h b/include/linux/mfd/88pm80x.h
index a92d173..122cfd2 100644
--- a/include/linux/mfd/88pm80x.h
+++ b/include/linux/mfd/88pm80x.h
@@ -295,6 +295,9 @@ enum {
 #define PM860_BUCK4_MISC2		(0x82)
 #define PM860_BUCK4_FULL_DRV		BIT(2)
 
+#define PM860_BUCK1_MISC		0x8E
+#define BUCK1_DUAL_PHASE_SEL		BIT(2)
+
 struct pm80x_rtc_pdata {
 	int		vrtc;
 	int		rtc_wakeup;
-- 
1.9.1

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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ