diff options
Diffstat (limited to 'drivers/of/platform.c')
| -rw-r--r-- | drivers/of/platform.c | 28 | 
1 files changed, 23 insertions, 5 deletions
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 8d103e4968be..16e8daffac06 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -297,19 +297,37 @@ static struct amba_device *of_amba_device_create(struct device_node *node,  static const struct of_dev_auxdata *of_dev_lookup(const struct of_dev_auxdata *lookup,  				 struct device_node *np)  { +	const struct of_dev_auxdata *auxdata;  	struct resource res; +	int compatible = 0;  	if (!lookup)  		return NULL; -	for(; lookup->compatible != NULL; lookup++) { -		if (!of_device_is_compatible(np, lookup->compatible)) +	auxdata = lookup; +	for (; auxdata->compatible; auxdata++) { +		if (!of_device_is_compatible(np, auxdata->compatible))  			continue; +		compatible++;  		if (!of_address_to_resource(np, 0, &res)) -			if (res.start != lookup->phys_addr) +			if (res.start != auxdata->phys_addr)  				continue; -		pr_debug("%s: devname=%s\n", np->full_name, lookup->name); -		return lookup; +		pr_debug("%s: devname=%s\n", np->full_name, auxdata->name); +		return auxdata; +	} + +	if (!compatible) +		return NULL; + +	/* Try compatible match if no phys_addr and name are specified */ +	auxdata = lookup; +	for (; auxdata->compatible; auxdata++) { +		if (!of_device_is_compatible(np, auxdata->compatible)) +			continue; +		if (!auxdata->phys_addr && !auxdata->name) { +			pr_debug("%s: compatible match\n", np->full_name); +			return auxdata; +		}  	}  	return NULL;  |