mcp3021.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /*
  2. * mcp3021.c - driver for Microchip MCP3021 and MCP3221
  3. *
  4. * Copyright (C) 2008-2009, 2012 Freescale Semiconductor, Inc.
  5. * Author: Mingkai Hu <Mingkai.hu@freescale.com>
  6. * Reworked by Sven Schuchmann <schuchmann@schleissheimer.de>
  7. * DT support added by Clemens Gruber <clemens.gruber@pqgruber.com>
  8. *
  9. * This driver export the value of analog input voltage to sysfs, the
  10. * voltage unit is mV. Through the sysfs interface, lm-sensors tool
  11. * can also display the input voltage.
  12. *
  13. * This program is free software; you can redistribute it and/or modify
  14. * it under the terms of the GNU General Public License as published by
  15. * the Free Software Foundation; either version 2 of the License, or
  16. * (at your option) any later version.
  17. */
  18. #include <linux/kernel.h>
  19. #include <linux/module.h>
  20. #include <linux/hwmon.h>
  21. #include <linux/slab.h>
  22. #include <linux/i2c.h>
  23. #include <linux/err.h>
  24. #include <linux/device.h>
  25. #include <linux/of.h>
  26. #include <linux/of_device.h>
  27. /* Vdd / reference voltage in millivolt */
  28. #define MCP3021_VDD_REF_MAX 5500
  29. #define MCP3021_VDD_REF_MIN 2700
  30. #define MCP3021_VDD_REF_DEFAULT 3300
  31. /* output format */
  32. #define MCP3021_SAR_SHIFT 2
  33. #define MCP3021_SAR_MASK 0x3ff
  34. #define MCP3021_OUTPUT_RES 10 /* 10-bit resolution */
  35. #define MCP3221_SAR_SHIFT 0
  36. #define MCP3221_SAR_MASK 0xfff
  37. #define MCP3221_OUTPUT_RES 12 /* 12-bit resolution */
  38. enum chips {
  39. mcp3021,
  40. mcp3221
  41. };
  42. /*
  43. * Client data (each client gets its own)
  44. */
  45. struct mcp3021_data {
  46. struct device *hwmon_dev;
  47. u32 vdd; /* supply and reference voltage in millivolt */
  48. u16 sar_shift;
  49. u16 sar_mask;
  50. u8 output_res;
  51. };
  52. static int mcp3021_read16(struct i2c_client *client)
  53. {
  54. struct mcp3021_data *data = i2c_get_clientdata(client);
  55. int ret;
  56. u16 reg;
  57. __be16 buf;
  58. ret = i2c_master_recv(client, (char *)&buf, 2);
  59. if (ret < 0)
  60. return ret;
  61. if (ret != 2)
  62. return -EIO;
  63. /* The output code of the MCP3021 is transmitted with MSB first. */
  64. reg = be16_to_cpu(buf);
  65. /*
  66. * The ten-bit output code is composed of the lower 4-bit of the
  67. * first byte and the upper 6-bit of the second byte.
  68. */
  69. reg = (reg >> data->sar_shift) & data->sar_mask;
  70. return reg;
  71. }
  72. static inline u16 volts_from_reg(struct mcp3021_data *data, u16 val)
  73. {
  74. return DIV_ROUND_CLOSEST(data->vdd * val, 1 << data->output_res);
  75. }
  76. static ssize_t in0_input_show(struct device *dev,
  77. struct device_attribute *attr, char *buf)
  78. {
  79. struct i2c_client *client = to_i2c_client(dev);
  80. struct mcp3021_data *data = i2c_get_clientdata(client);
  81. int reg, in_input;
  82. reg = mcp3021_read16(client);
  83. if (reg < 0)
  84. return reg;
  85. in_input = volts_from_reg(data, reg);
  86. return sprintf(buf, "%d\n", in_input);
  87. }
  88. static DEVICE_ATTR_RO(in0_input);
  89. static int mcp3021_probe(struct i2c_client *client,
  90. const struct i2c_device_id *id)
  91. {
  92. int err;
  93. struct mcp3021_data *data = NULL;
  94. struct device_node *np = client->dev.of_node;
  95. if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
  96. return -ENODEV;
  97. data = devm_kzalloc(&client->dev, sizeof(struct mcp3021_data),
  98. GFP_KERNEL);
  99. if (!data)
  100. return -ENOMEM;
  101. i2c_set_clientdata(client, data);
  102. if (np) {
  103. if (!of_property_read_u32(np, "reference-voltage-microvolt",
  104. &data->vdd))
  105. data->vdd /= 1000;
  106. else
  107. data->vdd = MCP3021_VDD_REF_DEFAULT;
  108. } else {
  109. u32 *pdata = dev_get_platdata(&client->dev);
  110. if (pdata)
  111. data->vdd = *pdata;
  112. else
  113. data->vdd = MCP3021_VDD_REF_DEFAULT;
  114. }
  115. switch (id->driver_data) {
  116. case mcp3021:
  117. data->sar_shift = MCP3021_SAR_SHIFT;
  118. data->sar_mask = MCP3021_SAR_MASK;
  119. data->output_res = MCP3021_OUTPUT_RES;
  120. break;
  121. case mcp3221:
  122. data->sar_shift = MCP3221_SAR_SHIFT;
  123. data->sar_mask = MCP3221_SAR_MASK;
  124. data->output_res = MCP3221_OUTPUT_RES;
  125. break;
  126. }
  127. if (data->vdd > MCP3021_VDD_REF_MAX || data->vdd < MCP3021_VDD_REF_MIN)
  128. return -EINVAL;
  129. err = sysfs_create_file(&client->dev.kobj, &dev_attr_in0_input.attr);
  130. if (err)
  131. return err;
  132. data->hwmon_dev = hwmon_device_register(&client->dev);
  133. if (IS_ERR(data->hwmon_dev)) {
  134. err = PTR_ERR(data->hwmon_dev);
  135. goto exit_remove;
  136. }
  137. return 0;
  138. exit_remove:
  139. sysfs_remove_file(&client->dev.kobj, &dev_attr_in0_input.attr);
  140. return err;
  141. }
  142. static int mcp3021_remove(struct i2c_client *client)
  143. {
  144. struct mcp3021_data *data = i2c_get_clientdata(client);
  145. hwmon_device_unregister(data->hwmon_dev);
  146. sysfs_remove_file(&client->dev.kobj, &dev_attr_in0_input.attr);
  147. return 0;
  148. }
  149. static const struct i2c_device_id mcp3021_id[] = {
  150. { "mcp3021", mcp3021 },
  151. { "mcp3221", mcp3221 },
  152. { }
  153. };
  154. MODULE_DEVICE_TABLE(i2c, mcp3021_id);
  155. #ifdef CONFIG_OF
  156. static const struct of_device_id of_mcp3021_match[] = {
  157. { .compatible = "microchip,mcp3021", .data = (void *)mcp3021 },
  158. { .compatible = "microchip,mcp3221", .data = (void *)mcp3221 },
  159. { }
  160. };
  161. MODULE_DEVICE_TABLE(of, of_mcp3021_match);
  162. #endif
  163. static struct i2c_driver mcp3021_driver = {
  164. .driver = {
  165. .name = "mcp3021",
  166. .of_match_table = of_match_ptr(of_mcp3021_match),
  167. },
  168. .probe = mcp3021_probe,
  169. .remove = mcp3021_remove,
  170. .id_table = mcp3021_id,
  171. };
  172. module_i2c_driver(mcp3021_driver);
  173. MODULE_AUTHOR("Mingkai Hu <Mingkai.hu@freescale.com>");
  174. MODULE_DESCRIPTION("Microchip MCP3021/MCP3221 driver");
  175. MODULE_LICENSE("GPL");