9f639269ed
Three new system-on-chip models are supported: the st-ericsson u9540 in ux500, the sam9n12 in at91 and the emma ev2 in shmobile. Emma is a little bit special because it is completely unrelated to the classic shmobile models, but the new Renesas rmobile SoCs are a combination of things from both Emma and shmobile, so it was decided to have them all live in one directory. This also contains updates to existing shmobile soc code as well as some related board changes due to dependencies. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJPuerfAAoJEIwa5zzehBx3hi4P/AsoiLW4VqN67zMmiaGC5Nwe X5nAeaaU0Oo4I9W2QD37V0BShk+yOE9xx7I0TOx7xE6/DpkJ3DhNlUOIvJSbtVD9 vOHF0pSu4huwmqMQmSS8qk5imYMVNGcDmNPVJsPdMCpC2PeCjNY5PxzX4PA18GxZ 9WaPClAP2vqSf/WewiFs73HE70TPL9DuMnAaA2QLBfeu6Cj5K401sc0sdJnBKJFc W7T8qo1LJ98wEWeGW1Qks2mhtwlRf3S20t6aYQi0Bm9znaHMRomdaWdkrXLUYxiO l8EHkCzgggXhdaqvqp15M3AFGgDsw+713UQ0n7tMGvIXv+Oc9ctriK0vcjIXHzH/ Ifz+4KvqYPo47ha0vSUpoRx29ThXO/zKDlzOUdh48JUWqBN6IDw+5H93ghI5SWGu 2h9RuAHIRxumtVe1Qb2dh2SzByxfqJJs7fkASXqWfucYgEi4vhylQdS7akCZ5ycq 35MOTS3v8rwxemTAR0NZKguRwVfUDnHGpyehumY5b/dp8nF0uHNaF8dRpnDC04Ty 4AHSquNmujQ0fqSJfcDCNT9V4vhrbdnW0YqhpCNFYLWBWnybJwjWDriWgt3Cc9tL BMApWGprknKjxH/LeoZHIr0cHGjhZ0iRgoX+av7mPbNUcW/T64HEIs1Yyo4dbE2w ffQN5xWomW+8VdZ1qf+w =5TAz -----END PGP SIGNATURE----- Merge tag 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc Pull support for new arm SoCs from Olof Johansson: "Three new system-on-chip models are supported: the st-ericsson u9540 in ux500, the sam9n12 in at91 and the emma ev2 in shmobile. Emma is a little bit special because it is completely unrelated to the classic shmobile models, but the new Renesas rmobile SoCs are a combination of things from both Emma and shmobile, so it was decided to have them all live in one directory. This also contains updates to existing shmobile soc code as well as some related board changes due to dependencies." * tag 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (23 commits) mach-shmobile: Use DT_MACHINE for KZM9D V3 mach-shmobile: Emma Mobile EV2 DT support V3 mach-shmobile: KZM9D board Ethernet support V3 mach-shmobile: Emma Mobile EV2 GPIO support V3 mach-shmobile: Emma Mobile EV2 SMP support V3 mach-shmobile: KZM9D board support V3 mach-shmobile: Emma Mobile EV2 SoC base support V3 gpio: Emma Mobile GPIO driver V2 ARM: mach-shmobile: sh73a0: fixup PINT/IRQ16-IRQ31 irq number conflict ARM: mach-shmobile: clock-r8a7740: use followparent_recalc on usb24s ARM: mach-shmobile: clock-r8a7740: add MMCIF clock ARM: mach-shmobile: clock-r8a7740: add SDHI clock ARM: mach-shmobile: clock-r8a7740: add USB clock ARM: mach-shmobile: clock-r8a7740: add FSI clock ARM: mach-shmobile: r8a7740: cleanup I2C workaround method ARM: mach-shmobile: r8a7740: add gpio_irq support ARM: mach-shmobile: sh7372: Add FSI DMAEngine support ARM / mach-shmobile: Use preset_lpj with calibrate_delay() ARM: ux500: ioremap differences for DB9540 ARM: ux500: core U9540 support ...
112 lines
2.8 KiB
C
112 lines
2.8 KiB
C
/*
|
|
* Copyright (C) ST-Ericsson SA 2011
|
|
*
|
|
* License Terms: GNU General Public License v2
|
|
* Author: Mattias Wallin <mattias.wallin@stericsson.com> for ST-Ericsson
|
|
*/
|
|
#include <linux/io.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/clksrc-dbx500-prcmu.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_address.h>
|
|
|
|
#include <asm/smp_twd.h>
|
|
|
|
#include <plat/mtu.h>
|
|
|
|
#include <mach/setup.h>
|
|
#include <mach/hardware.h>
|
|
#include <mach/irqs.h>
|
|
|
|
#ifdef CONFIG_HAVE_ARM_TWD
|
|
static DEFINE_TWD_LOCAL_TIMER(u8500_twd_local_timer,
|
|
U8500_TWD_BASE, IRQ_LOCALTIMER);
|
|
|
|
static void __init ux500_twd_init(void)
|
|
{
|
|
struct twd_local_timer *twd_local_timer;
|
|
int err;
|
|
|
|
/* Use this to switch local timer base if changed in new ASICs */
|
|
twd_local_timer = &u8500_twd_local_timer;
|
|
|
|
if (of_have_populated_dt())
|
|
twd_local_timer_of_register();
|
|
else {
|
|
err = twd_local_timer_register(twd_local_timer);
|
|
if (err)
|
|
pr_err("twd_local_timer_register failed %d\n", err);
|
|
}
|
|
}
|
|
#else
|
|
#define ux500_twd_init() do { } while(0)
|
|
#endif
|
|
|
|
const static struct of_device_id prcmu_timer_of_match[] __initconst = {
|
|
{ .compatible = "stericsson,db8500-prcmu-timer-4", },
|
|
{ },
|
|
};
|
|
|
|
static void __init ux500_timer_init(void)
|
|
{
|
|
void __iomem *mtu_timer_base;
|
|
void __iomem *prcmu_timer_base;
|
|
void __iomem *tmp_base;
|
|
struct device_node *np;
|
|
|
|
if (cpu_is_u8500_family()) {
|
|
mtu_timer_base = __io_address(U8500_MTU0_BASE);
|
|
prcmu_timer_base = __io_address(U8500_PRCMU_TIMER_4_BASE);
|
|
} else {
|
|
ux500_unknown_soc();
|
|
}
|
|
|
|
/* TODO: Once MTU has been DT:ed place code above into else. */
|
|
if (of_have_populated_dt()) {
|
|
np = of_find_matching_node(NULL, prcmu_timer_of_match);
|
|
if (!np)
|
|
goto dt_fail;
|
|
|
|
tmp_base = of_iomap(np, 0);
|
|
if (!tmp_base)
|
|
goto dt_fail;
|
|
|
|
prcmu_timer_base = tmp_base;
|
|
}
|
|
|
|
dt_fail:
|
|
/* Doing it the old fashioned way. */
|
|
|
|
/*
|
|
* Here we register the timerblocks active in the system.
|
|
* Localtimers (twd) is started when both cpu is up and running.
|
|
* MTU register a clocksource, clockevent and sched_clock.
|
|
* Since the MTU is located in the VAPE power domain
|
|
* it will be cleared in sleep which makes it unsuitable.
|
|
* We however need it as a timer tick (clockevent)
|
|
* during boot to calibrate delay until twd is started.
|
|
* RTC-RTT have problems as timer tick during boot since it is
|
|
* depending on delay which is not yet calibrated. RTC-RTT is in the
|
|
* always-on powerdomain and is used as clockevent instead of twd when
|
|
* sleeping.
|
|
* The PRCMU timer 4 register a clocksource and
|
|
* sched_clock with higher rating then MTU since is always-on.
|
|
*
|
|
*/
|
|
|
|
nmdk_timer_init(mtu_timer_base);
|
|
clksrc_dbx500_prcmu_init(prcmu_timer_base);
|
|
ux500_twd_init();
|
|
}
|
|
|
|
static void ux500_timer_reset(void)
|
|
{
|
|
nmdk_clkevt_reset();
|
|
nmdk_clksrc_reset();
|
|
}
|
|
|
|
struct sys_timer ux500_timer = {
|
|
.init = ux500_timer_init,
|
|
.resume = ux500_timer_reset,
|
|
};
|