diff options
Diffstat (limited to 'drivers/i2c/i2c-core.c')
| -rw-r--r-- | drivers/i2c/i2c-core.c | 44 | 
1 files changed, 11 insertions, 33 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 66a30f7ac88..8d1f644a7fd 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -935,25 +935,17 @@ out_list:   */  int i2c_add_adapter(struct i2c_adapter *adapter)  { -	int	id, res = 0; - -retry: -	if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0) -		return -ENOMEM; +	int id;  	mutex_lock(&core_lock); -	/* "above" here means "above or equal to", sigh */ -	res = idr_get_new_above(&i2c_adapter_idr, adapter, -				__i2c_first_dynamic_bus_num, &id); +	id = idr_alloc(&i2c_adapter_idr, adapter, +		       __i2c_first_dynamic_bus_num, 0, GFP_KERNEL);  	mutex_unlock(&core_lock); - -	if (res < 0) { -		if (res == -EAGAIN) -			goto retry; -		return res; -	} +	if (id < 0) +		return id;  	adapter->nr = id; +  	return i2c_register_adapter(adapter);  }  EXPORT_SYMBOL(i2c_add_adapter); @@ -984,33 +976,19 @@ EXPORT_SYMBOL(i2c_add_adapter);  int i2c_add_numbered_adapter(struct i2c_adapter *adap)  {  	int	id; -	int	status;  	if (adap->nr == -1) /* -1 means dynamically assign bus id */  		return i2c_add_adapter(adap);  	if (adap->nr & ~MAX_IDR_MASK)  		return -EINVAL; -retry: -	if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0) -		return -ENOMEM; -  	mutex_lock(&core_lock); -	/* "above" here means "above or equal to", sigh; -	 * we need the "equal to" result to force the result -	 */ -	status = idr_get_new_above(&i2c_adapter_idr, adap, adap->nr, &id); -	if (status == 0 && id != adap->nr) { -		status = -EBUSY; -		idr_remove(&i2c_adapter_idr, id); -	} +	id = idr_alloc(&i2c_adapter_idr, adap, adap->nr, adap->nr + 1, +		       GFP_KERNEL);  	mutex_unlock(&core_lock); -	if (status == -EAGAIN) -		goto retry; - -	if (status == 0) -		status = i2c_register_adapter(adap); -	return status; +	if (id < 0) +		return id == -ENOSPC ? -EBUSY : id; +	return i2c_register_adapter(adap);  }  EXPORT_SYMBOL_GPL(i2c_add_numbered_adapter);  |