|
@@ -482,3 +482,187 @@ static const struct fb_videomode lcdc1_mode = {
|
|
|
|
|
|
static struct sh_mobile_lcdc_info hdmi_lcdc_info = {
|
|
|
.clock_source = LCDC_CLK_PERIPHERAL, /* HDMI clock */
|
|
|
+ .ch[0] = {
|
|
|
+ .chan = LCDC_CHAN_MAINLCD,
|
|
|
+ .fourcc = V4L2_PIX_FMT_RGB565,
|
|
|
+ .interface_type = RGB24,
|
|
|
+ .clock_divider = 1,
|
|
|
+ .flags = LCDC_FLAGS_DWPOL,
|
|
|
+ .lcd_modes = &lcdc1_mode,
|
|
|
+ .num_modes = 1,
|
|
|
+ .tx_dev = &hdmi_device,
|
|
|
+ .panel_cfg = {
|
|
|
+ .width = 1280,
|
|
|
+ .height = 720,
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource hdmi_lcdc_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "LCDC1",
|
|
|
+ .start = 0xfe944000,
|
|
|
+ .end = 0xfe948000 - 1,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .start = intcs_evt2irq(0x1780),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device hdmi_lcdc_device = {
|
|
|
+ .name = "sh_mobile_lcdc_fb",
|
|
|
+ .num_resources = ARRAY_SIZE(hdmi_lcdc_resources),
|
|
|
+ .resource = hdmi_lcdc_resources,
|
|
|
+ .id = 1,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &hdmi_lcdc_info,
|
|
|
+ .coherent_dma_mask = ~0,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+/* GPIO KEY */
|
|
|
+#define GPIO_KEY(c, g, d, ...) \
|
|
|
+ { .code = c, .gpio = g, .desc = d, .active_low = 1, __VA_ARGS__ }
|
|
|
+
|
|
|
+static struct gpio_keys_button gpio_buttons[] = {
|
|
|
+ GPIO_KEY(KEY_POWER, GPIO_PORT99, "SW3", .wakeup = 1),
|
|
|
+ GPIO_KEY(KEY_BACK, GPIO_PORT100, "SW4"),
|
|
|
+ GPIO_KEY(KEY_MENU, GPIO_PORT97, "SW5"),
|
|
|
+ GPIO_KEY(KEY_HOME, GPIO_PORT98, "SW6"),
|
|
|
+};
|
|
|
+
|
|
|
+static struct gpio_keys_platform_data gpio_key_info = {
|
|
|
+ .buttons = gpio_buttons,
|
|
|
+ .nbuttons = ARRAY_SIZE(gpio_buttons),
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device gpio_keys_device = {
|
|
|
+ .name = "gpio-keys",
|
|
|
+ .id = -1,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &gpio_key_info,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+/* Fixed 3.3V regulator to be used by SDHI0, SDHI1, MMCIF */
|
|
|
+static struct regulator_consumer_supply fixed3v3_power_consumers[] =
|
|
|
+{
|
|
|
+ REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
|
|
|
+ REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
|
|
|
+ REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"),
|
|
|
+ REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"),
|
|
|
+ REGULATOR_SUPPLY("vmmc", "sh_mmcif"),
|
|
|
+ REGULATOR_SUPPLY("vqmmc", "sh_mmcif"),
|
|
|
+};
|
|
|
+
|
|
|
+/* SDHI0 */
|
|
|
+/*
|
|
|
+ * FIXME
|
|
|
+ *
|
|
|
+ * It use polling mode here, since
|
|
|
+ * CD (= Card Detect) pin is not connected to SDHI0_CD.
|
|
|
+ * We can use IRQ31 as card detect irq,
|
|
|
+ * but it needs chattering removal operation
|
|
|
+ */
|
|
|
+#define IRQ31 evt2irq(0x33E0)
|
|
|
+static struct sh_mobile_sdhi_info sdhi0_info = {
|
|
|
+ .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
|
|
|
+ .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
|
|
|
+ .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |\
|
|
|
+ MMC_CAP_NEEDS_POLL,
|
|
|
+ .tmio_ocr_mask = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,
|
|
|
+ .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource sdhi0_resources[] = {
|
|
|
+ {
|
|
|
+ .name = "SDHI0",
|
|
|
+ .start = 0xe6850000,
|
|
|
+ .end = 0xe6850100 - 1,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ /*
|
|
|
+ * no SH_MOBILE_SDHI_IRQ_CARD_DETECT here
|
|
|
+ */
|
|
|
+ {
|
|
|
+ .name = SH_MOBILE_SDHI_IRQ_SDCARD,
|
|
|
+ .start = evt2irq(0x0E20),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = SH_MOBILE_SDHI_IRQ_SDIO,
|
|
|
+ .start = evt2irq(0x0E40),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device sdhi0_device = {
|
|
|
+ .name = "sh_mobile_sdhi",
|
|
|
+ .id = 0,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &sdhi0_info,
|
|
|
+ },
|
|
|
+ .num_resources = ARRAY_SIZE(sdhi0_resources),
|
|
|
+ .resource = sdhi0_resources,
|
|
|
+};
|
|
|
+
|
|
|
+/* SDHI1 */
|
|
|
+static struct sh_mobile_sdhi_info sdhi1_info = {
|
|
|
+ .dma_slave_tx = SHDMA_SLAVE_SDHI1_TX,
|
|
|
+ .dma_slave_rx = SHDMA_SLAVE_SDHI1_RX,
|
|
|
+ .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ,
|
|
|
+ .tmio_ocr_mask = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,
|
|
|
+ .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource sdhi1_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "SDHI1",
|
|
|
+ .start = 0xe6860000,
|
|
|
+ .end = 0xe6860100 - 1,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .start = evt2irq(0x0E80),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+ [2] = {
|
|
|
+ .start = evt2irq(0x0EA0),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+ [3] = {
|
|
|
+ .start = evt2irq(0x0EC0),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device sdhi1_device = {
|
|
|
+ .name = "sh_mobile_sdhi",
|
|
|
+ .id = 1,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &sdhi1_info,
|
|
|
+ },
|
|
|
+ .num_resources = ARRAY_SIZE(sdhi1_resources),
|
|
|
+ .resource = sdhi1_resources,
|
|
|
+};
|
|
|
+
|
|
|
+/* MMCIF */
|
|
|
+static struct sh_mmcif_plat_data sh_mmcif_plat = {
|
|
|
+ .sup_pclk = 0,
|
|
|
+ .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,
|
|
|
+ .caps = MMC_CAP_4_BIT_DATA |
|
|
|
+ MMC_CAP_8_BIT_DATA |
|
|
|
+ MMC_CAP_NONREMOVABLE,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource sh_mmcif_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "MMCIF",
|
|
|
+ .start = 0xe6bd0000,
|
|
|
+ .end = 0xe6bd0100 - 1,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ /* MMC ERR */
|