linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] cpuidle: don't use modular platform register in non-modular ARM drivers
@ 2014-01-16 22:19 Paul Gortmaker
  2014-01-17  1:18 ` Rafael J. Wysocki
  0 siblings, 1 reply; 2+ messages in thread
From: Paul Gortmaker @ 2014-01-16 22:19 UTC (permalink / raw)
  To: linux-kernel
  Cc: Paul Gortmaker, Rafael J. Wysocki, Daniel Lezcano, Michal Simek,
	linux-pm, linux-arm-kernel

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" <rjw@rjwysocki.net>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Michal Simek <michal.simek@xilinx.com>
Cc: linux-pm@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>

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);
-- 
1.8.5.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] cpuidle: don't use modular platform register in non-modular ARM drivers
  2014-01-16 22:19 [PATCH] cpuidle: don't use modular platform register in non-modular ARM drivers Paul Gortmaker
@ 2014-01-17  1:18 ` Rafael J. Wysocki
  0 siblings, 0 replies; 2+ messages in thread
From: Rafael J. Wysocki @ 2014-01-17  1:18 UTC (permalink / raw)
  To: Paul Gortmaker
  Cc: linux-kernel, Daniel Lezcano, Michal Simek, linux-pm, linux-arm-kernel

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" <rjw@rjwysocki.net>
> Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
> Cc: Michal Simek <michal.simek@xilinx.com>
> Cc: linux-pm@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>

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.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-01-17  1:04 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-01-16 22:19 [PATCH] cpuidle: don't use modular platform register in non-modular ARM drivers Paul Gortmaker
2014-01-17  1:18 ` Rafael J. Wysocki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).