Path: blob/master/arch/arm/mach-nomadik/cpu-8815.c
10817 views
/*1* Copyright STMicroelectronics, 2007.2*3* This program is free software; you can redistribute it and/or modify4* it under the terms of the GNU General Public License as published by5* the Free Software Foundation; either version 2 of the License, or6* (at your option) any later version.7*8* This program is distributed in the hope that it will be useful,9* but WITHOUT ANY WARRANTY; without even the implied warranty of10* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the11* GNU General Public License for more details.12*13* You should have received a copy of the GNU General Public License14* along with this program; if not, write to the Free Software15* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA16*/1718#include <linux/types.h>19#include <linux/init.h>20#include <linux/device.h>21#include <linux/amba/bus.h>22#include <linux/platform_device.h>23#include <linux/gpio.h>2425#include <mach/hardware.h>26#include <mach/irqs.h>27#include <asm/mach/map.h>28#include <asm/hardware/vic.h>2930#include <asm/cacheflush.h>31#include <asm/hardware/cache-l2x0.h>3233#include "clock.h"3435#define __MEM_4K_RESOURCE(x) \36.res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM}3738/* The 8815 has 4 GPIO blocks, let's register them immediately */3940#define GPIO_RESOURCE(block) \41{ \42.start = NOMADIK_GPIO##block##_BASE, \43.end = NOMADIK_GPIO##block##_BASE + SZ_4K - 1, \44.flags = IORESOURCE_MEM, \45}, \46{ \47.start = IRQ_GPIO##block, \48.end = IRQ_GPIO##block, \49.flags = IORESOURCE_IRQ, \50}5152#define GPIO_DEVICE(block) \53{ \54.name = "gpio", \55.id = block, \56.num_resources = 2, \57.resource = &cpu8815_gpio_resources[block * 2], \58.dev = { \59.platform_data = &cpu8815_gpio[block], \60}, \61}6263static struct nmk_gpio_platform_data cpu8815_gpio[] = {64{65.name = "GPIO-0-31",66.first_gpio = 0,67.first_irq = NOMADIK_GPIO_TO_IRQ(0),68}, {69.name = "GPIO-32-63",70.first_gpio = 32,71.first_irq = NOMADIK_GPIO_TO_IRQ(32),72}, {73.name = "GPIO-64-95",74.first_gpio = 64,75.first_irq = NOMADIK_GPIO_TO_IRQ(64),76}, {77.name = "GPIO-96-127", /* 124..127 not routed to pin */78.first_gpio = 96,79.first_irq = NOMADIK_GPIO_TO_IRQ(96),80}81};8283static struct resource cpu8815_gpio_resources[] = {84GPIO_RESOURCE(0),85GPIO_RESOURCE(1),86GPIO_RESOURCE(2),87GPIO_RESOURCE(3),88};8990static struct platform_device cpu8815_platform_gpio[] = {91GPIO_DEVICE(0),92GPIO_DEVICE(1),93GPIO_DEVICE(2),94GPIO_DEVICE(3),95};9697static struct amba_device cpu8815_amba_rng = {98.dev = {99.init_name = "rng",100},101__MEM_4K_RESOURCE(NOMADIK_RNG_BASE),102};103104static struct platform_device *platform_devs[] __initdata = {105cpu8815_platform_gpio + 0,106cpu8815_platform_gpio + 1,107cpu8815_platform_gpio + 2,108cpu8815_platform_gpio + 3,109};110111static struct amba_device *amba_devs[] __initdata = {112&cpu8815_amba_rng113};114115static int __init cpu8815_init(void)116{117int i;118119platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));120for (i = 0; i < ARRAY_SIZE(amba_devs); i++)121amba_device_register(amba_devs[i], &iomem_resource);122return 0;123}124arch_initcall(cpu8815_init);125126/* All SoC devices live in the same area (see hardware.h) */127static struct map_desc nomadik_io_desc[] __initdata = {128{129.virtual = NOMADIK_IO_VIRTUAL,130.pfn = __phys_to_pfn(NOMADIK_IO_PHYSICAL),131.length = NOMADIK_IO_SIZE,132.type = MT_DEVICE,133}134/* static ram and secured ram may be added later */135};136137void __init cpu8815_map_io(void)138{139iotable_init(nomadik_io_desc, ARRAY_SIZE(nomadik_io_desc));140}141142void __init cpu8815_init_irq(void)143{144/* This modified VIC cell has two register blocks, at 0 and 0x20 */145vic_init(io_p2v(NOMADIK_IC_BASE + 0x00), IRQ_VIC_START + 0, ~0, 0);146vic_init(io_p2v(NOMADIK_IC_BASE + 0x20), IRQ_VIC_START + 32, ~0, 0);147148/*149* Init clocks here so that they are available for system timer150* initialization.151*/152clk_init();153}154155/*156* This function is called from the board init ("init_machine").157*/158void __init cpu8815_platform_init(void)159{160#ifdef CONFIG_CACHE_L2X0161/* At full speed latency must be >=2, so 0x249 in low bits */162l2x0_init(io_p2v(NOMADIK_L2CC_BASE), 0x00730249, 0xfe000fff);163#endif164return;165}166167168