Re: [PATCH V4 3/6] OMAPDSS: DSS: Cleanup cpu_is_xxxx checks
From: Tomi Valkeinen <hidden>
Date: 2012-08-20 08:42:04
Also in:
linux-fbdev
Attachments
- signature.asc [application/pgp-signature] 836 bytes
From: Tomi Valkeinen <hidden>
Date: 2012-08-20 08:42:04
Also in:
linux-fbdev
On Fri, 2012-08-17 at 16:54 +0300, Tomi Valkeinen wrote:
On Thu, 2012-08-16 at 16:48 +0530, Chandrabhanu Mahapatra wrote:quoted
All the cpu_is checks have been moved to dss_init_features function providing a much more generic and cleaner interface. The OMAP version and revision specific initializations in various functions are cleaned and the necessary data are moved to dss_features structure which is local to dss.c. Signed-off-by: Chandrabhanu Mahapatra <redacted>quoted
+static int __init dss_init_features(struct device *dev) +{ + dss.feat = devm_kzalloc(dev, sizeof(*dss.feat), GFP_KERNEL); + if (!dss.feat) { + dev_err(dev, "Failed to allocate local DSS Features\n"); + return -ENOMEM; + } + + if (cpu_is_omap24xx()) + dss.feat = &omap24xx_dss_features; + else if (cpu_is_omap34xx()) + dss.feat = &omap34xx_dss_features; + else if (cpu_is_omap3630()) + dss.feat = &omap3630_dss_features; + else if (cpu_is_omap44xx()) + dss.feat = &omap44xx_dss_features; + else + return -ENODEV; + + return 0; +}This is not correct (and same problem in dispc). You allocate the feat struct and assign the pointer to dss.feat, but then overwrite dss.feat pointer with the pointer to omap24xx_dss_features (which is freed later). You need to memcpy it. I also get a crash on omap3 overo board when loading omapdss:
The crash happens because dss_get_clocks uses the feat stuff, but the dss_init_features is only called later. Did you test this? I can't see how that can work on any board. Also, in the current place you have dss_init_features call, in case there's an error you can't just return, you need to release the resources. The same problem is in the dispc.c. Tomi