[v2,08/22] rtc: ds1305: stop using rtc deprecated functions

Message ID 1499846682-14093-9-git-send-email-benjamin.gaignard@linaro.org
State New
Headers show
Series
  • [v2,01/22] x86: rtc: stop using rtc deprecated functions
Related show

Commit Message

Benjamin Gaignard July 12, 2017, 8:04 a.m.
rtc_time_to_tm() and rtc_tm_to_time() are deprecated because they
rely on 32bits variables and that will make rtc break in y2038/2016.
Stop using those two functions to safer 64bits ones.

Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>

CC: Alessandro Zummo <a.zummo@towertech.it>
CC: Alexandre Belloni <alexandre.belloni@free-electrons.com>
CC: rtc-linux@googlegroups.com
CC: linux-kernel@vger.kernel.org
---
 drivers/rtc/rtc-ds1305.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

-- 
1.9.1

Comments

Alexandre Belloni July 12, 2017, 8:30 a.m. | #1
Well, again, please don't.

I'll be randomly taking this one as an example.

That RTC will fail in 2100, 6 years before rtc_tm_to_time begins to be
an issue.

Once again, your patch hides the fact that there is an issue. There is
no other way than reading the datasheet and actually think about what
your are doing instead of using sed/coccinelle/whatever.

On 12/07/2017 at 10:04:28 +0200, Benjamin Gaignard wrote:
> rtc_time_to_tm() and rtc_tm_to_time() are deprecated because they

> rely on 32bits variables and that will make rtc break in y2038/2016.

> Stop using those two functions to safer 64bits ones.

> 

> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>

> CC: Alessandro Zummo <a.zummo@towertech.it>

> CC: Alexandre Belloni <alexandre.belloni@free-electrons.com>

> CC: rtc-linux@googlegroups.com

> CC: linux-kernel@vger.kernel.org

> ---

>  drivers/rtc/rtc-ds1305.c | 11 ++++-------

>  1 file changed, 4 insertions(+), 7 deletions(-)

> 

> diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c

> index 72b2293..b41168b 100644

> --- a/drivers/rtc/rtc-ds1305.c

> +++ b/drivers/rtc/rtc-ds1305.c

> @@ -324,23 +324,20 @@ static int ds1305_set_alarm(struct device *dev, struct rtc_wkalrm *alm)

>  {

>  	struct ds1305	*ds1305 = dev_get_drvdata(dev);

>  	struct spi_device *spi = ds1305->spi;

> -	unsigned long	now, later;

> +	unsigned long long now, later;

>  	struct rtc_time	tm;

>  	int		status;

>  	u8		buf[1 + DS1305_ALM_LEN];

>  

>  	/* convert desired alarm to time_t */

> -	status = rtc_tm_to_time(&alm->time, &later);

> -	if (status < 0)

> -		return status;

> +	later = rtc_tm_to_time64(&alm->time);

>  

>  	/* Read current time as time_t */

>  	status = ds1305_get_time(dev, &tm);

>  	if (status < 0)

>  		return status;

> -	status = rtc_tm_to_time(&tm, &now);

> -	if (status < 0)

> -		return status;

> +

> +	now = rtc_tm_to_time64(&tm);

>  

>  	/* make sure alarm fires within the next 24 hours */

>  	if (later <= now)

> -- 

> 1.9.1

> 


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

Patch

diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c
index 72b2293..b41168b 100644
--- a/drivers/rtc/rtc-ds1305.c
+++ b/drivers/rtc/rtc-ds1305.c
@@ -324,23 +324,20 @@  static int ds1305_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
 {
 	struct ds1305	*ds1305 = dev_get_drvdata(dev);
 	struct spi_device *spi = ds1305->spi;
-	unsigned long	now, later;
+	unsigned long long now, later;
 	struct rtc_time	tm;
 	int		status;
 	u8		buf[1 + DS1305_ALM_LEN];
 
 	/* convert desired alarm to time_t */
-	status = rtc_tm_to_time(&alm->time, &later);
-	if (status < 0)
-		return status;
+	later = rtc_tm_to_time64(&alm->time);
 
 	/* Read current time as time_t */
 	status = ds1305_get_time(dev, &tm);
 	if (status < 0)
 		return status;
-	status = rtc_tm_to_time(&tm, &now);
-	if (status < 0)
-		return status;
+
+	now = rtc_tm_to_time64(&tm);
 
 	/* make sure alarm fires within the next 24 hours */
 	if (later <= now)