Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97cc4d49 authored by Jean Delvare's avatar Jean Delvare Committed by Jean Delvare
Browse files

i2c: Let i2c_parent_is_i2c_adapter return the parent adapter



This makes the calling site's code clearer IMHO.

Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Acked-by: default avatarMichael Lawnick <ml.lawnick@gmx.de>
parent d582963a
Loading
Loading
Loading
Loading
+18 −12
Original line number Diff line number Diff line
@@ -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);
}
+6 −7
Original line number Diff line number Diff line
@@ -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,
+8 −3
Original line number Diff line number Diff line
@@ -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 */