linux/arch/arm/mach-shmobile/board-g3evm.c
<<
>>
Prefs
   1/*
   2 * G3EVM board support
   3 *
   4 * Copyright (C) 2010  Magnus Damm
   5 * Copyright (C) 2008  Yoshihiro Shimoda
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; version 2 of the License.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software
  18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  19 */
  20#include <linux/kernel.h>
  21#include <linux/init.h>
  22#include <linux/interrupt.h>
  23#include <linux/irq.h>
  24#include <linux/platform_device.h>
  25#include <linux/delay.h>
  26#include <linux/mtd/mtd.h>
  27#include <linux/mtd/partitions.h>
  28#include <linux/mtd/physmap.h>
  29#include <linux/mtd/sh_flctl.h>
  30#include <linux/usb/r8a66597.h>
  31#include <linux/io.h>
  32#include <linux/gpio.h>
  33#include <linux/input.h>
  34#include <linux/input/sh_keysc.h>
  35#include <linux/dma-mapping.h>
  36#include <mach/irqs.h>
  37#include <mach/sh7367.h>
  38#include <mach/common.h>
  39#include <asm/mach-types.h>
  40#include <asm/mach/arch.h>
  41
  42/*
  43 * IrDA
  44 *
  45 * S67: 5bit : ON  power
  46 *    : 6bit : ON  remote control
  47 *             OFF IrDA
  48 */
  49
  50static struct mtd_partition nor_flash_partitions[] = {
  51        {
  52                .name           = "loader",
  53                .offset         = 0x00000000,
  54                .size           = 512 * 1024,
  55        },
  56        {
  57                .name           = "bootenv",
  58                .offset         = MTDPART_OFS_APPEND,
  59                .size           = 512 * 1024,
  60        },
  61        {
  62                .name           = "kernel_ro",
  63                .offset         = MTDPART_OFS_APPEND,
  64                .size           = 8 * 1024 * 1024,
  65                .mask_flags     = MTD_WRITEABLE,
  66        },
  67        {
  68                .name           = "kernel",
  69                .offset         = MTDPART_OFS_APPEND,
  70                .size           = 8 * 1024 * 1024,
  71        },
  72        {
  73                .name           = "data",
  74                .offset         = MTDPART_OFS_APPEND,
  75                .size           = MTDPART_SIZ_FULL,
  76        },
  77};
  78
  79static struct physmap_flash_data nor_flash_data = {
  80        .width          = 2,
  81        .parts          = nor_flash_partitions,
  82        .nr_parts       = ARRAY_SIZE(nor_flash_partitions),
  83};
  84
  85static struct resource nor_flash_resources[] = {
  86        [0]     = {
  87                .start  = 0x00000000,
  88                .end    = 0x08000000 - 1,
  89                .flags  = IORESOURCE_MEM,
  90        }
  91};
  92
  93static struct platform_device nor_flash_device = {
  94        .name           = "physmap-flash",
  95        .dev            = {
  96                .platform_data  = &nor_flash_data,
  97        },
  98        .num_resources  = ARRAY_SIZE(nor_flash_resources),
  99        .resource       = nor_flash_resources,
 100};
 101
 102/* USBHS */
 103static void usb_host_port_power(int port, int power)
 104{
 105        if (!power) /* only power-on supported for now */
 106                return;
 107
 108        /* set VBOUT/PWEN and EXTLP0 in DVSTCTR */
 109        __raw_writew(__raw_readw(0xe6890008) | 0x600, 0xe6890008);
 110}
 111
 112static struct r8a66597_platdata usb_host_data = {
 113        .on_chip = 1,
 114        .port_power = usb_host_port_power,
 115};
 116
 117static struct resource usb_host_resources[] = {
 118        [0] = {
 119                .name   = "USBHS",
 120                .start  = 0xe6890000,
 121                .end    = 0xe68900e5,
 122                .flags  = IORESOURCE_MEM,
 123        },
 124        [1] = {
 125                .start  = evt2irq(0xa20), /* USBHS_USHI0 */
 126                .flags  = IORESOURCE_IRQ,
 127        },
 128};
 129
 130static struct platform_device usb_host_device = {
 131        .name           = "r8a66597_hcd",
 132        .id             = 0,
 133        .dev = {
 134                .platform_data          = &usb_host_data,
 135                .dma_mask               = NULL,
 136                .coherent_dma_mask      = 0xffffffff,
 137        },
 138        .num_resources  = ARRAY_SIZE(usb_host_resources),
 139        .resource       = usb_host_resources,
 140};
 141
 142/* KEYSC */
 143static struct sh_keysc_info keysc_info = {
 144        .mode           = SH_KEYSC_MODE_5,
 145        .scan_timing    = 3,
 146        .delay          = 100,
 147        .keycodes = {
 148                KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G,
 149                KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N,
 150                KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U,
 151                KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_HOME, KEY_SLEEP,
 152                KEY_WAKEUP, KEY_COFFEE, KEY_0, KEY_1, KEY_2, KEY_3, KEY_4,
 153                KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_STOP, KEY_COMPUTER,
 154        },
 155};
 156
 157static struct resource keysc_resources[] = {
 158        [0] = {
 159                .name   = "KEYSC",
 160                .start  = 0xe61b0000,
 161                .end    = 0xe61b000f,
 162                .flags  = IORESOURCE_MEM,
 163        },
 164        [1] = {
 165                .start  = evt2irq(0xbe0), /* KEYSC_KEY */
 166                .flags  = IORESOURCE_IRQ,
 167        },
 168};
 169
 170static struct platform_device keysc_device = {
 171        .name           = "sh_keysc",
 172        .num_resources  = ARRAY_SIZE(keysc_resources),
 173        .resource       = keysc_resources,
 174        .dev    = {
 175                .platform_data  = &keysc_info,
 176        },
 177};
 178
 179static struct mtd_partition nand_partition_info[] = {
 180        {
 181                .name   = "system",
 182                .offset = 0,
 183                .size   = 64 * 1024 * 1024,
 184        },
 185        {
 186                .name   = "userdata",
 187                .offset = MTDPART_OFS_APPEND,
 188                .size   = 128 * 1024 * 1024,
 189        },
 190        {
 191                .name   = "cache",
 192                .offset = MTDPART_OFS_APPEND,
 193                .size   = 64 * 1024 * 1024,
 194        },
 195};
 196
 197static struct resource nand_flash_resources[] = {
 198        [0] = {
 199                .start  = 0xe6a30000,
 200                .end    = 0xe6a3009b,
 201                .flags  = IORESOURCE_MEM,
 202        }
 203};
 204
 205static struct sh_flctl_platform_data nand_flash_data = {
 206        .parts          = nand_partition_info,
 207        .nr_parts       = ARRAY_SIZE(nand_partition_info),
 208        .flcmncr_val    = QTSEL_E | FCKSEL_E | TYPESEL_SET | NANWF_E
 209                        | SHBUSSEL | SEL_16BIT,
 210};
 211
 212static struct platform_device nand_flash_device = {
 213        .name           = "sh_flctl",
 214        .resource       = nand_flash_resources,
 215        .num_resources  = ARRAY_SIZE(nand_flash_resources),
 216        .dev            = {
 217                .platform_data = &nand_flash_data,
 218        },
 219};
 220
 221static struct resource irda_resources[] = {
 222        [0] = {
 223                .start  = 0xE6D00000,
 224                .end    = 0xE6D01FD4 - 1,
 225                .flags  = IORESOURCE_MEM,
 226        },
 227        [1] = {
 228                .start  = evt2irq(0x480), /* IRDA */
 229                .flags  = IORESOURCE_IRQ,
 230        },
 231};
 232
 233static struct platform_device irda_device = {
 234        .name           = "sh_irda",
 235        .id             = -1,
 236        .resource       = irda_resources,
 237        .num_resources  = ARRAY_SIZE(irda_resources),
 238};
 239
 240static struct platform_device *g3evm_devices[] __initdata = {
 241        &nor_flash_device,
 242        &usb_host_device,
 243        &keysc_device,
 244        &nand_flash_device,
 245        &irda_device,
 246};
 247
 248static void __init g3evm_init(void)
 249{
 250        sh7367_pinmux_init();
 251
 252        /* Lit DS4 LED */
 253        gpio_request(GPIO_PORT22, NULL);
 254        gpio_direction_output(GPIO_PORT22, 1);
 255        gpio_export(GPIO_PORT22, 0);
 256
 257        /* Lit DS8 LED */
 258        gpio_request(GPIO_PORT23, NULL);
 259        gpio_direction_output(GPIO_PORT23, 1);
 260        gpio_export(GPIO_PORT23, 0);
 261
 262        /* Lit DS3 LED */
 263        gpio_request(GPIO_PORT24, NULL);
 264        gpio_direction_output(GPIO_PORT24, 1);
 265        gpio_export(GPIO_PORT24, 0);
 266
 267        /* SCIFA1 */
 268        gpio_request(GPIO_FN_SCIFA1_TXD, NULL);
 269        gpio_request(GPIO_FN_SCIFA1_RXD, NULL);
 270        gpio_request(GPIO_FN_SCIFA1_CTS, NULL);
 271        gpio_request(GPIO_FN_SCIFA1_RTS, NULL);
 272
 273        /* USBHS */
 274        gpio_request(GPIO_FN_VBUS0, NULL);
 275        gpio_request(GPIO_FN_PWEN, NULL);
 276        gpio_request(GPIO_FN_OVCN, NULL);
 277        gpio_request(GPIO_FN_OVCN2, NULL);
 278        gpio_request(GPIO_FN_EXTLP, NULL);
 279        gpio_request(GPIO_FN_IDIN, NULL);
 280
 281        /* setup USB phy */
 282        __raw_writew(0x0300, 0xe605810a);       /* USBCR1 */
 283        __raw_writew(0x00e0, 0xe60581c0);       /* CPFCH */
 284        __raw_writew(0x6010, 0xe60581c6);       /* CGPOSR */
 285        __raw_writew(0x8a0a, 0xe605810c);       /* USBCR2 */
 286
 287        /* KEYSC @ CN7 */
 288        gpio_request(GPIO_FN_PORT42_KEYOUT0, NULL);
 289        gpio_request(GPIO_FN_PORT43_KEYOUT1, NULL);
 290        gpio_request(GPIO_FN_PORT44_KEYOUT2, NULL);
 291        gpio_request(GPIO_FN_PORT45_KEYOUT3, NULL);
 292        gpio_request(GPIO_FN_PORT46_KEYOUT4, NULL);
 293        gpio_request(GPIO_FN_PORT47_KEYOUT5, NULL);
 294        gpio_request(GPIO_FN_PORT48_KEYIN0_PU, NULL);
 295        gpio_request(GPIO_FN_PORT49_KEYIN1_PU, NULL);
 296        gpio_request(GPIO_FN_PORT50_KEYIN2_PU, NULL);
 297        gpio_request(GPIO_FN_PORT55_KEYIN3_PU, NULL);
 298        gpio_request(GPIO_FN_PORT56_KEYIN4_PU, NULL);
 299        gpio_request(GPIO_FN_PORT57_KEYIN5_PU, NULL);
 300        gpio_request(GPIO_FN_PORT58_KEYIN6_PU, NULL);
 301
 302        /* FLCTL */
 303        gpio_request(GPIO_FN_FCE0, NULL);
 304        gpio_request(GPIO_FN_D0_ED0_NAF0, NULL);
 305        gpio_request(GPIO_FN_D1_ED1_NAF1, NULL);
 306        gpio_request(GPIO_FN_D2_ED2_NAF2, NULL);
 307        gpio_request(GPIO_FN_D3_ED3_NAF3, NULL);
 308        gpio_request(GPIO_FN_D4_ED4_NAF4, NULL);
 309        gpio_request(GPIO_FN_D5_ED5_NAF5, NULL);
 310        gpio_request(GPIO_FN_D6_ED6_NAF6, NULL);
 311        gpio_request(GPIO_FN_D7_ED7_NAF7, NULL);
 312        gpio_request(GPIO_FN_D8_ED8_NAF8, NULL);
 313        gpio_request(GPIO_FN_D9_ED9_NAF9, NULL);
 314        gpio_request(GPIO_FN_D10_ED10_NAF10, NULL);
 315        gpio_request(GPIO_FN_D11_ED11_NAF11, NULL);
 316        gpio_request(GPIO_FN_D12_ED12_NAF12, NULL);
 317        gpio_request(GPIO_FN_D13_ED13_NAF13, NULL);
 318        gpio_request(GPIO_FN_D14_ED14_NAF14, NULL);
 319        gpio_request(GPIO_FN_D15_ED15_NAF15, NULL);
 320        gpio_request(GPIO_FN_WE0_XWR0_FWE, NULL);
 321        gpio_request(GPIO_FN_FRB, NULL);
 322        /* FOE, FCDE, FSC on dedicated pins */
 323        __raw_writel(__raw_readl(0xe6158048) & ~(1 << 15), 0xe6158048);
 324
 325        /* IrDA */
 326        gpio_request(GPIO_FN_IRDA_OUT, NULL);
 327        gpio_request(GPIO_FN_IRDA_IN, NULL);
 328        gpio_request(GPIO_FN_IRDA_FIRSEL, NULL);
 329
 330        sh7367_add_standard_devices();
 331
 332        platform_add_devices(g3evm_devices, ARRAY_SIZE(g3evm_devices));
 333}
 334
 335MACHINE_START(G3EVM, "g3evm")
 336        .map_io         = sh7367_map_io,
 337        .init_early     = sh7367_add_early_devices,
 338        .init_irq       = sh7367_init_irq,
 339        .handle_irq     = shmobile_handle_irq_intc,
 340        .init_machine   = g3evm_init,
 341        .timer          = &shmobile_timer,
 342MACHINE_END
 343