[PATCH 3/3] riscv: Move timer portions of SiFive CLINT to drivers/timer

Sean Anderson seanga2 at gmail.com
Wed Oct 14 02:47:10 CEST 2020


On 10/13/20 8:43 PM, Rick Chen wrote:
>> Half of this driver is a DM-based timer driver, and half is RISC-V-specific
>> IPI code. Move the timer portions in with the other timer drivers. The
>> KConfig is not moved, since it also enables IPIs. It could also be split
>> into two configs, but no boards use the timer but not the IPI atm, so I
>> haven't split it.
>>
>> Signed-off-by: Sean Anderson <seanga2 at gmail.com>
>> ---
>>
>>  MAINTAINERS                        |  1 +
>>  arch/riscv/lib/sifive_clint.c      | 43 ++------------------------
>>  drivers/timer/Makefile             |  1 +
>>  drivers/timer/sifive_clint_timer.c | 49 ++++++++++++++++++++++++++++++
>>  4 files changed, 53 insertions(+), 41 deletions(-)
>>  create mode 100644 drivers/timer/sifive_clint_timer.c
>>
>> diff --git a/MAINTAINERS b/MAINTAINERS
>> index 32a2cdb52b..73d1c20a26 100644
>> --- a/MAINTAINERS
>> +++ b/MAINTAINERS
>> @@ -928,6 +928,7 @@ T:  git https://gitlab.denx.de/u-boot/custodians/u-boot-riscv.git
>>  F:     arch/riscv/
>>  F:     cmd/riscv/
>>  F:     drivers/timer/andes_plmt_timer.c
>> +F:     drivers/timer/sifive_clint_timer.c
>>  F:     tools/prelink-riscv.c
>>
>>  RISC-V KENDRYTE
>> diff --git a/arch/riscv/lib/sifive_clint.c b/arch/riscv/lib/sifive_clint.c
>> index c9704c596f..c8079dc510 100644
>> --- a/arch/riscv/lib/sifive_clint.c
>> +++ b/arch/riscv/lib/sifive_clint.c
>> @@ -1,5 +1,6 @@
>>  // SPDX-License-Identifier: GPL-2.0+
>>  /*
>> + * Copyright (C) 2020, Sean Anderson <seanga2 at gmail.com>
>>   * Copyright (C) 2018, Bin Meng <bmeng.cn at gmail.com>
>>   *
>>   * U-Boot syscon driver for SiFive's Core Local Interruptor (CLINT).
>> @@ -8,19 +9,13 @@
>>   */
>>
>>  #include <common.h>
>> -#include <clk.h>
>>  #include <dm.h>
>> -#include <timer.h>
>>  #include <asm/io.h>
>> -#include <asm/syscon.h>
>> +#include <asm/smp.h>
>>  #include <linux/err.h>
>>
>>  /* MSIP registers */
>>  #define MSIP_REG(base, hart)           ((ulong)(base) + (hart) * 4)
>> -/* mtime compare register */
>> -#define MTIMECMP_REG(base, hart)       ((ulong)(base) + 0x4000 + (hart) * 8)
>> -/* mtime register */
>> -#define MTIME_REG(base)                        ((ulong)(base) + 0xbff8)
>>
>>  DECLARE_GLOBAL_DATA_PTR;
>>
>> @@ -61,37 +56,3 @@ int riscv_get_ipi(int hart, int *pending)
>>
>>         return 0;
>>  }
>> -
>> -static int sifive_clint_get_count(struct udevice *dev, u64 *count)
>> -{
>> -       *count = readq((void __iomem *)MTIME_REG(dev->priv));
>> -
>> -       return 0;
>> -}
>> -
>> -static const struct timer_ops sifive_clint_ops = {
>> -       .get_count = sifive_clint_get_count,
>> -};
>> -
>> -static int sifive_clint_probe(struct udevice *dev)
>> -{
>> -       dev->priv = dev_read_addr_ptr(dev);
>> -       if (!dev->priv)
>> -               return -EINVAL;
>> -
>> -       return timer_timebase_fallback(dev);
>> -}
>> -
>> -static const struct udevice_id sifive_clint_ids[] = {
>> -       { .compatible = "riscv,clint0" },
>> -       { }
>> -};
>> -
>> -U_BOOT_DRIVER(sifive_clint) = {
>> -       .name           = "sifive_clint",
>> -       .id             = UCLASS_TIMER,
>> -       .of_match       = sifive_clint_ids,
>> -       .probe          = sifive_clint_probe,
>> -       .ops            = &sifive_clint_ops,
>> -       .flags          = DM_FLAG_PRE_RELOC,
>> -};
>> diff --git a/drivers/timer/Makefile b/drivers/timer/Makefile
>> index eda311f0f5..410ada87b7 100644
>> --- a/drivers/timer/Makefile
>> +++ b/drivers/timer/Makefile
>> @@ -19,6 +19,7 @@ obj-$(CONFIG_RENESAS_OSTM_TIMER) += ostm_timer.o
>>  obj-$(CONFIG_RISCV_TIMER) += riscv_timer.o
>>  obj-$(CONFIG_ROCKCHIP_TIMER) += rockchip_timer.o
>>  obj-$(CONFIG_SANDBOX_TIMER)    += sandbox_timer.o
>> +obj-$(CONFIG_SIFIVE_CLINT) += sifive_clint_timer.o
> 
> no _TIMER suffix ?

I chose to keep the current Kconfig option semantics and naming. This
reflects that it enables both an IPI driver and a timer driver.

--Sean

> 
>>  obj-$(CONFIG_STI_TIMER)                += sti-timer.o
>>  obj-$(CONFIG_STM32_TIMER)      += stm32_timer.o
>>  obj-$(CONFIG_X86_TSC_TIMER)    += tsc_timer.o
>> diff --git a/drivers/timer/sifive_clint_timer.c b/drivers/timer/sifive_clint_timer.c
>> new file mode 100644
>> index 0000000000..04e85c2564
>> --- /dev/null
>> +++ b/drivers/timer/sifive_clint_timer.c
>> @@ -0,0 +1,49 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * Copyright (C) 2020, Sean Anderson <seanga2 at gmail.com>
>> + * Copyright (C) 2018, Bin Meng <bmeng.cn at gmail.com>
>> + */
>> +
>> +#include <common.h>
>> +#include <clk.h>
>> +#include <dm.h>
>> +#include <timer.h>
>> +#include <asm/io.h>
>> +#include <linux/err.h>
>> +
>> +/* mtime register */
>> +#define MTIME_REG(base)                        ((ulong)(base) + 0xbff8)
>> +
>> +static int sifive_clint_get_count(struct udevice *dev, u64 *count)
>> +{
>> +       *count = readq((void __iomem *)MTIME_REG(dev->priv));
>> +
>> +       return 0;
>> +}
>> +
>> +static const struct timer_ops sifive_clint_ops = {
>> +       .get_count = sifive_clint_get_count,
>> +};
>> +
>> +static int sifive_clint_probe(struct udevice *dev)
>> +{
>> +       dev->priv = dev_read_addr_ptr(dev);
>> +       if (!dev->priv)
>> +               return -EINVAL;
>> +
>> +       return timer_timebase_fallback(dev);
>> +}
>> +
>> +static const struct udevice_id sifive_clint_ids[] = {
>> +       { .compatible = "riscv,clint0" },
>> +       { }
>> +};
>> +
>> +U_BOOT_DRIVER(sifive_clint) = {
>> +       .name           = "sifive_clint",
>> +       .id             = UCLASS_TIMER,
>> +       .of_match       = sifive_clint_ids,
>> +       .probe          = sifive_clint_probe,
>> +       .ops            = &sifive_clint_ops,
>> +       .flags          = DM_FLAG_PRE_RELOC,
>> +};
>> --
>> 2.28.0
> 
> LGTM.
> Other than that,
> Reviewed-by: Rick Chen <rick at andestech.com>
> 



More information about the U-Boot mailing list