]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00160877 ipuv3: pm method change
authorJason Chen <b02280@freescale.com>
Thu, 27 Oct 2011 02:25:33 +0000 (10:25 +0800)
committerOliver Wendt <ow@karo-electronics.de>
Mon, 30 Sep 2013 12:09:55 +0000 (14:09 +0200)
1. use late suspend early resume
2. disable/enable clk when suspend/resume with clk on.

Signed-off-by: Jason Chen <b02280@freescale.com>
drivers/mxc/ipu3/ipu_common.c

index 0911a15f480a295c561e222209f42370dc84db61..d198366bac7d86ac4fca6c261ef6824efcab62f1 100644 (file)
@@ -2779,8 +2779,9 @@ bool ipu_pixel_format_has_alpha(uint32_t fmt)
        return false;
 }
 
-static int ipu_suspend(struct platform_device *pdev, pm_message_t state)
+static int ipu_suspend_noirq(struct device *dev)
 {
+       struct platform_device *pdev = to_platform_device(dev);
        struct imx_ipuv3_platform_data *plat_data = pdev->dev.platform_data;
        struct ipu_soc *ipu = platform_get_drvdata(pdev);
 
@@ -2849,6 +2850,8 @@ static int ipu_suspend(struct platform_device *pdev, pm_message_t state)
                ipu->buf_ready_reg[7] = ipu_cm_read(ipu, IPU_ALT_CHA_BUF1_RDY(32));
                ipu->buf_ready_reg[8] = ipu_cm_read(ipu, IPU_CHA_BUF2_RDY(0));
                ipu->buf_ready_reg[9] = ipu_cm_read(ipu, IPU_CHA_BUF2_RDY(32));
+
+               clk_disable(ipu->ipu_clk);
        }
 
        if (plat_data->pg)
@@ -2857,8 +2860,9 @@ static int ipu_suspend(struct platform_device *pdev, pm_message_t state)
        return 0;
 }
 
-static int ipu_resume(struct platform_device *pdev)
+static int ipu_resume_noirq(struct device *dev)
 {
+       struct platform_device *pdev = to_platform_device(dev);
        struct imx_ipuv3_platform_data *plat_data = pdev->dev.platform_data;
        struct ipu_soc *ipu = platform_get_drvdata(pdev);
 
@@ -2866,6 +2870,8 @@ static int ipu_resume(struct platform_device *pdev)
                plat_data->pg(0);
 
        if (atomic_read(&ipu->ipu_use_count)) {
+               clk_enable(ipu->ipu_clk);
+
                /* restore buf ready regs */
                ipu_cm_write(ipu, ipu->buf_ready_reg[0], IPU_CHA_BUF0_RDY(0));
                ipu_cm_write(ipu, ipu->buf_ready_reg[1], IPU_CHA_BUF0_RDY(32));
@@ -2916,17 +2922,21 @@ static int ipu_resume(struct platform_device *pdev)
        return 0;
 }
 
+static const struct dev_pm_ops mxcipu_pm_ops = {
+       .suspend_noirq = ipu_suspend_noirq,
+       .resume_noirq = ipu_resume_noirq,
+};
+
 /*!
  * This structure contains pointers to the power management callback functions.
  */
 static struct platform_driver mxcipu_driver = {
        .driver = {
                   .name = "imx-ipuv3",
+                  .pm = &mxcipu_pm_ops,
                   },
        .probe = ipu_probe,
        .remove = ipu_remove,
-       .suspend = ipu_suspend,
-       .resume = ipu_resume,
 };
 
 int32_t __init ipu_gen_init(void)