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

sc27xx_adc.c (24596B)


      1// SPDX-License-Identifier: GPL-2.0
      2// Copyright (C) 2018 Spreadtrum Communications Inc.
      3
      4#include <linux/hwspinlock.h>
      5#include <linux/iio/iio.h>
      6#include <linux/module.h>
      7#include <linux/nvmem-consumer.h>
      8#include <linux/of.h>
      9#include <linux/of_device.h>
     10#include <linux/platform_device.h>
     11#include <linux/regmap.h>
     12#include <linux/regulator/consumer.h>
     13#include <linux/slab.h>
     14
     15/* PMIC global registers definition */
     16#define SC2730_MODULE_EN		0x1808
     17#define SC2731_MODULE_EN		0xc08
     18#define SC27XX_MODULE_ADC_EN		BIT(5)
     19#define SC2721_ARM_CLK_EN		0xc0c
     20#define SC2730_ARM_CLK_EN		0x180c
     21#define SC2731_ARM_CLK_EN		0xc10
     22#define SC27XX_CLK_ADC_EN		BIT(5)
     23#define SC27XX_CLK_ADC_CLK_EN		BIT(6)
     24
     25/* ADC controller registers definition */
     26#define SC27XX_ADC_CTL			0x0
     27#define SC27XX_ADC_CH_CFG		0x4
     28#define SC27XX_ADC_DATA			0x4c
     29#define SC27XX_ADC_INT_EN		0x50
     30#define SC27XX_ADC_INT_CLR		0x54
     31#define SC27XX_ADC_INT_STS		0x58
     32#define SC27XX_ADC_INT_RAW		0x5c
     33
     34/* Bits and mask definition for SC27XX_ADC_CTL register */
     35#define SC27XX_ADC_EN			BIT(0)
     36#define SC27XX_ADC_CHN_RUN		BIT(1)
     37#define SC27XX_ADC_12BIT_MODE		BIT(2)
     38#define SC27XX_ADC_RUN_NUM_MASK		GENMASK(7, 4)
     39#define SC27XX_ADC_RUN_NUM_SHIFT	4
     40
     41/* Bits and mask definition for SC27XX_ADC_CH_CFG register */
     42#define SC27XX_ADC_CHN_ID_MASK		GENMASK(4, 0)
     43#define SC27XX_ADC_SCALE_MASK		GENMASK(10, 9)
     44#define SC2721_ADC_SCALE_MASK		BIT(5)
     45#define SC27XX_ADC_SCALE_SHIFT		9
     46#define SC2721_ADC_SCALE_SHIFT		5
     47
     48/* Bits definitions for SC27XX_ADC_INT_EN registers */
     49#define SC27XX_ADC_IRQ_EN		BIT(0)
     50
     51/* Bits definitions for SC27XX_ADC_INT_CLR registers */
     52#define SC27XX_ADC_IRQ_CLR		BIT(0)
     53
     54/* Bits definitions for SC27XX_ADC_INT_RAW registers */
     55#define SC27XX_ADC_IRQ_RAW		BIT(0)
     56
     57/* Mask definition for SC27XX_ADC_DATA register */
     58#define SC27XX_ADC_DATA_MASK		GENMASK(11, 0)
     59
     60/* Timeout (ms) for the trylock of hardware spinlocks */
     61#define SC27XX_ADC_HWLOCK_TIMEOUT	5000
     62
     63/* Timeout (us) for ADC data conversion according to ADC datasheet */
     64#define SC27XX_ADC_RDY_TIMEOUT		1000000
     65#define SC27XX_ADC_POLL_RAW_STATUS	500
     66
     67/* Maximum ADC channel number */
     68#define SC27XX_ADC_CHANNEL_MAX		32
     69
     70/* ADC voltage ratio definition */
     71#define SC27XX_VOLT_RATIO(n, d)		\
     72	(((n) << SC27XX_RATIO_NUMERATOR_OFFSET) | (d))
     73#define SC27XX_RATIO_NUMERATOR_OFFSET	16
     74#define SC27XX_RATIO_DENOMINATOR_MASK	GENMASK(15, 0)
     75
     76/* ADC specific channel reference voltage 3.5V */
     77#define SC27XX_ADC_REFVOL_VDD35		3500000
     78
     79/* ADC default channel reference voltage is 2.8V */
     80#define SC27XX_ADC_REFVOL_VDD28		2800000
     81
     82struct sc27xx_adc_data {
     83	struct device *dev;
     84	struct regulator *volref;
     85	struct regmap *regmap;
     86	/*
     87	 * One hardware spinlock to synchronize between the multiple
     88	 * subsystems which will access the unique ADC controller.
     89	 */
     90	struct hwspinlock *hwlock;
     91	int channel_scale[SC27XX_ADC_CHANNEL_MAX];
     92	u32 base;
     93	int irq;
     94	const struct sc27xx_adc_variant_data *var_data;
     95};
     96
     97/*
     98 * Since different PMICs of SC27xx series can have different
     99 * address and ratio, we should save ratio config and base
    100 * in the device data structure.
    101 */
    102struct sc27xx_adc_variant_data {
    103	u32 module_en;
    104	u32 clk_en;
    105	u32 scale_shift;
    106	u32 scale_mask;
    107	const struct sc27xx_adc_linear_graph *bscale_cal;
    108	const struct sc27xx_adc_linear_graph *sscale_cal;
    109	void (*init_scale)(struct sc27xx_adc_data *data);
    110	int (*get_ratio)(int channel, int scale);
    111	bool set_volref;
    112};
    113
    114struct sc27xx_adc_linear_graph {
    115	int volt0;
    116	int adc0;
    117	int volt1;
    118	int adc1;
    119};
    120
    121/*
    122 * According to the datasheet, we can convert one ADC value to one voltage value
    123 * through 2 points in the linear graph. If the voltage is less than 1.2v, we
    124 * should use the small-scale graph, and if more than 1.2v, we should use the
    125 * big-scale graph.
    126 */
    127static struct sc27xx_adc_linear_graph big_scale_graph = {
    128	4200, 3310,
    129	3600, 2832,
    130};
    131
    132static struct sc27xx_adc_linear_graph small_scale_graph = {
    133	1000, 3413,
    134	100, 341,
    135};
    136
    137static const struct sc27xx_adc_linear_graph sc2731_big_scale_graph_calib = {
    138	4200, 850,
    139	3600, 728,
    140};
    141
    142static const struct sc27xx_adc_linear_graph sc2731_small_scale_graph_calib = {
    143	1000, 838,
    144	100, 84,
    145};
    146
    147static const struct sc27xx_adc_linear_graph big_scale_graph_calib = {
    148	4200, 856,
    149	3600, 733,
    150};
    151
    152static const struct sc27xx_adc_linear_graph small_scale_graph_calib = {
    153	1000, 833,
    154	100, 80,
    155};
    156
    157static int sc27xx_adc_get_calib_data(u32 calib_data, int calib_adc)
    158{
    159	return ((calib_data & 0xff) + calib_adc - 128) * 4;
    160}
    161
    162/* get the adc nvmem cell calibration data */
    163static int adc_nvmem_cell_calib_data(struct sc27xx_adc_data *data, const char *cell_name)
    164{
    165	struct nvmem_cell *cell;
    166	void *buf;
    167	u32 origin_calib_data = 0;
    168	size_t len;
    169
    170	if (!data)
    171		return -EINVAL;
    172
    173	cell = nvmem_cell_get(data->dev, cell_name);
    174	if (IS_ERR(cell))
    175		return PTR_ERR(cell);
    176
    177	buf = nvmem_cell_read(cell, &len);
    178	if (IS_ERR(buf)) {
    179		nvmem_cell_put(cell);
    180		return PTR_ERR(buf);
    181	}
    182
    183	memcpy(&origin_calib_data, buf, min(len, sizeof(u32)));
    184
    185	kfree(buf);
    186	nvmem_cell_put(cell);
    187	return origin_calib_data;
    188}
    189
    190static int sc27xx_adc_scale_calibration(struct sc27xx_adc_data *data,
    191					bool big_scale)
    192{
    193	const struct sc27xx_adc_linear_graph *calib_graph;
    194	struct sc27xx_adc_linear_graph *graph;
    195	const char *cell_name;
    196	u32 calib_data = 0;
    197
    198	if (big_scale) {
    199		calib_graph = data->var_data->bscale_cal;
    200		graph = &big_scale_graph;
    201		cell_name = "big_scale_calib";
    202	} else {
    203		calib_graph = data->var_data->sscale_cal;
    204		graph = &small_scale_graph;
    205		cell_name = "small_scale_calib";
    206	}
    207
    208	calib_data = adc_nvmem_cell_calib_data(data, cell_name);
    209
    210	/* Only need to calibrate the adc values in the linear graph. */
    211	graph->adc0 = sc27xx_adc_get_calib_data(calib_data, calib_graph->adc0);
    212	graph->adc1 = sc27xx_adc_get_calib_data(calib_data >> 8,
    213						calib_graph->adc1);
    214
    215	return 0;
    216}
    217
    218static int sc2720_adc_get_ratio(int channel, int scale)
    219{
    220	switch (channel) {
    221	case 14:
    222		switch (scale) {
    223		case 0:
    224			return SC27XX_VOLT_RATIO(68, 900);
    225		case 1:
    226			return SC27XX_VOLT_RATIO(68, 1760);
    227		case 2:
    228			return SC27XX_VOLT_RATIO(68, 2327);
    229		case 3:
    230			return SC27XX_VOLT_RATIO(68, 3654);
    231		default:
    232			return SC27XX_VOLT_RATIO(1, 1);
    233		}
    234	case 16:
    235		switch (scale) {
    236		case 0:
    237			return SC27XX_VOLT_RATIO(48, 100);
    238		case 1:
    239			return SC27XX_VOLT_RATIO(480, 1955);
    240		case 2:
    241			return SC27XX_VOLT_RATIO(480, 2586);
    242		case 3:
    243			return SC27XX_VOLT_RATIO(48, 406);
    244		default:
    245			return SC27XX_VOLT_RATIO(1, 1);
    246		}
    247	case 21:
    248	case 22:
    249	case 23:
    250		switch (scale) {
    251		case 0:
    252			return SC27XX_VOLT_RATIO(3, 8);
    253		case 1:
    254			return SC27XX_VOLT_RATIO(375, 1955);
    255		case 2:
    256			return SC27XX_VOLT_RATIO(375, 2586);
    257		case 3:
    258			return SC27XX_VOLT_RATIO(300, 3248);
    259		default:
    260			return SC27XX_VOLT_RATIO(1, 1);
    261		}
    262	default:
    263		switch (scale) {
    264		case 0:
    265			return SC27XX_VOLT_RATIO(1, 1);
    266		case 1:
    267			return SC27XX_VOLT_RATIO(1000, 1955);
    268		case 2:
    269			return SC27XX_VOLT_RATIO(1000, 2586);
    270		case 3:
    271			return SC27XX_VOLT_RATIO(100, 406);
    272		default:
    273			return SC27XX_VOLT_RATIO(1, 1);
    274		}
    275	}
    276	return SC27XX_VOLT_RATIO(1, 1);
    277}
    278
    279static int sc2721_adc_get_ratio(int channel, int scale)
    280{
    281	switch (channel) {
    282	case 1:
    283	case 2:
    284	case 3:
    285	case 4:
    286		return scale ? SC27XX_VOLT_RATIO(400, 1025) :
    287			SC27XX_VOLT_RATIO(1, 1);
    288	case 5:
    289		return SC27XX_VOLT_RATIO(7, 29);
    290	case 7:
    291	case 9:
    292		return scale ? SC27XX_VOLT_RATIO(100, 125) :
    293			SC27XX_VOLT_RATIO(1, 1);
    294	case 14:
    295		return SC27XX_VOLT_RATIO(68, 900);
    296	case 16:
    297		return SC27XX_VOLT_RATIO(48, 100);
    298	case 19:
    299		return SC27XX_VOLT_RATIO(1, 3);
    300	default:
    301		return SC27XX_VOLT_RATIO(1, 1);
    302	}
    303	return SC27XX_VOLT_RATIO(1, 1);
    304}
    305
    306static int sc2730_adc_get_ratio(int channel, int scale)
    307{
    308	switch (channel) {
    309	case 14:
    310		switch (scale) {
    311		case 0:
    312			return SC27XX_VOLT_RATIO(68, 900);
    313		case 1:
    314			return SC27XX_VOLT_RATIO(68, 1760);
    315		case 2:
    316			return SC27XX_VOLT_RATIO(68, 2327);
    317		case 3:
    318			return SC27XX_VOLT_RATIO(68, 3654);
    319		default:
    320			return SC27XX_VOLT_RATIO(1, 1);
    321		}
    322	case 15:
    323		switch (scale) {
    324		case 0:
    325			return SC27XX_VOLT_RATIO(1, 3);
    326		case 1:
    327			return SC27XX_VOLT_RATIO(1000, 5865);
    328		case 2:
    329			return SC27XX_VOLT_RATIO(500, 3879);
    330		case 3:
    331			return SC27XX_VOLT_RATIO(500, 6090);
    332		default:
    333			return SC27XX_VOLT_RATIO(1, 1);
    334		}
    335	case 16:
    336		switch (scale) {
    337		case 0:
    338			return SC27XX_VOLT_RATIO(48, 100);
    339		case 1:
    340			return SC27XX_VOLT_RATIO(480, 1955);
    341		case 2:
    342			return SC27XX_VOLT_RATIO(480, 2586);
    343		case 3:
    344			return SC27XX_VOLT_RATIO(48, 406);
    345		default:
    346			return SC27XX_VOLT_RATIO(1, 1);
    347		}
    348	case 21:
    349	case 22:
    350	case 23:
    351		switch (scale) {
    352		case 0:
    353			return SC27XX_VOLT_RATIO(3, 8);
    354		case 1:
    355			return SC27XX_VOLT_RATIO(375, 1955);
    356		case 2:
    357			return SC27XX_VOLT_RATIO(375, 2586);
    358		case 3:
    359			return SC27XX_VOLT_RATIO(300, 3248);
    360		default:
    361			return SC27XX_VOLT_RATIO(1, 1);
    362		}
    363	default:
    364		switch (scale) {
    365		case 0:
    366			return SC27XX_VOLT_RATIO(1, 1);
    367		case 1:
    368			return SC27XX_VOLT_RATIO(1000, 1955);
    369		case 2:
    370			return SC27XX_VOLT_RATIO(1000, 2586);
    371		case 3:
    372			return SC27XX_VOLT_RATIO(1000, 4060);
    373		default:
    374			return SC27XX_VOLT_RATIO(1, 1);
    375		}
    376	}
    377	return SC27XX_VOLT_RATIO(1, 1);
    378}
    379
    380static int sc2731_adc_get_ratio(int channel, int scale)
    381{
    382	switch (channel) {
    383	case 1:
    384	case 2:
    385	case 3:
    386	case 4:
    387		return scale ? SC27XX_VOLT_RATIO(400, 1025) :
    388			SC27XX_VOLT_RATIO(1, 1);
    389	case 5:
    390		return SC27XX_VOLT_RATIO(7, 29);
    391	case 6:
    392		return SC27XX_VOLT_RATIO(375, 9000);
    393	case 7:
    394	case 8:
    395		return scale ? SC27XX_VOLT_RATIO(100, 125) :
    396			SC27XX_VOLT_RATIO(1, 1);
    397	case 19:
    398		return SC27XX_VOLT_RATIO(1, 3);
    399	default:
    400		return SC27XX_VOLT_RATIO(1, 1);
    401	}
    402	return SC27XX_VOLT_RATIO(1, 1);
    403}
    404
    405/*
    406 * According to the datasheet set specific value on some channel.
    407 */
    408static void sc2720_adc_scale_init(struct sc27xx_adc_data *data)
    409{
    410	int i;
    411
    412	for (i = 0; i < SC27XX_ADC_CHANNEL_MAX; i++) {
    413		switch (i) {
    414		case 5:
    415			data->channel_scale[i] = 3;
    416			break;
    417		case 7:
    418		case 9:
    419			data->channel_scale[i] = 2;
    420			break;
    421		case 13:
    422			data->channel_scale[i] = 1;
    423			break;
    424		case 19:
    425		case 30:
    426		case 31:
    427			data->channel_scale[i] = 3;
    428			break;
    429		default:
    430			data->channel_scale[i] = 0;
    431			break;
    432		}
    433	}
    434}
    435
    436static void sc2730_adc_scale_init(struct sc27xx_adc_data *data)
    437{
    438	int i;
    439
    440	for (i = 0; i < SC27XX_ADC_CHANNEL_MAX; i++) {
    441		switch (i) {
    442		case 5:
    443		case 10:
    444		case 19:
    445		case 30:
    446		case 31:
    447			data->channel_scale[i] = 3;
    448			break;
    449		case 7:
    450		case 9:
    451			data->channel_scale[i] = 2;
    452			break;
    453		case 13:
    454			data->channel_scale[i] = 1;
    455			break;
    456		default:
    457			data->channel_scale[i] = 0;
    458			break;
    459		}
    460	}
    461}
    462
    463static void sc2731_adc_scale_init(struct sc27xx_adc_data *data)
    464{
    465	int i;
    466	/*
    467	 * In the current software design, SC2731 support 2 scales,
    468	 * channels 5 uses big scale, others use smale.
    469	 */
    470	for (i = 0; i < SC27XX_ADC_CHANNEL_MAX; i++) {
    471		switch (i) {
    472		case 5:
    473			data->channel_scale[i] = 1;
    474			break;
    475		default:
    476			data->channel_scale[i] = 0;
    477			break;
    478		}
    479	}
    480}
    481
    482static int sc27xx_adc_read(struct sc27xx_adc_data *data, int channel,
    483			   int scale, int *val)
    484{
    485	int ret, ret_volref;
    486	u32 tmp, value, status;
    487
    488	ret = hwspin_lock_timeout_raw(data->hwlock, SC27XX_ADC_HWLOCK_TIMEOUT);
    489	if (ret) {
    490		dev_err(data->dev, "timeout to get the hwspinlock\n");
    491		return ret;
    492	}
    493
    494	/*
    495	 * According to the sc2721 chip data sheet, the reference voltage of
    496	 * specific channel 30 and channel 31 in ADC module needs to be set from
    497	 * the default 2.8v to 3.5v.
    498	 */
    499	if ((data->var_data->set_volref) && (channel == 30 || channel == 31)) {
    500		ret = regulator_set_voltage(data->volref,
    501					SC27XX_ADC_REFVOL_VDD35,
    502					SC27XX_ADC_REFVOL_VDD35);
    503		if (ret) {
    504			dev_err(data->dev, "failed to set the volref 3.5v\n");
    505			goto unlock_adc;
    506		}
    507	}
    508
    509	ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL,
    510				 SC27XX_ADC_EN, SC27XX_ADC_EN);
    511	if (ret)
    512		goto regulator_restore;
    513
    514	ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_INT_CLR,
    515				 SC27XX_ADC_IRQ_CLR, SC27XX_ADC_IRQ_CLR);
    516	if (ret)
    517		goto disable_adc;
    518
    519	/* Configure the channel id and scale */
    520	tmp = (scale << data->var_data->scale_shift) & data->var_data->scale_mask;
    521	tmp |= channel & SC27XX_ADC_CHN_ID_MASK;
    522	ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CH_CFG,
    523				 SC27XX_ADC_CHN_ID_MASK |
    524				 data->var_data->scale_mask,
    525				 tmp);
    526	if (ret)
    527		goto disable_adc;
    528
    529	/* Select 12bit conversion mode, and only sample 1 time */
    530	tmp = SC27XX_ADC_12BIT_MODE;
    531	tmp |= (0 << SC27XX_ADC_RUN_NUM_SHIFT) & SC27XX_ADC_RUN_NUM_MASK;
    532	ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL,
    533				 SC27XX_ADC_RUN_NUM_MASK | SC27XX_ADC_12BIT_MODE,
    534				 tmp);
    535	if (ret)
    536		goto disable_adc;
    537
    538	ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL,
    539				 SC27XX_ADC_CHN_RUN, SC27XX_ADC_CHN_RUN);
    540	if (ret)
    541		goto disable_adc;
    542
    543	ret = regmap_read_poll_timeout(data->regmap,
    544				       data->base + SC27XX_ADC_INT_RAW,
    545				       status, (status & SC27XX_ADC_IRQ_RAW),
    546				       SC27XX_ADC_POLL_RAW_STATUS,
    547				       SC27XX_ADC_RDY_TIMEOUT);
    548	if (ret) {
    549		dev_err(data->dev, "read adc timeout, status = 0x%x\n", status);
    550		goto disable_adc;
    551	}
    552
    553	ret = regmap_read(data->regmap, data->base + SC27XX_ADC_DATA, &value);
    554	if (ret)
    555		goto disable_adc;
    556
    557	value &= SC27XX_ADC_DATA_MASK;
    558
    559disable_adc:
    560	regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL,
    561			   SC27XX_ADC_EN, 0);
    562regulator_restore:
    563	if ((data->var_data->set_volref) && (channel == 30 || channel == 31)) {
    564		ret_volref = regulator_set_voltage(data->volref,
    565					    SC27XX_ADC_REFVOL_VDD28,
    566					    SC27XX_ADC_REFVOL_VDD28);
    567		if (ret_volref) {
    568			dev_err(data->dev, "failed to set the volref 2.8v,ret_volref = 0x%x\n",
    569					 ret_volref);
    570			ret = ret || ret_volref;
    571		}
    572	}
    573unlock_adc:
    574	hwspin_unlock_raw(data->hwlock);
    575
    576	if (!ret)
    577		*val = value;
    578
    579	return ret;
    580}
    581
    582static void sc27xx_adc_volt_ratio(struct sc27xx_adc_data *data,
    583				  int channel, int scale,
    584				  u32 *div_numerator, u32 *div_denominator)
    585{
    586	u32 ratio;
    587
    588	ratio = data->var_data->get_ratio(channel, scale);
    589	*div_numerator = ratio >> SC27XX_RATIO_NUMERATOR_OFFSET;
    590	*div_denominator = ratio & SC27XX_RATIO_DENOMINATOR_MASK;
    591}
    592
    593static int adc_to_volt(struct sc27xx_adc_linear_graph *graph,
    594			      int raw_adc)
    595{
    596	int tmp;
    597
    598	tmp = (graph->volt0 - graph->volt1) * (raw_adc - graph->adc1);
    599	tmp /= (graph->adc0 - graph->adc1);
    600	tmp += graph->volt1;
    601
    602	return tmp;
    603}
    604
    605static int sc27xx_adc_to_volt(struct sc27xx_adc_linear_graph *graph,
    606			      int raw_adc)
    607{
    608	int tmp;
    609
    610	tmp = adc_to_volt(graph, raw_adc);
    611
    612	return tmp < 0 ? 0 : tmp;
    613}
    614
    615static int sc27xx_adc_convert_volt(struct sc27xx_adc_data *data, int channel,
    616				   int scale, int raw_adc)
    617{
    618	u32 numerator, denominator;
    619	u32 volt;
    620
    621	/*
    622	 * Convert ADC values to voltage values according to the linear graph,
    623	 * and channel 5 and channel 1 has been calibrated, so we can just
    624	 * return the voltage values calculated by the linear graph. But other
    625	 * channels need be calculated to the real voltage values with the
    626	 * voltage ratio.
    627	 */
    628	switch (channel) {
    629	case 5:
    630		return sc27xx_adc_to_volt(&big_scale_graph, raw_adc);
    631
    632	case 1:
    633		return sc27xx_adc_to_volt(&small_scale_graph, raw_adc);
    634
    635	default:
    636		volt = sc27xx_adc_to_volt(&small_scale_graph, raw_adc);
    637		break;
    638	}
    639
    640	sc27xx_adc_volt_ratio(data, channel, scale, &numerator, &denominator);
    641
    642	return DIV_ROUND_CLOSEST(volt * denominator, numerator);
    643}
    644
    645static int sc27xx_adc_read_processed(struct sc27xx_adc_data *data,
    646				     int channel, int scale, int *val)
    647{
    648	int ret, raw_adc;
    649
    650	ret = sc27xx_adc_read(data, channel, scale, &raw_adc);
    651	if (ret)
    652		return ret;
    653
    654	*val = sc27xx_adc_convert_volt(data, channel, scale, raw_adc);
    655	return 0;
    656}
    657
    658static int sc27xx_adc_read_raw(struct iio_dev *indio_dev,
    659			       struct iio_chan_spec const *chan,
    660			       int *val, int *val2, long mask)
    661{
    662	struct sc27xx_adc_data *data = iio_priv(indio_dev);
    663	int scale = data->channel_scale[chan->channel];
    664	int ret, tmp;
    665
    666	switch (mask) {
    667	case IIO_CHAN_INFO_RAW:
    668		mutex_lock(&indio_dev->mlock);
    669		ret = sc27xx_adc_read(data, chan->channel, scale, &tmp);
    670		mutex_unlock(&indio_dev->mlock);
    671
    672		if (ret)
    673			return ret;
    674
    675		*val = tmp;
    676		return IIO_VAL_INT;
    677
    678	case IIO_CHAN_INFO_PROCESSED:
    679		mutex_lock(&indio_dev->mlock);
    680		ret = sc27xx_adc_read_processed(data, chan->channel, scale,
    681						&tmp);
    682		mutex_unlock(&indio_dev->mlock);
    683
    684		if (ret)
    685			return ret;
    686
    687		*val = tmp;
    688		return IIO_VAL_INT;
    689
    690	case IIO_CHAN_INFO_SCALE:
    691		*val = scale;
    692		return IIO_VAL_INT;
    693
    694	default:
    695		return -EINVAL;
    696	}
    697}
    698
    699static int sc27xx_adc_write_raw(struct iio_dev *indio_dev,
    700				struct iio_chan_spec const *chan,
    701				int val, int val2, long mask)
    702{
    703	struct sc27xx_adc_data *data = iio_priv(indio_dev);
    704
    705	switch (mask) {
    706	case IIO_CHAN_INFO_SCALE:
    707		data->channel_scale[chan->channel] = val;
    708		return IIO_VAL_INT;
    709
    710	default:
    711		return -EINVAL;
    712	}
    713}
    714
    715static const struct iio_info sc27xx_info = {
    716	.read_raw = &sc27xx_adc_read_raw,
    717	.write_raw = &sc27xx_adc_write_raw,
    718};
    719
    720#define SC27XX_ADC_CHANNEL(index, mask) {			\
    721	.type = IIO_VOLTAGE,					\
    722	.channel = index,					\
    723	.info_mask_separate = mask | BIT(IIO_CHAN_INFO_SCALE),	\
    724	.datasheet_name = "CH##index",				\
    725	.indexed = 1,						\
    726}
    727
    728static const struct iio_chan_spec sc27xx_channels[] = {
    729	SC27XX_ADC_CHANNEL(0, BIT(IIO_CHAN_INFO_PROCESSED)),
    730	SC27XX_ADC_CHANNEL(1, BIT(IIO_CHAN_INFO_PROCESSED)),
    731	SC27XX_ADC_CHANNEL(2, BIT(IIO_CHAN_INFO_PROCESSED)),
    732	SC27XX_ADC_CHANNEL(3, BIT(IIO_CHAN_INFO_PROCESSED)),
    733	SC27XX_ADC_CHANNEL(4, BIT(IIO_CHAN_INFO_PROCESSED)),
    734	SC27XX_ADC_CHANNEL(5, BIT(IIO_CHAN_INFO_PROCESSED)),
    735	SC27XX_ADC_CHANNEL(6, BIT(IIO_CHAN_INFO_PROCESSED)),
    736	SC27XX_ADC_CHANNEL(7, BIT(IIO_CHAN_INFO_PROCESSED)),
    737	SC27XX_ADC_CHANNEL(8, BIT(IIO_CHAN_INFO_PROCESSED)),
    738	SC27XX_ADC_CHANNEL(9, BIT(IIO_CHAN_INFO_PROCESSED)),
    739	SC27XX_ADC_CHANNEL(10, BIT(IIO_CHAN_INFO_PROCESSED)),
    740	SC27XX_ADC_CHANNEL(11, BIT(IIO_CHAN_INFO_PROCESSED)),
    741	SC27XX_ADC_CHANNEL(12, BIT(IIO_CHAN_INFO_PROCESSED)),
    742	SC27XX_ADC_CHANNEL(13, BIT(IIO_CHAN_INFO_PROCESSED)),
    743	SC27XX_ADC_CHANNEL(14, BIT(IIO_CHAN_INFO_PROCESSED)),
    744	SC27XX_ADC_CHANNEL(15, BIT(IIO_CHAN_INFO_PROCESSED)),
    745	SC27XX_ADC_CHANNEL(16, BIT(IIO_CHAN_INFO_PROCESSED)),
    746	SC27XX_ADC_CHANNEL(17, BIT(IIO_CHAN_INFO_PROCESSED)),
    747	SC27XX_ADC_CHANNEL(18, BIT(IIO_CHAN_INFO_PROCESSED)),
    748	SC27XX_ADC_CHANNEL(19, BIT(IIO_CHAN_INFO_PROCESSED)),
    749	SC27XX_ADC_CHANNEL(20, BIT(IIO_CHAN_INFO_RAW)),
    750	SC27XX_ADC_CHANNEL(21, BIT(IIO_CHAN_INFO_PROCESSED)),
    751	SC27XX_ADC_CHANNEL(22, BIT(IIO_CHAN_INFO_PROCESSED)),
    752	SC27XX_ADC_CHANNEL(23, BIT(IIO_CHAN_INFO_PROCESSED)),
    753	SC27XX_ADC_CHANNEL(24, BIT(IIO_CHAN_INFO_PROCESSED)),
    754	SC27XX_ADC_CHANNEL(25, BIT(IIO_CHAN_INFO_PROCESSED)),
    755	SC27XX_ADC_CHANNEL(26, BIT(IIO_CHAN_INFO_PROCESSED)),
    756	SC27XX_ADC_CHANNEL(27, BIT(IIO_CHAN_INFO_PROCESSED)),
    757	SC27XX_ADC_CHANNEL(28, BIT(IIO_CHAN_INFO_PROCESSED)),
    758	SC27XX_ADC_CHANNEL(29, BIT(IIO_CHAN_INFO_PROCESSED)),
    759	SC27XX_ADC_CHANNEL(30, BIT(IIO_CHAN_INFO_PROCESSED)),
    760	SC27XX_ADC_CHANNEL(31, BIT(IIO_CHAN_INFO_PROCESSED)),
    761};
    762
    763static int sc27xx_adc_enable(struct sc27xx_adc_data *data)
    764{
    765	int ret;
    766
    767	ret = regmap_update_bits(data->regmap, data->var_data->module_en,
    768				 SC27XX_MODULE_ADC_EN, SC27XX_MODULE_ADC_EN);
    769	if (ret)
    770		return ret;
    771
    772	/* Enable ADC work clock and controller clock */
    773	ret = regmap_update_bits(data->regmap, data->var_data->clk_en,
    774				 SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN,
    775				 SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN);
    776	if (ret)
    777		goto disable_adc;
    778
    779	/* ADC channel scales' calibration from nvmem device */
    780	ret = sc27xx_adc_scale_calibration(data, true);
    781	if (ret)
    782		goto disable_clk;
    783
    784	ret = sc27xx_adc_scale_calibration(data, false);
    785	if (ret)
    786		goto disable_clk;
    787
    788	return 0;
    789
    790disable_clk:
    791	regmap_update_bits(data->regmap, data->var_data->clk_en,
    792			   SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN, 0);
    793disable_adc:
    794	regmap_update_bits(data->regmap, data->var_data->module_en,
    795			   SC27XX_MODULE_ADC_EN, 0);
    796
    797	return ret;
    798}
    799
    800static void sc27xx_adc_disable(void *_data)
    801{
    802	struct sc27xx_adc_data *data = _data;
    803
    804	/* Disable ADC work clock and controller clock */
    805	regmap_update_bits(data->regmap, data->var_data->clk_en,
    806			   SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN, 0);
    807
    808	regmap_update_bits(data->regmap, data->var_data->module_en,
    809			   SC27XX_MODULE_ADC_EN, 0);
    810}
    811
    812static const struct sc27xx_adc_variant_data sc2731_data = {
    813	.module_en = SC2731_MODULE_EN,
    814	.clk_en = SC2731_ARM_CLK_EN,
    815	.scale_shift = SC27XX_ADC_SCALE_SHIFT,
    816	.scale_mask = SC27XX_ADC_SCALE_MASK,
    817	.bscale_cal = &sc2731_big_scale_graph_calib,
    818	.sscale_cal = &sc2731_small_scale_graph_calib,
    819	.init_scale = sc2731_adc_scale_init,
    820	.get_ratio = sc2731_adc_get_ratio,
    821	.set_volref = false,
    822};
    823
    824static const struct sc27xx_adc_variant_data sc2730_data = {
    825	.module_en = SC2730_MODULE_EN,
    826	.clk_en = SC2730_ARM_CLK_EN,
    827	.scale_shift = SC27XX_ADC_SCALE_SHIFT,
    828	.scale_mask = SC27XX_ADC_SCALE_MASK,
    829	.bscale_cal = &big_scale_graph_calib,
    830	.sscale_cal = &small_scale_graph_calib,
    831	.init_scale = sc2730_adc_scale_init,
    832	.get_ratio = sc2730_adc_get_ratio,
    833	.set_volref = false,
    834};
    835
    836static const struct sc27xx_adc_variant_data sc2721_data = {
    837	.module_en = SC2731_MODULE_EN,
    838	.clk_en = SC2721_ARM_CLK_EN,
    839	.scale_shift = SC2721_ADC_SCALE_SHIFT,
    840	.scale_mask = SC2721_ADC_SCALE_MASK,
    841	.bscale_cal = &sc2731_big_scale_graph_calib,
    842	.sscale_cal = &sc2731_small_scale_graph_calib,
    843	.init_scale = sc2731_adc_scale_init,
    844	.get_ratio = sc2721_adc_get_ratio,
    845	.set_volref = true,
    846};
    847
    848static const struct sc27xx_adc_variant_data sc2720_data = {
    849	.module_en = SC2731_MODULE_EN,
    850	.clk_en = SC2721_ARM_CLK_EN,
    851	.scale_shift = SC27XX_ADC_SCALE_SHIFT,
    852	.scale_mask = SC27XX_ADC_SCALE_MASK,
    853	.bscale_cal = &big_scale_graph_calib,
    854	.sscale_cal = &small_scale_graph_calib,
    855	.init_scale = sc2720_adc_scale_init,
    856	.get_ratio = sc2720_adc_get_ratio,
    857	.set_volref = false,
    858};
    859
    860static int sc27xx_adc_probe(struct platform_device *pdev)
    861{
    862	struct device *dev = &pdev->dev;
    863	struct device_node *np = dev->of_node;
    864	struct sc27xx_adc_data *sc27xx_data;
    865	const struct sc27xx_adc_variant_data *pdata;
    866	struct iio_dev *indio_dev;
    867	int ret;
    868
    869	pdata = of_device_get_match_data(dev);
    870	if (!pdata) {
    871		dev_err(dev, "No matching driver data found\n");
    872		return -EINVAL;
    873	}
    874
    875	indio_dev = devm_iio_device_alloc(dev, sizeof(*sc27xx_data));
    876	if (!indio_dev)
    877		return -ENOMEM;
    878
    879	sc27xx_data = iio_priv(indio_dev);
    880
    881	sc27xx_data->regmap = dev_get_regmap(dev->parent, NULL);
    882	if (!sc27xx_data->regmap) {
    883		dev_err(dev, "failed to get ADC regmap\n");
    884		return -ENODEV;
    885	}
    886
    887	ret = of_property_read_u32(np, "reg", &sc27xx_data->base);
    888	if (ret) {
    889		dev_err(dev, "failed to get ADC base address\n");
    890		return ret;
    891	}
    892
    893	sc27xx_data->irq = platform_get_irq(pdev, 0);
    894	if (sc27xx_data->irq < 0)
    895		return sc27xx_data->irq;
    896
    897	ret = of_hwspin_lock_get_id(np, 0);
    898	if (ret < 0) {
    899		dev_err(dev, "failed to get hwspinlock id\n");
    900		return ret;
    901	}
    902
    903	sc27xx_data->hwlock = devm_hwspin_lock_request_specific(dev, ret);
    904	if (!sc27xx_data->hwlock) {
    905		dev_err(dev, "failed to request hwspinlock\n");
    906		return -ENXIO;
    907	}
    908
    909	sc27xx_data->dev = dev;
    910	if (pdata->set_volref) {
    911		sc27xx_data->volref = devm_regulator_get(dev, "vref");
    912		if (IS_ERR(sc27xx_data->volref)) {
    913			ret = PTR_ERR(sc27xx_data->volref);
    914			return dev_err_probe(dev, ret, "failed to get ADC volref\n");
    915		}
    916	}
    917
    918	sc27xx_data->var_data = pdata;
    919	sc27xx_data->var_data->init_scale(sc27xx_data);
    920
    921	ret = sc27xx_adc_enable(sc27xx_data);
    922	if (ret) {
    923		dev_err(dev, "failed to enable ADC module\n");
    924		return ret;
    925	}
    926
    927	ret = devm_add_action_or_reset(dev, sc27xx_adc_disable, sc27xx_data);
    928	if (ret) {
    929		dev_err(dev, "failed to add ADC disable action\n");
    930		return ret;
    931	}
    932
    933	indio_dev->name = dev_name(dev);
    934	indio_dev->modes = INDIO_DIRECT_MODE;
    935	indio_dev->info = &sc27xx_info;
    936	indio_dev->channels = sc27xx_channels;
    937	indio_dev->num_channels = ARRAY_SIZE(sc27xx_channels);
    938	ret = devm_iio_device_register(dev, indio_dev);
    939	if (ret)
    940		dev_err(dev, "could not register iio (ADC)");
    941
    942	return ret;
    943}
    944
    945static const struct of_device_id sc27xx_adc_of_match[] = {
    946	{ .compatible = "sprd,sc2731-adc", .data = &sc2731_data},
    947	{ .compatible = "sprd,sc2730-adc", .data = &sc2730_data},
    948	{ .compatible = "sprd,sc2721-adc", .data = &sc2721_data},
    949	{ .compatible = "sprd,sc2720-adc", .data = &sc2720_data},
    950	{ }
    951};
    952MODULE_DEVICE_TABLE(of, sc27xx_adc_of_match);
    953
    954static struct platform_driver sc27xx_adc_driver = {
    955	.probe = sc27xx_adc_probe,
    956	.driver = {
    957		.name = "sc27xx-adc",
    958		.of_match_table = sc27xx_adc_of_match,
    959	},
    960};
    961
    962module_platform_driver(sc27xx_adc_driver);
    963
    964MODULE_AUTHOR("Freeman Liu <freeman.liu@spreadtrum.com>");
    965MODULE_DESCRIPTION("Spreadtrum SC27XX ADC Driver");
    966MODULE_LICENSE("GPL v2");