aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2013-05-23 05:07:50 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2013-05-23 05:54:21 -0400
commit591a0ac7f14aae6bf11b1cb6b5a68480bd644ddb (patch)
treecb2b4707ecd8aaac1eff6901b311d4f839c69383
parentb358c6cf029cb67b3ed9cc367fb46f1fa3228c5b (diff)
OMAPDSS: Fix crash with DT boot
When booting with DT, there's a crash when omapfb is probed. This is caused by the fact that omapdss+DT is not yet supported, and thus omapdss is not probed at all. On the other hand, omapfb is always probed. When omapfb tries to use omapdss, there's a NULL pointer dereference crash. The same error should most likely happen with omapdrm and omap_vout also. To fix this, add an "initialized" state to omapdss. When omapdss has been probed, it's marked as initialized. omapfb, omapdrm and omap_vout check this state when they are probed to see that omapdss is actually there. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Tested-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.c3
-rw-r--r--drivers/media/platform/omap/omap_vout.c3
-rw-r--r--drivers/video/omap2/dss/core.c20
-rw-r--r--drivers/video/omap2/omapfb/omapfb-main.c3
-rw-r--r--include/video/omapdss.h1
5 files changed, 29 insertions, 1 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 079c54c6f94c..902074bbd1f4 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -548,6 +548,9 @@ static void pdev_shutdown(struct platform_device *device)
548 548
549static int pdev_probe(struct platform_device *device) 549static int pdev_probe(struct platform_device *device)
550{ 550{
551 if (omapdss_is_initialized() == false)
552 return -EPROBE_DEFER;
553
551 DBG("%s", device->name); 554 DBG("%s", device->name);
552 return drm_platform_init(&omap_drm_driver, device); 555 return drm_platform_init(&omap_drm_driver, device);
553} 556}
diff --git a/drivers/media/platform/omap/omap_vout.c b/drivers/media/platform/omap/omap_vout.c
index 96c4a17e4280..0a489bd29d6b 100644
--- a/drivers/media/platform/omap/omap_vout.c
+++ b/drivers/media/platform/omap/omap_vout.c
@@ -2144,6 +2144,9 @@ static int __init omap_vout_probe(struct platform_device *pdev)
2144 struct omap_dss_device *def_display; 2144 struct omap_dss_device *def_display;
2145 struct omap2video_device *vid_dev = NULL; 2145 struct omap2video_device *vid_dev = NULL;
2146 2146
2147 if (omapdss_is_initialized() == false)
2148 return -EPROBE_DEFER;
2149
2147 ret = omapdss_compat_init(); 2150 ret = omapdss_compat_init();
2148 if (ret) { 2151 if (ret) {
2149 dev_err(&pdev->dev, "failed to init dss\n"); 2152 dev_err(&pdev->dev, "failed to init dss\n");
diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c
index f8779d4750ba..f49ddb9e7c82 100644
--- a/drivers/video/omap2/dss/core.c
+++ b/drivers/video/omap2/dss/core.c
@@ -53,6 +53,8 @@ static char *def_disp_name;
53module_param_named(def_disp, def_disp_name, charp, 0); 53module_param_named(def_disp, def_disp_name, charp, 0);
54MODULE_PARM_DESC(def_disp, "default display name"); 54MODULE_PARM_DESC(def_disp, "default display name");
55 55
56static bool dss_initialized;
57
56const char *omapdss_get_default_display_name(void) 58const char *omapdss_get_default_display_name(void)
57{ 59{
58 return core.default_display_name; 60 return core.default_display_name;
@@ -66,6 +68,12 @@ enum omapdss_version omapdss_get_version(void)
66} 68}
67EXPORT_SYMBOL(omapdss_get_version); 69EXPORT_SYMBOL(omapdss_get_version);
68 70
71bool omapdss_is_initialized(void)
72{
73 return dss_initialized;
74}
75EXPORT_SYMBOL(omapdss_is_initialized);
76
69struct platform_device *dss_get_core_pdev(void) 77struct platform_device *dss_get_core_pdev(void)
70{ 78{
71 return core.pdev; 79 return core.pdev;
@@ -606,6 +614,8 @@ static int __init omap_dss_init(void)
606 return r; 614 return r;
607 } 615 }
608 616
617 dss_initialized = true;
618
609 return 0; 619 return 0;
610} 620}
611 621
@@ -636,7 +646,15 @@ static int __init omap_dss_init(void)
636 646
637static int __init omap_dss_init2(void) 647static int __init omap_dss_init2(void)
638{ 648{
639 return omap_dss_register_drivers(); 649 int r;
650
651 r = omap_dss_register_drivers();
652 if (r)
653 return r;
654
655 dss_initialized = true;
656
657 return 0;
640} 658}
641 659
642core_initcall(omap_dss_init); 660core_initcall(omap_dss_init);
diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
index 717f13a93351..bb5f9fee3659 100644
--- a/drivers/video/omap2/omapfb/omapfb-main.c
+++ b/drivers/video/omap2/omapfb/omapfb-main.c
@@ -2416,6 +2416,9 @@ static int __init omapfb_probe(struct platform_device *pdev)
2416 2416
2417 DBG("omapfb_probe\n"); 2417 DBG("omapfb_probe\n");
2418 2418
2419 if (omapdss_is_initialized() == false)
2420 return -EPROBE_DEFER;
2421
2419 if (pdev->num_resources != 0) { 2422 if (pdev->num_resources != 0) {
2420 dev_err(&pdev->dev, "probed for an unknown device\n"); 2423 dev_err(&pdev->dev, "probed for an unknown device\n");
2421 r = -ENODEV; 2424 r = -ENODEV;
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index caefa093337d..9b52340ec3ff 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -741,6 +741,7 @@ struct omap_dss_driver {
741}; 741};
742 742
743enum omapdss_version omapdss_get_version(void); 743enum omapdss_version omapdss_get_version(void);
744bool omapdss_is_initialized(void);
744 745
745int omap_dss_register_driver(struct omap_dss_driver *); 746int omap_dss_register_driver(struct omap_dss_driver *);
746void omap_dss_unregister_driver(struct omap_dss_driver *); 747void omap_dss_unregister_driver(struct omap_dss_driver *);