Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753324Ab0HYTuG (ORCPT ); Wed, 25 Aug 2010 15:50:06 -0400 Received: from mail-px0-f174.google.com ([209.85.212.174]:64655 "EHLO mail-px0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751536Ab0HYTuD convert rfc822-to-8bit (ORCPT ); Wed, 25 Aug 2010 15:50:03 -0400 From: Kevin Hilman To: Grant Likely Cc: linux-kernel@vger.kernel.org, Magnus Damm , Greg Kroah-Hartman , Uwe =?iso-8859-1?Q?Kleine-K=F6nig?= , Paul Mundt , Magnus Damm , Eric Miao , netdev@vger.kernel.org Subject: Re: [PATCH v2] driver core: platform_bus: allow runtime override of dev_pm_ops Organization: Deep Root Systems, LLC References: <1282583922-984-1-git-send-email-khilman@deeprootsystems.com> Date: Wed, 25 Aug 2010 12:50:00 -0700 In-Reply-To: (Grant Likely's message of "Wed, 25 Aug 2010 01:30:09 -0600") Message-ID: <871v9mfp5j.fsf@deeprootsystems.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5156 Lines: 134 Grant Likely writes: > On Mon, Aug 23, 2010 at 11:18 AM, Kevin Hilman > wrote: >> Currently, the platform_bus allows customization of several of the >> busses dev_pm_ops methods by using weak symbols so that platform code >> can override them. ?The weak-symbol approach is not scalable when >> wanting to support multiple platforms in a single kernel binary. >> >> Instead, provide __init methods for platform code to customize the >> dev_pm_ops methods at runtime. >> >> NOTE: after these dynamic methods are merged, the weak symbols should >> ? ? ?be removed from drivers/base/platform.c. ?AFAIK, this will only >> ? ? ?affect SH and sh-mobile which should be converted to use this >> ? ? ?runtime approach instead of the weak symbols. ?After SH & >> ? ? ?sh-mobile are converted, the weak symobols could be removed. >> >> Tested on OMAP3. >> >> Cc: Grant Likely >> Cc: Magnus Damm >> Signed-off-by: Kevin Hilman > > Looks good to me. A handful of nitpicks below, I don't know if Greg > will want you to respin for these or not. Feel free to add my > acked-by line though: > > Acked-by: Grant Likely Thanks, here's a re-spin with your signoff and fixing the issues you raised. Applies to v2.6.36-rc1. Kevin >From 728f0ae551e805a10c9a45bcfb29f81ad45842da Mon Sep 17 00:00:00 2001 From: Kevin Hilman Date: Fri, 20 Aug 2010 10:46:53 -0700 Subject: [PATCH] driver core: platform_bus: allow runtime override of dev_pm_ops Currently, the platform_bus allows customization of several of the busses dev_pm_ops methods by using weak symbols so that platform code can override them. The weak-symbol approach is not scalable when wanting to support multiple platforms in a single kernel binary. Instead, provide __init methods for platform code to customize the dev_pm_ops methods at runtime. NOTE: after these dynamic methods are merged, the weak symbols should be removed from drivers/base/platform.c. AFAIK, this will only affect SH and sh-mobile which should be converted to use this runtime approach instead of the weak symbols. After SH & sh-mobile are converted, the weak symobols could be removed. Tested on OMAP3. Cc: Magnus Damm Acked-by: Grant Likely Signed-off-by: Kevin Hilman --- drivers/base/platform.c | 35 +++++++++++++++++++++++++++++++++++ include/linux/platform_device.h | 3 +++ 2 files changed, 38 insertions(+), 0 deletions(-) diff --git a/drivers/base/platform.c b/drivers/base/platform.c index c6c933f..468bbfd 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -976,6 +976,41 @@ struct bus_type platform_bus_type = { }; EXPORT_SYMBOL_GPL(platform_bus_type); +/** + * platform_bus_get_pm_ops() - return pointer to busses dev_pm_ops + * + * This function can be used by platform code to get the current + * set of dev_pm_ops functions used by the platform_bus_type. + */ +const struct dev_pm_ops * __init platform_bus_get_pm_ops(void) +{ + return platform_bus_type.pm; +} + +/** + * platform_bus_set_pm_ops() - update dev_pm_ops for the platform_bus_type + * + * @pm: pointer to new dev_pm_ops struct to be used for platform_bus_type + * + * Platform code can override the dev_pm_ops methods of + * platform_bus_type by using this function. It is expected that + * platform code will first do a platform_bus_get_pm_ops(), then + * kmemdup it, then customize selected methods and pass a pointer to + * the new struct dev_pm_ops to this function. + * + * Since platform-specific code is customizing methods for *all* + * devices (not just platform-specific devices) it is expected that + * any custom overrides of these functions will keep existing behavior + * and simply extend it. For example, any customization of the + * runtime PM methods should continue to call the pm_generic_* + * functions as the default ones do in addition to the + * platform-specific behavior. + */ +void __init platform_bus_set_pm_ops(const struct dev_pm_ops *pm) +{ + platform_bus_type.pm = pm; +} + int __init platform_bus_init(void) { int error; diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index d7ecad0..2e700ec 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -138,6 +138,9 @@ 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 const struct dev_pm_ops * platform_bus_get_pm_ops(void); +extern void platform_bus_set_pm_ops(const struct dev_pm_ops *pm); + /* early platform driver interface */ struct early_platform_driver { const char *class_str; -- 1.7.2.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/