lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <AANLkTimkpgRz2wDZgcRwqS8wSECCaKmLuo=j1avXxFfD@mail.gmail.com>
Date:	Wed, 18 Aug 2010 16:25:57 -0600
From:	Grant Likely <grant.likely@...retlab.ca>
To:	Patrick Pannuto <ppannuto@...eaurora.org>
Cc:	linux-kernel@...r.kernel.org, linux-arm-msm@...r.kernel.org,
	magnus.damm@...il.com, gregkh@...e.de,
	Kevin Hilman <khilman@...prootsystems.com>,
	Paul Mundt <lethal@...ux-sh.org>,
	Magnus Damm <damm@...nsource.se>,
	"Rafael J. Wysocki" <rjw@...k.pl>,
	Eric Miao <eric.y.miao@...il.com>,
	Dmitry Torokhov <dtor@...l.ru>, netdev@...r.kernel.org
Subject: Re: [PATCH 2/4] platform: Facilitate the creation of pseudo-platform buses

Hi Patrick,

On Wed, Aug 18, 2010 at 1:15 PM, Patrick Pannuto
<ppannuto@...eaurora.org> wrote:
> (lkml.org seems to have lost August 3rd...)
> RFC: http://lkml.indiana.edu/hypermail/linux/kernel/1008.0/01342.html
>  v1: http://lkml.indiana.edu/hypermail/linux/kernel/1008.0/01942.html
>  v2: http://lkml.indiana.edu/hypermail/linux/kernel/1008.1/00958.html
>
> Based on the idea and code originally proposed by Kevin Hilman:
> http://www.mail-archive.com/linux-omap@vger.kernel.org/msg31161.html
>
> Changes from v2:
>   * Remove the pseudo_platform_bus_[un]register functions
>   * Split affected platform functions:
>       - Platform functions are split into a wrapper (with the
>         original function name) that retains the 'bus-setting'
>         and 'parent-setting' duties, and then exports all the
>         heavy-lifting to new __platform* counterparts
>       - "Pseudo" buses work the same as the platform bus now,
>         writing their own wrappers and calling the __platform
>         functions
>   * Export a *lot* of platform symbols to allow for intialization
>     of "pseudo" platform bus types.
>       - I personally like this model a lot, I think it is very
>         clean from an implementation perspective, even if it
>         does export a lot of new symbols
>       - Thanks to Michal Miroslaw <mirqus@...il.com> for the
>         suggestion here

I'm not quite as hot on this approach, mostly because it is a lot more
invasive to the namespace than just exposing an initialization
routine.  However, I leave that as a point of 'taste' and Greg can
decide.  :-)

Otherwise, the patch looks good.  As I commented on the other patch, I
still want to see a real use case (ie, a bus with different behaviour)
before casting my vote.

One more comment below...

>   * Add more use-cases justifying the need of platform-ish bus types
>
> Changes from v1:
>
>   * "Pseudo" buses are no longer init'd, they are [un]registered by:
>       - pseudo_platform_bus_register(struct bus_type *)
>       - pseudo_platform_bus_unregister(struct bus_type *)
>   * These registrations [de]allocate a dev_pm_ops structure for the
>     pseudo bus_type
>   * Do not overwrite the parent if .bus is already set (that is, allow
>     pseudo bus devices to be root devices)
>
>   * Split into 2 patches:
>       - 1/2: Already sent separately, but included here for clarity
>       - 2/2: The real meat of the patch (this patch)
>
> INTRO
>
> As SOCs become more popular, the desire to quickly define a simple,
> but functional, bus type with only a few unique properties becomes
> desirable. As they become more complicated, the ability to nest these
> simple busses and otherwise orchestrate them to match the actual
> topology also becomes desirable.
>
> Also, as power management becomes more challenging, grouping devices
> on the same SOC under the same /logical bus/ provides a very natural
> interface and location for power-management issues for that SOC.
>
> This is a fairly natural extension of the "platform" bus; ultimately,
> this patch series allows for the creation of multiple platform buses (SOC
> buses), with the correct name and quirks for each of the "platforms" (SOCs)
> they are trying to support.
>
> EXAMPLE USAGE
>
> See follow-on patches implementing the MSM bus and moving the
> MSM uart device / driver onto it.
>
> Change-Id: I10d2fa4671302e81be8f9cac01a3855cef4eeebf
> Cc: Kevin Hilman <khilman@...prootsystems.com>
> Signed-off-by: Patrick Pannuto <ppannuto@...eaurora.org>
> ---
>  drivers/base/platform.c         |  184 ++++++++++++++++++++------------------
>  include/linux/platform_device.h |   87 ++++++++++++++++++
>  2 files changed, 184 insertions(+), 87 deletions(-)
>
> diff --git a/drivers/base/platform.c b/drivers/base/platform.c
> index b69ccb4..e75640f 100644
> --- a/drivers/base/platform.c
> +++ b/drivers/base/platform.c
> @@ -224,25 +224,10 @@ int platform_device_add_data(struct platform_device *pdev, const void *data,
>  }
>  EXPORT_SYMBOL_GPL(platform_device_add_data);
>
> -/**
> - * platform_device_add - add a platform device to device hierarchy
> - * @pdev: platform device we're adding
> - *
> - * This is part 2 of platform_device_register(), though may be called
> - * separately _iff_ pdev was allocated by platform_device_alloc().
> - */
> -int platform_device_add(struct platform_device *pdev)
> +int __platform_device_add(struct platform_device *pdev)
>  {
>        int i, ret = 0;
>
> -       if (!pdev)
> -               return -EINVAL;
> -
> -       if (!pdev->dev.parent)
> -               pdev->dev.parent = &platform_bus;
> -
> -       pdev->dev.bus = &platform_bus_type;
> -
>        if (pdev->id != -1)
>                dev_set_name(&pdev->dev, "%s.%d", pdev->name,  pdev->id);
>        else
> @@ -289,6 +274,27 @@ int platform_device_add(struct platform_device *pdev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(__platform_device_add);
> +
> +/**
> + * platform_device_add - add a platform device to device hierarchy
> + * @pdev: platform device we're adding
> + *
> + * This is part 2 of platform_device_register(), though may be called
> + * separately _iff_ pdev was allocated by platform_device_alloc().
> + */
> +int platform_device_add(struct platform_device *pdev)
> +{
> +       if (!pdev)
> +               return -EINVAL;
> +
> +       if (!pdev->dev.parent)
> +               pdev->dev.parent = &platform_bus;
> +
> +       pdev->dev.bus = &platform_bus_type;
> +
> +       return __platform_device_add(pdev);
> +}
>  EXPORT_SYMBOL_GPL(platform_device_add);
>
>  /**
> @@ -476,13 +482,8 @@ static void platform_drv_shutdown(struct device *_dev)
>        drv->shutdown(dev);
>  }
>
> -/**
> - * platform_driver_register - register a driver for platform-level devices
> - * @drv: platform driver structure
> - */
> -int platform_driver_register(struct platform_driver *drv)
> +int __platform_driver_register(struct platform_driver *drv)
>  {
> -       drv->driver.bus = &platform_bus_type;
>        if (drv->probe)
>                drv->driver.probe = platform_drv_probe;
>        if (drv->remove)
> @@ -492,6 +493,18 @@ int platform_driver_register(struct platform_driver *drv)
>
>        return driver_register(&drv->driver);
>  }
> +EXPORT_SYMBOL_GPL(__platform_driver_register);
> +
> +/**
> + * platform_driver_register - register a driver for platform-level devices
> + * @drv: platform driver structure
> + */
> +int platform_driver_register(struct platform_driver *drv)
> +{
> +       drv->driver.bus = &platform_bus_type;
> +
> +       return __platform_driver_register(drv);
> +}
>  EXPORT_SYMBOL_GPL(platform_driver_register);
>
>  /**
> @@ -504,25 +517,9 @@ void platform_driver_unregister(struct platform_driver *drv)
>  }
>  EXPORT_SYMBOL_GPL(platform_driver_unregister);
>
> -/**
> - * platform_driver_probe - register driver for non-hotpluggable device
> - * @drv: platform driver structure
> - * @probe: the driver probe routine, probably from an __init section
> - *
> - * Use this instead of platform_driver_register() when you know the device
> - * is not hotpluggable and has already been registered, and you want to
> - * remove its run-once probe() infrastructure from memory after the driver
> - * has bound to the device.
> - *
> - * One typical use for this would be with drivers for controllers integrated
> - * into system-on-chip processors, where the controller devices have been
> - * configured as part of board setup.
> - *
> - * Returns zero if the driver registered and bound to a device, else returns
> - * a negative error code and with the driver not registered.
> - */
> -int __init_or_module platform_driver_probe(struct platform_driver *drv,
> -               int (*probe)(struct platform_device *))
> +int __init_or_module __platform_driver_probe(struct platform_driver *drv,
> +               int (*probe)(struct platform_device *),
> +               int (*bustype_driver_register)(struct platform_driver *))

Personally, unless you already have a use-case for using the
platform_driver_probe() hook on the custom busses, I would just leave
this one unimplemented.  It isn't critical (and I don't like it, but
that's a rant for another email).

>  {
>        int retval, code;
>
> @@ -531,7 +528,7 @@ int __init_or_module platform_driver_probe(struct platform_driver *drv,
>
>        /* temporary section violation during probe() */
>        drv->probe = probe;
> -       retval = code = platform_driver_register(drv);
> +       retval = code = bustype_driver_register(drv);
>
>        /*
>         * Fixup that section violation, being paranoid about code scanning
> @@ -550,6 +547,30 @@ int __init_or_module platform_driver_probe(struct platform_driver *drv,
>                platform_driver_unregister(drv);
>        return retval;
>  }
> +EXPORT_SYMBOL_GPL(__platform_driver_probe);
> +
> +/**
> + * platform_driver_probe - register driver for non-hotpluggable device
> + * @drv: platform driver structure
> + * @probe: the driver probe routine, probably from an __init section
> + *
> + * Use this instead of platform_driver_register() when you know the device
> + * is not hotpluggable and has already been registered, and you want to
> + * remove its run-once probe() infrastructure from memory after the driver
> + * has bound to the device.
> + *
> + * One typical use for this would be with drivers for controllers integrated
> + * into system-on-chip processors, where the controller devices have been
> + * configured as part of board setup.
> + *
> + * Returns zero if the driver registered and bound to a device, else returns
> + * a negative error code and with the driver not registered.
> + */
> +int __init_or_module platform_driver_probe(struct platform_driver *drv,
> +               int (*probe)(struct platform_device *))
> +{
> +       return __platform_driver_probe(drv, probe, &platform_driver_register);
> +}
>  EXPORT_SYMBOL_GPL(platform_driver_probe);
>
>  /**
> @@ -627,12 +648,13 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
>        return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
>  }
>
> -static struct device_attribute platform_dev_attrs[] = {
> +struct device_attribute platform_dev_attrs[] = {
>        __ATTR_RO(modalias),
>        __ATTR_NULL,
>  };
> +EXPORT_SYMBOL_GPL(platform_dev_attrs);
>
> -static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
> +int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
>  {
>        struct platform_device  *pdev = to_platform_device(dev);
>
> @@ -640,6 +662,7 @@ static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
>                (pdev->id_entry) ? pdev->id_entry->name : pdev->name);
>        return 0;
>  }
> +EXPORT_SYMBOL_GPL(platform_uevent);
>
>  static const struct platform_device_id *platform_match_id(
>                        const struct platform_device_id *id,
> @@ -668,7 +691,7 @@ static const struct platform_device_id *platform_match_id(
>  * and compare it against the name of the driver. Return whether they match
>  * or not.
>  */
> -static int platform_match(struct device *dev, struct device_driver *drv)
> +int platform_match(struct device *dev, struct device_driver *drv)
>  {
>        struct platform_device *pdev = to_platform_device(dev);
>        struct platform_driver *pdrv = to_platform_driver(drv);
> @@ -680,10 +703,11 @@ static int platform_match(struct device *dev, struct device_driver *drv)
>        /* fall-back to driver name match */
>        return (strcmp(pdev->name, drv->name) == 0);
>  }
> +EXPORT_SYMBOL_GPL(platform_match);
>
>  #ifdef CONFIG_PM_SLEEP
>
> -static int platform_legacy_suspend(struct device *dev, pm_message_t mesg)
> +int platform_legacy_suspend(struct device *dev, pm_message_t mesg)
>  {
>        struct platform_driver *pdrv = to_platform_driver(dev->driver);
>        struct platform_device *pdev = to_platform_device(dev);
> @@ -695,7 +719,7 @@ static int platform_legacy_suspend(struct device *dev, pm_message_t mesg)
>        return ret;
>  }
>
> -static int platform_legacy_resume(struct device *dev)
> +int platform_legacy_resume(struct device *dev)
>  {
>        struct platform_driver *pdrv = to_platform_driver(dev->driver);
>        struct platform_device *pdev = to_platform_device(dev);
> @@ -707,7 +731,7 @@ static int platform_legacy_resume(struct device *dev)
>        return ret;
>  }
>
> -static int platform_pm_prepare(struct device *dev)
> +int platform_pm_prepare(struct device *dev)
>  {
>        struct device_driver *drv = dev->driver;
>        int ret = 0;
> @@ -717,19 +741,16 @@ static int platform_pm_prepare(struct device *dev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(platform_pm_prepare);
>
> -static void platform_pm_complete(struct device *dev)
> +void platform_pm_complete(struct device *dev)
>  {
>        struct device_driver *drv = dev->driver;
>
>        if (drv && drv->pm && drv->pm->complete)
>                drv->pm->complete(dev);
>  }
> -
> -#else /* !CONFIG_PM_SLEEP */
> -
> -#define platform_pm_prepare            NULL
> -#define platform_pm_complete           NULL
> +EXPORT_SYMBOL_GPL(platform_pm_complete);
>
>  #endif /* !CONFIG_PM_SLEEP */
>
> @@ -752,6 +773,7 @@ int __weak platform_pm_suspend(struct device *dev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(platform_pm_suspend);
>
>  int __weak platform_pm_suspend_noirq(struct device *dev)
>  {
> @@ -768,6 +790,7 @@ int __weak platform_pm_suspend_noirq(struct device *dev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(platform_pm_suspend_noirq);
>
>  int __weak platform_pm_resume(struct device *dev)
>  {
> @@ -786,6 +809,7 @@ int __weak platform_pm_resume(struct device *dev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(platform_pm_resume);
>
>  int __weak platform_pm_resume_noirq(struct device *dev)
>  {
> @@ -802,19 +826,13 @@ int __weak platform_pm_resume_noirq(struct device *dev)
>
>        return ret;
>  }
> -
> -#else /* !CONFIG_SUSPEND */
> -
> -#define platform_pm_suspend            NULL
> -#define platform_pm_resume             NULL
> -#define platform_pm_suspend_noirq      NULL
> -#define platform_pm_resume_noirq       NULL
> +EXPORT_SYMBOL_GPL(platform_pm_resume_noirq);
>
>  #endif /* !CONFIG_SUSPEND */
>
>  #ifdef CONFIG_HIBERNATION
>
> -static int platform_pm_freeze(struct device *dev)
> +int platform_pm_freeze(struct device *dev)
>  {
>        struct device_driver *drv = dev->driver;
>        int ret = 0;
> @@ -831,8 +849,9 @@ static int platform_pm_freeze(struct device *dev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(platform_pm_freeze);
>
> -static int platform_pm_freeze_noirq(struct device *dev)
> +int platform_pm_freeze_noirq(struct device *dev)
>  {
>        struct device_driver *drv = dev->driver;
>        int ret = 0;
> @@ -847,8 +866,9 @@ static int platform_pm_freeze_noirq(struct device *dev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(platform_pm_freeze_noirq);
>
> -static int platform_pm_thaw(struct device *dev)
> +int platform_pm_thaw(struct device *dev)
>  {
>        struct device_driver *drv = dev->driver;
>        int ret = 0;
> @@ -865,8 +885,9 @@ static int platform_pm_thaw(struct device *dev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(platform_pm_thaw);
>
> -static int platform_pm_thaw_noirq(struct device *dev)
> +int platform_pm_thaw_noirq(struct device *dev)
>  {
>        struct device_driver *drv = dev->driver;
>        int ret = 0;
> @@ -881,8 +902,9 @@ static int platform_pm_thaw_noirq(struct device *dev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(platform_pm_thaw_noirq);
>
> -static int platform_pm_poweroff(struct device *dev)
> +int platform_pm_poweroff(struct device *dev)
>  {
>        struct device_driver *drv = dev->driver;
>        int ret = 0;
> @@ -899,8 +921,9 @@ static int platform_pm_poweroff(struct device *dev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(platform_pm_poweroff);
>
> -static int platform_pm_poweroff_noirq(struct device *dev)
> +int platform_pm_poweroff_noirq(struct device *dev)
>  {
>        struct device_driver *drv = dev->driver;
>        int ret = 0;
> @@ -915,8 +938,9 @@ static int platform_pm_poweroff_noirq(struct device *dev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(platform_pm_poweroff_noirq);
>
> -static int platform_pm_restore(struct device *dev)
> +int platform_pm_restore(struct device *dev)
>  {
>        struct device_driver *drv = dev->driver;
>        int ret = 0;
> @@ -933,8 +957,9 @@ static int platform_pm_restore(struct device *dev)
>
>        return ret;
>  }
> +EXPORT_SYMBOL_GPL(platform_pm_restore);
>
> -static int platform_pm_restore_noirq(struct device *dev)
> +int platform_pm_restore_noirq(struct device *dev)
>  {
>        struct device_driver *drv = dev->driver;
>        int ret = 0;
> @@ -949,17 +974,7 @@ static int platform_pm_restore_noirq(struct device *dev)
>
>        return ret;
>  }
> -
> -#else /* !CONFIG_HIBERNATION */
> -
> -#define platform_pm_freeze             NULL
> -#define platform_pm_thaw               NULL
> -#define platform_pm_poweroff           NULL
> -#define platform_pm_restore            NULL
> -#define platform_pm_freeze_noirq       NULL
> -#define platform_pm_thaw_noirq         NULL
> -#define platform_pm_poweroff_noirq     NULL
> -#define platform_pm_restore_noirq      NULL
> +EXPORT_SYMBOL_GPL(platform_pm_restore_noirq);
>
>  #endif /* !CONFIG_HIBERNATION */
>
> @@ -980,15 +995,9 @@ int __weak platform_pm_runtime_idle(struct device *dev)
>        return pm_generic_runtime_idle(dev);
>  };
>
> -#else /* !CONFIG_PM_RUNTIME */
> -
> -#define platform_pm_runtime_suspend NULL
> -#define platform_pm_runtime_resume NULL
> -#define platform_pm_runtime_idle NULL
> -
>  #endif /* !CONFIG_PM_RUNTIME */
>
> -static const struct dev_pm_ops platform_dev_pm_ops = {
> +const struct dev_pm_ops platform_dev_pm_ops = {
>        .prepare = platform_pm_prepare,
>        .complete = platform_pm_complete,
>        .suspend = platform_pm_suspend,
> @@ -1007,6 +1016,7 @@ static const struct dev_pm_ops platform_dev_pm_ops = {
>        .runtime_resume = platform_pm_runtime_resume,
>        .runtime_idle = platform_pm_runtime_idle,
>  };
> +EXPORT_SYMBOL_GPL(platform_dev_pm_ops);
>
>  struct bus_type platform_bus_type = {
>        .name           = "platform",
> diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h
> index 5417944..6d7d399 100644
> --- a/include/linux/platform_device.h
> +++ b/include/linux/platform_device.h
> @@ -53,6 +53,7 @@ extern int platform_device_add_resources(struct platform_device *pdev,
>                                         const struct resource *res,
>                                         unsigned int num);
>  extern int platform_device_add_data(struct platform_device *pdev, const void *data, size_t size);
> +extern int __platform_device_add(struct platform_device *pdev);
>  extern int platform_device_add(struct platform_device *pdev);
>  extern void platform_device_del(struct platform_device *pdev);
>  extern void platform_device_put(struct platform_device *pdev);
> @@ -67,12 +68,16 @@ struct platform_driver {
>        const struct platform_device_id *id_table;
>  };
>
> +extern int __platform_driver_register(struct platform_driver *);
>  extern int platform_driver_register(struct platform_driver *);
>  extern void platform_driver_unregister(struct platform_driver *);
>
>  /* non-hotpluggable platform devices may use this so that probe() and
>  * its support may live in __init sections, conserving runtime memory.
>  */
> +extern int __platform_driver_probe(struct platform_driver *driver,
> +               int (*probe)(struct platform_device *),
> +               int (*bustype_driver_register)(struct platform_driver *));
>  extern int platform_driver_probe(struct platform_driver *driver,
>                int (*probe)(struct platform_device *));
>
> @@ -84,6 +89,88 @@ extern struct platform_device *platform_create_bundle(struct platform_driver *dr
>                                        struct resource *res, unsigned int n_res,
>                                        const void *data, size_t size);
>
> +extern struct device_attribute platform_dev_attrs[];
> +extern int platform_uevent(struct device *dev, struct kobj_uevent_env *env);
> +extern int platform_match(struct device *dev, struct device_driver *drv);
> +
> +#ifdef CONFIG_PM_SLEEP
> +extern int platform_pm_prepare(struct device *dev);
> +extern void platform_pm_complete(struct device *dev);
> +#else  /* !CONFIG_PM_SLEEP */
> +#define platform_pm_prepare            NULL
> +#define platform_pm_complete           NULL
> +#endif /* !CONFIG_PM_SLEEP */
> +
> +#ifdef CONFIG_SUSPEND
> +extern int __weak platform_pm_suspend(struct device *dev);
> +extern int __weak platform_pm_suspend_noirq(struct device *dev);
> +extern int __weak platform_pm_resume(struct device *dev);
> +extern int __weak platform_pm_resume_noirq(struct device *dev);
> +#else  /* !CONFIG_SUSPEND */
> +#define platform_pm_suspend            NULL
> +#define platform_pm_resume             NULL
> +#define platform_pm_suspend_noirq      NULL
> +#define platform_pm_resume_noirq       NULL
> +#endif /* !CONFIG_SUSPEND */
> +
> +#ifdef CONFIG_HIBERNATION
> +extern int platform_pm_freeze(struct device *dev);
> +extern int platform_pm_freeze_noirq(struct device *dev);
> +extern int platform_pm_thaw(struct device *dev);
> +extern int platform_pm_thaw_noirq(struct device *dev);
> +extern int platform_pm_poweroff(struct device *dev);
> +extern int platform_pm_poweroff_noirq(struct device *dev);
> +extern int platform_pm_restore(struct device *dev);
> +extern int platform_pm_restore_noirq(struct device *dev);
> +#else  /* !CONFIG_HIBERNATION */
> +#define platform_pm_freeze             NULL
> +#define platform_pm_thaw               NULL
> +#define platform_pm_poweroff           NULL
> +#define platform_pm_restore            NULL
> +#define platform_pm_freeze_noirq       NULL
> +#define platform_pm_thaw_noirq         NULL
> +#define platform_pm_poweroff_noirq     NULL
> +#define platform_pm_restore_noirq      NULL
> +#endif /* !CONFIG_HIBERNATION */
> +
> +#ifdef CONFIG_PM_RUNTIME
> +extern int __weak platform_pm_runtime_suspend(struct device *dev);
> +extern int __weak platform_pm_runtime_resume(struct device *dev);
> +extern int __weak platform_pm_runtime_idle(struct device *dev);
> +#else  /* !CONFIG_PM_RUNTIME */
> +#define platform_pm_runtime_suspend NULL
> +#define platform_pm_runtime_resume NULL
> +#define platform_pm_runtime_idle NULL
> +#endif /* !CONFIG_PM_RUNTIME */
> +
> +extern const struct dev_pm_ops platform_dev_pm_ops;
> +
> +#define PLATFORM_BUS_TEMPLATE \
> +       .name           = "XXX_OVERRIDEME_XXX", \
> +       .dev_attrs      = platform_dev_attrs,   \
> +       .match          = platform_match,       \
> +       .uevent         = platform_uevent,      \
> +       .pm             = &platform_dev_pm_ops
> +
> +#define PLATFORM_PM_OPS_TEMPLATE \
> +       .prepare = platform_pm_prepare,                 \
> +       .complete = platform_pm_complete,               \
> +       .suspend = platform_pm_suspend,                 \
> +       .resume = platform_pm_resume,                   \
> +       .freeze = platform_pm_freeze,                   \
> +       .thaw = platform_pm_thaw,                       \
> +       .poweroff = platform_pm_poweroff,               \
> +       .restore = platform_pm_restore,                 \
> +       .suspend_noirq = platform_pm_suspend_noirq,     \
> +       .resume_noirq = platform_pm_resume_noirq,       \
> +       .freeze_noirq = platform_pm_freeze_noirq,       \
> +       .thaw_noirq = platform_pm_thaw_noirq,           \
> +       .poweroff_noirq = platform_pm_poweroff_noirq,   \
> +       .restore_noirq = platform_pm_restore_noirq,     \
> +       .runtime_suspend = platform_pm_runtime_suspend, \
> +       .runtime_resume = platform_pm_runtime_resume,   \
> +       .runtime_idle = platform_pm_runtime_idle
> +
>  /* early platform driver interface */
>  struct early_platform_driver {
>        const char *class_str;
> --
> 1.7.2.1
>
>



-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ