MLK-16992-1: drm: imx: dcss: Do not request bus_freq twice
authorLaurentiu Palcu <laurentiu.palcu@nxp.com>
Mon, 27 Nov 2017 06:38:26 +0000 (08:38 +0200)
committerLeonard Crestez <leonard.crestez@nxp.com>
Wed, 17 Apr 2019 23:51:34 +0000 (02:51 +0300)
Make sure we request/release the bus_freq exactly once.

Signed-off-by: Laurentiu Palcu <laurentiu.palcu@nxp.com>
drivers/gpu/imx/dcss/dcss-common.c
drivers/gpu/imx/dcss/dcss-prv.h

index c17577f..6ac8bc3 100644 (file)
@@ -367,6 +367,17 @@ static void dcss_debugfs_init(struct dcss_soc *dcss)
 }
 #endif
 
+static void dcss_bus_freq(struct dcss_soc *dcss, bool en)
+{
+       if (en && !dcss->bus_freq_req)
+               request_bus_freq(BUS_FREQ_HIGH);
+
+       if (!en && dcss->bus_freq_req)
+               release_bus_freq(BUS_FREQ_HIGH);
+
+       dcss->bus_freq_req = en;
+}
+
 static int dcss_probe(struct platform_device *pdev)
 {
        int ret;
@@ -415,13 +426,19 @@ static int dcss_probe(struct platform_device *pdev)
        pm_runtime_use_autosuspend(&pdev->dev);
        pm_runtime_enable(&pdev->dev);
 
-       request_bus_freq(BUS_FREQ_HIGH);
+       dcss_bus_freq(dcss, true);
 
        return dcss_add_client_devices(dcss);
 }
 
 static int dcss_remove(struct platform_device *pdev)
 {
+       struct dcss_soc *dcss = platform_get_drvdata(pdev);
+
+       dcss_bus_freq(dcss, false);
+
+       pm_runtime_disable(&pdev->dev);
+
        return 0;
 }
 
@@ -441,7 +458,7 @@ static int dcss_suspend(struct device *dev)
 
        clk_disable_unprepare(dcss->p_clk);
 
-       release_bus_freq(BUS_FREQ_HIGH);
+       dcss_bus_freq(dcss, false);
 
        return 0;
 }
@@ -451,7 +468,7 @@ static int dcss_resume(struct device *dev)
        struct platform_device *pdev = to_platform_device(dev);
        struct dcss_soc *dcss = platform_get_drvdata(pdev);
 
-       request_bus_freq(BUS_FREQ_HIGH);
+       dcss_bus_freq(dcss, true);
 
        clk_prepare_enable(dcss->p_clk);
 
@@ -477,7 +494,7 @@ static int dcss_runtime_suspend(struct device *dev)
 
        clk_disable_unprepare(dcss->p_clk);
 
-       release_bus_freq(BUS_FREQ_HIGH);
+       dcss_bus_freq(dcss, false);
 
        return 0;
 }
@@ -487,7 +504,7 @@ static int dcss_runtime_resume(struct device *dev)
        struct platform_device *pdev = to_platform_device(dev);
        struct dcss_soc *dcss = platform_get_drvdata(pdev);
 
-       request_bus_freq(BUS_FREQ_HIGH);
+       dcss_bus_freq(dcss, true);
 
        clk_prepare_enable(dcss->p_clk);
 
index 894cc4f..d226dbf 100644 (file)
@@ -51,6 +51,8 @@ struct dcss_soc {
        struct clk *dtrc_clk;
 
        void (*dcss_disable_callback)(void *data);
+
+       bool bus_freq_req;
 };
 
 /* BLKCTL */