max5821.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * iio/dac/max5821.c
  4. * Copyright (C) 2014 Philippe Reynes
  5. */
  6. #include <linux/kernel.h>
  7. #include <linux/module.h>
  8. #include <linux/i2c.h>
  9. #include <linux/iio/iio.h>
  10. #include <linux/regulator/consumer.h>
  11. #define MAX5821_MAX_DAC_CHANNELS 2
  12. /* command bytes */
  13. #define MAX5821_LOAD_DAC_A_IN_REG_B 0x00
  14. #define MAX5821_LOAD_DAC_B_IN_REG_A 0x10
  15. #define MAX5821_EXTENDED_COMMAND_MODE 0xf0
  16. #define MAX5821_READ_DAC_A_COMMAND 0xf1
  17. #define MAX5821_READ_DAC_B_COMMAND 0xf2
  18. #define MAX5821_EXTENDED_POWER_UP 0x00
  19. #define MAX5821_EXTENDED_POWER_DOWN_MODE0 0x01
  20. #define MAX5821_EXTENDED_POWER_DOWN_MODE1 0x02
  21. #define MAX5821_EXTENDED_POWER_DOWN_MODE2 0x03
  22. #define MAX5821_EXTENDED_DAC_A 0x04
  23. #define MAX5821_EXTENDED_DAC_B 0x08
  24. enum max5821_device_ids {
  25. ID_MAX5821,
  26. };
  27. struct max5821_data {
  28. struct i2c_client *client;
  29. unsigned short vref_mv;
  30. bool powerdown[MAX5821_MAX_DAC_CHANNELS];
  31. u8 powerdown_mode[MAX5821_MAX_DAC_CHANNELS];
  32. struct mutex lock;
  33. };
  34. static const char * const max5821_powerdown_modes[] = {
  35. "three_state",
  36. "1kohm_to_gnd",
  37. "100kohm_to_gnd",
  38. };
  39. enum {
  40. MAX5821_THREE_STATE,
  41. MAX5821_1KOHM_TO_GND,
  42. MAX5821_100KOHM_TO_GND
  43. };
  44. static int max5821_get_powerdown_mode(struct iio_dev *indio_dev,
  45. const struct iio_chan_spec *chan)
  46. {
  47. struct max5821_data *st = iio_priv(indio_dev);
  48. return st->powerdown_mode[chan->channel];
  49. }
  50. static int max5821_set_powerdown_mode(struct iio_dev *indio_dev,
  51. const struct iio_chan_spec *chan,
  52. unsigned int mode)
  53. {
  54. struct max5821_data *st = iio_priv(indio_dev);
  55. st->powerdown_mode[chan->channel] = mode;
  56. return 0;
  57. }
  58. static const struct iio_enum max5821_powerdown_mode_enum = {
  59. .items = max5821_powerdown_modes,
  60. .num_items = ARRAY_SIZE(max5821_powerdown_modes),
  61. .get = max5821_get_powerdown_mode,
  62. .set = max5821_set_powerdown_mode,
  63. };
  64. static ssize_t max5821_read_dac_powerdown(struct iio_dev *indio_dev,
  65. uintptr_t private,
  66. const struct iio_chan_spec *chan,
  67. char *buf)
  68. {
  69. struct max5821_data *st = iio_priv(indio_dev);
  70. return sysfs_emit(buf, "%d\n", st->powerdown[chan->channel]);
  71. }
  72. static int max5821_sync_powerdown_mode(struct max5821_data *data,
  73. const struct iio_chan_spec *chan)
  74. {
  75. u8 outbuf[2];
  76. outbuf[0] = MAX5821_EXTENDED_COMMAND_MODE;
  77. if (chan->channel == 0)
  78. outbuf[1] = MAX5821_EXTENDED_DAC_A;
  79. else
  80. outbuf[1] = MAX5821_EXTENDED_DAC_B;
  81. if (data->powerdown[chan->channel])
  82. outbuf[1] |= data->powerdown_mode[chan->channel] + 1;
  83. else
  84. outbuf[1] |= MAX5821_EXTENDED_POWER_UP;
  85. return i2c_master_send(data->client, outbuf, 2);
  86. }
  87. static ssize_t max5821_write_dac_powerdown(struct iio_dev *indio_dev,
  88. uintptr_t private,
  89. const struct iio_chan_spec *chan,
  90. const char *buf, size_t len)
  91. {
  92. struct max5821_data *data = iio_priv(indio_dev);
  93. bool powerdown;
  94. int ret;
  95. ret = kstrtobool(buf, &powerdown);
  96. if (ret)
  97. return ret;
  98. data->powerdown[chan->channel] = powerdown;
  99. ret = max5821_sync_powerdown_mode(data, chan);
  100. if (ret < 0)
  101. return ret;
  102. return len;
  103. }
  104. static const struct iio_chan_spec_ext_info max5821_ext_info[] = {
  105. {
  106. .name = "powerdown",
  107. .read = max5821_read_dac_powerdown,
  108. .write = max5821_write_dac_powerdown,
  109. .shared = IIO_SEPARATE,
  110. },
  111. IIO_ENUM("powerdown_mode", IIO_SEPARATE, &max5821_powerdown_mode_enum),
  112. IIO_ENUM_AVAILABLE("powerdown_mode", IIO_SHARED_BY_TYPE, &max5821_powerdown_mode_enum),
  113. { }
  114. };
  115. #define MAX5821_CHANNEL(chan) { \
  116. .type = IIO_VOLTAGE, \
  117. .indexed = 1, \
  118. .output = 1, \
  119. .channel = (chan), \
  120. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  121. .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE), \
  122. .ext_info = max5821_ext_info, \
  123. }
  124. static const struct iio_chan_spec max5821_channels[] = {
  125. MAX5821_CHANNEL(0),
  126. MAX5821_CHANNEL(1)
  127. };
  128. static const u8 max5821_read_dac_command[] = {
  129. MAX5821_READ_DAC_A_COMMAND,
  130. MAX5821_READ_DAC_B_COMMAND
  131. };
  132. static const u8 max5821_load_dac_command[] = {
  133. MAX5821_LOAD_DAC_A_IN_REG_B,
  134. MAX5821_LOAD_DAC_B_IN_REG_A
  135. };
  136. static int max5821_get_value(struct iio_dev *indio_dev,
  137. int *val, int channel)
  138. {
  139. struct max5821_data *data = iio_priv(indio_dev);
  140. struct i2c_client *client = data->client;
  141. u8 outbuf[1];
  142. u8 inbuf[2];
  143. int ret;
  144. if ((channel != 0) && (channel != 1))
  145. return -EINVAL;
  146. outbuf[0] = max5821_read_dac_command[channel];
  147. mutex_lock(&data->lock);
  148. ret = i2c_master_send(client, outbuf, 1);
  149. if (ret < 0) {
  150. mutex_unlock(&data->lock);
  151. return ret;
  152. } else if (ret != 1) {
  153. mutex_unlock(&data->lock);
  154. return -EIO;
  155. }
  156. ret = i2c_master_recv(client, inbuf, 2);
  157. if (ret < 0) {
  158. mutex_unlock(&data->lock);
  159. return ret;
  160. } else if (ret != 2) {
  161. mutex_unlock(&data->lock);
  162. return -EIO;
  163. }
  164. mutex_unlock(&data->lock);
  165. *val = ((inbuf[0] & 0x0f) << 6) | (inbuf[1] >> 2);
  166. return IIO_VAL_INT;
  167. }
  168. static int max5821_set_value(struct iio_dev *indio_dev,
  169. int val, int channel)
  170. {
  171. struct max5821_data *data = iio_priv(indio_dev);
  172. struct i2c_client *client = data->client;
  173. u8 outbuf[2];
  174. int ret;
  175. if ((val < 0) || (val > 1023))
  176. return -EINVAL;
  177. if ((channel != 0) && (channel != 1))
  178. return -EINVAL;
  179. outbuf[0] = max5821_load_dac_command[channel];
  180. outbuf[0] |= val >> 6;
  181. outbuf[1] = (val & 0x3f) << 2;
  182. ret = i2c_master_send(client, outbuf, 2);
  183. if (ret < 0)
  184. return ret;
  185. else if (ret != 2)
  186. return -EIO;
  187. else
  188. return 0;
  189. }
  190. static int max5821_read_raw(struct iio_dev *indio_dev,
  191. struct iio_chan_spec const *chan,
  192. int *val, int *val2, long mask)
  193. {
  194. struct max5821_data *data = iio_priv(indio_dev);
  195. switch (mask) {
  196. case IIO_CHAN_INFO_RAW:
  197. return max5821_get_value(indio_dev, val, chan->channel);
  198. case IIO_CHAN_INFO_SCALE:
  199. *val = data->vref_mv;
  200. *val2 = 10;
  201. return IIO_VAL_FRACTIONAL_LOG2;
  202. default:
  203. return -EINVAL;
  204. }
  205. }
  206. static int max5821_write_raw(struct iio_dev *indio_dev,
  207. struct iio_chan_spec const *chan,
  208. int val, int val2, long mask)
  209. {
  210. if (val2 != 0)
  211. return -EINVAL;
  212. switch (mask) {
  213. case IIO_CHAN_INFO_RAW:
  214. return max5821_set_value(indio_dev, val, chan->channel);
  215. default:
  216. return -EINVAL;
  217. }
  218. }
  219. static int max5821_suspend(struct device *dev)
  220. {
  221. u8 outbuf[2] = { MAX5821_EXTENDED_COMMAND_MODE,
  222. MAX5821_EXTENDED_DAC_A |
  223. MAX5821_EXTENDED_DAC_B |
  224. MAX5821_EXTENDED_POWER_DOWN_MODE2 };
  225. return i2c_master_send(to_i2c_client(dev), outbuf, 2);
  226. }
  227. static int max5821_resume(struct device *dev)
  228. {
  229. u8 outbuf[2] = { MAX5821_EXTENDED_COMMAND_MODE,
  230. MAX5821_EXTENDED_DAC_A |
  231. MAX5821_EXTENDED_DAC_B |
  232. MAX5821_EXTENDED_POWER_UP };
  233. return i2c_master_send(to_i2c_client(dev), outbuf, 2);
  234. }
  235. static DEFINE_SIMPLE_DEV_PM_OPS(max5821_pm_ops, max5821_suspend,
  236. max5821_resume);
  237. static const struct iio_info max5821_info = {
  238. .read_raw = max5821_read_raw,
  239. .write_raw = max5821_write_raw,
  240. };
  241. static int max5821_probe(struct i2c_client *client)
  242. {
  243. const struct i2c_device_id *id = i2c_client_get_device_id(client);
  244. struct max5821_data *data;
  245. struct iio_dev *indio_dev;
  246. u32 tmp;
  247. int ret;
  248. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
  249. if (!indio_dev)
  250. return -ENOMEM;
  251. data = iio_priv(indio_dev);
  252. data->client = client;
  253. mutex_init(&data->lock);
  254. /* max5821 start in powerdown mode 100Kohm to ground */
  255. for (tmp = 0; tmp < MAX5821_MAX_DAC_CHANNELS; tmp++) {
  256. data->powerdown[tmp] = true;
  257. data->powerdown_mode[tmp] = MAX5821_100KOHM_TO_GND;
  258. }
  259. ret = devm_regulator_get_enable_read_voltage(&client->dev, "vref");
  260. if (ret)
  261. return dev_err_probe(&client->dev, ret,
  262. "Failed to get vref regulator voltage\n");
  263. data->vref_mv = ret / 1000;
  264. indio_dev->name = id->name;
  265. indio_dev->num_channels = ARRAY_SIZE(max5821_channels);
  266. indio_dev->channels = max5821_channels;
  267. indio_dev->modes = INDIO_DIRECT_MODE;
  268. indio_dev->info = &max5821_info;
  269. return devm_iio_device_register(&client->dev, indio_dev);
  270. }
  271. static const struct i2c_device_id max5821_id[] = {
  272. { "max5821", ID_MAX5821 },
  273. { }
  274. };
  275. MODULE_DEVICE_TABLE(i2c, max5821_id);
  276. static const struct of_device_id max5821_of_match[] = {
  277. { .compatible = "maxim,max5821" },
  278. { }
  279. };
  280. MODULE_DEVICE_TABLE(of, max5821_of_match);
  281. static struct i2c_driver max5821_driver = {
  282. .driver = {
  283. .name = "max5821",
  284. .of_match_table = max5821_of_match,
  285. .pm = pm_sleep_ptr(&max5821_pm_ops),
  286. },
  287. .probe = max5821_probe,
  288. .id_table = max5821_id,
  289. };
  290. module_i2c_driver(max5821_driver);
  291. MODULE_AUTHOR("Philippe Reynes <tremyfr@yahoo.fr>");
  292. MODULE_DESCRIPTION("MAX5821 DAC");
  293. MODULE_LICENSE("GPL v2");