Skip to content

Commit

Permalink
video: fbdev: imxfb: add some error handling
Browse files Browse the repository at this point in the history
clk_prepare_enable can fail and if it does the controller must not be
considered enabled. So check for errors, properly unwind and give the
error code back to the caller.

While touching the clock code also enable the clocks in the same
direction and disable in reverse order.

Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
  • Loading branch information
Uwe Kleine-König authored and Tomi Valkeinen committed May 10, 2016
1 parent 46ffe10 commit cc6df3a
Showing 1 changed file with 27 additions and 8 deletions.
35 changes: 27 additions & 8 deletions drivers/video/fbdev/imxfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -473,11 +473,12 @@ static int imxfb_set_par(struct fb_info *info)
return 0;
}

static void imxfb_enable_controller(struct imxfb_info *fbi)
static int imxfb_enable_controller(struct imxfb_info *fbi)
{
int ret;

if (fbi->enabled)
return;
return 0;

pr_debug("Enabling LCD controller\n");

Expand All @@ -496,10 +497,29 @@ static void imxfb_enable_controller(struct imxfb_info *fbi)
*/
writel(RMCR_LCDC_EN_MX1, fbi->regs + LCDC_RMCR);

clk_prepare_enable(fbi->clk_ipg);
clk_prepare_enable(fbi->clk_ahb);
clk_prepare_enable(fbi->clk_per);
ret = clk_prepare_enable(fbi->clk_ipg);
if (ret)
goto err_enable_ipg;

ret = clk_prepare_enable(fbi->clk_ahb);
if (ret)
goto err_enable_ahb;

ret = clk_prepare_enable(fbi->clk_per);
if (ret)
goto err_enable_per;

fbi->enabled = true;
return 0;

err_enable_per:
clk_disable_unprepare(fbi->clk_ahb);
err_enable_ahb:
clk_disable_unprepare(fbi->clk_ipg);
err_enable_ipg:
writel(0, fbi->regs + LCDC_RMCR);

return ret;
}

static void imxfb_disable_controller(struct imxfb_info *fbi)
Expand All @@ -510,8 +530,8 @@ static void imxfb_disable_controller(struct imxfb_info *fbi)
pr_debug("Disabling LCD controller\n");

clk_disable_unprepare(fbi->clk_per);
clk_disable_unprepare(fbi->clk_ipg);
clk_disable_unprepare(fbi->clk_ahb);
clk_disable_unprepare(fbi->clk_ipg);
fbi->enabled = false;

writel(0, fbi->regs + LCDC_RMCR);
Expand All @@ -532,8 +552,7 @@ static int imxfb_blank(int blank, struct fb_info *info)
break;

case FB_BLANK_UNBLANK:
imxfb_enable_controller(fbi);
break;
return imxfb_enable_controller(fbi);
}
return 0;
}
Expand Down

0 comments on commit cc6df3a

Please sign in to comment.