Loading drivers/video/fbdev/msm/mdp3.c +33 −0 Original line number Diff line number Diff line Loading @@ -2111,9 +2111,41 @@ static ssize_t mdp3_show_smart_blit(struct device *dev, static DEVICE_ATTR(smart_blit, 0664, mdp3_show_smart_blit, mdp3_store_smart_blit); static ssize_t mdp3_store_twm(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { u32 data = -1; ssize_t rc = 0; rc = kstrtoint(buf, 10, &data); if (rc) { pr_err("kstrtoint failed. rc=%d\n", rc); return rc; } mdp3_res->twm_en = data ? true : false; pr_err("TWM : %s\n", (mdp3_res->twm_en) ? "ENABLED" : "DISABLED"); return len; } static ssize_t mdp3_show_twm(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t ret = 0; pr_err("TWM : %s\n", (mdp3_res->twm_en) ? "ENABLED" : "DISABLED"); ret = snprintf(buf, PAGE_SIZE, "%d\n", mdp3_res->twm_en); return ret; } static DEVICE_ATTR(twm_enable, 0664, mdp3_show_twm, mdp3_store_twm); static struct attribute *mdp3_fs_attrs[] = { &dev_attr_caps.attr, &dev_attr_smart_blit.attr, &dev_attr_twm_enable.attr, NULL }; Loading Loading @@ -2378,6 +2410,7 @@ static int mdp3_probe(struct platform_device *pdev) mdp3_dynamic_clock_gating_ctrl; mdp3_res->mdss_util->panel_intf_type = mdp3_panel_intf_type; mdp3_res->mdss_util->panel_intf_status = mdp3_panel_get_intf_status; mdp3_res->twm_en = false; if (mdp3_res->mdss_util->param_check(mdss_mdp3_panel)) { mdp3_res->mdss_util->display_disabled = true; Loading drivers/video/fbdev/msm/mdp3.h +1 −1 Original line number Diff line number Diff line Loading @@ -208,7 +208,7 @@ struct mdp3_hw_resource { bool solid_fill_vote_en; struct list_head reg_bus_clist; struct mutex reg_bus_lock; bool twm_en; u32 max_bw; u8 ppp_formats[BITS_TO_BYTES(MDP_IMGTYPE_LIMIT1)]; Loading drivers/video/fbdev/msm/mdp3_ctrl.c +30 −4 Original line number Diff line number Diff line Loading @@ -983,6 +983,11 @@ static int mdp3_ctrl_on(struct msm_fb_data_type *mfd) return rc; } static bool mdp3_is_twm_en(void) { return mdp3_res->twm_en; } static int mdp3_ctrl_off(struct msm_fb_data_type *mfd) { int rc = 0; Loading Loading @@ -1025,9 +1030,11 @@ static int mdp3_ctrl_off(struct msm_fb_data_type *mfd) pr_debug("fb%d is off already", mfd->index); goto off_error; } if (panel && panel->set_backlight) if (panel && panel->set_backlight) { if (!mdp3_is_twm_en()) panel->set_backlight(panel, 0); } } /* * While transitioning from interactive to low power, Loading Loading @@ -1065,9 +1072,27 @@ static int mdp3_ctrl_off(struct msm_fb_data_type *mfd) mdp3_irq_deregister(); } if (panel->event_handler) if (panel->event_handler) { if (mdp3_is_twm_en()) { pr_info("TWM active skip panel off, disable disp_en\n"); if (gpio_is_valid(panel->panel_en_gpio)) { rc = gpio_direction_output( panel->panel_en_gpio, 1); if (rc) { pr_err("%s:set dir for gpio(%d) FAIL\n", __func__, panel->panel_en_gpio); } else { gpio_set_value((panel->panel_en_gpio), 0); usleep_range(100, 110); pr_debug("%s:set disp_en_gpio_%d Low\n", __func__, panel->panel_en_gpio); } } } else { rc = panel->event_handler(panel, MDSS_EVENT_PANEL_OFF, (void *) (long int)mfd->panel_power_state); } } if (rc) pr_err("EVENT_PANEL_OFF error (%d)\n", rc); Loading Loading @@ -2870,6 +2895,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) mdp3_interface->configure_panel = mdp3_update_panel_info; mdp3_interface->input_event_handler = NULL; mdp3_interface->signal_retire_fence = NULL; mdp3_interface->is_twm_en = mdp3_is_twm_en; mdp3_session = kzalloc(sizeof(struct mdp3_session_data), GFP_KERNEL); if (!mdp3_session) Loading drivers/video/fbdev/msm/mdp3_ppp.c +8 −0 Original line number Diff line number Diff line Loading @@ -196,12 +196,20 @@ int mdp3_ppp_verify_res(struct mdp_blit_req *req) if (((req->src_rect.x + req->src_rect.w) > req->src.width) || ((req->src_rect.y + req->src_rect.h) > req->src.height)) { pr_err("%s: src roi (x=%d,y=%d,w=%d, h=%d) WxH(%dx%d)\n", __func__, req->src_rect.x, req->src_rect.y, req->src_rect.w, req->src_rect.h, req->src.width, req->src.height); pr_err("%s: src roi larger than boundary\n", __func__); return -EINVAL; } if (((req->dst_rect.x + req->dst_rect.w) > req->dst.width) || ((req->dst_rect.y + req->dst_rect.h) > req->dst.height)) { pr_err("%s: dst roi (x=%d,y=%d,w=%d, h=%d) WxH(%dx%d)\n", __func__, req->dst_rect.x, req->dst_rect.y, req->dst_rect.w, req->dst_rect.h, req->dst.width, req->dst.height); pr_err("%s: dst roi larger than boundary\n", __func__); return -EINVAL; } Loading drivers/video/fbdev/msm/mdss_dsi.c +3 −1 Original line number Diff line number Diff line Loading @@ -1704,7 +1704,8 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata, int power_state) ATRACE_BEGIN("dsi_panel_off"); ret = ctrl_pdata->off(pdata); if (ret) { pr_err("%s: Panel OFF failed\n", __func__); pr_err("%s: Panel OFF failed\n", __func__); goto error; } ATRACE_END("dsi_panel_off"); Loading Loading @@ -4069,6 +4070,7 @@ static int mdss_dsi_parse_gpio_params(struct platform_device *ctrl_pdev, if (!gpio_is_valid(ctrl_pdata->disp_en_gpio)) pr_debug("%s:%d, Disp_en gpio not specified\n", __func__, __LINE__); pdata->panel_en_gpio = ctrl_pdata->disp_en_gpio; } ctrl_pdata->disp_te_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node, Loading Loading
drivers/video/fbdev/msm/mdp3.c +33 −0 Original line number Diff line number Diff line Loading @@ -2111,9 +2111,41 @@ static ssize_t mdp3_show_smart_blit(struct device *dev, static DEVICE_ATTR(smart_blit, 0664, mdp3_show_smart_blit, mdp3_store_smart_blit); static ssize_t mdp3_store_twm(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { u32 data = -1; ssize_t rc = 0; rc = kstrtoint(buf, 10, &data); if (rc) { pr_err("kstrtoint failed. rc=%d\n", rc); return rc; } mdp3_res->twm_en = data ? true : false; pr_err("TWM : %s\n", (mdp3_res->twm_en) ? "ENABLED" : "DISABLED"); return len; } static ssize_t mdp3_show_twm(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t ret = 0; pr_err("TWM : %s\n", (mdp3_res->twm_en) ? "ENABLED" : "DISABLED"); ret = snprintf(buf, PAGE_SIZE, "%d\n", mdp3_res->twm_en); return ret; } static DEVICE_ATTR(twm_enable, 0664, mdp3_show_twm, mdp3_store_twm); static struct attribute *mdp3_fs_attrs[] = { &dev_attr_caps.attr, &dev_attr_smart_blit.attr, &dev_attr_twm_enable.attr, NULL }; Loading Loading @@ -2378,6 +2410,7 @@ static int mdp3_probe(struct platform_device *pdev) mdp3_dynamic_clock_gating_ctrl; mdp3_res->mdss_util->panel_intf_type = mdp3_panel_intf_type; mdp3_res->mdss_util->panel_intf_status = mdp3_panel_get_intf_status; mdp3_res->twm_en = false; if (mdp3_res->mdss_util->param_check(mdss_mdp3_panel)) { mdp3_res->mdss_util->display_disabled = true; Loading
drivers/video/fbdev/msm/mdp3.h +1 −1 Original line number Diff line number Diff line Loading @@ -208,7 +208,7 @@ struct mdp3_hw_resource { bool solid_fill_vote_en; struct list_head reg_bus_clist; struct mutex reg_bus_lock; bool twm_en; u32 max_bw; u8 ppp_formats[BITS_TO_BYTES(MDP_IMGTYPE_LIMIT1)]; Loading
drivers/video/fbdev/msm/mdp3_ctrl.c +30 −4 Original line number Diff line number Diff line Loading @@ -983,6 +983,11 @@ static int mdp3_ctrl_on(struct msm_fb_data_type *mfd) return rc; } static bool mdp3_is_twm_en(void) { return mdp3_res->twm_en; } static int mdp3_ctrl_off(struct msm_fb_data_type *mfd) { int rc = 0; Loading Loading @@ -1025,9 +1030,11 @@ static int mdp3_ctrl_off(struct msm_fb_data_type *mfd) pr_debug("fb%d is off already", mfd->index); goto off_error; } if (panel && panel->set_backlight) if (panel && panel->set_backlight) { if (!mdp3_is_twm_en()) panel->set_backlight(panel, 0); } } /* * While transitioning from interactive to low power, Loading Loading @@ -1065,9 +1072,27 @@ static int mdp3_ctrl_off(struct msm_fb_data_type *mfd) mdp3_irq_deregister(); } if (panel->event_handler) if (panel->event_handler) { if (mdp3_is_twm_en()) { pr_info("TWM active skip panel off, disable disp_en\n"); if (gpio_is_valid(panel->panel_en_gpio)) { rc = gpio_direction_output( panel->panel_en_gpio, 1); if (rc) { pr_err("%s:set dir for gpio(%d) FAIL\n", __func__, panel->panel_en_gpio); } else { gpio_set_value((panel->panel_en_gpio), 0); usleep_range(100, 110); pr_debug("%s:set disp_en_gpio_%d Low\n", __func__, panel->panel_en_gpio); } } } else { rc = panel->event_handler(panel, MDSS_EVENT_PANEL_OFF, (void *) (long int)mfd->panel_power_state); } } if (rc) pr_err("EVENT_PANEL_OFF error (%d)\n", rc); Loading Loading @@ -2870,6 +2895,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) mdp3_interface->configure_panel = mdp3_update_panel_info; mdp3_interface->input_event_handler = NULL; mdp3_interface->signal_retire_fence = NULL; mdp3_interface->is_twm_en = mdp3_is_twm_en; mdp3_session = kzalloc(sizeof(struct mdp3_session_data), GFP_KERNEL); if (!mdp3_session) Loading
drivers/video/fbdev/msm/mdp3_ppp.c +8 −0 Original line number Diff line number Diff line Loading @@ -196,12 +196,20 @@ int mdp3_ppp_verify_res(struct mdp_blit_req *req) if (((req->src_rect.x + req->src_rect.w) > req->src.width) || ((req->src_rect.y + req->src_rect.h) > req->src.height)) { pr_err("%s: src roi (x=%d,y=%d,w=%d, h=%d) WxH(%dx%d)\n", __func__, req->src_rect.x, req->src_rect.y, req->src_rect.w, req->src_rect.h, req->src.width, req->src.height); pr_err("%s: src roi larger than boundary\n", __func__); return -EINVAL; } if (((req->dst_rect.x + req->dst_rect.w) > req->dst.width) || ((req->dst_rect.y + req->dst_rect.h) > req->dst.height)) { pr_err("%s: dst roi (x=%d,y=%d,w=%d, h=%d) WxH(%dx%d)\n", __func__, req->dst_rect.x, req->dst_rect.y, req->dst_rect.w, req->dst_rect.h, req->dst.width, req->dst.height); pr_err("%s: dst roi larger than boundary\n", __func__); return -EINVAL; } Loading
drivers/video/fbdev/msm/mdss_dsi.c +3 −1 Original line number Diff line number Diff line Loading @@ -1704,7 +1704,8 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata, int power_state) ATRACE_BEGIN("dsi_panel_off"); ret = ctrl_pdata->off(pdata); if (ret) { pr_err("%s: Panel OFF failed\n", __func__); pr_err("%s: Panel OFF failed\n", __func__); goto error; } ATRACE_END("dsi_panel_off"); Loading Loading @@ -4069,6 +4070,7 @@ static int mdss_dsi_parse_gpio_params(struct platform_device *ctrl_pdev, if (!gpio_is_valid(ctrl_pdata->disp_en_gpio)) pr_debug("%s:%d, Disp_en gpio not specified\n", __func__, __LINE__); pdata->panel_en_gpio = ctrl_pdata->disp_en_gpio; } ctrl_pdata->disp_te_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node, Loading