max11205.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Maxim MAX11205 16-Bit Delta-Sigma ADC
  4. *
  5. * Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX1240-max11205.pdf
  6. * Copyright (C) 2022 Analog Devices, Inc.
  7. * Author: Ramona Bolboaca <[email protected]>
  8. */
  9. #include <linux/device.h>
  10. #include <linux/module.h>
  11. #include <linux/regulator/consumer.h>
  12. #include <linux/spi/spi.h>
  13. #include <linux/iio/iio.h>
  14. #include <linux/iio/adc/ad_sigma_delta.h>
  15. #define MAX11205_BIT_SCALE 15
  16. #define MAX11205A_OUT_DATA_RATE 116
  17. #define MAX11205B_OUT_DATA_RATE 13
  18. enum max11205_chip_type {
  19. TYPE_MAX11205A,
  20. TYPE_MAX11205B,
  21. };
  22. struct max11205_chip_info {
  23. unsigned int out_data_rate;
  24. const char *name;
  25. };
  26. struct max11205_state {
  27. const struct max11205_chip_info *chip_info;
  28. struct regulator *vref;
  29. struct ad_sigma_delta sd;
  30. };
  31. static const struct ad_sigma_delta_info max11205_sigma_delta_info = {
  32. .has_registers = false,
  33. };
  34. static int max11205_read_raw(struct iio_dev *indio_dev,
  35. struct iio_chan_spec const *chan,
  36. int *val, int *val2, long mask)
  37. {
  38. struct max11205_state *st = iio_priv(indio_dev);
  39. int reg_mv;
  40. switch (mask) {
  41. case IIO_CHAN_INFO_RAW:
  42. return ad_sigma_delta_single_conversion(indio_dev, chan, val);
  43. case IIO_CHAN_INFO_SCALE:
  44. reg_mv = regulator_get_voltage(st->vref);
  45. if (reg_mv < 0)
  46. return reg_mv;
  47. reg_mv /= 1000;
  48. *val = reg_mv;
  49. *val2 = MAX11205_BIT_SCALE;
  50. return IIO_VAL_FRACTIONAL_LOG2;
  51. case IIO_CHAN_INFO_SAMP_FREQ:
  52. *val = st->chip_info->out_data_rate;
  53. return IIO_VAL_INT;
  54. default:
  55. return -EINVAL;
  56. }
  57. }
  58. static const struct iio_info max11205_iio_info = {
  59. .read_raw = max11205_read_raw,
  60. .validate_trigger = ad_sd_validate_trigger,
  61. };
  62. static const struct iio_chan_spec max11205_channels[] = {
  63. {
  64. .type = IIO_VOLTAGE,
  65. .indexed = 1,
  66. .scan_type = {
  67. .sign = 's',
  68. .realbits = 16,
  69. .storagebits = 16,
  70. .endianness = IIO_BE,
  71. },
  72. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  73. BIT(IIO_CHAN_INFO_SAMP_FREQ) |
  74. BIT(IIO_CHAN_INFO_SCALE),
  75. },
  76. };
  77. static const struct max11205_chip_info max11205_chip_info[] = {
  78. [TYPE_MAX11205A] = {
  79. .out_data_rate = MAX11205A_OUT_DATA_RATE,
  80. .name = "max11205a",
  81. },
  82. [TYPE_MAX11205B] = {
  83. .out_data_rate = MAX11205B_OUT_DATA_RATE,
  84. .name = "max11205b",
  85. },
  86. };
  87. static void max11205_reg_disable(void *reg)
  88. {
  89. regulator_disable(reg);
  90. }
  91. static int max11205_probe(struct spi_device *spi)
  92. {
  93. struct max11205_state *st;
  94. struct iio_dev *indio_dev;
  95. int ret;
  96. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
  97. if (!indio_dev)
  98. return -ENOMEM;
  99. st = iio_priv(indio_dev);
  100. ad_sd_init(&st->sd, indio_dev, spi, &max11205_sigma_delta_info);
  101. st->chip_info = device_get_match_data(&spi->dev);
  102. if (!st->chip_info)
  103. st->chip_info =
  104. (const struct max11205_chip_info *)spi_get_device_id(spi)->driver_data;
  105. indio_dev->name = st->chip_info->name;
  106. indio_dev->modes = INDIO_DIRECT_MODE;
  107. indio_dev->channels = max11205_channels;
  108. indio_dev->num_channels = 1;
  109. indio_dev->info = &max11205_iio_info;
  110. st->vref = devm_regulator_get(&spi->dev, "vref");
  111. if (IS_ERR(st->vref))
  112. return dev_err_probe(&spi->dev, PTR_ERR(st->vref),
  113. "Failed to get vref regulator\n");
  114. ret = regulator_enable(st->vref);
  115. if (ret)
  116. return ret;
  117. ret = devm_add_action_or_reset(&spi->dev, max11205_reg_disable, st->vref);
  118. if (ret)
  119. return ret;
  120. ret = devm_ad_sd_setup_buffer_and_trigger(&spi->dev, indio_dev);
  121. if (ret)
  122. return ret;
  123. return devm_iio_device_register(&spi->dev, indio_dev);
  124. }
  125. static const struct spi_device_id max11205_spi_ids[] = {
  126. { "max11205a", (kernel_ulong_t)&max11205_chip_info[TYPE_MAX11205A] },
  127. { "max11205b", (kernel_ulong_t)&max11205_chip_info[TYPE_MAX11205B] },
  128. { }
  129. };
  130. MODULE_DEVICE_TABLE(spi, max11205_spi_ids);
  131. static const struct of_device_id max11205_dt_ids[] = {
  132. {
  133. .compatible = "maxim,max11205a",
  134. .data = &max11205_chip_info[TYPE_MAX11205A],
  135. },
  136. {
  137. .compatible = "maxim,max11205b",
  138. .data = &max11205_chip_info[TYPE_MAX11205B],
  139. },
  140. { }
  141. };
  142. MODULE_DEVICE_TABLE(of, max11205_dt_ids);
  143. static struct spi_driver max11205_spi_driver = {
  144. .driver = {
  145. .name = "max11205",
  146. .of_match_table = max11205_dt_ids,
  147. },
  148. .probe = max11205_probe,
  149. .id_table = max11205_spi_ids,
  150. };
  151. module_spi_driver(max11205_spi_driver);
  152. MODULE_AUTHOR("Ramona Bolboaca <[email protected]>");
  153. MODULE_DESCRIPTION("MAX11205 ADC driver");
  154. MODULE_LICENSE("GPL v2");
  155. MODULE_IMPORT_NS(IIO_AD_SIGMA_DELTA);