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

mcp3422.c (10313B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * mcp3422.c - driver for the Microchip mcp3421/2/3/4/5/6/7/8 chip family
      4 *
      5 * Copyright (C) 2013, Angelo Compagnucci
      6 * Author: Angelo Compagnucci <angelo.compagnucci@gmail.com>
      7 *
      8 * Datasheet: http://ww1.microchip.com/downloads/en/devicedoc/22088b.pdf
      9 *            https://ww1.microchip.com/downloads/en/DeviceDoc/22226a.pdf
     10 *            https://ww1.microchip.com/downloads/en/DeviceDoc/22072b.pdf
     11 *
     12 * This driver exports the value of analog input voltage to sysfs, the
     13 * voltage unit is nV.
     14 */
     15
     16#include <linux/err.h>
     17#include <linux/i2c.h>
     18#include <linux/module.h>
     19#include <linux/mod_devicetable.h>
     20#include <linux/delay.h>
     21#include <linux/sysfs.h>
     22#include <asm/unaligned.h>
     23
     24#include <linux/iio/iio.h>
     25#include <linux/iio/sysfs.h>
     26
     27/* Masks */
     28#define MCP3422_CHANNEL_MASK	0x60
     29#define MCP3422_PGA_MASK	0x03
     30#define MCP3422_SRATE_MASK	0x0C
     31#define MCP3422_SRATE_240	0x0
     32#define MCP3422_SRATE_60	0x1
     33#define MCP3422_SRATE_15	0x2
     34#define MCP3422_SRATE_3	0x3
     35#define MCP3422_PGA_1	0
     36#define MCP3422_PGA_2	1
     37#define MCP3422_PGA_4	2
     38#define MCP3422_PGA_8	3
     39#define MCP3422_CONT_SAMPLING	0x10
     40
     41#define MCP3422_CHANNEL(config)	(((config) & MCP3422_CHANNEL_MASK) >> 5)
     42#define MCP3422_PGA(config)	((config) & MCP3422_PGA_MASK)
     43#define MCP3422_SAMPLE_RATE(config)	(((config) & MCP3422_SRATE_MASK) >> 2)
     44
     45#define MCP3422_CHANNEL_VALUE(value) (((value) << 5) & MCP3422_CHANNEL_MASK)
     46#define MCP3422_PGA_VALUE(value) ((value) & MCP3422_PGA_MASK)
     47#define MCP3422_SAMPLE_RATE_VALUE(value) ((value << 2) & MCP3422_SRATE_MASK)
     48
     49#define MCP3422_CHAN(_index) \
     50	{ \
     51		.type = IIO_VOLTAGE, \
     52		.indexed = 1, \
     53		.channel = _index, \
     54		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) \
     55				| BIT(IIO_CHAN_INFO_SCALE), \
     56		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
     57	}
     58
     59static const int mcp3422_scales[4][4] = {
     60	{ 1000000, 500000, 250000, 125000 },
     61	{ 250000,  125000, 62500,  31250  },
     62	{ 62500,   31250,  15625,  7812   },
     63	{ 15625,   7812,   3906,   1953   } };
     64
     65/* Constant msleep times for data acquisitions */
     66static const int mcp3422_read_times[4] = {
     67	[MCP3422_SRATE_240] = 1000 / 240,
     68	[MCP3422_SRATE_60] = 1000 / 60,
     69	[MCP3422_SRATE_15] = 1000 / 15,
     70	[MCP3422_SRATE_3] = 1000 / 3 };
     71
     72/* sample rates to integer conversion table */
     73static const int mcp3422_sample_rates[4] = {
     74	[MCP3422_SRATE_240] = 240,
     75	[MCP3422_SRATE_60] = 60,
     76	[MCP3422_SRATE_15] = 15,
     77	[MCP3422_SRATE_3] = 3 };
     78
     79/* sample rates to sign extension table */
     80static const int mcp3422_sign_extend[4] = {
     81	[MCP3422_SRATE_240] = 11,
     82	[MCP3422_SRATE_60] = 13,
     83	[MCP3422_SRATE_15] = 15,
     84	[MCP3422_SRATE_3] = 17 };
     85
     86/* Client data (each client gets its own) */
     87struct mcp3422 {
     88	struct i2c_client *i2c;
     89	u8 id;
     90	u8 config;
     91	u8 pga[4];
     92	struct mutex lock;
     93};
     94
     95static int mcp3422_update_config(struct mcp3422 *adc, u8 newconfig)
     96{
     97	int ret;
     98
     99	ret = i2c_master_send(adc->i2c, &newconfig, 1);
    100	if (ret > 0) {
    101		adc->config = newconfig;
    102		ret = 0;
    103	}
    104
    105	return ret;
    106}
    107
    108static int mcp3422_read(struct mcp3422 *adc, int *value, u8 *config)
    109{
    110	int ret = 0;
    111	u8 sample_rate = MCP3422_SAMPLE_RATE(adc->config);
    112	u8 buf[4] = {0, 0, 0, 0};
    113	u32 temp;
    114
    115	if (sample_rate == MCP3422_SRATE_3) {
    116		ret = i2c_master_recv(adc->i2c, buf, 4);
    117		temp = get_unaligned_be24(&buf[0]);
    118		*config = buf[3];
    119	} else {
    120		ret = i2c_master_recv(adc->i2c, buf, 3);
    121		temp = get_unaligned_be16(&buf[0]);
    122		*config = buf[2];
    123	}
    124
    125	*value = sign_extend32(temp, mcp3422_sign_extend[sample_rate]);
    126
    127	return ret;
    128}
    129
    130static int mcp3422_read_channel(struct mcp3422 *adc,
    131				struct iio_chan_spec const *channel, int *value)
    132{
    133	int ret;
    134	u8 config;
    135	u8 req_channel = channel->channel;
    136
    137	mutex_lock(&adc->lock);
    138
    139	if (req_channel != MCP3422_CHANNEL(adc->config)) {
    140		config = adc->config;
    141		config &= ~MCP3422_CHANNEL_MASK;
    142		config |= MCP3422_CHANNEL_VALUE(req_channel);
    143		config &= ~MCP3422_PGA_MASK;
    144		config |= MCP3422_PGA_VALUE(adc->pga[req_channel]);
    145		ret = mcp3422_update_config(adc, config);
    146		if (ret < 0) {
    147			mutex_unlock(&adc->lock);
    148			return ret;
    149		}
    150		msleep(mcp3422_read_times[MCP3422_SAMPLE_RATE(adc->config)]);
    151	}
    152
    153	ret = mcp3422_read(adc, value, &config);
    154
    155	mutex_unlock(&adc->lock);
    156
    157	return ret;
    158}
    159
    160static int mcp3422_read_raw(struct iio_dev *iio,
    161			struct iio_chan_spec const *channel, int *val1,
    162			int *val2, long mask)
    163{
    164	struct mcp3422 *adc = iio_priv(iio);
    165	int err;
    166
    167	u8 sample_rate = MCP3422_SAMPLE_RATE(adc->config);
    168	u8 pga		 = MCP3422_PGA(adc->config);
    169
    170	switch (mask) {
    171	case IIO_CHAN_INFO_RAW:
    172		err = mcp3422_read_channel(adc, channel, val1);
    173		if (err < 0)
    174			return -EINVAL;
    175		return IIO_VAL_INT;
    176
    177	case IIO_CHAN_INFO_SCALE:
    178
    179		*val1 = 0;
    180		*val2 = mcp3422_scales[sample_rate][pga];
    181		return IIO_VAL_INT_PLUS_NANO;
    182
    183	case IIO_CHAN_INFO_SAMP_FREQ:
    184		*val1 = mcp3422_sample_rates[MCP3422_SAMPLE_RATE(adc->config)];
    185		return IIO_VAL_INT;
    186
    187	default:
    188		break;
    189	}
    190
    191	return -EINVAL;
    192}
    193
    194static int mcp3422_write_raw(struct iio_dev *iio,
    195			struct iio_chan_spec const *channel, int val1,
    196			int val2, long mask)
    197{
    198	struct mcp3422 *adc = iio_priv(iio);
    199	u8 temp;
    200	u8 config = adc->config;
    201	u8 req_channel = channel->channel;
    202	u8 sample_rate = MCP3422_SAMPLE_RATE(config);
    203	u8 i;
    204
    205	switch (mask) {
    206	case IIO_CHAN_INFO_SCALE:
    207		if (val1 != 0)
    208			return -EINVAL;
    209
    210		for (i = 0; i < ARRAY_SIZE(mcp3422_scales[0]); i++) {
    211			if (val2 == mcp3422_scales[sample_rate][i]) {
    212				adc->pga[req_channel] = i;
    213
    214				config &= ~MCP3422_CHANNEL_MASK;
    215				config |= MCP3422_CHANNEL_VALUE(req_channel);
    216				config &= ~MCP3422_PGA_MASK;
    217				config |= MCP3422_PGA_VALUE(adc->pga[req_channel]);
    218
    219				return mcp3422_update_config(adc, config);
    220			}
    221		}
    222		return -EINVAL;
    223
    224	case IIO_CHAN_INFO_SAMP_FREQ:
    225		switch (val1) {
    226		case 240:
    227			temp = MCP3422_SRATE_240;
    228			break;
    229		case 60:
    230			temp = MCP3422_SRATE_60;
    231			break;
    232		case 15:
    233			temp = MCP3422_SRATE_15;
    234			break;
    235		case 3:
    236			if (adc->id > 4)
    237				return -EINVAL;
    238			temp = MCP3422_SRATE_3;
    239			break;
    240		default:
    241			return -EINVAL;
    242		}
    243
    244		config &= ~MCP3422_CHANNEL_MASK;
    245		config |= MCP3422_CHANNEL_VALUE(req_channel);
    246		config &= ~MCP3422_SRATE_MASK;
    247		config |= MCP3422_SAMPLE_RATE_VALUE(temp);
    248
    249		return mcp3422_update_config(adc, config);
    250
    251	default:
    252		break;
    253	}
    254
    255	return -EINVAL;
    256}
    257
    258static int mcp3422_write_raw_get_fmt(struct iio_dev *indio_dev,
    259		struct iio_chan_spec const *chan, long mask)
    260{
    261	switch (mask) {
    262	case IIO_CHAN_INFO_SCALE:
    263		return IIO_VAL_INT_PLUS_NANO;
    264	case IIO_CHAN_INFO_SAMP_FREQ:
    265		return IIO_VAL_INT_PLUS_MICRO;
    266	default:
    267		return -EINVAL;
    268	}
    269}
    270
    271static ssize_t mcp3422_show_samp_freqs(struct device *dev,
    272		struct device_attribute *attr, char *buf)
    273{
    274	struct mcp3422 *adc = iio_priv(dev_to_iio_dev(dev));
    275
    276	if (adc->id > 4)
    277		return sprintf(buf, "240 60 15\n");
    278
    279	return sprintf(buf, "240 60 15 3\n");
    280}
    281
    282static ssize_t mcp3422_show_scales(struct device *dev,
    283		struct device_attribute *attr, char *buf)
    284{
    285	struct mcp3422 *adc = iio_priv(dev_to_iio_dev(dev));
    286	u8 sample_rate = MCP3422_SAMPLE_RATE(adc->config);
    287
    288	return sprintf(buf, "0.%09u 0.%09u 0.%09u 0.%09u\n",
    289		mcp3422_scales[sample_rate][0],
    290		mcp3422_scales[sample_rate][1],
    291		mcp3422_scales[sample_rate][2],
    292		mcp3422_scales[sample_rate][3]);
    293}
    294
    295static IIO_DEVICE_ATTR(sampling_frequency_available, S_IRUGO,
    296		mcp3422_show_samp_freqs, NULL, 0);
    297static IIO_DEVICE_ATTR(in_voltage_scale_available, S_IRUGO,
    298		mcp3422_show_scales, NULL, 0);
    299
    300static struct attribute *mcp3422_attributes[] = {
    301	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
    302	&iio_dev_attr_in_voltage_scale_available.dev_attr.attr,
    303	NULL,
    304};
    305
    306static const struct attribute_group mcp3422_attribute_group = {
    307	.attrs = mcp3422_attributes,
    308};
    309
    310static const struct iio_chan_spec mcp3421_channels[] = {
    311	MCP3422_CHAN(0),
    312};
    313
    314static const struct iio_chan_spec mcp3422_channels[] = {
    315	MCP3422_CHAN(0),
    316	MCP3422_CHAN(1),
    317};
    318
    319static const struct iio_chan_spec mcp3424_channels[] = {
    320	MCP3422_CHAN(0),
    321	MCP3422_CHAN(1),
    322	MCP3422_CHAN(2),
    323	MCP3422_CHAN(3),
    324};
    325
    326static const struct iio_info mcp3422_info = {
    327	.read_raw = mcp3422_read_raw,
    328	.write_raw = mcp3422_write_raw,
    329	.write_raw_get_fmt = mcp3422_write_raw_get_fmt,
    330	.attrs = &mcp3422_attribute_group,
    331};
    332
    333static int mcp3422_probe(struct i2c_client *client,
    334			 const struct i2c_device_id *id)
    335{
    336	struct iio_dev *indio_dev;
    337	struct mcp3422 *adc;
    338	int err;
    339	u8 config;
    340
    341	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
    342		return -EOPNOTSUPP;
    343
    344	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*adc));
    345	if (!indio_dev)
    346		return -ENOMEM;
    347
    348	adc = iio_priv(indio_dev);
    349	adc->i2c = client;
    350	adc->id = (u8)(id->driver_data);
    351
    352	mutex_init(&adc->lock);
    353
    354	indio_dev->name = dev_name(&client->dev);
    355	indio_dev->modes = INDIO_DIRECT_MODE;
    356	indio_dev->info = &mcp3422_info;
    357
    358	switch (adc->id) {
    359	case 1:
    360	case 5:
    361		indio_dev->channels = mcp3421_channels;
    362		indio_dev->num_channels = ARRAY_SIZE(mcp3421_channels);
    363		break;
    364	case 2:
    365	case 3:
    366	case 6:
    367	case 7:
    368		indio_dev->channels = mcp3422_channels;
    369		indio_dev->num_channels = ARRAY_SIZE(mcp3422_channels);
    370		break;
    371	case 4:
    372	case 8:
    373		indio_dev->channels = mcp3424_channels;
    374		indio_dev->num_channels = ARRAY_SIZE(mcp3424_channels);
    375		break;
    376	}
    377
    378	/* meaningful default configuration */
    379	config = (MCP3422_CONT_SAMPLING
    380		| MCP3422_CHANNEL_VALUE(0)
    381		| MCP3422_PGA_VALUE(MCP3422_PGA_1)
    382		| MCP3422_SAMPLE_RATE_VALUE(MCP3422_SRATE_240));
    383	err = mcp3422_update_config(adc, config);
    384	if (err < 0)
    385		return err;
    386
    387	err = devm_iio_device_register(&client->dev, indio_dev);
    388	if (err < 0)
    389		return err;
    390
    391	i2c_set_clientdata(client, indio_dev);
    392
    393	return 0;
    394}
    395
    396static const struct i2c_device_id mcp3422_id[] = {
    397	{ "mcp3421", 1 },
    398	{ "mcp3422", 2 },
    399	{ "mcp3423", 3 },
    400	{ "mcp3424", 4 },
    401	{ "mcp3425", 5 },
    402	{ "mcp3426", 6 },
    403	{ "mcp3427", 7 },
    404	{ "mcp3428", 8 },
    405	{ }
    406};
    407MODULE_DEVICE_TABLE(i2c, mcp3422_id);
    408
    409static const struct of_device_id mcp3422_of_match[] = {
    410	{ .compatible = "mcp3422" },
    411	{ }
    412};
    413MODULE_DEVICE_TABLE(of, mcp3422_of_match);
    414
    415static struct i2c_driver mcp3422_driver = {
    416	.driver = {
    417		.name = "mcp3422",
    418		.of_match_table = mcp3422_of_match,
    419	},
    420	.probe = mcp3422_probe,
    421	.id_table = mcp3422_id,
    422};
    423module_i2c_driver(mcp3422_driver);
    424
    425MODULE_AUTHOR("Angelo Compagnucci <angelo.compagnucci@gmail.com>");
    426MODULE_DESCRIPTION("Microchip mcp3421/2/3/4/5/6/7/8 driver");
    427MODULE_LICENSE("GPL v2");