![Linus Torvalds](/assets/img/avatar_default.png)
Device tree conversion and enablement branch. Mostly a bunch of new bindings and setup for various platforms, but the Via/Winchip VT8500 platform is also converted over from being 100% legacy to now use device tree for probing. More of that will come for 3.8. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJQaiKNAAoJEIwa5zzehBx329AP/1TwJk1dTHaAA7vDxyz2mq1E F0MBL9p32R1SczrFGjbmb9ouVW5tTjbK1zted5zBrGBXDIX9Kdz3Dmm7x6b2/JvZ 8yMrdiBNpF3r8au6IaMuMlOq5yAaN+F4SxbC2rE0a9y3YmMZ6ug5dgoZ4O8orAC4 il3eq1sb+rTTPCf7C5cGlKzdRQi2KYdAycpa7ChQCYSamxJjdM7cXR7pohVv9vhd 9sF+h1I0ArxcVYn/mUOoCin8MyIWXlBQvbUnF+3aYO8CO9erhKH/owPngVBWGKZH +X6dk0ChUJfjzaWr2HPZIYUqLUnIoO8TsRhQVmLp1rPrSzSXMG3iDq0M4WEwL4Xo bMbAZ1KWYg53HRqbIOEQk5q9Mg7HUgtbJuOE7WLgBO5ubdKFFWLmDUJ+WVcoWzSW qyWaWpECSptlQjFyqZJd9MjizIDhuYjog2EWaSWXETQ+1XRmCSsqx8AX6n1MVdhP 6jDLnYHYiJoOtGiaDpYxsXgMXdOVsrTegecNduqH/XhdEL1iwy3fwgK1DjoclYoj iFbn0/Tw3N5SvJlG4xitl12DQ7MeCCbfzJGRKenVh9/O4U+qrTbFRmsNaaZw5dA1 bt+iEZ3aU8YBaKj02LexunAevpZJ2rfGNX2tBjQrIzzZK6CZibPWg42qfKJfdn7w etXVVApw5jQjAImY64kh =q7ZY -----END PGP SIGNATURE----- Merge tag 'dt' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc Pull ARM soc device tree updates from Olof Johansson: "Device tree conversion and enablement branch. Mostly a bunch of new bindings and setup for various platforms, but the Via/Winchip VT8500 platform is also converted over from being 100% legacy to now use device tree for probing. More of that will come for 3.8." Trivial conflicts due to removal of vt8500 files, and one documentation file that was added with slightly different contents both here and in the USb tree. * tag 'dt' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (212 commits) arm: vt8500: Fixup for missing gpio.h ARM: LPC32xx: LED fix in PHY3250 DTS file ARM: dt: mmp-dma: add binding file arm: vt8500: Update arch-vt8500 to devicetree support. arm: vt8500: gpio: Devicetree support for arch-vt8500 arm: vt8500: doc: Add device tree bindings for arch-vt8500 devices arm: vt8500: clk: Add Common Clock Framework support video: vt8500: Add devicetree support for vt8500-fb and wm8505-fb serial: vt8500: Add devicetree support for vt8500-serial rtc: vt8500: Add devicetree support for vt8500-rtc arm: vt8500: Add device tree files for VIA/Wondermedia SoC's ARM: tegra: Add Avionic Design Tamonten Evaluation Carrier support ARM: tegra: Add Avionic Design Medcom-Wide support ARM: tegra: Add Avionic Design Plutux support ARM: tegra: Add Avionic Design Tamonten support ARM: tegra: dts: Add pwm label ARM: ux500: Fix SSP register address format ARM: ux500: Apply tc3589x's GPIO/IRQ properties to HREF's DT ARM: ux500: Remove redundant #gpio-cell properties from Snowball DT ARM: ux500: Add all encompassing sound node to the HREF Device Tree ...
176 lines
4.4 KiB
C
176 lines
4.4 KiB
C
/*
|
|
* linux/arch/arm/mach-mmp/mmp2.c
|
|
*
|
|
* code name MMP2
|
|
*
|
|
* Copyright (C) 2009 Marvell International Ltd.
|
|
*
|
|
* 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/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
#include <linux/io.h>
|
|
#include <linux/platform_device.h>
|
|
|
|
#include <asm/hardware/cache-tauros2.h>
|
|
|
|
#include <asm/mach/time.h>
|
|
#include <mach/addr-map.h>
|
|
#include <mach/regs-apbc.h>
|
|
#include <mach/cputype.h>
|
|
#include <mach/irqs.h>
|
|
#include <mach/dma.h>
|
|
#include <mach/mfp.h>
|
|
#include <mach/devices.h>
|
|
#include <mach/mmp2.h>
|
|
|
|
#include "common.h"
|
|
|
|
#define MFPR_VIRT_BASE (APB_VIRT_BASE + 0x1e000)
|
|
|
|
static struct mfp_addr_map mmp2_addr_map[] __initdata = {
|
|
|
|
MFP_ADDR_X(GPIO0, GPIO58, 0x54),
|
|
MFP_ADDR_X(GPIO59, GPIO73, 0x280),
|
|
MFP_ADDR_X(GPIO74, GPIO101, 0x170),
|
|
|
|
MFP_ADDR(GPIO102, 0x0),
|
|
MFP_ADDR(GPIO103, 0x4),
|
|
MFP_ADDR(GPIO104, 0x1fc),
|
|
MFP_ADDR(GPIO105, 0x1f8),
|
|
MFP_ADDR(GPIO106, 0x1f4),
|
|
MFP_ADDR(GPIO107, 0x1f0),
|
|
MFP_ADDR(GPIO108, 0x21c),
|
|
MFP_ADDR(GPIO109, 0x218),
|
|
MFP_ADDR(GPIO110, 0x214),
|
|
MFP_ADDR(GPIO111, 0x200),
|
|
MFP_ADDR(GPIO112, 0x244),
|
|
MFP_ADDR(GPIO113, 0x25c),
|
|
MFP_ADDR(GPIO114, 0x164),
|
|
MFP_ADDR_X(GPIO115, GPIO122, 0x260),
|
|
|
|
MFP_ADDR(GPIO123, 0x148),
|
|
MFP_ADDR_X(GPIO124, GPIO141, 0xc),
|
|
|
|
MFP_ADDR(GPIO142, 0x8),
|
|
MFP_ADDR_X(GPIO143, GPIO151, 0x220),
|
|
MFP_ADDR_X(GPIO152, GPIO153, 0x248),
|
|
MFP_ADDR_X(GPIO154, GPIO155, 0x254),
|
|
MFP_ADDR_X(GPIO156, GPIO159, 0x14c),
|
|
|
|
MFP_ADDR(GPIO160, 0x250),
|
|
MFP_ADDR(GPIO161, 0x210),
|
|
MFP_ADDR(GPIO162, 0x20c),
|
|
MFP_ADDR(GPIO163, 0x208),
|
|
MFP_ADDR(GPIO164, 0x204),
|
|
MFP_ADDR(GPIO165, 0x1ec),
|
|
MFP_ADDR(GPIO166, 0x1e8),
|
|
MFP_ADDR(GPIO167, 0x1e4),
|
|
MFP_ADDR(GPIO168, 0x1e0),
|
|
|
|
MFP_ADDR_X(TWSI1_SCL, TWSI1_SDA, 0x140),
|
|
MFP_ADDR_X(TWSI4_SCL, TWSI4_SDA, 0x2bc),
|
|
|
|
MFP_ADDR(PMIC_INT, 0x2c4),
|
|
MFP_ADDR(CLK_REQ, 0x160),
|
|
|
|
MFP_ADDR_END,
|
|
};
|
|
|
|
void mmp2_clear_pmic_int(void)
|
|
{
|
|
void __iomem *mfpr_pmic;
|
|
unsigned long data;
|
|
|
|
mfpr_pmic = APB_VIRT_BASE + 0x1e000 + 0x2c4;
|
|
data = __raw_readl(mfpr_pmic);
|
|
__raw_writel(data | (1 << 6), mfpr_pmic);
|
|
__raw_writel(data, mfpr_pmic);
|
|
}
|
|
|
|
void __init mmp2_init_irq(void)
|
|
{
|
|
mmp2_init_icu();
|
|
}
|
|
|
|
static int __init mmp2_init(void)
|
|
{
|
|
if (cpu_is_mmp2()) {
|
|
#ifdef CONFIG_CACHE_TAUROS2
|
|
tauros2_init(0);
|
|
#endif
|
|
mfp_init_base(MFPR_VIRT_BASE);
|
|
mfp_init_addr(mmp2_addr_map);
|
|
pxa_init_dma(IRQ_MMP2_DMA_RIQ, 16);
|
|
mmp2_clk_init();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
postcore_initcall(mmp2_init);
|
|
|
|
#define APBC_TIMERS APBC_REG(0x024)
|
|
|
|
static void __init mmp2_timer_init(void)
|
|
{
|
|
unsigned long clk_rst;
|
|
|
|
__raw_writel(APBC_APBCLK | APBC_RST, APBC_TIMERS);
|
|
|
|
/*
|
|
* enable bus/functional clock, enable 6.5MHz (divider 4),
|
|
* release reset
|
|
*/
|
|
clk_rst = APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(1);
|
|
__raw_writel(clk_rst, APBC_TIMERS);
|
|
|
|
timer_init(IRQ_MMP2_TIMER1);
|
|
}
|
|
|
|
struct sys_timer mmp2_timer = {
|
|
.init = mmp2_timer_init,
|
|
};
|
|
|
|
/* on-chip devices */
|
|
MMP2_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4030000, 0x30, 4, 5);
|
|
MMP2_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4017000, 0x30, 20, 21);
|
|
MMP2_DEVICE(uart3, "pxa2xx-uart", 2, UART3, 0xd4018000, 0x30, 22, 23);
|
|
MMP2_DEVICE(uart4, "pxa2xx-uart", 3, UART4, 0xd4016000, 0x30, 18, 19);
|
|
MMP2_DEVICE(twsi1, "pxa2xx-i2c", 0, TWSI1, 0xd4011000, 0x70);
|
|
MMP2_DEVICE(twsi2, "pxa2xx-i2c", 1, TWSI2, 0xd4031000, 0x70);
|
|
MMP2_DEVICE(twsi3, "pxa2xx-i2c", 2, TWSI3, 0xd4032000, 0x70);
|
|
MMP2_DEVICE(twsi4, "pxa2xx-i2c", 3, TWSI4, 0xd4033000, 0x70);
|
|
MMP2_DEVICE(twsi5, "pxa2xx-i2c", 4, TWSI5, 0xd4033800, 0x70);
|
|
MMP2_DEVICE(twsi6, "pxa2xx-i2c", 5, TWSI6, 0xd4034000, 0x70);
|
|
MMP2_DEVICE(nand, "pxa3xx-nand", -1, NAND, 0xd4283000, 0x100, 28, 29);
|
|
MMP2_DEVICE(sdh0, "sdhci-pxav3", 0, MMC, 0xd4280000, 0x120);
|
|
MMP2_DEVICE(sdh1, "sdhci-pxav3", 1, MMC2, 0xd4280800, 0x120);
|
|
MMP2_DEVICE(sdh2, "sdhci-pxav3", 2, MMC3, 0xd4281000, 0x120);
|
|
MMP2_DEVICE(sdh3, "sdhci-pxav3", 3, MMC4, 0xd4281800, 0x120);
|
|
MMP2_DEVICE(asram, "asram", -1, NONE, 0xe0000000, 0x4000);
|
|
/* 0xd1000000 ~ 0xd101ffff is reserved for secure processor */
|
|
MMP2_DEVICE(isram, "isram", -1, NONE, 0xd1020000, 0x18000);
|
|
|
|
struct resource mmp2_resource_gpio[] = {
|
|
{
|
|
.start = 0xd4019000,
|
|
.end = 0xd4019fff,
|
|
.flags = IORESOURCE_MEM,
|
|
}, {
|
|
.start = IRQ_MMP2_GPIO,
|
|
.end = IRQ_MMP2_GPIO,
|
|
.name = "gpio_mux",
|
|
.flags = IORESOURCE_IRQ,
|
|
},
|
|
};
|
|
|
|
struct platform_device mmp2_device_gpio = {
|
|
.name = "pxa-gpio",
|
|
.id = -1,
|
|
.num_resources = ARRAY_SIZE(mmp2_resource_gpio),
|
|
.resource = mmp2_resource_gpio,
|
|
};
|