0001
0002
0003
0004
0005
0006
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
0121 readl(adc->base + JZ_ADC_REG_ADCMD);
0122
0123 if (mask & 0x3) {
0124
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
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
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
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
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
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
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
0218
0219
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
0329
0330
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
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
0365
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
0376 div_10us = DIV_ROUND_UP(rate, 10000);
0377
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,
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
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
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
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
0883 writeb(0x00, adc->base + JZ_ADC_REG_ENABLE);
0884 writeb(0xff, adc->base + JZ_ADC_REG_CTRL);
0885
0886
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);
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");