max517.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * max517.c - Support for Maxim MAX517, MAX518 and MAX519
  4. *
  5. * Copyright (C) 2010, 2011 Roland Stigge <stigge@antcom.de>
  6. */
  7. #include <linux/module.h>
  8. #include <linux/slab.h>
  9. #include <linux/jiffies.h>
  10. #include <linux/i2c.h>
  11. #include <linux/err.h>
  12. #include <linux/iio/iio.h>
  13. #include <linux/iio/sysfs.h>
  14. #include <linux/iio/dac/max517.h>
  15. /* Commands */
  16. #define COMMAND_CHANNEL0 0x00
  17. #define COMMAND_CHANNEL1 0x01 /* for MAX518 and MAX519 */
  18. #define COMMAND_PD 0x08 /* Power Down */
  19. enum max517_device_ids {
  20. ID_MAX517,
  21. ID_MAX518,
  22. ID_MAX519,
  23. ID_MAX520,
  24. ID_MAX521,
  25. };
  26. struct max517_data {
  27. struct i2c_client *client;
  28. unsigned short vref_mv[8];
  29. };
  30. /*
  31. * channel: bit 0: channel 1
  32. * bit 1: channel 2
  33. * (this way, it's possible to set both channels at once)
  34. */
  35. static int max517_set_value(struct iio_dev *indio_dev,
  36. long val, int channel)
  37. {
  38. struct max517_data *data = iio_priv(indio_dev);
  39. struct i2c_client *client = data->client;
  40. u8 outbuf[2];
  41. int res;
  42. if (val < 0 || val > 255)
  43. return -EINVAL;
  44. outbuf[0] = channel;
  45. outbuf[1] = val;
  46. res = i2c_master_send(client, outbuf, 2);
  47. if (res < 0)
  48. return res;
  49. else if (res != 2)
  50. return -EIO;
  51. else
  52. return 0;
  53. }
  54. static int max517_read_raw(struct iio_dev *indio_dev,
  55. struct iio_chan_spec const *chan,
  56. int *val,
  57. int *val2,
  58. long m)
  59. {
  60. struct max517_data *data = iio_priv(indio_dev);
  61. switch (m) {
  62. case IIO_CHAN_INFO_SCALE:
  63. /* Corresponds to Vref / 2^(bits) */
  64. *val = data->vref_mv[chan->channel];
  65. *val2 = 8;
  66. return IIO_VAL_FRACTIONAL_LOG2;
  67. default:
  68. break;
  69. }
  70. return -EINVAL;
  71. }
  72. static int max517_write_raw(struct iio_dev *indio_dev,
  73. struct iio_chan_spec const *chan, int val, int val2, long mask)
  74. {
  75. int ret;
  76. switch (mask) {
  77. case IIO_CHAN_INFO_RAW:
  78. ret = max517_set_value(indio_dev, val, chan->channel);
  79. break;
  80. default:
  81. ret = -EINVAL;
  82. break;
  83. }
  84. return ret;
  85. }
  86. static int max517_suspend(struct device *dev)
  87. {
  88. u8 outbuf = COMMAND_PD;
  89. return i2c_master_send(to_i2c_client(dev), &outbuf, 1);
  90. }
  91. static int max517_resume(struct device *dev)
  92. {
  93. u8 outbuf = 0;
  94. return i2c_master_send(to_i2c_client(dev), &outbuf, 1);
  95. }
  96. static DEFINE_SIMPLE_DEV_PM_OPS(max517_pm_ops, max517_suspend, max517_resume);
  97. static const struct iio_info max517_info = {
  98. .read_raw = max517_read_raw,
  99. .write_raw = max517_write_raw,
  100. };
  101. #define MAX517_CHANNEL(chan) { \
  102. .type = IIO_VOLTAGE, \
  103. .indexed = 1, \
  104. .output = 1, \
  105. .channel = (chan), \
  106. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  107. BIT(IIO_CHAN_INFO_SCALE), \
  108. }
  109. static const struct iio_chan_spec max517_channels[] = {
  110. MAX517_CHANNEL(0),
  111. MAX517_CHANNEL(1),
  112. MAX517_CHANNEL(2),
  113. MAX517_CHANNEL(3),
  114. MAX517_CHANNEL(4),
  115. MAX517_CHANNEL(5),
  116. MAX517_CHANNEL(6),
  117. MAX517_CHANNEL(7),
  118. };
  119. static int max517_probe(struct i2c_client *client)
  120. {
  121. const struct max517_platform_data *platform_data = dev_get_platdata(&client->dev);
  122. const struct i2c_device_id *id = i2c_client_get_device_id(client);
  123. struct max517_data *data;
  124. struct iio_dev *indio_dev;
  125. int chan;
  126. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
  127. if (!indio_dev)
  128. return -ENOMEM;
  129. data = iio_priv(indio_dev);
  130. data->client = client;
  131. switch (id->driver_data) {
  132. case ID_MAX521:
  133. indio_dev->num_channels = 8;
  134. break;
  135. case ID_MAX520:
  136. indio_dev->num_channels = 4;
  137. break;
  138. case ID_MAX519:
  139. case ID_MAX518:
  140. indio_dev->num_channels = 2;
  141. break;
  142. default: /* single channel for MAX517 */
  143. indio_dev->num_channels = 1;
  144. break;
  145. }
  146. indio_dev->channels = max517_channels;
  147. indio_dev->modes = INDIO_DIRECT_MODE;
  148. indio_dev->info = &max517_info;
  149. /*
  150. * Reference voltage on MAX518 and default is 5V, else take vref_mv
  151. * from platform_data
  152. */
  153. for (chan = 0; chan < indio_dev->num_channels; chan++) {
  154. if (id->driver_data == ID_MAX518 || !platform_data)
  155. data->vref_mv[chan] = 5000; /* mV */
  156. else
  157. data->vref_mv[chan] = platform_data->vref_mv[chan];
  158. }
  159. return devm_iio_device_register(&client->dev, indio_dev);
  160. }
  161. static const struct i2c_device_id max517_id[] = {
  162. { "max517", ID_MAX517 },
  163. { "max518", ID_MAX518 },
  164. { "max519", ID_MAX519 },
  165. { "max520", ID_MAX520 },
  166. { "max521", ID_MAX521 },
  167. { }
  168. };
  169. MODULE_DEVICE_TABLE(i2c, max517_id);
  170. static struct i2c_driver max517_driver = {
  171. .driver = {
  172. .name = "max517",
  173. .pm = pm_sleep_ptr(&max517_pm_ops),
  174. },
  175. .probe = max517_probe,
  176. .id_table = max517_id,
  177. };
  178. module_i2c_driver(max517_driver);
  179. MODULE_AUTHOR("Roland Stigge <stigge@antcom.de>");
  180. MODULE_DESCRIPTION("MAX517/518/519/520/521 8-bit DAC");
  181. MODULE_LICENSE("GPL");