aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorKevin Hilman <khilman@deeprootsystems.com>2010-02-24 14:05:45 -0500
committerPaul Walmsley <paul@pwsan.com>2010-02-24 14:05:45 -0500
commit0007122ad85cc36b1c18c0b59344093ca210d206 (patch)
treec5406ff2b8fd1ddd11cc0201c6a10ef47dbd2990 /arch
parent80c20d543d142ee54ec85259b77aaf0b83c32db5 (diff)
OMAP: omap_device: add omap_device_is_valid()
The omap_device struct contains a 'struct platform_device'. Normally, converting a platform_device pointer to an omap_device pointer consists of simply doing a container_of(), as is done currently by the to_omap_device() macro. However, if this is attempted when using platform_device that has not been created as part of the omap_device creation, the container_of() will point to a memory location before the platform_device pointer which will contain random data. Therefore, we need a way to detect valid omap_device pointers. This patch solves this by using the simple magic number approach. Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com> Signed-off-by: Paul Walmsley <paul@pwsan.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/plat-omap/include/plat/omap_device.h2
-rw-r--r--arch/arm/plat-omap/omap_device.c16
2 files changed, 18 insertions, 0 deletions
diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h
index 76d49171fed9..4677ff7d3ab5 100644
--- a/arch/arm/plat-omap/include/plat/omap_device.h
+++ b/arch/arm/plat-omap/include/plat/omap_device.h
@@ -62,6 +62,7 @@
62 * 62 *
63 */ 63 */
64struct omap_device { 64struct omap_device {
65 u32 magic;
65 struct platform_device pdev; 66 struct platform_device pdev;
66 struct omap_hwmod **hwmods; 67 struct omap_hwmod **hwmods;
67 struct omap_device_pm_latency *pm_lats; 68 struct omap_device_pm_latency *pm_lats;
@@ -81,6 +82,7 @@ int omap_device_shutdown(struct platform_device *pdev);
81 82
82/* Core code interface */ 83/* Core code interface */
83 84
85bool omap_device_is_valid(struct omap_device *od);
84int omap_device_count_resources(struct omap_device *od); 86int omap_device_count_resources(struct omap_device *od);
85int omap_device_fill_resources(struct omap_device *od, struct resource *res); 87int omap_device_fill_resources(struct omap_device *od, struct resource *res);
86 88
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c
index 5195dbb1a397..40289e095fc6 100644
--- a/arch/arm/plat-omap/omap_device.c
+++ b/arch/arm/plat-omap/omap_device.c
@@ -90,6 +90,8 @@
90#define IGNORE_WAKEUP_LAT 1 90#define IGNORE_WAKEUP_LAT 1
91 91
92 92
93#define OMAP_DEVICE_MAGIC 0xf00dcafe
94
93/* Private functions */ 95/* Private functions */
94 96
95/** 97/**
@@ -403,6 +405,8 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
403 od->pm_lats = pm_lats; 405 od->pm_lats = pm_lats;
404 od->pm_lats_cnt = pm_lats_cnt; 406 od->pm_lats_cnt = pm_lats_cnt;
405 407
408 od->magic = OMAP_DEVICE_MAGIC;
409
406 ret = omap_device_register(od); 410 ret = omap_device_register(od);
407 if (ret) 411 if (ret)
408 goto odbs_exit4; 412 goto odbs_exit4;
@@ -589,6 +593,18 @@ int omap_device_align_pm_lat(struct platform_device *pdev,
589} 593}
590 594
591/** 595/**
596 * omap_device_is_valid - Check if pointer is a valid omap_device
597 * @od: struct omap_device *
598 *
599 * Return whether struct omap_device pointer @od points to a valid
600 * omap_device.
601 */
602bool omap_device_is_valid(struct omap_device *od)
603{
604 return (od && od->magic == OMAP_DEVICE_MAGIC);
605}
606
607/**
592 * omap_device_get_pwrdm - return the powerdomain * associated with @od 608 * omap_device_get_pwrdm - return the powerdomain * associated with @od
593 * @od: struct omap_device * 609 * @od: struct omap_device *
594 * 610 *