Merge branch 'fix' of git://github.com/ycmiao/pxa-linux into fixes
[pandora-kernel.git] / arch / arm / mach-shmobile / board-ag5evm.c
index 5fde49d..b862e9f 100644 (file)
@@ -59,7 +59,7 @@ static struct resource smsc9220_resources[] = {
                .flags          = IORESOURCE_MEM,
        },
        [1] = {
-               .start          = gic_spi(33), /* PINT1 */
+               .start          = SH73A0_PINT0_IRQ(2), /* PINTA2 */
                .flags          = IORESOURCE_IRQ,
        },
 };
@@ -339,6 +339,18 @@ static struct platform_device mipidsi0_device = {
        },
 };
 
+/* SDHI0 */
+static irqreturn_t ag5evm_sdhi0_gpio_cd(int irq, void *arg)
+{
+       struct device *dev = arg;
+       struct sh_mobile_sdhi_info *info = dev->platform_data;
+       struct tmio_mmc_data *pdata = info->pdata;
+
+       tmio_mmc_cd_wakeup(pdata);
+
+       return IRQ_HANDLED;
+}
+
 static struct sh_mobile_sdhi_info sdhi0_info = {
        .dma_slave_tx   = SHDMA_SLAVE_SDHI0_TX,
        .dma_slave_rx   = SHDMA_SLAVE_SDHI0_RX,
@@ -355,14 +367,17 @@ static struct resource sdhi0_resources[] = {
                .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,
        },
@@ -398,14 +413,17 @@ static struct resource sdhi1_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
+               .name   = SH_MOBILE_SDHI_IRQ_CARD_DETECT,
                .start  = gic_spi(87),
                .flags  = IORESOURCE_IRQ,
        },
        [2] = {
+               .name   = SH_MOBILE_SDHI_IRQ_SDCARD,
                .start  = gic_spi(88),
                .flags  = IORESOURCE_IRQ,
        },
        [3] = {
+               .name   = SH_MOBILE_SDHI_IRQ_SDIO,
                .start  = gic_spi(89),
                .flags  = IORESOURCE_IRQ,
        },
@@ -456,19 +474,6 @@ static void __init ag5evm_map_io(void)
        shmobile_setup_console();
 }
 
-#define PINTC_ADDR     0xe6900000
-#define PINTER0A       (PINTC_ADDR + 0xa0)
-#define PINTCR0A       (PINTC_ADDR + 0xb0)
-
-void __init ag5evm_init_irq(void)
-{
-       sh73a0_init_irq();
-
-       /* setup PINT: enable PINTA2 as active low */
-       __raw_writel(__raw_readl(PINTER0A) | (1<<29), PINTER0A);
-       __raw_writew(__raw_readw(PINTCR0A) | (2<<10), PINTCR0A);
-}
-
 #define DSI0PHYCR      0xe615006c
 
 static void __init ag5evm_init(void)
@@ -510,14 +515,14 @@ static void __init ag5evm_init(void)
        /* enable MMCIF */
        gpio_request(GPIO_FN_MMCCLK0, NULL);
        gpio_request(GPIO_FN_MMCCMD0_PU, NULL);
-       gpio_request(GPIO_FN_MMCD0_0, NULL);
-       gpio_request(GPIO_FN_MMCD0_1, NULL);
-       gpio_request(GPIO_FN_MMCD0_2, NULL);
-       gpio_request(GPIO_FN_MMCD0_3, NULL);
-       gpio_request(GPIO_FN_MMCD0_4, NULL);
-       gpio_request(GPIO_FN_MMCD0_5, NULL);
-       gpio_request(GPIO_FN_MMCD0_6, NULL);
-       gpio_request(GPIO_FN_MMCD0_7, NULL);
+       gpio_request(GPIO_FN_MMCD0_0_PU, NULL);
+       gpio_request(GPIO_FN_MMCD0_1_PU, NULL);
+       gpio_request(GPIO_FN_MMCD0_2_PU, NULL);
+       gpio_request(GPIO_FN_MMCD0_3_PU, NULL);
+       gpio_request(GPIO_FN_MMCD0_4_PU, NULL);
+       gpio_request(GPIO_FN_MMCD0_5_PU, NULL);
+       gpio_request(GPIO_FN_MMCD0_6_PU, NULL);
+       gpio_request(GPIO_FN_MMCD0_7_PU, NULL);
        gpio_request(GPIO_PORT208, NULL); /* Reset */
        gpio_direction_output(GPIO_PORT208, 1);
 
@@ -564,6 +569,13 @@ static void __init ag5evm_init(void)
        gpio_request(GPIO_FN_SDHID0_1, NULL);
        gpio_request(GPIO_FN_SDHID0_0, NULL);
 
+       if (!request_irq(intcs_evt2irq(0x3c0), ag5evm_sdhi0_gpio_cd,
+                        IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
+                        "sdhi0 cd", &sdhi0_device.dev))
+               sdhi0_info.tmio_flags |= TMIO_MMC_HAS_COLD_CD;
+       else
+               pr_warn("Unable to setup SDHI0 GPIO IRQ\n");
+
        /* enable SDHI1 on CN4 [WLAN I/F] */
        gpio_request(GPIO_FN_SDHICLK1, NULL);
        gpio_request(GPIO_FN_SDHICMD1_PU, NULL);
@@ -595,7 +607,7 @@ struct sys_timer ag5evm_timer = {
 
 MACHINE_START(AG5EVM, "ag5evm")
        .map_io         = ag5evm_map_io,
-       .init_irq       = ag5evm_init_irq,
+       .init_irq       = sh73a0_init_irq,
        .handle_irq     = shmobile_handle_irq_gic,
        .init_machine   = ag5evm_init,
        .timer          = &ag5evm_timer,