linux/arch/arm/mach-nomadik/cpu-8815.c
<<
>>
Prefs
   1/*
   2 * Copyright STMicroelectronics, 2007.
   3 *
   4 *  This program is free software; you can redistribute it and/or modify
   5 *  it under the terms of the GNU General Public License as published by
   6 *  the Free Software Foundation; either version 2 of the License, or
   7 *  (at your option) any later version.
   8 *
   9 *  This program is distributed in the hope that it will be useful,
  10 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 *  GNU General Public License for more details.
  13 *
  14 *  You should have received a copy of the GNU General Public License
  15 *  along with this program; if not, write to the Free Software
  16 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17 */
  18
  19#include <linux/types.h>
  20#include <linux/init.h>
  21#include <linux/device.h>
  22#include <linux/amba/bus.h>
  23#include <linux/gpio.h>
  24
  25#include <mach/hardware.h>
  26#include <mach/irqs.h>
  27#include <asm/mach/map.h>
  28#include <asm/hardware/vic.h>
  29
  30#include <asm/cacheflush.h>
  31#include <asm/hardware/cache-l2x0.h>
  32
  33/* The 8815 has 4 GPIO blocks, let's register them immediately */
  34static struct nmk_gpio_platform_data cpu8815_gpio[] = {
  35        {
  36                .name = "GPIO-0-31",
  37                .first_gpio = 0,
  38                .first_irq = NOMADIK_GPIO_TO_IRQ(0),
  39                .parent_irq = IRQ_GPIO0,
  40        }, {
  41                .name = "GPIO-32-63",
  42                .first_gpio = 32,
  43                .first_irq = NOMADIK_GPIO_TO_IRQ(32),
  44                .parent_irq = IRQ_GPIO1,
  45        }, {
  46                .name = "GPIO-64-95",
  47                .first_gpio = 64,
  48                .first_irq = NOMADIK_GPIO_TO_IRQ(64),
  49                .parent_irq = IRQ_GPIO2,
  50        }, {
  51                .name = "GPIO-96-127", /* 124..127 not routed to pin */
  52                .first_gpio = 96,
  53                .first_irq = NOMADIK_GPIO_TO_IRQ(96),
  54                .parent_irq = IRQ_GPIO3,
  55        }
  56};
  57
  58#define __MEM_4K_RESOURCE(x) \
  59        .res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM}
  60
  61static struct amba_device cpu8815_amba_gpio[] = {
  62        {
  63                .dev = {
  64                        .init_name = "gpio0",
  65                        .platform_data = cpu8815_gpio + 0,
  66                },
  67                __MEM_4K_RESOURCE(NOMADIK_GPIO0_BASE),
  68        }, {
  69                .dev = {
  70                        .init_name = "gpio1",
  71                        .platform_data = cpu8815_gpio + 1,
  72                },
  73                __MEM_4K_RESOURCE(NOMADIK_GPIO1_BASE),
  74        }, {
  75                .dev = {
  76                        .init_name = "gpio2",
  77                        .platform_data = cpu8815_gpio + 2,
  78                },
  79                __MEM_4K_RESOURCE(NOMADIK_GPIO2_BASE),
  80        }, {
  81                .dev = {
  82                        .init_name = "gpio3",
  83                        .platform_data = cpu8815_gpio + 3,
  84                },
  85                __MEM_4K_RESOURCE(NOMADIK_GPIO3_BASE),
  86        },
  87};
  88
  89static struct amba_device *amba_devs[] __initdata = {
  90        cpu8815_amba_gpio + 0,
  91        cpu8815_amba_gpio + 1,
  92        cpu8815_amba_gpio + 2,
  93        cpu8815_amba_gpio + 3,
  94};
  95
  96static int __init cpu8815_init(void)
  97{
  98        int i;
  99
 100        for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
 101                amba_device_register(amba_devs[i], &iomem_resource);
 102        return 0;
 103}
 104arch_initcall(cpu8815_init);
 105
 106/* All SoC devices live in the same area (see hardware.h) */
 107static struct map_desc nomadik_io_desc[] __initdata = {
 108        {
 109                .virtual =      NOMADIK_IO_VIRTUAL,
 110                .pfn =          __phys_to_pfn(NOMADIK_IO_PHYSICAL),
 111                .length =       NOMADIK_IO_SIZE,
 112                .type =         MT_DEVICE,
 113        }
 114        /* static ram and secured ram may be added later */
 115};
 116
 117void __init cpu8815_map_io(void)
 118{
 119        iotable_init(nomadik_io_desc, ARRAY_SIZE(nomadik_io_desc));
 120}
 121
 122void __init cpu8815_init_irq(void)
 123{
 124        /* This modified VIC cell has two register blocks, at 0 and 0x20 */
 125        vic_init(io_p2v(NOMADIK_IC_BASE + 0x00), IRQ_VIC_START +  0, ~0, 0);
 126        vic_init(io_p2v(NOMADIK_IC_BASE + 0x20), IRQ_VIC_START + 32, ~0, 0);
 127}
 128
 129/*
 130 * This function is called from the board init ("init_machine").
 131 */
 132 void __init cpu8815_platform_init(void)
 133{
 134#ifdef CONFIG_CACHE_L2X0
 135        /* At full speed latency must be >=2, so 0x249 in low bits */
 136        l2x0_init(io_p2v(NOMADIK_L2CC_BASE), 0x00730249, 0xfe000fff);
 137#endif
 138         return;
 139}
 140