* [PATCH v4 1/4] dt-bindings: mfd: s2mps11: add documentation for s2mps15 PMIC
2015-10-29 4:58 [PATCH v4 0/4] mfd: sec: add S2MPS15 PMIC support Alim Akhtar
@ 2015-10-29 4:58 ` Alim Akhtar
2015-10-29 5:57 ` Krzysztof Kozlowski
2015-10-29 4:58 ` [PATCH v4 2/4] mfd: sec: Add support for S2MPS15 PMIC Alim Akhtar
` (2 subsequent siblings)
3 siblings, 1 reply; 20+ messages in thread
From: Alim Akhtar @ 2015-10-29 4:58 UTC (permalink / raw)
To: lee.jones, broonie
Cc: k.kozlowski, linux-samsung-soc, rtc-linux, linux-kernel,
Thomas Abraham, devicetree
From: Thomas Abraham <thomas.ab@samsung.com>
Add dt-binding documentation for s2mps15 PMIC device. The s2mps15 device
is similar to s2mps11/14 PMIC device and has 27 LDO and 10 buck regulators.
Cc: devicetree@vger.kernel.org
Signed-off-by: Thomas Abraham <thomas.ab@samsung.com>
Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Acked-by: Lee Jones <lee.jones@linaro.org>
---
Documentation/devicetree/bindings/mfd/s2mps11.txt | 23 ++++++++++++++-------
1 file changed, 15 insertions(+), 8 deletions(-)
diff --git a/Documentation/devicetree/bindings/mfd/s2mps11.txt b/Documentation/devicetree/bindings/mfd/s2mps11.txt
index 890f0b0e1643..c0427c9d0886 100644
--- a/Documentation/devicetree/bindings/mfd/s2mps11.txt
+++ b/Documentation/devicetree/bindings/mfd/s2mps11.txt
@@ -1,5 +1,5 @@
-* Samsung S2MPS11, S2MPS13, S2MPS14 and S2MPU02 Voltage and Current Regulator
+* Samsung S2MPS11/13/14/15 and S2MPU02 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,8 +7,12 @@ 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,s2mps13-pmic"
- or "samsung,s2mps14-pmic" or "samsung,s2mpu02-pmic".
+- compatible: Should be one of the following
+ - "samsung,s2mps11-pmic"
+ - "samsung,s2mps13-pmic"
+ - "samsung,s2mps14-pmic"
+ - "samsung,s2mps15-pmic"
+ - "samsung,s2mpu02-pmic".
- reg: Specifies the I2C slave address of the pmic block. It should be 0x66.
Optional properties:
@@ -24,7 +28,7 @@ Optional properties:
unwanted buck warm reset (setting buck voltages to default values).
Optional nodes:
-- clocks: s2mps11, s2mps13 and s5m8767 provide three(AP/CP/BT) buffered 32.768
+- clocks: s2mps11, s2mps13, s2mps15 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 :
@@ -37,12 +41,13 @@ Optional nodes:
the clock which they consume.
Clock ID Devices
----------------------------------------------------------
- 32KhzAP 0 S2MPS11, S2MPS13, S2MPS14, S5M8767
- 32KhzCP 1 S2MPS11, S2MPS13, S5M8767
- 32KhzBT 2 S2MPS11, S2MPS13, S2MPS14, S5M8767
+ 32KhzAP 0 S2MPS11, S2MPS13, S2MPS14, S2MPS15, S5M8767
+ 32KhzCP 1 S2MPS11, S2MPS13, S2MPS15, S5M8767
+ 32KhzBT 2 S2MPS11, S2MPS13, S2MPS14, S2MPS15, S5M8767
- compatible: Should be one of: "samsung,s2mps11-clk", "samsung,s2mps13-clk",
- "samsung,s2mps14-clk", "samsung,s5m8767-clk"
+ "samsung,s2mps14-clk", "samsung,s2mps15-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
@@ -90,6 +95,7 @@ as per the datasheet of s2mps11.
- S2MPS11: 1 to 38
- S2MPS13: 1 to 40
- S2MPS14: 1 to 25
+ - S2MPS15: 1 to 27
- S2MPU02: 1 to 28
- Example: LDO1, LDO2, LDO28
- BUCKn
@@ -97,6 +103,7 @@ as per the datasheet of s2mps11.
- S2MPS11: 1 to 10
- S2MPS13: 1 to 10
- S2MPS14: 1 to 5
+ - S2MPS15: 1 to 10
- S2MPU02: 1 to 7
- Example: BUCK1, BUCK2, BUCK9
--
1.7.10.4
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v4 1/4] dt-bindings: mfd: s2mps11: add documentation for s2mps15 PMIC
2015-10-29 4:58 ` [PATCH v4 1/4] dt-bindings: mfd: s2mps11: add documentation for s2mps15 PMIC Alim Akhtar
@ 2015-10-29 5:57 ` Krzysztof Kozlowski
2015-10-29 7:48 ` Alim Akhtar
0 siblings, 1 reply; 20+ messages in thread
From: Krzysztof Kozlowski @ 2015-10-29 5:57 UTC (permalink / raw)
To: Alim Akhtar, lee.jones, broonie
Cc: linux-samsung-soc, rtc-linux, linux-kernel, Thomas Abraham,
devicetree
On 29.10.2015 13:58, Alim Akhtar wrote:
> From: Thomas Abraham <thomas.ab@samsung.com>
>
> Add dt-binding documentation for s2mps15 PMIC device. The s2mps15 device
> is similar to s2mps11/14 PMIC device and has 27 LDO and 10 buck regulators.
>
> Cc: devicetree@vger.kernel.org
> Signed-off-by: Thomas Abraham <thomas.ab@samsung.com>
> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
> Acked-by: Lee Jones <lee.jones@linaro.org>
> ---
> Documentation/devicetree/bindings/mfd/s2mps11.txt | 23 ++++++++++++++-------
> 1 file changed, 15 insertions(+), 8 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/mfd/s2mps11.txt b/Documentation/devicetree/bindings/mfd/s2mps11.txt
> index 890f0b0e1643..c0427c9d0886 100644
> --- a/Documentation/devicetree/bindings/mfd/s2mps11.txt
> +++ b/Documentation/devicetree/bindings/mfd/s2mps11.txt
> @@ -1,5 +1,5 @@
>
> -* Samsung S2MPS11, S2MPS13, S2MPS14 and S2MPU02 Voltage and Current Regulator
> +* Samsung S2MPS11/13/14/15 and S2MPU02 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,8 +7,12 @@ 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,s2mps13-pmic"
> - or "samsung,s2mps14-pmic" or "samsung,s2mpu02-pmic".
> +- compatible: Should be one of the following
> + - "samsung,s2mps11-pmic"
> + - "samsung,s2mps13-pmic"
> + - "samsung,s2mps14-pmic"
> + - "samsung,s2mps15-pmic"
> + - "samsung,s2mpu02-pmic".
> - reg: Specifies the I2C slave address of the pmic block. It should be 0x66.
>
> Optional properties:
> @@ -24,7 +28,7 @@ Optional properties:
> unwanted buck warm reset (setting buck voltages to default values).
>
> Optional nodes:
> -- clocks: s2mps11, s2mps13 and s5m8767 provide three(AP/CP/BT) buffered 32.768
> +- clocks: s2mps11, s2mps13, s2mps15 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 :
> @@ -37,12 +41,13 @@ Optional nodes:
> the clock which they consume.
> Clock ID Devices
> ----------------------------------------------------------
> - 32KhzAP 0 S2MPS11, S2MPS13, S2MPS14, S5M8767
> - 32KhzCP 1 S2MPS11, S2MPS13, S5M8767
> - 32KhzBT 2 S2MPS11, S2MPS13, S2MPS14, S5M8767
> + 32KhzAP 0 S2MPS11, S2MPS13, S2MPS14, S2MPS15, S5M8767
> + 32KhzCP 1 S2MPS11, S2MPS13, S2MPS15, S5M8767
> + 32KhzBT 2 S2MPS11, S2MPS13, S2MPS14, S2MPS15, S5M8767
>
> - compatible: Should be one of: "samsung,s2mps11-clk", "samsung,s2mps13-clk",
> - "samsung,s2mps14-clk", "samsung,s5m8767-clk"
> + "samsung,s2mps14-clk", "samsung,s2mps15-clk",
> + "samsung,s5m8767-clk"
Noooo. Why "samsung,s2mps15-clk"?
Adding a new compatible to bindings is a major change so my review tag
(from v1 where there was no such compatible) should be dropped. Please
drop it.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v4 1/4] dt-bindings: mfd: s2mps11: add documentation for s2mps15 PMIC
2015-10-29 5:57 ` Krzysztof Kozlowski
@ 2015-10-29 7:48 ` Alim Akhtar
0 siblings, 0 replies; 20+ messages in thread
From: Alim Akhtar @ 2015-10-29 7:48 UTC (permalink / raw)
To: Krzysztof Kozlowski, lee.jones, broonie
Cc: linux-samsung-soc, rtc-linux, linux-kernel, Thomas Abraham,
devicetree
On 10/29/2015 11:27 AM, Krzysztof Kozlowski wrote:
> On 29.10.2015 13:58, Alim Akhtar wrote:
>> From: Thomas Abraham <thomas.ab@samsung.com>
>>
>> Add dt-binding documentation for s2mps15 PMIC device. The s2mps15 device
>> is similar to s2mps11/14 PMIC device and has 27 LDO and 10 buck regulators.
>>
>> Cc: devicetree@vger.kernel.org
>> Signed-off-by: Thomas Abraham <thomas.ab@samsung.com>
>> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
>> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
>> Acked-by: Lee Jones <lee.jones@linaro.org>
>> ---
>> Documentation/devicetree/bindings/mfd/s2mps11.txt | 23 ++++++++++++++-------
>> 1 file changed, 15 insertions(+), 8 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/mfd/s2mps11.txt b/Documentation/devicetree/bindings/mfd/s2mps11.txt
>> index 890f0b0e1643..c0427c9d0886 100644
>> --- a/Documentation/devicetree/bindings/mfd/s2mps11.txt
>> +++ b/Documentation/devicetree/bindings/mfd/s2mps11.txt
>> @@ -1,5 +1,5 @@
>>
>> -* Samsung S2MPS11, S2MPS13, S2MPS14 and S2MPU02 Voltage and Current Regulator
>> +* Samsung S2MPS11/13/14/15 and S2MPU02 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,8 +7,12 @@ 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,s2mps13-pmic"
>> - or "samsung,s2mps14-pmic" or "samsung,s2mpu02-pmic".
>> +- compatible: Should be one of the following
>> + - "samsung,s2mps11-pmic"
>> + - "samsung,s2mps13-pmic"
>> + - "samsung,s2mps14-pmic"
>> + - "samsung,s2mps15-pmic"
>> + - "samsung,s2mpu02-pmic".
>> - reg: Specifies the I2C slave address of the pmic block. It should be 0x66.
>>
>> Optional properties:
>> @@ -24,7 +28,7 @@ Optional properties:
>> unwanted buck warm reset (setting buck voltages to default values).
>>
>> Optional nodes:
>> -- clocks: s2mps11, s2mps13 and s5m8767 provide three(AP/CP/BT) buffered 32.768
>> +- clocks: s2mps11, s2mps13, s2mps15 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 :
>> @@ -37,12 +41,13 @@ Optional nodes:
>> the clock which they consume.
>> Clock ID Devices
>> ----------------------------------------------------------
>> - 32KhzAP 0 S2MPS11, S2MPS13, S2MPS14, S5M8767
>> - 32KhzCP 1 S2MPS11, S2MPS13, S5M8767
>> - 32KhzBT 2 S2MPS11, S2MPS13, S2MPS14, S5M8767
>> + 32KhzAP 0 S2MPS11, S2MPS13, S2MPS14, S2MPS15, S5M8767
>> + 32KhzCP 1 S2MPS11, S2MPS13, S2MPS15, S5M8767
>> + 32KhzBT 2 S2MPS11, S2MPS13, S2MPS14, S2MPS15, S5M8767
>>
>> - compatible: Should be one of: "samsung,s2mps11-clk", "samsung,s2mps13-clk",
>> - "samsung,s2mps14-clk", "samsung,s5m8767-clk"
>> + "samsung,s2mps14-clk", "samsung,s2mps15-clk",
>> + "samsung,s5m8767-clk"
>
> Noooo. Why "samsung,s2mps15-clk"?
>
> Adding a new compatible to bindings is a major change so my review tag
> (from v1 where there was no such compatible) should be dropped. Please
> drop it.
>
My bad, will drop it.
> Best regards,
> Krzysztof
>
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v4 2/4] mfd: sec: Add support for S2MPS15 PMIC
2015-10-29 4:58 [PATCH v4 0/4] mfd: sec: add S2MPS15 PMIC support Alim Akhtar
2015-10-29 4:58 ` [PATCH v4 1/4] dt-bindings: mfd: s2mps11: add documentation for s2mps15 PMIC Alim Akhtar
@ 2015-10-29 4:58 ` Alim Akhtar
2015-10-29 8:06 ` Lee Jones
2015-10-29 4:58 ` [PATCH v4 3/4] regulator: s2mps11: add support for S2MPS15 regulators Alim Akhtar
2015-10-29 4:58 ` [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC Alim Akhtar
3 siblings, 1 reply; 20+ messages in thread
From: Alim Akhtar @ 2015-10-29 4:58 UTC (permalink / raw)
To: lee.jones, broonie
Cc: k.kozlowski, linux-samsung-soc, rtc-linux, linux-kernel,
Thomas Abraham
From: Thomas Abraham <thomas.ab@samsung.com>
Add support for S2MPS15 PMIC which is similar to S2MPS11 PMIC. The S2MPS15
PMIC supports 27 LDO regulators, 10 buck regulators, RTC, three 32.768KHz
clock outputs and battery charger. This patch adds initial support for
LDO and buck regulators of S2MPS15 device.
Signed-off-by: Thomas Abraham <thomas.ab@samsung.com>
Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
[Alim: Added s2mps15_devs like rtc and clk and related changes]
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
---
drivers/mfd/sec-core.c | 31 +++++++
drivers/mfd/sec-irq.c | 8 ++
include/linux/mfd/samsung/core.h | 1 +
include/linux/mfd/samsung/s2mps15.h | 158 +++++++++++++++++++++++++++++++++++
4 files changed, 198 insertions(+)
create mode 100644 include/linux/mfd/samsung/s2mps15.h
diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c
index 2626fc0b5b8c..fbb8a5715597 100644
--- a/drivers/mfd/sec-core.c
+++ b/drivers/mfd/sec-core.c
@@ -29,6 +29,7 @@
#include <linux/mfd/samsung/s2mps11.h>
#include <linux/mfd/samsung/s2mps13.h>
#include <linux/mfd/samsung/s2mps14.h>
+#include <linux/mfd/samsung/s2mps15.h>
#include <linux/mfd/samsung/s2mpu02.h>
#include <linux/mfd/samsung/s5m8763.h>
#include <linux/mfd/samsung/s5m8767.h>
@@ -96,6 +97,17 @@ static const struct mfd_cell s2mps14_devs[] = {
}
};
+static const struct mfd_cell s2mps15_devs[] = {
+ {
+ .name = "s2mps15-regulator",
+ }, {
+ .name = "s2mps15-rtc",
+ }, {
+ .name = "s2mps13-clk",
+ .of_compatible = "samsung,s2mps13-clk",
+ },
+};
+
static const struct mfd_cell s2mpa01_devs[] = {
{
.name = "s2mpa01-pmic",
@@ -125,6 +137,9 @@ static const struct of_device_id sec_dt_match[] = {
.compatible = "samsung,s2mps14-pmic",
.data = (void *)S2MPS14X,
}, {
+ .compatible = "samsung,s2mps15-pmic",
+ .data = (void *)S2MPS15X,
+ }, {
.compatible = "samsung,s2mpa01-pmic",
.data = (void *)S2MPA01,
}, {
@@ -226,6 +241,15 @@ static const struct regmap_config s2mps14_regmap_config = {
.cache_type = REGCACHE_FLAT,
};
+static const struct regmap_config s2mps15_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+
+ .max_register = S2MPS15_REG_LDODSCH4,
+ .volatile_reg = s2mps11_volatile,
+ .cache_type = REGCACHE_FLAT,
+};
+
static const struct regmap_config s2mpu02_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
@@ -387,6 +411,9 @@ static int sec_pmic_probe(struct i2c_client *i2c,
case S2MPS14X:
regmap = &s2mps14_regmap_config;
break;
+ case S2MPS15X:
+ regmap = &s2mps15_regmap_config;
+ break;
case S5M8763X:
regmap = &s5m8763_regmap_config;
break;
@@ -445,6 +472,10 @@ static int sec_pmic_probe(struct i2c_client *i2c,
sec_devs = s2mps14_devs;
num_sec_devs = ARRAY_SIZE(s2mps14_devs);
break;
+ case S2MPS15X:
+ sec_devs = s2mps15_devs;
+ num_sec_devs = ARRAY_SIZE(s2mps15_devs);
+ break;
case S2MPU02:
sec_devs = s2mpu02_devs;
num_sec_devs = ARRAY_SIZE(s2mpu02_devs);
diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c
index 806fa8dbb22d..d77de431cc50 100644
--- a/drivers/mfd/sec-irq.c
+++ b/drivers/mfd/sec-irq.c
@@ -407,6 +407,11 @@ static const struct regmap_irq_chip s2mps14_irq_chip = {
S2MPS1X_IRQ_CHIP_COMMON_DATA,
};
+static const struct regmap_irq_chip s2mps15_irq_chip = {
+ .name = "s2mps15",
+ S2MPS1X_IRQ_CHIP_COMMON_DATA,
+};
+
static const struct regmap_irq_chip s2mpu02_irq_chip = {
.name = "s2mpu02",
.irqs = s2mpu02_irqs,
@@ -466,6 +471,9 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
case S2MPS14X:
sec_irq_chip = &s2mps14_irq_chip;
break;
+ case S2MPS15X:
+ sec_irq_chip = &s2mps15_irq_chip;
+ break;
case S2MPU02:
sec_irq_chip = &s2mpu02_irq_chip;
break;
diff --git a/include/linux/mfd/samsung/core.h b/include/linux/mfd/samsung/core.h
index a06098639399..6bc4bcd488ac 100644
--- a/include/linux/mfd/samsung/core.h
+++ b/include/linux/mfd/samsung/core.h
@@ -44,6 +44,7 @@ enum sec_device_type {
S2MPS11X,
S2MPS13X,
S2MPS14X,
+ S2MPS15X,
S2MPU02,
};
diff --git a/include/linux/mfd/samsung/s2mps15.h b/include/linux/mfd/samsung/s2mps15.h
new file mode 100644
index 000000000000..36d35287c3c0
--- /dev/null
+++ b/include/linux/mfd/samsung/s2mps15.h
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd
+ * http://www.samsung.com
+ *
+ * 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
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __LINUX_MFD_S2MPS15_H
+#define __LINUX_MFD_S2MPS15_H
+
+/* S2MPS15 registers */
+enum s2mps15_reg {
+ S2MPS15_REG_ID,
+ S2MPS15_REG_INT1,
+ S2MPS15_REG_INT2,
+ S2MPS15_REG_INT3,
+ S2MPS15_REG_INT1M,
+ S2MPS15_REG_INT2M,
+ S2MPS15_REG_INT3M,
+ S2MPS15_REG_ST1,
+ S2MPS15_REG_ST2,
+ S2MPS15_REG_PWRONSRC,
+ S2MPS15_REG_OFFSRC,
+ S2MPS15_REG_BU_CHG,
+ S2MPS15_REG_RTC_BUF,
+ S2MPS15_REG_CTRL1,
+ S2MPS15_REG_CTRL2,
+ S2MPS15_REG_RSVD1,
+ S2MPS15_REG_RSVD2,
+ S2MPS15_REG_RSVD3,
+ S2MPS15_REG_RSVD4,
+ S2MPS15_REG_RSVD5,
+ S2MPS15_REG_RSVD6,
+ S2MPS15_REG_CTRL3,
+ S2MPS15_REG_RSVD7,
+ S2MPS15_REG_RSVD8,
+ S2MPS15_REG_RSVD9,
+ S2MPS15_REG_B1CTRL1,
+ S2MPS15_REG_B1CTRL2,
+ S2MPS15_REG_B2CTRL1,
+ S2MPS15_REG_B2CTRL2,
+ S2MPS15_REG_B3CTRL1,
+ S2MPS15_REG_B3CTRL2,
+ S2MPS15_REG_B4CTRL1,
+ S2MPS15_REG_B4CTRL2,
+ S2MPS15_REG_B5CTRL1,
+ S2MPS15_REG_B5CTRL2,
+ S2MPS15_REG_B6CTRL1,
+ S2MPS15_REG_B6CTRL2,
+ S2MPS15_REG_B7CTRL1,
+ S2MPS15_REG_B7CTRL2,
+ S2MPS15_REG_B8CTRL1,
+ S2MPS15_REG_B8CTRL2,
+ S2MPS15_REG_B9CTRL1,
+ S2MPS15_REG_B9CTRL2,
+ S2MPS15_REG_B10CTRL1,
+ S2MPS15_REG_B10CTRL2,
+ S2MPS15_REG_BBCTRL1,
+ S2MPS15_REG_BBCTRL2,
+ S2MPS15_REG_BRAMP,
+ S2MPS15_REG_LDODVS1,
+ S2MPS15_REG_LDODVS2,
+ S2MPS15_REG_LDODVS3,
+ S2MPS15_REG_LDODVS4,
+ S2MPS15_REG_L1CTRL,
+ S2MPS15_REG_L2CTRL,
+ S2MPS15_REG_L3CTRL,
+ S2MPS15_REG_L4CTRL,
+ S2MPS15_REG_L5CTRL,
+ S2MPS15_REG_L6CTRL,
+ S2MPS15_REG_L7CTRL,
+ S2MPS15_REG_L8CTRL,
+ S2MPS15_REG_L9CTRL,
+ S2MPS15_REG_L10CTRL,
+ S2MPS15_REG_L11CTRL,
+ S2MPS15_REG_L12CTRL,
+ S2MPS15_REG_L13CTRL,
+ S2MPS15_REG_L14CTRL,
+ S2MPS15_REG_L15CTRL,
+ S2MPS15_REG_L16CTRL,
+ S2MPS15_REG_L17CTRL,
+ S2MPS15_REG_L18CTRL,
+ S2MPS15_REG_L19CTRL,
+ S2MPS15_REG_L20CTRL,
+ S2MPS15_REG_L21CTRL,
+ S2MPS15_REG_L22CTRL,
+ S2MPS15_REG_L23CTRL,
+ S2MPS15_REG_L24CTRL,
+ S2MPS15_REG_L25CTRL,
+ S2MPS15_REG_L26CTRL,
+ S2MPS15_REG_L27CTRL,
+ S2MPS15_REG_LDODSCH1,
+ S2MPS15_REG_LDODSCH2,
+ S2MPS15_REG_LDODSCH3,
+ S2MPS15_REG_LDODSCH4,
+};
+
+/* S2MPS15 regulator ids */
+enum s2mps15_regulators {
+ S2MPS15_LDO1,
+ S2MPS15_LDO2,
+ S2MPS15_LDO3,
+ S2MPS15_LDO4,
+ S2MPS15_LDO5,
+ S2MPS15_LDO6,
+ S2MPS15_LDO7,
+ S2MPS15_LDO8,
+ S2MPS15_LDO9,
+ S2MPS15_LDO10,
+ S2MPS15_LDO11,
+ S2MPS15_LDO12,
+ S2MPS15_LDO13,
+ S2MPS15_LDO14,
+ S2MPS15_LDO15,
+ S2MPS15_LDO16,
+ S2MPS15_LDO17,
+ S2MPS15_LDO18,
+ S2MPS15_LDO19,
+ S2MPS15_LDO20,
+ S2MPS15_LDO21,
+ S2MPS15_LDO22,
+ S2MPS15_LDO23,
+ S2MPS15_LDO24,
+ S2MPS15_LDO25,
+ S2MPS15_LDO26,
+ S2MPS15_LDO27,
+ S2MPS15_BUCK1,
+ S2MPS15_BUCK2,
+ S2MPS15_BUCK3,
+ S2MPS15_BUCK4,
+ S2MPS15_BUCK5,
+ S2MPS15_BUCK6,
+ S2MPS15_BUCK7,
+ S2MPS15_BUCK8,
+ S2MPS15_BUCK9,
+ S2MPS15_BUCK10,
+ S2MPS15_BUCK11,
+ S2MPS15_REGULATOR_MAX,
+};
+
+#define S2MPS15_LDO_VSEL_MASK (0x3F)
+#define S2MPS15_BUCK_VSEL_MASK (0xFF)
+
+#define S2MPS15_ENABLE_SHIFT (0x06)
+#define S2MPS15_ENABLE_MASK (0x03 << S2MPS15_ENABLE_SHIFT)
+
+#define S2MPS15_LDO_N_VOLTAGES (S2MPS15_LDO_VSEL_MASK + 1)
+#define S2MPS15_BUCK_N_VOLTAGES (S2MPS15_BUCK_VSEL_MASK + 1)
+
+#endif /* __LINUX_MFD_S2MPS15_H */
--
1.7.10.4
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v4 2/4] mfd: sec: Add support for S2MPS15 PMIC
2015-10-29 4:58 ` [PATCH v4 2/4] mfd: sec: Add support for S2MPS15 PMIC Alim Akhtar
@ 2015-10-29 8:06 ` Lee Jones
2015-10-29 8:32 ` Alim Akhtar
0 siblings, 1 reply; 20+ messages in thread
From: Lee Jones @ 2015-10-29 8:06 UTC (permalink / raw)
To: Alim Akhtar
Cc: broonie, k.kozlowski, linux-samsung-soc, rtc-linux, linux-kernel,
Thomas Abraham
On Thu, 29 Oct 2015, Alim Akhtar wrote:
> From: Thomas Abraham <thomas.ab@samsung.com>
>
> Add support for S2MPS15 PMIC which is similar to S2MPS11 PMIC. The S2MPS15
> PMIC supports 27 LDO regulators, 10 buck regulators, RTC, three 32.768KHz
> clock outputs and battery charger. This patch adds initial support for
> LDO and buck regulators of S2MPS15 device.
>
> Signed-off-by: Thomas Abraham <thomas.ab@samsung.com>
> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
> [Alim: Added s2mps15_devs like rtc and clk and related changes]
> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
> ---
> drivers/mfd/sec-core.c | 31 +++++++
> drivers/mfd/sec-irq.c | 8 ++
> include/linux/mfd/samsung/core.h | 1 +
> include/linux/mfd/samsung/s2mps15.h | 158 +++++++++++++++++++++++++++++++++++
> 4 files changed, 198 insertions(+)
> create mode 100644 include/linux/mfd/samsung/s2mps15.h
Looks good now.
Acked-by: Lee Jones <lee.jones@linaro.org>
> diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c
> index 2626fc0b5b8c..fbb8a5715597 100644
> --- a/drivers/mfd/sec-core.c
> +++ b/drivers/mfd/sec-core.c
> @@ -29,6 +29,7 @@
> #include <linux/mfd/samsung/s2mps11.h>
> #include <linux/mfd/samsung/s2mps13.h>
> #include <linux/mfd/samsung/s2mps14.h>
> +#include <linux/mfd/samsung/s2mps15.h>
> #include <linux/mfd/samsung/s2mpu02.h>
> #include <linux/mfd/samsung/s5m8763.h>
> #include <linux/mfd/samsung/s5m8767.h>
> @@ -96,6 +97,17 @@ static const struct mfd_cell s2mps14_devs[] = {
> }
> };
>
> +static const struct mfd_cell s2mps15_devs[] = {
> + {
> + .name = "s2mps15-regulator",
> + }, {
> + .name = "s2mps15-rtc",
> + }, {
> + .name = "s2mps13-clk",
> + .of_compatible = "samsung,s2mps13-clk",
> + },
> +};
> +
> static const struct mfd_cell s2mpa01_devs[] = {
> {
> .name = "s2mpa01-pmic",
> @@ -125,6 +137,9 @@ static const struct of_device_id sec_dt_match[] = {
> .compatible = "samsung,s2mps14-pmic",
> .data = (void *)S2MPS14X,
> }, {
> + .compatible = "samsung,s2mps15-pmic",
> + .data = (void *)S2MPS15X,
> + }, {
> .compatible = "samsung,s2mpa01-pmic",
> .data = (void *)S2MPA01,
> }, {
> @@ -226,6 +241,15 @@ static const struct regmap_config s2mps14_regmap_config = {
> .cache_type = REGCACHE_FLAT,
> };
>
> +static const struct regmap_config s2mps15_regmap_config = {
> + .reg_bits = 8,
> + .val_bits = 8,
> +
> + .max_register = S2MPS15_REG_LDODSCH4,
> + .volatile_reg = s2mps11_volatile,
> + .cache_type = REGCACHE_FLAT,
> +};
> +
> static const struct regmap_config s2mpu02_regmap_config = {
> .reg_bits = 8,
> .val_bits = 8,
> @@ -387,6 +411,9 @@ static int sec_pmic_probe(struct i2c_client *i2c,
> case S2MPS14X:
> regmap = &s2mps14_regmap_config;
> break;
> + case S2MPS15X:
> + regmap = &s2mps15_regmap_config;
> + break;
> case S5M8763X:
> regmap = &s5m8763_regmap_config;
> break;
> @@ -445,6 +472,10 @@ static int sec_pmic_probe(struct i2c_client *i2c,
> sec_devs = s2mps14_devs;
> num_sec_devs = ARRAY_SIZE(s2mps14_devs);
> break;
> + case S2MPS15X:
> + sec_devs = s2mps15_devs;
> + num_sec_devs = ARRAY_SIZE(s2mps15_devs);
> + break;
> case S2MPU02:
> sec_devs = s2mpu02_devs;
> num_sec_devs = ARRAY_SIZE(s2mpu02_devs);
> diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c
> index 806fa8dbb22d..d77de431cc50 100644
> --- a/drivers/mfd/sec-irq.c
> +++ b/drivers/mfd/sec-irq.c
> @@ -407,6 +407,11 @@ static const struct regmap_irq_chip s2mps14_irq_chip = {
> S2MPS1X_IRQ_CHIP_COMMON_DATA,
> };
>
> +static const struct regmap_irq_chip s2mps15_irq_chip = {
> + .name = "s2mps15",
> + S2MPS1X_IRQ_CHIP_COMMON_DATA,
> +};
> +
> static const struct regmap_irq_chip s2mpu02_irq_chip = {
> .name = "s2mpu02",
> .irqs = s2mpu02_irqs,
> @@ -466,6 +471,9 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
> case S2MPS14X:
> sec_irq_chip = &s2mps14_irq_chip;
> break;
> + case S2MPS15X:
> + sec_irq_chip = &s2mps15_irq_chip;
> + break;
> case S2MPU02:
> sec_irq_chip = &s2mpu02_irq_chip;
> break;
> diff --git a/include/linux/mfd/samsung/core.h b/include/linux/mfd/samsung/core.h
> index a06098639399..6bc4bcd488ac 100644
> --- a/include/linux/mfd/samsung/core.h
> +++ b/include/linux/mfd/samsung/core.h
> @@ -44,6 +44,7 @@ enum sec_device_type {
> S2MPS11X,
> S2MPS13X,
> S2MPS14X,
> + S2MPS15X,
> S2MPU02,
> };
>
> diff --git a/include/linux/mfd/samsung/s2mps15.h b/include/linux/mfd/samsung/s2mps15.h
> new file mode 100644
> index 000000000000..36d35287c3c0
> --- /dev/null
> +++ b/include/linux/mfd/samsung/s2mps15.h
> @@ -0,0 +1,158 @@
> +/*
> + * Copyright (c) 2015 Samsung Electronics Co., Ltd
> + * http://www.samsung.com
> + *
> + * 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
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + */
> +
> +#ifndef __LINUX_MFD_S2MPS15_H
> +#define __LINUX_MFD_S2MPS15_H
> +
> +/* S2MPS15 registers */
> +enum s2mps15_reg {
> + S2MPS15_REG_ID,
> + S2MPS15_REG_INT1,
> + S2MPS15_REG_INT2,
> + S2MPS15_REG_INT3,
> + S2MPS15_REG_INT1M,
> + S2MPS15_REG_INT2M,
> + S2MPS15_REG_INT3M,
> + S2MPS15_REG_ST1,
> + S2MPS15_REG_ST2,
> + S2MPS15_REG_PWRONSRC,
> + S2MPS15_REG_OFFSRC,
> + S2MPS15_REG_BU_CHG,
> + S2MPS15_REG_RTC_BUF,
> + S2MPS15_REG_CTRL1,
> + S2MPS15_REG_CTRL2,
> + S2MPS15_REG_RSVD1,
> + S2MPS15_REG_RSVD2,
> + S2MPS15_REG_RSVD3,
> + S2MPS15_REG_RSVD4,
> + S2MPS15_REG_RSVD5,
> + S2MPS15_REG_RSVD6,
> + S2MPS15_REG_CTRL3,
> + S2MPS15_REG_RSVD7,
> + S2MPS15_REG_RSVD8,
> + S2MPS15_REG_RSVD9,
> + S2MPS15_REG_B1CTRL1,
> + S2MPS15_REG_B1CTRL2,
> + S2MPS15_REG_B2CTRL1,
> + S2MPS15_REG_B2CTRL2,
> + S2MPS15_REG_B3CTRL1,
> + S2MPS15_REG_B3CTRL2,
> + S2MPS15_REG_B4CTRL1,
> + S2MPS15_REG_B4CTRL2,
> + S2MPS15_REG_B5CTRL1,
> + S2MPS15_REG_B5CTRL2,
> + S2MPS15_REG_B6CTRL1,
> + S2MPS15_REG_B6CTRL2,
> + S2MPS15_REG_B7CTRL1,
> + S2MPS15_REG_B7CTRL2,
> + S2MPS15_REG_B8CTRL1,
> + S2MPS15_REG_B8CTRL2,
> + S2MPS15_REG_B9CTRL1,
> + S2MPS15_REG_B9CTRL2,
> + S2MPS15_REG_B10CTRL1,
> + S2MPS15_REG_B10CTRL2,
> + S2MPS15_REG_BBCTRL1,
> + S2MPS15_REG_BBCTRL2,
> + S2MPS15_REG_BRAMP,
> + S2MPS15_REG_LDODVS1,
> + S2MPS15_REG_LDODVS2,
> + S2MPS15_REG_LDODVS3,
> + S2MPS15_REG_LDODVS4,
> + S2MPS15_REG_L1CTRL,
> + S2MPS15_REG_L2CTRL,
> + S2MPS15_REG_L3CTRL,
> + S2MPS15_REG_L4CTRL,
> + S2MPS15_REG_L5CTRL,
> + S2MPS15_REG_L6CTRL,
> + S2MPS15_REG_L7CTRL,
> + S2MPS15_REG_L8CTRL,
> + S2MPS15_REG_L9CTRL,
> + S2MPS15_REG_L10CTRL,
> + S2MPS15_REG_L11CTRL,
> + S2MPS15_REG_L12CTRL,
> + S2MPS15_REG_L13CTRL,
> + S2MPS15_REG_L14CTRL,
> + S2MPS15_REG_L15CTRL,
> + S2MPS15_REG_L16CTRL,
> + S2MPS15_REG_L17CTRL,
> + S2MPS15_REG_L18CTRL,
> + S2MPS15_REG_L19CTRL,
> + S2MPS15_REG_L20CTRL,
> + S2MPS15_REG_L21CTRL,
> + S2MPS15_REG_L22CTRL,
> + S2MPS15_REG_L23CTRL,
> + S2MPS15_REG_L24CTRL,
> + S2MPS15_REG_L25CTRL,
> + S2MPS15_REG_L26CTRL,
> + S2MPS15_REG_L27CTRL,
> + S2MPS15_REG_LDODSCH1,
> + S2MPS15_REG_LDODSCH2,
> + S2MPS15_REG_LDODSCH3,
> + S2MPS15_REG_LDODSCH4,
> +};
> +
> +/* S2MPS15 regulator ids */
> +enum s2mps15_regulators {
> + S2MPS15_LDO1,
> + S2MPS15_LDO2,
> + S2MPS15_LDO3,
> + S2MPS15_LDO4,
> + S2MPS15_LDO5,
> + S2MPS15_LDO6,
> + S2MPS15_LDO7,
> + S2MPS15_LDO8,
> + S2MPS15_LDO9,
> + S2MPS15_LDO10,
> + S2MPS15_LDO11,
> + S2MPS15_LDO12,
> + S2MPS15_LDO13,
> + S2MPS15_LDO14,
> + S2MPS15_LDO15,
> + S2MPS15_LDO16,
> + S2MPS15_LDO17,
> + S2MPS15_LDO18,
> + S2MPS15_LDO19,
> + S2MPS15_LDO20,
> + S2MPS15_LDO21,
> + S2MPS15_LDO22,
> + S2MPS15_LDO23,
> + S2MPS15_LDO24,
> + S2MPS15_LDO25,
> + S2MPS15_LDO26,
> + S2MPS15_LDO27,
> + S2MPS15_BUCK1,
> + S2MPS15_BUCK2,
> + S2MPS15_BUCK3,
> + S2MPS15_BUCK4,
> + S2MPS15_BUCK5,
> + S2MPS15_BUCK6,
> + S2MPS15_BUCK7,
> + S2MPS15_BUCK8,
> + S2MPS15_BUCK9,
> + S2MPS15_BUCK10,
> + S2MPS15_BUCK11,
> + S2MPS15_REGULATOR_MAX,
> +};
> +
> +#define S2MPS15_LDO_VSEL_MASK (0x3F)
> +#define S2MPS15_BUCK_VSEL_MASK (0xFF)
> +
> +#define S2MPS15_ENABLE_SHIFT (0x06)
> +#define S2MPS15_ENABLE_MASK (0x03 << S2MPS15_ENABLE_SHIFT)
> +
> +#define S2MPS15_LDO_N_VOLTAGES (S2MPS15_LDO_VSEL_MASK + 1)
> +#define S2MPS15_BUCK_N_VOLTAGES (S2MPS15_BUCK_VSEL_MASK + 1)
> +
> +#endif /* __LINUX_MFD_S2MPS15_H */
--
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v4 2/4] mfd: sec: Add support for S2MPS15 PMIC
2015-10-29 8:06 ` Lee Jones
@ 2015-10-29 8:32 ` Alim Akhtar
0 siblings, 0 replies; 20+ messages in thread
From: Alim Akhtar @ 2015-10-29 8:32 UTC (permalink / raw)
To: Lee Jones
Cc: broonie, k.kozlowski, linux-samsung-soc, rtc-linux, linux-kernel,
Thomas Abraham
Hi
On 10/29/2015 01:36 PM, Lee Jones wrote:
> On Thu, 29 Oct 2015, Alim Akhtar wrote:
>
>> From: Thomas Abraham <thomas.ab@samsung.com>
>>
>> Add support for S2MPS15 PMIC which is similar to S2MPS11 PMIC. The S2MPS15
>> PMIC supports 27 LDO regulators, 10 buck regulators, RTC, three 32.768KHz
>> clock outputs and battery charger. This patch adds initial support for
>> LDO and buck regulators of S2MPS15 device.
>>
>> Signed-off-by: Thomas Abraham <thomas.ab@samsung.com>
>> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
>> [Alim: Added s2mps15_devs like rtc and clk and related changes]
>> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
>> ---
>> drivers/mfd/sec-core.c | 31 +++++++
>> drivers/mfd/sec-irq.c | 8 ++
>> include/linux/mfd/samsung/core.h | 1 +
>> include/linux/mfd/samsung/s2mps15.h | 158 +++++++++++++++++++++++++++++++++++
>> 4 files changed, 198 insertions(+)
>> create mode 100644 include/linux/mfd/samsung/s2mps15.h
>
> Looks good now.
>
> Acked-by: Lee Jones <lee.jones@linaro.org>
>
Thanks!!
>> diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c
>> index 2626fc0b5b8c..fbb8a5715597 100644
>> --- a/drivers/mfd/sec-core.c
>> +++ b/drivers/mfd/sec-core.c
>> @@ -29,6 +29,7 @@
>> #include <linux/mfd/samsung/s2mps11.h>
>> #include <linux/mfd/samsung/s2mps13.h>
>> #include <linux/mfd/samsung/s2mps14.h>
>> +#include <linux/mfd/samsung/s2mps15.h>
>> #include <linux/mfd/samsung/s2mpu02.h>
>> #include <linux/mfd/samsung/s5m8763.h>
>> #include <linux/mfd/samsung/s5m8767.h>
>> @@ -96,6 +97,17 @@ static const struct mfd_cell s2mps14_devs[] = {
>> }
>> };
>>
>> +static const struct mfd_cell s2mps15_devs[] = {
>> + {
>> + .name = "s2mps15-regulator",
>> + }, {
>> + .name = "s2mps15-rtc",
>> + }, {
>> + .name = "s2mps13-clk",
>> + .of_compatible = "samsung,s2mps13-clk",
>> + },
>> +};
>> +
>> static const struct mfd_cell s2mpa01_devs[] = {
>> {
>> .name = "s2mpa01-pmic",
>> @@ -125,6 +137,9 @@ static const struct of_device_id sec_dt_match[] = {
>> .compatible = "samsung,s2mps14-pmic",
>> .data = (void *)S2MPS14X,
>> }, {
>> + .compatible = "samsung,s2mps15-pmic",
>> + .data = (void *)S2MPS15X,
>> + }, {
>> .compatible = "samsung,s2mpa01-pmic",
>> .data = (void *)S2MPA01,
>> }, {
>> @@ -226,6 +241,15 @@ static const struct regmap_config s2mps14_regmap_config = {
>> .cache_type = REGCACHE_FLAT,
>> };
>>
>> +static const struct regmap_config s2mps15_regmap_config = {
>> + .reg_bits = 8,
>> + .val_bits = 8,
>> +
>> + .max_register = S2MPS15_REG_LDODSCH4,
>> + .volatile_reg = s2mps11_volatile,
>> + .cache_type = REGCACHE_FLAT,
>> +};
>> +
>> static const struct regmap_config s2mpu02_regmap_config = {
>> .reg_bits = 8,
>> .val_bits = 8,
>> @@ -387,6 +411,9 @@ static int sec_pmic_probe(struct i2c_client *i2c,
>> case S2MPS14X:
>> regmap = &s2mps14_regmap_config;
>> break;
>> + case S2MPS15X:
>> + regmap = &s2mps15_regmap_config;
>> + break;
>> case S5M8763X:
>> regmap = &s5m8763_regmap_config;
>> break;
>> @@ -445,6 +472,10 @@ static int sec_pmic_probe(struct i2c_client *i2c,
>> sec_devs = s2mps14_devs;
>> num_sec_devs = ARRAY_SIZE(s2mps14_devs);
>> break;
>> + case S2MPS15X:
>> + sec_devs = s2mps15_devs;
>> + num_sec_devs = ARRAY_SIZE(s2mps15_devs);
>> + break;
>> case S2MPU02:
>> sec_devs = s2mpu02_devs;
>> num_sec_devs = ARRAY_SIZE(s2mpu02_devs);
>> diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c
>> index 806fa8dbb22d..d77de431cc50 100644
>> --- a/drivers/mfd/sec-irq.c
>> +++ b/drivers/mfd/sec-irq.c
>> @@ -407,6 +407,11 @@ static const struct regmap_irq_chip s2mps14_irq_chip = {
>> S2MPS1X_IRQ_CHIP_COMMON_DATA,
>> };
>>
>> +static const struct regmap_irq_chip s2mps15_irq_chip = {
>> + .name = "s2mps15",
>> + S2MPS1X_IRQ_CHIP_COMMON_DATA,
>> +};
>> +
>> static const struct regmap_irq_chip s2mpu02_irq_chip = {
>> .name = "s2mpu02",
>> .irqs = s2mpu02_irqs,
>> @@ -466,6 +471,9 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
>> case S2MPS14X:
>> sec_irq_chip = &s2mps14_irq_chip;
>> break;
>> + case S2MPS15X:
>> + sec_irq_chip = &s2mps15_irq_chip;
>> + break;
>> case S2MPU02:
>> sec_irq_chip = &s2mpu02_irq_chip;
>> break;
>> diff --git a/include/linux/mfd/samsung/core.h b/include/linux/mfd/samsung/core.h
>> index a06098639399..6bc4bcd488ac 100644
>> --- a/include/linux/mfd/samsung/core.h
>> +++ b/include/linux/mfd/samsung/core.h
>> @@ -44,6 +44,7 @@ enum sec_device_type {
>> S2MPS11X,
>> S2MPS13X,
>> S2MPS14X,
>> + S2MPS15X,
>> S2MPU02,
>> };
>>
>> diff --git a/include/linux/mfd/samsung/s2mps15.h b/include/linux/mfd/samsung/s2mps15.h
>> new file mode 100644
>> index 000000000000..36d35287c3c0
>> --- /dev/null
>> +++ b/include/linux/mfd/samsung/s2mps15.h
>> @@ -0,0 +1,158 @@
>> +/*
>> + * Copyright (c) 2015 Samsung Electronics Co., Ltd
>> + * http://www.samsung.com
>> + *
>> + * 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
>> + * Free Software Foundation; either version 2 of the License, or (at your
>> + * option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + * GNU General Public License for more details.
>> + */
>> +
>> +#ifndef __LINUX_MFD_S2MPS15_H
>> +#define __LINUX_MFD_S2MPS15_H
>> +
>> +/* S2MPS15 registers */
>> +enum s2mps15_reg {
>> + S2MPS15_REG_ID,
>> + S2MPS15_REG_INT1,
>> + S2MPS15_REG_INT2,
>> + S2MPS15_REG_INT3,
>> + S2MPS15_REG_INT1M,
>> + S2MPS15_REG_INT2M,
>> + S2MPS15_REG_INT3M,
>> + S2MPS15_REG_ST1,
>> + S2MPS15_REG_ST2,
>> + S2MPS15_REG_PWRONSRC,
>> + S2MPS15_REG_OFFSRC,
>> + S2MPS15_REG_BU_CHG,
>> + S2MPS15_REG_RTC_BUF,
>> + S2MPS15_REG_CTRL1,
>> + S2MPS15_REG_CTRL2,
>> + S2MPS15_REG_RSVD1,
>> + S2MPS15_REG_RSVD2,
>> + S2MPS15_REG_RSVD3,
>> + S2MPS15_REG_RSVD4,
>> + S2MPS15_REG_RSVD5,
>> + S2MPS15_REG_RSVD6,
>> + S2MPS15_REG_CTRL3,
>> + S2MPS15_REG_RSVD7,
>> + S2MPS15_REG_RSVD8,
>> + S2MPS15_REG_RSVD9,
>> + S2MPS15_REG_B1CTRL1,
>> + S2MPS15_REG_B1CTRL2,
>> + S2MPS15_REG_B2CTRL1,
>> + S2MPS15_REG_B2CTRL2,
>> + S2MPS15_REG_B3CTRL1,
>> + S2MPS15_REG_B3CTRL2,
>> + S2MPS15_REG_B4CTRL1,
>> + S2MPS15_REG_B4CTRL2,
>> + S2MPS15_REG_B5CTRL1,
>> + S2MPS15_REG_B5CTRL2,
>> + S2MPS15_REG_B6CTRL1,
>> + S2MPS15_REG_B6CTRL2,
>> + S2MPS15_REG_B7CTRL1,
>> + S2MPS15_REG_B7CTRL2,
>> + S2MPS15_REG_B8CTRL1,
>> + S2MPS15_REG_B8CTRL2,
>> + S2MPS15_REG_B9CTRL1,
>> + S2MPS15_REG_B9CTRL2,
>> + S2MPS15_REG_B10CTRL1,
>> + S2MPS15_REG_B10CTRL2,
>> + S2MPS15_REG_BBCTRL1,
>> + S2MPS15_REG_BBCTRL2,
>> + S2MPS15_REG_BRAMP,
>> + S2MPS15_REG_LDODVS1,
>> + S2MPS15_REG_LDODVS2,
>> + S2MPS15_REG_LDODVS3,
>> + S2MPS15_REG_LDODVS4,
>> + S2MPS15_REG_L1CTRL,
>> + S2MPS15_REG_L2CTRL,
>> + S2MPS15_REG_L3CTRL,
>> + S2MPS15_REG_L4CTRL,
>> + S2MPS15_REG_L5CTRL,
>> + S2MPS15_REG_L6CTRL,
>> + S2MPS15_REG_L7CTRL,
>> + S2MPS15_REG_L8CTRL,
>> + S2MPS15_REG_L9CTRL,
>> + S2MPS15_REG_L10CTRL,
>> + S2MPS15_REG_L11CTRL,
>> + S2MPS15_REG_L12CTRL,
>> + S2MPS15_REG_L13CTRL,
>> + S2MPS15_REG_L14CTRL,
>> + S2MPS15_REG_L15CTRL,
>> + S2MPS15_REG_L16CTRL,
>> + S2MPS15_REG_L17CTRL,
>> + S2MPS15_REG_L18CTRL,
>> + S2MPS15_REG_L19CTRL,
>> + S2MPS15_REG_L20CTRL,
>> + S2MPS15_REG_L21CTRL,
>> + S2MPS15_REG_L22CTRL,
>> + S2MPS15_REG_L23CTRL,
>> + S2MPS15_REG_L24CTRL,
>> + S2MPS15_REG_L25CTRL,
>> + S2MPS15_REG_L26CTRL,
>> + S2MPS15_REG_L27CTRL,
>> + S2MPS15_REG_LDODSCH1,
>> + S2MPS15_REG_LDODSCH2,
>> + S2MPS15_REG_LDODSCH3,
>> + S2MPS15_REG_LDODSCH4,
>> +};
>> +
>> +/* S2MPS15 regulator ids */
>> +enum s2mps15_regulators {
>> + S2MPS15_LDO1,
>> + S2MPS15_LDO2,
>> + S2MPS15_LDO3,
>> + S2MPS15_LDO4,
>> + S2MPS15_LDO5,
>> + S2MPS15_LDO6,
>> + S2MPS15_LDO7,
>> + S2MPS15_LDO8,
>> + S2MPS15_LDO9,
>> + S2MPS15_LDO10,
>> + S2MPS15_LDO11,
>> + S2MPS15_LDO12,
>> + S2MPS15_LDO13,
>> + S2MPS15_LDO14,
>> + S2MPS15_LDO15,
>> + S2MPS15_LDO16,
>> + S2MPS15_LDO17,
>> + S2MPS15_LDO18,
>> + S2MPS15_LDO19,
>> + S2MPS15_LDO20,
>> + S2MPS15_LDO21,
>> + S2MPS15_LDO22,
>> + S2MPS15_LDO23,
>> + S2MPS15_LDO24,
>> + S2MPS15_LDO25,
>> + S2MPS15_LDO26,
>> + S2MPS15_LDO27,
>> + S2MPS15_BUCK1,
>> + S2MPS15_BUCK2,
>> + S2MPS15_BUCK3,
>> + S2MPS15_BUCK4,
>> + S2MPS15_BUCK5,
>> + S2MPS15_BUCK6,
>> + S2MPS15_BUCK7,
>> + S2MPS15_BUCK8,
>> + S2MPS15_BUCK9,
>> + S2MPS15_BUCK10,
>> + S2MPS15_BUCK11,
>> + S2MPS15_REGULATOR_MAX,
>> +};
>> +
>> +#define S2MPS15_LDO_VSEL_MASK (0x3F)
>> +#define S2MPS15_BUCK_VSEL_MASK (0xFF)
>> +
>> +#define S2MPS15_ENABLE_SHIFT (0x06)
>> +#define S2MPS15_ENABLE_MASK (0x03 << S2MPS15_ENABLE_SHIFT)
>> +
>> +#define S2MPS15_LDO_N_VOLTAGES (S2MPS15_LDO_VSEL_MASK + 1)
>> +#define S2MPS15_BUCK_N_VOLTAGES (S2MPS15_BUCK_VSEL_MASK + 1)
>> +
>> +#endif /* __LINUX_MFD_S2MPS15_H */
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v4 3/4] regulator: s2mps11: add support for S2MPS15 regulators
2015-10-29 4:58 [PATCH v4 0/4] mfd: sec: add S2MPS15 PMIC support Alim Akhtar
2015-10-29 4:58 ` [PATCH v4 1/4] dt-bindings: mfd: s2mps11: add documentation for s2mps15 PMIC Alim Akhtar
2015-10-29 4:58 ` [PATCH v4 2/4] mfd: sec: Add support for S2MPS15 PMIC Alim Akhtar
@ 2015-10-29 4:58 ` Alim Akhtar
2015-10-29 8:08 ` Lee Jones
2015-10-29 4:58 ` [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC Alim Akhtar
3 siblings, 1 reply; 20+ messages in thread
From: Alim Akhtar @ 2015-10-29 4:58 UTC (permalink / raw)
To: lee.jones, broonie
Cc: k.kozlowski, linux-samsung-soc, rtc-linux, linux-kernel,
Thomas Abraham
From: Thomas Abraham <thomas.ab@samsung.com>
The S2MPS15 PMIC is similar in functionality to S2MPS11/14 PMIC. It contains
27 LDO and 10 Buck regulators and allows programming these regulators via a
I2C interface. This patch adds initial support for LDO/Buck regulators of
S2MPS15 PMIC.
Signed-off-by: Thomas Abraham <thomas.ab@samsung.com>
Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
---
drivers/regulator/Kconfig | 4 +-
drivers/regulator/s2mps11.c | 135 ++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 136 insertions(+), 3 deletions(-)
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 64bccff557be..3e3ee5b88b3f 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -588,10 +588,10 @@ config REGULATOR_S2MPA01
via I2C bus. S2MPA01 has 10 Bucks and 26 LDO outputs.
config REGULATOR_S2MPS11
- tristate "Samsung S2MPS11/S2MPS13/S2MPS14/S2MPU02 voltage regulator"
+ tristate "Samsung S2MPS11/13/14/15/S2MPU02 voltage regulator"
depends on MFD_SEC_CORE
help
- This driver supports a Samsung S2MPS11/S2MPS13/S2MPS14/S2MPU02 voltage
+ This driver supports a Samsung S2MPS11/13/14/15/S2MPU02 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 72fc3c32db49..b2f3a28e720c 100644
--- a/drivers/regulator/s2mps11.c
+++ b/drivers/regulator/s2mps11.c
@@ -32,6 +32,7 @@
#include <linux/mfd/samsung/s2mps11.h>
#include <linux/mfd/samsung/s2mps13.h>
#include <linux/mfd/samsung/s2mps14.h>
+#include <linux/mfd/samsung/s2mps15.h>
#include <linux/mfd/samsung/s2mpu02.h>
/* The highest number of possible regulators for supported devices. */
@@ -661,6 +662,133 @@ static const struct regulator_desc s2mps14_regulators[] = {
S2MPS14_BUCK1235_START_SEL),
};
+static struct regulator_ops s2mps15_reg_ldo_ops = {
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_linear_range,
+ .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,
+};
+
+static struct regulator_ops s2mps15_reg_buck_ops = {
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_linear_range,
+ .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,
+};
+
+#define regulator_desc_s2mps15_ldo(num, range) { \
+ .name = "LDO"#num, \
+ .id = S2MPS15_LDO##num, \
+ .ops = &s2mps15_reg_ldo_ops, \
+ .type = REGULATOR_VOLTAGE, \
+ .owner = THIS_MODULE, \
+ .linear_ranges = range, \
+ .n_linear_ranges = ARRAY_SIZE(range), \
+ .n_voltages = S2MPS15_LDO_N_VOLTAGES, \
+ .vsel_reg = S2MPS15_REG_L1CTRL + num - 1, \
+ .vsel_mask = S2MPS15_LDO_VSEL_MASK, \
+ .enable_reg = S2MPS15_REG_L1CTRL + num - 1, \
+ .enable_mask = S2MPS15_ENABLE_MASK \
+}
+
+#define regulator_desc_s2mps15_buck(num, range) { \
+ .name = "BUCK"#num, \
+ .id = S2MPS15_BUCK##num, \
+ .ops = &s2mps15_reg_buck_ops, \
+ .type = REGULATOR_VOLTAGE, \
+ .owner = THIS_MODULE, \
+ .linear_ranges = range, \
+ .n_linear_ranges = ARRAY_SIZE(range), \
+ .ramp_delay = 12500, \
+ .n_voltages = S2MPS15_BUCK_N_VOLTAGES, \
+ .vsel_reg = S2MPS15_REG_B1CTRL2 + ((num - 1) * 2), \
+ .vsel_mask = S2MPS15_BUCK_VSEL_MASK, \
+ .enable_reg = S2MPS15_REG_B1CTRL1 + ((num - 1) * 2), \
+ .enable_mask = S2MPS15_ENABLE_MASK \
+}
+
+/* voltage range for s2mps15 LDO 3, 5, 15, 16, 18, 20, 23 and 27 */
+static const struct regulator_linear_range s2mps15_ldo_voltage_ranges1[] = {
+ REGULATOR_LINEAR_RANGE(1000000, 0xc, 0x38, 25000),
+};
+
+/* voltage range for s2mps15 LDO 2, 6, 14, 17, 19, 21, 24 and 25 */
+static const struct regulator_linear_range s2mps15_ldo_voltage_ranges2[] = {
+ REGULATOR_LINEAR_RANGE(1800000, 0x0, 0x3f, 25000),
+};
+
+/* voltage range for s2mps15 LDO 4, 11, 12, 13, 22 and 26 */
+static const struct regulator_linear_range s2mps15_ldo_voltage_ranges3[] = {
+ REGULATOR_LINEAR_RANGE(700000, 0x0, 0x34, 12500),
+};
+
+/* voltage range for s2mps15 LDO 7, 8, 9 and 10 */
+static const struct regulator_linear_range s2mps15_ldo_voltage_ranges4[] = {
+ REGULATOR_LINEAR_RANGE(700000, 0xc, 0x18, 25000),
+};
+
+/* voltage range for s2mps15 LDO 1 */
+static const struct regulator_linear_range s2mps15_ldo_voltage_ranges5[] = {
+ REGULATOR_LINEAR_RANGE(500000, 0x0, 0x20, 12500),
+};
+
+/* voltage range for s2mps15 BUCK 1, 2, 3, 4, 5, 6 and 7 */
+static const struct regulator_linear_range s2mps15_buck_voltage_ranges1[] = {
+ REGULATOR_LINEAR_RANGE(500000, 0x20, 0xb0, 6250),
+};
+
+/* voltage range for s2mps15 BUCK 8, 9 and 10 */
+static const struct regulator_linear_range s2mps15_buck_voltage_ranges2[] = {
+ REGULATOR_LINEAR_RANGE(1000000, 0x20, 0xc0, 12500),
+};
+
+static const struct regulator_desc s2mps15_regulators[] = {
+ regulator_desc_s2mps15_ldo(1, s2mps15_ldo_voltage_ranges5),
+ regulator_desc_s2mps15_ldo(2, s2mps15_ldo_voltage_ranges2),
+ regulator_desc_s2mps15_ldo(3, s2mps15_ldo_voltage_ranges1),
+ regulator_desc_s2mps15_ldo(4, s2mps15_ldo_voltage_ranges3),
+ regulator_desc_s2mps15_ldo(5, s2mps15_ldo_voltage_ranges1),
+ regulator_desc_s2mps15_ldo(6, s2mps15_ldo_voltage_ranges2),
+ regulator_desc_s2mps15_ldo(7, s2mps15_ldo_voltage_ranges4),
+ regulator_desc_s2mps15_ldo(8, s2mps15_ldo_voltage_ranges4),
+ regulator_desc_s2mps15_ldo(9, s2mps15_ldo_voltage_ranges4),
+ regulator_desc_s2mps15_ldo(10, s2mps15_ldo_voltage_ranges4),
+ regulator_desc_s2mps15_ldo(11, s2mps15_ldo_voltage_ranges3),
+ regulator_desc_s2mps15_ldo(12, s2mps15_ldo_voltage_ranges3),
+ regulator_desc_s2mps15_ldo(13, s2mps15_ldo_voltage_ranges3),
+ regulator_desc_s2mps15_ldo(14, s2mps15_ldo_voltage_ranges2),
+ regulator_desc_s2mps15_ldo(15, s2mps15_ldo_voltage_ranges1),
+ regulator_desc_s2mps15_ldo(16, s2mps15_ldo_voltage_ranges1),
+ regulator_desc_s2mps15_ldo(17, s2mps15_ldo_voltage_ranges2),
+ regulator_desc_s2mps15_ldo(18, s2mps15_ldo_voltage_ranges1),
+ regulator_desc_s2mps15_ldo(19, s2mps15_ldo_voltage_ranges2),
+ regulator_desc_s2mps15_ldo(20, s2mps15_ldo_voltage_ranges1),
+ regulator_desc_s2mps15_ldo(21, s2mps15_ldo_voltage_ranges2),
+ regulator_desc_s2mps15_ldo(22, s2mps15_ldo_voltage_ranges3),
+ regulator_desc_s2mps15_ldo(23, s2mps15_ldo_voltage_ranges1),
+ regulator_desc_s2mps15_ldo(24, s2mps15_ldo_voltage_ranges2),
+ regulator_desc_s2mps15_ldo(25, s2mps15_ldo_voltage_ranges2),
+ regulator_desc_s2mps15_ldo(26, s2mps15_ldo_voltage_ranges3),
+ regulator_desc_s2mps15_ldo(27, s2mps15_ldo_voltage_ranges1),
+ regulator_desc_s2mps15_buck(1, s2mps15_buck_voltage_ranges1),
+ regulator_desc_s2mps15_buck(2, s2mps15_buck_voltage_ranges1),
+ regulator_desc_s2mps15_buck(3, s2mps15_buck_voltage_ranges1),
+ regulator_desc_s2mps15_buck(4, s2mps15_buck_voltage_ranges1),
+ regulator_desc_s2mps15_buck(5, s2mps15_buck_voltage_ranges1),
+ regulator_desc_s2mps15_buck(6, s2mps15_buck_voltage_ranges1),
+ regulator_desc_s2mps15_buck(7, s2mps15_buck_voltage_ranges1),
+ regulator_desc_s2mps15_buck(8, s2mps15_buck_voltage_ranges2),
+ regulator_desc_s2mps15_buck(9, s2mps15_buck_voltage_ranges2),
+ regulator_desc_s2mps15_buck(10, s2mps15_buck_voltage_ranges2),
+};
+
static int s2mps14_pmic_enable_ext_control(struct s2mps11_info *s2mps11,
struct regulator_dev *rdev)
{
@@ -974,6 +1102,10 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
regulators = s2mps14_regulators;
BUILD_BUG_ON(S2MPS_REGULATOR_MAX < s2mps11->rdev_num);
break;
+ case S2MPS15X:
+ s2mps11->rdev_num = ARRAY_SIZE(s2mps15_regulators);
+ regulators = s2mps15_regulators;
+ break;
case S2MPU02:
s2mps11->rdev_num = ARRAY_SIZE(s2mpu02_regulators);
regulators = s2mpu02_regulators;
@@ -1070,6 +1202,7 @@ static const struct platform_device_id s2mps11_pmic_id[] = {
{ "s2mps11-pmic", S2MPS11X},
{ "s2mps13-pmic", S2MPS13X},
{ "s2mps14-pmic", S2MPS14X},
+ { "s2mps15-regulator", S2MPS15X},
{ "s2mpu02-pmic", S2MPU02},
{ },
};
@@ -1097,5 +1230,5 @@ module_exit(s2mps11_pmic_exit);
/* Module information */
MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
-MODULE_DESCRIPTION("SAMSUNG S2MPS11/S2MPS14/S2MPU02 Regulator Driver");
+MODULE_DESCRIPTION("SAMSUNG S2MPS11/S2MPS14/S2MPS15/S2MPU02 Regulator Driver");
MODULE_LICENSE("GPL");
--
1.7.10.4
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v4 3/4] regulator: s2mps11: add support for S2MPS15 regulators
2015-10-29 4:58 ` [PATCH v4 3/4] regulator: s2mps11: add support for S2MPS15 regulators Alim Akhtar
@ 2015-10-29 8:08 ` Lee Jones
2015-10-29 8:13 ` Krzysztof Kozlowski
0 siblings, 1 reply; 20+ messages in thread
From: Lee Jones @ 2015-10-29 8:08 UTC (permalink / raw)
To: Alim Akhtar
Cc: broonie, k.kozlowski, linux-samsung-soc, rtc-linux, linux-kernel,
Thomas Abraham
On Thu, 29 Oct 2015, Alim Akhtar wrote:
> From: Thomas Abraham <thomas.ab@samsung.com>
>
> The S2MPS15 PMIC is similar in functionality to S2MPS11/14 PMIC. It contains
> 27 LDO and 10 Buck regulators and allows programming these regulators via a
> I2C interface. This patch adds initial support for LDO/Buck regulators of
> S2MPS15 PMIC.
>
> Signed-off-by: Thomas Abraham <thomas.ab@samsung.com>
> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
> ---
> drivers/regulator/Kconfig | 4 +-
> drivers/regulator/s2mps11.c | 135 ++++++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 136 insertions(+), 3 deletions(-)
[...]
> @@ -1070,6 +1202,7 @@ static const struct platform_device_id s2mps11_pmic_id[] = {
> { "s2mps11-pmic", S2MPS11X},
> { "s2mps13-pmic", S2MPS13X},
> { "s2mps14-pmic", S2MPS14X},
> + { "s2mps15-regulator", S2MPS15X},
> { "s2mpu02-pmic", S2MPU02},
> { },
> };
Are you going to s/pmic/regulator/ for the existing devices too?
[...]
--
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v4 3/4] regulator: s2mps11: add support for S2MPS15 regulators
2015-10-29 8:08 ` Lee Jones
@ 2015-10-29 8:13 ` Krzysztof Kozlowski
2015-10-29 8:34 ` Alim Akhtar
0 siblings, 1 reply; 20+ messages in thread
From: Krzysztof Kozlowski @ 2015-10-29 8:13 UTC (permalink / raw)
To: Lee Jones, Alim Akhtar
Cc: broonie, linux-samsung-soc, rtc-linux, linux-kernel,
Thomas Abraham
On 29.10.2015 17:08, Lee Jones wrote:
> On Thu, 29 Oct 2015, Alim Akhtar wrote:
>
>> From: Thomas Abraham <thomas.ab@samsung.com>
>>
>> The S2MPS15 PMIC is similar in functionality to S2MPS11/14 PMIC. It contains
>> 27 LDO and 10 Buck regulators and allows programming these regulators via a
>> I2C interface. This patch adds initial support for LDO/Buck regulators of
>> S2MPS15 PMIC.
>>
>> Signed-off-by: Thomas Abraham <thomas.ab@samsung.com>
>> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
>> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
>> ---
>> drivers/regulator/Kconfig | 4 +-
>> drivers/regulator/s2mps11.c | 135 ++++++++++++++++++++++++++++++++++++++++++-
>> 2 files changed, 136 insertions(+), 3 deletions(-)
>
> [...]
>
>> @@ -1070,6 +1202,7 @@ static const struct platform_device_id s2mps11_pmic_id[] = {
>> { "s2mps11-pmic", S2MPS11X},
>> { "s2mps13-pmic", S2MPS13X},
>> { "s2mps14-pmic", S2MPS14X},
>> + { "s2mps15-regulator", S2MPS15X},
>> { "s2mpu02-pmic", S2MPU02},
>> { },
>> };
>
> Are you going to s/pmic/regulator/ for the existing devices too?
Yeah, I expected that as well... but of course it is orthogonal to this
patchset.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v4 3/4] regulator: s2mps11: add support for S2MPS15 regulators
2015-10-29 8:13 ` Krzysztof Kozlowski
@ 2015-10-29 8:34 ` Alim Akhtar
0 siblings, 0 replies; 20+ messages in thread
From: Alim Akhtar @ 2015-10-29 8:34 UTC (permalink / raw)
To: Krzysztof Kozlowski, Lee Jones
Cc: broonie, linux-samsung-soc, rtc-linux, linux-kernel,
Thomas Abraham
Hi,
On 10/29/2015 01:43 PM, Krzysztof Kozlowski wrote:
> On 29.10.2015 17:08, Lee Jones wrote:
>> On Thu, 29 Oct 2015, Alim Akhtar wrote:
>>
>>> From: Thomas Abraham <thomas.ab@samsung.com>
>>>
>>> The S2MPS15 PMIC is similar in functionality to S2MPS11/14 PMIC. It contains
>>> 27 LDO and 10 Buck regulators and allows programming these regulators via a
>>> I2C interface. This patch adds initial support for LDO/Buck regulators of
>>> S2MPS15 PMIC.
>>>
>>> Signed-off-by: Thomas Abraham <thomas.ab@samsung.com>
>>> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
>>> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
>>> ---
>>> drivers/regulator/Kconfig | 4 +-
>>> drivers/regulator/s2mps11.c | 135 ++++++++++++++++++++++++++++++++++++++++++-
>>> 2 files changed, 136 insertions(+), 3 deletions(-)
>>
>> [...]
>>
>>> @@ -1070,6 +1202,7 @@ static const struct platform_device_id s2mps11_pmic_id[] = {
>>> { "s2mps11-pmic", S2MPS11X},
>>> { "s2mps13-pmic", S2MPS13X},
>>> { "s2mps14-pmic", S2MPS14X},
>>> + { "s2mps15-regulator", S2MPS15X},
>>> { "s2mpu02-pmic", S2MPU02},
>>> { },
>>> };
>>
>> Are you going to s/pmic/regulator/ for the existing devices too?
>
> Yeah, I expected that as well... but of course it is orthogonal to this
> patchset.
>
Agree with Krzysztof here. Noted, will send a separate patch to rename
other S2MPxxx-pmic to *-regulator.
> Best regards,
> Krzysztof
>
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC
2015-10-29 4:58 [PATCH v4 0/4] mfd: sec: add S2MPS15 PMIC support Alim Akhtar
` (2 preceding siblings ...)
2015-10-29 4:58 ` [PATCH v4 3/4] regulator: s2mps11: add support for S2MPS15 regulators Alim Akhtar
@ 2015-10-29 4:58 ` Alim Akhtar
2015-10-29 5:07 ` Krzysztof Kozlowski
2015-10-29 5:54 ` Krzysztof Kozlowski
3 siblings, 2 replies; 20+ messages in thread
From: Alim Akhtar @ 2015-10-29 4:58 UTC (permalink / raw)
To: lee.jones, broonie
Cc: k.kozlowski, linux-samsung-soc, rtc-linux, linux-kernel,
Alexandre Belloni
RTC found in s2mps15 is almost same as one found on s2mps14/13
with few differences in RTC_UPDATE register fields, like
bit fields are changed for WUDR and AUDR.
This patch add required changes to enable s2mps15 rtc timer.
Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
---
drivers/rtc/rtc-s5m.c | 20 ++++++++++++++++++--
include/linux/mfd/samsung/rtc.h | 4 ++++
2 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
index f2504b4eef34..0d106a99958f 100644
--- a/drivers/rtc/rtc-s5m.c
+++ b/drivers/rtc/rtc-s5m.c
@@ -188,6 +188,7 @@ static inline int s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info,
ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val);
val &= S5M_ALARM0_STATUS;
break;
+ case S2MPS15X:
case S2MPS14X:
case S2MPS13X:
ret = regmap_read(info->s5m87xx->regmap_pmic, S2MPS14_REG_ST2,
@@ -223,6 +224,9 @@ static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info)
if (info->device_type == S5M8763X || info->device_type == S5M8767X)
data |= S5M_RTC_TIME_EN_MASK;
+ if (info->device_type == S2MPS15X)
+ data |= S2MPS15_RTC_WUDR_MASK;
+
ret = regmap_write(info->regmap, info->regs->rtc_udr_update, data);
if (ret < 0) {
dev_err(info->dev, "failed to write update reg(%d)\n", ret);
@@ -252,6 +256,9 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
case S5M8767X:
data &= ~S5M_RTC_TIME_EN_MASK;
break;
+ case S2MPS15X:
+ data |= S2MPS15_RTC_AUDR_MASK;
+ break;
case S2MPS14X:
data |= S2MPS_RTC_RUDR_MASK;
break;
@@ -275,7 +282,6 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
if (info->device_type == S2MPS13X)
regmap_update_bits(info->regmap, info->regs->rtc_udr_update,
S2MPS13_RTC_AUDR_MASK, 0);
-
return ret;
}
@@ -317,7 +323,8 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
u8 data[info->regs->regs_count];
int ret;
- if (info->device_type == S2MPS14X || info->device_type == S2MPS13X) {
+ if (info->device_type == S2MPS15X || info->device_type == S2MPS14X ||
+ info->device_type == S2MPS13X) {
ret = regmap_update_bits(info->regmap,
info->regs->rtc_udr_update,
S2MPS_RTC_RUDR_MASK, S2MPS_RTC_RUDR_MASK);
@@ -339,6 +346,7 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
break;
case S5M8767X:
+ case S2MPS15X:
case S2MPS14X:
case S2MPS13X:
s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode);
@@ -366,6 +374,7 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
s5m8763_tm_to_data(tm, data);
break;
case S5M8767X:
+ case S2MPS15X:
case S2MPS14X:
case S2MPS13X:
ret = s5m8767_tm_to_data(tm, data);
@@ -414,6 +423,7 @@ static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
break;
case S5M8767X:
+ case S2MPS15X:
case S2MPS14X:
case S2MPS13X:
s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
@@ -463,6 +473,7 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
break;
case S5M8767X:
+ case S2MPS15X:
case S2MPS14X:
case S2MPS13X:
for (i = 0; i < info->regs->regs_count; i++)
@@ -508,6 +519,7 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
break;
case S5M8767X:
+ case S2MPS15X:
case S2MPS14X:
case S2MPS13X:
data[RTC_SEC] |= ALARM_ENABLE_MASK;
@@ -548,6 +560,7 @@ static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
break;
case S5M8767X:
+ case S2MPS15X:
case S2MPS14X:
case S2MPS13X:
s5m8767_tm_to_data(&alrm->time, data);
@@ -631,6 +644,7 @@ static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
ret = regmap_raw_write(info->regmap, S5M_ALARM0_CONF, data, 2);
break;
+ case S2MPS15X:
case S2MPS14X:
case S2MPS13X:
data[0] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
@@ -679,6 +693,7 @@ static int s5m_rtc_probe(struct platform_device *pdev)
return -ENOMEM;
switch (platform_get_device_id(pdev)->driver_data) {
+ case S2MPS15X:
case S2MPS14X:
case S2MPS13X:
regmap_cfg = &s2mps14_rtc_regmap_config;
@@ -805,6 +820,7 @@ static const struct platform_device_id s5m_rtc_id[] = {
{ "s5m-rtc", S5M8767X },
{ "s2mps13-rtc", S2MPS13X },
{ "s2mps14-rtc", S2MPS14X },
+ { "s2mps15-rtc", S2MPS15X },
{ },
};
MODULE_DEVICE_TABLE(platform, s5m_rtc_id);
diff --git a/include/linux/mfd/samsung/rtc.h b/include/linux/mfd/samsung/rtc.h
index 29c30ac36020..0be45fccc52b 100644
--- a/include/linux/mfd/samsung/rtc.h
+++ b/include/linux/mfd/samsung/rtc.h
@@ -107,6 +107,10 @@ enum s2mps_rtc_reg {
#define S2MPS_RTC_WUDR_MASK (1 << S2MPS_RTC_WUDR_SHIFT)
#define S2MPS13_RTC_AUDR_SHIFT 1
#define S2MPS13_RTC_AUDR_MASK (1 << S2MPS13_RTC_AUDR_SHIFT)
+#define S2MPS15_RTC_AUDR_SHIFT 4
+#define S2MPS15_RTC_AUDR_MASK (1 << S2MPS15_RTC_AUDR_SHIFT)
+#define S2MPS15_RTC_WUDR_SHIFT 1
+#define S2MPS15_RTC_WUDR_MASK (1 << S2MPS15_RTC_WUDR_SHIFT)
#define S2MPS_RTC_RUDR_SHIFT 0
#define S2MPS_RTC_RUDR_MASK (1 << S2MPS_RTC_RUDR_SHIFT)
#define RTC_TCON_SHIFT 1
--
1.7.10.4
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC
2015-10-29 4:58 ` [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC Alim Akhtar
@ 2015-10-29 5:07 ` Krzysztof Kozlowski
2015-10-29 5:34 ` Alim Akhtar
2015-10-29 5:54 ` Krzysztof Kozlowski
1 sibling, 1 reply; 20+ messages in thread
From: Krzysztof Kozlowski @ 2015-10-29 5:07 UTC (permalink / raw)
To: Alim Akhtar, lee.jones, broonie
Cc: linux-samsung-soc, rtc-linux, linux-kernel, Alexandre Belloni
On 29.10.2015 13:58, Alim Akhtar wrote:
> RTC found in s2mps15 is almost same as one found on s2mps14/13
> with few differences in RTC_UPDATE register fields, like
> bit fields are changed for WUDR and AUDR.
> This patch add required changes to enable s2mps15 rtc timer.
>
> Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
> ---
> drivers/rtc/rtc-s5m.c | 20 ++++++++++++++++++--
> include/linux/mfd/samsung/rtc.h | 4 ++++
> 2 files changed, 22 insertions(+), 2 deletions(-)
Oh, this is totally different than previous patch and changelog does not
mention these changes.
Was the previous RTC patch tested?
Here the AUDR and WUDR seem to be reversed... oh, that is strange. :)
Best regards,
Krzysztof
>
> diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
> index f2504b4eef34..0d106a99958f 100644
> --- a/drivers/rtc/rtc-s5m.c
> +++ b/drivers/rtc/rtc-s5m.c
> @@ -188,6 +188,7 @@ static inline int s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info,
> ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val);
> val &= S5M_ALARM0_STATUS;
> break;
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> ret = regmap_read(info->s5m87xx->regmap_pmic, S2MPS14_REG_ST2,
> @@ -223,6 +224,9 @@ static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info)
> if (info->device_type == S5M8763X || info->device_type == S5M8767X)
> data |= S5M_RTC_TIME_EN_MASK;
>
> + if (info->device_type == S2MPS15X)
> + data |= S2MPS15_RTC_WUDR_MASK;
> +
> ret = regmap_write(info->regmap, info->regs->rtc_udr_update, data);
> if (ret < 0) {
> dev_err(info->dev, "failed to write update reg(%d)\n", ret);
> @@ -252,6 +256,9 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
> case S5M8767X:
> data &= ~S5M_RTC_TIME_EN_MASK;
> break;
> + case S2MPS15X:
> + data |= S2MPS15_RTC_AUDR_MASK;
> + break;
> case S2MPS14X:
> data |= S2MPS_RTC_RUDR_MASK;
> break;
> @@ -275,7 +282,6 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
> if (info->device_type == S2MPS13X)
> regmap_update_bits(info->regmap, info->regs->rtc_udr_update,
> S2MPS13_RTC_AUDR_MASK, 0);
> -
> return ret;
> }
>
> @@ -317,7 +323,8 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
> u8 data[info->regs->regs_count];
> int ret;
>
> - if (info->device_type == S2MPS14X || info->device_type == S2MPS13X) {
> + if (info->device_type == S2MPS15X || info->device_type == S2MPS14X ||
> + info->device_type == S2MPS13X) {
> ret = regmap_update_bits(info->regmap,
> info->regs->rtc_udr_update,
> S2MPS_RTC_RUDR_MASK, S2MPS_RTC_RUDR_MASK);
> @@ -339,6 +346,7 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
> break;
>
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode);
> @@ -366,6 +374,7 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
> s5m8763_tm_to_data(tm, data);
> break;
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> ret = s5m8767_tm_to_data(tm, data);
> @@ -414,6 +423,7 @@ static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
> break;
>
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
> @@ -463,6 +473,7 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
> break;
>
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> for (i = 0; i < info->regs->regs_count; i++)
> @@ -508,6 +519,7 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
> break;
>
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> data[RTC_SEC] |= ALARM_ENABLE_MASK;
> @@ -548,6 +560,7 @@ static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
> break;
>
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> s5m8767_tm_to_data(&alrm->time, data);
> @@ -631,6 +644,7 @@ static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
> ret = regmap_raw_write(info->regmap, S5M_ALARM0_CONF, data, 2);
> break;
>
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> data[0] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
> @@ -679,6 +693,7 @@ static int s5m_rtc_probe(struct platform_device *pdev)
> return -ENOMEM;
>
> switch (platform_get_device_id(pdev)->driver_data) {
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> regmap_cfg = &s2mps14_rtc_regmap_config;
> @@ -805,6 +820,7 @@ static const struct platform_device_id s5m_rtc_id[] = {
> { "s5m-rtc", S5M8767X },
> { "s2mps13-rtc", S2MPS13X },
> { "s2mps14-rtc", S2MPS14X },
> + { "s2mps15-rtc", S2MPS15X },
> { },
> };
> MODULE_DEVICE_TABLE(platform, s5m_rtc_id);
> diff --git a/include/linux/mfd/samsung/rtc.h b/include/linux/mfd/samsung/rtc.h
> index 29c30ac36020..0be45fccc52b 100644
> --- a/include/linux/mfd/samsung/rtc.h
> +++ b/include/linux/mfd/samsung/rtc.h
> @@ -107,6 +107,10 @@ enum s2mps_rtc_reg {
> #define S2MPS_RTC_WUDR_MASK (1 << S2MPS_RTC_WUDR_SHIFT)
> #define S2MPS13_RTC_AUDR_SHIFT 1
> #define S2MPS13_RTC_AUDR_MASK (1 << S2MPS13_RTC_AUDR_SHIFT)
> +#define S2MPS15_RTC_AUDR_SHIFT 4
> +#define S2MPS15_RTC_AUDR_MASK (1 << S2MPS15_RTC_AUDR_SHIFT)
> +#define S2MPS15_RTC_WUDR_SHIFT 1
> +#define S2MPS15_RTC_WUDR_MASK (1 << S2MPS15_RTC_WUDR_SHIFT)
> #define S2MPS_RTC_RUDR_SHIFT 0
> #define S2MPS_RTC_RUDR_MASK (1 << S2MPS_RTC_RUDR_SHIFT)
> #define RTC_TCON_SHIFT 1
>
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC
2015-10-29 5:07 ` Krzysztof Kozlowski
@ 2015-10-29 5:34 ` Alim Akhtar
0 siblings, 0 replies; 20+ messages in thread
From: Alim Akhtar @ 2015-10-29 5:34 UTC (permalink / raw)
To: Krzysztof Kozlowski, lee.jones, broonie
Cc: linux-samsung-soc, rtc-linux, linux-kernel, Alexandre Belloni
On 10/29/2015 10:37 AM, Krzysztof Kozlowski wrote:
> On 29.10.2015 13:58, Alim Akhtar wrote:
>> RTC found in s2mps15 is almost same as one found on s2mps14/13
>> with few differences in RTC_UPDATE register fields, like
>> bit fields are changed for WUDR and AUDR.
>> This patch add required changes to enable s2mps15 rtc timer.
>>
>> Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
>> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
>> ---
>> drivers/rtc/rtc-s5m.c | 20 ++++++++++++++++++--
>> include/linux/mfd/samsung/rtc.h | 4 ++++
>> 2 files changed, 22 insertions(+), 2 deletions(-)
>
>
> Oh, this is totally different than previous patch and changelog does not
> mention these changes.
>
I am still learning to make thing more correct in first attempt, these
input will help :-), thanks.
> Was the previous RTC patch tested?
Yes, it was tested, but the coverage was limited to wakealarm.
Now I have tested wakealarm and setting hw clock date/time using hwclock
utility, setting system time/date to rtc and visa-versa, both works as
expected.
> Here the AUDR and WUDR seem to be reversed... oh, that is strange. :)
>
Yah, indeed this was a surprised for me also, but this how it is
implemented in s2mps15.
> Best regards,
> Krzysztof
>
>>
>> diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
>> index f2504b4eef34..0d106a99958f 100644
>> --- a/drivers/rtc/rtc-s5m.c
>> +++ b/drivers/rtc/rtc-s5m.c
>> @@ -188,6 +188,7 @@ static inline int s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info,
>> ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val);
>> val &= S5M_ALARM0_STATUS;
>> break;
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> ret = regmap_read(info->s5m87xx->regmap_pmic, S2MPS14_REG_ST2,
>> @@ -223,6 +224,9 @@ static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info)
>> if (info->device_type == S5M8763X || info->device_type == S5M8767X)
>> data |= S5M_RTC_TIME_EN_MASK;
>>
>> + if (info->device_type == S2MPS15X)
>> + data |= S2MPS15_RTC_WUDR_MASK;
>> +
>> ret = regmap_write(info->regmap, info->regs->rtc_udr_update, data);
>> if (ret < 0) {
>> dev_err(info->dev, "failed to write update reg(%d)\n", ret);
>> @@ -252,6 +256,9 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
>> case S5M8767X:
>> data &= ~S5M_RTC_TIME_EN_MASK;
>> break;
>> + case S2MPS15X:
>> + data |= S2MPS15_RTC_AUDR_MASK;
>> + break;
>> case S2MPS14X:
>> data |= S2MPS_RTC_RUDR_MASK;
>> break;
>> @@ -275,7 +282,6 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
>> if (info->device_type == S2MPS13X)
>> regmap_update_bits(info->regmap, info->regs->rtc_udr_update,
>> S2MPS13_RTC_AUDR_MASK, 0);
>> -
>> return ret;
>> }
>>
>> @@ -317,7 +323,8 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
>> u8 data[info->regs->regs_count];
>> int ret;
>>
>> - if (info->device_type == S2MPS14X || info->device_type == S2MPS13X) {
>> + if (info->device_type == S2MPS15X || info->device_type == S2MPS14X ||
>> + info->device_type == S2MPS13X) {
>> ret = regmap_update_bits(info->regmap,
>> info->regs->rtc_udr_update,
>> S2MPS_RTC_RUDR_MASK, S2MPS_RTC_RUDR_MASK);
>> @@ -339,6 +346,7 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
>> break;
>>
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode);
>> @@ -366,6 +374,7 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
>> s5m8763_tm_to_data(tm, data);
>> break;
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> ret = s5m8767_tm_to_data(tm, data);
>> @@ -414,6 +423,7 @@ static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
>> break;
>>
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
>> @@ -463,6 +473,7 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
>> break;
>>
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> for (i = 0; i < info->regs->regs_count; i++)
>> @@ -508,6 +519,7 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
>> break;
>>
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> data[RTC_SEC] |= ALARM_ENABLE_MASK;
>> @@ -548,6 +560,7 @@ static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
>> break;
>>
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> s5m8767_tm_to_data(&alrm->time, data);
>> @@ -631,6 +644,7 @@ static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
>> ret = regmap_raw_write(info->regmap, S5M_ALARM0_CONF, data, 2);
>> break;
>>
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> data[0] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
>> @@ -679,6 +693,7 @@ static int s5m_rtc_probe(struct platform_device *pdev)
>> return -ENOMEM;
>>
>> switch (platform_get_device_id(pdev)->driver_data) {
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> regmap_cfg = &s2mps14_rtc_regmap_config;
>> @@ -805,6 +820,7 @@ static const struct platform_device_id s5m_rtc_id[] = {
>> { "s5m-rtc", S5M8767X },
>> { "s2mps13-rtc", S2MPS13X },
>> { "s2mps14-rtc", S2MPS14X },
>> + { "s2mps15-rtc", S2MPS15X },
>> { },
>> };
>> MODULE_DEVICE_TABLE(platform, s5m_rtc_id);
>> diff --git a/include/linux/mfd/samsung/rtc.h b/include/linux/mfd/samsung/rtc.h
>> index 29c30ac36020..0be45fccc52b 100644
>> --- a/include/linux/mfd/samsung/rtc.h
>> +++ b/include/linux/mfd/samsung/rtc.h
>> @@ -107,6 +107,10 @@ enum s2mps_rtc_reg {
>> #define S2MPS_RTC_WUDR_MASK (1 << S2MPS_RTC_WUDR_SHIFT)
>> #define S2MPS13_RTC_AUDR_SHIFT 1
>> #define S2MPS13_RTC_AUDR_MASK (1 << S2MPS13_RTC_AUDR_SHIFT)
>> +#define S2MPS15_RTC_AUDR_SHIFT 4
>> +#define S2MPS15_RTC_AUDR_MASK (1 << S2MPS15_RTC_AUDR_SHIFT)
>> +#define S2MPS15_RTC_WUDR_SHIFT 1
>> +#define S2MPS15_RTC_WUDR_MASK (1 << S2MPS15_RTC_WUDR_SHIFT)
>> #define S2MPS_RTC_RUDR_SHIFT 0
>> #define S2MPS_RTC_RUDR_MASK (1 << S2MPS_RTC_RUDR_SHIFT)
>> #define RTC_TCON_SHIFT 1
>>
>
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC
2015-10-29 4:58 ` [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC Alim Akhtar
2015-10-29 5:07 ` Krzysztof Kozlowski
@ 2015-10-29 5:54 ` Krzysztof Kozlowski
2015-10-29 7:47 ` Alim Akhtar
1 sibling, 1 reply; 20+ messages in thread
From: Krzysztof Kozlowski @ 2015-10-29 5:54 UTC (permalink / raw)
To: Alim Akhtar, lee.jones, broonie
Cc: linux-samsung-soc, rtc-linux, linux-kernel, Alexandre Belloni
On 29.10.2015 13:58, Alim Akhtar wrote:
> RTC found in s2mps15 is almost same as one found on s2mps14/13
> with few differences in RTC_UPDATE register fields, like
> bit fields are changed for WUDR and AUDR.
> This patch add required changes to enable s2mps15 rtc timer.
>
> Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
> ---
> drivers/rtc/rtc-s5m.c | 20 ++++++++++++++++++--
> include/linux/mfd/samsung/rtc.h | 4 ++++
> 2 files changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
> index f2504b4eef34..0d106a99958f 100644
> --- a/drivers/rtc/rtc-s5m.c
> +++ b/drivers/rtc/rtc-s5m.c
> @@ -188,6 +188,7 @@ static inline int s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info,
> ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val);
> val &= S5M_ALARM0_STATUS;
> break;
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> ret = regmap_read(info->s5m87xx->regmap_pmic, S2MPS14_REG_ST2,
> @@ -223,6 +224,9 @@ static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info)
> if (info->device_type == S5M8763X || info->device_type == S5M8767X)
> data |= S5M_RTC_TIME_EN_MASK;
>
> + if (info->device_type == S2MPS15X)
> + data |= S2MPS15_RTC_WUDR_MASK;
> +
You are setting here bit 1 and bit 4. However vendor code sets only bit
4 (called WUDR there). That's confusing. Why the difference? Or maybe I
am looking at wrong vendor tree (SM-G920F)?
> ret = regmap_write(info->regmap, info->regs->rtc_udr_update, data);
> if (ret < 0) {
> dev_err(info->dev, "failed to write update reg(%d)\n", ret);
> @@ -252,6 +256,9 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
> case S5M8767X:
> data &= ~S5M_RTC_TIME_EN_MASK;
> break;
> + case S2MPS15X:
> + data |= S2MPS15_RTC_AUDR_MASK;
> + break;
> case S2MPS14X:
> data |= S2MPS_RTC_RUDR_MASK;
> break;
Another difference: you are setting here exactly the same values as
S2MPS13 - bit 1 and bit 4. However vendor code sets only bit 4 (called
WUDR there)?
What exactly is necessary to update alarm and time registers on S2MPS15?
> @@ -275,7 +282,6 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
> if (info->device_type == S2MPS13X)
> regmap_update_bits(info->regmap, info->regs->rtc_udr_update,
> S2MPS13_RTC_AUDR_MASK, 0);
> -
This is not related to the patch.
Best regards,
Krzysztof
> return ret;
> }
>
> @@ -317,7 +323,8 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
> u8 data[info->regs->regs_count];
> int ret;
>
> - if (info->device_type == S2MPS14X || info->device_type == S2MPS13X) {
> + if (info->device_type == S2MPS15X || info->device_type == S2MPS14X ||
> + info->device_type == S2MPS13X) {
> ret = regmap_update_bits(info->regmap,
> info->regs->rtc_udr_update,
> S2MPS_RTC_RUDR_MASK, S2MPS_RTC_RUDR_MASK);
> @@ -339,6 +346,7 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
> break;
>
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode);
> @@ -366,6 +374,7 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
> s5m8763_tm_to_data(tm, data);
> break;
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> ret = s5m8767_tm_to_data(tm, data);
> @@ -414,6 +423,7 @@ static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
> break;
>
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
> @@ -463,6 +473,7 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
> break;
>
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> for (i = 0; i < info->regs->regs_count; i++)
> @@ -508,6 +519,7 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
> break;
>
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> data[RTC_SEC] |= ALARM_ENABLE_MASK;
> @@ -548,6 +560,7 @@ static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
> break;
>
> case S5M8767X:
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> s5m8767_tm_to_data(&alrm->time, data);
> @@ -631,6 +644,7 @@ static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
> ret = regmap_raw_write(info->regmap, S5M_ALARM0_CONF, data, 2);
> break;
>
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> data[0] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
> @@ -679,6 +693,7 @@ static int s5m_rtc_probe(struct platform_device *pdev)
> return -ENOMEM;
>
> switch (platform_get_device_id(pdev)->driver_data) {
> + case S2MPS15X:
> case S2MPS14X:
> case S2MPS13X:
> regmap_cfg = &s2mps14_rtc_regmap_config;
> @@ -805,6 +820,7 @@ static const struct platform_device_id s5m_rtc_id[] = {
> { "s5m-rtc", S5M8767X },
> { "s2mps13-rtc", S2MPS13X },
> { "s2mps14-rtc", S2MPS14X },
> + { "s2mps15-rtc", S2MPS15X },
> { },
> };
> MODULE_DEVICE_TABLE(platform, s5m_rtc_id);
> diff --git a/include/linux/mfd/samsung/rtc.h b/include/linux/mfd/samsung/rtc.h
> index 29c30ac36020..0be45fccc52b 100644
> --- a/include/linux/mfd/samsung/rtc.h
> +++ b/include/linux/mfd/samsung/rtc.h
> @@ -107,6 +107,10 @@ enum s2mps_rtc_reg {
> #define S2MPS_RTC_WUDR_MASK (1 << S2MPS_RTC_WUDR_SHIFT)
> #define S2MPS13_RTC_AUDR_SHIFT 1
> #define S2MPS13_RTC_AUDR_MASK (1 << S2MPS13_RTC_AUDR_SHIFT)
> +#define S2MPS15_RTC_AUDR_SHIFT 4
> +#define S2MPS15_RTC_AUDR_MASK (1 << S2MPS15_RTC_AUDR_SHIFT)
> +#define S2MPS15_RTC_WUDR_SHIFT 1
> +#define S2MPS15_RTC_WUDR_MASK (1 << S2MPS15_RTC_WUDR_SHIFT)
> #define S2MPS_RTC_RUDR_SHIFT 0
> #define S2MPS_RTC_RUDR_MASK (1 << S2MPS_RTC_RUDR_SHIFT)
> #define RTC_TCON_SHIFT 1
>
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC
2015-10-29 5:54 ` Krzysztof Kozlowski
@ 2015-10-29 7:47 ` Alim Akhtar
2015-10-29 11:03 ` Krzysztof Kozlowski
0 siblings, 1 reply; 20+ messages in thread
From: Alim Akhtar @ 2015-10-29 7:47 UTC (permalink / raw)
To: Krzysztof Kozlowski, lee.jones, broonie
Cc: linux-samsung-soc, rtc-linux, linux-kernel, Alexandre Belloni
Hello Krzysztof,
On 10/29/2015 11:24 AM, Krzysztof Kozlowski wrote:
> On 29.10.2015 13:58, Alim Akhtar wrote:
>> RTC found in s2mps15 is almost same as one found on s2mps14/13
>> with few differences in RTC_UPDATE register fields, like
>> bit fields are changed for WUDR and AUDR.
>> This patch add required changes to enable s2mps15 rtc timer.
>>
>> Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
>> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
>> ---
>> drivers/rtc/rtc-s5m.c | 20 ++++++++++++++++++--
>> include/linux/mfd/samsung/rtc.h | 4 ++++
>> 2 files changed, 22 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
>> index f2504b4eef34..0d106a99958f 100644
>> --- a/drivers/rtc/rtc-s5m.c
>> +++ b/drivers/rtc/rtc-s5m.c
>> @@ -188,6 +188,7 @@ static inline int s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info,
>> ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val);
>> val &= S5M_ALARM0_STATUS;
>> break;
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> ret = regmap_read(info->s5m87xx->regmap_pmic, S2MPS14_REG_ST2,
>> @@ -223,6 +224,9 @@ static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info)
>> if (info->device_type == S5M8763X || info->device_type == S5M8767X)
>> data |= S5M_RTC_TIME_EN_MASK;
>>
>> + if (info->device_type == S2MPS15X)
>> + data |= S2MPS15_RTC_WUDR_MASK;
>> +
>
>
> You are setting here bit 1 and bit 4. However vendor code sets only bit
> 4 (called WUDR there). That's confusing. Why the difference? Or maybe I
> am looking at wrong vendor tree (SM-G920F)?
>
Sorry, I don't have access to vendor code that you are looking into, so
won't be able to comment on that.
I am testing this patch before sending them, what I have found is if you
don't update WUDR the time does not changes in rtc.
e.g.
if you don't do above changes then you will see below:
-----
# date --set="Oct 29 14:10:40 2015" <update the a new date>
Thu Oct 29 14:10:40 UTC 2015
#
# hwclock --systohc <copy system clock to hardware clock/rtc>
# hwclock <read back hwclock>
Thu Oct 29 12:52:32 2015 .922889 seconds
----
which is not excepted.
And with the above change I see:
----
# date --set="Oct 29 14:30:10 2015" <update the a new date>
Thu Oct 29 14:30:10 UTC 2015
# date
Thu Oct 29 14:30:12 UTC 2015
# hwclock --systohc <copy system clock to hardware clock/rtc>
# hwclock <read back hwclock>
Thu Oct 29 14:30:21 2015 .333006 seconds
----
Which is as expected.
>> ret = regmap_write(info->regmap, info->regs->rtc_udr_update, data);
>> if (ret < 0) {
>> dev_err(info->dev, "failed to write update reg(%d)\n", ret);
>> @@ -252,6 +256,9 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
>> case S5M8767X:
>> data &= ~S5M_RTC_TIME_EN_MASK;
>> break;
>> + case S2MPS15X:
>> + data |= S2MPS15_RTC_AUDR_MASK;
>> + break;
>> case S2MPS14X:
>> data |= S2MPS_RTC_RUDR_MASK;
>> break;
>
> Another difference: you are setting here exactly the same values as
> S2MPS13 - bit 1 and bit 4. However vendor code sets only bit 4 (called
> WUDR there)?
>
No they are not, AUDR on s2mps13 is bit:1 where as it is bit:4 on s2mps15.
> What exactly is necessary to update alarm and time registers on S2MPS15?
>
As explained above in example, it is required to update the 'write alarm
buffer(AUDR)' and 'write time buffer(WUDR)' bits in-order to get rtc
working.
>> @@ -275,7 +282,6 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
>> if (info->device_type == S2MPS13X)
>> regmap_update_bits(info->regmap, info->regs->rtc_udr_update,
>> S2MPS13_RTC_AUDR_MASK, 0);
>> -
>
> This is not related to the patch.
>
uhh...will change.
> Best regards,
> Krzysztof
>
Thanks again.
>
>> return ret;
>> }
>>
>> @@ -317,7 +323,8 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
>> u8 data[info->regs->regs_count];
>> int ret;
>>
>> - if (info->device_type == S2MPS14X || info->device_type == S2MPS13X) {
>> + if (info->device_type == S2MPS15X || info->device_type == S2MPS14X ||
>> + info->device_type == S2MPS13X) {
>> ret = regmap_update_bits(info->regmap,
>> info->regs->rtc_udr_update,
>> S2MPS_RTC_RUDR_MASK, S2MPS_RTC_RUDR_MASK);
>> @@ -339,6 +346,7 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
>> break;
>>
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode);
>> @@ -366,6 +374,7 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
>> s5m8763_tm_to_data(tm, data);
>> break;
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> ret = s5m8767_tm_to_data(tm, data);
>> @@ -414,6 +423,7 @@ static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
>> break;
>>
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
>> @@ -463,6 +473,7 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
>> break;
>>
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> for (i = 0; i < info->regs->regs_count; i++)
>> @@ -508,6 +519,7 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
>> break;
>>
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> data[RTC_SEC] |= ALARM_ENABLE_MASK;
>> @@ -548,6 +560,7 @@ static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
>> break;
>>
>> case S5M8767X:
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> s5m8767_tm_to_data(&alrm->time, data);
>> @@ -631,6 +644,7 @@ static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
>> ret = regmap_raw_write(info->regmap, S5M_ALARM0_CONF, data, 2);
>> break;
>>
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> data[0] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
>> @@ -679,6 +693,7 @@ static int s5m_rtc_probe(struct platform_device *pdev)
>> return -ENOMEM;
>>
>> switch (platform_get_device_id(pdev)->driver_data) {
>> + case S2MPS15X:
>> case S2MPS14X:
>> case S2MPS13X:
>> regmap_cfg = &s2mps14_rtc_regmap_config;
>> @@ -805,6 +820,7 @@ static const struct platform_device_id s5m_rtc_id[] = {
>> { "s5m-rtc", S5M8767X },
>> { "s2mps13-rtc", S2MPS13X },
>> { "s2mps14-rtc", S2MPS14X },
>> + { "s2mps15-rtc", S2MPS15X },
>> { },
>> };
>> MODULE_DEVICE_TABLE(platform, s5m_rtc_id);
>> diff --git a/include/linux/mfd/samsung/rtc.h b/include/linux/mfd/samsung/rtc.h
>> index 29c30ac36020..0be45fccc52b 100644
>> --- a/include/linux/mfd/samsung/rtc.h
>> +++ b/include/linux/mfd/samsung/rtc.h
>> @@ -107,6 +107,10 @@ enum s2mps_rtc_reg {
>> #define S2MPS_RTC_WUDR_MASK (1 << S2MPS_RTC_WUDR_SHIFT)
>> #define S2MPS13_RTC_AUDR_SHIFT 1
>> #define S2MPS13_RTC_AUDR_MASK (1 << S2MPS13_RTC_AUDR_SHIFT)
>> +#define S2MPS15_RTC_AUDR_SHIFT 4
>> +#define S2MPS15_RTC_AUDR_MASK (1 << S2MPS15_RTC_AUDR_SHIFT)
>> +#define S2MPS15_RTC_WUDR_SHIFT 1
>> +#define S2MPS15_RTC_WUDR_MASK (1 << S2MPS15_RTC_WUDR_SHIFT)
>> #define S2MPS_RTC_RUDR_SHIFT 0
>> #define S2MPS_RTC_RUDR_MASK (1 << S2MPS_RTC_RUDR_SHIFT)
>> #define RTC_TCON_SHIFT 1
>>
>
>
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC
2015-10-29 7:47 ` Alim Akhtar
@ 2015-10-29 11:03 ` Krzysztof Kozlowski
2015-10-29 11:20 ` Alim Akhtar
0 siblings, 1 reply; 20+ messages in thread
From: Krzysztof Kozlowski @ 2015-10-29 11:03 UTC (permalink / raw)
To: Alim Akhtar
Cc: Krzysztof Kozlowski, lee.jones, broonie, linux-samsung-soc,
rtc-linux, linux-kernel, Alexandre Belloni
2015-10-29 16:47 GMT+09:00 Alim Akhtar <alim.akhtar@samsung.com>:
> Hello Krzysztof,
>
>
> On 10/29/2015 11:24 AM, Krzysztof Kozlowski wrote:
>>
>> On 29.10.2015 13:58, Alim Akhtar wrote:
>>>
>>> RTC found in s2mps15 is almost same as one found on s2mps14/13
>>> with few differences in RTC_UPDATE register fields, like
>>> bit fields are changed for WUDR and AUDR.
>>> This patch add required changes to enable s2mps15 rtc timer.
>>>
>>> Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
>>> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
>>> ---
>>> drivers/rtc/rtc-s5m.c | 20 ++++++++++++++++++--
>>> include/linux/mfd/samsung/rtc.h | 4 ++++
>>> 2 files changed, 22 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
>>> index f2504b4eef34..0d106a99958f 100644
>>> --- a/drivers/rtc/rtc-s5m.c
>>> +++ b/drivers/rtc/rtc-s5m.c
>>> @@ -188,6 +188,7 @@ static inline int
>>> s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info,
>>> ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val);
>>> val &= S5M_ALARM0_STATUS;
>>> break;
>>> + case S2MPS15X:
>>> case S2MPS14X:
>>> case S2MPS13X:
>>> ret = regmap_read(info->s5m87xx->regmap_pmic,
>>> S2MPS14_REG_ST2,
>>> @@ -223,6 +224,9 @@ static inline int s5m8767_rtc_set_time_reg(struct
>>> s5m_rtc_info *info)
>>> if (info->device_type == S5M8763X || info->device_type ==
>>> S5M8767X)
>>> data |= S5M_RTC_TIME_EN_MASK;
>>>
>>> + if (info->device_type == S2MPS15X)
>>> + data |= S2MPS15_RTC_WUDR_MASK;
>>> +
>>
>>
>>
>> You are setting here bit 1 and bit 4. However vendor code sets only bit
>> 4 (called WUDR there). That's confusing. Why the difference? Or maybe I
>> am looking at wrong vendor tree (SM-G920F)?
>>
> Sorry, I don't have access to vendor code that you are looking into, so
> won't be able to comment on that.
Everyone have the access. It is on opensource.samsung.com, as required by GPL.
>
> I am testing this patch before sending them, what I have found is if you
> don't update WUDR the time does not changes in rtc.
> e.g.
> if you don't do above changes then you will see below:
> -----
> # date --set="Oct 29 14:10:40 2015" <update the a new date>
> Thu Oct 29 14:10:40 UTC 2015
> #
> # hwclock --systohc <copy system clock to hardware clock/rtc>
> # hwclock <read back hwclock>
> Thu Oct 29 12:52:32 2015 .922889 seconds
> ----
> which is not excepted.
>
> And with the above change I see:
>
> ----
> # date --set="Oct 29 14:30:10 2015" <update the a new date>
> Thu Oct 29 14:30:10 UTC 2015
> # date
> Thu Oct 29 14:30:12 UTC 2015
> # hwclock --systohc <copy system clock to hardware clock/rtc>
> # hwclock <read back hwclock>
> Thu Oct 29 14:30:21 2015 .333006 seconds
> ----
>
> Which is as expected.
Okay, but I said that vendor is setting only WUDR which is bit 4. You
are setting bit 1 and bit 4. Your reply - about the need of setting
WUDR (bit 4 I guess) - does not explain my concerns. Do you have to
set bit 1?
>
>>> ret = regmap_write(info->regmap, info->regs->rtc_udr_update,
>>> data);
>>> if (ret < 0) {
>>> dev_err(info->dev, "failed to write update reg(%d)\n",
>>> ret);
>>> @@ -252,6 +256,9 @@ static inline int s5m8767_rtc_set_alarm_reg(struct
>>> s5m_rtc_info *info)
>>> case S5M8767X:
>>> data &= ~S5M_RTC_TIME_EN_MASK;
>>> break;
>>> + case S2MPS15X:
>>> + data |= S2MPS15_RTC_AUDR_MASK;
>>> + break;
>>> case S2MPS14X:
>>> data |= S2MPS_RTC_RUDR_MASK;
>>> break;
>>
>>
>> Another difference: you are setting here exactly the same values as
>> S2MPS13 - bit 1 and bit 4. However vendor code sets only bit 4 (called
>> WUDR there)?
>>
> No they are not, AUDR on s2mps13 is bit:1 where as it is bit:4 on s2mps15.
>>
>> What exactly is necessary to update alarm and time registers on S2MPS15?
>>
> As explained above in example, it is required to update the 'write alarm
> buffer(AUDR)' and 'write time buffer(WUDR)' bits in-order to get rtc
> working.
For updating time and alarm registers? Or only for updating alarm registers?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC
2015-10-29 11:03 ` Krzysztof Kozlowski
@ 2015-10-29 11:20 ` Alim Akhtar
2015-10-29 11:35 ` [rtc-linux] " Krzysztof Kozlowski
0 siblings, 1 reply; 20+ messages in thread
From: Alim Akhtar @ 2015-10-29 11:20 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: lee.jones, broonie, linux-samsung-soc, rtc-linux, linux-kernel,
Alexandre Belloni
On 10/29/2015 04:33 PM, Krzysztof Kozlowski wrote:
> 2015-10-29 16:47 GMT+09:00 Alim Akhtar <alim.akhtar@samsung.com>:
>> Hello Krzysztof,
>>
>>
>> On 10/29/2015 11:24 AM, Krzysztof Kozlowski wrote:
>>>
>>> On 29.10.2015 13:58, Alim Akhtar wrote:
>>>>
>>>> RTC found in s2mps15 is almost same as one found on s2mps14/13
>>>> with few differences in RTC_UPDATE register fields, like
>>>> bit fields are changed for WUDR and AUDR.
>>>> This patch add required changes to enable s2mps15 rtc timer.
>>>>
>>>> Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
>>>> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
>>>> ---
>>>> drivers/rtc/rtc-s5m.c | 20 ++++++++++++++++++--
>>>> include/linux/mfd/samsung/rtc.h | 4 ++++
>>>> 2 files changed, 22 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
>>>> index f2504b4eef34..0d106a99958f 100644
>>>> --- a/drivers/rtc/rtc-s5m.c
>>>> +++ b/drivers/rtc/rtc-s5m.c
>>>> @@ -188,6 +188,7 @@ static inline int
>>>> s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info,
>>>> ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val);
>>>> val &= S5M_ALARM0_STATUS;
>>>> break;
>>>> + case S2MPS15X:
>>>> case S2MPS14X:
>>>> case S2MPS13X:
>>>> ret = regmap_read(info->s5m87xx->regmap_pmic,
>>>> S2MPS14_REG_ST2,
>>>> @@ -223,6 +224,9 @@ static inline int s5m8767_rtc_set_time_reg(struct
>>>> s5m_rtc_info *info)
>>>> if (info->device_type == S5M8763X || info->device_type ==
>>>> S5M8767X)
>>>> data |= S5M_RTC_TIME_EN_MASK;
>>>>
>>>> + if (info->device_type == S2MPS15X)
>>>> + data |= S2MPS15_RTC_WUDR_MASK;
>>>> +
>>>
>>>
>>>
>>> You are setting here bit 1 and bit 4. However vendor code sets only bit
>>> 4 (called WUDR there). That's confusing. Why the difference? Or maybe I
>>> am looking at wrong vendor tree (SM-G920F)?
>>>
>> Sorry, I don't have access to vendor code that you are looking into, so
>> won't be able to comment on that.
>
> Everyone have the access. It is on opensource.samsung.com, as required by GPL.
>
Ok, I didn't check there.
>>
>> I am testing this patch before sending them, what I have found is if you
>> don't update WUDR the time does not changes in rtc.
>> e.g.
>> if you don't do above changes then you will see below:
>> -----
>> # date --set="Oct 29 14:10:40 2015" <update the a new date>
>> Thu Oct 29 14:10:40 UTC 2015
>> #
>> # hwclock --systohc <copy system clock to hardware clock/rtc>
>> # hwclock <read back hwclock>
>> Thu Oct 29 12:52:32 2015 .922889 seconds
>> ----
>> which is not excepted.
>>
>> And with the above change I see:
>>
>> ----
>> # date --set="Oct 29 14:30:10 2015" <update the a new date>
>> Thu Oct 29 14:30:10 UTC 2015
>> # date
>> Thu Oct 29 14:30:12 UTC 2015
>> # hwclock --systohc <copy system clock to hardware clock/rtc>
>> # hwclock <read back hwclock>
>> Thu Oct 29 14:30:21 2015 .333006 seconds
>> ----
>>
>> Which is as expected.
>
> Okay, but I said that vendor is setting only WUDR which is bit 4. You
bit:4 is AUDR (for alarm). not WUDR and bit: 1 is WDUR(for timer)
> are setting bit 1 and bit 4. Your reply - about the need of setting
> WUDR (bit 4 I guess) - does not explain my concerns. Do you have to
> set bit 1?
>
Yes, I think we need to set both for timer and alarm.
I have send you a snapshot of the rtc_update register in UM via internal
email. PTAL.
>>
>>>> ret = regmap_write(info->regmap, info->regs->rtc_udr_update,
>>>> data);
>>>> if (ret < 0) {
>>>> dev_err(info->dev, "failed to write update reg(%d)\n",
>>>> ret);
>>>> @@ -252,6 +256,9 @@ static inline int s5m8767_rtc_set_alarm_reg(struct
>>>> s5m_rtc_info *info)
>>>> case S5M8767X:
>>>> data &= ~S5M_RTC_TIME_EN_MASK;
>>>> break;
>>>> + case S2MPS15X:
>>>> + data |= S2MPS15_RTC_AUDR_MASK;
>>>> + break;
>>>> case S2MPS14X:
>>>> data |= S2MPS_RTC_RUDR_MASK;
>>>> break;
>>>
>>>
>>> Another difference: you are setting here exactly the same values as
>>> S2MPS13 - bit 1 and bit 4. However vendor code sets only bit 4 (called
>>> WUDR there)?
>>>
>> No they are not, AUDR on s2mps13 is bit:1 where as it is bit:4 on s2mps15.
>>>
>>> What exactly is necessary to update alarm and time registers on S2MPS15?
>>>
>> As explained above in example, it is required to update the 'write alarm
>> buffer(AUDR)' and 'write time buffer(WUDR)' bits in-order to get rtc
>> working.
>
> For updating time and alarm registers? Or only for updating alarm registers?
>
example was only for the timer register.
> Best regards,
> Krzysztof
>
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [rtc-linux] Re: [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC
2015-10-29 11:20 ` Alim Akhtar
@ 2015-10-29 11:35 ` Krzysztof Kozlowski
2015-10-29 16:13 ` Alim Akhtar
0 siblings, 1 reply; 20+ messages in thread
From: Krzysztof Kozlowski @ 2015-10-29 11:35 UTC (permalink / raw)
To: rtc-linux
Cc: Krzysztof Kozlowski, lee.jones, broonie, linux-samsung-soc,
linux-kernel, Alexandre Belloni
2015-10-29 20:20 GMT+09:00 Alim Akhtar <alim.akhtar@samsung.com>:
>>> I am testing this patch before sending them, what I have found is if you
>>> don't update WUDR the time does not changes in rtc.
>>> e.g.
>>> if you don't do above changes then you will see below:
>>> -----
>>> # date --set="Oct 29 14:10:40 2015" <update the a new date>
>>> Thu Oct 29 14:10:40 UTC 2015
>>> #
>>> # hwclock --systohc <copy system clock to hardware clock/rtc>
>>> # hwclock <read back hwclock>
>>> Thu Oct 29 12:52:32 2015 .922889 seconds
>>> ----
>>> which is not excepted.
>>>
>>> And with the above change I see:
>>>
>>> ----
>>> # date --set="Oct 29 14:30:10 2015" <update the a new date>
>>> Thu Oct 29 14:30:10 UTC 2015
>>> # date
>>> Thu Oct 29 14:30:12 UTC 2015
>>> # hwclock --systohc <copy system clock to hardware clock/rtc>
>>> # hwclock <read back hwclock>
>>> Thu Oct 29 14:30:21 2015 .333006 seconds
>>> ----
>>>
>>> Which is as expected.
>>
>>
>> Okay, but I said that vendor is setting only WUDR which is bit 4. You
>
> bit:4 is AUDR (for alarm). not WUDR and bit: 1 is WDUR(for timer)
Damn, the mismatch in names is confusing. The vendor sets WUDR which
on S2MPS15 is bit 1.
You are setting bit 1 (okay) and bit 4. This is different which makes
me asking questions.
>>
>> are setting bit 1 and bit 4. Your reply - about the need of setting
>> WUDR (bit 4 I guess) - does not explain my concerns. Do you have to
>> set bit 1?
>>
> Yes, I think we need to set both for timer and alarm.
> I have send you a snapshot of the rtc_update register in UM via internal
> email. PTAL.
Okay, I will take a look when I get to the office tomorrow.
>
>>>
>>>>> ret = regmap_write(info->regmap, info->regs->rtc_udr_update,
>>>>> data);
>>>>> if (ret < 0) {
>>>>> dev_err(info->dev, "failed to write update reg(%d)\n",
>>>>> ret);
>>>>> @@ -252,6 +256,9 @@ static inline int s5m8767_rtc_set_alarm_reg(struct
>>>>> s5m_rtc_info *info)
>>>>> case S5M8767X:
>>>>> data &= ~S5M_RTC_TIME_EN_MASK;
>>>>> break;
>>>>> + case S2MPS15X:
>>>>> + data |= S2MPS15_RTC_AUDR_MASK;
>>>>> + break;
>>>>> case S2MPS14X:
>>>>> data |= S2MPS_RTC_RUDR_MASK;
>>>>> break;
>>>>
>>>>
>>>>
>>>> Another difference: you are setting here exactly the same values as
>>>> S2MPS13 - bit 1 and bit 4. However vendor code sets only bit 4 (called
>>>> WUDR there)?
>>>>
>>> No they are not, AUDR on s2mps13 is bit:1 where as it is bit:4 on
>>> s2mps15.
>>>>
>>>>
>>>> What exactly is necessary to update alarm and time registers on S2MPS15?
>>>>
>>> As explained above in example, it is required to update the 'write alarm
>>> buffer(AUDR)' and 'write time buffer(WUDR)' bits in-order to get rtc
>>> working.
>>
>>
>> For updating time and alarm registers? Or only for updating alarm
>> registers?
>>
> example was only for the timer register.
>
Anyway setting alarm above is strange. You are setting bit 4 twice. One as:
data |= info->regs->rtc_udr_mask;
and then:
case S2MPS15X:
data |= S2MPS15_RTC_AUDR_MASK;
Yeah, I know this is misleading. Could you document expected behavior
exactly somewhere in the code or in the commit message? "bit fields
are changed for WUDR and AUDR." seems not enough. Instead I would be
happy to see a statement: "to set time registers, AUDR and WUDR must
be set, to set alarm .... etc. where AUDR and WUDR on S2MPS15 are
reversed"
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [rtc-linux] Re: [PATCH v4 4/4] drivers/rtc/rtc-s5m.c: add support for S2MPS15 RTC
2015-10-29 11:35 ` [rtc-linux] " Krzysztof Kozlowski
@ 2015-10-29 16:13 ` Alim Akhtar
0 siblings, 0 replies; 20+ messages in thread
From: Alim Akhtar @ 2015-10-29 16:13 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: rtc-linux, lee.jones, broonie, linux-samsung-soc@vger.kernel.org,
linux-kernel@vger.kernel.org, Alexandre Belloni, Alim Akhtar
Hi Krzysztof,
On Thu, Oct 29, 2015 at 5:05 PM, Krzysztof Kozlowski
<k.kozlowski@samsung.com> wrote:
> 2015-10-29 20:20 GMT+09:00 Alim Akhtar <alim.akhtar@samsung.com>:
>>>> I am testing this patch before sending them, what I have found is if you
>>>> don't update WUDR the time does not changes in rtc.
>>>> e.g.
>>>> if you don't do above changes then you will see below:
>>>> -----
>>>> # date --set="Oct 29 14:10:40 2015" <update the a new date>
>>>> Thu Oct 29 14:10:40 UTC 2015
>>>> #
>>>> # hwclock --systohc <copy system clock to hardware clock/rtc>
>>>> # hwclock <read back hwclock>
>>>> Thu Oct 29 12:52:32 2015 .922889 seconds
>>>> ----
>>>> which is not excepted.
>>>>
>>>> And with the above change I see:
>>>>
>>>> ----
>>>> # date --set="Oct 29 14:30:10 2015" <update the a new date>
>>>> Thu Oct 29 14:30:10 UTC 2015
>>>> # date
>>>> Thu Oct 29 14:30:12 UTC 2015
>>>> # hwclock --systohc <copy system clock to hardware clock/rtc>
>>>> # hwclock <read back hwclock>
>>>> Thu Oct 29 14:30:21 2015 .333006 seconds
>>>> ----
>>>>
>>>> Which is as expected.
>>>
>>>
>>> Okay, but I said that vendor is setting only WUDR which is bit 4. You
>>
>> bit:4 is AUDR (for alarm). not WUDR and bit: 1 is WDUR(for timer)
>
> Damn, the mismatch in names is confusing. The vendor sets WUDR which
> on S2MPS15 is bit 1.
>
> You are setting bit 1 (okay) and bit 4. This is different which makes
> me asking questions.
>
hmm..ok let me have a relook. Perhaps I will add a switch case here to
handle each device_type,
keeping the current behavior as same.
>>>
>>> are setting bit 1 and bit 4. Your reply - about the need of setting
>>> WUDR (bit 4 I guess) - does not explain my concerns. Do you have to
>>> set bit 1?
>>>
>> Yes, I think we need to set both for timer and alarm.
>> I have send you a snapshot of the rtc_update register in UM via internal
>> email. PTAL.
>
> Okay, I will take a look when I get to the office tomorrow.
>
>>
>>>>
>>>>>> ret = regmap_write(info->regmap, info->regs->rtc_udr_update,
>>>>>> data);
>>>>>> if (ret < 0) {
>>>>>> dev_err(info->dev, "failed to write update reg(%d)\n",
>>>>>> ret);
>>>>>> @@ -252,6 +256,9 @@ static inline int s5m8767_rtc_set_alarm_reg(struct
>>>>>> s5m_rtc_info *info)
>>>>>> case S5M8767X:
>>>>>> data &= ~S5M_RTC_TIME_EN_MASK;
>>>>>> break;
>>>>>> + case S2MPS15X:
>>>>>> + data |= S2MPS15_RTC_AUDR_MASK;
>>>>>> + break;
>>>>>> case S2MPS14X:
>>>>>> data |= S2MPS_RTC_RUDR_MASK;
>>>>>> break;
>>>>>
>>>>>
>>>>>
>>>>> Another difference: you are setting here exactly the same values as
>>>>> S2MPS13 - bit 1 and bit 4. However vendor code sets only bit 4 (called
>>>>> WUDR there)?
>>>>>
>>>> No they are not, AUDR on s2mps13 is bit:1 where as it is bit:4 on
>>>> s2mps15.
>>>>>
>>>>>
>>>>> What exactly is necessary to update alarm and time registers on S2MPS15?
>>>>>
>>>> As explained above in example, it is required to update the 'write alarm
>>>> buffer(AUDR)' and 'write time buffer(WUDR)' bits in-order to get rtc
>>>> working.
>>>
>>>
>>> For updating time and alarm registers? Or only for updating alarm
>>> registers?
>>>
>> example was only for the timer register.
>>
>
> Anyway setting alarm above is strange. You are setting bit 4 twice. One as:
> data |= info->regs->rtc_udr_mask;
> and then:
> case S2MPS15X:
> data |= S2MPS15_RTC_AUDR_MASK;
>
ok, I can see what you are saying...good catch.
> Yeah, I know this is misleading. Could you document expected behavior
> exactly somewhere in the code or in the commit message? "bit fields
> are changed for WUDR and AUDR." seems not enough. Instead I would be
> happy to see a statement: "to set time registers, AUDR and WUDR must
> be set, to set alarm .... etc. where AUDR and WUDR on S2MPS15 are
> reversed"
>
This is a nice suggestions, will add.
> Best regards,
> Krzysztof
> --
> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Regards,
Alim
^ permalink raw reply [flat|nested] 20+ messages in thread