summaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorDanny Nold <dannynold@freescale.com>2010-09-22 19:05:22 -0500
committerScott Sweeny <scott.sweeny@timesys.com>2011-01-19 11:49:43 -0500
commit51067b3658804515ba7d22a621a869e8e68c4e4e (patch)
treeec9163550a6545d9de94771db917ec35c691e690 /drivers/video
parentc0d7ea640e6544ba51b665818fbdd465fc3b1a15 (diff)
ENGR00131874-3 - EPDC fb: updates for kernel 2.6.35
Added checks to ensure that clocks and regulators can be accessed. Removed redundant call to clean up fb_deferred_io. Fixed string manipulation-related crashes with firmware file string by defining fixed string length. Signed-off-by: Danny Nold <dannynold@freescale.com>
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/mxc/mxc_epdc_fb.c41
1 files changed, 31 insertions, 10 deletions
diff --git a/drivers/video/mxc/mxc_epdc_fb.c b/drivers/video/mxc/mxc_epdc_fb.c
index f1c76ad61091..e73033526aa8 100644
--- a/drivers/video/mxc/mxc_epdc_fb.c
+++ b/drivers/video/mxc/mxc_epdc_fb.c
@@ -745,6 +745,7 @@ void epdc_init_settings(struct mxc_epdc_fb_data *fb_data)
static void epdc_powerup(struct mxc_epdc_fb_data *fb_data)
{
+ int ret = 0;
mutex_lock(&fb_data->power_mutex);
/*
@@ -772,8 +773,20 @@ static void epdc_powerup(struct mxc_epdc_fb_data *fb_data)
__raw_writel(EPDC_CTRL_CLKGATE, EPDC_CTRL_CLEAR);
/* Enable power to the EPD panel */
- regulator_enable(fb_data->display_regulator);
- regulator_enable(fb_data->vcom_regulator);
+ ret = regulator_enable(fb_data->display_regulator);
+ if (IS_ERR(ret)) {
+ dev_err(fb_data->dev, "Unable to enable DISPLAY regulator."
+ "err = 0x%x\n", ret);
+ mutex_unlock(&fb_data->power_mutex);
+ return;
+ }
+ ret = regulator_enable(fb_data->vcom_regulator);
+ if (IS_ERR(ret)) {
+ dev_err(fb_data->dev, "Unable to enable VCOM regulator."
+ "err = 0x%x\n", ret);
+ mutex_unlock(&fb_data->power_mutex);
+ return;
+ }
fb_data->power_state = POWER_STATE_ON;
@@ -2243,7 +2256,7 @@ static int mxc_epdc_fb_init_hw(struct fb_info *info)
{
struct mxc_epdc_fb_data *fb_data = (struct mxc_epdc_fb_data *)info;
const struct firmware *fw;
- char *fw_str = "imx/epdc";
+ char fw_str[24] = "imx/epdc_";
struct mxcfb_update_data update;
struct mxcfb_waveform_data_file *wv_file;
int wv_data_offs;
@@ -2255,7 +2268,6 @@ static int mxc_epdc_fb_init_hw(struct fb_info *info)
* Format is "imx/epdc_[panel string].fw"
*/
if (fb_data->cur_mode) {
- strcat(fw_str, "_");
strcat(fw_str, fb_data->cur_mode->vmode->name);
strcat(fw_str, ".fw");
}
@@ -2307,7 +2319,7 @@ static int mxc_epdc_fb_init_hw(struct fb_info *info)
epdc_init_sequence(fb_data);
- /* Enable clocks to access EPDC regs */
+ /* Disable clocks */
clk_disable(fb_data->epdc_clk_axi);
clk_disable(fb_data->epdc_clk_pix);
@@ -2649,7 +2661,19 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
fb_data->pdata->get_pins();
fb_data->epdc_clk_axi = clk_get(fb_data->dev, "epdc_axi");
+ if (IS_ERR(fb_data->epdc_clk_axi)) {
+ dev_err(&pdev->dev, "Unable to get EPDC AXI clk."
+ "err = 0x%x\n", (int)fb_data->epdc_clk_axi);
+ ret = -ENODEV;
+ goto out_upd_buffers;
+ }
fb_data->epdc_clk_pix = clk_get(fb_data->dev, "epdc_pix");
+ if (IS_ERR(fb_data->epdc_clk_pix)) {
+ dev_err(&pdev->dev, "Unable to get EPDC pix clk."
+ "err = 0x%x\n", (int)fb_data->epdc_clk_pix);
+ ret = -ENODEV;
+ goto out_upd_buffers;
+ }
fb_data->in_init = false;
@@ -2900,11 +2924,11 @@ static int mxc_epdc_fb_remove(struct platform_device *pdev)
dma_free_writecombine(&pdev->dev, fb_data->working_buffer_size,
fb_data->working_buffer_virt,
- fb_data->working_buffer_phys);
+ fb_data->working_buffer_phys);
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);
+ 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);
dma_free_writecombine(&pdev->dev, plist->size, plist->virt_addr,
@@ -2929,9 +2953,6 @@ static int mxc_epdc_fb_remove(struct platform_device *pdev)
iounmap(epdc_base);
-#ifdef CONFIG_FB_MXC_EINK_AUTO_UPDATE_MODE
- fb_deferred_io_cleanup(&fb_data->info);
-#endif
fb_dealloc_cmap(&fb_data->info.cmap);
framebuffer_release(&fb_data->info);