diff options
-rw-r--r-- | drivers/video/fbdev/arm-hdlcd.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/video/fbdev/arm-hdlcd.c b/drivers/video/fbdev/arm-hdlcd.c index c4d01adbe33e..fa67ed1f3bd4 100644 --- a/drivers/video/fbdev/arm-hdlcd.c +++ b/drivers/video/fbdev/arm-hdlcd.c @@ -289,7 +289,6 @@ static int hdlcd_set_par(struct fb_info *info) WRITE_HDLCD_REG(HDLCD_REG_GREEN_SELECT, ((hdlcd->fb.var.green.length & 0xf) << 8) | hdlcd->fb.var.green.offset); WRITE_HDLCD_REG(HDLCD_REG_BLUE_SELECT, ((hdlcd->fb.var.blue.length & 0xf) << 8) | hdlcd->fb.var.blue.offset); - clk_prepare(hdlcd->clk); clk_set_rate(hdlcd->clk, (1000000000 / hdlcd->fb.var.pixclock) * 1000); clk_enable(hdlcd->clk); @@ -481,6 +480,10 @@ static int hdlcd_setup(struct hdlcd_device *hdlcd) return PTR_ERR(hdlcd->clk); } + err = clk_prepare(hdlcd->clk); + if (err) + goto clk_prepare_err; + hdlcd->base = ioremap_nocache(hdlcd->fb.fix.mmio_start, hdlcd->fb.fix.mmio_len); if (!hdlcd->base) { dev_err(hdlcd->dev, "HDLCD: unable to map registers\n"); @@ -572,9 +575,9 @@ static int hdlcd_setup(struct hdlcd_device *hdlcd) /* Ensure interrupts are disabled */ WRITE_HDLCD_REG(HDLCD_REG_INT_MASK, 0); #endif + fb_set_var(&hdlcd->fb, &hdlcd->fb.var); + if (!register_framebuffer(&hdlcd->fb)) { - fb_set_var(&hdlcd->fb, &hdlcd->fb.var); - clk_enable(hdlcd->clk); return 0; } @@ -586,6 +589,8 @@ setup_err: kmalloc_err: kfree(hdlcd->fb.pseudo_palette); remap_err: + clk_unprepare(hdlcd->clk); +clk_prepare_err: clk_put(hdlcd->clk); return err; } |