|
@@ -394,3 +394,178 @@ static struct sh_mobile_lcdc_info lcdc_info = {
|
|
|
.width = 152,
|
|
|
.height = 91,
|
|
|
},
|
|
|
+ .bl_info = {
|
|
|
+ .name = "sh_mobile_lcdc_bl",
|
|
|
+ .max_brightness = 1,
|
|
|
+ .set_brightness = mackerel_set_brightness,
|
|
|
+ },
|
|
|
+ .meram_cfg = &lcd_meram_cfg,
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource lcdc_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "LCDC",
|
|
|
+ .start = 0xfe940000,
|
|
|
+ .end = 0xfe943fff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .start = intcs_evt2irq(0x580),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device lcdc_device = {
|
|
|
+ .name = "sh_mobile_lcdc_fb",
|
|
|
+ .num_resources = ARRAY_SIZE(lcdc_resources),
|
|
|
+ .resource = lcdc_resources,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &lcdc_info,
|
|
|
+ .coherent_dma_mask = ~0,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+/* HDMI */
|
|
|
+static struct sh_mobile_hdmi_info hdmi_info = {
|
|
|
+ .flags = HDMI_SND_SRC_SPDIF,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource hdmi_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "HDMI",
|
|
|
+ .start = 0xe6be0000,
|
|
|
+ .end = 0xe6be00ff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ /* There's also an HDMI interrupt on INTCS @ 0x18e0 */
|
|
|
+ .start = evt2irq(0x17e0),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device hdmi_device = {
|
|
|
+ .name = "sh-mobile-hdmi",
|
|
|
+ .num_resources = ARRAY_SIZE(hdmi_resources),
|
|
|
+ .resource = hdmi_resources,
|
|
|
+ .id = -1,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &hdmi_info,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static const struct sh_mobile_meram_cfg hdmi_meram_cfg = {
|
|
|
+ .icb[0] = {
|
|
|
+ .meram_size = 0x100,
|
|
|
+ },
|
|
|
+ .icb[1] = {
|
|
|
+ .meram_size = 0x100,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct sh_mobile_lcdc_info hdmi_lcdc_info = {
|
|
|
+ .meram_dev = &mackerel_meram_info,
|
|
|
+ .clock_source = LCDC_CLK_EXTERNAL,
|
|
|
+ .ch[0] = {
|
|
|
+ .chan = LCDC_CHAN_MAINLCD,
|
|
|
+ .fourcc = V4L2_PIX_FMT_RGB565,
|
|
|
+ .interface_type = RGB24,
|
|
|
+ .clock_divider = 1,
|
|
|
+ .flags = LCDC_FLAGS_DWPOL,
|
|
|
+ .meram_cfg = &hdmi_meram_cfg,
|
|
|
+ .tx_dev = &hdmi_device,
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource hdmi_lcdc_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "LCDC1",
|
|
|
+ .start = 0xfe944000,
|
|
|
+ .end = 0xfe947fff,
|
|
|
+ .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,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct asoc_simple_dai_init_info fsi2_hdmi_init_info = {
|
|
|
+ .cpu_daifmt = SND_SOC_DAIFMT_CBM_CFM,
|
|
|
+};
|
|
|
+
|
|
|
+static struct asoc_simple_card_info fsi2_hdmi_info = {
|
|
|
+ .name = "HDMI",
|
|
|
+ .card = "FSI2B-HDMI",
|
|
|
+ .cpu_dai = "fsib-dai",
|
|
|
+ .codec = "sh-mobile-hdmi",
|
|
|
+ .platform = "sh_fsi2",
|
|
|
+ .codec_dai = "sh_mobile_hdmi-hifi",
|
|
|
+ .init = &fsi2_hdmi_init_info,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device fsi_hdmi_device = {
|
|
|
+ .name = "asoc-simple-card",
|
|
|
+ .id = 1,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &fsi2_hdmi_info,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static void __init hdmi_init_pm_clock(void)
|
|
|
+{
|
|
|
+ struct clk *hdmi_ick = clk_get(&hdmi_device.dev, "ick");
|
|
|
+ int ret;
|
|
|
+ long rate;
|
|
|
+
|
|
|
+ if (IS_ERR(hdmi_ick)) {
|
|
|
+ ret = PTR_ERR(hdmi_ick);
|
|
|
+ pr_err("Cannot get HDMI ICK: %d\n", ret);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = clk_set_parent(&sh7372_pllc2_clk, &sh7372_dv_clki_div2_clk);
|
|
|
+ if (ret < 0) {
|
|
|
+ pr_err("Cannot set PLLC2 parent: %d, %d users\n",
|
|
|
+ ret, sh7372_pllc2_clk.usecount);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ pr_debug("PLLC2 initial frequency %lu\n",
|
|
|
+ clk_get_rate(&sh7372_pllc2_clk));
|
|
|
+
|
|
|
+ rate = clk_round_rate(&sh7372_pllc2_clk, 594000000);
|
|
|
+ if (rate < 0) {
|
|
|
+ pr_err("Cannot get suitable rate: %ld\n", rate);
|
|
|
+ ret = rate;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = clk_set_rate(&sh7372_pllc2_clk, rate);
|
|
|
+ if (ret < 0) {
|
|
|
+ pr_err("Cannot set rate %ld: %d\n", rate, ret);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ pr_debug("PLLC2 set frequency %lu\n", rate);
|
|
|
+
|
|
|
+ ret = clk_set_parent(hdmi_ick, &sh7372_pllc2_clk);
|
|
|
+ if (ret < 0)
|
|
|
+ pr_err("Cannot set HDMI parent: %d\n", ret);
|
|
|
+
|
|
|
+out:
|
|
|
+ if (!IS_ERR(hdmi_ick))
|
|
|
+ clk_put(hdmi_ick);
|
|
|
+}
|