diff options
| author | Siddhartha Agrawal <agrawals@codeaurora.org> | 2013-02-25 11:48:56 -0800 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:15:00 -0700 |
| commit | a6dc8943f3461e3066b2f61ded490cf6db5e90cc (patch) | |
| tree | f773fcd87917b4acb5a6f2d1f8d6bdeb16a037fc | |
| parent | a83bd56c966bf6d036ecf767e81fb02c8a043d5e (diff) | |
mdss: Copy splash screen buffer into MDSS buffer
Copy splash screen framebuffer into temporary buffer
till we get the first frame update.
Change-Id: Ib8a3742bf8c58b29fd7763dfe477b83939ece193
Signed-off-by: Siddhartha Agrawal <agrawals@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.c | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 70 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_panel.h | 1 |
4 files changed, 66 insertions, 7 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index 36f70dab2e4f..68042fd9ce28 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -1851,6 +1851,7 @@ int mdss_register_panel(struct platform_device *pdev, if (pdata->panel_info.cont_splash_enabled) { mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false); mdss_mdp_footswitch_ctrl_splash(1); + mdss_mdp_copy_splash_screen(pdata); } mdss_notfound: diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index eadf87708d98..4c70770abf57 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -296,6 +296,7 @@ static inline u32 mdss_mdp_ctl_read(struct mdss_mdp_ctl *ctl, u32 reg) irqreturn_t mdss_mdp_isr(int irq, void *ptr); int mdss_iommu_attach(struct mdss_data_type *mdata); +int mdss_mdp_copy_splash_screen(struct mdss_panel_data *pdata); int mdss_mdp_irq_enable(u32 intr_type, u32 intf_num); void mdss_mdp_irq_disable(u32 intr_type, u32 intf_num); int mdss_mdp_hist_irq_enable(u32 irq); diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index 4f7176de8202..6862c0ef15bd 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -500,18 +500,74 @@ static int mdss_mdp_overlay_cleanup(struct msm_fb_data_type *mfd) return 0; } -static int mdss_mdp_reconfigure_splash_done(struct mdss_mdp_ctl *ctl) +int mdss_mdp_copy_splash_screen(struct mdss_panel_data *pdata) { + void *virt = NULL; + unsigned long bl_fb_addr = 0; + unsigned long *bl_fb_addr_va; + unsigned long pipe_addr, pipe_src_size; + u32 height, width, rgb_size, bpp; + size_t size; + static struct ion_handle *ihdl; + struct ion_client *iclient = mdss_get_ionclient(); + static ion_phys_addr_t phys; - struct msm_fb_data_type *mfd = ctl->mfd; - int ret = 0, off; + pipe_addr = MDSS_MDP_REG_SSPP_OFFSET(3) + + MDSS_MDP_REG_SSPP_SRC0_ADDR; + pipe_src_size = + MDSS_MDP_REG_SSPP_OFFSET(3) + MDSS_MDP_REG_SSPP_SRC_SIZE; - if (!mfd) { - pr_debug("Invalid handle for reconfigure splash\n"); - return ret; + bpp = 3; + rgb_size = MDSS_MDP_REG_READ(pipe_src_size); + bl_fb_addr = MDSS_MDP_REG_READ(pipe_addr); + + height = (rgb_size >> 16) & 0xffff; + width = rgb_size & 0xffff; + size = PAGE_ALIGN(height * width * bpp); + pr_debug("%s:%d splash_height=%d splash_width=%d Buffer size=%d\n", + __func__, __LINE__, height, width, size); + + ihdl = ion_alloc(iclient, size, SZ_1M, + ION_HEAP(ION_QSECOM_HEAP_ID), 0); + if (IS_ERR_OR_NULL(ihdl)) { + pr_err("unable to alloc fbmem from ion (%p)\n", ihdl); + return -ENOMEM; } + + pdata->panel_info.splash_ihdl = ihdl; + + virt = ion_map_kernel(iclient, ihdl); + ion_phys(iclient, ihdl, &phys, &size); + + pr_debug("%s %d Allocating %u bytes at 0x%lx (%lx phys)\n", + __func__, __LINE__, size, + (unsigned long int)virt, phys); + + bl_fb_addr_va = (unsigned long *)ioremap(bl_fb_addr, size); + + memcpy(virt, bl_fb_addr_va, size); + + MDSS_MDP_REG_WRITE(pipe_addr, phys); + MDSS_MDP_REG_WRITE(MDSS_MDP_REG_CTL_FLUSH + MDSS_MDP_REG_CTL_OFFSET(0), + 0x48); + + return 0; + +} + +int mdss_mdp_reconfigure_splash_done(struct mdss_mdp_ctl *ctl) +{ + struct ion_client *iclient = mdss_get_ionclient(); + struct mdss_panel_data *pdata; + int ret = 0, off; + off = 0; - ctl->panel_data->panel_info.cont_splash_enabled = 0; + + pdata = ctl->panel_data; + + pdata->panel_info.cont_splash_enabled = 0; + + ion_free(iclient, pdata->panel_info.splash_ihdl); mdss_mdp_ctl_write(ctl, 0, MDSS_MDP_LM_BORDER_COLOR); off = MDSS_MDP_REG_INTF_OFFSET(ctl->intf_num); diff --git a/drivers/video/fbdev/msm/mdss_panel.h b/drivers/video/fbdev/msm/mdss_panel.h index 2b66181a9cdf..31fb2e7991e8 100644 --- a/drivers/video/fbdev/msm/mdss_panel.h +++ b/drivers/video/fbdev/msm/mdss_panel.h @@ -185,6 +185,7 @@ struct mdss_panel_info { u32 vic; /* video identification code */ u32 cont_splash_enabled; + struct ion_handle *splash_ihdl; u32 panel_power_on; struct lcd_panel_info lcd; |
