ARM: plat-nomadik: move MTU, kill plat-nomadik
authorLinus Walleij <linus.walleij@linaro.org>
Thu, 18 Oct 2012 12:01:25 +0000 (14:01 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 5 Nov 2012 08:55:33 +0000 (09:55 +0100)
This moves the MTU timer driver from arch/arm/plat-nomadik
to drivers/clocksource and moves the header file to the
platform_data directory.

As this moves the last file being compiled to an object out
of arch/arm/plat-nomadik, we have to "turn off the light"
and delete the plat-nomadik directory, because it is not
allowed to have an empty Makefile in a plat-* directory.
This is probably also a desired side effect of depopulating
the arch/arm directory of drivers. Luckily we have just
deleted all the <plat/*> include files prior to this so
by moving the last one we may delete the directory.

After this all the Ux500 and Nomadik device drivers live
outside of the arch/arm hierarchy.

Cc: Alessandro Rubini <rubini@unipv.it>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
17 files changed:
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/mach-nomadik/Kconfig
arch/arm/mach-nomadik/board-nhk8815.c
arch/arm/mach-ux500/Kconfig
arch/arm/mach-ux500/timer.c
arch/arm/plat-nomadik/Kconfig [deleted file]
arch/arm/plat-nomadik/Makefile [deleted file]
arch/arm/plat-nomadik/include/plat/mtu.h [deleted file]
arch/arm/plat-nomadik/timer.c [deleted file]
drivers/char/hw_random/Kconfig
drivers/clocksource/Kconfig
drivers/clocksource/Makefile
drivers/clocksource/nomadik-mtu.c [new file with mode: 0644]
drivers/input/keyboard/Kconfig
drivers/mtd/nand/Kconfig
include/linux/platform_data/clocksource-nomadik-mtu.h [new file with mode: 0644]

index ade7e924bef5faaf00de76c0354e025ed4371b35..8dae1e016ac8792a9ee5ff6233b1e1f3e658449a 100644 (file)
@@ -1065,7 +1065,6 @@ source "arch/arm/mach-mxs/Kconfig"
 source "arch/arm/mach-netx/Kconfig"
 
 source "arch/arm/mach-nomadik/Kconfig"
-source "arch/arm/plat-nomadik/Kconfig"
 
 source "arch/arm/plat-omap/Kconfig"
 
index 5f914fca911b77b747dd43569b84a76883abcef7..89087d599ad28c6acf02cb8f1ee5f844424afb99 100644 (file)
@@ -201,7 +201,6 @@ plat-$(CONFIG_ARCH_OMAP)    += omap
 plat-$(CONFIG_ARCH_S3C64XX)    += samsung
 plat-$(CONFIG_ARCH_ZYNQ)       += versatile
 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 samsung
index c744946ef0222e89623a038473497ad007f7b5ef..706dc5727bbe86ea110517cb0f3fb8e470ab6d3c 100644 (file)
@@ -4,7 +4,7 @@ menu "Nomadik boards"
 
 config MACH_NOMADIK_8815NHK
        bool "ST 8815 Nomadik Hardware Kit (evaluation board)"
-       select HAS_MTU
+       select CLKSRC_NOMADIK_MTU
        select NOMADIK_8815
 
 endmenu
index 16f10e04a8051eaad2ee42fa3942abff91f5404c..5ccdf53c5a9dcd0c3a6814d61b49d083e34a89eb 100644 (file)
 #include <linux/io.h>
 #include <linux/pinctrl/machine.h>
 #include <linux/platform_data/pinctrl-nomadik.h>
+#include <linux/platform_data/clocksource-nomadik-mtu.h>
+#include <linux/platform_data/mtd-nomadik-nand.h>
 #include <asm/hardware/vic.h>
 #include <asm/sizes.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/flash.h>
 #include <asm/mach/time.h>
-
-#include <plat/mtu.h>
-
-#include <linux/platform_data/mtd-nomadik-nand.h>
 #include <mach/fsmc.h>
 #include <mach/irqs.h>
 
index e8c3f0d70ca66efa50d71bba32c462829148df4d..5dea90636d94f91e10820a41a502f23b796fc522 100644 (file)
@@ -7,8 +7,8 @@ config UX500_SOC_COMMON
        select ARM_ERRATA_764369 if SMP
        select ARM_GIC
        select CACHE_L2X0
+       select CLKSRC_NOMADIK_MTU
        select COMMON_CLK
-       select HAS_MTU
        select PINCTRL
        select PINCTRL_NOMADIK
        select PL310_ERRATA_753970 if CACHE_PL310
index 20d02fa01ec32f5f175b73339376375662d0bb11..875309acb02272cf76c405a72a319cf29dc16b6f 100644 (file)
@@ -9,11 +9,10 @@
 #include <linux/clksrc-dbx500-prcmu.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
+#include <linux/platform_data/clocksource-nomadik-mtu.h>
 
 #include <asm/smp_twd.h>
 
-#include <plat/mtu.h>
-
 #include <mach/setup.h>
 #include <mach/hardware.h>
 #include <mach/irqs.h>
diff --git a/arch/arm/plat-nomadik/Kconfig b/arch/arm/plat-nomadik/Kconfig
deleted file mode 100644 (file)
index 19f55ca..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-# 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 || ARCH_U8500
-       default y
-       select CLKSRC_MMIO
-       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.
-
-config NOMADIK_MTU_SCHED_CLOCK
-       bool
-       depends on HAS_MTU
-       help
-         Use the Multi Timer Unit as the sched_clock.
-
-endif
diff --git a/arch/arm/plat-nomadik/Makefile b/arch/arm/plat-nomadik/Makefile
deleted file mode 100644 (file)
index 37c7cdd..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-# arch/arm/plat-nomadik/Makefile
-# Copyright 2009 ST-Ericsson
-# Licensed under GPLv2
-
-obj-$(CONFIG_HAS_MTU)  += timer.o
diff --git a/arch/arm/plat-nomadik/include/plat/mtu.h b/arch/arm/plat-nomadik/include/plat/mtu.h
deleted file mode 100644 (file)
index 8008897..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef __PLAT_MTU_H
-#define __PLAT_MTU_H
-
-void nmdk_timer_init(void __iomem *base, int irq);
-void nmdk_clkevt_reset(void);
-void nmdk_clksrc_reset(void);
-
-#endif /* __PLAT_MTU_H */
-
diff --git a/arch/arm/plat-nomadik/timer.c b/arch/arm/plat-nomadik/timer.c
deleted file mode 100644 (file)
index f911430..0000000
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- *  linux/arch/arm/plat-nomadik/timer.c
- *
- * Copyright (C) 2008 STMicroelectronics
- * Copyright (C) 2010 Alessandro Rubini
- * Copyright (C) 2010 Linus Walleij for ST-Ericsson
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2, as
- * published by the Free Software Foundation.
- */
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/io.h>
-#include <linux/clockchips.h>
-#include <linux/clk.h>
-#include <linux/jiffies.h>
-#include <linux/err.h>
-#include <asm/mach/time.h>
-#include <asm/sched_clock.h>
-
-/*
- * The MTU device hosts four different counters, with 4 set of
- * registers. These are register names.
- */
-
-#define MTU_IMSC       0x00    /* Interrupt mask set/clear */
-#define MTU_RIS                0x04    /* Raw interrupt status */
-#define MTU_MIS                0x08    /* Masked interrupt status */
-#define MTU_ICR                0x0C    /* Interrupt clear register */
-
-/* per-timer registers take 0..3 as argument */
-#define MTU_LR(x)      (0x10 + 0x10 * (x) + 0x00)      /* Load value */
-#define MTU_VAL(x)     (0x10 + 0x10 * (x) + 0x04)      /* Current value */
-#define MTU_CR(x)      (0x10 + 0x10 * (x) + 0x08)      /* Control reg */
-#define MTU_BGLR(x)    (0x10 + 0x10 * (x) + 0x0c)      /* At next overflow */
-
-/* bits for the control register */
-#define MTU_CRn_ENA            0x80
-#define MTU_CRn_PERIODIC       0x40    /* if 0 = free-running */
-#define MTU_CRn_PRESCALE_MASK  0x0c
-#define MTU_CRn_PRESCALE_1             0x00
-#define MTU_CRn_PRESCALE_16            0x04
-#define MTU_CRn_PRESCALE_256           0x08
-#define MTU_CRn_32BITS         0x02
-#define MTU_CRn_ONESHOT                0x01    /* if 0 = wraps reloading from BGLR*/
-
-/* Other registers are usual amba/primecell registers, currently not used */
-#define MTU_ITCR       0xff0
-#define MTU_ITOP       0xff4
-
-#define MTU_PERIPH_ID0 0xfe0
-#define MTU_PERIPH_ID1 0xfe4
-#define MTU_PERIPH_ID2 0xfe8
-#define MTU_PERIPH_ID3 0xfeC
-
-#define MTU_PCELL0     0xff0
-#define MTU_PCELL1     0xff4
-#define MTU_PCELL2     0xff8
-#define MTU_PCELL3     0xffC
-
-static void __iomem *mtu_base;
-static bool clkevt_periodic;
-static u32 clk_prescale;
-static u32 nmdk_cycle;         /* write-once */
-
-#ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK
-/*
- * Override the global weak sched_clock symbol with this
- * local implementation which uses the clocksource to get some
- * better resolution when scheduling the kernel.
- */
-static u32 notrace nomadik_read_sched_clock(void)
-{
-       if (unlikely(!mtu_base))
-               return 0;
-
-       return -readl(mtu_base + MTU_VAL(0));
-}
-#endif
-
-/* Clockevent device: use one-shot mode */
-static int nmdk_clkevt_next(unsigned long evt, struct clock_event_device *ev)
-{
-       writel(1 << 1, mtu_base + MTU_IMSC);
-       writel(evt, mtu_base + MTU_LR(1));
-       /* Load highest value, enable device, enable interrupts */
-       writel(MTU_CRn_ONESHOT | clk_prescale |
-              MTU_CRn_32BITS | MTU_CRn_ENA,
-              mtu_base + MTU_CR(1));
-
-       return 0;
-}
-
-void nmdk_clkevt_reset(void)
-{
-       if (clkevt_periodic) {
-               /* Timer: configure load and background-load, and fire it up */
-               writel(nmdk_cycle, mtu_base + MTU_LR(1));
-               writel(nmdk_cycle, mtu_base + MTU_BGLR(1));
-
-               writel(MTU_CRn_PERIODIC | clk_prescale |
-                      MTU_CRn_32BITS | MTU_CRn_ENA,
-                      mtu_base + MTU_CR(1));
-               writel(1 << 1, mtu_base + MTU_IMSC);
-       } else {
-               /* Generate an interrupt to start the clockevent again */
-               (void) nmdk_clkevt_next(nmdk_cycle, NULL);
-       }
-}
-
-static void nmdk_clkevt_mode(enum clock_event_mode mode,
-                            struct clock_event_device *dev)
-{
-       switch (mode) {
-       case CLOCK_EVT_MODE_PERIODIC:
-               clkevt_periodic = true;
-               nmdk_clkevt_reset();
-               break;
-       case CLOCK_EVT_MODE_ONESHOT:
-               clkevt_periodic = false;
-               break;
-       case CLOCK_EVT_MODE_SHUTDOWN:
-       case CLOCK_EVT_MODE_UNUSED:
-               writel(0, mtu_base + MTU_IMSC);
-               /* disable timer */
-               writel(0, mtu_base + MTU_CR(1));
-               /* load some high default value */
-               writel(0xffffffff, mtu_base + MTU_LR(1));
-               break;
-       case CLOCK_EVT_MODE_RESUME:
-               break;
-       }
-}
-
-static struct clock_event_device nmdk_clkevt = {
-       .name           = "mtu_1",
-       .features       = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
-       .rating         = 200,
-       .set_mode       = nmdk_clkevt_mode,
-       .set_next_event = nmdk_clkevt_next,
-};
-
-/*
- * IRQ Handler for timer 1 of the MTU block.
- */
-static irqreturn_t nmdk_timer_interrupt(int irq, void *dev_id)
-{
-       struct clock_event_device *evdev = dev_id;
-
-       writel(1 << 1, mtu_base + MTU_ICR); /* Interrupt clear reg */
-       evdev->event_handler(evdev);
-       return IRQ_HANDLED;
-}
-
-static struct irqaction nmdk_timer_irq = {
-       .name           = "Nomadik Timer Tick",
-       .flags          = IRQF_DISABLED | IRQF_TIMER,
-       .handler        = nmdk_timer_interrupt,
-       .dev_id         = &nmdk_clkevt,
-};
-
-void nmdk_clksrc_reset(void)
-{
-       /* Disable */
-       writel(0, mtu_base + MTU_CR(0));
-
-       /* ClockSource: configure load and background-load, and fire it up */
-       writel(nmdk_cycle, mtu_base + MTU_LR(0));
-       writel(nmdk_cycle, mtu_base + MTU_BGLR(0));
-
-       writel(clk_prescale | MTU_CRn_32BITS | MTU_CRn_ENA,
-              mtu_base + MTU_CR(0));
-}
-
-void __init nmdk_timer_init(void __iomem *base, int irq)
-{
-       unsigned long rate;
-       struct clk *clk0;
-
-       mtu_base = base;
-       clk0 = clk_get_sys("mtu0", NULL);
-       BUG_ON(IS_ERR(clk0));
-       BUG_ON(clk_prepare(clk0) < 0);
-       BUG_ON(clk_enable(clk0) < 0);
-
-       /*
-        * Tick rate is 2.4MHz for Nomadik and 2.4Mhz, 100MHz or 133 MHz
-        * for ux500.
-        * Use a divide-by-16 counter if the tick rate is more than 32MHz.
-        * At 32 MHz, the timer (with 32 bit counter) can be programmed
-        * to wake-up at a max 127s a head in time. Dividing a 2.4 MHz timer
-        * with 16 gives too low timer resolution.
-        */
-       rate = clk_get_rate(clk0);
-       if (rate > 32000000) {
-               rate /= 16;
-               clk_prescale = MTU_CRn_PRESCALE_16;
-       } else {
-               clk_prescale = MTU_CRn_PRESCALE_1;
-       }
-
-       /* Cycles for periodic mode */
-       nmdk_cycle = DIV_ROUND_CLOSEST(rate, HZ);
-
-
-       /* Timer 0 is the free running clocksource */
-       nmdk_clksrc_reset();
-
-       if (clocksource_mmio_init(mtu_base + MTU_VAL(0), "mtu_0",
-                       rate, 200, 32, clocksource_mmio_readl_down))
-               pr_err("timer: failed to initialize clock source %s\n",
-                      "mtu_0");
-
-#ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK
-       setup_sched_clock(nomadik_read_sched_clock, 32, rate);
-#endif
-
-       /* Timer 1 is used for events, register irq and clockevents */
-       setup_irq(irq, &nmdk_timer_irq);
-       nmdk_clkevt.cpumask = cpumask_of(0);
-       clockevents_config_and_register(&nmdk_clkevt, rate, 2, 0xffffffffU);
-}
index fbd9b2b850ef1de0a84a57182ff79bdd38064896..5bc09eec9bbb7f3b809c8e34b7dfa231e5bd3639 100644 (file)
@@ -216,7 +216,7 @@ config HW_RANDOM_MXC_RNGA
 
 config HW_RANDOM_NOMADIK
        tristate "ST-Ericsson Nomadik Random Number Generator support"
-       depends on HW_RANDOM && PLAT_NOMADIK
+       depends on HW_RANDOM && ARCH_NOMADIK
        ---help---
          This driver provides kernel-side support for the Random Number
          Generator hardware found on ST-Ericsson SoCs (8815 and 8500).
index 6a78073c3808b492aeb64dee35cfaeb34f901613..c9f67de8b7b4900dd8f0d9d797a405befc985ced 100644 (file)
@@ -22,6 +22,21 @@ config DW_APB_TIMER_OF
 config ARMADA_370_XP_TIMER
        bool
 
+config CLKSRC_NOMADIK_MTU
+       bool
+       depends on (ARCH_NOMADIK || ARCH_U8500)
+       select CLKSRC_MMIO
+       help
+         Support for Multi Timer Unit. MTU provides access
+         to multiple interrupt generating programmable
+         32-bit free running decrementing counters.
+
+config CLKSRC_NOMADIK_MTU_SCHED_CLOCK
+       bool
+       depends on CLKSRC_NOMADIK_MTU
+       help
+         Use the Multi Timer Unit as the sched_clock.
+
 config CLKSRC_DBX500_PRCMU
        bool "Clocksource PRCMU Timer"
        depends on UX500_SOC_DB8500
@@ -31,7 +46,7 @@ config CLKSRC_DBX500_PRCMU
 
 config CLKSRC_DBX500_PRCMU_SCHED_CLOCK
        bool "Clocksource PRCMU Timer sched_clock"
-       depends on (CLKSRC_DBX500_PRCMU && !NOMADIK_MTU_SCHED_CLOCK)
+       depends on (CLKSRC_DBX500_PRCMU && !CLKSRC_NOMADIK_MTU_SCHED_CLOCK)
        default y
        help
          Use the always on PRCMU Timer as sched_clock
index 603be366f762c7a528de14e36ba2043ef9bb1ca1..24fb888ee0a25356301da06822142763abd94dd1 100644 (file)
@@ -11,6 +11,7 @@ obj-$(CONFIG_CLKBLD_I8253)    += i8253.o
 obj-$(CONFIG_CLKSRC_MMIO)      += mmio.o
 obj-$(CONFIG_DW_APB_TIMER)     += dw_apb_timer.o
 obj-$(CONFIG_DW_APB_TIMER_OF)  += dw_apb_timer_of.o
+obj-$(CONFIG_CLKSRC_NOMADIK_MTU)       += nomadik-mtu.o
 obj-$(CONFIG_CLKSRC_DBX500_PRCMU)      += clksrc-dbx500-prcmu.o
 obj-$(CONFIG_ARMADA_370_XP_TIMER)      += time-armada-370-xp.o
 obj-$(CONFIG_ARCH_BCM2835)     += bcm2835_timer.o
diff --git a/drivers/clocksource/nomadik-mtu.c b/drivers/clocksource/nomadik-mtu.c
new file mode 100644 (file)
index 0000000..23c780b
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2008 STMicroelectronics
+ * Copyright (C) 2010 Alessandro Rubini
+ * Copyright (C) 2010 Linus Walleij for ST-Ericsson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2, as
+ * published by the Free Software Foundation.
+ */
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/io.h>
+#include <linux/clockchips.h>
+#include <linux/clocksource.h>
+#include <linux/clk.h>
+#include <linux/jiffies.h>
+#include <linux/err.h>
+#include <linux/platform_data/clocksource-nomadik-mtu.h>
+#include <asm/mach/time.h>
+#include <asm/sched_clock.h>
+
+/*
+ * The MTU device hosts four different counters, with 4 set of
+ * registers. These are register names.
+ */
+
+#define MTU_IMSC       0x00    /* Interrupt mask set/clear */
+#define MTU_RIS                0x04    /* Raw interrupt status */
+#define MTU_MIS                0x08    /* Masked interrupt status */
+#define MTU_ICR                0x0C    /* Interrupt clear register */
+
+/* per-timer registers take 0..3 as argument */
+#define MTU_LR(x)      (0x10 + 0x10 * (x) + 0x00)      /* Load value */
+#define MTU_VAL(x)     (0x10 + 0x10 * (x) + 0x04)      /* Current value */
+#define MTU_CR(x)      (0x10 + 0x10 * (x) + 0x08)      /* Control reg */
+#define MTU_BGLR(x)    (0x10 + 0x10 * (x) + 0x0c)      /* At next overflow */
+
+/* bits for the control register */
+#define MTU_CRn_ENA            0x80
+#define MTU_CRn_PERIODIC       0x40    /* if 0 = free-running */
+#define MTU_CRn_PRESCALE_MASK  0x0c
+#define MTU_CRn_PRESCALE_1             0x00
+#define MTU_CRn_PRESCALE_16            0x04
+#define MTU_CRn_PRESCALE_256           0x08
+#define MTU_CRn_32BITS         0x02
+#define MTU_CRn_ONESHOT                0x01    /* if 0 = wraps reloading from BGLR*/
+
+/* Other registers are usual amba/primecell registers, currently not used */
+#define MTU_ITCR       0xff0
+#define MTU_ITOP       0xff4
+
+#define MTU_PERIPH_ID0 0xfe0
+#define MTU_PERIPH_ID1 0xfe4
+#define MTU_PERIPH_ID2 0xfe8
+#define MTU_PERIPH_ID3 0xfeC
+
+#define MTU_PCELL0     0xff0
+#define MTU_PCELL1     0xff4
+#define MTU_PCELL2     0xff8
+#define MTU_PCELL3     0xffC
+
+static void __iomem *mtu_base;
+static bool clkevt_periodic;
+static u32 clk_prescale;
+static u32 nmdk_cycle;         /* write-once */
+
+#ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK
+/*
+ * Override the global weak sched_clock symbol with this
+ * local implementation which uses the clocksource to get some
+ * better resolution when scheduling the kernel.
+ */
+static u32 notrace nomadik_read_sched_clock(void)
+{
+       if (unlikely(!mtu_base))
+               return 0;
+
+       return -readl(mtu_base + MTU_VAL(0));
+}
+#endif
+
+/* Clockevent device: use one-shot mode */
+static int nmdk_clkevt_next(unsigned long evt, struct clock_event_device *ev)
+{
+       writel(1 << 1, mtu_base + MTU_IMSC);
+       writel(evt, mtu_base + MTU_LR(1));
+       /* Load highest value, enable device, enable interrupts */
+       writel(MTU_CRn_ONESHOT | clk_prescale |
+              MTU_CRn_32BITS | MTU_CRn_ENA,
+              mtu_base + MTU_CR(1));
+
+       return 0;
+}
+
+void nmdk_clkevt_reset(void)
+{
+       if (clkevt_periodic) {
+               /* Timer: configure load and background-load, and fire it up */
+               writel(nmdk_cycle, mtu_base + MTU_LR(1));
+               writel(nmdk_cycle, mtu_base + MTU_BGLR(1));
+
+               writel(MTU_CRn_PERIODIC | clk_prescale |
+                      MTU_CRn_32BITS | MTU_CRn_ENA,
+                      mtu_base + MTU_CR(1));
+               writel(1 << 1, mtu_base + MTU_IMSC);
+       } else {
+               /* Generate an interrupt to start the clockevent again */
+               (void) nmdk_clkevt_next(nmdk_cycle, NULL);
+       }
+}
+
+static void nmdk_clkevt_mode(enum clock_event_mode mode,
+                            struct clock_event_device *dev)
+{
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               clkevt_periodic = true;
+               nmdk_clkevt_reset();
+               break;
+       case CLOCK_EVT_MODE_ONESHOT:
+               clkevt_periodic = false;
+               break;
+       case CLOCK_EVT_MODE_SHUTDOWN:
+       case CLOCK_EVT_MODE_UNUSED:
+               writel(0, mtu_base + MTU_IMSC);
+               /* disable timer */
+               writel(0, mtu_base + MTU_CR(1));
+               /* load some high default value */
+               writel(0xffffffff, mtu_base + MTU_LR(1));
+               break;
+       case CLOCK_EVT_MODE_RESUME:
+               break;
+       }
+}
+
+static struct clock_event_device nmdk_clkevt = {
+       .name           = "mtu_1",
+       .features       = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
+       .rating         = 200,
+       .set_mode       = nmdk_clkevt_mode,
+       .set_next_event = nmdk_clkevt_next,
+};
+
+/*
+ * IRQ Handler for timer 1 of the MTU block.
+ */
+static irqreturn_t nmdk_timer_interrupt(int irq, void *dev_id)
+{
+       struct clock_event_device *evdev = dev_id;
+
+       writel(1 << 1, mtu_base + MTU_ICR); /* Interrupt clear reg */
+       evdev->event_handler(evdev);
+       return IRQ_HANDLED;
+}
+
+static struct irqaction nmdk_timer_irq = {
+       .name           = "Nomadik Timer Tick",
+       .flags          = IRQF_DISABLED | IRQF_TIMER,
+       .handler        = nmdk_timer_interrupt,
+       .dev_id         = &nmdk_clkevt,
+};
+
+void nmdk_clksrc_reset(void)
+{
+       /* Disable */
+       writel(0, mtu_base + MTU_CR(0));
+
+       /* ClockSource: configure load and background-load, and fire it up */
+       writel(nmdk_cycle, mtu_base + MTU_LR(0));
+       writel(nmdk_cycle, mtu_base + MTU_BGLR(0));
+
+       writel(clk_prescale | MTU_CRn_32BITS | MTU_CRn_ENA,
+              mtu_base + MTU_CR(0));
+}
+
+void __init nmdk_timer_init(void __iomem *base, int irq)
+{
+       unsigned long rate;
+       struct clk *clk0;
+
+       mtu_base = base;
+       clk0 = clk_get_sys("mtu0", NULL);
+       BUG_ON(IS_ERR(clk0));
+       BUG_ON(clk_prepare(clk0) < 0);
+       BUG_ON(clk_enable(clk0) < 0);
+
+       /*
+        * Tick rate is 2.4MHz for Nomadik and 2.4Mhz, 100MHz or 133 MHz
+        * for ux500.
+        * Use a divide-by-16 counter if the tick rate is more than 32MHz.
+        * At 32 MHz, the timer (with 32 bit counter) can be programmed
+        * to wake-up at a max 127s a head in time. Dividing a 2.4 MHz timer
+        * with 16 gives too low timer resolution.
+        */
+       rate = clk_get_rate(clk0);
+       if (rate > 32000000) {
+               rate /= 16;
+               clk_prescale = MTU_CRn_PRESCALE_16;
+       } else {
+               clk_prescale = MTU_CRn_PRESCALE_1;
+       }
+
+       /* Cycles for periodic mode */
+       nmdk_cycle = DIV_ROUND_CLOSEST(rate, HZ);
+
+
+       /* Timer 0 is the free running clocksource */
+       nmdk_clksrc_reset();
+
+       if (clocksource_mmio_init(mtu_base + MTU_VAL(0), "mtu_0",
+                       rate, 200, 32, clocksource_mmio_readl_down))
+               pr_err("timer: failed to initialize clock source %s\n",
+                      "mtu_0");
+
+#ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK
+       setup_sched_clock(nomadik_read_sched_clock, 32, rate);
+#endif
+
+       /* Timer 1 is used for events, register irq and clockevents */
+       setup_irq(irq, &nmdk_timer_irq);
+       nmdk_clkevt.cpumask = cpumask_of(0);
+       clockevents_config_and_register(&nmdk_clkevt, rate, 2, 0xffffffffU);
+}
index b4b65af8612a3f03a79ea19422873cd777f39b76..855fc52945db798387853c2205db67daebe0bc63 100644 (file)
@@ -408,7 +408,7 @@ config KEYBOARD_NEWTON
 
 config KEYBOARD_NOMADIK
        tristate "ST-Ericsson Nomadik SKE keyboard"
-       depends on PLAT_NOMADIK
+       depends on (ARCH_NOMADIK || ARCH_U8500)
        select INPUT_MATRIXKMAP
        help
          Say Y here if you want to use a keypad provided on the SKE controller
index 4883139460be90ba7385b059651f1a52bab608c5..e4f57482f0ae1347c25242c36509ced704e7bbc5 100644 (file)
@@ -559,7 +559,7 @@ config MTD_NAND_JZ4740
 
 config MTD_NAND_FSMC
        tristate "Support for NAND on ST Micros FSMC"
-       depends on PLAT_SPEAR || PLAT_NOMADIK || MACH_U300
+       depends on PLAT_SPEAR || ARCH_NOMADIK || ARCH_U8500 || MACH_U300
        help
          Enables support for NAND Flash chips on the ST Microelectronics
          Flexible Static Memory Controller (FSMC)
diff --git a/include/linux/platform_data/clocksource-nomadik-mtu.h b/include/linux/platform_data/clocksource-nomadik-mtu.h
new file mode 100644 (file)
index 0000000..8008897
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef __PLAT_MTU_H
+#define __PLAT_MTU_H
+
+void nmdk_timer_init(void __iomem *base, int irq);
+void nmdk_clkevt_reset(void);
+void nmdk_clksrc_reset(void);
+
+#endif /* __PLAT_MTU_H */
+