Merge branch 'sh/sdhi-mfd'
authorPaul Mundt <lethal@linux-sh.org>
Mon, 26 Oct 2009 01:47:44 +0000 (10:47 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Mon, 26 Oct 2009 01:47:44 +0000 (10:47 +0900)
Conflicts:
arch/sh/boards/mach-ecovec24/setup.c
arch/sh/boards/mach-kfr2r09/setup.c

1  2 
arch/sh/boards/mach-ecovec24/setup.c
arch/sh/boards/mach-kfr2r09/setup.c

@@@ -391,43 -376,54 +391,91 @@@ static struct platform_device keysc_dev
        },
  };
  
 +/* TouchScreen */
 +#define IRQ0 32
 +static int ts_get_pendown_state(void)
 +{
 +      int val = 0;
 +      gpio_free(GPIO_FN_INTC_IRQ0);
 +      gpio_request(GPIO_PTZ0, NULL);
 +      gpio_direction_input(GPIO_PTZ0);
 +
 +      val = gpio_get_value(GPIO_PTZ0);
 +
 +      gpio_free(GPIO_PTZ0);
 +      gpio_request(GPIO_FN_INTC_IRQ0, NULL);
 +
 +      return val ? 0 : 1;
 +}
 +
 +static int ts_init(void)
 +{
 +      gpio_request(GPIO_FN_INTC_IRQ0, NULL);
 +      return 0;
 +}
 +
 +struct tsc2007_platform_data tsc2007_info = {
 +      .model                  = 2007,
 +      .x_plate_ohms           = 180,
 +      .get_pendown_state      = ts_get_pendown_state,
 +      .init_platform_hw       = ts_init,
 +};
 +
 +static struct i2c_board_info ts_i2c_clients = {
 +      I2C_BOARD_INFO("tsc2007", 0x48),
 +      .type           = "tsc2007",
 +      .platform_data  = &tsc2007_info,
 +      .irq            = IRQ0,
 +};
 +
+ /* SHDI0 */
+ static struct resource sdhi0_resources[] = {
+       [0] = {
+               .name   = "SDHI0",
+               .start  = 0x04ce0000,
+               .end    = 0x04ce01ff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 101,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device sdhi0_device = {
+       .name           = "sh_mobile_sdhi",
+       .num_resources  = ARRAY_SIZE(sdhi0_resources),
+       .resource       = sdhi0_resources,
+       .id             = 0,
+       .archdata = {
+               .hwblk_id = HWBLK_SDHI0,
+       },
+ };
+ /* SHDI1 */
+ static struct resource sdhi1_resources[] = {
+       [0] = {
+               .name   = "SDHI1",
+               .start  = 0x04cf0000,
+               .end    = 0x04cf01ff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 24,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device sdhi1_device = {
+       .name           = "sh_mobile_sdhi",
+       .num_resources  = ARRAY_SIZE(sdhi1_resources),
+       .resource       = sdhi1_resources,
+       .id             = 1,
+       .archdata = {
+               .hwblk_id = HWBLK_SDHI1,
+       },
+ };
  static struct platform_device *ecovec_devices[] __initdata = {
        &heartbeat_device,
        &nor_flash_device,
@@@ -726,7 -743,7 +804,6 @@@ static int __init devices_setup(void
  }
  device_initcall(devices_setup);
  
--
  static struct sh_machine_vector mv_ecovec __initmv = {
        .mv_name        = "R0P7724 (EcoVec)",
  };
@@@ -214,131 -212,34 +214,154 @@@ static struct platform_device kfr2r09_u
        .resource       = kfr2r09_usb0_gadget_resources,
  };
  
 +static struct sh_mobile_ceu_info sh_mobile_ceu_info = {
 +      .flags = SH_CEU_FLAG_USE_8BIT_BUS,
 +};
 +
 +static struct resource kfr2r09_ceu_resources[] = {
 +      [0] = {
 +              .name   = "CEU",
 +              .start  = 0xfe910000,
 +              .end    = 0xfe91009f,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +      [1] = {
 +              .start  = 52,
 +              .end  = 52,
 +              .flags  = IORESOURCE_IRQ,
 +      },
 +      [2] = {
 +              /* place holder for contiguous memory */
 +      },
 +};
 +
 +static struct platform_device kfr2r09_ceu_device = {
 +      .name           = "sh_mobile_ceu",
 +      .id             = 0, /* "ceu0" clock */
 +      .num_resources  = ARRAY_SIZE(kfr2r09_ceu_resources),
 +      .resource       = kfr2r09_ceu_resources,
 +      .dev    = {
 +              .platform_data  = &sh_mobile_ceu_info,
 +      },
 +      .archdata = {
 +              .hwblk_id = HWBLK_CEU0,
 +      },
 +};
 +
 +static struct i2c_board_info kfr2r09_i2c_camera = {
 +      I2C_BOARD_INFO("rj54n1cb0c", 0x50),
 +};
 +
 +static struct clk *camera_clk;
 +
 +#define DRVCRB 0xA405018C
 +static int camera_power(struct device *dev, int mode)
 +{
 +      int ret;
 +
 +      if (mode) {
 +              long rate;
 +
 +              camera_clk = clk_get(NULL, "video_clk");
 +              if (IS_ERR(camera_clk))
 +                      return PTR_ERR(camera_clk);
 +
 +              /* set VIO_CKO clock to 25MHz */
 +              rate = clk_round_rate(camera_clk, 25000000);
 +              ret = clk_set_rate(camera_clk, rate);
 +              if (ret < 0)
 +                      goto eclkrate;
 +
 +              /* set DRVCRB
 +               *
 +               * use 1.8 V for VccQ_VIO
 +               * use 2.85V for VccQ_SR
 +               */
 +              ctrl_outw((ctrl_inw(DRVCRB) & ~0x0003) | 0x0001, DRVCRB);
 +
 +              /* reset clear */
 +              ret = gpio_request(GPIO_PTB4, NULL);
 +              if (ret < 0)
 +                      goto eptb4;
 +              ret = gpio_request(GPIO_PTB7, NULL);
 +              if (ret < 0)
 +                      goto eptb7;
 +
 +              ret = gpio_direction_output(GPIO_PTB4, 1);
 +              if (!ret)
 +                      ret = gpio_direction_output(GPIO_PTB7, 1);
 +              if (ret < 0)
 +                      goto egpioout;
 +              msleep(1);
 +
 +              ret = clk_enable(camera_clk);   /* start VIO_CKO */
 +              if (ret < 0)
 +                      goto eclkon;
 +
 +              return 0;
 +      }
 +
 +      ret = 0;
 +
 +      clk_disable(camera_clk);
 +eclkon:
 +      gpio_set_value(GPIO_PTB7, 0);
 +egpioout:
 +      gpio_set_value(GPIO_PTB4, 0);
 +      gpio_free(GPIO_PTB7);
 +eptb7:
 +      gpio_free(GPIO_PTB4);
 +eptb4:
 +eclkrate:
 +      clk_put(camera_clk);
 +      return ret;
 +}
 +
 +static struct soc_camera_link rj54n1_link = {
 +      .power          = camera_power,
 +      .board_info     = &kfr2r09_i2c_camera,
 +      .i2c_adapter_id = 1,
 +      .module_name    = "rj54n1cb0c",
 +};
 +
 +static struct platform_device kfr2r09_camera = {
 +      .name   = "soc-camera-pdrv",
 +      .id     = 0,
 +      .dev    = {
 +              .platform_data = &rj54n1_link,
 +      },
 +};
 +
+ static struct resource kfr2r09_sh_sdhi0_resources[] = {
+       [0] = {
+               .name   = "SDHI0",
+               .start  = 0x04ce0000,
+               .end    = 0x04ce01ff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 101,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device kfr2r09_sh_sdhi0_device = {
+       .name           = "sh_mobile_sdhi",
+       .num_resources  = ARRAY_SIZE(kfr2r09_sh_sdhi0_resources),
+       .resource       = kfr2r09_sh_sdhi0_resources,
+       .archdata = {
+               .hwblk_id = HWBLK_SDHI0,
+       },
+ };
  static struct platform_device *kfr2r09_devices[] __initdata = {
        &kfr2r09_nor_flash_device,
        &kfr2r09_nand_flash_device,
        &kfr2r09_sh_keysc_device,
        &kfr2r09_sh_lcdc_device,
 +      &kfr2r09_ceu_device,
 +      &kfr2r09_camera,
+       &kfr2r09_sh_sdhi0_device,
  };
  
  #define BSC_CS0BCR 0xfec10004
@@@ -483,23 -384,16 +506,33 @@@ static int __init kfr2r09_devices_setup
        if (kfr2r09_usb0_gadget_setup() == 0)
                platform_device_register(&kfr2r09_usb0_gadget_device);
  
 +      /* CEU */
 +      gpio_request(GPIO_FN_VIO_CKO, NULL);
 +      gpio_request(GPIO_FN_VIO0_CLK, NULL);
 +      gpio_request(GPIO_FN_VIO0_VD, NULL);
 +      gpio_request(GPIO_FN_VIO0_HD, NULL);
 +      gpio_request(GPIO_FN_VIO0_FLD, NULL);
 +      gpio_request(GPIO_FN_VIO0_D7, NULL);
 +      gpio_request(GPIO_FN_VIO0_D6, NULL);
 +      gpio_request(GPIO_FN_VIO0_D5, NULL);
 +      gpio_request(GPIO_FN_VIO0_D4, NULL);
 +      gpio_request(GPIO_FN_VIO0_D3, NULL);
 +      gpio_request(GPIO_FN_VIO0_D2, NULL);
 +      gpio_request(GPIO_FN_VIO0_D1, NULL);
 +      gpio_request(GPIO_FN_VIO0_D0, NULL);
 +
 +      platform_resource_setup_memory(&kfr2r09_ceu_device, "ceu", 4 << 20);
 +
+       /* SDHI0 connected to yc304 */
+       gpio_request(GPIO_FN_SDHI0CD, NULL);
+       gpio_request(GPIO_FN_SDHI0WP, NULL);
+       gpio_request(GPIO_FN_SDHI0D3, NULL);
+       gpio_request(GPIO_FN_SDHI0D2, NULL);
+       gpio_request(GPIO_FN_SDHI0D1, NULL);
+       gpio_request(GPIO_FN_SDHI0D0, NULL);
+       gpio_request(GPIO_FN_SDHI0CMD, NULL);
+       gpio_request(GPIO_FN_SDHI0CLK, NULL);
        return platform_add_devices(kfr2r09_devices,
                                    ARRAY_SIZE(kfr2r09_devices));
  }