]> Pileus Git - ~andy/linux/blobdiff - arch/arm/mach-shmobile/board-kzm9g.c
Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
[~andy/linux] / arch / arm / mach-shmobile / board-kzm9g.c
index 57c391a7550c8328556ff20a6747a9f5f55e9b80..d8e33b682832e8279e06c1e1d27e6825ad638397 100644 (file)
 
 #include <linux/delay.h>
 #include <linux/gpio.h>
+#include <linux/gpio_keys.h>
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/i2c.h>
+#include <linux/i2c/pcf857x.h>
+#include <linux/input.h>
 #include <linux/mmc/host.h>
 #include <linux/mmc/sh_mmcif.h>
+#include <linux/mmc/sh_mobile_sdhi.h>
+#include <linux/mfd/tmio.h>
 #include <linux/platform_device.h>
 #include <linux/smsc911x.h>
 #include <linux/usb/r8a66597.h>
 #include <asm/mach/arch.h>
 #include <video/sh_mobile_lcdc.h>
 
+/*
+ * external GPIO
+ */
+#define GPIO_PCF8575_BASE      (GPIO_NR)
+#define GPIO_PCF8575_PORT10    (GPIO_NR + 8)
+#define GPIO_PCF8575_PORT11    (GPIO_NR + 9)
+#define GPIO_PCF8575_PORT12    (GPIO_NR + 10)
+#define GPIO_PCF8575_PORT13    (GPIO_NR + 11)
+#define GPIO_PCF8575_PORT14    (GPIO_NR + 12)
+#define GPIO_PCF8575_PORT15    (GPIO_NR + 13)
+#define GPIO_PCF8575_PORT16    (GPIO_NR + 14)
+
 /* SMSC 9221 */
 static struct resource smsc9221_resources[] = {
        [0] = {
@@ -183,6 +200,78 @@ static struct platform_device mmc_device = {
        .resource       = sh_mmcif_resources,
 };
 
+/* SDHI */
+static struct sh_mobile_sdhi_info sdhi0_info = {
+       .tmio_flags     = TMIO_MMC_HAS_IDLE_WAIT,
+       .tmio_caps      = MMC_CAP_SD_HIGHSPEED,
+       .tmio_ocr_mask  = MMC_VDD_27_28 | MMC_VDD_28_29,
+};
+
+static struct resource sdhi0_resources[] = {
+       [0] = {
+               .name   = "SDHI0",
+               .start  = 0xee100000,
+               .end    = 0xee1000ff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .name   = SH_MOBILE_SDHI_IRQ_CARD_DETECT,
+               .start  = gic_spi(83),
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .name   = SH_MOBILE_SDHI_IRQ_SDCARD,
+               .start  = gic_spi(84),
+               .flags  = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .name   = SH_MOBILE_SDHI_IRQ_SDIO,
+               .start  = gic_spi(85),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device sdhi0_device = {
+       .name           = "sh_mobile_sdhi",
+       .num_resources  = ARRAY_SIZE(sdhi0_resources),
+       .resource       = sdhi0_resources,
+       .dev    = {
+               .platform_data  = &sdhi0_info,
+       },
+};
+
+/* KEY */
+#define GPIO_KEY(c, g, d) { .code = c, .gpio = g, .desc = d, .active_low = 1 }
+
+static struct gpio_keys_button gpio_buttons[] = {
+       GPIO_KEY(KEY_BACK,      GPIO_PCF8575_PORT10,    "SW3"),
+       GPIO_KEY(KEY_RIGHT,     GPIO_PCF8575_PORT11,    "SW2-R"),
+       GPIO_KEY(KEY_LEFT,      GPIO_PCF8575_PORT12,    "SW2-L"),
+       GPIO_KEY(KEY_ENTER,     GPIO_PCF8575_PORT13,    "SW2-P"),
+       GPIO_KEY(KEY_UP,        GPIO_PCF8575_PORT14,    "SW2-U"),
+       GPIO_KEY(KEY_DOWN,      GPIO_PCF8575_PORT15,    "SW2-D"),
+       GPIO_KEY(KEY_HOME,      GPIO_PCF8575_PORT16,    "SW1"),
+};
+
+static struct gpio_keys_platform_data gpio_key_info = {
+       .buttons        = gpio_buttons,
+       .nbuttons       = ARRAY_SIZE(gpio_buttons),
+       .poll_interval  = 250, /* poling at this point */
+};
+
+static struct platform_device gpio_keys_device = {
+       /* gpio-pcf857x.c driver doesn't support gpio_to_irq() */
+       .name   = "gpio-keys-polled",
+       .dev    = {
+               .platform_data  = &gpio_key_info,
+       },
+};
+
+/* I2C */
+static struct pcf857x_platform_data pcf8575_pdata = {
+       .gpio_base      = GPIO_PCF8575_BASE,
+};
+
 static struct i2c_board_info i2c1_devices[] = {
        {
                I2C_BOARD_INFO("st1232-ts", 0x55),
@@ -190,11 +279,20 @@ static struct i2c_board_info i2c1_devices[] = {
        },
 };
 
+static struct i2c_board_info i2c3_devices[] = {
+       {
+               I2C_BOARD_INFO("pcf8575", 0x20),
+               .platform_data = &pcf8575_pdata,
+       },
+};
+
 static struct platform_device *kzm_devices[] __initdata = {
        &smsc_device,
        &usb_host_device,
        &lcdc_device,
        &mmc_device,
+       &sdhi0_device,
+       &gpio_keys_device,
 };
 
 /*
@@ -316,18 +414,41 @@ static void __init kzm_init(void)
        gpio_request(GPIO_FN_MMCD0_6_PU,        NULL);
        gpio_request(GPIO_FN_MMCD0_7_PU,        NULL);
 
+       /* enable SD */
+       gpio_request(GPIO_FN_SDHIWP0,           NULL);
+       gpio_request(GPIO_FN_SDHICD0,           NULL);
+       gpio_request(GPIO_FN_SDHICMD0,          NULL);
+       gpio_request(GPIO_FN_SDHICLK0,          NULL);
+       gpio_request(GPIO_FN_SDHID0_3,          NULL);
+       gpio_request(GPIO_FN_SDHID0_2,          NULL);
+       gpio_request(GPIO_FN_SDHID0_1,          NULL);
+       gpio_request(GPIO_FN_SDHID0_0,          NULL);
+       gpio_request(GPIO_FN_SDHI0_VCCQ_MC0_ON, NULL);
+       gpio_request(GPIO_PORT15, NULL);
+       gpio_direction_output(GPIO_PORT15, 1); /* power */
+
+       /* I2C 3 */
+       gpio_request(GPIO_FN_PORT27_I2C_SCL3, NULL);
+       gpio_request(GPIO_FN_PORT28_I2C_SDA3, NULL);
+
 #ifdef CONFIG_CACHE_L2X0
        /* Early BRESP enable, Shared attribute override enable, 64K*8way */
        l2x0_init(IOMEM(0xf0100000), 0x40460000, 0x82000fff);
 #endif
 
        i2c_register_board_info(1, i2c1_devices, ARRAY_SIZE(i2c1_devices));
+       i2c_register_board_info(3, i2c3_devices, ARRAY_SIZE(i2c3_devices));
 
        sh73a0_add_standard_devices();
        platform_add_devices(kzm_devices, ARRAY_SIZE(kzm_devices));
 }
 
-MACHINE_START(KZM9G, "kzm9g")
+static const char *kzm9g_boards_compat_dt[] __initdata = {
+       "renesas,kzm9g",
+       NULL,
+};
+
+DT_MACHINE_START(KZM9G_DT, "kzm9g")
        .map_io         = sh73a0_map_io,
        .init_early     = sh73a0_add_early_devices,
        .nr_irqs        = NR_IRQS_LEGACY,
@@ -335,4 +456,5 @@ MACHINE_START(KZM9G, "kzm9g")
        .handle_irq     = gic_handle_irq,
        .init_machine   = kzm_init,
        .timer          = &shmobile_timer,
+       .dt_compat      = kzm9g_boards_compat_dt,
 MACHINE_END