summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShivaraj Shetty <shivaraj@codeaurora.org>2013-11-29 14:58:54 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:23:59 -0700
commitbc42f2cffa0161ab871ec3ee2cc321529f01bcb1 (patch)
tree32d4ef3706596ba13a268d8141447ab45dd958ea
parentc703f37d1479f7c48b6a1bcf9a6d667ef6b0061b (diff)
msm: mdss: Update the dma stride value on mdp3
The frame buffer is allocated from user space. And it may have some special alignment requirement. Rather than assuming the alignment in the driver, this change is to use the value passed in from the user space to configure the dma stride register. CRs-fixed: 582796 Change-Id: Ic3884ee0a530ed1ab83b6df26ba180fd21257ae0 Signed-off-by: Shivaraj Shetty <shivaraj@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdp3_ctrl.c16
-rw-r--r--drivers/video/fbdev/msm/mdp3_dma.c19
-rw-r--r--drivers/video/fbdev/msm/mdp3_dma.h2
3 files changed, 37 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdp3_ctrl.c b/drivers/video/fbdev/msm/mdp3_ctrl.c
index c85104c86c2f..7907051c24e8 100644
--- a/drivers/video/fbdev/msm/mdp3_ctrl.c
+++ b/drivers/video/fbdev/msm/mdp3_ctrl.c
@@ -839,6 +839,14 @@ static int mdp3_overlay_set(struct msm_fb_data_type *mfd,
{
int rc = 0;
struct mdp3_session_data *mdp3_session = mfd->mdp.private1;
+ struct fb_var_screeninfo *var;
+ struct fb_fix_screeninfo *fix;
+ struct fb_info *fbi = mfd->fbi;
+ int stride;
+
+ fix = &fbi->fix;
+ var = &fbi->var;
+ stride = req->src.width * var->bits_per_pixel/8;
mutex_lock(&mdp3_session->lock);
@@ -847,6 +855,9 @@ static int mdp3_overlay_set(struct msm_fb_data_type *mfd,
mdp3_session->overlay = *req;
if (req->id == MSMFB_NEW_REQUEST) {
+ if (fix->line_length != stride)
+ mdp3_session->dma->config_stride(
+ mdp3_session->dma, stride);
mdp3_session->overlay.id = 1;
req->id = 1;
}
@@ -860,10 +871,15 @@ static int mdp3_overlay_unset(struct msm_fb_data_type *mfd, int ndx)
{
int rc = 0;
struct mdp3_session_data *mdp3_session = mfd->mdp.private1;
+ struct fb_info *fbi = mfd->fbi;
+ struct fb_fix_screeninfo *fix;
+ fix = &fbi->fix;
mutex_lock(&mdp3_session->lock);
if (mdp3_session->overlay.id == ndx && ndx == 1) {
+ mdp3_session->dma->config_stride(mdp3_session->dma,
+ fix->line_length);
mdp3_session->overlay.id = MSMFB_NEW_REQUEST;
mdp3_bufq_deinit(&mdp3_session->bufq_in);
} else {
diff --git a/drivers/video/fbdev/msm/mdp3_dma.c b/drivers/video/fbdev/msm/mdp3_dma.c
index 6489cdc1e461..4d9bceab8691 100644
--- a/drivers/video/fbdev/msm/mdp3_dma.c
+++ b/drivers/video/fbdev/msm/mdp3_dma.c
@@ -268,6 +268,23 @@ static int mdp3_dma_sync_config(struct mdp3_dma *dma,
return 0;
}
+static void mdp3_dma_stride_config(struct mdp3_dma *dma, int stride)
+{
+ struct mdp3_dma_source *source_config;
+ u32 dma_stride_offset;
+
+ if (dma->dma_sel == MDP3_DMA_P)
+ dma_stride_offset = MDP3_REG_DMA_P_IBUF_Y_STRIDE;
+ else
+ dma_stride_offset = MDP3_REG_DMA_S_IBUF_Y_STRIDE;
+
+ source_config = &dma->source_config;
+ source_config->stride = stride;
+ pr_debug("%s: Update the fb stride for DMA to %d", __func__,
+ (u32)source_config->stride);
+ MDP3_REG_WRITE(dma_stride_offset, source_config->stride);
+}
+
static int mdp3_dmap_config(struct mdp3_dma *dma,
struct mdp3_dma_source *source_config,
struct mdp3_dma_output_config *output_config)
@@ -855,6 +872,7 @@ int mdp3_dma_init(struct mdp3_dma *dma)
dma->vsync_enable = mdp3_dma_vsync_enable;
dma->start = mdp3_dma_start;
dma->stop = mdp3_dma_stop;
+ dma->config_stride = mdp3_dma_stride_config;
break;
case MDP3_DMA_S:
dma->dma_config = mdp3_dmas_config;
@@ -869,6 +887,7 @@ int mdp3_dma_init(struct mdp3_dma *dma)
dma->vsync_enable = mdp3_dma_vsync_enable;
dma->start = mdp3_dma_start;
dma->stop = mdp3_dma_stop;
+ dma->config_stride = mdp3_dma_stride_config;
break;
case MDP3_DMA_E:
default:
diff --git a/drivers/video/fbdev/msm/mdp3_dma.h b/drivers/video/fbdev/msm/mdp3_dma.h
index b40b4236c1a7..935025f2ea45 100644
--- a/drivers/video/fbdev/msm/mdp3_dma.h
+++ b/drivers/video/fbdev/msm/mdp3_dma.h
@@ -287,6 +287,8 @@ struct mdp3_dma {
int (*histo_op)(struct mdp3_dma *dma, u32 op);
+ void (*config_stride)(struct mdp3_dma *dma, int stride);
+
void (*vsync_enable)(struct mdp3_dma *dma,
struct mdp3_vsync_notification *vsync_client);
};