i2c: Let i2c_parent_is_i2c_adapter return the parent adapter

This makes the calling site's code clearer IMHO.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Michael Lawnick <ml.lawnick@gmx.de>
This commit is contained in:
Jean Delvare 2010-10-24 18:16:57 +02:00 committed by Jean Delvare
parent d582963a02
commit 97cc4d49cf
3 changed files with 32 additions and 22 deletions

View File

@ -425,14 +425,14 @@ static int __i2c_check_addr_busy(struct device *dev, void *addrp)
/* walk up mux tree */ /* walk up mux tree */
static int i2c_check_mux_parents(struct i2c_adapter *adapter, int addr) static int i2c_check_mux_parents(struct i2c_adapter *adapter, int addr)
{ {
struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter);
int result; int result;
result = device_for_each_child(&adapter->dev, &addr, result = device_for_each_child(&adapter->dev, &addr,
__i2c_check_addr_busy); __i2c_check_addr_busy);
if (!result && i2c_parent_is_i2c_adapter(adapter)) if (!result && parent)
result = i2c_check_mux_parents( result = i2c_check_mux_parents(parent, addr);
to_i2c_adapter(adapter->dev.parent), addr);
return result; 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) 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; int result = 0;
if (i2c_parent_is_i2c_adapter(adapter)) if (parent)
result = i2c_check_mux_parents( result = i2c_check_mux_parents(parent, addr);
to_i2c_adapter(adapter->dev.parent), addr);
if (!result) if (!result)
result = device_for_each_child(&adapter->dev, &addr, 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) void i2c_lock_adapter(struct i2c_adapter *adapter)
{ {
if (i2c_parent_is_i2c_adapter(adapter)) struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter);
i2c_lock_adapter(to_i2c_adapter(adapter->dev.parent));
if (parent)
i2c_lock_adapter(parent);
else else
rt_mutex_lock(&adapter->bus_lock); 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) static int i2c_trylock_adapter(struct i2c_adapter *adapter)
{ {
if (i2c_parent_is_i2c_adapter(adapter)) struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter);
return i2c_trylock_adapter(to_i2c_adapter(adapter->dev.parent));
if (parent)
return i2c_trylock_adapter(parent);
else else
return rt_mutex_trylock(&adapter->bus_lock); 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) void i2c_unlock_adapter(struct i2c_adapter *adapter)
{ {
if (i2c_parent_is_i2c_adapter(adapter)) struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter);
i2c_unlock_adapter(to_i2c_adapter(adapter->dev.parent));
if (parent)
i2c_unlock_adapter(parent);
else else
rt_mutex_unlock(&adapter->bus_lock); rt_mutex_unlock(&adapter->bus_lock);
} }

View File

@ -192,13 +192,12 @@ static int i2cdev_check(struct device *dev, void *addrp)
/* walk up mux tree */ /* walk up mux tree */
static int i2cdev_check_mux_parents(struct i2c_adapter *adapter, int addr) static int i2cdev_check_mux_parents(struct i2c_adapter *adapter, int addr)
{ {
struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter);
int result; int result;
result = device_for_each_child(&adapter->dev, &addr, i2cdev_check); result = device_for_each_child(&adapter->dev, &addr, i2cdev_check);
if (!result && parent)
if (!result && i2c_parent_is_i2c_adapter(adapter)) result = i2cdev_check_mux_parents(parent, addr);
result = i2cdev_check_mux_parents(
to_i2c_adapter(adapter->dev.parent), addr);
return result; return result;
} }
@ -222,11 +221,11 @@ static int i2cdev_check_mux_children(struct device *dev, void *addrp)
driver bound to it, as NOT busy. */ driver bound to it, as NOT busy. */
static int i2cdev_check_addr(struct i2c_adapter *adapter, unsigned int addr) 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; int result = 0;
if (i2c_parent_is_i2c_adapter(adapter)) if (parent)
result = i2cdev_check_mux_parents( result = i2cdev_check_mux_parents(parent, addr);
to_i2c_adapter(adapter->dev.parent), addr);
if (!result) if (!result)
result = device_for_each_child(&adapter->dev, &addr, result = device_for_each_child(&adapter->dev, &addr,

View File

@ -384,10 +384,15 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data)
dev_set_drvdata(&dev->dev, 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 struct device *parent = adapter->dev.parent;
&& adapter->dev.parent->type == &i2c_adapter_type;
if (parent != NULL && parent->type == &i2c_adapter_type)
return to_i2c_adapter(parent);
else
return NULL;
} }
/* Adapter locking functions, exported for shared pin cases */ /* Adapter locking functions, exported for shared pin cases */