| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Gary Bisson <gary.bisson@boundarydevices.com> |
| Date: Tue, 25 Apr 2017 16:45:15 +0200 |
| Subject: rtc: m41t80: fix SQW dividers override when setting a date |
| |
| From: Gary Bisson <gary.bisson@boundarydevices.com> |
| |
| |
| [ Upstream commit 0f546b058b86ea2f661cc7a6e931cee5a29959ef ] |
| |
| This patch is only relevant for RTC with the SQ_ALT feature which |
| means the clock output frequency divider is stored in the weekday |
| register. |
| |
| Current implementation discards the previous dividers value and clear |
| them as soon as the time is set. |
| |
| Signed-off-by: Gary Bisson <gary.bisson@boundarydevices.com> |
| Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/rtc/rtc-m41t80.c | 12 ++++++++++++ |
| 1 file changed, 12 insertions(+) |
| |
| --- a/drivers/rtc/rtc-m41t80.c |
| +++ b/drivers/rtc/rtc-m41t80.c |
| @@ -168,6 +168,7 @@ static int m41t80_get_datetime(struct i2 |
| /* Sets the given date and time to the real time clock. */ |
| static int m41t80_set_datetime(struct i2c_client *client, struct rtc_time *tm) |
| { |
| + struct m41t80_data *clientdata = i2c_get_clientdata(client); |
| unsigned char buf[8]; |
| int err, flags; |
| |
| @@ -183,6 +184,17 @@ static int m41t80_set_datetime(struct i2 |
| buf[M41T80_REG_YEAR] = bin2bcd(tm->tm_year - 100); |
| buf[M41T80_REG_WDAY] = tm->tm_wday; |
| |
| + /* If the square wave output is controlled in the weekday register */ |
| + if (clientdata->features & M41T80_FEATURE_SQ_ALT) { |
| + int val; |
| + |
| + val = i2c_smbus_read_byte_data(client, M41T80_REG_WDAY); |
| + if (val < 0) |
| + return val; |
| + |
| + buf[M41T80_REG_WDAY] |= (val & 0xf0); |
| + } |
| + |
| err = i2c_smbus_write_i2c_block_data(client, M41T80_REG_SSEC, |
| sizeof(buf), buf); |
| if (err < 0) { |