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

Commit 3d744eee authored by Finn Thain's avatar Finn Thain Committed by Geert Uytterhoeven
Browse files

m68k: mvme16x: 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>
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
parent 7529b90d
Loading
Loading
Loading
Loading
+31 −6
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/mm.h>
#include <linux/seq_file.h>
#include <linux/tty.h>
#include <linux/clocksource.h>
#include <linux/console.h>
#include <linux/linkage.h>
#include <linux/init.h>
@@ -343,6 +344,21 @@ static irqreturn_t mvme16x_abort_int (int irq, void *dev_id)
	return IRQ_HANDLED;
}

static u64 mvme16x_read_clk(struct clocksource *cs);

static struct clocksource mvme16x_clk = {
	.name   = "pcc",
	.rating = 250,
	.read   = mvme16x_read_clk,
	.mask   = CLOCKSOURCE_MASK(32),
	.flags  = CLOCK_SOURCE_IS_CONTINUOUS,
};

static u32 clk_total;

#define PCC_TIMER_CLOCK_FREQ 1000000
#define PCC_TIMER_CYCLES     (PCC_TIMER_CLOCK_FREQ / HZ)

static irqreturn_t mvme16x_timer_int (int irq, void *dev_id)
{
	irq_handler_t timer_routine = dev_id;
@@ -350,6 +366,7 @@ static irqreturn_t mvme16x_timer_int (int irq, void *dev_id)

	local_irq_save(flags);
	*(volatile unsigned char *)0xfff4201b |= 8;
	clk_total += PCC_TIMER_CYCLES;
	timer_routine(0, NULL);
	local_irq_restore(flags);

@@ -363,13 +380,15 @@ void mvme16x_sched_init (irq_handler_t timer_routine)

    /* Using PCCchip2 or MC2 chip tick timer 1 */
    *(volatile unsigned long *)0xfff42008 = 0;
    *(volatile unsigned long *)0xfff42004 = 10000;	/* 10ms */
    *(volatile unsigned long *)0xfff42004 = PCC_TIMER_CYCLES;
    *(volatile unsigned char *)0xfff42017 |= 3;
    *(volatile unsigned char *)0xfff4201b = 0x16;
    if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, "timer",
    if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, IRQF_TIMER, "timer",
                    timer_routine))
	panic ("Couldn't register timer int");

    clocksource_register_hz(&mvme16x_clk, PCC_TIMER_CLOCK_FREQ);

    if (brdno == 0x0162 || brdno == 0x172)
	irq = MVME162_IRQ_ABORT;
    else
@@ -379,11 +398,17 @@ void mvme16x_sched_init (irq_handler_t timer_routine)
	panic ("Couldn't register abort int");
}


/* This is always executed with interrupts disabled.  */
u32 mvme16x_gettimeoffset(void)
static u64 mvme16x_read_clk(struct clocksource *cs)
{
    return (*(volatile u32 *)0xfff42008) * 1000;
	unsigned long flags;
	u32 ticks;

	local_irq_save(flags);
	ticks = *(volatile u32 *)0xfff42008;
	ticks += clk_total;
	local_irq_restore(flags);

	return ticks;
}

int bcd2int (unsigned char b)