mcp4725.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /*
  2. * mcp4725.c - Support for Microchip MCP4725
  3. *
  4. * Copyright (C) 2012 Peter Meerwald <pmeerw@pmeerw.net>
  5. *
  6. * Based on max517 by Roland Stigge <stigge@antcom.de>
  7. *
  8. * This file is subject to the terms and conditions of version 2 of
  9. * the GNU General Public License. See the file COPYING in the main
  10. * directory of this archive for more details.
  11. *
  12. * driver for the Microchip I2C 12-bit digital-to-analog converter (DAC)
  13. * (7-bit I2C slave address 0x60, the three LSBs can be configured in
  14. * hardware)
  15. *
  16. * writing the DAC value to EEPROM is not supported
  17. */
  18. #include <linux/module.h>
  19. #include <linux/init.h>
  20. #include <linux/i2c.h>
  21. #include <linux/err.h>
  22. #include <linux/iio/iio.h>
  23. #include <linux/iio/sysfs.h>
  24. #include <linux/iio/dac/mcp4725.h>
  25. #define MCP4725_DRV_NAME "mcp4725"
  26. struct mcp4725_data {
  27. struct i2c_client *client;
  28. u16 vref_mv;
  29. u16 dac_value;
  30. };
  31. #ifdef CONFIG_PM_SLEEP
  32. static int mcp4725_suspend(struct device *dev)
  33. {
  34. u8 outbuf[2];
  35. outbuf[0] = 0x3 << 4; /* power-down bits, 500 kOhm resistor */
  36. outbuf[1] = 0;
  37. return i2c_master_send(to_i2c_client(dev), outbuf, 2);
  38. }
  39. static int mcp4725_resume(struct device *dev)
  40. {
  41. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  42. struct mcp4725_data *data = iio_priv(indio_dev);
  43. u8 outbuf[2];
  44. /* restore previous DAC value */
  45. outbuf[0] = (data->dac_value >> 8) & 0xf;
  46. outbuf[1] = data->dac_value & 0xff;
  47. return i2c_master_send(to_i2c_client(dev), outbuf, 2);
  48. }
  49. static SIMPLE_DEV_PM_OPS(mcp4725_pm_ops, mcp4725_suspend, mcp4725_resume);
  50. #define MCP4725_PM_OPS (&mcp4725_pm_ops)
  51. #else
  52. #define MCP4725_PM_OPS NULL
  53. #endif
  54. static const struct iio_chan_spec mcp4725_channel = {
  55. .type = IIO_VOLTAGE,
  56. .indexed = 1,
  57. .output = 1,
  58. .channel = 0,
  59. .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
  60. IIO_CHAN_INFO_SCALE_SHARED_BIT,
  61. .scan_type = IIO_ST('u', 12, 16, 0),
  62. };
  63. static int mcp4725_set_value(struct iio_dev *indio_dev, int val)
  64. {
  65. struct mcp4725_data *data = iio_priv(indio_dev);
  66. u8 outbuf[2];
  67. int ret;
  68. if (val >= (1 << 12) || val < 0)
  69. return -EINVAL;
  70. outbuf[0] = (val >> 8) & 0xf;
  71. outbuf[1] = val & 0xff;
  72. ret = i2c_master_send(data->client, outbuf, 2);
  73. if (ret < 0)
  74. return ret;
  75. else if (ret != 2)
  76. return -EIO;
  77. else
  78. return 0;
  79. }
  80. static int mcp4725_read_raw(struct iio_dev *indio_dev,
  81. struct iio_chan_spec const *chan,
  82. int *val, int *val2, long mask)
  83. {
  84. struct mcp4725_data *data = iio_priv(indio_dev);
  85. unsigned long scale_uv;
  86. switch (mask) {
  87. case IIO_CHAN_INFO_RAW:
  88. *val = data->dac_value;
  89. return IIO_VAL_INT;
  90. case IIO_CHAN_INFO_SCALE:
  91. scale_uv = (data->vref_mv * 1000) >> 12;
  92. *val = scale_uv / 1000000;
  93. *val2 = scale_uv % 1000000;
  94. return IIO_VAL_INT_PLUS_MICRO;
  95. }
  96. return -EINVAL;
  97. }
  98. static int mcp4725_write_raw(struct iio_dev *indio_dev,
  99. struct iio_chan_spec const *chan,
  100. int val, int val2, long mask)
  101. {
  102. struct mcp4725_data *data = iio_priv(indio_dev);
  103. int ret;
  104. switch (mask) {
  105. case IIO_CHAN_INFO_RAW:
  106. ret = mcp4725_set_value(indio_dev, val);
  107. data->dac_value = val;
  108. break;
  109. default:
  110. ret = -EINVAL;
  111. break;
  112. }
  113. return ret;
  114. }
  115. static const struct iio_info mcp4725_info = {
  116. .read_raw = mcp4725_read_raw,
  117. .write_raw = mcp4725_write_raw,
  118. .driver_module = THIS_MODULE,
  119. };
  120. static int mcp4725_probe(struct i2c_client *client,
  121. const struct i2c_device_id *id)
  122. {
  123. struct mcp4725_data *data;
  124. struct iio_dev *indio_dev;
  125. struct mcp4725_platform_data *platform_data = client->dev.platform_data;
  126. u8 inbuf[3];
  127. int err;
  128. if (!platform_data || !platform_data->vref_mv) {
  129. dev_err(&client->dev, "invalid platform data");
  130. err = -EINVAL;
  131. goto exit;
  132. }
  133. indio_dev = iio_device_alloc(sizeof(*data));
  134. if (indio_dev == NULL) {
  135. err = -ENOMEM;
  136. goto exit;
  137. }
  138. data = iio_priv(indio_dev);
  139. i2c_set_clientdata(client, indio_dev);
  140. data->client = client;
  141. indio_dev->dev.parent = &client->dev;
  142. indio_dev->info = &mcp4725_info;
  143. indio_dev->channels = &mcp4725_channel;
  144. indio_dev->num_channels = 1;
  145. indio_dev->modes = INDIO_DIRECT_MODE;
  146. data->vref_mv = platform_data->vref_mv;
  147. /* read current DAC value */
  148. err = i2c_master_recv(client, inbuf, 3);
  149. if (err < 0) {
  150. dev_err(&client->dev, "failed to read DAC value");
  151. goto exit_free_device;
  152. }
  153. data->dac_value = (inbuf[1] << 4) | (inbuf[2] >> 4);
  154. err = iio_device_register(indio_dev);
  155. if (err)
  156. goto exit_free_device;
  157. dev_info(&client->dev, "MCP4725 DAC registered\n");
  158. return 0;
  159. exit_free_device:
  160. iio_device_free(indio_dev);
  161. exit:
  162. return err;
  163. }
  164. static int mcp4725_remove(struct i2c_client *client)
  165. {
  166. struct iio_dev *indio_dev = i2c_get_clientdata(client);
  167. iio_device_unregister(indio_dev);
  168. iio_device_free(indio_dev);
  169. return 0;
  170. }
  171. static const struct i2c_device_id mcp4725_id[] = {
  172. { "mcp4725", 0 },
  173. { }
  174. };
  175. MODULE_DEVICE_TABLE(i2c, mcp4725_id);
  176. static struct i2c_driver mcp4725_driver = {
  177. .driver = {
  178. .name = MCP4725_DRV_NAME,
  179. .pm = MCP4725_PM_OPS,
  180. },
  181. .probe = mcp4725_probe,
  182. .remove = mcp4725_remove,
  183. .id_table = mcp4725_id,
  184. };
  185. module_i2c_driver(mcp4725_driver);
  186. MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>");
  187. MODULE_DESCRIPTION("MCP4725 12-bit DAC");
  188. MODULE_LICENSE("GPL");