arch/m68k/hp300/time.c
Source file repositories/reference/linux-study-clean/arch/m68k/hp300/time.c
File Facts
- System
- Linux kernel
- Corpus path
arch/m68k/hp300/time.c- Extension
.c- Size
- 2733 bytes
- Lines
- 118
- Domain
- Architecture Layer
- Bucket
- arch/m68k
- Inferred role
- Architecture Layer: implementation source
- Status
- source implementation candidate
Why This File Exists
CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- 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
asm/ptrace.hlinux/clocksource.hlinux/types.hlinux/init.hlinux/sched.hlinux/kernel_stat.hlinux/interrupt.hasm/machdep.hasm/irq.hasm/io.hasm/traps.hasm/blinken.htime.h
Detected Declarations
function hp300_tickfunction hp300_read_clkfunction hp300_sched_init
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0
/*
* linux/arch/m68k/hp300/time.c
*
* Copyright (C) 1998 Philip Blundell <philb@gnu.org>
*
* This file contains the HP300-specific time handling code.
*/
#include <asm/ptrace.h>
#include <linux/clocksource.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel_stat.h>
#include <linux/interrupt.h>
#include <asm/machdep.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/traps.h>
#include <asm/blinken.h>
#include "time.h"
static u64 hp300_read_clk(struct clocksource *cs);
static struct clocksource hp300_clk = {
.name = "timer",
.rating = 250,
.read = hp300_read_clk,
.mask = CLOCKSOURCE_MASK(32),
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
};
static u32 clk_total, clk_offset;
/* Clock hardware definitions */
#define CLOCKBASE 0xf05f8000
#define CLKCR1 0x1
#define CLKCR2 0x3
#define CLKCR3 CLKCR1
#define CLKSR CLKCR2
#define CLKMSB1 0x5
#define CLKLSB1 0x7
#define CLKMSB2 0x9
#define CLKMSB3 0xD
#define CLKSR_INT1 BIT(0)
/* This is for machines which generate the exact clock. */
#define HP300_TIMER_CLOCK_FREQ 250000
#define HP300_TIMER_CYCLES (HP300_TIMER_CLOCK_FREQ / HZ)
#define INTVAL (HP300_TIMER_CYCLES - 1)
static irqreturn_t hp300_tick(int irq, void *dev_id)
{
unsigned long flags;
unsigned long tmp;
local_irq_save(flags);
in_8(CLOCKBASE + CLKSR);
asm volatile ("movpw %1@(5),%0" : "=d" (tmp) : "a" (CLOCKBASE));
clk_total += INTVAL;
clk_offset = 0;
legacy_timer_tick(1);
timer_heartbeat();
local_irq_restore(flags);
/* Turn off the network and SCSI leds */
blinken_leds(0, 0xe0);
return IRQ_HANDLED;
}
static u64 hp300_read_clk(struct clocksource *cs)
{
unsigned long flags;
unsigned char lsb, msb, msb_new;
u32 ticks;
local_irq_save(flags);
/* Read current timer 1 value */
msb = in_8(CLOCKBASE + CLKMSB1);
again:
if ((in_8(CLOCKBASE + CLKSR) & CLKSR_INT1) && msb > 0)
clk_offset = INTVAL;
lsb = in_8(CLOCKBASE + CLKLSB1);
msb_new = in_8(CLOCKBASE + CLKMSB1);
Annotation
- Immediate include surface: `asm/ptrace.h`, `linux/clocksource.h`, `linux/types.h`, `linux/init.h`, `linux/sched.h`, `linux/kernel_stat.h`, `linux/interrupt.h`, `asm/machdep.h`.
- Detected declarations: `function hp300_tick`, `function hp300_read_clk`, `function hp300_sched_init`.
- Atlas domain: Architecture Layer / arch/m68k.
- 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.