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

qcom-spmi-adc-tm5.c (29145B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (c) 2020 Linaro Limited
      4 *
      5 * Based on original driver:
      6 * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
      7 *
      8 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
      9 */
     10
     11#include <linux/bitfield.h>
     12#include <linux/iio/adc/qcom-vadc-common.h>
     13#include <linux/iio/consumer.h>
     14#include <linux/interrupt.h>
     15#include <linux/module.h>
     16#include <linux/of.h>
     17#include <linux/of_device.h>
     18#include <linux/platform_device.h>
     19#include <linux/regmap.h>
     20#include <linux/thermal.h>
     21#include <asm-generic/unaligned.h>
     22
     23/*
     24 * Thermal monitoring block consists of 8 (ADC_TM5_NUM_CHANNELS) channels. Each
     25 * channel is programmed to use one of ADC channels for voltage comparison.
     26 * Voltages are programmed using ADC codes, so we have to convert temp to
     27 * voltage and then to ADC code value.
     28 *
     29 * Configuration of TM channels must match configuration of corresponding ADC
     30 * channels.
     31 */
     32
     33#define ADC5_MAX_CHANNEL                        0xc0
     34#define ADC_TM5_NUM_CHANNELS		8
     35
     36#define ADC_TM5_STATUS_LOW			0x0a
     37
     38#define ADC_TM5_STATUS_HIGH			0x0b
     39
     40#define ADC_TM5_NUM_BTM				0x0f
     41
     42#define ADC_TM5_ADC_DIG_PARAM			0x42
     43
     44#define ADC_TM5_FAST_AVG_CTL			(ADC_TM5_ADC_DIG_PARAM + 1)
     45#define ADC_TM5_FAST_AVG_EN				BIT(7)
     46
     47#define ADC_TM5_MEAS_INTERVAL_CTL		(ADC_TM5_ADC_DIG_PARAM + 2)
     48#define ADC_TM5_TIMER1					3 /* 3.9ms */
     49
     50#define ADC_TM5_MEAS_INTERVAL_CTL2		(ADC_TM5_ADC_DIG_PARAM + 3)
     51#define ADC_TM5_MEAS_INTERVAL_CTL2_MASK			0xf0
     52#define ADC_TM5_TIMER2					10 /* 1 second */
     53#define ADC_TM5_MEAS_INTERVAL_CTL3_MASK			0xf
     54#define ADC_TM5_TIMER3					4 /* 4 second */
     55
     56#define ADC_TM_EN_CTL1				0x46
     57#define ADC_TM_EN					BIT(7)
     58#define ADC_TM_CONV_REQ				0x47
     59#define ADC_TM_CONV_REQ_EN				BIT(7)
     60
     61#define ADC_TM5_M_CHAN_BASE			0x60
     62
     63#define ADC_TM5_M_ADC_CH_SEL_CTL(n)		(ADC_TM5_M_CHAN_BASE + ((n) * 8) + 0)
     64#define ADC_TM5_M_LOW_THR0(n)			(ADC_TM5_M_CHAN_BASE + ((n) * 8) + 1)
     65#define ADC_TM5_M_LOW_THR1(n)			(ADC_TM5_M_CHAN_BASE + ((n) * 8) + 2)
     66#define ADC_TM5_M_HIGH_THR0(n)			(ADC_TM5_M_CHAN_BASE + ((n) * 8) + 3)
     67#define ADC_TM5_M_HIGH_THR1(n)			(ADC_TM5_M_CHAN_BASE + ((n) * 8) + 4)
     68#define ADC_TM5_M_MEAS_INTERVAL_CTL(n)		(ADC_TM5_M_CHAN_BASE + ((n) * 8) + 5)
     69#define ADC_TM5_M_CTL(n)			(ADC_TM5_M_CHAN_BASE + ((n) * 8) + 6)
     70#define ADC_TM5_M_CTL_HW_SETTLE_DELAY_MASK		0xf
     71#define ADC_TM5_M_CTL_CAL_SEL_MASK			0x30
     72#define ADC_TM5_M_CTL_CAL_VAL				0x40
     73#define ADC_TM5_M_EN(n)				(ADC_TM5_M_CHAN_BASE + ((n) * 8) + 7)
     74#define ADC_TM5_M_MEAS_EN				BIT(7)
     75#define ADC_TM5_M_HIGH_THR_INT_EN			BIT(1)
     76#define ADC_TM5_M_LOW_THR_INT_EN			BIT(0)
     77
     78#define ADC_TM_GEN2_STATUS1			0x08
     79#define ADC_TM_GEN2_STATUS_LOW_SET		0x09
     80#define ADC_TM_GEN2_STATUS_LOW_CLR		0x0a
     81#define ADC_TM_GEN2_STATUS_HIGH_SET		0x0b
     82#define ADC_TM_GEN2_STATUS_HIGH_CLR		0x0c
     83
     84#define ADC_TM_GEN2_CFG_HS_SET			0x0d
     85#define ADC_TM_GEN2_CFG_HS_FLAG			BIT(0)
     86#define ADC_TM_GEN2_CFG_HS_CLR			0x0e
     87
     88#define ADC_TM_GEN2_SID				0x40
     89
     90#define ADC_TM_GEN2_CH_CTL			0x41
     91#define ADC_TM_GEN2_TM_CH_SEL			GENMASK(7, 5)
     92#define ADC_TM_GEN2_MEAS_INT_SEL		GENMASK(3, 2)
     93
     94#define ADC_TM_GEN2_ADC_DIG_PARAM		0x42
     95#define ADC_TM_GEN2_CTL_CAL_SEL			GENMASK(5, 4)
     96#define ADC_TM_GEN2_CTL_DEC_RATIO_MASK		GENMASK(3, 2)
     97
     98#define ADC_TM_GEN2_FAST_AVG_CTL		0x43
     99#define ADC_TM_GEN2_FAST_AVG_EN			BIT(7)
    100
    101#define ADC_TM_GEN2_ADC_CH_SEL_CTL		0x44
    102
    103#define ADC_TM_GEN2_DELAY_CTL			0x45
    104#define ADC_TM_GEN2_HW_SETTLE_DELAY		GENMASK(3, 0)
    105
    106#define ADC_TM_GEN2_EN_CTL1			0x46
    107#define ADC_TM_GEN2_EN				BIT(7)
    108
    109#define ADC_TM_GEN2_CONV_REQ			0x47
    110#define ADC_TM_GEN2_CONV_REQ_EN			BIT(7)
    111
    112#define ADC_TM_GEN2_LOW_THR0			0x49
    113#define ADC_TM_GEN2_LOW_THR1			0x4a
    114#define ADC_TM_GEN2_HIGH_THR0			0x4b
    115#define ADC_TM_GEN2_HIGH_THR1			0x4c
    116#define ADC_TM_GEN2_LOWER_MASK(n)		((n) & GENMASK(7, 0))
    117#define ADC_TM_GEN2_UPPER_MASK(n)		(((n) & GENMASK(15, 8)) >> 8)
    118
    119#define ADC_TM_GEN2_MEAS_IRQ_EN			0x4d
    120#define ADC_TM_GEN2_MEAS_EN			BIT(7)
    121#define ADC_TM5_GEN2_HIGH_THR_INT_EN		BIT(1)
    122#define ADC_TM5_GEN2_LOW_THR_INT_EN		BIT(0)
    123
    124#define ADC_TM_GEN2_MEAS_INT_LSB		0x50
    125#define ADC_TM_GEN2_MEAS_INT_MSB		0x51
    126#define ADC_TM_GEN2_MEAS_INT_MODE		0x52
    127
    128#define ADC_TM_GEN2_Mn_DATA0(n)			((n * 2) + 0xa0)
    129#define ADC_TM_GEN2_Mn_DATA1(n)			((n * 2) + 0xa1)
    130#define ADC_TM_GEN2_DATA_SHIFT			8
    131
    132enum adc5_timer_select {
    133	ADC5_TIMER_SEL_1 = 0,
    134	ADC5_TIMER_SEL_2,
    135	ADC5_TIMER_SEL_3,
    136	ADC5_TIMER_SEL_NONE,
    137};
    138
    139enum adc5_gen {
    140	ADC_TM5,
    141	ADC_TM_HC,
    142	ADC_TM5_GEN2,
    143	ADC_TM5_MAX
    144};
    145
    146enum adc_tm5_cal_method {
    147	ADC_TM5_NO_CAL = 0,
    148	ADC_TM5_RATIOMETRIC_CAL,
    149	ADC_TM5_ABSOLUTE_CAL
    150};
    151
    152enum adc_tm_gen2_time_select {
    153	MEAS_INT_50MS = 0,
    154	MEAS_INT_100MS,
    155	MEAS_INT_1S,
    156	MEAS_INT_SET,
    157	MEAS_INT_NONE,
    158};
    159
    160struct adc_tm5_chip;
    161struct adc_tm5_channel;
    162
    163struct adc_tm5_data {
    164	const u32 full_scale_code_volt;
    165	unsigned int *decimation;
    166	unsigned int *hw_settle;
    167	int (*disable_channel)(struct adc_tm5_channel *channel);
    168	int (*configure)(struct adc_tm5_channel *channel, int low, int high);
    169	irqreturn_t (*isr)(int irq, void *data);
    170	int (*init)(struct adc_tm5_chip *chip);
    171	char *irq_name;
    172	int gen;
    173};
    174
    175/**
    176 * struct adc_tm5_channel - ADC Thermal Monitoring channel data.
    177 * @channel: channel number.
    178 * @adc_channel: corresponding ADC channel number.
    179 * @cal_method: calibration method.
    180 * @prescale: channel scaling performed on the input signal.
    181 * @hw_settle_time: the time between AMUX being configured and the
    182 *	start of conversion.
    183 * @decimation: sampling rate supported for the channel.
    184 * @avg_samples: ability to provide single result from the ADC
    185 *	that is an average of multiple measurements.
    186 * @high_thr_en: channel upper voltage threshold enable state.
    187 * @low_thr_en: channel lower voltage threshold enable state.
    188 * @meas_en: recurring measurement enable state
    189 * @iio: IIO channel instance used by this channel.
    190 * @chip: ADC TM chip instance.
    191 * @tzd: thermal zone device used by this channel.
    192 */
    193struct adc_tm5_channel {
    194	unsigned int		channel;
    195	unsigned int		adc_channel;
    196	enum adc_tm5_cal_method	cal_method;
    197	unsigned int		prescale;
    198	unsigned int		hw_settle_time;
    199	unsigned int		decimation;	/* For Gen2 ADC_TM */
    200	unsigned int		avg_samples;	/* For Gen2 ADC_TM */
    201	bool			high_thr_en;	/* For Gen2 ADC_TM */
    202	bool			low_thr_en;	/* For Gen2 ADC_TM */
    203	bool			meas_en;	/* For Gen2 ADC_TM */
    204	struct iio_channel	*iio;
    205	struct adc_tm5_chip	*chip;
    206	struct thermal_zone_device *tzd;
    207};
    208
    209/**
    210 * struct adc_tm5_chip - ADC Thermal Monitoring properties
    211 * @regmap: SPMI ADC5 Thermal Monitoring  peripheral register map field.
    212 * @dev: SPMI ADC5 device.
    213 * @data: software configuration data.
    214 * @channels: array of ADC TM channel data.
    215 * @nchannels: amount of channels defined/allocated
    216 * @decimation: sampling rate supported for the channel.
    217 *      Applies to all channels, used only on Gen1 ADC_TM.
    218 * @avg_samples: ability to provide single result from the ADC
    219 *      that is an average of multiple measurements. Applies to all
    220 *      channels, used only on Gen1 ADC_TM.
    221 * @base: base address of TM registers.
    222 * @adc_mutex_lock: ADC_TM mutex lock, used only on Gen2 ADC_TM.
    223 *      It is used to ensure only one ADC channel configuration
    224 *      is done at a time using the shared set of configuration
    225 *      registers.
    226 */
    227struct adc_tm5_chip {
    228	struct regmap		*regmap;
    229	struct device		*dev;
    230	const struct adc_tm5_data	*data;
    231	struct adc_tm5_channel	*channels;
    232	unsigned int		nchannels;
    233	unsigned int		decimation;
    234	unsigned int		avg_samples;
    235	u16			base;
    236	struct mutex		adc_mutex_lock;
    237};
    238
    239static int adc_tm5_read(struct adc_tm5_chip *adc_tm, u16 offset, u8 *data, int len)
    240{
    241	return regmap_bulk_read(adc_tm->regmap, adc_tm->base + offset, data, len);
    242}
    243
    244static int adc_tm5_write(struct adc_tm5_chip *adc_tm, u16 offset, u8 *data, int len)
    245{
    246	return regmap_bulk_write(adc_tm->regmap, adc_tm->base + offset, data, len);
    247}
    248
    249static int adc_tm5_reg_update(struct adc_tm5_chip *adc_tm, u16 offset, u8 mask, u8 val)
    250{
    251	return regmap_write_bits(adc_tm->regmap, adc_tm->base + offset, mask, val);
    252}
    253
    254static irqreturn_t adc_tm5_isr(int irq, void *data)
    255{
    256	struct adc_tm5_chip *chip = data;
    257	u8 status_low, status_high, ctl;
    258	int ret, i;
    259
    260	ret = adc_tm5_read(chip, ADC_TM5_STATUS_LOW, &status_low, sizeof(status_low));
    261	if (unlikely(ret)) {
    262		dev_err(chip->dev, "read status low failed: %d\n", ret);
    263		return IRQ_HANDLED;
    264	}
    265
    266	ret = adc_tm5_read(chip, ADC_TM5_STATUS_HIGH, &status_high, sizeof(status_high));
    267	if (unlikely(ret)) {
    268		dev_err(chip->dev, "read status high failed: %d\n", ret);
    269		return IRQ_HANDLED;
    270	}
    271
    272	for (i = 0; i < chip->nchannels; i++) {
    273		bool upper_set = false, lower_set = false;
    274		unsigned int ch = chip->channels[i].channel;
    275
    276		/* No TZD, we warned at the boot time */
    277		if (!chip->channels[i].tzd)
    278			continue;
    279
    280		ret = adc_tm5_read(chip, ADC_TM5_M_EN(ch), &ctl, sizeof(ctl));
    281		if (unlikely(ret)) {
    282			dev_err(chip->dev, "ctl read failed: %d, channel %d\n", ret, i);
    283			continue;
    284		}
    285
    286		if (!(ctl & ADC_TM5_M_MEAS_EN))
    287			continue;
    288
    289		lower_set = (status_low & BIT(ch)) &&
    290			(ctl & ADC_TM5_M_LOW_THR_INT_EN);
    291
    292		upper_set = (status_high & BIT(ch)) &&
    293			(ctl & ADC_TM5_M_HIGH_THR_INT_EN);
    294
    295		if (upper_set || lower_set)
    296			thermal_zone_device_update(chip->channels[i].tzd,
    297						   THERMAL_EVENT_UNSPECIFIED);
    298	}
    299
    300	return IRQ_HANDLED;
    301}
    302
    303static irqreturn_t adc_tm5_gen2_isr(int irq, void *data)
    304{
    305	struct adc_tm5_chip *chip = data;
    306	u8 status_low, status_high;
    307	int ret, i;
    308
    309	ret = adc_tm5_read(chip, ADC_TM_GEN2_STATUS_LOW_CLR, &status_low, sizeof(status_low));
    310	if (ret) {
    311		dev_err(chip->dev, "read status_low failed: %d\n", ret);
    312		return IRQ_HANDLED;
    313	}
    314
    315	ret = adc_tm5_read(chip, ADC_TM_GEN2_STATUS_HIGH_CLR, &status_high, sizeof(status_high));
    316	if (ret) {
    317		dev_err(chip->dev, "read status_high failed: %d\n", ret);
    318		return IRQ_HANDLED;
    319	}
    320
    321	ret = adc_tm5_write(chip, ADC_TM_GEN2_STATUS_LOW_CLR, &status_low, sizeof(status_low));
    322	if (ret < 0) {
    323		dev_err(chip->dev, "clear status low failed with %d\n", ret);
    324		return IRQ_HANDLED;
    325	}
    326
    327	ret = adc_tm5_write(chip, ADC_TM_GEN2_STATUS_HIGH_CLR, &status_high, sizeof(status_high));
    328	if (ret < 0) {
    329		dev_err(chip->dev, "clear status high failed with %d\n", ret);
    330		return IRQ_HANDLED;
    331	}
    332
    333	for (i = 0; i < chip->nchannels; i++) {
    334		bool upper_set = false, lower_set = false;
    335		unsigned int ch = chip->channels[i].channel;
    336
    337		/* No TZD, we warned at the boot time */
    338		if (!chip->channels[i].tzd)
    339			continue;
    340
    341		if (!chip->channels[i].meas_en)
    342			continue;
    343
    344		lower_set = (status_low & BIT(ch)) &&
    345			(chip->channels[i].low_thr_en);
    346
    347		upper_set = (status_high & BIT(ch)) &&
    348			(chip->channels[i].high_thr_en);
    349
    350		if (upper_set || lower_set)
    351			thermal_zone_device_update(chip->channels[i].tzd,
    352						   THERMAL_EVENT_UNSPECIFIED);
    353	}
    354
    355	return IRQ_HANDLED;
    356}
    357
    358static int adc_tm5_get_temp(void *data, int *temp)
    359{
    360	struct adc_tm5_channel *channel = data;
    361	int ret;
    362
    363	if (!channel || !channel->iio)
    364		return -EINVAL;
    365
    366	ret = iio_read_channel_processed(channel->iio, temp);
    367	if (ret < 0)
    368		return ret;
    369
    370	if (ret != IIO_VAL_INT)
    371		return -EINVAL;
    372
    373	return 0;
    374}
    375
    376static int adc_tm5_disable_channel(struct adc_tm5_channel *channel)
    377{
    378	struct adc_tm5_chip *chip = channel->chip;
    379	unsigned int reg = ADC_TM5_M_EN(channel->channel);
    380
    381	return adc_tm5_reg_update(chip, reg,
    382				  ADC_TM5_M_MEAS_EN |
    383				  ADC_TM5_M_HIGH_THR_INT_EN |
    384				  ADC_TM5_M_LOW_THR_INT_EN,
    385				  0);
    386}
    387
    388#define ADC_TM_GEN2_POLL_DELAY_MIN_US		100
    389#define ADC_TM_GEN2_POLL_DELAY_MAX_US		110
    390#define ADC_TM_GEN2_POLL_RETRY_COUNT		3
    391
    392static int32_t adc_tm5_gen2_conv_req(struct adc_tm5_chip *chip)
    393{
    394	int ret;
    395	u8 data;
    396	unsigned int count;
    397
    398	data = ADC_TM_GEN2_EN;
    399	ret = adc_tm5_write(chip, ADC_TM_GEN2_EN_CTL1, &data, 1);
    400	if (ret < 0) {
    401		dev_err(chip->dev, "adc-tm enable failed with %d\n", ret);
    402		return ret;
    403	}
    404
    405	data = ADC_TM_GEN2_CFG_HS_FLAG;
    406	ret = adc_tm5_write(chip, ADC_TM_GEN2_CFG_HS_SET, &data, 1);
    407	if (ret < 0) {
    408		dev_err(chip->dev, "adc-tm handshake failed with %d\n", ret);
    409		return ret;
    410	}
    411
    412	data = ADC_TM_GEN2_CONV_REQ_EN;
    413	ret = adc_tm5_write(chip, ADC_TM_GEN2_CONV_REQ, &data, 1);
    414	if (ret < 0) {
    415		dev_err(chip->dev, "adc-tm request conversion failed with %d\n", ret);
    416		return ret;
    417	}
    418
    419	/*
    420	 * SW sets a handshake bit and waits for PBS to clear it
    421	 * before the next conversion request can be queued.
    422	 */
    423
    424	for (count = 0; count < ADC_TM_GEN2_POLL_RETRY_COUNT; count++) {
    425		ret = adc_tm5_read(chip, ADC_TM_GEN2_CFG_HS_SET, &data, sizeof(data));
    426		if (ret < 0) {
    427			dev_err(chip->dev, "adc-tm read failed with %d\n", ret);
    428			return ret;
    429		}
    430
    431		if (!(data & ADC_TM_GEN2_CFG_HS_FLAG))
    432			return ret;
    433		usleep_range(ADC_TM_GEN2_POLL_DELAY_MIN_US,
    434			ADC_TM_GEN2_POLL_DELAY_MAX_US);
    435	}
    436
    437	dev_err(chip->dev, "adc-tm conversion request handshake timed out\n");
    438
    439	return -ETIMEDOUT;
    440}
    441
    442static int adc_tm5_gen2_disable_channel(struct adc_tm5_channel *channel)
    443{
    444	struct adc_tm5_chip *chip = channel->chip;
    445	int ret;
    446	u8 val;
    447
    448	mutex_lock(&chip->adc_mutex_lock);
    449
    450	channel->meas_en = false;
    451	channel->high_thr_en = false;
    452	channel->low_thr_en = false;
    453
    454	ret = adc_tm5_read(chip, ADC_TM_GEN2_CH_CTL, &val, sizeof(val));
    455	if (ret < 0) {
    456		dev_err(chip->dev, "adc-tm block read failed with %d\n", ret);
    457		goto disable_fail;
    458	}
    459
    460	val &= ~ADC_TM_GEN2_TM_CH_SEL;
    461	val |= FIELD_PREP(ADC_TM_GEN2_TM_CH_SEL, channel->channel);
    462
    463	ret = adc_tm5_write(chip, ADC_TM_GEN2_CH_CTL, &val, 1);
    464	if (ret < 0) {
    465		dev_err(chip->dev, "adc-tm channel disable failed with %d\n", ret);
    466		goto disable_fail;
    467	}
    468
    469	val = 0;
    470	ret = adc_tm5_write(chip, ADC_TM_GEN2_MEAS_IRQ_EN, &val, 1);
    471	if (ret < 0) {
    472		dev_err(chip->dev, "adc-tm interrupt disable failed with %d\n", ret);
    473		goto disable_fail;
    474	}
    475
    476
    477	ret = adc_tm5_gen2_conv_req(channel->chip);
    478	if (ret < 0)
    479		dev_err(chip->dev, "adc-tm channel configure failed with %d\n", ret);
    480
    481disable_fail:
    482	mutex_unlock(&chip->adc_mutex_lock);
    483	return ret;
    484}
    485
    486static int adc_tm5_enable(struct adc_tm5_chip *chip)
    487{
    488	int ret;
    489	u8 data;
    490
    491	data = ADC_TM_EN;
    492	ret = adc_tm5_write(chip, ADC_TM_EN_CTL1, &data, sizeof(data));
    493	if (ret < 0) {
    494		dev_err(chip->dev, "adc-tm enable failed\n");
    495		return ret;
    496	}
    497
    498	data = ADC_TM_CONV_REQ_EN;
    499	ret = adc_tm5_write(chip, ADC_TM_CONV_REQ, &data, sizeof(data));
    500	if (ret < 0) {
    501		dev_err(chip->dev, "adc-tm request conversion failed\n");
    502		return ret;
    503	}
    504
    505	return 0;
    506}
    507
    508static int adc_tm5_configure(struct adc_tm5_channel *channel, int low, int high)
    509{
    510	struct adc_tm5_chip *chip = channel->chip;
    511	u8 buf[8];
    512	u16 reg = ADC_TM5_M_ADC_CH_SEL_CTL(channel->channel);
    513	int ret;
    514
    515	ret = adc_tm5_read(chip, reg, buf, sizeof(buf));
    516	if (ret) {
    517		dev_err(chip->dev, "channel %d params read failed: %d\n", channel->channel, ret);
    518		return ret;
    519	}
    520
    521	buf[0] = channel->adc_channel;
    522
    523	/* High temperature corresponds to low voltage threshold */
    524	if (high != INT_MAX) {
    525		u16 adc_code = qcom_adc_tm5_temp_volt_scale(channel->prescale,
    526				chip->data->full_scale_code_volt, high);
    527
    528		put_unaligned_le16(adc_code, &buf[1]);
    529		buf[7] |= ADC_TM5_M_LOW_THR_INT_EN;
    530	} else {
    531		buf[7] &= ~ADC_TM5_M_LOW_THR_INT_EN;
    532	}
    533
    534	/* Low temperature corresponds to high voltage threshold */
    535	if (low != -INT_MAX) {
    536		u16 adc_code = qcom_adc_tm5_temp_volt_scale(channel->prescale,
    537				chip->data->full_scale_code_volt, low);
    538
    539		put_unaligned_le16(adc_code, &buf[3]);
    540		buf[7] |= ADC_TM5_M_HIGH_THR_INT_EN;
    541	} else {
    542		buf[7] &= ~ADC_TM5_M_HIGH_THR_INT_EN;
    543	}
    544
    545	buf[5] = ADC5_TIMER_SEL_2;
    546
    547	/* Set calibration select, hw_settle delay */
    548	buf[6] &= ~ADC_TM5_M_CTL_HW_SETTLE_DELAY_MASK;
    549	buf[6] |= FIELD_PREP(ADC_TM5_M_CTL_HW_SETTLE_DELAY_MASK, channel->hw_settle_time);
    550	buf[6] &= ~ADC_TM5_M_CTL_CAL_SEL_MASK;
    551	buf[6] |= FIELD_PREP(ADC_TM5_M_CTL_CAL_SEL_MASK, channel->cal_method);
    552
    553	buf[7] |= ADC_TM5_M_MEAS_EN;
    554
    555	ret = adc_tm5_write(chip, reg, buf, sizeof(buf));
    556	if (ret) {
    557		dev_err(chip->dev, "channel %d params write failed: %d\n", channel->channel, ret);
    558		return ret;
    559	}
    560
    561	return adc_tm5_enable(chip);
    562}
    563
    564static int adc_tm5_gen2_configure(struct adc_tm5_channel *channel, int low, int high)
    565{
    566	struct adc_tm5_chip *chip = channel->chip;
    567	int ret;
    568	u8 buf[14];
    569	u16 adc_code;
    570
    571	mutex_lock(&chip->adc_mutex_lock);
    572
    573	channel->meas_en = true;
    574
    575	ret = adc_tm5_read(chip, ADC_TM_GEN2_SID, buf, sizeof(buf));
    576	if (ret < 0) {
    577		dev_err(chip->dev, "adc-tm block read failed with %d\n", ret);
    578		goto config_fail;
    579	}
    580
    581	/* Set SID from virtual channel number */
    582	buf[0] = channel->adc_channel >> 8;
    583
    584	/* Set TM channel number used and measurement interval */
    585	buf[1] &= ~ADC_TM_GEN2_TM_CH_SEL;
    586	buf[1] |= FIELD_PREP(ADC_TM_GEN2_TM_CH_SEL, channel->channel);
    587	buf[1] &= ~ADC_TM_GEN2_MEAS_INT_SEL;
    588	buf[1] |= FIELD_PREP(ADC_TM_GEN2_MEAS_INT_SEL, MEAS_INT_1S);
    589
    590	buf[2] &= ~ADC_TM_GEN2_CTL_DEC_RATIO_MASK;
    591	buf[2] |= FIELD_PREP(ADC_TM_GEN2_CTL_DEC_RATIO_MASK, channel->decimation);
    592	buf[2] &= ~ADC_TM_GEN2_CTL_CAL_SEL;
    593	buf[2] |= FIELD_PREP(ADC_TM_GEN2_CTL_CAL_SEL, channel->cal_method);
    594
    595	buf[3] = channel->avg_samples | ADC_TM_GEN2_FAST_AVG_EN;
    596
    597	buf[4] = channel->adc_channel & 0xff;
    598
    599	buf[5] = channel->hw_settle_time & ADC_TM_GEN2_HW_SETTLE_DELAY;
    600
    601	/* High temperature corresponds to low voltage threshold */
    602	if (high != INT_MAX) {
    603		channel->low_thr_en = true;
    604		adc_code = qcom_adc_tm5_gen2_temp_res_scale(high);
    605		put_unaligned_le16(adc_code, &buf[9]);
    606	} else {
    607		channel->low_thr_en = false;
    608	}
    609
    610	/* Low temperature corresponds to high voltage threshold */
    611	if (low != -INT_MAX) {
    612		channel->high_thr_en = true;
    613		adc_code = qcom_adc_tm5_gen2_temp_res_scale(low);
    614		put_unaligned_le16(adc_code, &buf[11]);
    615	} else {
    616		channel->high_thr_en = false;
    617	}
    618
    619	buf[13] = ADC_TM_GEN2_MEAS_EN;
    620	if (channel->high_thr_en)
    621		buf[13] |= ADC_TM5_GEN2_HIGH_THR_INT_EN;
    622	if (channel->low_thr_en)
    623		buf[13] |= ADC_TM5_GEN2_LOW_THR_INT_EN;
    624
    625	ret = adc_tm5_write(chip, ADC_TM_GEN2_SID, buf, sizeof(buf));
    626	if (ret) {
    627		dev_err(chip->dev, "channel %d params write failed: %d\n", channel->channel, ret);
    628		goto config_fail;
    629	}
    630
    631	ret = adc_tm5_gen2_conv_req(channel->chip);
    632	if (ret < 0)
    633		dev_err(chip->dev, "adc-tm channel configure failed with %d\n", ret);
    634
    635config_fail:
    636	mutex_unlock(&chip->adc_mutex_lock);
    637	return ret;
    638}
    639
    640static int adc_tm5_set_trips(void *data, int low, int high)
    641{
    642	struct adc_tm5_channel *channel = data;
    643	struct adc_tm5_chip *chip;
    644	int ret;
    645
    646	if (!channel)
    647		return -EINVAL;
    648
    649	chip = channel->chip;
    650	dev_dbg(chip->dev, "%d:low(mdegC):%d, high(mdegC):%d\n",
    651		channel->channel, low, high);
    652
    653	if (high == INT_MAX && low <= -INT_MAX)
    654		ret = chip->data->disable_channel(channel);
    655	else
    656		ret = chip->data->configure(channel, low, high);
    657
    658	return ret;
    659}
    660
    661static struct thermal_zone_of_device_ops adc_tm5_thermal_ops = {
    662	.get_temp = adc_tm5_get_temp,
    663	.set_trips = adc_tm5_set_trips,
    664};
    665
    666static int adc_tm5_register_tzd(struct adc_tm5_chip *adc_tm)
    667{
    668	unsigned int i;
    669	struct thermal_zone_device *tzd;
    670
    671	for (i = 0; i < adc_tm->nchannels; i++) {
    672		adc_tm->channels[i].chip = adc_tm;
    673
    674		tzd = devm_thermal_zone_of_sensor_register(adc_tm->dev,
    675							   adc_tm->channels[i].channel,
    676							   &adc_tm->channels[i],
    677							   &adc_tm5_thermal_ops);
    678		if (IS_ERR(tzd)) {
    679			if (PTR_ERR(tzd) == -ENODEV) {
    680				dev_warn(adc_tm->dev, "thermal sensor on channel %d is not used\n",
    681					 adc_tm->channels[i].channel);
    682				continue;
    683			}
    684
    685			dev_err(adc_tm->dev, "Error registering TZ zone for channel %d: %ld\n",
    686				adc_tm->channels[i].channel, PTR_ERR(tzd));
    687			return PTR_ERR(tzd);
    688		}
    689		adc_tm->channels[i].tzd = tzd;
    690	}
    691
    692	return 0;
    693}
    694
    695static int adc_tm_hc_init(struct adc_tm5_chip *chip)
    696{
    697	unsigned int i;
    698	u8 buf[2];
    699	int ret;
    700
    701	for (i = 0; i < chip->nchannels; i++) {
    702		if (chip->channels[i].channel >= ADC_TM5_NUM_CHANNELS) {
    703			dev_err(chip->dev, "Invalid channel %d\n", chip->channels[i].channel);
    704			return -EINVAL;
    705		}
    706	}
    707
    708	buf[0] = chip->decimation;
    709	buf[1] = chip->avg_samples | ADC_TM5_FAST_AVG_EN;
    710
    711	ret = adc_tm5_write(chip, ADC_TM5_ADC_DIG_PARAM, buf, sizeof(buf));
    712	if (ret)
    713		dev_err(chip->dev, "block write failed: %d\n", ret);
    714
    715	return ret;
    716}
    717
    718static int adc_tm5_init(struct adc_tm5_chip *chip)
    719{
    720	u8 buf[4], channels_available;
    721	int ret;
    722	unsigned int i;
    723
    724	ret = adc_tm5_read(chip, ADC_TM5_NUM_BTM,
    725			   &channels_available, sizeof(channels_available));
    726	if (ret) {
    727		dev_err(chip->dev, "read failed for BTM channels\n");
    728		return ret;
    729	}
    730
    731	for (i = 0; i < chip->nchannels; i++) {
    732		if (chip->channels[i].channel >= channels_available) {
    733			dev_err(chip->dev, "Invalid channel %d\n", chip->channels[i].channel);
    734			return -EINVAL;
    735		}
    736	}
    737
    738	buf[0] = chip->decimation;
    739	buf[1] = chip->avg_samples | ADC_TM5_FAST_AVG_EN;
    740	buf[2] = ADC_TM5_TIMER1;
    741	buf[3] = FIELD_PREP(ADC_TM5_MEAS_INTERVAL_CTL2_MASK, ADC_TM5_TIMER2) |
    742		 FIELD_PREP(ADC_TM5_MEAS_INTERVAL_CTL3_MASK, ADC_TM5_TIMER3);
    743
    744	ret = adc_tm5_write(chip, ADC_TM5_ADC_DIG_PARAM, buf, sizeof(buf));
    745	if (ret) {
    746		dev_err(chip->dev, "block write failed: %d\n", ret);
    747		return ret;
    748	}
    749
    750	return ret;
    751}
    752
    753static int adc_tm5_gen2_init(struct adc_tm5_chip *chip)
    754{
    755	u8 channels_available;
    756	int ret;
    757	unsigned int i;
    758
    759	ret = adc_tm5_read(chip, ADC_TM5_NUM_BTM,
    760			   &channels_available, sizeof(channels_available));
    761	if (ret) {
    762		dev_err(chip->dev, "read failed for BTM channels\n");
    763		return ret;
    764	}
    765
    766	for (i = 0; i < chip->nchannels; i++) {
    767		if (chip->channels[i].channel >= channels_available) {
    768			dev_err(chip->dev, "Invalid channel %d\n", chip->channels[i].channel);
    769			return -EINVAL;
    770		}
    771	}
    772
    773	mutex_init(&chip->adc_mutex_lock);
    774
    775	return ret;
    776}
    777
    778static int adc_tm5_get_dt_channel_data(struct adc_tm5_chip *adc_tm,
    779				       struct adc_tm5_channel *channel,
    780				       struct device_node *node)
    781{
    782	const char *name = node->name;
    783	u32 chan, value, adc_channel, varr[2];
    784	int ret;
    785	struct device *dev = adc_tm->dev;
    786	struct of_phandle_args args;
    787
    788	ret = of_property_read_u32(node, "reg", &chan);
    789	if (ret) {
    790		dev_err(dev, "%s: invalid channel number %d\n", name, ret);
    791		return ret;
    792	}
    793
    794	if (chan >= ADC_TM5_NUM_CHANNELS) {
    795		dev_err(dev, "%s: channel number too big: %d\n", name, chan);
    796		return -EINVAL;
    797	}
    798
    799	channel->channel = chan;
    800
    801	/*
    802	 * We are tied to PMIC's ADC controller, which always use single
    803	 * argument for channel number.  So don't bother parsing
    804	 * #io-channel-cells, just enforce cell_count = 1.
    805	 */
    806	ret = of_parse_phandle_with_fixed_args(node, "io-channels", 1, 0, &args);
    807	if (ret < 0) {
    808		dev_err(dev, "%s: error parsing ADC channel number %d: %d\n", name, chan, ret);
    809		return ret;
    810	}
    811	of_node_put(args.np);
    812
    813	if (args.args_count != 1) {
    814		dev_err(dev, "%s: invalid args count for ADC channel %d\n", name, chan);
    815		return -EINVAL;
    816	}
    817
    818	adc_channel = args.args[0];
    819	if (adc_tm->data->gen == ADC_TM5_GEN2)
    820		adc_channel &= 0xff;
    821
    822	if (adc_channel >= ADC5_MAX_CHANNEL) {
    823		dev_err(dev, "%s: invalid ADC channel number %d\n", name, chan);
    824		return -EINVAL;
    825	}
    826	channel->adc_channel = args.args[0];
    827
    828	channel->iio = devm_of_iio_channel_get_by_name(adc_tm->dev, node, NULL);
    829	if (IS_ERR(channel->iio)) {
    830		ret = PTR_ERR(channel->iio);
    831		if (ret != -EPROBE_DEFER)
    832			dev_err(dev, "%s: error getting channel: %d\n", name, ret);
    833		return ret;
    834	}
    835
    836	ret = of_property_read_u32_array(node, "qcom,pre-scaling", varr, 2);
    837	if (!ret) {
    838		ret = qcom_adc5_prescaling_from_dt(varr[0], varr[1]);
    839		if (ret < 0) {
    840			dev_err(dev, "%s: invalid pre-scaling <%d %d>\n",
    841				name, varr[0], varr[1]);
    842			return ret;
    843		}
    844		channel->prescale = ret;
    845	} else {
    846		/* 1:1 prescale is index 0 */
    847		channel->prescale = 0;
    848	}
    849
    850	ret = of_property_read_u32(node, "qcom,hw-settle-time-us", &value);
    851	if (!ret) {
    852		ret = qcom_adc5_hw_settle_time_from_dt(value, adc_tm->data->hw_settle);
    853		if (ret < 0) {
    854			dev_err(dev, "%s invalid hw-settle-time-us %d us\n",
    855				name, value);
    856			return ret;
    857		}
    858		channel->hw_settle_time = ret;
    859	} else {
    860		channel->hw_settle_time = VADC_DEF_HW_SETTLE_TIME;
    861	}
    862
    863	if (of_property_read_bool(node, "qcom,ratiometric"))
    864		channel->cal_method = ADC_TM5_RATIOMETRIC_CAL;
    865	else
    866		channel->cal_method = ADC_TM5_ABSOLUTE_CAL;
    867
    868	if (adc_tm->data->gen == ADC_TM5_GEN2) {
    869		ret = of_property_read_u32(node, "qcom,decimation", &value);
    870		if (!ret) {
    871			ret = qcom_adc5_decimation_from_dt(value, adc_tm->data->decimation);
    872			if (ret < 0) {
    873				dev_err(dev, "invalid decimation %d\n", value);
    874				return ret;
    875			}
    876			channel->decimation = ret;
    877		} else {
    878			channel->decimation = ADC5_DECIMATION_DEFAULT;
    879		}
    880
    881		ret = of_property_read_u32(node, "qcom,avg-samples", &value);
    882		if (!ret) {
    883			ret = qcom_adc5_avg_samples_from_dt(value);
    884			if (ret < 0) {
    885				dev_err(dev, "invalid avg-samples %d\n", value);
    886				return ret;
    887			}
    888			channel->avg_samples = ret;
    889		} else {
    890			channel->avg_samples = VADC_DEF_AVG_SAMPLES;
    891		}
    892	}
    893
    894	return 0;
    895}
    896
    897static const struct adc_tm5_data adc_tm5_data_pmic = {
    898	.full_scale_code_volt = 0x70e4,
    899	.decimation = (unsigned int []) { 250, 420, 840 },
    900	.hw_settle = (unsigned int []) { 15, 100, 200, 300, 400, 500, 600, 700,
    901					 1000, 2000, 4000, 8000, 16000, 32000,
    902					 64000, 128000 },
    903	.disable_channel = adc_tm5_disable_channel,
    904	.configure = adc_tm5_configure,
    905	.isr = adc_tm5_isr,
    906	.init = adc_tm5_init,
    907	.irq_name = "pm-adc-tm5",
    908	.gen = ADC_TM5,
    909};
    910
    911static const struct adc_tm5_data adc_tm_hc_data_pmic = {
    912	.full_scale_code_volt = 0x70e4,
    913	.decimation = (unsigned int []) { 256, 512, 1024 },
    914	.hw_settle = (unsigned int []) { 0, 100, 200, 300, 400, 500, 600, 700,
    915					 1000, 2000, 4000, 6000, 8000, 10000 },
    916	.disable_channel = adc_tm5_disable_channel,
    917	.configure = adc_tm5_configure,
    918	.isr = adc_tm5_isr,
    919	.init = adc_tm_hc_init,
    920	.irq_name = "pm-adc-tm5",
    921	.gen = ADC_TM_HC,
    922};
    923
    924static const struct adc_tm5_data adc_tm5_gen2_data_pmic = {
    925	.full_scale_code_volt = 0x70e4,
    926	.decimation = (unsigned int []) { 85, 340, 1360 },
    927	.hw_settle = (unsigned int []) { 15, 100, 200, 300, 400, 500, 600, 700,
    928					 1000, 2000, 4000, 8000, 16000, 32000,
    929					 64000, 128000 },
    930	.disable_channel = adc_tm5_gen2_disable_channel,
    931	.configure = adc_tm5_gen2_configure,
    932	.isr = adc_tm5_gen2_isr,
    933	.init = adc_tm5_gen2_init,
    934	.irq_name = "pm-adc-tm5-gen2",
    935	.gen = ADC_TM5_GEN2,
    936};
    937
    938static int adc_tm5_get_dt_data(struct adc_tm5_chip *adc_tm, struct device_node *node)
    939{
    940	struct adc_tm5_channel *channels;
    941	struct device_node *child;
    942	u32 value;
    943	int ret;
    944	struct device *dev = adc_tm->dev;
    945
    946	adc_tm->nchannels = of_get_available_child_count(node);
    947	if (!adc_tm->nchannels)
    948		return -EINVAL;
    949
    950	adc_tm->channels = devm_kcalloc(dev, adc_tm->nchannels,
    951					sizeof(*adc_tm->channels), GFP_KERNEL);
    952	if (!adc_tm->channels)
    953		return -ENOMEM;
    954
    955	channels = adc_tm->channels;
    956
    957	adc_tm->data = of_device_get_match_data(dev);
    958	if (!adc_tm->data)
    959		adc_tm->data = &adc_tm5_data_pmic;
    960
    961	ret = of_property_read_u32(node, "qcom,decimation", &value);
    962	if (!ret) {
    963		ret = qcom_adc5_decimation_from_dt(value, adc_tm->data->decimation);
    964		if (ret < 0) {
    965			dev_err(dev, "invalid decimation %d\n", value);
    966			return ret;
    967		}
    968		adc_tm->decimation = ret;
    969	} else {
    970		adc_tm->decimation = ADC5_DECIMATION_DEFAULT;
    971	}
    972
    973	ret = of_property_read_u32(node, "qcom,avg-samples", &value);
    974	if (!ret) {
    975		ret = qcom_adc5_avg_samples_from_dt(value);
    976		if (ret < 0) {
    977			dev_err(dev, "invalid avg-samples %d\n", value);
    978			return ret;
    979		}
    980		adc_tm->avg_samples = ret;
    981	} else {
    982		adc_tm->avg_samples = VADC_DEF_AVG_SAMPLES;
    983	}
    984
    985	for_each_available_child_of_node(node, child) {
    986		ret = adc_tm5_get_dt_channel_data(adc_tm, channels, child);
    987		if (ret) {
    988			of_node_put(child);
    989			return ret;
    990		}
    991
    992		channels++;
    993	}
    994
    995	return 0;
    996}
    997
    998static int adc_tm5_probe(struct platform_device *pdev)
    999{
   1000	struct device_node *node = pdev->dev.of_node;
   1001	struct device *dev = &pdev->dev;
   1002	struct adc_tm5_chip *adc_tm;
   1003	struct regmap *regmap;
   1004	int ret, irq;
   1005	u32 reg;
   1006
   1007	regmap = dev_get_regmap(dev->parent, NULL);
   1008	if (!regmap)
   1009		return -ENODEV;
   1010
   1011	ret = of_property_read_u32(node, "reg", &reg);
   1012	if (ret)
   1013		return ret;
   1014
   1015	adc_tm = devm_kzalloc(&pdev->dev, sizeof(*adc_tm), GFP_KERNEL);
   1016	if (!adc_tm)
   1017		return -ENOMEM;
   1018
   1019	adc_tm->regmap = regmap;
   1020	adc_tm->dev = dev;
   1021	adc_tm->base = reg;
   1022
   1023	irq = platform_get_irq(pdev, 0);
   1024	if (irq < 0) {
   1025		dev_err(dev, "get_irq failed: %d\n", irq);
   1026		return irq;
   1027	}
   1028
   1029	ret = adc_tm5_get_dt_data(adc_tm, node);
   1030	if (ret) {
   1031		dev_err(dev, "get dt data failed: %d\n", ret);
   1032		return ret;
   1033	}
   1034
   1035	ret = adc_tm->data->init(adc_tm);
   1036	if (ret) {
   1037		dev_err(dev, "adc-tm init failed\n");
   1038		return ret;
   1039	}
   1040
   1041	ret = adc_tm5_register_tzd(adc_tm);
   1042	if (ret) {
   1043		dev_err(dev, "tzd register failed\n");
   1044		return ret;
   1045	}
   1046
   1047	return devm_request_threaded_irq(dev, irq, NULL, adc_tm->data->isr,
   1048			IRQF_ONESHOT, adc_tm->data->irq_name, adc_tm);
   1049}
   1050
   1051static const struct of_device_id adc_tm5_match_table[] = {
   1052	{
   1053		.compatible = "qcom,spmi-adc-tm5",
   1054		.data = &adc_tm5_data_pmic,
   1055	},
   1056	{
   1057		.compatible = "qcom,spmi-adc-tm-hc",
   1058		.data = &adc_tm_hc_data_pmic,
   1059	},
   1060	{
   1061		.compatible = "qcom,spmi-adc-tm5-gen2",
   1062		.data = &adc_tm5_gen2_data_pmic,
   1063	},
   1064	{ }
   1065};
   1066MODULE_DEVICE_TABLE(of, adc_tm5_match_table);
   1067
   1068static struct platform_driver adc_tm5_driver = {
   1069	.driver = {
   1070		.name = "qcom-spmi-adc-tm5",
   1071		.of_match_table = adc_tm5_match_table,
   1072	},
   1073	.probe = adc_tm5_probe,
   1074};
   1075module_platform_driver(adc_tm5_driver);
   1076
   1077MODULE_DESCRIPTION("SPMI PMIC Thermal Monitor ADC driver");
   1078MODULE_LICENSE("GPL v2");