Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 591a0ac7 authored by Tomi Valkeinen's avatar Tomi Valkeinen
Browse files

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: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
Tested-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
parent b358c6cf
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -548,6 +548,9 @@ static void pdev_shutdown(struct platform_device *device)

static int pdev_probe(struct platform_device *device)
{
	if (omapdss_is_initialized() == false)
		return -EPROBE_DEFER;

	DBG("%s", device->name);
	return drm_platform_init(&omap_drm_driver, device);
}
+3 −0
Original line number Diff line number Diff line
@@ -2144,6 +2144,9 @@ static int __init omap_vout_probe(struct platform_device *pdev)
	struct omap_dss_device *def_display;
	struct omap2video_device *vid_dev = NULL;

	if (omapdss_is_initialized() == false)
		return -EPROBE_DEFER;

	ret = omapdss_compat_init();
	if (ret) {
		dev_err(&pdev->dev, "failed to init dss\n");
+19 −1
Original line number Diff line number Diff line
@@ -53,6 +53,8 @@ static char *def_disp_name;
module_param_named(def_disp, def_disp_name, charp, 0);
MODULE_PARM_DESC(def_disp, "default display name");

static bool dss_initialized;

const char *omapdss_get_default_display_name(void)
{
	return core.default_display_name;
@@ -66,6 +68,12 @@ enum omapdss_version omapdss_get_version(void)
}
EXPORT_SYMBOL(omapdss_get_version);

bool omapdss_is_initialized(void)
{
	return dss_initialized;
}
EXPORT_SYMBOL(omapdss_is_initialized);

struct platform_device *dss_get_core_pdev(void)
{
	return core.pdev;
@@ -606,6 +614,8 @@ static int __init omap_dss_init(void)
		return r;
	}

	dss_initialized = true;

	return 0;
}

@@ -636,7 +646,15 @@ static int __init omap_dss_init(void)

static int __init omap_dss_init2(void)
{
	return omap_dss_register_drivers();
	int r;

	r = omap_dss_register_drivers();
	if (r)
		return r;

	dss_initialized = true;

	return 0;
}

core_initcall(omap_dss_init);
+3 −0
Original line number Diff line number Diff line
@@ -2416,6 +2416,9 @@ static int __init omapfb_probe(struct platform_device *pdev)

	DBG("omapfb_probe\n");

	if (omapdss_is_initialized() == false)
		return -EPROBE_DEFER;

	if (pdev->num_resources != 0) {
		dev_err(&pdev->dev, "probed for an unknown device\n");
		r = -ENODEV;
+1 −0
Original line number Diff line number Diff line
@@ -741,6 +741,7 @@ struct omap_dss_driver {
};

enum omapdss_version omapdss_get_version(void);
bool omapdss_is_initialized(void);

int omap_dss_register_driver(struct omap_dss_driver *);
void omap_dss_unregister_driver(struct omap_dss_driver *);