linux-rtc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] rtc: armada38x: drop redundant initialization
@ 2018-06-21 17:40 Baruch Siach
  2018-06-21 17:40 ` [PATCH 2/2] rtc: armada38x: reset after rtc power loss Baruch Siach
  2018-06-21 17:59 ` [PATCH 1/2] rtc: armada38x: drop redundant initialization Alexandre Belloni
  0 siblings, 2 replies; 6+ messages in thread
From: Baruch Siach @ 2018-06-21 17:40 UTC (permalink / raw)
  To: Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth
  Cc: Russell King, Jon Nettleton, Alessandro Zummo, Alexandre Belloni,
	linux-rtc, linux-arm-kernel, Baruch Siach

The 'ret' variable in these functions is set unconditionally below.

Signed-off-by: Baruch Siach <baruch@tkos.co.il>
---
 drivers/rtc/rtc-armada38x.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/rtc/rtc-armada38x.c b/drivers/rtc/rtc-armada38x.c
index 1e4978c96ffd..4d62a54fd5d6 100644
--- a/drivers/rtc/rtc-armada38x.c
+++ b/drivers/rtc/rtc-armada38x.c
@@ -229,7 +229,7 @@ static int armada38x_rtc_read_time(struct device *dev, struct rtc_time *tm)
 static int armada38x_rtc_set_time(struct device *dev, struct rtc_time *tm)
 {
 	struct armada38x_rtc *rtc = dev_get_drvdata(dev);
-	int ret = 0;
+	int ret;
 	unsigned long time, flags;
 
 	ret = rtc_tm_to_time(tm, &time);
@@ -272,7 +272,7 @@ static int armada38x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 	u32 reg = ALARM_REG(RTC_ALARM1, rtc->data->alarm);
 	u32 reg_irq = ALARM_REG(RTC_IRQ1_CONF, rtc->data->alarm);
 	unsigned long time, flags;
-	int ret = 0;
+	int ret;
 
 	ret = rtc_tm_to_time(&alrm->time, &time);
 
-- 
2.17.1

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

* [PATCH 2/2] rtc: armada38x: reset after rtc power loss
  2018-06-21 17:40 [PATCH 1/2] rtc: armada38x: drop redundant initialization Baruch Siach
@ 2018-06-21 17:40 ` Baruch Siach
  2018-06-28 13:56   ` Gregory CLEMENT
  2018-07-12 18:36   ` Alexandre Belloni
  2018-06-21 17:59 ` [PATCH 1/2] rtc: armada38x: drop redundant initialization Alexandre Belloni
  1 sibling, 2 replies; 6+ messages in thread
From: Baruch Siach @ 2018-06-21 17:40 UTC (permalink / raw)
  To: Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth
  Cc: Russell King, Jon Nettleton, Alessandro Zummo, Alexandre Belloni,
	linux-rtc, linux-arm-kernel, Baruch Siach

When the RTC block looses power it needs a reset sequence to make it
usable again. Otherwise, writes to the time register have no effect.

This reset sequence combines information from the mvebu_rtc driver in
the Marvell provided U-Boot, and the SolidRun provided U-Boot repo.

Tested on the Armada 388 based SolidRun Clearfog Base.

Signed-off-by: Baruch Siach <baruch@tkos.co.il>
---
 drivers/rtc/rtc-armada38x.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/drivers/rtc/rtc-armada38x.c b/drivers/rtc/rtc-armada38x.c
index 4d62a54fd5d6..0b50276dce6d 100644
--- a/drivers/rtc/rtc-armada38x.c
+++ b/drivers/rtc/rtc-armada38x.c
@@ -30,6 +30,8 @@
 #define RTC_IRQ_FREQ_1HZ	    BIT(2)
 #define RTC_CCR		    0x18
 #define RTC_CCR_MODE		    BIT(15)
+#define RTC_CONF_TEST	    0x1C
+#define RTC_NOMINAL_TIMING	    BIT(13)
 
 #define RTC_TIME	    0xC
 #define RTC_ALARM1	    0x10
@@ -75,6 +77,7 @@ struct armada38x_rtc {
 	void __iomem	    *regs_soc;
 	spinlock_t	    lock;
 	int		    irq;
+	bool		    initialized;
 	struct value_to_freq *val_to_freq;
 	struct armada38x_rtc_data *data;
 };
@@ -226,6 +229,23 @@ static int armada38x_rtc_read_time(struct device *dev, struct rtc_time *tm)
 	return 0;
 }
 
+static void armada38x_rtc_reset(struct armada38x_rtc *rtc)
+{
+	u32 reg;
+
+	reg = rtc->data->read_rtc_reg(rtc, RTC_CONF_TEST);
+	/* If bits [7:0] are non-zero, assume RTC was uninitialized */
+	if (reg & 0xff) {
+		rtc_delayed_write(0, rtc, RTC_CONF_TEST);
+		msleep(500); /* Oscillator startup time */
+		rtc_delayed_write(0, rtc, RTC_TIME);
+		rtc_delayed_write(SOC_RTC_ALARM1 | SOC_RTC_ALARM2, rtc,
+				  RTC_STATUS);
+		rtc_delayed_write(RTC_NOMINAL_TIMING, rtc, RTC_CCR);
+	}
+	rtc->initialized = true;
+}
+
 static int armada38x_rtc_set_time(struct device *dev, struct rtc_time *tm)
 {
 	struct armada38x_rtc *rtc = dev_get_drvdata(dev);
@@ -237,6 +257,9 @@ static int armada38x_rtc_set_time(struct device *dev, struct rtc_time *tm)
 	if (ret)
 		goto out;
 
+	if (!rtc->initialized)
+		armada38x_rtc_reset(rtc);
+
 	spin_lock_irqsave(&rtc->lock, flags);
 	rtc_delayed_write(time, rtc, RTC_TIME);
 	spin_unlock_irqrestore(&rtc->lock, flags);
-- 
2.17.1

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

* Re: [PATCH 1/2] rtc: armada38x: drop redundant initialization
  2018-06-21 17:40 [PATCH 1/2] rtc: armada38x: drop redundant initialization Baruch Siach
  2018-06-21 17:40 ` [PATCH 2/2] rtc: armada38x: reset after rtc power loss Baruch Siach
@ 2018-06-21 17:59 ` Alexandre Belloni
  2018-06-21 18:11   ` Baruch Siach
  1 sibling, 1 reply; 6+ messages in thread
From: Alexandre Belloni @ 2018-06-21 17:59 UTC (permalink / raw)
  To: Baruch Siach
  Cc: Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth,
	Russell King, Jon Nettleton, Alessandro Zummo, linux-rtc,
	linux-arm-kernel

On 21/06/2018 20:40:22+0300, Baruch Siach wrote:
> The 'ret' variable in these functions is set unconditionally below.
> 

Hum, what is the actual benefit of this patch?

> Signed-off-by: Baruch Siach <baruch@tkos.co.il>
> ---
>  drivers/rtc/rtc-armada38x.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/rtc/rtc-armada38x.c b/drivers/rtc/rtc-armada38x.c
> index 1e4978c96ffd..4d62a54fd5d6 100644
> --- a/drivers/rtc/rtc-armada38x.c
> +++ b/drivers/rtc/rtc-armada38x.c
> @@ -229,7 +229,7 @@ static int armada38x_rtc_read_time(struct device *dev, struct rtc_time *tm)
>  static int armada38x_rtc_set_time(struct device *dev, struct rtc_time *tm)
>  {
>  	struct armada38x_rtc *rtc = dev_get_drvdata(dev);
> -	int ret = 0;
> +	int ret;
>  	unsigned long time, flags;
>  
>  	ret = rtc_tm_to_time(tm, &time);
> @@ -272,7 +272,7 @@ static int armada38x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
>  	u32 reg = ALARM_REG(RTC_ALARM1, rtc->data->alarm);
>  	u32 reg_irq = ALARM_REG(RTC_IRQ1_CONF, rtc->data->alarm);
>  	unsigned long time, flags;
> -	int ret = 0;
> +	int ret;
>  
>  	ret = rtc_tm_to_time(&alrm->time, &time);
>  
> -- 
> 2.17.1
> 

-- 
Alexandre Belloni, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com

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

* Re: [PATCH 1/2] rtc: armada38x: drop redundant initialization
  2018-06-21 17:59 ` [PATCH 1/2] rtc: armada38x: drop redundant initialization Alexandre Belloni
@ 2018-06-21 18:11   ` Baruch Siach
  0 siblings, 0 replies; 6+ messages in thread
From: Baruch Siach @ 2018-06-21 18:11 UTC (permalink / raw)
  To: Alexandre Belloni
  Cc: Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth,
	Russell King, Jon Nettleton, Alessandro Zummo, linux-rtc,
	linux-arm-kernel

Hi Alexandre,

On Thu, Jun 21, 2018 at 07:59:39PM +0200, Alexandre Belloni wrote:
> On 21/06/2018 20:40:22+0300, Baruch Siach wrote:
> > The 'ret' variable in these functions is set unconditionally below.
> 
> Hum, what is the actual benefit of this patch?

It is just a small cleanup to reduces somewhat the strain on the reader of the 
code. ret is not different from other variables in the same functions that are 
only initialized when needed.

baruch

> > Signed-off-by: Baruch Siach <baruch@tkos.co.il>
> > ---
> >  drivers/rtc/rtc-armada38x.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/rtc/rtc-armada38x.c b/drivers/rtc/rtc-armada38x.c
> > index 1e4978c96ffd..4d62a54fd5d6 100644
> > --- a/drivers/rtc/rtc-armada38x.c
> > +++ b/drivers/rtc/rtc-armada38x.c
> > @@ -229,7 +229,7 @@ static int armada38x_rtc_read_time(struct device *dev, struct rtc_time *tm)
> >  static int armada38x_rtc_set_time(struct device *dev, struct rtc_time *tm)
> >  {
> >  	struct armada38x_rtc *rtc = dev_get_drvdata(dev);
> > -	int ret = 0;
> > +	int ret;
> >  	unsigned long time, flags;
> >  
> >  	ret = rtc_tm_to_time(tm, &time);
> > @@ -272,7 +272,7 @@ static int armada38x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
> >  	u32 reg = ALARM_REG(RTC_ALARM1, rtc->data->alarm);
> >  	u32 reg_irq = ALARM_REG(RTC_IRQ1_CONF, rtc->data->alarm);
> >  	unsigned long time, flags;
> > -	int ret = 0;
> > +	int ret;
> >  
> >  	ret = rtc_tm_to_time(&alrm->time, &time);
> >  
> > -- 
> > 2.17.1

-- 
     http://baruch.siach.name/blog/                  ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch@tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -

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

* Re: [PATCH 2/2] rtc: armada38x: reset after rtc power loss
  2018-06-21 17:40 ` [PATCH 2/2] rtc: armada38x: reset after rtc power loss Baruch Siach
@ 2018-06-28 13:56   ` Gregory CLEMENT
  2018-07-12 18:36   ` Alexandre Belloni
  1 sibling, 0 replies; 6+ messages in thread
From: Gregory CLEMENT @ 2018-06-28 13:56 UTC (permalink / raw)
  To: Baruch Siach
  Cc: Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth,
	Russell King, Jon Nettleton, Alessandro Zummo, Alexandre Belloni,
	linux-rtc, linux-arm-kernel

Hi Baruch,
 
 On jeu., juin 21 2018, Baruch Siach <baruch@tkos.co.il> wrote:

> When the RTC block looses power it needs a reset sequence to make it
> usable again. Otherwise, writes to the time register have no effect.
>
> This reset sequence combines information from the mvebu_rtc driver in
> the Marvell provided U-Boot, and the SolidRun provided U-Boot repo.
>
> Tested on the Armada 388 based SolidRun Clearfog Base.

It also matches my notes to reset the RTC on Armada 8K:
devmem2 0xf428401c w 0
devmem2 0xf4284018 w 0x2000

Acked-by: Gregory CLEMENT <gregory.clement@bootlin.com>

Thanks,

Gregory


>
> Signed-off-by: Baruch Siach <baruch@tkos.co.il>
> ---
>  drivers/rtc/rtc-armada38x.c | 23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
>
> diff --git a/drivers/rtc/rtc-armada38x.c b/drivers/rtc/rtc-armada38x.c
> index 4d62a54fd5d6..0b50276dce6d 100644
> --- a/drivers/rtc/rtc-armada38x.c
> +++ b/drivers/rtc/rtc-armada38x.c
> @@ -30,6 +30,8 @@
>  #define RTC_IRQ_FREQ_1HZ	    BIT(2)
>  #define RTC_CCR		    0x18
>  #define RTC_CCR_MODE		    BIT(15)
> +#define RTC_CONF_TEST	    0x1C
> +#define RTC_NOMINAL_TIMING	    BIT(13)
>  
>  #define RTC_TIME	    0xC
>  #define RTC_ALARM1	    0x10
> @@ -75,6 +77,7 @@ struct armada38x_rtc {
>  	void __iomem	    *regs_soc;
>  	spinlock_t	    lock;
>  	int		    irq;
> +	bool		    initialized;
>  	struct value_to_freq *val_to_freq;
>  	struct armada38x_rtc_data *data;
>  };
> @@ -226,6 +229,23 @@ static int armada38x_rtc_read_time(struct device *dev, struct rtc_time *tm)
>  	return 0;
>  }
>  
> +static void armada38x_rtc_reset(struct armada38x_rtc *rtc)
> +{
> +	u32 reg;
> +
> +	reg = rtc->data->read_rtc_reg(rtc, RTC_CONF_TEST);
> +	/* If bits [7:0] are non-zero, assume RTC was uninitialized */
> +	if (reg & 0xff) {
> +		rtc_delayed_write(0, rtc, RTC_CONF_TEST);
> +		msleep(500); /* Oscillator startup time */
> +		rtc_delayed_write(0, rtc, RTC_TIME);
> +		rtc_delayed_write(SOC_RTC_ALARM1 | SOC_RTC_ALARM2, rtc,
> +				  RTC_STATUS);
> +		rtc_delayed_write(RTC_NOMINAL_TIMING, rtc, RTC_CCR);
> +	}
> +	rtc->initialized = true;
> +}
> +
>  static int armada38x_rtc_set_time(struct device *dev, struct rtc_time *tm)
>  {
>  	struct armada38x_rtc *rtc = dev_get_drvdata(dev);
> @@ -237,6 +257,9 @@ static int armada38x_rtc_set_time(struct device *dev, struct rtc_time *tm)
>  	if (ret)
>  		goto out;
>  
> +	if (!rtc->initialized)
> +		armada38x_rtc_reset(rtc);
> +
>  	spin_lock_irqsave(&rtc->lock, flags);
>  	rtc_delayed_write(time, rtc, RTC_TIME);
>  	spin_unlock_irqrestore(&rtc->lock, flags);
> -- 
> 2.17.1
>

-- 
Gregory Clement, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
http://bootlin.com

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

* Re: [PATCH 2/2] rtc: armada38x: reset after rtc power loss
  2018-06-21 17:40 ` [PATCH 2/2] rtc: armada38x: reset after rtc power loss Baruch Siach
  2018-06-28 13:56   ` Gregory CLEMENT
@ 2018-07-12 18:36   ` Alexandre Belloni
  1 sibling, 0 replies; 6+ messages in thread
From: Alexandre Belloni @ 2018-07-12 18:36 UTC (permalink / raw)
  To: Baruch Siach
  Cc: Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth,
	Russell King, Jon Nettleton, Alessandro Zummo, linux-rtc,
	linux-arm-kernel

On 21/06/2018 20:40:23+0300, Baruch Siach wrote:
> When the RTC block looses power it needs a reset sequence to make it
> usable again. Otherwise, writes to the time register have no effect.
> 
> This reset sequence combines information from the mvebu_rtc driver in
> the Marvell provided U-Boot, and the SolidRun provided U-Boot repo.
> 
> Tested on the Armada 388 based SolidRun Clearfog Base.
> 
> Signed-off-by: Baruch Siach <baruch@tkos.co.il>
> ---
>  drivers/rtc/rtc-armada38x.c | 23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
> 
Applied, thanks.

-- 
Alexandre Belloni, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com

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

end of thread, other threads:[~2018-07-12 18:47 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-06-21 17:40 [PATCH 1/2] rtc: armada38x: drop redundant initialization Baruch Siach
2018-06-21 17:40 ` [PATCH 2/2] rtc: armada38x: reset after rtc power loss Baruch Siach
2018-06-28 13:56   ` Gregory CLEMENT
2018-07-12 18:36   ` Alexandre Belloni
2018-06-21 17:59 ` [PATCH 1/2] rtc: armada38x: drop redundant initialization Alexandre Belloni
2018-06-21 18:11   ` Baruch Siach

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).