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

stk8ba50.c (14161B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Sensortek STK8BA50 3-Axis Accelerometer
      4 *
      5 * Copyright (c) 2015, Intel Corporation.
      6 *
      7 * STK8BA50 7-bit I2C address: 0x18.
      8 */
      9
     10#include <linux/acpi.h>
     11#include <linux/i2c.h>
     12#include <linux/interrupt.h>
     13#include <linux/kernel.h>
     14#include <linux/module.h>
     15#include <linux/iio/buffer.h>
     16#include <linux/iio/iio.h>
     17#include <linux/iio/sysfs.h>
     18#include <linux/iio/trigger.h>
     19#include <linux/iio/triggered_buffer.h>
     20#include <linux/iio/trigger_consumer.h>
     21
     22#define STK8BA50_REG_XOUT			0x02
     23#define STK8BA50_REG_YOUT			0x04
     24#define STK8BA50_REG_ZOUT			0x06
     25#define STK8BA50_REG_RANGE			0x0F
     26#define STK8BA50_REG_BWSEL			0x10
     27#define STK8BA50_REG_POWMODE			0x11
     28#define STK8BA50_REG_SWRST			0x14
     29#define STK8BA50_REG_INTEN2			0x17
     30#define STK8BA50_REG_INTMAP2			0x1A
     31
     32#define STK8BA50_MODE_NORMAL			0
     33#define STK8BA50_MODE_SUSPEND			1
     34#define STK8BA50_MODE_POWERBIT			BIT(7)
     35#define STK8BA50_DATA_SHIFT			6
     36#define STK8BA50_RESET_CMD			0xB6
     37#define STK8BA50_SR_1792HZ_IDX			7
     38#define STK8BA50_DREADY_INT_MASK		0x10
     39#define STK8BA50_DREADY_INT_MAP			0x81
     40#define STK8BA50_ALL_CHANNEL_MASK		7
     41#define STK8BA50_ALL_CHANNEL_SIZE		6
     42
     43#define STK8BA50_DRIVER_NAME			"stk8ba50"
     44#define STK8BA50_IRQ_NAME			"stk8ba50_event"
     45
     46#define STK8BA50_SCALE_AVAIL			"0.0384 0.0767 0.1534 0.3069"
     47
     48/*
     49 * The accelerometer has four measurement ranges:
     50 * +/-2g; +/-4g; +/-8g; +/-16g
     51 *
     52 * Acceleration values are 10-bit, 2's complement.
     53 * Scales are calculated as following:
     54 *
     55 * scale1 = (2 + 2) * 9.81 / (2^10 - 1)   = 0.0384
     56 * scale2 = (4 + 4) * 9.81 / (2^10 - 1)   = 0.0767
     57 * etc.
     58 *
     59 * Scales are stored in this format:
     60 * { <register value>, <scale value> }
     61 *
     62 * Locally, the range is stored as a table index.
     63 */
     64static const struct {
     65	u8 reg_val;
     66	u32 scale_val;
     67} stk8ba50_scale_table[] = {
     68	{3, 38400}, {5, 76700}, {8, 153400}, {12, 306900}
     69};
     70
     71/* Sample rates are stored as { <register value>, <Hz value> } */
     72static const struct {
     73	u8 reg_val;
     74	u16 samp_freq;
     75} stk8ba50_samp_freq_table[] = {
     76	{0x08, 14},  {0x09, 25},  {0x0A, 56},  {0x0B, 112},
     77	{0x0C, 224}, {0x0D, 448}, {0x0E, 896}, {0x0F, 1792}
     78};
     79
     80/* Used to map scan mask bits to their corresponding channel register. */
     81static const int stk8ba50_channel_table[] = {
     82	STK8BA50_REG_XOUT,
     83	STK8BA50_REG_YOUT,
     84	STK8BA50_REG_ZOUT
     85};
     86
     87struct stk8ba50_data {
     88	struct i2c_client *client;
     89	struct mutex lock;
     90	int range;
     91	u8 sample_rate_idx;
     92	struct iio_trigger *dready_trig;
     93	bool dready_trigger_on;
     94	/* Ensure timestamp is naturally aligned */
     95	struct {
     96		s16 chans[3];
     97		s64 timetamp __aligned(8);
     98	} scan;
     99};
    100
    101#define STK8BA50_ACCEL_CHANNEL(index, reg, axis) {			\
    102	.type = IIO_ACCEL,						\
    103	.address = reg,							\
    104	.modified = 1,							\
    105	.channel2 = IIO_MOD_##axis,					\
    106	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),			\
    107	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),		\
    108				    BIT(IIO_CHAN_INFO_SAMP_FREQ),	\
    109	.scan_index = index,						\
    110	.scan_type = {							\
    111		.sign = 's',						\
    112		.realbits = 10,						\
    113		.storagebits = 16,					\
    114		.shift = STK8BA50_DATA_SHIFT,				\
    115		.endianness = IIO_CPU,					\
    116	},								\
    117}
    118
    119static const struct iio_chan_spec stk8ba50_channels[] = {
    120	STK8BA50_ACCEL_CHANNEL(0, STK8BA50_REG_XOUT, X),
    121	STK8BA50_ACCEL_CHANNEL(1, STK8BA50_REG_YOUT, Y),
    122	STK8BA50_ACCEL_CHANNEL(2, STK8BA50_REG_ZOUT, Z),
    123	IIO_CHAN_SOFT_TIMESTAMP(3),
    124};
    125
    126static IIO_CONST_ATTR(in_accel_scale_available, STK8BA50_SCALE_AVAIL);
    127
    128static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("14 25 56 112 224 448 896 1792");
    129
    130static struct attribute *stk8ba50_attributes[] = {
    131	&iio_const_attr_in_accel_scale_available.dev_attr.attr,
    132	&iio_const_attr_sampling_frequency_available.dev_attr.attr,
    133	NULL,
    134};
    135
    136static const struct attribute_group stk8ba50_attribute_group = {
    137	.attrs = stk8ba50_attributes
    138};
    139
    140static int stk8ba50_read_accel(struct stk8ba50_data *data, u8 reg)
    141{
    142	int ret;
    143	struct i2c_client *client = data->client;
    144
    145	ret = i2c_smbus_read_word_data(client, reg);
    146	if (ret < 0) {
    147		dev_err(&client->dev, "register read failed\n");
    148		return ret;
    149	}
    150
    151	return ret;
    152}
    153
    154static int stk8ba50_data_rdy_trigger_set_state(struct iio_trigger *trig,
    155					       bool state)
    156{
    157	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
    158	struct stk8ba50_data *data = iio_priv(indio_dev);
    159	int ret;
    160
    161	if (state)
    162		ret = i2c_smbus_write_byte_data(data->client,
    163			STK8BA50_REG_INTEN2, STK8BA50_DREADY_INT_MASK);
    164	else
    165		ret = i2c_smbus_write_byte_data(data->client,
    166			STK8BA50_REG_INTEN2, 0x00);
    167
    168	if (ret < 0)
    169		dev_err(&data->client->dev, "failed to set trigger state\n");
    170	else
    171		data->dready_trigger_on = state;
    172
    173	return ret;
    174}
    175
    176static const struct iio_trigger_ops stk8ba50_trigger_ops = {
    177	.set_trigger_state = stk8ba50_data_rdy_trigger_set_state,
    178};
    179
    180static int stk8ba50_set_power(struct stk8ba50_data *data, bool mode)
    181{
    182	int ret;
    183	u8 masked_reg;
    184	struct i2c_client *client = data->client;
    185
    186	ret = i2c_smbus_read_byte_data(client, STK8BA50_REG_POWMODE);
    187	if (ret < 0)
    188		goto exit_err;
    189
    190	if (mode)
    191		masked_reg = ret | STK8BA50_MODE_POWERBIT;
    192	else
    193		masked_reg = ret & (~STK8BA50_MODE_POWERBIT);
    194
    195	ret = i2c_smbus_write_byte_data(client, STK8BA50_REG_POWMODE,
    196					masked_reg);
    197	if (ret < 0)
    198		goto exit_err;
    199
    200	return ret;
    201
    202exit_err:
    203	dev_err(&client->dev, "failed to change sensor mode\n");
    204	return ret;
    205}
    206
    207static int stk8ba50_read_raw(struct iio_dev *indio_dev,
    208			     struct iio_chan_spec const *chan,
    209			     int *val, int *val2, long mask)
    210{
    211	struct stk8ba50_data *data = iio_priv(indio_dev);
    212	int ret;
    213
    214	switch (mask) {
    215	case IIO_CHAN_INFO_RAW:
    216		if (iio_buffer_enabled(indio_dev))
    217			return -EBUSY;
    218		mutex_lock(&data->lock);
    219		ret = stk8ba50_set_power(data, STK8BA50_MODE_NORMAL);
    220		if (ret < 0) {
    221			mutex_unlock(&data->lock);
    222			return -EINVAL;
    223		}
    224		ret = stk8ba50_read_accel(data, chan->address);
    225		if (ret < 0) {
    226			stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
    227			mutex_unlock(&data->lock);
    228			return -EINVAL;
    229		}
    230		*val = sign_extend32(ret >> chan->scan_type.shift,
    231				     chan->scan_type.realbits - 1);
    232		stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
    233		mutex_unlock(&data->lock);
    234		return IIO_VAL_INT;
    235	case IIO_CHAN_INFO_SCALE:
    236		*val = 0;
    237		*val2 = stk8ba50_scale_table[data->range].scale_val;
    238		return IIO_VAL_INT_PLUS_MICRO;
    239	case IIO_CHAN_INFO_SAMP_FREQ:
    240		*val = stk8ba50_samp_freq_table
    241				[data->sample_rate_idx].samp_freq;
    242		*val2 = 0;
    243		return IIO_VAL_INT;
    244	}
    245
    246	return -EINVAL;
    247}
    248
    249static int stk8ba50_write_raw(struct iio_dev *indio_dev,
    250			      struct iio_chan_spec const *chan,
    251			      int val, int val2, long mask)
    252{
    253	int ret;
    254	int i;
    255	int index = -1;
    256	struct stk8ba50_data *data = iio_priv(indio_dev);
    257
    258	switch (mask) {
    259	case IIO_CHAN_INFO_SCALE:
    260		if (val != 0)
    261			return -EINVAL;
    262
    263		for (i = 0; i < ARRAY_SIZE(stk8ba50_scale_table); i++)
    264			if (val2 == stk8ba50_scale_table[i].scale_val) {
    265				index = i;
    266				break;
    267			}
    268		if (index < 0)
    269			return -EINVAL;
    270
    271		ret = i2c_smbus_write_byte_data(data->client,
    272				STK8BA50_REG_RANGE,
    273				stk8ba50_scale_table[index].reg_val);
    274		if (ret < 0)
    275			dev_err(&data->client->dev,
    276					"failed to set measurement range\n");
    277		else
    278			data->range = index;
    279
    280		return ret;
    281	case IIO_CHAN_INFO_SAMP_FREQ:
    282		for (i = 0; i < ARRAY_SIZE(stk8ba50_samp_freq_table); i++)
    283			if (val == stk8ba50_samp_freq_table[i].samp_freq) {
    284				index = i;
    285				break;
    286			}
    287		if (index < 0)
    288			return -EINVAL;
    289
    290		ret = i2c_smbus_write_byte_data(data->client,
    291				STK8BA50_REG_BWSEL,
    292				stk8ba50_samp_freq_table[index].reg_val);
    293		if (ret < 0)
    294			dev_err(&data->client->dev,
    295					"failed to set sampling rate\n");
    296		else
    297			data->sample_rate_idx = index;
    298
    299		return ret;
    300	}
    301
    302	return -EINVAL;
    303}
    304
    305static const struct iio_info stk8ba50_info = {
    306	.read_raw		= stk8ba50_read_raw,
    307	.write_raw		= stk8ba50_write_raw,
    308	.attrs			= &stk8ba50_attribute_group,
    309};
    310
    311static irqreturn_t stk8ba50_trigger_handler(int irq, void *p)
    312{
    313	struct iio_poll_func *pf = p;
    314	struct iio_dev *indio_dev = pf->indio_dev;
    315	struct stk8ba50_data *data = iio_priv(indio_dev);
    316	int bit, ret, i = 0;
    317
    318	mutex_lock(&data->lock);
    319	/*
    320	 * Do a bulk read if all channels are requested,
    321	 * from 0x02 (XOUT1) to 0x07 (ZOUT2)
    322	 */
    323	if (*(indio_dev->active_scan_mask) == STK8BA50_ALL_CHANNEL_MASK) {
    324		ret = i2c_smbus_read_i2c_block_data(data->client,
    325						    STK8BA50_REG_XOUT,
    326						    STK8BA50_ALL_CHANNEL_SIZE,
    327						    (u8 *)data->scan.chans);
    328		if (ret < STK8BA50_ALL_CHANNEL_SIZE) {
    329			dev_err(&data->client->dev, "register read failed\n");
    330			goto err;
    331		}
    332	} else {
    333		for_each_set_bit(bit, indio_dev->active_scan_mask,
    334				 indio_dev->masklength) {
    335			ret = stk8ba50_read_accel(data,
    336						  stk8ba50_channel_table[bit]);
    337			if (ret < 0)
    338				goto err;
    339
    340			data->scan.chans[i++] = ret;
    341		}
    342	}
    343	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
    344					   pf->timestamp);
    345err:
    346	mutex_unlock(&data->lock);
    347	iio_trigger_notify_done(indio_dev->trig);
    348
    349	return IRQ_HANDLED;
    350}
    351
    352static irqreturn_t stk8ba50_data_rdy_trig_poll(int irq, void *private)
    353{
    354	struct iio_dev *indio_dev = private;
    355	struct stk8ba50_data *data = iio_priv(indio_dev);
    356
    357	if (data->dready_trigger_on)
    358		iio_trigger_poll(data->dready_trig);
    359
    360	return IRQ_HANDLED;
    361}
    362
    363static int stk8ba50_buffer_preenable(struct iio_dev *indio_dev)
    364{
    365	struct stk8ba50_data *data = iio_priv(indio_dev);
    366
    367	return stk8ba50_set_power(data, STK8BA50_MODE_NORMAL);
    368}
    369
    370static int stk8ba50_buffer_postdisable(struct iio_dev *indio_dev)
    371{
    372	struct stk8ba50_data *data = iio_priv(indio_dev);
    373
    374	return stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
    375}
    376
    377static const struct iio_buffer_setup_ops stk8ba50_buffer_setup_ops = {
    378	.preenable   = stk8ba50_buffer_preenable,
    379	.postdisable = stk8ba50_buffer_postdisable,
    380};
    381
    382static int stk8ba50_probe(struct i2c_client *client,
    383			  const struct i2c_device_id *id)
    384{
    385	int ret;
    386	struct iio_dev *indio_dev;
    387	struct stk8ba50_data *data;
    388
    389	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
    390	if (!indio_dev) {
    391		dev_err(&client->dev, "iio allocation failed!\n");
    392		return -ENOMEM;
    393	}
    394
    395	data = iio_priv(indio_dev);
    396	data->client = client;
    397	i2c_set_clientdata(client, indio_dev);
    398	mutex_init(&data->lock);
    399
    400	indio_dev->info = &stk8ba50_info;
    401	indio_dev->name = STK8BA50_DRIVER_NAME;
    402	indio_dev->modes = INDIO_DIRECT_MODE;
    403	indio_dev->channels = stk8ba50_channels;
    404	indio_dev->num_channels = ARRAY_SIZE(stk8ba50_channels);
    405
    406	/* Reset all registers on startup */
    407	ret = i2c_smbus_write_byte_data(client,
    408			STK8BA50_REG_SWRST, STK8BA50_RESET_CMD);
    409	if (ret < 0) {
    410		dev_err(&client->dev, "failed to reset sensor\n");
    411		goto err_power_off;
    412	}
    413
    414	/* The default range is +/-2g */
    415	data->range = 0;
    416
    417	/* The default sampling rate is 1792 Hz (maximum) */
    418	data->sample_rate_idx = STK8BA50_SR_1792HZ_IDX;
    419
    420	/* Set up interrupts */
    421	ret = i2c_smbus_write_byte_data(client,
    422			STK8BA50_REG_INTEN2, STK8BA50_DREADY_INT_MASK);
    423	if (ret < 0) {
    424		dev_err(&client->dev, "failed to set up interrupts\n");
    425		goto err_power_off;
    426	}
    427	ret = i2c_smbus_write_byte_data(client,
    428			STK8BA50_REG_INTMAP2, STK8BA50_DREADY_INT_MAP);
    429	if (ret < 0) {
    430		dev_err(&client->dev, "failed to set up interrupts\n");
    431		goto err_power_off;
    432	}
    433
    434	if (client->irq > 0) {
    435		ret = devm_request_threaded_irq(&client->dev, client->irq,
    436						stk8ba50_data_rdy_trig_poll,
    437						NULL,
    438						IRQF_TRIGGER_RISING |
    439						IRQF_ONESHOT,
    440						STK8BA50_IRQ_NAME,
    441						indio_dev);
    442		if (ret < 0) {
    443			dev_err(&client->dev, "request irq %d failed\n",
    444				client->irq);
    445			goto err_power_off;
    446		}
    447
    448		data->dready_trig = devm_iio_trigger_alloc(&client->dev,
    449							   "%s-dev%d",
    450							   indio_dev->name,
    451							   iio_device_id(indio_dev));
    452		if (!data->dready_trig) {
    453			ret = -ENOMEM;
    454			goto err_power_off;
    455		}
    456
    457		data->dready_trig->ops = &stk8ba50_trigger_ops;
    458		iio_trigger_set_drvdata(data->dready_trig, indio_dev);
    459		ret = iio_trigger_register(data->dready_trig);
    460		if (ret) {
    461			dev_err(&client->dev, "iio trigger register failed\n");
    462			goto err_power_off;
    463		}
    464	}
    465
    466	ret = iio_triggered_buffer_setup(indio_dev,
    467					 iio_pollfunc_store_time,
    468					 stk8ba50_trigger_handler,
    469					 &stk8ba50_buffer_setup_ops);
    470	if (ret < 0) {
    471		dev_err(&client->dev, "iio triggered buffer setup failed\n");
    472		goto err_trigger_unregister;
    473	}
    474
    475	ret = iio_device_register(indio_dev);
    476	if (ret < 0) {
    477		dev_err(&client->dev, "device_register failed\n");
    478		goto err_buffer_cleanup;
    479	}
    480
    481	return ret;
    482
    483err_buffer_cleanup:
    484	iio_triggered_buffer_cleanup(indio_dev);
    485err_trigger_unregister:
    486	if (data->dready_trig)
    487		iio_trigger_unregister(data->dready_trig);
    488err_power_off:
    489	stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
    490	return ret;
    491}
    492
    493static int stk8ba50_remove(struct i2c_client *client)
    494{
    495	struct iio_dev *indio_dev = i2c_get_clientdata(client);
    496	struct stk8ba50_data *data = iio_priv(indio_dev);
    497
    498	iio_device_unregister(indio_dev);
    499	iio_triggered_buffer_cleanup(indio_dev);
    500
    501	if (data->dready_trig)
    502		iio_trigger_unregister(data->dready_trig);
    503
    504	return stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
    505}
    506
    507static int stk8ba50_suspend(struct device *dev)
    508{
    509	struct stk8ba50_data *data;
    510
    511	data = iio_priv(i2c_get_clientdata(to_i2c_client(dev)));
    512
    513	return stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
    514}
    515
    516static int stk8ba50_resume(struct device *dev)
    517{
    518	struct stk8ba50_data *data;
    519
    520	data = iio_priv(i2c_get_clientdata(to_i2c_client(dev)));
    521
    522	return stk8ba50_set_power(data, STK8BA50_MODE_NORMAL);
    523}
    524
    525static DEFINE_SIMPLE_DEV_PM_OPS(stk8ba50_pm_ops, stk8ba50_suspend,
    526				stk8ba50_resume);
    527
    528static const struct i2c_device_id stk8ba50_i2c_id[] = {
    529	{"stk8ba50", 0},
    530	{}
    531};
    532MODULE_DEVICE_TABLE(i2c, stk8ba50_i2c_id);
    533
    534static const struct acpi_device_id stk8ba50_acpi_id[] = {
    535	{"STK8BA50", 0},
    536	{}
    537};
    538
    539MODULE_DEVICE_TABLE(acpi, stk8ba50_acpi_id);
    540
    541static struct i2c_driver stk8ba50_driver = {
    542	.driver = {
    543		.name = "stk8ba50",
    544		.pm = pm_sleep_ptr(&stk8ba50_pm_ops),
    545		.acpi_match_table = ACPI_PTR(stk8ba50_acpi_id),
    546	},
    547	.probe =            stk8ba50_probe,
    548	.remove =           stk8ba50_remove,
    549	.id_table =         stk8ba50_i2c_id,
    550};
    551
    552module_i2c_driver(stk8ba50_driver);
    553
    554MODULE_AUTHOR("Tiberiu Breana <tiberiu.a.breana@intel.com>");
    555MODULE_DESCRIPTION("STK8BA50 3-Axis Accelerometer driver");
    556MODULE_LICENSE("GPL v2");