brintos

brintos / linux-shallow public Read only

0
0
Text · 13.7 KiB · a32a773 Raw
555 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Sensortek STK8BA50 3-Axis Accelerometer4 *5 * Copyright (c) 2015, Intel Corporation.6 *7 * STK8BA50 7-bit I2C address: 0x18.8 */9 10#include <linux/i2c.h>11#include <linux/interrupt.h>12#include <linux/kernel.h>13#include <linux/module.h>14#include <linux/mod_devicetable.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			0x0223#define STK8BA50_REG_YOUT			0x0424#define STK8BA50_REG_ZOUT			0x0625#define STK8BA50_REG_RANGE			0x0F26#define STK8BA50_REG_BWSEL			0x1027#define STK8BA50_REG_POWMODE			0x1128#define STK8BA50_REG_SWRST			0x1429#define STK8BA50_REG_INTEN2			0x1730#define STK8BA50_REG_INTMAP2			0x1A31 32#define STK8BA50_MODE_NORMAL			033#define STK8BA50_MODE_SUSPEND			134#define STK8BA50_MODE_POWERBIT			BIT(7)35#define STK8BA50_DATA_SHIFT			636#define STK8BA50_RESET_CMD			0xB637#define STK8BA50_SR_1792HZ_IDX			738#define STK8BA50_DREADY_INT_MASK		0x1039#define STK8BA50_DREADY_INT_MAP			0x8140#define STK8BA50_ALL_CHANNEL_MASK		741#define STK8BA50_ALL_CHANNEL_SIZE		642 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; +/-16g51 *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.038456 * scale2 = (4 + 4) * 9.81 / (2^10 - 1)   = 0.076757 * 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_ZOUT85};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_attributes138};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	else165		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	else171		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	else193		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_table241				[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		else278			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		else297			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		iio_for_each_active_channel(indio_dev, bit) {334			ret = stk8ba50_read_accel(data,335						  stk8ba50_channel_table[bit]);336			if (ret < 0)337				goto err;338 339			data->scan.chans[i++] = ret;340		}341	}342	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,343					   pf->timestamp);344err:345	mutex_unlock(&data->lock);346	iio_trigger_notify_done(indio_dev->trig);347 348	return IRQ_HANDLED;349}350 351static irqreturn_t stk8ba50_data_rdy_trig_poll(int irq, void *private)352{353	struct iio_dev *indio_dev = private;354	struct stk8ba50_data *data = iio_priv(indio_dev);355 356	if (data->dready_trigger_on)357		iio_trigger_poll(data->dready_trig);358 359	return IRQ_HANDLED;360}361 362static int stk8ba50_buffer_preenable(struct iio_dev *indio_dev)363{364	struct stk8ba50_data *data = iio_priv(indio_dev);365 366	return stk8ba50_set_power(data, STK8BA50_MODE_NORMAL);367}368 369static int stk8ba50_buffer_postdisable(struct iio_dev *indio_dev)370{371	struct stk8ba50_data *data = iio_priv(indio_dev);372 373	return stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);374}375 376static const struct iio_buffer_setup_ops stk8ba50_buffer_setup_ops = {377	.preenable   = stk8ba50_buffer_preenable,378	.postdisable = stk8ba50_buffer_postdisable,379};380 381static int stk8ba50_probe(struct i2c_client *client)382{383	int ret;384	struct iio_dev *indio_dev;385	struct stk8ba50_data *data;386 387	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));388	if (!indio_dev) {389		dev_err(&client->dev, "iio allocation failed!\n");390		return -ENOMEM;391	}392 393	data = iio_priv(indio_dev);394	data->client = client;395	i2c_set_clientdata(client, indio_dev);396	mutex_init(&data->lock);397 398	indio_dev->info = &stk8ba50_info;399	indio_dev->name = STK8BA50_DRIVER_NAME;400	indio_dev->modes = INDIO_DIRECT_MODE;401	indio_dev->channels = stk8ba50_channels;402	indio_dev->num_channels = ARRAY_SIZE(stk8ba50_channels);403 404	/* Reset all registers on startup */405	ret = i2c_smbus_write_byte_data(client,406			STK8BA50_REG_SWRST, STK8BA50_RESET_CMD);407	if (ret < 0) {408		dev_err(&client->dev, "failed to reset sensor\n");409		goto err_power_off;410	}411 412	/* The default range is +/-2g */413	data->range = 0;414 415	/* The default sampling rate is 1792 Hz (maximum) */416	data->sample_rate_idx = STK8BA50_SR_1792HZ_IDX;417 418	/* Set up interrupts */419	ret = i2c_smbus_write_byte_data(client,420			STK8BA50_REG_INTEN2, STK8BA50_DREADY_INT_MASK);421	if (ret < 0) {422		dev_err(&client->dev, "failed to set up interrupts\n");423		goto err_power_off;424	}425	ret = i2c_smbus_write_byte_data(client,426			STK8BA50_REG_INTMAP2, STK8BA50_DREADY_INT_MAP);427	if (ret < 0) {428		dev_err(&client->dev, "failed to set up interrupts\n");429		goto err_power_off;430	}431 432	if (client->irq > 0) {433		ret = devm_request_threaded_irq(&client->dev, client->irq,434						stk8ba50_data_rdy_trig_poll,435						NULL,436						IRQF_TRIGGER_RISING |437						IRQF_ONESHOT,438						STK8BA50_IRQ_NAME,439						indio_dev);440		if (ret < 0) {441			dev_err(&client->dev, "request irq %d failed\n",442				client->irq);443			goto err_power_off;444		}445 446		data->dready_trig = devm_iio_trigger_alloc(&client->dev,447							   "%s-dev%d",448							   indio_dev->name,449							   iio_device_id(indio_dev));450		if (!data->dready_trig) {451			ret = -ENOMEM;452			goto err_power_off;453		}454 455		data->dready_trig->ops = &stk8ba50_trigger_ops;456		iio_trigger_set_drvdata(data->dready_trig, indio_dev);457		ret = iio_trigger_register(data->dready_trig);458		if (ret) {459			dev_err(&client->dev, "iio trigger register failed\n");460			goto err_power_off;461		}462	}463 464	ret = iio_triggered_buffer_setup(indio_dev,465					 iio_pollfunc_store_time,466					 stk8ba50_trigger_handler,467					 &stk8ba50_buffer_setup_ops);468	if (ret < 0) {469		dev_err(&client->dev, "iio triggered buffer setup failed\n");470		goto err_trigger_unregister;471	}472 473	ret = iio_device_register(indio_dev);474	if (ret < 0) {475		dev_err(&client->dev, "device_register failed\n");476		goto err_buffer_cleanup;477	}478 479	return ret;480 481err_buffer_cleanup:482	iio_triggered_buffer_cleanup(indio_dev);483err_trigger_unregister:484	if (data->dready_trig)485		iio_trigger_unregister(data->dready_trig);486err_power_off:487	stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);488	return ret;489}490 491static void stk8ba50_remove(struct i2c_client *client)492{493	struct iio_dev *indio_dev = i2c_get_clientdata(client);494	struct stk8ba50_data *data = iio_priv(indio_dev);495 496	iio_device_unregister(indio_dev);497	iio_triggered_buffer_cleanup(indio_dev);498 499	if (data->dready_trig)500		iio_trigger_unregister(data->dready_trig);501 502	stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);503}504 505static int stk8ba50_suspend(struct device *dev)506{507	struct stk8ba50_data *data;508 509	data = iio_priv(i2c_get_clientdata(to_i2c_client(dev)));510 511	return stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);512}513 514static int stk8ba50_resume(struct device *dev)515{516	struct stk8ba50_data *data;517 518	data = iio_priv(i2c_get_clientdata(to_i2c_client(dev)));519 520	return stk8ba50_set_power(data, STK8BA50_MODE_NORMAL);521}522 523static DEFINE_SIMPLE_DEV_PM_OPS(stk8ba50_pm_ops, stk8ba50_suspend,524				stk8ba50_resume);525 526static const struct i2c_device_id stk8ba50_i2c_id[] = {527	{ "stk8ba50" },528	{}529};530MODULE_DEVICE_TABLE(i2c, stk8ba50_i2c_id);531 532static const struct acpi_device_id stk8ba50_acpi_id[] = {533	{"STK8BA50", 0},534	{}535};536 537MODULE_DEVICE_TABLE(acpi, stk8ba50_acpi_id);538 539static struct i2c_driver stk8ba50_driver = {540	.driver = {541		.name = "stk8ba50",542		.pm = pm_sleep_ptr(&stk8ba50_pm_ops),543		.acpi_match_table = stk8ba50_acpi_id,544	},545	.probe =        stk8ba50_probe,546	.remove =           stk8ba50_remove,547	.id_table =         stk8ba50_i2c_id,548};549 550module_i2c_driver(stk8ba50_driver);551 552MODULE_AUTHOR("Tiberiu Breana <tiberiu.a.breana@intel.com>");553MODULE_DESCRIPTION("STK8BA50 3-Axis Accelerometer driver");554MODULE_LICENSE("GPL v2");555