diff options
| author | Aravind Venkateswaran <aravindh@codeaurora.org> | 2014-04-17 16:01:50 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:29:45 -0700 |
| commit | d4be657cb826a18041d3d9a5b31e445f9fa5cc59 (patch) | |
| tree | 521d96c97f93361f9907ddf3697a208957222c49 | |
| parent | e34e985389bfc2835ebb53bdd85ba525ccaab2f3 (diff) | |
msm: mdss: add support to enable idle power collapse
Add support for a new configuration entry to enable mdss power
collapse for idle screen use-cases, when a command mode interface is
active. Currently idle power collapse happens only if the Ultra-Low
Power State feature of the DSI controller is enabled. Adding a separate
configuration entry provides the flexibility to enable this feature
independent of the state of the DSI controller.
Change-Id: I4732a95a9f3d0db3e7ecc96a36414349ac6b5604
Signed-off-by: Aravind Venkateswaran <aravindh@codeaurora.org>
| -rw-r--r-- | Documentation/devicetree/bindings/fb/mdss-mdp.txt | 4 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss.h | 3 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 22 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c | 8 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 5 |
6 files changed, 28 insertions, 16 deletions
diff --git a/Documentation/devicetree/bindings/fb/mdss-mdp.txt b/Documentation/devicetree/bindings/fb/mdss-mdp.txt index 9c9cbbd49c41..73fa729b743b 100644 --- a/Documentation/devicetree/bindings/fb/mdss-mdp.txt +++ b/Documentation/devicetree/bindings/fb/mdss-mdp.txt @@ -398,6 +398,9 @@ Subnode properties: screen feature and has no relation with qcom,cont-splash-enabled entry present in panel configuration. +- qcom,mdss-idle-power-collapse-enabled: Boolean property that enables support + for mdss power collapse in idle + screen use cases with smart panels. Example: mdss_mdp: qcom,mdss_mdp@fd900000 { @@ -511,6 +514,7 @@ Example: qcom,mdss-prefill-post-scaler-buffer-pixels = <2048>; qcom,mdss-prefill-pingpong-buffer-pixels = <5120>; qcom,mdss-prefill-fbc-lines = <2>; + qcom,mdss-idle-power-collapse-enabled; mdss_fb0: qcom,mdss_fb_primary { cell-index = <0>; diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h index 31f94e254e05..b78b0bd60013 100644 --- a/drivers/video/fbdev/msm/mdss.h +++ b/drivers/video/fbdev/msm/mdss.h @@ -128,6 +128,7 @@ struct mdss_data_type { u8 has_wb_ad; u8 has_non_scalar_rgb; bool has_src_split; + bool idle_pc_enabled; u32 rotator_ot_limit; u32 mdp_irq_mask; @@ -209,7 +210,7 @@ struct mdss_data_type { struct mdss_prefill_data prefill_data; int handoff_pending; - bool ulps; + bool idle_pc; struct mdss_perf_tune perf_tune; }; extern struct mdss_data_type *mdss_res; diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index 307b3458b924..383a872b9f4c 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -2452,6 +2452,9 @@ static int mdss_mdp_parse_dt_misc(struct platform_device *pdev) mdata->has_src_split = of_property_read_bool(pdev->dev.of_node, "qcom,mdss-has-source-split"); + mdata->idle_pc_enabled = of_property_read_bool(pdev->dev.of_node, + "qcom,mdss-idle-power-collapse-enabled"); + prop = of_find_property(pdev->dev.of_node, "batfet-supply", NULL); mdata->batfet_required = prop ? true : false; rc = of_property_read_u32(pdev->dev.of_node, @@ -2771,7 +2774,7 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on) ret = regulator_enable(mdata->fs); if (ret) pr_err("Footswitch failed to enable\n"); - if (!mdata->ulps) { + if (!mdata->idle_pc) { mdss_mdp_cx_ctrl(mdata, true); mdss_mdp_batfet_ctrl(mdata, true); } @@ -2782,7 +2785,7 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on) mdss_iommu_dettach(mdata); if (mdata->fs_ena) { regulator_disable(mdata->fs); - if (!mdata->ulps) { + if (!mdata->idle_pc) { mdss_mdp_cx_ctrl(mdata, false); mdss_mdp_batfet_ctrl(mdata, false); } @@ -2792,17 +2795,16 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on) } /** - * mdss_mdp_footswitch_ctrl_ulps() - MDSS GDSC control with ULPS feature + * mdss_mdp_footswitch_ctrl_idle_pc() - MDSS GDSC control with idle power collapse * @on: 1 to turn on footswitch, 0 to turn off footswitch * @dev: framebuffer device node * * MDSS GDSC can be voted off during idle-screen usecase for MIPI DSI command - * mode displays with Ultra-Low Power State (ULPS) feature enabled. Upon - * subsequent frame update, MDSS GDSC needs to turned back on and hw state - * needs to be restored. It returns error if footswitch control API - * fails. + * mode displays. Upon subsequent frame update, MDSS GDSC needs to turned back + * on and hw state needs to be restored. It returns error if footswitch control + * API fails. */ -int mdss_mdp_footswitch_ctrl_ulps(int on, struct device *dev) +int mdss_mdp_footswitch_ctrl_idle_pc(int on, struct device *dev) { struct mdss_data_type *mdata = mdss_mdp_get_mdata(); int rc = 0; @@ -2816,9 +2818,9 @@ int mdss_mdp_footswitch_ctrl_ulps(int on, struct device *dev) goto end; } mdss_hw_init(mdata); - mdata->ulps = false; + mdata->idle_pc = false; } else { - mdata->ulps = true; + mdata->idle_pc = true; pm_runtime_put_sync(dev); } diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index 02ce00b5415e..73256a4f3909 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -785,7 +785,7 @@ int mdss_mdp_pipe_program_pixel_extn(struct mdss_mdp_pipe *pipe); int mdss_mdp_wb_set_secure(struct msm_fb_data_type *mfd, int enable); int mdss_mdp_wb_get_secure(struct msm_fb_data_type *mfd, uint8_t *enable); void mdss_mdp_ctl_restore(struct mdss_mdp_ctl *ctl); -int mdss_mdp_footswitch_ctrl_ulps(int on, struct device *dev); +int mdss_mdp_footswitch_ctrl_idle_pc(int on, struct device *dev); #define mfd_to_mdp5_data(mfd) (mfd->mdp.private1) #define mfd_to_mdata(mfd) (((struct mdss_overlay_private *)\ diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c index cfd044674ad5..666555b8016a 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c @@ -382,6 +382,7 @@ static void clk_ctrl_work(struct work_struct *work) static void __mdss_mdp_cmd_ulps_work(struct work_struct *work) { struct delayed_work *dw = to_delayed_work(work); + struct mdss_data_type *mdata = mdss_mdp_get_mdata(); struct mdss_mdp_cmd_ctx *ctx = container_of(dw, struct mdss_mdp_cmd_ctx, ulps_work); @@ -406,8 +407,11 @@ static void __mdss_mdp_cmd_ulps_work(struct work_struct *work) if (!mdss_mdp_ctl_intf_event(ctx->ctl, MDSS_EVENT_DSI_ULPS_CTRL, (void *)1)) { ctx->ulps = true; - ctx->ctl->play_cnt = 0; - mdss_mdp_footswitch_ctrl_ulps(0, &ctx->ctl->mfd->pdev->dev); + if (mdata->idle_pc_enabled) { + ctx->ctl->play_cnt = 0; + mdss_mdp_footswitch_ctrl_idle_pc(0, + &ctx->ctl->mfd->pdev->dev); + } } } diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index 74401cdc34d5..7e7ea8beaee9 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -1112,8 +1112,9 @@ int mdss_mdp_overlay_start(struct msm_fb_data_type *mfd) struct mdss_mdp_ctl *ctl = mdp5_data->ctl; if (ctl->power_on) { - if (mdp5_data->mdata->ulps) { - rc = mdss_mdp_footswitch_ctrl_ulps(1, &mfd->pdev->dev); + if (mdp5_data->mdata->idle_pc) { + rc = mdss_mdp_footswitch_ctrl_idle_pc(1, + &mfd->pdev->dev); if (rc) { pr_err("footswtich control power on failed rc=%d\n", rc); |
