0001
0002
0003
0004 #include <linux/hwspinlock.h>
0005 #include <linux/iio/iio.h>
0006 #include <linux/module.h>
0007 #include <linux/nvmem-consumer.h>
0008 #include <linux/of.h>
0009 #include <linux/of_device.h>
0010 #include <linux/platform_device.h>
0011 #include <linux/regmap.h>
0012 #include <linux/regulator/consumer.h>
0013 #include <linux/slab.h>
0014
0015
0016 #define SC2730_MODULE_EN 0x1808
0017 #define SC2731_MODULE_EN 0xc08
0018 #define SC27XX_MODULE_ADC_EN BIT(5)
0019 #define SC2721_ARM_CLK_EN 0xc0c
0020 #define SC2730_ARM_CLK_EN 0x180c
0021 #define SC2731_ARM_CLK_EN 0xc10
0022 #define SC27XX_CLK_ADC_EN BIT(5)
0023 #define SC27XX_CLK_ADC_CLK_EN BIT(6)
0024
0025
0026 #define SC27XX_ADC_CTL 0x0
0027 #define SC27XX_ADC_CH_CFG 0x4
0028 #define SC27XX_ADC_DATA 0x4c
0029 #define SC27XX_ADC_INT_EN 0x50
0030 #define SC27XX_ADC_INT_CLR 0x54
0031 #define SC27XX_ADC_INT_STS 0x58
0032 #define SC27XX_ADC_INT_RAW 0x5c
0033
0034
0035 #define SC27XX_ADC_EN BIT(0)
0036 #define SC27XX_ADC_CHN_RUN BIT(1)
0037 #define SC27XX_ADC_12BIT_MODE BIT(2)
0038 #define SC27XX_ADC_RUN_NUM_MASK GENMASK(7, 4)
0039 #define SC27XX_ADC_RUN_NUM_SHIFT 4
0040
0041
0042 #define SC27XX_ADC_CHN_ID_MASK GENMASK(4, 0)
0043 #define SC27XX_ADC_SCALE_MASK GENMASK(10, 9)
0044 #define SC2721_ADC_SCALE_MASK BIT(5)
0045 #define SC27XX_ADC_SCALE_SHIFT 9
0046 #define SC2721_ADC_SCALE_SHIFT 5
0047
0048
0049 #define SC27XX_ADC_IRQ_EN BIT(0)
0050
0051
0052 #define SC27XX_ADC_IRQ_CLR BIT(0)
0053
0054
0055 #define SC27XX_ADC_IRQ_RAW BIT(0)
0056
0057
0058 #define SC27XX_ADC_DATA_MASK GENMASK(11, 0)
0059
0060
0061 #define SC27XX_ADC_HWLOCK_TIMEOUT 5000
0062
0063
0064 #define SC27XX_ADC_RDY_TIMEOUT 1000000
0065 #define SC27XX_ADC_POLL_RAW_STATUS 500
0066
0067
0068 #define SC27XX_ADC_CHANNEL_MAX 32
0069
0070
0071 #define SC27XX_VOLT_RATIO(n, d) \
0072 (((n) << SC27XX_RATIO_NUMERATOR_OFFSET) | (d))
0073 #define SC27XX_RATIO_NUMERATOR_OFFSET 16
0074 #define SC27XX_RATIO_DENOMINATOR_MASK GENMASK(15, 0)
0075
0076
0077 #define SC27XX_ADC_REFVOL_VDD35 3500000
0078
0079
0080 #define SC27XX_ADC_REFVOL_VDD28 2800000
0081
0082 struct sc27xx_adc_data {
0083 struct device *dev;
0084 struct regulator *volref;
0085 struct regmap *regmap;
0086
0087
0088
0089
0090 struct hwspinlock *hwlock;
0091 int channel_scale[SC27XX_ADC_CHANNEL_MAX];
0092 u32 base;
0093 int irq;
0094 const struct sc27xx_adc_variant_data *var_data;
0095 };
0096
0097
0098
0099
0100
0101
0102 struct sc27xx_adc_variant_data {
0103 u32 module_en;
0104 u32 clk_en;
0105 u32 scale_shift;
0106 u32 scale_mask;
0107 const struct sc27xx_adc_linear_graph *bscale_cal;
0108 const struct sc27xx_adc_linear_graph *sscale_cal;
0109 void (*init_scale)(struct sc27xx_adc_data *data);
0110 int (*get_ratio)(int channel, int scale);
0111 bool set_volref;
0112 };
0113
0114 struct sc27xx_adc_linear_graph {
0115 int volt0;
0116 int adc0;
0117 int volt1;
0118 int adc1;
0119 };
0120
0121
0122
0123
0124
0125
0126
0127 static struct sc27xx_adc_linear_graph big_scale_graph = {
0128 4200, 3310,
0129 3600, 2832,
0130 };
0131
0132 static struct sc27xx_adc_linear_graph small_scale_graph = {
0133 1000, 3413,
0134 100, 341,
0135 };
0136
0137 static const struct sc27xx_adc_linear_graph sc2731_big_scale_graph_calib = {
0138 4200, 850,
0139 3600, 728,
0140 };
0141
0142 static const struct sc27xx_adc_linear_graph sc2731_small_scale_graph_calib = {
0143 1000, 838,
0144 100, 84,
0145 };
0146
0147 static const struct sc27xx_adc_linear_graph big_scale_graph_calib = {
0148 4200, 856,
0149 3600, 733,
0150 };
0151
0152 static const struct sc27xx_adc_linear_graph small_scale_graph_calib = {
0153 1000, 833,
0154 100, 80,
0155 };
0156
0157 static int sc27xx_adc_get_calib_data(u32 calib_data, int calib_adc)
0158 {
0159 return ((calib_data & 0xff) + calib_adc - 128) * 4;
0160 }
0161
0162
0163 static int adc_nvmem_cell_calib_data(struct sc27xx_adc_data *data, const char *cell_name)
0164 {
0165 struct nvmem_cell *cell;
0166 void *buf;
0167 u32 origin_calib_data = 0;
0168 size_t len;
0169
0170 if (!data)
0171 return -EINVAL;
0172
0173 cell = nvmem_cell_get(data->dev, cell_name);
0174 if (IS_ERR(cell))
0175 return PTR_ERR(cell);
0176
0177 buf = nvmem_cell_read(cell, &len);
0178 if (IS_ERR(buf)) {
0179 nvmem_cell_put(cell);
0180 return PTR_ERR(buf);
0181 }
0182
0183 memcpy(&origin_calib_data, buf, min(len, sizeof(u32)));
0184
0185 kfree(buf);
0186 nvmem_cell_put(cell);
0187 return origin_calib_data;
0188 }
0189
0190 static int sc27xx_adc_scale_calibration(struct sc27xx_adc_data *data,
0191 bool big_scale)
0192 {
0193 const struct sc27xx_adc_linear_graph *calib_graph;
0194 struct sc27xx_adc_linear_graph *graph;
0195 const char *cell_name;
0196 u32 calib_data = 0;
0197
0198 if (big_scale) {
0199 calib_graph = data->var_data->bscale_cal;
0200 graph = &big_scale_graph;
0201 cell_name = "big_scale_calib";
0202 } else {
0203 calib_graph = data->var_data->sscale_cal;
0204 graph = &small_scale_graph;
0205 cell_name = "small_scale_calib";
0206 }
0207
0208 calib_data = adc_nvmem_cell_calib_data(data, cell_name);
0209
0210
0211 graph->adc0 = sc27xx_adc_get_calib_data(calib_data, calib_graph->adc0);
0212 graph->adc1 = sc27xx_adc_get_calib_data(calib_data >> 8,
0213 calib_graph->adc1);
0214
0215 return 0;
0216 }
0217
0218 static int sc2720_adc_get_ratio(int channel, int scale)
0219 {
0220 switch (channel) {
0221 case 14:
0222 switch (scale) {
0223 case 0:
0224 return SC27XX_VOLT_RATIO(68, 900);
0225 case 1:
0226 return SC27XX_VOLT_RATIO(68, 1760);
0227 case 2:
0228 return SC27XX_VOLT_RATIO(68, 2327);
0229 case 3:
0230 return SC27XX_VOLT_RATIO(68, 3654);
0231 default:
0232 return SC27XX_VOLT_RATIO(1, 1);
0233 }
0234 case 16:
0235 switch (scale) {
0236 case 0:
0237 return SC27XX_VOLT_RATIO(48, 100);
0238 case 1:
0239 return SC27XX_VOLT_RATIO(480, 1955);
0240 case 2:
0241 return SC27XX_VOLT_RATIO(480, 2586);
0242 case 3:
0243 return SC27XX_VOLT_RATIO(48, 406);
0244 default:
0245 return SC27XX_VOLT_RATIO(1, 1);
0246 }
0247 case 21:
0248 case 22:
0249 case 23:
0250 switch (scale) {
0251 case 0:
0252 return SC27XX_VOLT_RATIO(3, 8);
0253 case 1:
0254 return SC27XX_VOLT_RATIO(375, 1955);
0255 case 2:
0256 return SC27XX_VOLT_RATIO(375, 2586);
0257 case 3:
0258 return SC27XX_VOLT_RATIO(300, 3248);
0259 default:
0260 return SC27XX_VOLT_RATIO(1, 1);
0261 }
0262 default:
0263 switch (scale) {
0264 case 0:
0265 return SC27XX_VOLT_RATIO(1, 1);
0266 case 1:
0267 return SC27XX_VOLT_RATIO(1000, 1955);
0268 case 2:
0269 return SC27XX_VOLT_RATIO(1000, 2586);
0270 case 3:
0271 return SC27XX_VOLT_RATIO(100, 406);
0272 default:
0273 return SC27XX_VOLT_RATIO(1, 1);
0274 }
0275 }
0276 return SC27XX_VOLT_RATIO(1, 1);
0277 }
0278
0279 static int sc2721_adc_get_ratio(int channel, int scale)
0280 {
0281 switch (channel) {
0282 case 1:
0283 case 2:
0284 case 3:
0285 case 4:
0286 return scale ? SC27XX_VOLT_RATIO(400, 1025) :
0287 SC27XX_VOLT_RATIO(1, 1);
0288 case 5:
0289 return SC27XX_VOLT_RATIO(7, 29);
0290 case 7:
0291 case 9:
0292 return scale ? SC27XX_VOLT_RATIO(100, 125) :
0293 SC27XX_VOLT_RATIO(1, 1);
0294 case 14:
0295 return SC27XX_VOLT_RATIO(68, 900);
0296 case 16:
0297 return SC27XX_VOLT_RATIO(48, 100);
0298 case 19:
0299 return SC27XX_VOLT_RATIO(1, 3);
0300 default:
0301 return SC27XX_VOLT_RATIO(1, 1);
0302 }
0303 return SC27XX_VOLT_RATIO(1, 1);
0304 }
0305
0306 static int sc2730_adc_get_ratio(int channel, int scale)
0307 {
0308 switch (channel) {
0309 case 14:
0310 switch (scale) {
0311 case 0:
0312 return SC27XX_VOLT_RATIO(68, 900);
0313 case 1:
0314 return SC27XX_VOLT_RATIO(68, 1760);
0315 case 2:
0316 return SC27XX_VOLT_RATIO(68, 2327);
0317 case 3:
0318 return SC27XX_VOLT_RATIO(68, 3654);
0319 default:
0320 return SC27XX_VOLT_RATIO(1, 1);
0321 }
0322 case 15:
0323 switch (scale) {
0324 case 0:
0325 return SC27XX_VOLT_RATIO(1, 3);
0326 case 1:
0327 return SC27XX_VOLT_RATIO(1000, 5865);
0328 case 2:
0329 return SC27XX_VOLT_RATIO(500, 3879);
0330 case 3:
0331 return SC27XX_VOLT_RATIO(500, 6090);
0332 default:
0333 return SC27XX_VOLT_RATIO(1, 1);
0334 }
0335 case 16:
0336 switch (scale) {
0337 case 0:
0338 return SC27XX_VOLT_RATIO(48, 100);
0339 case 1:
0340 return SC27XX_VOLT_RATIO(480, 1955);
0341 case 2:
0342 return SC27XX_VOLT_RATIO(480, 2586);
0343 case 3:
0344 return SC27XX_VOLT_RATIO(48, 406);
0345 default:
0346 return SC27XX_VOLT_RATIO(1, 1);
0347 }
0348 case 21:
0349 case 22:
0350 case 23:
0351 switch (scale) {
0352 case 0:
0353 return SC27XX_VOLT_RATIO(3, 8);
0354 case 1:
0355 return SC27XX_VOLT_RATIO(375, 1955);
0356 case 2:
0357 return SC27XX_VOLT_RATIO(375, 2586);
0358 case 3:
0359 return SC27XX_VOLT_RATIO(300, 3248);
0360 default:
0361 return SC27XX_VOLT_RATIO(1, 1);
0362 }
0363 default:
0364 switch (scale) {
0365 case 0:
0366 return SC27XX_VOLT_RATIO(1, 1);
0367 case 1:
0368 return SC27XX_VOLT_RATIO(1000, 1955);
0369 case 2:
0370 return SC27XX_VOLT_RATIO(1000, 2586);
0371 case 3:
0372 return SC27XX_VOLT_RATIO(1000, 4060);
0373 default:
0374 return SC27XX_VOLT_RATIO(1, 1);
0375 }
0376 }
0377 return SC27XX_VOLT_RATIO(1, 1);
0378 }
0379
0380 static int sc2731_adc_get_ratio(int channel, int scale)
0381 {
0382 switch (channel) {
0383 case 1:
0384 case 2:
0385 case 3:
0386 case 4:
0387 return scale ? SC27XX_VOLT_RATIO(400, 1025) :
0388 SC27XX_VOLT_RATIO(1, 1);
0389 case 5:
0390 return SC27XX_VOLT_RATIO(7, 29);
0391 case 6:
0392 return SC27XX_VOLT_RATIO(375, 9000);
0393 case 7:
0394 case 8:
0395 return scale ? SC27XX_VOLT_RATIO(100, 125) :
0396 SC27XX_VOLT_RATIO(1, 1);
0397 case 19:
0398 return SC27XX_VOLT_RATIO(1, 3);
0399 default:
0400 return SC27XX_VOLT_RATIO(1, 1);
0401 }
0402 return SC27XX_VOLT_RATIO(1, 1);
0403 }
0404
0405
0406
0407
0408 static void sc2720_adc_scale_init(struct sc27xx_adc_data *data)
0409 {
0410 int i;
0411
0412 for (i = 0; i < SC27XX_ADC_CHANNEL_MAX; i++) {
0413 switch (i) {
0414 case 5:
0415 data->channel_scale[i] = 3;
0416 break;
0417 case 7:
0418 case 9:
0419 data->channel_scale[i] = 2;
0420 break;
0421 case 13:
0422 data->channel_scale[i] = 1;
0423 break;
0424 case 19:
0425 case 30:
0426 case 31:
0427 data->channel_scale[i] = 3;
0428 break;
0429 default:
0430 data->channel_scale[i] = 0;
0431 break;
0432 }
0433 }
0434 }
0435
0436 static void sc2730_adc_scale_init(struct sc27xx_adc_data *data)
0437 {
0438 int i;
0439
0440 for (i = 0; i < SC27XX_ADC_CHANNEL_MAX; i++) {
0441 switch (i) {
0442 case 5:
0443 case 10:
0444 case 19:
0445 case 30:
0446 case 31:
0447 data->channel_scale[i] = 3;
0448 break;
0449 case 7:
0450 case 9:
0451 data->channel_scale[i] = 2;
0452 break;
0453 case 13:
0454 data->channel_scale[i] = 1;
0455 break;
0456 default:
0457 data->channel_scale[i] = 0;
0458 break;
0459 }
0460 }
0461 }
0462
0463 static void sc2731_adc_scale_init(struct sc27xx_adc_data *data)
0464 {
0465 int i;
0466
0467
0468
0469
0470 for (i = 0; i < SC27XX_ADC_CHANNEL_MAX; i++) {
0471 switch (i) {
0472 case 5:
0473 data->channel_scale[i] = 1;
0474 break;
0475 default:
0476 data->channel_scale[i] = 0;
0477 break;
0478 }
0479 }
0480 }
0481
0482 static int sc27xx_adc_read(struct sc27xx_adc_data *data, int channel,
0483 int scale, int *val)
0484 {
0485 int ret, ret_volref;
0486 u32 tmp, value, status;
0487
0488 ret = hwspin_lock_timeout_raw(data->hwlock, SC27XX_ADC_HWLOCK_TIMEOUT);
0489 if (ret) {
0490 dev_err(data->dev, "timeout to get the hwspinlock\n");
0491 return ret;
0492 }
0493
0494
0495
0496
0497
0498
0499 if ((data->var_data->set_volref) && (channel == 30 || channel == 31)) {
0500 ret = regulator_set_voltage(data->volref,
0501 SC27XX_ADC_REFVOL_VDD35,
0502 SC27XX_ADC_REFVOL_VDD35);
0503 if (ret) {
0504 dev_err(data->dev, "failed to set the volref 3.5v\n");
0505 goto unlock_adc;
0506 }
0507 }
0508
0509 ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL,
0510 SC27XX_ADC_EN, SC27XX_ADC_EN);
0511 if (ret)
0512 goto regulator_restore;
0513
0514 ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_INT_CLR,
0515 SC27XX_ADC_IRQ_CLR, SC27XX_ADC_IRQ_CLR);
0516 if (ret)
0517 goto disable_adc;
0518
0519
0520 tmp = (scale << data->var_data->scale_shift) & data->var_data->scale_mask;
0521 tmp |= channel & SC27XX_ADC_CHN_ID_MASK;
0522 ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CH_CFG,
0523 SC27XX_ADC_CHN_ID_MASK |
0524 data->var_data->scale_mask,
0525 tmp);
0526 if (ret)
0527 goto disable_adc;
0528
0529
0530 tmp = SC27XX_ADC_12BIT_MODE;
0531 tmp |= (0 << SC27XX_ADC_RUN_NUM_SHIFT) & SC27XX_ADC_RUN_NUM_MASK;
0532 ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL,
0533 SC27XX_ADC_RUN_NUM_MASK | SC27XX_ADC_12BIT_MODE,
0534 tmp);
0535 if (ret)
0536 goto disable_adc;
0537
0538 ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL,
0539 SC27XX_ADC_CHN_RUN, SC27XX_ADC_CHN_RUN);
0540 if (ret)
0541 goto disable_adc;
0542
0543 ret = regmap_read_poll_timeout(data->regmap,
0544 data->base + SC27XX_ADC_INT_RAW,
0545 status, (status & SC27XX_ADC_IRQ_RAW),
0546 SC27XX_ADC_POLL_RAW_STATUS,
0547 SC27XX_ADC_RDY_TIMEOUT);
0548 if (ret) {
0549 dev_err(data->dev, "read adc timeout, status = 0x%x\n", status);
0550 goto disable_adc;
0551 }
0552
0553 ret = regmap_read(data->regmap, data->base + SC27XX_ADC_DATA, &value);
0554 if (ret)
0555 goto disable_adc;
0556
0557 value &= SC27XX_ADC_DATA_MASK;
0558
0559 disable_adc:
0560 regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL,
0561 SC27XX_ADC_EN, 0);
0562 regulator_restore:
0563 if ((data->var_data->set_volref) && (channel == 30 || channel == 31)) {
0564 ret_volref = regulator_set_voltage(data->volref,
0565 SC27XX_ADC_REFVOL_VDD28,
0566 SC27XX_ADC_REFVOL_VDD28);
0567 if (ret_volref) {
0568 dev_err(data->dev, "failed to set the volref 2.8v,ret_volref = 0x%x\n",
0569 ret_volref);
0570 ret = ret || ret_volref;
0571 }
0572 }
0573 unlock_adc:
0574 hwspin_unlock_raw(data->hwlock);
0575
0576 if (!ret)
0577 *val = value;
0578
0579 return ret;
0580 }
0581
0582 static void sc27xx_adc_volt_ratio(struct sc27xx_adc_data *data, int channel, int scale,
0583 struct u32_fract *fract)
0584 {
0585 u32 ratio;
0586
0587 ratio = data->var_data->get_ratio(channel, scale);
0588 fract->numerator = ratio >> SC27XX_RATIO_NUMERATOR_OFFSET;
0589 fract->denominator = ratio & SC27XX_RATIO_DENOMINATOR_MASK;
0590 }
0591
0592 static int adc_to_volt(struct sc27xx_adc_linear_graph *graph,
0593 int raw_adc)
0594 {
0595 int tmp;
0596
0597 tmp = (graph->volt0 - graph->volt1) * (raw_adc - graph->adc1);
0598 tmp /= (graph->adc0 - graph->adc1);
0599 tmp += graph->volt1;
0600
0601 return tmp;
0602 }
0603
0604 static int sc27xx_adc_to_volt(struct sc27xx_adc_linear_graph *graph,
0605 int raw_adc)
0606 {
0607 int tmp;
0608
0609 tmp = adc_to_volt(graph, raw_adc);
0610
0611 return tmp < 0 ? 0 : tmp;
0612 }
0613
0614 static int sc27xx_adc_convert_volt(struct sc27xx_adc_data *data, int channel,
0615 int scale, int raw_adc)
0616 {
0617 struct u32_fract fract;
0618 u32 volt;
0619
0620
0621
0622
0623
0624
0625
0626
0627 switch (channel) {
0628 case 5:
0629 return sc27xx_adc_to_volt(&big_scale_graph, raw_adc);
0630
0631 case 1:
0632 return sc27xx_adc_to_volt(&small_scale_graph, raw_adc);
0633
0634 default:
0635 volt = sc27xx_adc_to_volt(&small_scale_graph, raw_adc);
0636 break;
0637 }
0638
0639 sc27xx_adc_volt_ratio(data, channel, scale, &fract);
0640
0641 return DIV_ROUND_CLOSEST(volt * fract.denominator, fract.numerator);
0642 }
0643
0644 static int sc27xx_adc_read_processed(struct sc27xx_adc_data *data,
0645 int channel, int scale, int *val)
0646 {
0647 int ret, raw_adc;
0648
0649 ret = sc27xx_adc_read(data, channel, scale, &raw_adc);
0650 if (ret)
0651 return ret;
0652
0653 *val = sc27xx_adc_convert_volt(data, channel, scale, raw_adc);
0654 return 0;
0655 }
0656
0657 static int sc27xx_adc_read_raw(struct iio_dev *indio_dev,
0658 struct iio_chan_spec const *chan,
0659 int *val, int *val2, long mask)
0660 {
0661 struct sc27xx_adc_data *data = iio_priv(indio_dev);
0662 int scale = data->channel_scale[chan->channel];
0663 int ret, tmp;
0664
0665 switch (mask) {
0666 case IIO_CHAN_INFO_RAW:
0667 mutex_lock(&indio_dev->mlock);
0668 ret = sc27xx_adc_read(data, chan->channel, scale, &tmp);
0669 mutex_unlock(&indio_dev->mlock);
0670
0671 if (ret)
0672 return ret;
0673
0674 *val = tmp;
0675 return IIO_VAL_INT;
0676
0677 case IIO_CHAN_INFO_PROCESSED:
0678 mutex_lock(&indio_dev->mlock);
0679 ret = sc27xx_adc_read_processed(data, chan->channel, scale,
0680 &tmp);
0681 mutex_unlock(&indio_dev->mlock);
0682
0683 if (ret)
0684 return ret;
0685
0686 *val = tmp;
0687 return IIO_VAL_INT;
0688
0689 case IIO_CHAN_INFO_SCALE:
0690 *val = scale;
0691 return IIO_VAL_INT;
0692
0693 default:
0694 return -EINVAL;
0695 }
0696 }
0697
0698 static int sc27xx_adc_write_raw(struct iio_dev *indio_dev,
0699 struct iio_chan_spec const *chan,
0700 int val, int val2, long mask)
0701 {
0702 struct sc27xx_adc_data *data = iio_priv(indio_dev);
0703
0704 switch (mask) {
0705 case IIO_CHAN_INFO_SCALE:
0706 data->channel_scale[chan->channel] = val;
0707 return IIO_VAL_INT;
0708
0709 default:
0710 return -EINVAL;
0711 }
0712 }
0713
0714 static const struct iio_info sc27xx_info = {
0715 .read_raw = &sc27xx_adc_read_raw,
0716 .write_raw = &sc27xx_adc_write_raw,
0717 };
0718
0719 #define SC27XX_ADC_CHANNEL(index, mask) { \
0720 .type = IIO_VOLTAGE, \
0721 .channel = index, \
0722 .info_mask_separate = mask | BIT(IIO_CHAN_INFO_SCALE), \
0723 .datasheet_name = "CH##index", \
0724 .indexed = 1, \
0725 }
0726
0727 static const struct iio_chan_spec sc27xx_channels[] = {
0728 SC27XX_ADC_CHANNEL(0, BIT(IIO_CHAN_INFO_PROCESSED)),
0729 SC27XX_ADC_CHANNEL(1, BIT(IIO_CHAN_INFO_PROCESSED)),
0730 SC27XX_ADC_CHANNEL(2, BIT(IIO_CHAN_INFO_PROCESSED)),
0731 SC27XX_ADC_CHANNEL(3, BIT(IIO_CHAN_INFO_PROCESSED)),
0732 SC27XX_ADC_CHANNEL(4, BIT(IIO_CHAN_INFO_PROCESSED)),
0733 SC27XX_ADC_CHANNEL(5, BIT(IIO_CHAN_INFO_PROCESSED)),
0734 SC27XX_ADC_CHANNEL(6, BIT(IIO_CHAN_INFO_PROCESSED)),
0735 SC27XX_ADC_CHANNEL(7, BIT(IIO_CHAN_INFO_PROCESSED)),
0736 SC27XX_ADC_CHANNEL(8, BIT(IIO_CHAN_INFO_PROCESSED)),
0737 SC27XX_ADC_CHANNEL(9, BIT(IIO_CHAN_INFO_PROCESSED)),
0738 SC27XX_ADC_CHANNEL(10, BIT(IIO_CHAN_INFO_PROCESSED)),
0739 SC27XX_ADC_CHANNEL(11, BIT(IIO_CHAN_INFO_PROCESSED)),
0740 SC27XX_ADC_CHANNEL(12, BIT(IIO_CHAN_INFO_PROCESSED)),
0741 SC27XX_ADC_CHANNEL(13, BIT(IIO_CHAN_INFO_PROCESSED)),
0742 SC27XX_ADC_CHANNEL(14, BIT(IIO_CHAN_INFO_PROCESSED)),
0743 SC27XX_ADC_CHANNEL(15, BIT(IIO_CHAN_INFO_PROCESSED)),
0744 SC27XX_ADC_CHANNEL(16, BIT(IIO_CHAN_INFO_PROCESSED)),
0745 SC27XX_ADC_CHANNEL(17, BIT(IIO_CHAN_INFO_PROCESSED)),
0746 SC27XX_ADC_CHANNEL(18, BIT(IIO_CHAN_INFO_PROCESSED)),
0747 SC27XX_ADC_CHANNEL(19, BIT(IIO_CHAN_INFO_PROCESSED)),
0748 SC27XX_ADC_CHANNEL(20, BIT(IIO_CHAN_INFO_RAW)),
0749 SC27XX_ADC_CHANNEL(21, BIT(IIO_CHAN_INFO_PROCESSED)),
0750 SC27XX_ADC_CHANNEL(22, BIT(IIO_CHAN_INFO_PROCESSED)),
0751 SC27XX_ADC_CHANNEL(23, BIT(IIO_CHAN_INFO_PROCESSED)),
0752 SC27XX_ADC_CHANNEL(24, BIT(IIO_CHAN_INFO_PROCESSED)),
0753 SC27XX_ADC_CHANNEL(25, BIT(IIO_CHAN_INFO_PROCESSED)),
0754 SC27XX_ADC_CHANNEL(26, BIT(IIO_CHAN_INFO_PROCESSED)),
0755 SC27XX_ADC_CHANNEL(27, BIT(IIO_CHAN_INFO_PROCESSED)),
0756 SC27XX_ADC_CHANNEL(28, BIT(IIO_CHAN_INFO_PROCESSED)),
0757 SC27XX_ADC_CHANNEL(29, BIT(IIO_CHAN_INFO_PROCESSED)),
0758 SC27XX_ADC_CHANNEL(30, BIT(IIO_CHAN_INFO_PROCESSED)),
0759 SC27XX_ADC_CHANNEL(31, BIT(IIO_CHAN_INFO_PROCESSED)),
0760 };
0761
0762 static int sc27xx_adc_enable(struct sc27xx_adc_data *data)
0763 {
0764 int ret;
0765
0766 ret = regmap_update_bits(data->regmap, data->var_data->module_en,
0767 SC27XX_MODULE_ADC_EN, SC27XX_MODULE_ADC_EN);
0768 if (ret)
0769 return ret;
0770
0771
0772 ret = regmap_update_bits(data->regmap, data->var_data->clk_en,
0773 SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN,
0774 SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN);
0775 if (ret)
0776 goto disable_adc;
0777
0778
0779 ret = sc27xx_adc_scale_calibration(data, true);
0780 if (ret)
0781 goto disable_clk;
0782
0783 ret = sc27xx_adc_scale_calibration(data, false);
0784 if (ret)
0785 goto disable_clk;
0786
0787 return 0;
0788
0789 disable_clk:
0790 regmap_update_bits(data->regmap, data->var_data->clk_en,
0791 SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN, 0);
0792 disable_adc:
0793 regmap_update_bits(data->regmap, data->var_data->module_en,
0794 SC27XX_MODULE_ADC_EN, 0);
0795
0796 return ret;
0797 }
0798
0799 static void sc27xx_adc_disable(void *_data)
0800 {
0801 struct sc27xx_adc_data *data = _data;
0802
0803
0804 regmap_update_bits(data->regmap, data->var_data->clk_en,
0805 SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN, 0);
0806
0807 regmap_update_bits(data->regmap, data->var_data->module_en,
0808 SC27XX_MODULE_ADC_EN, 0);
0809 }
0810
0811 static const struct sc27xx_adc_variant_data sc2731_data = {
0812 .module_en = SC2731_MODULE_EN,
0813 .clk_en = SC2731_ARM_CLK_EN,
0814 .scale_shift = SC27XX_ADC_SCALE_SHIFT,
0815 .scale_mask = SC27XX_ADC_SCALE_MASK,
0816 .bscale_cal = &sc2731_big_scale_graph_calib,
0817 .sscale_cal = &sc2731_small_scale_graph_calib,
0818 .init_scale = sc2731_adc_scale_init,
0819 .get_ratio = sc2731_adc_get_ratio,
0820 .set_volref = false,
0821 };
0822
0823 static const struct sc27xx_adc_variant_data sc2730_data = {
0824 .module_en = SC2730_MODULE_EN,
0825 .clk_en = SC2730_ARM_CLK_EN,
0826 .scale_shift = SC27XX_ADC_SCALE_SHIFT,
0827 .scale_mask = SC27XX_ADC_SCALE_MASK,
0828 .bscale_cal = &big_scale_graph_calib,
0829 .sscale_cal = &small_scale_graph_calib,
0830 .init_scale = sc2730_adc_scale_init,
0831 .get_ratio = sc2730_adc_get_ratio,
0832 .set_volref = false,
0833 };
0834
0835 static const struct sc27xx_adc_variant_data sc2721_data = {
0836 .module_en = SC2731_MODULE_EN,
0837 .clk_en = SC2721_ARM_CLK_EN,
0838 .scale_shift = SC2721_ADC_SCALE_SHIFT,
0839 .scale_mask = SC2721_ADC_SCALE_MASK,
0840 .bscale_cal = &sc2731_big_scale_graph_calib,
0841 .sscale_cal = &sc2731_small_scale_graph_calib,
0842 .init_scale = sc2731_adc_scale_init,
0843 .get_ratio = sc2721_adc_get_ratio,
0844 .set_volref = true,
0845 };
0846
0847 static const struct sc27xx_adc_variant_data sc2720_data = {
0848 .module_en = SC2731_MODULE_EN,
0849 .clk_en = SC2721_ARM_CLK_EN,
0850 .scale_shift = SC27XX_ADC_SCALE_SHIFT,
0851 .scale_mask = SC27XX_ADC_SCALE_MASK,
0852 .bscale_cal = &big_scale_graph_calib,
0853 .sscale_cal = &small_scale_graph_calib,
0854 .init_scale = sc2720_adc_scale_init,
0855 .get_ratio = sc2720_adc_get_ratio,
0856 .set_volref = false,
0857 };
0858
0859 static int sc27xx_adc_probe(struct platform_device *pdev)
0860 {
0861 struct device *dev = &pdev->dev;
0862 struct device_node *np = dev->of_node;
0863 struct sc27xx_adc_data *sc27xx_data;
0864 const struct sc27xx_adc_variant_data *pdata;
0865 struct iio_dev *indio_dev;
0866 int ret;
0867
0868 pdata = of_device_get_match_data(dev);
0869 if (!pdata) {
0870 dev_err(dev, "No matching driver data found\n");
0871 return -EINVAL;
0872 }
0873
0874 indio_dev = devm_iio_device_alloc(dev, sizeof(*sc27xx_data));
0875 if (!indio_dev)
0876 return -ENOMEM;
0877
0878 sc27xx_data = iio_priv(indio_dev);
0879
0880 sc27xx_data->regmap = dev_get_regmap(dev->parent, NULL);
0881 if (!sc27xx_data->regmap) {
0882 dev_err(dev, "failed to get ADC regmap\n");
0883 return -ENODEV;
0884 }
0885
0886 ret = of_property_read_u32(np, "reg", &sc27xx_data->base);
0887 if (ret) {
0888 dev_err(dev, "failed to get ADC base address\n");
0889 return ret;
0890 }
0891
0892 sc27xx_data->irq = platform_get_irq(pdev, 0);
0893 if (sc27xx_data->irq < 0)
0894 return sc27xx_data->irq;
0895
0896 ret = of_hwspin_lock_get_id(np, 0);
0897 if (ret < 0) {
0898 dev_err(dev, "failed to get hwspinlock id\n");
0899 return ret;
0900 }
0901
0902 sc27xx_data->hwlock = devm_hwspin_lock_request_specific(dev, ret);
0903 if (!sc27xx_data->hwlock) {
0904 dev_err(dev, "failed to request hwspinlock\n");
0905 return -ENXIO;
0906 }
0907
0908 sc27xx_data->dev = dev;
0909 if (pdata->set_volref) {
0910 sc27xx_data->volref = devm_regulator_get(dev, "vref");
0911 if (IS_ERR(sc27xx_data->volref)) {
0912 ret = PTR_ERR(sc27xx_data->volref);
0913 return dev_err_probe(dev, ret, "failed to get ADC volref\n");
0914 }
0915 }
0916
0917 sc27xx_data->var_data = pdata;
0918 sc27xx_data->var_data->init_scale(sc27xx_data);
0919
0920 ret = sc27xx_adc_enable(sc27xx_data);
0921 if (ret) {
0922 dev_err(dev, "failed to enable ADC module\n");
0923 return ret;
0924 }
0925
0926 ret = devm_add_action_or_reset(dev, sc27xx_adc_disable, sc27xx_data);
0927 if (ret) {
0928 dev_err(dev, "failed to add ADC disable action\n");
0929 return ret;
0930 }
0931
0932 indio_dev->name = dev_name(dev);
0933 indio_dev->modes = INDIO_DIRECT_MODE;
0934 indio_dev->info = &sc27xx_info;
0935 indio_dev->channels = sc27xx_channels;
0936 indio_dev->num_channels = ARRAY_SIZE(sc27xx_channels);
0937 ret = devm_iio_device_register(dev, indio_dev);
0938 if (ret)
0939 dev_err(dev, "could not register iio (ADC)");
0940
0941 return ret;
0942 }
0943
0944 static const struct of_device_id sc27xx_adc_of_match[] = {
0945 { .compatible = "sprd,sc2731-adc", .data = &sc2731_data},
0946 { .compatible = "sprd,sc2730-adc", .data = &sc2730_data},
0947 { .compatible = "sprd,sc2721-adc", .data = &sc2721_data},
0948 { .compatible = "sprd,sc2720-adc", .data = &sc2720_data},
0949 { }
0950 };
0951 MODULE_DEVICE_TABLE(of, sc27xx_adc_of_match);
0952
0953 static struct platform_driver sc27xx_adc_driver = {
0954 .probe = sc27xx_adc_probe,
0955 .driver = {
0956 .name = "sc27xx-adc",
0957 .of_match_table = sc27xx_adc_of_match,
0958 },
0959 };
0960
0961 module_platform_driver(sc27xx_adc_driver);
0962
0963 MODULE_AUTHOR("Freeman Liu <freeman.liu@spreadtrum.com>");
0964 MODULE_DESCRIPTION("Spreadtrum SC27XX ADC Driver");
0965 MODULE_LICENSE("GPL v2");