static void backlight_tft_late_on(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return; } pr_info("%s : Backlight is on\n", __func__); if (!mdss_panel_attach_get(ctrl)) { pr_err("%s: mdss_panel_attach_get(%d) : %d\n",__func__, ctrl->ndx, mdss_panel_attach_get(ctrl)); return; } vdd->panel_func.samsung_bl_ic_pwm_en(1); if(vdd->auto_brightness==6) vdd->panel_func.samsung_bl_ic_outdoor(1); if(is_first_boot){ if (ctrl->panel_data.set_backlight) ctrl->panel_data.set_backlight(&ctrl->panel_data, LCD_DEFAUL_BL_LEVEL); is_first_boot = 0; } if(vdd->bl_level) mdss_samsung_brightness_tft_pwm(ctrl, vdd->bl_level); }
static int mdss_panel_revision(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } if (vdd->manufacture_id_dsi[ctrl->ndx] == 0) mdss_panel_attach_set(ctrl, false); else mdss_panel_attach_set(ctrl, true); if (mdss_panel_id2_get(ctrl) == 0x13) vdd->panel_revision = 'D' - 'A'; else if (mdss_panel_id2_get(ctrl) == 0x14) vdd->panel_revision = 'E' - 'A'; else vdd->panel_revision = 'D' - 'A'; pr_info("%s : panel_revision = %c \n", __func__, (unsigned char)vdd->panel_revision); return true; }
static int mdss_manufacture_date_read(struct mdss_dsi_ctrl_pdata *ctrl) { unsigned char date[2]; int year, month, day; struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } /* Read mtp (C8h 41,42th) for manufacture date */ if (vdd->dtsi_data[ctrl->ndx].manufacture_date_rx_cmds[vdd->panel_revision].cmd_cnt) { mdss_samsung_panel_data_read(ctrl, &vdd->dtsi_data[ctrl->ndx].manufacture_date_rx_cmds[vdd->panel_revision], date, PANEL_LEVE2_KEY); year = date[0] & 0xf0; year >>= 4; year += 2011; // 0 = 2011 year month = date[0] & 0x0f; day = date[1] & 0x1f; pr_info("%s DSI%d manufacture_date = %d", __func__, ctrl->ndx, year * 10000 + month * 100 + day); vdd->manufacture_date_dsi[ctrl->ndx] = year * 10000 + month * 100 + day; } else {
static int mdss_manufacture_date_read(struct mdss_dsi_ctrl_pdata *ctrl) { unsigned char date[4]; int year, month, day; int hour, min; struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } /* Read mtp (C8h 41,42th) for manufacture date */ if (vdd->dtsi_data[ctrl->ndx].manufacture_date_rx_cmds[vdd->panel_revision].cmd_cnt) { mdss_samsung_panel_data_read(ctrl, &vdd->dtsi_data[ctrl->ndx].manufacture_date_rx_cmds[vdd->panel_revision], date, PANEL_LEVE2_KEY); year = date[0] & 0xf0; year >>= 4; year += 2011; // 0 = 2011 year month = date[0] & 0x0f; day = date[1] & 0x1f; hour = date[2]& 0x0f; min = date[3] & 0x1f; vdd->manufacture_date_dsi[ctrl->ndx] = year * 10000 + month * 100 + day; vdd->manufacture_time_dsi[ctrl->ndx] = hour * 100 + min; pr_err("manufacture_date DSI%d = (%d%04d) - year(%d) month(%d) day(%d) hour(%d) min(%d)\n", ctrl->ndx, vdd->manufacture_date_dsi[ctrl->ndx], vdd->manufacture_time_dsi[ctrl->ndx], year, month, day, hour, min); } else {
static int mdss_panel_on_post(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } pr_info("%s+: ndx=%d %d %d \n", __func__, ctrl->ndx,alpm_status_func(CHECK_PREVIOUS_STATUS),alpm_status_func(CHECK_CURRENT_STATUS)); /* ALPM Mode Change */ if (!alpm_status_func(CHECK_PREVIOUS_STATUS)\ && alpm_status_func(CHECK_CURRENT_STATUS)) { /* Turn On ALPM Mode */ mdss_samsung_send_cmd(ctrl, PANEL_ALPM_ON); alpm_status_func(STORE_CURRENT_STATUS); pr_info("[ALPM_DEBUG] %s: Send ALPM mode on cmds\n", __func__); } else if (!alpm_status_func(CHECK_CURRENT_STATUS)\ && alpm_status_func(CHECK_PREVIOUS_STATUS)) { /* Turn Off ALPM Mode */ mdss_samsung_send_cmd(ctrl, PANEL_ALPM_OFF); alpm_status_func(CLEAR_MODE_STATUS); pr_info("[ALPM_DEBUG] %s: Send ALPM off cmds\n", __func__); } pr_info("%s-: ndx=%d \n", __func__, ctrl->ndx); return true; }
static int mdss_panel_on_post(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } pr_info("%s %d\n", __func__, ctrl->ndx); if(ctrl->bklt_ctrl == BL_DCS_CMD) ktd3102_set_led_current(5,ctrl); /* set max current to "6"/19.8mA, only when CABC is enabled */ if(vdd->support_cabc) mdss_samsung_cabc_update(); if(ctrl->bklt_ctrl == BL_DCS_CMD && is_first_boot){ mdss_samsung_brightness_dcs(ctrl, LCD_DEFAUL_BL_LEVEL); is_first_boot = 0; } return true; }
static void backlight_tft_late_on(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return; } if (!mdss_panel_attach_get(ctrl)) { pr_err("%s: mdss_panel_attach_get(%d) : %d\n",__func__, ctrl->ndx, mdss_panel_attach_get(ctrl)); return; } if (gpio_is_valid(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[0])) { gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[0], 1); msleep(80); } if(ctrl->bklt_ctrl == BL_SS_PWM && is_first_boot){ if (vdd->panel_func.samsung_brightness_tft_pwm) vdd->panel_func.samsung_brightness_tft_pwm(ctrl,LCD_DEFAUL_BL_LEVEL); is_first_boot = 0; } pr_info("%s : Backlight is on\n", __func__); if(vdd->support_cabc) mdss_samsung_cabc_update(); }
static void mdss_panel_tft_outdoormode_update(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return; } pr_info("%s: tft panel autobrightness update\n", __func__); switch(vdd->auto_brightness) { case 0: mdss_samsung_cabc_update(); if(vdd->prev_auto_brightness == 6) vdd->panel_func.samsung_bl_ic_outdoor(0); break; case 1: case 2: case 3: case 4: mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_ON); if(vdd->prev_auto_brightness == 6) vdd->panel_func.samsung_bl_ic_outdoor(0); break; case 5: mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF); if(vdd->prev_auto_brightness == 6) vdd->panel_func.samsung_bl_ic_outdoor(0); break; case 6: mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF); vdd->panel_func.samsung_bl_ic_outdoor(1); break; } vdd->prev_auto_brightness = vdd->auto_brightness; }
static int mdss_panel_revision(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } if (vdd->manufacture_id_dsi[ctrl->ndx] == 0) mdss_panel_attach_set(ctrl, false); else mdss_panel_attach_set(ctrl, true); /*temp_joann*/ if (mdss_panel_id2_get(ctrl) == 0x5) vdd->panel_revision = 'F'; else if (mdss_panel_id2_get(ctrl) == 0x6) vdd->panel_revision = 'G'; else if (mdss_panel_id2_get(ctrl) == 0x7) vdd->panel_revision = 'H'; else if (mdss_panel_id2_get(ctrl) == 0x8) // For use 0x08 Rev to 0x09 Rev vdd->panel_revision = 'J'; else if (mdss_panel_id2_get(ctrl) == 0x9) vdd->panel_revision = 'J'; else vdd->panel_revision = 'J'; vdd->panel_revision -= 'A'; pr_info("%s : panel_revision = %c %d \n", __func__, vdd->panel_revision + 'A', vdd->panel_revision); return true; }
static void mdss_panel_tft_outdoormode_update(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); struct mdss_panel_info *pinfo = NULL; if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return; } pinfo = &(ctrl->panel_data.panel_info); if (pinfo->blank_state == MDSS_PANEL_BLANK_BLANK) { pr_info("%s: skip mdss_panel_tft_outdoormode_update %d\n", __func__, __LINE__); return; } pr_info("%s: tft panel autobrightness update\n", __func__); if(vdd->prev_auto_brightness == vdd->auto_brightness) return; switch(vdd->auto_brightness) { case 0: mdss_samsung_cabc_update(); if(vdd->prev_auto_brightness == 6) vdd->panel_func.samsung_bl_ic_outdoor(0); break; case 1: case 2: case 3: case 4: if(vdd->prev_auto_brightness && vdd->prev_auto_brightness < 5) { vdd->prev_auto_brightness = vdd->auto_brightness; return; } if(vdd->prev_auto_brightness == 6) vdd->panel_func.samsung_bl_ic_outdoor(0); vdd->prev_auto_brightness = vdd->auto_brightness; mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY); mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_ON); if(vdd->dtsi_data[ctrl->ndx].cabc_delay && !vdd->display_ststus_dsi[ctrl->ndx].disp_on_pre) usleep(vdd->dtsi_data[ctrl->ndx].cabc_delay); mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_ON_DUTY); break; case 5: mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY); mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF); if(vdd->prev_auto_brightness == 6) vdd->panel_func.samsung_bl_ic_outdoor(0); break; case 6: mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY); mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF); vdd->panel_func.samsung_bl_ic_outdoor(1); break; } vdd->prev_auto_brightness = vdd->auto_brightness; }
static void ktd3102_set_brightness(int level, struct mdss_dsi_ctrl_pdata *ctrl) { int pulse; int tune_level = 0; unsigned long irq_flags; struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return; } tune_level = level; if(level == 0){ gpio_set_value((vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1]), 0); lcd_brightness = tune_level; pr_info("level = %d pulling low\n",level); return; } if (unlikely(lcd_brightness < 0)) { int val = gpio_get_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1]); if (val) { lcd_brightness = 0; gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1], 0); mdelay(3); pr_info("LCD Baklight init in boot time on kernel\n"); } } if (!lcd_brightness) { gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1], 1); udelay(3); lcd_brightness = 1; pr_info("level = %d !lcd_brightness\n",level); } pulse = (tune_level - lcd_brightness + MAX_BRIGHTNESS_IN_BLU) % MAX_BRIGHTNESS_IN_BLU; pr_info("lcd_brightness = %d, tune_level = %d, pulse = %d\n", lcd_brightness,tune_level,pulse); spin_lock_irqsave(&bg_gpio_lock, irq_flags); for (; pulse > 0; pulse--) { gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1], 0); udelay(3); gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1], 1); udelay(3); } spin_unlock_irqrestore(&bg_gpio_lock, irq_flags); lcd_brightness = tune_level; mdelay(1); }
static void mdss_panel_tft_pwm_control(struct mdss_dsi_ctrl_pdata *ctrl, int bl_lvl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return; } if(ctrl->panel_data.panel_info.blank_state == MDSS_PANEL_BLANK_UNBLANK) { vdd->panel_func.samsung_bl_ic_pwm_en(1); vdd->panel_func.samsung_bl_ic_i2c_ctrl(bl_lvl); } }
static int mdss_panel_revision(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } vdd->panel_revision = 0; return true; }
static int mdss_panel_off_pre(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } pr_info("%s %d\n", __func__, ctrl->ndx); vdd->panel_func.samsung_bl_ic_pwm_en(0); return true; }
static int mdss_panel_on_post(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } pr_info("%s %d\n", __func__, ctrl->ndx); mdss_samsung_cabc_update(); return true; }
static void mdss_panel_tft_pwm_control(struct mdss_dsi_ctrl_pdata *ctrl, int level) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return; } vdd->bl_level = level; vdd->scaled_level = get_scaled_level(vdd, ctrl->ndx); ktd3102_set_brightness(vdd->scaled_level, ctrl); pr_info("%s bl_level : %d scaled_level : %d\n", __func__, level, vdd->scaled_level); return; }
static int mdss_panel_on_pre(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); printk("%s:%d --by sean\n",__func__,__LINE__); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } pr_info("%s %d\n", __func__, ctrl->ndx); mdss_panel_attach_set(ctrl, true); return true; }
static struct dsi_panel_cmds * mdss_brightness_tft_pwm(struct mdss_dsi_ctrl_pdata *ctrl, int *level_key) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return NULL; } vdd->scaled_level = get_scaled_level(vdd, ctrl->ndx); pr_info("%s bl_level : %d scaled_level : %d\n", __func__, vdd->bl_level, vdd->scaled_level); vdd->dtsi_data[ctrl->ndx].tft_pwm_tx_cmds->cmds->payload[1] = vdd->scaled_level ; return &vdd->dtsi_data[ctrl->ndx].tft_pwm_tx_cmds[vdd->panel_revision]; }
void mdss_samsung_cabc_update_tft(struct mdss_dsi_ctrl_pdata *ctrl, int val) { static int prev_val; struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s vdd is error", __func__); return; } if(prev_val == val) return; if(val){ mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY); mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF); } else { switch(vdd->auto_brightness) { case 1: case 2: case 3: case 4: if(vdd->prev_auto_brightness == 6) vdd->panel_func.samsung_bl_ic_outdoor(0); prev_val = val; mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY); mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_ON); if(vdd->dtsi_data[ctrl->ndx].cabc_delay && !vdd->display_ststus_dsi[ctrl->ndx].disp_on_pre) usleep(vdd->dtsi_data[ctrl->ndx].cabc_delay); mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_ON_DUTY); break; case 5: mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY); mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF); if(vdd->prev_auto_brightness == 6) vdd->panel_func.samsung_bl_ic_outdoor(0); break; case 6: mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY); vdd->panel_func.samsung_bl_ic_outdoor(1); break; } } prev_val = val; }
static int mdss_panel_on_post(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } pr_info("%s+: ndx=%d \n", __func__, ctrl->ndx); if((mdss_panel_id1_get(ctrl) == 0x20) || (mdss_panel_id1_get(ctrl) == 0x40)) mdss_samsung_send_cmd(ctrl, PANEL_HSYNC_ON); pr_info("%s-: ndx=%d \n", __func__, ctrl->ndx); return true; }
static void update_mdnie_tft_cmds(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return; } if (!mdss_panel_attach_get(ctrl)) { pr_err("%s: mdss_panel_attach_get(%d) : %d\n",__func__, ctrl->ndx, mdss_panel_attach_get(ctrl)); return; } if (vdd->support_mdnie_lite) update_dsi_tcon_mdnie_register(vdd); }
static int mdss_panel_on_post(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } pr_info("%s %d\n", __func__, ctrl->ndx); mdss_samsung_cabc_update(); if(is_first_boot){ if (ctrl->panel_data.set_backlight) ctrl->panel_data.set_backlight(&ctrl->panel_data, LCD_DEFAUL_BL_LEVEL); is_first_boot = 0; } return true; }
static int mdss_panel_off_post(struct mdss_dsi_ctrl_pdata *ctrl) { struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl); if (IS_ERR_OR_NULL(vdd)) { pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd); return false; } if(is_first_boot) { mdss_backlight_tft_request_gpios(ctrl); if (ctrl->bklt_ctrl == BL_DCS_CMD && vdd->panel_func.samsung_brightness_tft_pwm) vdd->panel_func.samsung_brightness_tft_pwm(ctrl, 0); } if (gpio_is_valid(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[0])) gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[0], 0); if (gpio_is_valid(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1])) gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1], 0); return true; }
int mdss_dsi_on(struct mdss_panel_data *pdata) { int ret = 0; struct mdss_panel_info *pinfo; struct mipi_panel_info *mipi; struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; int cur_power_state; #if defined(CONFIG_FB_MSM_MDSS_SAMSUNG) struct samsung_display_driver_data *vdd = NULL; u32 reg_backup; #endif if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); return -EINVAL; } ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); cur_power_state = pdata->panel_info.panel_power_state; pr_info("%s+: ctrl=%p ndx=%d cur_power_state=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx, cur_power_state); pinfo = &pdata->panel_info; mipi = &pdata->panel_info.mipi; #if defined(CONFIG_FB_MSM_MDSS_SAMSUNG) if (pinfo->esd_recovery.esd_irq_enable) pinfo->esd_recovery.esd_irq_enable(true, false, (void *)pinfo); #endif if (mdss_dsi_is_panel_on_interactive(pdata)) { pr_err("%s: panel already on\n", __func__); goto end; } ret = mdss_dsi_panel_power_ctrl(pdata, MDSS_PANEL_POWER_ON); if (ret) { pr_err("%s:Panel power on failed. rc=%d\n", __func__, ret); return ret; } if (cur_power_state != MDSS_PANEL_POWER_OFF) { pr_debug("%s: dsi_on from panel low power state\n", __func__); goto end; } /* * Enable DSI clocks. * This is also enable the DSI core power block and reset/setup * DSI phy */ mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 1); mdss_dsi_sw_reset(ctrl_pdata, true); /* * Issue hardware reset line after enabling the DSI clocks and data * data lanes for LP11 init */ if (mipi->lp11_init) { #if defined(CONFIG_FB_MSM_MDSS_SAMSUNG) vdd = check_valid_ctrl(ctrl_pdata); if (!IS_ERR_OR_NULL(vdd) && vdd->dtsi_data[ctrl_pdata->ndx].samsung_lp11_init) { /* LP11 */ reg_backup = MIPI_INP((ctrl_pdata->ctrl_base) + 0xac); MIPI_OUTP((ctrl_pdata->ctrl_base) + 0xac, 0x1F << 16); wmb(); if (mipi->init_delay) usleep(mipi->init_delay); } #endif mdss_dsi_panel_reset(pdata, 1); #if defined(CONFIG_FB_MSM_MDSS_SAMSUNG) /* LP11 Restore */ if (!IS_ERR_OR_NULL(vdd) && vdd->dtsi_data[ctrl_pdata->ndx].samsung_lp11_init) MIPI_OUTP((ctrl_pdata->ctrl_base) + 0xac, reg_backup); #endif } if (mipi->init_delay) usleep(mipi->init_delay); if (mipi->force_clk_lane_hs) { u32 tmp; tmp = MIPI_INP((ctrl_pdata->ctrl_base) + 0xac); tmp |= (1<<28); MIPI_OUTP((ctrl_pdata->ctrl_base) + 0xac, tmp); wmb(); } if (pdata->panel_info.type == MIPI_CMD_PANEL) mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 0); pinfo->dsi_on_status = true; end: pr_err("%s-:\n", __func__); return 0; }