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

bmg160_core.c (31433B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * BMG160 Gyro Sensor driver
      4 * Copyright (c) 2014, Intel Corporation.
      5 */
      6
      7#include <linux/module.h>
      8#include <linux/interrupt.h>
      9#include <linux/delay.h>
     10#include <linux/slab.h>
     11#include <linux/acpi.h>
     12#include <linux/pm.h>
     13#include <linux/pm_runtime.h>
     14#include <linux/iio/iio.h>
     15#include <linux/iio/sysfs.h>
     16#include <linux/iio/buffer.h>
     17#include <linux/iio/trigger.h>
     18#include <linux/iio/events.h>
     19#include <linux/iio/trigger_consumer.h>
     20#include <linux/iio/triggered_buffer.h>
     21#include <linux/regmap.h>
     22#include <linux/regulator/consumer.h>
     23#include "bmg160.h"
     24
     25#define BMG160_IRQ_NAME		"bmg160_event"
     26
     27#define BMG160_REG_CHIP_ID		0x00
     28#define BMG160_CHIP_ID_VAL		0x0F
     29
     30#define BMG160_REG_PMU_LPW		0x11
     31#define BMG160_MODE_NORMAL		0x00
     32#define BMG160_MODE_DEEP_SUSPEND	0x20
     33#define BMG160_MODE_SUSPEND		0x80
     34
     35#define BMG160_REG_RANGE		0x0F
     36
     37#define BMG160_RANGE_2000DPS		0
     38#define BMG160_RANGE_1000DPS		1
     39#define BMG160_RANGE_500DPS		2
     40#define BMG160_RANGE_250DPS		3
     41#define BMG160_RANGE_125DPS		4
     42
     43#define BMG160_REG_PMU_BW		0x10
     44#define BMG160_NO_FILTER		0
     45#define BMG160_DEF_BW			100
     46#define BMG160_REG_PMU_BW_RES		BIT(7)
     47
     48#define BMG160_GYRO_REG_RESET		0x14
     49#define BMG160_GYRO_RESET_VAL		0xb6
     50
     51#define BMG160_REG_INT_MAP_0		0x17
     52#define BMG160_INT_MAP_0_BIT_ANY	BIT(1)
     53
     54#define BMG160_REG_INT_MAP_1		0x18
     55#define BMG160_INT_MAP_1_BIT_NEW_DATA	BIT(0)
     56
     57#define BMG160_REG_INT_RST_LATCH	0x21
     58#define BMG160_INT_MODE_LATCH_RESET	0x80
     59#define BMG160_INT_MODE_LATCH_INT	0x0F
     60#define BMG160_INT_MODE_NON_LATCH_INT	0x00
     61
     62#define BMG160_REG_INT_EN_0		0x15
     63#define BMG160_DATA_ENABLE_INT		BIT(7)
     64
     65#define BMG160_REG_INT_EN_1		0x16
     66#define BMG160_INT1_BIT_OD		BIT(1)
     67
     68#define BMG160_REG_XOUT_L		0x02
     69#define BMG160_AXIS_TO_REG(axis)	(BMG160_REG_XOUT_L + (axis * 2))
     70
     71#define BMG160_REG_SLOPE_THRES		0x1B
     72#define BMG160_SLOPE_THRES_MASK	0x0F
     73
     74#define BMG160_REG_MOTION_INTR		0x1C
     75#define BMG160_INT_MOTION_X		BIT(0)
     76#define BMG160_INT_MOTION_Y		BIT(1)
     77#define BMG160_INT_MOTION_Z		BIT(2)
     78#define BMG160_ANY_DUR_MASK		0x30
     79#define BMG160_ANY_DUR_SHIFT		4
     80
     81#define BMG160_REG_INT_STATUS_2	0x0B
     82#define BMG160_ANY_MOTION_MASK		0x07
     83#define BMG160_ANY_MOTION_BIT_X		BIT(0)
     84#define BMG160_ANY_MOTION_BIT_Y		BIT(1)
     85#define BMG160_ANY_MOTION_BIT_Z		BIT(2)
     86
     87#define BMG160_REG_TEMP		0x08
     88#define BMG160_TEMP_CENTER_VAL		23
     89
     90#define BMG160_MAX_STARTUP_TIME_MS	80
     91
     92#define BMG160_AUTO_SUSPEND_DELAY_MS	2000
     93
     94struct bmg160_data {
     95	struct regmap *regmap;
     96	struct regulator_bulk_data regulators[2];
     97	struct iio_trigger *dready_trig;
     98	struct iio_trigger *motion_trig;
     99	struct iio_mount_matrix orientation;
    100	struct mutex mutex;
    101	/* Ensure naturally aligned timestamp */
    102	struct {
    103		s16 chans[3];
    104		s64 timestamp __aligned(8);
    105	} scan;
    106	u32 dps_range;
    107	int ev_enable_state;
    108	int slope_thres;
    109	bool dready_trigger_on;
    110	bool motion_trigger_on;
    111	int irq;
    112};
    113
    114enum bmg160_axis {
    115	AXIS_X,
    116	AXIS_Y,
    117	AXIS_Z,
    118	AXIS_MAX,
    119};
    120
    121static const struct {
    122	int odr;
    123	int filter;
    124	int bw_bits;
    125} bmg160_samp_freq_table[] = { {100, 32, 0x07},
    126			       {200, 64, 0x06},
    127			       {100, 12, 0x05},
    128			       {200, 23, 0x04},
    129			       {400, 47, 0x03},
    130			       {1000, 116, 0x02},
    131			       {2000, 230, 0x01} };
    132
    133static const struct {
    134	int scale;
    135	int dps_range;
    136} bmg160_scale_table[] = { { 1065, BMG160_RANGE_2000DPS},
    137			   { 532, BMG160_RANGE_1000DPS},
    138			   { 266, BMG160_RANGE_500DPS},
    139			   { 133, BMG160_RANGE_250DPS},
    140			   { 66, BMG160_RANGE_125DPS} };
    141
    142static int bmg160_set_mode(struct bmg160_data *data, u8 mode)
    143{
    144	struct device *dev = regmap_get_device(data->regmap);
    145	int ret;
    146
    147	ret = regmap_write(data->regmap, BMG160_REG_PMU_LPW, mode);
    148	if (ret < 0) {
    149		dev_err(dev, "Error writing reg_pmu_lpw\n");
    150		return ret;
    151	}
    152
    153	return 0;
    154}
    155
    156static int bmg160_convert_freq_to_bit(int val)
    157{
    158	int i;
    159
    160	for (i = 0; i < ARRAY_SIZE(bmg160_samp_freq_table); ++i) {
    161		if (bmg160_samp_freq_table[i].odr == val)
    162			return bmg160_samp_freq_table[i].bw_bits;
    163	}
    164
    165	return -EINVAL;
    166}
    167
    168static int bmg160_set_bw(struct bmg160_data *data, int val)
    169{
    170	struct device *dev = regmap_get_device(data->regmap);
    171	int ret;
    172	int bw_bits;
    173
    174	bw_bits = bmg160_convert_freq_to_bit(val);
    175	if (bw_bits < 0)
    176		return bw_bits;
    177
    178	ret = regmap_write(data->regmap, BMG160_REG_PMU_BW, bw_bits);
    179	if (ret < 0) {
    180		dev_err(dev, "Error writing reg_pmu_bw\n");
    181		return ret;
    182	}
    183
    184	return 0;
    185}
    186
    187static int bmg160_get_filter(struct bmg160_data *data, int *val)
    188{
    189	struct device *dev = regmap_get_device(data->regmap);
    190	int ret;
    191	int i;
    192	unsigned int bw_bits;
    193
    194	ret = regmap_read(data->regmap, BMG160_REG_PMU_BW, &bw_bits);
    195	if (ret < 0) {
    196		dev_err(dev, "Error reading reg_pmu_bw\n");
    197		return ret;
    198	}
    199
    200	/* Ignore the readonly reserved bit. */
    201	bw_bits &= ~BMG160_REG_PMU_BW_RES;
    202
    203	for (i = 0; i < ARRAY_SIZE(bmg160_samp_freq_table); ++i) {
    204		if (bmg160_samp_freq_table[i].bw_bits == bw_bits)
    205			break;
    206	}
    207
    208	*val = bmg160_samp_freq_table[i].filter;
    209
    210	return ret ? ret : IIO_VAL_INT;
    211}
    212
    213
    214static int bmg160_set_filter(struct bmg160_data *data, int val)
    215{
    216	struct device *dev = regmap_get_device(data->regmap);
    217	int ret;
    218	int i;
    219
    220	for (i = 0; i < ARRAY_SIZE(bmg160_samp_freq_table); ++i) {
    221		if (bmg160_samp_freq_table[i].filter == val)
    222			break;
    223	}
    224
    225	ret = regmap_write(data->regmap, BMG160_REG_PMU_BW,
    226			   bmg160_samp_freq_table[i].bw_bits);
    227	if (ret < 0) {
    228		dev_err(dev, "Error writing reg_pmu_bw\n");
    229		return ret;
    230	}
    231
    232	return 0;
    233}
    234
    235static int bmg160_chip_init(struct bmg160_data *data)
    236{
    237	struct device *dev = regmap_get_device(data->regmap);
    238	int ret;
    239	unsigned int val;
    240
    241	/*
    242	 * Reset chip to get it in a known good state. A delay of 30ms after
    243	 * reset is required according to the datasheet.
    244	 */
    245	regmap_write(data->regmap, BMG160_GYRO_REG_RESET,
    246		     BMG160_GYRO_RESET_VAL);
    247	usleep_range(30000, 30700);
    248
    249	ret = regmap_read(data->regmap, BMG160_REG_CHIP_ID, &val);
    250	if (ret < 0) {
    251		dev_err(dev, "Error reading reg_chip_id\n");
    252		return ret;
    253	}
    254
    255	dev_dbg(dev, "Chip Id %x\n", val);
    256	if (val != BMG160_CHIP_ID_VAL) {
    257		dev_err(dev, "invalid chip %x\n", val);
    258		return -ENODEV;
    259	}
    260
    261	ret = bmg160_set_mode(data, BMG160_MODE_NORMAL);
    262	if (ret < 0)
    263		return ret;
    264
    265	/* Wait upto 500 ms to be ready after changing mode */
    266	usleep_range(500, 1000);
    267
    268	/* Set Bandwidth */
    269	ret = bmg160_set_bw(data, BMG160_DEF_BW);
    270	if (ret < 0)
    271		return ret;
    272
    273	/* Set Default Range */
    274	ret = regmap_write(data->regmap, BMG160_REG_RANGE, BMG160_RANGE_500DPS);
    275	if (ret < 0) {
    276		dev_err(dev, "Error writing reg_range\n");
    277		return ret;
    278	}
    279	data->dps_range = BMG160_RANGE_500DPS;
    280
    281	ret = regmap_read(data->regmap, BMG160_REG_SLOPE_THRES, &val);
    282	if (ret < 0) {
    283		dev_err(dev, "Error reading reg_slope_thres\n");
    284		return ret;
    285	}
    286	data->slope_thres = val;
    287
    288	/* Set default interrupt mode */
    289	ret = regmap_update_bits(data->regmap, BMG160_REG_INT_EN_1,
    290				 BMG160_INT1_BIT_OD, 0);
    291	if (ret < 0) {
    292		dev_err(dev, "Error updating bits in reg_int_en_1\n");
    293		return ret;
    294	}
    295
    296	ret = regmap_write(data->regmap, BMG160_REG_INT_RST_LATCH,
    297			   BMG160_INT_MODE_LATCH_INT |
    298			   BMG160_INT_MODE_LATCH_RESET);
    299	if (ret < 0) {
    300		dev_err(dev,
    301			"Error writing reg_motion_intr\n");
    302		return ret;
    303	}
    304
    305	return 0;
    306}
    307
    308static int bmg160_set_power_state(struct bmg160_data *data, bool on)
    309{
    310#ifdef CONFIG_PM
    311	struct device *dev = regmap_get_device(data->regmap);
    312	int ret;
    313
    314	if (on)
    315		ret = pm_runtime_get_sync(dev);
    316	else {
    317		pm_runtime_mark_last_busy(dev);
    318		ret = pm_runtime_put_autosuspend(dev);
    319	}
    320
    321	if (ret < 0) {
    322		dev_err(dev, "Failed: bmg160_set_power_state for %d\n", on);
    323
    324		if (on)
    325			pm_runtime_put_noidle(dev);
    326
    327		return ret;
    328	}
    329#endif
    330
    331	return 0;
    332}
    333
    334static int bmg160_setup_any_motion_interrupt(struct bmg160_data *data,
    335					     bool status)
    336{
    337	struct device *dev = regmap_get_device(data->regmap);
    338	int ret;
    339
    340	/* Enable/Disable INT_MAP0 mapping */
    341	ret = regmap_update_bits(data->regmap, BMG160_REG_INT_MAP_0,
    342				 BMG160_INT_MAP_0_BIT_ANY,
    343				 (status ? BMG160_INT_MAP_0_BIT_ANY : 0));
    344	if (ret < 0) {
    345		dev_err(dev, "Error updating bits reg_int_map0\n");
    346		return ret;
    347	}
    348
    349	/* Enable/Disable slope interrupts */
    350	if (status) {
    351		/* Update slope thres */
    352		ret = regmap_write(data->regmap, BMG160_REG_SLOPE_THRES,
    353				   data->slope_thres);
    354		if (ret < 0) {
    355			dev_err(dev, "Error writing reg_slope_thres\n");
    356			return ret;
    357		}
    358
    359		ret = regmap_write(data->regmap, BMG160_REG_MOTION_INTR,
    360				   BMG160_INT_MOTION_X | BMG160_INT_MOTION_Y |
    361				   BMG160_INT_MOTION_Z);
    362		if (ret < 0) {
    363			dev_err(dev, "Error writing reg_motion_intr\n");
    364			return ret;
    365		}
    366
    367		/*
    368		 * New data interrupt is always non-latched,
    369		 * which will have higher priority, so no need
    370		 * to set latched mode, we will be flooded anyway with INTR
    371		 */
    372		if (!data->dready_trigger_on) {
    373			ret = regmap_write(data->regmap,
    374					   BMG160_REG_INT_RST_LATCH,
    375					   BMG160_INT_MODE_LATCH_INT |
    376					   BMG160_INT_MODE_LATCH_RESET);
    377			if (ret < 0) {
    378				dev_err(dev, "Error writing reg_rst_latch\n");
    379				return ret;
    380			}
    381		}
    382
    383		ret = regmap_write(data->regmap, BMG160_REG_INT_EN_0,
    384				   BMG160_DATA_ENABLE_INT);
    385
    386	} else {
    387		ret = regmap_write(data->regmap, BMG160_REG_INT_EN_0, 0);
    388	}
    389
    390	if (ret < 0) {
    391		dev_err(dev, "Error writing reg_int_en0\n");
    392		return ret;
    393	}
    394
    395	return 0;
    396}
    397
    398static int bmg160_setup_new_data_interrupt(struct bmg160_data *data,
    399					   bool status)
    400{
    401	struct device *dev = regmap_get_device(data->regmap);
    402	int ret;
    403
    404	/* Enable/Disable INT_MAP1 mapping */
    405	ret = regmap_update_bits(data->regmap, BMG160_REG_INT_MAP_1,
    406				 BMG160_INT_MAP_1_BIT_NEW_DATA,
    407				 (status ? BMG160_INT_MAP_1_BIT_NEW_DATA : 0));
    408	if (ret < 0) {
    409		dev_err(dev, "Error updating bits in reg_int_map1\n");
    410		return ret;
    411	}
    412
    413	if (status) {
    414		ret = regmap_write(data->regmap, BMG160_REG_INT_RST_LATCH,
    415				   BMG160_INT_MODE_NON_LATCH_INT |
    416				   BMG160_INT_MODE_LATCH_RESET);
    417		if (ret < 0) {
    418			dev_err(dev, "Error writing reg_rst_latch\n");
    419			return ret;
    420		}
    421
    422		ret = regmap_write(data->regmap, BMG160_REG_INT_EN_0,
    423				   BMG160_DATA_ENABLE_INT);
    424
    425	} else {
    426		/* Restore interrupt mode */
    427		ret = regmap_write(data->regmap, BMG160_REG_INT_RST_LATCH,
    428				   BMG160_INT_MODE_LATCH_INT |
    429				   BMG160_INT_MODE_LATCH_RESET);
    430		if (ret < 0) {
    431			dev_err(dev, "Error writing reg_rst_latch\n");
    432			return ret;
    433		}
    434
    435		ret = regmap_write(data->regmap, BMG160_REG_INT_EN_0, 0);
    436	}
    437
    438	if (ret < 0) {
    439		dev_err(dev, "Error writing reg_int_en0\n");
    440		return ret;
    441	}
    442
    443	return 0;
    444}
    445
    446static int bmg160_get_bw(struct bmg160_data *data, int *val)
    447{
    448	struct device *dev = regmap_get_device(data->regmap);	
    449	int i;
    450	unsigned int bw_bits;
    451	int ret;
    452
    453	ret = regmap_read(data->regmap, BMG160_REG_PMU_BW, &bw_bits);
    454	if (ret < 0) {
    455		dev_err(dev, "Error reading reg_pmu_bw\n");
    456		return ret;
    457	}
    458
    459	/* Ignore the readonly reserved bit. */
    460	bw_bits &= ~BMG160_REG_PMU_BW_RES;
    461
    462	for (i = 0; i < ARRAY_SIZE(bmg160_samp_freq_table); ++i) {
    463		if (bmg160_samp_freq_table[i].bw_bits == bw_bits) {
    464			*val = bmg160_samp_freq_table[i].odr;
    465			return IIO_VAL_INT;
    466		}
    467	}
    468
    469	return -EINVAL;
    470}
    471
    472static int bmg160_set_scale(struct bmg160_data *data, int val)
    473{
    474	struct device *dev = regmap_get_device(data->regmap);
    475	int ret, i;
    476
    477	for (i = 0; i < ARRAY_SIZE(bmg160_scale_table); ++i) {
    478		if (bmg160_scale_table[i].scale == val) {
    479			ret = regmap_write(data->regmap, BMG160_REG_RANGE,
    480					   bmg160_scale_table[i].dps_range);
    481			if (ret < 0) {
    482				dev_err(dev, "Error writing reg_range\n");
    483				return ret;
    484			}
    485			data->dps_range = bmg160_scale_table[i].dps_range;
    486			return 0;
    487		}
    488	}
    489
    490	return -EINVAL;
    491}
    492
    493static int bmg160_get_temp(struct bmg160_data *data, int *val)
    494{
    495	struct device *dev = regmap_get_device(data->regmap);
    496	int ret;
    497	unsigned int raw_val;
    498
    499	mutex_lock(&data->mutex);
    500	ret = bmg160_set_power_state(data, true);
    501	if (ret < 0) {
    502		mutex_unlock(&data->mutex);
    503		return ret;
    504	}
    505
    506	ret = regmap_read(data->regmap, BMG160_REG_TEMP, &raw_val);
    507	if (ret < 0) {
    508		dev_err(dev, "Error reading reg_temp\n");
    509		bmg160_set_power_state(data, false);
    510		mutex_unlock(&data->mutex);
    511		return ret;
    512	}
    513
    514	*val = sign_extend32(raw_val, 7);
    515	ret = bmg160_set_power_state(data, false);
    516	mutex_unlock(&data->mutex);
    517	if (ret < 0)
    518		return ret;
    519
    520	return IIO_VAL_INT;
    521}
    522
    523static int bmg160_get_axis(struct bmg160_data *data, int axis, int *val)
    524{
    525	struct device *dev = regmap_get_device(data->regmap);
    526	int ret;
    527	__le16 raw_val;
    528
    529	mutex_lock(&data->mutex);
    530	ret = bmg160_set_power_state(data, true);
    531	if (ret < 0) {
    532		mutex_unlock(&data->mutex);
    533		return ret;
    534	}
    535
    536	ret = regmap_bulk_read(data->regmap, BMG160_AXIS_TO_REG(axis), &raw_val,
    537			       sizeof(raw_val));
    538	if (ret < 0) {
    539		dev_err(dev, "Error reading axis %d\n", axis);
    540		bmg160_set_power_state(data, false);
    541		mutex_unlock(&data->mutex);
    542		return ret;
    543	}
    544
    545	*val = sign_extend32(le16_to_cpu(raw_val), 15);
    546	ret = bmg160_set_power_state(data, false);
    547	mutex_unlock(&data->mutex);
    548	if (ret < 0)
    549		return ret;
    550
    551	return IIO_VAL_INT;
    552}
    553
    554static int bmg160_read_raw(struct iio_dev *indio_dev,
    555			   struct iio_chan_spec const *chan,
    556			   int *val, int *val2, long mask)
    557{
    558	struct bmg160_data *data = iio_priv(indio_dev);
    559	int ret;
    560
    561	switch (mask) {
    562	case IIO_CHAN_INFO_RAW:
    563		switch (chan->type) {
    564		case IIO_TEMP:
    565			return bmg160_get_temp(data, val);
    566		case IIO_ANGL_VEL:
    567			if (iio_buffer_enabled(indio_dev))
    568				return -EBUSY;
    569			else
    570				return bmg160_get_axis(data, chan->scan_index,
    571						       val);
    572		default:
    573			return -EINVAL;
    574		}
    575	case IIO_CHAN_INFO_OFFSET:
    576		if (chan->type == IIO_TEMP) {
    577			*val = BMG160_TEMP_CENTER_VAL;
    578			return IIO_VAL_INT;
    579		} else
    580			return -EINVAL;
    581	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
    582		return bmg160_get_filter(data, val);
    583	case IIO_CHAN_INFO_SCALE:
    584		switch (chan->type) {
    585		case IIO_TEMP:
    586			*val = 500;
    587			return IIO_VAL_INT;
    588		case IIO_ANGL_VEL:
    589		{
    590			int i;
    591
    592			for (i = 0; i < ARRAY_SIZE(bmg160_scale_table); ++i) {
    593				if (bmg160_scale_table[i].dps_range ==
    594							data->dps_range) {
    595					*val = 0;
    596					*val2 = bmg160_scale_table[i].scale;
    597					return IIO_VAL_INT_PLUS_MICRO;
    598				}
    599			}
    600			return -EINVAL;
    601		}
    602		default:
    603			return -EINVAL;
    604		}
    605	case IIO_CHAN_INFO_SAMP_FREQ:
    606		*val2 = 0;
    607		mutex_lock(&data->mutex);
    608		ret = bmg160_get_bw(data, val);
    609		mutex_unlock(&data->mutex);
    610		return ret;
    611	default:
    612		return -EINVAL;
    613	}
    614}
    615
    616static int bmg160_write_raw(struct iio_dev *indio_dev,
    617			    struct iio_chan_spec const *chan,
    618			    int val, int val2, long mask)
    619{
    620	struct bmg160_data *data = iio_priv(indio_dev);
    621	int ret;
    622
    623	switch (mask) {
    624	case IIO_CHAN_INFO_SAMP_FREQ:
    625		mutex_lock(&data->mutex);
    626		/*
    627		 * Section 4.2 of spec
    628		 * In suspend mode, the only supported operations are reading
    629		 * registers as well as writing to the (0x14) softreset
    630		 * register. Since we will be in suspend mode by default, change
    631		 * mode to power on for other writes.
    632		 */
    633		ret = bmg160_set_power_state(data, true);
    634		if (ret < 0) {
    635			mutex_unlock(&data->mutex);
    636			return ret;
    637		}
    638		ret = bmg160_set_bw(data, val);
    639		if (ret < 0) {
    640			bmg160_set_power_state(data, false);
    641			mutex_unlock(&data->mutex);
    642			return ret;
    643		}
    644		ret = bmg160_set_power_state(data, false);
    645		mutex_unlock(&data->mutex);
    646		return ret;
    647	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
    648		if (val2)
    649			return -EINVAL;
    650
    651		mutex_lock(&data->mutex);
    652		ret = bmg160_set_power_state(data, true);
    653		if (ret < 0) {
    654			bmg160_set_power_state(data, false);
    655			mutex_unlock(&data->mutex);
    656			return ret;
    657		}
    658		ret = bmg160_set_filter(data, val);
    659		if (ret < 0) {
    660			bmg160_set_power_state(data, false);
    661			mutex_unlock(&data->mutex);
    662			return ret;
    663		}
    664		ret = bmg160_set_power_state(data, false);
    665		mutex_unlock(&data->mutex);
    666		return ret;
    667	case IIO_CHAN_INFO_SCALE:
    668		if (val)
    669			return -EINVAL;
    670
    671		mutex_lock(&data->mutex);
    672		/* Refer to comments above for the suspend mode ops */
    673		ret = bmg160_set_power_state(data, true);
    674		if (ret < 0) {
    675			mutex_unlock(&data->mutex);
    676			return ret;
    677		}
    678		ret = bmg160_set_scale(data, val2);
    679		if (ret < 0) {
    680			bmg160_set_power_state(data, false);
    681			mutex_unlock(&data->mutex);
    682			return ret;
    683		}
    684		ret = bmg160_set_power_state(data, false);
    685		mutex_unlock(&data->mutex);
    686		return ret;
    687	default:
    688		return -EINVAL;
    689	}
    690
    691	return -EINVAL;
    692}
    693
    694static int bmg160_read_event(struct iio_dev *indio_dev,
    695			     const struct iio_chan_spec *chan,
    696			     enum iio_event_type type,
    697			     enum iio_event_direction dir,
    698			     enum iio_event_info info,
    699			     int *val, int *val2)
    700{
    701	struct bmg160_data *data = iio_priv(indio_dev);
    702
    703	*val2 = 0;
    704	switch (info) {
    705	case IIO_EV_INFO_VALUE:
    706		*val = data->slope_thres & BMG160_SLOPE_THRES_MASK;
    707		break;
    708	default:
    709		return -EINVAL;
    710	}
    711
    712	return IIO_VAL_INT;
    713}
    714
    715static int bmg160_write_event(struct iio_dev *indio_dev,
    716			      const struct iio_chan_spec *chan,
    717			      enum iio_event_type type,
    718			      enum iio_event_direction dir,
    719			      enum iio_event_info info,
    720			      int val, int val2)
    721{
    722	struct bmg160_data *data = iio_priv(indio_dev);
    723
    724	switch (info) {
    725	case IIO_EV_INFO_VALUE:
    726		if (data->ev_enable_state)
    727			return -EBUSY;
    728		data->slope_thres &= ~BMG160_SLOPE_THRES_MASK;
    729		data->slope_thres |= (val & BMG160_SLOPE_THRES_MASK);
    730		break;
    731	default:
    732		return -EINVAL;
    733	}
    734
    735	return 0;
    736}
    737
    738static int bmg160_read_event_config(struct iio_dev *indio_dev,
    739				    const struct iio_chan_spec *chan,
    740				    enum iio_event_type type,
    741				    enum iio_event_direction dir)
    742{
    743
    744	struct bmg160_data *data = iio_priv(indio_dev);
    745
    746	return data->ev_enable_state;
    747}
    748
    749static int bmg160_write_event_config(struct iio_dev *indio_dev,
    750				     const struct iio_chan_spec *chan,
    751				     enum iio_event_type type,
    752				     enum iio_event_direction dir,
    753				     int state)
    754{
    755	struct bmg160_data *data = iio_priv(indio_dev);
    756	int ret;
    757
    758	if (state && data->ev_enable_state)
    759		return 0;
    760
    761	mutex_lock(&data->mutex);
    762
    763	if (!state && data->motion_trigger_on) {
    764		data->ev_enable_state = 0;
    765		mutex_unlock(&data->mutex);
    766		return 0;
    767	}
    768	/*
    769	 * We will expect the enable and disable to do operation in
    770	 * in reverse order. This will happen here anyway as our
    771	 * resume operation uses sync mode runtime pm calls, the
    772	 * suspend operation will be delayed by autosuspend delay
    773	 * So the disable operation will still happen in reverse of
    774	 * enable operation. When runtime pm is disabled the mode
    775	 * is always on so sequence doesn't matter
    776	 */
    777	ret = bmg160_set_power_state(data, state);
    778	if (ret < 0) {
    779		mutex_unlock(&data->mutex);
    780		return ret;
    781	}
    782
    783	ret =  bmg160_setup_any_motion_interrupt(data, state);
    784	if (ret < 0) {
    785		bmg160_set_power_state(data, false);
    786		mutex_unlock(&data->mutex);
    787		return ret;
    788	}
    789
    790	data->ev_enable_state = state;
    791	mutex_unlock(&data->mutex);
    792
    793	return 0;
    794}
    795
    796static const struct iio_mount_matrix *
    797bmg160_get_mount_matrix(const struct iio_dev *indio_dev,
    798			 const struct iio_chan_spec *chan)
    799{
    800	struct bmg160_data *data = iio_priv(indio_dev);
    801
    802	return &data->orientation;
    803}
    804
    805static const struct iio_chan_spec_ext_info bmg160_ext_info[] = {
    806	IIO_MOUNT_MATRIX(IIO_SHARED_BY_DIR, bmg160_get_mount_matrix),
    807	{ }
    808};
    809
    810static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("100 200 400 1000 2000");
    811
    812static IIO_CONST_ATTR(in_anglvel_scale_available,
    813		      "0.001065 0.000532 0.000266 0.000133 0.000066");
    814
    815static struct attribute *bmg160_attributes[] = {
    816	&iio_const_attr_sampling_frequency_available.dev_attr.attr,
    817	&iio_const_attr_in_anglvel_scale_available.dev_attr.attr,
    818	NULL,
    819};
    820
    821static const struct attribute_group bmg160_attrs_group = {
    822	.attrs = bmg160_attributes,
    823};
    824
    825static const struct iio_event_spec bmg160_event = {
    826		.type = IIO_EV_TYPE_ROC,
    827		.dir = IIO_EV_DIR_EITHER,
    828		.mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
    829				       BIT(IIO_EV_INFO_ENABLE)
    830};
    831
    832#define BMG160_CHANNEL(_axis) {					\
    833	.type = IIO_ANGL_VEL,						\
    834	.modified = 1,							\
    835	.channel2 = IIO_MOD_##_axis,					\
    836	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),			\
    837	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |		\
    838		BIT(IIO_CHAN_INFO_SAMP_FREQ) |				\
    839		BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY),	\
    840	.scan_index = AXIS_##_axis,					\
    841	.scan_type = {							\
    842		.sign = 's',						\
    843		.realbits = 16,					\
    844		.storagebits = 16,					\
    845		.endianness = IIO_LE,					\
    846	},								\
    847	.ext_info = bmg160_ext_info,					\
    848	.event_spec = &bmg160_event,					\
    849	.num_event_specs = 1						\
    850}
    851
    852static const struct iio_chan_spec bmg160_channels[] = {
    853	{
    854		.type = IIO_TEMP,
    855		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
    856				      BIT(IIO_CHAN_INFO_SCALE) |
    857				      BIT(IIO_CHAN_INFO_OFFSET),
    858		.scan_index = -1,
    859	},
    860	BMG160_CHANNEL(X),
    861	BMG160_CHANNEL(Y),
    862	BMG160_CHANNEL(Z),
    863	IIO_CHAN_SOFT_TIMESTAMP(3),
    864};
    865
    866static const struct iio_info bmg160_info = {
    867	.attrs			= &bmg160_attrs_group,
    868	.read_raw		= bmg160_read_raw,
    869	.write_raw		= bmg160_write_raw,
    870	.read_event_value	= bmg160_read_event,
    871	.write_event_value	= bmg160_write_event,
    872	.write_event_config	= bmg160_write_event_config,
    873	.read_event_config	= bmg160_read_event_config,
    874};
    875
    876static const unsigned long bmg160_accel_scan_masks[] = {
    877					BIT(AXIS_X) | BIT(AXIS_Y) | BIT(AXIS_Z),
    878					0};
    879
    880static irqreturn_t bmg160_trigger_handler(int irq, void *p)
    881{
    882	struct iio_poll_func *pf = p;
    883	struct iio_dev *indio_dev = pf->indio_dev;
    884	struct bmg160_data *data = iio_priv(indio_dev);
    885	int ret;
    886
    887	mutex_lock(&data->mutex);
    888	ret = regmap_bulk_read(data->regmap, BMG160_REG_XOUT_L,
    889			       data->scan.chans, AXIS_MAX * 2);
    890	mutex_unlock(&data->mutex);
    891	if (ret < 0)
    892		goto err;
    893
    894	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
    895					   pf->timestamp);
    896err:
    897	iio_trigger_notify_done(indio_dev->trig);
    898
    899	return IRQ_HANDLED;
    900}
    901
    902static void bmg160_trig_reen(struct iio_trigger *trig)
    903{
    904	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
    905	struct bmg160_data *data = iio_priv(indio_dev);
    906	struct device *dev = regmap_get_device(data->regmap);
    907	int ret;
    908
    909	/* new data interrupts don't need ack */
    910	if (data->dready_trigger_on)
    911		return;
    912
    913	/* Set latched mode interrupt and clear any latched interrupt */
    914	ret = regmap_write(data->regmap, BMG160_REG_INT_RST_LATCH,
    915			   BMG160_INT_MODE_LATCH_INT |
    916			   BMG160_INT_MODE_LATCH_RESET);
    917	if (ret < 0)
    918		dev_err(dev, "Error writing reg_rst_latch\n");
    919}
    920
    921static int bmg160_data_rdy_trigger_set_state(struct iio_trigger *trig,
    922					     bool state)
    923{
    924	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
    925	struct bmg160_data *data = iio_priv(indio_dev);
    926	int ret;
    927
    928	mutex_lock(&data->mutex);
    929
    930	if (!state && data->ev_enable_state && data->motion_trigger_on) {
    931		data->motion_trigger_on = false;
    932		mutex_unlock(&data->mutex);
    933		return 0;
    934	}
    935
    936	/*
    937	 * Refer to comment in bmg160_write_event_config for
    938	 * enable/disable operation order
    939	 */
    940	ret = bmg160_set_power_state(data, state);
    941	if (ret < 0) {
    942		mutex_unlock(&data->mutex);
    943		return ret;
    944	}
    945	if (data->motion_trig == trig)
    946		ret =  bmg160_setup_any_motion_interrupt(data, state);
    947	else
    948		ret = bmg160_setup_new_data_interrupt(data, state);
    949	if (ret < 0) {
    950		bmg160_set_power_state(data, false);
    951		mutex_unlock(&data->mutex);
    952		return ret;
    953	}
    954	if (data->motion_trig == trig)
    955		data->motion_trigger_on = state;
    956	else
    957		data->dready_trigger_on = state;
    958
    959	mutex_unlock(&data->mutex);
    960
    961	return 0;
    962}
    963
    964static const struct iio_trigger_ops bmg160_trigger_ops = {
    965	.set_trigger_state = bmg160_data_rdy_trigger_set_state,
    966	.reenable = bmg160_trig_reen,
    967};
    968
    969static irqreturn_t bmg160_event_handler(int irq, void *private)
    970{
    971	struct iio_dev *indio_dev = private;
    972	struct bmg160_data *data = iio_priv(indio_dev);
    973	struct device *dev = regmap_get_device(data->regmap);
    974	int ret;
    975	int dir;
    976	unsigned int val;
    977
    978	ret = regmap_read(data->regmap, BMG160_REG_INT_STATUS_2, &val);
    979	if (ret < 0) {
    980		dev_err(dev, "Error reading reg_int_status2\n");
    981		goto ack_intr_status;
    982	}
    983
    984	if (val & 0x08)
    985		dir = IIO_EV_DIR_RISING;
    986	else
    987		dir = IIO_EV_DIR_FALLING;
    988
    989	if (val & BMG160_ANY_MOTION_BIT_X)
    990		iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL,
    991							     0,
    992							     IIO_MOD_X,
    993							     IIO_EV_TYPE_ROC,
    994							     dir),
    995			       iio_get_time_ns(indio_dev));
    996	if (val & BMG160_ANY_MOTION_BIT_Y)
    997		iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL,
    998							     0,
    999							     IIO_MOD_Y,
   1000							     IIO_EV_TYPE_ROC,
   1001							     dir),
   1002			       iio_get_time_ns(indio_dev));
   1003	if (val & BMG160_ANY_MOTION_BIT_Z)
   1004		iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL,
   1005							     0,
   1006							     IIO_MOD_Z,
   1007							     IIO_EV_TYPE_ROC,
   1008							     dir),
   1009			       iio_get_time_ns(indio_dev));
   1010
   1011ack_intr_status:
   1012	if (!data->dready_trigger_on) {
   1013		ret = regmap_write(data->regmap, BMG160_REG_INT_RST_LATCH,
   1014				   BMG160_INT_MODE_LATCH_INT |
   1015				   BMG160_INT_MODE_LATCH_RESET);
   1016		if (ret < 0)
   1017			dev_err(dev, "Error writing reg_rst_latch\n");
   1018	}
   1019
   1020	return IRQ_HANDLED;
   1021}
   1022
   1023static irqreturn_t bmg160_data_rdy_trig_poll(int irq, void *private)
   1024{
   1025	struct iio_dev *indio_dev = private;
   1026	struct bmg160_data *data = iio_priv(indio_dev);
   1027
   1028	if (data->dready_trigger_on)
   1029		iio_trigger_poll(data->dready_trig);
   1030	else if (data->motion_trigger_on)
   1031		iio_trigger_poll(data->motion_trig);
   1032
   1033	if (data->ev_enable_state)
   1034		return IRQ_WAKE_THREAD;
   1035	else
   1036		return IRQ_HANDLED;
   1037
   1038}
   1039
   1040static int bmg160_buffer_preenable(struct iio_dev *indio_dev)
   1041{
   1042	struct bmg160_data *data = iio_priv(indio_dev);
   1043
   1044	return bmg160_set_power_state(data, true);
   1045}
   1046
   1047static int bmg160_buffer_postdisable(struct iio_dev *indio_dev)
   1048{
   1049	struct bmg160_data *data = iio_priv(indio_dev);
   1050
   1051	return bmg160_set_power_state(data, false);
   1052}
   1053
   1054static const struct iio_buffer_setup_ops bmg160_buffer_setup_ops = {
   1055	.preenable = bmg160_buffer_preenable,
   1056	.postdisable = bmg160_buffer_postdisable,
   1057};
   1058
   1059static const char *bmg160_match_acpi_device(struct device *dev)
   1060{
   1061	const struct acpi_device_id *id;
   1062
   1063	id = acpi_match_device(dev->driver->acpi_match_table, dev);
   1064	if (!id)
   1065		return NULL;
   1066
   1067	return dev_name(dev);
   1068}
   1069
   1070static void bmg160_disable_regulators(void *d)
   1071{
   1072	struct bmg160_data *data = d;
   1073
   1074	regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators);
   1075}
   1076
   1077int bmg160_core_probe(struct device *dev, struct regmap *regmap, int irq,
   1078		      const char *name)
   1079{
   1080	struct bmg160_data *data;
   1081	struct iio_dev *indio_dev;
   1082	int ret;
   1083
   1084	indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
   1085	if (!indio_dev)
   1086		return -ENOMEM;
   1087
   1088	data = iio_priv(indio_dev);
   1089	dev_set_drvdata(dev, indio_dev);
   1090	data->irq = irq;
   1091	data->regmap = regmap;
   1092
   1093	data->regulators[0].supply = "vdd";
   1094	data->regulators[1].supply = "vddio";
   1095	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->regulators),
   1096				      data->regulators);
   1097	if (ret)
   1098		return dev_err_probe(dev, ret, "Failed to get regulators\n");
   1099
   1100	ret = regulator_bulk_enable(ARRAY_SIZE(data->regulators),
   1101				    data->regulators);
   1102	if (ret)
   1103		return ret;
   1104
   1105	ret = devm_add_action_or_reset(dev, bmg160_disable_regulators, data);
   1106	if (ret)
   1107		return ret;
   1108
   1109	ret = iio_read_mount_matrix(dev, &data->orientation);
   1110	if (ret)
   1111		return ret;
   1112
   1113	ret = bmg160_chip_init(data);
   1114	if (ret < 0)
   1115		return ret;
   1116
   1117	mutex_init(&data->mutex);
   1118
   1119	if (ACPI_HANDLE(dev))
   1120		name = bmg160_match_acpi_device(dev);
   1121
   1122	indio_dev->channels = bmg160_channels;
   1123	indio_dev->num_channels = ARRAY_SIZE(bmg160_channels);
   1124	indio_dev->name = name;
   1125	indio_dev->available_scan_masks = bmg160_accel_scan_masks;
   1126	indio_dev->modes = INDIO_DIRECT_MODE;
   1127	indio_dev->info = &bmg160_info;
   1128
   1129	if (data->irq > 0) {
   1130		ret = devm_request_threaded_irq(dev,
   1131						data->irq,
   1132						bmg160_data_rdy_trig_poll,
   1133						bmg160_event_handler,
   1134						IRQF_TRIGGER_RISING,
   1135						BMG160_IRQ_NAME,
   1136						indio_dev);
   1137		if (ret)
   1138			return ret;
   1139
   1140		data->dready_trig = devm_iio_trigger_alloc(dev,
   1141							   "%s-dev%d",
   1142							   indio_dev->name,
   1143							   iio_device_id(indio_dev));
   1144		if (!data->dready_trig)
   1145			return -ENOMEM;
   1146
   1147		data->motion_trig = devm_iio_trigger_alloc(dev,
   1148							  "%s-any-motion-dev%d",
   1149							  indio_dev->name,
   1150							  iio_device_id(indio_dev));
   1151		if (!data->motion_trig)
   1152			return -ENOMEM;
   1153
   1154		data->dready_trig->ops = &bmg160_trigger_ops;
   1155		iio_trigger_set_drvdata(data->dready_trig, indio_dev);
   1156		ret = iio_trigger_register(data->dready_trig);
   1157		if (ret)
   1158			return ret;
   1159
   1160		data->motion_trig->ops = &bmg160_trigger_ops;
   1161		iio_trigger_set_drvdata(data->motion_trig, indio_dev);
   1162		ret = iio_trigger_register(data->motion_trig);
   1163		if (ret) {
   1164			data->motion_trig = NULL;
   1165			goto err_trigger_unregister;
   1166		}
   1167	}
   1168
   1169	ret = iio_triggered_buffer_setup(indio_dev,
   1170					 iio_pollfunc_store_time,
   1171					 bmg160_trigger_handler,
   1172					 &bmg160_buffer_setup_ops);
   1173	if (ret < 0) {
   1174		dev_err(dev,
   1175			"iio triggered buffer setup failed\n");
   1176		goto err_trigger_unregister;
   1177	}
   1178
   1179	ret = pm_runtime_set_active(dev);
   1180	if (ret)
   1181		goto err_buffer_cleanup;
   1182
   1183	pm_runtime_enable(dev);
   1184	pm_runtime_set_autosuspend_delay(dev,
   1185					 BMG160_AUTO_SUSPEND_DELAY_MS);
   1186	pm_runtime_use_autosuspend(dev);
   1187
   1188	ret = iio_device_register(indio_dev);
   1189	if (ret < 0) {
   1190		dev_err(dev, "unable to register iio device\n");
   1191		goto err_pm_cleanup;
   1192	}
   1193
   1194	return 0;
   1195
   1196err_pm_cleanup:
   1197	pm_runtime_dont_use_autosuspend(dev);
   1198	pm_runtime_disable(dev);
   1199err_buffer_cleanup:
   1200	iio_triggered_buffer_cleanup(indio_dev);
   1201err_trigger_unregister:
   1202	if (data->dready_trig)
   1203		iio_trigger_unregister(data->dready_trig);
   1204	if (data->motion_trig)
   1205		iio_trigger_unregister(data->motion_trig);
   1206
   1207	return ret;
   1208}
   1209EXPORT_SYMBOL_GPL(bmg160_core_probe);
   1210
   1211void bmg160_core_remove(struct device *dev)
   1212{
   1213	struct iio_dev *indio_dev = dev_get_drvdata(dev);
   1214	struct bmg160_data *data = iio_priv(indio_dev);
   1215
   1216	iio_device_unregister(indio_dev);
   1217
   1218	pm_runtime_disable(dev);
   1219	pm_runtime_set_suspended(dev);
   1220	pm_runtime_put_noidle(dev);
   1221
   1222	iio_triggered_buffer_cleanup(indio_dev);
   1223
   1224	if (data->dready_trig) {
   1225		iio_trigger_unregister(data->dready_trig);
   1226		iio_trigger_unregister(data->motion_trig);
   1227	}
   1228
   1229	mutex_lock(&data->mutex);
   1230	bmg160_set_mode(data, BMG160_MODE_DEEP_SUSPEND);
   1231	mutex_unlock(&data->mutex);
   1232}
   1233EXPORT_SYMBOL_GPL(bmg160_core_remove);
   1234
   1235#ifdef CONFIG_PM_SLEEP
   1236static int bmg160_suspend(struct device *dev)
   1237{
   1238	struct iio_dev *indio_dev = dev_get_drvdata(dev);
   1239	struct bmg160_data *data = iio_priv(indio_dev);
   1240
   1241	mutex_lock(&data->mutex);
   1242	bmg160_set_mode(data, BMG160_MODE_SUSPEND);
   1243	mutex_unlock(&data->mutex);
   1244
   1245	return 0;
   1246}
   1247
   1248static int bmg160_resume(struct device *dev)
   1249{
   1250	struct iio_dev *indio_dev = dev_get_drvdata(dev);
   1251	struct bmg160_data *data = iio_priv(indio_dev);
   1252
   1253	mutex_lock(&data->mutex);
   1254	if (data->dready_trigger_on || data->motion_trigger_on ||
   1255							data->ev_enable_state)
   1256		bmg160_set_mode(data, BMG160_MODE_NORMAL);
   1257	mutex_unlock(&data->mutex);
   1258
   1259	return 0;
   1260}
   1261#endif
   1262
   1263#ifdef CONFIG_PM
   1264static int bmg160_runtime_suspend(struct device *dev)
   1265{
   1266	struct iio_dev *indio_dev = dev_get_drvdata(dev);
   1267	struct bmg160_data *data = iio_priv(indio_dev);
   1268	int ret;
   1269
   1270	ret = bmg160_set_mode(data, BMG160_MODE_SUSPEND);
   1271	if (ret < 0) {
   1272		dev_err(dev, "set mode failed\n");
   1273		return -EAGAIN;
   1274	}
   1275
   1276	return 0;
   1277}
   1278
   1279static int bmg160_runtime_resume(struct device *dev)
   1280{
   1281	struct iio_dev *indio_dev = dev_get_drvdata(dev);
   1282	struct bmg160_data *data = iio_priv(indio_dev);
   1283	int ret;
   1284
   1285	ret = bmg160_set_mode(data, BMG160_MODE_NORMAL);
   1286	if (ret < 0)
   1287		return ret;
   1288
   1289	msleep_interruptible(BMG160_MAX_STARTUP_TIME_MS);
   1290
   1291	return 0;
   1292}
   1293#endif
   1294
   1295const struct dev_pm_ops bmg160_pm_ops = {
   1296	SET_SYSTEM_SLEEP_PM_OPS(bmg160_suspend, bmg160_resume)
   1297	SET_RUNTIME_PM_OPS(bmg160_runtime_suspend,
   1298			   bmg160_runtime_resume, NULL)
   1299};
   1300EXPORT_SYMBOL_GPL(bmg160_pm_ops);
   1301
   1302MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");
   1303MODULE_LICENSE("GPL v2");
   1304MODULE_DESCRIPTION("BMG160 Gyro driver");