Loading msm/dsi/dsi_display.c +6 −3 Original line number Diff line number Diff line Loading @@ -2660,7 +2660,7 @@ static int dsi_display_phy_power_off(struct dsi_display *display) } #ifdef CONFIG_DEEPSLEEP static int dsi_display_unset_clk_src(struct dsi_display *display) int dsi_display_unset_clk_src(struct dsi_display *display) { int rc = 0; int i; Loading @@ -2685,13 +2685,13 @@ static int dsi_display_unset_clk_src(struct dsi_display *display) return 0; } #else static inline int dsi_display_unset_clk_src(struct dsi_display *display) inline int dsi_display_unset_clk_src(struct dsi_display *display) { return 0; } #endif static int dsi_display_set_clk_src(struct dsi_display *display) int dsi_display_set_clk_src(struct dsi_display *display) { int rc = 0; int i; Loading Loading @@ -4201,6 +4201,9 @@ static int dsi_display_parse_dt(struct dsi_display *display) /* Parse TE data */ dsi_display_parse_te_data(display); display->needs_clk_src_reset = of_property_read_bool(of_node, "qcom,needs-clk-src-reset"); /* Parse all external bridges from port 0 */ display_for_each_ctrl(i, display) { display->ext_bridge[i].node_of = Loading msm/dsi/dsi_display.h +16 −0 Original line number Diff line number Diff line Loading @@ -214,6 +214,7 @@ struct dsi_display { int disp_te_gpio; bool is_te_irq_enabled; struct completion esd_te_gate; bool needs_clk_src_reset; u32 ctrl_count; struct dsi_display_ctrl ctrl[MAX_DSI_CTRLS_PER_DISPLAY]; Loading Loading @@ -801,4 +802,19 @@ int dsi_display_dump_clks_state(struct dsi_display *display); */ void dsi_display_dfps_update_parent(struct dsi_display *display); /** * dsi_display_unset_clk_src() - reset the clocks source to default * @display: Handle to display * * Return: Zero on Success */ int dsi_display_unset_clk_src(struct dsi_display *display); /** * dsi_display_set_clk_src() - set the clocks source * @display: Handle to display * * Return: Zero on Success */ int dsi_display_set_clk_src(struct dsi_display *display); #endif /* _DSI_DISPLAY_H_ */ msm/sde/sde_kms.c +45 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include <linux/of_irq.h> #include <linux/dma-buf.h> #include <linux/memblock.h> #include <linux/suspend.h> #include <drm/drm_atomic_uapi.h> #include <drm/drm_probe_helper.h> Loading Loading @@ -3713,6 +3714,44 @@ void sde_kms_display_early_wakeup(struct drm_device *dev, drm_connector_list_iter_end(&conn_iter); } #ifdef CONFIG_DEEPSLEEP static int _sde_kms_pm_set_clk_src(struct sde_kms *sde_kms, bool enable) { int i, rc = 0; void *display; struct dsi_display *dsi_display; if (mem_sleep_current == PM_SUSPEND_MEM) { SDE_INFO("Deepsleep\n"); for (i = 0; i < sde_kms->dsi_display_count; i++) { display = sde_kms->dsi_displays[i]; dsi_display = (struct dsi_display *)display; if (!dsi_display->needs_clk_src_reset) continue; if (enable) rc = dsi_display_set_clk_src(dsi_display); else rc = dsi_display_unset_clk_src(dsi_display); if (rc) { SDE_ERROR("failed to set clks rc:%d\n", rc); return rc; } } } return rc; } #else static inline int _sde_kms_pm_set_clk_src(struct sde_kms *sde_kms, bool enable) { return 0; } #endif static void _sde_kms_pm_suspend_idle_helper(struct sde_kms *sde_kms, struct device *dev) { Loading Loading @@ -3904,6 +3943,9 @@ static int sde_kms_pm_suspend(struct device *dev) pm_runtime_put_sync(dev); pm_runtime_get_noresume(dev); /* reset clock source based on PM suspend state */ _sde_kms_pm_set_clk_src(sde_kms, false); /* dump clock state before entering suspend */ if (sde_kms->pm_suspend_clk_dump) _sde_kms_dump_clks_state(sde_kms); Loading Loading @@ -3941,6 +3983,9 @@ static int sde_kms_pm_resume(struct device *dev) goto end; } /* reset clock source based on PM suspend state */ _sde_kms_pm_set_clk_src(sde_kms, true); sde_kms->suspend_block = false; if (sde_kms->suspend_state) { Loading Loading
msm/dsi/dsi_display.c +6 −3 Original line number Diff line number Diff line Loading @@ -2660,7 +2660,7 @@ static int dsi_display_phy_power_off(struct dsi_display *display) } #ifdef CONFIG_DEEPSLEEP static int dsi_display_unset_clk_src(struct dsi_display *display) int dsi_display_unset_clk_src(struct dsi_display *display) { int rc = 0; int i; Loading @@ -2685,13 +2685,13 @@ static int dsi_display_unset_clk_src(struct dsi_display *display) return 0; } #else static inline int dsi_display_unset_clk_src(struct dsi_display *display) inline int dsi_display_unset_clk_src(struct dsi_display *display) { return 0; } #endif static int dsi_display_set_clk_src(struct dsi_display *display) int dsi_display_set_clk_src(struct dsi_display *display) { int rc = 0; int i; Loading Loading @@ -4201,6 +4201,9 @@ static int dsi_display_parse_dt(struct dsi_display *display) /* Parse TE data */ dsi_display_parse_te_data(display); display->needs_clk_src_reset = of_property_read_bool(of_node, "qcom,needs-clk-src-reset"); /* Parse all external bridges from port 0 */ display_for_each_ctrl(i, display) { display->ext_bridge[i].node_of = Loading
msm/dsi/dsi_display.h +16 −0 Original line number Diff line number Diff line Loading @@ -214,6 +214,7 @@ struct dsi_display { int disp_te_gpio; bool is_te_irq_enabled; struct completion esd_te_gate; bool needs_clk_src_reset; u32 ctrl_count; struct dsi_display_ctrl ctrl[MAX_DSI_CTRLS_PER_DISPLAY]; Loading Loading @@ -801,4 +802,19 @@ int dsi_display_dump_clks_state(struct dsi_display *display); */ void dsi_display_dfps_update_parent(struct dsi_display *display); /** * dsi_display_unset_clk_src() - reset the clocks source to default * @display: Handle to display * * Return: Zero on Success */ int dsi_display_unset_clk_src(struct dsi_display *display); /** * dsi_display_set_clk_src() - set the clocks source * @display: Handle to display * * Return: Zero on Success */ int dsi_display_set_clk_src(struct dsi_display *display); #endif /* _DSI_DISPLAY_H_ */
msm/sde/sde_kms.c +45 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include <linux/of_irq.h> #include <linux/dma-buf.h> #include <linux/memblock.h> #include <linux/suspend.h> #include <drm/drm_atomic_uapi.h> #include <drm/drm_probe_helper.h> Loading Loading @@ -3713,6 +3714,44 @@ void sde_kms_display_early_wakeup(struct drm_device *dev, drm_connector_list_iter_end(&conn_iter); } #ifdef CONFIG_DEEPSLEEP static int _sde_kms_pm_set_clk_src(struct sde_kms *sde_kms, bool enable) { int i, rc = 0; void *display; struct dsi_display *dsi_display; if (mem_sleep_current == PM_SUSPEND_MEM) { SDE_INFO("Deepsleep\n"); for (i = 0; i < sde_kms->dsi_display_count; i++) { display = sde_kms->dsi_displays[i]; dsi_display = (struct dsi_display *)display; if (!dsi_display->needs_clk_src_reset) continue; if (enable) rc = dsi_display_set_clk_src(dsi_display); else rc = dsi_display_unset_clk_src(dsi_display); if (rc) { SDE_ERROR("failed to set clks rc:%d\n", rc); return rc; } } } return rc; } #else static inline int _sde_kms_pm_set_clk_src(struct sde_kms *sde_kms, bool enable) { return 0; } #endif static void _sde_kms_pm_suspend_idle_helper(struct sde_kms *sde_kms, struct device *dev) { Loading Loading @@ -3904,6 +3943,9 @@ static int sde_kms_pm_suspend(struct device *dev) pm_runtime_put_sync(dev); pm_runtime_get_noresume(dev); /* reset clock source based on PM suspend state */ _sde_kms_pm_set_clk_src(sde_kms, false); /* dump clock state before entering suspend */ if (sde_kms->pm_suspend_clk_dump) _sde_kms_dump_clks_state(sde_kms); Loading Loading @@ -3941,6 +3983,9 @@ static int sde_kms_pm_resume(struct device *dev) goto end; } /* reset clock source based on PM suspend state */ _sde_kms_pm_set_clk_src(sde_kms, true); sde_kms->suspend_block = false; if (sde_kms->suspend_state) { Loading