diff options
| -rw-r--r-- | drivers/i2c/i2c-core.c | 30 | ||||
| -rw-r--r-- | drivers/i2c/i2c-dev.c | 13 | ||||
| -rw-r--r-- | include/linux/i2c.h | 11 | 
3 files changed, 32 insertions, 22 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index bea4c5021d2..40e563de050 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -425,14 +425,14 @@ static int __i2c_check_addr_busy(struct device *dev, void *addrp)  /* walk up mux tree */  static int i2c_check_mux_parents(struct i2c_adapter *adapter, int addr)  { +	struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter);  	int result;  	result = device_for_each_child(&adapter->dev, &addr,  					__i2c_check_addr_busy); -	if (!result && i2c_parent_is_i2c_adapter(adapter)) -		result = i2c_check_mux_parents( -				    to_i2c_adapter(adapter->dev.parent), addr); +	if (!result && parent) +		result = i2c_check_mux_parents(parent, addr);  	return result;  } @@ -453,11 +453,11 @@ static int i2c_check_mux_children(struct device *dev, void *addrp)  static int i2c_check_addr_busy(struct i2c_adapter *adapter, int addr)  { +	struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter);  	int result = 0; -	if (i2c_parent_is_i2c_adapter(adapter)) -		result = i2c_check_mux_parents( -				    to_i2c_adapter(adapter->dev.parent), addr); +	if (parent) +		result = i2c_check_mux_parents(parent, addr);  	if (!result)  		result = device_for_each_child(&adapter->dev, &addr, @@ -472,8 +472,10 @@ static int i2c_check_addr_busy(struct i2c_adapter *adapter, int addr)   */  void i2c_lock_adapter(struct i2c_adapter *adapter)  { -	if (i2c_parent_is_i2c_adapter(adapter)) -		i2c_lock_adapter(to_i2c_adapter(adapter->dev.parent)); +	struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); + +	if (parent) +		i2c_lock_adapter(parent);  	else  		rt_mutex_lock(&adapter->bus_lock);  } @@ -485,8 +487,10 @@ EXPORT_SYMBOL_GPL(i2c_lock_adapter);   */  static int i2c_trylock_adapter(struct i2c_adapter *adapter)  { -	if (i2c_parent_is_i2c_adapter(adapter)) -		return i2c_trylock_adapter(to_i2c_adapter(adapter->dev.parent)); +	struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); + +	if (parent) +		return i2c_trylock_adapter(parent);  	else  		return rt_mutex_trylock(&adapter->bus_lock);  } @@ -497,8 +501,10 @@ static int i2c_trylock_adapter(struct i2c_adapter *adapter)   */  void i2c_unlock_adapter(struct i2c_adapter *adapter)  { -	if (i2c_parent_is_i2c_adapter(adapter)) -		i2c_unlock_adapter(to_i2c_adapter(adapter->dev.parent)); +	struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); + +	if (parent) +		i2c_unlock_adapter(parent);  	else  		rt_mutex_unlock(&adapter->bus_lock);  } diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c index 5f3a52d517c..cec0f3ba97f 100644 --- a/drivers/i2c/i2c-dev.c +++ b/drivers/i2c/i2c-dev.c @@ -192,13 +192,12 @@ static int i2cdev_check(struct device *dev, void *addrp)  /* walk up mux tree */  static int i2cdev_check_mux_parents(struct i2c_adapter *adapter, int addr)  { +	struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter);  	int result;  	result = device_for_each_child(&adapter->dev, &addr, i2cdev_check); - -	if (!result && i2c_parent_is_i2c_adapter(adapter)) -		result = i2cdev_check_mux_parents( -				    to_i2c_adapter(adapter->dev.parent), addr); +	if (!result && parent) +		result = i2cdev_check_mux_parents(parent, addr);  	return result;  } @@ -222,11 +221,11 @@ static int i2cdev_check_mux_children(struct device *dev, void *addrp)     driver bound to it, as NOT busy. */  static int i2cdev_check_addr(struct i2c_adapter *adapter, unsigned int addr)  { +	struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter);  	int result = 0; -	if (i2c_parent_is_i2c_adapter(adapter)) -		result = i2cdev_check_mux_parents( -				    to_i2c_adapter(adapter->dev.parent), addr); +	if (parent) +		result = i2cdev_check_mux_parents(parent, addr);  	if (!result)  		result = device_for_each_child(&adapter->dev, &addr, diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 9391a491501..1f66fa06a97 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -384,10 +384,15 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data)  	dev_set_drvdata(&dev->dev, data);  } -static inline int i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter) +static inline struct i2c_adapter * +i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter)  { -	return adapter->dev.parent != NULL -		&& adapter->dev.parent->type == &i2c_adapter_type; +	struct device *parent = adapter->dev.parent; + +	if (parent != NULL && parent->type == &i2c_adapter_type) +		return to_i2c_adapter(parent); +	else +		return NULL;  }  /* Adapter locking functions, exported for shared pin cases */  |