public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K
@ 2017-02-17 10:19 Gregory CLEMENT
  2017-02-17 10:19 ` [PATCH v2 1/3] rtc: armada38x: Prepare driver to manage different versions Gregory CLEMENT
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Gregory CLEMENT @ 2017-02-17 10:19 UTC (permalink / raw)
  To: linux-arm-kernel

The Armada 7K/8K SoCs use the same RTC IP than the Armada 38x. However
the SOC integration differs in 2 points:
     - MBUS bridge timing initialization
     - IRQ configuration at SoC level

This patch set extends the driver support to these SoCs family.

In this second version the device tree was updated allowing to use the
RTC on Armada 80x0 SoCs. Indeed on the Armada 80x0, the RTC clock in
CP master is not connected (by package) to the oscillator. So this one
is disabled for the Armada 8020 and the Armada 8040. On these SoCs it
will be the RTC clock in CP slave connected to the oscillator which
will be used.

Thanks,

Gregory

Gregory CLEMENT (3):
  rtc: armada38x: Prepare driver to manage different versions
  rtc: armada38x: Add support for Armada 7K/8K
  arm64: dts: marvell: add RTC description for Armada 7K/8K

 .../devicetree/bindings/rtc/armada-380-rtc.txt     |   8 +-
 arch/arm64/boot/dts/marvell/armada-8020.dtsi       |  10 +
 arch/arm64/boot/dts/marvell/armada-8040.dtsi       |   9 +
 .../boot/dts/marvell/armada-cp110-master.dtsi      |   7 +
 .../arm64/boot/dts/marvell/armada-cp110-slave.dtsi |   7 +
 drivers/rtc/rtc-armada38x.c                        | 217 ++++++++++++++++-----
 6 files changed, 202 insertions(+), 56 deletions(-)

-- 
2.11.0

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 1/3] rtc: armada38x: Prepare driver to manage different versions
  2017-02-17 10:19 [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K Gregory CLEMENT
@ 2017-02-17 10:19 ` Gregory CLEMENT
  2017-02-17 10:19 ` [PATCH v2 2/3] rtc: armada38x: Add support for Armada 7K/8K Gregory CLEMENT
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 12+ messages in thread
From: Gregory CLEMENT @ 2017-02-17 10:19 UTC (permalink / raw)
  To: linux-arm-kernel

In order to prepare the introduction of the A7K/A8K version of the RTC,
this commit introduces a new data structure. This structure allows to
handle the differences between the integration of the RTC IP in the
SoCs. It will be:
 - MBUS bridge timing initialization
 - IRQ configuration at SoC level

Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
---
 drivers/rtc/rtc-armada38x.c | 152 +++++++++++++++++++++++++++++---------------
 1 file changed, 99 insertions(+), 53 deletions(-)

diff --git a/drivers/rtc/rtc-armada38x.c b/drivers/rtc/rtc-armada38x.c
index 7cb5b27189db..b2a8e2ed71ca 100644
--- a/drivers/rtc/rtc-armada38x.c
+++ b/drivers/rtc/rtc-armada38x.c
@@ -16,6 +16,7 @@
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/rtc.h>
 
@@ -23,23 +24,23 @@
 #define RTC_STATUS_ALARM1	    BIT(0)
 #define RTC_STATUS_ALARM2	    BIT(1)
 #define RTC_IRQ1_CONF	    0x4
-#define RTC_IRQ1_AL_EN		    BIT(0)
-#define RTC_IRQ1_FREQ_EN	    BIT(1)
-#define RTC_IRQ1_FREQ_1HZ	    BIT(2)
+#define RTC_IRQ_AL_EN		    BIT(0)
+#define RTC_IRQ_FREQ_EN		    BIT(1)
+#define RTC_IRQ_FREQ_1HZ	    BIT(2)
+
 #define RTC_TIME	    0xC
 #define RTC_ALARM1	    0x10
-
-#define SOC_RTC_BRIDGE_TIMING_CTL   0x0
-#define SOC_RTC_PERIOD_OFFS		0
-#define SOC_RTC_PERIOD_MASK		(0x3FF << SOC_RTC_PERIOD_OFFS)
-#define SOC_RTC_READ_DELAY_OFFS		26
-#define SOC_RTC_READ_DELAY_MASK		(0x1F << SOC_RTC_READ_DELAY_OFFS)
-
-#define SOC_RTC_INTERRUPT   0x8
-#define SOC_RTC_ALARM1		BIT(0)
-#define SOC_RTC_ALARM2		BIT(1)
-#define SOC_RTC_ALARM1_MASK	BIT(2)
-#define SOC_RTC_ALARM2_MASK	BIT(3)
+#define RTC_38X_BRIDGE_TIMING_CTL   0x0
+#define RTC_38X_PERIOD_OFFS		0
+#define RTC_38X_PERIOD_MASK		(0x3FF << RTC_38X_PERIOD_OFFS)
+#define RTC_38X_READ_DELAY_OFFS		26
+#define RTC_38X_READ_DELAY_MASK		(0x1F << RTC_38X_READ_DELAY_OFFS)
+
+#define SOC_RTC_INTERRUPT	    0x8
+#define SOC_RTC_ALARM1			BIT(0)
+#define SOC_RTC_ALARM2			BIT(1)
+#define SOC_RTC_ALARM1_MASK		BIT(2)
+#define SOC_RTC_ALARM2_MASK		BIT(3)
 
 #define SAMPLE_NR 100
 
@@ -55,6 +56,19 @@ struct armada38x_rtc {
 	spinlock_t	    lock;
 	int		    irq;
 	struct value_to_freq *val_to_freq;
+	struct armada38x_rtc_data *data;
+};
+
+#define ALARM1	0
+#define ALARM_REG(base, alarm)	 ((base) + (alarm) * sizeof(u32))
+
+struct armada38x_rtc_data {
+	/* Initialize the RTC-MBUS bridge timing */
+	void (*update_mbus_timing)(struct armada38x_rtc *rtc);
+	u32 (*read_rtc_reg)(struct armada38x_rtc *rtc, u8 rtc_reg);
+	void (*clear_isr)(struct armada38x_rtc *rtc);
+	void (*unmask_interrupt)(struct armada38x_rtc *rtc);
+	u32 alarm;
 };
 
 /*
@@ -76,19 +90,19 @@ static void rtc_delayed_write(u32 val, struct armada38x_rtc *rtc, int offset)
 }
 
 /* Update RTC-MBUS bridge timing parameters */
-static void rtc_update_mbus_timing_params(struct armada38x_rtc *rtc)
+static void rtc_update_38x_mbus_timing_params(struct armada38x_rtc *rtc)
 {
 	u32 reg;
 
-	reg = readl(rtc->regs_soc + SOC_RTC_BRIDGE_TIMING_CTL);
-	reg &= ~SOC_RTC_PERIOD_MASK;
-	reg |= 0x3FF << SOC_RTC_PERIOD_OFFS; /* Maximum value */
-	reg &= ~SOC_RTC_READ_DELAY_MASK;
-	reg |= 0x1F << SOC_RTC_READ_DELAY_OFFS; /* Maximum value */
-	writel(reg, rtc->regs_soc + SOC_RTC_BRIDGE_TIMING_CTL);
+	reg = readl(rtc->regs_soc + RTC_38X_BRIDGE_TIMING_CTL);
+	reg &= ~RTC_38X_PERIOD_MASK;
+	reg |= 0x3FF << RTC_38X_PERIOD_OFFS; /* Maximum value */
+	reg &= ~RTC_38X_READ_DELAY_MASK;
+	reg |= 0x1F << RTC_38X_READ_DELAY_OFFS; /* Maximum value */
+	writel(reg, rtc->regs_soc + RTC_38X_BRIDGE_TIMING_CTL);
 }
 
-static u32 read_rtc_register_wa(struct armada38x_rtc *rtc, u8 rtc_reg)
+static u32 read_rtc_register_38x_wa(struct armada38x_rtc *rtc, u8 rtc_reg)
 {
 	int i, index_max = 0, max = 0;
 
@@ -130,13 +144,26 @@ static u32 read_rtc_register_wa(struct armada38x_rtc *rtc, u8 rtc_reg)
 	return rtc->val_to_freq[index_max].value;
 }
 
+static void armada38x_clear_isr(struct armada38x_rtc *rtc)
+{
+	u32 val = readl(rtc->regs_soc + SOC_RTC_INTERRUPT);
+
+	writel(val & ~SOC_RTC_ALARM1, rtc->regs_soc + SOC_RTC_INTERRUPT);
+}
+
+static void armada38x_unmask_interrupt(struct armada38x_rtc *rtc)
+{
+	u32 val = readl(rtc->regs_soc + SOC_RTC_INTERRUPT);
+
+	writel(val | SOC_RTC_ALARM1_MASK, rtc->regs_soc + SOC_RTC_INTERRUPT);
+}
 static int armada38x_rtc_read_time(struct device *dev, struct rtc_time *tm)
 {
 	struct armada38x_rtc *rtc = dev_get_drvdata(dev);
 	unsigned long time, flags;
 
 	spin_lock_irqsave(&rtc->lock, flags);
-	time = read_rtc_register_wa(rtc, RTC_TIME);
+	time = rtc->data->read_rtc_reg(rtc, RTC_TIME);
 	spin_unlock_irqrestore(&rtc->lock, flags);
 
 	rtc_time_to_tm(time, tm);
@@ -167,12 +194,14 @@ static int armada38x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 {
 	struct armada38x_rtc *rtc = dev_get_drvdata(dev);
 	unsigned long time, flags;
+	u32 reg = ALARM_REG(RTC_ALARM1, rtc->data->alarm);
+	u32 reg_irq = ALARM_REG(RTC_IRQ1_CONF, rtc->data->alarm);
 	u32 val;
 
 	spin_lock_irqsave(&rtc->lock, flags);
 
-	time = read_rtc_register_wa(rtc, RTC_ALARM1);
-	val = read_rtc_register_wa(rtc, RTC_IRQ1_CONF) & RTC_IRQ1_AL_EN;
+	time = rtc->data->read_rtc_reg(rtc, reg);
+	val = rtc->data->read_rtc_reg(rtc, reg_irq) & RTC_IRQ_AL_EN;
 
 	spin_unlock_irqrestore(&rtc->lock, flags);
 
@@ -185,9 +214,10 @@ static int armada38x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 static int armada38x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 {
 	struct armada38x_rtc *rtc = dev_get_drvdata(dev);
+	u32 reg = ALARM_REG(RTC_ALARM1, rtc->data->alarm);
+	u32 reg_irq = ALARM_REG(RTC_IRQ1_CONF, rtc->data->alarm);
 	unsigned long time, flags;
 	int ret = 0;
-	u32 val;
 
 	ret = rtc_tm_to_time(&alrm->time, &time);
 
@@ -196,13 +226,11 @@ static int armada38x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 
 	spin_lock_irqsave(&rtc->lock, flags);
 
-	rtc_delayed_write(time, rtc, RTC_ALARM1);
+	rtc_delayed_write(time, rtc, reg);
 
 	if (alrm->enabled) {
-			rtc_delayed_write(RTC_IRQ1_AL_EN, rtc, RTC_IRQ1_CONF);
-			val = readl(rtc->regs_soc + SOC_RTC_INTERRUPT);
-			writel(val | SOC_RTC_ALARM1_MASK,
-			       rtc->regs_soc + SOC_RTC_INTERRUPT);
+		rtc_delayed_write(RTC_IRQ_AL_EN, rtc, reg_irq);
+		rtc->data->unmask_interrupt(rtc);
 	}
 
 	spin_unlock_irqrestore(&rtc->lock, flags);
@@ -215,14 +243,15 @@ static int armada38x_rtc_alarm_irq_enable(struct device *dev,
 					 unsigned int enabled)
 {
 	struct armada38x_rtc *rtc = dev_get_drvdata(dev);
+	u32 reg_irq = ALARM_REG(RTC_IRQ1_CONF, rtc->data->alarm);
 	unsigned long flags;
 
 	spin_lock_irqsave(&rtc->lock, flags);
 
 	if (enabled)
-		rtc_delayed_write(RTC_IRQ1_AL_EN, rtc, RTC_IRQ1_CONF);
+		rtc_delayed_write(RTC_IRQ_AL_EN, rtc, reg_irq);
 	else
-		rtc_delayed_write(0, rtc, RTC_IRQ1_CONF);
+		rtc_delayed_write(0, rtc, reg_irq);
 
 	spin_unlock_irqrestore(&rtc->lock, flags);
 
@@ -234,24 +263,23 @@ static irqreturn_t armada38x_rtc_alarm_irq(int irq, void *data)
 	struct armada38x_rtc *rtc = data;
 	u32 val;
 	int event = RTC_IRQF | RTC_AF;
+	u32 reg_irq = ALARM_REG(RTC_IRQ1_CONF, rtc->data->alarm);
 
 	dev_dbg(&rtc->rtc_dev->dev, "%s:irq(%d)\n", __func__, irq);
 
 	spin_lock(&rtc->lock);
 
-	val = readl(rtc->regs_soc + SOC_RTC_INTERRUPT);
-
-	writel(val & ~SOC_RTC_ALARM1, rtc->regs_soc + SOC_RTC_INTERRUPT);
-	val = read_rtc_register_wa(rtc, RTC_IRQ1_CONF);
-	/* disable all the interrupts for alarm 1 */
-	rtc_delayed_write(0, rtc, RTC_IRQ1_CONF);
+	rtc->data->clear_isr(rtc);
+	val = rtc->data->read_rtc_reg(rtc, reg_irq);
+	/* disable all the interrupts for alarm*/
+	rtc_delayed_write(0, rtc, reg_irq);
 	/* Ack the event */
-	rtc_delayed_write(RTC_STATUS_ALARM1, rtc, RTC_STATUS);
+	rtc_delayed_write(1 << rtc->data->alarm, rtc, RTC_STATUS);
 
 	spin_unlock(&rtc->lock);
 
-	if (val & RTC_IRQ1_FREQ_EN) {
-		if (val & RTC_IRQ1_FREQ_1HZ)
+	if (val & RTC_IRQ_FREQ_EN) {
+		if (val & RTC_IRQ_FREQ_1HZ)
 			event |= RTC_UF;
 		else
 			event |= RTC_PF;
@@ -276,13 +304,37 @@ static const struct rtc_class_ops armada38x_rtc_ops_noirq = {
 	.read_alarm = armada38x_rtc_read_alarm,
 };
 
+static const struct armada38x_rtc_data armada38x_data = {
+	.update_mbus_timing = rtc_update_38x_mbus_timing_params,
+	.read_rtc_reg = read_rtc_register_38x_wa,
+	.clear_isr = armada38x_clear_isr,
+	.unmask_interrupt = armada38x_unmask_interrupt,
+	.alarm = ALARM1,
+};
+
+#ifdef CONFIG_OF
+static const struct of_device_id armada38x_rtc_of_match_table[] = {
+	{
+		.compatible = "marvell,armada-380-rtc",
+		.data = &armada38x_data,
+	},
+	{}
+};
+MODULE_DEVICE_TABLE(of, armada38x_rtc_of_match_table);
+#endif
+
 static __init int armada38x_rtc_probe(struct platform_device *pdev)
 {
 	const struct rtc_class_ops *ops;
 	struct resource *res;
 	struct armada38x_rtc *rtc;
+	const struct of_device_id *match;
 	int ret;
 
+	match = of_match_device(armada38x_rtc_of_match_table, &pdev->dev);
+	if (!match)
+		return -ENODEV;
+
 	rtc = devm_kzalloc(&pdev->dev, sizeof(struct armada38x_rtc),
 			    GFP_KERNEL);
 	if (!rtc)
@@ -327,9 +379,11 @@ static __init int armada38x_rtc_probe(struct platform_device *pdev)
 		 */
 		ops = &armada38x_rtc_ops_noirq;
 	}
+	rtc->data = (struct armada38x_rtc_data *)match->data;
+
 
 	/* Update RTC-MBUS bridge timing parameters */
-	rtc_update_mbus_timing_params(rtc);
+	rtc->data->update_mbus_timing(rtc);
 
 	rtc->rtc_dev = devm_rtc_device_register(&pdev->dev, pdev->name,
 						ops, THIS_MODULE);
@@ -359,7 +413,7 @@ static int armada38x_rtc_resume(struct device *dev)
 		struct armada38x_rtc *rtc = dev_get_drvdata(dev);
 
 		/* Update RTC-MBUS bridge timing parameters */
-		rtc_update_mbus_timing_params(rtc);
+		rtc->data->update_mbus_timing(rtc);
 
 		return disable_irq_wake(rtc->irq);
 	}
@@ -371,14 +425,6 @@ static int armada38x_rtc_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(armada38x_rtc_pm_ops,
 			 armada38x_rtc_suspend, armada38x_rtc_resume);
 
-#ifdef CONFIG_OF
-static const struct of_device_id armada38x_rtc_of_match_table[] = {
-	{ .compatible = "marvell,armada-380-rtc", },
-	{}
-};
-MODULE_DEVICE_TABLE(of, armada38x_rtc_of_match_table);
-#endif
-
 static struct platform_driver armada38x_rtc_driver = {
 	.driver		= {
 		.name	= "armada38x-rtc",
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 2/3] rtc: armada38x: Add support for Armada 7K/8K
  2017-02-17 10:19 [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K Gregory CLEMENT
  2017-02-17 10:19 ` [PATCH v2 1/3] rtc: armada38x: Prepare driver to manage different versions Gregory CLEMENT
@ 2017-02-17 10:19 ` Gregory CLEMENT
  2017-02-17 10:19 ` [PATCH v2 3/3] arm64: dts: marvell: add RTC description " Gregory CLEMENT
  2017-02-20 17:06 ` [PATCH v2 0/3] Extend rtc-armada38x support " Gregory CLEMENT
  3 siblings, 0 replies; 12+ messages in thread
From: Gregory CLEMENT @ 2017-02-17 10:19 UTC (permalink / raw)
  To: linux-arm-kernel

The Armada 7K/8K use the same RTC IP than the Armada 38x. However the SOC
integration differs in 2 points:
 - MBUS bridge timing initialization
 - IRQ configuration at SoC level

Moreover the Armada 7K/8K have an issue preventing to get the interrupt
from alarm 1. This commit allows to use alarm 2 for these A7K/8K but to
still use alarm 1 for the Armada 38x.

Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
---
 .../devicetree/bindings/rtc/armada-380-rtc.txt     |  8 ++-
 drivers/rtc/rtc-armada38x.c                        | 65 ++++++++++++++++++++++
 2 files changed, 70 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/rtc/armada-380-rtc.txt b/Documentation/devicetree/bindings/rtc/armada-380-rtc.txt
index 2eb9d4ee7dc0..c3c9a1226f9a 100644
--- a/Documentation/devicetree/bindings/rtc/armada-380-rtc.txt
+++ b/Documentation/devicetree/bindings/rtc/armada-380-rtc.txt
@@ -1,9 +1,11 @@
-* Real Time Clock of the Armada 38x SoCs
+* Real Time Clock of the Armada 38x/7K/8K SoCs
 
-RTC controller for the Armada 38x SoCs
+RTC controller for the Armada 38x, 7K and 8K SoCs
 
 Required properties:
-- compatible : Should be "marvell,armada-380-rtc"
+- compatible : Should be one of the following:
+	"marvell,armada-380-rtc" for Armada 38x SoC
+	"marvell,armada-8k-rtc" for Aramda 7K/8K SoCs
 - reg: a list of base address and size pairs, one for each entry in
   reg-names
 - reg names: should contain:
diff --git a/drivers/rtc/rtc-armada38x.c b/drivers/rtc/rtc-armada38x.c
index b2a8e2ed71ca..21f355c37eab 100644
--- a/drivers/rtc/rtc-armada38x.c
+++ b/drivers/rtc/rtc-armada38x.c
@@ -24,18 +24,36 @@
 #define RTC_STATUS_ALARM1	    BIT(0)
 #define RTC_STATUS_ALARM2	    BIT(1)
 #define RTC_IRQ1_CONF	    0x4
+#define RTC_IRQ2_CONF	    0x8
 #define RTC_IRQ_AL_EN		    BIT(0)
 #define RTC_IRQ_FREQ_EN		    BIT(1)
 #define RTC_IRQ_FREQ_1HZ	    BIT(2)
 
 #define RTC_TIME	    0xC
 #define RTC_ALARM1	    0x10
+#define RTC_ALARM2	    0x14
+
+/* Armada38x SoC registers  */
 #define RTC_38X_BRIDGE_TIMING_CTL   0x0
 #define RTC_38X_PERIOD_OFFS		0
 #define RTC_38X_PERIOD_MASK		(0x3FF << RTC_38X_PERIOD_OFFS)
 #define RTC_38X_READ_DELAY_OFFS		26
 #define RTC_38X_READ_DELAY_MASK		(0x1F << RTC_38X_READ_DELAY_OFFS)
 
+/* Armada 7K/8K registers  */
+#define RTC_8K_BRIDGE_TIMING_CTL0    0x0
+#define RTC_8K_WRCLK_PERIOD_OFFS	0
+#define RTC_8K_WRCLK_PERIOD_MASK	(0xFFFF << RTC_8K_WRCLK_PERIOD_OFFS)
+#define RTC_8K_WRCLK_SETUP_OFFS		16
+#define RTC_8K_WRCLK_SETUP_MASK		(0xFFFF << RTC_8K_WRCLK_SETUP_OFFS)
+#define RTC_8K_BRIDGE_TIMING_CTL1   0x4
+#define RTC_8K_READ_DELAY_OFFS		0
+#define RTC_8K_READ_DELAY_MASK		(0xFFFF << RTC_8K_READ_DELAY_OFFS)
+
+#define RTC_8K_ISR		    0x10
+#define RTC_8K_IMR		    0x14
+#define RTC_8K_ALARM2			BIT(0)
+
 #define SOC_RTC_INTERRUPT	    0x8
 #define SOC_RTC_ALARM1			BIT(0)
 #define SOC_RTC_ALARM2			BIT(1)
@@ -60,6 +78,8 @@ struct armada38x_rtc {
 };
 
 #define ALARM1	0
+#define ALARM2	1
+
 #define ALARM_REG(base, alarm)	 ((base) + (alarm) * sizeof(u32))
 
 struct armada38x_rtc_data {
@@ -102,6 +122,28 @@ static void rtc_update_38x_mbus_timing_params(struct armada38x_rtc *rtc)
 	writel(reg, rtc->regs_soc + RTC_38X_BRIDGE_TIMING_CTL);
 }
 
+static void rtc_update_8k_mbus_timing_params(struct armada38x_rtc *rtc)
+{
+	u32 reg;
+
+	reg = readl(rtc->regs_soc + RTC_8K_BRIDGE_TIMING_CTL0);
+	reg &= ~RTC_8K_WRCLK_PERIOD_MASK;
+	reg |= 0x3FF << RTC_8K_WRCLK_PERIOD_OFFS;
+	reg &= ~RTC_8K_WRCLK_SETUP_MASK;
+	reg |= 0x29 << RTC_8K_WRCLK_SETUP_OFFS;
+	writel(reg, rtc->regs_soc + RTC_8K_BRIDGE_TIMING_CTL0);
+
+	reg = readl(rtc->regs_soc + RTC_8K_BRIDGE_TIMING_CTL1);
+	reg &= ~RTC_8K_READ_DELAY_MASK;
+	reg |= 0x3F << RTC_8K_READ_DELAY_OFFS;
+	writel(reg, rtc->regs_soc + RTC_8K_BRIDGE_TIMING_CTL1);
+}
+
+static u32 read_rtc_register(struct armada38x_rtc *rtc, u8 rtc_reg)
+{
+	return readl(rtc->regs + rtc_reg);
+}
+
 static u32 read_rtc_register_38x_wa(struct armada38x_rtc *rtc, u8 rtc_reg)
 {
 	int i, index_max = 0, max = 0;
@@ -157,6 +199,17 @@ static void armada38x_unmask_interrupt(struct armada38x_rtc *rtc)
 
 	writel(val | SOC_RTC_ALARM1_MASK, rtc->regs_soc + SOC_RTC_INTERRUPT);
 }
+
+static void armada8k_clear_isr(struct armada38x_rtc *rtc)
+{
+	writel(RTC_8K_ALARM2, rtc->regs_soc + RTC_8K_ISR);
+}
+
+static void armada8k_unmask_interrupt(struct armada38x_rtc *rtc)
+{
+	writel(RTC_8K_ALARM2, rtc->regs_soc + RTC_8K_IMR);
+}
+
 static int armada38x_rtc_read_time(struct device *dev, struct rtc_time *tm)
 {
 	struct armada38x_rtc *rtc = dev_get_drvdata(dev);
@@ -312,12 +365,24 @@ static const struct armada38x_rtc_data armada38x_data = {
 	.alarm = ALARM1,
 };
 
+static const struct armada38x_rtc_data armada8k_data = {
+	.update_mbus_timing = rtc_update_8k_mbus_timing_params,
+	.read_rtc_reg = read_rtc_register,
+	.clear_isr = armada8k_clear_isr,
+	.unmask_interrupt = armada8k_unmask_interrupt,
+	.alarm = ALARM2,
+};
+
 #ifdef CONFIG_OF
 static const struct of_device_id armada38x_rtc_of_match_table[] = {
 	{
 		.compatible = "marvell,armada-380-rtc",
 		.data = &armada38x_data,
 	},
+	{
+		.compatible = "marvell,armada-8k-rtc",
+		.data = &armada8k_data,
+	},
 	{}
 };
 MODULE_DEVICE_TABLE(of, armada38x_rtc_of_match_table);
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 3/3] arm64: dts: marvell: add RTC description for Armada 7K/8K
  2017-02-17 10:19 [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K Gregory CLEMENT
  2017-02-17 10:19 ` [PATCH v2 1/3] rtc: armada38x: Prepare driver to manage different versions Gregory CLEMENT
  2017-02-17 10:19 ` [PATCH v2 2/3] rtc: armada38x: Add support for Armada 7K/8K Gregory CLEMENT
@ 2017-02-17 10:19 ` Gregory CLEMENT
  2017-02-20 17:06 ` [PATCH v2 0/3] Extend rtc-armada38x support " Gregory CLEMENT
  3 siblings, 0 replies; 12+ messages in thread
From: Gregory CLEMENT @ 2017-02-17 10:19 UTC (permalink / raw)
  To: linux-arm-kernel

This RTC IP is found in the CP110 master and slave which are part of the
Armada 8K SoCs and of the subset family the Armada 7K.

There is one RTC in each CP but the RTC requires an external
oscillator. However on the Armada 80x0, the RTC clock in CP master is not
connected (by package) to the oscillator. So this one is disabled for the
Armada 8020 and the Armada 8040.

As the RTC clock in CP slave is connected to the oscillator this one is
let enabled. and will be used on these SoCs (80x0).

Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
---
 arch/arm64/boot/dts/marvell/armada-8020.dtsi         | 10 ++++++++++
 arch/arm64/boot/dts/marvell/armada-8040.dtsi         |  9 +++++++++
 arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi |  7 +++++++
 arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi  |  7 +++++++
 4 files changed, 33 insertions(+)

diff --git a/arch/arm64/boot/dts/marvell/armada-8020.dtsi b/arch/arm64/boot/dts/marvell/armada-8020.dtsi
index 048e5cf5160e..7c08f1f28d9e 100644
--- a/arch/arm64/boot/dts/marvell/armada-8020.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-8020.dtsi
@@ -54,3 +54,13 @@
 	compatible = "marvell,armada8020", "marvell,armada-ap806-dual",
 		     "marvell,armada-ap806";
 };
+
+/* The RTC requires external oscillator. But on Aramda 80x0, the RTC clock
+ * in CP master is not connected (by package) to the oscillator. So
+ * disable it. However, the RTC clock in CP slave is connected to the
+ * oscillator so this one is let enabled.
+ */
+
+&cpm_rtc {
+	status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/marvell/armada-8040.dtsi b/arch/arm64/boot/dts/marvell/armada-8040.dtsi
index 9c1b28c47683..33813a75bc30 100644
--- a/arch/arm64/boot/dts/marvell/armada-8040.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-8040.dtsi
@@ -54,3 +54,12 @@
 	compatible = "marvell,armada8040", "marvell,armada-ap806-quad",
 		     "marvell,armada-ap806";
 };
+
+/* The RTC requires external oscillator. But on Aramda 80x0, the RTC clock
+ * in CP master is not connected (by package) to the oscillator. So
+ * disable it. However, the RTC clock in CP slave is connected to the
+ * oscillator so this one is let enabled.
+ */
+&cpm_rtc {
+	status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi b/arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi
index 3a99c36433d6..d12741414009 100644
--- a/arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi
@@ -79,6 +79,13 @@
 					"cpm-usb3dev", "cpm-eip150", "cpm-eip197";
 			};
 
+			cpm_rtc: rtc at 284000 {
+				compatible = "marvell,armada-8k-rtc";
+				reg = <0x284000 0x20>, <0x284080 0x24>;
+				reg-names = "rtc", "rtc-soc";
+				interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
+			};
+
 			cpm_sata0: sata at 540000 {
 				compatible = "marvell,armada-8k-ahci",
 					     "generic-ahci";
diff --git a/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi b/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi
index 9e09c4d3b6bd..d01be5a639e9 100644
--- a/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi
@@ -59,6 +59,13 @@
 			interrupt-parent = <&gic>;
 			ranges = <0x0 0x0 0xf4000000 0x2000000>;
 
+			cps_rtc: rtc at 284000 {
+				compatible = "marvell,armada-8k-rtc";
+				reg = <0x284000 0x20>, <0x284080 0x24>;
+				reg-names = "rtc", "rtc-soc";
+				interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
+			};
+
 			cps_syscon0: system-controller at 440000 {
 				compatible = "marvell,cp110-system-controller0",
 					     "syscon";
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K
  2017-02-17 10:19 [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K Gregory CLEMENT
                   ` (2 preceding siblings ...)
  2017-02-17 10:19 ` [PATCH v2 3/3] arm64: dts: marvell: add RTC description " Gregory CLEMENT
@ 2017-02-20 17:06 ` Gregory CLEMENT
  2017-02-20 17:27   ` Russell King - ARM Linux
  2017-02-20 17:36   ` Alexandre Belloni
  3 siblings, 2 replies; 12+ messages in thread
From: Gregory CLEMENT @ 2017-02-20 17:06 UTC (permalink / raw)
  To: linux-arm-kernel

Hi,
 
 On ven., f?vr. 17 2017, Gregory CLEMENT <gregory.clement@free-electrons.com> wrote:

> The Armada 7K/8K SoCs use the same RTC IP than the Armada 38x. However
> the SOC integration differs in 2 points:
>      - MBUS bridge timing initialization
>      - IRQ configuration at SoC level
>
> This patch set extends the driver support to these SoCs family.
>
> In this second version the device tree was updated allowing to use the
> RTC on Armada 80x0 SoCs. Indeed on the Armada 80x0, the RTC clock in
> CP master is not connected (by package) to the oscillator. So this one
> is disabled for the Armada 8020 and the Armada 8040. On these SoCs it
> will be the RTC clock in CP slave connected to the oscillator which
> will be used.

I saw on IRC than Russell managed to have a more coherent date with this
series on his 8040 based board. For the record, as the U-Boot on this
board didn't provide a "date reset" command for the RTC located on CP
slave, then Russell needed to do the following:

devmem2 0xf428401c w 0
devmem2 0xf4284018 w 0x2000
followed by:
date 021612342017; ntpdate ...; hwclock -uw

But this issue was related to the bootloader not to the kernel. The
other potential issue seen by Russell was about the GIC mapping for the
interrupt, but here again this mapping was done by the 1st stage
bootloader.

Given this information would it be OK to applied this series?

Thanks,

Gregory

>
> Thanks,
>
> Gregory
>
> Gregory CLEMENT (3):
>   rtc: armada38x: Prepare driver to manage different versions
>   rtc: armada38x: Add support for Armada 7K/8K
>   arm64: dts: marvell: add RTC description for Armada 7K/8K
>
>  .../devicetree/bindings/rtc/armada-380-rtc.txt     |   8 +-
>  arch/arm64/boot/dts/marvell/armada-8020.dtsi       |  10 +
>  arch/arm64/boot/dts/marvell/armada-8040.dtsi       |   9 +
>  .../boot/dts/marvell/armada-cp110-master.dtsi      |   7 +
>  .../arm64/boot/dts/marvell/armada-cp110-slave.dtsi |   7 +
>  drivers/rtc/rtc-armada38x.c                        | 217 ++++++++++++++++-----
>  6 files changed, 202 insertions(+), 56 deletions(-)
>
> -- 
> 2.11.0
>

-- 
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K
  2017-02-20 17:06 ` [PATCH v2 0/3] Extend rtc-armada38x support " Gregory CLEMENT
@ 2017-02-20 17:27   ` Russell King - ARM Linux
  2017-02-20 17:36     ` Gregory CLEMENT
  2017-02-20 17:42     ` Russell King - ARM Linux
  2017-02-20 17:36   ` Alexandre Belloni
  1 sibling, 2 replies; 12+ messages in thread
From: Russell King - ARM Linux @ 2017-02-20 17:27 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Feb 20, 2017 at 06:06:11PM +0100, Gregory CLEMENT wrote:
> I saw on IRC than Russell managed to have a more coherent date with this
> series on his 8040 based board. For the record, as the U-Boot on this
> board didn't provide a "date reset" command for the RTC located on CP
> slave, then Russell needed to do the following:
> 
> devmem2 0xf428401c w 0
> devmem2 0xf4284018 w 0x2000
> followed by:
> date 021612342017; ntpdate ...; hwclock -uw
> 
> But this issue was related to the bootloader not to the kernel. The
> other potential issue seen by Russell was about the GIC mapping for the
> interrupt, but here again this mapping was done by the 1st stage
> bootloader.
> 
> Given this information would it be OK to applied this series?

No it is not.  As I already pointed out, the interrupt for the 8040 is
GIC_SPI 71 _not_ GIC_SPI 77 as you have it in this series.

Both CP110's on Armada 8040 have a default mapping of ICU 77 to GIC 71.

-- 
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K
  2017-02-20 17:27   ` Russell King - ARM Linux
@ 2017-02-20 17:36     ` Gregory CLEMENT
  2017-02-20 17:42     ` Russell King - ARM Linux
  1 sibling, 0 replies; 12+ messages in thread
From: Gregory CLEMENT @ 2017-02-20 17:36 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Russell King,
 
 On lun., f?vr. 20 2017, Russell King - ARM Linux <linux@armlinux.org.uk> wrote:

> On Mon, Feb 20, 2017 at 06:06:11PM +0100, Gregory CLEMENT wrote:
>> I saw on IRC than Russell managed to have a more coherent date with this
>> series on his 8040 based board. For the record, as the U-Boot on this
>> board didn't provide a "date reset" command for the RTC located on CP
>> slave, then Russell needed to do the following:
>> 
>> devmem2 0xf428401c w 0
>> devmem2 0xf4284018 w 0x2000
>> followed by:
>> date 021612342017; ntpdate ...; hwclock -uw
>> 
>> But this issue was related to the bootloader not to the kernel. The
>> other potential issue seen by Russell was about the GIC mapping for the
>> interrupt, but here again this mapping was done by the 1st stage
>> bootloader.
>> 
>> Given this information would it be OK to applied this series?
>
> No it is not.  As I already pointed out, the interrupt for the 8040 is
> GIC_SPI 71 _not_ GIC_SPI 77 as you have it in this series.
>
> Both CP110's on Armada 8040 have a default mapping of ICU 77 to GIC
> 71.

OK so I am sending a v2 with this fix.

Thanks,

Gregory

>
> -- 
> RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
> FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
> according to speedtest.net.

-- 
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K
  2017-02-20 17:06 ` [PATCH v2 0/3] Extend rtc-armada38x support " Gregory CLEMENT
  2017-02-20 17:27   ` Russell King - ARM Linux
@ 2017-02-20 17:36   ` Alexandre Belloni
  2017-02-20 17:43     ` Gregory CLEMENT
  2017-02-20 17:50     ` Russell King - ARM Linux
  1 sibling, 2 replies; 12+ messages in thread
From: Alexandre Belloni @ 2017-02-20 17:36 UTC (permalink / raw)
  To: linux-arm-kernel

On 20/02/2017 at 18:06:11 +0100, Gregory CLEMENT wrote:
>  On ven., f?vr. 17 2017, Gregory CLEMENT <gregory.clement@free-electrons.com> wrote:
> 
> > The Armada 7K/8K SoCs use the same RTC IP than the Armada 38x. However
> > the SOC integration differs in 2 points:
> >      - MBUS bridge timing initialization
> >      - IRQ configuration at SoC level
> >
> > This patch set extends the driver support to these SoCs family.
> >
> > In this second version the device tree was updated allowing to use the
> > RTC on Armada 80x0 SoCs. Indeed on the Armada 80x0, the RTC clock in
> > CP master is not connected (by package) to the oscillator. So this one
> > is disabled for the Armada 8020 and the Armada 8040. On these SoCs it
> > will be the RTC clock in CP slave connected to the oscillator which
> > will be used.
> 
> I saw on IRC than Russell managed to have a more coherent date with this
> series on his 8040 based board. For the record, as the U-Boot on this
> board didn't provide a "date reset" command for the RTC located on CP
> slave, then Russell needed to do the following:
> 
> devmem2 0xf428401c w 0
> devmem2 0xf4284018 w 0x2000

The question being what does that do and whether it could be done in the
driver instead.

-- 
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K
  2017-02-20 17:27   ` Russell King - ARM Linux
  2017-02-20 17:36     ` Gregory CLEMENT
@ 2017-02-20 17:42     ` Russell King - ARM Linux
  1 sibling, 0 replies; 12+ messages in thread
From: Russell King - ARM Linux @ 2017-02-20 17:42 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Feb 20, 2017 at 05:27:39PM +0000, Russell King - ARM Linux wrote:
> No it is not.  As I already pointed out, the interrupt for the 8040 is
> GIC_SPI 71 _not_ GIC_SPI 77 as you have it in this series.
> 
> Both CP110's on Armada 8040 have a default mapping of ICU 77 to GIC 71.

For reference, here's the full boot-time mapping of the ICU.  I don't
know what's responsible for this mapping, but this is read directly
out of the ICU at kernel boot.

Format of the following table is:

ICU-irq => GIC-SPI-num Enable Edge/Level ICU-group

ICU mapping (/cp110-master/config-space at f2000000/interrupt-controller at 1e0000)
    0 =>  32    Lv 0
    1 =>  32    Lv 0
    2 =>  32    Lv 0
    3 =>  32    Lv 0
    4 =>  32    Lv 0
    5 =>  32    Lv 0
    6 =>  32    Lv 0
    7 =>  32    Lv 0
    8 =>  32    Lv 0
    9 =>  32    Lv 0
   10 =>  32    Lv 0
   11 =>  53 En Lv 4
   12 =>  32 En Lv 5
   13 =>  32    Lv 0
   14 =>  32    Lv 0
   15 =>  54 En Lv 4
   16 =>  55 En Lv 4
   17 =>  56 En Lv 4
   18 =>  57 En Lv 4
   19 =>  58 En Lv 4
   20 =>  59 En Lv 4
   21 =>  60 En Lv 4
   22 =>  32 En Lv 0
   23 =>  33 En Lv 0
   24 =>  34 En Lv 0
   25 =>  61 En Lv 4
   26 =>  33 En Lv 5
   27 =>  69 En Lv 0
   28 =>  32    Lv 0
   29 =>  32    Lv 0
   30 =>  32    Lv 0
   31 =>  32    Lv 0
   32 =>  32    Lv 0
   33 =>  35 En Lv 0
   34 =>  35 En Lv 0
   35 =>  35 En Lv 0
   36 =>  35 En Lv 0
   37 =>  32    Lv 0
   38 =>  36 En Lv 0
   39 =>  37 En Lv 0
   40 =>  38 En Lv 0
   41 =>  39 En Lv 0
   42 =>  40 En Lv 0
   43 =>  41 En Lv 0
   44 =>  42 En Lv 0
   45 =>  43 En Lv 0
   46 =>  44 En Lv 0
   47 =>  45 En Lv 0
   48 =>  46 En Lv 0
   49 =>  47 En Lv 0
   50 =>  48 En Lv 0
   51 =>  49 En Lv 0
   52 =>  50 En Lv 0
   53 =>  51 En Lv 0
   54 =>  52 En Lv 0
   55 =>  92 En Lv 0
   56 =>  93 En Lv 0
   57 =>  94 En Lv 0
   58 =>  95 En Lv 0
   59 =>  32    Lv 0
   60 =>  32    Lv 0
   61 =>  32    Lv 0
   62 =>  32    Lv 0
   63 =>  32    Lv 0
   64 =>  32    Lv 0
   65 =>  32    Lv 0
   66 =>  32    Lv 0
   67 =>  32    Lv 0
   68 =>  32    Lv 0
   69 =>  32    Lv 0
   70 =>  32    Lv 0
   71 =>  32    Lv 0
   72 =>  32    Lv 0
   73 =>  32    Lv 0
   74 =>  32    Lv 0
   75 =>  62 En Lv 4
   76 =>  70 En Lv 0
   77 =>  71 En Lv 0
   78 =>  53 En Lv 0
   79 =>  72 En Lv 0
   80 =>  73 En Lv 0
   81 =>  74 En Lv 0
   82 =>  75 En Lv 0
   83 =>  76 En Lv 0
   84 =>  77 En Lv 0
   85 =>  78 En Lv 0
   86 =>  79 En Lv 0
   87 =>  34 En Lv 5
   88 =>  54 En Lv 0
   89 =>  55 En Lv 0
   90 =>  56 En Lv 0
   91 =>  57 En Lv 0
   92 =>  58 En Lv 0
   93 =>  35 En Ed 5
   94 =>  63 En Lv 4
   95 =>  59 En Lv 0
   96 =>  36 En Lv 5
   97 =>  64 En Lv 4
   98 =>  37 En Lv 5
   99 =>  65 En Lv 4
  100 =>  38 En Ed 5
  101 =>  39 En Ed 5
  102 =>  60 En Lv 0
  103 =>  40 En Ed 5
  104 =>  41 En Ed 5
  105 =>  61 En Lv 0
  106 =>  62 En Lv 0
  107 =>  63 En Lv 0
  108 =>  66 En Lv 4
  109 =>  63 En Lv 0
  110 =>  67 En Lv 4
  111 =>  80 En Lv 0
  112 =>  81 En Lv 0
  113 =>  82 En Lv 0
  114 =>  68 En Lv 4
  115 =>  83 En Lv 0
  116 =>  69 En Lv 4
  117 =>  70 En Lv 4
  118 =>  85 En Lv 0
  119 =>  32    Lv 0
  120 =>  86 En Lv 0
  121 =>  87 En Lv 0
  122 =>  88 En Lv 0
  123 =>  89 En Lv 0
  124 =>  90 En Lv 0
  125 =>  91 En Lv 0
  126 =>  65 En Lv 0
  127 =>  66 En Lv 0
  128 =>  67 En Lv 0
  129 =>  68 En Lv 0
ICU mapping (/cp110-slave/config-space at f4000000/interrupt-controller at 1e0000)
    0 =>  32    Lv 0
    1 =>  32    Lv 0
    2 =>  32    Lv 0
    3 =>  32    Lv 0
    4 =>  32    Lv 0
    5 =>  32    Lv 0
    6 =>  32    Lv 0
    7 =>  32    Lv 0
    8 =>  32    Lv 0
    9 =>  32    Lv 0
   10 =>  32    Lv 0
   11 =>  53 En Lv 4
   12 =>  32 En Lv 5
   13 =>  32    Lv 0
   14 =>  32    Lv 0
   15 =>  54 En Lv 4
   16 =>  55 En Lv 4
   17 =>  56 En Lv 4
   18 =>  57 En Lv 4
   19 =>  58 En Lv 4
   20 =>  59 En Lv 4
   21 =>  60 En Lv 4
   22 => 256 En Lv 0
   23 => 257 En Lv 0
   24 => 258 En Lv 0
   25 =>  61 En Lv 4
   26 =>  33 En Lv 5
   27 =>  69 En Lv 0
   28 =>  32    Lv 0
   29 =>  32    Lv 0
   30 =>  32    Lv 0
   31 =>  32    Lv 0
   32 =>  32    Lv 0
   33 => 259 En Lv 0
   34 => 259 En Lv 0
   35 => 259 En Lv 0
   36 => 259 En Lv 0
   37 =>  32    Lv 0
   38 => 260 En Lv 0
   39 => 261 En Lv 0
   40 => 262 En Lv 0
   41 => 263 En Lv 0
   42 => 264 En Lv 0
   43 => 265 En Lv 0
   44 => 266 En Lv 0
   45 => 267 En Lv 0
   46 => 268 En Lv 0
   47 => 269 En Lv 0
   48 => 270 En Lv 0
   49 => 271 En Lv 0
   50 => 272 En Lv 0
   51 => 273 En Lv 0
   52 => 274 En Lv 0
   53 => 275 En Lv 0
   54 => 276 En Lv 0
   55 => 316 En Lv 0
   56 => 317 En Lv 0
   57 => 318 En Lv 0
   58 => 319 En Lv 0
   59 =>  32    Lv 0
   60 =>  32    Lv 0
   61 =>  32    Lv 0
   62 =>  32    Lv 0
   63 =>  32    Lv 0
   64 =>  32    Lv 0
   65 =>  32    Lv 0
   66 =>  32    Lv 0
   67 =>  32    Lv 0
   68 =>  32    Lv 0
   69 =>  32    Lv 0
   70 =>  32    Lv 0
   71 =>  32    Lv 0
   72 =>  32    Lv 0
   73 =>  32    Lv 0
   74 =>  32    Lv 0
   75 =>  62 En Lv 4
   76 =>  70 En Lv 0
   77 =>  71 En Lv 0
   78 => 277 En Lv 0
   79 =>  72 En Lv 0
   80 =>  73 En Lv 0
   81 =>  74 En Lv 0
   82 =>  75 En Lv 0
   83 =>  76 En Lv 0
   84 =>  77 En Lv 0
   85 =>  78 En Lv 0
   86 =>  79 En Lv 0
   87 =>  34 En Lv 5
   88 => 278 En Lv 0
   89 => 279 En Lv 0
   90 => 280 En Lv 0
   91 => 281 En Lv 0
   92 => 282 En Lv 0
   93 =>  35 En Ed 5
   94 =>  63 En Lv 4
   95 => 283 En Lv 0
   96 =>  36 En Lv 5
   97 =>  64 En Lv 4
   98 =>  37 En Lv 5
   99 =>  65 En Lv 4
  100 =>  38 En Ed 5
  101 =>  39 En Ed 5
  102 => 284 En Lv 0
  103 =>  40 En Ed 5
  104 =>  41 En Ed 5
  105 => 285 En Lv 0
  106 => 286 En Lv 0
  107 => 287 En Lv 0
  108 =>  66 En Lv 4
  109 => 287 En Lv 0
  110 =>  67 En Lv 4
  111 =>  80 En Lv 0
  112 =>  81 En Lv 0
  113 =>  82 En Lv 0
  114 =>  68 En Lv 4
  115 =>  83 En Lv 0
  116 =>  69 En Lv 4
  117 =>  70 En Lv 4
  118 =>  85 En Lv 0
  119 =>  32    Lv 0
  120 =>  86 En Lv 0
  121 =>  87 En Lv 0
  122 =>  88 En Lv 0
  123 =>  89 En Lv 0
  124 =>  90 En Lv 0
  125 =>  91 En Lv 0
  126 => 289 En Lv 0
  127 => 290 En Lv 0
  128 => 291 En Lv 0
  129 => 292 En Lv 0

-- 
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K
  2017-02-20 17:36   ` Alexandre Belloni
@ 2017-02-20 17:43     ` Gregory CLEMENT
  2017-02-20 17:50     ` Russell King - ARM Linux
  1 sibling, 0 replies; 12+ messages in thread
From: Gregory CLEMENT @ 2017-02-20 17:43 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Alexandre,
 
 On lun., f?vr. 20 2017, Alexandre Belloni <alexandre.belloni@free-electrons.com> wrote:

> On 20/02/2017 at 18:06:11 +0100, Gregory CLEMENT wrote:
>>  On ven., f?vr. 17 2017, Gregory CLEMENT <gregory.clement@free-electrons.com> wrote:
>> 
>> > The Armada 7K/8K SoCs use the same RTC IP than the Armada 38x. However
>> > the SOC integration differs in 2 points:
>> >      - MBUS bridge timing initialization
>> >      - IRQ configuration at SoC level
>> >
>> > This patch set extends the driver support to these SoCs family.
>> >
>> > In this second version the device tree was updated allowing to use the
>> > RTC on Armada 80x0 SoCs. Indeed on the Armada 80x0, the RTC clock in
>> > CP master is not connected (by package) to the oscillator. So this one
>> > is disabled for the Armada 8020 and the Armada 8040. On these SoCs it
>> > will be the RTC clock in CP slave connected to the oscillator which
>> > will be used.
>> 
>> I saw on IRC than Russell managed to have a more coherent date with this
>> series on his 8040 based board. For the record, as the U-Boot on this
>> board didn't provide a "date reset" command for the RTC located on CP
>> slave, then Russell needed to do the following:
>> 
>> devmem2 0xf428401c w 0
>> devmem2 0xf4284018 w 0x2000
>
> The question being what does that do and whether it could be done in the
> driver instead.

The first time the RTC is powered up it needed to be reset. It is the
purpose of these 2 lines. As it should be done only one time when a the
RTC is powered of the first time it was chosen to be done in the
bootloader.

Maybe later it could be part of the kernel, as an optional parameter for
instance, but currently I don't know if there is more involved when
resetting the RTC.

Gregory



>
> -- 
> Alexandre Belloni, Free Electrons
> Embedded Linux and Kernel engineering
> http://free-electrons.com

-- 
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K
  2017-02-20 17:36   ` Alexandre Belloni
  2017-02-20 17:43     ` Gregory CLEMENT
@ 2017-02-20 17:50     ` Russell King - ARM Linux
  2017-02-20 18:17       ` Alexandre Belloni
  1 sibling, 1 reply; 12+ messages in thread
From: Russell King - ARM Linux @ 2017-02-20 17:50 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Feb 20, 2017 at 06:36:33PM +0100, Alexandre Belloni wrote:
> On 20/02/2017 at 18:06:11 +0100, Gregory CLEMENT wrote:
> >  On ven., f?vr. 17 2017, Gregory CLEMENT <gregory.clement@free-electrons.com> wrote:
> > 
> > > The Armada 7K/8K SoCs use the same RTC IP than the Armada 38x. However
> > > the SOC integration differs in 2 points:
> > >      - MBUS bridge timing initialization
> > >      - IRQ configuration at SoC level
> > >
> > > This patch set extends the driver support to these SoCs family.
> > >
> > > In this second version the device tree was updated allowing to use the
> > > RTC on Armada 80x0 SoCs. Indeed on the Armada 80x0, the RTC clock in
> > > CP master is not connected (by package) to the oscillator. So this one
> > > is disabled for the Armada 8020 and the Armada 8040. On these SoCs it
> > > will be the RTC clock in CP slave connected to the oscillator which
> > > will be used.
> > 
> > I saw on IRC than Russell managed to have a more coherent date with this
> > series on his 8040 based board. For the record, as the U-Boot on this
> > board didn't provide a "date reset" command for the RTC located on CP
> > slave, then Russell needed to do the following:
> > 
> > devmem2 0xf428401c w 0
> > devmem2 0xf4284018 w 0x2000
> 
> The question being what does that do and whether it could be done in the
> driver instead.

It's not specific to the Armada 8040, the same problem exists with
Armada 38x, so holding this up for that reason does not make sense.

>From what I've been told via SolidRun, it's an errata work-around.
Armada 38x needs "date reset" to be given _twice_ in uboot if the
RTC is not functioning, and part of the "date reset" sequence is
the above couple of register writes.

What effect it would have on an already running RTC is not known -
but using "date reset" in uboot for a correct RTC has the effect of
setting it back to 1970.

On Armada 38x:

Table 1461: RTC Clock Correction Register   Offset:   0x000A3818
Bit         Field                Type / InitVal  Description
31:16       Reserved             RSVD   0x0      Reserved
15          Correct Mode         RW     0x0      Correction Mode
                                                 0 = Low
                                                 1 = High
14:0        Correct Value        RW     0x0      Correction Value

Table 1462: RTC Test Configuration Register Offset:   0x000A381C
Bit         Field                Type / InitVal   Description
31:5        Reserved             RSVD   0x0       Reserved
4           Func Test            RW     0x0       Functional Test Acceleration
3:0         Reserved             RSVD   0x0       Reserved

So, we don't know what the first write really does.

I suspect that the errata is "RTC is not reset at power up" for the RTC
power domain.

I don't know where the value of 0x2000 comes from for the correction
value, all I know is that's the value uboot uses with "date reset".
We probably do _not_ want the driver writing that each time the
kernel boots, since that's a tuning parameter.

This is all purely guesswork though.

-- 
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K
  2017-02-20 17:50     ` Russell King - ARM Linux
@ 2017-02-20 18:17       ` Alexandre Belloni
  0 siblings, 0 replies; 12+ messages in thread
From: Alexandre Belloni @ 2017-02-20 18:17 UTC (permalink / raw)
  To: linux-arm-kernel

On 20/02/2017 at 17:50:54 +0000, Russell King - ARM Linux wrote:
> > The question being what does that do and whether it could be done in the
> > driver instead.
> 
> It's not specific to the Armada 8040, the same problem exists with
> Armada 38x, so holding this up for that reason does not make sense.
> 

I agree, I will not delay the patch for that.

> I suspect that the errata is "RTC is not reset at power up" for the RTC
> power domain.
> 
> I don't know where the value of 0x2000 comes from for the correction
> value, all I know is that's the value uboot uses with "date reset".
> We probably do _not_ want the driver writing that each time the
> kernel boots, since that's a tuning parameter.
> 

It is probably a calibration offset. It may be worth exposing to
userspace but without more information, I doubt we can make something
useful out of it.



-- 
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2017-02-20 18:17 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-17 10:19 [PATCH v2 0/3] Extend rtc-armada38x support for Armada 7K/8K Gregory CLEMENT
2017-02-17 10:19 ` [PATCH v2 1/3] rtc: armada38x: Prepare driver to manage different versions Gregory CLEMENT
2017-02-17 10:19 ` [PATCH v2 2/3] rtc: armada38x: Add support for Armada 7K/8K Gregory CLEMENT
2017-02-17 10:19 ` [PATCH v2 3/3] arm64: dts: marvell: add RTC description " Gregory CLEMENT
2017-02-20 17:06 ` [PATCH v2 0/3] Extend rtc-armada38x support " Gregory CLEMENT
2017-02-20 17:27   ` Russell King - ARM Linux
2017-02-20 17:36     ` Gregory CLEMENT
2017-02-20 17:42     ` Russell King - ARM Linux
2017-02-20 17:36   ` Alexandre Belloni
2017-02-20 17:43     ` Gregory CLEMENT
2017-02-20 17:50     ` Russell King - ARM Linux
2017-02-20 18:17       ` Alexandre Belloni

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox