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

twl4030-madc.c (25639B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *
      4 * TWL4030 MADC module driver-This driver monitors the real time
      5 * conversion of analog signals like battery temperature,
      6 * battery type, battery level etc.
      7 *
      8 * Copyright (C) 2011 Texas Instruments Incorporated - https://www.ti.com/
      9 * J Keerthy <j-keerthy@ti.com>
     10 *
     11 * Based on twl4030-madc.c
     12 * Copyright (C) 2008 Nokia Corporation
     13 * Mikko Ylinen <mikko.k.ylinen@nokia.com>
     14 *
     15 * Amit Kucheria <amit.kucheria@canonical.com>
     16 */
     17
     18#include <linux/device.h>
     19#include <linux/interrupt.h>
     20#include <linux/kernel.h>
     21#include <linux/delay.h>
     22#include <linux/platform_device.h>
     23#include <linux/slab.h>
     24#include <linux/mfd/twl.h>
     25#include <linux/module.h>
     26#include <linux/stddef.h>
     27#include <linux/mutex.h>
     28#include <linux/bitops.h>
     29#include <linux/jiffies.h>
     30#include <linux/types.h>
     31#include <linux/gfp.h>
     32#include <linux/err.h>
     33#include <linux/regulator/consumer.h>
     34
     35#include <linux/iio/iio.h>
     36
     37#define TWL4030_MADC_MAX_CHANNELS 16
     38
     39#define TWL4030_MADC_CTRL1		0x00
     40#define TWL4030_MADC_CTRL2		0x01
     41
     42#define TWL4030_MADC_RTSELECT_LSB	0x02
     43#define TWL4030_MADC_SW1SELECT_LSB	0x06
     44#define TWL4030_MADC_SW2SELECT_LSB	0x0A
     45
     46#define TWL4030_MADC_RTAVERAGE_LSB	0x04
     47#define TWL4030_MADC_SW1AVERAGE_LSB	0x08
     48#define TWL4030_MADC_SW2AVERAGE_LSB	0x0C
     49
     50#define TWL4030_MADC_CTRL_SW1		0x12
     51#define TWL4030_MADC_CTRL_SW2		0x13
     52
     53#define TWL4030_MADC_RTCH0_LSB		0x17
     54#define TWL4030_MADC_GPCH0_LSB		0x37
     55
     56#define TWL4030_MADC_MADCON	(1 << 0)	/* MADC power on */
     57#define TWL4030_MADC_BUSY	(1 << 0)	/* MADC busy */
     58/* MADC conversion completion */
     59#define TWL4030_MADC_EOC_SW	(1 << 1)
     60/* MADC SWx start conversion */
     61#define TWL4030_MADC_SW_START	(1 << 5)
     62#define TWL4030_MADC_ADCIN0	(1 << 0)
     63#define TWL4030_MADC_ADCIN1	(1 << 1)
     64#define TWL4030_MADC_ADCIN2	(1 << 2)
     65#define TWL4030_MADC_ADCIN3	(1 << 3)
     66#define TWL4030_MADC_ADCIN4	(1 << 4)
     67#define TWL4030_MADC_ADCIN5	(1 << 5)
     68#define TWL4030_MADC_ADCIN6	(1 << 6)
     69#define TWL4030_MADC_ADCIN7	(1 << 7)
     70#define TWL4030_MADC_ADCIN8	(1 << 8)
     71#define TWL4030_MADC_ADCIN9	(1 << 9)
     72#define TWL4030_MADC_ADCIN10	(1 << 10)
     73#define TWL4030_MADC_ADCIN11	(1 << 11)
     74#define TWL4030_MADC_ADCIN12	(1 << 12)
     75#define TWL4030_MADC_ADCIN13	(1 << 13)
     76#define TWL4030_MADC_ADCIN14	(1 << 14)
     77#define TWL4030_MADC_ADCIN15	(1 << 15)
     78
     79/* Fixed channels */
     80#define TWL4030_MADC_BTEMP	TWL4030_MADC_ADCIN1
     81#define TWL4030_MADC_VBUS	TWL4030_MADC_ADCIN8
     82#define TWL4030_MADC_VBKB	TWL4030_MADC_ADCIN9
     83#define TWL4030_MADC_ICHG	TWL4030_MADC_ADCIN10
     84#define TWL4030_MADC_VCHG	TWL4030_MADC_ADCIN11
     85#define TWL4030_MADC_VBAT	TWL4030_MADC_ADCIN12
     86
     87/* Step size and prescaler ratio */
     88#define TEMP_STEP_SIZE          147
     89#define TEMP_PSR_R              100
     90#define CURR_STEP_SIZE		147
     91#define CURR_PSR_R1		44
     92#define CURR_PSR_R2		88
     93
     94#define TWL4030_BCI_BCICTL1	0x23
     95#define TWL4030_BCI_CGAIN	0x020
     96#define TWL4030_BCI_MESBAT	(1 << 1)
     97#define TWL4030_BCI_TYPEN	(1 << 4)
     98#define TWL4030_BCI_ITHEN	(1 << 3)
     99
    100#define REG_BCICTL2             0x024
    101#define TWL4030_BCI_ITHSENS	0x007
    102
    103/* Register and bits for GPBR1 register */
    104#define TWL4030_REG_GPBR1		0x0c
    105#define TWL4030_GPBR1_MADC_HFCLK_EN	(1 << 7)
    106
    107#define TWL4030_USB_SEL_MADC_MCPC	(1<<3)
    108#define TWL4030_USB_CARKIT_ANA_CTRL	0xBB
    109
    110struct twl4030_madc_conversion_method {
    111	u8 sel;
    112	u8 avg;
    113	u8 rbase;
    114	u8 ctrl;
    115};
    116
    117/**
    118 * struct twl4030_madc_request - madc request packet for channel conversion
    119 * @channels:	16 bit bitmap for individual channels
    120 * @do_avg:	sample the input channel for 4 consecutive cycles
    121 * @method:	RT, SW1, SW2
    122 * @type:	Polling or interrupt based method
    123 * @active:	Flag if request is active
    124 * @result_pending: Flag from irq handler, that result is ready
    125 * @raw:	Return raw value, do not convert it
    126 * @rbuf:	Result buffer
    127 */
    128struct twl4030_madc_request {
    129	unsigned long channels;
    130	bool do_avg;
    131	u16 method;
    132	u16 type;
    133	bool active;
    134	bool result_pending;
    135	bool raw;
    136	int rbuf[TWL4030_MADC_MAX_CHANNELS];
    137};
    138
    139enum conversion_methods {
    140	TWL4030_MADC_RT,
    141	TWL4030_MADC_SW1,
    142	TWL4030_MADC_SW2,
    143	TWL4030_MADC_NUM_METHODS
    144};
    145
    146enum sample_type {
    147	TWL4030_MADC_WAIT,
    148	TWL4030_MADC_IRQ_ONESHOT,
    149	TWL4030_MADC_IRQ_REARM
    150};
    151
    152/**
    153 * struct twl4030_madc_data - a container for madc info
    154 * @dev:		Pointer to device structure for madc
    155 * @lock:		Mutex protecting this data structure
    156 * @usb3v1:		Pointer to bias regulator for madc
    157 * @requests:		Array of request struct corresponding to SW1, SW2 and RT
    158 * @use_second_irq:	IRQ selection (main or co-processor)
    159 * @imr:		Interrupt mask register of MADC
    160 * @isr:		Interrupt status register of MADC
    161 */
    162struct twl4030_madc_data {
    163	struct device *dev;
    164	struct mutex lock;
    165	struct regulator *usb3v1;
    166	struct twl4030_madc_request requests[TWL4030_MADC_NUM_METHODS];
    167	bool use_second_irq;
    168	u8 imr;
    169	u8 isr;
    170};
    171
    172static int twl4030_madc_conversion(struct twl4030_madc_request *req);
    173
    174static int twl4030_madc_read(struct iio_dev *iio_dev,
    175			     const struct iio_chan_spec *chan,
    176			     int *val, int *val2, long mask)
    177{
    178	struct twl4030_madc_data *madc = iio_priv(iio_dev);
    179	struct twl4030_madc_request req;
    180	int ret;
    181
    182	req.method = madc->use_second_irq ? TWL4030_MADC_SW2 : TWL4030_MADC_SW1;
    183
    184	req.channels = BIT(chan->channel);
    185	req.active = false;
    186	req.type = TWL4030_MADC_WAIT;
    187	req.raw = !(mask == IIO_CHAN_INFO_PROCESSED);
    188	req.do_avg = (mask == IIO_CHAN_INFO_AVERAGE_RAW);
    189
    190	ret = twl4030_madc_conversion(&req);
    191	if (ret < 0)
    192		return ret;
    193
    194	*val = req.rbuf[chan->channel];
    195
    196	return IIO_VAL_INT;
    197}
    198
    199static const struct iio_info twl4030_madc_iio_info = {
    200	.read_raw = &twl4030_madc_read,
    201};
    202
    203#define TWL4030_ADC_CHANNEL(_channel, _type, _name) {	\
    204	.type = _type,					\
    205	.channel = _channel,				\
    206	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |  \
    207			      BIT(IIO_CHAN_INFO_AVERAGE_RAW) | \
    208			      BIT(IIO_CHAN_INFO_PROCESSED), \
    209	.datasheet_name = _name,			\
    210	.indexed = 1,					\
    211}
    212
    213static const struct iio_chan_spec twl4030_madc_iio_channels[] = {
    214	TWL4030_ADC_CHANNEL(0, IIO_VOLTAGE, "ADCIN0"),
    215	TWL4030_ADC_CHANNEL(1, IIO_TEMP, "ADCIN1"),
    216	TWL4030_ADC_CHANNEL(2, IIO_VOLTAGE, "ADCIN2"),
    217	TWL4030_ADC_CHANNEL(3, IIO_VOLTAGE, "ADCIN3"),
    218	TWL4030_ADC_CHANNEL(4, IIO_VOLTAGE, "ADCIN4"),
    219	TWL4030_ADC_CHANNEL(5, IIO_VOLTAGE, "ADCIN5"),
    220	TWL4030_ADC_CHANNEL(6, IIO_VOLTAGE, "ADCIN6"),
    221	TWL4030_ADC_CHANNEL(7, IIO_VOLTAGE, "ADCIN7"),
    222	TWL4030_ADC_CHANNEL(8, IIO_VOLTAGE, "ADCIN8"),
    223	TWL4030_ADC_CHANNEL(9, IIO_VOLTAGE, "ADCIN9"),
    224	TWL4030_ADC_CHANNEL(10, IIO_CURRENT, "ADCIN10"),
    225	TWL4030_ADC_CHANNEL(11, IIO_VOLTAGE, "ADCIN11"),
    226	TWL4030_ADC_CHANNEL(12, IIO_VOLTAGE, "ADCIN12"),
    227	TWL4030_ADC_CHANNEL(13, IIO_VOLTAGE, "ADCIN13"),
    228	TWL4030_ADC_CHANNEL(14, IIO_VOLTAGE, "ADCIN14"),
    229	TWL4030_ADC_CHANNEL(15, IIO_VOLTAGE, "ADCIN15"),
    230};
    231
    232static struct twl4030_madc_data *twl4030_madc;
    233
    234static const struct s16_fract twl4030_divider_ratios[16] = {
    235	{1, 1},		/* CHANNEL 0 No Prescaler */
    236	{1, 1},		/* CHANNEL 1 No Prescaler */
    237	{6, 10},	/* CHANNEL 2 */
    238	{6, 10},	/* CHANNEL 3 */
    239	{6, 10},	/* CHANNEL 4 */
    240	{6, 10},	/* CHANNEL 5 */
    241	{6, 10},	/* CHANNEL 6 */
    242	{6, 10},	/* CHANNEL 7 */
    243	{3, 14},	/* CHANNEL 8 */
    244	{1, 3},		/* CHANNEL 9 */
    245	{1, 1},		/* CHANNEL 10 No Prescaler */
    246	{15, 100},	/* CHANNEL 11 */
    247	{1, 4},		/* CHANNEL 12 */
    248	{1, 1},		/* CHANNEL 13 Reserved channels */
    249	{1, 1},		/* CHANNEL 14 Reseved channels */
    250	{5, 11},	/* CHANNEL 15 */
    251};
    252
    253/* Conversion table from -3 to 55 degrees Celcius */
    254static int twl4030_therm_tbl[] = {
    255	30800,	29500,	28300,	27100,
    256	26000,	24900,	23900,	22900,	22000,	21100,	20300,	19400,	18700,
    257	17900,	17200,	16500,	15900,	15300,	14700,	14100,	13600,	13100,
    258	12600,	12100,	11600,	11200,	10800,	10400,	10000,	9630,	9280,
    259	8950,	8620,	8310,	8020,	7730,	7460,	7200,	6950,	6710,
    260	6470,	6250,	6040,	5830,	5640,	5450,	5260,	5090,	4920,
    261	4760,	4600,	4450,	4310,	4170,	4040,	3910,	3790,	3670,
    262	3550
    263};
    264
    265/*
    266 * Structure containing the registers
    267 * of different conversion methods supported by MADC.
    268 * Hardware or RT real time conversion request initiated by external host
    269 * processor for RT Signal conversions.
    270 * External host processors can also request for non RT conversions
    271 * SW1 and SW2 software conversions also called asynchronous or GPC request.
    272 */
    273static
    274const struct twl4030_madc_conversion_method twl4030_conversion_methods[] = {
    275	[TWL4030_MADC_RT] = {
    276			     .sel = TWL4030_MADC_RTSELECT_LSB,
    277			     .avg = TWL4030_MADC_RTAVERAGE_LSB,
    278			     .rbase = TWL4030_MADC_RTCH0_LSB,
    279			     },
    280	[TWL4030_MADC_SW1] = {
    281			      .sel = TWL4030_MADC_SW1SELECT_LSB,
    282			      .avg = TWL4030_MADC_SW1AVERAGE_LSB,
    283			      .rbase = TWL4030_MADC_GPCH0_LSB,
    284			      .ctrl = TWL4030_MADC_CTRL_SW1,
    285			      },
    286	[TWL4030_MADC_SW2] = {
    287			      .sel = TWL4030_MADC_SW2SELECT_LSB,
    288			      .avg = TWL4030_MADC_SW2AVERAGE_LSB,
    289			      .rbase = TWL4030_MADC_GPCH0_LSB,
    290			      .ctrl = TWL4030_MADC_CTRL_SW2,
    291			      },
    292};
    293
    294/**
    295 * twl4030_madc_channel_raw_read() - Function to read a particular channel value
    296 * @madc:	pointer to struct twl4030_madc_data
    297 * @reg:	lsb of ADC Channel
    298 *
    299 * Return: 0 on success, an error code otherwise.
    300 */
    301static int twl4030_madc_channel_raw_read(struct twl4030_madc_data *madc, u8 reg)
    302{
    303	u16 val;
    304	int ret;
    305	/*
    306	 * For each ADC channel, we have MSB and LSB register pair. MSB address
    307	 * is always LSB address+1. reg parameter is the address of LSB register
    308	 */
    309	ret = twl_i2c_read_u16(TWL4030_MODULE_MADC, &val, reg);
    310	if (ret) {
    311		dev_err(madc->dev, "unable to read register 0x%X\n", reg);
    312		return ret;
    313	}
    314
    315	return (int)(val >> 6);
    316}
    317
    318/*
    319 * Return battery temperature in degrees Celsius
    320 * Or < 0 on failure.
    321 */
    322static int twl4030battery_temperature(int raw_volt)
    323{
    324	u8 val;
    325	int temp, curr, volt, res, ret;
    326
    327	volt = (raw_volt * TEMP_STEP_SIZE) / TEMP_PSR_R;
    328	/* Getting and calculating the supply current in micro amperes */
    329	ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE, &val,
    330		REG_BCICTL2);
    331	if (ret < 0)
    332		return ret;
    333
    334	curr = ((val & TWL4030_BCI_ITHSENS) + 1) * 10;
    335	/* Getting and calculating the thermistor resistance in ohms */
    336	res = volt * 1000 / curr;
    337	/* calculating temperature */
    338	for (temp = 58; temp >= 0; temp--) {
    339		int actual = twl4030_therm_tbl[temp];
    340		if ((actual - res) >= 0)
    341			break;
    342	}
    343
    344	return temp + 1;
    345}
    346
    347static int twl4030battery_current(int raw_volt)
    348{
    349	int ret;
    350	u8 val;
    351
    352	ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE, &val,
    353		TWL4030_BCI_BCICTL1);
    354	if (ret)
    355		return ret;
    356	if (val & TWL4030_BCI_CGAIN) /* slope of 0.44 mV/mA */
    357		return (raw_volt * CURR_STEP_SIZE) / CURR_PSR_R1;
    358	else /* slope of 0.88 mV/mA */
    359		return (raw_volt * CURR_STEP_SIZE) / CURR_PSR_R2;
    360}
    361
    362/*
    363 * Function to read channel values
    364 * @madc - pointer to twl4030_madc_data struct
    365 * @reg_base - Base address of the first channel
    366 * @Channels - 16 bit bitmap. If the bit is set, channel's value is read
    367 * @buf - The channel values are stored here. if read fails error
    368 * @raw - Return raw values without conversion
    369 * value is stored
    370 * Returns the number of successfully read channels.
    371 */
    372static int twl4030_madc_read_channels(struct twl4030_madc_data *madc,
    373				      u8 reg_base, unsigned
    374				      long channels, int *buf,
    375				      bool raw)
    376{
    377	int count = 0;
    378	int i;
    379	u8 reg;
    380
    381	for_each_set_bit(i, &channels, TWL4030_MADC_MAX_CHANNELS) {
    382		reg = reg_base + (2 * i);
    383		buf[i] = twl4030_madc_channel_raw_read(madc, reg);
    384		if (buf[i] < 0) {
    385			dev_err(madc->dev, "Unable to read register 0x%X\n",
    386				reg);
    387			return buf[i];
    388		}
    389		if (raw) {
    390			count++;
    391			continue;
    392		}
    393		switch (i) {
    394		case 10:
    395			buf[i] = twl4030battery_current(buf[i]);
    396			if (buf[i] < 0) {
    397				dev_err(madc->dev, "err reading current\n");
    398				return buf[i];
    399			} else {
    400				count++;
    401				buf[i] = buf[i] - 750;
    402			}
    403			break;
    404		case 1:
    405			buf[i] = twl4030battery_temperature(buf[i]);
    406			if (buf[i] < 0) {
    407				dev_err(madc->dev, "err reading temperature\n");
    408				return buf[i];
    409			} else {
    410				buf[i] -= 3;
    411				count++;
    412			}
    413			break;
    414		default:
    415			count++;
    416			/* Analog Input (V) = conv_result * step_size / R
    417			 * conv_result = decimal value of 10-bit conversion
    418			 *		 result
    419			 * step size = 1.5 / (2 ^ 10 -1)
    420			 * R = Prescaler ratio for input channels.
    421			 * Result given in mV hence multiplied by 1000.
    422			 */
    423			buf[i] = (buf[i] * 3 * 1000 *
    424				 twl4030_divider_ratios[i].denominator)
    425				/ (2 * 1023 *
    426				twl4030_divider_ratios[i].numerator);
    427		}
    428	}
    429
    430	return count;
    431}
    432
    433/*
    434 * Disables irq.
    435 * @madc - pointer to twl4030_madc_data struct
    436 * @id - irq number to be disabled
    437 * can take one of TWL4030_MADC_RT, TWL4030_MADC_SW1, TWL4030_MADC_SW2
    438 * corresponding to RT, SW1, SW2 conversion requests.
    439 * Returns error if i2c read/write fails.
    440 */
    441static int twl4030_madc_disable_irq(struct twl4030_madc_data *madc, u8 id)
    442{
    443	u8 val;
    444	int ret;
    445
    446	ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &val, madc->imr);
    447	if (ret) {
    448		dev_err(madc->dev, "unable to read imr register 0x%X\n",
    449			madc->imr);
    450		return ret;
    451	}
    452	val |= (1 << id);
    453	ret = twl_i2c_write_u8(TWL4030_MODULE_MADC, val, madc->imr);
    454	if (ret) {
    455		dev_err(madc->dev,
    456			"unable to write imr register 0x%X\n", madc->imr);
    457		return ret;
    458	}
    459
    460	return 0;
    461}
    462
    463static irqreturn_t twl4030_madc_threaded_irq_handler(int irq, void *_madc)
    464{
    465	struct twl4030_madc_data *madc = _madc;
    466	const struct twl4030_madc_conversion_method *method;
    467	u8 isr_val, imr_val;
    468	int i, ret;
    469	struct twl4030_madc_request *r;
    470
    471	mutex_lock(&madc->lock);
    472	ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &isr_val, madc->isr);
    473	if (ret) {
    474		dev_err(madc->dev, "unable to read isr register 0x%X\n",
    475			madc->isr);
    476		goto err_i2c;
    477	}
    478	ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &imr_val, madc->imr);
    479	if (ret) {
    480		dev_err(madc->dev, "unable to read imr register 0x%X\n",
    481			madc->imr);
    482		goto err_i2c;
    483	}
    484	isr_val &= ~imr_val;
    485	for (i = 0; i < TWL4030_MADC_NUM_METHODS; i++) {
    486		if (!(isr_val & (1 << i)))
    487			continue;
    488		ret = twl4030_madc_disable_irq(madc, i);
    489		if (ret < 0)
    490			dev_dbg(madc->dev, "Disable interrupt failed %d\n", i);
    491		madc->requests[i].result_pending = true;
    492	}
    493	for (i = 0; i < TWL4030_MADC_NUM_METHODS; i++) {
    494		r = &madc->requests[i];
    495		/* No pending results for this method, move to next one */
    496		if (!r->result_pending)
    497			continue;
    498		method = &twl4030_conversion_methods[r->method];
    499		/* Read results */
    500		twl4030_madc_read_channels(madc, method->rbase,
    501					   r->channels, r->rbuf, r->raw);
    502		/* Free request */
    503		r->result_pending = false;
    504		r->active = false;
    505	}
    506	mutex_unlock(&madc->lock);
    507
    508	return IRQ_HANDLED;
    509
    510err_i2c:
    511	/*
    512	 * In case of error check whichever request is active
    513	 * and service the same.
    514	 */
    515	for (i = 0; i < TWL4030_MADC_NUM_METHODS; i++) {
    516		r = &madc->requests[i];
    517		if (!r->active)
    518			continue;
    519		method = &twl4030_conversion_methods[r->method];
    520		/* Read results */
    521		twl4030_madc_read_channels(madc, method->rbase,
    522					   r->channels, r->rbuf, r->raw);
    523		/* Free request */
    524		r->result_pending = false;
    525		r->active = false;
    526	}
    527	mutex_unlock(&madc->lock);
    528
    529	return IRQ_HANDLED;
    530}
    531
    532/*
    533 * Function which enables the madc conversion
    534 * by writing to the control register.
    535 * @madc - pointer to twl4030_madc_data struct
    536 * @conv_method - can be TWL4030_MADC_RT, TWL4030_MADC_SW2, TWL4030_MADC_SW1
    537 * corresponding to RT SW1 or SW2 conversion methods.
    538 * Returns 0 if succeeds else a negative error value
    539 */
    540static int twl4030_madc_start_conversion(struct twl4030_madc_data *madc,
    541					 int conv_method)
    542{
    543	const struct twl4030_madc_conversion_method *method;
    544	int ret = 0;
    545
    546	if (conv_method != TWL4030_MADC_SW1 && conv_method != TWL4030_MADC_SW2)
    547		return -ENOTSUPP;
    548
    549	method = &twl4030_conversion_methods[conv_method];
    550	ret = twl_i2c_write_u8(TWL4030_MODULE_MADC, TWL4030_MADC_SW_START,
    551			       method->ctrl);
    552	if (ret) {
    553		dev_err(madc->dev, "unable to write ctrl register 0x%X\n",
    554			method->ctrl);
    555		return ret;
    556	}
    557
    558	return 0;
    559}
    560
    561/*
    562 * Function that waits for conversion to be ready
    563 * @madc - pointer to twl4030_madc_data struct
    564 * @timeout_ms - timeout value in milliseconds
    565 * @status_reg - ctrl register
    566 * returns 0 if succeeds else a negative error value
    567 */
    568static int twl4030_madc_wait_conversion_ready(struct twl4030_madc_data *madc,
    569					      unsigned int timeout_ms,
    570					      u8 status_reg)
    571{
    572	unsigned long timeout;
    573	int ret;
    574
    575	timeout = jiffies + msecs_to_jiffies(timeout_ms);
    576	do {
    577		u8 reg;
    578
    579		ret = twl_i2c_read_u8(TWL4030_MODULE_MADC, &reg, status_reg);
    580		if (ret) {
    581			dev_err(madc->dev,
    582				"unable to read status register 0x%X\n",
    583				status_reg);
    584			return ret;
    585		}
    586		if (!(reg & TWL4030_MADC_BUSY) && (reg & TWL4030_MADC_EOC_SW))
    587			return 0;
    588		usleep_range(500, 2000);
    589	} while (!time_after(jiffies, timeout));
    590	dev_err(madc->dev, "conversion timeout!\n");
    591
    592	return -EAGAIN;
    593}
    594
    595/*
    596 * An exported function which can be called from other kernel drivers.
    597 * @req twl4030_madc_request structure
    598 * req->rbuf will be filled with read values of channels based on the
    599 * channel index. If a particular channel reading fails there will
    600 * be a negative error value in the corresponding array element.
    601 * returns 0 if succeeds else error value
    602 */
    603static int twl4030_madc_conversion(struct twl4030_madc_request *req)
    604{
    605	const struct twl4030_madc_conversion_method *method;
    606	int ret;
    607
    608	if (!req || !twl4030_madc)
    609		return -EINVAL;
    610
    611	mutex_lock(&twl4030_madc->lock);
    612	if (req->method < TWL4030_MADC_RT || req->method > TWL4030_MADC_SW2) {
    613		ret = -EINVAL;
    614		goto out;
    615	}
    616	/* Do we have a conversion request ongoing */
    617	if (twl4030_madc->requests[req->method].active) {
    618		ret = -EBUSY;
    619		goto out;
    620	}
    621	method = &twl4030_conversion_methods[req->method];
    622	/* Select channels to be converted */
    623	ret = twl_i2c_write_u16(TWL4030_MODULE_MADC, req->channels, method->sel);
    624	if (ret) {
    625		dev_err(twl4030_madc->dev,
    626			"unable to write sel register 0x%X\n", method->sel);
    627		goto out;
    628	}
    629	/* Select averaging for all channels if do_avg is set */
    630	if (req->do_avg) {
    631		ret = twl_i2c_write_u16(TWL4030_MODULE_MADC, req->channels,
    632				       method->avg);
    633		if (ret) {
    634			dev_err(twl4030_madc->dev,
    635				"unable to write avg register 0x%X\n",
    636				method->avg);
    637			goto out;
    638		}
    639	}
    640	/* With RT method we should not be here anymore */
    641	if (req->method == TWL4030_MADC_RT) {
    642		ret = -EINVAL;
    643		goto out;
    644	}
    645	ret = twl4030_madc_start_conversion(twl4030_madc, req->method);
    646	if (ret < 0)
    647		goto out;
    648	twl4030_madc->requests[req->method].active = true;
    649	/* Wait until conversion is ready (ctrl register returns EOC) */
    650	ret = twl4030_madc_wait_conversion_ready(twl4030_madc, 5, method->ctrl);
    651	if (ret) {
    652		twl4030_madc->requests[req->method].active = false;
    653		goto out;
    654	}
    655	ret = twl4030_madc_read_channels(twl4030_madc, method->rbase,
    656					 req->channels, req->rbuf, req->raw);
    657	twl4030_madc->requests[req->method].active = false;
    658
    659out:
    660	mutex_unlock(&twl4030_madc->lock);
    661
    662	return ret;
    663}
    664
    665/**
    666 * twl4030_madc_set_current_generator() - setup bias current
    667 *
    668 * @madc:	pointer to twl4030_madc_data struct
    669 * @chan:	can be one of the two values:
    670 *		0 - Enables bias current for main battery type reading
    671 *		1 - Enables bias current for main battery temperature sensing
    672 * @on:		enable or disable chan.
    673 *
    674 * Function to enable or disable bias current for
    675 * main battery type reading or temperature sensing
    676 */
    677static int twl4030_madc_set_current_generator(struct twl4030_madc_data *madc,
    678					      int chan, int on)
    679{
    680	int ret;
    681	int regmask;
    682	u8 regval;
    683
    684	ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE,
    685			      &regval, TWL4030_BCI_BCICTL1);
    686	if (ret) {
    687		dev_err(madc->dev, "unable to read BCICTL1 reg 0x%X",
    688			TWL4030_BCI_BCICTL1);
    689		return ret;
    690	}
    691
    692	regmask = chan ? TWL4030_BCI_ITHEN : TWL4030_BCI_TYPEN;
    693	if (on)
    694		regval |= regmask;
    695	else
    696		regval &= ~regmask;
    697
    698	ret = twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE,
    699			       regval, TWL4030_BCI_BCICTL1);
    700	if (ret) {
    701		dev_err(madc->dev, "unable to write BCICTL1 reg 0x%X\n",
    702			TWL4030_BCI_BCICTL1);
    703		return ret;
    704	}
    705
    706	return 0;
    707}
    708
    709/*
    710 * Function that sets MADC software power on bit to enable MADC
    711 * @madc - pointer to twl4030_madc_data struct
    712 * @on - Enable or disable MADC software power on bit.
    713 * returns error if i2c read/write fails else 0
    714 */
    715static int twl4030_madc_set_power(struct twl4030_madc_data *madc, int on)
    716{
    717	u8 regval;
    718	int ret;
    719
    720	ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE,
    721			      &regval, TWL4030_MADC_CTRL1);
    722	if (ret) {
    723		dev_err(madc->dev, "unable to read madc ctrl1 reg 0x%X\n",
    724			TWL4030_MADC_CTRL1);
    725		return ret;
    726	}
    727	if (on)
    728		regval |= TWL4030_MADC_MADCON;
    729	else
    730		regval &= ~TWL4030_MADC_MADCON;
    731	ret = twl_i2c_write_u8(TWL4030_MODULE_MADC, regval, TWL4030_MADC_CTRL1);
    732	if (ret) {
    733		dev_err(madc->dev, "unable to write madc ctrl1 reg 0x%X\n",
    734			TWL4030_MADC_CTRL1);
    735		return ret;
    736	}
    737
    738	return 0;
    739}
    740
    741/*
    742 * Initialize MADC and request for threaded irq
    743 */
    744static int twl4030_madc_probe(struct platform_device *pdev)
    745{
    746	struct twl4030_madc_data *madc;
    747	struct twl4030_madc_platform_data *pdata = dev_get_platdata(&pdev->dev);
    748	struct device_node *np = pdev->dev.of_node;
    749	int irq, ret;
    750	u8 regval;
    751	struct iio_dev *iio_dev = NULL;
    752
    753	if (!pdata && !np) {
    754		dev_err(&pdev->dev, "neither platform data nor Device Tree node available\n");
    755		return -EINVAL;
    756	}
    757
    758	iio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*madc));
    759	if (!iio_dev) {
    760		dev_err(&pdev->dev, "failed allocating iio device\n");
    761		return -ENOMEM;
    762	}
    763
    764	madc = iio_priv(iio_dev);
    765	madc->dev = &pdev->dev;
    766
    767	iio_dev->name = dev_name(&pdev->dev);
    768	iio_dev->info = &twl4030_madc_iio_info;
    769	iio_dev->modes = INDIO_DIRECT_MODE;
    770	iio_dev->channels = twl4030_madc_iio_channels;
    771	iio_dev->num_channels = ARRAY_SIZE(twl4030_madc_iio_channels);
    772
    773	/*
    774	 * Phoenix provides 2 interrupt lines. The first one is connected to
    775	 * the OMAP. The other one can be connected to the other processor such
    776	 * as modem. Hence two separate ISR and IMR registers.
    777	 */
    778	if (pdata)
    779		madc->use_second_irq = (pdata->irq_line != 1);
    780	else
    781		madc->use_second_irq = of_property_read_bool(np,
    782				       "ti,system-uses-second-madc-irq");
    783
    784	madc->imr = madc->use_second_irq ? TWL4030_MADC_IMR2 :
    785					   TWL4030_MADC_IMR1;
    786	madc->isr = madc->use_second_irq ? TWL4030_MADC_ISR2 :
    787					   TWL4030_MADC_ISR1;
    788
    789	ret = twl4030_madc_set_power(madc, 1);
    790	if (ret < 0)
    791		return ret;
    792	ret = twl4030_madc_set_current_generator(madc, 0, 1);
    793	if (ret < 0)
    794		goto err_current_generator;
    795
    796	ret = twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE,
    797			      &regval, TWL4030_BCI_BCICTL1);
    798	if (ret) {
    799		dev_err(&pdev->dev, "unable to read reg BCI CTL1 0x%X\n",
    800			TWL4030_BCI_BCICTL1);
    801		goto err_i2c;
    802	}
    803	regval |= TWL4030_BCI_MESBAT;
    804	ret = twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE,
    805			       regval, TWL4030_BCI_BCICTL1);
    806	if (ret) {
    807		dev_err(&pdev->dev, "unable to write reg BCI Ctl1 0x%X\n",
    808			TWL4030_BCI_BCICTL1);
    809		goto err_i2c;
    810	}
    811
    812	/* Check that MADC clock is on */
    813	ret = twl_i2c_read_u8(TWL4030_MODULE_INTBR, &regval, TWL4030_REG_GPBR1);
    814	if (ret) {
    815		dev_err(&pdev->dev, "unable to read reg GPBR1 0x%X\n",
    816				TWL4030_REG_GPBR1);
    817		goto err_i2c;
    818	}
    819
    820	/* If MADC clk is not on, turn it on */
    821	if (!(regval & TWL4030_GPBR1_MADC_HFCLK_EN)) {
    822		dev_info(&pdev->dev, "clk disabled, enabling\n");
    823		regval |= TWL4030_GPBR1_MADC_HFCLK_EN;
    824		ret = twl_i2c_write_u8(TWL4030_MODULE_INTBR, regval,
    825				       TWL4030_REG_GPBR1);
    826		if (ret) {
    827			dev_err(&pdev->dev, "unable to write reg GPBR1 0x%X\n",
    828					TWL4030_REG_GPBR1);
    829			goto err_i2c;
    830		}
    831	}
    832
    833	platform_set_drvdata(pdev, iio_dev);
    834	mutex_init(&madc->lock);
    835
    836	irq = platform_get_irq(pdev, 0);
    837	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
    838				   twl4030_madc_threaded_irq_handler,
    839				   IRQF_TRIGGER_RISING | IRQF_ONESHOT,
    840				   "twl4030_madc", madc);
    841	if (ret) {
    842		dev_err(&pdev->dev, "could not request irq\n");
    843		goto err_i2c;
    844	}
    845	twl4030_madc = madc;
    846
    847	/* Configure MADC[3:6] */
    848	ret = twl_i2c_read_u8(TWL_MODULE_USB, &regval,
    849			TWL4030_USB_CARKIT_ANA_CTRL);
    850	if (ret) {
    851		dev_err(&pdev->dev, "unable to read reg CARKIT_ANA_CTRL  0x%X\n",
    852				TWL4030_USB_CARKIT_ANA_CTRL);
    853		goto err_i2c;
    854	}
    855	regval |= TWL4030_USB_SEL_MADC_MCPC;
    856	ret = twl_i2c_write_u8(TWL_MODULE_USB, regval,
    857				 TWL4030_USB_CARKIT_ANA_CTRL);
    858	if (ret) {
    859		dev_err(&pdev->dev, "unable to write reg CARKIT_ANA_CTRL 0x%X\n",
    860				TWL4030_USB_CARKIT_ANA_CTRL);
    861		goto err_i2c;
    862	}
    863
    864	/* Enable 3v1 bias regulator for MADC[3:6] */
    865	madc->usb3v1 = devm_regulator_get(madc->dev, "vusb3v1");
    866	if (IS_ERR(madc->usb3v1)) {
    867		ret = -ENODEV;
    868		goto err_i2c;
    869	}
    870
    871	ret = regulator_enable(madc->usb3v1);
    872	if (ret) {
    873		dev_err(madc->dev, "could not enable 3v1 bias regulator\n");
    874		goto err_i2c;
    875	}
    876
    877	ret = iio_device_register(iio_dev);
    878	if (ret) {
    879		dev_err(&pdev->dev, "could not register iio device\n");
    880		goto err_usb3v1;
    881	}
    882
    883	return 0;
    884
    885err_usb3v1:
    886	regulator_disable(madc->usb3v1);
    887err_i2c:
    888	twl4030_madc_set_current_generator(madc, 0, 0);
    889err_current_generator:
    890	twl4030_madc_set_power(madc, 0);
    891	return ret;
    892}
    893
    894static int twl4030_madc_remove(struct platform_device *pdev)
    895{
    896	struct iio_dev *iio_dev = platform_get_drvdata(pdev);
    897	struct twl4030_madc_data *madc = iio_priv(iio_dev);
    898
    899	iio_device_unregister(iio_dev);
    900
    901	twl4030_madc_set_current_generator(madc, 0, 0);
    902	twl4030_madc_set_power(madc, 0);
    903
    904	regulator_disable(madc->usb3v1);
    905
    906	return 0;
    907}
    908
    909#ifdef CONFIG_OF
    910static const struct of_device_id twl_madc_of_match[] = {
    911	{ .compatible = "ti,twl4030-madc", },
    912	{ },
    913};
    914MODULE_DEVICE_TABLE(of, twl_madc_of_match);
    915#endif
    916
    917static struct platform_driver twl4030_madc_driver = {
    918	.probe = twl4030_madc_probe,
    919	.remove = twl4030_madc_remove,
    920	.driver = {
    921		   .name = "twl4030_madc",
    922		   .of_match_table = of_match_ptr(twl_madc_of_match),
    923	},
    924};
    925
    926module_platform_driver(twl4030_madc_driver);
    927
    928MODULE_DESCRIPTION("TWL4030 ADC driver");
    929MODULE_LICENSE("GPL");
    930MODULE_AUTHOR("J Keerthy");
    931MODULE_ALIAS("platform:twl4030_madc");