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.

Dependency Surface

Detected Declarations

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

Implementation Notes