Merge tag 'drm-misc-next-fixes-2021-09-09' of git://anongit.freedesktop.org/drm/drm...
[linux-2.6-microblaze.git] / drivers / gpu / drm / tegra / vic.c
index c9d55a9..c02010f 100644 (file)
@@ -29,7 +29,6 @@ struct vic_config {
 
 struct vic {
        struct falcon falcon;
-       bool booted;
 
        void __iomem *regs;
        struct tegra_drm_client client;
@@ -52,48 +51,6 @@ static void vic_writel(struct vic *vic, u32 value, unsigned int offset)
        writel(value, vic->regs + offset);
 }
 
-static int vic_runtime_resume(struct device *dev)
-{
-       struct vic *vic = dev_get_drvdata(dev);
-       int err;
-
-       err = clk_prepare_enable(vic->clk);
-       if (err < 0)
-               return err;
-
-       usleep_range(10, 20);
-
-       err = reset_control_deassert(vic->rst);
-       if (err < 0)
-               goto disable;
-
-       usleep_range(10, 20);
-
-       return 0;
-
-disable:
-       clk_disable_unprepare(vic->clk);
-       return err;
-}
-
-static int vic_runtime_suspend(struct device *dev)
-{
-       struct vic *vic = dev_get_drvdata(dev);
-       int err;
-
-       err = reset_control_assert(vic->rst);
-       if (err < 0)
-               return err;
-
-       usleep_range(2000, 4000);
-
-       clk_disable_unprepare(vic->clk);
-
-       vic->booted = false;
-
-       return 0;
-}
-
 static int vic_boot(struct vic *vic)
 {
 #ifdef CONFIG_IOMMU_API
@@ -103,9 +60,6 @@ static int vic_boot(struct vic *vic)
        void *hdr;
        int err = 0;
 
-       if (vic->booted)
-               return 0;
-
 #ifdef CONFIG_IOMMU_API
        if (vic->config->supports_sid && spec) {
                u32 value;
@@ -168,8 +122,6 @@ static int vic_boot(struct vic *vic)
                return err;
        }
 
-       vic->booted = true;
-
        return 0;
 }
 
@@ -323,35 +275,74 @@ cleanup:
        return err;
 }
 
-static int vic_open_channel(struct tegra_drm_client *client,
-                           struct tegra_drm_context *context)
+
+static int vic_runtime_resume(struct device *dev)
 {
-       struct vic *vic = to_vic(client);
+       struct vic *vic = dev_get_drvdata(dev);
        int err;
 
-       err = pm_runtime_resume_and_get(vic->dev);
+       err = clk_prepare_enable(vic->clk);
        if (err < 0)
                return err;
 
+       usleep_range(10, 20);
+
+       err = reset_control_deassert(vic->rst);
+       if (err < 0)
+               goto disable;
+
+       usleep_range(10, 20);
+
        err = vic_load_firmware(vic);
        if (err < 0)
-               goto rpm_put;
+               goto assert;
 
        err = vic_boot(vic);
        if (err < 0)
-               goto rpm_put;
+               goto assert;
+
+       return 0;
+
+assert:
+       reset_control_assert(vic->rst);
+disable:
+       clk_disable_unprepare(vic->clk);
+       return err;
+}
+
+static int vic_runtime_suspend(struct device *dev)
+{
+       struct vic *vic = dev_get_drvdata(dev);
+       int err;
+
+       err = reset_control_assert(vic->rst);
+       if (err < 0)
+               return err;
+
+       usleep_range(2000, 4000);
+
+       clk_disable_unprepare(vic->clk);
+
+       return 0;
+}
+
+static int vic_open_channel(struct tegra_drm_client *client,
+                           struct tegra_drm_context *context)
+{
+       struct vic *vic = to_vic(client);
+       int err;
+
+       err = pm_runtime_resume_and_get(vic->dev);
+       if (err < 0)
+               return err;
 
        context->channel = host1x_channel_get(vic->channel);
        if (!context->channel) {
-               err = -ENOMEM;
-               goto rpm_put;
+               pm_runtime_put(vic->dev);
+               return -ENOMEM;
        }
 
        return 0;
-
-rpm_put:
-       pm_runtime_put(vic->dev);
-       return err;
 }
 
 static void vic_close_channel(struct tegra_drm_context *context)
@@ -359,7 +350,6 @@ static void vic_close_channel(struct tegra_drm_context *context)
        struct vic *vic = to_vic(context->client);
 
        host1x_channel_put(context->channel);
-
        pm_runtime_put(vic->dev);
 }