linux/drivers/iio
Peter Rosin 1ffcfaf195 iio: imu: inv_mpu6050: change the i2c gate to be mux-locked
The root i2c adapter lock is then no longer held by the i2c mux during
accesses behind the i2c gate, and such accesses need to take that lock
just like any other ordinary i2c accesses do.

So, declare the i2c gate mux-locked, and zap the code that makes the
unlocked i2c accesses and just use ordinary regmap_write accesses.

This also happens to fix the deadlock described in
http://patchwork.ozlabs.org/patch/584776/ authored by
Adriana Reus <adriana.reus@intel.com> and submitted by
Daniel Baluta <daniel.baluta@intel.com>

----------8<----------
iio: imu: inv_mpu6050: Fix deadlock between i2c adapter lock and mpu lock

This deadlock occurs if the accel/gyro and the sensor on the auxiliary
I2C (in my setup it's an ak8975) are working at the same time.

Scenario:

      T1					T2
     ====				       ====
inv_mpu6050_read_fifo                  aux sensor op (eg. ak8975_read_raw)
        |                                     |
mutex_lock(&indio_dev->mlock)           i2c_transfer
        |                                     |
i2c transaction                         i2c adapter lock
        |                                     |
i2c adapter lock                        i2c_mux_master_xfer
                                              |
                                        inv_mpu6050_select_bypass
                                              |
                                        mutex_lock(&indio_dev->mlock)

When we operate on an mpu sensor the order of locking is mpu lock
followed by the i2c adapter lock. However, when we operate the auxiliary
sensor the order of locking is the other way around.

...
----------8<----------

The reason this patch fixes the deadlock is that T2 does not grab the
i2c adapter lock until the very end (and grabs the newfangled i2c mux
lock where it previously grabbed the i2c adapter lock).

Acked-by: Jonathan Cameron <jic23@kernel.org>
Acked-by: Daniel Baluta <daniel.baluta@intel.com>
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>
2016-05-04 22:39:30 +02:00
..
accel iio: accel: bmc150: fix endianness when reading axes 2016-04-03 11:16:11 +01:00
adc Second set of IIO fixes for the 4.6 cycle. 2016-04-04 13:45:10 -07:00
amplifiers spi: Updates for v4.4 2015-11-05 13:15:12 -08:00
buffer iio: buffer-dmaengine: Use dmaengine_terminate_sync() 2016-02-09 21:05:17 +00:00
chemical iio: convert to common i2c_check_functionality() return value 2016-02-27 17:17:43 +00:00
common iio: st_sensors: support active-low interrupts 2016-01-10 12:35:32 +00:00
dac iio: dac: vf610_dac: Add IIO DAC driver for Vybrid SoC 2016-02-24 20:52:55 +00:00
dummy Second set of IIO new drivers, functionality and cleanups for the 4.5 cycle. 2015-12-26 17:03:33 -08:00
frequency spi: Updates for v4.4 2015-11-05 13:15:12 -08:00
gyro iio: gyro: bmg160: fix buffer read values 2016-04-03 11:21:33 +01:00
health iio: health: max30100: correct FIFO check condition 2016-03-28 10:09:58 +01:00
humidity iio: convert to common i2c_check_functionality() return value 2016-02-27 17:17:43 +00:00
imu iio: imu: inv_mpu6050: change the i2c gate to be mux-locked 2016-05-04 22:39:30 +02:00
light First round of IIO fixes for the 4.6 cycle. 2016-04-04 12:59:48 -07:00
magnetometer iio: st_magn: always define ST_MAGN_TRIGGER_SET_STATE 2016-04-03 10:56:42 +01:00
orientation iio: orientation: hid-sensor-rotation: Fix memory leak in probe() 2015-05-17 09:10:25 +01:00
potentiometer iio: convert to common i2c_check_functionality() return value 2016-02-27 17:17:43 +00:00
pressure iio: convert to common i2c_check_functionality() return value 2016-02-27 17:17:43 +00:00
proximity iio: convert to common i2c_check_functionality() return value 2016-02-27 17:17:43 +00:00
temperature iio: convert to common i2c_check_functionality() return value 2016-02-27 17:17:43 +00:00
trigger iio: trigger: Introduce IIO hrtimer based trigger 2015-12-03 18:19:27 +00:00
iio_core_trigger.h
iio_core.h iio: Move buffer registration to the core 2014-12-12 12:28:31 +00:00
industrialio-buffer.c iio: fix config watermark initial value 2016-03-28 11:00:38 +01:00
industrialio-configfs.c iio:configfs: Introduce iio/configfs.h to provide a location for the configfs_subsystem 2015-12-05 16:25:30 +00:00
industrialio-core.c First round of new IIO device support, features and cleanups for the 4.6 cycle. 2016-02-01 13:10:03 -08:00
industrialio-event.c iio: event: Remove negative error code from iio_event_poll 2015-08-12 19:26:39 +01:00
industrialio-sw-trigger.c iio: core: fix ptr_ret.cocci warnings 2016-01-20 17:09:18 -08:00
industrialio-trigger.c iio: Support triggered events 2015-08-27 20:47:09 +01:00
industrialio-triggered-event.c iio: Support triggered events 2015-08-27 20:47:09 +01:00
inkern.c First set of IIO fixes for the 4.5 cycle. 2016-02-01 13:07:38 -08:00
Kconfig iio: light: add MAX30100 oximeter driver support 2015-12-12 12:14:37 +00:00
Makefile iio: light: add MAX30100 oximeter driver support 2015-12-12 12:14:37 +00:00