On Mon, Jul 02, 2018 at 07:07:55PM +0300, Tuomas Tynkkynen wrote: > Hi Heinrich, > > On 06/29/2018 01:34 AM, Heinrich Schuchardt wrote: > >QEMU provides an emulated ARM AMBA PrimeCell PL031 RTC. > > > >The patch sets the base address in the board include file according to the > >definition in hw/arm/virt.c of the QEMU source. It defines the Kconfig > >option for the existing driver, and enables the RTC driver in > >qemu_arm64_defconfig and qemu_arm_defconfig as well as the date command. > > > >We need an RTC to provide the GetTime() runtime service in the UEFI > >subsystem. > > > >Signed-off-by: Heinrich Schuchardt <xypron.g...@gmx.de> > >--- > > configs/qemu_arm64_defconfig | 2 ++ > > configs/qemu_arm_defconfig | 2 ++ > > drivers/rtc/Kconfig | 7 +++++++ > > include/configs/qemu-arm.h | 3 +++ > > 4 files changed, 14 insertions(+) > > > > Reviewed-by: Tuomas Tynkkynen <tuomas.tynkky...@iki.fi> > Tested-by: Tuomas Tynkkynen <tuomas.tynkky...@iki.fi> > > - Tuomas
Well, it is a good time. Why not change the driver to driver model like below: * I intentionally leave CONFIG_DM_RTC not mandatory here * The patch may be split into two parts; one for rtc, the other for qemu-arm ---8<--- From c2e701dfb8ca48025e8266035cd455287178f85b Mon Sep 17 00:00:00 2001 From: AKASHI Takahiro <takahiro.aka...@linaro.org> Date: Tue, 3 Jul 2018 08:32:16 +0900 Subject: [PATCH] rtc: pl031: convert the driver to driver model Signed-off-by: AKASHI Takahiro <takahiro.aka...@linaro.org> --- board/emulation/qemu-arm/qemu-arm.c | 13 ++++ drivers/rtc/Kconfig | 7 +++ drivers/rtc/pl031.c | 91 +++++++++++++++++++++++++--- include/configs/qemu-arm.h | 4 ++ include/dm/platform_data/rtc_pl031.h | 10 +++ 5 files changed, 118 insertions(+), 7 deletions(-) create mode 100644 include/dm/platform_data/rtc_pl031.h diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c index 085cbbef99..3084f2aa71 100644 --- a/board/emulation/qemu-arm/qemu-arm.c +++ b/board/emulation/qemu-arm/qemu-arm.c @@ -3,8 +3,21 @@ * Copyright (c) 2017 Tuomas Tynkkynen */ #include <common.h> +#include <dm.h> +#include <dm/platform_data/rtc_pl031.h> #include <fdtdec.h> +#ifdef CONFIG_DM_RTC +static const struct pl031_rtc_platdata pl031_pdata = { + .base = SYS_RTC_BASE, +}; + +U_BOOT_DEVICE(qemu_arm_rtc) = { + .name = "rtc-pl031", + .platdata = &pl031_pdata, +}; +#endif + #ifdef CONFIG_ARM64 #include <asm/armv8/mmu.h> diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index a3f8c8aecc..50d9236601 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -55,6 +55,13 @@ config RTC_MV Enable Marvell RTC driver. This driver supports the rtc that is present on some Marvell SoCs. +config RTC_PL031 + bool "Enable ARM PL031 RTC driver" + imply DM_RTC + imply CMD_DATE + help + Enable ARM PL031 RTC driver. + config RTC_S35392A bool "Enable S35392A driver" select BITREVERSE diff --git a/drivers/rtc/pl031.c b/drivers/rtc/pl031.c index 8955805e3b..884e3a13fe 100644 --- a/drivers/rtc/pl031.c +++ b/drivers/rtc/pl031.c @@ -8,12 +8,25 @@ #include <common.h> #include <command.h> +#include <dm.h> +#include <dm/platform_data/rtc_pl031.h> #include <rtc.h> #if defined(CONFIG_CMD_DATE) -#ifndef CONFIG_SYS_RTC_PL031_BASE -#error CONFIG_SYS_RTC_PL031_BASE is not defined! +#define __RTC_WRITE_REG(base, addr, val) \ + (*(volatile unsigned int *)((base) + (addr)) = (val)) +#define __RTC_READ_REG(base, addr) \ + (*(volatile unsigned int *)((base) + (addr))) + +#ifdef CONFIG_DM_RTC +phys_addr_t pl031_base; +#else +# ifndef CONFIG_SYS_RTC_PL031_BASE +# error CONFIG_SYS_RTC_PL031_BASE is not defined! +# endif + +phys_addr_t pl031_base = CONFIG_SYS_RTC_PL031_BASE; #endif /* @@ -30,10 +43,8 @@ #define RTC_CR_START (1 << 0) -#define RTC_WRITE_REG(addr, val) \ - (*(volatile unsigned int *)(CONFIG_SYS_RTC_PL031_BASE + (addr)) = (val)) -#define RTC_READ_REG(addr) \ - (*(volatile unsigned int *)(CONFIG_SYS_RTC_PL031_BASE + (addr))) +#define RTC_WRITE_REG(addr, val) __RTC_WRITE_REG(pl031_base, addr, val) +#define RTC_READ_REG(addr) __RTC_READ_REG(pl031_base, addr) static int pl031_initted = 0; @@ -104,4 +115,70 @@ int rtc_get(struct rtc_time *tmp) return 0; } -#endif +#ifdef CONFIG_DM_RTC +void pl031_rtc_init(struct pl031_rtc_platdata *pdata) +{ + pl031_base = pdata->base; +} + +static int pl031_rtc_get(struct udevice *dev, struct rtc_time *tm) +{ + struct pl031_rtc_platdata *pdata = dev_get_platdata(dev); + + if (!pl031_initted) + pl031_rtc_init(pdata); + + return rtc_get(tm); +} + +static int pl031_rtc_set(struct udevice *dev, const struct rtc_time *tm) +{ + struct pl031_rtc_platdata *pdata = dev_get_platdata(dev); + + if (!pl031_initted) + pl031_rtc_init(pdata); + + return rtc_set(tm); +} + +static int pl031_rtc_reset(struct udevice *dev) +{ + struct pl031_rtc_platdata *pdata = dev_get_platdata(dev); + + if (!pl031_initted) + pl031_rtc_init(pdata); + + rtc_reset(); + + return 0; +} + +static const struct rtc_ops pl031_rtc_ops = { + .get = pl031_rtc_get, + .set = pl031_rtc_set, + .reset = pl031_rtc_reset, +}; + +static const struct udevice_id pl031_rtc_ids[] = { + { .compatible = "arm,pl031" }, + { } +}; + +static int pl031_rtc_ofdata_to_platdata(struct udevice *dev) +{ + struct pl031_rtc_platdata *pdata = dev_get_platdata(dev); + + pdata->base = devfdt_get_addr(dev); + return 0; +} + +U_BOOT_DRIVER(rtc_pl031) = { + .name = "rtc-pl031", + .id = UCLASS_RTC, + .ofdata_to_platdata = pl031_rtc_ofdata_to_platdata, + .of_match = pl031_rtc_ids, + .ops = &pl031_rtc_ops, +}; +#endif /* CONFIG_DM_RTC */ + +#endif /* CONFIG_CMD_DATE */ diff --git a/include/configs/qemu-arm.h b/include/configs/qemu-arm.h index b7debb9cc7..569fa729a9 100644 --- a/include/configs/qemu-arm.h +++ b/include/configs/qemu-arm.h @@ -36,6 +36,10 @@ #define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_FLASH_BASE0 #define CONFIG_SYS_FLASH_BASE CONFIG_SYS_FLASH_BASE0 +#define SYS_PERI_BASE 0x9000000 +#define SYS_UART_BASE SYS_PERI_BASE +#define SYS_RTC_BASE (SYS_PERI_BASE + 0x10000) + /* PCI */ /* * #define CONFIG_SYS_PCI_64BIT 1 diff --git a/include/dm/platform_data/rtc_pl031.h b/include/dm/platform_data/rtc_pl031.h new file mode 100644 index 0000000000..b35642b15d --- /dev/null +++ b/include/dm/platform_data/rtc_pl031.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +#ifndef __rtc_pl031_h +#define __rtc_pl031_h + +struct pl031_rtc_platdata { + phys_addr_t base; +}; + +#endif -- 2.17.0 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot