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

Commit 51f97f6d authored by Peter Rosin's avatar Peter Rosin Committed by Wolfram Sang
Browse files

iio: imu: inv_mpu6050: convert to use an explicit i2c mux core



Allocate an explicit i2c mux core to handle parent and child adapters
etc. Update the select/deselect ops to be in terms of the i2c mux core
instead of the child adapter.

Acked-by: default avatarJonathan Cameron <jic23@kernel.org>
Tested-by: default avatarCrestez Dan Leonard <leonard.crestez@intel.com>
Signed-off-by: default avatarPeter Rosin <peda@axentia.se>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent 193304ae
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -183,7 +183,7 @@ int inv_mpu_acpi_create_mux_client(struct i2c_client *client)
			} else
				return 0; /* no secondary addr, which is OK */
		}
		st->mux_client = i2c_new_device(st->mux_adapter, &info);
		st->mux_client = i2c_new_device(st->muxc->adapter[0], &info);
		if (!st->mux_client)
			return -ENODEV;
	}
+0 −1
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@
#include <linux/kfifo.h>
#include <linux/spinlock.h>
#include <linux/iio/iio.h>
#include <linux/i2c-mux.h>
#include <linux/acpi.h>
#include "inv_mpu_iio.h"

+16 −17
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/i2c-mux.h>
#include <linux/iio/iio.h>
#include <linux/module.h>
#include "inv_mpu_iio.h"
@@ -52,10 +51,9 @@ static int inv_mpu6050_write_reg_unlocked(struct i2c_client *client,
	return 0;
}

static int inv_mpu6050_select_bypass(struct i2c_adapter *adap, void *mux_priv,
				     u32 chan_id)
static int inv_mpu6050_select_bypass(struct i2c_mux_core *muxc, u32 chan_id)
{
	struct i2c_client *client = mux_priv;
	struct i2c_client *client = i2c_mux_priv(muxc);
	struct iio_dev *indio_dev = dev_get_drvdata(&client->dev);
	struct inv_mpu6050_state *st = iio_priv(indio_dev);
	int ret = 0;
@@ -84,10 +82,9 @@ static int inv_mpu6050_select_bypass(struct i2c_adapter *adap, void *mux_priv,
	return ret;
}

static int inv_mpu6050_deselect_bypass(struct i2c_adapter *adap,
				       void *mux_priv, u32 chan_id)
static int inv_mpu6050_deselect_bypass(struct i2c_mux_core *muxc, u32 chan_id)
{
	struct i2c_client *client = mux_priv;
	struct i2c_client *client = i2c_mux_priv(muxc);
	struct iio_dev *indio_dev = dev_get_drvdata(&client->dev);
	struct inv_mpu6050_state *st = iio_priv(indio_dev);

@@ -136,16 +133,18 @@ static int inv_mpu_probe(struct i2c_client *client,
		return result;

	st = iio_priv(dev_get_drvdata(&client->dev));
	st->mux_adapter = i2c_add_mux_adapter(client->adapter,
					      &client->dev,
					      client,
					      0, 0, 0,
	st->muxc = i2c_mux_alloc(client->adapter, &client->dev,
				 1, 0, 0,
				 inv_mpu6050_select_bypass,
				 inv_mpu6050_deselect_bypass);
	if (!st->mux_adapter) {
		result = -ENODEV;
	if (!st->muxc) {
		result = -ENOMEM;
		goto out_unreg_device;
	}
	st->muxc->priv = dev_get_drvdata(&client->dev);
	result = i2c_mux_add_adapter(st->muxc, 0, 0, 0);
	if (result)
		goto out_unreg_device;

	result = inv_mpu_acpi_create_mux_client(client);
	if (result)
@@ -154,7 +153,7 @@ static int inv_mpu_probe(struct i2c_client *client,
	return 0;

out_del_mux:
	i2c_del_mux_adapter(st->mux_adapter);
	i2c_mux_del_adapters(st->muxc);
out_unreg_device:
	inv_mpu_core_remove(&client->dev);
	return result;
@@ -166,7 +165,7 @@ static int inv_mpu_remove(struct i2c_client *client)
	struct inv_mpu6050_state *st = iio_priv(indio_dev);

	inv_mpu_acpi_delete_mux_client(client);
	i2c_del_mux_adapter(st->mux_adapter);
	i2c_mux_del_adapters(st->muxc);

	return inv_mpu_core_remove(&client->dev);
}
+2 −1
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
* GNU General Public License for more details.
*/
#include <linux/i2c.h>
#include <linux/i2c-mux.h>
#include <linux/kfifo.h>
#include <linux/spinlock.h>
#include <linux/iio/iio.h>
@@ -127,7 +128,7 @@ struct inv_mpu6050_state {
	const struct inv_mpu6050_hw *hw;
	enum   inv_devices chip_type;
	spinlock_t time_stamp_lock;
	struct i2c_adapter *mux_adapter;
	struct i2c_mux_core *muxc;
	struct i2c_client *mux_client;
	unsigned int powerup_count;
	struct inv_mpu6050_platform_data plat_data;