Loading drivers/video/fbdev/msm/mdss_dsi.c +3 −0 Original line number Diff line number Diff line Loading @@ -4364,6 +4364,9 @@ int dsi_panel_device_register(struct platform_device *ctrl_pdev, return rc; } /* default state of gpio is false */ ctrl_pdata->bklt_en_gpio_state = false; pinfo->panel_max_fps = mdss_panel_get_framerate(pinfo); pinfo->panel_max_vtotal = mdss_panel_get_vtotal(pinfo); Loading drivers/video/fbdev/msm/mdss_dsi.h +1 −0 Original line number Diff line number Diff line Loading @@ -454,6 +454,7 @@ struct mdss_dsi_ctrl_pdata { int disp_en_gpio; int bklt_en_gpio; bool bklt_en_gpio_invert; bool bklt_en_gpio_state; int lcd_mode_sel_gpio; int bklt_ctrl; /* backlight ctrl */ bool pwm_pmi; Loading drivers/video/fbdev/msm/mdss_dsi_panel.c +78 −42 Original line number Diff line number Diff line Loading @@ -260,16 +260,6 @@ static int mdss_dsi_request_gpios(struct mdss_dsi_ctrl_pdata *ctrl_pdata) rc); goto rst_gpio_err; } if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { rc = gpio_request(ctrl_pdata->bklt_en_gpio, "bklt_enable"); if (rc) { pr_err("request bklt gpio failed, rc=%d\n", rc); goto bklt_en_gpio_err; } } if (gpio_is_valid(ctrl_pdata->lcd_mode_sel_gpio)) { rc = gpio_request(ctrl_pdata->lcd_mode_sel_gpio, "mode_sel"); if (rc) { Loading @@ -282,9 +272,6 @@ static int mdss_dsi_request_gpios(struct mdss_dsi_ctrl_pdata *ctrl_pdata) return rc; lcd_mode_sel_gpio_err: if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) gpio_free(ctrl_pdata->bklt_en_gpio); bklt_en_gpio_err: gpio_free(ctrl_pdata->rst_gpio); rst_gpio_err: if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) Loading @@ -293,6 +280,81 @@ disp_en_gpio_err: return rc; } int mdss_dsi_bl_gpio_ctrl(struct mdss_panel_data *pdata, int enable) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; int rc = 0, val = 0; 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); if (ctrl_pdata == NULL) { pr_err("%s: Invalid ctrl data\n", __func__); return -EINVAL; } /* if gpio is not valid */ if (!gpio_is_valid(ctrl_pdata->bklt_en_gpio)) return rc; pr_debug("%s: enable = %d\n", __func__, enable); /* * if gpio state is false and enable (bl level) is * non zero then toggle the gpio */ if (!ctrl_pdata->bklt_en_gpio_state && enable) { rc = gpio_request(ctrl_pdata->bklt_en_gpio, "bklt_enable"); if (rc) { pr_err("request bklt gpio failed, rc=%d\n", rc); goto free; } if (ctrl_pdata->bklt_en_gpio_invert) val = 0; else val = 1; rc = gpio_direction_output(ctrl_pdata->bklt_en_gpio, val); if (rc) { pr_err("%s: unable to set dir for bklt gpio val %d\n", __func__, val); goto free; } ctrl_pdata->bklt_en_gpio_state = true; goto ret; } else if (ctrl_pdata->bklt_en_gpio_state && !enable) { /* * if gpio state is true and enable (bl level) is * zero then toggle the gpio */ if (ctrl_pdata->bklt_en_gpio_invert) val = 1; else val = 0; rc = gpio_direction_output(ctrl_pdata->bklt_en_gpio, val); if (rc) pr_err("%s: unable to set dir for bklt gpio val %d\n", __func__, val); goto free; } /* gpio state is true and bl level is non zero */ goto ret; free: pr_debug("%s: free bklt gpio\n", __func__); ctrl_pdata->bklt_en_gpio_state = false; gpio_free(ctrl_pdata->bklt_en_gpio); ret: return rc; } int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; Loading Loading @@ -362,26 +424,6 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) if (pdata->panel_info.rst_seq[++i]) usleep_range(pinfo->rst_seq[i] * 1000, pinfo->rst_seq[i] * 1000); } if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { if (ctrl_pdata->bklt_en_gpio_invert) { rc = gpio_direction_output( ctrl_pdata->bklt_en_gpio, 0); gpio_set_value( (ctrl_pdata->bklt_en_gpio), 0); } else { rc = gpio_direction_output( ctrl_pdata->bklt_en_gpio, 1); gpio_set_value( (ctrl_pdata->bklt_en_gpio), 1); } if (rc) { pr_err("%s: unable to set dir for bklt gpio\n", __func__); goto exit; } } } if (gpio_is_valid(ctrl_pdata->lcd_mode_sel_gpio)) { Loading Loading @@ -410,15 +452,6 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) pr_debug("%s: Reset panel done\n", __func__); } } else { if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { if (ctrl_pdata->bklt_en_gpio_invert) gpio_set_value((ctrl_pdata->bklt_en_gpio), 1); else gpio_set_value((ctrl_pdata->bklt_en_gpio), 0); gpio_free(ctrl_pdata->bklt_en_gpio); } if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) { gpio_set_value((ctrl_pdata->disp_en_gpio), 0); gpio_free(ctrl_pdata->disp_en_gpio); Loading Loading @@ -801,6 +834,9 @@ static void mdss_dsi_panel_bl_ctrl(struct mdss_panel_data *pdata, if ((bl_level < pdata->panel_info.bl_min) && (bl_level != 0)) bl_level = pdata->panel_info.bl_min; /* enable the backlight gpio if present */ mdss_dsi_bl_gpio_ctrl(pdata, bl_level); switch (ctrl_pdata->bklt_ctrl) { case BL_WLED: led_trigger_event(bl_led_trigger, bl_level); Loading Loading
drivers/video/fbdev/msm/mdss_dsi.c +3 −0 Original line number Diff line number Diff line Loading @@ -4364,6 +4364,9 @@ int dsi_panel_device_register(struct platform_device *ctrl_pdev, return rc; } /* default state of gpio is false */ ctrl_pdata->bklt_en_gpio_state = false; pinfo->panel_max_fps = mdss_panel_get_framerate(pinfo); pinfo->panel_max_vtotal = mdss_panel_get_vtotal(pinfo); Loading
drivers/video/fbdev/msm/mdss_dsi.h +1 −0 Original line number Diff line number Diff line Loading @@ -454,6 +454,7 @@ struct mdss_dsi_ctrl_pdata { int disp_en_gpio; int bklt_en_gpio; bool bklt_en_gpio_invert; bool bklt_en_gpio_state; int lcd_mode_sel_gpio; int bklt_ctrl; /* backlight ctrl */ bool pwm_pmi; Loading
drivers/video/fbdev/msm/mdss_dsi_panel.c +78 −42 Original line number Diff line number Diff line Loading @@ -260,16 +260,6 @@ static int mdss_dsi_request_gpios(struct mdss_dsi_ctrl_pdata *ctrl_pdata) rc); goto rst_gpio_err; } if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { rc = gpio_request(ctrl_pdata->bklt_en_gpio, "bklt_enable"); if (rc) { pr_err("request bklt gpio failed, rc=%d\n", rc); goto bklt_en_gpio_err; } } if (gpio_is_valid(ctrl_pdata->lcd_mode_sel_gpio)) { rc = gpio_request(ctrl_pdata->lcd_mode_sel_gpio, "mode_sel"); if (rc) { Loading @@ -282,9 +272,6 @@ static int mdss_dsi_request_gpios(struct mdss_dsi_ctrl_pdata *ctrl_pdata) return rc; lcd_mode_sel_gpio_err: if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) gpio_free(ctrl_pdata->bklt_en_gpio); bklt_en_gpio_err: gpio_free(ctrl_pdata->rst_gpio); rst_gpio_err: if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) Loading @@ -293,6 +280,81 @@ disp_en_gpio_err: return rc; } int mdss_dsi_bl_gpio_ctrl(struct mdss_panel_data *pdata, int enable) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; int rc = 0, val = 0; 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); if (ctrl_pdata == NULL) { pr_err("%s: Invalid ctrl data\n", __func__); return -EINVAL; } /* if gpio is not valid */ if (!gpio_is_valid(ctrl_pdata->bklt_en_gpio)) return rc; pr_debug("%s: enable = %d\n", __func__, enable); /* * if gpio state is false and enable (bl level) is * non zero then toggle the gpio */ if (!ctrl_pdata->bklt_en_gpio_state && enable) { rc = gpio_request(ctrl_pdata->bklt_en_gpio, "bklt_enable"); if (rc) { pr_err("request bklt gpio failed, rc=%d\n", rc); goto free; } if (ctrl_pdata->bklt_en_gpio_invert) val = 0; else val = 1; rc = gpio_direction_output(ctrl_pdata->bklt_en_gpio, val); if (rc) { pr_err("%s: unable to set dir for bklt gpio val %d\n", __func__, val); goto free; } ctrl_pdata->bklt_en_gpio_state = true; goto ret; } else if (ctrl_pdata->bklt_en_gpio_state && !enable) { /* * if gpio state is true and enable (bl level) is * zero then toggle the gpio */ if (ctrl_pdata->bklt_en_gpio_invert) val = 1; else val = 0; rc = gpio_direction_output(ctrl_pdata->bklt_en_gpio, val); if (rc) pr_err("%s: unable to set dir for bklt gpio val %d\n", __func__, val); goto free; } /* gpio state is true and bl level is non zero */ goto ret; free: pr_debug("%s: free bklt gpio\n", __func__); ctrl_pdata->bklt_en_gpio_state = false; gpio_free(ctrl_pdata->bklt_en_gpio); ret: return rc; } int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; Loading Loading @@ -362,26 +424,6 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) if (pdata->panel_info.rst_seq[++i]) usleep_range(pinfo->rst_seq[i] * 1000, pinfo->rst_seq[i] * 1000); } if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { if (ctrl_pdata->bklt_en_gpio_invert) { rc = gpio_direction_output( ctrl_pdata->bklt_en_gpio, 0); gpio_set_value( (ctrl_pdata->bklt_en_gpio), 0); } else { rc = gpio_direction_output( ctrl_pdata->bklt_en_gpio, 1); gpio_set_value( (ctrl_pdata->bklt_en_gpio), 1); } if (rc) { pr_err("%s: unable to set dir for bklt gpio\n", __func__); goto exit; } } } if (gpio_is_valid(ctrl_pdata->lcd_mode_sel_gpio)) { Loading Loading @@ -410,15 +452,6 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) pr_debug("%s: Reset panel done\n", __func__); } } else { if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { if (ctrl_pdata->bklt_en_gpio_invert) gpio_set_value((ctrl_pdata->bklt_en_gpio), 1); else gpio_set_value((ctrl_pdata->bklt_en_gpio), 0); gpio_free(ctrl_pdata->bklt_en_gpio); } if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) { gpio_set_value((ctrl_pdata->disp_en_gpio), 0); gpio_free(ctrl_pdata->disp_en_gpio); Loading Loading @@ -801,6 +834,9 @@ static void mdss_dsi_panel_bl_ctrl(struct mdss_panel_data *pdata, if ((bl_level < pdata->panel_info.bl_min) && (bl_level != 0)) bl_level = pdata->panel_info.bl_min; /* enable the backlight gpio if present */ mdss_dsi_bl_gpio_ctrl(pdata, bl_level); switch (ctrl_pdata->bklt_ctrl) { case BL_WLED: led_trigger_event(bl_led_trigger, bl_level); Loading