diff options
author | Danny Nold <dannynold@freescale.com> | 2010-07-30 10:57:54 -0500 |
---|---|---|
committer | Danny Nold <dannynold@freescale.com> | 2010-07-30 11:04:46 -0500 |
commit | 8da1203033e80e2e2517e9677a24fe79c4f0c3a1 (patch) | |
tree | af44a31598b9384521209482668272e2a3533e9a | |
parent | 06118f74be3dcb4af994804f871094631db50900 (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>
-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); |