2009-11-28 15:17:18 +08:00
|
|
|
/*
|
2011-12-15 20:38:40 +08:00
|
|
|
* Copyright (C) 2008-2009 ST-Ericsson SA
|
2009-11-28 15:17:18 +08:00
|
|
|
*
|
|
|
|
* Author: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
|
|
|
|
*
|
|
|
|
* 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/types.h>
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/device.h>
|
|
|
|
#include <linux/amba/bus.h>
|
2011-02-08 11:54:37 +08:00
|
|
|
#include <linux/interrupt.h>
|
2009-11-28 15:17:18 +08:00
|
|
|
#include <linux/irq.h>
|
|
|
|
#include <linux/platform_device.h>
|
2010-03-01 12:03:31 +08:00
|
|
|
#include <linux/io.h>
|
2012-09-27 17:17:36 +08:00
|
|
|
#include <linux/of.h>
|
|
|
|
#include <linux/of_platform.h>
|
2015-07-06 19:23:53 +08:00
|
|
|
#include <linux/perf/arm_pmu.h>
|
2012-09-27 17:17:36 +08:00
|
|
|
#include <linux/regulator/machine.h>
|
2009-11-28 15:17:18 +08:00
|
|
|
|
|
|
|
#include <asm/mach/map.h>
|
2012-12-14 02:57:16 +08:00
|
|
|
|
2013-03-22 05:51:12 +08:00
|
|
|
#include "setup.h"
|
2010-03-03 11:54:37 +08:00
|
|
|
|
2012-09-27 17:17:36 +08:00
|
|
|
#include "board-mop500.h"
|
2013-11-06 18:05:43 +08:00
|
|
|
#include "db8500-regs.h"
|
2009-11-28 15:17:18 +08:00
|
|
|
|
2011-02-08 11:54:37 +08:00
|
|
|
/*
|
|
|
|
* The PMU IRQ lines of two cores are wired together into a single interrupt.
|
|
|
|
* Bounce the interrupt to the other core if it's not ours.
|
|
|
|
*/
|
|
|
|
static irqreturn_t db8500_pmu_handler(int irq, void *dev, irq_handler_t handler)
|
|
|
|
{
|
|
|
|
irqreturn_t ret = handler(irq, dev);
|
|
|
|
int other = !smp_processor_id();
|
|
|
|
|
|
|
|
if (ret == IRQ_NONE && cpu_online(other))
|
|
|
|
irq_set_affinity(irq, cpumask_of(other));
|
|
|
|
|
|
|
|
/*
|
|
|
|
* We should be able to get away with the amount of IRQ_NONEs we give,
|
|
|
|
* while still having the spurious IRQ detection code kick in if the
|
|
|
|
* interrupt really starts hitting spuriously.
|
|
|
|
*/
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2014-05-28 17:26:04 +08:00
|
|
|
static struct arm_pmu_platdata db8500_pmu_platdata = {
|
2011-02-08 11:54:37 +08:00
|
|
|
.handle_irq = db8500_pmu_handler,
|
|
|
|
};
|
|
|
|
|
2012-09-27 17:17:36 +08:00
|
|
|
static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
|
|
|
|
/* Requires call-back bindings. */
|
|
|
|
OF_DEV_AUXDATA("arm,cortex-a9-pmu", 0, "arm-pmu", &db8500_pmu_platdata),
|
2012-11-03 20:37:15 +08:00
|
|
|
/* Requires DMA bindings. */
|
2013-09-18 20:37:12 +08:00
|
|
|
OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000,
|
|
|
|
"ux500-msp-i2s.0", &msp0_platform_data),
|
|
|
|
OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80124000,
|
|
|
|
"ux500-msp-i2s.1", &msp1_platform_data),
|
|
|
|
OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80117000,
|
|
|
|
"ux500-msp-i2s.2", &msp2_platform_data),
|
|
|
|
OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80125000,
|
|
|
|
"ux500-msp-i2s.3", &msp3_platform_data),
|
2013-08-21 18:32:49 +08:00
|
|
|
/* Requires non-DT:able platform data. */
|
2016-03-18 23:53:31 +08:00
|
|
|
OF_DEV_AUXDATA("stericsson,db8500-prcmu", 0x80157000, "db8500-prcmu", NULL),
|
2013-05-16 19:27:23 +08:00
|
|
|
OF_DEV_AUXDATA("stericsson,ux500-cryp", 0xa03cb000, "cryp1", NULL),
|
2013-05-16 19:27:24 +08:00
|
|
|
OF_DEV_AUXDATA("stericsson,ux500-hash", 0xa03c2000, "hash1", NULL),
|
2013-05-30 21:27:44 +08:00
|
|
|
OF_DEV_AUXDATA("stericsson,snd-soc-mop500", 0, "snd-soc-mop500.0",
|
|
|
|
NULL),
|
2012-09-27 17:17:36 +08:00
|
|
|
{},
|
|
|
|
};
|
|
|
|
|
2013-04-02 21:21:53 +08:00
|
|
|
static struct of_dev_auxdata u8540_auxdata_lookup[] __initdata = {
|
2016-03-18 23:53:31 +08:00
|
|
|
OF_DEV_AUXDATA("stericsson,db8500-prcmu", 0x80157000, "db8500-prcmu", NULL),
|
2013-04-02 21:21:53 +08:00
|
|
|
{},
|
|
|
|
};
|
|
|
|
|
2012-09-27 17:17:36 +08:00
|
|
|
static const struct of_device_id u8500_local_bus_nodes[] = {
|
|
|
|
/* only create devices below soc node */
|
|
|
|
{ .compatible = "stericsson,db8500", },
|
|
|
|
{ .compatible = "stericsson,db8500-prcmu", },
|
|
|
|
{ .compatible = "simple-bus"},
|
|
|
|
{ },
|
|
|
|
};
|
|
|
|
|
|
|
|
static void __init u8500_init_machine(void)
|
|
|
|
{
|
2013-04-02 21:21:53 +08:00
|
|
|
/* automatically probe child nodes of dbx5x0 devices */
|
|
|
|
if (of_machine_is_compatible("st-ericsson,u8540"))
|
|
|
|
of_platform_populate(NULL, u8500_local_bus_nodes,
|
ARM: ux500: move soc_id driver to drivers/soc
As the ux500 id code is basically a standalone driver, we can move it
out of the arch code into drivers/soc/ux500.
This is a user-visible change, as it moves all the devices in sysfs
from /sys/devices/soc0/ to /sys/devices/ and leaves the soc0 node as a
separate device.
Originally the idea was to put all on-chip devices under the soc node,
and ux500 was the first platform to have this device, but later platforms
almost all didn't follow that pattern, so this makes the platform do
the same thing as everyone else.
Since the platform is really obsolete now, I am optimistic that nothing
will break after moving the devices around.
As the SoC driver no longer has access to the private header files,
I'm changing the code to instead look up the address of the backupram
from devicetree, which is a good idea anyway.
Finally, having a separate Kconfig symbol means the driver is now
optional and could even be a loadable module rather than always being
built-in if we allowed that for soc_device.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
[Fixup mising Makefile, fixup BB_UID_BASE to fc0]
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
2016-06-22 22:32:36 +08:00
|
|
|
u8540_auxdata_lookup, NULL);
|
2013-04-02 21:21:53 +08:00
|
|
|
else
|
|
|
|
of_platform_populate(NULL, u8500_local_bus_nodes,
|
ARM: ux500: move soc_id driver to drivers/soc
As the ux500 id code is basically a standalone driver, we can move it
out of the arch code into drivers/soc/ux500.
This is a user-visible change, as it moves all the devices in sysfs
from /sys/devices/soc0/ to /sys/devices/ and leaves the soc0 node as a
separate device.
Originally the idea was to put all on-chip devices under the soc node,
and ux500 was the first platform to have this device, but later platforms
almost all didn't follow that pattern, so this makes the platform do
the same thing as everyone else.
Since the platform is really obsolete now, I am optimistic that nothing
will break after moving the devices around.
As the SoC driver no longer has access to the private header files,
I'm changing the code to instead look up the address of the backupram
from devicetree, which is a good idea anyway.
Finally, having a separate Kconfig symbol means the driver is now
optional and could even be a loadable module rather than always being
built-in if we allowed that for soc_device.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
[Fixup mising Makefile, fixup BB_UID_BASE to fc0]
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
2016-06-22 22:32:36 +08:00
|
|
|
u8500_auxdata_lookup, NULL);
|
2012-09-27 17:17:36 +08:00
|
|
|
}
|
|
|
|
|
2012-10-15 17:07:55 +08:00
|
|
|
static const char * stericsson_dt_platform_compat[] = {
|
|
|
|
"st-ericsson,u8500",
|
|
|
|
"st-ericsson,u8540",
|
|
|
|
"st-ericsson,u9500",
|
|
|
|
"st-ericsson,u9540",
|
2012-09-27 17:17:36 +08:00
|
|
|
NULL,
|
|
|
|
};
|
|
|
|
|
2012-10-15 15:55:17 +08:00
|
|
|
DT_MACHINE_START(U8500_DT, "ST-Ericsson Ux5x0 platform (Device Tree Support)")
|
2016-06-21 04:27:23 +08:00
|
|
|
.l2c_aux_val = 0,
|
|
|
|
.l2c_aux_mask = ~0,
|
2012-09-27 17:17:36 +08:00
|
|
|
.init_irq = ux500_init_irq,
|
|
|
|
.init_machine = u8500_init_machine,
|
2012-10-15 17:07:55 +08:00
|
|
|
.dt_compat = stericsson_dt_platform_compat,
|
2013-06-14 21:22:40 +08:00
|
|
|
.restart = ux500_restart,
|
2012-09-27 17:17:36 +08:00
|
|
|
MACHINE_END
|