From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Rafael J. Wysocki" Subject: Re: [PATCH] cpuidle: don't use modular platform register in non-modular ARM drivers Date: Fri, 17 Jan 2014 02:18:38 +0100 Message-ID: <3872763.be1TKi9G4j@vostro.rjw.lan> References: <1389910767-4040-1-git-send-email-paul.gortmaker@windriver.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7Bit Return-path: Received: from v094114.home.net.pl ([79.96.170.134]:64902 "HELO v094114.home.net.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1750937AbaAQBEh (ORCPT ); Thu, 16 Jan 2014 20:04:37 -0500 In-Reply-To: <1389910767-4040-1-git-send-email-paul.gortmaker@windriver.com> Sender: linux-pm-owner@vger.kernel.org List-Id: linux-pm@vger.kernel.org To: Paul Gortmaker Cc: linux-kernel@vger.kernel.org, Daniel Lezcano , Michal Simek , linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org On Thursday, January 16, 2014 05:19:27 PM Paul Gortmaker wrote: > These two drivers are configured with Kconfig options that are > both declared as bool. Hence it is not possible for the code > to be built as modular. However the code is currently using the > module_platform_driver() macro for driver registration. > > While this currently works, we really don't want to be including > the module.h header in non-modular code, which we'll be forced > to do, pending some upcoming code relocation from init.h into > module.h. So we fix it now by using the non-modular equivalent. > > With some macro detangulation, and a little help from cpp, we can > see that module_platform_driver(calxeda_cpuidle_plat_driver) gets > roughly translated into: > > static int __init calxeda_cpuidle_plat_driver_init(void) > { > return platform_driver_register(&calxeda_cpuidle_plat_driver); > } > module_init(calxeda_cpuidle_plat_driver_init); > > static void __exit calxeda_cpuidle_plat_driver_exit(void) > { > platform_driver_unregister(&calxeda_cpuidle_plat_driver); > } > module_exit(calxeda_cpuidle_plat_driver_exit); > > [and similarly for the other file, cpuidle-zynq.c] > > And since we've already established that the code is non-modular, > we can completely drop any code relating to module_exit. For non > modular code, module_init beomes __initcall. But direct use of > __initcall is discouraged, vs. one of the priority categorized > subgroups. As __initcall gets mapped onto device_initcall, our > use of device_initcall directly in this change means that the > runtime impact is zero -- they will remain at level 6 in the > initcall ordering. > > Cc: "Rafael J. Wysocki" > Cc: Daniel Lezcano > Cc: Michal Simek > Cc: linux-pm@vger.kernel.org > Cc: linux-arm-kernel@lists.infradead.org > Signed-off-by: Paul Gortmaker I'd appreciate some ACKs from the ARM people. Thanks! > diff --git a/drivers/cpuidle/cpuidle-calxeda.c b/drivers/cpuidle/cpuidle-calxeda.c > index 6e51114057d0..631e2cd9bce6 100644 > --- a/drivers/cpuidle/cpuidle-calxeda.c > +++ b/drivers/cpuidle/cpuidle-calxeda.c > @@ -78,4 +78,8 @@ static struct platform_driver calxeda_cpuidle_plat_driver = { > .probe = calxeda_cpuidle_probe, > }; > > -module_platform_driver(calxeda_cpuidle_plat_driver); > +static int __init calxeda_cpuidle_plat_driver_init(void) > +{ > + return platform_driver_register(&calxeda_cpuidle_plat_driver); > +} > +device_initcall(calxeda_cpuidle_plat_driver_init); > diff --git a/drivers/cpuidle/cpuidle-zynq.c b/drivers/cpuidle/cpuidle-zynq.c > index aded75928028..a1aae519a573 100644 > --- a/drivers/cpuidle/cpuidle-zynq.c > +++ b/drivers/cpuidle/cpuidle-zynq.c > @@ -85,4 +85,8 @@ static struct platform_driver zynq_cpuidle_driver = { > .probe = zynq_cpuidle_probe, > }; > > -module_platform_driver(zynq_cpuidle_driver); > +static int __init zynq_cpuidle_driver_init(void) > +{ > + return platform_driver_register(&zynq_cpuidle_driver); > +} > +device_initcall(zynq_cpuidle_driver_init); > -- I speak only for myself. Rafael J. Wysocki, Intel Open Source Technology Center.