Re: [RESEND PATCH 6/6] cpufreq: probe the Integrator cpufreq driver from DT

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Monday, October 07, 2013 03:53:47 PM Linus Walleij wrote:
> This makes the Integrator cpufreq driver probe from the core
> module device tree node through it's registered platforms
> device, getting the memory base from the device tree,
> remapping it and removing dependencies to <mach/platform.h>
> and <mach/hardware.h> by moving the two affected CM
> register offsets into the driver.
> 
> Cc: Rafael J. Wysocki <rjw@xxxxxxx>
> Cc: Viresh Kumar <viresh.kumar@xxxxxxxxxx>
> Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx>
> ---
> CPUfreq guys - can either of you ACK this patch so I can take
> it through the ARM SoC tree?

Formally, Viresh is responsible for ARM cpufreq, but I have no objections,
so please feel free to add:

Acked-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>

to this patch.

> ---
>  drivers/cpufreq/integrator-cpufreq.c | 56 ++++++++++++++++++++++++------------
>  1 file changed, 38 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/cpufreq/integrator-cpufreq.c b/drivers/cpufreq/integrator-cpufreq.c
> index f7c99df..9faf0ca 100644
> --- a/drivers/cpufreq/integrator-cpufreq.c
> +++ b/drivers/cpufreq/integrator-cpufreq.c
> @@ -15,18 +15,19 @@
>  #include <linux/smp.h>
>  #include <linux/init.h>
>  #include <linux/io.h>
> +#include <linux/platform_device.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
>  
> -#include <mach/hardware.h>
> -#include <mach/platform.h>
>  #include <asm/mach-types.h>
>  #include <asm/hardware/icst.h>
>  
> -static struct cpufreq_driver integrator_driver;
> +static void __iomem *cm_base;
> +/* The cpufreq driver only use the OSC register */
> +#define INTEGRATOR_HDR_OSC_OFFSET       0x08
> +#define INTEGRATOR_HDR_LOCK_OFFSET      0x14
>  
> -#define CM_ID  	__io_address(INTEGRATOR_HDR_ID)
> -#define CM_OSC	__io_address(INTEGRATOR_HDR_OSC)
> -#define CM_STAT __io_address(INTEGRATOR_HDR_STAT)
> -#define CM_LOCK __io_address(INTEGRATOR_HDR_LOCK)
> +static struct cpufreq_driver integrator_driver;
>  
>  static const struct icst_params lclk_params = {
>  	.ref		= 24000000,
> @@ -100,7 +101,7 @@ static int integrator_set_target(struct cpufreq_policy *policy,
>  	BUG_ON(cpu != smp_processor_id());
>  
>  	/* get current setting */
> -	cm_osc = __raw_readl(CM_OSC);
> +	cm_osc = __raw_readl(cm_base + INTEGRATOR_HDR_OSC_OFFSET);
>  
>  	if (machine_is_integrator()) {
>  		vco.s = (cm_osc >> 8) & 7;
> @@ -128,7 +129,7 @@ static int integrator_set_target(struct cpufreq_policy *policy,
>  
>  	cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
>  
> -	cm_osc = __raw_readl(CM_OSC);
> +	cm_osc = __raw_readl(cm_base + INTEGRATOR_HDR_OSC_OFFSET);
>  
>  	if (machine_is_integrator()) {
>  		cm_osc &= 0xfffff800;
> @@ -138,9 +139,9 @@ static int integrator_set_target(struct cpufreq_policy *policy,
>  	}
>  	cm_osc |= vco.v;
>  
> -	__raw_writel(0xa05f, CM_LOCK);
> -	__raw_writel(cm_osc, CM_OSC);
> -	__raw_writel(0, CM_LOCK);
> +	__raw_writel(0xa05f, cm_base + INTEGRATOR_HDR_LOCK_OFFSET);
> +	__raw_writel(cm_osc, cm_base + INTEGRATOR_HDR_OSC_OFFSET);
> +	__raw_writel(0, cm_base + INTEGRATOR_HDR_LOCK_OFFSET);
>  
>  	/*
>  	 * Restore the CPUs allowed mask.
> @@ -165,7 +166,7 @@ static unsigned int integrator_get(unsigned int cpu)
>  	BUG_ON(cpu != smp_processor_id());
>  
>  	/* detect memory etc. */
> -	cm_osc = __raw_readl(CM_OSC);
> +	cm_osc = __raw_readl(cm_base + INTEGRATOR_HDR_OSC_OFFSET);
>  
>  	if (machine_is_integrator()) {
>  		vco.s = (cm_osc >> 8) & 7;
> @@ -202,19 +203,38 @@ static struct cpufreq_driver integrator_driver = {
>  	.name		= "integrator",
>  };
>  
> -static int __init integrator_cpu_init(void)
> +static int __init integrator_cpufreq_probe(struct platform_device *pdev)
>  {
> +	struct device_node *np = pdev->dev.of_node;
> +
> +	cm_base = of_iomap(np, 0);
> +	if (!cm_base)
> +		return -ENODEV;
>  	return cpufreq_register_driver(&integrator_driver);
>  }
>  
> -static void __exit integrator_cpu_exit(void)
> +static void __exit integrator_cpufreq_remove(struct platform_device *pdev)
>  {
>  	cpufreq_unregister_driver(&integrator_driver);
>  }
>  
> +static const struct of_device_id integrator_cpufreq_match[] = {
> +	{ .compatible = "arm,core-module-integrator"},
> +	{ },
> +};
> +
> +static struct platform_driver integrator_cpufreq_driver = {
> +	.driver = {
> +		.name = "integrator-cpufreq",
> +		.owner = THIS_MODULE,
> +		.of_match_table = integrator_cpufreq_match,
> +	},
> +	.remove = __exit_p(integrator_cpufreq_remove),
> +};
> +
> +module_platform_driver_probe(integrator_cpufreq_driver,
> +			     integrator_cpufreq_probe);
> +
>  MODULE_AUTHOR ("Russell M. King");
>  MODULE_DESCRIPTION ("cpufreq driver for ARM Integrator CPUs");
>  MODULE_LICENSE ("GPL");
> -
> -module_init(integrator_cpu_init);
> -module_exit(integrator_cpu_exit);
> 
-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
--
To unsubscribe from this list: send the line "unsubscribe cpufreq" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Devel]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Forum]     [Linux SCSI]

  Powered by Linux