[PATCH v2 1/3] OMAP: PM: initial runtime PM core support
Grant Likely
grant.likely at secretlab.ca
Wed Aug 4 18:55:27 EDT 2010
On Thu, Jun 24, 2010 at 5:43 PM, Kevin Hilman
<khilman at deeprootsystems.com> wrote:
> Implement the new runtime PM framework as a thin layer on top of the
> omap_device API. Since we don't have an OMAP-specific bus, override
> the runtime PM hooks for the platform_bus for the OMAP specific
> implementation.
[...]
> +int platform_pm_runtime_suspend(struct device *dev)
> +{
> + struct platform_device *pdev = to_platform_device(dev);
> + struct omap_device *odev = to_omap_device(pdev);
> + int r, ret = 0;
> +
> + dev_dbg(dev, "%s\n", __func__);
> +
> + if (dev->driver->pm && dev->driver->pm->runtime_suspend)
> + ret = dev->driver->pm->runtime_suspend(dev);
> + if (!ret && omap_device_is_valid(odev)) {
> + r = omap_device_idle(pdev);
> + WARN_ON(r);
For the record, I should note here that this is *really* dangerous.
When handed a random platform_device pointer, it is not safe to use
to_omap_device() and dereference it with omap_device_is_valid().
There are no guarantees that the dereference is actually valid,
particularly so when the platform_device has been dynamically
allocated.
It is only okay to use to_omap_device() when the code is already
absolutely sure that the platform_device is in fact contained by a
struct omap_device. There needs to be a different method to test if
it is contained by an omap_device before doing the dereference.
More information about the linux-arm-kernel
mailing list