Loading arch/arm/boot/dts/msm8610-mdss.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ mdss_fb0: qcom,mdss_fb_primary { cell-index = <0>; compatible = "qcom,mdss-fb"; qcom,memblock-reserve = <0xf800000 0x800000>; }; }; Loading drivers/video/msm/mdss/mdp3.c +43 −6 Original line number Diff line number Diff line Loading @@ -35,6 +35,8 @@ #include <linux/file.h> #include <linux/msm_kgsl.h> #include <linux/major.h> #include <linux/bootmem.h> #include <linux/memblock.h> #include <mach/board.h> #include <mach/clk.h> Loading Loading @@ -1064,6 +1066,45 @@ void mdp3_free(void) } } int mdp3_parse_dt_splash(struct msm_fb_data_type *mfd) { struct platform_device *pdev = mfd->pdev; int rc; u32 offsets[2]; rc = of_property_read_u32_array(pdev->dev.of_node, "qcom,memblock-reserve", offsets, 2); if (rc) { pr_err("fail to get memblock-reserve property\n"); return rc; } if (mdp3_res->splash_mem_addr != offsets[0]) rc = -EINVAL; mdp3_res->splash_mem_addr = offsets[0]; mdp3_res->splash_mem_size = offsets[1]; pr_debug("memaddr=%x size=%x\n", mdp3_res->splash_mem_addr, mdp3_res->splash_mem_size); return rc; } void mdp3_release_splash_memory(void) { /* Give back the reserved memory to the system */ if (mdp3_res->splash_mem_addr) { pr_debug("mdp3_release_splash_memory\n"); memblock_free(mdp3_res->splash_mem_addr, mdp3_res->splash_mem_size); free_bootmem_late(mdp3_res->splash_mem_addr, mdp3_res->splash_mem_size); mdp3_res->splash_mem_addr = 0; } } struct mdp3_dma *mdp3_get_dma_pipe(int capability) { int i; Loading Loading @@ -1154,6 +1195,8 @@ static int mdp3_is_display_on(struct mdss_panel_data *pdata) rc = (status == 0x080000); } mdp3_res->splash_mem_addr = MDP3_REG_READ(MDP3_REG_DMA_S_IBUF_ADDR); mdp3_clk_update(MDP3_CLK_AHB, 0); mdp3_clk_update(MDP3_CLK_CORE, 0); return rc; Loading Loading @@ -1187,12 +1230,6 @@ static int mdp3_continuous_splash_on(struct mdss_panel_data *pdata) goto splash_on_err; } rc = mdp3_continuous_splash_copy(pdata); if (rc) { pr_err("fail to copy continuous splash image\n"); goto splash_on_err; } mdp3_irq_register(); if (pdata->event_handler) { Loading drivers/video/msm/mdss/mdp3.h +5 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,9 @@ struct mdp3_hw_resource { u32 irq_mask; struct mdp3_intr_cb callbacks[MDP3_MAX_INTR]; int irq_registered; u32 splash_mem_addr; u32 splash_mem_size; }; struct mdp3_img_data { Loading Loading @@ -152,6 +155,8 @@ int mdp3_iommu_enable(int client); int mdp3_iommu_disable(int client); int mdp3_iommu_is_attached(int client); void mdp3_free(void); int mdp3_parse_dt_splash(struct msm_fb_data_type *mfd); void mdp3_release_splash_memory(void); #define MDP3_REG_WRITE(addr, val) writel_relaxed(val, mdp3_res->mdp_base + addr) #define MDP3_REG_READ(addr) readl_relaxed(mdp3_res->mdp_base + addr) Loading drivers/video/msm/mdss/mdp3_ctrl.c +13 −3 Original line number Diff line number Diff line Loading @@ -682,8 +682,8 @@ static int mdp3_ctrl_display_commit_kickoff(struct msm_fb_data_type *mfd) pr_debug("continuous splash screen, IOMMU not attached\n"); mdp3_ctrl_off(mfd); mdp3_ctrl_on(mfd); mdp3_free(); } mdp3_release_splash_memory(); mutex_lock(&mdp3_session->lock); Loading Loading @@ -1275,8 +1275,13 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) struct mdp3_session_data *mdp3_session = NULL; u32 intf_type = MDP3_DMA_OUTPUT_SEL_DSI_VIDEO; int rc; int splash_mismatch = 0; pr_info("mdp3_ctrl_init\n"); rc = mdp3_parse_dt_splash(mfd); if (rc) splash_mismatch = 1; pr_debug("mdp3_ctrl_init\n"); mdp3_interface->on_fnc = mdp3_ctrl_on; mdp3_interface->off_fnc = mdp3_ctrl_off; mdp3_interface->do_histogram = NULL; Loading Loading @@ -1321,7 +1326,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) mdp3_session->dma->output_config.out_sel = intf_type; mdp3_session->mfd = mfd; mdp3_session->panel = dev_get_platdata(&mfd->pdev->dev); mdp3_session->status = 0; mdp3_session->status = mdp3_session->intf->active; mdp3_session->overlay.id = MSMFB_NEW_REQUEST; mdp3_bufq_init(&mdp3_session->bufq_in); mdp3_bufq_init(&mdp3_session->bufq_out); Loading Loading @@ -1351,6 +1356,11 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) kobject_uevent(&dev->kobj, KOBJ_ADD); pr_debug("vsync kobject_uevent(KOBJ_ADD)\n"); if (splash_mismatch) { pr_err("splash memory mismatch, stop splash\n"); mdp3_ctrl_off(mfd); } init_done: if (IS_ERR_VALUE(rc)) kfree(mdp3_session); Loading Loading
arch/arm/boot/dts/msm8610-mdss.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ mdss_fb0: qcom,mdss_fb_primary { cell-index = <0>; compatible = "qcom,mdss-fb"; qcom,memblock-reserve = <0xf800000 0x800000>; }; }; Loading
drivers/video/msm/mdss/mdp3.c +43 −6 Original line number Diff line number Diff line Loading @@ -35,6 +35,8 @@ #include <linux/file.h> #include <linux/msm_kgsl.h> #include <linux/major.h> #include <linux/bootmem.h> #include <linux/memblock.h> #include <mach/board.h> #include <mach/clk.h> Loading Loading @@ -1064,6 +1066,45 @@ void mdp3_free(void) } } int mdp3_parse_dt_splash(struct msm_fb_data_type *mfd) { struct platform_device *pdev = mfd->pdev; int rc; u32 offsets[2]; rc = of_property_read_u32_array(pdev->dev.of_node, "qcom,memblock-reserve", offsets, 2); if (rc) { pr_err("fail to get memblock-reserve property\n"); return rc; } if (mdp3_res->splash_mem_addr != offsets[0]) rc = -EINVAL; mdp3_res->splash_mem_addr = offsets[0]; mdp3_res->splash_mem_size = offsets[1]; pr_debug("memaddr=%x size=%x\n", mdp3_res->splash_mem_addr, mdp3_res->splash_mem_size); return rc; } void mdp3_release_splash_memory(void) { /* Give back the reserved memory to the system */ if (mdp3_res->splash_mem_addr) { pr_debug("mdp3_release_splash_memory\n"); memblock_free(mdp3_res->splash_mem_addr, mdp3_res->splash_mem_size); free_bootmem_late(mdp3_res->splash_mem_addr, mdp3_res->splash_mem_size); mdp3_res->splash_mem_addr = 0; } } struct mdp3_dma *mdp3_get_dma_pipe(int capability) { int i; Loading Loading @@ -1154,6 +1195,8 @@ static int mdp3_is_display_on(struct mdss_panel_data *pdata) rc = (status == 0x080000); } mdp3_res->splash_mem_addr = MDP3_REG_READ(MDP3_REG_DMA_S_IBUF_ADDR); mdp3_clk_update(MDP3_CLK_AHB, 0); mdp3_clk_update(MDP3_CLK_CORE, 0); return rc; Loading Loading @@ -1187,12 +1230,6 @@ static int mdp3_continuous_splash_on(struct mdss_panel_data *pdata) goto splash_on_err; } rc = mdp3_continuous_splash_copy(pdata); if (rc) { pr_err("fail to copy continuous splash image\n"); goto splash_on_err; } mdp3_irq_register(); if (pdata->event_handler) { Loading
drivers/video/msm/mdss/mdp3.h +5 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,9 @@ struct mdp3_hw_resource { u32 irq_mask; struct mdp3_intr_cb callbacks[MDP3_MAX_INTR]; int irq_registered; u32 splash_mem_addr; u32 splash_mem_size; }; struct mdp3_img_data { Loading Loading @@ -152,6 +155,8 @@ int mdp3_iommu_enable(int client); int mdp3_iommu_disable(int client); int mdp3_iommu_is_attached(int client); void mdp3_free(void); int mdp3_parse_dt_splash(struct msm_fb_data_type *mfd); void mdp3_release_splash_memory(void); #define MDP3_REG_WRITE(addr, val) writel_relaxed(val, mdp3_res->mdp_base + addr) #define MDP3_REG_READ(addr) readl_relaxed(mdp3_res->mdp_base + addr) Loading
drivers/video/msm/mdss/mdp3_ctrl.c +13 −3 Original line number Diff line number Diff line Loading @@ -682,8 +682,8 @@ static int mdp3_ctrl_display_commit_kickoff(struct msm_fb_data_type *mfd) pr_debug("continuous splash screen, IOMMU not attached\n"); mdp3_ctrl_off(mfd); mdp3_ctrl_on(mfd); mdp3_free(); } mdp3_release_splash_memory(); mutex_lock(&mdp3_session->lock); Loading Loading @@ -1275,8 +1275,13 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) struct mdp3_session_data *mdp3_session = NULL; u32 intf_type = MDP3_DMA_OUTPUT_SEL_DSI_VIDEO; int rc; int splash_mismatch = 0; pr_info("mdp3_ctrl_init\n"); rc = mdp3_parse_dt_splash(mfd); if (rc) splash_mismatch = 1; pr_debug("mdp3_ctrl_init\n"); mdp3_interface->on_fnc = mdp3_ctrl_on; mdp3_interface->off_fnc = mdp3_ctrl_off; mdp3_interface->do_histogram = NULL; Loading Loading @@ -1321,7 +1326,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) mdp3_session->dma->output_config.out_sel = intf_type; mdp3_session->mfd = mfd; mdp3_session->panel = dev_get_platdata(&mfd->pdev->dev); mdp3_session->status = 0; mdp3_session->status = mdp3_session->intf->active; mdp3_session->overlay.id = MSMFB_NEW_REQUEST; mdp3_bufq_init(&mdp3_session->bufq_in); mdp3_bufq_init(&mdp3_session->bufq_out); Loading Loading @@ -1351,6 +1356,11 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) kobject_uevent(&dev->kobj, KOBJ_ADD); pr_debug("vsync kobject_uevent(KOBJ_ADD)\n"); if (splash_mismatch) { pr_err("splash memory mismatch, stop splash\n"); mdp3_ctrl_off(mfd); } init_done: if (IS_ERR_VALUE(rc)) kfree(mdp3_session); Loading