Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Amlogic Meson Successive Approximation Register (SAR) A/D Converter
0004  *
0005  * Copyright (C) 2017 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
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  * NOTE: registers from here are undocumented (the vendor Linux kernel driver
0153  * and u-boot source served as reference). These only seem to be relevant on
0154  * GXBB and newer.
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 /* ms */
0164 #define MESON_SAR_ADC_VOLTAGE_AND_TEMP_CHANNEL          6
0165 #define MESON_SAR_ADC_TEMP_OFFSET               27
0166 
0167 /* temperature sensor calibration information in eFuse */
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 /* for use with IIO_VAL_INT_PLUS_MICRO */
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, &regval);
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     /* use val_calib = scale * val_raw + offset calibration function */
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      * NOTE: we need a small delay before reading the status, otherwise
0329      * the sample engine may not have started internally (which would
0330      * seem to us that sampling is already finished).
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, &regval);
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      * the SAR ADC engine allows sampling multiple channels at the same
0397      * time. to keep it simple we're only working with one *internal*
0398      * channel, which starts counting at index 0 (which means: count = 1).
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     /* map channel index 0 to the channel which we want to read */
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     /* wait until all modules are stopped */
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         /* prevent BL30 from using the SAR ADC while we are using it */
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          * wait until BL30 releases it's lock (so we can use the SAR
0501          * ADC)
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         /* allow BL30 to use the SAR ADC again */
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     /* clear the FIFO to make sure we're not reading old values */
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             /* SoC specific multiplier and divider */
0610             *val = priv->param->temperature_multiplier;
0611             *val2 = priv->param->temperature_divider;
0612 
0613             /* celsius to millicelsius */
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          * leave the temperature sensor disabled if no calibration data
0706          * was passed via nvmem-cells.
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      * make sure we start at CH7 input since the other muxes are only used
0755      * for internal calibration.
0756      */
0757     meson_sar_adc_set_chan7_mux(indio_dev, CHAN7_MUX_CH7_INPUT);
0758 
0759     if (priv->param->has_bl30_integration) {
0760         /*
0761          * leave sampling delay and the input clocks as configured by
0762          * BL30 to make sure BL30 gets the values it expects when
0763          * reading the temperature sensor.
0764          */
0765         regmap_read(priv->regmap, MESON_SAR_ADC_REG3, &regval);
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      * disable this bit as seems to be only relevant for Meson6 (based
0774      * on the vendor driver), which we don't support at the moment.
0775      */
0776     regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
0777                MESON_SAR_ADC_REG0_ADC_TEMP_SEN_SEL, 0);
0778 
0779     /* disable all channels by default */
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     /* delay between two samples = (10+1) * 1uS */
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     /* delay between two samples = (10+1) * 1uS */
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      * set up the input channel muxes in MESON_SAR_ADC_CHAN_10_SW
0810      * (0 = SAR_ADC_CH0, 1 = SAR_ADC_CH1)
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      * set up the input channel muxes in MESON_SAR_ADC_AUX_SW
0823      * (2 = SAR_ADC_CH2, 3 = SAR_ADC_CH3, ...) and enable
0824      * MESON_SAR_ADC_AUX_SW_YP_DRIVE_SW and
0825      * MESON_SAR_ADC_AUX_SW_XP_DRIVE_SW like the vendor driver.
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          * set bits [3:0] of the TSC (temperature sensor coefficient)
0844          * to get the correct values when reading the temperature.
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              * bit [4] (the 5th bit when starting to count at 1)
0859              * of the TSC is located in the HHI register area.
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, &regval);
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     /* use points 25% and 75% for calibration */
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     { /* sentinel */ }
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     /* on pre-GXBB SoCs the SAR ADC itself provides the ADC clock: */
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");