forked from u-boot/u-boot
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
riscv: Move timer portions of SiFive CLINT to drivers/timer
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
Showing
4 changed files
with
51 additions
and
39 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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). | ||
|
@@ -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,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, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, | ||
}; |