[PATCH 3/6] ARM: mvebu: improve PMSU driver to request its resource

Gregory CLEMENT gregory.clement at free-electrons.com
Thu Mar 27 11:59:15 EDT 2014


On 27/03/2014 14:38, Thomas Petazzoni wrote:
> Until now, the PMSU driver was using of_iomap() to map its registers,
> but of_iomap() doesn't call request_mem_region(). This commit fixes
> the memory mapping code of the PMSU to do so, which will also be
> useful for a later commit since we will need to adjust the resource
> base address and size for Device Tree backward compatibility.
> 
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>


Acked-by: Gregory CLEMENT <gregory.clement at free-electrons.com>

> ---
>  arch/arm/mach-mvebu/pmsu.c | 36 +++++++++++++++++++++++++++++++-----
>  1 file changed, 31 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/arm/mach-mvebu/pmsu.c b/arch/arm/mach-mvebu/pmsu.c
> index 1807639..b337fe5 100644
> --- a/arch/arm/mach-mvebu/pmsu.c
> +++ b/arch/arm/mach-mvebu/pmsu.c
> @@ -16,6 +16,8 @@
>   * other SOC units
>   */
>  
> +#define pr_fmt(fmt) "mvebu-pmsu: " fmt
> +
>  #include <linux/kernel.h>
>  #include <linux/init.h>
>  #include <linux/of_address.h>
> @@ -63,15 +65,39 @@ int armada_xp_boot_cpu(unsigned int cpu_id, void *boot_addr)
>  static int __init armada_370_xp_pmsu_init(void)
>  {
>  	struct device_node *np;
> +	struct resource res;
> +	int ret = 0;
>  
>  	np = of_find_matching_node(NULL, of_pmsu_table);
> -	if (np) {
> -		pr_info("Initializing Power Management Service Unit\n");
> -		pmsu_mp_base = of_iomap(np, 0);
> -		of_node_put(np);
> +	if (!np)
> +		return 0;
> +
> +	pr_info("Initializing Power Management Service Unit\n");
> +
> +	if (of_address_to_resource(np, 0, &res)) {
> +		pr_err("unable to get resource\n");
> +		ret = -ENOENT;
> +		goto out;
>  	}
>  
> -	return 0;
> +	if (!request_mem_region(res.start, resource_size(&res),
> +				np->full_name)) {
> +		pr_err("unable to request region\n");
> +		ret = -EBUSY;
> +		goto out;
> +	}
> +
> +	pmsu_mp_base = ioremap(res.start, resource_size(&res));
> +	if (!pmsu_mp_base) {
> +		pr_err("unable to map registers\n");
> +		release_mem_region(res.start, resource_size(&res));
> +		ret = -ENOMEM;
> +		goto out;
> +	}
> +
> + out:
> +	of_node_put(np);
> +	return ret;
>  }
>  
>  early_initcall(armada_370_xp_pmsu_init);
> 


-- 
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com



More information about the linux-arm-kernel mailing list