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

twl6030-gpadc.c (24885B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * TWL6030 GPADC module driver
      4 *
      5 * Copyright (C) 2009-2013 Texas Instruments Inc.
      6 * Nishant Kamat <nskamat@ti.com>
      7 * Balaji T K <balajitk@ti.com>
      8 * Graeme Gregory <gg@slimlogic.co.uk>
      9 * Girish S Ghongdemath <girishsg@ti.com>
     10 * Ambresh K <ambresh@ti.com>
     11 * Oleksandr Kozaruk <oleksandr.kozaruk@ti.com
     12 *
     13 * Based on twl4030-madc.c
     14 * Copyright (C) 2008 Nokia Corporation
     15 * Mikko Ylinen <mikko.k.ylinen@nokia.com>
     16 */
     17#include <linux/interrupt.h>
     18#include <linux/kernel.h>
     19#include <linux/module.h>
     20#include <linux/platform_device.h>
     21#include <linux/of_platform.h>
     22#include <linux/mfd/twl.h>
     23#include <linux/iio/iio.h>
     24#include <linux/iio/sysfs.h>
     25
     26#define DRIVER_NAME		"twl6030_gpadc"
     27
     28/*
     29 * twl6030 per TRM has 17 channels, and twl6032 has 19 channels
     30 * 2 test network channels are not used,
     31 * 2 die temperature channels are not used either, as it is not
     32 * defined how to convert ADC value to temperature
     33 */
     34#define TWL6030_GPADC_USED_CHANNELS		13
     35#define TWL6030_GPADC_MAX_CHANNELS		15
     36#define TWL6032_GPADC_USED_CHANNELS		15
     37#define TWL6032_GPADC_MAX_CHANNELS		19
     38#define TWL6030_GPADC_NUM_TRIM_REGS		16
     39
     40#define TWL6030_GPADC_CTRL_P1			0x05
     41
     42#define TWL6032_GPADC_GPSELECT_ISB		0x07
     43#define TWL6032_GPADC_CTRL_P1			0x08
     44
     45#define TWL6032_GPADC_GPCH0_LSB			0x0d
     46#define TWL6032_GPADC_GPCH0_MSB			0x0e
     47
     48#define TWL6030_GPADC_CTRL_P1_SP1		BIT(3)
     49
     50#define TWL6030_GPADC_GPCH0_LSB			(0x29)
     51
     52#define TWL6030_GPADC_RT_SW1_EOC_MASK		BIT(5)
     53
     54#define TWL6030_GPADC_TRIM1			0xCD
     55
     56#define TWL6030_REG_TOGGLE1			0x90
     57#define TWL6030_GPADCS				BIT(1)
     58#define TWL6030_GPADCR				BIT(0)
     59
     60/**
     61 * struct twl6030_chnl_calib - channel calibration
     62 * @gain:		slope coefficient for ideal curve
     63 * @gain_error:		gain error
     64 * @offset_error:	offset of the real curve
     65 */
     66struct twl6030_chnl_calib {
     67	s32 gain;
     68	s32 gain_error;
     69	s32 offset_error;
     70};
     71
     72/**
     73 * struct twl6030_ideal_code - GPADC calibration parameters
     74 * GPADC is calibrated in two points: close to the beginning and
     75 * to the and of the measurable input range
     76 *
     77 * @channel:	channel number
     78 * @code1:	ideal code for the input at the beginning
     79 * @code2:	ideal code for at the end of the range
     80 * @volt1:	voltage input at the beginning(low voltage)
     81 * @volt2:	voltage input at the end(high voltage)
     82 */
     83struct twl6030_ideal_code {
     84	int channel;
     85	u16 code1;
     86	u16 code2;
     87	u16 volt1;
     88	u16 volt2;
     89};
     90
     91struct twl6030_gpadc_data;
     92
     93/**
     94 * struct twl6030_gpadc_platform_data - platform specific data
     95 * @nchannels:		number of GPADC channels
     96 * @iio_channels:	iio channels
     97 * @ideal:		pointer to calibration parameters
     98 * @start_conversion:	pointer to ADC start conversion function
     99 * @channel_to_reg:	pointer to ADC function to convert channel to
    100 *			register address for reading conversion result
    101 * @calibrate:		pointer to calibration function
    102 */
    103struct twl6030_gpadc_platform_data {
    104	const int nchannels;
    105	const struct iio_chan_spec *iio_channels;
    106	const struct twl6030_ideal_code *ideal;
    107	int (*start_conversion)(int channel);
    108	u8 (*channel_to_reg)(int channel);
    109	int (*calibrate)(struct twl6030_gpadc_data *gpadc);
    110};
    111
    112/**
    113 * struct twl6030_gpadc_data - GPADC data
    114 * @dev:		device pointer
    115 * @lock:		mutual exclusion lock for the structure
    116 * @irq_complete:	completion to signal end of conversion
    117 * @twl6030_cal_tbl:	pointer to calibration data for each
    118 *			channel with gain error and offset
    119 * @pdata:		pointer to device specific data
    120 */
    121struct twl6030_gpadc_data {
    122	struct device	*dev;
    123	struct mutex	lock;
    124	struct completion	irq_complete;
    125	struct twl6030_chnl_calib	*twl6030_cal_tbl;
    126	const struct twl6030_gpadc_platform_data *pdata;
    127};
    128
    129/*
    130 * channels 11, 12, 13, 15 and 16 have no calibration data
    131 * calibration offset is same for channels 1, 3, 4, 5
    132 *
    133 * The data is taken from GPADC_TRIM registers description.
    134 * GPADC_TRIM registers keep difference between the code measured
    135 * at volt1 and volt2 input voltages and corresponding code1 and code2
    136 */
    137static const struct twl6030_ideal_code
    138	twl6030_ideal[TWL6030_GPADC_USED_CHANNELS] = {
    139	[0] = { /* ch 0, external, battery type, resistor value */
    140		.channel = 0,
    141		.code1 = 116,
    142		.code2 = 745,
    143		.volt1 = 141,
    144		.volt2 = 910,
    145	},
    146	[1] = { /* ch 1, external, battery temperature, NTC resistor value */
    147		.channel = 1,
    148		.code1 = 82,
    149		.code2 = 900,
    150		.volt1 = 100,
    151		.volt2 = 1100,
    152	},
    153	[2] = { /* ch 2, external, audio accessory/general purpose */
    154		.channel = 2,
    155		.code1 = 55,
    156		.code2 = 818,
    157		.volt1 = 101,
    158		.volt2 = 1499,
    159	},
    160	[3] = { /* ch 3, external, general purpose */
    161		.channel = 3,
    162		.code1 = 82,
    163		.code2 = 900,
    164		.volt1 = 100,
    165		.volt2 = 1100,
    166	},
    167	[4] = { /* ch 4, external, temperature measurement/general purpose */
    168		.channel = 4,
    169		.code1 = 82,
    170		.code2 = 900,
    171		.volt1 = 100,
    172		.volt2 = 1100,
    173	},
    174	[5] = { /* ch 5, external, general purpose */
    175		.channel = 5,
    176		.code1 = 82,
    177		.code2 = 900,
    178		.volt1 = 100,
    179		.volt2 = 1100,
    180	},
    181	[6] = { /* ch 6, external, general purpose */
    182		.channel = 6,
    183		.code1 = 82,
    184		.code2 = 900,
    185		.volt1 = 100,
    186		.volt2 = 1100,
    187	},
    188	[7] = { /* ch 7, internal, main battery */
    189		.channel = 7,
    190		.code1 = 614,
    191		.code2 = 941,
    192		.volt1 = 3001,
    193		.volt2 = 4599,
    194	},
    195	[8] = { /* ch 8, internal, backup battery */
    196		.channel = 8,
    197		.code1 = 82,
    198		.code2 = 688,
    199		.volt1 = 501,
    200		.volt2 = 4203,
    201	},
    202	[9] = { /* ch 9, internal, external charger input */
    203		.channel = 9,
    204		.code1 = 182,
    205		.code2 = 818,
    206		.volt1 = 2001,
    207		.volt2 = 8996,
    208	},
    209	[10] = { /* ch 10, internal, VBUS */
    210		.channel = 10,
    211		.code1 = 149,
    212		.code2 = 818,
    213		.volt1 = 1001,
    214		.volt2 = 5497,
    215	},
    216	[11] = { /* ch 11, internal, VBUS charging current */
    217		.channel = 11,
    218	},
    219		/* ch 12, internal, Die temperature */
    220		/* ch 13, internal, Die temperature */
    221	[12] = { /* ch 14, internal, USB ID line */
    222		.channel = 14,
    223		.code1 = 48,
    224		.code2 = 714,
    225		.volt1 = 323,
    226		.volt2 = 4800,
    227	},
    228};
    229
    230static const struct twl6030_ideal_code
    231			twl6032_ideal[TWL6032_GPADC_USED_CHANNELS] = {
    232	[0] = { /* ch 0, external, battery type, resistor value */
    233		.channel = 0,
    234		.code1 = 1441,
    235		.code2 = 3276,
    236		.volt1 = 440,
    237		.volt2 = 1000,
    238	},
    239	[1] = { /* ch 1, external, battery temperature, NTC resistor value */
    240		.channel = 1,
    241		.code1 = 1441,
    242		.code2 = 3276,
    243		.volt1 = 440,
    244		.volt2 = 1000,
    245	},
    246	[2] = { /* ch 2, external, audio accessory/general purpose */
    247		.channel = 2,
    248		.code1 = 1441,
    249		.code2 = 3276,
    250		.volt1 = 660,
    251		.volt2 = 1500,
    252	},
    253	[3] = { /* ch 3, external, temperature with external diode/general
    254								purpose */
    255		.channel = 3,
    256		.code1 = 1441,
    257		.code2 = 3276,
    258		.volt1 = 440,
    259		.volt2 = 1000,
    260	},
    261	[4] = { /* ch 4, external, temperature measurement/general purpose */
    262		.channel = 4,
    263		.code1 = 1441,
    264		.code2 = 3276,
    265		.volt1 = 440,
    266		.volt2 = 1000,
    267	},
    268	[5] = { /* ch 5, external, general purpose */
    269		.channel = 5,
    270		.code1 = 1441,
    271		.code2 = 3276,
    272		.volt1 = 440,
    273		.volt2 = 1000,
    274	},
    275	[6] = { /* ch 6, external, general purpose */
    276		.channel = 6,
    277		.code1 = 1441,
    278		.code2 = 3276,
    279		.volt1 = 440,
    280		.volt2 = 1000,
    281	},
    282	[7] = { /* ch7, internal, system supply */
    283		.channel = 7,
    284		.code1 = 1441,
    285		.code2 = 3276,
    286		.volt1 = 2200,
    287		.volt2 = 5000,
    288	},
    289	[8] = { /* ch8, internal, backup battery */
    290		.channel = 8,
    291		.code1 = 1441,
    292		.code2 = 3276,
    293		.volt1 = 2200,
    294		.volt2 = 5000,
    295	},
    296	[9] = { /* ch 9, internal, external charger input */
    297		.channel = 9,
    298		.code1 = 1441,
    299		.code2 = 3276,
    300		.volt1 = 3960,
    301		.volt2 = 9000,
    302	},
    303	[10] = { /* ch10, internal, VBUS */
    304		.channel = 10,
    305		.code1 = 150,
    306		.code2 = 751,
    307		.volt1 = 1000,
    308		.volt2 = 5000,
    309	},
    310	[11] = { /* ch 11, internal, VBUS DC-DC output current */
    311		.channel = 11,
    312		.code1 = 1441,
    313		.code2 = 3276,
    314		.volt1 = 660,
    315		.volt2 = 1500,
    316	},
    317		/* ch 12, internal, Die temperature */
    318		/* ch 13, internal, Die temperature */
    319	[12] = { /* ch 14, internal, USB ID line */
    320		.channel = 14,
    321		.code1 = 1441,
    322		.code2 = 3276,
    323		.volt1 = 2420,
    324		.volt2 = 5500,
    325	},
    326		/* ch 15, internal, test network */
    327		/* ch 16, internal, test network */
    328	[13] = { /* ch 17, internal, battery charging current */
    329		.channel = 17,
    330	},
    331	[14] = { /* ch 18, internal, battery voltage */
    332		.channel = 18,
    333		.code1 = 1441,
    334		.code2 = 3276,
    335		.volt1 = 2200,
    336		.volt2 = 5000,
    337	},
    338};
    339
    340static inline int twl6030_gpadc_write(u8 reg, u8 val)
    341{
    342	return twl_i2c_write_u8(TWL6030_MODULE_GPADC, val, reg);
    343}
    344
    345static inline int twl6030_gpadc_read(u8 reg, u8 *val)
    346{
    347
    348	return twl_i2c_read(TWL6030_MODULE_GPADC, val, reg, 2);
    349}
    350
    351static int twl6030_gpadc_enable_irq(u8 mask)
    352{
    353	int ret;
    354
    355	ret = twl6030_interrupt_unmask(mask, REG_INT_MSK_LINE_B);
    356	if (ret < 0)
    357		return ret;
    358
    359	ret = twl6030_interrupt_unmask(mask, REG_INT_MSK_STS_B);
    360
    361	return ret;
    362}
    363
    364static void twl6030_gpadc_disable_irq(u8 mask)
    365{
    366	twl6030_interrupt_mask(mask, REG_INT_MSK_LINE_B);
    367	twl6030_interrupt_mask(mask, REG_INT_MSK_STS_B);
    368}
    369
    370static irqreturn_t twl6030_gpadc_irq_handler(int irq, void *indio_dev)
    371{
    372	struct twl6030_gpadc_data *gpadc = iio_priv(indio_dev);
    373
    374	complete(&gpadc->irq_complete);
    375
    376	return IRQ_HANDLED;
    377}
    378
    379static int twl6030_start_conversion(int channel)
    380{
    381	return twl6030_gpadc_write(TWL6030_GPADC_CTRL_P1,
    382					TWL6030_GPADC_CTRL_P1_SP1);
    383}
    384
    385static int twl6032_start_conversion(int channel)
    386{
    387	int ret;
    388
    389	ret = twl6030_gpadc_write(TWL6032_GPADC_GPSELECT_ISB, channel);
    390	if (ret)
    391		return ret;
    392
    393	return twl6030_gpadc_write(TWL6032_GPADC_CTRL_P1,
    394						TWL6030_GPADC_CTRL_P1_SP1);
    395}
    396
    397static u8 twl6030_channel_to_reg(int channel)
    398{
    399	return TWL6030_GPADC_GPCH0_LSB + 2 * channel;
    400}
    401
    402static u8 twl6032_channel_to_reg(int channel)
    403{
    404	/*
    405	 * for any prior chosen channel, when the conversion is ready
    406	 * the result is avalable in GPCH0_LSB, GPCH0_MSB.
    407	 */
    408
    409	return TWL6032_GPADC_GPCH0_LSB;
    410}
    411
    412static int twl6030_gpadc_lookup(const struct twl6030_ideal_code *ideal,
    413		int channel, int size)
    414{
    415	int i;
    416
    417	for (i = 0; i < size; i++)
    418		if (ideal[i].channel == channel)
    419			break;
    420
    421	return i;
    422}
    423
    424static int twl6030_channel_calibrated(const struct twl6030_gpadc_platform_data
    425		*pdata, int channel)
    426{
    427	const struct twl6030_ideal_code *ideal = pdata->ideal;
    428	int i;
    429
    430	i = twl6030_gpadc_lookup(ideal, channel, pdata->nchannels);
    431	/* not calibrated channels have 0 in all structure members */
    432	return pdata->ideal[i].code2;
    433}
    434
    435static int twl6030_gpadc_make_correction(struct twl6030_gpadc_data *gpadc,
    436		int channel, int raw_code)
    437{
    438	const struct twl6030_ideal_code *ideal = gpadc->pdata->ideal;
    439	int corrected_code;
    440	int i;
    441
    442	i = twl6030_gpadc_lookup(ideal, channel, gpadc->pdata->nchannels);
    443	corrected_code = ((raw_code * 1000) -
    444		gpadc->twl6030_cal_tbl[i].offset_error) /
    445		gpadc->twl6030_cal_tbl[i].gain_error;
    446
    447	return corrected_code;
    448}
    449
    450static int twl6030_gpadc_get_raw(struct twl6030_gpadc_data *gpadc,
    451		int channel, int *res)
    452{
    453	u8 reg = gpadc->pdata->channel_to_reg(channel);
    454	__le16 val;
    455	int raw_code;
    456	int ret;
    457
    458	ret = twl6030_gpadc_read(reg, (u8 *)&val);
    459	if (ret) {
    460		dev_dbg(gpadc->dev, "unable to read register 0x%X\n", reg);
    461		return ret;
    462	}
    463
    464	raw_code = le16_to_cpu(val);
    465	dev_dbg(gpadc->dev, "GPADC raw code: %d", raw_code);
    466
    467	if (twl6030_channel_calibrated(gpadc->pdata, channel))
    468		*res = twl6030_gpadc_make_correction(gpadc, channel, raw_code);
    469	else
    470		*res = raw_code;
    471
    472	return ret;
    473}
    474
    475static int twl6030_gpadc_get_processed(struct twl6030_gpadc_data *gpadc,
    476		int channel, int *val)
    477{
    478	const struct twl6030_ideal_code *ideal = gpadc->pdata->ideal;
    479	int corrected_code;
    480	int channel_value;
    481	int i;
    482	int ret;
    483
    484	ret = twl6030_gpadc_get_raw(gpadc, channel, &corrected_code);
    485	if (ret)
    486		return ret;
    487
    488	i = twl6030_gpadc_lookup(ideal, channel, gpadc->pdata->nchannels);
    489	channel_value = corrected_code *
    490			gpadc->twl6030_cal_tbl[i].gain;
    491
    492	/* Shift back into mV range */
    493	channel_value /= 1000;
    494
    495	dev_dbg(gpadc->dev, "GPADC corrected code: %d", corrected_code);
    496	dev_dbg(gpadc->dev, "GPADC value: %d", channel_value);
    497
    498	*val = channel_value;
    499
    500	return ret;
    501}
    502
    503static int twl6030_gpadc_read_raw(struct iio_dev *indio_dev,
    504			     const struct iio_chan_spec *chan,
    505			     int *val, int *val2, long mask)
    506{
    507	struct twl6030_gpadc_data *gpadc = iio_priv(indio_dev);
    508	int ret;
    509	long timeout;
    510
    511	mutex_lock(&gpadc->lock);
    512
    513	ret = gpadc->pdata->start_conversion(chan->channel);
    514	if (ret) {
    515		dev_err(gpadc->dev, "failed to start conversion\n");
    516		goto err;
    517	}
    518	/* wait for conversion to complete */
    519	timeout = wait_for_completion_interruptible_timeout(
    520				&gpadc->irq_complete, msecs_to_jiffies(5000));
    521	if (timeout == 0) {
    522		ret = -ETIMEDOUT;
    523		goto err;
    524	} else if (timeout < 0) {
    525		ret = -EINTR;
    526		goto err;
    527	}
    528
    529	switch (mask) {
    530	case IIO_CHAN_INFO_RAW:
    531		ret = twl6030_gpadc_get_raw(gpadc, chan->channel, val);
    532		ret = ret ? -EIO : IIO_VAL_INT;
    533		break;
    534
    535	case IIO_CHAN_INFO_PROCESSED:
    536		ret = twl6030_gpadc_get_processed(gpadc, chan->channel, val);
    537		ret = ret ? -EIO : IIO_VAL_INT;
    538		break;
    539
    540	default:
    541		break;
    542	}
    543err:
    544	mutex_unlock(&gpadc->lock);
    545
    546	return ret;
    547}
    548
    549/*
    550 * The GPADC channels are calibrated using a two point calibration method.
    551 * The channels measured with two known values: volt1 and volt2, and
    552 * ideal corresponding output codes are known: code1, code2.
    553 * The difference(d1, d2) between ideal and measured codes stored in trim
    554 * registers.
    555 * The goal is to find offset and gain of the real curve for each calibrated
    556 * channel.
    557 * gain: k = 1 + ((d2 - d1) / (x2 - x1))
    558 * offset: b = d1 + (k - 1) * x1
    559 */
    560static void twl6030_calibrate_channel(struct twl6030_gpadc_data *gpadc,
    561		int channel, int d1, int d2)
    562{
    563	int b, k, gain, x1, x2, i;
    564	const struct twl6030_ideal_code *ideal = gpadc->pdata->ideal;
    565
    566	i = twl6030_gpadc_lookup(ideal, channel, gpadc->pdata->nchannels);
    567
    568	/* Gain */
    569	gain = ((ideal[i].volt2 - ideal[i].volt1) * 1000) /
    570		(ideal[i].code2 - ideal[i].code1);
    571
    572	x1 = ideal[i].code1;
    573	x2 = ideal[i].code2;
    574
    575	/* k - real curve gain */
    576	k = 1000 + (((d2 - d1) * 1000) / (x2 - x1));
    577
    578	/* b - offset of the real curve gain */
    579	b = (d1 * 1000) - (k - 1000) * x1;
    580
    581	gpadc->twl6030_cal_tbl[i].gain = gain;
    582	gpadc->twl6030_cal_tbl[i].gain_error = k;
    583	gpadc->twl6030_cal_tbl[i].offset_error = b;
    584
    585	dev_dbg(gpadc->dev, "GPADC d1   for Chn: %d = %d\n", channel, d1);
    586	dev_dbg(gpadc->dev, "GPADC d2   for Chn: %d = %d\n", channel, d2);
    587	dev_dbg(gpadc->dev, "GPADC x1   for Chn: %d = %d\n", channel, x1);
    588	dev_dbg(gpadc->dev, "GPADC x2   for Chn: %d = %d\n", channel, x2);
    589	dev_dbg(gpadc->dev, "GPADC Gain for Chn: %d = %d\n", channel, gain);
    590	dev_dbg(gpadc->dev, "GPADC k    for Chn: %d = %d\n", channel, k);
    591	dev_dbg(gpadc->dev, "GPADC b    for Chn: %d = %d\n", channel, b);
    592}
    593
    594static inline int twl6030_gpadc_get_trim_offset(s8 d)
    595{
    596	/*
    597	 * XXX NOTE!
    598	 * bit 0 - sign, bit 7 - reserved, 6..1 - trim value
    599	 * though, the documentation states that trim value
    600	 * is absolute value, the correct conversion results are
    601	 * obtained if the value is interpreted as 2's complement.
    602	 */
    603	__u32 temp = ((d & 0x7f) >> 1) | ((d & 1) << 6);
    604
    605	return sign_extend32(temp, 6);
    606}
    607
    608static int twl6030_calibration(struct twl6030_gpadc_data *gpadc)
    609{
    610	int ret;
    611	int chn;
    612	u8 trim_regs[TWL6030_GPADC_NUM_TRIM_REGS];
    613	s8 d1, d2;
    614
    615	/*
    616	 * for calibration two measurements have been performed at
    617	 * factory, for some channels, during the production test and
    618	 * have been stored in registers. This two stored values are
    619	 * used to correct the measurements. The values represent
    620	 * offsets for the given input from the output on ideal curve.
    621	 */
    622	ret = twl_i2c_read(TWL6030_MODULE_ID2, trim_regs,
    623			TWL6030_GPADC_TRIM1, TWL6030_GPADC_NUM_TRIM_REGS);
    624	if (ret < 0) {
    625		dev_err(gpadc->dev, "calibration failed\n");
    626		return ret;
    627	}
    628
    629	for (chn = 0; chn < TWL6030_GPADC_MAX_CHANNELS; chn++) {
    630
    631		switch (chn) {
    632		case 0:
    633			d1 = trim_regs[0];
    634			d2 = trim_regs[1];
    635			break;
    636		case 1:
    637		case 3:
    638		case 4:
    639		case 5:
    640		case 6:
    641			d1 = trim_regs[4];
    642			d2 = trim_regs[5];
    643			break;
    644		case 2:
    645			d1 = trim_regs[12];
    646			d2 = trim_regs[13];
    647			break;
    648		case 7:
    649			d1 = trim_regs[6];
    650			d2 = trim_regs[7];
    651			break;
    652		case 8:
    653			d1 = trim_regs[2];
    654			d2 = trim_regs[3];
    655			break;
    656		case 9:
    657			d1 = trim_regs[8];
    658			d2 = trim_regs[9];
    659			break;
    660		case 10:
    661			d1 = trim_regs[10];
    662			d2 = trim_regs[11];
    663			break;
    664		case 14:
    665			d1 = trim_regs[14];
    666			d2 = trim_regs[15];
    667			break;
    668		default:
    669			continue;
    670		}
    671
    672		d1 = twl6030_gpadc_get_trim_offset(d1);
    673		d2 = twl6030_gpadc_get_trim_offset(d2);
    674
    675		twl6030_calibrate_channel(gpadc, chn, d1, d2);
    676	}
    677
    678	return 0;
    679}
    680
    681static int twl6032_get_trim_value(u8 *trim_regs, unsigned int reg0,
    682		unsigned int reg1, unsigned int mask0, unsigned int mask1,
    683		unsigned int shift0)
    684{
    685	int val;
    686
    687	val = (trim_regs[reg0] & mask0) << shift0;
    688	val |= (trim_regs[reg1] & mask1) >> 1;
    689	if (trim_regs[reg1] & 0x01)
    690		val = -val;
    691
    692	return val;
    693}
    694
    695static int twl6032_calibration(struct twl6030_gpadc_data *gpadc)
    696{
    697	int chn, d1 = 0, d2 = 0, temp;
    698	u8 trim_regs[TWL6030_GPADC_NUM_TRIM_REGS];
    699	int ret;
    700
    701	ret = twl_i2c_read(TWL6030_MODULE_ID2, trim_regs,
    702			TWL6030_GPADC_TRIM1, TWL6030_GPADC_NUM_TRIM_REGS);
    703	if (ret < 0) {
    704		dev_err(gpadc->dev, "calibration failed\n");
    705		return ret;
    706	}
    707
    708	/*
    709	 * Loop to calculate the value needed for returning voltages from
    710	 * GPADC not values.
    711	 *
    712	 * gain is calculated to 3 decimal places fixed point.
    713	 */
    714	for (chn = 0; chn < TWL6032_GPADC_MAX_CHANNELS; chn++) {
    715
    716		switch (chn) {
    717		case 0:
    718		case 1:
    719		case 2:
    720		case 3:
    721		case 4:
    722		case 5:
    723		case 6:
    724		case 11:
    725		case 14:
    726			d1 = twl6032_get_trim_value(trim_regs, 2, 0, 0x1f,
    727								0x06, 2);
    728			d2 = twl6032_get_trim_value(trim_regs, 3, 1, 0x3f,
    729								0x06, 2);
    730			break;
    731		case 8:
    732			temp = twl6032_get_trim_value(trim_regs, 2, 0, 0x1f,
    733								0x06, 2);
    734			d1 = temp + twl6032_get_trim_value(trim_regs, 7, 6,
    735								0x18, 0x1E, 1);
    736
    737			temp = twl6032_get_trim_value(trim_regs, 3, 1, 0x3F,
    738								0x06, 2);
    739			d2 = temp + twl6032_get_trim_value(trim_regs, 9, 7,
    740								0x1F, 0x06, 2);
    741			break;
    742		case 9:
    743			temp = twl6032_get_trim_value(trim_regs, 2, 0, 0x1f,
    744								0x06, 2);
    745			d1 = temp + twl6032_get_trim_value(trim_regs, 13, 11,
    746								0x18, 0x1E, 1);
    747
    748			temp = twl6032_get_trim_value(trim_regs, 3, 1, 0x3f,
    749								0x06, 2);
    750			d2 = temp + twl6032_get_trim_value(trim_regs, 15, 13,
    751								0x1F, 0x06, 1);
    752			break;
    753		case 10:
    754			d1 = twl6032_get_trim_value(trim_regs, 10, 8, 0x0f,
    755								0x0E, 3);
    756			d2 = twl6032_get_trim_value(trim_regs, 14, 12, 0x0f,
    757								0x0E, 3);
    758			break;
    759		case 7:
    760		case 18:
    761			temp = twl6032_get_trim_value(trim_regs, 2, 0, 0x1f,
    762								0x06, 2);
    763
    764			d1 = (trim_regs[4] & 0x7E) >> 1;
    765			if (trim_regs[4] & 0x01)
    766				d1 = -d1;
    767			d1 += temp;
    768
    769			temp = twl6032_get_trim_value(trim_regs, 3, 1, 0x3f,
    770								0x06, 2);
    771
    772			d2 = (trim_regs[5] & 0xFE) >> 1;
    773			if (trim_regs[5] & 0x01)
    774				d2 = -d2;
    775
    776			d2 += temp;
    777			break;
    778		default:
    779			/* No data for other channels */
    780			continue;
    781		}
    782
    783		twl6030_calibrate_channel(gpadc, chn, d1, d2);
    784	}
    785
    786	return 0;
    787}
    788
    789#define TWL6030_GPADC_CHAN(chn, _type, chan_info) {	\
    790	.type = _type,					\
    791	.channel = chn,					\
    792	.info_mask_separate = BIT(chan_info),		\
    793	.indexed = 1,					\
    794}
    795
    796static const struct iio_chan_spec twl6030_gpadc_iio_channels[] = {
    797	TWL6030_GPADC_CHAN(0, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    798	TWL6030_GPADC_CHAN(1, IIO_TEMP, IIO_CHAN_INFO_RAW),
    799	TWL6030_GPADC_CHAN(2, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    800	TWL6030_GPADC_CHAN(3, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    801	TWL6030_GPADC_CHAN(4, IIO_TEMP, IIO_CHAN_INFO_RAW),
    802	TWL6030_GPADC_CHAN(5, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    803	TWL6030_GPADC_CHAN(6, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    804	TWL6030_GPADC_CHAN(7, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    805	TWL6030_GPADC_CHAN(8, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    806	TWL6030_GPADC_CHAN(9, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    807	TWL6030_GPADC_CHAN(10, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    808	TWL6030_GPADC_CHAN(11, IIO_VOLTAGE, IIO_CHAN_INFO_RAW),
    809	TWL6030_GPADC_CHAN(14, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    810};
    811
    812static const struct iio_chan_spec twl6032_gpadc_iio_channels[] = {
    813	TWL6030_GPADC_CHAN(0, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    814	TWL6030_GPADC_CHAN(1, IIO_TEMP, IIO_CHAN_INFO_RAW),
    815	TWL6030_GPADC_CHAN(2, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    816	TWL6030_GPADC_CHAN(3, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    817	TWL6030_GPADC_CHAN(4, IIO_TEMP, IIO_CHAN_INFO_RAW),
    818	TWL6030_GPADC_CHAN(5, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    819	TWL6030_GPADC_CHAN(6, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    820	TWL6030_GPADC_CHAN(7, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    821	TWL6030_GPADC_CHAN(8, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    822	TWL6030_GPADC_CHAN(9, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    823	TWL6030_GPADC_CHAN(10, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    824	TWL6030_GPADC_CHAN(11, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    825	TWL6030_GPADC_CHAN(14, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    826	TWL6030_GPADC_CHAN(17, IIO_VOLTAGE, IIO_CHAN_INFO_RAW),
    827	TWL6030_GPADC_CHAN(18, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
    828};
    829
    830static const struct iio_info twl6030_gpadc_iio_info = {
    831	.read_raw = &twl6030_gpadc_read_raw,
    832};
    833
    834static const struct twl6030_gpadc_platform_data twl6030_pdata = {
    835	.iio_channels = twl6030_gpadc_iio_channels,
    836	.nchannels = TWL6030_GPADC_USED_CHANNELS,
    837	.ideal = twl6030_ideal,
    838	.start_conversion = twl6030_start_conversion,
    839	.channel_to_reg = twl6030_channel_to_reg,
    840	.calibrate = twl6030_calibration,
    841};
    842
    843static const struct twl6030_gpadc_platform_data twl6032_pdata = {
    844	.iio_channels = twl6032_gpadc_iio_channels,
    845	.nchannels = TWL6032_GPADC_USED_CHANNELS,
    846	.ideal = twl6032_ideal,
    847	.start_conversion = twl6032_start_conversion,
    848	.channel_to_reg = twl6032_channel_to_reg,
    849	.calibrate = twl6032_calibration,
    850};
    851
    852static const struct of_device_id of_twl6030_match_tbl[] = {
    853	{
    854		.compatible = "ti,twl6030-gpadc",
    855		.data = &twl6030_pdata,
    856	},
    857	{
    858		.compatible = "ti,twl6032-gpadc",
    859		.data = &twl6032_pdata,
    860	},
    861	{ /* end */ }
    862};
    863MODULE_DEVICE_TABLE(of, of_twl6030_match_tbl);
    864
    865static int twl6030_gpadc_probe(struct platform_device *pdev)
    866{
    867	struct device *dev = &pdev->dev;
    868	struct twl6030_gpadc_data *gpadc;
    869	const struct twl6030_gpadc_platform_data *pdata;
    870	const struct of_device_id *match;
    871	struct iio_dev *indio_dev;
    872	int irq;
    873	int ret;
    874
    875	match = of_match_device(of_twl6030_match_tbl, dev);
    876	if (!match)
    877		return -EINVAL;
    878
    879	pdata = match->data;
    880
    881	indio_dev = devm_iio_device_alloc(dev, sizeof(*gpadc));
    882	if (!indio_dev)
    883		return -ENOMEM;
    884
    885	gpadc = iio_priv(indio_dev);
    886
    887	gpadc->twl6030_cal_tbl = devm_kcalloc(dev,
    888					pdata->nchannels,
    889					sizeof(*gpadc->twl6030_cal_tbl),
    890					GFP_KERNEL);
    891	if (!gpadc->twl6030_cal_tbl)
    892		return -ENOMEM;
    893
    894	gpadc->dev = dev;
    895	gpadc->pdata = pdata;
    896
    897	platform_set_drvdata(pdev, indio_dev);
    898	mutex_init(&gpadc->lock);
    899	init_completion(&gpadc->irq_complete);
    900
    901	ret = pdata->calibrate(gpadc);
    902	if (ret < 0) {
    903		dev_err(dev, "failed to read calibration registers\n");
    904		return ret;
    905	}
    906
    907	irq = platform_get_irq(pdev, 0);
    908	if (irq < 0)
    909		return irq;
    910
    911	ret = devm_request_threaded_irq(dev, irq, NULL,
    912				twl6030_gpadc_irq_handler,
    913				IRQF_ONESHOT, "twl6030_gpadc", indio_dev);
    914	if (ret)
    915		return ret;
    916
    917	ret = twl6030_gpadc_enable_irq(TWL6030_GPADC_RT_SW1_EOC_MASK);
    918	if (ret < 0) {
    919		dev_err(dev, "failed to enable GPADC interrupt\n");
    920		return ret;
    921	}
    922
    923	ret = twl_i2c_write_u8(TWL6030_MODULE_ID1, TWL6030_GPADCS,
    924					TWL6030_REG_TOGGLE1);
    925	if (ret < 0) {
    926		dev_err(dev, "failed to enable GPADC module\n");
    927		return ret;
    928	}
    929
    930	indio_dev->name = DRIVER_NAME;
    931	indio_dev->info = &twl6030_gpadc_iio_info;
    932	indio_dev->modes = INDIO_DIRECT_MODE;
    933	indio_dev->channels = pdata->iio_channels;
    934	indio_dev->num_channels = pdata->nchannels;
    935
    936	return iio_device_register(indio_dev);
    937}
    938
    939static int twl6030_gpadc_remove(struct platform_device *pdev)
    940{
    941	struct iio_dev *indio_dev = platform_get_drvdata(pdev);
    942
    943	twl6030_gpadc_disable_irq(TWL6030_GPADC_RT_SW1_EOC_MASK);
    944	iio_device_unregister(indio_dev);
    945
    946	return 0;
    947}
    948
    949static int twl6030_gpadc_suspend(struct device *pdev)
    950{
    951	int ret;
    952
    953	ret = twl_i2c_write_u8(TWL6030_MODULE_ID1, TWL6030_GPADCR,
    954				TWL6030_REG_TOGGLE1);
    955	if (ret)
    956		dev_err(pdev, "error resetting GPADC (%d)!\n", ret);
    957
    958	return 0;
    959};
    960
    961static int twl6030_gpadc_resume(struct device *pdev)
    962{
    963	int ret;
    964
    965	ret = twl_i2c_write_u8(TWL6030_MODULE_ID1, TWL6030_GPADCS,
    966				TWL6030_REG_TOGGLE1);
    967	if (ret)
    968		dev_err(pdev, "error setting GPADC (%d)!\n", ret);
    969
    970	return 0;
    971};
    972
    973static DEFINE_SIMPLE_DEV_PM_OPS(twl6030_gpadc_pm_ops, twl6030_gpadc_suspend,
    974				twl6030_gpadc_resume);
    975
    976static struct platform_driver twl6030_gpadc_driver = {
    977	.probe		= twl6030_gpadc_probe,
    978	.remove		= twl6030_gpadc_remove,
    979	.driver		= {
    980		.name	= DRIVER_NAME,
    981		.pm	= pm_sleep_ptr(&twl6030_gpadc_pm_ops),
    982		.of_match_table = of_twl6030_match_tbl,
    983	},
    984};
    985
    986module_platform_driver(twl6030_gpadc_driver);
    987
    988MODULE_ALIAS("platform:" DRIVER_NAME);
    989MODULE_AUTHOR("Balaji T K <balajitk@ti.com>");
    990MODULE_AUTHOR("Graeme Gregory <gg@slimlogic.co.uk>");
    991MODULE_AUTHOR("Oleksandr Kozaruk <oleksandr.kozaruk@ti.com");
    992MODULE_DESCRIPTION("twl6030 ADC driver");
    993MODULE_LICENSE("GPL");