X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Frtc%2Fmvrtc.c;h=94a065379c91d7d4ba9d9373d8c1185c0832e684;hb=0c4e81e0eb6bec3aab1f4500f8fb347202c5b601;hp=97dadd068b9d29c9b56071cca02a817d838ff973;hpb=5b9c79a81db80c3f9e50c77477957cd803429af8;p=oweals%2Fu-boot.git diff --git a/drivers/rtc/mvrtc.c b/drivers/rtc/mvrtc.c index 97dadd068b..94a065379c 100644 --- a/drivers/rtc/mvrtc.c +++ b/drivers/rtc/mvrtc.c @@ -1,8 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2011 * Jason Cooper - * - * SPDX-License-Identifier: GPL-2.0+ */ /* @@ -11,6 +10,7 @@ #include #include +#include #include #include #include "mvrtc.h" @@ -18,19 +18,16 @@ /* This RTC does not support century, so we assume 20 */ #define CENTURY 20 -int rtc_get(struct rtc_time *t) +static int __mv_rtc_get(struct mvrtc_registers *regs, struct rtc_time *t) { u32 time; u32 date; - struct mvrtc_registers *mvrtc_regs; - - mvrtc_regs = (struct mvrtc_registers *)KW_RTC_BASE; /* read the time register */ - time = readl(&mvrtc_regs->time); + time = readl(®s->time); /* read the date register */ - date = readl(&mvrtc_regs->date); + date = readl(®s->date); /* test for 12 hour clock (can't tell if it's am/pm) */ if (time & MVRTC_HRFMT_MSK) { @@ -58,13 +55,20 @@ int rtc_get(struct rtc_time *t) return 0; } -int rtc_set(struct rtc_time *t) +#ifndef CONFIG_DM_RTC +int rtc_get(struct rtc_time *t) +{ + struct mvrtc_registers *regs; + + regs = (struct mvrtc_registers *)KW_RTC_BASE; + return __mv_rtc_get(regs, t); +} +#endif /* !CONFIG_DM_RTC */ + +static int __mv_rtc_set(struct mvrtc_registers *regs, const struct rtc_time *t) { u32 time = 0; /* sets hour format bit to zero, 24hr format. */ u32 date = 0; - struct mvrtc_registers *mvrtc_regs; - - mvrtc_regs = (struct mvrtc_registers *)KW_RTC_BASE; /* check that this code isn't 80+ years old ;-) */ if ((t->tm_year / 100) != CENTURY) @@ -82,28 +86,100 @@ int rtc_set(struct rtc_time *t) date |= (bin2bcd(t->tm_year % 100) & MVRTC_YEAR_MSK) << MVRTC_YEAR_SFT; /* write the time register */ - writel(time, &mvrtc_regs->time); + writel(time, ®s->time); /* write the date register */ - writel(date, &mvrtc_regs->date); + writel(date, ®s->date); return 0; } -void rtc_reset(void) +#ifndef CONFIG_DM_RTC +int rtc_set(struct rtc_time *t) +{ + struct mvrtc_registers *regs; + + regs = (struct mvrtc_registers *)KW_RTC_BASE; + return __mv_rtc_set(regs, t); +} +#endif /* !CONFIG_DM_RTC */ + +static void __mv_rtc_reset(struct mvrtc_registers *regs) { u32 time; u32 sec; - struct mvrtc_registers *mvrtc_regs; - - mvrtc_regs = (struct mvrtc_registers *)KW_RTC_BASE; /* no init routine for this RTC needed, just check that it's working */ - time = readl(&mvrtc_regs->time); + time = readl(®s->time); sec = bcd2bin((time >> MVRTC_SEC_SFT) & MVRTC_SEC_MSK); udelay(1000000); - time = readl(&mvrtc_regs->time); + time = readl(®s->time); if (sec == bcd2bin((time >> MVRTC_SEC_SFT) & MVRTC_SEC_MSK)) printf("Error: RTC did not increment.\n"); } + +#ifndef CONFIG_DM_RTC +void rtc_reset(void) +{ + struct mvrtc_registers *regs; + + regs = (struct mvrtc_registers *)KW_RTC_BASE; + __mv_rtc_reset(regs); +} +#endif /* !CONFIG_DM_RTC */ + +#ifdef CONFIG_DM_RTC +static int mv_rtc_get(struct udevice *dev, struct rtc_time *tm) +{ + struct mvrtc_pdata *pdata = dev_get_platdata(dev); + struct mvrtc_registers *regs = (struct mvrtc_registers *)pdata->iobase; + + return __mv_rtc_get(regs, tm); +} + +static int mv_rtc_set(struct udevice *dev, const struct rtc_time *tm) +{ + struct mvrtc_pdata *pdata = dev_get_platdata(dev); + struct mvrtc_registers *regs = (struct mvrtc_registers *)pdata->iobase; + + return __mv_rtc_set(regs, tm); +} + +static int mv_rtc_reset(struct udevice *dev) +{ + struct mvrtc_pdata *pdata = dev_get_platdata(dev); + struct mvrtc_registers *regs = (struct mvrtc_registers *)pdata->iobase; + + __mv_rtc_reset(regs); + return 0; +} + +static const struct rtc_ops mv_rtc_ops = { + .get = mv_rtc_get, + .set = mv_rtc_set, + .reset = mv_rtc_reset, +}; + +static const struct udevice_id mv_rtc_ids[] = { + { .compatible = "marvell,kirkwood-rtc" }, + { .compatible = "marvell,orion-rtc" }, + { } +}; + +static int mv_rtc_ofdata_to_platdata(struct udevice *dev) +{ + struct mvrtc_pdata *pdata = dev_get_platdata(dev); + + pdata->iobase = devfdt_get_addr(dev); + return 0; +} + +U_BOOT_DRIVER(rtc_mv) = { + .name = "rtc-mv", + .id = UCLASS_RTC, + .ofdata_to_platdata = mv_rtc_ofdata_to_platdata, + .of_match = mv_rtc_ids, + .ops = &mv_rtc_ops, +}; +#endif /* CONFIG_DM_RTC */