Skip to content

Commit

Permalink
ARM: 5786/1: Introduce plat-nomadik, MTU code re-organization
Browse files Browse the repository at this point in the history
Introduce the plat-nomadik folder for ST-Ericsson
machines including the existing nomadik 8815 architecture.
This also moves the existing MTU (MultiTimerUnit)
of nomadik 8815 to the proposed plat-nomadik and adds
HAS_MTU. The patch has been re-based to 2.6.32-rc6

Signed-off-by: srinidhi kasagar <srinidhi.kasagar@stericsson.com>
Acked-by: Alessandro Rubini <rubini@unipv.it>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Srinidhi Kasagar authored and Russell King committed Nov 28, 2009
1 parent a8a8a66 commit 59b559d
Show file tree
Hide file tree
Showing 10 changed files with 74 additions and 32 deletions.
1 change: 1 addition & 0 deletions arch/arm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,7 @@ source "arch/arm/mach-at91/Kconfig"
source "arch/arm/plat-mxc/Kconfig"

source "arch/arm/mach-nomadik/Kconfig"
source "arch/arm/plat-nomadik/Kconfig"

source "arch/arm/mach-netx/Kconfig"

Expand Down
1 change: 1 addition & 0 deletions arch/arm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ machine-$(CONFIG_ARCH_MXC91231) := mxc91231
plat-$(CONFIG_ARCH_MXC) := mxc
plat-$(CONFIG_ARCH_OMAP) := omap
plat-$(CONFIG_PLAT_IOP) := iop
plat-$(CONFIG_PLAT_NOMADIK) := nomadik
plat-$(CONFIG_PLAT_ORION) := orion
plat-$(CONFIG_PLAT_PXA) := pxa
plat-$(CONFIG_PLAT_S3C24XX) := s3c24xx s3c
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-nomadik/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ menu "Nomadik boards"
config MACH_NOMADIK_8815NHK
bool "ST 8815 Nomadik Hardware Kit (evaluation board)"
select NOMADIK_8815
select HAS_MTU

endmenu

config NOMADIK_8815
bool


config I2C_BITBANG_8815NHK
tristate "Driver for bit-bang busses found on the 8815 NHK"
depends on I2C && MACH_NOMADIK_8815NHK
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-nomadik/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

# Object file lists.

obj-y += clock.o timer.o gpio.o
obj-y += clock.o gpio.o

# Cpu revision
obj-$(CONFIG_NOMADIK_8815) += cpu-8815.o
Expand Down
27 changes: 27 additions & 0 deletions arch/arm/mach-nomadik/board-nhk8815.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,18 @@
#include <asm/mach/arch.h>
#include <asm/mach/irq.h>
#include <asm/mach/flash.h>

#include <plat/mtu.h>

#include <mach/setup.h>
#include <mach/nand.h>
#include <mach/fsmc.h>
#include "clock.h"

/* Initial value for SRC control register: all timers use MXTAL/8 source */
#define SRC_CR_INIT_MASK 0x00007fff
#define SRC_CR_INIT_VAL 0x2aaa8000

/* These adresses span 16MB, so use three individual pages */
static struct resource nhk8815_nand_resources[] = {
{
Expand Down Expand Up @@ -239,6 +246,26 @@ static struct platform_device *nhk8815_platform_devices[] __initdata = {
/* will add more devices */
};

static void __init nomadik_timer_init(void)
{
u32 src_cr;

/* Configure timer sources in "system reset controller" ctrl reg */
src_cr = readl(io_p2v(NOMADIK_SRC_BASE));
src_cr &= SRC_CR_INIT_MASK;
src_cr |= SRC_CR_INIT_VAL;
writel(src_cr, io_p2v(NOMADIK_SRC_BASE));

/* Save global pointer to mtu, used by platform timer code */
mtu_base = io_p2v(NOMADIK_MTU0_BASE);

nmdk_timer_init();
}

static struct sys_timer nomadik_timer = {
.init = nomadik_timer_init,
};

static void __init nhk8815_platform_init(void)
{
int i;
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-nomadik/include/mach/setup.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
extern void cpu8815_map_io(void);
extern void cpu8815_platform_init(void);
extern void cpu8815_init_irq(void);
extern struct sys_timer nomadik_timer;
extern void nmdk_timer_init(void);

#endif /* NOMADIK_8815 */

Expand Down
22 changes: 22 additions & 0 deletions arch/arm/plat-nomadik/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# We keep common IP's here for Nomadik and other similar
# familiy of processors from ST-Ericsson. At the moment we have
# just MTU, others to follow soon.

config PLAT_NOMADIK
bool
depends on ARCH_NOMADIK
default y
help
Common platform code for Nomadik and other ST-Ericsson
platforms.

if PLAT_NOMADIK

config HAS_MTU
bool
help
Support for Multi Timer Unit. MTU provides access
to multiple interrupt generating programmable
32-bit free running decrementing counters.

endif
5 changes: 5 additions & 0 deletions arch/arm/plat-nomadik/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# arch/arm/plat-nomadik/Makefile
# Copyright 2009 ST-Ericsson
# Licensed under GPLv2

obj-$(CONFIG_HAS_MTU) += timer.o
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
#ifndef __ASM_ARCH_MTU_H
#define __ASM_ARCH_MTU_H
#ifndef __PLAT_MTU_H
#define __PLAT_MTU_H

/* should be set by the platform code */
extern void __iomem *mtu_base;

/*
* The MTU device hosts four different counters, with 4 set of
Expand Down Expand Up @@ -41,5 +44,5 @@
#define MTU_PCELL2 0xff8
#define MTU_PCELL3 0xffC

#endif /* __ASM_ARCH_MTU_H */
#endif /* __PLAT_MTU_H */

35 changes: 9 additions & 26 deletions arch/arm/mach-nomadik/timer.c → arch/arm/plat-nomadik/timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,14 @@
#include <linux/clockchips.h>
#include <linux/jiffies.h>
#include <asm/mach/time.h>
#include <mach/mtu.h>

#define TIMER_CTRL 0x80 /* No divisor */
#define TIMER_PERIODIC 0x40
#define TIMER_SZ32BIT 0x02

/* Initial value for SRC control register: all timers use MXTAL/8 source */
#define SRC_CR_INIT_MASK 0x00007fff
#define SRC_CR_INIT_VAL 0x2aaa8000
#include <plat/mtu.h>

static u32 nmdk_count; /* accumulated count */
static u32 nmdk_cycle; /* write-once */
static __iomem void *mtu_base;

/* setup by the platform code */
void __iomem *mtu_base;

/*
* clocksource: the MTU device is a decrementing counters, so we negate
Expand Down Expand Up @@ -93,7 +88,7 @@ static struct clock_event_device nmdk_clkevt = {
static irqreturn_t nmdk_timer_interrupt(int irq, void *dev_id)
{
/* ack: "interrupt clear register" */
writel( 1 << 0, mtu_base + MTU_ICR);
writel(1 << 0, mtu_base + MTU_ICR);

/* we can't count lost ticks, unfortunately */
nmdk_count += nmdk_cycle;
Expand Down Expand Up @@ -125,40 +120,28 @@ static void nmdk_timer_reset(void)
writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(0));
}

static void __init nmdk_timer_init(void)
void __init nmdk_timer_init(void)
{
u32 src_cr;
unsigned long rate;
int bits;

rate = CLOCK_TICK_RATE; /* 2.4MHz */
nmdk_cycle = (rate + HZ/2) / HZ;

/* Configure timer sources in "system reset controller" ctrl reg */
src_cr = readl(io_p2v(NOMADIK_SRC_BASE));
src_cr &= SRC_CR_INIT_MASK;
src_cr |= SRC_CR_INIT_VAL;
writel(src_cr, io_p2v(NOMADIK_SRC_BASE));

/* Save global pointer to mtu, used by functions above */
mtu_base = io_p2v(NOMADIK_MTU0_BASE);

/* Init the timer and register clocksource */
nmdk_timer_reset();

nmdk_clksrc.mult = clocksource_hz2mult(rate, nmdk_clksrc.shift);
bits = 8*sizeof(nmdk_count);
nmdk_clksrc.mask = CLOCKSOURCE_MASK(bits);

clocksource_register(&nmdk_clksrc);
if (clocksource_register(&nmdk_clksrc))
printk(KERN_ERR "timer: failed to initialize clock "
"source %s\n", nmdk_clksrc.name);

/* Register irq and clockevents */
setup_irq(IRQ_MTU0, &nmdk_timer_irq);
nmdk_clkevt.mult = div_sc(rate, NSEC_PER_SEC, nmdk_clkevt.shift);
nmdk_clkevt.cpumask = cpumask_of(0);
clockevents_register_device(&nmdk_clkevt);
}

struct sys_timer nomadik_timer = {
.init = nmdk_timer_init,
};

0 comments on commit 59b559d

Please sign in to comment.