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: <1401110423-5647-3-git-send-email-k.kozlowski@samsung.com>
Date:	Mon, 26 May 2014 15:20:22 +0200
From:	Krzysztof Kozlowski <k.kozlowski@...sung.com>
To:	Liam Girdwood <lgirdwood@...il.com>,
	Mark Brown <broonie@...nel.org>,
	Sangbeom Kim <sbkim73@...sung.com>,
	Lee Jones <lee.jones@...aro.org>,
	Sachin Kamat <sachin.kamat@...aro.org>,
	linux-kernel@...r.kernel.org
Cc:	linux-samsung-soc@...r.kernel.org,
	Tomasz Figa <t.figa@...sung.com>,
	Kyungmin Park <kyungmin.park@...sung.com>,
	Marek Szyprowski <m.szyprowski@...sung.com>,
	Bartlomiej Zolnierkiewicz <b.zolnierkie@...sung.com>,
	devicetree@...r.kernel.org,
	Krzysztof Kozlowski <k.kozlowski@...sung.com>
Subject: [PATCH 2/3] regulator: s2mps11: Merge S2MPA01 driver

Add S2MPA01 support to the s2mps11 regulator driver. This obsoletes the
s2mpa01 regulator driver.

Signed-off-by: Krzysztof Kozlowski <k.kozlowski@...sung.com>
---
 Documentation/devicetree/bindings/mfd/s2mps11.txt | 106 ++++----
 drivers/regulator/Kconfig                         |   4 +-
 drivers/regulator/s2mps11.c                       | 283 +++++++++++++++++++---
 3 files changed, 315 insertions(+), 78 deletions(-)

diff --git a/Documentation/devicetree/bindings/mfd/s2mps11.txt b/Documentation/devicetree/bindings/mfd/s2mps11.txt
index d81ba30c0d8b..63f9b0d7982a 100644
--- a/Documentation/devicetree/bindings/mfd/s2mps11.txt
+++ b/Documentation/devicetree/bindings/mfd/s2mps11.txt
@@ -1,5 +1,5 @@
 
-* Samsung S2MPS11 and S2MPS14 Voltage and Current Regulator
+* Samsung S2MPA01, S2MPS11 and S2MPS14 Voltage and Current Regulator
 
 The Samsung S2MPS11 is a multi-function device which includes voltage and
 current regulators, RTC, charger controller and other sub-blocks. It is
@@ -7,21 +7,23 @@ interfaced to the host controller using an I2C interface. Each sub-block is
 addressed by the host system using different I2C slave addresses.
 
 Required properties:
-- compatible: Should be "samsung,s2mps11-pmic" or "samsung,s2mps14-pmic".
+- compatible: Should be one of: "samsung,s2mps11-pmic", "samsung,s2mps14-pmic",
+              "samsung,s2mpa01-pmic".
 - reg: Specifies the I2C slave address of the pmic block. It should be 0x66.
 
 Optional properties:
 - interrupt-parent: Specifies the phandle of the interrupt controller to which
   the interrupts from s2mps11 are delivered to.
-- interrupts: Interrupt specifiers for interrupt sources.
+- interrupts: An interrupt specifier for the sole interrupt generated by the
+  device.
 
 Optional nodes:
-- clocks: s2mps11 and s5m8767 provide three(AP/CP/BT) buffered 32.768 KHz
+- clocks: S2MPS11 and S5M8767 provide three(AP/CP/BT) buffered 32.768 KHz
   outputs, so to register these as clocks with common clock framework
   instantiate a sub-node named "clocks". It uses the common clock binding
   documented in :
   [Documentation/devicetree/bindings/clock/clock-bindings.txt]
-  The s2mps14 provides two (AP/BT) buffered 32.768 KHz outputs.
+  The S2MPS14 provides two (AP/BT) buffered 32.768 KHz outputs.
   - #clock-cells: should be 1.
 
   - The following is the list of clocks generated by the controller. Each clock
@@ -34,7 +36,8 @@ Optional nodes:
     32KhzBT		2            S2MPS11, S2MPS14, S5M8767
 
   - compatible: Should be one of: "samsung,s2mps11-clk", "samsung,s2mps14-clk",
-		"samsung,s5m8767-clk"
+                "samsung,s5m8767-clk"
+
 
 - regulators: The regulators of s2mps11 that have to be instantiated should be
 included in a sub-node named 'regulators'. Regulator nodes included in this
@@ -44,24 +47,61 @@ sub-node should be of the format as listed below.
 		[standard regulator constraints....];
 	};
 
- regulator-ramp-delay for BUCKs = [6250/12500/25000(default)/50000] uV/us
-
- BUCK[2/3/4/6] supports disabling ramp delay on hardware, so explictly
- regulator-ramp-delay = <0> can be used for them to disable ramp delay.
- In the absence of the regulator-ramp-delay property, the default ramp
- delay will be used.
-
-NOTE: Some BUCKs share the ramp rate setting i.e. same ramp value will be set
-for a particular group of BUCKs. So provide same regulator-ramp-delay<value>.
-Grouping of BUCKs sharing ramp rate setting is as follow : BUCK[1, 6],
-BUCK[3, 4], and BUCK[7, 8, 10]
-
-On S2MPS14 the LDO10, LDO11 and LDO12 can be configured to external control
-over GPIO. To turn this feature on this property must be added to the regulator
-sub-node:
-	- samsung,ext-control-gpios: GPIO specifier for one GPIO
-		controlling this regulator (enable/disable);
-Example:
+  The regulator constraints inside the regulator nodes use the standard
+  regulator bindings which are documented elsewhere.
+
+  The following are the names of the regulators that the s2mps11 pmic block
+  supports. Note: The 'n' in LDOn and BUCKn represents the LDO or BUCK number
+  as per the datasheet of S2MPA01/S2MPS11/S2MPS14.
+
+  - LDOn
+    - valid values for n are:
+      - S2MPA01: 1 to 26
+      - S2MPS11: 1 to 38
+      - S2MPS14: 1 to 25
+    - Example: LDO1, LDO2, LDO28
+
+  - BUCKn
+    - valid values for n are:
+      - S2MPA01: 1 to 10
+      - S2MPS11: 1 to 10
+      - S2MPS14: 1 to 5
+    - Example: BUCK1, BUCK2, BUCK9
+
+  Properties for BUCK regulator nodes, only on S2MPA01 and S2MPS11:
+  - regulator-ramp-delay: ramp delay in uV/us. May be 6250, 12500, 25000
+    or 50000. May be 0 for disabling the ramp delay when this is supported.
+
+    NOTE: Some BUCKs share the ramp rate setting i.e. same ramp value will
+    be set for a particular group of BUCKs. So provide same
+    regulator-ramp-delay=<value>.
+
+    - S2MPA01:
+      Default ramp delay: 12500
+      Ramp delay can be disabled for BUCK{1,2,3,4}.
+      BUCKs sharing ramp settings:
+      - 1 and 6
+      - 2 and 4
+      - 8, 9 and 10
+
+    - S2MPS11:
+      Default ramp delay: 25000
+      Ramp delay can be disabled for BUCK{2,3,4,6}.
+      BUCKs sharing ramp settings:
+      - 1 and 6
+      - 3 and 4
+      - 7, 8 and 9
+
+    In the absence of the regulator-ramp-delay property, the default ramp
+    delay will be used.
+
+  Properties for regulator nodes, only on S2MPS14:
+  - samsung,ext-control-gpios: GPIO specifier for one GPIO
+    controlling this regulator (enable/disable);
+
+    On S2MPS14 the LDO10, LDO11 and LDO12 can be configured to external
+    control over GPIO.
+    Example:
 	LDO12 {
 		regulator-name = "V_EMMC_2.8V";
 		regulator-min-microvolt = <2800000>;
@@ -70,24 +110,6 @@ Example:
 	};
 
 
-The regulator constraints inside the regulator nodes use the standard regulator
-bindings which are documented elsewhere.
-
-The following are the names of the regulators that the s2mps11 pmic block
-supports. Note: The 'n' in LDOn and BUCKn represents the LDO or BUCK number
-as per the datasheet of s2mps11.
-
-	- LDOn
-		  - valid values for n are:
-			- S2MPS11: 1 to 38
-			- S2MPS14: 1 to 25
-		  - Example: LDO1, LD02, LDO28
-	- BUCKn
-		  - valid values for n are:
-			- S2MPS11: 1 to 10
-			- S2MPS14: 1 to 5
-		  - Example: BUCK1, BUCK2, BUCK9
-
 Example:
 
 	s2mps11_pmic@66 {
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 65e5d7d1b35a..c4aa87fd12af 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -448,10 +448,10 @@ config REGULATOR_S2MPA01
 	 via I2C bus. S2MPA01 has 10 Bucks and 26 LDO outputs.
 
 config REGULATOR_S2MPS11
-	tristate "Samsung S2MPS11/S2MPS14 voltage regulator"
+	tristate "Samsung S2MPA01/S2MPS11/S2MPS14 voltage regulator"
 	depends on MFD_SEC_CORE
 	help
-	 This driver supports a Samsung S2MPS11/S2MPS14 voltage output
+	 This driver supports a Samsung S2MPA01/S2MPS11/S2MPS14 voltage output
 	 regulator via I2C bus. The chip is comprised of high efficient Buck
 	 converters including Dual-Phase Buck converter, Buck-Boost converter,
 	 various LDOs.
diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c
index fa12d75b784f..701fd6a687b9 100644
--- a/drivers/regulator/s2mps11.c
+++ b/drivers/regulator/s2mps11.c
@@ -3,6 +3,10 @@
  *
  * Copyright (c) 2012-2014 Samsung Electronics Co., Ltd
  *              http://www.samsung.com
+ * Authors:
+ * - Original driver: Sangbeom Kim <sbkim73@...sung.com>
+ * - Support for S2MPS14: Krzysztof Kozlowski <k.kozlowski@...sung.com>
+ * - Support for S2MPA01 based on work by Sachin Kamat <sachin.kamat@...aro.org>
  *
  * This program is free software; you can redistribute  it and/or modify it
  * under  the terms of  the GNU General  Public License as published by the
@@ -29,6 +33,7 @@
 #include <linux/regulator/of_regulator.h>
 #include <linux/of_gpio.h>
 #include <linux/mfd/samsung/core.h>
+#include <linux/mfd/samsung/s2mpa01.h>
 #include <linux/mfd/samsung/s2mps11.h>
 #include <linux/mfd/samsung/s2mps14.h>
 
@@ -105,7 +110,34 @@ static const struct s2mpx_ramp_reg s2mps11_ramp_regs[] = {
 	[S2MPX_BUCK10]	= s2mps11_ramp_reg(BUCK7810),
 };
 
+#define s2mpa01_ramp_reg(r_shift) {					\
+	.ramp_shift		= S2MPA01_ ## r_shift ## _RAMP_SHIFT,	\
+	.ramp_reg		= S2MPA01_REG_RAMP2,			\
+	.enable_shift		= 0,					\
+	.enable_supported	= false,				\
+}
+#define s2mpa01_buck1234_ramp_reg(r_shift, r_reg, e_shift) {		\
+	.ramp_shift		= S2MPA01_ ## r_shift ## _RAMP_SHIFT,	\
+	.ramp_reg		= S2MPA01_REG_ ## r_reg,		\
+	.enable_shift		= S2MPA01_ ## e_shift ## _RAMP_EN_SHIFT,\
+	.enable_supported	= true,					\
+}
+
+static const struct s2mpx_ramp_reg s2mpa01_ramp_regs[] = {
+	[S2MPX_BUCK1]	= s2mpa01_buck1234_ramp_reg(BUCK16, RAMP2, BUCK1),
+	[S2MPX_BUCK2]	= s2mpa01_buck1234_ramp_reg(BUCK24, RAMP1, BUCK2),
+	[S2MPX_BUCK3]	= s2mpa01_buck1234_ramp_reg(BUCK3, RAMP1, BUCK3),
+	[S2MPX_BUCK4]	= s2mpa01_buck1234_ramp_reg(BUCK24, RAMP1, BUCK4),
+	[S2MPX_BUCK5]	= s2mpa01_ramp_reg(BUCK5),
+	[S2MPX_BUCK6]	= s2mpa01_ramp_reg(BUCK16),
+	[S2MPX_BUCK7]	= s2mpa01_ramp_reg(BUCK7),
+	[S2MPX_BUCK8]	= s2mpa01_ramp_reg(BUCK8910),
+	[S2MPX_BUCK9]	= s2mpa01_ramp_reg(BUCK8910),
+	[S2MPX_BUCK10]	= s2mpa01_ramp_reg(BUCK8910),
+};
+
 static const struct s2mpx_ramp_reg * const s2mpx_ramp_regs[] = {
+	[S2MPA01] = s2mpa01_ramp_regs,
 	[S2MPS11X] = s2mps11_ramp_regs,
 };
 
@@ -138,6 +170,8 @@ static int get_s2mpx_buck_id(enum sec_device_type dev_type,
 		int rdev_id)
 {
 	switch (dev_type) {
+	case S2MPA01:
+		return rdev_id - S2MPA01_BUCK1;
 	case S2MPS11X:
 		return rdev_id - S2MPS11_BUCK1;
 	default:
@@ -202,7 +236,7 @@ static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 	struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
 	const struct s2mpx_ramp_reg *ramp_reg;
 	unsigned int ramp_val;
-	unsigned int ramp_enable = 1;
+	unsigned int ramp_disable = !ramp_delay;
 	int buck_id;
 	int ret;
 
@@ -216,30 +250,20 @@ static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 			ramp_delay = s2mps11->ramp_delay16;
 		break;
 	case S2MPX_BUCK2:
-		if (!ramp_delay) {
-			ramp_enable = 0;
-			break;
-		}
-
-		s2mps11->ramp_delay2 = ramp_delay;
+		if (s2mps11->dev_type == S2MPS11X ||
+				ramp_delay > s2mps11->ramp_delay2)
+			s2mps11->ramp_delay2 = ramp_delay;
+		else /* S2MPA01 && ramp_delay <= s2mpa01->ramp_delay24 */
+			ramp_delay = s2mps11->ramp_delay2;
 		break;
 	case S2MPX_BUCK3:
-		if (!ramp_delay) {
-			ramp_enable = 0;
-			break;
-		}
-
-		if (ramp_delay > s2mps11->ramp_delay3)
+		if (s2mps11->dev_type == S2MPA01 ||
+				ramp_delay > s2mps11->ramp_delay3)
 			s2mps11->ramp_delay3 = ramp_delay;
-		else
+		else /* S2MPS11 && ramp_delay <= s2mpa01->ramp_delay3 */
 			ramp_delay = s2mps11->ramp_delay3;
 		break;
 	case S2MPS11_BUCK4:
-		if (!ramp_delay) {
-			ramp_enable = 0;
-			break;
-		}
-
 		if (ramp_delay > s2mps11->ramp_delay4)
 			s2mps11->ramp_delay4 = ramp_delay;
 		else
@@ -249,20 +273,16 @@ static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 		s2mps11->ramp_delay5 = ramp_delay;
 		break;
 	case S2MPS11_BUCK6:
-		if (!ramp_delay) {
-			ramp_enable = 0;
-			break;
-		}
-
 		if (ramp_delay > s2mps11->ramp_delay16)
 			s2mps11->ramp_delay16 = ramp_delay;
 		else
 			ramp_delay = s2mps11->ramp_delay16;
 		break;
 	case S2MPS11_BUCK7:
-		if (ramp_delay > s2mps11->ramp_delay7)
+		if (s2mps11->dev_type == S2MPA01 ||
+				ramp_delay > s2mps11->ramp_delay7)
 			s2mps11->ramp_delay7 = ramp_delay;
-		else
+		else /* S2MPS11 && ramp_delay <= s2mpa01->ramp_delay7 */
 			ramp_delay = s2mps11->ramp_delay7;
 		break;
 	case S2MPS11_BUCK8:
@@ -273,7 +293,11 @@ static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 			ramp_delay = s2mps11->ramp_delay810;
 		break;
 	case S2MPS11_BUCK9:
-		s2mps11->ramp_delay9 = ramp_delay;
+		if (s2mps11->dev_type == S2MPS11X ||
+				ramp_delay > s2mps11->ramp_delay9)
+			s2mps11->ramp_delay9 = ramp_delay;
+		else /* S2MPA01 && ramp_delay <= s2mpa01->ramp_delay9 */
+			ramp_delay = s2mps11->ramp_delay9;
 		break;
 	default:
 		return 0;
@@ -281,11 +305,10 @@ static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 
 	ramp_reg = &s2mpx_ramp_regs[s2mps11->dev_type][buck_id];
 
-	if (!ramp_enable)
-		goto ramp_disable;
-
-	/* Ramp delay can be enabled/disabled only for buck[2346] */
 	if (ramp_reg->enable_supported) {
+		if (ramp_disable)
+			goto ramp_disable;
+
 		ret = regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP,
 					 1 << ramp_reg->enable_shift,
 					 1 << ramp_reg->enable_shift);
@@ -654,6 +677,193 @@ static const struct regulator_desc s2mps14_regulators[] = {
 	regulator_desc_s2mps14_buck1235(5),
 };
 
+static struct regulator_ops s2mpa01_ldo_ops = {
+	.list_voltage		= regulator_list_voltage_linear,
+	.map_voltage		= regulator_map_voltage_linear,
+	.is_enabled		= regulator_is_enabled_regmap,
+	.enable			= regulator_enable_regmap,
+	.disable		= regulator_disable_regmap,
+	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
+	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
+	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
+};
+
+static struct regulator_ops s2mpa01_buck_ops = {
+	.list_voltage		= regulator_list_voltage_linear,
+	.map_voltage		= regulator_map_voltage_linear,
+	.is_enabled		= regulator_is_enabled_regmap,
+	.enable			= regulator_enable_regmap,
+	.disable		= regulator_disable_regmap,
+	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
+	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
+	.set_voltage_time_sel	= s2mps11_regulator_set_voltage_time_sel,
+	.set_ramp_delay		= s2mps11_set_ramp_delay,
+};
+
+#define regulator_desc_s2mpa01_ldo1(num) {		\
+	.name		= "LDO"#num,			\
+	.id		= S2MPA01_LDO##num,		\
+	.ops		= &s2mpa01_ldo_ops,		\
+	.type		= REGULATOR_VOLTAGE,		\
+	.owner		= THIS_MODULE,			\
+	.min_uV		= S2MPA01_LDO_MIN,		\
+	.uV_step	= S2MPA01_LDO_STEP1,		\
+	.n_voltages	= S2MPA01_LDO_N_VOLTAGES,	\
+	.vsel_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
+	.vsel_mask	= S2MPA01_LDO_VSEL_MASK,	\
+	.enable_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
+	.enable_mask	= S2MPA01_ENABLE_MASK		\
+}
+#define regulator_desc_s2mpa01_ldo2(num) {		\
+	.name		= "LDO"#num,			\
+	.id		= S2MPA01_LDO##num,		\
+	.ops		= &s2mpa01_ldo_ops,		\
+	.type		= REGULATOR_VOLTAGE,		\
+	.owner		= THIS_MODULE,			\
+	.min_uV		= S2MPA01_LDO_MIN,		\
+	.uV_step	= S2MPA01_LDO_STEP2,		\
+	.n_voltages	= S2MPA01_LDO_N_VOLTAGES,	\
+	.vsel_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
+	.vsel_mask	= S2MPA01_LDO_VSEL_MASK,	\
+	.enable_reg	= S2MPA01_REG_L1CTRL + num - 1,	\
+	.enable_mask	= S2MPA01_ENABLE_MASK		\
+}
+
+#define regulator_desc_s2mpa01_buck1_4(num) {			\
+	.name		= "BUCK"#num,				\
+	.id		= S2MPA01_BUCK##num,			\
+	.ops		= &s2mpa01_buck_ops,			\
+	.type		= REGULATOR_VOLTAGE,			\
+	.owner		= THIS_MODULE,				\
+	.min_uV		= S2MPA01_BUCK_MIN1,			\
+	.uV_step	= S2MPA01_BUCK_STEP1,			\
+	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
+	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
+	.vsel_reg	= S2MPA01_REG_B1CTRL2 + (num - 1) * 2,	\
+	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
+	.enable_reg	= S2MPA01_REG_B1CTRL1 + (num - 1) * 2,	\
+	.enable_mask	= S2MPA01_ENABLE_MASK			\
+}
+
+#define regulator_desc_s2mpa01_buck5 {				\
+	.name		= "BUCK5",				\
+	.id		= S2MPA01_BUCK5,			\
+	.ops		= &s2mpa01_buck_ops,			\
+	.type		= REGULATOR_VOLTAGE,			\
+	.owner		= THIS_MODULE,				\
+	.min_uV		= S2MPA01_BUCK_MIN2,			\
+	.uV_step	= S2MPA01_BUCK_STEP1,			\
+	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
+	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
+	.vsel_reg	= S2MPA01_REG_B5CTRL2,			\
+	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
+	.enable_reg	= S2MPA01_REG_B5CTRL1,			\
+	.enable_mask	= S2MPA01_ENABLE_MASK			\
+}
+
+#define regulator_desc_s2mpa01_buck6_7(num) {			\
+	.name		= "BUCK"#num,				\
+	.id		= S2MPA01_BUCK##num,			\
+	.ops		= &s2mpa01_buck_ops,			\
+	.type		= REGULATOR_VOLTAGE,			\
+	.owner		= THIS_MODULE,				\
+	.min_uV		= S2MPA01_BUCK_MIN1,			\
+	.uV_step	= S2MPA01_BUCK_STEP1,			\
+	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
+	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
+	.vsel_reg	= S2MPA01_REG_B6CTRL2 + (num - 6) * 2,	\
+	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
+	.enable_reg	= S2MPA01_REG_B6CTRL1 + (num - 6) * 2,	\
+	.enable_mask	= S2MPA01_ENABLE_MASK			\
+}
+
+#define regulator_desc_s2mpa01_buck8 {				\
+	.name		= "BUCK8",				\
+	.id		= S2MPA01_BUCK8,			\
+	.ops		= &s2mpa01_buck_ops,			\
+	.type		= REGULATOR_VOLTAGE,			\
+	.owner		= THIS_MODULE,				\
+	.min_uV		= S2MPA01_BUCK_MIN2,			\
+	.uV_step	= S2MPA01_BUCK_STEP2,			\
+	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
+	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
+	.vsel_reg	= S2MPA01_REG_B8CTRL2,			\
+	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
+	.enable_reg	= S2MPA01_REG_B8CTRL1,			\
+	.enable_mask	= S2MPA01_ENABLE_MASK			\
+}
+
+#define regulator_desc_s2mpa01_buck9 {				\
+	.name		= "BUCK9",				\
+	.id		= S2MPA01_BUCK9,			\
+	.ops		= &s2mpa01_buck_ops,			\
+	.type		= REGULATOR_VOLTAGE,			\
+	.owner		= THIS_MODULE,				\
+	.min_uV		= S2MPA01_BUCK_MIN4,			\
+	.uV_step	= S2MPA01_BUCK_STEP2,			\
+	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
+	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
+	.vsel_reg	= S2MPA01_REG_B9CTRL2,			\
+	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
+	.enable_reg	= S2MPA01_REG_B9CTRL1,			\
+	.enable_mask	= S2MPA01_ENABLE_MASK			\
+}
+
+#define regulator_desc_s2mpa01_buck10 {				\
+	.name		= "BUCK10",				\
+	.id		= S2MPA01_BUCK10,			\
+	.ops		= &s2mpa01_buck_ops,			\
+	.type		= REGULATOR_VOLTAGE,			\
+	.owner		= THIS_MODULE,				\
+	.min_uV		= S2MPA01_BUCK_MIN3,			\
+	.uV_step	= S2MPA01_BUCK_STEP2,			\
+	.n_voltages	= S2MPA01_BUCK_N_VOLTAGES,		\
+	.ramp_delay	= S2MPA01_RAMP_DELAY,			\
+	.vsel_reg	= S2MPA01_REG_B10CTRL2,			\
+	.vsel_mask	= S2MPA01_BUCK_VSEL_MASK,		\
+	.enable_reg	= S2MPA01_REG_B10CTRL1,			\
+	.enable_mask	= S2MPA01_ENABLE_MASK			\
+}
+
+static struct regulator_desc s2mpa01_regulators[] = {
+	regulator_desc_s2mpa01_ldo2(1),
+	regulator_desc_s2mpa01_ldo1(2),
+	regulator_desc_s2mpa01_ldo1(3),
+	regulator_desc_s2mpa01_ldo1(4),
+	regulator_desc_s2mpa01_ldo1(5),
+	regulator_desc_s2mpa01_ldo2(6),
+	regulator_desc_s2mpa01_ldo1(7),
+	regulator_desc_s2mpa01_ldo1(8),
+	regulator_desc_s2mpa01_ldo1(9),
+	regulator_desc_s2mpa01_ldo1(10),
+	regulator_desc_s2mpa01_ldo2(11),
+	regulator_desc_s2mpa01_ldo1(12),
+	regulator_desc_s2mpa01_ldo1(13),
+	regulator_desc_s2mpa01_ldo1(14),
+	regulator_desc_s2mpa01_ldo1(15),
+	regulator_desc_s2mpa01_ldo1(16),
+	regulator_desc_s2mpa01_ldo1(17),
+	regulator_desc_s2mpa01_ldo1(18),
+	regulator_desc_s2mpa01_ldo1(19),
+	regulator_desc_s2mpa01_ldo1(20),
+	regulator_desc_s2mpa01_ldo1(21),
+	regulator_desc_s2mpa01_ldo2(22),
+	regulator_desc_s2mpa01_ldo2(23),
+	regulator_desc_s2mpa01_ldo1(24),
+	regulator_desc_s2mpa01_ldo1(25),
+	regulator_desc_s2mpa01_ldo1(26),
+	regulator_desc_s2mpa01_buck1_4(1),
+	regulator_desc_s2mpa01_buck1_4(2),
+	regulator_desc_s2mpa01_buck1_4(3),
+	regulator_desc_s2mpa01_buck1_4(4),
+	regulator_desc_s2mpa01_buck5,
+	regulator_desc_s2mpa01_buck6_7(6),
+	regulator_desc_s2mpa01_buck6_7(7),
+	regulator_desc_s2mpa01_buck8,
+	regulator_desc_s2mpa01_buck9,
+	regulator_desc_s2mpa01_buck10,
+};
+
 static int s2mps14_pmic_enable_ext_control(struct s2mps11_info *s2mps11,
 		struct regulator_dev *rdev)
 {
@@ -713,13 +923,16 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
 	int i, ret = 0;
 	const struct regulator_desc *regulators;
 
-	s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info),
-				GFP_KERNEL);
+	s2mps11 = devm_kzalloc(&pdev->dev, sizeof(*s2mps11), GFP_KERNEL);
 	if (!s2mps11)
 		return -ENOMEM;
 
 	s2mps11->dev_type = platform_get_device_id(pdev)->driver_data;
 	switch (s2mps11->dev_type) {
+	case S2MPA01:
+		s2mps11->rdev_num = ARRAY_SIZE(s2mpa01_regulators);
+		regulators = s2mpa01_regulators;
+		break;
 	case S2MPS11X:
 		s2mps11->rdev_num = ARRAY_SIZE(s2mps11_regulators);
 		regulators = s2mps11_regulators;
@@ -817,6 +1030,7 @@ out:
 static const struct platform_device_id s2mps11_pmic_id[] = {
 	{ "s2mps11-pmic", S2MPS11X},
 	{ "s2mps14-pmic", S2MPS14X},
+	{ "s2mpa01-pmic", S2MPA01},
 	{ },
 };
 MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id);
@@ -844,5 +1058,6 @@ module_exit(s2mps11_pmic_exit);
 
 /* Module information */
 MODULE_AUTHOR("Sangbeom Kim <sbkim73@...sung.com>");
-MODULE_DESCRIPTION("SAMSUNG S2MPS11/S2MPS14 Regulator Driver");
+MODULE_AUTHOR("Krzysztof Kozlowski <k.kozlowski@...sung.com>");
+MODULE_DESCRIPTION("SAMSUNG S2MPA01/S2MPS11/S2MPS14 Regulator Driver");
 MODULE_LICENSE("GPL");
-- 
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