|
@@ -1198,3 +1198,157 @@ static void __init ap4evb_init(void)
|
|
|
|
|
|
/* setup FSI2 port B (HDMI) */
|
|
|
gpio_request(GPIO_FN_FSIBCK, NULL);
|
|
|
+ __raw_writew(__raw_readw(USCCR1) & ~(1 << 6), USCCR1); /* use SPDIF */
|
|
|
+
|
|
|
+ /* set SPU2 clock to 119.6 MHz */
|
|
|
+ clk = clk_get(NULL, "spu_clk");
|
|
|
+ if (!IS_ERR(clk)) {
|
|
|
+ clk_set_rate(clk, clk_round_rate(clk, 119600000));
|
|
|
+ clk_put(clk);
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * set irq priority, to avoid sound chopping
|
|
|
+ * when NFS rootfs is used
|
|
|
+ * FSI(3) > SMSC911X(2)
|
|
|
+ */
|
|
|
+ intc_set_priority(IRQ_FSI, 3);
|
|
|
+
|
|
|
+ i2c_register_board_info(0, i2c0_devices,
|
|
|
+ ARRAY_SIZE(i2c0_devices));
|
|
|
+
|
|
|
+ i2c_register_board_info(1, i2c1_devices,
|
|
|
+ ARRAY_SIZE(i2c1_devices));
|
|
|
+
|
|
|
+#ifdef CONFIG_AP4EVB_QHD
|
|
|
+
|
|
|
+ /*
|
|
|
+ * For QHD Panel (MIPI-DSI, CONFIG_AP4EVB_QHD=y) and
|
|
|
+ * IRQ28 for Touch Panel, set dip switches S3, S43 as OFF, ON.
|
|
|
+ */
|
|
|
+
|
|
|
+ /* enable KEYSC */
|
|
|
+ gpio_request(GPIO_FN_KEYOUT0, NULL);
|
|
|
+ gpio_request(GPIO_FN_KEYOUT1, NULL);
|
|
|
+ gpio_request(GPIO_FN_KEYOUT2, NULL);
|
|
|
+ gpio_request(GPIO_FN_KEYOUT3, NULL);
|
|
|
+ gpio_request(GPIO_FN_KEYOUT4, NULL);
|
|
|
+ gpio_request(GPIO_FN_KEYIN0_136, NULL);
|
|
|
+ gpio_request(GPIO_FN_KEYIN1_135, NULL);
|
|
|
+ gpio_request(GPIO_FN_KEYIN2_134, NULL);
|
|
|
+ gpio_request(GPIO_FN_KEYIN3_133, NULL);
|
|
|
+ gpio_request(GPIO_FN_KEYIN4, NULL);
|
|
|
+
|
|
|
+ /* enable TouchScreen */
|
|
|
+ irq_set_irq_type(IRQ28, IRQ_TYPE_LEVEL_LOW);
|
|
|
+
|
|
|
+ tsc_device.irq = IRQ28;
|
|
|
+ i2c_register_board_info(1, &tsc_device, 1);
|
|
|
+
|
|
|
+ /* LCDC0 */
|
|
|
+ lcdc_info.clock_source = LCDC_CLK_PERIPHERAL;
|
|
|
+ lcdc_info.ch[0].interface_type = RGB24;
|
|
|
+ lcdc_info.ch[0].clock_divider = 1;
|
|
|
+ lcdc_info.ch[0].flags = LCDC_FLAGS_DWPOL;
|
|
|
+ lcdc_info.ch[0].panel_cfg.width = 44;
|
|
|
+ lcdc_info.ch[0].panel_cfg.height = 79;
|
|
|
+
|
|
|
+ platform_add_devices(qhd_devices, ARRAY_SIZE(qhd_devices));
|
|
|
+
|
|
|
+#else
|
|
|
+ /*
|
|
|
+ * For WVGA Panel (18-bit RGB, CONFIG_AP4EVB_WVGA=y) and
|
|
|
+ * IRQ7 for Touch Panel, set dip switches S3, S43 to ON, OFF.
|
|
|
+ */
|
|
|
+
|
|
|
+ gpio_request(GPIO_FN_LCDD17, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD16, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD15, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD14, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD13, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD12, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD11, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD10, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD9, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD8, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD7, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD6, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD5, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD4, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD3, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD2, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD1, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDD0, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDDISP, NULL);
|
|
|
+ gpio_request(GPIO_FN_LCDDCK, NULL);
|
|
|
+
|
|
|
+ gpio_request(GPIO_PORT189, NULL); /* backlight */
|
|
|
+ gpio_direction_output(GPIO_PORT189, 1);
|
|
|
+
|
|
|
+ gpio_request(GPIO_PORT151, NULL); /* LCDDON */
|
|
|
+ gpio_direction_output(GPIO_PORT151, 1);
|
|
|
+
|
|
|
+ lcdc_info.clock_source = LCDC_CLK_BUS;
|
|
|
+ lcdc_info.ch[0].interface_type = RGB18;
|
|
|
+ lcdc_info.ch[0].clock_divider = 3;
|
|
|
+ lcdc_info.ch[0].flags = 0;
|
|
|
+ lcdc_info.ch[0].panel_cfg.width = 152;
|
|
|
+ lcdc_info.ch[0].panel_cfg.height = 91;
|
|
|
+
|
|
|
+ /* enable TouchScreen */
|
|
|
+ irq_set_irq_type(IRQ7, IRQ_TYPE_LEVEL_LOW);
|
|
|
+
|
|
|
+ tsc_device.irq = IRQ7;
|
|
|
+ i2c_register_board_info(0, &tsc_device, 1);
|
|
|
+#endif /* CONFIG_AP4EVB_QHD */
|
|
|
+
|
|
|
+ /* CEU */
|
|
|
+
|
|
|
+ /*
|
|
|
+ * TODO: reserve memory for V4L2 DMA buffers, when a suitable API
|
|
|
+ * becomes available
|
|
|
+ */
|
|
|
+
|
|
|
+ /* MIPI-CSI stuff */
|
|
|
+ gpio_request(GPIO_FN_VIO_CKO, NULL);
|
|
|
+
|
|
|
+ clk = clk_get(NULL, "vck1_clk");
|
|
|
+ if (!IS_ERR(clk)) {
|
|
|
+ clk_set_rate(clk, clk_round_rate(clk, 13000000));
|
|
|
+ clk_enable(clk);
|
|
|
+ clk_put(clk);
|
|
|
+ }
|
|
|
+
|
|
|
+ sh7372_add_standard_devices();
|
|
|
+
|
|
|
+ /* HDMI */
|
|
|
+ gpio_request(GPIO_FN_HDMI_HPD, NULL);
|
|
|
+ gpio_request(GPIO_FN_HDMI_CEC, NULL);
|
|
|
+
|
|
|
+ /* Reset HDMI, must be held at least one EXTALR (32768Hz) period */
|
|
|
+#define SRCR4 IOMEM(0xe61580bc)
|
|
|
+ srcr4 = __raw_readl(SRCR4);
|
|
|
+ __raw_writel(srcr4 | (1 << 13), SRCR4);
|
|
|
+ udelay(50);
|
|
|
+ __raw_writel(srcr4 & ~(1 << 13), SRCR4);
|
|
|
+
|
|
|
+ platform_add_devices(ap4evb_devices, ARRAY_SIZE(ap4evb_devices));
|
|
|
+
|
|
|
+ rmobile_add_devices_to_domains(domain_devices,
|
|
|
+ ARRAY_SIZE(domain_devices));
|
|
|
+
|
|
|
+ hdmi_init_pm_clock();
|
|
|
+ sh7372_pm_init();
|
|
|
+ pm_clk_add(&fsi_device.dev, "spu2");
|
|
|
+ pm_clk_add(&lcdc1_device.dev, "hdmi");
|
|
|
+}
|
|
|
+
|
|
|
+MACHINE_START(AP4EVB, "ap4evb")
|
|
|
+ .map_io = sh7372_map_io,
|
|
|
+ .init_early = sh7372_add_early_devices,
|
|
|
+ .init_irq = sh7372_init_irq,
|
|
|
+ .handle_irq = shmobile_handle_irq_intc,
|
|
|
+ .init_machine = ap4evb_init,
|
|
|
+ .init_late = sh7372_pm_init_late,
|
|
|
+ .timer = &shmobile_timer,
|
|
|
+MACHINE_END
|