max77541-adc.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 2022 Analog Devices, Inc.
  4. * ADI MAX77541 ADC Driver with IIO interface
  5. */
  6. #include <linux/bitfield.h>
  7. #include <linux/iio/iio.h>
  8. #include <linux/mod_devicetable.h>
  9. #include <linux/platform_device.h>
  10. #include <linux/regmap.h>
  11. #include <linux/units.h>
  12. #include <linux/mfd/max77541.h>
  13. enum max77541_adc_range {
  14. LOW_RANGE,
  15. MID_RANGE,
  16. HIGH_RANGE,
  17. };
  18. enum max77541_adc_channel {
  19. MAX77541_ADC_VSYS_V,
  20. MAX77541_ADC_VOUT1_V,
  21. MAX77541_ADC_VOUT2_V,
  22. MAX77541_ADC_TEMP,
  23. };
  24. static int max77541_adc_offset(struct iio_dev *indio_dev,
  25. struct iio_chan_spec const *chan,
  26. int *val, int *val2)
  27. {
  28. switch (chan->channel) {
  29. case MAX77541_ADC_TEMP:
  30. *val = DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS, 1725);
  31. return IIO_VAL_INT;
  32. default:
  33. return -EINVAL;
  34. }
  35. }
  36. static int max77541_adc_scale(struct iio_dev *indio_dev,
  37. struct iio_chan_spec const *chan,
  38. int *val, int *val2)
  39. {
  40. struct regmap **regmap = iio_priv(indio_dev);
  41. unsigned int reg_val;
  42. int ret;
  43. switch (chan->channel) {
  44. case MAX77541_ADC_VSYS_V:
  45. *val = 25;
  46. return IIO_VAL_INT;
  47. case MAX77541_ADC_VOUT1_V:
  48. case MAX77541_ADC_VOUT2_V:
  49. ret = regmap_read(*regmap, MAX77541_REG_M2_CFG1, &reg_val);
  50. if (ret)
  51. return ret;
  52. reg_val = FIELD_GET(MAX77541_BITS_MX_CFG1_RNG, reg_val);
  53. switch (reg_val) {
  54. case LOW_RANGE:
  55. *val = 6;
  56. *val2 = 250000;
  57. break;
  58. case MID_RANGE:
  59. *val = 12;
  60. *val2 = 500000;
  61. break;
  62. case HIGH_RANGE:
  63. *val = 25;
  64. return IIO_VAL_INT;
  65. default:
  66. return -EINVAL;
  67. }
  68. return IIO_VAL_INT_PLUS_MICRO;
  69. case MAX77541_ADC_TEMP:
  70. *val = 1725;
  71. return IIO_VAL_INT;
  72. default:
  73. return -EINVAL;
  74. }
  75. }
  76. static int max77541_adc_raw(struct iio_dev *indio_dev,
  77. struct iio_chan_spec const *chan,
  78. int *val)
  79. {
  80. struct regmap **regmap = iio_priv(indio_dev);
  81. int ret;
  82. ret = regmap_read(*regmap, chan->address, val);
  83. if (ret)
  84. return ret;
  85. return IIO_VAL_INT;
  86. }
  87. #define MAX77541_ADC_CHANNEL_V(_channel, _name, _type, _reg) \
  88. { \
  89. .type = _type, \
  90. .indexed = 1, \
  91. .channel = _channel, \
  92. .address = _reg, \
  93. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  94. BIT(IIO_CHAN_INFO_SCALE), \
  95. .datasheet_name = _name, \
  96. }
  97. #define MAX77541_ADC_CHANNEL_TEMP(_channel, _name, _type, _reg) \
  98. { \
  99. .type = _type, \
  100. .indexed = 1, \
  101. .channel = _channel, \
  102. .address = _reg, \
  103. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  104. BIT(IIO_CHAN_INFO_SCALE) |\
  105. BIT(IIO_CHAN_INFO_OFFSET),\
  106. .datasheet_name = _name, \
  107. }
  108. static const struct iio_chan_spec max77541_adc_channels[] = {
  109. MAX77541_ADC_CHANNEL_V(MAX77541_ADC_VSYS_V, "vsys_v", IIO_VOLTAGE,
  110. MAX77541_REG_ADC_DATA_CH1),
  111. MAX77541_ADC_CHANNEL_V(MAX77541_ADC_VOUT1_V, "vout1_v", IIO_VOLTAGE,
  112. MAX77541_REG_ADC_DATA_CH2),
  113. MAX77541_ADC_CHANNEL_V(MAX77541_ADC_VOUT2_V, "vout2_v", IIO_VOLTAGE,
  114. MAX77541_REG_ADC_DATA_CH3),
  115. MAX77541_ADC_CHANNEL_TEMP(MAX77541_ADC_TEMP, "temp", IIO_TEMP,
  116. MAX77541_REG_ADC_DATA_CH6),
  117. };
  118. static int max77541_adc_read_raw(struct iio_dev *indio_dev,
  119. struct iio_chan_spec const *chan,
  120. int *val, int *val2, long mask)
  121. {
  122. switch (mask) {
  123. case IIO_CHAN_INFO_OFFSET:
  124. return max77541_adc_offset(indio_dev, chan, val, val2);
  125. case IIO_CHAN_INFO_SCALE:
  126. return max77541_adc_scale(indio_dev, chan, val, val2);
  127. case IIO_CHAN_INFO_RAW:
  128. return max77541_adc_raw(indio_dev, chan, val);
  129. default:
  130. return -EINVAL;
  131. }
  132. }
  133. static const struct iio_info max77541_adc_info = {
  134. .read_raw = max77541_adc_read_raw,
  135. };
  136. static int max77541_adc_probe(struct platform_device *pdev)
  137. {
  138. struct device *dev = &pdev->dev;
  139. struct iio_dev *indio_dev;
  140. struct regmap **regmap;
  141. indio_dev = devm_iio_device_alloc(dev, sizeof(*regmap));
  142. if (!indio_dev)
  143. return -ENOMEM;
  144. regmap = iio_priv(indio_dev);
  145. *regmap = dev_get_regmap(dev->parent, NULL);
  146. indio_dev->modes = INDIO_DIRECT_MODE;
  147. indio_dev->name = "max77541";
  148. indio_dev->info = &max77541_adc_info;
  149. indio_dev->channels = max77541_adc_channels;
  150. indio_dev->num_channels = ARRAY_SIZE(max77541_adc_channels);
  151. return devm_iio_device_register(dev, indio_dev);
  152. }
  153. static const struct platform_device_id max77541_adc_platform_id[] = {
  154. { "max77541-adc" },
  155. { /* sentinel */ }
  156. };
  157. MODULE_DEVICE_TABLE(platform, max77541_adc_platform_id);
  158. static struct platform_driver max77541_adc_driver = {
  159. .driver = {
  160. .name = "max77541-adc",
  161. },
  162. .probe = max77541_adc_probe,
  163. .id_table = max77541_adc_platform_id,
  164. };
  165. module_platform_driver(max77541_adc_driver);
  166. MODULE_AUTHOR("Okan Sahin <Okan.Sahin@analog.com>");
  167. MODULE_DESCRIPTION("MAX77541 ADC driver");
  168. MODULE_LICENSE("GPL");