Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5afd3d06 authored by Finn Thain's avatar Finn Thain Committed by Geert Uytterhoeven
Browse files

m68k: amiga: Convert to clocksource API



Add a platform clocksource by adapting the existing arch_gettimeoffset
implementation.

Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Tested-by: default avatarMichael Schmitz <schmitzmic@gmail.com>
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
parent 7d6ca235
Loading
Loading
Loading
Loading
+37 −9
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
#include <linux/mm.h>
#include <linux/mm.h>
#include <linux/seq_file.h>
#include <linux/seq_file.h>
#include <linux/tty.h>
#include <linux/tty.h>
#include <linux/clocksource.h>
#include <linux/console.h>
#include <linux/console.h>
#include <linux/rtc.h>
#include <linux/rtc.h>
#include <linux/init.h>
#include <linux/init.h>
@@ -461,7 +462,29 @@ void __init config_amiga(void)
		*(unsigned char *)ZTWO_VADDR(0xde0002) |= 0x80;
		*(unsigned char *)ZTWO_VADDR(0xde0002) |= 0x80;
}
}


static u64 amiga_read_clk(struct clocksource *cs);

static struct clocksource amiga_clk = {
	.name   = "ciab",
	.rating = 250,
	.read   = amiga_read_clk,
	.mask   = CLOCKSOURCE_MASK(32),
	.flags  = CLOCK_SOURCE_IS_CONTINUOUS,
};

static unsigned short jiffy_ticks;
static unsigned short jiffy_ticks;
static u32 clk_total, clk_offset;

static irqreturn_t ciab_timer_handler(int irq, void *dev_id)
{
	irq_handler_t timer_routine = dev_id;

	clk_total += jiffy_ticks;
	clk_offset = 0;
	timer_routine(0, NULL);

	return IRQ_HANDLED;
}


static void __init amiga_sched_init(irq_handler_t timer_routine)
static void __init amiga_sched_init(irq_handler_t timer_routine)
{
{
@@ -481,19 +504,22 @@ static void __init amiga_sched_init(irq_handler_t timer_routine)
	 * Please don't change this to use ciaa, as it interferes with the
	 * Please don't change this to use ciaa, as it interferes with the
	 * SCSI code. We'll have to take a look at this later
	 * SCSI code. We'll have to take a look at this later
	 */
	 */
	if (request_irq(IRQ_AMIGA_CIAB_TA, timer_routine, 0, "timer", NULL))
	if (request_irq(IRQ_AMIGA_CIAB_TA, ciab_timer_handler, IRQF_TIMER,
			"timer", timer_routine))
		pr_err("Couldn't register timer interrupt\n");
		pr_err("Couldn't register timer interrupt\n");
	/* start timer */
	/* start timer */
	ciab.cra |= 0x11;
	ciab.cra |= 0x11;
}


#define TICK_SIZE 10000
	clocksource_register_hz(&amiga_clk, amiga_eclock);
}


/* This is always executed with interrupts disabled.  */
static u64 amiga_read_clk(struct clocksource *cs)
static u32 amiga_gettimeoffset(void)
{
{
	unsigned short hi, lo, hi2;
	unsigned short hi, lo, hi2;
	u32 ticks, offset = 0;
	unsigned long flags;
	u32 ticks;

	local_irq_save(flags);


	/* read CIA B timer A current value */
	/* read CIA B timer A current value */
	hi  = ciab.tahi;
	hi  = ciab.tahi;
@@ -510,12 +536,14 @@ static u32 amiga_gettimeoffset(void)
	if (ticks > jiffy_ticks / 2)
	if (ticks > jiffy_ticks / 2)
		/* check for pending interrupt */
		/* check for pending interrupt */
		if (cia_set_irq(&ciab_base, 0) & CIA_ICR_TA)
		if (cia_set_irq(&ciab_base, 0) & CIA_ICR_TA)
			offset = 10000;
			clk_offset = jiffy_ticks;


	ticks = jiffy_ticks - ticks;
	ticks = jiffy_ticks - ticks;
	ticks = (10000 * ticks) / jiffy_ticks;
	ticks += clk_offset + clk_total;

	local_irq_restore(flags);


	return (ticks + offset) * 1000;
	return ticks;
}
}


static void amiga_reset(void)  __noreturn;
static void amiga_reset(void)  __noreturn;