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 *); |
