]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
video: tegra: host: Dump clk state on mc_flush t/o
authorArto Merilainen <amerilainen@nvidia.com>
Thu, 8 Jan 2015 14:50:55 +0000 (16:50 +0200)
committerBharat Nihalani <bnihalani@nvidia.com>
Mon, 12 Jan 2015 04:59:45 +0000 (20:59 -0800)
This patch modifies nvhost to dump nvhost clock state if mc_flush
fails.

Bug 200061755

Change-Id: I9530d47c808bbb8324f6afa66cbdfa836123df62
Signed-off-by: Arto Merilainen <amerilainen@nvidia.com>
Reviewed-on: http://git-master/r/670700
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
drivers/video/tegra/host/nvhost_acm.c

index 5ab9399a3eccfd8c46468a1df7d6dbcd5232e9c8..b50499613b35917289776ac23d48e672ed75fcea 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Tegra Graphics Host Automatic Clock Management
  *
- * Copyright (c) 2010-2014, NVIDIA Corporation. All rights reserved.
+ * Copyright (c) 2010-2015, NVIDIA Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -89,9 +89,27 @@ static void do_unpowergate_locked(int id)
        }
 }
 
+static void dump_clock_status(struct platform_device *dev)
+{
+       struct nvhost_device_data *pdata = platform_get_drvdata(dev);
+       int i;
+
+       pr_info("\n%s: %s status:\n", __func__, dev_name(&dev->dev));
+
+       for (i = 0; i < NVHOST_MODULE_MAX_CLOCKS; i++) {
+               if (!pdata->clocks[i].name)
+                       break;
+               pr_info("%s: clock %s: enabled=%d, rate = %lu\n",
+                       __func__, pdata->clocks[i].name,
+                       !!tegra_is_clk_enabled(pdata->clk[i]),
+                       clk_get_rate(pdata->clk[i]));
+       }
+}
+
 static void do_module_reset_locked(struct platform_device *dev)
 {
        struct nvhost_device_data *pdata = platform_get_drvdata(dev);
+       int ret;
 
        if (pdata->reset) {
                pdata->reset(dev);
@@ -100,12 +118,20 @@ static void do_module_reset_locked(struct platform_device *dev)
 
        /* assert module and mc client reset */
        if (pdata->clocks[0].reset) {
-               tegra_mc_flush(pdata->clocks[0].reset);
+               ret = tegra_mc_flush(pdata->clocks[0].reset);
+               if (ret) {
+                       dump_clock_status(nvhost_get_host(dev)->dev);
+                       dump_clock_status(dev);
+               }
                tegra_periph_reset_assert(pdata->clk[0]);
        }
 
        if (pdata->clocks[1].reset) {
-               tegra_mc_flush(pdata->clocks[1].reset);
+               ret = tegra_mc_flush(pdata->clocks[1].reset);
+               if (ret) {
+                       dump_clock_status(nvhost_get_host(dev)->dev);
+                       dump_clock_status(dev);
+               }
                tegra_periph_reset_assert(pdata->clk[1]);
        }