diff options
author | Danny Nold <dannynold@freescale.com> | 2012-03-19 22:17:00 -0500 |
---|---|---|
committer | Jason Liu <r64343@freescale.com> | 2012-07-20 13:35:56 +0800 |
commit | c9c5eb73e33eb98a43e47ca5c8fe867d7dcfe842 (patch) | |
tree | d304af87c66577a1cb8c04057d57e220c61da786 | |
parent | 2c4d7870dc48a6bd4dd5a2150a1d2cf7367314f0 (diff) |
ENGR00177317 - EPDC fb: Add clean-up for new EPDC buffer allocation scheme
- Added clean-up for new PxP output buffer allocation scheme. Clean-up
covers cases where probe fails and where module is removed.
Signed-off-by: Danny Nold <dannynold@freescale.com>
-rw-r--r-- | drivers/video/mxc/mxc_epdc_fb.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/drivers/video/mxc/mxc_epdc_fb.c b/drivers/video/mxc/mxc_epdc_fb.c index 5bc048d216be..da77373e03a6 100644 --- a/drivers/video/mxc/mxc_epdc_fb.c +++ b/drivers/video/mxc/mxc_epdc_fb.c @@ -4726,9 +4726,15 @@ out_copybuffer: fb_data->phys_addr_copybuf); out_upd_buffers: for (i = 0; i < fb_data->max_num_buffers; i++) - dma_free_writecombine(&pdev->dev, fb_data->max_pix_size, - fb_data->virt_addr_updbuf[i], - fb_data->phys_addr_updbuf[i]); + if (fb_data->virt_addr_updbuf[i] != NULL) + dma_free_writecombine(&pdev->dev, + fb_data->max_pix_size, + fb_data->virt_addr_updbuf[i], + fb_data->phys_addr_updbuf[i]); + if (fb_data->virt_addr_updbuf != NULL) + kfree(fb_data->virt_addr_updbuf); + if (fb_data->phys_addr_updbuf != NULL) + kfree(fb_data->phys_addr_updbuf); out_upd_lists: list_for_each_entry_safe(plist, temp_list, &fb_data->upd_buf_free_list, list) { @@ -4753,6 +4759,7 @@ static int mxc_epdc_fb_remove(struct platform_device *pdev) { struct update_data_list *plist, *temp_list; struct mxc_epdc_fb_data *fb_data = platform_get_drvdata(pdev); + int i; mxc_epdc_fb_blank(FB_BLANK_POWERDOWN, &fb_data->info); @@ -4766,6 +4773,16 @@ static int mxc_epdc_fb_remove(struct platform_device *pdev) unregister_framebuffer(&fb_data->info); free_irq(fb_data->epdc_irq, fb_data); + for (i = 0; i < fb_data->max_num_buffers; i++) + if (fb_data->virt_addr_updbuf[i] != NULL) + dma_free_writecombine(&pdev->dev, fb_data->max_pix_size, + fb_data->virt_addr_updbuf[i], + fb_data->phys_addr_updbuf[i]); + if (fb_data->virt_addr_updbuf != NULL) + kfree(fb_data->virt_addr_updbuf); + if (fb_data->phys_addr_updbuf != NULL) + kfree(fb_data->phys_addr_updbuf); + dma_free_writecombine(&pdev->dev, fb_data->working_buffer_size, fb_data->working_buffer_virt, fb_data->working_buffer_phys); @@ -4780,9 +4797,6 @@ static int mxc_epdc_fb_remove(struct platform_device *pdev) list_for_each_entry_safe(plist, temp_list, &fb_data->upd_buf_free_list, list) { list_del(&plist->list); - dma_free_writecombine(&pdev->dev, fb_data->max_pix_size, - plist->virt_addr, - plist->phys_addr); kfree(plist); } #ifdef CONFIG_FB_MXC_EINK_AUTO_UPDATE_MODE |