void gcdb_display_init(uint32_t rev, void *base) { if (!oem_panel_select(&panelstruct, &(panel.panel_info), &dsi_video_mode_phy_db)) { dprintf(CRITICAL, "Target panel init not found!\n"); return; } init_platform_data(); if (dsi_panel_init(&(panel.panel_info), &panelstruct)) { dprintf(CRITICAL, "DSI panel init failed!\n"); return; } panel.panel_info.mipi.mdss_dsi_phy_db = &dsi_video_mode_phy_db; panel.pll_clk_func = mdss_dsi_panel_clock; panel.power_func = mdss_dsi_panel_power; panel.fb.base = base; 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 = panel.panel_info.mipi.dst_format; panel.mdp_rev = rev; if (msm_display_init(&panel)) { dprintf(CRITICAL, "Display init failed!\n"); return; } display_enable = 1; }
void target_display_init(const char *panel_name) { uint32_t hw_id = board_hardware_id(); uint32_t panel_loop = 0; uint32_t ret = 0; if (target_hw_interposer()) return; panel_name += strspn(panel_name, " "); if ((!strcmp(panel_name, NO_PANEL_CONFIG)) || (!strcmp(panel_name, SIM_VIDEO_PANEL)) || (!strcmp(panel_name, SIM_DUALDSI_VIDEO_PANEL))) { dprintf(INFO, "Selected panel: %s\nSkip panel configuration", panel_name); return; } else if (!strcmp(panel_name, HDMI_PANEL_NAME)) { dprintf(INFO, "%s: HDMI is primary\n", __func__); return; } switch (hw_id) { case HW_PLATFORM_LIQUID: edp_panel_init(&(panel.panel_info)); panel.clk_func = msm8974_mdss_edp_panel_clock; panel.power_func = msm8974_edp_panel_power; panel.fb.base = (void *)EDP_FB_ADDR; panel.fb.format = FB_FORMAT_RGB888; panel.mdp_rev = MDP_REV_50; if (msm_display_init(&panel)) { dprintf(CRITICAL, "edp init failed!\n"); return; } edp_enable = 1; break; default: do { ret = gcdb_display_init(panel_name, MDP_REV_50, MIPI_FB_ADDR); if (!ret || ret == ERR_NOT_SUPPORTED) { break; } else { target_force_cont_splash_disable(true); msm_display_off(); target_force_cont_splash_disable(false); } } while (++panel_loop <= oem_panel_max_auto_detect_panels()); break; } }
void mdss_hdmi_display_init(uint32_t rev, void *base) { mdss_hdmi_panel_init(&(panel.panel_info)); panel.clk_func = mdss_hdmi_panel_clock; panel.power_func = mdss_hdmi_enable_power; 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.fb.base = base; panel.mdp_rev = rev; msm_display_init(&panel); }
int gcdb_display_init(const char *panel_name, uint32_t rev, void *base) { int ret = NO_ERROR; int pan_type; dsi_video_mode_phy_db.pll_type = DSI_PLL_TYPE_28NM; pan_type = oem_panel_select(panel_name, &panelstruct, &(panel.panel_info), &dsi_video_mode_phy_db); if (pan_type == PANEL_TYPE_DSI) { target_dsi_phy_config(&dsi_video_mode_phy_db); mdss_dsi_set_pll_src(); if (dsi_panel_init(&(panel.panel_info), &panelstruct)) { dprintf(CRITICAL, "DSI panel init failed!\n"); ret = ERROR; goto error_gcdb_display_init; } panel.panel_info.mipi.mdss_dsi_phy_db = &dsi_video_mode_phy_db; panel.pll_clk_func = mdss_dsi_panel_clock; panel.dfps_func = mdss_dsi_mipi_dfps_config; panel.power_func = mdss_dsi_panel_power; panel.pre_init_func = mdss_dsi_panel_pre_init; panel.bl_func = mdss_dsi_bl_enable; panel.dsi2HDMI_config = mdss_dsi2HDMI_config; /* * If dfps enabled, reserve fb memory to store pll * codes and pass pll codes values to kernel. */ if (panel.panel_info.dfps.panel_dfps.enabled) { panel.panel_info.dfps.dfps_fb_base = base; base += DFPS_PLL_CODES_SIZE; dprintf(SPEW, "fb_base=0x%p!\n", base); } panel.fb.base = base; 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 = panel.panel_info.mipi.dst_format; } else if (pan_type == PANEL_TYPE_EDP) { mdss_edp_panel_init(&(panel.panel_info)); /* prepare func is set up at edp_panel_init */ panel.clk_func = mdss_edp_panel_clock; panel.power_func = mdss_edp_panel_power; panel.bl_func = mdss_edp_bl_enable; panel.fb.format = FB_FORMAT_RGB888; } else { dprintf(CRITICAL, "Target panel init not found!\n"); ret = ERR_NOT_SUPPORTED; goto error_gcdb_display_init; } panel.fb.base = base; panel.mdp_rev = rev; ret = msm_display_init(&panel); error_gcdb_display_init: display_enable = ret ? 0 : 1; return ret; }
void display_init(void) { unsigned mach_type; mach_type = board_machtype(); dprintf(SPEW, "display_init\n"); switch (mach_type) { case MSM7X27A_SURF: case MSM8X25_SURF: case MSM7X27A_FFA: #if MIPI_VIDEO_MODE mipi_renesas_video_fwvga_init(&(panel.panel_info)); #else mipi_renesas_cmd_fwvga_init(&(panel.panel_info)); #endif panel.clk_func = msm7627a_mdp_clock_init; panel.power_func = mipi_renesas_panel_dsi_config; 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_303; break; case MSM7X25A_SURF: case MSM7X25A_FFA: #if MIPI_VIDEO_MODE mipi_renesas_video_hvga_init(&(panel.panel_info)); #else mipi_renesas_cmd_hvga_init(&(panel.panel_info)); #endif panel.clk_func = msm7627a_mdp_clock_init; panel.power_func = mipi_renesas_panel_dsi_config; 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_303; break; case MSM7X27A_EVB: case MSM8X25_EVB: case MSM8X25_EVT: #if MIPI_VIDEO_MODE mipi_nt35510_video_wvga_init(&(panel.panel_info)); #else mipi_nt35510_cmd_wvga_init(&(panel.panel_info)); #endif panel.clk_func = msm7627a_mdp_clock_init; panel.power_func = mipi_nt35510_panel_dsi_config; 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_303; if (mach_type == MSM8X25_EVT) panel.rotate = 1; break; default: return; }; if (msm_display_init(&panel)) { dprintf(CRITICAL, "Display init failed!\n"); return; } display_enabled = 1; }
static void msm8960_backlight_on(void) { struct pm8921_gpio backlight_pwm = { .direction = PM_GPIO_DIR_OUT, .output_buffer = 0, .output_value = 0, .pull = PM_GPIO_PULL_NO, .vin_sel = 2, .out_strength = PM_GPIO_STRENGTH_HIGH, .function = PM_GPIO_FUNC_1, .inv_int_pol = 0, }; int rc = pm8921_gpio_config(PM_GPIO(24), &backlight_pwm); if (rc) dprintf(CRITICAL, "FAIL pm8921_gpio_config(): rc=%d.\n", rc); } /* Pull DISP_RST_N high to get panel out of reset */ static void msm8960_mipi_panel_reset(void) { struct pm8921_gpio gpio43_param = { .direction = PM_GPIO_DIR_OUT, .output_buffer = 0, .output_value = 1, .pull = PM_GPIO_PULL_UP_30, .vin_sel = 2, .out_strength = PM_GPIO_STRENGTH_HIGH, .function = PM_GPIO_FUNC_PAIRED, .inv_int_pol = 0, .disable_pin = 0, }; pm8921_gpio_config(PM_GPIO(43), &gpio43_param); } static int msm8960_mipi_panel_clock(int enable) { if (enable) { mdp_clock_init(); mmss_clock_init(); } else if(!target_cont_splash_screen()) { mmss_clock_disable(); } return 0; } static int msm8960_mipi_panel_power(int enable) { if (enable) { msm8960_backlight_on(); /* Turn on LDO8 for lcd1 mipi vdd */ pm8921_ldo_set_voltage(LDO_8, LDO_VOLTAGE_3_0V); /* Turn on LDO23 for lcd1 mipi vddio */ pm8921_ldo_set_voltage(LDO_23, LDO_VOLTAGE_1_8V); /* Turn on LDO2 for vdda_mipi_dsi */ pm8921_ldo_set_voltage(LDO_2, LDO_VOLTAGE_1_2V); msm8960_mipi_panel_reset(); } return 0; } void display_init(void) { dprintf(CRITICAL, "display_init\n"); switch (board_target_id()) { case LINUX_MACHTYPE_8064_CDP: lvds_chimei_wxga_init(&(panel.panel_info)); panel.clk_func = apq8064_lvds_clock; panel.power_func = apq8064_lvds_panel_power; panel.fb.base = 0x80B00000; 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_44; break; case LINUX_MACHTYPE_8064_MTP: mipi_toshiba_video_wsvga_init(&(panel.panel_info)); panel.clk_func = fusion3_mtp_clock; panel.power_func = fusion3_mtp_panel_power; panel.fb.base = 0x89000000; 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_44; break; case LINUX_MACHTYPE_8960_CDP: case LINUX_MACHTYPE_8960_MTP: case LINUX_MACHTYPE_8960_FLUID: case LINUX_MACHTYPE_8960_LIQUID: mipi_toshiba_video_wsvga_init(&(panel.panel_info)); panel.clk_func = msm8960_mipi_panel_clock; panel.power_func = msm8960_mipi_panel_power; panel.fb.base = 0x89000000; 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_42; break; default: return; }; if (msm_display_init(&panel)) { dprintf(CRITICAL, "Display init failed!\n"); return; } display_image_on_screen(); display_enable = 1; } void display_shutdown(void) { if (display_enable) msm_display_off(); }
static int msm8974_backlight_on() { static struct pm8x41_wled_data wled_ctrl = { .mod_scheme = 0xC3, .led1_brightness = (0x0F << 8) | 0xEF, .led2_brightness = (0x0F << 8) | 0xEF, .led3_brightness = (0x0F << 8) | 0xEF, .max_duty_cycle = 0x01, }; pm8x41_wled_config(&wled_ctrl); pm8x41_wled_sink_control(1); pm8x41_wled_iled_sync_control(1); pm8x41_wled_enable(1); return 0; } static int msm8974_mdss_dsi_panel_clock(uint8_t enable) { if (enable) { mdp_gdsc_ctrl(enable); mdp_clock_init(); mdss_dsi_uniphy_pll_config(); mmss_clock_init(); } else if(!target_cont_splash_screen()) { // * Add here for continuous splash * mmss_clock_disable(); mdp_clock_disable(); mdp_gdsc_ctrl(enable); } return 0; } /* Pull DISP_RST_N high to get panel out of reset */ static void msm8974_mdss_mipi_panel_reset(uint8_t enable) { struct pm8x41_gpio gpio19_param = { .direction = PM_GPIO_DIR_OUT, .output_buffer = PM_GPIO_OUT_CMOS, .out_strength = PM_GPIO_OUT_DRIVE_MED, }; pm8x41_gpio_config(19, &gpio19_param); if (enable) { gpio_tlmm_config(58, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_8MA, GPIO_DISABLE); pm8x41_gpio_set(19, PM_GPIO_FUNC_HIGH); mdelay(2); pm8x41_gpio_set(19, PM_GPIO_FUNC_LOW); mdelay(5); pm8x41_gpio_set(19, PM_GPIO_FUNC_HIGH); mdelay(2); gpio_set(58, 2); } else { gpio19_param.out_strength = PM_GPIO_OUT_DRIVE_LOW; pm8x41_gpio_config(19, &gpio19_param); pm8x41_gpio_set(19, PM_GPIO_FUNC_LOW); gpio_set(58, 2); } } static int msm8974_mipi_panel_power(uint8_t enable) { if (enable) { /* Enable backlight */ msm8974_backlight_on(); /* Turn on LDO8 for lcd1 mipi vdd */ dprintf(SPEW, " Setting LDO22\n"); pm8x41_ldo_set_voltage("LDO22", 3000000); pm8x41_ldo_control("LDO22", enable); dprintf(SPEW, " Setting LDO12\n"); /* Turn on LDO23 for lcd1 mipi vddio */ pm8x41_ldo_set_voltage("LDO12", 1800000); pm8x41_ldo_control("LDO12", enable); dprintf(SPEW, " Setting LDO2\n"); /* Turn on LDO2 for vdda_mipi_dsi */ pm8x41_ldo_set_voltage("LDO2", 1200000); pm8x41_ldo_control("LDO2", enable); dprintf(SPEW, " Panel Reset \n"); /* Panel Reset */ msm8974_mdss_mipi_panel_reset(enable); dprintf(SPEW, " Panel Reset Done\n"); } else { msm8974_mdss_mipi_panel_reset(enable); pm8x41_wled_enable(enable); pm8x41_ldo_control("LDO2", enable); pm8x41_ldo_control("LDO22", enable); } return 0; } void display_init(void) { uint32_t hw_id = board_hardware_id(); uint32_t soc_ver = board_soc_version(); dprintf(INFO, "display_init(),target_id=%d.\n", hw_id); switch (hw_id) { case HW_PLATFORM_MTP: case HW_PLATFORM_FLUID: case HW_PLATFORM_SURF: mipi_toshiba_video_720p_init(&(panel.panel_info)); panel.clk_func = msm8974_mdss_dsi_panel_clock; panel.power_func = msm8974_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_50; break; default: return; }; if (msm_display_init(&panel)) { dprintf(CRITICAL, "Display init failed!\n"); return; } display_enable = 1; }
static void msm8960_backlight_on(void) { struct pm8921_gpio backlight_pwm = { .direction = PM_GPIO_DIR_OUT, .output_buffer = 0, .output_value = 0, .pull = PM_GPIO_PULL_NO, .vin_sel = 2, .out_strength = PM_GPIO_STRENGTH_HIGH, .function = PM_GPIO_FUNC_1, .inv_int_pol = 0, }; int rc = pm8921_gpio_config(PM_GPIO(24), &backlight_pwm); if (rc) dprintf(CRITICAL, "FAIL pm8921_gpio_config(): rc=%d.\n", rc); } /* Pull DISP_RST_N high to get panel out of reset */ static void msm8960_mipi_panel_reset(void) { struct pm8921_gpio gpio43_param = { .direction = PM_GPIO_DIR_OUT, .output_buffer = 0, .output_value = 1, .pull = PM_GPIO_PULL_UP_30, .vin_sel = 2, .out_strength = PM_GPIO_STRENGTH_HIGH, .function = PM_GPIO_FUNC_PAIRED, .inv_int_pol = 0, .disable_pin = 0, }; pm8921_gpio_config(PM_GPIO(43), &gpio43_param); } static int msm8960_mipi_panel_clock(int enable) { if (enable) { mdp_clock_init(); mmss_clock_init(); } else if(!target_cont_splash_screen()) { mmss_clock_disable(); } return 0; } static int msm8960_liquid_mipi_panel_clock(int enable) { if (enable) { mdp_clock_init(); liquid_mmss_clock_init(); /* 240 MHZ MIPI-DSI clk */ } else if(!target_cont_splash_screen()) { mmss_clock_disable(); } return 0; } static int msm8960_mipi_panel_power(int enable) { if (enable) { msm8960_backlight_on(); /* Turn on LDO8 for lcd1 mipi vdd */ pm8921_ldo_set_voltage(LDO_8, LDO_VOLTAGE_3_0V); /* Turn on LDO23 for lcd1 mipi vddio */ pm8921_ldo_set_voltage(LDO_23, LDO_VOLTAGE_1_8V); /* Turn on LDO2 for vdda_mipi_dsi */ pm8921_ldo_set_voltage(LDO_2, LDO_VOLTAGE_1_2V); msm8960_mipi_panel_reset(); } return 0; } #define PM_GPIO_VIN_VPH 0 /* 3v ~ 4.4v */ #define PM_GPIO_VIN_BB 1 /* ~3.3v */ #define PM_GPIO_VIN_S4 2 /* 1.8v */ #define PM_GPIO_VIN_L15 3 static int msm8960_liquid_mipi_panel_power(int enable) { if (enable) { static int gpio17, gpio21, gpio43 ; int rc; struct pm8921_gpio gpio_config = { .direction = PM_GPIO_DIR_OUT, .output_buffer = 0, .output_value = 1, .pull = PM_GPIO_PULL_NO, .vin_sel = PM_GPIO_VIN_S4, .out_strength = PM_GPIO_STRENGTH_HIGH, .function = PM_GPIO_FUNC_NORMAL, .inv_int_pol = 0, .disable_pin = 0, }; /* Note: PWM is controlled by PM-GPIO#24 */ gpio17 = PM_GPIO(17); /* ext_3p3v */ gpio21 = PM_GPIO(21); /* disp power enable_n , vin=VPH-PWR */ gpio43 = PM_GPIO(43); /* Displays Enable (rst_n) */ gpio_config.output_value = 1; rc = pm8921_gpio_config(gpio17, &gpio_config); mdelay(100); gpio_config.output_value = 0; /* disp disable (resx=0) */ rc = pm8921_gpio_config(gpio43, &gpio_config); mdelay(100); gpio_config.output_value = 0; gpio_config.vin_sel = PM_GPIO_VIN_VPH; /* VPH_PWR */ /* disp power enable_n */ rc = pm8921_gpio_config(gpio21, &gpio_config); mdelay(100); gpio_config.output_value = 1; gpio_config.vin_sel = PM_GPIO_VIN_S4; /* disp enable */ rc = pm8921_gpio_config(gpio43, &gpio_config); mdelay(100); pm8921_low_voltage_switch_enable(lvs_4); /* S4 1.8 V */ /* Turn on LDO2 for vdda_mipi_dsi */ pm8921_ldo_set_voltage(LDO_2, LDO_VOLTAGE_1_2V); msm8960_backlight_on(); } return 0; } void display_init(void) { int target_id = board_target_id(); dprintf(INFO, "display_init(),target_id=%d.\n", target_id); switch (target_id) { case LINUX_MACHTYPE_8960_LIQUID: mipi_chimei_video_wxga_init(&(panel.panel_info)); /* * mipi_chimei_wxga panel not supported yet in LK. * However, MIPI clocks and power should be set in LK. */ panel.clk_func = msm8960_liquid_mipi_panel_clock; panel.power_func = msm8960_liquid_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_44; break; case LINUX_MACHTYPE_8064_CDP: lvds_chimei_wxga_init(&(panel.panel_info)); panel.clk_func = apq8064_lvds_clock; panel.power_func = apq8064_lvds_panel_power; panel.fb.base = 0x80B00000; 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_44; break; case LINUX_MACHTYPE_8064_MTP: mipi_toshiba_video_wsvga_init(&(panel.panel_info)); panel.clk_func = fusion3_mtp_clock; panel.power_func = fusion3_mtp_panel_power; panel.fb.base = 0x89000000; 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_44; break; case LINUX_MACHTYPE_8960_CDP: case LINUX_MACHTYPE_8960_MTP: case LINUX_MACHTYPE_8960_FLUID: mipi_toshiba_video_wsvga_init(&(panel.panel_info)); panel.clk_func = msm8960_mipi_panel_clock; panel.power_func = msm8960_mipi_panel_power; panel.fb.base = 0x89000000; 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_42; break; default: return; }; if (msm_display_init(&panel)) { dprintf(CRITICAL, "Display init failed!\n"); return; } display_image_on_screen(); display_enable = 1; } void display_shutdown(void) { if (display_enable) msm_display_off(); }