diff options
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2013-05-23 05:07:50 -0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2013-05-23 05:54:21 -0400 |
commit | 591a0ac7f14aae6bf11b1cb6b5a68480bd644ddb (patch) | |
tree | cb2b4707ecd8aaac1eff6901b311d4f839c69383 | |
parent | b358c6cf029cb67b3ed9cc367fb46f1fa3228c5b (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.c | 3 | ||||
-rw-r--r-- | drivers/media/platform/omap/omap_vout.c | 3 | ||||
-rw-r--r-- | drivers/video/omap2/dss/core.c | 20 | ||||
-rw-r--r-- | drivers/video/omap2/omapfb/omapfb-main.c | 3 | ||||
-rw-r--r-- | include/video/omapdss.h | 1 |
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 | ||
549 | static int pdev_probe(struct platform_device *device) | 549 | static 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; | |||
53 | module_param_named(def_disp, def_disp_name, charp, 0); | 53 | module_param_named(def_disp, def_disp_name, charp, 0); |
54 | MODULE_PARM_DESC(def_disp, "default display name"); | 54 | MODULE_PARM_DESC(def_disp, "default display name"); |
55 | 55 | ||
56 | static bool dss_initialized; | ||
57 | |||
56 | const char *omapdss_get_default_display_name(void) | 58 | const 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 | } |
67 | EXPORT_SYMBOL(omapdss_get_version); | 69 | EXPORT_SYMBOL(omapdss_get_version); |
68 | 70 | ||
71 | bool omapdss_is_initialized(void) | ||
72 | { | ||
73 | return dss_initialized; | ||
74 | } | ||
75 | EXPORT_SYMBOL(omapdss_is_initialized); | ||
76 | |||
69 | struct platform_device *dss_get_core_pdev(void) | 77 | struct 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 | ||
637 | static int __init omap_dss_init2(void) | 647 | static 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 | ||
642 | core_initcall(omap_dss_init); | 660 | core_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 | ||
743 | enum omapdss_version omapdss_get_version(void); | 743 | enum omapdss_version omapdss_get_version(void); |
744 | bool omapdss_is_initialized(void); | ||
744 | 745 | ||
745 | int omap_dss_register_driver(struct omap_dss_driver *); | 746 | int omap_dss_register_driver(struct omap_dss_driver *); |
746 | void omap_dss_unregister_driver(struct omap_dss_driver *); | 747 | void omap_dss_unregister_driver(struct omap_dss_driver *); |