cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

inv_mpu_core.c (49909B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3* Copyright (C) 2012 Invensense, Inc.
      4*/
      5
      6#include <linux/module.h>
      7#include <linux/slab.h>
      8#include <linux/i2c.h>
      9#include <linux/err.h>
     10#include <linux/delay.h>
     11#include <linux/sysfs.h>
     12#include <linux/jiffies.h>
     13#include <linux/irq.h>
     14#include <linux/interrupt.h>
     15#include <linux/iio/iio.h>
     16#include <linux/acpi.h>
     17#include <linux/platform_device.h>
     18#include <linux/regulator/consumer.h>
     19#include <linux/pm.h>
     20#include <linux/pm_runtime.h>
     21#include "inv_mpu_iio.h"
     22#include "inv_mpu_magn.h"
     23
     24/*
     25 * this is the gyro scale translated from dynamic range plus/minus
     26 * {250, 500, 1000, 2000} to rad/s
     27 */
     28static const int gyro_scale_6050[] = {133090, 266181, 532362, 1064724};
     29
     30/*
     31 * this is the accel scale translated from dynamic range plus/minus
     32 * {2, 4, 8, 16} to m/s^2
     33 */
     34static const int accel_scale[] = {598, 1196, 2392, 4785};
     35
     36static const struct inv_mpu6050_reg_map reg_set_icm20602 = {
     37	.sample_rate_div	= INV_MPU6050_REG_SAMPLE_RATE_DIV,
     38	.lpf                    = INV_MPU6050_REG_CONFIG,
     39	.accel_lpf              = INV_MPU6500_REG_ACCEL_CONFIG_2,
     40	.user_ctrl              = INV_MPU6050_REG_USER_CTRL,
     41	.fifo_en                = INV_MPU6050_REG_FIFO_EN,
     42	.gyro_config            = INV_MPU6050_REG_GYRO_CONFIG,
     43	.accl_config            = INV_MPU6050_REG_ACCEL_CONFIG,
     44	.fifo_count_h           = INV_MPU6050_REG_FIFO_COUNT_H,
     45	.fifo_r_w               = INV_MPU6050_REG_FIFO_R_W,
     46	.raw_gyro               = INV_MPU6050_REG_RAW_GYRO,
     47	.raw_accl               = INV_MPU6050_REG_RAW_ACCEL,
     48	.temperature            = INV_MPU6050_REG_TEMPERATURE,
     49	.int_enable             = INV_MPU6050_REG_INT_ENABLE,
     50	.int_status             = INV_MPU6050_REG_INT_STATUS,
     51	.pwr_mgmt_1             = INV_MPU6050_REG_PWR_MGMT_1,
     52	.pwr_mgmt_2             = INV_MPU6050_REG_PWR_MGMT_2,
     53	.int_pin_cfg            = INV_MPU6050_REG_INT_PIN_CFG,
     54	.accl_offset            = INV_MPU6500_REG_ACCEL_OFFSET,
     55	.gyro_offset            = INV_MPU6050_REG_GYRO_OFFSET,
     56	.i2c_if                 = INV_ICM20602_REG_I2C_IF,
     57};
     58
     59static const struct inv_mpu6050_reg_map reg_set_6500 = {
     60	.sample_rate_div	= INV_MPU6050_REG_SAMPLE_RATE_DIV,
     61	.lpf                    = INV_MPU6050_REG_CONFIG,
     62	.accel_lpf              = INV_MPU6500_REG_ACCEL_CONFIG_2,
     63	.user_ctrl              = INV_MPU6050_REG_USER_CTRL,
     64	.fifo_en                = INV_MPU6050_REG_FIFO_EN,
     65	.gyro_config            = INV_MPU6050_REG_GYRO_CONFIG,
     66	.accl_config            = INV_MPU6050_REG_ACCEL_CONFIG,
     67	.fifo_count_h           = INV_MPU6050_REG_FIFO_COUNT_H,
     68	.fifo_r_w               = INV_MPU6050_REG_FIFO_R_W,
     69	.raw_gyro               = INV_MPU6050_REG_RAW_GYRO,
     70	.raw_accl               = INV_MPU6050_REG_RAW_ACCEL,
     71	.temperature            = INV_MPU6050_REG_TEMPERATURE,
     72	.int_enable             = INV_MPU6050_REG_INT_ENABLE,
     73	.int_status             = INV_MPU6050_REG_INT_STATUS,
     74	.pwr_mgmt_1             = INV_MPU6050_REG_PWR_MGMT_1,
     75	.pwr_mgmt_2             = INV_MPU6050_REG_PWR_MGMT_2,
     76	.int_pin_cfg		= INV_MPU6050_REG_INT_PIN_CFG,
     77	.accl_offset		= INV_MPU6500_REG_ACCEL_OFFSET,
     78	.gyro_offset		= INV_MPU6050_REG_GYRO_OFFSET,
     79	.i2c_if                 = 0,
     80};
     81
     82static const struct inv_mpu6050_reg_map reg_set_6050 = {
     83	.sample_rate_div	= INV_MPU6050_REG_SAMPLE_RATE_DIV,
     84	.lpf                    = INV_MPU6050_REG_CONFIG,
     85	.user_ctrl              = INV_MPU6050_REG_USER_CTRL,
     86	.fifo_en                = INV_MPU6050_REG_FIFO_EN,
     87	.gyro_config            = INV_MPU6050_REG_GYRO_CONFIG,
     88	.accl_config            = INV_MPU6050_REG_ACCEL_CONFIG,
     89	.fifo_count_h           = INV_MPU6050_REG_FIFO_COUNT_H,
     90	.fifo_r_w               = INV_MPU6050_REG_FIFO_R_W,
     91	.raw_gyro               = INV_MPU6050_REG_RAW_GYRO,
     92	.raw_accl               = INV_MPU6050_REG_RAW_ACCEL,
     93	.temperature            = INV_MPU6050_REG_TEMPERATURE,
     94	.int_enable             = INV_MPU6050_REG_INT_ENABLE,
     95	.pwr_mgmt_1             = INV_MPU6050_REG_PWR_MGMT_1,
     96	.pwr_mgmt_2             = INV_MPU6050_REG_PWR_MGMT_2,
     97	.int_pin_cfg		= INV_MPU6050_REG_INT_PIN_CFG,
     98	.accl_offset		= INV_MPU6050_REG_ACCEL_OFFSET,
     99	.gyro_offset		= INV_MPU6050_REG_GYRO_OFFSET,
    100	.i2c_if                 = 0,
    101};
    102
    103static const struct inv_mpu6050_chip_config chip_config_6050 = {
    104	.clk = INV_CLK_INTERNAL,
    105	.fsr = INV_MPU6050_FSR_2000DPS,
    106	.lpf = INV_MPU6050_FILTER_20HZ,
    107	.divider = INV_MPU6050_FIFO_RATE_TO_DIVIDER(50),
    108	.gyro_en = true,
    109	.accl_en = true,
    110	.temp_en = true,
    111	.magn_en = false,
    112	.gyro_fifo_enable = false,
    113	.accl_fifo_enable = false,
    114	.temp_fifo_enable = false,
    115	.magn_fifo_enable = false,
    116	.accl_fs = INV_MPU6050_FS_02G,
    117	.user_ctrl = 0,
    118};
    119
    120static const struct inv_mpu6050_chip_config chip_config_6500 = {
    121	.clk = INV_CLK_PLL,
    122	.fsr = INV_MPU6050_FSR_2000DPS,
    123	.lpf = INV_MPU6050_FILTER_20HZ,
    124	.divider = INV_MPU6050_FIFO_RATE_TO_DIVIDER(50),
    125	.gyro_en = true,
    126	.accl_en = true,
    127	.temp_en = true,
    128	.magn_en = false,
    129	.gyro_fifo_enable = false,
    130	.accl_fifo_enable = false,
    131	.temp_fifo_enable = false,
    132	.magn_fifo_enable = false,
    133	.accl_fs = INV_MPU6050_FS_02G,
    134	.user_ctrl = 0,
    135};
    136
    137/* Indexed by enum inv_devices */
    138static const struct inv_mpu6050_hw hw_info[] = {
    139	{
    140		.whoami = INV_MPU6050_WHOAMI_VALUE,
    141		.name = "MPU6050",
    142		.reg = &reg_set_6050,
    143		.config = &chip_config_6050,
    144		.fifo_size = 1024,
    145		.temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE},
    146		.startup_time = {INV_MPU6050_GYRO_STARTUP_TIME, INV_MPU6050_ACCEL_STARTUP_TIME},
    147	},
    148	{
    149		.whoami = INV_MPU6500_WHOAMI_VALUE,
    150		.name = "MPU6500",
    151		.reg = &reg_set_6500,
    152		.config = &chip_config_6500,
    153		.fifo_size = 512,
    154		.temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
    155		.startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
    156	},
    157	{
    158		.whoami = INV_MPU6515_WHOAMI_VALUE,
    159		.name = "MPU6515",
    160		.reg = &reg_set_6500,
    161		.config = &chip_config_6500,
    162		.fifo_size = 512,
    163		.temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
    164		.startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
    165	},
    166	{
    167		.whoami = INV_MPU6880_WHOAMI_VALUE,
    168		.name = "MPU6880",
    169		.reg = &reg_set_6500,
    170		.config = &chip_config_6500,
    171		.fifo_size = 4096,
    172		.temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
    173		.startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
    174	},
    175	{
    176		.whoami = INV_MPU6000_WHOAMI_VALUE,
    177		.name = "MPU6000",
    178		.reg = &reg_set_6050,
    179		.config = &chip_config_6050,
    180		.fifo_size = 1024,
    181		.temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE},
    182		.startup_time = {INV_MPU6050_GYRO_STARTUP_TIME, INV_MPU6050_ACCEL_STARTUP_TIME},
    183	},
    184	{
    185		.whoami = INV_MPU9150_WHOAMI_VALUE,
    186		.name = "MPU9150",
    187		.reg = &reg_set_6050,
    188		.config = &chip_config_6050,
    189		.fifo_size = 1024,
    190		.temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE},
    191		.startup_time = {INV_MPU6050_GYRO_STARTUP_TIME, INV_MPU6050_ACCEL_STARTUP_TIME},
    192	},
    193	{
    194		.whoami = INV_MPU9250_WHOAMI_VALUE,
    195		.name = "MPU9250",
    196		.reg = &reg_set_6500,
    197		.config = &chip_config_6500,
    198		.fifo_size = 512,
    199		.temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
    200		.startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
    201	},
    202	{
    203		.whoami = INV_MPU9255_WHOAMI_VALUE,
    204		.name = "MPU9255",
    205		.reg = &reg_set_6500,
    206		.config = &chip_config_6500,
    207		.fifo_size = 512,
    208		.temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
    209		.startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
    210	},
    211	{
    212		.whoami = INV_ICM20608_WHOAMI_VALUE,
    213		.name = "ICM20608",
    214		.reg = &reg_set_6500,
    215		.config = &chip_config_6500,
    216		.fifo_size = 512,
    217		.temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
    218		.startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
    219	},
    220	{
    221		.whoami = INV_ICM20608D_WHOAMI_VALUE,
    222		.name = "ICM20608D",
    223		.reg = &reg_set_6500,
    224		.config = &chip_config_6500,
    225		.fifo_size = 512,
    226		.temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
    227		.startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
    228	},
    229	{
    230		.whoami = INV_ICM20609_WHOAMI_VALUE,
    231		.name = "ICM20609",
    232		.reg = &reg_set_6500,
    233		.config = &chip_config_6500,
    234		.fifo_size = 4 * 1024,
    235		.temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
    236		.startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
    237	},
    238	{
    239		.whoami = INV_ICM20689_WHOAMI_VALUE,
    240		.name = "ICM20689",
    241		.reg = &reg_set_6500,
    242		.config = &chip_config_6500,
    243		.fifo_size = 4 * 1024,
    244		.temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
    245		.startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
    246	},
    247	{
    248		.whoami = INV_ICM20602_WHOAMI_VALUE,
    249		.name = "ICM20602",
    250		.reg = &reg_set_icm20602,
    251		.config = &chip_config_6500,
    252		.fifo_size = 1008,
    253		.temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
    254		.startup_time = {INV_ICM20602_GYRO_STARTUP_TIME, INV_ICM20602_ACCEL_STARTUP_TIME},
    255	},
    256	{
    257		.whoami = INV_ICM20690_WHOAMI_VALUE,
    258		.name = "ICM20690",
    259		.reg = &reg_set_6500,
    260		.config = &chip_config_6500,
    261		.fifo_size = 1024,
    262		.temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
    263		.startup_time = {INV_ICM20690_GYRO_STARTUP_TIME, INV_ICM20690_ACCEL_STARTUP_TIME},
    264	},
    265	{
    266		.whoami = INV_IAM20680_WHOAMI_VALUE,
    267		.name = "IAM20680",
    268		.reg = &reg_set_6500,
    269		.config = &chip_config_6500,
    270		.fifo_size = 512,
    271		.temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
    272		.startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
    273	},
    274};
    275
    276static int inv_mpu6050_pwr_mgmt_1_write(struct inv_mpu6050_state *st, bool sleep,
    277					int clock, int temp_dis)
    278{
    279	u8 val;
    280
    281	if (clock < 0)
    282		clock = st->chip_config.clk;
    283	if (temp_dis < 0)
    284		temp_dis = !st->chip_config.temp_en;
    285
    286	val = clock & INV_MPU6050_BIT_CLK_MASK;
    287	if (temp_dis)
    288		val |= INV_MPU6050_BIT_TEMP_DIS;
    289	if (sleep)
    290		val |= INV_MPU6050_BIT_SLEEP;
    291
    292	dev_dbg(regmap_get_device(st->map), "pwr_mgmt_1: 0x%x\n", val);
    293	return regmap_write(st->map, st->reg->pwr_mgmt_1, val);
    294}
    295
    296static int inv_mpu6050_clock_switch(struct inv_mpu6050_state *st,
    297				    unsigned int clock)
    298{
    299	int ret;
    300
    301	switch (st->chip_type) {
    302	case INV_MPU6050:
    303	case INV_MPU6000:
    304	case INV_MPU9150:
    305		/* old chips: switch clock manually */
    306		ret = inv_mpu6050_pwr_mgmt_1_write(st, false, clock, -1);
    307		if (ret)
    308			return ret;
    309		st->chip_config.clk = clock;
    310		break;
    311	default:
    312		/* automatic clock switching, nothing to do */
    313		break;
    314	}
    315
    316	return 0;
    317}
    318
    319int inv_mpu6050_switch_engine(struct inv_mpu6050_state *st, bool en,
    320			      unsigned int mask)
    321{
    322	unsigned int sleep;
    323	u8 pwr_mgmt2, user_ctrl;
    324	int ret;
    325
    326	/* delete useless requests */
    327	if (mask & INV_MPU6050_SENSOR_ACCL && en == st->chip_config.accl_en)
    328		mask &= ~INV_MPU6050_SENSOR_ACCL;
    329	if (mask & INV_MPU6050_SENSOR_GYRO && en == st->chip_config.gyro_en)
    330		mask &= ~INV_MPU6050_SENSOR_GYRO;
    331	if (mask & INV_MPU6050_SENSOR_TEMP && en == st->chip_config.temp_en)
    332		mask &= ~INV_MPU6050_SENSOR_TEMP;
    333	if (mask & INV_MPU6050_SENSOR_MAGN && en == st->chip_config.magn_en)
    334		mask &= ~INV_MPU6050_SENSOR_MAGN;
    335	if (mask == 0)
    336		return 0;
    337
    338	/* turn on/off temperature sensor */
    339	if (mask & INV_MPU6050_SENSOR_TEMP) {
    340		ret = inv_mpu6050_pwr_mgmt_1_write(st, false, -1, !en);
    341		if (ret)
    342			return ret;
    343		st->chip_config.temp_en = en;
    344	}
    345
    346	/* update user_crtl for driving magnetometer */
    347	if (mask & INV_MPU6050_SENSOR_MAGN) {
    348		user_ctrl = st->chip_config.user_ctrl;
    349		if (en)
    350			user_ctrl |= INV_MPU6050_BIT_I2C_MST_EN;
    351		else
    352			user_ctrl &= ~INV_MPU6050_BIT_I2C_MST_EN;
    353		ret = regmap_write(st->map, st->reg->user_ctrl, user_ctrl);
    354		if (ret)
    355			return ret;
    356		st->chip_config.user_ctrl = user_ctrl;
    357		st->chip_config.magn_en = en;
    358	}
    359
    360	/* manage accel & gyro engines */
    361	if (mask & (INV_MPU6050_SENSOR_ACCL | INV_MPU6050_SENSOR_GYRO)) {
    362		/* compute power management 2 current value */
    363		pwr_mgmt2 = 0;
    364		if (!st->chip_config.accl_en)
    365			pwr_mgmt2 |= INV_MPU6050_BIT_PWR_ACCL_STBY;
    366		if (!st->chip_config.gyro_en)
    367			pwr_mgmt2 |= INV_MPU6050_BIT_PWR_GYRO_STBY;
    368
    369		/* update to new requested value */
    370		if (mask & INV_MPU6050_SENSOR_ACCL) {
    371			if (en)
    372				pwr_mgmt2 &= ~INV_MPU6050_BIT_PWR_ACCL_STBY;
    373			else
    374				pwr_mgmt2 |= INV_MPU6050_BIT_PWR_ACCL_STBY;
    375		}
    376		if (mask & INV_MPU6050_SENSOR_GYRO) {
    377			if (en)
    378				pwr_mgmt2 &= ~INV_MPU6050_BIT_PWR_GYRO_STBY;
    379			else
    380				pwr_mgmt2 |= INV_MPU6050_BIT_PWR_GYRO_STBY;
    381		}
    382
    383		/* switch clock to internal when turning gyro off */
    384		if (mask & INV_MPU6050_SENSOR_GYRO && !en) {
    385			ret = inv_mpu6050_clock_switch(st, INV_CLK_INTERNAL);
    386			if (ret)
    387				return ret;
    388		}
    389
    390		/* update sensors engine */
    391		dev_dbg(regmap_get_device(st->map), "pwr_mgmt_2: 0x%x\n",
    392			pwr_mgmt2);
    393		ret = regmap_write(st->map, st->reg->pwr_mgmt_2, pwr_mgmt2);
    394		if (ret)
    395			return ret;
    396		if (mask & INV_MPU6050_SENSOR_ACCL)
    397			st->chip_config.accl_en = en;
    398		if (mask & INV_MPU6050_SENSOR_GYRO)
    399			st->chip_config.gyro_en = en;
    400
    401		/* compute required time to have sensors stabilized */
    402		sleep = 0;
    403		if (en) {
    404			if (mask & INV_MPU6050_SENSOR_ACCL) {
    405				if (sleep < st->hw->startup_time.accel)
    406					sleep = st->hw->startup_time.accel;
    407			}
    408			if (mask & INV_MPU6050_SENSOR_GYRO) {
    409				if (sleep < st->hw->startup_time.gyro)
    410					sleep = st->hw->startup_time.gyro;
    411			}
    412		} else {
    413			if (mask & INV_MPU6050_SENSOR_GYRO) {
    414				if (sleep < INV_MPU6050_GYRO_DOWN_TIME)
    415					sleep = INV_MPU6050_GYRO_DOWN_TIME;
    416			}
    417		}
    418		if (sleep)
    419			msleep(sleep);
    420
    421		/* switch clock to PLL when turning gyro on */
    422		if (mask & INV_MPU6050_SENSOR_GYRO && en) {
    423			ret = inv_mpu6050_clock_switch(st, INV_CLK_PLL);
    424			if (ret)
    425				return ret;
    426		}
    427	}
    428
    429	return 0;
    430}
    431
    432static int inv_mpu6050_set_power_itg(struct inv_mpu6050_state *st,
    433				     bool power_on)
    434{
    435	int result;
    436
    437	result = inv_mpu6050_pwr_mgmt_1_write(st, !power_on, -1, -1);
    438	if (result)
    439		return result;
    440
    441	if (power_on)
    442		usleep_range(INV_MPU6050_REG_UP_TIME_MIN,
    443			     INV_MPU6050_REG_UP_TIME_MAX);
    444
    445	return 0;
    446}
    447
    448static int inv_mpu6050_set_gyro_fsr(struct inv_mpu6050_state *st,
    449				    enum inv_mpu6050_fsr_e val)
    450{
    451	unsigned int gyro_shift;
    452	u8 data;
    453
    454	switch (st->chip_type) {
    455	case INV_ICM20690:
    456		gyro_shift = INV_ICM20690_GYRO_CONFIG_FSR_SHIFT;
    457		break;
    458	default:
    459		gyro_shift = INV_MPU6050_GYRO_CONFIG_FSR_SHIFT;
    460		break;
    461	}
    462
    463	data = val << gyro_shift;
    464	return regmap_write(st->map, st->reg->gyro_config, data);
    465}
    466
    467/*
    468 *  inv_mpu6050_set_lpf_regs() - set low pass filter registers, chip dependent
    469 *
    470 *  MPU60xx/MPU9150 use only 1 register for accelerometer + gyroscope
    471 *  MPU6500 and above have a dedicated register for accelerometer
    472 */
    473static int inv_mpu6050_set_lpf_regs(struct inv_mpu6050_state *st,
    474				    enum inv_mpu6050_filter_e val)
    475{
    476	int result;
    477
    478	result = regmap_write(st->map, st->reg->lpf, val);
    479	if (result)
    480		return result;
    481
    482	/* set accel lpf */
    483	switch (st->chip_type) {
    484	case INV_MPU6050:
    485	case INV_MPU6000:
    486	case INV_MPU9150:
    487		/* old chips, nothing to do */
    488		return 0;
    489	case INV_ICM20689:
    490	case INV_ICM20690:
    491		/* set FIFO size to maximum value */
    492		val |= INV_ICM20689_BITS_FIFO_SIZE_MAX;
    493		break;
    494	default:
    495		break;
    496	}
    497
    498	return regmap_write(st->map, st->reg->accel_lpf, val);
    499}
    500
    501/*
    502 *  inv_mpu6050_init_config() - Initialize hardware, disable FIFO.
    503 *
    504 *  Initial configuration:
    505 *  FSR: ± 2000DPS
    506 *  DLPF: 20Hz
    507 *  FIFO rate: 50Hz
    508 *  Clock source: Gyro PLL
    509 */
    510static int inv_mpu6050_init_config(struct iio_dev *indio_dev)
    511{
    512	int result;
    513	u8 d;
    514	struct inv_mpu6050_state *st = iio_priv(indio_dev);
    515
    516	result = inv_mpu6050_set_gyro_fsr(st, st->chip_config.fsr);
    517	if (result)
    518		return result;
    519
    520	result = inv_mpu6050_set_lpf_regs(st, st->chip_config.lpf);
    521	if (result)
    522		return result;
    523
    524	d = st->chip_config.divider;
    525	result = regmap_write(st->map, st->reg->sample_rate_div, d);
    526	if (result)
    527		return result;
    528
    529	d = (st->chip_config.accl_fs << INV_MPU6050_ACCL_CONFIG_FSR_SHIFT);
    530	result = regmap_write(st->map, st->reg->accl_config, d);
    531	if (result)
    532		return result;
    533
    534	result = regmap_write(st->map, st->reg->int_pin_cfg, st->irq_mask);
    535	if (result)
    536		return result;
    537
    538	/*
    539	 * Internal chip period is 1ms (1kHz).
    540	 * Let's use at the beginning the theorical value before measuring
    541	 * with interrupt timestamps.
    542	 */
    543	st->chip_period = NSEC_PER_MSEC;
    544
    545	/* magn chip init, noop if not present in the chip */
    546	result = inv_mpu_magn_probe(st);
    547	if (result)
    548		return result;
    549
    550	return 0;
    551}
    552
    553static int inv_mpu6050_sensor_set(struct inv_mpu6050_state  *st, int reg,
    554				int axis, int val)
    555{
    556	int ind, result;
    557	__be16 d = cpu_to_be16(val);
    558
    559	ind = (axis - IIO_MOD_X) * 2;
    560	result = regmap_bulk_write(st->map, reg + ind, &d, sizeof(d));
    561	if (result)
    562		return -EINVAL;
    563
    564	return 0;
    565}
    566
    567static int inv_mpu6050_sensor_show(struct inv_mpu6050_state  *st, int reg,
    568				   int axis, int *val)
    569{
    570	int ind, result;
    571	__be16 d;
    572
    573	ind = (axis - IIO_MOD_X) * 2;
    574	result = regmap_bulk_read(st->map, reg + ind, &d, sizeof(d));
    575	if (result)
    576		return -EINVAL;
    577	*val = (short)be16_to_cpup(&d);
    578
    579	return IIO_VAL_INT;
    580}
    581
    582static int inv_mpu6050_read_channel_data(struct iio_dev *indio_dev,
    583					 struct iio_chan_spec const *chan,
    584					 int *val)
    585{
    586	struct inv_mpu6050_state *st = iio_priv(indio_dev);
    587	struct device *pdev = regmap_get_device(st->map);
    588	unsigned int freq_hz, period_us, min_sleep_us, max_sleep_us;
    589	int result;
    590	int ret;
    591
    592	/* compute sample period */
    593	freq_hz = INV_MPU6050_DIVIDER_TO_FIFO_RATE(st->chip_config.divider);
    594	period_us = 1000000 / freq_hz;
    595
    596	result = pm_runtime_resume_and_get(pdev);
    597	if (result)
    598		return result;
    599
    600	switch (chan->type) {
    601	case IIO_ANGL_VEL:
    602		if (!st->chip_config.gyro_en) {
    603			result = inv_mpu6050_switch_engine(st, true,
    604					INV_MPU6050_SENSOR_GYRO);
    605			if (result)
    606				goto error_power_off;
    607			/* need to wait 2 periods to have first valid sample */
    608			min_sleep_us = 2 * period_us;
    609			max_sleep_us = 2 * (period_us + period_us / 2);
    610			usleep_range(min_sleep_us, max_sleep_us);
    611		}
    612		ret = inv_mpu6050_sensor_show(st, st->reg->raw_gyro,
    613					      chan->channel2, val);
    614		break;
    615	case IIO_ACCEL:
    616		if (!st->chip_config.accl_en) {
    617			result = inv_mpu6050_switch_engine(st, true,
    618					INV_MPU6050_SENSOR_ACCL);
    619			if (result)
    620				goto error_power_off;
    621			/* wait 1 period for first sample availability */
    622			min_sleep_us = period_us;
    623			max_sleep_us = period_us + period_us / 2;
    624			usleep_range(min_sleep_us, max_sleep_us);
    625		}
    626		ret = inv_mpu6050_sensor_show(st, st->reg->raw_accl,
    627					      chan->channel2, val);
    628		break;
    629	case IIO_TEMP:
    630		/* temperature sensor work only with accel and/or gyro */
    631		if (!st->chip_config.accl_en && !st->chip_config.gyro_en) {
    632			result = -EBUSY;
    633			goto error_power_off;
    634		}
    635		if (!st->chip_config.temp_en) {
    636			result = inv_mpu6050_switch_engine(st, true,
    637					INV_MPU6050_SENSOR_TEMP);
    638			if (result)
    639				goto error_power_off;
    640			/* wait 1 period for first sample availability */
    641			min_sleep_us = period_us;
    642			max_sleep_us = period_us + period_us / 2;
    643			usleep_range(min_sleep_us, max_sleep_us);
    644		}
    645		ret = inv_mpu6050_sensor_show(st, st->reg->temperature,
    646					      IIO_MOD_X, val);
    647		break;
    648	case IIO_MAGN:
    649		if (!st->chip_config.magn_en) {
    650			result = inv_mpu6050_switch_engine(st, true,
    651					INV_MPU6050_SENSOR_MAGN);
    652			if (result)
    653				goto error_power_off;
    654			/* frequency is limited for magnetometer */
    655			if (freq_hz > INV_MPU_MAGN_FREQ_HZ_MAX) {
    656				freq_hz = INV_MPU_MAGN_FREQ_HZ_MAX;
    657				period_us = 1000000 / freq_hz;
    658			}
    659			/* need to wait 2 periods to have first valid sample */
    660			min_sleep_us = 2 * period_us;
    661			max_sleep_us = 2 * (period_us + period_us / 2);
    662			usleep_range(min_sleep_us, max_sleep_us);
    663		}
    664		ret = inv_mpu_magn_read(st, chan->channel2, val);
    665		break;
    666	default:
    667		ret = -EINVAL;
    668		break;
    669	}
    670
    671	pm_runtime_mark_last_busy(pdev);
    672	pm_runtime_put_autosuspend(pdev);
    673
    674	return ret;
    675
    676error_power_off:
    677	pm_runtime_put_autosuspend(pdev);
    678	return result;
    679}
    680
    681static int
    682inv_mpu6050_read_raw(struct iio_dev *indio_dev,
    683		     struct iio_chan_spec const *chan,
    684		     int *val, int *val2, long mask)
    685{
    686	struct inv_mpu6050_state  *st = iio_priv(indio_dev);
    687	int ret = 0;
    688
    689	switch (mask) {
    690	case IIO_CHAN_INFO_RAW:
    691		ret = iio_device_claim_direct_mode(indio_dev);
    692		if (ret)
    693			return ret;
    694		mutex_lock(&st->lock);
    695		ret = inv_mpu6050_read_channel_data(indio_dev, chan, val);
    696		mutex_unlock(&st->lock);
    697		iio_device_release_direct_mode(indio_dev);
    698		return ret;
    699	case IIO_CHAN_INFO_SCALE:
    700		switch (chan->type) {
    701		case IIO_ANGL_VEL:
    702			mutex_lock(&st->lock);
    703			*val  = 0;
    704			*val2 = gyro_scale_6050[st->chip_config.fsr];
    705			mutex_unlock(&st->lock);
    706
    707			return IIO_VAL_INT_PLUS_NANO;
    708		case IIO_ACCEL:
    709			mutex_lock(&st->lock);
    710			*val = 0;
    711			*val2 = accel_scale[st->chip_config.accl_fs];
    712			mutex_unlock(&st->lock);
    713
    714			return IIO_VAL_INT_PLUS_MICRO;
    715		case IIO_TEMP:
    716			*val = st->hw->temp.scale / 1000000;
    717			*val2 = st->hw->temp.scale % 1000000;
    718			return IIO_VAL_INT_PLUS_MICRO;
    719		case IIO_MAGN:
    720			return inv_mpu_magn_get_scale(st, chan, val, val2);
    721		default:
    722			return -EINVAL;
    723		}
    724	case IIO_CHAN_INFO_OFFSET:
    725		switch (chan->type) {
    726		case IIO_TEMP:
    727			*val = st->hw->temp.offset;
    728			return IIO_VAL_INT;
    729		default:
    730			return -EINVAL;
    731		}
    732	case IIO_CHAN_INFO_CALIBBIAS:
    733		switch (chan->type) {
    734		case IIO_ANGL_VEL:
    735			mutex_lock(&st->lock);
    736			ret = inv_mpu6050_sensor_show(st, st->reg->gyro_offset,
    737						chan->channel2, val);
    738			mutex_unlock(&st->lock);
    739			return IIO_VAL_INT;
    740		case IIO_ACCEL:
    741			mutex_lock(&st->lock);
    742			ret = inv_mpu6050_sensor_show(st, st->reg->accl_offset,
    743						chan->channel2, val);
    744			mutex_unlock(&st->lock);
    745			return IIO_VAL_INT;
    746
    747		default:
    748			return -EINVAL;
    749		}
    750	default:
    751		return -EINVAL;
    752	}
    753}
    754
    755static int inv_mpu6050_write_gyro_scale(struct inv_mpu6050_state *st, int val,
    756					int val2)
    757{
    758	int result, i;
    759
    760	if (val != 0)
    761		return -EINVAL;
    762
    763	for (i = 0; i < ARRAY_SIZE(gyro_scale_6050); ++i) {
    764		if (gyro_scale_6050[i] == val2) {
    765			result = inv_mpu6050_set_gyro_fsr(st, i);
    766			if (result)
    767				return result;
    768
    769			st->chip_config.fsr = i;
    770			return 0;
    771		}
    772	}
    773
    774	return -EINVAL;
    775}
    776
    777static int inv_write_raw_get_fmt(struct iio_dev *indio_dev,
    778				 struct iio_chan_spec const *chan, long mask)
    779{
    780	switch (mask) {
    781	case IIO_CHAN_INFO_SCALE:
    782		switch (chan->type) {
    783		case IIO_ANGL_VEL:
    784			return IIO_VAL_INT_PLUS_NANO;
    785		default:
    786			return IIO_VAL_INT_PLUS_MICRO;
    787		}
    788	default:
    789		return IIO_VAL_INT_PLUS_MICRO;
    790	}
    791
    792	return -EINVAL;
    793}
    794
    795static int inv_mpu6050_write_accel_scale(struct inv_mpu6050_state *st, int val,
    796					 int val2)
    797{
    798	int result, i;
    799	u8 d;
    800
    801	if (val != 0)
    802		return -EINVAL;
    803
    804	for (i = 0; i < ARRAY_SIZE(accel_scale); ++i) {
    805		if (accel_scale[i] == val2) {
    806			d = (i << INV_MPU6050_ACCL_CONFIG_FSR_SHIFT);
    807			result = regmap_write(st->map, st->reg->accl_config, d);
    808			if (result)
    809				return result;
    810
    811			st->chip_config.accl_fs = i;
    812			return 0;
    813		}
    814	}
    815
    816	return -EINVAL;
    817}
    818
    819static int inv_mpu6050_write_raw(struct iio_dev *indio_dev,
    820				 struct iio_chan_spec const *chan,
    821				 int val, int val2, long mask)
    822{
    823	struct inv_mpu6050_state  *st = iio_priv(indio_dev);
    824	struct device *pdev = regmap_get_device(st->map);
    825	int result;
    826
    827	/*
    828	 * we should only update scale when the chip is disabled, i.e.
    829	 * not running
    830	 */
    831	result = iio_device_claim_direct_mode(indio_dev);
    832	if (result)
    833		return result;
    834
    835	mutex_lock(&st->lock);
    836	result = pm_runtime_resume_and_get(pdev);
    837	if (result)
    838		goto error_write_raw_unlock;
    839
    840	switch (mask) {
    841	case IIO_CHAN_INFO_SCALE:
    842		switch (chan->type) {
    843		case IIO_ANGL_VEL:
    844			result = inv_mpu6050_write_gyro_scale(st, val, val2);
    845			break;
    846		case IIO_ACCEL:
    847			result = inv_mpu6050_write_accel_scale(st, val, val2);
    848			break;
    849		default:
    850			result = -EINVAL;
    851			break;
    852		}
    853		break;
    854	case IIO_CHAN_INFO_CALIBBIAS:
    855		switch (chan->type) {
    856		case IIO_ANGL_VEL:
    857			result = inv_mpu6050_sensor_set(st,
    858							st->reg->gyro_offset,
    859							chan->channel2, val);
    860			break;
    861		case IIO_ACCEL:
    862			result = inv_mpu6050_sensor_set(st,
    863							st->reg->accl_offset,
    864							chan->channel2, val);
    865			break;
    866		default:
    867			result = -EINVAL;
    868			break;
    869		}
    870		break;
    871	default:
    872		result = -EINVAL;
    873		break;
    874	}
    875
    876	pm_runtime_mark_last_busy(pdev);
    877	pm_runtime_put_autosuspend(pdev);
    878error_write_raw_unlock:
    879	mutex_unlock(&st->lock);
    880	iio_device_release_direct_mode(indio_dev);
    881
    882	return result;
    883}
    884
    885/*
    886 *  inv_mpu6050_set_lpf() - set low pass filer based on fifo rate.
    887 *
    888 *                  Based on the Nyquist principle, the bandwidth of the low
    889 *                  pass filter must not exceed the signal sampling rate divided
    890 *                  by 2, or there would be aliasing.
    891 *                  This function basically search for the correct low pass
    892 *                  parameters based on the fifo rate, e.g, sampling frequency.
    893 *
    894 *  lpf is set automatically when setting sampling rate to avoid any aliases.
    895 */
    896static int inv_mpu6050_set_lpf(struct inv_mpu6050_state *st, int rate)
    897{
    898	static const int hz[] = {400, 200, 90, 40, 20, 10};
    899	static const int d[] = {
    900		INV_MPU6050_FILTER_200HZ, INV_MPU6050_FILTER_100HZ,
    901		INV_MPU6050_FILTER_45HZ, INV_MPU6050_FILTER_20HZ,
    902		INV_MPU6050_FILTER_10HZ, INV_MPU6050_FILTER_5HZ
    903	};
    904	int i, result;
    905	u8 data;
    906
    907	data = INV_MPU6050_FILTER_5HZ;
    908	for (i = 0; i < ARRAY_SIZE(hz); ++i) {
    909		if (rate >= hz[i]) {
    910			data = d[i];
    911			break;
    912		}
    913	}
    914	result = inv_mpu6050_set_lpf_regs(st, data);
    915	if (result)
    916		return result;
    917	st->chip_config.lpf = data;
    918
    919	return 0;
    920}
    921
    922/*
    923 * inv_mpu6050_fifo_rate_store() - Set fifo rate.
    924 */
    925static ssize_t
    926inv_mpu6050_fifo_rate_store(struct device *dev, struct device_attribute *attr,
    927			    const char *buf, size_t count)
    928{
    929	int fifo_rate;
    930	u8 d;
    931	int result;
    932	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
    933	struct inv_mpu6050_state *st = iio_priv(indio_dev);
    934	struct device *pdev = regmap_get_device(st->map);
    935
    936	if (kstrtoint(buf, 10, &fifo_rate))
    937		return -EINVAL;
    938	if (fifo_rate < INV_MPU6050_MIN_FIFO_RATE ||
    939	    fifo_rate > INV_MPU6050_MAX_FIFO_RATE)
    940		return -EINVAL;
    941
    942	/* compute the chip sample rate divider */
    943	d = INV_MPU6050_FIFO_RATE_TO_DIVIDER(fifo_rate);
    944	/* compute back the fifo rate to handle truncation cases */
    945	fifo_rate = INV_MPU6050_DIVIDER_TO_FIFO_RATE(d);
    946
    947	mutex_lock(&st->lock);
    948	if (d == st->chip_config.divider) {
    949		result = 0;
    950		goto fifo_rate_fail_unlock;
    951	}
    952	result = pm_runtime_resume_and_get(pdev);
    953	if (result)
    954		goto fifo_rate_fail_unlock;
    955
    956	result = regmap_write(st->map, st->reg->sample_rate_div, d);
    957	if (result)
    958		goto fifo_rate_fail_power_off;
    959	st->chip_config.divider = d;
    960
    961	result = inv_mpu6050_set_lpf(st, fifo_rate);
    962	if (result)
    963		goto fifo_rate_fail_power_off;
    964
    965	/* update rate for magn, noop if not present in chip */
    966	result = inv_mpu_magn_set_rate(st, fifo_rate);
    967	if (result)
    968		goto fifo_rate_fail_power_off;
    969
    970	pm_runtime_mark_last_busy(pdev);
    971fifo_rate_fail_power_off:
    972	pm_runtime_put_autosuspend(pdev);
    973fifo_rate_fail_unlock:
    974	mutex_unlock(&st->lock);
    975	if (result)
    976		return result;
    977
    978	return count;
    979}
    980
    981/*
    982 * inv_fifo_rate_show() - Get the current sampling rate.
    983 */
    984static ssize_t
    985inv_fifo_rate_show(struct device *dev, struct device_attribute *attr,
    986		   char *buf)
    987{
    988	struct inv_mpu6050_state *st = iio_priv(dev_to_iio_dev(dev));
    989	unsigned fifo_rate;
    990
    991	mutex_lock(&st->lock);
    992	fifo_rate = INV_MPU6050_DIVIDER_TO_FIFO_RATE(st->chip_config.divider);
    993	mutex_unlock(&st->lock);
    994
    995	return scnprintf(buf, PAGE_SIZE, "%u\n", fifo_rate);
    996}
    997
    998/*
    999 * inv_attr_show() - calling this function will show current
   1000 *                    parameters.
   1001 *
   1002 * Deprecated in favor of IIO mounting matrix API.
   1003 *
   1004 * See inv_get_mount_matrix()
   1005 */
   1006static ssize_t inv_attr_show(struct device *dev, struct device_attribute *attr,
   1007			     char *buf)
   1008{
   1009	struct inv_mpu6050_state *st = iio_priv(dev_to_iio_dev(dev));
   1010	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
   1011	s8 *m;
   1012
   1013	switch (this_attr->address) {
   1014	/*
   1015	 * In MPU6050, the two matrix are the same because gyro and accel
   1016	 * are integrated in one chip
   1017	 */
   1018	case ATTR_GYRO_MATRIX:
   1019	case ATTR_ACCL_MATRIX:
   1020		m = st->plat_data.orientation;
   1021
   1022		return scnprintf(buf, PAGE_SIZE,
   1023			"%d, %d, %d; %d, %d, %d; %d, %d, %d\n",
   1024			m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]);
   1025	default:
   1026		return -EINVAL;
   1027	}
   1028}
   1029
   1030/**
   1031 * inv_mpu6050_validate_trigger() - validate_trigger callback for invensense
   1032 *                                  MPU6050 device.
   1033 * @indio_dev: The IIO device
   1034 * @trig: The new trigger
   1035 *
   1036 * Returns: 0 if the 'trig' matches the trigger registered by the MPU6050
   1037 * device, -EINVAL otherwise.
   1038 */
   1039static int inv_mpu6050_validate_trigger(struct iio_dev *indio_dev,
   1040					struct iio_trigger *trig)
   1041{
   1042	struct inv_mpu6050_state *st = iio_priv(indio_dev);
   1043
   1044	if (st->trig != trig)
   1045		return -EINVAL;
   1046
   1047	return 0;
   1048}
   1049
   1050static const struct iio_mount_matrix *
   1051inv_get_mount_matrix(const struct iio_dev *indio_dev,
   1052		     const struct iio_chan_spec *chan)
   1053{
   1054	struct inv_mpu6050_state *data = iio_priv(indio_dev);
   1055	const struct iio_mount_matrix *matrix;
   1056
   1057	if (chan->type == IIO_MAGN)
   1058		matrix = &data->magn_orient;
   1059	else
   1060		matrix = &data->orientation;
   1061
   1062	return matrix;
   1063}
   1064
   1065static const struct iio_chan_spec_ext_info inv_ext_info[] = {
   1066	IIO_MOUNT_MATRIX(IIO_SHARED_BY_TYPE, inv_get_mount_matrix),
   1067	{ }
   1068};
   1069
   1070#define INV_MPU6050_CHAN(_type, _channel2, _index)                    \
   1071	{                                                             \
   1072		.type = _type,                                        \
   1073		.modified = 1,                                        \
   1074		.channel2 = _channel2,                                \
   1075		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
   1076		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |	      \
   1077				      BIT(IIO_CHAN_INFO_CALIBBIAS),   \
   1078		.scan_index = _index,                                 \
   1079		.scan_type = {                                        \
   1080				.sign = 's',                          \
   1081				.realbits = 16,                       \
   1082				.storagebits = 16,                    \
   1083				.shift = 0,                           \
   1084				.endianness = IIO_BE,                 \
   1085			     },                                       \
   1086		.ext_info = inv_ext_info,                             \
   1087	}
   1088
   1089#define INV_MPU6050_TEMP_CHAN(_index)				\
   1090	{							\
   1091		.type = IIO_TEMP,				\
   1092		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW)	\
   1093				| BIT(IIO_CHAN_INFO_OFFSET)	\
   1094				| BIT(IIO_CHAN_INFO_SCALE),	\
   1095		.scan_index = _index,				\
   1096		.scan_type = {					\
   1097			.sign = 's',				\
   1098			.realbits = 16,				\
   1099			.storagebits = 16,			\
   1100			.shift = 0,				\
   1101			.endianness = IIO_BE,			\
   1102		},						\
   1103	}
   1104
   1105static const struct iio_chan_spec inv_mpu_channels[] = {
   1106	IIO_CHAN_SOFT_TIMESTAMP(INV_MPU6050_SCAN_TIMESTAMP),
   1107
   1108	INV_MPU6050_TEMP_CHAN(INV_MPU6050_SCAN_TEMP),
   1109
   1110	INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_MPU6050_SCAN_GYRO_X),
   1111	INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_MPU6050_SCAN_GYRO_Y),
   1112	INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_MPU6050_SCAN_GYRO_Z),
   1113
   1114	INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_X, INV_MPU6050_SCAN_ACCL_X),
   1115	INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Y, INV_MPU6050_SCAN_ACCL_Y),
   1116	INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z),
   1117};
   1118
   1119#define INV_MPU6050_SCAN_MASK_3AXIS_ACCEL	\
   1120	(BIT(INV_MPU6050_SCAN_ACCL_X)		\
   1121	| BIT(INV_MPU6050_SCAN_ACCL_Y)		\
   1122	| BIT(INV_MPU6050_SCAN_ACCL_Z))
   1123
   1124#define INV_MPU6050_SCAN_MASK_3AXIS_GYRO	\
   1125	(BIT(INV_MPU6050_SCAN_GYRO_X)		\
   1126	| BIT(INV_MPU6050_SCAN_GYRO_Y)		\
   1127	| BIT(INV_MPU6050_SCAN_GYRO_Z))
   1128
   1129#define INV_MPU6050_SCAN_MASK_TEMP		(BIT(INV_MPU6050_SCAN_TEMP))
   1130
   1131static const unsigned long inv_mpu_scan_masks[] = {
   1132	/* 3-axis accel */
   1133	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL,
   1134	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_TEMP,
   1135	/* 3-axis gyro */
   1136	INV_MPU6050_SCAN_MASK_3AXIS_GYRO,
   1137	INV_MPU6050_SCAN_MASK_3AXIS_GYRO | INV_MPU6050_SCAN_MASK_TEMP,
   1138	/* 6-axis accel + gyro */
   1139	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO,
   1140	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO
   1141		| INV_MPU6050_SCAN_MASK_TEMP,
   1142	0,
   1143};
   1144
   1145#define INV_MPU9X50_MAGN_CHAN(_chan2, _bits, _index)			\
   1146	{								\
   1147		.type = IIO_MAGN,					\
   1148		.modified = 1,						\
   1149		.channel2 = _chan2,					\
   1150		.info_mask_separate = BIT(IIO_CHAN_INFO_SCALE) |	\
   1151				      BIT(IIO_CHAN_INFO_RAW),		\
   1152		.scan_index = _index,					\
   1153		.scan_type = {						\
   1154			.sign = 's',					\
   1155			.realbits = _bits,				\
   1156			.storagebits = 16,				\
   1157			.shift = 0,					\
   1158			.endianness = IIO_BE,				\
   1159		},							\
   1160		.ext_info = inv_ext_info,				\
   1161	}
   1162
   1163static const struct iio_chan_spec inv_mpu9150_channels[] = {
   1164	IIO_CHAN_SOFT_TIMESTAMP(INV_MPU9X50_SCAN_TIMESTAMP),
   1165
   1166	INV_MPU6050_TEMP_CHAN(INV_MPU6050_SCAN_TEMP),
   1167
   1168	INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_MPU6050_SCAN_GYRO_X),
   1169	INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_MPU6050_SCAN_GYRO_Y),
   1170	INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_MPU6050_SCAN_GYRO_Z),
   1171
   1172	INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_X, INV_MPU6050_SCAN_ACCL_X),
   1173	INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Y, INV_MPU6050_SCAN_ACCL_Y),
   1174	INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z),
   1175
   1176	/* Magnetometer resolution is 13 bits */
   1177	INV_MPU9X50_MAGN_CHAN(IIO_MOD_X, 13, INV_MPU9X50_SCAN_MAGN_X),
   1178	INV_MPU9X50_MAGN_CHAN(IIO_MOD_Y, 13, INV_MPU9X50_SCAN_MAGN_Y),
   1179	INV_MPU9X50_MAGN_CHAN(IIO_MOD_Z, 13, INV_MPU9X50_SCAN_MAGN_Z),
   1180};
   1181
   1182static const struct iio_chan_spec inv_mpu9250_channels[] = {
   1183	IIO_CHAN_SOFT_TIMESTAMP(INV_MPU9X50_SCAN_TIMESTAMP),
   1184
   1185	INV_MPU6050_TEMP_CHAN(INV_MPU6050_SCAN_TEMP),
   1186
   1187	INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_MPU6050_SCAN_GYRO_X),
   1188	INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_MPU6050_SCAN_GYRO_Y),
   1189	INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_MPU6050_SCAN_GYRO_Z),
   1190
   1191	INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_X, INV_MPU6050_SCAN_ACCL_X),
   1192	INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Y, INV_MPU6050_SCAN_ACCL_Y),
   1193	INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z),
   1194
   1195	/* Magnetometer resolution is 16 bits */
   1196	INV_MPU9X50_MAGN_CHAN(IIO_MOD_X, 16, INV_MPU9X50_SCAN_MAGN_X),
   1197	INV_MPU9X50_MAGN_CHAN(IIO_MOD_Y, 16, INV_MPU9X50_SCAN_MAGN_Y),
   1198	INV_MPU9X50_MAGN_CHAN(IIO_MOD_Z, 16, INV_MPU9X50_SCAN_MAGN_Z),
   1199};
   1200
   1201#define INV_MPU9X50_SCAN_MASK_3AXIS_MAGN	\
   1202	(BIT(INV_MPU9X50_SCAN_MAGN_X)		\
   1203	| BIT(INV_MPU9X50_SCAN_MAGN_Y)		\
   1204	| BIT(INV_MPU9X50_SCAN_MAGN_Z))
   1205
   1206static const unsigned long inv_mpu9x50_scan_masks[] = {
   1207	/* 3-axis accel */
   1208	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL,
   1209	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_TEMP,
   1210	/* 3-axis gyro */
   1211	INV_MPU6050_SCAN_MASK_3AXIS_GYRO,
   1212	INV_MPU6050_SCAN_MASK_3AXIS_GYRO | INV_MPU6050_SCAN_MASK_TEMP,
   1213	/* 3-axis magn */
   1214	INV_MPU9X50_SCAN_MASK_3AXIS_MAGN,
   1215	INV_MPU9X50_SCAN_MASK_3AXIS_MAGN | INV_MPU6050_SCAN_MASK_TEMP,
   1216	/* 6-axis accel + gyro */
   1217	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO,
   1218	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO
   1219		| INV_MPU6050_SCAN_MASK_TEMP,
   1220	/* 6-axis accel + magn */
   1221	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU9X50_SCAN_MASK_3AXIS_MAGN,
   1222	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU9X50_SCAN_MASK_3AXIS_MAGN
   1223		| INV_MPU6050_SCAN_MASK_TEMP,
   1224	/* 6-axis gyro + magn */
   1225	INV_MPU6050_SCAN_MASK_3AXIS_GYRO | INV_MPU9X50_SCAN_MASK_3AXIS_MAGN,
   1226	INV_MPU6050_SCAN_MASK_3AXIS_GYRO | INV_MPU9X50_SCAN_MASK_3AXIS_MAGN
   1227		| INV_MPU6050_SCAN_MASK_TEMP,
   1228	/* 9-axis accel + gyro + magn */
   1229	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO
   1230		| INV_MPU9X50_SCAN_MASK_3AXIS_MAGN,
   1231	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO
   1232		| INV_MPU9X50_SCAN_MASK_3AXIS_MAGN
   1233		| INV_MPU6050_SCAN_MASK_TEMP,
   1234	0,
   1235};
   1236
   1237static const unsigned long inv_icm20602_scan_masks[] = {
   1238	/* 3-axis accel + temp (mandatory) */
   1239	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_TEMP,
   1240	/* 3-axis gyro + temp (mandatory) */
   1241	INV_MPU6050_SCAN_MASK_3AXIS_GYRO | INV_MPU6050_SCAN_MASK_TEMP,
   1242	/* 6-axis accel + gyro + temp (mandatory) */
   1243	INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO
   1244		| INV_MPU6050_SCAN_MASK_TEMP,
   1245	0,
   1246};
   1247
   1248/*
   1249 * The user can choose any frequency between INV_MPU6050_MIN_FIFO_RATE and
   1250 * INV_MPU6050_MAX_FIFO_RATE, but only these frequencies are matched by the
   1251 * low-pass filter. Specifically, each of these sampling rates are about twice
   1252 * the bandwidth of a corresponding low-pass filter, which should eliminate
   1253 * aliasing following the Nyquist principle. By picking a frequency different
   1254 * from these, the user risks aliasing effects.
   1255 */
   1256static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("10 20 50 100 200 500");
   1257static IIO_CONST_ATTR(in_anglvel_scale_available,
   1258					  "0.000133090 0.000266181 0.000532362 0.001064724");
   1259static IIO_CONST_ATTR(in_accel_scale_available,
   1260					  "0.000598 0.001196 0.002392 0.004785");
   1261static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR, inv_fifo_rate_show,
   1262	inv_mpu6050_fifo_rate_store);
   1263
   1264/* Deprecated: kept for userspace backward compatibility. */
   1265static IIO_DEVICE_ATTR(in_gyro_matrix, S_IRUGO, inv_attr_show, NULL,
   1266	ATTR_GYRO_MATRIX);
   1267static IIO_DEVICE_ATTR(in_accel_matrix, S_IRUGO, inv_attr_show, NULL,
   1268	ATTR_ACCL_MATRIX);
   1269
   1270static struct attribute *inv_attributes[] = {
   1271	&iio_dev_attr_in_gyro_matrix.dev_attr.attr,  /* deprecated */
   1272	&iio_dev_attr_in_accel_matrix.dev_attr.attr, /* deprecated */
   1273	&iio_dev_attr_sampling_frequency.dev_attr.attr,
   1274	&iio_const_attr_sampling_frequency_available.dev_attr.attr,
   1275	&iio_const_attr_in_accel_scale_available.dev_attr.attr,
   1276	&iio_const_attr_in_anglvel_scale_available.dev_attr.attr,
   1277	NULL,
   1278};
   1279
   1280static const struct attribute_group inv_attribute_group = {
   1281	.attrs = inv_attributes
   1282};
   1283
   1284static int inv_mpu6050_reg_access(struct iio_dev *indio_dev,
   1285				  unsigned int reg,
   1286				  unsigned int writeval,
   1287				  unsigned int *readval)
   1288{
   1289	struct inv_mpu6050_state *st = iio_priv(indio_dev);
   1290	int ret;
   1291
   1292	mutex_lock(&st->lock);
   1293	if (readval)
   1294		ret = regmap_read(st->map, reg, readval);
   1295	else
   1296		ret = regmap_write(st->map, reg, writeval);
   1297	mutex_unlock(&st->lock);
   1298
   1299	return ret;
   1300}
   1301
   1302static const struct iio_info mpu_info = {
   1303	.read_raw = &inv_mpu6050_read_raw,
   1304	.write_raw = &inv_mpu6050_write_raw,
   1305	.write_raw_get_fmt = &inv_write_raw_get_fmt,
   1306	.attrs = &inv_attribute_group,
   1307	.validate_trigger = inv_mpu6050_validate_trigger,
   1308	.debugfs_reg_access = &inv_mpu6050_reg_access,
   1309};
   1310
   1311/*
   1312 *  inv_check_and_setup_chip() - check and setup chip.
   1313 */
   1314static int inv_check_and_setup_chip(struct inv_mpu6050_state *st)
   1315{
   1316	int result;
   1317	unsigned int regval, mask;
   1318	int i;
   1319
   1320	st->hw  = &hw_info[st->chip_type];
   1321	st->reg = hw_info[st->chip_type].reg;
   1322	memcpy(&st->chip_config, hw_info[st->chip_type].config,
   1323	       sizeof(st->chip_config));
   1324
   1325	/* check chip self-identification */
   1326	result = regmap_read(st->map, INV_MPU6050_REG_WHOAMI, &regval);
   1327	if (result)
   1328		return result;
   1329	if (regval != st->hw->whoami) {
   1330		/* check whoami against all possible values */
   1331		for (i = 0; i < INV_NUM_PARTS; ++i) {
   1332			if (regval == hw_info[i].whoami) {
   1333				dev_warn(regmap_get_device(st->map),
   1334					"whoami mismatch got 0x%02x (%s) expected 0x%02x (%s)\n",
   1335					regval, hw_info[i].name,
   1336					st->hw->whoami, st->hw->name);
   1337				break;
   1338			}
   1339		}
   1340		if (i >= INV_NUM_PARTS) {
   1341			dev_err(regmap_get_device(st->map),
   1342				"invalid whoami 0x%02x expected 0x%02x (%s)\n",
   1343				regval, st->hw->whoami, st->hw->name);
   1344			return -ENODEV;
   1345		}
   1346	}
   1347
   1348	/* reset to make sure previous state are not there */
   1349	result = regmap_write(st->map, st->reg->pwr_mgmt_1,
   1350			      INV_MPU6050_BIT_H_RESET);
   1351	if (result)
   1352		return result;
   1353	msleep(INV_MPU6050_POWER_UP_TIME);
   1354	switch (st->chip_type) {
   1355	case INV_MPU6000:
   1356	case INV_MPU6500:
   1357	case INV_MPU6515:
   1358	case INV_MPU6880:
   1359	case INV_MPU9250:
   1360	case INV_MPU9255:
   1361		/* reset signal path (required for spi connection) */
   1362		regval = INV_MPU6050_BIT_TEMP_RST | INV_MPU6050_BIT_ACCEL_RST |
   1363			 INV_MPU6050_BIT_GYRO_RST;
   1364		result = regmap_write(st->map, INV_MPU6050_REG_SIGNAL_PATH_RESET,
   1365				      regval);
   1366		if (result)
   1367			return result;
   1368		msleep(INV_MPU6050_POWER_UP_TIME);
   1369		break;
   1370	default:
   1371		break;
   1372	}
   1373
   1374	/*
   1375	 * Turn power on. After reset, the sleep bit could be on
   1376	 * or off depending on the OTP settings. Turning power on
   1377	 * make it in a definite state as well as making the hardware
   1378	 * state align with the software state
   1379	 */
   1380	result = inv_mpu6050_set_power_itg(st, true);
   1381	if (result)
   1382		return result;
   1383	mask = INV_MPU6050_SENSOR_ACCL | INV_MPU6050_SENSOR_GYRO |
   1384			INV_MPU6050_SENSOR_TEMP | INV_MPU6050_SENSOR_MAGN;
   1385	result = inv_mpu6050_switch_engine(st, false, mask);
   1386	if (result)
   1387		goto error_power_off;
   1388
   1389	return 0;
   1390
   1391error_power_off:
   1392	inv_mpu6050_set_power_itg(st, false);
   1393	return result;
   1394}
   1395
   1396static int inv_mpu_core_enable_regulator_vddio(struct inv_mpu6050_state *st)
   1397{
   1398	int result;
   1399
   1400	result = regulator_enable(st->vddio_supply);
   1401	if (result) {
   1402		dev_err(regmap_get_device(st->map),
   1403			"Failed to enable vddio regulator: %d\n", result);
   1404	} else {
   1405		/* Give the device a little bit of time to start up. */
   1406		usleep_range(3000, 5000);
   1407	}
   1408
   1409	return result;
   1410}
   1411
   1412static int inv_mpu_core_disable_regulator_vddio(struct inv_mpu6050_state *st)
   1413{
   1414	int result;
   1415
   1416	result = regulator_disable(st->vddio_supply);
   1417	if (result)
   1418		dev_err(regmap_get_device(st->map),
   1419			"Failed to disable vddio regulator: %d\n", result);
   1420
   1421	return result;
   1422}
   1423
   1424static void inv_mpu_core_disable_regulator_action(void *_data)
   1425{
   1426	struct inv_mpu6050_state *st = _data;
   1427	int result;
   1428
   1429	result = regulator_disable(st->vdd_supply);
   1430	if (result)
   1431		dev_err(regmap_get_device(st->map),
   1432			"Failed to disable vdd regulator: %d\n", result);
   1433
   1434	inv_mpu_core_disable_regulator_vddio(st);
   1435}
   1436
   1437static void inv_mpu_pm_disable(void *data)
   1438{
   1439	struct device *dev = data;
   1440
   1441	pm_runtime_disable(dev);
   1442}
   1443
   1444int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
   1445		int (*inv_mpu_bus_setup)(struct iio_dev *), int chip_type)
   1446{
   1447	struct inv_mpu6050_state *st;
   1448	struct iio_dev *indio_dev;
   1449	struct inv_mpu6050_platform_data *pdata;
   1450	struct device *dev = regmap_get_device(regmap);
   1451	int result;
   1452	struct irq_data *desc;
   1453	int irq_type;
   1454
   1455	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
   1456	if (!indio_dev)
   1457		return -ENOMEM;
   1458
   1459	BUILD_BUG_ON(ARRAY_SIZE(hw_info) != INV_NUM_PARTS);
   1460	if (chip_type < 0 || chip_type >= INV_NUM_PARTS) {
   1461		dev_err(dev, "Bad invensense chip_type=%d name=%s\n",
   1462				chip_type, name);
   1463		return -ENODEV;
   1464	}
   1465	st = iio_priv(indio_dev);
   1466	mutex_init(&st->lock);
   1467	st->chip_type = chip_type;
   1468	st->irq = irq;
   1469	st->map = regmap;
   1470
   1471	pdata = dev_get_platdata(dev);
   1472	if (!pdata) {
   1473		result = iio_read_mount_matrix(dev, &st->orientation);
   1474		if (result) {
   1475			dev_err(dev, "Failed to retrieve mounting matrix %d\n",
   1476				result);
   1477			return result;
   1478		}
   1479	} else {
   1480		st->plat_data = *pdata;
   1481	}
   1482
   1483	if (irq > 0) {
   1484		desc = irq_get_irq_data(irq);
   1485		if (!desc) {
   1486			dev_err(dev, "Could not find IRQ %d\n", irq);
   1487			return -EINVAL;
   1488		}
   1489
   1490		irq_type = irqd_get_trigger_type(desc);
   1491		if (!irq_type)
   1492			irq_type = IRQF_TRIGGER_RISING;
   1493	} else {
   1494		/* Doesn't really matter, use the default */
   1495		irq_type = IRQF_TRIGGER_RISING;
   1496	}
   1497
   1498	if (irq_type & IRQF_TRIGGER_RISING)	// rising or both-edge
   1499		st->irq_mask = INV_MPU6050_ACTIVE_HIGH;
   1500	else if (irq_type == IRQF_TRIGGER_FALLING)
   1501		st->irq_mask = INV_MPU6050_ACTIVE_LOW;
   1502	else if (irq_type == IRQF_TRIGGER_HIGH)
   1503		st->irq_mask = INV_MPU6050_ACTIVE_HIGH |
   1504			INV_MPU6050_LATCH_INT_EN;
   1505	else if (irq_type == IRQF_TRIGGER_LOW)
   1506		st->irq_mask = INV_MPU6050_ACTIVE_LOW |
   1507			INV_MPU6050_LATCH_INT_EN;
   1508	else {
   1509		dev_err(dev, "Invalid interrupt type 0x%x specified\n",
   1510			irq_type);
   1511		return -EINVAL;
   1512	}
   1513
   1514	st->vdd_supply = devm_regulator_get(dev, "vdd");
   1515	if (IS_ERR(st->vdd_supply))
   1516		return dev_err_probe(dev, PTR_ERR(st->vdd_supply),
   1517				     "Failed to get vdd regulator\n");
   1518
   1519	st->vddio_supply = devm_regulator_get(dev, "vddio");
   1520	if (IS_ERR(st->vddio_supply))
   1521		return dev_err_probe(dev, PTR_ERR(st->vddio_supply),
   1522				     "Failed to get vddio regulator\n");
   1523
   1524	result = regulator_enable(st->vdd_supply);
   1525	if (result) {
   1526		dev_err(dev, "Failed to enable vdd regulator: %d\n", result);
   1527		return result;
   1528	}
   1529	msleep(INV_MPU6050_POWER_UP_TIME);
   1530
   1531	result = inv_mpu_core_enable_regulator_vddio(st);
   1532	if (result) {
   1533		regulator_disable(st->vdd_supply);
   1534		return result;
   1535	}
   1536
   1537	result = devm_add_action_or_reset(dev, inv_mpu_core_disable_regulator_action,
   1538				 st);
   1539	if (result) {
   1540		dev_err(dev, "Failed to setup regulator cleanup action %d\n",
   1541			result);
   1542		return result;
   1543	}
   1544
   1545	/* fill magnetometer orientation */
   1546	result = inv_mpu_magn_set_orient(st);
   1547	if (result)
   1548		return result;
   1549
   1550	/* power is turned on inside check chip type*/
   1551	result = inv_check_and_setup_chip(st);
   1552	if (result)
   1553		return result;
   1554
   1555	result = inv_mpu6050_init_config(indio_dev);
   1556	if (result) {
   1557		dev_err(dev, "Could not initialize device.\n");
   1558		goto error_power_off;
   1559	}
   1560
   1561	dev_set_drvdata(dev, indio_dev);
   1562	/* name will be NULL when enumerated via ACPI */
   1563	if (name)
   1564		indio_dev->name = name;
   1565	else
   1566		indio_dev->name = dev_name(dev);
   1567
   1568	/* requires parent device set in indio_dev */
   1569	if (inv_mpu_bus_setup) {
   1570		result = inv_mpu_bus_setup(indio_dev);
   1571		if (result)
   1572			goto error_power_off;
   1573	}
   1574
   1575	/* chip init is done, turning on runtime power management */
   1576	result = pm_runtime_set_active(dev);
   1577	if (result)
   1578		goto error_power_off;
   1579	pm_runtime_get_noresume(dev);
   1580	pm_runtime_enable(dev);
   1581	pm_runtime_set_autosuspend_delay(dev, INV_MPU6050_SUSPEND_DELAY_MS);
   1582	pm_runtime_use_autosuspend(dev);
   1583	pm_runtime_put(dev);
   1584	result = devm_add_action_or_reset(dev, inv_mpu_pm_disable, dev);
   1585	if (result)
   1586		return result;
   1587
   1588	switch (chip_type) {
   1589	case INV_MPU9150:
   1590		indio_dev->channels = inv_mpu9150_channels;
   1591		indio_dev->num_channels = ARRAY_SIZE(inv_mpu9150_channels);
   1592		indio_dev->available_scan_masks = inv_mpu9x50_scan_masks;
   1593		break;
   1594	case INV_MPU9250:
   1595	case INV_MPU9255:
   1596		indio_dev->channels = inv_mpu9250_channels;
   1597		indio_dev->num_channels = ARRAY_SIZE(inv_mpu9250_channels);
   1598		indio_dev->available_scan_masks = inv_mpu9x50_scan_masks;
   1599		break;
   1600	case INV_ICM20602:
   1601		indio_dev->channels = inv_mpu_channels;
   1602		indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
   1603		indio_dev->available_scan_masks = inv_icm20602_scan_masks;
   1604		break;
   1605	default:
   1606		indio_dev->channels = inv_mpu_channels;
   1607		indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
   1608		indio_dev->available_scan_masks = inv_mpu_scan_masks;
   1609		break;
   1610	}
   1611	/*
   1612	 * Use magnetometer inside the chip only if there is no i2c
   1613	 * auxiliary device in use. Otherwise Going back to 6-axis only.
   1614	 */
   1615	if (st->magn_disabled) {
   1616		indio_dev->channels = inv_mpu_channels;
   1617		indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
   1618		indio_dev->available_scan_masks = inv_mpu_scan_masks;
   1619	}
   1620
   1621	indio_dev->info = &mpu_info;
   1622
   1623	if (irq > 0) {
   1624		/*
   1625		 * The driver currently only supports buffered capture with its
   1626		 * own trigger. So no IRQ, no trigger, no buffer
   1627		 */
   1628		result = devm_iio_triggered_buffer_setup(dev, indio_dev,
   1629							 iio_pollfunc_store_time,
   1630							 inv_mpu6050_read_fifo,
   1631							 NULL);
   1632		if (result) {
   1633			dev_err(dev, "configure buffer fail %d\n", result);
   1634			return result;
   1635		}
   1636
   1637		result = inv_mpu6050_probe_trigger(indio_dev, irq_type);
   1638		if (result) {
   1639			dev_err(dev, "trigger probe fail %d\n", result);
   1640			return result;
   1641		}
   1642	}
   1643
   1644	result = devm_iio_device_register(dev, indio_dev);
   1645	if (result) {
   1646		dev_err(dev, "IIO register fail %d\n", result);
   1647		return result;
   1648	}
   1649
   1650	return 0;
   1651
   1652error_power_off:
   1653	inv_mpu6050_set_power_itg(st, false);
   1654	return result;
   1655}
   1656EXPORT_SYMBOL_GPL(inv_mpu_core_probe);
   1657
   1658static int __maybe_unused inv_mpu_resume(struct device *dev)
   1659{
   1660	struct iio_dev *indio_dev = dev_get_drvdata(dev);
   1661	struct inv_mpu6050_state *st = iio_priv(indio_dev);
   1662	int result;
   1663
   1664	mutex_lock(&st->lock);
   1665	result = inv_mpu_core_enable_regulator_vddio(st);
   1666	if (result)
   1667		goto out_unlock;
   1668
   1669	result = inv_mpu6050_set_power_itg(st, true);
   1670	if (result)
   1671		goto out_unlock;
   1672
   1673	pm_runtime_disable(dev);
   1674	pm_runtime_set_active(dev);
   1675	pm_runtime_enable(dev);
   1676
   1677	result = inv_mpu6050_switch_engine(st, true, st->suspended_sensors);
   1678	if (result)
   1679		goto out_unlock;
   1680
   1681	if (iio_buffer_enabled(indio_dev))
   1682		result = inv_mpu6050_prepare_fifo(st, true);
   1683
   1684out_unlock:
   1685	mutex_unlock(&st->lock);
   1686
   1687	return result;
   1688}
   1689
   1690static int __maybe_unused inv_mpu_suspend(struct device *dev)
   1691{
   1692	struct iio_dev *indio_dev = dev_get_drvdata(dev);
   1693	struct inv_mpu6050_state *st = iio_priv(indio_dev);
   1694	int result;
   1695
   1696	mutex_lock(&st->lock);
   1697
   1698	st->suspended_sensors = 0;
   1699	if (pm_runtime_suspended(dev)) {
   1700		result = 0;
   1701		goto out_unlock;
   1702	}
   1703
   1704	if (iio_buffer_enabled(indio_dev)) {
   1705		result = inv_mpu6050_prepare_fifo(st, false);
   1706		if (result)
   1707			goto out_unlock;
   1708	}
   1709
   1710	if (st->chip_config.accl_en)
   1711		st->suspended_sensors |= INV_MPU6050_SENSOR_ACCL;
   1712	if (st->chip_config.gyro_en)
   1713		st->suspended_sensors |= INV_MPU6050_SENSOR_GYRO;
   1714	if (st->chip_config.temp_en)
   1715		st->suspended_sensors |= INV_MPU6050_SENSOR_TEMP;
   1716	if (st->chip_config.magn_en)
   1717		st->suspended_sensors |= INV_MPU6050_SENSOR_MAGN;
   1718	result = inv_mpu6050_switch_engine(st, false, st->suspended_sensors);
   1719	if (result)
   1720		goto out_unlock;
   1721
   1722	result = inv_mpu6050_set_power_itg(st, false);
   1723	if (result)
   1724		goto out_unlock;
   1725
   1726	inv_mpu_core_disable_regulator_vddio(st);
   1727out_unlock:
   1728	mutex_unlock(&st->lock);
   1729
   1730	return result;
   1731}
   1732
   1733static int __maybe_unused inv_mpu_runtime_suspend(struct device *dev)
   1734{
   1735	struct inv_mpu6050_state *st = iio_priv(dev_get_drvdata(dev));
   1736	unsigned int sensors;
   1737	int ret;
   1738
   1739	mutex_lock(&st->lock);
   1740
   1741	sensors = INV_MPU6050_SENSOR_ACCL | INV_MPU6050_SENSOR_GYRO |
   1742			INV_MPU6050_SENSOR_TEMP | INV_MPU6050_SENSOR_MAGN;
   1743	ret = inv_mpu6050_switch_engine(st, false, sensors);
   1744	if (ret)
   1745		goto out_unlock;
   1746
   1747	ret = inv_mpu6050_set_power_itg(st, false);
   1748	if (ret)
   1749		goto out_unlock;
   1750
   1751	inv_mpu_core_disable_regulator_vddio(st);
   1752
   1753out_unlock:
   1754	mutex_unlock(&st->lock);
   1755	return ret;
   1756}
   1757
   1758static int __maybe_unused inv_mpu_runtime_resume(struct device *dev)
   1759{
   1760	struct inv_mpu6050_state *st = iio_priv(dev_get_drvdata(dev));
   1761	int ret;
   1762
   1763	ret = inv_mpu_core_enable_regulator_vddio(st);
   1764	if (ret)
   1765		return ret;
   1766
   1767	return inv_mpu6050_set_power_itg(st, true);
   1768}
   1769
   1770const struct dev_pm_ops inv_mpu_pmops = {
   1771	SET_SYSTEM_SLEEP_PM_OPS(inv_mpu_suspend, inv_mpu_resume)
   1772	SET_RUNTIME_PM_OPS(inv_mpu_runtime_suspend, inv_mpu_runtime_resume, NULL)
   1773};
   1774EXPORT_SYMBOL_GPL(inv_mpu_pmops);
   1775
   1776MODULE_AUTHOR("Invensense Corporation");
   1777MODULE_DESCRIPTION("Invensense device MPU6050 driver");
   1778MODULE_LICENSE("GPL");