mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 14:04:27 -04:00
rtc: rzn1: use FIELD_PREP/FIELD_GET and GENMASK for register access
Replace open-coded shift and mask operations with the bitfield API. Note that the weekday field is changed from an explicit 0x0f mask to an 8-bit field definition, matching the hardware manual. This does not change behaviour, as valid weekday values cannot exceed 7. Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Link: https://patch.msgid.link/20260821211032.13554-15-prabhakar.mahadev-lad.rj@bp.renesas.com Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
This commit is contained in:
committed by
Alexandre Belloni
parent
0e1ae8c654
commit
5ae93269d3
@@ -12,6 +12,8 @@
|
||||
*/
|
||||
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/bits.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/iopoll.h>
|
||||
@@ -39,14 +41,18 @@
|
||||
#define RZN1_RTC_CTL2_STOPPED (RZN1_RTC_CTL2_WAIT | RZN1_RTC_CTL2_WST)
|
||||
|
||||
#define RZN1_RTC_TIME 0x30
|
||||
#define RZN1_RTC_TIME_MIN_SHIFT 8
|
||||
#define RZN1_RTC_TIME_HOUR_SHIFT 16
|
||||
#define RZN1_RTC_TIME_SEC GENMASK(7, 0)
|
||||
#define RZN1_RTC_TIME_MIN GENMASK(15, 8)
|
||||
#define RZN1_RTC_TIME_HOUR GENMASK(23, 16)
|
||||
|
||||
#define RZN1_RTC_CAL 0x34
|
||||
#define RZN1_RTC_CAL_DAY_SHIFT 8
|
||||
#define RZN1_RTC_CAL_MON_SHIFT 16
|
||||
#define RZN1_RTC_CAL_YEAR_SHIFT 24
|
||||
#define RZN1_RTC_CAL_WDAY GENMASK(7, 0)
|
||||
#define RZN1_RTC_CAL_DAY GENMASK(15, 8)
|
||||
#define RZN1_RTC_CAL_MON GENMASK(23, 16)
|
||||
#define RZN1_RTC_CAL_YEAR GENMASK(31, 24)
|
||||
|
||||
#define RZN1_RTC_SUBU 0x38
|
||||
#define RZN1_RTC_SUBU_RTCA0FX GENMASK(5, 0)
|
||||
#define RZN1_RTC_SUBU_DEV BIT(7)
|
||||
#define RZN1_RTC_SUBU_DECR BIT(6)
|
||||
|
||||
@@ -78,15 +84,15 @@ static void rzn1_rtc_get_time_snapshot(struct rzn1_rtc *rtc, struct rtc_time *tm
|
||||
u32 val;
|
||||
|
||||
val = readl(rtc->base + RZN1_RTC_TIMEC);
|
||||
tm->tm_sec = bcd2bin(val);
|
||||
tm->tm_min = bcd2bin(val >> RZN1_RTC_TIME_MIN_SHIFT);
|
||||
tm->tm_hour = bcd2bin(val >> RZN1_RTC_TIME_HOUR_SHIFT);
|
||||
tm->tm_sec = bcd2bin(FIELD_GET(RZN1_RTC_TIME_SEC, val));
|
||||
tm->tm_min = bcd2bin(FIELD_GET(RZN1_RTC_TIME_MIN, val));
|
||||
tm->tm_hour = bcd2bin(FIELD_GET(RZN1_RTC_TIME_HOUR, val));
|
||||
|
||||
val = readl(rtc->base + RZN1_RTC_CALC);
|
||||
tm->tm_wday = val & 0x0f;
|
||||
tm->tm_mday = bcd2bin(val >> RZN1_RTC_CAL_DAY_SHIFT);
|
||||
tm->tm_mon = bcd2bin(val >> RZN1_RTC_CAL_MON_SHIFT) - 1;
|
||||
tm->tm_year = bcd2bin(val >> RZN1_RTC_CAL_YEAR_SHIFT) + 100;
|
||||
tm->tm_wday = FIELD_GET(RZN1_RTC_CAL_WDAY, val);
|
||||
tm->tm_mday = bcd2bin(FIELD_GET(RZN1_RTC_CAL_DAY, val));
|
||||
tm->tm_mon = bcd2bin(FIELD_GET(RZN1_RTC_CAL_MON, val)) - 1;
|
||||
tm->tm_year = bcd2bin(FIELD_GET(RZN1_RTC_CAL_YEAR, val)) + 100;
|
||||
}
|
||||
|
||||
static int rzn1_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
@@ -129,15 +135,15 @@ static int rzn1_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
return ret;
|
||||
}
|
||||
|
||||
val = bin2bcd(tm->tm_sec);
|
||||
val |= bin2bcd(tm->tm_min) << RZN1_RTC_TIME_MIN_SHIFT;
|
||||
val |= bin2bcd(tm->tm_hour) << RZN1_RTC_TIME_HOUR_SHIFT;
|
||||
val = FIELD_PREP(RZN1_RTC_TIME_SEC, bin2bcd(tm->tm_sec)) |
|
||||
FIELD_PREP(RZN1_RTC_TIME_MIN, bin2bcd(tm->tm_min)) |
|
||||
FIELD_PREP(RZN1_RTC_TIME_HOUR, bin2bcd(tm->tm_hour));
|
||||
writel(val, rtc->base + RZN1_RTC_TIME);
|
||||
|
||||
val = tm->tm_wday;
|
||||
val |= bin2bcd(tm->tm_mday) << RZN1_RTC_CAL_DAY_SHIFT;
|
||||
val |= bin2bcd(tm->tm_mon + 1) << RZN1_RTC_CAL_MON_SHIFT;
|
||||
val |= bin2bcd(tm->tm_year - 100) << RZN1_RTC_CAL_YEAR_SHIFT;
|
||||
val = FIELD_PREP(RZN1_RTC_CAL_WDAY, tm->tm_wday) |
|
||||
FIELD_PREP(RZN1_RTC_CAL_DAY, bin2bcd(tm->tm_mday)) |
|
||||
FIELD_PREP(RZN1_RTC_CAL_MON, bin2bcd(tm->tm_mon + 1)) |
|
||||
FIELD_PREP(RZN1_RTC_CAL_YEAR, bin2bcd(tm->tm_year - 100));
|
||||
writel(val, rtc->base + RZN1_RTC_CAL);
|
||||
|
||||
writel(0, rtc->base + RZN1_RTC_CTL2);
|
||||
@@ -308,12 +314,12 @@ static int rzn1_rtc_read_offset(struct device *dev, long *offset)
|
||||
val = readl(rtc->base + RZN1_RTC_SUBU);
|
||||
ppb_per_step = val & RZN1_RTC_SUBU_DEV ? 1017 : 3051;
|
||||
subtract = val & RZN1_RTC_SUBU_DECR;
|
||||
val &= 0x3F;
|
||||
val = FIELD_GET(RZN1_RTC_SUBU_RTCA0FX, val);
|
||||
|
||||
if (!val)
|
||||
*offset = 0;
|
||||
else if (subtract)
|
||||
*offset = -(((~val) & 0x3F) + 1) * ppb_per_step;
|
||||
*offset = -(((~val) & RZN1_RTC_SUBU_RTCA0FX) + 1) * ppb_per_step;
|
||||
else
|
||||
*offset = (val - 1) * ppb_per_step;
|
||||
|
||||
@@ -355,7 +361,7 @@ static int rzn1_rtc_set_offset(struct device *dev, long offset)
|
||||
subu |= steps + 1;
|
||||
} else {
|
||||
subu |= RZN1_RTC_SUBU_DECR;
|
||||
subu |= (~(-steps - 1)) & 0x3F;
|
||||
subu |= (~(-steps - 1)) & RZN1_RTC_SUBU_RTCA0FX;
|
||||
}
|
||||
|
||||
ret = readl_poll_timeout(rtc->base + RZN1_RTC_CTL2, ctl2,
|
||||
|
||||
Reference in New Issue
Block a user