0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/bitfield.h>
0009 #include <linux/clk.h>
0010 #include <linux/clk-provider.h>
0011 #include <linux/delay.h>
0012 #include <linux/io.h>
0013 #include <linux/iio/iio.h>
0014 #include <linux/module.h>
0015 #include <linux/nvmem-consumer.h>
0016 #include <linux/interrupt.h>
0017 #include <linux/of.h>
0018 #include <linux/of_irq.h>
0019 #include <linux/of_device.h>
0020 #include <linux/platform_device.h>
0021 #include <linux/regmap.h>
0022 #include <linux/regulator/consumer.h>
0023 #include <linux/mfd/syscon.h>
0024
0025 #define MESON_SAR_ADC_REG0 0x00
0026 #define MESON_SAR_ADC_REG0_PANEL_DETECT BIT(31)
0027 #define MESON_SAR_ADC_REG0_BUSY_MASK GENMASK(30, 28)
0028 #define MESON_SAR_ADC_REG0_DELTA_BUSY BIT(30)
0029 #define MESON_SAR_ADC_REG0_AVG_BUSY BIT(29)
0030 #define MESON_SAR_ADC_REG0_SAMPLE_BUSY BIT(28)
0031 #define MESON_SAR_ADC_REG0_FIFO_FULL BIT(27)
0032 #define MESON_SAR_ADC_REG0_FIFO_EMPTY BIT(26)
0033 #define MESON_SAR_ADC_REG0_FIFO_COUNT_MASK GENMASK(25, 21)
0034 #define MESON_SAR_ADC_REG0_ADC_BIAS_CTRL_MASK GENMASK(20, 19)
0035 #define MESON_SAR_ADC_REG0_CURR_CHAN_ID_MASK GENMASK(18, 16)
0036 #define MESON_SAR_ADC_REG0_ADC_TEMP_SEN_SEL BIT(15)
0037 #define MESON_SAR_ADC_REG0_SAMPLING_STOP BIT(14)
0038 #define MESON_SAR_ADC_REG0_CHAN_DELTA_EN_MASK GENMASK(13, 12)
0039 #define MESON_SAR_ADC_REG0_DETECT_IRQ_POL BIT(10)
0040 #define MESON_SAR_ADC_REG0_DETECT_IRQ_EN BIT(9)
0041 #define MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK GENMASK(8, 4)
0042 #define MESON_SAR_ADC_REG0_FIFO_IRQ_EN BIT(3)
0043 #define MESON_SAR_ADC_REG0_SAMPLING_START BIT(2)
0044 #define MESON_SAR_ADC_REG0_CONTINUOUS_EN BIT(1)
0045 #define MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE BIT(0)
0046
0047 #define MESON_SAR_ADC_CHAN_LIST 0x04
0048 #define MESON_SAR_ADC_CHAN_LIST_MAX_INDEX_MASK GENMASK(26, 24)
0049 #define MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(_chan) \
0050 (GENMASK(2, 0) << ((_chan) * 3))
0051
0052 #define MESON_SAR_ADC_AVG_CNTL 0x08
0053 #define MESON_SAR_ADC_AVG_CNTL_AVG_MODE_SHIFT(_chan) \
0054 (16 + ((_chan) * 2))
0055 #define MESON_SAR_ADC_AVG_CNTL_AVG_MODE_MASK(_chan) \
0056 (GENMASK(17, 16) << ((_chan) * 2))
0057 #define MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_SHIFT(_chan) \
0058 (0 + ((_chan) * 2))
0059 #define MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_MASK(_chan) \
0060 (GENMASK(1, 0) << ((_chan) * 2))
0061
0062 #define MESON_SAR_ADC_REG3 0x0c
0063 #define MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY BIT(31)
0064 #define MESON_SAR_ADC_REG3_CLK_EN BIT(30)
0065 #define MESON_SAR_ADC_REG3_BL30_INITIALIZED BIT(28)
0066 #define MESON_SAR_ADC_REG3_CTRL_CONT_RING_COUNTER_EN BIT(27)
0067 #define MESON_SAR_ADC_REG3_CTRL_SAMPLING_CLOCK_PHASE BIT(26)
0068 #define MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK GENMASK(25, 23)
0069 #define MESON_SAR_ADC_REG3_DETECT_EN BIT(22)
0070 #define MESON_SAR_ADC_REG3_ADC_EN BIT(21)
0071 #define MESON_SAR_ADC_REG3_PANEL_DETECT_COUNT_MASK GENMASK(20, 18)
0072 #define MESON_SAR_ADC_REG3_PANEL_DETECT_FILTER_TB_MASK GENMASK(17, 16)
0073 #define MESON_SAR_ADC_REG3_ADC_CLK_DIV_SHIFT 10
0074 #define MESON_SAR_ADC_REG3_ADC_CLK_DIV_WIDTH 5
0075 #define MESON_SAR_ADC_REG3_BLOCK_DLY_SEL_MASK GENMASK(9, 8)
0076 #define MESON_SAR_ADC_REG3_BLOCK_DLY_MASK GENMASK(7, 0)
0077
0078 #define MESON_SAR_ADC_DELAY 0x10
0079 #define MESON_SAR_ADC_DELAY_INPUT_DLY_SEL_MASK GENMASK(25, 24)
0080 #define MESON_SAR_ADC_DELAY_BL30_BUSY BIT(15)
0081 #define MESON_SAR_ADC_DELAY_KERNEL_BUSY BIT(14)
0082 #define MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK GENMASK(23, 16)
0083 #define MESON_SAR_ADC_DELAY_SAMPLE_DLY_SEL_MASK GENMASK(9, 8)
0084 #define MESON_SAR_ADC_DELAY_SAMPLE_DLY_CNT_MASK GENMASK(7, 0)
0085
0086 #define MESON_SAR_ADC_LAST_RD 0x14
0087 #define MESON_SAR_ADC_LAST_RD_LAST_CHANNEL1_MASK GENMASK(23, 16)
0088 #define MESON_SAR_ADC_LAST_RD_LAST_CHANNEL0_MASK GENMASK(9, 0)
0089
0090 #define MESON_SAR_ADC_FIFO_RD 0x18
0091 #define MESON_SAR_ADC_FIFO_RD_CHAN_ID_MASK GENMASK(14, 12)
0092 #define MESON_SAR_ADC_FIFO_RD_SAMPLE_VALUE_MASK GENMASK(11, 0)
0093
0094 #define MESON_SAR_ADC_AUX_SW 0x1c
0095 #define MESON_SAR_ADC_AUX_SW_MUX_SEL_CHAN_SHIFT(_chan) \
0096 (8 + (((_chan) - 2) * 3))
0097 #define MESON_SAR_ADC_AUX_SW_VREF_P_MUX BIT(6)
0098 #define MESON_SAR_ADC_AUX_SW_VREF_N_MUX BIT(5)
0099 #define MESON_SAR_ADC_AUX_SW_MODE_SEL BIT(4)
0100 #define MESON_SAR_ADC_AUX_SW_YP_DRIVE_SW BIT(3)
0101 #define MESON_SAR_ADC_AUX_SW_XP_DRIVE_SW BIT(2)
0102 #define MESON_SAR_ADC_AUX_SW_YM_DRIVE_SW BIT(1)
0103 #define MESON_SAR_ADC_AUX_SW_XM_DRIVE_SW BIT(0)
0104
0105 #define MESON_SAR_ADC_CHAN_10_SW 0x20
0106 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_MUX_SEL_MASK GENMASK(25, 23)
0107 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_VREF_P_MUX BIT(22)
0108 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_VREF_N_MUX BIT(21)
0109 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_MODE_SEL BIT(20)
0110 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_YP_DRIVE_SW BIT(19)
0111 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_XP_DRIVE_SW BIT(18)
0112 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_YM_DRIVE_SW BIT(17)
0113 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_XM_DRIVE_SW BIT(16)
0114 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_MUX_SEL_MASK GENMASK(9, 7)
0115 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_VREF_P_MUX BIT(6)
0116 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_VREF_N_MUX BIT(5)
0117 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_MODE_SEL BIT(4)
0118 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_YP_DRIVE_SW BIT(3)
0119 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_XP_DRIVE_SW BIT(2)
0120 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_YM_DRIVE_SW BIT(1)
0121 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_XM_DRIVE_SW BIT(0)
0122
0123 #define MESON_SAR_ADC_DETECT_IDLE_SW 0x24
0124 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_SW_EN BIT(26)
0125 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK GENMASK(25, 23)
0126 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_VREF_P_MUX BIT(22)
0127 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_VREF_N_MUX BIT(21)
0128 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MODE_SEL BIT(20)
0129 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_YP_DRIVE_SW BIT(19)
0130 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_XP_DRIVE_SW BIT(18)
0131 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_YM_DRIVE_SW BIT(17)
0132 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_XM_DRIVE_SW BIT(16)
0133 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK GENMASK(9, 7)
0134 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_VREF_P_MUX BIT(6)
0135 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_VREF_N_MUX BIT(5)
0136 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MODE_SEL BIT(4)
0137 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_YP_DRIVE_SW BIT(3)
0138 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_XP_DRIVE_SW BIT(2)
0139 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_YM_DRIVE_SW BIT(1)
0140 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_XM_DRIVE_SW BIT(0)
0141
0142 #define MESON_SAR_ADC_DELTA_10 0x28
0143 #define MESON_SAR_ADC_DELTA_10_TEMP_SEL BIT(27)
0144 #define MESON_SAR_ADC_DELTA_10_TS_REVE1 BIT(26)
0145 #define MESON_SAR_ADC_DELTA_10_CHAN1_DELTA_VALUE_MASK GENMASK(25, 16)
0146 #define MESON_SAR_ADC_DELTA_10_TS_REVE0 BIT(15)
0147 #define MESON_SAR_ADC_DELTA_10_TS_C_MASK GENMASK(14, 11)
0148 #define MESON_SAR_ADC_DELTA_10_TS_VBG_EN BIT(10)
0149 #define MESON_SAR_ADC_DELTA_10_CHAN0_DELTA_VALUE_MASK GENMASK(9, 0)
0150
0151
0152
0153
0154
0155
0156 #define MESON_SAR_ADC_REG11 0x2c
0157 #define MESON_SAR_ADC_REG11_BANDGAP_EN BIT(13)
0158
0159 #define MESON_SAR_ADC_REG13 0x34
0160 #define MESON_SAR_ADC_REG13_12BIT_CALIBRATION_MASK GENMASK(13, 8)
0161
0162 #define MESON_SAR_ADC_MAX_FIFO_SIZE 32
0163 #define MESON_SAR_ADC_TIMEOUT 100
0164 #define MESON_SAR_ADC_VOLTAGE_AND_TEMP_CHANNEL 6
0165 #define MESON_SAR_ADC_TEMP_OFFSET 27
0166
0167
0168 #define MESON_SAR_ADC_EFUSE_BYTES 4
0169 #define MESON_SAR_ADC_EFUSE_BYTE3_UPPER_ADC_VAL GENMASK(6, 0)
0170 #define MESON_SAR_ADC_EFUSE_BYTE3_IS_CALIBRATED BIT(7)
0171
0172 #define MESON_HHI_DPLL_TOP_0 0x318
0173 #define MESON_HHI_DPLL_TOP_0_TSC_BIT4 BIT(9)
0174
0175
0176 #define MILLION 1000000
0177
0178 #define MESON_SAR_ADC_CHAN(_chan) { \
0179 .type = IIO_VOLTAGE, \
0180 .indexed = 1, \
0181 .channel = _chan, \
0182 .address = _chan, \
0183 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
0184 BIT(IIO_CHAN_INFO_AVERAGE_RAW), \
0185 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
0186 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_CALIBBIAS) | \
0187 BIT(IIO_CHAN_INFO_CALIBSCALE), \
0188 .datasheet_name = "SAR_ADC_CH"#_chan, \
0189 }
0190
0191 #define MESON_SAR_ADC_TEMP_CHAN(_chan) { \
0192 .type = IIO_TEMP, \
0193 .channel = _chan, \
0194 .address = MESON_SAR_ADC_VOLTAGE_AND_TEMP_CHANNEL, \
0195 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
0196 BIT(IIO_CHAN_INFO_AVERAGE_RAW), \
0197 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | \
0198 BIT(IIO_CHAN_INFO_SCALE), \
0199 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_CALIBBIAS) | \
0200 BIT(IIO_CHAN_INFO_CALIBSCALE), \
0201 .datasheet_name = "TEMP_SENSOR", \
0202 }
0203
0204 static const struct iio_chan_spec meson_sar_adc_iio_channels[] = {
0205 MESON_SAR_ADC_CHAN(0),
0206 MESON_SAR_ADC_CHAN(1),
0207 MESON_SAR_ADC_CHAN(2),
0208 MESON_SAR_ADC_CHAN(3),
0209 MESON_SAR_ADC_CHAN(4),
0210 MESON_SAR_ADC_CHAN(5),
0211 MESON_SAR_ADC_CHAN(6),
0212 MESON_SAR_ADC_CHAN(7),
0213 IIO_CHAN_SOFT_TIMESTAMP(8),
0214 };
0215
0216 static const struct iio_chan_spec meson_sar_adc_and_temp_iio_channels[] = {
0217 MESON_SAR_ADC_CHAN(0),
0218 MESON_SAR_ADC_CHAN(1),
0219 MESON_SAR_ADC_CHAN(2),
0220 MESON_SAR_ADC_CHAN(3),
0221 MESON_SAR_ADC_CHAN(4),
0222 MESON_SAR_ADC_CHAN(5),
0223 MESON_SAR_ADC_CHAN(6),
0224 MESON_SAR_ADC_CHAN(7),
0225 MESON_SAR_ADC_TEMP_CHAN(8),
0226 IIO_CHAN_SOFT_TIMESTAMP(9),
0227 };
0228
0229 enum meson_sar_adc_avg_mode {
0230 NO_AVERAGING = 0x0,
0231 MEAN_AVERAGING = 0x1,
0232 MEDIAN_AVERAGING = 0x2,
0233 };
0234
0235 enum meson_sar_adc_num_samples {
0236 ONE_SAMPLE = 0x0,
0237 TWO_SAMPLES = 0x1,
0238 FOUR_SAMPLES = 0x2,
0239 EIGHT_SAMPLES = 0x3,
0240 };
0241
0242 enum meson_sar_adc_chan7_mux_sel {
0243 CHAN7_MUX_VSS = 0x0,
0244 CHAN7_MUX_VDD_DIV4 = 0x1,
0245 CHAN7_MUX_VDD_DIV2 = 0x2,
0246 CHAN7_MUX_VDD_MUL3_DIV4 = 0x3,
0247 CHAN7_MUX_VDD = 0x4,
0248 CHAN7_MUX_CH7_INPUT = 0x7,
0249 };
0250
0251 struct meson_sar_adc_param {
0252 bool has_bl30_integration;
0253 unsigned long clock_rate;
0254 u32 bandgap_reg;
0255 unsigned int resolution;
0256 const struct regmap_config *regmap_config;
0257 u8 temperature_trimming_bits;
0258 unsigned int temperature_multiplier;
0259 unsigned int temperature_divider;
0260 };
0261
0262 struct meson_sar_adc_data {
0263 const struct meson_sar_adc_param *param;
0264 const char *name;
0265 };
0266
0267 struct meson_sar_adc_priv {
0268 struct regmap *regmap;
0269 struct regulator *vref;
0270 const struct meson_sar_adc_param *param;
0271 struct clk *clkin;
0272 struct clk *core_clk;
0273 struct clk *adc_sel_clk;
0274 struct clk *adc_clk;
0275 struct clk_gate clk_gate;
0276 struct clk *adc_div_clk;
0277 struct clk_divider clk_div;
0278 struct completion done;
0279 int calibbias;
0280 int calibscale;
0281 struct regmap *tsc_regmap;
0282 bool temperature_sensor_calibrated;
0283 u8 temperature_sensor_coefficient;
0284 u16 temperature_sensor_adc_val;
0285 };
0286
0287 static const struct regmap_config meson_sar_adc_regmap_config_gxbb = {
0288 .reg_bits = 8,
0289 .val_bits = 32,
0290 .reg_stride = 4,
0291 .max_register = MESON_SAR_ADC_REG13,
0292 };
0293
0294 static const struct regmap_config meson_sar_adc_regmap_config_meson8 = {
0295 .reg_bits = 8,
0296 .val_bits = 32,
0297 .reg_stride = 4,
0298 .max_register = MESON_SAR_ADC_DELTA_10,
0299 };
0300
0301 static unsigned int meson_sar_adc_get_fifo_count(struct iio_dev *indio_dev)
0302 {
0303 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0304 u32 regval;
0305
0306 regmap_read(priv->regmap, MESON_SAR_ADC_REG0, ®val);
0307
0308 return FIELD_GET(MESON_SAR_ADC_REG0_FIFO_COUNT_MASK, regval);
0309 }
0310
0311 static int meson_sar_adc_calib_val(struct iio_dev *indio_dev, int val)
0312 {
0313 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0314 int tmp;
0315
0316
0317 tmp = div_s64((s64)val * priv->calibscale, MILLION) + priv->calibbias;
0318
0319 return clamp(tmp, 0, (1 << priv->param->resolution) - 1);
0320 }
0321
0322 static int meson_sar_adc_wait_busy_clear(struct iio_dev *indio_dev)
0323 {
0324 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0325 int val;
0326
0327
0328
0329
0330
0331
0332 udelay(1);
0333 return regmap_read_poll_timeout_atomic(priv->regmap, MESON_SAR_ADC_REG0, val,
0334 !FIELD_GET(MESON_SAR_ADC_REG0_BUSY_MASK, val),
0335 1, 10000);
0336 }
0337
0338 static int meson_sar_adc_read_raw_sample(struct iio_dev *indio_dev,
0339 const struct iio_chan_spec *chan,
0340 int *val)
0341 {
0342 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0343 struct device *dev = indio_dev->dev.parent;
0344 int regval, fifo_chan, fifo_val, count;
0345
0346 if (!wait_for_completion_timeout(&priv->done,
0347 msecs_to_jiffies(MESON_SAR_ADC_TIMEOUT)))
0348 return -ETIMEDOUT;
0349
0350 count = meson_sar_adc_get_fifo_count(indio_dev);
0351 if (count != 1) {
0352 dev_err(dev, "ADC FIFO has %d element(s) instead of one\n", count);
0353 return -EINVAL;
0354 }
0355
0356 regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, ®val);
0357 fifo_chan = FIELD_GET(MESON_SAR_ADC_FIFO_RD_CHAN_ID_MASK, regval);
0358 if (fifo_chan != chan->address) {
0359 dev_err(dev, "ADC FIFO entry belongs to channel %d instead of %lu\n",
0360 fifo_chan, chan->address);
0361 return -EINVAL;
0362 }
0363
0364 fifo_val = FIELD_GET(MESON_SAR_ADC_FIFO_RD_SAMPLE_VALUE_MASK, regval);
0365 fifo_val &= GENMASK(priv->param->resolution - 1, 0);
0366 *val = meson_sar_adc_calib_val(indio_dev, fifo_val);
0367
0368 return 0;
0369 }
0370
0371 static void meson_sar_adc_set_averaging(struct iio_dev *indio_dev,
0372 const struct iio_chan_spec *chan,
0373 enum meson_sar_adc_avg_mode mode,
0374 enum meson_sar_adc_num_samples samples)
0375 {
0376 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0377 int val, address = chan->address;
0378
0379 val = samples << MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_SHIFT(address);
0380 regmap_update_bits(priv->regmap, MESON_SAR_ADC_AVG_CNTL,
0381 MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_MASK(address),
0382 val);
0383
0384 val = mode << MESON_SAR_ADC_AVG_CNTL_AVG_MODE_SHIFT(address);
0385 regmap_update_bits(priv->regmap, MESON_SAR_ADC_AVG_CNTL,
0386 MESON_SAR_ADC_AVG_CNTL_AVG_MODE_MASK(address), val);
0387 }
0388
0389 static void meson_sar_adc_enable_channel(struct iio_dev *indio_dev,
0390 const struct iio_chan_spec *chan)
0391 {
0392 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0393 u32 regval;
0394
0395
0396
0397
0398
0399
0400 regval = FIELD_PREP(MESON_SAR_ADC_CHAN_LIST_MAX_INDEX_MASK, 0);
0401 regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_LIST,
0402 MESON_SAR_ADC_CHAN_LIST_MAX_INDEX_MASK, regval);
0403
0404
0405 regval = FIELD_PREP(MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(0),
0406 chan->address);
0407 regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_LIST,
0408 MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(0), regval);
0409
0410 regval = FIELD_PREP(MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK,
0411 chan->address);
0412 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DETECT_IDLE_SW,
0413 MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK,
0414 regval);
0415
0416 regval = FIELD_PREP(MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK,
0417 chan->address);
0418 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DETECT_IDLE_SW,
0419 MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK,
0420 regval);
0421
0422 if (chan->address == MESON_SAR_ADC_VOLTAGE_AND_TEMP_CHANNEL) {
0423 if (chan->type == IIO_TEMP)
0424 regval = MESON_SAR_ADC_DELTA_10_TEMP_SEL;
0425 else
0426 regval = 0;
0427
0428 regmap_update_bits(priv->regmap,
0429 MESON_SAR_ADC_DELTA_10,
0430 MESON_SAR_ADC_DELTA_10_TEMP_SEL, regval);
0431 }
0432 }
0433
0434 static void meson_sar_adc_set_chan7_mux(struct iio_dev *indio_dev,
0435 enum meson_sar_adc_chan7_mux_sel sel)
0436 {
0437 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0438 u32 regval;
0439
0440 regval = FIELD_PREP(MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK, sel);
0441 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
0442 MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK, regval);
0443
0444 usleep_range(10, 20);
0445 }
0446
0447 static void meson_sar_adc_start_sample_engine(struct iio_dev *indio_dev)
0448 {
0449 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0450
0451 reinit_completion(&priv->done);
0452
0453 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
0454 MESON_SAR_ADC_REG0_FIFO_IRQ_EN,
0455 MESON_SAR_ADC_REG0_FIFO_IRQ_EN);
0456
0457 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
0458 MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE,
0459 MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE);
0460
0461 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
0462 MESON_SAR_ADC_REG0_SAMPLING_START,
0463 MESON_SAR_ADC_REG0_SAMPLING_START);
0464 }
0465
0466 static void meson_sar_adc_stop_sample_engine(struct iio_dev *indio_dev)
0467 {
0468 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0469
0470 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
0471 MESON_SAR_ADC_REG0_FIFO_IRQ_EN, 0);
0472
0473 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
0474 MESON_SAR_ADC_REG0_SAMPLING_STOP,
0475 MESON_SAR_ADC_REG0_SAMPLING_STOP);
0476
0477
0478 meson_sar_adc_wait_busy_clear(indio_dev);
0479
0480 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
0481 MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE, 0);
0482 }
0483
0484 static int meson_sar_adc_lock(struct iio_dev *indio_dev)
0485 {
0486 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0487 int val, ret;
0488
0489 mutex_lock(&indio_dev->mlock);
0490
0491 if (priv->param->has_bl30_integration) {
0492
0493 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
0494 MESON_SAR_ADC_DELAY_KERNEL_BUSY,
0495 MESON_SAR_ADC_DELAY_KERNEL_BUSY);
0496
0497 udelay(1);
0498
0499
0500
0501
0502
0503 ret = regmap_read_poll_timeout_atomic(priv->regmap, MESON_SAR_ADC_DELAY, val,
0504 !(val & MESON_SAR_ADC_DELAY_BL30_BUSY),
0505 1, 10000);
0506 if (ret) {
0507 mutex_unlock(&indio_dev->mlock);
0508 return ret;
0509 }
0510 }
0511
0512 return 0;
0513 }
0514
0515 static void meson_sar_adc_unlock(struct iio_dev *indio_dev)
0516 {
0517 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0518
0519 if (priv->param->has_bl30_integration)
0520
0521 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
0522 MESON_SAR_ADC_DELAY_KERNEL_BUSY, 0);
0523
0524 mutex_unlock(&indio_dev->mlock);
0525 }
0526
0527 static void meson_sar_adc_clear_fifo(struct iio_dev *indio_dev)
0528 {
0529 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0530 unsigned int count, tmp;
0531
0532 for (count = 0; count < MESON_SAR_ADC_MAX_FIFO_SIZE; count++) {
0533 if (!meson_sar_adc_get_fifo_count(indio_dev))
0534 break;
0535
0536 regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, &tmp);
0537 }
0538 }
0539
0540 static int meson_sar_adc_get_sample(struct iio_dev *indio_dev,
0541 const struct iio_chan_spec *chan,
0542 enum meson_sar_adc_avg_mode avg_mode,
0543 enum meson_sar_adc_num_samples avg_samples,
0544 int *val)
0545 {
0546 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0547 struct device *dev = indio_dev->dev.parent;
0548 int ret;
0549
0550 if (chan->type == IIO_TEMP && !priv->temperature_sensor_calibrated)
0551 return -ENOTSUPP;
0552
0553 ret = meson_sar_adc_lock(indio_dev);
0554 if (ret)
0555 return ret;
0556
0557
0558 meson_sar_adc_clear_fifo(indio_dev);
0559
0560 meson_sar_adc_set_averaging(indio_dev, chan, avg_mode, avg_samples);
0561
0562 meson_sar_adc_enable_channel(indio_dev, chan);
0563
0564 meson_sar_adc_start_sample_engine(indio_dev);
0565 ret = meson_sar_adc_read_raw_sample(indio_dev, chan, val);
0566 meson_sar_adc_stop_sample_engine(indio_dev);
0567
0568 meson_sar_adc_unlock(indio_dev);
0569
0570 if (ret) {
0571 dev_warn(dev, "failed to read sample for channel %lu: %d\n",
0572 chan->address, ret);
0573 return ret;
0574 }
0575
0576 return IIO_VAL_INT;
0577 }
0578
0579 static int meson_sar_adc_iio_info_read_raw(struct iio_dev *indio_dev,
0580 const struct iio_chan_spec *chan,
0581 int *val, int *val2, long mask)
0582 {
0583 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0584 struct device *dev = indio_dev->dev.parent;
0585 int ret;
0586
0587 switch (mask) {
0588 case IIO_CHAN_INFO_RAW:
0589 return meson_sar_adc_get_sample(indio_dev, chan, NO_AVERAGING,
0590 ONE_SAMPLE, val);
0591
0592 case IIO_CHAN_INFO_AVERAGE_RAW:
0593 return meson_sar_adc_get_sample(indio_dev, chan,
0594 MEAN_AVERAGING, EIGHT_SAMPLES,
0595 val);
0596
0597 case IIO_CHAN_INFO_SCALE:
0598 if (chan->type == IIO_VOLTAGE) {
0599 ret = regulator_get_voltage(priv->vref);
0600 if (ret < 0) {
0601 dev_err(dev, "failed to get vref voltage: %d\n", ret);
0602 return ret;
0603 }
0604
0605 *val = ret / 1000;
0606 *val2 = priv->param->resolution;
0607 return IIO_VAL_FRACTIONAL_LOG2;
0608 } else if (chan->type == IIO_TEMP) {
0609
0610 *val = priv->param->temperature_multiplier;
0611 *val2 = priv->param->temperature_divider;
0612
0613
0614 *val *= 1000;
0615
0616 return IIO_VAL_FRACTIONAL;
0617 } else {
0618 return -EINVAL;
0619 }
0620
0621 case IIO_CHAN_INFO_CALIBBIAS:
0622 *val = priv->calibbias;
0623 return IIO_VAL_INT;
0624
0625 case IIO_CHAN_INFO_CALIBSCALE:
0626 *val = priv->calibscale / MILLION;
0627 *val2 = priv->calibscale % MILLION;
0628 return IIO_VAL_INT_PLUS_MICRO;
0629
0630 case IIO_CHAN_INFO_OFFSET:
0631 *val = DIV_ROUND_CLOSEST(MESON_SAR_ADC_TEMP_OFFSET *
0632 priv->param->temperature_divider,
0633 priv->param->temperature_multiplier);
0634 *val -= priv->temperature_sensor_adc_val;
0635 return IIO_VAL_INT;
0636
0637 default:
0638 return -EINVAL;
0639 }
0640 }
0641
0642 static int meson_sar_adc_clk_init(struct iio_dev *indio_dev,
0643 void __iomem *base)
0644 {
0645 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0646 struct device *dev = indio_dev->dev.parent;
0647 struct clk_init_data init;
0648 const char *clk_parents[1];
0649
0650 init.name = devm_kasprintf(dev, GFP_KERNEL, "%s#adc_div", dev_name(dev));
0651 if (!init.name)
0652 return -ENOMEM;
0653
0654 init.flags = 0;
0655 init.ops = &clk_divider_ops;
0656 clk_parents[0] = __clk_get_name(priv->clkin);
0657 init.parent_names = clk_parents;
0658 init.num_parents = 1;
0659
0660 priv->clk_div.reg = base + MESON_SAR_ADC_REG3;
0661 priv->clk_div.shift = MESON_SAR_ADC_REG3_ADC_CLK_DIV_SHIFT;
0662 priv->clk_div.width = MESON_SAR_ADC_REG3_ADC_CLK_DIV_WIDTH;
0663 priv->clk_div.hw.init = &init;
0664 priv->clk_div.flags = 0;
0665
0666 priv->adc_div_clk = devm_clk_register(dev, &priv->clk_div.hw);
0667 if (WARN_ON(IS_ERR(priv->adc_div_clk)))
0668 return PTR_ERR(priv->adc_div_clk);
0669
0670 init.name = devm_kasprintf(dev, GFP_KERNEL, "%s#adc_en", dev_name(dev));
0671 if (!init.name)
0672 return -ENOMEM;
0673
0674 init.flags = CLK_SET_RATE_PARENT;
0675 init.ops = &clk_gate_ops;
0676 clk_parents[0] = __clk_get_name(priv->adc_div_clk);
0677 init.parent_names = clk_parents;
0678 init.num_parents = 1;
0679
0680 priv->clk_gate.reg = base + MESON_SAR_ADC_REG3;
0681 priv->clk_gate.bit_idx = __ffs(MESON_SAR_ADC_REG3_CLK_EN);
0682 priv->clk_gate.hw.init = &init;
0683
0684 priv->adc_clk = devm_clk_register(dev, &priv->clk_gate.hw);
0685 if (WARN_ON(IS_ERR(priv->adc_clk)))
0686 return PTR_ERR(priv->adc_clk);
0687
0688 return 0;
0689 }
0690
0691 static int meson_sar_adc_temp_sensor_init(struct iio_dev *indio_dev)
0692 {
0693 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0694 u8 *buf, trimming_bits, trimming_mask, upper_adc_val;
0695 struct device *dev = indio_dev->dev.parent;
0696 struct nvmem_cell *temperature_calib;
0697 size_t read_len;
0698 int ret;
0699
0700 temperature_calib = devm_nvmem_cell_get(dev, "temperature_calib");
0701 if (IS_ERR(temperature_calib)) {
0702 ret = PTR_ERR(temperature_calib);
0703
0704
0705
0706
0707
0708 if (ret == -ENODEV)
0709 return 0;
0710
0711 return dev_err_probe(dev, ret, "failed to get temperature_calib cell\n");
0712 }
0713
0714 priv->tsc_regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "amlogic,hhi-sysctrl");
0715 if (IS_ERR(priv->tsc_regmap))
0716 return dev_err_probe(dev, PTR_ERR(priv->tsc_regmap),
0717 "failed to get amlogic,hhi-sysctrl regmap\n");
0718
0719 read_len = MESON_SAR_ADC_EFUSE_BYTES;
0720 buf = nvmem_cell_read(temperature_calib, &read_len);
0721 if (IS_ERR(buf))
0722 return dev_err_probe(dev, PTR_ERR(buf), "failed to read temperature_calib cell\n");
0723 if (read_len != MESON_SAR_ADC_EFUSE_BYTES) {
0724 kfree(buf);
0725 return dev_err_probe(dev, -EINVAL, "invalid read size of temperature_calib cell\n");
0726 }
0727
0728 trimming_bits = priv->param->temperature_trimming_bits;
0729 trimming_mask = BIT(trimming_bits) - 1;
0730
0731 priv->temperature_sensor_calibrated =
0732 buf[3] & MESON_SAR_ADC_EFUSE_BYTE3_IS_CALIBRATED;
0733 priv->temperature_sensor_coefficient = buf[2] & trimming_mask;
0734
0735 upper_adc_val = FIELD_GET(MESON_SAR_ADC_EFUSE_BYTE3_UPPER_ADC_VAL,
0736 buf[3]);
0737
0738 priv->temperature_sensor_adc_val = buf[2];
0739 priv->temperature_sensor_adc_val |= upper_adc_val << BITS_PER_BYTE;
0740 priv->temperature_sensor_adc_val >>= trimming_bits;
0741
0742 kfree(buf);
0743
0744 return 0;
0745 }
0746
0747 static int meson_sar_adc_init(struct iio_dev *indio_dev)
0748 {
0749 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0750 struct device *dev = indio_dev->dev.parent;
0751 int regval, i, ret;
0752
0753
0754
0755
0756
0757 meson_sar_adc_set_chan7_mux(indio_dev, CHAN7_MUX_CH7_INPUT);
0758
0759 if (priv->param->has_bl30_integration) {
0760
0761
0762
0763
0764
0765 regmap_read(priv->regmap, MESON_SAR_ADC_REG3, ®val);
0766 if (regval & MESON_SAR_ADC_REG3_BL30_INITIALIZED)
0767 return 0;
0768 }
0769
0770 meson_sar_adc_stop_sample_engine(indio_dev);
0771
0772
0773
0774
0775
0776 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
0777 MESON_SAR_ADC_REG0_ADC_TEMP_SEN_SEL, 0);
0778
0779
0780 regmap_write(priv->regmap, MESON_SAR_ADC_CHAN_LIST, 0x0);
0781
0782 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
0783 MESON_SAR_ADC_REG3_CTRL_SAMPLING_CLOCK_PHASE, 0);
0784 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
0785 MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY,
0786 MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY);
0787
0788
0789 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
0790 MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK,
0791 FIELD_PREP(MESON_SAR_ADC_DELAY_SAMPLE_DLY_CNT_MASK,
0792 10));
0793 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
0794 MESON_SAR_ADC_DELAY_SAMPLE_DLY_SEL_MASK,
0795 FIELD_PREP(MESON_SAR_ADC_DELAY_SAMPLE_DLY_SEL_MASK,
0796 0));
0797
0798
0799 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
0800 MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK,
0801 FIELD_PREP(MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK,
0802 10));
0803 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
0804 MESON_SAR_ADC_DELAY_INPUT_DLY_SEL_MASK,
0805 FIELD_PREP(MESON_SAR_ADC_DELAY_INPUT_DLY_SEL_MASK,
0806 1));
0807
0808
0809
0810
0811
0812 regval = FIELD_PREP(MESON_SAR_ADC_CHAN_10_SW_CHAN0_MUX_SEL_MASK, 0);
0813 regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW,
0814 MESON_SAR_ADC_CHAN_10_SW_CHAN0_MUX_SEL_MASK,
0815 regval);
0816 regval = FIELD_PREP(MESON_SAR_ADC_CHAN_10_SW_CHAN1_MUX_SEL_MASK, 1);
0817 regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW,
0818 MESON_SAR_ADC_CHAN_10_SW_CHAN1_MUX_SEL_MASK,
0819 regval);
0820
0821
0822
0823
0824
0825
0826
0827 regval = 0;
0828 for (i = 2; i <= 7; i++)
0829 regval |= i << MESON_SAR_ADC_AUX_SW_MUX_SEL_CHAN_SHIFT(i);
0830 regval |= MESON_SAR_ADC_AUX_SW_YP_DRIVE_SW;
0831 regval |= MESON_SAR_ADC_AUX_SW_XP_DRIVE_SW;
0832 regmap_write(priv->regmap, MESON_SAR_ADC_AUX_SW, regval);
0833
0834 if (priv->temperature_sensor_calibrated) {
0835 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10,
0836 MESON_SAR_ADC_DELTA_10_TS_REVE1,
0837 MESON_SAR_ADC_DELTA_10_TS_REVE1);
0838 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10,
0839 MESON_SAR_ADC_DELTA_10_TS_REVE0,
0840 MESON_SAR_ADC_DELTA_10_TS_REVE0);
0841
0842
0843
0844
0845
0846 regval = FIELD_PREP(MESON_SAR_ADC_DELTA_10_TS_C_MASK,
0847 priv->temperature_sensor_coefficient);
0848 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10,
0849 MESON_SAR_ADC_DELTA_10_TS_C_MASK, regval);
0850
0851 if (priv->param->temperature_trimming_bits == 5) {
0852 if (priv->temperature_sensor_coefficient & BIT(4))
0853 regval = MESON_HHI_DPLL_TOP_0_TSC_BIT4;
0854 else
0855 regval = 0;
0856
0857
0858
0859
0860
0861 regmap_update_bits(priv->tsc_regmap,
0862 MESON_HHI_DPLL_TOP_0,
0863 MESON_HHI_DPLL_TOP_0_TSC_BIT4,
0864 regval);
0865 }
0866 } else {
0867 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10,
0868 MESON_SAR_ADC_DELTA_10_TS_REVE1, 0);
0869 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10,
0870 MESON_SAR_ADC_DELTA_10_TS_REVE0, 0);
0871 }
0872
0873 ret = clk_set_parent(priv->adc_sel_clk, priv->clkin);
0874 if (ret)
0875 return dev_err_probe(dev, ret, "failed to set adc parent to clkin\n");
0876
0877 ret = clk_set_rate(priv->adc_clk, priv->param->clock_rate);
0878 if (ret)
0879 return dev_err_probe(dev, ret, "failed to set adc clock rate\n");
0880
0881 return 0;
0882 }
0883
0884 static void meson_sar_adc_set_bandgap(struct iio_dev *indio_dev, bool on_off)
0885 {
0886 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0887 const struct meson_sar_adc_param *param = priv->param;
0888 u32 enable_mask;
0889
0890 if (param->bandgap_reg == MESON_SAR_ADC_REG11)
0891 enable_mask = MESON_SAR_ADC_REG11_BANDGAP_EN;
0892 else
0893 enable_mask = MESON_SAR_ADC_DELTA_10_TS_VBG_EN;
0894
0895 regmap_update_bits(priv->regmap, param->bandgap_reg, enable_mask,
0896 on_off ? enable_mask : 0);
0897 }
0898
0899 static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev)
0900 {
0901 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0902 struct device *dev = indio_dev->dev.parent;
0903 int ret;
0904 u32 regval;
0905
0906 ret = meson_sar_adc_lock(indio_dev);
0907 if (ret)
0908 goto err_lock;
0909
0910 ret = regulator_enable(priv->vref);
0911 if (ret < 0) {
0912 dev_err(dev, "failed to enable vref regulator\n");
0913 goto err_vref;
0914 }
0915
0916 ret = clk_prepare_enable(priv->core_clk);
0917 if (ret) {
0918 dev_err(dev, "failed to enable core clk\n");
0919 goto err_core_clk;
0920 }
0921
0922 regval = FIELD_PREP(MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, 1);
0923 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
0924 MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, regval);
0925
0926 meson_sar_adc_set_bandgap(indio_dev, true);
0927
0928 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
0929 MESON_SAR_ADC_REG3_ADC_EN,
0930 MESON_SAR_ADC_REG3_ADC_EN);
0931
0932 udelay(5);
0933
0934 ret = clk_prepare_enable(priv->adc_clk);
0935 if (ret) {
0936 dev_err(dev, "failed to enable adc clk\n");
0937 goto err_adc_clk;
0938 }
0939
0940 meson_sar_adc_unlock(indio_dev);
0941
0942 return 0;
0943
0944 err_adc_clk:
0945 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
0946 MESON_SAR_ADC_REG3_ADC_EN, 0);
0947 meson_sar_adc_set_bandgap(indio_dev, false);
0948 clk_disable_unprepare(priv->core_clk);
0949 err_core_clk:
0950 regulator_disable(priv->vref);
0951 err_vref:
0952 meson_sar_adc_unlock(indio_dev);
0953 err_lock:
0954 return ret;
0955 }
0956
0957 static int meson_sar_adc_hw_disable(struct iio_dev *indio_dev)
0958 {
0959 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0960 int ret;
0961
0962 ret = meson_sar_adc_lock(indio_dev);
0963 if (ret)
0964 return ret;
0965
0966 clk_disable_unprepare(priv->adc_clk);
0967
0968 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
0969 MESON_SAR_ADC_REG3_ADC_EN, 0);
0970
0971 meson_sar_adc_set_bandgap(indio_dev, false);
0972
0973 clk_disable_unprepare(priv->core_clk);
0974
0975 regulator_disable(priv->vref);
0976
0977 meson_sar_adc_unlock(indio_dev);
0978
0979 return 0;
0980 }
0981
0982 static irqreturn_t meson_sar_adc_irq(int irq, void *data)
0983 {
0984 struct iio_dev *indio_dev = data;
0985 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
0986 unsigned int cnt, threshold;
0987 u32 regval;
0988
0989 regmap_read(priv->regmap, MESON_SAR_ADC_REG0, ®val);
0990 cnt = FIELD_GET(MESON_SAR_ADC_REG0_FIFO_COUNT_MASK, regval);
0991 threshold = FIELD_GET(MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, regval);
0992
0993 if (cnt < threshold)
0994 return IRQ_NONE;
0995
0996 complete(&priv->done);
0997
0998 return IRQ_HANDLED;
0999 }
1000
1001 static int meson_sar_adc_calib(struct iio_dev *indio_dev)
1002 {
1003 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
1004 int ret, nominal0, nominal1, value0, value1;
1005
1006
1007 nominal0 = (1 << priv->param->resolution) / 4;
1008 nominal1 = (1 << priv->param->resolution) * 3 / 4;
1009
1010 meson_sar_adc_set_chan7_mux(indio_dev, CHAN7_MUX_VDD_DIV4);
1011 usleep_range(10, 20);
1012 ret = meson_sar_adc_get_sample(indio_dev,
1013 &indio_dev->channels[7],
1014 MEAN_AVERAGING, EIGHT_SAMPLES, &value0);
1015 if (ret < 0)
1016 goto out;
1017
1018 meson_sar_adc_set_chan7_mux(indio_dev, CHAN7_MUX_VDD_MUL3_DIV4);
1019 usleep_range(10, 20);
1020 ret = meson_sar_adc_get_sample(indio_dev,
1021 &indio_dev->channels[7],
1022 MEAN_AVERAGING, EIGHT_SAMPLES, &value1);
1023 if (ret < 0)
1024 goto out;
1025
1026 if (value1 <= value0) {
1027 ret = -EINVAL;
1028 goto out;
1029 }
1030
1031 priv->calibscale = div_s64((nominal1 - nominal0) * (s64)MILLION,
1032 value1 - value0);
1033 priv->calibbias = nominal0 - div_s64((s64)value0 * priv->calibscale,
1034 MILLION);
1035 ret = 0;
1036 out:
1037 meson_sar_adc_set_chan7_mux(indio_dev, CHAN7_MUX_CH7_INPUT);
1038
1039 return ret;
1040 }
1041
1042 static const struct iio_info meson_sar_adc_iio_info = {
1043 .read_raw = meson_sar_adc_iio_info_read_raw,
1044 };
1045
1046 static const struct meson_sar_adc_param meson_sar_adc_meson8_param = {
1047 .has_bl30_integration = false,
1048 .clock_rate = 1150000,
1049 .bandgap_reg = MESON_SAR_ADC_DELTA_10,
1050 .regmap_config = &meson_sar_adc_regmap_config_meson8,
1051 .resolution = 10,
1052 .temperature_trimming_bits = 4,
1053 .temperature_multiplier = 18 * 10000,
1054 .temperature_divider = 1024 * 10 * 85,
1055 };
1056
1057 static const struct meson_sar_adc_param meson_sar_adc_meson8b_param = {
1058 .has_bl30_integration = false,
1059 .clock_rate = 1150000,
1060 .bandgap_reg = MESON_SAR_ADC_DELTA_10,
1061 .regmap_config = &meson_sar_adc_regmap_config_meson8,
1062 .resolution = 10,
1063 .temperature_trimming_bits = 5,
1064 .temperature_multiplier = 10,
1065 .temperature_divider = 32,
1066 };
1067
1068 static const struct meson_sar_adc_param meson_sar_adc_gxbb_param = {
1069 .has_bl30_integration = true,
1070 .clock_rate = 1200000,
1071 .bandgap_reg = MESON_SAR_ADC_REG11,
1072 .regmap_config = &meson_sar_adc_regmap_config_gxbb,
1073 .resolution = 10,
1074 };
1075
1076 static const struct meson_sar_adc_param meson_sar_adc_gxl_param = {
1077 .has_bl30_integration = true,
1078 .clock_rate = 1200000,
1079 .bandgap_reg = MESON_SAR_ADC_REG11,
1080 .regmap_config = &meson_sar_adc_regmap_config_gxbb,
1081 .resolution = 12,
1082 };
1083
1084 static const struct meson_sar_adc_param meson_sar_adc_g12a_param = {
1085 .has_bl30_integration = false,
1086 .clock_rate = 1200000,
1087 .bandgap_reg = MESON_SAR_ADC_REG11,
1088 .regmap_config = &meson_sar_adc_regmap_config_gxbb,
1089 .resolution = 12,
1090 };
1091
1092 static const struct meson_sar_adc_data meson_sar_adc_meson8_data = {
1093 .param = &meson_sar_adc_meson8_param,
1094 .name = "meson-meson8-saradc",
1095 };
1096
1097 static const struct meson_sar_adc_data meson_sar_adc_meson8b_data = {
1098 .param = &meson_sar_adc_meson8b_param,
1099 .name = "meson-meson8b-saradc",
1100 };
1101
1102 static const struct meson_sar_adc_data meson_sar_adc_meson8m2_data = {
1103 .param = &meson_sar_adc_meson8b_param,
1104 .name = "meson-meson8m2-saradc",
1105 };
1106
1107 static const struct meson_sar_adc_data meson_sar_adc_gxbb_data = {
1108 .param = &meson_sar_adc_gxbb_param,
1109 .name = "meson-gxbb-saradc",
1110 };
1111
1112 static const struct meson_sar_adc_data meson_sar_adc_gxl_data = {
1113 .param = &meson_sar_adc_gxl_param,
1114 .name = "meson-gxl-saradc",
1115 };
1116
1117 static const struct meson_sar_adc_data meson_sar_adc_gxm_data = {
1118 .param = &meson_sar_adc_gxl_param,
1119 .name = "meson-gxm-saradc",
1120 };
1121
1122 static const struct meson_sar_adc_data meson_sar_adc_axg_data = {
1123 .param = &meson_sar_adc_gxl_param,
1124 .name = "meson-axg-saradc",
1125 };
1126
1127 static const struct meson_sar_adc_data meson_sar_adc_g12a_data = {
1128 .param = &meson_sar_adc_g12a_param,
1129 .name = "meson-g12a-saradc",
1130 };
1131
1132 static const struct of_device_id meson_sar_adc_of_match[] = {
1133 {
1134 .compatible = "amlogic,meson8-saradc",
1135 .data = &meson_sar_adc_meson8_data,
1136 }, {
1137 .compatible = "amlogic,meson8b-saradc",
1138 .data = &meson_sar_adc_meson8b_data,
1139 }, {
1140 .compatible = "amlogic,meson8m2-saradc",
1141 .data = &meson_sar_adc_meson8m2_data,
1142 }, {
1143 .compatible = "amlogic,meson-gxbb-saradc",
1144 .data = &meson_sar_adc_gxbb_data,
1145 }, {
1146 .compatible = "amlogic,meson-gxl-saradc",
1147 .data = &meson_sar_adc_gxl_data,
1148 }, {
1149 .compatible = "amlogic,meson-gxm-saradc",
1150 .data = &meson_sar_adc_gxm_data,
1151 }, {
1152 .compatible = "amlogic,meson-axg-saradc",
1153 .data = &meson_sar_adc_axg_data,
1154 }, {
1155 .compatible = "amlogic,meson-g12a-saradc",
1156 .data = &meson_sar_adc_g12a_data,
1157 },
1158 { }
1159 };
1160 MODULE_DEVICE_TABLE(of, meson_sar_adc_of_match);
1161
1162 static int meson_sar_adc_probe(struct platform_device *pdev)
1163 {
1164 const struct meson_sar_adc_data *match_data;
1165 struct meson_sar_adc_priv *priv;
1166 struct device *dev = &pdev->dev;
1167 struct iio_dev *indio_dev;
1168 void __iomem *base;
1169 int irq, ret;
1170
1171 indio_dev = devm_iio_device_alloc(dev, sizeof(*priv));
1172 if (!indio_dev)
1173 return dev_err_probe(dev, -ENOMEM, "failed allocating iio device\n");
1174
1175 priv = iio_priv(indio_dev);
1176 init_completion(&priv->done);
1177
1178 match_data = of_device_get_match_data(dev);
1179 if (!match_data)
1180 return dev_err_probe(dev, -ENODEV, "failed to get match data\n");
1181
1182 priv->param = match_data->param;
1183
1184 indio_dev->name = match_data->name;
1185 indio_dev->modes = INDIO_DIRECT_MODE;
1186 indio_dev->info = &meson_sar_adc_iio_info;
1187
1188 base = devm_platform_ioremap_resource(pdev, 0);
1189 if (IS_ERR(base))
1190 return PTR_ERR(base);
1191
1192 priv->regmap = devm_regmap_init_mmio(dev, base, priv->param->regmap_config);
1193 if (IS_ERR(priv->regmap))
1194 return PTR_ERR(priv->regmap);
1195
1196 irq = irq_of_parse_and_map(dev->of_node, 0);
1197 if (!irq)
1198 return -EINVAL;
1199
1200 ret = devm_request_irq(dev, irq, meson_sar_adc_irq, IRQF_SHARED, dev_name(dev), indio_dev);
1201 if (ret)
1202 return ret;
1203
1204 priv->clkin = devm_clk_get(dev, "clkin");
1205 if (IS_ERR(priv->clkin))
1206 return dev_err_probe(dev, PTR_ERR(priv->clkin), "failed to get clkin\n");
1207
1208 priv->core_clk = devm_clk_get(dev, "core");
1209 if (IS_ERR(priv->core_clk))
1210 return dev_err_probe(dev, PTR_ERR(priv->core_clk), "failed to get core clk\n");
1211
1212 priv->adc_clk = devm_clk_get_optional(dev, "adc_clk");
1213 if (IS_ERR(priv->adc_clk))
1214 return dev_err_probe(dev, PTR_ERR(priv->adc_clk), "failed to get adc clk\n");
1215
1216 priv->adc_sel_clk = devm_clk_get_optional(dev, "adc_sel");
1217 if (IS_ERR(priv->adc_sel_clk))
1218 return dev_err_probe(dev, PTR_ERR(priv->adc_sel_clk), "failed to get adc_sel clk\n");
1219
1220
1221 if (!priv->adc_clk) {
1222 ret = meson_sar_adc_clk_init(indio_dev, base);
1223 if (ret)
1224 return ret;
1225 }
1226
1227 priv->vref = devm_regulator_get(dev, "vref");
1228 if (IS_ERR(priv->vref))
1229 return dev_err_probe(dev, PTR_ERR(priv->vref), "failed to get vref regulator\n");
1230
1231 priv->calibscale = MILLION;
1232
1233 if (priv->param->temperature_trimming_bits) {
1234 ret = meson_sar_adc_temp_sensor_init(indio_dev);
1235 if (ret)
1236 return ret;
1237 }
1238
1239 if (priv->temperature_sensor_calibrated) {
1240 indio_dev->channels = meson_sar_adc_and_temp_iio_channels;
1241 indio_dev->num_channels =
1242 ARRAY_SIZE(meson_sar_adc_and_temp_iio_channels);
1243 } else {
1244 indio_dev->channels = meson_sar_adc_iio_channels;
1245 indio_dev->num_channels =
1246 ARRAY_SIZE(meson_sar_adc_iio_channels);
1247 }
1248
1249 ret = meson_sar_adc_init(indio_dev);
1250 if (ret)
1251 goto err;
1252
1253 ret = meson_sar_adc_hw_enable(indio_dev);
1254 if (ret)
1255 goto err;
1256
1257 ret = meson_sar_adc_calib(indio_dev);
1258 if (ret)
1259 dev_warn(dev, "calibration failed\n");
1260
1261 platform_set_drvdata(pdev, indio_dev);
1262
1263 ret = iio_device_register(indio_dev);
1264 if (ret)
1265 goto err_hw;
1266
1267 return 0;
1268
1269 err_hw:
1270 meson_sar_adc_hw_disable(indio_dev);
1271 err:
1272 return ret;
1273 }
1274
1275 static int meson_sar_adc_remove(struct platform_device *pdev)
1276 {
1277 struct iio_dev *indio_dev = platform_get_drvdata(pdev);
1278
1279 iio_device_unregister(indio_dev);
1280
1281 return meson_sar_adc_hw_disable(indio_dev);
1282 }
1283
1284 static int meson_sar_adc_suspend(struct device *dev)
1285 {
1286 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1287
1288 return meson_sar_adc_hw_disable(indio_dev);
1289 }
1290
1291 static int meson_sar_adc_resume(struct device *dev)
1292 {
1293 struct iio_dev *indio_dev = dev_get_drvdata(dev);
1294
1295 return meson_sar_adc_hw_enable(indio_dev);
1296 }
1297
1298 static DEFINE_SIMPLE_DEV_PM_OPS(meson_sar_adc_pm_ops,
1299 meson_sar_adc_suspend, meson_sar_adc_resume);
1300
1301 static struct platform_driver meson_sar_adc_driver = {
1302 .probe = meson_sar_adc_probe,
1303 .remove = meson_sar_adc_remove,
1304 .driver = {
1305 .name = "meson-saradc",
1306 .of_match_table = meson_sar_adc_of_match,
1307 .pm = pm_sleep_ptr(&meson_sar_adc_pm_ops),
1308 },
1309 };
1310
1311 module_platform_driver(meson_sar_adc_driver);
1312
1313 MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
1314 MODULE_DESCRIPTION("Amlogic Meson SAR ADC driver");
1315 MODULE_LICENSE("GPL v2");