lk: display: Add video mode splash screen display for 8x10
With this patch we are enabling splash screen for 8x10.
Change-Id: I5498c72f7925b414bc57fc26b0b6360b648bfec5
diff --git a/target/msm8610/target_display.c b/target/msm8610/target_display.c
new file mode 100644
index 0000000..4904848
--- /dev/null
+++ b/target/msm8610/target_display.c
@@ -0,0 +1,208 @@
+/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <debug.h>
+#include <smem.h>
+#include <msm_panel.h>
+#include <pm8x41.h>
+#include <pm8x41_wled.h>
+#include <board.h>
+#include <platform/gpio.h>
+#include <platform/iomap.h>
+#include <target/display.h>
+
+static struct msm_fb_panel_data panel;
+static uint8_t display_enable;
+
+extern int msm_display_init(struct msm_fb_panel_data *pdata);
+extern int msm_display_off();
+extern void dsi_phy_init(struct msm_panel_info *pinfo);
+
+static int msm8610_backlight(uint8_t enable)
+{
+ struct pm8x41_mpp mpp;
+ mpp.base = PM8x41_MMP3_BASE;
+ mpp.mode = MPP_HIGH;
+ mpp.vin = MPP_VIN3;
+ if (enable)
+ {
+ pm8x41_config_output_mpp(&mpp);
+ pm8x41_enable_mpp(&mpp, MPP_ENABLE);
+ } else {
+ pm8x41_enable_mpp(&mpp, MPP_DISABLE);
+ }
+ /* Need delay before power on regulators */
+ mdelay(20);
+ return 0;
+}
+
+void dsi_calc_clk_rate(uint32_t *dsiclk_rate, uint32_t *byteclk_rate)
+{
+ uint32_t hbp, hfp, vbp, vfp, hspw, vspw, width, height;
+ uint32_t bitclk_rate;
+ int frame_rate, lanes;
+
+ width = panel.panel_info.xres;
+ height = panel.panel_info.yres;
+ hbp = panel.panel_info.lcdc.h_back_porch;
+ hfp = panel.panel_info.lcdc.h_front_porch;
+ hspw = panel.panel_info.lcdc.h_pulse_width;
+ vbp = panel.panel_info.lcdc.v_back_porch;
+ vfp = panel.panel_info.lcdc.v_front_porch;
+ vspw = panel.panel_info.lcdc.v_pulse_width;
+ lanes = panel.panel_info.mipi.num_of_lanes;
+ frame_rate = panel.panel_info.mipi.frame_rate;
+
+ bitclk_rate = (width + hbp + hfp + hspw) * (height + vbp + vfp + vspw);
+ bitclk_rate *= frame_rate;
+ bitclk_rate *= panel.panel_info.bpp;
+ bitclk_rate /= lanes;
+
+ *byteclk_rate = bitclk_rate / 8;
+ *dsiclk_rate = *byteclk_rate * lanes;
+}
+
+static int msm8610_mdss_dsi_panel_clock(uint8_t enable)
+{
+ uint32_t dsiclk_rate, byteclk_rate;
+
+ if (enable)
+ {
+ mdp_clock_enable();
+ dsi_calc_clk_rate(&dsiclk_rate, &byteclk_rate);
+ dsi_clock_enable(dsiclk_rate, byteclk_rate);
+ } else if(!target_cont_splash_screen()) {
+ dsi_clock_disable();
+ mdp_clock_disable();
+ }
+
+ return 0;
+}
+
+static void msm8610_mdss_mipi_panel_reset(int enable)
+{
+ dprintf(SPEW, "msm8610_mdss_mipi_panel_reset, enable = %d\n", enable);
+
+ if (enable)
+ {
+ gpio_tlmm_config(41, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_8MA, GPIO_DISABLE);
+ gpio_tlmm_config(7, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_8MA, GPIO_DISABLE);
+
+ /* reset */
+ gpio_set(41, 2);
+ mdelay(20);
+ gpio_set(41, 0);
+ udelay(20);
+ gpio_set(41, 2);
+ mdelay(20);
+
+ if (panel.panel_info.type == MIPI_VIDEO_PANEL)
+ gpio_set(7, 2);
+ else if (panel.panel_info.type == MIPI_CMD_PANEL)
+ gpio_set(7, 0);
+ } else if(!target_cont_splash_screen()) {
+ gpio_set(7, 0);
+ gpio_set(41, 0);
+ }
+ return;
+}
+
+static int msm8610_mipi_panel_power(uint8_t enable)
+{
+ int ret;
+ struct pm8x41_ldo ldo4 = LDO(PM8x41_LDO4, NLDO_TYPE);
+ struct pm8x41_ldo ldo14 = LDO(PM8x41_LDO14, PLDO_TYPE);
+ struct pm8x41_ldo ldo19 = LDO(PM8x41_LDO19, PLDO_TYPE);
+
+ dprintf(SPEW, "msm8610_mipi_panel_power, enable = %d\n", enable);
+ if (enable)
+ {
+ /* backlight */
+ msm8610_backlight(enable);
+
+ /* regulators */
+ pm8x41_ldo_set_voltage(&ldo14, 1800000);
+ pm8x41_ldo_control(&ldo14, enable);
+ pm8x41_ldo_set_voltage(&ldo19, 2850000);
+ pm8x41_ldo_control(&ldo19, enable);
+ pm8x41_ldo_set_voltage(&ldo4, 1200000);
+ pm8x41_ldo_control(&ldo4, enable);
+
+ /* reset */
+ msm8610_mdss_mipi_panel_reset(enable);
+ } else if(!target_cont_splash_screen()) {
+ msm8610_backlight(0);
+ msm8610_mdss_mipi_panel_reset(enable);
+
+ pm8x41_ldo_control(&ldo19, enable);
+ pm8x41_ldo_control(&ldo14, enable);
+ pm8x41_ldo_control(&ldo4, enable);
+ }
+ return 0;
+}
+
+void display_init(void)
+{
+ uint32_t hw_id = board_hardware_id();
+
+ dprintf(SPEW, "display_init(),target_id=%d.\n", hw_id);
+
+ switch (hw_id) {
+ case HW_PLATFORM_QRD:
+ case HW_PLATFORM_MTP:
+ case HW_PLATFORM_SURF:
+ mipi_truly_video_wvga_init(&(panel.panel_info));
+ panel.clk_func = msm8610_mdss_dsi_panel_clock;
+ panel.power_func = msm8610_mipi_panel_power;
+ panel.fb.base = MIPI_FB_ADDR;
+ panel.fb.width = panel.panel_info.xres;
+ panel.fb.height = panel.panel_info.yres;
+ panel.fb.stride = panel.panel_info.xres;
+ panel.fb.bpp = panel.panel_info.bpp;
+ panel.fb.format = FB_FORMAT_RGB888;
+ panel.mdp_rev = MDP_REV_304;
+ break;
+ default:
+ return;
+ };
+
+ if (msm_display_init(&panel))
+ {
+ dprintf(CRITICAL, "Display init failed!\n");
+ return;
+ }
+
+ display_enable = 1;
+}
+
+void display_shutdown(void)
+{
+ if (display_enable)
+ msm_display_off();
+}