Commit ccbc2e5e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull m68k updates from Geert Uytterhoeven:

 - drop arch_gettimeoffset and adopt clocksource API

 - defconfig updates

* tag 'm68k-for-v5.2-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k:
  Documentation/features/time: Mark m68k having modern-timekeeping
  m68k: defconfig: Update defconfigs for v5.1-rc1
  m68k: mvme16x: Handle timer counter overflow
  m68k: mvme16x: Convert to clocksource API
  m68k: mvme147: Handle timer counter overflow
  m68k: mvme147: Convert to clocksource API
  m68k: mac: Convert to clocksource API
  m68k: hp300: Handle timer counter overflow
  m68k: hp300: Convert to clocksource API
  m68k: bvme6000: Convert to clocksource API
  m68k: atari: Convert to clocksource API
  m68k: amiga: Convert to clocksource API
  m68k: Drop ARCH_USES_GETTIMEOFFSET
  m68k: apollo, q40, sun3, sun3x: Remove arch_gettimeoffset implementations
  m68k: mac: Fix VIA timer counter accesses
  m68k: Call timer_interrupt() with interrupts disabled
parents fdafe5d1 fdd20ec8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@
    |       h8300: |  ok  |
    |     hexagon: |  ok  |
    |        ia64: |  ok  |
    |        m68k: | TODO |
    |        m68k: |  ok  |
    |  microblaze: |  ok  |
    |        mips: |  ok  |
    |       nds32: |  ok  |
+0 −1
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ config M68K
	select GENERIC_STRNCPY_FROM_USER if MMU
	select GENERIC_STRNLEN_USER if MMU
	select ARCH_WANT_IPC_PARSE_VERSION
	select ARCH_USES_GETTIMEOFFSET if MMU && !COLDFIRE
	select HAVE_FUTEX_CMPXCHG if MMU && FUTEX
	select HAVE_MOD_ARCH_SPECIFIC
	select MODULES_USE_ELF_REL
+9 −0
Original line number Diff line number Diff line
@@ -88,10 +88,19 @@ static irqreturn_t cia_handler(int irq, void *dev_id)
	struct ciabase *base = dev_id;
	int mach_irq;
	unsigned char ints;
	unsigned long flags;

	/* Interrupts get disabled while the timer irq flag is cleared and
	 * the timer interrupt serviced.
	 */
	mach_irq = base->cia_irq;
	local_irq_save(flags);
	ints = cia_set_irq(base, CIA_ICR_ALL);
	amiga_custom.intreq = base->int_mask;
	if (ints & 1)
		generic_handle_irq(mach_irq);
	local_irq_restore(flags);
	mach_irq++, ints >>= 1;
	for (; ints; mach_irq++, ints >>= 1) {
		if (ints & 1)
			generic_handle_irq(mach_irq);
+37 −12
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include <linux/mm.h>
#include <linux/seq_file.h>
#include <linux/tty.h>
#include <linux/clocksource.h>
#include <linux/console.h>
#include <linux/rtc.h>
#include <linux/init.h>
@@ -95,8 +96,6 @@ static char amiga_model_name[13] = "Amiga ";
static void amiga_sched_init(irq_handler_t handler);
static void amiga_get_model(char *model);
static void amiga_get_hardware_list(struct seq_file *m);
/* amiga specific timer functions */
static u32 amiga_gettimeoffset(void);
extern void amiga_mksound(unsigned int count, unsigned int ticks);
static void amiga_reset(void);
extern void amiga_init_sound(void);
@@ -386,7 +385,6 @@ void __init config_amiga(void)
	mach_init_IRQ        = amiga_init_IRQ;
	mach_get_model       = amiga_get_model;
	mach_get_hardware_list = amiga_get_hardware_list;
	arch_gettimeoffset   = amiga_gettimeoffset;

	/*
	 * default MAX_DMA=0xffffffff on all machines. If we don't do so, the SCSI
@@ -464,7 +462,29 @@ void __init config_amiga(void)
		*(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 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)
{
@@ -484,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
	 * 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");
	/* start timer */
	ciab.cra |= 0x11;
}

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

/* This is always executed with interrupts disabled.  */
static u32 amiga_gettimeoffset(void)
static u64 amiga_read_clk(struct clocksource *cs)
{
	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 */
	hi  = ciab.tahi;
@@ -513,12 +536,14 @@ static u32 amiga_gettimeoffset(void)
	if (ticks > jiffy_ticks / 2)
		/* check for pending interrupt */
		if (cia_set_irq(&ciab_base, 0) & CIA_ICR_TA)
			offset = 10000;
			clk_offset = jiffy_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;
+0 −7
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ u_long apollo_model;

extern void dn_sched_init(irq_handler_t handler);
extern void dn_init_IRQ(void);
extern u32 dn_gettimeoffset(void);
extern int dn_dummy_hwclk(int, struct rtc_time *);
extern void dn_dummy_reset(void);
#ifdef CONFIG_HEARTBEAT
@@ -152,7 +151,6 @@ void __init config_apollo(void)

	mach_sched_init=dn_sched_init; /* */
	mach_init_IRQ=dn_init_IRQ;
	arch_gettimeoffset   = dn_gettimeoffset;
	mach_max_dma_address = 0xffffffff;
	mach_hwclk           = dn_dummy_hwclk; /* */
	mach_reset	     = dn_dummy_reset;  /* */
@@ -205,11 +203,6 @@ void dn_sched_init(irq_handler_t timer_routine)
		pr_err("Couldn't register timer interrupt\n");
}

u32 dn_gettimeoffset(void)
{
	return 0xdeadbeef;
}

int dn_dummy_hwclk(int op, struct rtc_time *t) {


Loading