From 2f529f9b558ca1c1bd74be7437a84e4711743404 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 01 Nov 2024 02:11:33 +0000
Subject: [PATCH] add xenomai
---
kernel/drivers/clocksource/bcm2835_timer.c | 27 ++++++++++++++++++++-------
1 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/kernel/drivers/clocksource/bcm2835_timer.c b/kernel/drivers/clocksource/bcm2835_timer.c
index 1592650..687e9f2 100644
--- a/kernel/drivers/clocksource/bcm2835_timer.c
+++ b/kernel/drivers/clocksource/bcm2835_timer.c
@@ -53,18 +53,25 @@
static irqreturn_t bcm2835_time_interrupt(int irq, void *dev_id)
{
struct bcm2835_timer *timer = dev_id;
- void (*event_handler)(struct clock_event_device *);
+
if (readl_relaxed(timer->control) & timer->match_mask) {
writel_relaxed(timer->match_mask, timer->control);
- event_handler = READ_ONCE(timer->evt.event_handler);
- if (event_handler)
- event_handler(&timer->evt);
+ clockevents_handle_event(&timer->evt);
return IRQ_HANDLED;
} else {
return IRQ_NONE;
}
}
+
+static struct clocksource_user_mmio clocksource_bcm2835 = {
+ .mmio.clksrc = {
+ .rating = 300,
+ .read = clocksource_mmio_readl_up,
+ .mask = CLOCKSOURCE_MASK(32),
+ .flags = CLOCK_SOURCE_IS_CONTINUOUS,
+ },
+};
static int __init bcm2835_timer_init(struct device_node *node)
{
@@ -72,6 +79,7 @@
u32 freq;
int irq, ret;
struct bcm2835_timer *timer;
+ struct clocksource_mmio_regs mmr;
base = of_iomap(node, 0);
if (!base) {
@@ -88,8 +96,13 @@
system_clock = base + REG_COUNTER_LO;
sched_clock_register(bcm2835_sched_read, 32, freq);
- clocksource_mmio_init(base + REG_COUNTER_LO, node->name,
- freq, 300, 32, clocksource_mmio_readl_up);
+ mmr.reg_lower = base + REG_COUNTER_LO;
+ mmr.bits_lower = 32;
+ mmr.reg_upper = 0;
+ mmr.bits_upper = 0;
+ mmr.revmap = NULL;
+ clocksource_bcm2835.mmio.clksrc.name = node->name;
+ clocksource_user_mmio_init(&clocksource_bcm2835, &mmr, freq);
irq = irq_of_parse_and_map(node, DEFAULT_TIMER);
if (irq <= 0) {
@@ -109,7 +122,7 @@
timer->match_mask = BIT(DEFAULT_TIMER);
timer->evt.name = node->name;
timer->evt.rating = 300;
- timer->evt.features = CLOCK_EVT_FEAT_ONESHOT;
+ timer->evt.features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PIPELINE;
timer->evt.set_next_event = bcm2835_time_set_next_event;
timer->evt.cpumask = cpumask_of(0);
--
Gitblit v1.6.2