mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
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: Jonathan Cameron <jic23@kernel.org> Tested-by: Crestez Dan Leonard <leonard.crestez@intel.com> Signed-off-by: Peter Rosin <peda@axentia.se> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:
parent
193304aef8
commit
51f97f6dd7
4 changed files with 19 additions and 20 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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,
|
||||
inv_mpu6050_select_bypass,
|
||||
inv_mpu6050_deselect_bypass);
|
||||
if (!st->mux_adapter) {
|
||||
result = -ENODEV;
|
||||
st->muxc = i2c_mux_alloc(client->adapter, &client->dev,
|
||||
1, 0, 0,
|
||||
inv_mpu6050_select_bypass,
|
||||
inv_mpu6050_deselect_bypass);
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue