mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From f92d9597f781f6a5a39c73dc71604bd8a21c5299 Mon Sep 17 00:00:00 2001
 | |
| From: Rajendra Nayak <rnayak@ti.com>
 | |
| Date: Wed, 09 Oct 2013 07:26:55 +0000
 | |
| Subject: ARM: OMAP2+: hwmod: Extract no-idle and no-reset info from DT
 | |
| 
 | |
| Now that we have DT bindings to specify which devices should not
 | |
| be reset and idled during init, make hwmod extract the information
 | |
| (and store them in internal flags) from Device tree.
 | |
| 
 | |
| Signed-off-by: Rajendra Nayak <rnayak@ti.com>
 | |
| [paul@pwsan.com: updated to apply]
 | |
| Signed-off-by: Paul Walmsley <paul@pwsan.com>
 | |
| 
 | |
| ---
 | |
| --- a/arch/arm/mach-omap2/omap_hwmod.c
 | |
| +++ b/arch/arm/mach-omap2/omap_hwmod.c
 | |
| @@ -2393,6 +2393,8 @@ static struct device_node *of_dev_hwmod_
 | |
|  /**
 | |
|   * _init_mpu_rt_base - populate the virtual address for a hwmod
 | |
|   * @oh: struct omap_hwmod * to locate the virtual address
 | |
| + * @data: (unused, caller should pass NULL)
 | |
| + * @np: struct device_node * of the IP block's device node in the DT data
 | |
|   *
 | |
|   * Cache the virtual address used by the MPU to access this IP block's
 | |
|   * registers.  This address is needed early so the OCP registers that
 | |
| @@ -2401,11 +2403,11 @@ static struct device_node *of_dev_hwmod_
 | |
|   * Returns 0 on success, -EINVAL if an invalid hwmod is passed, and
 | |
|   * -ENXIO on absent or invalid register target address space.
 | |
|   */
 | |
| -static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data)
 | |
| +static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data,
 | |
| +				    struct device_node *np)
 | |
|  {
 | |
|  	struct omap_hwmod_addr_space *mem;
 | |
|  	void __iomem *va_start = NULL;
 | |
| -	struct device_node *np;
 | |
|  
 | |
|  	if (!oh)
 | |
|  		return -EINVAL;
 | |
| @@ -2421,12 +2423,10 @@ static int __init _init_mpu_rt_base(stru
 | |
|  			 oh->name);
 | |
|  
 | |
|  		/* Extract the IO space from device tree blob */
 | |
| -		if (!of_have_populated_dt())
 | |
| +		if (!np)
 | |
|  			return -ENXIO;
 | |
|  
 | |
| -		np = of_dev_hwmod_lookup(of_find_node_by_name(NULL, "ocp"), oh);
 | |
| -		if (np)
 | |
| -			va_start = of_iomap(np, oh->mpu_rt_idx);
 | |
| +		va_start = of_iomap(np, oh->mpu_rt_idx);
 | |
|  	} else {
 | |
|  		va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start);
 | |
|  	}
 | |
| @@ -2459,12 +2459,16 @@ static int __init _init_mpu_rt_base(stru
 | |
|  static int __init _init(struct omap_hwmod *oh, void *data)
 | |
|  {
 | |
|  	int r;
 | |
| +	struct device_node *np = NULL;
 | |
|  
 | |
|  	if (oh->_state != _HWMOD_STATE_REGISTERED)
 | |
|  		return 0;
 | |
|  
 | |
| +	if (of_have_populated_dt())
 | |
| +		np = of_dev_hwmod_lookup(of_find_node_by_name(NULL, "ocp"), oh);
 | |
| +
 | |
|  	if (oh->class->sysc) {
 | |
| -		r = _init_mpu_rt_base(oh, NULL);
 | |
| +		r = _init_mpu_rt_base(oh, NULL, np);
 | |
|  		if (r < 0) {
 | |
|  			WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n",
 | |
|  			     oh->name);
 | |
| @@ -2478,6 +2482,12 @@ static int __init _init(struct omap_hwmo
 | |
|  		return -EINVAL;
 | |
|  	}
 | |
|  
 | |
| +	if (np)
 | |
| +		if (of_find_property(np, "ti,no-reset-on-init", NULL))
 | |
| +			oh->flags |= HWMOD_INIT_NO_RESET;
 | |
| +		if (of_find_property(np, "ti,no-idle-on-init", NULL))
 | |
| +			oh->flags |= HWMOD_INIT_NO_IDLE;
 | |
| +
 | |
|  	oh->_state = _HWMOD_STATE_INITIALIZED;
 | |
|  
 | |
|  	return 0;
 |