Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * ADC driver for the Ingenic JZ47xx SoCs
0004  * Copyright (c) 2019 Artur Rojek <contact@artur-rojek.eu>
0005  *
0006  * based on drivers/mfd/jz4740-adc.c
0007  */
0008 
0009 #include <dt-bindings/iio/adc/ingenic,adc.h>
0010 #include <linux/clk.h>
0011 #include <linux/iio/buffer.h>
0012 #include <linux/iio/iio.h>
0013 #include <linux/interrupt.h>
0014 #include <linux/io.h>
0015 #include <linux/iopoll.h>
0016 #include <linux/kernel.h>
0017 #include <linux/module.h>
0018 #include <linux/mod_devicetable.h>
0019 #include <linux/mutex.h>
0020 #include <linux/of.h>
0021 #include <linux/platform_device.h>
0022 #include <linux/property.h>
0023 
0024 #define JZ_ADC_REG_ENABLE       0x00
0025 #define JZ_ADC_REG_CFG          0x04
0026 #define JZ_ADC_REG_CTRL         0x08
0027 #define JZ_ADC_REG_STATUS       0x0c
0028 #define JZ_ADC_REG_ADSAME       0x10
0029 #define JZ_ADC_REG_ADWAIT       0x14
0030 #define JZ_ADC_REG_ADTCH        0x18
0031 #define JZ_ADC_REG_ADBDAT       0x1c
0032 #define JZ_ADC_REG_ADSDAT       0x20
0033 #define JZ_ADC_REG_ADCMD        0x24
0034 #define JZ_ADC_REG_ADCLK        0x28
0035 
0036 #define JZ_ADC_REG_ENABLE_PD        BIT(7)
0037 #define JZ_ADC_REG_CFG_AUX_MD       (BIT(0) | BIT(1))
0038 #define JZ_ADC_REG_CFG_BAT_MD       BIT(4)
0039 #define JZ_ADC_REG_CFG_SAMPLE_NUM(n)    ((n) << 10)
0040 #define JZ_ADC_REG_CFG_PULL_UP(n)   ((n) << 16)
0041 #define JZ_ADC_REG_CFG_CMD_SEL      BIT(22)
0042 #define JZ_ADC_REG_CFG_VBAT_SEL     BIT(30)
0043 #define JZ_ADC_REG_CFG_TOUCH_OPS_MASK   (BIT(31) | GENMASK(23, 10))
0044 #define JZ_ADC_REG_ADCLK_CLKDIV_LSB 0
0045 #define JZ4725B_ADC_REG_ADCLK_CLKDIV10US_LSB    16
0046 #define JZ4770_ADC_REG_ADCLK_CLKDIV10US_LSB 8
0047 #define JZ4770_ADC_REG_ADCLK_CLKDIVMS_LSB   16
0048 
0049 #define JZ_ADC_REG_ADCMD_YNADC      BIT(7)
0050 #define JZ_ADC_REG_ADCMD_YPADC      BIT(8)
0051 #define JZ_ADC_REG_ADCMD_XNADC      BIT(9)
0052 #define JZ_ADC_REG_ADCMD_XPADC      BIT(10)
0053 #define JZ_ADC_REG_ADCMD_VREFPYP    BIT(11)
0054 #define JZ_ADC_REG_ADCMD_VREFPXP    BIT(12)
0055 #define JZ_ADC_REG_ADCMD_VREFPXN    BIT(13)
0056 #define JZ_ADC_REG_ADCMD_VREFPAUX   BIT(14)
0057 #define JZ_ADC_REG_ADCMD_VREFPVDD33 BIT(15)
0058 #define JZ_ADC_REG_ADCMD_VREFNYN    BIT(16)
0059 #define JZ_ADC_REG_ADCMD_VREFNXP    BIT(17)
0060 #define JZ_ADC_REG_ADCMD_VREFNXN    BIT(18)
0061 #define JZ_ADC_REG_ADCMD_VREFAUX    BIT(19)
0062 #define JZ_ADC_REG_ADCMD_YNGRU      BIT(20)
0063 #define JZ_ADC_REG_ADCMD_XNGRU      BIT(21)
0064 #define JZ_ADC_REG_ADCMD_XPGRU      BIT(22)
0065 #define JZ_ADC_REG_ADCMD_YPSUP      BIT(23)
0066 #define JZ_ADC_REG_ADCMD_XNSUP      BIT(24)
0067 #define JZ_ADC_REG_ADCMD_XPSUP      BIT(25)
0068 
0069 #define JZ_ADC_AUX_VREF             3300
0070 #define JZ_ADC_AUX_VREF_BITS            12
0071 #define JZ_ADC_BATTERY_LOW_VREF         2500
0072 #define JZ_ADC_BATTERY_LOW_VREF_BITS        12
0073 #define JZ4725B_ADC_BATTERY_HIGH_VREF       7500
0074 #define JZ4725B_ADC_BATTERY_HIGH_VREF_BITS  10
0075 #define JZ4740_ADC_BATTERY_HIGH_VREF        (7500 * 0.986)
0076 #define JZ4740_ADC_BATTERY_HIGH_VREF_BITS   12
0077 #define JZ4760_ADC_BATTERY_VREF         2500
0078 #define JZ4770_ADC_BATTERY_VREF         1200
0079 #define JZ4770_ADC_BATTERY_VREF_BITS        12
0080 
0081 #define JZ_ADC_IRQ_AUX          BIT(0)
0082 #define JZ_ADC_IRQ_BATTERY      BIT(1)
0083 #define JZ_ADC_IRQ_TOUCH        BIT(2)
0084 #define JZ_ADC_IRQ_PEN_DOWN     BIT(3)
0085 #define JZ_ADC_IRQ_PEN_UP       BIT(4)
0086 #define JZ_ADC_IRQ_PEN_DOWN_SLEEP   BIT(5)
0087 #define JZ_ADC_IRQ_SLEEP        BIT(7)
0088 
0089 struct ingenic_adc;
0090 
0091 struct ingenic_adc_soc_data {
0092     unsigned int battery_high_vref;
0093     unsigned int battery_high_vref_bits;
0094     const int *battery_raw_avail;
0095     size_t battery_raw_avail_size;
0096     const int *battery_scale_avail;
0097     size_t battery_scale_avail_size;
0098     unsigned int battery_vref_mode: 1;
0099     unsigned int has_aux_md: 1;
0100     const struct iio_chan_spec *channels;
0101     unsigned int num_channels;
0102     int (*init_clk_div)(struct device *dev, struct ingenic_adc *adc);
0103 };
0104 
0105 struct ingenic_adc {
0106     void __iomem *base;
0107     struct clk *clk;
0108     struct mutex lock;
0109     struct mutex aux_lock;
0110     const struct ingenic_adc_soc_data *soc_data;
0111     bool low_vref_mode;
0112 };
0113 
0114 static void ingenic_adc_set_adcmd(struct iio_dev *iio_dev, unsigned long mask)
0115 {
0116     struct ingenic_adc *adc = iio_priv(iio_dev);
0117 
0118     mutex_lock(&adc->lock);
0119 
0120     /* Init ADCMD */
0121     readl(adc->base + JZ_ADC_REG_ADCMD);
0122 
0123     if (mask & 0x3) {
0124         /* Second channel (INGENIC_ADC_TOUCH_YP): sample YP vs. GND */
0125         writel(JZ_ADC_REG_ADCMD_XNGRU
0126                | JZ_ADC_REG_ADCMD_VREFNXN | JZ_ADC_REG_ADCMD_VREFPVDD33
0127                | JZ_ADC_REG_ADCMD_YPADC,
0128                adc->base + JZ_ADC_REG_ADCMD);
0129 
0130         /* First channel (INGENIC_ADC_TOUCH_XP): sample XP vs. GND */
0131         writel(JZ_ADC_REG_ADCMD_YNGRU
0132                | JZ_ADC_REG_ADCMD_VREFNYN | JZ_ADC_REG_ADCMD_VREFPVDD33
0133                | JZ_ADC_REG_ADCMD_XPADC,
0134                adc->base + JZ_ADC_REG_ADCMD);
0135     }
0136 
0137     if (mask & 0xc) {
0138         /* Fourth channel (INGENIC_ADC_TOUCH_YN): sample YN vs. GND */
0139         writel(JZ_ADC_REG_ADCMD_XNGRU
0140                | JZ_ADC_REG_ADCMD_VREFNXN | JZ_ADC_REG_ADCMD_VREFPVDD33
0141                | JZ_ADC_REG_ADCMD_YNADC,
0142                adc->base + JZ_ADC_REG_ADCMD);
0143 
0144         /* Third channel (INGENIC_ADC_TOUCH_XN): sample XN vs. GND */
0145         writel(JZ_ADC_REG_ADCMD_YNGRU
0146                | JZ_ADC_REG_ADCMD_VREFNYN | JZ_ADC_REG_ADCMD_VREFPVDD33
0147                | JZ_ADC_REG_ADCMD_XNADC,
0148                adc->base + JZ_ADC_REG_ADCMD);
0149     }
0150 
0151     if (mask & 0x30) {
0152         /* Sixth channel (INGENIC_ADC_TOUCH_YD): sample YP vs. YN */
0153         writel(JZ_ADC_REG_ADCMD_VREFNYN | JZ_ADC_REG_ADCMD_VREFPVDD33
0154                | JZ_ADC_REG_ADCMD_YPADC,
0155                adc->base + JZ_ADC_REG_ADCMD);
0156 
0157         /* Fifth channel (INGENIC_ADC_TOUCH_XD): sample XP vs. XN */
0158         writel(JZ_ADC_REG_ADCMD_VREFNXN | JZ_ADC_REG_ADCMD_VREFPVDD33
0159                | JZ_ADC_REG_ADCMD_XPADC,
0160                adc->base + JZ_ADC_REG_ADCMD);
0161     }
0162 
0163     /* We're done */
0164     writel(0, adc->base + JZ_ADC_REG_ADCMD);
0165 
0166     mutex_unlock(&adc->lock);
0167 }
0168 
0169 static void ingenic_adc_set_config(struct ingenic_adc *adc,
0170                    uint32_t mask,
0171                    uint32_t val)
0172 {
0173     uint32_t cfg;
0174 
0175     mutex_lock(&adc->lock);
0176 
0177     cfg = readl(adc->base + JZ_ADC_REG_CFG) & ~mask;
0178     cfg |= val;
0179     writel(cfg, adc->base + JZ_ADC_REG_CFG);
0180 
0181     mutex_unlock(&adc->lock);
0182 }
0183 
0184 static void ingenic_adc_enable_unlocked(struct ingenic_adc *adc,
0185                     int engine,
0186                     bool enabled)
0187 {
0188     u8 val;
0189 
0190     val = readb(adc->base + JZ_ADC_REG_ENABLE);
0191 
0192     if (enabled)
0193         val |= BIT(engine);
0194     else
0195         val &= ~BIT(engine);
0196 
0197     writeb(val, adc->base + JZ_ADC_REG_ENABLE);
0198 }
0199 
0200 static void ingenic_adc_enable(struct ingenic_adc *adc,
0201                    int engine,
0202                    bool enabled)
0203 {
0204     mutex_lock(&adc->lock);
0205     ingenic_adc_enable_unlocked(adc, engine, enabled);
0206     mutex_unlock(&adc->lock);
0207 }
0208 
0209 static int ingenic_adc_capture(struct ingenic_adc *adc,
0210                    int engine)
0211 {
0212     u32 cfg;
0213     u8 val;
0214     int ret;
0215 
0216     /*
0217      * Disable CMD_SEL temporarily, because it causes wrong VBAT readings,
0218      * probably due to the switch of VREF. We must keep the lock here to
0219      * avoid races with the buffer enable/disable functions.
0220      */
0221     mutex_lock(&adc->lock);
0222     cfg = readl(adc->base + JZ_ADC_REG_CFG);
0223     writel(cfg & ~JZ_ADC_REG_CFG_CMD_SEL, adc->base + JZ_ADC_REG_CFG);
0224 
0225     ingenic_adc_enable_unlocked(adc, engine, true);
0226     ret = readb_poll_timeout(adc->base + JZ_ADC_REG_ENABLE, val,
0227                  !(val & BIT(engine)), 250, 1000);
0228     if (ret)
0229         ingenic_adc_enable_unlocked(adc, engine, false);
0230 
0231     writel(cfg, adc->base + JZ_ADC_REG_CFG);
0232     mutex_unlock(&adc->lock);
0233 
0234     return ret;
0235 }
0236 
0237 static int ingenic_adc_write_raw(struct iio_dev *iio_dev,
0238                  struct iio_chan_spec const *chan,
0239                  int val,
0240                  int val2,
0241                  long m)
0242 {
0243     struct ingenic_adc *adc = iio_priv(iio_dev);
0244     struct device *dev = iio_dev->dev.parent;
0245     int ret;
0246 
0247     switch (m) {
0248     case IIO_CHAN_INFO_SCALE:
0249         switch (chan->channel) {
0250         case INGENIC_ADC_BATTERY:
0251             if (!adc->soc_data->battery_vref_mode)
0252                 return -EINVAL;
0253 
0254             ret = clk_enable(adc->clk);
0255             if (ret) {
0256                 dev_err(dev, "Failed to enable clock: %d\n",
0257                     ret);
0258                 return ret;
0259             }
0260 
0261             if (val > JZ_ADC_BATTERY_LOW_VREF) {
0262                 ingenic_adc_set_config(adc,
0263                                JZ_ADC_REG_CFG_BAT_MD,
0264                                0);
0265                 adc->low_vref_mode = false;
0266             } else {
0267                 ingenic_adc_set_config(adc,
0268                                JZ_ADC_REG_CFG_BAT_MD,
0269                                JZ_ADC_REG_CFG_BAT_MD);
0270                 adc->low_vref_mode = true;
0271             }
0272 
0273             clk_disable(adc->clk);
0274 
0275             return 0;
0276         default:
0277             return -EINVAL;
0278         }
0279     default:
0280         return -EINVAL;
0281     }
0282 }
0283 
0284 static const int jz4725b_adc_battery_raw_avail[] = {
0285     0, 1, (1 << JZ_ADC_BATTERY_LOW_VREF_BITS) - 1,
0286 };
0287 
0288 static const int jz4725b_adc_battery_scale_avail[] = {
0289     JZ4725B_ADC_BATTERY_HIGH_VREF, JZ4725B_ADC_BATTERY_HIGH_VREF_BITS,
0290     JZ_ADC_BATTERY_LOW_VREF, JZ_ADC_BATTERY_LOW_VREF_BITS,
0291 };
0292 
0293 static const int jz4740_adc_battery_raw_avail[] = {
0294     0, 1, (1 << JZ_ADC_BATTERY_LOW_VREF_BITS) - 1,
0295 };
0296 
0297 static const int jz4740_adc_battery_scale_avail[] = {
0298     JZ4740_ADC_BATTERY_HIGH_VREF, JZ4740_ADC_BATTERY_HIGH_VREF_BITS,
0299     JZ_ADC_BATTERY_LOW_VREF, JZ_ADC_BATTERY_LOW_VREF_BITS,
0300 };
0301 
0302 static const int jz4760_adc_battery_scale_avail[] = {
0303     JZ4760_ADC_BATTERY_VREF, JZ4770_ADC_BATTERY_VREF_BITS,
0304 };
0305 
0306 static const int jz4770_adc_battery_raw_avail[] = {
0307     0, 1, (1 << JZ4770_ADC_BATTERY_VREF_BITS) - 1,
0308 };
0309 
0310 static const int jz4770_adc_battery_scale_avail[] = {
0311     JZ4770_ADC_BATTERY_VREF, JZ4770_ADC_BATTERY_VREF_BITS,
0312 };
0313 
0314 static int jz4725b_adc_init_clk_div(struct device *dev, struct ingenic_adc *adc)
0315 {
0316     struct clk *parent_clk;
0317     unsigned long parent_rate, rate;
0318     unsigned int div_main, div_10us;
0319 
0320     parent_clk = clk_get_parent(adc->clk);
0321     if (!parent_clk) {
0322         dev_err(dev, "ADC clock has no parent\n");
0323         return -ENODEV;
0324     }
0325     parent_rate = clk_get_rate(parent_clk);
0326 
0327     /*
0328      * The JZ4725B ADC works at 500 kHz to 8 MHz.
0329      * We pick the highest rate possible.
0330      * In practice we typically get 6 MHz, half of the 12 MHz EXT clock.
0331      */
0332     div_main = DIV_ROUND_UP(parent_rate, 8000000);
0333     div_main = clamp(div_main, 1u, 64u);
0334     rate = parent_rate / div_main;
0335     if (rate < 500000 || rate > 8000000) {
0336         dev_err(dev, "No valid divider for ADC main clock\n");
0337         return -EINVAL;
0338     }
0339 
0340     /* We also need a divider that produces a 10us clock. */
0341     div_10us = DIV_ROUND_UP(rate, 100000);
0342 
0343     writel(((div_10us - 1) << JZ4725B_ADC_REG_ADCLK_CLKDIV10US_LSB) |
0344            (div_main - 1) << JZ_ADC_REG_ADCLK_CLKDIV_LSB,
0345            adc->base + JZ_ADC_REG_ADCLK);
0346 
0347     return 0;
0348 }
0349 
0350 static int jz4770_adc_init_clk_div(struct device *dev, struct ingenic_adc *adc)
0351 {
0352     struct clk *parent_clk;
0353     unsigned long parent_rate, rate;
0354     unsigned int div_main, div_ms, div_10us;
0355 
0356     parent_clk = clk_get_parent(adc->clk);
0357     if (!parent_clk) {
0358         dev_err(dev, "ADC clock has no parent\n");
0359         return -ENODEV;
0360     }
0361     parent_rate = clk_get_rate(parent_clk);
0362 
0363     /*
0364      * The JZ4770 ADC works at 20 kHz to 200 kHz.
0365      * We pick the highest rate possible.
0366      */
0367     div_main = DIV_ROUND_UP(parent_rate, 200000);
0368     div_main = clamp(div_main, 1u, 256u);
0369     rate = parent_rate / div_main;
0370     if (rate < 20000 || rate > 200000) {
0371         dev_err(dev, "No valid divider for ADC main clock\n");
0372         return -EINVAL;
0373     }
0374 
0375     /* We also need a divider that produces a 10us clock. */
0376     div_10us = DIV_ROUND_UP(rate, 10000);
0377     /* And another, which produces a 1ms clock. */
0378     div_ms = DIV_ROUND_UP(rate, 1000);
0379 
0380     writel(((div_ms - 1) << JZ4770_ADC_REG_ADCLK_CLKDIVMS_LSB) |
0381            ((div_10us - 1) << JZ4770_ADC_REG_ADCLK_CLKDIV10US_LSB) |
0382            (div_main - 1) << JZ_ADC_REG_ADCLK_CLKDIV_LSB,
0383            adc->base + JZ_ADC_REG_ADCLK);
0384 
0385     return 0;
0386 }
0387 
0388 static const struct iio_chan_spec jz4740_channels[] = {
0389     {
0390         .extend_name = "aux",
0391         .type = IIO_VOLTAGE,
0392         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0393                       BIT(IIO_CHAN_INFO_SCALE),
0394         .indexed = 1,
0395         .channel = INGENIC_ADC_AUX,
0396         .scan_index = -1,
0397     },
0398     {
0399         .extend_name = "battery",
0400         .type = IIO_VOLTAGE,
0401         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0402                       BIT(IIO_CHAN_INFO_SCALE),
0403         .info_mask_separate_available = BIT(IIO_CHAN_INFO_RAW) |
0404                         BIT(IIO_CHAN_INFO_SCALE),
0405         .indexed = 1,
0406         .channel = INGENIC_ADC_BATTERY,
0407         .scan_index = -1,
0408     },
0409 };
0410 
0411 static const struct iio_chan_spec jz4760_channels[] = {
0412     {
0413         .extend_name = "aux",
0414         .type = IIO_VOLTAGE,
0415         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0416                       BIT(IIO_CHAN_INFO_SCALE),
0417         .indexed = 1,
0418         .channel = INGENIC_ADC_AUX0,
0419         .scan_index = -1,
0420     },
0421     {
0422         .extend_name = "aux1",
0423         .type = IIO_VOLTAGE,
0424         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0425                       BIT(IIO_CHAN_INFO_SCALE),
0426         .indexed = 1,
0427         .channel = INGENIC_ADC_AUX,
0428         .scan_index = -1,
0429     },
0430     {
0431         .extend_name = "aux2",
0432         .type = IIO_VOLTAGE,
0433         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0434                       BIT(IIO_CHAN_INFO_SCALE),
0435         .indexed = 1,
0436         .channel = INGENIC_ADC_AUX2,
0437         .scan_index = -1,
0438     },
0439     {
0440         .extend_name = "battery",
0441         .type = IIO_VOLTAGE,
0442         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0443                       BIT(IIO_CHAN_INFO_SCALE),
0444         .info_mask_separate_available = BIT(IIO_CHAN_INFO_RAW) |
0445                         BIT(IIO_CHAN_INFO_SCALE),
0446         .indexed = 1,
0447         .channel = INGENIC_ADC_BATTERY,
0448         .scan_index = -1,
0449     },
0450 };
0451 
0452 static const struct iio_chan_spec jz4770_channels[] = {
0453     {
0454         .type = IIO_VOLTAGE,
0455         .indexed = 1,
0456         .channel = INGENIC_ADC_TOUCH_XP,
0457         .scan_index = 0,
0458         .scan_type = {
0459             .sign = 'u',
0460             .realbits = 12,
0461             .storagebits = 16,
0462         },
0463     },
0464     {
0465         .type = IIO_VOLTAGE,
0466         .indexed = 1,
0467         .channel = INGENIC_ADC_TOUCH_YP,
0468         .scan_index = 1,
0469         .scan_type = {
0470             .sign = 'u',
0471             .realbits = 12,
0472             .storagebits = 16,
0473         },
0474     },
0475     {
0476         .type = IIO_VOLTAGE,
0477         .indexed = 1,
0478         .channel = INGENIC_ADC_TOUCH_XN,
0479         .scan_index = 2,
0480         .scan_type = {
0481             .sign = 'u',
0482             .realbits = 12,
0483             .storagebits = 16,
0484         },
0485     },
0486     {
0487         .type = IIO_VOLTAGE,
0488         .indexed = 1,
0489         .channel = INGENIC_ADC_TOUCH_YN,
0490         .scan_index = 3,
0491         .scan_type = {
0492             .sign = 'u',
0493             .realbits = 12,
0494             .storagebits = 16,
0495         },
0496     },
0497     {
0498         .type = IIO_VOLTAGE,
0499         .indexed = 1,
0500         .channel = INGENIC_ADC_TOUCH_XD,
0501         .scan_index = 4,
0502         .scan_type = {
0503             .sign = 'u',
0504             .realbits = 12,
0505             .storagebits = 16,
0506         },
0507     },
0508     {
0509         .type = IIO_VOLTAGE,
0510         .indexed = 1,
0511         .channel = INGENIC_ADC_TOUCH_YD,
0512         .scan_index = 5,
0513         .scan_type = {
0514             .sign = 'u',
0515             .realbits = 12,
0516             .storagebits = 16,
0517         },
0518     },
0519     {
0520         .extend_name = "aux",
0521         .type = IIO_VOLTAGE,
0522         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0523                       BIT(IIO_CHAN_INFO_SCALE),
0524         .indexed = 1,
0525         .channel = INGENIC_ADC_AUX,
0526         .scan_index = -1,
0527     },
0528     {
0529         .extend_name = "battery",
0530         .type = IIO_VOLTAGE,
0531         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0532                       BIT(IIO_CHAN_INFO_SCALE),
0533         .info_mask_separate_available = BIT(IIO_CHAN_INFO_RAW) |
0534                         BIT(IIO_CHAN_INFO_SCALE),
0535         .indexed = 1,
0536         .channel = INGENIC_ADC_BATTERY,
0537         .scan_index = -1,
0538     },
0539     {
0540         .extend_name = "aux2",
0541         .type = IIO_VOLTAGE,
0542         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0543                       BIT(IIO_CHAN_INFO_SCALE),
0544         .indexed = 1,
0545         .channel = INGENIC_ADC_AUX2,
0546         .scan_index = -1,
0547     },
0548 };
0549 
0550 static const struct ingenic_adc_soc_data jz4725b_adc_soc_data = {
0551     .battery_high_vref = JZ4725B_ADC_BATTERY_HIGH_VREF,
0552     .battery_high_vref_bits = JZ4725B_ADC_BATTERY_HIGH_VREF_BITS,
0553     .battery_raw_avail = jz4725b_adc_battery_raw_avail,
0554     .battery_raw_avail_size = ARRAY_SIZE(jz4725b_adc_battery_raw_avail),
0555     .battery_scale_avail = jz4725b_adc_battery_scale_avail,
0556     .battery_scale_avail_size = ARRAY_SIZE(jz4725b_adc_battery_scale_avail),
0557     .battery_vref_mode = true,
0558     .has_aux_md = false,
0559     .channels = jz4740_channels,
0560     .num_channels = ARRAY_SIZE(jz4740_channels),
0561     .init_clk_div = jz4725b_adc_init_clk_div,
0562 };
0563 
0564 static const struct ingenic_adc_soc_data jz4740_adc_soc_data = {
0565     .battery_high_vref = JZ4740_ADC_BATTERY_HIGH_VREF,
0566     .battery_high_vref_bits = JZ4740_ADC_BATTERY_HIGH_VREF_BITS,
0567     .battery_raw_avail = jz4740_adc_battery_raw_avail,
0568     .battery_raw_avail_size = ARRAY_SIZE(jz4740_adc_battery_raw_avail),
0569     .battery_scale_avail = jz4740_adc_battery_scale_avail,
0570     .battery_scale_avail_size = ARRAY_SIZE(jz4740_adc_battery_scale_avail),
0571     .battery_vref_mode = true,
0572     .has_aux_md = false,
0573     .channels = jz4740_channels,
0574     .num_channels = ARRAY_SIZE(jz4740_channels),
0575     .init_clk_div = NULL, /* no ADCLK register on JZ4740 */
0576 };
0577 
0578 static const struct ingenic_adc_soc_data jz4760_adc_soc_data = {
0579     .battery_high_vref = JZ4760_ADC_BATTERY_VREF,
0580     .battery_high_vref_bits = JZ4770_ADC_BATTERY_VREF_BITS,
0581     .battery_raw_avail = jz4770_adc_battery_raw_avail,
0582     .battery_raw_avail_size = ARRAY_SIZE(jz4770_adc_battery_raw_avail),
0583     .battery_scale_avail = jz4760_adc_battery_scale_avail,
0584     .battery_scale_avail_size = ARRAY_SIZE(jz4760_adc_battery_scale_avail),
0585     .battery_vref_mode = false,
0586     .has_aux_md = true,
0587     .channels = jz4760_channels,
0588     .num_channels = ARRAY_SIZE(jz4760_channels),
0589     .init_clk_div = jz4770_adc_init_clk_div,
0590 };
0591 
0592 static const struct ingenic_adc_soc_data jz4770_adc_soc_data = {
0593     .battery_high_vref = JZ4770_ADC_BATTERY_VREF,
0594     .battery_high_vref_bits = JZ4770_ADC_BATTERY_VREF_BITS,
0595     .battery_raw_avail = jz4770_adc_battery_raw_avail,
0596     .battery_raw_avail_size = ARRAY_SIZE(jz4770_adc_battery_raw_avail),
0597     .battery_scale_avail = jz4770_adc_battery_scale_avail,
0598     .battery_scale_avail_size = ARRAY_SIZE(jz4770_adc_battery_scale_avail),
0599     .battery_vref_mode = false,
0600     .has_aux_md = true,
0601     .channels = jz4770_channels,
0602     .num_channels = ARRAY_SIZE(jz4770_channels),
0603     .init_clk_div = jz4770_adc_init_clk_div,
0604 };
0605 
0606 static int ingenic_adc_read_avail(struct iio_dev *iio_dev,
0607                   struct iio_chan_spec const *chan,
0608                   const int **vals,
0609                   int *type,
0610                   int *length,
0611                   long m)
0612 {
0613     struct ingenic_adc *adc = iio_priv(iio_dev);
0614 
0615     switch (m) {
0616     case IIO_CHAN_INFO_RAW:
0617         *type = IIO_VAL_INT;
0618         *length = adc->soc_data->battery_raw_avail_size;
0619         *vals = adc->soc_data->battery_raw_avail;
0620         return IIO_AVAIL_RANGE;
0621     case IIO_CHAN_INFO_SCALE:
0622         *type = IIO_VAL_FRACTIONAL_LOG2;
0623         *length = adc->soc_data->battery_scale_avail_size;
0624         *vals = adc->soc_data->battery_scale_avail;
0625         return IIO_AVAIL_LIST;
0626     default:
0627         return -EINVAL;
0628     }
0629 }
0630 
0631 static int ingenic_adc_read_chan_info_raw(struct iio_dev *iio_dev,
0632                       struct iio_chan_spec const *chan,
0633                       int *val)
0634 {
0635     int cmd, ret, engine = (chan->channel == INGENIC_ADC_BATTERY);
0636     struct ingenic_adc *adc = iio_priv(iio_dev);
0637 
0638     ret = clk_enable(adc->clk);
0639     if (ret) {
0640         dev_err(iio_dev->dev.parent, "Failed to enable clock: %d\n",
0641             ret);
0642         return ret;
0643     }
0644 
0645     /* We cannot sample the aux channels in parallel. */
0646     mutex_lock(&adc->aux_lock);
0647     if (adc->soc_data->has_aux_md && engine == 0) {
0648         switch (chan->channel) {
0649         case INGENIC_ADC_AUX0:
0650             cmd = 0;
0651             break;
0652         case INGENIC_ADC_AUX:
0653             cmd = 1;
0654             break;
0655         case INGENIC_ADC_AUX2:
0656             cmd = 2;
0657             break;
0658         }
0659 
0660         ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_AUX_MD, cmd);
0661     }
0662 
0663     ret = ingenic_adc_capture(adc, engine);
0664     if (ret)
0665         goto out;
0666 
0667     switch (chan->channel) {
0668     case INGENIC_ADC_AUX0:
0669     case INGENIC_ADC_AUX:
0670     case INGENIC_ADC_AUX2:
0671         *val = readw(adc->base + JZ_ADC_REG_ADSDAT);
0672         break;
0673     case INGENIC_ADC_BATTERY:
0674         *val = readw(adc->base + JZ_ADC_REG_ADBDAT);
0675         break;
0676     }
0677 
0678     ret = IIO_VAL_INT;
0679 out:
0680     mutex_unlock(&adc->aux_lock);
0681     clk_disable(adc->clk);
0682 
0683     return ret;
0684 }
0685 
0686 static int ingenic_adc_read_raw(struct iio_dev *iio_dev,
0687                 struct iio_chan_spec const *chan,
0688                 int *val,
0689                 int *val2,
0690                 long m)
0691 {
0692     struct ingenic_adc *adc = iio_priv(iio_dev);
0693 
0694     switch (m) {
0695     case IIO_CHAN_INFO_RAW:
0696         return ingenic_adc_read_chan_info_raw(iio_dev, chan, val);
0697     case IIO_CHAN_INFO_SCALE:
0698         switch (chan->channel) {
0699         case INGENIC_ADC_AUX0:
0700         case INGENIC_ADC_AUX:
0701         case INGENIC_ADC_AUX2:
0702             *val = JZ_ADC_AUX_VREF;
0703             *val2 = JZ_ADC_AUX_VREF_BITS;
0704             break;
0705         case INGENIC_ADC_BATTERY:
0706             if (adc->low_vref_mode) {
0707                 *val = JZ_ADC_BATTERY_LOW_VREF;
0708                 *val2 = JZ_ADC_BATTERY_LOW_VREF_BITS;
0709             } else {
0710                 *val = adc->soc_data->battery_high_vref;
0711                 *val2 = adc->soc_data->battery_high_vref_bits;
0712             }
0713             break;
0714         }
0715 
0716         return IIO_VAL_FRACTIONAL_LOG2;
0717     default:
0718         return -EINVAL;
0719     }
0720 }
0721 
0722 static int ingenic_adc_of_xlate(struct iio_dev *iio_dev,
0723                 const struct of_phandle_args *iiospec)
0724 {
0725     int i;
0726 
0727     if (!iiospec->args_count)
0728         return -EINVAL;
0729 
0730     for (i = 0; i < iio_dev->num_channels; ++i)
0731         if (iio_dev->channels[i].channel == iiospec->args[0])
0732             return i;
0733 
0734     return -EINVAL;
0735 }
0736 
0737 static void ingenic_adc_clk_cleanup(void *data)
0738 {
0739     clk_unprepare(data);
0740 }
0741 
0742 static const struct iio_info ingenic_adc_info = {
0743     .write_raw = ingenic_adc_write_raw,
0744     .read_raw = ingenic_adc_read_raw,
0745     .read_avail = ingenic_adc_read_avail,
0746     .of_xlate = ingenic_adc_of_xlate,
0747 };
0748 
0749 static int ingenic_adc_buffer_enable(struct iio_dev *iio_dev)
0750 {
0751     struct ingenic_adc *adc = iio_priv(iio_dev);
0752     int ret;
0753 
0754     ret = clk_enable(adc->clk);
0755     if (ret) {
0756         dev_err(iio_dev->dev.parent, "Failed to enable clock: %d\n",
0757             ret);
0758         return ret;
0759     }
0760 
0761     /* It takes significant time for the touchscreen hw to stabilize. */
0762     msleep(50);
0763     ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_TOUCH_OPS_MASK,
0764                    JZ_ADC_REG_CFG_SAMPLE_NUM(4) |
0765                    JZ_ADC_REG_CFG_PULL_UP(4));
0766 
0767     writew(80, adc->base + JZ_ADC_REG_ADWAIT);
0768     writew(2, adc->base + JZ_ADC_REG_ADSAME);
0769     writeb((u8)~JZ_ADC_IRQ_TOUCH, adc->base + JZ_ADC_REG_CTRL);
0770     writel(0, adc->base + JZ_ADC_REG_ADTCH);
0771 
0772     ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_CMD_SEL,
0773                    JZ_ADC_REG_CFG_CMD_SEL);
0774     ingenic_adc_set_adcmd(iio_dev, iio_dev->active_scan_mask[0]);
0775 
0776     ingenic_adc_enable(adc, 2, true);
0777 
0778     return 0;
0779 }
0780 
0781 static int ingenic_adc_buffer_disable(struct iio_dev *iio_dev)
0782 {
0783     struct ingenic_adc *adc = iio_priv(iio_dev);
0784 
0785     ingenic_adc_enable(adc, 2, false);
0786 
0787     ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_CMD_SEL, 0);
0788 
0789     writeb(0xff, adc->base + JZ_ADC_REG_CTRL);
0790     writeb(0xff, adc->base + JZ_ADC_REG_STATUS);
0791     ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_TOUCH_OPS_MASK, 0);
0792     writew(0, adc->base + JZ_ADC_REG_ADSAME);
0793     writew(0, adc->base + JZ_ADC_REG_ADWAIT);
0794     clk_disable(adc->clk);
0795 
0796     return 0;
0797 }
0798 
0799 static const struct iio_buffer_setup_ops ingenic_buffer_setup_ops = {
0800     .postenable = &ingenic_adc_buffer_enable,
0801     .predisable = &ingenic_adc_buffer_disable
0802 };
0803 
0804 static irqreturn_t ingenic_adc_irq(int irq, void *data)
0805 {
0806     struct iio_dev *iio_dev = data;
0807     struct ingenic_adc *adc = iio_priv(iio_dev);
0808     unsigned long mask = iio_dev->active_scan_mask[0];
0809     unsigned int i;
0810     u32 tdat[3];
0811 
0812     for (i = 0; i < ARRAY_SIZE(tdat); mask >>= 2, i++) {
0813         if (mask & 0x3)
0814             tdat[i] = readl(adc->base + JZ_ADC_REG_ADTCH);
0815         else
0816             tdat[i] = 0;
0817     }
0818 
0819     iio_push_to_buffers(iio_dev, tdat);
0820     writeb(JZ_ADC_IRQ_TOUCH, adc->base + JZ_ADC_REG_STATUS);
0821 
0822     return IRQ_HANDLED;
0823 }
0824 
0825 static int ingenic_adc_probe(struct platform_device *pdev)
0826 {
0827     struct device *dev = &pdev->dev;
0828     struct iio_dev *iio_dev;
0829     struct ingenic_adc *adc;
0830     const struct ingenic_adc_soc_data *soc_data;
0831     int irq, ret;
0832 
0833     soc_data = device_get_match_data(dev);
0834     if (!soc_data)
0835         return -EINVAL;
0836 
0837     iio_dev = devm_iio_device_alloc(dev, sizeof(*adc));
0838     if (!iio_dev)
0839         return -ENOMEM;
0840 
0841     adc = iio_priv(iio_dev);
0842     mutex_init(&adc->lock);
0843     mutex_init(&adc->aux_lock);
0844     adc->soc_data = soc_data;
0845 
0846     irq = platform_get_irq(pdev, 0);
0847     if (irq < 0)
0848         return irq;
0849 
0850     ret = devm_request_irq(dev, irq, ingenic_adc_irq, 0,
0851                    dev_name(dev), iio_dev);
0852     if (ret < 0) {
0853         dev_err(dev, "Failed to request irq: %d\n", ret);
0854         return ret;
0855     }
0856 
0857     adc->base = devm_platform_ioremap_resource(pdev, 0);
0858     if (IS_ERR(adc->base))
0859         return PTR_ERR(adc->base);
0860 
0861     adc->clk = devm_clk_get(dev, "adc");
0862     if (IS_ERR(adc->clk)) {
0863         dev_err(dev, "Unable to get clock\n");
0864         return PTR_ERR(adc->clk);
0865     }
0866 
0867     ret = clk_prepare_enable(adc->clk);
0868     if (ret) {
0869         dev_err(dev, "Failed to enable clock\n");
0870         return ret;
0871     }
0872 
0873     /* Set clock dividers. */
0874     if (soc_data->init_clk_div) {
0875         ret = soc_data->init_clk_div(dev, adc);
0876         if (ret) {
0877             clk_disable_unprepare(adc->clk);
0878             return ret;
0879         }
0880     }
0881 
0882     /* Put hardware in a known passive state. */
0883     writeb(0x00, adc->base + JZ_ADC_REG_ENABLE);
0884     writeb(0xff, adc->base + JZ_ADC_REG_CTRL);
0885 
0886     /* JZ4760B specific */
0887     if (device_property_present(dev, "ingenic,use-internal-divider"))
0888         ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_VBAT_SEL,
0889                         JZ_ADC_REG_CFG_VBAT_SEL);
0890     else
0891         ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_VBAT_SEL, 0);
0892 
0893     usleep_range(2000, 3000); /* Must wait at least 2ms. */
0894     clk_disable(adc->clk);
0895 
0896     ret = devm_add_action_or_reset(dev, ingenic_adc_clk_cleanup, adc->clk);
0897     if (ret) {
0898         dev_err(dev, "Unable to add action\n");
0899         return ret;
0900     }
0901 
0902     iio_dev->name = "jz-adc";
0903     iio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE;
0904     iio_dev->setup_ops = &ingenic_buffer_setup_ops;
0905     iio_dev->channels = soc_data->channels;
0906     iio_dev->num_channels = soc_data->num_channels;
0907     iio_dev->info = &ingenic_adc_info;
0908 
0909     ret = devm_iio_device_register(dev, iio_dev);
0910     if (ret)
0911         dev_err(dev, "Unable to register IIO device\n");
0912 
0913     return ret;
0914 }
0915 
0916 static const struct of_device_id ingenic_adc_of_match[] = {
0917     { .compatible = "ingenic,jz4725b-adc", .data = &jz4725b_adc_soc_data, },
0918     { .compatible = "ingenic,jz4740-adc", .data = &jz4740_adc_soc_data, },
0919     { .compatible = "ingenic,jz4760-adc", .data = &jz4760_adc_soc_data, },
0920     { .compatible = "ingenic,jz4760b-adc", .data = &jz4760_adc_soc_data, },
0921     { .compatible = "ingenic,jz4770-adc", .data = &jz4770_adc_soc_data, },
0922     { },
0923 };
0924 MODULE_DEVICE_TABLE(of, ingenic_adc_of_match);
0925 
0926 static struct platform_driver ingenic_adc_driver = {
0927     .driver = {
0928         .name = "ingenic-adc",
0929         .of_match_table = ingenic_adc_of_match,
0930     },
0931     .probe = ingenic_adc_probe,
0932 };
0933 module_platform_driver(ingenic_adc_driver);
0934 MODULE_LICENSE("GPL v2");