diff options
author | Danny Nold <dannynold@freescale.com> | 2010-07-30 10:57:54 -0500 |
---|---|---|
committer | Alan Tull <r80115@freescale.com> | 2010-09-25 09:49:43 -0500 |
commit | a8ae0d6193cad4f58f204f50b6dad6610db067b5 (patch) | |
tree | 1304aba1c0690187a7168fcab33787fd10072c34 /drivers/video/mxc | |
parent | 6ba91fdb42a31a8d4b74ca2594b93ace2abd45ba (diff) |
ENGR00125779 - EPDC fb module load/unload
Modified mxc_epdc_fb_remove() to prevent crashes and errors when
the FB driver is removed. deferred_io must be unloaded before FB
memory is freed.
Signed-off-by: Danny Nold <dannynold@freescale.com>
Diffstat (limited to 'drivers/video/mxc')
-rw-r--r-- | drivers/video/mxc/mxc_epdc_fb.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/video/mxc/mxc_epdc_fb.c b/drivers/video/mxc/mxc_epdc_fb.c index d3dee60e5907..109fa314a3cf 100644 --- a/drivers/video/mxc/mxc_epdc_fb.c +++ b/drivers/video/mxc/mxc_epdc_fb.c @@ -2429,11 +2429,11 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) mxc_epdc_fb_default.xres = pentry->x_res; mxc_epdc_fb_default.yres = pentry->y_res; mxc_epdc_fb_default.xres_virtual = pentry->x_res; - mxc_epdc_fb_default.yres_virtual = pentry->y_res * 2; /* FB doubled in virtual space */ + /* Additional screens allow for panning and buffer flipping */ + mxc_epdc_fb_default.yres_virtual = pentry->y_res * NUM_SCREENS; mxc_epdc_fb_fix.smem_start = fb_data->phys_start; - mxc_epdc_fb_fix.smem_len = mxc_epdc_fb_default.yres_virtual - * pentry->x_res * 2 * pentry->bpp / 8; + mxc_epdc_fb_fix.smem_len = fb_data->map_size; mxc_epdc_fb_fix.ypanstep = 0; switch (pentry->bpp) { @@ -2779,9 +2779,12 @@ static int mxc_epdc_fb_remove(struct platform_device *pdev) unregister_framebuffer(&fb_data->info); free_irq(fb_data->epdc_irq, fb_data); - dma_free_writecombine(&pdev->dev, fb_data->working_buffer_size, fb_data->working_buffer_virt, + dma_free_writecombine(&pdev->dev, fb_data->working_buffer_size, + fb_data->working_buffer_virt, fb_data->working_buffer_phys); - dma_free_writecombine(&pdev->dev, fb_data->waveform_buffer_size, fb_data->waveform_buffer_virt, + if (fb_data->waveform_buffer_virt != NULL) + dma_free_writecombine(&pdev->dev, fb_data->waveform_buffer_size, + fb_data->waveform_buffer_virt, fb_data->waveform_buffer_phys); list_for_each_entry_safe(plist, temp_list, &fb_data->upd_buf_free_list->list, list) { list_del(&plist->list); @@ -2789,6 +2792,10 @@ static int mxc_epdc_fb_remove(struct platform_device *pdev) plist->phys_addr); kfree(plist); } +#ifdef CONFIG_FB_MXC_EINK_AUTO_UPDATE_MODE + fb_deferred_io_cleanup(&fb_data->info); +#endif + dma_free_writecombine(&pdev->dev, fb_data->map_size, fb_data->info.screen_base, fb_data->phys_start); |