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 Original line Diff line number Diff line
@@ -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);
}
}
+6 −7
Original line number Original line Diff line number Diff line
@@ -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,
+8 −3
Original line number Original line 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);
	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 */