diff mbox series

rtc: ds1307: Fix wday settings for rx8130

Message ID 20210420012439.1948867-1-nobuhiro1.iwamatsu@toshiba.co.jp
State Superseded
Headers show
Series rtc: ds1307: Fix wday settings for rx8130 | expand

Commit Message

Nobuhiro Iwamatsu April 20, 2021, 1:24 a.m. UTC
rx8130 wday specifies the bit position, not BCD.

Fixes: ee0981be7704 ("rtc: ds1307: Add support for Epson RX8130CE")
Signed-off-by: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
---
 drivers/rtc/rtc-ds1307.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

Comments

Nobuhiro Iwamatsu April 20, 2021, 2:37 a.m. UTC | #1
Sorry, I sent the wrong patch. Please ignore this version.
I will send the correct patch as v2.

Best regards,
  Nobuhiro

On Tue, Apr 20, 2021 at 10:24:39AM +0900, Nobuhiro Iwamatsu wrote:
> rx8130 wday specifies the bit position, not BCD.
> 
> Fixes: ee0981be7704 ("rtc: ds1307: Add support for Epson RX8130CE")
> Signed-off-by: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
> ---
>  drivers/rtc/rtc-ds1307.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c
> index cd8e438bc9c46b..aff3c41f7fa585 100644
> --- a/drivers/rtc/rtc-ds1307.c
> +++ b/drivers/rtc/rtc-ds1307.c
> @@ -296,7 +296,11 @@ static int ds1307_get_time(struct device *dev, struct rtc_time *t)
>  	t->tm_min = bcd2bin(regs[DS1307_REG_MIN] & 0x7f);
>  	tmp = regs[DS1307_REG_HOUR] & 0x3f;
>  	t->tm_hour = bcd2bin(tmp);
> -	t->tm_wday = bcd2bin(regs[DS1307_REG_WDAY] & 0x07) - 1;
> +	/* rx8130 is bit position, not BCD */
> +	if (ds1307->type == rx_8130) {
> +		t->tm_wday = fls(regs[DS1307_REG_WDAY] & 0x7f);
> +	else
> +		t->tm_wday = bcd2bin(regs[DS1307_REG_WDAY] & 0x07) - 1;
>  	t->tm_mday = bcd2bin(regs[DS1307_REG_MDAY] & 0x3f);
>  	tmp = regs[DS1307_REG_MONTH] & 0x1f;
>  	t->tm_mon = bcd2bin(tmp) - 1;
> @@ -343,7 +347,11 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)
>  	regs[DS1307_REG_SECS] = bin2bcd(t->tm_sec);
>  	regs[DS1307_REG_MIN] = bin2bcd(t->tm_min);
>  	regs[DS1307_REG_HOUR] = bin2bcd(t->tm_hour);
> -	regs[DS1307_REG_WDAY] = bin2bcd(t->tm_wday + 1);
> +	/* rx8130 is bit position, not BCD */
> +	if (ds1307->type == rx_8130)
> +		data[DS1307_REG_WDAY] = 1 << t->tm_wday;
> +	else
> +		regs[DS1307_REG_WDAY] = bin2bcd(t->tm_wday + 1);
>  	regs[DS1307_REG_MDAY] = bin2bcd(t->tm_mday);
>  	regs[DS1307_REG_MONTH] = bin2bcd(t->tm_mon + 1);
>  
> -- 
> 2.30.0
> 
>
diff mbox series

Patch

diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c
index cd8e438bc9c46b..aff3c41f7fa585 100644
--- a/drivers/rtc/rtc-ds1307.c
+++ b/drivers/rtc/rtc-ds1307.c
@@ -296,7 +296,11 @@  static int ds1307_get_time(struct device *dev, struct rtc_time *t)
 	t->tm_min = bcd2bin(regs[DS1307_REG_MIN] & 0x7f);
 	tmp = regs[DS1307_REG_HOUR] & 0x3f;
 	t->tm_hour = bcd2bin(tmp);
-	t->tm_wday = bcd2bin(regs[DS1307_REG_WDAY] & 0x07) - 1;
+	/* rx8130 is bit position, not BCD */
+	if (ds1307->type == rx_8130) {
+		t->tm_wday = fls(regs[DS1307_REG_WDAY] & 0x7f);
+	else
+		t->tm_wday = bcd2bin(regs[DS1307_REG_WDAY] & 0x07) - 1;
 	t->tm_mday = bcd2bin(regs[DS1307_REG_MDAY] & 0x3f);
 	tmp = regs[DS1307_REG_MONTH] & 0x1f;
 	t->tm_mon = bcd2bin(tmp) - 1;
@@ -343,7 +347,11 @@  static int ds1307_set_time(struct device *dev, struct rtc_time *t)
 	regs[DS1307_REG_SECS] = bin2bcd(t->tm_sec);
 	regs[DS1307_REG_MIN] = bin2bcd(t->tm_min);
 	regs[DS1307_REG_HOUR] = bin2bcd(t->tm_hour);
-	regs[DS1307_REG_WDAY] = bin2bcd(t->tm_wday + 1);
+	/* rx8130 is bit position, not BCD */
+	if (ds1307->type == rx_8130)
+		data[DS1307_REG_WDAY] = 1 << t->tm_wday;
+	else
+		regs[DS1307_REG_WDAY] = bin2bcd(t->tm_wday + 1);
 	regs[DS1307_REG_MDAY] = bin2bcd(t->tm_mday);
 	regs[DS1307_REG_MONTH] = bin2bcd(t->tm_mon + 1);