Loading Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt +2 −0 Original line number Diff line number Diff line Loading @@ -320,6 +320,7 @@ Optional properties: - qcom,mdss-dsi-rx-eot-ignore: Boolean used to enable ignoring end of transmission packets. - qcom,mdss-dsi-tx-eot-append: Boolean used to enable appending end of transmission packets. - qcom,ulps-enabled: Boolean to enable support for Ultra Low Power State (ULPS) mode. - qcom,suspend-ulps-enabled: Boolean to enable support for ULPS mode for panels during suspend state. - qcom,panel-roi-alignment: Specifies the panel ROI alignment restrictions on its left, top, width, height alignments and minimum width and height values Loading Loading @@ -470,6 +471,7 @@ Example: mdss-dsi-rx-eot-ignore; mdss-dsi-tx-eot-append; qcom,ulps-enabled; qcom,suspend-ulps-enabled; qcom,panel-roi-alignment = <4 4 2 2 20 20>; qcom,esd-check-enabled; qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; Loading drivers/video/msm/mdss/mdss_dsi.c +23 −4 Original line number Diff line number Diff line Loading @@ -481,11 +481,13 @@ static int mdss_dsi_off(struct mdss_panel_data *pdata, int power_state) if (pdata->panel_info.type == MIPI_CMD_PANEL) mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 1); if (!pdata->panel_info.ulps_suspend_enabled) { /* disable DSI controller */ mdss_dsi_controller_cfg(0, pdata); /* disable DSI phy */ mdss_dsi_phy_disable(ctrl_pdata); } mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 0); Loading Loading @@ -1836,6 +1838,23 @@ int dsi_panel_device_register(struct device_node *pan_node, ctrl_pdata->ctrl_state = CTRL_STATE_UNKNOWN; /* * If ULPS during suspend is enabled, add an extra vote for the * DSI CTRL power module. This keeps the regulator always enabled. * This is needed for the DSI PHY to maintain ULPS state during * suspend also. */ if (pinfo->ulps_suspend_enabled) { rc = msm_dss_enable_vreg( ctrl_pdata->power_data[DSI_CTRL_PM].vreg_config, ctrl_pdata->power_data[DSI_CTRL_PM].num_vreg, 1); if (rc) { pr_err("%s: failed to enable vregs for DSI_CTRL_PM\n", __func__); return rc; } } if (pinfo->cont_splash_enabled) { rc = mdss_dsi_panel_power_ctrl(&(ctrl_pdata->panel_data), MDSS_PANEL_POWER_ON); Loading drivers/video/msm/mdss/mdss_dsi_panel.c +5 −0 Original line number Diff line number Diff line Loading @@ -1084,6 +1084,11 @@ static int mdss_dsi_parse_panel_features(struct device_node *np, pinfo->esd_check_enabled = of_property_read_bool(np, "qcom,esd-check-enabled"); pinfo->ulps_suspend_enabled = of_property_read_bool(np, "qcom,suspend-ulps-enabled"); pr_info("%s: ulps during suspend feature %s", __func__, (pinfo->ulps_suspend_enabled ? "enabled" : "disabled")); pinfo->mipi.dynamic_switch_enabled = of_property_read_bool(np, "qcom,dynamic-mode-switch-enabled"); Loading drivers/video/msm/mdss/mdss_panel.h +1 −0 Original line number Diff line number Diff line Loading @@ -365,6 +365,7 @@ struct mdss_panel_info { int pwm_period; bool dynamic_fps; bool ulps_feature_enabled; bool ulps_suspend_enabled; bool panel_ack_disabled; bool esd_check_enabled; char dfps_update; Loading drivers/video/msm/mdss/msm_mdss_io_8974.c +22 −11 Original line number Diff line number Diff line Loading @@ -394,7 +394,8 @@ int mdss_dsi_clk_init(struct platform_device *pdev, } if ((ctrl->panel_data.panel_info.type == MIPI_CMD_PANEL) || ctrl->panel_data.panel_info.mipi.dynamic_switch_enabled) { ctrl->panel_data.panel_info.mipi.dynamic_switch_enabled || ctrl->panel_data.panel_info.ulps_suspend_enabled) { ctrl->mmss_misc_ahb_clk = clk_get(dev, "core_mmss_clk"); if (IS_ERR(ctrl->mmss_misc_ahb_clk)) { ctrl->mmss_misc_ahb_clk = NULL; Loading Loading @@ -958,7 +959,8 @@ static int mdss_dsi_ulps_config(struct mdss_dsi_ctrl_pdata *ctrl, pinfo = &pdata->panel_info; mipi = &pinfo->mipi; if (!mdss_dsi_ulps_feature_enabled(pdata)) { if (!mdss_dsi_ulps_feature_enabled(pdata) && !pinfo->ulps_suspend_enabled) { pr_debug("%s: ULPS feature not supported. enable=%d\n", __func__, enable); return -ENOTSUPP; Loading Loading @@ -1219,11 +1221,13 @@ static int mdss_dsi_core_power_ctrl(struct mdss_dsi_ctrl_pdata *ctrl, } /* * Phy software reset should not be done for idle screen power * collapse use-case. Issue a phy software reset only when * unblanking the panel. * Phy software reset should not be done for: * 1.) Idle screen power collapse use-case. Issue a phy software * reset only when unblanking the panel in this case. * 2.) When ULPS during suspend is enabled. */ if (pdata->panel_info.blank_state == MDSS_PANEL_BLANK_BLANK) if (pdata->panel_info.blank_state == MDSS_PANEL_BLANK_BLANK && !pdata->panel_info.ulps_suspend_enabled) mdss_dsi_phy_sw_reset(ctrl); /* Loading Loading @@ -1266,8 +1270,12 @@ static int mdss_dsi_core_power_ctrl(struct mdss_dsi_ctrl_pdata *ctrl, goto error_ulps; } } else { /* Enable DSI clamps only if entering idle power collapse */ if (pdata->panel_info.blank_state != MDSS_PANEL_BLANK_BLANK) { /* * Enable DSI clamps only if entering idle power collapse or * when ULPS during suspend is enabled. */ if ((pdata->panel_info.blank_state != MDSS_PANEL_BLANK_BLANK) || pdata->panel_info.ulps_suspend_enabled) { rc = mdss_dsi_clamp_ctrl(ctrl, 1); if (rc) pr_err("%s: Failed to enable dsi clamps. rc=%d\n", Loading Loading @@ -1380,13 +1388,16 @@ static int mdss_dsi_clk_ctrl_sub(struct mdss_dsi_ctrl_pdata *ctrl, if (clk_type & DSI_LINK_CLKS) { /* * If ULPS feature is enabled, enter ULPS first. * No need to enable ULPS when turning off clocks * If ULPS during suspend is not enabled, no need * to enable ULPS when turning off the clocks * while blanking the panel. */ if ((mdss_dsi_ulps_feature_enabled(pdata)) && if (((mdss_dsi_ulps_feature_enabled(pdata)) && (pdata->panel_info.blank_state != MDSS_PANEL_BLANK_BLANK)) MDSS_PANEL_BLANK_BLANK)) || (pdata->panel_info.ulps_suspend_enabled)) mdss_dsi_ulps_config(ctrl, 1); mdss_dsi_link_clk_stop(ctrl); } if (clk_type & DSI_BUS_CLKS) { Loading Loading
Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt +2 −0 Original line number Diff line number Diff line Loading @@ -320,6 +320,7 @@ Optional properties: - qcom,mdss-dsi-rx-eot-ignore: Boolean used to enable ignoring end of transmission packets. - qcom,mdss-dsi-tx-eot-append: Boolean used to enable appending end of transmission packets. - qcom,ulps-enabled: Boolean to enable support for Ultra Low Power State (ULPS) mode. - qcom,suspend-ulps-enabled: Boolean to enable support for ULPS mode for panels during suspend state. - qcom,panel-roi-alignment: Specifies the panel ROI alignment restrictions on its left, top, width, height alignments and minimum width and height values Loading Loading @@ -470,6 +471,7 @@ Example: mdss-dsi-rx-eot-ignore; mdss-dsi-tx-eot-append; qcom,ulps-enabled; qcom,suspend-ulps-enabled; qcom,panel-roi-alignment = <4 4 2 2 20 20>; qcom,esd-check-enabled; qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; Loading
drivers/video/msm/mdss/mdss_dsi.c +23 −4 Original line number Diff line number Diff line Loading @@ -481,11 +481,13 @@ static int mdss_dsi_off(struct mdss_panel_data *pdata, int power_state) if (pdata->panel_info.type == MIPI_CMD_PANEL) mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 1); if (!pdata->panel_info.ulps_suspend_enabled) { /* disable DSI controller */ mdss_dsi_controller_cfg(0, pdata); /* disable DSI phy */ mdss_dsi_phy_disable(ctrl_pdata); } mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 0); Loading Loading @@ -1836,6 +1838,23 @@ int dsi_panel_device_register(struct device_node *pan_node, ctrl_pdata->ctrl_state = CTRL_STATE_UNKNOWN; /* * If ULPS during suspend is enabled, add an extra vote for the * DSI CTRL power module. This keeps the regulator always enabled. * This is needed for the DSI PHY to maintain ULPS state during * suspend also. */ if (pinfo->ulps_suspend_enabled) { rc = msm_dss_enable_vreg( ctrl_pdata->power_data[DSI_CTRL_PM].vreg_config, ctrl_pdata->power_data[DSI_CTRL_PM].num_vreg, 1); if (rc) { pr_err("%s: failed to enable vregs for DSI_CTRL_PM\n", __func__); return rc; } } if (pinfo->cont_splash_enabled) { rc = mdss_dsi_panel_power_ctrl(&(ctrl_pdata->panel_data), MDSS_PANEL_POWER_ON); Loading
drivers/video/msm/mdss/mdss_dsi_panel.c +5 −0 Original line number Diff line number Diff line Loading @@ -1084,6 +1084,11 @@ static int mdss_dsi_parse_panel_features(struct device_node *np, pinfo->esd_check_enabled = of_property_read_bool(np, "qcom,esd-check-enabled"); pinfo->ulps_suspend_enabled = of_property_read_bool(np, "qcom,suspend-ulps-enabled"); pr_info("%s: ulps during suspend feature %s", __func__, (pinfo->ulps_suspend_enabled ? "enabled" : "disabled")); pinfo->mipi.dynamic_switch_enabled = of_property_read_bool(np, "qcom,dynamic-mode-switch-enabled"); Loading
drivers/video/msm/mdss/mdss_panel.h +1 −0 Original line number Diff line number Diff line Loading @@ -365,6 +365,7 @@ struct mdss_panel_info { int pwm_period; bool dynamic_fps; bool ulps_feature_enabled; bool ulps_suspend_enabled; bool panel_ack_disabled; bool esd_check_enabled; char dfps_update; Loading
drivers/video/msm/mdss/msm_mdss_io_8974.c +22 −11 Original line number Diff line number Diff line Loading @@ -394,7 +394,8 @@ int mdss_dsi_clk_init(struct platform_device *pdev, } if ((ctrl->panel_data.panel_info.type == MIPI_CMD_PANEL) || ctrl->panel_data.panel_info.mipi.dynamic_switch_enabled) { ctrl->panel_data.panel_info.mipi.dynamic_switch_enabled || ctrl->panel_data.panel_info.ulps_suspend_enabled) { ctrl->mmss_misc_ahb_clk = clk_get(dev, "core_mmss_clk"); if (IS_ERR(ctrl->mmss_misc_ahb_clk)) { ctrl->mmss_misc_ahb_clk = NULL; Loading Loading @@ -958,7 +959,8 @@ static int mdss_dsi_ulps_config(struct mdss_dsi_ctrl_pdata *ctrl, pinfo = &pdata->panel_info; mipi = &pinfo->mipi; if (!mdss_dsi_ulps_feature_enabled(pdata)) { if (!mdss_dsi_ulps_feature_enabled(pdata) && !pinfo->ulps_suspend_enabled) { pr_debug("%s: ULPS feature not supported. enable=%d\n", __func__, enable); return -ENOTSUPP; Loading Loading @@ -1219,11 +1221,13 @@ static int mdss_dsi_core_power_ctrl(struct mdss_dsi_ctrl_pdata *ctrl, } /* * Phy software reset should not be done for idle screen power * collapse use-case. Issue a phy software reset only when * unblanking the panel. * Phy software reset should not be done for: * 1.) Idle screen power collapse use-case. Issue a phy software * reset only when unblanking the panel in this case. * 2.) When ULPS during suspend is enabled. */ if (pdata->panel_info.blank_state == MDSS_PANEL_BLANK_BLANK) if (pdata->panel_info.blank_state == MDSS_PANEL_BLANK_BLANK && !pdata->panel_info.ulps_suspend_enabled) mdss_dsi_phy_sw_reset(ctrl); /* Loading Loading @@ -1266,8 +1270,12 @@ static int mdss_dsi_core_power_ctrl(struct mdss_dsi_ctrl_pdata *ctrl, goto error_ulps; } } else { /* Enable DSI clamps only if entering idle power collapse */ if (pdata->panel_info.blank_state != MDSS_PANEL_BLANK_BLANK) { /* * Enable DSI clamps only if entering idle power collapse or * when ULPS during suspend is enabled. */ if ((pdata->panel_info.blank_state != MDSS_PANEL_BLANK_BLANK) || pdata->panel_info.ulps_suspend_enabled) { rc = mdss_dsi_clamp_ctrl(ctrl, 1); if (rc) pr_err("%s: Failed to enable dsi clamps. rc=%d\n", Loading Loading @@ -1380,13 +1388,16 @@ static int mdss_dsi_clk_ctrl_sub(struct mdss_dsi_ctrl_pdata *ctrl, if (clk_type & DSI_LINK_CLKS) { /* * If ULPS feature is enabled, enter ULPS first. * No need to enable ULPS when turning off clocks * If ULPS during suspend is not enabled, no need * to enable ULPS when turning off the clocks * while blanking the panel. */ if ((mdss_dsi_ulps_feature_enabled(pdata)) && if (((mdss_dsi_ulps_feature_enabled(pdata)) && (pdata->panel_info.blank_state != MDSS_PANEL_BLANK_BLANK)) MDSS_PANEL_BLANK_BLANK)) || (pdata->panel_info.ulps_suspend_enabled)) mdss_dsi_ulps_config(ctrl, 1); mdss_dsi_link_clk_stop(ctrl); } if (clk_type & DSI_BUS_CLKS) { Loading