diff options
| author | Adrian Salido-Moreno <adrianm@codeaurora.org> | 2013-01-18 14:31:20 -0800 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:14:11 -0700 |
| commit | e63a361cd8dbf147554332efdfa0935618b0db10 (patch) | |
| tree | 50758a4dda6223300a38d658f84556250fa81af8 | |
| parent | 4a6f58d802d81cf85d71be7319d23f47ba3661d9 (diff) | |
msm: mdss: fix handling of dynamic control paths
Allow dynamic changes in control paths by changing interrupt handler to
be able to handle different configurations depending on how control path
is configured, additionally make sure to clear control path mixer
configuration to make sure all pipes are properly dettached and won't
conflict with new control path configuration.
CRs-Fixed: 437343
Change-Id: I89c833f2cb6cc2556d15d468375d88a7a550f85e
Signed-off-by: Adrian Salido-Moreno <adrianm@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_ctl.c | 8 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c | 10 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_util.c | 15 |
3 files changed, 21 insertions, 12 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index 2f4c2ed3e7da..6030cbcc5166 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -698,6 +698,14 @@ int mdss_mdp_ctl_off(struct msm_fb_data_type *mfd) ctl->power_on = false; ctl->play_cnt = 0; ctl->clk_rate = 0; + if (ctl->mixer_left) { + mdss_mdp_ctl_write(ctl, MDSS_MDP_REG_CTL_LAYER( + ctl->mixer_left->num), 0); + } + if (ctl->mixer_right) { + mdss_mdp_ctl_write(ctl, MDSS_MDP_REG_CTL_LAYER( + ctl->mixer_right->num), 0); + } mdss_mdp_ctl_perf_commit(MDSS_MDP_PERF_UPDATE_ALL); } diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c index c8ace5db7f6d..2c0dddaaf9b8 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -265,6 +265,9 @@ static int mdss_mdp_writeback_stop(struct mdss_mdp_ctl *ctl) ctx = (struct mdss_mdp_writeback_ctx *) ctl->priv_data; if (ctx) { + mdss_mdp_set_intr_callback(ctx->intr_type, ctx->intf_num, + NULL, NULL); + ctl->priv_data = NULL; ctx->ref_cnt--; } @@ -318,8 +321,6 @@ static int mdss_mdp_writeback_display(struct mdss_mdp_ctl *ctl, void *arg) flush_bits = BIT(16); /* WB */ mdss_mdp_ctl_write(ctl, MDSS_MDP_REG_CTL_FLUSH, flush_bits); - mdss_mdp_set_intr_callback(ctx->intr_type, ctx->intf_num, - mdss_mdp_writeback_intr_done, ctx); mdss_mdp_irq_enable(ctx->intr_type, ctx->intf_num); mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false); @@ -353,6 +354,9 @@ int mdss_mdp_writeback_start(struct mdss_mdp_ctl *ctl) ctx->wb_num = ctl->num; /* wb num should match ctl num */ ctx->initialized = false; + mdss_mdp_set_intr_callback(ctx->intr_type, ctx->intf_num, + mdss_mdp_writeback_intr_done, ctx); + if (ctx->type == MDSS_MDP_WRITEBACK_TYPE_ROTATOR) ctl->prepare_fnc = mdss_mdp_writeback_prepare_rot; else /* wfd or line mode */ diff --git a/drivers/video/fbdev/msm/mdss_mdp_util.c b/drivers/video/fbdev/msm/mdss_mdp_util.c index 4663e478e51b..47e846f6229f 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_util.c +++ b/drivers/video/fbdev/msm/mdss_mdp_util.c @@ -79,7 +79,7 @@ int mdss_mdp_set_intr_callback(u32 intr_type, u32 intf_num, void (*fnc_ptr)(void *), void *arg) { unsigned long flags; - int index, ret; + int index; index = mdss_mdp_intr2index(intr_type, intf_num); if (index < 0) { @@ -89,16 +89,13 @@ int mdss_mdp_set_intr_callback(u32 intr_type, u32 intf_num, } spin_lock_irqsave(&mdss_mdp_intr_lock, flags); - if (!mdp_intr_cb[index].func) { - mdp_intr_cb[index].func = fnc_ptr; - mdp_intr_cb[index].arg = arg; - ret = 0; - } else { - ret = -EBUSY; - } + WARN(mdp_intr_cb[index].func && fnc_ptr, + "replacing current intr callback for ndx=%d\n", index); + mdp_intr_cb[index].func = fnc_ptr; + mdp_intr_cb[index].arg = arg; spin_unlock_irqrestore(&mdss_mdp_intr_lock, flags); - return ret; + return 0; } static inline void mdss_mdp_intr_done(int index) |
