video: tegra: host: register nvhost master device in board-xxx-panel.c
Mayuresh Kulkarni [Mon, 5 Mar 2012 13:06:47 +0000 (18:06 +0530)]
- the suspend order of devices is governed by the order
in which devices are registered
- this commit ensures that nvhost master is registered before
any of the graphics devices
- previously this was done in rootfs_init call which is
later than arch_init calls of board-xxx-panel.c
- this caused tegra-dc device to be registered *before* nvhost
master device. as a result it was suspended *later* than nvhost
master device. this is a clear violation of dependency rule
for nvhost. this caused suspend-resume to fail for L4T
- this worked on android as it has CONFIG early suspend enabled
while it failed for L4T which doesn't have CONFIG early suspend
enabled

Bug 947617

Change-Id: I6cd405f3ba23d004e7659140019f5130e6c25159
Signed-off-by: Mayuresh Kulkarni <mkulkarni@nvidia.com>
Reviewed-on: http://git-master/r/87756
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>

arch/arm/mach-tegra/board-aruba-panel.c
arch/arm/mach-tegra/board-cardhu-panel.c
arch/arm/mach-tegra/board-enterprise-panel.c
arch/arm/mach-tegra/board-harmony-panel.c
arch/arm/mach-tegra/board-kai-panel.c
arch/arm/mach-tegra/board-p1852-panel.c
arch/arm/mach-tegra/board-ventana-panel.c
arch/arm/mach-tegra/board-whistler-panel.c
arch/arm/mach-tegra/devices.h
arch/arm/mach-tegra/p852/board-p852-panel.c
drivers/video/tegra/host/dev.c

index 92e4362..b014326 100644 (file)
@@ -227,6 +227,12 @@ int __init aruba_panel_init(void)
        aruba_carveouts[1].size = tegra_carveout_size;
 #endif
 
+#ifdef CONFIG_TEGRA_GRHOST
+       err = nvhost_device_register(&tegra_grhost_device);
+       if (err)
+               return err;
+#endif
+
        err = platform_add_devices(aruba_gfx_devices,
                                   ARRAY_SIZE(aruba_gfx_devices));
 
index 7de8476..f6db96c 100644 (file)
@@ -1225,6 +1225,12 @@ int __init cardhu_panel_init(void)
        register_early_suspend(&cardhu_panel_early_suspender);
 #endif
 
+#ifdef CONFIG_TEGRA_GRHOST
+       err = nvhost_device_register(&tegra_grhost_device);
+       if (err)
+               return err;
+#endif
+
        err = platform_add_devices(cardhu_gfx_devices,
                                ARRAY_SIZE(cardhu_gfx_devices));
 
index 0defe56..9be8582 100644 (file)
@@ -709,8 +709,6 @@ struct early_suspend enterprise_panel_early_suspender;
 
 static void enterprise_panel_early_suspend(struct early_suspend *h)
 {
-       unsigned i;
-
        /* power down LCD, add use a black screen for HDMI */
        if (num_registered_fb > 0)
                fb_blank(registered_fb[0], FB_BLANK_POWERDOWN);
@@ -733,6 +731,7 @@ static void enterprise_panel_early_suspend(struct early_suspend *h)
 static void enterprise_panel_late_resume(struct early_suspend *h)
 {
        unsigned i;
+
 #ifdef CONFIG_TEGRA_CONVSERVATIVE_GOV_ON_EARLYSUPSEND
        cpufreq_restore_default_governor();
 #endif
@@ -786,6 +785,12 @@ int __init enterprise_panel_init(void)
        register_early_suspend(&enterprise_panel_early_suspender);
 #endif
 
+#ifdef CONFIG_TEGRA_GRHOST
+       err = nvhost_device_register(&tegra_grhost_device);
+       if (err)
+               return err;
+#endif
+
        err = platform_add_devices(enterprise_gfx_devices,
                                ARRAY_SIZE(enterprise_gfx_devices));
 
index d9974f1..c240396 100644 (file)
@@ -329,7 +329,8 @@ static struct platform_device *harmony_gfx_devices[] __initdata = {
        &harmony_backlight_device,
 };
 
-int __init harmony_panel_init(void) {
+int __init harmony_panel_init(void)
+{
        int err;
        struct resource *res;
 
@@ -354,6 +355,12 @@ int __init harmony_panel_init(void) {
        harmony_carveouts[1].size = tegra_carveout_size;
 #endif
 
+#ifdef CONFIG_TEGRA_GRHOST
+       err = nvhost_device_register(&tegra_grhost_device);
+       if (err)
+               return err;
+#endif
+
        err = platform_add_devices(harmony_gfx_devices,
                                   ARRAY_SIZE(harmony_gfx_devices));
        if (err)
index b98c916..71e238f 100644 (file)
@@ -700,6 +700,12 @@ int __init kai_panel_init(void)
        register_early_suspend(&kai_panel_early_suspender);
 #endif
 
+#ifdef CONFIG_TEGRA_GRHOST
+       err = nvhost_device_register(&tegra_grhost_device);
+       if (err)
+               return err;
+#endif
+
        err = platform_add_devices(kai_gfx_devices,
                                ARRAY_SIZE(kai_gfx_devices));
 
index 33a86fa..8940af0 100644 (file)
@@ -125,6 +125,12 @@ int __init p1852_panel_init(void)
        res->start = tegra_fb_start;
        res->end = tegra_fb_start + tegra_fb_size - 1;
 
+#ifdef CONFIG_TEGRA_GRHOST
+       err = nvhost_device_register(&tegra_grhost_device);
+       if (err)
+               return err;
+#endif
+
        err = platform_add_devices(p1852_gfx_devices,
                                ARRAY_SIZE(p1852_gfx_devices));
        if (!err)
index 83bfb78..cad303d 100644 (file)
@@ -412,6 +412,12 @@ int __init ventana_panel_init(void)
        ventana_carveouts[1].size = tegra_carveout_size;
 #endif
 
+#ifdef CONFIG_TEGRA_GRHOST
+       err = nvhost_device_register(&tegra_grhost_device);
+       if (err)
+               return err;
+#endif
+
        err = platform_add_devices(ventana_gfx_devices,
                                   ARRAY_SIZE(ventana_gfx_devices));
 
index 6fc576b..74075d4 100644 (file)
@@ -363,6 +363,12 @@ int __init whistler_panel_init(void)
        whistler_carveouts[1].size = tegra_carveout_size;
 #endif
 
+#ifdef CONFIG_TEGRA_GRHOST
+       err = nvhost_device_register(&tegra_grhost_device);
+       if (err)
+               return err;
+#endif
+
        err = platform_add_devices(whistler_gfx_devices,
                                   ARRAY_SIZE(whistler_gfx_devices));
 
index b7fc6fd..97a0c53 100644 (file)
@@ -108,6 +108,7 @@ extern struct platform_device tegra_uartc_device;
 extern struct platform_device tegra_uartd_device;
 extern struct platform_device tegra_uarte_device;
 extern struct platform_device tegra_avp_device;
+extern struct nvhost_device tegra_grhost_device;
 extern struct nvhost_device nvavp_device;
 extern struct platform_device tegra_aes_device;
 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
index 3d65a61..c47032d 100644 (file)
@@ -174,6 +174,12 @@ int __init p852_panel_init(void)
        if (err)
                return err;
 
+#ifdef CONFIG_TEGRA_GRHOST
+       err = nvhost_device_register(&tegra_grhost_device);
+       if (err)
+               return err;
+#endif
+
        err = platform_add_devices(p852_gfx_devices,
                                   ARRAY_SIZE(p852_gfx_devices));
 
index fa8c617..b257586 100644 (file)
@@ -1072,7 +1072,8 @@ static int __exit nvhost_remove(struct nvhost_device *dev)
 static int nvhost_suspend(struct nvhost_device *dev, pm_message_t state)
 {
        struct nvhost_master *host = nvhost_get_drvdata(dev);
-       int i, ret;
+       int i, ret = 0;
+
        dev_info(&dev->dev, "suspending\n");
 
        for (i = 0; i < host->nb_channels; i++) {
@@ -1083,6 +1084,7 @@ static int nvhost_suspend(struct nvhost_device *dev, pm_message_t state)
 
        ret = nvhost_module_suspend(host->dev, true);
        dev_info(&dev->dev, "suspend status: %d\n", ret);
+
        return ret;
 }
 
@@ -1105,14 +1107,7 @@ static struct nvhost_driver nvhost_driver = {
 
 static int __init nvhost_mod_init(void)
 {
-       int err;
-
        register_sets = tegra_gpu_register_sets();
-
-       err = nvhost_device_register(&tegra_grhost_device);
-       if (err)
-               return err;
-
        return nvhost_driver_register(&nvhost_driver);
 }