Linux RTC
 help / color / mirror / Atom feed
* Re: [PATCH v3 1/2] dt-bindings: rtc: Add Spreadtrum SC27xx RTC documentation
From: Rob Herring @ 2017-11-15 15:32 UTC (permalink / raw)
  To: Baolin Wang
  Cc: a.zummo, alexandre.belloni, mark.rutland, devicetree,
	linux-kernel, linux-rtc, broonie, baolin.wang
In-Reply-To: <c65b61e5e37cb43214973cb3e479ce06c4a73395.1510198341.git.baolin.wang@spreadtrum.com>

On Thu, Nov 09, 2017 at 11:34:16AM +0800, Baolin Wang wrote:
> This patch adds the binding documentation for Spreadtrum SC27xx series
> RTC device.
> 
> Signed-off-by: Baolin Wang <baolin.wang@spreadtrum.com>
> ---
> Changes since v2:
>  - No updates.
> 
> Changes since v1:
>  - Use a specific chip name as compatible string.
>  - Remove useless alias.
>  - Add the parent MFD node.
> ---
>  .../devicetree/bindings/rtc/sprd,sc27xx-rtc.txt    |   27 ++++++++++++++++++++
>  1 file changed, 27 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/rtc/sprd,sc27xx-rtc.txt

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply

* [PATCH] dt-bindings: rtc: imxdi: Improve the bindings text
From: Fabio Estevam @ 2017-11-15 12:59 UTC (permalink / raw)
  To: alexandre.belloni; +Cc: robh+dt, devicetree, jbe, Fabio Estevam

From: Fabio Estevam <fabio.estevam@nxp.com>

Improve the bindings text by doing the following changes:

- Remove the i.MX53 reference, as the RTC on i.MX53 is a different hardware
- Add 'clocks' to the list of required properties
- Explain that the optional security violation irq is the second entry
- Use the real unit address and irq numbers for i.MX25

Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
---
 Documentation/devicetree/bindings/rtc/imxdi-rtc.txt | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/Documentation/devicetree/bindings/rtc/imxdi-rtc.txt b/Documentation/devicetree/bindings/rtc/imxdi-rtc.txt
index 323cf26..b8f3050 100644
--- a/Documentation/devicetree/bindings/rtc/imxdi-rtc.txt
+++ b/Documentation/devicetree/bindings/rtc/imxdi-rtc.txt
@@ -1,20 +1,20 @@
 * i.MX25 Real Time Clock controller
 
-This binding supports the following chips: i.MX25, i.MX53
-
 Required properties:
 - compatible: should be: "fsl,imx25-rtc"
 - reg: physical base address of the controller and length of memory mapped
   region.
+- clocks: should contain the phandle for the rtc clock
 - interrupts: rtc alarm interrupt
 
 Optional properties:
-- interrupts: dryice security violation interrupt
+- interrupts: dryice security violation interrupt (second entry)
 
 Example:
 
-rtc@80056000 {
-	compatible = "fsl,imx53-rtc", "fsl,imx25-rtc";
-	reg = <0x80056000 2000>;
-	interrupts = <29 56>;
+rtc@53ffc000 {
+	compatible = "fsl,imx25-rtc";
+	reg = <0x53ffc000 0x4000>;
+	clocks = <&clks 81>;
+	interrupts = <25 56>;
 };
-- 
2.7.4

^ permalink raw reply related

* Re: DryIce , RTC not working on imx53.
From: Fabio Estevam @ 2017-11-15 11:42 UTC (permalink / raw)
  To: Juergen Borleis
  Cc: linux-arm-kernel@lists.infradead.org, Alexandre Belloni,
	Vellemans, Noel, linux-rtc@vger.kernel.org, Patrick Brünn
In-Reply-To: <201711151053.13676.jbe@pengutronix.de>

On Wed, Nov 15, 2017 at 7:53 AM, Juergen Borleis <jbe@pengutronix.de> wrote:

> After a quick look into the reference manuals:
>
> Patch 5b72505 ("ARM: dts: imx53: add srtc node") is bad. The i.MX53 provides
> an RTC more close to the i.MX6 instead (e.g. rtc-snvs.c). But unfortunately
> it uses a different register layout than the i.MX6 does. So we can't use
> this driver without i.MX53 specific adaptions.
> But at least 5b72505 should be reverted.

Agreed. Looked in the vendor kernel and this is the rtc driver for mx53:
http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/tree/drivers/rtc/rtc-mxc_v2.c?h=imx_2.6.35_11.09.01

,which is a different one from the dryice one:
http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/tree/drivers/rtc/rtc-imxdi.c?h=imx_2.6.35_11.09.01

I will send a revert for 5b72505 ("ARM: dts: imx53: add srtc node").

Thanks

^ permalink raw reply

* Re: [PATCH] rtc: Add tracepoints for RTC system
From: Baolin Wang @ 2017-11-15 10:05 UTC (permalink / raw)
  To: Alexandre Belloni
  Cc: Alessandro Zummo, Steven Rostedt, Ingo Molnar, linux-rtc, LKML,
	Arnd Bergmann, Mark Brown
In-Reply-To: <20171115092539.xrenngsxvsxzizs3@piout.net>

Hi Alexandre,

On 15 November 2017 at 17:25, Alexandre Belloni
<alexandre.belloni@free-electrons.com> wrote:
> Hi,
>
> On 15/11/2017 at 15:30:21 +0800, Baolin Wang wrote:
>> It will be more helpful to add some tracepoints to track RTC actions when
>> debugging RTC driver. Below sample is that we set/read the RTC time, then
>> set 2 alarms, so we can see the trace logs:
>
> I'm not sure it is actually useful when debugging an RTC driver because
> you will be interested in the real values that are written to or read
> from the RTC, not what is returned by the driver to the RTC core as this
> information is already readily available to userspace.
>
> Is this really worth the added overhead?
>
> Maybe you have another use case?

Suppose one case like one thread set one alarm into RTC unexpectedly,
which maybe affect the system suspend. So we can catch out which
thread set the RTC alarm by trace logs. From trace log, I also can
know who set the RTC time, when and who disable the alarm irq to debug
some cases like the alarm event was not fired.
In some respects I think it will be helpful, maybe I need delete some
unuseful trace events? Thanks.

-- 
Baolin.wang
Best Regards

^ permalink raw reply

* Re: [PATCH] rtc: Add tracepoints for RTC system
From: Baolin Wang @ 2017-11-15  9:57 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Alessandro Zummo, Alexandre Belloni, Steven Rostedt, Ingo Molnar,
	linux-rtc, LKML, Arnd Bergmann, Mark Brown
In-Reply-To: <20171115083505.kderwwdigcq7e674@gmail.com>

Hi Ingo,

On 15 November 2017 at 16:35, Ingo Molnar <mingo@kernel.org> wrote:
>
> * Baolin Wang <baolin.wang@linaro.org> wrote:
>
>> It will be more helpful to add some tracepoints to track RTC actions when
>> debugging RTC driver. Below sample is that we set/read the RTC time, then
>> set 2 alarms, so we can see the trace logs:
>>
>> set/read RTC time:
>> kworker/1:1-586   [001] .... 21.826112: rtc_set_time: 2017-11-10 08:13:00 UTC (1510301580)
>> kworker/1:1-586   [001] .... 21.826174: rtc_read_time: 2017-11-10 08:13:00 UTC (1510301580)
>>
>> set the first alarm timer:
>> kworker/1:1-586   [001] .... 21.841098: rtc_timer_enqueue: RTC timer:(ffffffc15ad913c8) 2017-11-10 08:15:00 UTC (1510301700)
>> kworker/1:1-586   [001] .... 22.009424: rtc_set_alarm: 2017-11-10 08:15:00 UTC (1510301700)
>>
>> set the second alarm timer:
>> kworker/1:1-586   [001] .... 22.181304: rtc_timer_enqueue: RTC timer:(ffffff80088e6430) 2017-11-10 08:17:00 UTC (1510301820)
>>
>> the first alarm timer was expired:
>> kworker/0:1-67    [000] .... 145.156226: rtc_timer_dequeue: RTC timer:(ffffffc15ad913c8) 2017-11-10 08:15:00 UTC (1510301700)
>> kworker/0:1-67    [000] .... 145.156235: rtc_timer_fired: RTC timer:(ffffffc15ad913c8) 2017-11-10 08:15:00 UTC (1510301700)
>> kworker/0:1-67    [000] .... 145.173137: rtc_set_alarm: 2017-11-10 08:17:00 UTC (1510301820)
>>
>> the second alarm timer was expired:
>> kworker/0:1-67    [000] .... 269.102985: rtc_timer_dequeue: RTC timer:(ffffff80088e6430) 2017-11-10 08:17:00 UTC (1510301820)
>> kworker/0:1-67    [000] .... 269.102992: rtc_timer_fired: RTC timer:(ffffff80088e6430) 2017-11-10 08:17:00 UTC (1510301820)
>>
>> disable alarm irq:
>> kworker/0:1-67    [000] .... 269.103098: rtc_alarm_irq_enable: disable RTC alarm IRQ
>>
>> Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
>> ---
>>  drivers/rtc/interface.c    |   46 ++++++++++
>>  include/trace/events/rtc.h |  215 ++++++++++++++++++++++++++++++++++++++++++++
>>  2 files changed, 261 insertions(+)
>>  create mode 100644 include/trace/events/rtc.h
>>
>> diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
>> index 8cec9a0..cdd3ac8 100644
>> --- a/drivers/rtc/interface.c
>> +++ b/drivers/rtc/interface.c
>> @@ -17,6 +17,9 @@
>>  #include <linux/log2.h>
>>  #include <linux/workqueue.h>
>>
>> +#define CREATE_TRACE_POINTS
>> +#include <trace/events/rtc.h>
>> +
>>  static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer);
>>  static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer);
>>
>> @@ -53,6 +56,9 @@ int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
>>
>>       err = __rtc_read_time(rtc, tm);
>>       mutex_unlock(&rtc->ops_lock);
>> +
>> +     if (!err)
>> +             trace_rtc_read_time(tm);
>
> It's better to just add unconditional tracepoints and trace the failures as well -
> this makes things faster for the non-traced case, plus it's much easier to read as
> well.
>
> I.e. something like:
>
>         trace_rtc_read_time(tm, err);

Yes, that's will be better.

>
> etc.
>
>> @@ -790,6 +818,8 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
>>                       schedule_work(&rtc->irqwork);
>>               } else if (err) {
>>                       timerqueue_del(&rtc->timerqueue, &timer->node);
>> +                     trace_rtc_timer_dequeue(timer,
>> +                                     rtc_ktime_to_tm(timer->node.expires));
>
> Please don't break the line in such an ugly fashion.

I will try to modify it in next version.

>
>> @@ -803,6 +833,7 @@ static void rtc_alarm_disable(struct rtc_device *rtc)
>>               return;
>>
>>       rtc->ops->alarm_irq_enable(rtc->dev.parent, false);
>> +     trace_rtc_alarm_irq_enable(0);
>
> Since there's so many new events already, why not add an enable/disable variant
> instead of parameterizing the 'enable' event?

Since the rtc_alarm_irq_enable() is one separate function and can be
called from userspace individually.

>
>>       timerqueue_del(&rtc->timerqueue, &timer->node);
>> +     trace_rtc_timer_dequeue(timer, rtc_ktime_to_tm(timer->node.expires));
>
>> +             trace_rtc_timer_dequeue(timer,
>> +                             rtc_ktime_to_tm(timer->node.expires));
>
>> +             trace_rtc_timer_fired(timer,
>> +                             rtc_ktime_to_tm(timer->node.expires));
>
>> +                     trace_rtc_timer_enqueue(timer,
>> +                                     rtc_ktime_to_tm(timer->node.expires));
>
> All the decoding of expiry time should be done in the trace handler, don't bloat
> the call site with it.

OK. Thanks for your comments.

-- 
Baolin.wang
Best Regards

^ permalink raw reply

* Re: DryIce , RTC not working on imx53.
From: Juergen Borleis @ 2017-11-15  9:53 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Alexandre Belloni, Vellemans, Noel, linux-rtc@vger.kernel.org,
	Fabio Estevam, Patrick Brünn
In-Reply-To: <201711141343.15309.jbe@pengutronix.de>

Hi all,

On Tuesday 14 November 2017 13:43:14 Myself wrote:
> On Tuesday 14 November 2017 11:55:17 Alexandre Belloni wrote:
> > On 14/11/2017 at 08:33:09 -0200, Fabio Estevam wrote:
> > > On Tue, Nov 14, 2017 at 8:26 AM, Alexandre Belloni
> > >
> > > <alexandre.belloni@free-electrons.com> wrote:
> > > >> I have the impression that the dryice driver has never worked in
> > > >> mainlune for mx53.
> > > >
> > > > I doubt that because it seems to have been used by Pengutronix.
> > >
> > > Juergen can confirm, but it seems the dryice driver was only used on
> > > mx25 in mainline.
> >
> > Ok, that would explain it.
>
> Yes. The development was made on an i.MX25. But currently I have an
> i.MX53 on my desk here and could test...

After a quick look into the reference manuals:

Patch 5b72505 ("ARM: dts: imx53: add srtc node") is bad. The i.MX53 provides 
an RTC more close to the i.MX6 instead (e.g. rtc-snvs.c). But unfortunately 
it uses a different register layout than the i.MX6 does. So we can't use 
this driver without i.MX53 specific adaptions.
But at least 5b72505 should be reverted.

jb

-- 
Pengutronix e.K.                             | Juergen Borleis             |
Industrial Linux Solutions                   | http://www.pengutronix.de/  |

^ permalink raw reply

* Re: [PATCH] rtc: Add tracepoints for RTC system
From: Alexandre Belloni @ 2017-11-15  9:25 UTC (permalink / raw)
  To: Baolin Wang
  Cc: a.zummo, rostedt, mingo, linux-rtc, linux-kernel, arnd, broonie
In-Reply-To: <354301cc7c61ba39021bb56e7ede5ba959e9dbb2.1510730564.git.baolin.wang@linaro.org>

Hi,

On 15/11/2017 at 15:30:21 +0800, Baolin Wang wrote:
> It will be more helpful to add some tracepoints to track RTC actions when
> debugging RTC driver. Below sample is that we set/read the RTC time, then
> set 2 alarms, so we can see the trace logs:

I'm not sure it is actually useful when debugging an RTC driver because
you will be interested in the real values that are written to or read
from the RTC, not what is returned by the driver to the RTC core as this
information is already readily available to userspace.

Is this really worth the added overhead?

Maybe you have another use case?


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

^ permalink raw reply

* Re: [PATCH] rtc: Add tracepoints for RTC system
From: Ingo Molnar @ 2017-11-15  8:35 UTC (permalink / raw)
  To: Baolin Wang
  Cc: a.zummo, alexandre.belloni, rostedt, mingo, linux-rtc,
	linux-kernel, arnd, broonie
In-Reply-To: <354301cc7c61ba39021bb56e7ede5ba959e9dbb2.1510730564.git.baolin.wang@linaro.org>


* Baolin Wang <baolin.wang@linaro.org> wrote:

> It will be more helpful to add some tracepoints to track RTC actions when
> debugging RTC driver. Below sample is that we set/read the RTC time, then
> set 2 alarms, so we can see the trace logs:
> 
> set/read RTC time:
> kworker/1:1-586   [001] .... 21.826112: rtc_set_time: 2017-11-10 08:13:00 UTC (1510301580)
> kworker/1:1-586   [001] .... 21.826174: rtc_read_time: 2017-11-10 08:13:00 UTC (1510301580)
> 
> set the first alarm timer:
> kworker/1:1-586   [001] .... 21.841098: rtc_timer_enqueue: RTC timer:(ffffffc15ad913c8) 2017-11-10 08:15:00 UTC (1510301700)
> kworker/1:1-586   [001] .... 22.009424: rtc_set_alarm: 2017-11-10 08:15:00 UTC (1510301700)
> 
> set the second alarm timer:
> kworker/1:1-586   [001] .... 22.181304: rtc_timer_enqueue: RTC timer:(ffffff80088e6430) 2017-11-10 08:17:00 UTC (1510301820)
> 
> the first alarm timer was expired:
> kworker/0:1-67    [000] .... 145.156226: rtc_timer_dequeue: RTC timer:(ffffffc15ad913c8) 2017-11-10 08:15:00 UTC (1510301700)
> kworker/0:1-67    [000] .... 145.156235: rtc_timer_fired: RTC timer:(ffffffc15ad913c8) 2017-11-10 08:15:00 UTC (1510301700)
> kworker/0:1-67    [000] .... 145.173137: rtc_set_alarm: 2017-11-10 08:17:00 UTC (1510301820)
> 
> the second alarm timer was expired:
> kworker/0:1-67    [000] .... 269.102985: rtc_timer_dequeue: RTC timer:(ffffff80088e6430) 2017-11-10 08:17:00 UTC (1510301820)
> kworker/0:1-67    [000] .... 269.102992: rtc_timer_fired: RTC timer:(ffffff80088e6430) 2017-11-10 08:17:00 UTC (1510301820)
> 
> disable alarm irq:
> kworker/0:1-67    [000] .... 269.103098: rtc_alarm_irq_enable: disable RTC alarm IRQ
> 
> Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
> ---
>  drivers/rtc/interface.c    |   46 ++++++++++
>  include/trace/events/rtc.h |  215 ++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 261 insertions(+)
>  create mode 100644 include/trace/events/rtc.h
> 
> diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
> index 8cec9a0..cdd3ac8 100644
> --- a/drivers/rtc/interface.c
> +++ b/drivers/rtc/interface.c
> @@ -17,6 +17,9 @@
>  #include <linux/log2.h>
>  #include <linux/workqueue.h>
>  
> +#define CREATE_TRACE_POINTS
> +#include <trace/events/rtc.h>
> +
>  static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer);
>  static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer);
>  
> @@ -53,6 +56,9 @@ int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
>  
>  	err = __rtc_read_time(rtc, tm);
>  	mutex_unlock(&rtc->ops_lock);
> +
> +	if (!err)
> +		trace_rtc_read_time(tm);

It's better to just add unconditional tracepoints and trace the failures as well - 
this makes things faster for the non-traced case, plus it's much easier to read as 
well.

I.e. something like:

	trace_rtc_read_time(tm, err);

etc.

> @@ -790,6 +818,8 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
>  			schedule_work(&rtc->irqwork);
>  		} else if (err) {
>  			timerqueue_del(&rtc->timerqueue, &timer->node);
> +			trace_rtc_timer_dequeue(timer,
> +					rtc_ktime_to_tm(timer->node.expires));

Please don't break the line in such an ugly fashion.

> @@ -803,6 +833,7 @@ static void rtc_alarm_disable(struct rtc_device *rtc)
>  		return;
>  
>  	rtc->ops->alarm_irq_enable(rtc->dev.parent, false);
> +	trace_rtc_alarm_irq_enable(0);

Since there's so many new events already, why not add an enable/disable variant 
instead of parameterizing the 'enable' event?

>  	timerqueue_del(&rtc->timerqueue, &timer->node);
> +	trace_rtc_timer_dequeue(timer, rtc_ktime_to_tm(timer->node.expires));

> +		trace_rtc_timer_dequeue(timer,
> +				rtc_ktime_to_tm(timer->node.expires));

> +		trace_rtc_timer_fired(timer,
> +				rtc_ktime_to_tm(timer->node.expires));

> +			trace_rtc_timer_enqueue(timer,
> +					rtc_ktime_to_tm(timer->node.expires));

All the decoding of expiry time should be done in the trace handler, don't bloat 
the call site with it.

Thanks,

	Ingo

^ permalink raw reply

* [PATCH] rtc: Add tracepoints for RTC system
From: Baolin Wang @ 2017-11-15  7:30 UTC (permalink / raw)
  To: a.zummo, alexandre.belloni, rostedt, mingo
  Cc: linux-rtc, linux-kernel, arnd, broonie, baolin.wang

It will be more helpful to add some tracepoints to track RTC actions when
debugging RTC driver. Below sample is that we set/read the RTC time, then
set 2 alarms, so we can see the trace logs:

set/read RTC time:
kworker/1:1-586   [001] .... 21.826112: rtc_set_time: 2017-11-10 08:13:00 UTC (1510301580)
kworker/1:1-586   [001] .... 21.826174: rtc_read_time: 2017-11-10 08:13:00 UTC (1510301580)

set the first alarm timer:
kworker/1:1-586   [001] .... 21.841098: rtc_timer_enqueue: RTC timer:(ffffffc15ad913c8) 2017-11-10 08:15:00 UTC (1510301700)
kworker/1:1-586   [001] .... 22.009424: rtc_set_alarm: 2017-11-10 08:15:00 UTC (1510301700)

set the second alarm timer:
kworker/1:1-586   [001] .... 22.181304: rtc_timer_enqueue: RTC timer:(ffffff80088e6430) 2017-11-10 08:17:00 UTC (1510301820)

the first alarm timer was expired:
kworker/0:1-67    [000] .... 145.156226: rtc_timer_dequeue: RTC timer:(ffffffc15ad913c8) 2017-11-10 08:15:00 UTC (1510301700)
kworker/0:1-67    [000] .... 145.156235: rtc_timer_fired: RTC timer:(ffffffc15ad913c8) 2017-11-10 08:15:00 UTC (1510301700)
kworker/0:1-67    [000] .... 145.173137: rtc_set_alarm: 2017-11-10 08:17:00 UTC (1510301820)

the second alarm timer was expired:
kworker/0:1-67    [000] .... 269.102985: rtc_timer_dequeue: RTC timer:(ffffff80088e6430) 2017-11-10 08:17:00 UTC (1510301820)
kworker/0:1-67    [000] .... 269.102992: rtc_timer_fired: RTC timer:(ffffff80088e6430) 2017-11-10 08:17:00 UTC (1510301820)

disable alarm irq:
kworker/0:1-67    [000] .... 269.103098: rtc_alarm_irq_enable: disable RTC alarm IRQ

Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
---
 drivers/rtc/interface.c    |   46 ++++++++++
 include/trace/events/rtc.h |  215 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 261 insertions(+)
 create mode 100644 include/trace/events/rtc.h

diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 8cec9a0..cdd3ac8 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -17,6 +17,9 @@
 #include <linux/log2.h>
 #include <linux/workqueue.h>
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/rtc.h>
+
 static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer);
 static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer);
 
@@ -53,6 +56,9 @@ int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
 
 	err = __rtc_read_time(rtc, tm);
 	mutex_unlock(&rtc->ops_lock);
+
+	if (!err)
+		trace_rtc_read_time(tm);
 	return err;
 }
 EXPORT_SYMBOL_GPL(rtc_read_time);
@@ -87,6 +93,9 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
 	mutex_unlock(&rtc->ops_lock);
 	/* A timer might have just expired */
 	schedule_work(&rtc->irqwork);
+
+	if (!err)
+		trace_rtc_set_time(tm);
 	return err;
 }
 EXPORT_SYMBOL_GPL(rtc_set_time);
@@ -119,6 +128,9 @@ static int rtc_read_alarm_internal(struct rtc_device *rtc, struct rtc_wkalrm *al
 	}
 
 	mutex_unlock(&rtc->ops_lock);
+
+	if (!err)
+		trace_rtc_read_alarm(&alarm->time);
 	return err;
 }
 
@@ -316,6 +328,8 @@ int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
 	}
 	mutex_unlock(&rtc->ops_lock);
 
+	if (!err)
+		trace_rtc_read_alarm(&alarm->time);
 	return err;
 }
 EXPORT_SYMBOL_GPL(rtc_read_alarm);
@@ -352,6 +366,8 @@ static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
 	else
 		err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
 
+	if (!err)
+		trace_rtc_set_alarm(&alarm->time);
 	return err;
 }
 
@@ -406,6 +422,8 @@ int rtc_initialize_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
 
 		rtc->aie_timer.enabled = 1;
 		timerqueue_add(&rtc->timerqueue, &rtc->aie_timer.node);
+		trace_rtc_timer_enqueue(&rtc->aie_timer,
+				rtc_ktime_to_tm(rtc->aie_timer.node.expires));
 	}
 	mutex_unlock(&rtc->ops_lock);
 	return err;
@@ -435,6 +453,9 @@ int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled)
 		err = rtc->ops->alarm_irq_enable(rtc->dev.parent, enabled);
 
 	mutex_unlock(&rtc->ops_lock);
+
+	if (!err)
+		trace_rtc_alarm_irq_enable(enabled);
 	return err;
 }
 EXPORT_SYMBOL_GPL(rtc_alarm_irq_enable);
@@ -709,6 +730,9 @@ int rtc_irq_set_state(struct rtc_device *rtc, struct rtc_task *task, int enabled
 		rtc->pie_enabled = enabled;
 	}
 	spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
+
+	if (!err)
+		trace_rtc_irq_set_state(enabled);
 	return err;
 }
 EXPORT_SYMBOL_GPL(rtc_irq_set_state);
@@ -745,6 +769,9 @@ int rtc_irq_set_freq(struct rtc_device *rtc, struct rtc_task *task, int freq)
 		}
 	}
 	spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
+
+	if (!err)
+		trace_rtc_irq_set_freq(freq);
 	return err;
 }
 EXPORT_SYMBOL_GPL(rtc_irq_set_freq);
@@ -779,6 +806,7 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
 	}
 
 	timerqueue_add(&rtc->timerqueue, &timer->node);
+	trace_rtc_timer_enqueue(timer, rtc_ktime_to_tm(timer->node.expires));
 	if (!next) {
 		struct rtc_wkalrm alarm;
 		int err;
@@ -790,6 +818,8 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
 			schedule_work(&rtc->irqwork);
 		} else if (err) {
 			timerqueue_del(&rtc->timerqueue, &timer->node);
+			trace_rtc_timer_dequeue(timer,
+					rtc_ktime_to_tm(timer->node.expires));
 			timer->enabled = 0;
 			return err;
 		}
@@ -803,6 +833,7 @@ static void rtc_alarm_disable(struct rtc_device *rtc)
 		return;
 
 	rtc->ops->alarm_irq_enable(rtc->dev.parent, false);
+	trace_rtc_alarm_irq_enable(0);
 }
 
 /**
@@ -821,6 +852,7 @@ static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer)
 {
 	struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue);
 	timerqueue_del(&rtc->timerqueue, &timer->node);
+	trace_rtc_timer_dequeue(timer, rtc_ktime_to_tm(timer->node.expires));
 	timer->enabled = 0;
 	if (next == &timer->node) {
 		struct rtc_wkalrm alarm;
@@ -871,16 +903,22 @@ void rtc_timer_do_work(struct work_struct *work)
 		/* expire timer */
 		timer = container_of(next, struct rtc_timer, node);
 		timerqueue_del(&rtc->timerqueue, &timer->node);
+		trace_rtc_timer_dequeue(timer,
+				rtc_ktime_to_tm(timer->node.expires));
 		timer->enabled = 0;
 		if (timer->task.func)
 			timer->task.func(timer->task.private_data);
 
+		trace_rtc_timer_fired(timer,
+				rtc_ktime_to_tm(timer->node.expires));
 		/* Re-add/fwd periodic timers */
 		if (ktime_to_ns(timer->period)) {
 			timer->node.expires = ktime_add(timer->node.expires,
 							timer->period);
 			timer->enabled = 1;
 			timerqueue_add(&rtc->timerqueue, &timer->node);
+			trace_rtc_timer_enqueue(timer,
+					rtc_ktime_to_tm(timer->node.expires));
 		}
 	}
 
@@ -902,6 +940,8 @@ void rtc_timer_do_work(struct work_struct *work)
 
 			timer = container_of(next, struct rtc_timer, node);
 			timerqueue_del(&rtc->timerqueue, &timer->node);
+			trace_rtc_timer_dequeue(timer,
+					rtc_ktime_to_tm(timer->node.expires));
 			timer->enabled = 0;
 			dev_err(&rtc->dev, "__rtc_set_alarm: err=%d\n", err);
 			goto again;
@@ -992,6 +1032,9 @@ int rtc_read_offset(struct rtc_device *rtc, long *offset)
 	mutex_lock(&rtc->ops_lock);
 	ret = rtc->ops->read_offset(rtc->dev.parent, offset);
 	mutex_unlock(&rtc->ops_lock);
+
+	if (!ret)
+		trace_rtc_read_offset(*offset);
 	return ret;
 }
 
@@ -1021,5 +1064,8 @@ int rtc_set_offset(struct rtc_device *rtc, long offset)
 	mutex_lock(&rtc->ops_lock);
 	ret = rtc->ops->set_offset(rtc->dev.parent, offset);
 	mutex_unlock(&rtc->ops_lock);
+
+	if (!ret)
+		trace_rtc_set_offset(offset);
 	return ret;
 }
diff --git a/include/trace/events/rtc.h b/include/trace/events/rtc.h
new file mode 100644
index 0000000..93d77bc
--- /dev/null
+++ b/include/trace/events/rtc.h
@@ -0,0 +1,215 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM rtc
+
+#if !defined(_TRACE_RTC_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_RTC_H
+
+#include <linux/rtc.h>
+#include <linux/tracepoint.h>
+
+DECLARE_EVENT_CLASS(rtc_time_alarm_class,
+
+	TP_PROTO(struct rtc_time *tm),
+
+	TP_ARGS(tm),
+
+	TP_STRUCT__entry(
+		__field(int, sec)
+		__field(int, min)
+		__field(int, hour)
+		__field(int, mday)
+		__field(int, mon)
+		__field(int, year)
+		__field(time64_t, secs)
+	),
+
+	TP_fast_assign(
+		__entry->sec = tm->tm_sec;
+		__entry->min = tm->tm_min;
+		__entry->hour = tm->tm_hour;
+		__entry->mday = tm->tm_mday;
+		__entry->mon = tm->tm_mon;
+		__entry->year = tm->tm_year;
+		__entry->secs = rtc_tm_to_time64(tm);
+	),
+
+	TP_printk("%d-%02d-%02d %02d:%02d:%02d UTC (%lld)",
+		  __entry->year + 1900, __entry->mon + 1, __entry->mday,
+		  __entry->hour, __entry->min, __entry->sec, __entry->secs
+	)
+);
+
+DEFINE_EVENT(rtc_time_alarm_class, rtc_set_time,
+
+	TP_PROTO(struct rtc_time *tm),
+
+	TP_ARGS(tm)
+);
+
+DEFINE_EVENT(rtc_time_alarm_class, rtc_read_time,
+
+	TP_PROTO(struct rtc_time *tm),
+
+	TP_ARGS(tm)
+);
+
+DEFINE_EVENT(rtc_time_alarm_class, rtc_set_alarm,
+
+	TP_PROTO(struct rtc_time *tm),
+
+	TP_ARGS(tm)
+);
+
+DEFINE_EVENT(rtc_time_alarm_class, rtc_read_alarm,
+
+	TP_PROTO(struct rtc_time *tm),
+
+	TP_ARGS(tm)
+);
+
+TRACE_EVENT(rtc_irq_set_freq,
+
+	TP_PROTO(int freq),
+
+	TP_ARGS(freq),
+
+	TP_STRUCT__entry(
+		__field(int, freq)
+	),
+
+	TP_fast_assign(
+		__entry->freq = freq;
+	),
+
+	TP_printk("set RTC periodic IRQ frequency:%u", __entry->freq)
+);
+
+TRACE_EVENT(rtc_irq_set_state,
+
+	TP_PROTO(int enabled),
+
+	TP_ARGS(enabled),
+
+	TP_STRUCT__entry(
+		__field(int, enabled)
+	),
+
+	TP_fast_assign(
+		__entry->enabled = enabled;
+	),
+
+	TP_printk("%s RTC 2^N Hz periodic IRQs",
+		  __entry->enabled ? "enable" : "disable"
+	)
+);
+
+TRACE_EVENT(rtc_alarm_irq_enable,
+
+	TP_PROTO(unsigned int enabled),
+
+	TP_ARGS(enabled),
+
+	TP_STRUCT__entry(
+		__field(unsigned int, enabled)
+	),
+
+	TP_fast_assign(
+		__entry->enabled = enabled;
+	),
+
+	TP_printk("%s RTC alarm IRQ",
+		  __entry->enabled ? "enable" : "disable"
+	)
+);
+
+DECLARE_EVENT_CLASS(rtc_offset_class,
+
+	TP_PROTO(long offset),
+
+	TP_ARGS(offset),
+
+	TP_STRUCT__entry(
+		__field(long, offset)
+	),
+
+	TP_fast_assign(
+		__entry->offset = offset;
+	),
+
+	TP_printk("RTC offset: %ld", __entry->offset)
+);
+
+DEFINE_EVENT(rtc_offset_class, rtc_set_offset,
+
+	TP_PROTO(long offset),
+
+	TP_ARGS(offset)
+);
+
+DEFINE_EVENT(rtc_offset_class, rtc_read_offset,
+
+	TP_PROTO(long offset),
+
+	TP_ARGS(offset)
+);
+
+DECLARE_EVENT_CLASS(rtc_timer_class,
+
+	TP_PROTO(struct rtc_timer *timer, struct rtc_time tm),
+
+	TP_ARGS(timer, tm),
+
+	TP_STRUCT__entry(
+		__field(struct rtc_timer *, timer)
+		__field(int, sec)
+		__field(int, min)
+		__field(int, hour)
+		__field(int, mday)
+		__field(int, mon)
+		__field(int, year)
+		__field(time64_t, secs)
+	),
+
+	TP_fast_assign(
+		__entry->timer = timer;
+		__entry->sec = tm.tm_sec;
+		__entry->min = tm.tm_min;
+		__entry->hour = tm.tm_hour;
+		__entry->mday = tm.tm_mday;
+		__entry->mon = tm.tm_mon;
+		__entry->year = tm.tm_year;
+		__entry->secs = rtc_tm_to_time64(&tm);
+	),
+
+	TP_printk("RTC timer:(%p) %d-%02d-%02d %02d:%02d:%02d UTC (%lld)",
+		  __entry->timer, __entry->year + 1900, __entry->mon + 1,
+		  __entry->mday, __entry->hour, __entry->min, __entry->sec,
+		  __entry->secs
+	)
+);
+
+DEFINE_EVENT(rtc_timer_class, rtc_timer_enqueue,
+
+	TP_PROTO(struct rtc_timer *timer, struct rtc_time tm),
+
+	TP_ARGS(timer, tm)
+);
+
+DEFINE_EVENT(rtc_timer_class, rtc_timer_dequeue,
+
+	TP_PROTO(struct rtc_timer *timer, struct rtc_time tm),
+
+	TP_ARGS(timer, tm)
+);
+
+DEFINE_EVENT(rtc_timer_class, rtc_timer_fired,
+
+	TP_PROTO(struct rtc_timer *timer, struct rtc_time tm),
+
+	TP_ARGS(timer, tm)
+);
+
+#endif /* _TRACE_RTC_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
-- 
1.7.9.5

^ permalink raw reply related

* RE: DryIce , RTC not working on imx53.
From: Vellemans, Noel @ 2017-11-14 12:56 UTC (permalink / raw)
  To: Juergen Borleis, Alexandre Belloni
  Cc: Fabio Estevam, Patrick Brünn,
	linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <201711141343.15309.jbe@pengutronix.de>

SGkgYWxsLCANCg0KSnVlcmdlbiBJdCB3b24ndCB3b3JrICggYXMgaXQgaXMpICwgcmVnaXN0ZXJz
IGFyZSBub3Qgb24gdGhlIGNvcnJlY3Qgb2Zmc2V0cyBhbmQgc29tZSBiaXRzIGFyZSBub3Qgb24g
dGhlIHNhbWUgcG9zaXRpb25zICggZm9yIHRoZSBJTVg1MykNClRoaXMgZHJpdmVyIHdpbGwgbm90
IHdvcmsgZm9yIHRoZSBJTlRFUk5BTC1SVEMgKCBydGMgaW50byB0aGUgSU1YNTMpLCBhbmQgd2ls
bCBuZXZlciBoYXZlIHdvcmtlZCAoIG9uIElNWDUzKS4gDQpJIGNhbiBjb25maXJtLCBpdCBtaWdo
dCB3b3JrIGZvciBzb21lIG90aGVyIHZhcmlhbnQgb2YgdGhlIFJUQywgYnV0IGl0IHdpbGwgbm90
IGRvIHdoYXQgd2UgYWxsIGV4cGVjdGVkIGZvciB0aGUgUlRDIGxvY2F0ZWQgaW50byBJTVg1MyEN
Cg0KKCBub3Qgc3VyZSBteSBwcmV2aW91cyBtYWlsIGdvdCB0byB0aGUgZGVzdGluYXRpb24pDQoN
CkJlc3QgUmVnYXJkcw0KTm9lbA0KDQoNCg0KDQo+Pg0KPj4gPiBKdWVyZ2VuIGNhbiBjb25maXJt
LCBidXQgaXQgc2VlbXMgdGhlIGRyeWljZSBkcml2ZXIgd2FzIG9ubHkgdXNlZCBvbg0KPiA+IG14
MjUgaW4gbWFpbmxpbmUuDQo+Pg0KPj4+IE9rLCB0aGF0IHdvdWxkIGV4cGxhaW4gaXQuDQo+Pg0K
Pj5ZZXMuIFRoZSBkZXZlbG9wbWVudCB3YXMgbWFkZSBvbiBhbiBpLk1YMjUuIEJ1dCBjdXJyZW50
bHkgSSBoYXZlIGFuIGkuTVg1MyBvbiBteSBkZXNrIGhlcmUgYW5kIGNvdWxkIHRlc3QuLi4NCj4+
DQo+PmpiDQoNCj4+Pg0KPj4NCj4+DQo+Pg0KPj4tLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0K
Pj5Gcm9tOiBWZWxsZW1hbnMsIE5vZWwgDQo+PlNlbnQ6IFR1ZXNkYXksIE5vdmVtYmVyIDE0LCAy
MDE3IDExOjMwIEFNDQo+PlRvOiAnRmFiaW8gRXN0ZXZhbScNCj4+Q2M6IFBhdHJpY2sgQnLDvG5u
OyBBbGV4YW5kcmUgQmVsbG9uaTsgbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3Jn
OyBsaW51eC1ydGNAdmdlci5rZXJuZWwub3JnDQo+PlN1YmplY3Q6IFJFOiBEcnlJY2UgLCBSVEMg
bm90IHdvcmtpbmcgb24gaW14NTMuDQo+Pg0KPj5IaSBGYWJpbw0KPj4NCj4+SXQncyBiZWVuIGEg
d2hpbGUuLi4gKCBidXQgSSdtIHF1aXRlIHN1cmUpLCBpZiB5b3UgbG9vayBjbG9zZWx5IGF0IHRo
ZSByZWdpc3RlciBkZWZpbmVzICggaW50byB0aGUgRFJZSUNFLWRyaXZlci1jb2RlKSB0aGVuIHlv
dSB3aWxsIG5vdGljZS4uLiB0aGF0IFNPTUUgcmVnaXN0ZXJzIG9mZnNldHMgYXJlIGNvcnJlY3Qg
LCBidXQgb3RoZXJzIGFyZSBub3QgbWF0Y2hpbmcgdGhlIElOVEVSTkFMIHJ0YyBvZiB0aGUgSU1Y
NTMuDQo+Pg0KPj5XaGVuIEkgbm90aWNlZCB0aGF0ICggSSBza2lwcGVkIFJUQyBkcml2ZXIgZnVu
Y3Rpb25hbGl0eSwgdW5kZXIgcmVsZWFzZSBwcmVzc3VyZSwgSSBoYWQgc3RpbGwgbWFueSBpdGVt
cyB0byB0ZXN0IG9uIHRob3NlIGtlcm5lbCAsIGFuZCBJIHdhcyB1bmRlciByZWxlYXNlIHByZXNz
dXJlLi4gc28gSSByZW1vdmVkIFJUQyBmb3IgdGhlIHRpbWUgYmVpbmcuKQ0KPj4NCj4+eyB5b3Ug
Y2FuIGdldCBiYXNpYyBSVEMgLCB0aW1lciBvbmx5ICwgbm8gYWxhcm1zL2V2ZW50cyB3b3JraW5n
Li4uIGJ5IGNvbW1lbnRpbmcgYSBsb3Qgb2YgdGhpbmdzIG91dCwgIGJ1dCAuLiBJIGRlY2lkZWQg
dG8gc29sdmUgdGhpcyBsYXRlciB0aGUgY29ycmVjdCB3YXksICB3aGVuIEkgZmluZCBzb21lIHRp
bWUgICggYW5kIHRvIHJlcG9ydCBiYWNrIHdoZW4gc29sdmVkLCBkaWRuJ3Qgd2FudCB0byBib3Ro
ZXIgbWFueSBwZW9wbGUsIG9yIG90aGVyd2lzZSBzYWlkIGRpZG4ndCB3YW50IG1ha2UgdG9vIG1h
bnkgbm9pc2UgLi4uLiAoIGJlY2F1c2UgcnRjIGlzIG5vdCBjcml0aWNhbCBpbiBteSBhcHBsaWNh
dGlvbiApIH0NCj4+DQo+PlRoaXMgZHJpdmVyIHdpbGwgbm90IHdvcmsgZm9yIHRoZSBJTlRFUk5B
TC1SVEMgKCBydGMgaW50byB0aGUgSU1YNTMpLCBhbmQgd2lsbCBuZXZlciBoYXZlIHdvcmtlZCwg
SSBjYW4gY29uZmlybSB0aGlzLCBpdCBtaWdodCBoYXZlIHdvcmtlZCBmb3Igc29tZSBvdGhlciB2
YXJpYW50IG9mIHRoZSBSVEMsIGJ1dCBpdCB3aWxsIG5vdCBkbyB3aGF0IHdlIGFsbCBleHBlY3Rl
ZCBmb3IgdGhlIFJUQyBsb2NhdGVkIGludG8gSU1YNTMhDQo+Pg0KPj4NCj4+UmVnYXJkcw0KPj5O
b2VsDQo+Pg0KPj5QUzogSnVzdCBmb3IgaW5mbywgIGF0IHRoaXMgdGltZSBJJ20gaW52ZXN0aWdh
dGluZyBhIE5PVCBib290aW5nIHByb2JsZW0gLi4gYW5kIC4uIGl04oCZcyBhIGhhcmQgb25lICgg
a2VlcHMgbWUgYnVzeSBmb3Igc29tZSBkYXkncyBhbHJlYWR5IC4uLiBsZXQncyBzYXkgaW4gYSA1
MDAgYm9vdHMgdGhlcmUgaXMgb25lIGlzc3VlIHdoZXJlIHRoZSAna2VybmVsJyBsb2Nrcy11cCBp
biBhIA0KPj52ZXJ5IHZlcnkgZWFybHkgc3RhZ2UuLiAoaW50byB0aGUgZmlyc3QgbWlsaS1zZWMg
b2YgdGhlIGJvb3QgaXQgaGFuZ3MsIHNvbWUtd2hlcmUgYXJvdW5kIElSUS1pbml0aWFsaXphdGlv
biAuLiBhbGwgYmxvY2tzICwgYmVmb3JlIENQVS1pZGVudGlmaWNhdGlvbi4uLiBubyBjbHVlIHll
dCB3aGVyZSBleGFjdGx5Li4hKSANCj4+eyBpdCdzIG9ubHkgaGFwcGVuaW5nIGluIGxhdGVzdCBr
ZXJuZWxzIDQuNC54IC8gNC4xeC54ICwgb2xkZXIgMi42LjM1IGRvIG5vdCBzdWZmZXIgdGhpcyBu
b25lIGJvb3QgYmVoYXZpb3IgKCBvbiB0aGUgc2FtZSBoYXJkd2FyZSkgLCBzbyAuLiBkaWdnaW5n
IC8gZGVidWdnaW5nIC8gcHJpbnRpbmcuLiA6LSkgYXQgdGhpcyB0aW1lIH0NCg0K

^ permalink raw reply

* Re: DryIce , RTC not working on imx53.
From: Juergen Borleis @ 2017-11-14 12:43 UTC (permalink / raw)
  To: Alexandre Belloni
  Cc: Fabio Estevam, Patrick Brünn, Vellemans, Noel,
	linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <20171114105517.74ycmwcjsab7xp2j@piout.net>

Hi,

On Tuesday 14 November 2017 11:55:17 Alexandre Belloni wrote:
> On 14/11/2017 at 08:33:09 -0200, Fabio Estevam wrote:
> > On Tue, Nov 14, 2017 at 8:26 AM, Alexandre Belloni
> >
> > <alexandre.belloni@free-electrons.com> wrote:
> > >> I have the impression that the dryice driver has never worked in
> > >> mainlune for mx53.
> > >
> > > I doubt that because it seems to have been used by Pengutronix.
> >
> > Juergen can confirm, but it seems the dryice driver was only used on
> > mx25 in mainline.
>
> Ok, that would explain it.

Yes. The development was made on an i.MX25. But currently I have an i.MX53 
on my desk here and could test...

jb

-- 
Pengutronix e.K.                             | Juergen Borleis             |
Industrial Linux Solutions                   | http://www.pengutronix.de/  |

^ permalink raw reply

* Re: DryIce , RTC not working on imx53.
From: Alexandre Belloni @ 2017-11-14 10:55 UTC (permalink / raw)
  To: Fabio Estevam
  Cc: Patrick Brünn, Juergen Borleis, Vellemans, Noel,
	linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <CAOMZO5CdGAqBkBQ5DdphzNr-tB5r7Sj9jBAhFTFPNezTEjJOMg@mail.gmail.com>

On 14/11/2017 at 08:33:09 -0200, Fabio Estevam wrote:
> On Tue, Nov 14, 2017 at 8:26 AM, Alexandre Belloni
> <alexandre.belloni@free-electrons.com> wrote:
> 
> >> I have the impression that the dryice driver has never worked in
> >> mainlune for mx53.
> >>
> >
> > I doubt that because it seems to have been used by Pengutronix.
> 
> Juergen can confirm, but it seems the dryice driver was only used on
> mx25 in mainline.

Ok, that would explain it.

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

^ permalink raw reply

* Re: DryIce , RTC not working on imx53.
From: Fabio Estevam @ 2017-11-14 10:33 UTC (permalink / raw)
  To: Alexandre Belloni
  Cc: Patrick Brünn, Juergen Borleis, Vellemans, Noel,
	linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <20171114102614.g2bxstg5qacvmtk6@piout.net>

On Tue, Nov 14, 2017 at 8:26 AM, Alexandre Belloni
<alexandre.belloni@free-electrons.com> wrote:

>> I have the impression that the dryice driver has never worked in
>> mainlune for mx53.
>>
>
> I doubt that because it seems to have been used by Pengutronix.

Juergen can confirm, but it seems the dryice driver was only used on
mx25 in mainline.

^ permalink raw reply

* RE: DryIce , RTC not working on imx53.
From: Vellemans, Noel @ 2017-11-14 10:29 UTC (permalink / raw)
  To: Fabio Estevam
  Cc: Patrick Brünn, Alexandre Belloni,
	linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <CAOMZO5BqhhFMRByY+cHXcqmUiLVVngYHvjmTcNJP8M08ew8xnw@mail.gmail.com>

SGkgRmFiaW8NCg0KSXQncyBiZWVuIGEgd2hpbGUuLi4gKCBidXQgSSdtIHF1aXRlIHN1cmUpLCBp
ZiB5b3UgbG9vayBjbG9zZWx5IGF0IHRoZSByZWdpc3RlciBkZWZpbmVzICggaW50byB0aGUgRFJZ
SUNFLWRyaXZlci1jb2RlKSB0aGVuIHlvdSB3aWxsIG5vdGljZS4uLiB0aGF0IFNPTUUgcmVnaXN0
ZXJzIG9mZnNldHMgYXJlIGNvcnJlY3QgLCBidXQgb3RoZXJzIGFyZSBub3QgbWF0Y2hpbmcgdGhl
IElOVEVSTkFMIHJ0YyBvZiB0aGUgSU1YNTMuDQoNCldoZW4gSSBub3RpY2VkIHRoYXQgKCBJIHNr
aXBwZWQgUlRDIGRyaXZlciBmdW5jdGlvbmFsaXR5LCB1bmRlciByZWxlYXNlIHByZXNzdXJlLCBJ
IGhhZCBzdGlsbCBtYW55IGl0ZW1zIHRvIHRlc3Qgb24gdGhvc2Uga2VybmVsICwgYW5kIEkgd2Fz
IHVuZGVyIHJlbGVhc2UgcHJlc3N1cmUuLiBzbyBJIHJlbW92ZWQgUlRDIGZvciB0aGUgdGltZSBi
ZWluZy4pDQoNCnsgeW91IGNhbiBnZXQgYmFzaWMgUlRDICwgdGltZXIgb25seSAsIG5vIGFsYXJt
cy9ldmVudHMgd29ya2luZy4uLiBieSBjb21tZW50aW5nIGEgbG90IG9mIHRoaW5ncyBvdXQsICBi
dXQgLi4gSSBkZWNpZGVkIHRvIHNvbHZlIHRoaXMgbGF0ZXIgdGhlIGNvcnJlY3Qgd2F5LCAgd2hl
biBJIGZpbmQgc29tZSB0aW1lICAoIGFuZCB0byByZXBvcnQgYmFjayB3aGVuIHNvbHZlZCwgZGlk
bid0IHdhbnQgdG8gYm90aGVyIG1hbnkgcGVvcGxlLCBvciBvdGhlcndpc2Ugc2FpZCBkaWRuJ3Qg
d2FudCBtYWtlIHRvbyBtYW55IG5vaXNlIC4uLi4gKCBiZWNhdXNlIHJ0YyBpcyBub3QgY3JpdGlj
YWwgaW4gbXkgYXBwbGljYXRpb24gKSB9DQoNClRoaXMgZHJpdmVyIHdpbGwgbm90IHdvcmsgZm9y
IHRoZSBJTlRFUk5BTC1SVEMgKCBydGMgaW50byB0aGUgSU1YNTMpLCBhbmQgd2lsbCBuZXZlciBo
YXZlIHdvcmtlZCwgSSBjYW4gY29uZmlybSB0aGlzLCBpdCBtaWdodCBoYXZlIHdvcmtlZCBmb3Ig
c29tZSBvdGhlciB2YXJpYW50IG9mIHRoZSBSVEMsIGJ1dCBpdCB3aWxsIG5vdCBkbyB3aGF0IHdl
IGFsbCBleHBlY3RlZCBmb3IgdGhlIFJUQyBsb2NhdGVkIGludG8gSU1YNTMhDQoNCg0KUmVnYXJk
cw0KTm9lbA0KDQoNClBTOiBKdXN0IGZvciBpbmZvLCAgYXQgdGhpcyB0aW1lIEknbSBpbnZlc3Rp
Z2F0aW5nIGEgTk9UIGJvb3RpbmcgcHJvYmxlbSAuLiBhbmQgLi4gaXTigJlzIGEgaGFyZCBvbmUg
KCBrZWVwcyBtZSBidXN5IGZvciBzb21lIGRheSdzIGFscmVhZHkgLi4uIGxldCdzIHNheSBpbiBh
IDUwMCBib290cyB0aGVyZSBpcyBvbmUgaXNzdWUgd2hlcmUgdGhlICdrZXJuZWwnIGxvY2tzLXVw
IGluIGEgdmVyeSB2ZXJ5IGVhcmx5IHN0YWdlLi4gKGludG8gdGhlIGZpcnN0IG1pbGktc2VjIG9m
IHRoZSBib290IGl0IGhhbmdzLCBzb21lLXdoZXJlIGFyb3VuZCBJUlEtaW5pdGlhbGl6YXRpb24g
Li4gYWxsIGJsb2NrcyAsIGJlZm9yZSBDUFUtaWRlbnRpZmljYXRpb24uLi4gbm8gY2x1ZSB5ZXQg
d2hlcmUgZXhhY3RseS4uISkNCnsgaXQncyBvbmx5IGhhcHBlbmluZyBpbiBsYXRlc3Qga2VybmVs
cyA0LjQueCAvIDQuMXgueCAsIG9sZGVyIDIuNi4zNSBkbyBub3Qgc3VmZmVyIHRoaXMgbm9uZSBi
b290IGJlaGF2aW9yICggb24gdGhlIHNhbWUgaGFyZHdhcmUpICwgc28gLi4gZGlnZ2luZyAvIGRl
YnVnZ2luZyAvIHByaW50aW5nLi4gOi0pIGF0IHRoaXMgdGltZSB9DQoNCg0KX19fX19fX19fX19f
X19fX19fX19fX18NCk5vZWwgVmVsbGVtYW5zDQpCTVMgYnZiYQ0KDQotLS0tLU9yaWdpbmFsIE1l
c3NhZ2UtLS0tLQ0KRnJvbTogRmFiaW8gRXN0ZXZhbSBbbWFpbHRvOmZlc3RldmFtQGdtYWlsLmNv
bV0gDQpTZW50OiBUdWVzZGF5LCBOb3ZlbWJlciAxNCwgMjAxNyAxMToxMyBBTQ0KVG86IFZlbGxl
bWFucywgTm9lbA0KQ2M6IFBhdHJpY2sgQnLDvG5uOyBBbGV4YW5kcmUgQmVsbG9uaTsgbGludXgt
YXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOyBsaW51eC1ydGNAdmdlci5rZXJuZWwub3Jn
DQpTdWJqZWN0OiBSZTogRHJ5SWNlICwgUlRDIG5vdCB3b3JraW5nIG9uIGlteDUzLg0KDQpIaSBO
b2VsLA0KDQpPbiBUdWUsIE5vdiAxNCwgMjAxNyBhdCA0OjQwIEFNLCBWZWxsZW1hbnMsIE5vZWwg
PE5vZWwuVmVsbGVtYW5zQHZpc2lvbmJtcy5jb20+IHdyb3RlOg0KPiBISSBhbGwsDQo+DQo+IEkn
dmUgYmVlbiBkaWdnaW5nIGEgd2hpbGUgaW4gdGhlIERyeUljZSBjb2RlIChzb21lIHRpbWUgYWdv
LCBpdCB3YXMgaW4gYSBodXJyeSBiZWNhdXNlIEkgbmVlZGVkIHRvIHJlbGVhc2UpLg0KPg0KPiBJ
IGZpbmFsbHkgZW5kZWQgdXAgYnkgTk9UIHVzaW5nIHRoZSBEcnlJY2UgY29kZSAsIGZvciB0aGUg
SU1YNTMgKCANCj4gaW50ZXJuYWwgUlRDKQ0KPg0KPiBJZiBJIHJlY2FsbCBjb3JyZWN0bHkgLCB0
aGlzIGlzIG5vdCB0aGUgY29ycmVjdCBkcml2ZXIgZm9yIHRoZSANCj4gSW50ZXJuYWwgSU1YNTMg
UlRDLCAoIGZvciBleGFtcGxlIHRoZSByZWdpc3RlciBCQVNFLUFkZHJlc3NlcyAvIA0KPiBvZmZz
ZXRzIGFyZSBub3QgY29ycmVjdC4uKSByZXN1bHRpbmcgaW4gYWxsIGtpbmQgb2Ygc3RyYW5nZSBi
ZWhhdmlvciwgDQo+IGRlcGVuZGluZyBvbiB5b3VyIHNpdHVhdGlvbmFsIHVzZS1jYXNlczotKA0K
DQpDb3VsZCB5b3UgY2xhcmlmeSBhYm91dCB0aGlzPyBXaGljaCBiYXNlIGFkZHJlc3Mgb3Igb2Zm
c2V0cyBhcmUgbm90IGNvcnJlY3Q/DQo=

^ permalink raw reply

* Re: DryIce , RTC not working on imx53.
From: Alexandre Belloni @ 2017-11-14 10:26 UTC (permalink / raw)
  To: Fabio Estevam
  Cc: Patrick Brünn, Juergen Borleis, Vellemans, Noel,
	linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <CAOMZO5B_RcXb6X7gUVSJbDpKSHj9eqtDqcYHjEN1n6zhkyCAjQ@mail.gmail.com>

+Cc Juergen

On 14/11/2017 at 08:12:03 -0200, Fabio Estevam wrote:
> Hi Patrick,
> 
> On Tue, Nov 14, 2017 at 3:00 AM, Patrick Brünn <P.Bruenn@beckhoff.com> wrote:
> >>From: Fabio Estevam [mailto:festevam@gmail.com]
> >>Sent: Montag, 13. November 2017 19:57
> >>> I don't recall of any recent change in this area.
> >>>
> > I don't think the behavior changed recently. I tried a kernel 4.4.65 and it shows the same symptoms. I guess Noel really means 3.19-> 4.0.
> 
> Or maybe by 'old kernel' he meant the vendor 2.6.35 kernel.
> 
> I have the impression that the dryice driver has never worked in
> mainlune for mx53.
> 

I doubt that because it seems to have been used by Pengutronix.

> > Unfortunately no. Did you run hwclock or rtctest?
> 
> Yes, this is what I get:
> 
> # hwclock -r -D
> hwclock from util-linux 2.31
> System Time: 14.876372
> Trying to open: /dev/rtc0
> Using the rtc interface to the clock.
> Last drift adjustment done at 2167 seconds after 1969
> Last calibrat[   14.892484] imxdi_rtc 53fa4000.srtc: Write-wait timeout val = 08
> ion done at 2167 seconds after 1969
> Hardware clock is on UTC time
> Assuming hardware clock is kept in UTC time.
> Waiting for clock tick...
> hwclock: select() to /dev/rtc0 to wait for clock tick timed out
> ...synchronization failed
> 
> 
> > I still see:
> > root@CX9020:~# cat /proc/interrupts | grep rtc
> >  40:          0      tzic  24 Edge      53fa4000.srtc
> >  41:          0      tzic  25 Edge      53fa4000.srtc
> > root@CX9020:~# hwclock -D -r
> > hwclock from util-linux 2.29.2
> > Using the /dev interface to the clock.
> > Last drift adjustment done at 1490885082 seconds after 1969
> > Last calibration done at 1490885082 seconds after 1969
> > Hardware clock is on UTC time
> > Assuming hardware clock is kept in UTC time.
> > Waiting for clock tick...
> > [   41.035269] irq 40: nobody cared (try booting with the "irqpoll" option)
> > [   41.042514] handlers:
> > [   41.044847] [<c06031e0>] dryice_irq
> > [   41.048398] Disabling IRQ #40
> 
> This error I don't get with the 2.31 hwclock version I tried.

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

^ permalink raw reply

* Re: DryIce , RTC not working on imx53.
From: Fabio Estevam @ 2017-11-14 10:13 UTC (permalink / raw)
  To: Vellemans, Noel
  Cc: Patrick Brünn, Alexandre Belloni,
	linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <D24E577EA1E37B4788A3BFBC418F14A707646377@wetsrvex01.loepfe.com>

Hi Noel,

On Tue, Nov 14, 2017 at 4:40 AM, Vellemans, Noel
<Noel.Vellemans@visionbms.com> wrote:
> HI all,
>
> I've been digging a while in the DryIce code (some time ago, it was in a hurry because I needed to release).
>
> I finally ended up by NOT using the DryIce code , for the IMX53 ( internal RTC)
>
> If I recall correctly , this is not the correct driver for the Internal IMX53 RTC, ( for example the register BASE-Addresses / offsets are not correct..)
> resulting in all kind of strange behavior, depending on your situational use-cases:-(

Could you clarify about this? Which base address or offsets are not correct?

^ permalink raw reply

* Re: DryIce , RTC not working on imx53.
From: Fabio Estevam @ 2017-11-14 10:12 UTC (permalink / raw)
  To: Patrick Brünn
  Cc: Alexandre Belloni, Vellemans, Noel,
	linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <3BB206AB2B1BD448954845CE6FF69A8E01CB52F4BE@NT-Mail07.beckhoff.com>

Hi Patrick,

On Tue, Nov 14, 2017 at 3:00 AM, Patrick Br=C3=BCnn <P.Bruenn@beckhoff.com>=
 wrote:
>>From: Fabio Estevam [mailto:festevam@gmail.com]
>>Sent: Montag, 13. November 2017 19:57
>>> I don't recall of any recent change in this area.
>>>
> I don't think the behavior changed recently. I tried a kernel 4.4.65 and =
it shows the same symptoms. I guess Noel really means 3.19-> 4.0.

Or maybe by 'old kernel' he meant the vendor 2.6.35 kernel.

I have the impression that the dryice driver has never worked in
mainlune for mx53.

> Unfortunately no. Did you run hwclock or rtctest?

Yes, this is what I get:

# hwclock -r -D
hwclock from util-linux 2.31
System Time: 14.876372
Trying to open: /dev/rtc0
Using the rtc interface to the clock.
Last drift adjustment done at 2167 seconds after 1969
Last calibrat[   14.892484] imxdi_rtc 53fa4000.srtc: Write-wait timeout val=
 =3D 08
ion done at 2167 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
hwclock: select() to /dev/rtc0 to wait for clock tick timed out
...synchronization failed


> I still see:
> root@CX9020:~# cat /proc/interrupts | grep rtc
>  40:          0      tzic  24 Edge      53fa4000.srtc
>  41:          0      tzic  25 Edge      53fa4000.srtc
> root@CX9020:~# hwclock -D -r
> hwclock from util-linux 2.29.2
> Using the /dev interface to the clock.
> Last drift adjustment done at 1490885082 seconds after 1969
> Last calibration done at 1490885082 seconds after 1969
> Hardware clock is on UTC time
> Assuming hardware clock is kept in UTC time.
> Waiting for clock tick...
> [   41.035269] irq 40: nobody cared (try booting with the "irqpoll" optio=
n)
> [   41.042514] handlers:
> [   41.044847] [<c06031e0>] dryice_irq
> [   41.048398] Disabling IRQ #40

This error I don't get with the 2.31 hwclock version I tried.

^ permalink raw reply

* RE: DryIce , RTC not working on imx53.
From: Vellemans, Noel @ 2017-11-14  6:40 UTC (permalink / raw)
  To: Patrick Brünn, Fabio Estevam, Alexandre Belloni
  Cc: linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <3BB206AB2B1BD448954845CE6FF69A8E01CB52F4BE@NT-Mail07.beckhoff.com>

SEkgYWxsLA0KDQpJJ3ZlIGJlZW4gZGlnZ2luZyBhIHdoaWxlIGluIHRoZSBEcnlJY2UgY29kZSAo
c29tZSB0aW1lIGFnbywgaXQgd2FzIGluIGEgaHVycnkgYmVjYXVzZSBJIG5lZWRlZCB0byByZWxl
YXNlKS4NCg0KSSBmaW5hbGx5IGVuZGVkIHVwIGJ5IE5PVCB1c2luZyB0aGUgRHJ5SWNlIGNvZGUg
LCBmb3IgdGhlIElNWDUzICggaW50ZXJuYWwgUlRDKQ0KDQpJZiBJIHJlY2FsbCBjb3JyZWN0bHkg
LCB0aGlzIGlzIG5vdCB0aGUgY29ycmVjdCBkcml2ZXIgZm9yIHRoZSBJbnRlcm5hbCBJTVg1MyBS
VEMsICggZm9yIGV4YW1wbGUgdGhlIHJlZ2lzdGVyIEJBU0UtQWRkcmVzc2VzIC8gb2Zmc2V0cyBh
cmUgbm90IGNvcnJlY3QuLikgDQpyZXN1bHRpbmcgaW4gYWxsIGtpbmQgb2Ygc3RyYW5nZSBiZWhh
dmlvciwgZGVwZW5kaW5nIG9uIHlvdXIgc2l0dWF0aW9uYWwgdXNlLWNhc2VzOi0oDQoNCg0KDQoN
CkJlc3QgUmVnYXJkcw0KTm9lbA0KDQpfX19fX19fX19fX19fX19fX19fX19fXw0KTm9lbCBWZWxs
ZW1hbnMNCkJNUyBidmJhDQoNCi0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQpGcm9tOiBQYXRy
aWNrIEJyw7xubiBbbWFpbHRvOlAuQnJ1ZW5uQGJlY2tob2ZmLmNvbV0gDQpTZW50OiBUdWVzZGF5
LCBOb3ZlbWJlciAxNCwgMjAxNyA2OjAwIEFNDQpUbzogRmFiaW8gRXN0ZXZhbTsgQWxleGFuZHJl
IEJlbGxvbmkNCkNjOiBWZWxsZW1hbnMsIE5vZWw7IGxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5m
cmFkZWFkLm9yZzsgbGludXgtcnRjQHZnZXIua2VybmVsLm9yZw0KU3ViamVjdDogUkU6IERyeUlj
ZSAsIFJUQyBub3Qgd29ya2luZyBvbiBpbXg1My4NCg0KPkZyb206IEZhYmlvIEVzdGV2YW0gW21h
aWx0bzpmZXN0ZXZhbUBnbWFpbC5jb21dDQo+U2VudDogTW9udGFnLCAxMy4gTm92ZW1iZXIgMjAx
NyAxOTo1Nw0KPj4gSSBkb24ndCByZWNhbGwgb2YgYW55IHJlY2VudCBjaGFuZ2UgaW4gdGhpcyBh
cmVhLg0KPj4NCkkgZG9uJ3QgdGhpbmsgdGhlIGJlaGF2aW9yIGNoYW5nZWQgcmVjZW50bHkuIEkg
dHJpZWQgYSBrZXJuZWwgNC40LjY1IGFuZCBpdCBzaG93cyB0aGUgc2FtZSBzeW1wdG9tcy4gSSBn
dWVzcyBOb2VsIHJlYWxseSBtZWFucyAzLjE5LT4gNC4wLg0KDQo+PiBQYXRyaWNrL05vZWwsDQo+
Pg0KPj4gRG9lcyB0aGUgY2hhbmdlIGJlbG93IGhlbHA/DQpVbmZvcnR1bmF0ZWx5IG5vLiBEaWQg
eW91IHJ1biBod2Nsb2NrIG9yIHJ0Y3Rlc3Q/DQpJIHN0aWxsIHNlZToNCnJvb3RAQ1g5MDIwOn4j
IGNhdCAvcHJvYy9pbnRlcnJ1cHRzIHwgZ3JlcCBydGMNCiA0MDogICAgICAgICAgMCAgICAgIHR6
aWMgIDI0IEVkZ2UgICAgICA1M2ZhNDAwMC5zcnRjDQogNDE6ICAgICAgICAgIDAgICAgICB0emlj
ICAyNSBFZGdlICAgICAgNTNmYTQwMDAuc3J0Yw0Kcm9vdEBDWDkwMjA6fiMgaHdjbG9jayAtRCAt
cg0KaHdjbG9jayBmcm9tIHV0aWwtbGludXggMi4yOS4yDQpVc2luZyB0aGUgL2RldiBpbnRlcmZh
Y2UgdG8gdGhlIGNsb2NrLg0KTGFzdCBkcmlmdCBhZGp1c3RtZW50IGRvbmUgYXQgMTQ5MDg4NTA4
MiBzZWNvbmRzIGFmdGVyIDE5NjkgTGFzdCBjYWxpYnJhdGlvbiBkb25lIGF0IDE0OTA4ODUwODIg
c2Vjb25kcyBhZnRlciAxOTY5IEhhcmR3YXJlIGNsb2NrIGlzIG9uIFVUQyB0aW1lIEFzc3VtaW5n
IGhhcmR3YXJlIGNsb2NrIGlzIGtlcHQgaW4gVVRDIHRpbWUuDQpXYWl0aW5nIGZvciBjbG9jayB0
aWNrLi4uDQpbICAgNDEuMDM1MjY5XSBpcnEgNDA6IG5vYm9keSBjYXJlZCAodHJ5IGJvb3Rpbmcg
d2l0aCB0aGUgImlycXBvbGwiIG9wdGlvbikNClsgICA0MS4wNDI1MTRdIGhhbmRsZXJzOg0KWyAg
IDQxLjA0NDg0N10gWzxjMDYwMzFlMD5dIGRyeWljZV9pcnENClsgICA0MS4wNDgzOThdIERpc2Fi
bGluZyBJUlEgIzQwDQpzZWxlY3QoKSB0byAvZGV2L3J0YyB0byB3YWl0IGZvciBjbG9jayB0aWNr
IHRpbWVkIG91dC4uLnN5bmNocm9uaXphdGlvbiBmYWlsZWQgcm9vdEBDWDkwMjA6fiMgY2F0IC9w
cm9jL2ludGVycnVwdHMgfCBncmVwIHJ0Yw0KIDQwOiAgICAgMTAwMDAwICAgICAgdHppYyAgMjQg
RWRnZSAgICAgIDUzZmE0MDAwLnNydGMNCiA0MTogICAgICAgICAgMCAgICAgIHR6aWMgIDI1IEVk
Z2UgICAgICA1M2ZhNDAwMC5zcnRjDQoNCg0Kb3IgaWYgSSBydW4gcnRjdGVzdCBmcm9tIHRvb2xz
L3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy8gKGFmdGVyIHJlYm9vdCk6DQoNCnJvb3RAQ1g5MDIw
On4jIGNhdCAvcHJvYy9pbnRlcnJ1cHRzIHwgZ3JlcCBydGMNCiA0MDogICAgICAgICAgMCAgICAg
IHR6aWMgIDI0IEVkZ2UgICAgICA1M2ZhNDAwMC5zcnRjDQogNDE6ICAgICAgICAgIDAgICAgICB0
emljICAyNSBFZGdlICAgICAgNTNmYTQwMDAuc3J0Yw0Kcm9vdEBDWDkwMjA6fiMgLi9ydGN0ZXN0
DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIFJUQyBEcml2ZXIgVGVzdCBFeGFtcGxlLg0KDQpD
b3VudGluZyA1IHVwZGF0ZSAoMS9zZWMpIGludGVycnVwdHMgZnJvbSByZWFkaW5nIC9kZXYvcnRj
MDpbICAgMzcuNTUwMzk5XSBpcnEgNDA6IG5vYm9keSBjYXJlZCAodHJ5IGJvb3Rpbmcgd2l0aCB0
aGUgImlycXBvbGwiIG9wdGlvbikNClsgICAzNy41NTc2NDZdIGhhbmRsZXJzOg0KWyAgIDM3LjU1
OTk4MF0gWzxjMDYwMzFlMD5dIGRyeWljZV9pcnENClsgICAzNy41NjM1MzJdIERpc2FibGluZyBJ
UlEgIzQwDQpeQw0Kcm9vdEBDWDkwMjA6fiMgY2F0IC9wcm9jL2ludGVycnVwdHMgfCBncmVwIHJ0
Yw0KIDQwOiAgICAgMTAwMDAwICAgICAgdHppYyAgMjQgRWRnZSAgICAgIDUzZmE0MDAwLnNydGMN
CiA0MTogICAgICAgICAgMCAgICAgIHR6aWMgIDI1IEVkZ2UgICAgICA1M2ZhNDAwMC5zcnRjDQoN
Cg0KV2l0aCB0aGUgYXR0YWNoZWQgcGF0Y2ggSSBnZXQgcmlkIG9mIHRoZSB1bmhhbmRsZWQgaW50
ZXJydXB0cy4gQnV0IHRoYXQgcGF0Y2gganVzdCBBQ0tzIGV2ZXJ5dGhpbmcuDQogcm9vdEBDWDkw
MjA6fiMgY2F0IC9wcm9jL2ludGVycnVwdHMgfCBncmVwIHJ0Yw0KIDQwOiAgICAgICAgICAwICAg
ICAgdHppYyAgMjQgRWRnZSAgICAgIDUzZmE0MDAwLnNydGMNCiA0MTogICAgICAgICAgMCAgICAg
IHR6aWMgIDI1IEVkZ2UgICAgICA1M2ZhNDAwMC5zcnRjDQpyb290QENYOTAyMDp+IyBod2Nsb2Nr
IC1EIC1yDQpod2Nsb2NrIGZyb20gdXRpbC1saW51eCAyLjI5LjINClVzaW5nIHRoZSAvZGV2IGlu
dGVyZmFjZSB0byB0aGUgY2xvY2suDQpMYXN0IGRyaWZ0IGFkanVzdG1lbnQgZG9uZSBhdCAxNDkw
ODg1MDgyIHNlY29uZHMgYWZ0ZXIgMTk2OSBMYXN0IGNhbGlicmF0aW9uIGRvbmUgYXQgMTQ5MDg4
NTA4MiBzZWNvbmRzIGFmdGVyIDE5NjkgSGFyZHdhcmUgY2xvY2sgaXMgb24gVVRDIHRpbWUgQXNz
dW1pbmcgaGFyZHdhcmUgY2xvY2sgaXMga2VwdCBpbiBVVEMgdGltZS4NCldhaXRpbmcgZm9yIGNs
b2NrIHRpY2suLi4NCnNlbGVjdCgpIHRvIC9kZXYvcnRjIHRvIHdhaXQgZm9yIGNsb2NrIHRpY2sg
dGltZWQgb3V0Li4uc3luY2hyb25pemF0aW9uIGZhaWxlZCByb290QENYOTAyMDp+IyBjYXQgL3By
b2MvaW50ZXJydXB0cyB8IGdyZXAgcnRjDQogNDA6ICAgICAzMDE4NDQgICAgICB0emljICAyNCBF
ZGdlICAgICAgNTNmYTQwMDAuc3J0Yw0KIDQxOiAgICAgICAgICAwICAgICAgdHppYyAgMjUgRWRn
ZSAgICAgIDUzZmE0MDAwLnNydGMNCg0KRnJvbSA0MjI3NDc2ODZmNTcyM2FjNzViOThhZDYxMGIz
ZWY0ZDk0ZWYyNzFmIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQ0KRnJvbTogUGF0cmljayBCcnVl
bm4gPHAuYnJ1ZW5uQGJlY2tob2ZmLmNvbT4NCkRhdGU6IFR1ZSwgMTQgTm92IDIwMTcgMDU6MjM6
MjQgKzAxMDANClN1YmplY3Q6IFtQQVRDSF0gWFhYOiBkaXNhYmxlIGludGVycnVwdHMgbWFudWFs
bHkNCg0KLS0tDQogZHJpdmVycy9ydGMvcnRjLWlteGRpLmMgfCAyNCArKysrKysrKysrKysrKysr
KysrKysrKysNCiAxIGZpbGUgY2hhbmdlZCwgMjQgaW5zZXJ0aW9ucygrKQ0KDQpkaWZmIC0tZ2l0
IGEvZHJpdmVycy9ydGMvcnRjLWlteGRpLmMgYi9kcml2ZXJzL3J0Yy9ydGMtaW14ZGkuYyBpbmRl
eCA4MDkzMTExNGM4OTkuLjRiNjRhNTM1MGJhYyAxMDA2NDQNCi0tLSBhL2RyaXZlcnMvcnRjL3J0
Yy1pbXhkaS5jDQorKysgYi9kcml2ZXJzL3J0Yy9ydGMtaW14ZGkuYw0KQEAgLTY4Niw2ICs2ODYs
MjQgQEAgc3RhdGljIGlycXJldHVybl90IGRyeWljZV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lk
KQ0KICAgICAgICBkaWVyID0gcmVhZGwoaW14ZGktPmlvYWRkciArIERJRVIpOw0KICAgICAgICBk
c3IgPSByZWFkbChpbXhkaS0+aW9hZGRyICsgRFNSKTsNCg0KKyAgICAgICAvKiBhY2sgbW9ub3Rv
bmljIGNvdW50ZXIgb3ZlcmZsb3cgKi8NCisgICAgICAgaWYgKERTUl9NQ08gPT0gZHNyKSB7DQor
ICAgICAgICAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOw0KKyAgICAgICB9DQorICAgICAgIGlm
IChkaWVyICYgRElFUl9XQ0lFKSB7DQorICAgICAgICAgICAgICAgaWYgKGRzciAmIERTUl9NQ08p
IHsNCisgICAgICAgICAgICAgICAgICAgICAgIGRpX2ludF9kaXNhYmxlKGlteGRpLCBESUVSX1dD
SUUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOw0KKyAgICAg
ICAgICAgICAgIH0NCisgICAgICAgfQ0KKw0KKyAgICAgICBpZiAoZGllciAmIERJRVJfQ0FJRSkg
ew0KKyAgICAgICAgICAgICAgIGlmIChkc3IgJiBEU1JfTUNPKSB7DQorICAgICAgICAgICAgICAg
ICAgICAgICBkaV9pbnRfZGlzYWJsZShpbXhkaSwgRElFUl9DQUlFKTsNCisgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsNCisgICAgICAgICAgICAgICB9DQorICAgICAg
IH0NCisNCiAgICAgICAgLyogaGFuZGxlIHRoZSBzZWN1cml0eSB2aW9sYXRpb24gZXZlbnQgKi8N
CiAgICAgICAgaWYgKGRpZXIgJiBESUVSX1NWSUUpIHsNCiAgICAgICAgICAgICAgICBpZiAoZHNy
ICYgRFNSX1NWRikgew0KQEAgLTcxMCw3ICs3MjgsMTAgQEAgc3RhdGljIGlycXJldHVybl90IGRy
eWljZV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQ0KICAgICAgICAgICAgICAgICAgb3BlcmF0
aW9ucy4gSXQgbWVhbnMgdGhlIGludGVycnVwdCBpcyBmb3IgRHJ5SWNlIC1TZWN1cml0eS4NCiAg
ICAgICAgICAgICAgICAgIElSUSBtdXN0IGJlIHJldHVybmVkIGFzIG5vbmUuKi8NCiAgICAgICAg
ICAgICAgICBpZiAobGlzdF9lbXB0eV9jYXJlZnVsKCZpbXhkaS0+d3JpdGVfd2FpdC5oZWFkKSkN
CisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoInJ0Yzog
WFhYWDogZGllcjogMHgleCBkc3I6IDB4JXhcbiIsIA0KKyBkaWVyLCBkc3IpOw0KICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIHJjOw0KKyAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAg
ICAgICAgIC8qIERTUl9XQ0YgY2xlYXJzIGl0c2VsZiBvbiBEU1IgcmVhZCAqLw0KICAgICAgICAg
ICAgICAgIGlmIChkc3IgJiAoRFNSX1dDRiB8IERTUl9XRUYpKSB7IEBAIC03MzcsNiArNzU4LDkg
QEAgc3RhdGljIGlycXJldHVybl90IGRyeWljZV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQ0K
ICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBJUlFfSEFORExFRDsNCiAgICAgICAgICAgICAg
ICB9DQogICAgICAgIH0NCisgICAgICAgaWYgKHJjICE9IElSUV9IQU5ETEVEKSB7DQorICAgICAg
ICAgICAgICAgcHJpbnRrKCJydGM6IFhYWFg6IGRpZXI6IDB4JXggZHNyOiAweCV4XG4iLCBkaWVy
LCBkc3IpOw0KKyAgICAgICB9DQogICAgICAgIHJldHVybiByYzsNCiB9DQoNCi0tDQoyLjExLjAN
CkJlY2tob2ZmIEF1dG9tYXRpb24gR21iSCAmIENvLiBLRyB8IE1hbmFnaW5nIERpcmVjdG9yOiBE
aXBsLiBQaHlzLiBIYW5zIEJlY2tob2ZmIFJlZ2lzdGVyZWQgb2ZmaWNlOiBWZXJsLCBHZXJtYW55
IHwgUmVnaXN0ZXIgY291cnQ6IEd1ZXRlcnNsb2ggSFJBIDcwNzUNCg0KDQo=

^ permalink raw reply

* RE: DryIce , RTC not working on imx53.
From: Patrick Brünn @ 2017-11-14  5:00 UTC (permalink / raw)
  To: Fabio Estevam, Alexandre Belloni
  Cc: Vellemans, Noel, linux-arm-kernel@lists.infradead.org,
	linux-rtc@vger.kernel.org
In-Reply-To: <CAOMZO5AOAo8OU86CrneFeWuu2ti1sea9843UQ16=7AyU5-B11Q@mail.gmail.com>

PkZyb206IEZhYmlvIEVzdGV2YW0gW21haWx0bzpmZXN0ZXZhbUBnbWFpbC5jb21dDQo+U2VudDog
TW9udGFnLCAxMy4gTm92ZW1iZXIgMjAxNyAxOTo1Nw0KPj4gSSBkb24ndCByZWNhbGwgb2YgYW55
IHJlY2VudCBjaGFuZ2UgaW4gdGhpcyBhcmVhLg0KPj4NCkkgZG9uJ3QgdGhpbmsgdGhlIGJlaGF2
aW9yIGNoYW5nZWQgcmVjZW50bHkuIEkgdHJpZWQgYSBrZXJuZWwgNC40LjY1IGFuZCBpdCBzaG93
cyB0aGUgc2FtZSBzeW1wdG9tcy4gSSBndWVzcyBOb2VsIHJlYWxseSBtZWFucyAzLjE5LT4gNC4w
Lg0KDQo+PiBQYXRyaWNrL05vZWwsDQo+Pg0KPj4gRG9lcyB0aGUgY2hhbmdlIGJlbG93IGhlbHA/
DQpVbmZvcnR1bmF0ZWx5IG5vLiBEaWQgeW91IHJ1biBod2Nsb2NrIG9yIHJ0Y3Rlc3Q/DQpJIHN0
aWxsIHNlZToNCnJvb3RAQ1g5MDIwOn4jIGNhdCAvcHJvYy9pbnRlcnJ1cHRzIHwgZ3JlcCBydGMN
CiA0MDogICAgICAgICAgMCAgICAgIHR6aWMgIDI0IEVkZ2UgICAgICA1M2ZhNDAwMC5zcnRjDQog
NDE6ICAgICAgICAgIDAgICAgICB0emljICAyNSBFZGdlICAgICAgNTNmYTQwMDAuc3J0Yw0Kcm9v
dEBDWDkwMjA6fiMgaHdjbG9jayAtRCAtcg0KaHdjbG9jayBmcm9tIHV0aWwtbGludXggMi4yOS4y
DQpVc2luZyB0aGUgL2RldiBpbnRlcmZhY2UgdG8gdGhlIGNsb2NrLg0KTGFzdCBkcmlmdCBhZGp1
c3RtZW50IGRvbmUgYXQgMTQ5MDg4NTA4MiBzZWNvbmRzIGFmdGVyIDE5NjkNCkxhc3QgY2FsaWJy
YXRpb24gZG9uZSBhdCAxNDkwODg1MDgyIHNlY29uZHMgYWZ0ZXIgMTk2OQ0KSGFyZHdhcmUgY2xv
Y2sgaXMgb24gVVRDIHRpbWUNCkFzc3VtaW5nIGhhcmR3YXJlIGNsb2NrIGlzIGtlcHQgaW4gVVRD
IHRpbWUuDQpXYWl0aW5nIGZvciBjbG9jayB0aWNrLi4uDQpbICAgNDEuMDM1MjY5XSBpcnEgNDA6
IG5vYm9keSBjYXJlZCAodHJ5IGJvb3Rpbmcgd2l0aCB0aGUgImlycXBvbGwiIG9wdGlvbikNClsg
ICA0MS4wNDI1MTRdIGhhbmRsZXJzOg0KWyAgIDQxLjA0NDg0N10gWzxjMDYwMzFlMD5dIGRyeWlj
ZV9pcnENClsgICA0MS4wNDgzOThdIERpc2FibGluZyBJUlEgIzQwDQpzZWxlY3QoKSB0byAvZGV2
L3J0YyB0byB3YWl0IGZvciBjbG9jayB0aWNrIHRpbWVkIG91dC4uLnN5bmNocm9uaXphdGlvbiBm
YWlsZWQNCnJvb3RAQ1g5MDIwOn4jIGNhdCAvcHJvYy9pbnRlcnJ1cHRzIHwgZ3JlcCBydGMNCiA0
MDogICAgIDEwMDAwMCAgICAgIHR6aWMgIDI0IEVkZ2UgICAgICA1M2ZhNDAwMC5zcnRjDQogNDE6
ICAgICAgICAgIDAgICAgICB0emljICAyNSBFZGdlICAgICAgNTNmYTQwMDAuc3J0Yw0KDQoNCm9y
IGlmIEkgcnVuIHJ0Y3Rlc3QgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvIChh
ZnRlciByZWJvb3QpOg0KDQpyb290QENYOTAyMDp+IyBjYXQgL3Byb2MvaW50ZXJydXB0cyB8IGdy
ZXAgcnRjDQogNDA6ICAgICAgICAgIDAgICAgICB0emljICAyNCBFZGdlICAgICAgNTNmYTQwMDAu
c3J0Yw0KIDQxOiAgICAgICAgICAwICAgICAgdHppYyAgMjUgRWRnZSAgICAgIDUzZmE0MDAwLnNy
dGMNCnJvb3RAQ1g5MDIwOn4jIC4vcnRjdGVzdA0KDQogICAgICAgICAgICAgICAgICAgICAgICBS
VEMgRHJpdmVyIFRlc3QgRXhhbXBsZS4NCg0KQ291bnRpbmcgNSB1cGRhdGUgKDEvc2VjKSBpbnRl
cnJ1cHRzIGZyb20gcmVhZGluZyAvZGV2L3J0YzA6WyAgIDM3LjU1MDM5OV0gaXJxIDQwOiBub2Jv
ZHkgY2FyZWQgKHRyeSBib290aW5nIHdpdGggdGhlICJpcnFwb2xsIiBvcHRpb24pDQpbICAgMzcu
NTU3NjQ2XSBoYW5kbGVyczoNClsgICAzNy41NTk5ODBdIFs8YzA2MDMxZTA+XSBkcnlpY2VfaXJx
DQpbICAgMzcuNTYzNTMyXSBEaXNhYmxpbmcgSVJRICM0MA0KXkMNCnJvb3RAQ1g5MDIwOn4jIGNh
dCAvcHJvYy9pbnRlcnJ1cHRzIHwgZ3JlcCBydGMNCiA0MDogICAgIDEwMDAwMCAgICAgIHR6aWMg
IDI0IEVkZ2UgICAgICA1M2ZhNDAwMC5zcnRjDQogNDE6ICAgICAgICAgIDAgICAgICB0emljICAy
NSBFZGdlICAgICAgNTNmYTQwMDAuc3J0Yw0KDQoNCldpdGggdGhlIGF0dGFjaGVkIHBhdGNoIEkg
Z2V0IHJpZCBvZiB0aGUgdW5oYW5kbGVkIGludGVycnVwdHMuIEJ1dCB0aGF0IHBhdGNoIGp1c3Qg
QUNLcyBldmVyeXRoaW5nLg0KIHJvb3RAQ1g5MDIwOn4jIGNhdCAvcHJvYy9pbnRlcnJ1cHRzIHwg
Z3JlcCBydGMNCiA0MDogICAgICAgICAgMCAgICAgIHR6aWMgIDI0IEVkZ2UgICAgICA1M2ZhNDAw
MC5zcnRjDQogNDE6ICAgICAgICAgIDAgICAgICB0emljICAyNSBFZGdlICAgICAgNTNmYTQwMDAu
c3J0Yw0Kcm9vdEBDWDkwMjA6fiMgaHdjbG9jayAtRCAtcg0KaHdjbG9jayBmcm9tIHV0aWwtbGlu
dXggMi4yOS4yDQpVc2luZyB0aGUgL2RldiBpbnRlcmZhY2UgdG8gdGhlIGNsb2NrLg0KTGFzdCBk
cmlmdCBhZGp1c3RtZW50IGRvbmUgYXQgMTQ5MDg4NTA4MiBzZWNvbmRzIGFmdGVyIDE5NjkNCkxh
c3QgY2FsaWJyYXRpb24gZG9uZSBhdCAxNDkwODg1MDgyIHNlY29uZHMgYWZ0ZXIgMTk2OQ0KSGFy
ZHdhcmUgY2xvY2sgaXMgb24gVVRDIHRpbWUNCkFzc3VtaW5nIGhhcmR3YXJlIGNsb2NrIGlzIGtl
cHQgaW4gVVRDIHRpbWUuDQpXYWl0aW5nIGZvciBjbG9jayB0aWNrLi4uDQpzZWxlY3QoKSB0byAv
ZGV2L3J0YyB0byB3YWl0IGZvciBjbG9jayB0aWNrIHRpbWVkIG91dC4uLnN5bmNocm9uaXphdGlv
biBmYWlsZWQNCnJvb3RAQ1g5MDIwOn4jIGNhdCAvcHJvYy9pbnRlcnJ1cHRzIHwgZ3JlcCBydGMN
CiA0MDogICAgIDMwMTg0NCAgICAgIHR6aWMgIDI0IEVkZ2UgICAgICA1M2ZhNDAwMC5zcnRjDQog
NDE6ICAgICAgICAgIDAgICAgICB0emljICAyNSBFZGdlICAgICAgNTNmYTQwMDAuc3J0Yw0KDQpG
cm9tIDQyMjc0NzY4NmY1NzIzYWM3NWI5OGFkNjEwYjNlZjRkOTRlZjI3MWYgTW9uIFNlcCAxNyAw
MDowMDowMCAyMDAxDQpGcm9tOiBQYXRyaWNrIEJydWVubiA8cC5icnVlbm5AYmVja2hvZmYuY29t
Pg0KRGF0ZTogVHVlLCAxNCBOb3YgMjAxNyAwNToyMzoyNCArMDEwMA0KU3ViamVjdDogW1BBVENI
XSBYWFg6IGRpc2FibGUgaW50ZXJydXB0cyBtYW51YWxseQ0KDQotLS0NCiBkcml2ZXJzL3J0Yy9y
dGMtaW14ZGkuYyB8IDI0ICsrKysrKysrKysrKysrKysrKysrKysrKw0KIDEgZmlsZSBjaGFuZ2Vk
LCAyNCBpbnNlcnRpb25zKCspDQoNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtaW14ZGku
YyBiL2RyaXZlcnMvcnRjL3J0Yy1pbXhkaS5jDQppbmRleCA4MDkzMTExNGM4OTkuLjRiNjRhNTM1
MGJhYyAxMDA2NDQNCi0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1pbXhkaS5jDQorKysgYi9kcml2ZXJz
L3J0Yy9ydGMtaW14ZGkuYw0KQEAgLTY4Niw2ICs2ODYsMjQgQEAgc3RhdGljIGlycXJldHVybl90
IGRyeWljZV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQ0KICAgICAgICBkaWVyID0gcmVhZGwo
aW14ZGktPmlvYWRkciArIERJRVIpOw0KICAgICAgICBkc3IgPSByZWFkbChpbXhkaS0+aW9hZGRy
ICsgRFNSKTsNCg0KKyAgICAgICAvKiBhY2sgbW9ub3RvbmljIGNvdW50ZXIgb3ZlcmZsb3cgKi8N
CisgICAgICAgaWYgKERTUl9NQ08gPT0gZHNyKSB7DQorICAgICAgICAgICAgICAgcmV0dXJuIElS
UV9IQU5ETEVEOw0KKyAgICAgICB9DQorICAgICAgIGlmIChkaWVyICYgRElFUl9XQ0lFKSB7DQor
ICAgICAgICAgICAgICAgaWYgKGRzciAmIERTUl9NQ08pIHsNCisgICAgICAgICAgICAgICAgICAg
ICAgIGRpX2ludF9kaXNhYmxlKGlteGRpLCBESUVSX1dDSUUpOw0KKyAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgfQ0K
Kw0KKyAgICAgICBpZiAoZGllciAmIERJRVJfQ0FJRSkgew0KKyAgICAgICAgICAgICAgIGlmIChk
c3IgJiBEU1JfTUNPKSB7DQorICAgICAgICAgICAgICAgICAgICAgICBkaV9pbnRfZGlzYWJsZShp
bXhkaSwgRElFUl9DQUlFKTsNCisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJUlFfSEFO
RExFRDsNCisgICAgICAgICAgICAgICB9DQorICAgICAgIH0NCisNCiAgICAgICAgLyogaGFuZGxl
IHRoZSBzZWN1cml0eSB2aW9sYXRpb24gZXZlbnQgKi8NCiAgICAgICAgaWYgKGRpZXIgJiBESUVS
X1NWSUUpIHsNCiAgICAgICAgICAgICAgICBpZiAoZHNyICYgRFNSX1NWRikgew0KQEAgLTcxMCw3
ICs3MjgsMTAgQEAgc3RhdGljIGlycXJldHVybl90IGRyeWljZV9pcnEoaW50IGlycSwgdm9pZCAq
ZGV2X2lkKQ0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy4gSXQgbWVhbnMgdGhlIGludGVy
cnVwdCBpcyBmb3IgRHJ5SWNlIC1TZWN1cml0eS4NCiAgICAgICAgICAgICAgICAgIElSUSBtdXN0
IGJlIHJldHVybmVkIGFzIG5vbmUuKi8NCiAgICAgICAgICAgICAgICBpZiAobGlzdF9lbXB0eV9j
YXJlZnVsKCZpbXhkaS0+d3JpdGVfd2FpdC5oZWFkKSkNCisgICAgICAgICAgICAgICB7DQorICAg
ICAgICAgICAgICAgICAgICAgICBwcmludGsoInJ0YzogWFhYWDogZGllcjogMHgleCBkc3I6IDB4
JXhcbiIsIGRpZXIsIGRzcik7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmM7DQor
ICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLyogRFNSX1dDRiBjbGVhcnMgaXRz
ZWxmIG9uIERTUiByZWFkICovDQogICAgICAgICAgICAgICAgaWYgKGRzciAmIChEU1JfV0NGIHwg
RFNSX1dFRikpIHsNCkBAIC03MzcsNiArNzU4LDkgQEAgc3RhdGljIGlycXJldHVybl90IGRyeWlj
ZV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmMg
PSBJUlFfSEFORExFRDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgIH0NCisgICAgICAgaWYg
KHJjICE9IElSUV9IQU5ETEVEKSB7DQorICAgICAgICAgICAgICAgcHJpbnRrKCJydGM6IFhYWFg6
IGRpZXI6IDB4JXggZHNyOiAweCV4XG4iLCBkaWVyLCBkc3IpOw0KKyAgICAgICB9DQogICAgICAg
IHJldHVybiByYzsNCiB9DQoNCi0tDQoyLjExLjANCkJlY2tob2ZmIEF1dG9tYXRpb24gR21iSCAm
IENvLiBLRyB8IE1hbmFnaW5nIERpcmVjdG9yOiBEaXBsLiBQaHlzLiBIYW5zIEJlY2tob2ZmDQpS
ZWdpc3RlcmVkIG9mZmljZTogVmVybCwgR2VybWFueSB8IFJlZ2lzdGVyIGNvdXJ0OiBHdWV0ZXJz
bG9oIEhSQSA3MDc1DQoNCg0K

^ permalink raw reply

* Re: DryIce , RTC not working on imx53.
From: Fabio Estevam @ 2017-11-13 18:56 UTC (permalink / raw)
  To: Alexandre Belloni
  Cc: Patrick Brünn, Vellemans, Noel,
	linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <CAOMZO5Bi5PcuGiVRZykw9Zp-ysHmHzThhwNai-cqy3HRTUKQAg@mail.gmail.com>

On Mon, Nov 13, 2017 at 2:54 PM, Fabio Estevam <festevam@gmail.com> wrote:

> I don't recall of any recent change in this area.
>
> Patrick/Noel,
>
> Does the change below help?
>
> --- a/arch/arm/boot/dts/imx53.dtsi
> +++ b/arch/arm/boot/dts/imx53.dtsi
> @@ -436,8 +436,7 @@
>                         srtc: srtc@53fa4000 {
>                                 compatible = "fsl,imx53-rtc", "fsl,imx25-rtc";
>                                 reg = <0x53fa4000 0x4000>;
> -                               interrupts = <24>;
> -                               interrupt-parent = <&tzic>;
> +                               interrupts = <24 25>;
>                                 clocks = <&clks IMX5_CLK_SRTC_GATE>;
>                                 clock-names = "ipg";
>                         };

With this change I no longer get the spurious interrupts:

# cat /proc/interrupts | grep rtc
 40:          0      tzic  24 Edge      53fa4000.srtc
 41:          0      tzic  25 Edge      53fa4000.srtc

The timeout is still present though and we need to figure this out.

^ permalink raw reply

* Re: DryIce , RTC not working on imx53.
From: Fabio Estevam @ 2017-11-13 16:54 UTC (permalink / raw)
  To: Alexandre Belloni
  Cc: Patrick Brünn, Vellemans, Noel,
	linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <20171113161522.2kq7un7gl5vg4qlq@piout.net>

Hi Alexandre,

On Mon, Nov 13, 2017 at 2:15 PM, Alexandre Belloni
<alexandre.belloni@free-electrons.com> wrote:

> Fabio, is there any recent change in the platform code that would make
> reading/writing the rtc register fail?

I don't recall of any recent change in this area.

Patrick/Noel,

Does the change below help?

--- a/arch/arm/boot/dts/imx53.dtsi
+++ b/arch/arm/boot/dts/imx53.dtsi
@@ -436,8 +436,7 @@
                        srtc: srtc@53fa4000 {
                                compatible = "fsl,imx53-rtc", "fsl,imx25-rtc";
                                reg = <0x53fa4000 0x4000>;
-                               interrupts = <24>;
-                               interrupt-parent = <&tzic>;
+                               interrupts = <24 25>;
                                clocks = <&clks IMX5_CLK_SRTC_GATE>;
                                clock-names = "ipg";
                        };

^ permalink raw reply

* Re: DryIce , RTC not working on imx53.
From: Alexandre Belloni @ 2017-11-13 16:15 UTC (permalink / raw)
  To: Patrick Brünn
  Cc: Vellemans, Noel, Fabio Estevam,
	linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org
In-Reply-To: <3BB206AB2B1BD448954845CE6FF69A8E01CB52290E@NT-Mail07.beckhoff.com>

+Cc Fabio

On 09/11/2017 at 09:59:02 +0000, Patrick Brünn wrote:
> 
> >From: Alexandre Belloni [mailto:alexandre.belloni@free-electrons.com]
> >Sent: Donnerstag, 9. November 2017 04:03
> >
> >hwclock times out because the alarm is not working properly. Can you
> >check whether rtctest is working?
> >
> You mean "tools/testing/selftests/timers/rtctest", right?
> 
> I just run it and it's stuck at "Counting 5 update (1/sec) interrupts from reading /dev/rtc0:"
> 

So alarms or interrupts definitively don't work.

> Kernel log shows a new message for each try I restart rtctest.
> [ 1032.349562] imxdi_rtc 53fa4000.srtc: Write-wait timeout val = 0x5a042418 reg = 0x00000008"
> 

That would explain it because failing to write DCAMR means that the
alarm is not set to the proper value.

But that doesn't explain all the spurious interrupts you are seeing.

Fabio, is there any recent change in the platform code that would make
reading/writing the rtc register fail?


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

^ permalink raw reply

* [rtc-linux] [PATCH v4 2/2] rtc: cros-ec: add cros-ec-rtc driver.
From: Enric Balletbo i Serra @ 2017-11-10 21:55 UTC (permalink / raw)
  To: Lee Jones, bleung
  Cc: Guenter Roeck, Gwendal Grignou, linux-kernel, linux-iio,
	rtc-linux, Stephen Barber
In-Reply-To: <20171110215553.20696-1-enric.balletbo@collabora.com>

From: Stephen Barber <smbarber@chromium.org>

On platforms with a Chrome OS EC, the EC can function as a simple RTC.
Add a basic driver with this functionality.

Signed-off-by: Stephen Barber <smbarber@chromium.org>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Acked-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Acked-by: Benson Leung <bleung@chromium.org>
---
 drivers/rtc/Kconfig       |  10 ++
 drivers/rtc/Makefile      |   1 +
 drivers/rtc/rtc-cros-ec.c | 413 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 424 insertions(+)
 create mode 100644 drivers/rtc/rtc-cros-ec.c

diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index e0e58f3..f157288 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -1231,6 +1231,16 @@ config RTC_DRV_ZYNQMP
 	  If you say yes here you get support for the RTC controller found on
 	  Xilinx Zynq Ultrascale+ MPSoC.
 
+config RTC_DRV_CROS_EC
+	tristate "Chrome OS EC RTC driver"
+	depends on MFD_CROS_EC
+	help
+	  If you say yes here you will get support for the
+	  Chrome OS Embedded Controller's RTC.
+
+	  This driver can also be built as a module. If so, the module
+	  will be called rtc-cros-ec.
+
 comment "on-CPU RTC drivers"
 
 config RTC_DRV_ASM9260
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index 0bf1fc0..08789d7 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -44,6 +44,7 @@ obj-$(CONFIG_RTC_DRV_BQ4802)	+= rtc-bq4802.o
 obj-$(CONFIG_RTC_DRV_CMOS)	+= rtc-cmos.o
 obj-$(CONFIG_RTC_DRV_COH901331)	+= rtc-coh901331.o
 obj-$(CONFIG_RTC_DRV_CPCAP)	+= rtc-cpcap.o
+obj-$(CONFIG_RTC_DRV_CROS_EC)	+= rtc-cros-ec.o
 obj-$(CONFIG_RTC_DRV_DA9052)	+= rtc-da9052.o
 obj-$(CONFIG_RTC_DRV_DA9055)	+= rtc-da9055.o
 obj-$(CONFIG_RTC_DRV_DA9063)	+= rtc-da9063.o
diff --git a/drivers/rtc/rtc-cros-ec.c b/drivers/rtc/rtc-cros-ec.c
new file mode 100644
index 0000000..f0ea689
--- /dev/null
+++ b/drivers/rtc/rtc-cros-ec.c
@@ -0,0 +1,413 @@
+/*
+ * RTC driver for Chrome OS Embedded Controller
+ *
+ * Copyright (c) 2017, Google, Inc
+ *
+ * Author: Stephen Barber <smbarber@chromium.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+#include <linux/kernel.h>
+#include <linux/mfd/cros_ec.h>
+#include <linux/mfd/cros_ec_commands.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/rtc.h>
+#include <linux/slab.h>
+
+#define DRV_NAME	"cros-ec-rtc"
+
+/**
+ * struct cros_ec_rtc - Driver data for EC RTC
+ *
+ * @cros_ec: Pointer to EC device
+ * @rtc: Pointer to RTC device
+ * @notifier: Notifier info for responding to EC events
+ * @saved_alarm: Alarm to restore when interrupts are reenabled
+ */
+struct cros_ec_rtc {
+	struct cros_ec_device *cros_ec;
+	struct rtc_device *rtc;
+	struct notifier_block notifier;
+	u32 saved_alarm;
+};
+
+static int cros_ec_rtc_get(struct cros_ec_device *cros_ec, u32 command,
+			   u32 *response)
+{
+	int ret;
+	struct {
+		struct cros_ec_command msg;
+		struct ec_response_rtc data;
+	} __packed msg;
+
+	memset(&msg, 0, sizeof(msg));
+	msg.msg.command = command;
+	msg.msg.insize = sizeof(msg.data);
+
+	ret = cros_ec_cmd_xfer_status(cros_ec, &msg.msg);
+	if (ret < 0) {
+		dev_err(cros_ec->dev,
+			"error getting %s from EC: %d\n",
+			command == EC_CMD_RTC_GET_VALUE ? "time" : "alarm",
+			ret);
+		return ret;
+	}
+
+	*response = msg.data.time;
+
+	return 0;
+}
+
+static int cros_ec_rtc_set(struct cros_ec_device *cros_ec, u32 command,
+			   u32 param)
+{
+	int ret = 0;
+	struct {
+		struct cros_ec_command msg;
+		struct ec_response_rtc data;
+	} __packed msg;
+
+	memset(&msg, 0, sizeof(msg));
+	msg.msg.command = command;
+	msg.msg.outsize = sizeof(msg.data);
+	msg.data.time = param;
+
+	ret = cros_ec_cmd_xfer_status(cros_ec, &msg.msg);
+	if (ret < 0) {
+		dev_err(cros_ec->dev, "error setting %s on EC: %d\n",
+			command == EC_CMD_RTC_SET_VALUE ? "time" : "alarm",
+			ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+/* Read the current time from the EC. */
+static int cros_ec_rtc_read_time(struct device *dev, struct rtc_time *tm)
+{
+	struct cros_ec_rtc *cros_ec_rtc = dev_get_drvdata(dev);
+	struct cros_ec_device *cros_ec = cros_ec_rtc->cros_ec;
+	int ret;
+	u32 time;
+
+	ret = cros_ec_rtc_get(cros_ec, EC_CMD_RTC_GET_VALUE, &time);
+	if (ret) {
+		dev_err(dev, "error getting time: %d\n", ret);
+		return ret;
+	}
+
+	rtc_time64_to_tm(time, tm);
+
+	return 0;
+}
+
+/* Set the current EC time. */
+static int cros_ec_rtc_set_time(struct device *dev, struct rtc_time *tm)
+{
+	struct cros_ec_rtc *cros_ec_rtc = dev_get_drvdata(dev);
+	struct cros_ec_device *cros_ec = cros_ec_rtc->cros_ec;
+	int ret;
+	time64_t time;
+
+	time = rtc_tm_to_time64(tm);
+	if (time < 0 || time > U32_MAX)
+		return -EINVAL;
+
+	ret = cros_ec_rtc_set(cros_ec, EC_CMD_RTC_SET_VALUE, (u32)time);
+	if (ret < 0) {
+		dev_err(dev, "error setting time: %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+/* Read alarm time from RTC. */
+static int cros_ec_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
+{
+	struct cros_ec_rtc *cros_ec_rtc = dev_get_drvdata(dev);
+	struct cros_ec_device *cros_ec = cros_ec_rtc->cros_ec;
+	int ret;
+	u32 current_time, alarm_offset;
+
+	/*
+	 * The EC host command for getting the alarm is relative (i.e. 5
+	 * seconds from now) whereas rtc_wkalrm is absolute. Get the current
+	 * RTC time first so we can calculate the relative time.
+	 */
+	ret = cros_ec_rtc_get(cros_ec, EC_CMD_RTC_GET_VALUE, &current_time);
+	if (ret < 0) {
+		dev_err(dev, "error getting time: %d\n", ret);
+		return ret;
+	}
+
+	ret = cros_ec_rtc_get(cros_ec, EC_CMD_RTC_GET_ALARM, &alarm_offset);
+	if (ret < 0) {
+		dev_err(dev, "error getting alarm: %d\n", ret);
+		return ret;
+	}
+
+	rtc_time64_to_tm(current_time + alarm_offset, &alrm->time);
+
+	return 0;
+}
+
+/* Set the EC's RTC alarm. */
+static int cros_ec_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
+{
+	struct cros_ec_rtc *cros_ec_rtc = dev_get_drvdata(dev);
+	struct cros_ec_device *cros_ec = cros_ec_rtc->cros_ec;
+	int ret;
+	time64_t alarm_time;
+	u32 current_time, alarm_offset;
+
+	/*
+	 * The EC host command for setting the alarm is relative
+	 * (i.e. 5 seconds from now) whereas rtc_wkalrm is absolute.
+	 * Get the current RTC time first so we can calculate the
+	 * relative time.
+	 */
+	ret = cros_ec_rtc_get(cros_ec, EC_CMD_RTC_GET_VALUE, &current_time);
+	if (ret < 0) {
+		dev_err(dev, "error getting time: %d\n", ret);
+		return ret;
+	}
+
+	alarm_time = rtc_tm_to_time64(&alrm->time);
+
+	if (alarm_time < 0 || alarm_time > U32_MAX)
+		return -EINVAL;
+
+	if (!alrm->enabled) {
+		/*
+		 * If the alarm is being disabled, send an alarm
+		 * clear command.
+		 */
+		alarm_offset = EC_RTC_ALARM_CLEAR;
+		cros_ec_rtc->saved_alarm = (u32)alarm_time;
+	} else {
+		/* Don't set an alarm in the past. */
+		if ((u32)alarm_time < current_time)
+			alarm_offset = EC_RTC_ALARM_CLEAR;
+		else
+			alarm_offset = (u32)alarm_time - current_time;
+	}
+
+	ret = cros_ec_rtc_set(cros_ec, EC_CMD_RTC_SET_ALARM, alarm_offset);
+	if (ret < 0) {
+		dev_err(dev, "error setting alarm: %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int cros_ec_rtc_alarm_irq_enable(struct device *dev,
+					unsigned int enabled)
+{
+	struct cros_ec_rtc *cros_ec_rtc = dev_get_drvdata(dev);
+	struct cros_ec_device *cros_ec = cros_ec_rtc->cros_ec;
+	int ret;
+	u32 current_time, alarm_offset, alarm_value;
+
+	ret = cros_ec_rtc_get(cros_ec, EC_CMD_RTC_GET_VALUE, &current_time);
+	if (ret < 0) {
+		dev_err(dev, "error getting time: %d\n", ret);
+		return ret;
+	}
+
+	if (enabled) {
+		/* Restore saved alarm if it's still in the future. */
+		if (cros_ec_rtc->saved_alarm < current_time)
+			alarm_offset = EC_RTC_ALARM_CLEAR;
+		else
+			alarm_offset = cros_ec_rtc->saved_alarm - current_time;
+
+		ret = cros_ec_rtc_set(cros_ec, EC_CMD_RTC_SET_ALARM,
+				      alarm_offset);
+		if (ret < 0) {
+			dev_err(dev, "error restoring alarm: %d\n", ret);
+			return ret;
+		}
+	} else {
+		/* Disable alarm, saving the old alarm value. */
+		ret = cros_ec_rtc_get(cros_ec, EC_CMD_RTC_GET_ALARM,
+				      &alarm_offset);
+		if (ret < 0) {
+			dev_err(dev, "error saving alarm: %d\n", ret);
+			return ret;
+		}
+
+		alarm_value = current_time + alarm_offset;
+
+		/*
+		 * If the current EC alarm is already past, we don't want
+		 * to set an alarm when we go through the alarm irq enable
+		 * path.
+		 */
+		if (alarm_value < current_time)
+			cros_ec_rtc->saved_alarm = EC_RTC_ALARM_CLEAR;
+		else
+			cros_ec_rtc->saved_alarm = alarm_value;
+
+		alarm_offset = EC_RTC_ALARM_CLEAR;
+		ret = cros_ec_rtc_set(cros_ec, EC_CMD_RTC_SET_ALARM,
+				      alarm_offset);
+		if (ret < 0) {
+			dev_err(dev, "error disabling alarm: %d\n", ret);
+			return ret;
+		}
+	}
+
+	return 0;
+}
+
+static int cros_ec_rtc_event(struct notifier_block *nb,
+			     unsigned long queued_during_suspend,
+			     void *_notify)
+{
+	struct cros_ec_rtc *cros_ec_rtc;
+	struct rtc_device *rtc;
+	struct cros_ec_device *cros_ec;
+	u32 host_event;
+
+	cros_ec_rtc = container_of(nb, struct cros_ec_rtc, notifier);
+	rtc = cros_ec_rtc->rtc;
+	cros_ec = cros_ec_rtc->cros_ec;
+
+	host_event = cros_ec_get_host_event(cros_ec);
+	if (host_event & EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC)) {
+		rtc_update_irq(rtc, 1, RTC_IRQF | RTC_AF);
+		return NOTIFY_OK;
+	} else {
+		return NOTIFY_DONE;
+	}
+}
+
+static const struct rtc_class_ops cros_ec_rtc_ops = {
+	.read_time = cros_ec_rtc_read_time,
+	.set_time = cros_ec_rtc_set_time,
+	.read_alarm = cros_ec_rtc_read_alarm,
+	.set_alarm = cros_ec_rtc_set_alarm,
+	.alarm_irq_enable = cros_ec_rtc_alarm_irq_enable,
+};
+
+#ifdef CONFIG_PM_SLEEP
+static int cros_ec_rtc_suspend(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct cros_ec_rtc *cros_ec_rtc = dev_get_drvdata(&pdev->dev);
+
+	if (device_may_wakeup(dev))
+		enable_irq_wake(cros_ec_rtc->cros_ec->irq);
+
+	return 0;
+}
+
+static int cros_ec_rtc_resume(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct cros_ec_rtc *cros_ec_rtc = dev_get_drvdata(&pdev->dev);
+
+	if (device_may_wakeup(dev))
+		disable_irq_wake(cros_ec_rtc->cros_ec->irq);
+
+	return 0;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(cros_ec_rtc_pm_ops, cros_ec_rtc_suspend,
+			 cros_ec_rtc_resume);
+
+static int cros_ec_rtc_probe(struct platform_device *pdev)
+{
+	struct cros_ec_dev *ec_dev = dev_get_drvdata(pdev->dev.parent);
+	struct cros_ec_device *cros_ec = ec_dev->ec_dev;
+	struct cros_ec_rtc *cros_ec_rtc;
+	struct rtc_time tm;
+	int ret;
+
+	cros_ec_rtc = devm_kzalloc(&pdev->dev, sizeof(*cros_ec_rtc),
+				   GFP_KERNEL);
+	if (!cros_ec_rtc)
+		return -ENOMEM;
+
+	platform_set_drvdata(pdev, cros_ec_rtc);
+	cros_ec_rtc->cros_ec = cros_ec;
+
+	/* Get initial time */
+	ret = cros_ec_rtc_read_time(&pdev->dev, &tm);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to read RTC time\n");
+		return ret;
+	}
+
+	ret = device_init_wakeup(&pdev->dev, 1);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to initialize wakeup\n");
+		return ret;
+	}
+
+	cros_ec_rtc->rtc = devm_rtc_device_register(&pdev->dev, DRV_NAME,
+						    &cros_ec_rtc_ops,
+						    THIS_MODULE);
+	if (IS_ERR(cros_ec_rtc->rtc)) {
+		ret = PTR_ERR(cros_ec_rtc->rtc);
+		dev_err(&pdev->dev, "failed to register rtc device\n");
+		return ret;
+	}
+
+	/* Get RTC events from the EC. */
+	cros_ec_rtc->notifier.notifier_call = cros_ec_rtc_event;
+	ret = blocking_notifier_chain_register(&cros_ec->event_notifier,
+					       &cros_ec_rtc->notifier);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to register notifier\n");
+		return ret;
+	}
+
+	return 0;
+}
+
+static int cros_ec_rtc_remove(struct platform_device *pdev)
+{
+	struct cros_ec_rtc *cros_ec_rtc = platform_get_drvdata(pdev);
+	struct device *dev = &pdev->dev;
+	int ret;
+
+	ret = blocking_notifier_chain_unregister(
+				&cros_ec_rtc->cros_ec->event_notifier,
+				&cros_ec_rtc->notifier);
+	if (ret) {
+		dev_err(dev, "failed to unregister notifier\n");
+		return ret;
+	}
+
+	return 0;
+}
+
+static struct platform_driver cros_ec_rtc_driver = {
+	.probe = cros_ec_rtc_probe,
+	.remove = cros_ec_rtc_remove,
+	.driver = {
+		.name = DRV_NAME,
+		.pm = &cros_ec_rtc_pm_ops,
+	},
+};
+
+module_platform_driver(cros_ec_rtc_driver);
+
+MODULE_DESCRIPTION("RTC driver for Chrome OS ECs");
+MODULE_AUTHOR("Stephen Barber <smbarber@chromium.org>");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DRV_NAME);
-- 
2.9.3

-- 
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
--- 
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply related

* [rtc-linux] [PATCH v4 1/2] mfd: cros_ec: Introduce RTC commands and events definitions.
From: Enric Balletbo i Serra @ 2017-11-10 21:55 UTC (permalink / raw)
  To: Lee Jones, bleung
  Cc: Guenter Roeck, Gwendal Grignou, linux-kernel, linux-iio,
	rtc-linux, Stephen Barber
In-Reply-To: <20171110215553.20696-1-enric.balletbo@collabora.com>

From: Stephen Barber <smbarber@chromium.org>

The EC can function as a simple RT, this patch adds the RTC related
definitions needed by the rtc-cros-ec driver.

Signed-off-by: Stephen Barber <smbarber@chromium.org>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Acked-by: Lee Jones <lee.jones@linaro.org>
Acked-by: Benson Leung <bleung@chromium.org>
---
 include/linux/mfd/cros_ec_commands.h | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/include/linux/mfd/cros_ec_commands.h b/include/linux/mfd/cros_ec_commands.h
index 2b16e95..c6046a2 100644
--- a/include/linux/mfd/cros_ec_commands.h
+++ b/include/linux/mfd/cros_ec_commands.h
@@ -291,6 +291,9 @@ enum host_event_code {
 	/* EC desires to change state of host-controlled USB mux */
 	EC_HOST_EVENT_USB_MUX = 28,
 
+	/* EC RTC event occurred */
+	EC_HOST_EVENT_RTC = 26,
+
 	/*
 	 * The high bit of the event mask is not used as a host event code.  If
 	 * it reads back as set, then the entire event mask should be
@@ -799,6 +802,8 @@ enum ec_feature_code {
 	EC_FEATURE_USB_MUX = 23,
 	/* Motion Sensor code has an internal software FIFO */
 	EC_FEATURE_MOTION_SENSE_FIFO = 24,
+	/* EC has RTC feature that can be controlled by host commands */
+	EC_FEATURE_RTC = 27,
 };
 
 #define EC_FEATURE_MASK_0(event_code) (1UL << (event_code % 32))
@@ -1709,6 +1714,9 @@ struct ec_response_rtc {
 #define EC_CMD_RTC_SET_VALUE 0x46
 #define EC_CMD_RTC_SET_ALARM 0x47
 
+/* Pass as param to SET_ALARM to clear the current alarm */
+#define EC_RTC_ALARM_CLEAR 0
+
 /*****************************************************************************/
 /* Port80 log access */
 
-- 
2.9.3

-- 
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
--- 
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply related

* [rtc-linux] [PATCH v4 0/2] Add support for cros-ec-rtc driver.
From: Enric Balletbo i Serra @ 2017-11-10 21:55 UTC (permalink / raw)
  To: Lee Jones, bleung
  Cc: Guenter Roeck, Gwendal Grignou, linux-kernel, linux-iio,
	rtc-linux

Dear all,

This is an attempt to revive some patches from that [1] patchset, some
of them are still under discussion but I think there is no reason to not
have the other two in this fourth version to land upstream meanwhile we
discuss about the others.

[1] https://lkml.org/lkml/2017/7/12/182

Changes since v3:
* Rebased an retested with current mainline using a Samsung Chromebook Plus
* Removed from patchset
  * 1/4 mfd: cros_ec: Get rid of cros_ec_check_features from cros_ec_dev.
  * 4/4 mfd: cros_ec: add RTC as mfd subdevice.

Changes since v2:
- Rebase on top of mainline.
- Removed patch 'mfd: cros-ec: Fix host command buffer size' from series
as was already picked.

Changes since v1:
- Removed patch 'iio: cros_ec_sensors: Fix return value to get raw and
calibbias data' from series as was already picked.
- Removed patch 'iio: cros_ec_sensors: Fix return value to get raw and
calibbias data' from series as was already picked.
- Patch 2/5: Acked-by: Jonathan Cameron <***@kernel.org>

Best regards,

 Enric

Stephen Barber (2):
  mfd: cros_ec: Introduce RTC commands and events definitions.
  rtc: cros-ec: add cros-ec-rtc driver.

 drivers/rtc/Kconfig                  |  10 +
 drivers/rtc/Makefile                 |   1 +
 drivers/rtc/rtc-cros-ec.c            | 413 +++++++++++++++++++++++++++++++++++
 include/linux/mfd/cros_ec_commands.h |   8 +
 4 files changed, 432 insertions(+)
 create mode 100644 drivers/rtc/rtc-cros-ec.c

-- 
2.9.3

-- 
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
--- 
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply


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