struct imxfb_info {
        struct platform_device  *pdev;
        void __iomem            *regs;
-       struct clk              *clk;
+       struct clk              *clk_ipg;
+       struct clk              *clk_ahb;
+       struct clk              *clk_per;
 
        /*
         * These are the addresses we mapped
 
        pr_debug("var->bits_per_pixel=%d\n", var->bits_per_pixel);
 
-       lcd_clk = clk_get_rate(fbi->clk);
+       lcd_clk = clk_get_rate(fbi->clk_per);
 
        tmp = var->pixclock * (unsigned long long)lcd_clk;
 
 
        fbi->pwmr = (fbi->pwmr & ~0xFF) | brightness;
 
-       if (bl->props.fb_blank != FB_BLANK_UNBLANK)
-               clk_enable(fbi->clk);
+       if (bl->props.fb_blank != FB_BLANK_UNBLANK) {
+               clk_prepare_enable(fbi->clk_ipg);
+               clk_prepare_enable(fbi->clk_ahb);
+               clk_prepare_enable(fbi->clk_per);
+       }
        writel(fbi->pwmr, fbi->regs + LCDC_PWMR);
-       if (bl->props.fb_blank != FB_BLANK_UNBLANK)
-               clk_disable(fbi->clk);
+       if (bl->props.fb_blank != FB_BLANK_UNBLANK) {
+               clk_disable_unprepare(fbi->clk_per);
+               clk_disable_unprepare(fbi->clk_ahb);
+               clk_disable_unprepare(fbi->clk_ipg);
+       }
 
        return 0;
 }
         */
        writel(RMCR_LCDC_EN_MX1, fbi->regs + LCDC_RMCR);
 
-       clk_enable(fbi->clk);
+       clk_prepare_enable(fbi->clk_ipg);
+       clk_prepare_enable(fbi->clk_ahb);
+       clk_prepare_enable(fbi->clk_per);
 
        if (fbi->backlight_power)
                fbi->backlight_power(1);
        if (fbi->lcd_power)
                fbi->lcd_power(0);
 
-       clk_disable(fbi->clk);
+       clk_disable_unprepare(fbi->clk_per);
+       clk_disable_unprepare(fbi->clk_ipg);
+       clk_disable_unprepare(fbi->clk_ahb);
 
        writel(0, fbi->regs + LCDC_RMCR);
 }
                goto failed_req;
        }
 
-       fbi->clk = clk_get(&pdev->dev, NULL);
-       if (IS_ERR(fbi->clk)) {
-               ret = PTR_ERR(fbi->clk);
-               dev_err(&pdev->dev, "unable to get clock: %d\n", ret);
+       fbi->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
+       if (IS_ERR(fbi->clk_ipg)) {
+               ret = PTR_ERR(fbi->clk_ipg);
+               goto failed_getclock;
+       }
+
+       fbi->clk_ahb = devm_clk_get(&pdev->dev, "ahb");
+       if (IS_ERR(fbi->clk_ahb)) {
+               ret = PTR_ERR(fbi->clk_ahb);
+               goto failed_getclock;
+       }
+
+       fbi->clk_per = devm_clk_get(&pdev->dev, "per");
+       if (IS_ERR(fbi->clk_per)) {
+               ret = PTR_ERR(fbi->clk_per);
                goto failed_getclock;
        }
 
 failed_map:
        iounmap(fbi->regs);
 failed_ioremap:
-       clk_put(fbi->clk);
 failed_getclock:
        release_mem_region(res->start, resource_size(res));
 failed_req:
 
        iounmap(fbi->regs);
        release_mem_region(res->start, resource_size(res));
-       clk_disable(fbi->clk);
-       clk_put(fbi->clk);
 
        platform_set_drvdata(pdev, NULL);