Skip to content

Commit

Permalink
riscv: Move timer portions of SiFive CLINT to drivers/timer
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Simon Glass <[email protected]>
Reviewed-by: Rick Chen <[email protected]>
  • Loading branch information
Forty-Bot authored and Andes committed Oct 26, 2020
1 parent 7dbebeb commit 47d7e3b
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 39 deletions.
1 change: 1 addition & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -939,6 +939,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
Expand Down
41 changes: 2 additions & 39 deletions arch/riscv/lib/sifive_clint.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2020, Sean Anderson <[email protected]>
* Copyright (C) 2018, Bin Meng <[email protected]>
*
* U-Boot syscon driver for SiFive's Core Local Interruptor (CLINT).
Expand All @@ -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;

Expand Down Expand Up @@ -61,35 +56,3 @@ int riscv_get_ipi(int hart, int *pending)

return 0;
}

static u64 sifive_clint_get_count(struct udevice *dev)
{
return readq((void __iomem *)MTIME_REG(dev->priv));
}

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,
};
1 change: 1 addition & 0 deletions drivers/timer/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
obj-$(CONFIG_STI_TIMER) += sti-timer.o
obj-$(CONFIG_STM32_TIMER) += stm32_timer.o
obj-$(CONFIG_X86_TSC_TIMER) += tsc_timer.o
Expand Down
47 changes: 47 additions & 0 deletions drivers/timer/sifive_clint_timer.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2020, Sean Anderson <[email protected]>
* Copyright (C) 2018, Bin Meng <[email protected]>
*/

#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 u64 sifive_clint_get_count(struct udevice *dev)
{
return readq((void __iomem *)MTIME_REG(dev->priv));
}

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,
};

0 comments on commit 47d7e3b

Please sign in to comment.