drivers/clocksource/timer-mp-csky.c
Source file repositories/reference/linux-study-clean/drivers/clocksource/timer-mp-csky.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/clocksource/timer-mp-csky.c- Extension
.c- Size
- 3765 bytes
- Lines
- 174
- Domain
- Driver Families
- Bucket
- drivers/clocksource
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/init.hlinux/interrupt.hlinux/sched_clock.hlinux/cpu.hlinux/of_irq.hasm/reg_ops.htimer-of.h
Detected Declarations
function csky_mptimer_set_next_eventfunction csky_mptimer_shutdownfunction csky_mptimer_oneshotfunction csky_mptimer_oneshot_stoppedfunction csky_timer_interruptfunction csky_mptimer_starting_cpufunction csky_mptimer_dying_cpufunction sched_clock_readfunction clksrc_readfunction csky_mptimer_initfunction for_each_possible_cpu
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0
// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/sched_clock.h>
#include <linux/cpu.h>
#include <linux/of_irq.h>
#include <asm/reg_ops.h>
#include "timer-of.h"
#define PTIM_CCVR "cr<3, 14>"
#define PTIM_CTLR "cr<0, 14>"
#define PTIM_LVR "cr<6, 14>"
#define PTIM_TSR "cr<1, 14>"
static int csky_mptimer_irq;
static int csky_mptimer_set_next_event(unsigned long delta,
struct clock_event_device *ce)
{
mtcr(PTIM_LVR, delta);
return 0;
}
static int csky_mptimer_shutdown(struct clock_event_device *ce)
{
mtcr(PTIM_CTLR, 0);
return 0;
}
static int csky_mptimer_oneshot(struct clock_event_device *ce)
{
mtcr(PTIM_CTLR, 1);
return 0;
}
static int csky_mptimer_oneshot_stopped(struct clock_event_device *ce)
{
mtcr(PTIM_CTLR, 0);
return 0;
}
static DEFINE_PER_CPU(struct timer_of, csky_to) = {
.flags = TIMER_OF_CLOCK,
.clkevt = {
.rating = 300,
.features = CLOCK_EVT_FEAT_PERCPU |
CLOCK_EVT_FEAT_ONESHOT,
.set_state_shutdown = csky_mptimer_shutdown,
.set_state_oneshot = csky_mptimer_oneshot,
.set_state_oneshot_stopped = csky_mptimer_oneshot_stopped,
.set_next_event = csky_mptimer_set_next_event,
},
};
static irqreturn_t csky_timer_interrupt(int irq, void *dev)
{
struct timer_of *to = this_cpu_ptr(&csky_to);
mtcr(PTIM_TSR, 0);
to->clkevt.event_handler(&to->clkevt);
return IRQ_HANDLED;
}
/*
* clock event for percpu
*/
static int csky_mptimer_starting_cpu(unsigned int cpu)
{
struct timer_of *to = per_cpu_ptr(&csky_to, cpu);
to->clkevt.cpumask = cpumask_of(cpu);
enable_percpu_irq(csky_mptimer_irq, 0);
clockevents_config_and_register(&to->clkevt, timer_of_rate(to),
2, ULONG_MAX);
return 0;
}
static int csky_mptimer_dying_cpu(unsigned int cpu)
Annotation
- Immediate include surface: `linux/init.h`, `linux/interrupt.h`, `linux/sched_clock.h`, `linux/cpu.h`, `linux/of_irq.h`, `asm/reg_ops.h`, `timer-of.h`.
- Detected declarations: `function csky_mptimer_set_next_event`, `function csky_mptimer_shutdown`, `function csky_mptimer_oneshot`, `function csky_mptimer_oneshot_stopped`, `function csky_timer_interrupt`, `function csky_mptimer_starting_cpu`, `function csky_mptimer_dying_cpu`, `function sched_clock_read`, `function clksrc_read`, `function csky_mptimer_init`.
- Atlas domain: Driver Families / drivers/clocksource.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.