Skip to contentSkip to conversation

rtc: snvs: add Freescale rtc-snvs driver

PATCH Superseded Shawn Guo 3 participants 12 messages Jul 4, 2012 – Jul 12, 2012

Subsystems (5)

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore

Shawn Guo

author
#0 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

Add an RTC driver for Freescale Secure Non-Volatile Storage (SNVS) Low Power (LP) RTC.

Cc Alessandro Zummo <[email protected]>

---
Changes since v1:
* Address the comments Stephen and Kim gave on v1

 .../devicetree/bindings/crypto/fsl-sec4.txt        |   51 +++
 Documentation/devicetree/bindings/rtc/snvs-rtc.txt |    1 +
 drivers/rtc/Kconfig                                |   11 +
 drivers/rtc/Makefile                               |    1 +
 drivers/rtc/rtc-snvs.c                             |  355 ++++++++++++++++++++
 5 files changed, 419 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/rtc/snvs-rtc.txt
 create mode 100644 drivers/rtc/rtc-snvs.c
Documentation/devicetree/bindings/crypto/fsl-sec4.txt +51 -0
index bf57ecd..bd7ce12 100644
@@ -9,6 +9,7 @@ Copyright (C) 2008-2011 Freescale Semiconductor Inc.
    -Run Time Integrity Check (RTIC) Node
    -Run Time Integrity Check (RTIC) Memory Node
    -Secure Non-Volatile Storage (SNVS) Node
+   -Secure Non-Volatile Storage (SNVS) Low Power (LP) RTC Node
    -Full Example
 
 NOTE: the SEC 4 is also known as Freescale's Cryptographic Accelerator
@@ -294,6 +295,27 @@ Secure Non-Volatile Storage (SNVS) Node
           address and length of the SEC4 configuration
           registers.
 
+   - #address-cells
+       Usage: required
+       Value type: <u32>
+       Definition: A standard property.  Defines the number of cells
+           for representing physical addresses in child nodes.  Must
+           have a value of 1.
+
+   - #size-cells
+       Usage: required
+       Value type: <u32>
+       Definition: A standard property.  Defines the number of cells
+           for representing the size of physical addresses in
+           child nodes.  Must have a value of 1.
+
+   - ranges
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: A standard property.  Specifies the physical address
+           range of the SNVS register space.  A triplet that includes
+           the child address, parent address, & length.
+
    - interrupts
       Usage: required
       Value type: <prop_encoded-array>
@@ -314,11 +336,34 @@ EXAMPLE
 	sec_mon at 314000 {
 		compatible = "fsl,sec-v4.0-mon";
 		reg = <0x314000 0x1000>;
+		ranges = <0 0x314000 0x1000>;
 		interrupt-parent = <&mpic>;
 		interrupts = <93 2>;
 	};
 
 =====================================================================
+Secure Non-Volatile Storage (SNVS) Low Power (LP) RTC Node
+
+  A SNVS child node that defines SNVS LP RTC.
+
+  - compatible
+      Usage: required
+      Value type: <string>
+      Definition: Must include "fsl,sec-v4.0-mon-rtc-lp".
+
+  - reg
+      Usage: required
+      Value type: <prop-encoded-array>
+      Definition: A standard property.  Specifies the physical
+          address and length of the SNVS LP configuration registers.
+
+EXAMPLE
+	sec_mon_rtc_lp at 314000 {
+		compatible = "fsl,sec-v4.0-mon-rtc-lp";
+		reg = <0x34 0x58>;
+	};
+
+=====================================================================
 FULL EXAMPLE
 
 	crypto: crypto at 300000 {
@@ -390,8 +435,14 @@ FULL EXAMPLE
 	sec_mon: sec_mon at 314000 {
 		compatible = "fsl,sec-v4.0-mon";
 		reg = <0x314000 0x1000>;
+		ranges = <0 0x314000 0x1000>;
 		interrupt-parent = <&mpic>;
 		interrupts = <93 2>;
+
+		sec_mon_rtc_lp at 34 {
+			compatible = "fsl,sec-v4.0-mon-rtc-lp";
+			reg = <0x34 0x58>;
+		};
 	};
 
 =====================================================================
Documentation/devicetree/bindings/rtc/snvs-rtc.txt new file +1 -0
new file mode 100644
index 0000000..fb61ed7
@@ -0,0 +1 @@
+See Documentation/devicetree/bindings/crypto/fsl-sec4.txt for details.
drivers/rtc/Kconfig +11 -0
index 08cbdb9..e174e16 100644
@@ -1087,4 +1087,15 @@ config RTC_DRV_MXC
 	   This driver can also be built as a module, if so, the module
 	   will be called "rtc-mxc".
 
+config RTC_DRV_SNVS
+	tristate "Freescale SNVS RTC support"
+	depends on HAS_IOMEM
+	depends on OF
+	help
+	   If you say yes here you get support for the Freescale SNVS
+	   Low Power (LP) RTC module.
+
+	   This driver can also be built as a module, if so, the module
+	   will be called "rtc-snvs".
+
 endif # RTC_CLASS
drivers/rtc/Makefile +1 -0
index 2973921..0e3ff92 100644
@@ -95,6 +95,7 @@ obj-$(CONFIG_RTC_DRV_S35390A)	+= rtc-s35390a.o
 obj-$(CONFIG_RTC_DRV_S3C)	+= rtc-s3c.o
 obj-$(CONFIG_RTC_DRV_SA1100)	+= rtc-sa1100.o
 obj-$(CONFIG_RTC_DRV_SH)	+= rtc-sh.o
+obj-$(CONFIG_RTC_DRV_SNVS)	+= rtc-snvs.o
 obj-$(CONFIG_RTC_DRV_SPEAR)	+= rtc-spear.o
 obj-$(CONFIG_RTC_DRV_STARFIRE)	+= rtc-starfire.o
 obj-$(CONFIG_RTC_DRV_STK17TA8)	+= rtc-stk17ta8.o
drivers/rtc/rtc-snvs.c new file +355 -0

355 lines not on this page · raw message

Signature · 1 line
1.7.5.4
#1 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

Quoted 5 lines · Shawn Guo

Add an RTC driver for Freescale Secure Non-Volatile Storage (SNVS) Low Power (LP) RTC.

Cc Alessandro Zummo <[email protected]>

Besides the minor comment below, please add

Quoted 15 lines
drivers/rtc/rtc-snvs.c new file +15 -0
+#ifdef CONFIG_PM
+static int snvs_rtc_suspend(struct device *dev)
+{
+	struct snvs_rtc_data *data = dev_get_drvdata(dev);
+
+	if (device_may_wakeup(dev))
+		enable_irq_wake(data->irq);
+
+	return 0;
+}
+
+static int snvs_rtc_resume(struct device *dev)
+{
+	struct snvs_rtc_data *data = dev_get_drvdata(dev);
+

drivers/rtc/rtc-snvs.c line 330

Quoted 10 lines
drivers/rtc/rtc-snvs.c new file +10 -0
+	if (device_may_wakeup(dev))
+		disable_irq_wake(data->irq);
+
+	return 0;
+}
+
+static const struct dev_pm_ops snvs_rtc_pm_ops = {
+	.suspend = snvs_rtc_suspend,
+	.resume = snvs_rtc_resume,
+};

Can you use the SIMPLE_DEV_PM_OPS? Then we get the same callbacks for hibernation.

Quoted 5 lines
drivers/rtc/rtc-snvs.c new file +5 -0
+#endif
+
+static const struct of_device_id __devinitconst snvs_dt_ids[] = {
+	{ .compatible = "fsl,sec-v4.0-mon-rtc-lp", },
+	{ /* sentinel */ }

drivers/rtc/rtc-snvs.c line 345

Quoted 10 lines
drivers/rtc/rtc-snvs.c new file +10 -0
+};
+MODULE_DEVICE_TABLE(of, snvs_dt_ids);
+
+static struct platform_driver snvs_rtc_driver = {
+	.driver = {
+		.name	= "snvs_rtc",
+		.owner	= THIS_MODULE,
+#ifdef CONFIG_PM
+		.pm	= &snvs_rtc_pm_ops,
+#endif

Doing that avoids having an ifdef here.

Quoted 10 lines
drivers/rtc/rtc-snvs.c new file +10 -0
+		.of_match_table = snvs_dt_ids,
+	},
+	.probe		= snvs_rtc_probe,
+	.remove		= __devexit_p(snvs_rtc_remove),
+};
+module_platform_driver(snvs_rtc_driver);
+
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_DESCRIPTION("Freescale SNVS RTC Driver");
+MODULE_LICENSE("GPL");
Signature · 2 lines
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
#2 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

In reply to Shawn Guo

drivers/rtc/rtc-snvs.c line 334

Quoted 2 lines · On Wed, 4 Jul 2012 23:38:14 +0800 Shawn Guo <[email protected]> wrote:
drivers/rtc/rtc-snvs.c new file +2 -0
+static const struct of_device_id __devinitconst snvs_dt_ids[] = {
+	{ .compatible = "fsl,sec-v4.0-mon-rtc-lp", },

the driver should be compatible with "fsl,sec-v4.0-mon", and its probe function search for "fsl,sec-v4.0-mon-rtc-lp" sub-compatibles (and possibly "fsl,sec-v4.0-mon-rtc-hp" in the future?).

Kim

author
#3 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

Quoted 10 lines · Kim Phillips

drivers/rtc/rtc-snvs.c line 334

Quoted 2 lines · On Wed, 4 Jul 2012 23:38:14 +0800 Shawn Guo <[email protected]> wrote:
drivers/rtc/rtc-snvs.c new file +2 -0
+static const struct of_device_id __devinitconst snvs_dt_ids[] = {
+	{ .compatible = "fsl,sec-v4.0-mon-rtc-lp", },

the driver should be compatible with "fsl,sec-v4.0-mon", and its probe function search for "fsl,sec-v4.0-mon-rtc-lp" sub-compatibles (and possibly "fsl,sec-v4.0-mon-rtc-hp" in the future?).

So you think snvs is all about rtc (lp and hp), nothing else? If that is true, it's reasonable to do what you suggested here. Otherwise, we should have a snvs driver be compatible with "fsl,sec-v4.0-mon", and this driver should be responsible for populate all the sub-devices of snvs, rtc-lp, rtc-hp, and others. In the latter case, rtc-snvs should just stay as it stands right now.

Signature · 2 lines
Regards,
Shawn
#4 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

Quoted 4 lines · On Fri, 6 Jul 2012 08:22:56 +0800 Shawn Guo <[email protected]> wrote:
Quoted 3 lines · Kim Phillips

On Wed, 4 Jul 2012 23:38:14 +0800
Shawn Guo <[email protected]> wrote:

Quoted 8 lines
Quoted 7 lines

Review

Quoted 2 lines
(quoted diff) +2 -0
+static const struct of_device_id __devinitconst snvs_dt_ids[] = {
+	{ .compatible = "fsl,sec-v4.0-mon-rtc-lp", },

the driver should be compatible with "fsl,sec-v4.0-mon", and its probe function search for "fsl,sec-v4.0-mon-rtc-lp" sub-compatibles (and possibly "fsl,sec-v4.0-mon-rtc-hp" in the future?).

So you think snvs is all about rtc (lp and hp), nothing else? If that

no, I'm aware that it's more than a couple of RTCs.

Quoted 5 lines

is true, it's reasonable to do what you suggested here. Otherwise, we should have a snvs driver be compatible with "fsl,sec-v4.0-mon", and this driver should be responsible for populate all the sub-devices of snvs, rtc-lp, rtc-hp, and others. In the latter case, rtc-snvs should just stay as it stands right now.

but it doesn't function as it stands right now, at least on Power. The compatible in the device tree's sec_mon node "fsl,sec-v4.0-mon" and the driver's "fsl,sec-v4.0-mon-rtc-lp" don't match. Here are the device tree changes I used:

arch/powerpc/boot/dts/fsl/qoriq-sec4.2-0.dtsi +8 -0
index 7990e0d..14c933b 100644
@@ -104,6 +104,14 @@ crypto: crypto at 300000 {
 
 sec_mon: sec_mon at 314000 {
        compatible = "fsl,sec-v4.2-mon", "fsl,sec-v4.0-mon";
+       #address-cells = <1>;
+       #size-cells = <1>;
+       ranges = <0 0x314000 0x1000>;
        reg = <0x314000 0x1000>;
        interrupts = <93 2 0 0>;
+
+       sec_mon_rtc_lp at 34 {
+               compatible = "fsl,sec-v4.2-mon-rtc-lp", "fsl,sec-v4.0-mon-rtc-lp";
+               reg = <0x34 0x58>;
+       };
 };

btw, I don't see any imx6q.dtsi changes.

Kim

author
#5 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

Quoted 15 lines · Kim Phillips

but it doesn't function as it stands right now, at least on Power. The compatible in the device tree's sec_mon node "fsl,sec-v4.0-mon" and the driver's "fsl,sec-v4.0-mon-rtc-lp" don't match. Here are the device tree changes I used:

arch/powerpc/boot/dts/fsl/qoriq-sec4.2-0.dtsi +1 -0
index 7990e0d..14c933b 100644
@@ -104,6 +104,14 @@ crypto: crypto at 300000 {
 
 sec_mon: sec_mon at 314000 {
        compatible = "fsl,sec-v4.2-mon", "fsl,sec-v4.0-mon";
+       #address-cells = <1>;

arch/powerpc/boot/dts/fsl/qoriq-sec4.2-0.dtsi crypto: crypto at 300000 { · line 117

Quoted 10 lines
arch/powerpc/boot/dts/fsl/qoriq-sec4.2-0.dtsi +7 -0
+       #size-cells = <1>;
+       ranges = <0 0x314000 0x1000>;
        reg = <0x314000 0x1000>;
        interrupts = <93 2 0 0>;
+
+       sec_mon_rtc_lp at 34 {
+               compatible = "fsl,sec-v4.2-mon-rtc-lp", "fsl,sec-v4.0-mon-rtc-lp";
+               reg = <0x34 0x58>;
+       };
 };

Yes, the way that this dts is written as well as the examples in Documentation/devicetree/bindings/crypto/fsl-sec4.txt assume there is a sec_mon driver. This driver will match "fsl,sec-v4.0-mon" and populate rtc-lp device probed by the rtc-snvs driver created by the patch.

While there is no such sec_mon driver right now. I did a quick tweaking on imx6q.dtsi to have rtc-snvs probed without the need of sec_mon driver.

Quoted 2 lines

btw, I don't see any imx6q.dtsi changes.

See below.

Either way, being a driver of SNVS LP RTC, rtc-snvs should just stand as it stands right now. It should not care about how the device is populated, by DT core or by sec_mon driver.

Regards,
Shawn

arch/arm/boot/dts/imx6q.dtsi +10 -2
index 8c90cba..26c42da 100644
@@ -455,8 +455,16 @@
                        };
 
                        snvs at 020cc000 {
-                               reg = <0x020cc000 0x4000>;
-                               interrupts = <0 19 0x04 0 20 0x04>;
+                               compatible = "fsl,sec-v4.0-mon", "simple-bus";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 0x020cc000 0x4000>;
+
+                               snvs-rtc-lp at 34 {
+                                       compatible = "fsl,sec-v4.0-mon-rtc-lp";
+                                       reg = <0x34 0x58>;
+                                       interrupts = <0 19 0x04 0 20 0x04>;
+                               };
                        };
 
                        epit at 020d0000 { /* EPIT1 */
#6 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

Quoted 35 lines · On Mon, 9 Jul 2012 14:51:18 +0800 Shawn Guo <[email protected]> wrote:
Quoted 15 lines · Kim Phillips

but it doesn't function as it stands right now, at least on Power. The compatible in the device tree's sec_mon node "fsl,sec-v4.0-mon" and the driver's "fsl,sec-v4.0-mon-rtc-lp" don't match. Here are the device tree changes I used:

arch/powerpc/boot/dts/fsl/qoriq-sec4.2-0.dtsi +1 -0
index 7990e0d..14c933b 100644
@@ -104,6 +104,14 @@ crypto: crypto at 300000 {
 
 sec_mon: sec_mon at 314000 {
        compatible = "fsl,sec-v4.2-mon", "fsl,sec-v4.0-mon";
+       #address-cells = <1>;

arch/powerpc/boot/dts/fsl/qoriq-sec4.2-0.dtsi crypto: crypto at 300000 { · line 117

Quoted 10 lines
arch/powerpc/boot/dts/fsl/qoriq-sec4.2-0.dtsi +7 -0
+       #size-cells = <1>;
+       ranges = <0 0x314000 0x1000>;
        reg = <0x314000 0x1000>;
        interrupts = <93 2 0 0>;
+
+       sec_mon_rtc_lp at 34 {
+               compatible = "fsl,sec-v4.2-mon-rtc-lp", "fsl,sec-v4.0-mon-rtc-lp";
+               reg = <0x34 0x58>;
+       };
 };

Yes, the way that this dts is written as well as the examples in Documentation/devicetree/bindings/crypto/fsl-sec4.txt assume there is a sec_mon driver. This driver will match "fsl,sec-v4.0-mon" and populate rtc-lp device probed by the rtc-snvs driver created by the patch.

While there is no such sec_mon driver right now. I did a quick tweaking on imx6q.dtsi to have rtc-snvs probed without the need of sec_mon driver.

...

Quoted 16 lines
Quoted 2 lines

btw, I don't see any imx6q.dtsi changes.

See below.

Either way, being a driver of SNVS LP RTC, rtc-snvs should just stand as it stands right now. It should not care about how the device is populated, by DT core or by sec_mon driver.

Regards,
Shawn

arch/arm/boot/dts/imx6q.dtsi +0 -0
index 8c90cba..26c42da 100644

arch/arm/boot/dts/imx6q.dtsi line 458

Quoted 6 lines
arch/arm/boot/dts/imx6q.dtsi +1 -2
@@ -455,8 +455,16 @@
                        };
 
                        snvs at 020cc000 {
-                               reg = <0x020cc000 0x4000>;
-                               interrupts = <0 19 0x04 0 20 0x04>;
+                               compatible = "fsl,sec-v4.0-mon", "simple-bus";

ah, "simple-bus" was the missing tweak.

I'm not sure if this is appropriate vs. having common arch code publish SNVS devices; see e.g., the other fsl,* devices in arch/powerpc/platforms/85xx/common.c:mpc85xx_common_ids[].

Either way, I'd like to get support without having to manually tweak the device tree, i.e., the patch doesn't work as-is.

btw, testing on a p4080r2 produces a soft lockup:

root at p4080ds:~# modprobe rtc-snvs
snvs_rtc ffe314034.sec_mon_rtc_lp: rtc core: registered ffe314034.sec_mon_r as rtc1 root at p4080ds:~# hwclock -w -f /dev/rtc1

BUG: soft lockup - CPU#0 stuck for 23s! [kworker/0:0:4]
Modules linked in: rtc_snvs nfsd exportfs
irq event stamp: 54
hardirqs last  enabled at (53): [<c04f90dc>] _raw_spin_unlock_irq+0x30/0x58
hardirqs last disabled at (54): [<c04f8808>] _raw_spin_lock_irq+0x24/0x70
softirqs last  enabled at (0): [<c001eff8>] copy_process+0x2f4/0xde4
softirqs last disabled at (0): [<  (null)>]   (null)
NIP: f10b80b4 LR: f10b8074 CTR: 00000003
REGS: ee071d70 TRAP: 0901   Not tainted  (3.5.0-rc5-00099-gd8715a7-dirty)
MSR: 00029002 <CE,EE,ME>  CR: 42042022  XER: 00000000

TASK = ee06f470[4] 'kworker/0:0' THREAD: ee070000 CPU: 0
GPR00: 00000000 ee071e20 ee06f470 c04f9058 00000001 f10b8074 00000000 00000002
GPR08: 00000001 f10bc054 00000000 00000000 c04f901c
NIP [f10b80b4] snvs_rtc_alarm_irq_enable+0xb4/0xf8 [rtc_snvs]
LR [f10b8074] snvs_rtc_alarm_irq_enable+0x74/0xf8 [rtc_snvs]

Call Trace:
[ee071e20] [f10b8074] snvs_rtc_alarm_irq_enable+0x74/0xf8 [rtc_snvs] (unreliable)
[ee071e40] [c038c118] rtc_timer_do_work+0x184/0x20c
[ee071f10] [c003fc4c] process_one_work+0x1d4/0x48c
[ee071f50] [c0040d4c] worker_thread+0x184/0x358
[ee071f90] [c0046458] kthread+0x84/0x88
[ee071ff0] [c000d434] kernel_thread+0x4c/0x68

Instruction dump:
7c0004ac 7d404c2c 0c0a0000 4c00012c 7c0004ac 7c004c2c 0c000000 4c00012c 7f8a0000 409effdc 7c0004ac 7c004c2c <0c000000> 4c00012c 7c0004ac 7d604c2c

I debugged it to the innermost loop of rtc_write_sync_lp(), where count2 and count3 are always equal. Should there be a timeout in that loop? Do you know if this is because the machine isn't in trusted mode? Any other hints appreciated.

Kim

author
#7 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

Quoted 4 lines · Kim Phillips

I'm not sure if this is appropriate vs. having common arch code publish SNVS devices; see e.g., the other fsl,* devices in arch/powerpc/platforms/85xx/common.c:mpc85xx_common_ids[].

This is completely beyond the scope of the patch, which merely adds a driver for snvs-lp-rtc device. But the driver does not know how the device is created, and it does not need to know.

Quoted 3 lines

Either way, I'd like to get support without having to manually tweak the device tree, i.e., the patch doesn't work as-is.

As I already said, the patch only adds a driver for snvs-lp-rtc. It should not care about how snvs-lp-rtc device is created on particular platform. The patch does work as-is for imx6q, which is the target of the patch so far.

Quoted 27 lines

btw, testing on a p4080r2 produces a soft lockup:

root at p4080ds:~# modprobe rtc-snvs
snvs_rtc ffe314034.sec_mon_rtc_lp: rtc core: registered ffe314034.sec_mon_r as rtc1 root at p4080ds:~# hwclock -w -f /dev/rtc1

BUG: soft lockup - CPU#0 stuck for 23s! [kworker/0:0:4]
Modules linked in: rtc_snvs nfsd exportfs
irq event stamp: 54
hardirqs last  enabled at (53): [<c04f90dc>] _raw_spin_unlock_irq+0x30/0x58
hardirqs last disabled at (54): [<c04f8808>] _raw_spin_lock_irq+0x24/0x70
softirqs last  enabled at (0): [<c001eff8>] copy_process+0x2f4/0xde4
softirqs last disabled at (0): [<  (null)>]   (null)
NIP: f10b80b4 LR: f10b8074 CTR: 00000003
REGS: ee071d70 TRAP: 0901   Not tainted  (3.5.0-rc5-00099-gd8715a7-dirty)
MSR: 00029002 <CE,EE,ME>  CR: 42042022  XER: 00000000

TASK = ee06f470[4] 'kworker/0:0' THREAD: ee070000 CPU: 0
GPR00: 00000000 ee071e20 ee06f470 c04f9058 00000001 f10b8074 00000000 00000002
GPR08: 00000001 f10bc054 00000000 00000000 c04f901c
NIP [f10b80b4] snvs_rtc_alarm_irq_enable+0xb4/0xf8 [rtc_snvs]
LR [f10b8074] snvs_rtc_alarm_irq_enable+0x74/0xf8 [rtc_snvs]

Call Trace:
[ee071e20] [f10b8074] snvs_rtc_alarm_irq_enable+0x74/0xf8 [rtc_snvs] (unreliable)
[ee071e40] [c038c118] rtc_timer_do_work+0x184/0x20c
[ee071f10] [c003fc4c] process_one_work+0x1d4/0x48c
[ee071f50] [c0040d4c] worker_thread+0x184/0x358
[ee071f90] [c0046458] kthread+0x84/0x88
[ee071ff0] [c000d434] kernel_thread+0x4c/0x68
Quoted 9 lines

Instruction dump:
7c0004ac 7d404c2c 0c0a0000 4c00012c 7c0004ac 7c004c2c 0c000000 4c00012c 7f8a0000 409effdc 7c0004ac 7c004c2c <0c000000> 4c00012c 7c0004ac 7d604c2c

I debugged it to the innermost loop of rtc_write_sync_lp(), where count2 and count3 are always equal. Should there be a timeout in that loop? Do you know if this is because the machine isn't in trusted mode? Any other hints appreciated.

This is probably because readl/writel does not work on powerpc. I experienced the same thing when working on fsl_ssi driver.

My patch only targets imx6q right now.

Signature · 2 lines
Regards,
Shawn
#8 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

Quoted 9 lines · On Tue, 10 Jul 2012 10:32:29 +0800 Shawn Guo <[email protected]> wrote:
Quoted 4 lines · Kim Phillips

I'm not sure if this is appropriate vs. having common arch code publish SNVS devices; see e.g., the other fsl,* devices in arch/powerpc/platforms/85xx/common.c:mpc85xx_common_ids[].

This is completely beyond the scope of the patch, which merely adds a driver for snvs-lp-rtc device. But the driver does not know how the device is created, and it does not need to know.

Quoted 7 lines
Quoted 3 lines

Either way, I'd like to get support without having to manually tweak the device tree, i.e., the patch doesn't work as-is.

As I already said, the patch only adds a driver for snvs-lp-rtc. It should not care about how snvs-lp-rtc device is created on particular platform. The patch does work as-is for imx6q, which is the target of the patch so far.

how, without the "simple-bus" addition to the sec_mon compatibles list in the imx6 device tree (which isn't present in this patch)?

Quoted 36 lines
Quoted 27 lines

btw, testing on a p4080r2 produces a soft lockup:

root at p4080ds:~# modprobe rtc-snvs
snvs_rtc ffe314034.sec_mon_rtc_lp: rtc core: registered ffe314034.sec_mon_r as rtc1 root at p4080ds:~# hwclock -w -f /dev/rtc1

BUG: soft lockup - CPU#0 stuck for 23s! [kworker/0:0:4]
Modules linked in: rtc_snvs nfsd exportfs
irq event stamp: 54
hardirqs last  enabled at (53): [<c04f90dc>] _raw_spin_unlock_irq+0x30/0x58
hardirqs last disabled at (54): [<c04f8808>] _raw_spin_lock_irq+0x24/0x70
softirqs last  enabled at (0): [<c001eff8>] copy_process+0x2f4/0xde4
softirqs last disabled at (0): [<  (null)>]   (null)
NIP: f10b80b4 LR: f10b8074 CTR: 00000003
REGS: ee071d70 TRAP: 0901   Not tainted  (3.5.0-rc5-00099-gd8715a7-dirty)
MSR: 00029002 <CE,EE,ME>  CR: 42042022  XER: 00000000

TASK = ee06f470[4] 'kworker/0:0' THREAD: ee070000 CPU: 0
GPR00: 00000000 ee071e20 ee06f470 c04f9058 00000001 f10b8074 00000000 00000002
GPR08: 00000001 f10bc054 00000000 00000000 c04f901c
NIP [f10b80b4] snvs_rtc_alarm_irq_enable+0xb4/0xf8 [rtc_snvs]
LR [f10b8074] snvs_rtc_alarm_irq_enable+0x74/0xf8 [rtc_snvs]

Call Trace:
[ee071e20] [f10b8074] snvs_rtc_alarm_irq_enable+0x74/0xf8 [rtc_snvs] (unreliable)
[ee071e40] [c038c118] rtc_timer_do_work+0x184/0x20c
[ee071f10] [c003fc4c] process_one_work+0x1d4/0x48c
[ee071f50] [c0040d4c] worker_thread+0x184/0x358
[ee071f90] [c0046458] kthread+0x84/0x88
[ee071ff0] [c000d434] kernel_thread+0x4c/0x68
Quoted 9 lines

Instruction dump:
7c0004ac 7d404c2c 0c0a0000 4c00012c 7c0004ac 7c004c2c 0c000000 4c00012c 7f8a0000 409effdc 7c0004ac 7c004c2c <0c000000> 4c00012c 7c0004ac 7d604c2c

I debugged it to the innermost loop of rtc_write_sync_lp(), where count2 and count3 are always equal. Should there be a timeout in that loop? Do you know if this is because the machine isn't in trusted mode? Any other hints appreciated.

Quoted 4 lines

This is probably because readl/writel does not work on powerpc. I experienced the same thing when working on fsl_ssi driver.

My patch only targets imx6q right now.

interesting. When I add

+#define readl in_be32
+#define writel(val, addr) out_be32(addr, val)

to the top of the driver, the soft-lockup moves to rtc_read_lp_counter(). I'm trying to verify if I have the right h/w revision.

Kim

author
#9 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

Quoted 3 lines · Kim Phillips

how, without the "simple-bus" addition to the sec_mon compatibles list in the imx6 device tree (which isn't present in this patch)?

This patch does not present anything about sec_mon node. It's all about sec_mon_rtc_lp node. The driver itself does not know if the rtc_lp node is a subnode of sec_mon node at all.

Can you please tell me what exact change you expect me to make on drivers/rtc/rtc-snvs.c? The patch merely adds a lp-rtc driver and should not include any platform specific changes (dts, etc.) The driver and dts changes are two orthogonal parts, and should go via RTC tree and ARCH tree separately.

Quoted 9 lines

interesting. When I add

(quoted diff) +2 -0
+#define readl in_be32
+#define writel(val, addr)             out_be32(addr, val)

to the top of the driver, the soft-lockup moves to rtc_read_lp_counter(). I'm trying to verify if I have the right h/w revision.

You can submit an incremental patch later to make the driver work for powerpc.

Signature · 2 lines
Regards,
Shawn
#10 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

Quoted 5 lines · On Wed, 11 Jul 2012 10:57:55 +0800 Shawn Guo <[email protected]> wrote:
Quoted 3 lines · Kim Phillips

how, without the "simple-bus" addition to the sec_mon compatibles list in the imx6 device tree (which isn't present in this patch)?

This patch does not present anything about sec_mon node.

it makes a change to its definition in the device tree documentation.

Quoted 1 line

It's all about sec_mon_rtc_lp node.

the change is that the sec_mon node now includes the sec_mon_rtc_lp node, and they are related, just as in h/w.

Quoted 2 lines

The driver itself does not know if the
rtc_lp node is a subnode of sec_mon node at all.

I understand that, but as it stands (and AFAICT), this patch by itself doesn't enable the driver to be probed on _any_ platform, including ARM.

Quoted 5 lines

Can you please tell me what exact change you expect me to make on drivers/rtc/rtc-snvs.c? The patch merely adds a lp-rtc driver and should not include any platform specific changes (dts, etc.) The driver and dts changes are two orthogonal parts, and should go via RTC tree and ARCH tree separately.

That's odd; I would expect all enabling changes to either be included in the same patch, or at least in the same patchseries, and one subsystem maintainer ack the other. If ARM-related patch processes differ somehow, then so be it.

Quoted 11 lines
Quoted 9 lines

interesting. When I add

(quoted diff) +2 -0
+#define readl in_be32
+#define writel(val, addr)             out_be32(addr, val)

to the top of the driver, the soft-lockup moves to rtc_read_lp_counter(). I'm trying to verify if I have the right h/w revision.

You can submit an incremental patch later to make the driver work for powerpc.

Turns out there was a mistake in the QorIQ series documentation that exposed SRTC registers even though the SNVS LP SRTC isn't physically present on any of the Power based parts; I've since notified the documentation team.

Thanks,

Kim

author
#11 lore raw

PATCH v2 1/1 rtc: snvs: add Freescale rtc-snvs driver

Quoted 7 lines · Kim Phillips
Quoted 4 lines · On Wed, 11 Jul 2012 10:57:55 +0800 Shawn Guo <[email protected]> wrote:
Quoted 3 lines · Kim Phillips

how, without the "simple-bus" addition to the sec_mon compatibles list in the imx6 device tree (which isn't present in this patch)?

Quoted 9 lines
Quoted 1 line

This patch does not present anything about sec_mon node.

it makes a change to its definition in the device tree documentation.

Quoted 1 line

It's all about sec_mon_rtc_lp node.

the change is that the sec_mon node now includes the sec_mon_rtc_lp node, and they are related, just as in h/w.

I'm primarily talking about drivers/rtc/rtc-snvs.c. There is no change required on drivers/rtc/rtc-snvs.c whether the device is created by a sec_mon driver or "simple-bus" approach.

Quoted 7 lines
Quoted 2 lines

The driver itself does not know if the
rtc_lp node is a subnode of sec_mon node at all.

I understand that, but as it stands (and AFAICT), this patch by itself doesn't enable the driver to be probed on _any_ platform, including ARM.

It's never a thing that RTC driver should care. As long as the driver is verified to be functional, it's platform's call to enable the device or not on particular board/system.

Quoted 11 lines
Quoted 5 lines

Can you please tell me what exact change you expect me to make on drivers/rtc/rtc-snvs.c? The patch merely adds a lp-rtc driver and should not include any platform specific changes (dts, etc.) The driver and dts changes are two orthogonal parts, and should go via RTC tree and ARCH tree separately.

That's odd; I would expect all enabling changes to either be included in the same patch, or at least in the same patchseries, and one subsystem maintainer ack the other. If ARM-related patch processes differ somehow, then so be it.

I don't think it's an ARM-related process. The process you mentioned is only used for particular case where a series touches multiple subsystems while the whole series has to go via one tree in order to maintain "git bisect". Since there is no bisect for a new driver to maintain at all, it should just follow the general process, having patches go via respective subsystem tree to minimize the merge conflicts when different trees get merged together.

Signature · 2 lines
Regards,
Shawn