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

Commit 863753a8 authored by Lennert Buytenhek's avatar Lennert Buytenhek Committed by Russell King
Browse files

[ARM] 3823/1: iop3xx: switch iop32x/iop33x over to shared time code



Switch the iop32x and iop33x code over to the common time implementation,
and remove the (nearly identical) iop32x and iop33x time implementations.

Signed-off-by: default avatarLennert Buytenhek <buytenh@wantstofly.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 48388b2a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
# Makefile for the linux kernel.
#

obj-y			:= common.o setup.o irq.o time.o
obj-y			:= common.o setup.o irq.o
obj-m			:=
obj-n			:=
obj-			:=
+11 −4
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include <asm/hardware.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/time.h>
#include <asm/hardware/iop3xx.h>

#define IOP321_UART_XTAL 1843200
@@ -67,16 +68,22 @@ void __init iop32x_init(void)

#ifdef CONFIG_ARCH_IQ80321
extern void iq80321_map_io(void);
extern struct sys_timer iop321_timer;
extern void iop321_init_time(void);
#endif

#ifdef CONFIG_ARCH_IQ31244
extern void iq31244_map_io(void);
extern struct sys_timer iop321_timer;
extern void iop321_init_time(void);
#endif

static void __init iop3xx_timer_init(void)
{
	iop3xx_init_time(IOP321_TICK_RATE);
}

struct sys_timer iop321_timer = {
	.init		= iop3xx_timer_init,
	.offset		= iop3xx_gettimeoffset,
};

#if defined(CONFIG_ARCH_IQ80321)
MACHINE_START(IQ80321, "Intel IQ80321")
	/* Maintainer: Intel Corporation */

arch/arm/mach-iop32x/time.c

deleted100644 → 0
+0 −108
Original line number Diff line number Diff line
/*
 * arch/arm/mach-iop32x/time.c
 *
 * Timer code for IOP321 based systems
 *
 * Author: Deepak Saxena <dsaxena@mvista.com>
 *
 * Copyright 2002-2003 MontaVista Software Inc.
 *
 *  This program is free software; you can redistribute  it and/or modify it
 *  under  the terms of  the GNU General  Public License as published by the
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 *  option) any later version.
 */

#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/time.h>
#include <linux/init.h>
#include <linux/timex.h>

#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <asm/mach/irq.h>
#include <asm/mach/time.h>

#define IOP321_TIME_SYNC 0

static inline unsigned long get_elapsed(void)
{
	return LATCH - *IOP321_TU_TCR0;
}

static unsigned long iop321_gettimeoffset(void)
{
	unsigned long elapsed, usec;
	u32 tisr1, tisr2;

	/*
	 * If an interrupt was pending before we read the timer,
	 * we've already wrapped.  Factor this into the time.
	 * If an interrupt was pending after we read the timer,
	 * it may have wrapped between checking the interrupt
	 * status and reading the timer.  Re-read the timer to
	 * be sure its value is after the wrap.
	 */

	asm volatile("mrc p6, 0, %0, c6, c1, 0" : "=r" (tisr1));
	elapsed = get_elapsed();
	asm volatile("mrc p6, 0, %0, c6, c1, 0" : "=r" (tisr2));

	if(tisr1 & 1)
		elapsed += LATCH;
	else if (tisr2 & 1)
		elapsed = LATCH + get_elapsed();

	/*
	 * Now convert them to usec.
	 */
	usec = (unsigned long)(elapsed / (CLOCK_TICK_RATE/1000000));

	return usec;
}

static irqreturn_t
iop321_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
	u32 tisr;

	write_seqlock(&xtime_lock);

	asm volatile("mrc p6, 0, %0, c6, c1, 0" : "=r" (tisr));
	tisr |= 1;
	asm volatile("mcr p6, 0, %0, c6, c1, 0" : : "r" (tisr));

	timer_tick(regs);

	write_sequnlock(&xtime_lock);

	return IRQ_HANDLED;
}

static struct irqaction iop321_timer_irq = {
	.name		= "IOP321 Timer Tick",
	.handler	= iop321_timer_interrupt,
	.flags		= IRQF_DISABLED | IRQF_TIMER,
};

static void __init iop321_timer_init(void)
{
	u32 timer_ctl;

	setup_irq(IRQ_IOP321_TIMER0, &iop321_timer_irq);

	timer_ctl = IOP321_TMR_EN | IOP321_TMR_PRIVILEGED | IOP321_TMR_RELOAD |
			IOP321_TMR_RATIO_1_1;

	asm volatile("mcr p6, 0, %0, c4, c1, 0" : : "r" (LATCH));

	asm volatile("mcr p6, 0, %0, c0, c1, 0"	: : "r" (timer_ctl));
}

struct sys_timer iop321_timer = {
	.init		= &iop321_timer_init,
	.offset		= iop321_gettimeoffset,
};
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
# Makefile for the linux kernel.
#

obj-y			:= setup.o irq.o time.o
obj-y			:= setup.o irq.o
obj-m			:=
obj-n			:=
obj-			:=
+11 −1
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <asm/hardware.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/time.h>
#include <asm/hardware/iop3xx.h>

#define IOP331_UART_XTAL 33334000
@@ -118,9 +119,18 @@ void __init iop33x_init(void)

#ifdef CONFIG_ARCH_IOP33X
extern void iop331_init_irq(void);
extern struct sys_timer iop331_timer;
#endif

static void __init iop3xx_timer_init(void)
{
	iop3xx_init_time(IOP331_TICK_RATE);
}

struct sys_timer iop331_timer = {
	.init		= iop3xx_timer_init,
	.offset		= iop3xx_gettimeoffset,
};

#if defined(CONFIG_ARCH_IQ80331)
MACHINE_START(IQ80331, "Intel IQ80331")
	/* Maintainer: Intel Corp. */
Loading