lm87.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  1. /*
  2. * lm87.c
  3. *
  4. * Copyright (C) 2000 Frodo Looijaard <frodol@dds.nl>
  5. * Philip Edelbrock <phil@netroedge.com>
  6. * Stephen Rousset <stephen.rousset@rocketlogix.com>
  7. * Dan Eaton <dan.eaton@rocketlogix.com>
  8. * Copyright (C) 2004-2008 Jean Delvare <khali@linux-fr.org>
  9. *
  10. * Original port to Linux 2.6 by Jeff Oliver.
  11. *
  12. * The LM87 is a sensor chip made by National Semiconductor. It monitors up
  13. * to 8 voltages (including its own power source), up to three temperatures
  14. * (its own plus up to two external ones) and up to two fans. The default
  15. * configuration is 6 voltages, two temperatures and two fans (see below).
  16. * Voltages are scaled internally with ratios such that the nominal value of
  17. * each voltage correspond to a register value of 192 (which means a
  18. * resolution of about 0.5% of the nominal value). Temperature values are
  19. * reported with a 1 deg resolution and a 3-4 deg accuracy. Complete
  20. * datasheet can be obtained from National's website at:
  21. * http://www.national.com/pf/LM/LM87.html
  22. *
  23. * Some functions share pins, so not all functions are available at the same
  24. * time. Which are depends on the hardware setup. This driver normally
  25. * assumes that firmware configured the chip correctly. Where this is not
  26. * the case, platform code must set the I2C client's platform_data to point
  27. * to a u8 value to be written to the channel register.
  28. * For reference, here is the list of exclusive functions:
  29. * - in0+in5 (default) or temp3
  30. * - fan1 (default) or in6
  31. * - fan2 (default) or in7
  32. * - VID lines (default) or IRQ lines (not handled by this driver)
  33. *
  34. * The LM87 additionally features an analog output, supposedly usable to
  35. * control the speed of a fan. All new chips use pulse width modulation
  36. * instead. The LM87 is the only hardware monitoring chipset I know of
  37. * which uses amplitude modulation. Be careful when using this feature.
  38. *
  39. * This driver also supports the ADM1024, a sensor chip made by Analog
  40. * Devices. That chip is fully compatible with the LM87. Complete
  41. * datasheet can be obtained from Analog's website at:
  42. * http://www.analog.com/en/prod/0,2877,ADM1024,00.html
  43. *
  44. * This program is free software; you can redistribute it and/or modify
  45. * it under the terms of the GNU General Public License as published by
  46. * the Free Software Foundation; either version 2 of the License, or
  47. * (at your option) any later version.
  48. *
  49. * This program is distributed in the hope that it will be useful,
  50. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  51. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  52. * GNU General Public License for more details.
  53. *
  54. * You should have received a copy of the GNU General Public License
  55. * along with this program; if not, write to the Free Software
  56. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  57. */
  58. #include <linux/module.h>
  59. #include <linux/init.h>
  60. #include <linux/slab.h>
  61. #include <linux/jiffies.h>
  62. #include <linux/i2c.h>
  63. #include <linux/hwmon.h>
  64. #include <linux/hwmon-sysfs.h>
  65. #include <linux/hwmon-vid.h>
  66. #include <linux/err.h>
  67. #include <linux/mutex.h>
  68. /*
  69. * Addresses to scan
  70. * LM87 has three possible addresses: 0x2c, 0x2d and 0x2e.
  71. */
  72. static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END };
  73. enum chips { lm87, adm1024 };
  74. /*
  75. * The LM87 registers
  76. */
  77. /* nr in 0..5 */
  78. #define LM87_REG_IN(nr) (0x20 + (nr))
  79. #define LM87_REG_IN_MAX(nr) (0x2B + (nr) * 2)
  80. #define LM87_REG_IN_MIN(nr) (0x2C + (nr) * 2)
  81. /* nr in 0..1 */
  82. #define LM87_REG_AIN(nr) (0x28 + (nr))
  83. #define LM87_REG_AIN_MIN(nr) (0x1A + (nr))
  84. #define LM87_REG_AIN_MAX(nr) (0x3B + (nr))
  85. static u8 LM87_REG_TEMP[3] = { 0x27, 0x26, 0x20 };
  86. static u8 LM87_REG_TEMP_HIGH[3] = { 0x39, 0x37, 0x2B };
  87. static u8 LM87_REG_TEMP_LOW[3] = { 0x3A, 0x38, 0x2C };
  88. #define LM87_REG_TEMP_HW_INT_LOCK 0x13
  89. #define LM87_REG_TEMP_HW_EXT_LOCK 0x14
  90. #define LM87_REG_TEMP_HW_INT 0x17
  91. #define LM87_REG_TEMP_HW_EXT 0x18
  92. /* nr in 0..1 */
  93. #define LM87_REG_FAN(nr) (0x28 + (nr))
  94. #define LM87_REG_FAN_MIN(nr) (0x3B + (nr))
  95. #define LM87_REG_AOUT 0x19
  96. #define LM87_REG_CONFIG 0x40
  97. #define LM87_REG_CHANNEL_MODE 0x16
  98. #define LM87_REG_VID_FAN_DIV 0x47
  99. #define LM87_REG_VID4 0x49
  100. #define LM87_REG_ALARMS1 0x41
  101. #define LM87_REG_ALARMS2 0x42
  102. #define LM87_REG_COMPANY_ID 0x3E
  103. #define LM87_REG_REVISION 0x3F
  104. /*
  105. * Conversions and various macros
  106. * The LM87 uses signed 8-bit values for temperatures.
  107. */
  108. #define IN_FROM_REG(reg, scale) (((reg) * (scale) + 96) / 192)
  109. #define IN_TO_REG(val, scale) ((val) <= 0 ? 0 : \
  110. (val) * 192 >= (scale) * 255 ? 255 : \
  111. ((val) * 192 + (scale) / 2) / (scale))
  112. #define TEMP_FROM_REG(reg) ((reg) * 1000)
  113. #define TEMP_TO_REG(val) ((val) <= -127500 ? -128 : \
  114. (val) >= 126500 ? 127 : \
  115. (((val) < 0 ? (val) - 500 : \
  116. (val) + 500) / 1000))
  117. #define FAN_FROM_REG(reg, div) ((reg) == 255 || (reg) == 0 ? 0 : \
  118. (1350000 + (reg)*(div) / 2) / ((reg) * (div)))
  119. #define FAN_TO_REG(val, div) ((val) * (div) * 255 <= 1350000 ? 255 : \
  120. (1350000 + (val)*(div) / 2) / ((val) * (div)))
  121. #define FAN_DIV_FROM_REG(reg) (1 << (reg))
  122. /* analog out is 9.80mV/LSB */
  123. #define AOUT_FROM_REG(reg) (((reg) * 98 + 5) / 10)
  124. #define AOUT_TO_REG(val) ((val) <= 0 ? 0 : \
  125. (val) >= 2500 ? 255 : \
  126. ((val) * 10 + 49) / 98)
  127. /* nr in 0..1 */
  128. #define CHAN_NO_FAN(nr) (1 << (nr))
  129. #define CHAN_TEMP3 (1 << 2)
  130. #define CHAN_VCC_5V (1 << 3)
  131. #define CHAN_NO_VID (1 << 7)
  132. /*
  133. * Client data (each client gets its own)
  134. */
  135. struct lm87_data {
  136. struct device *hwmon_dev;
  137. struct mutex update_lock;
  138. char valid; /* zero until following fields are valid */
  139. unsigned long last_updated; /* In jiffies */
  140. u8 channel; /* register value */
  141. u8 config; /* original register value */
  142. u8 in[8]; /* register value */
  143. u8 in_max[8]; /* register value */
  144. u8 in_min[8]; /* register value */
  145. u16 in_scale[8];
  146. s8 temp[3]; /* register value */
  147. s8 temp_high[3]; /* register value */
  148. s8 temp_low[3]; /* register value */
  149. s8 temp_crit_int; /* min of two register values */
  150. s8 temp_crit_ext; /* min of two register values */
  151. u8 fan[2]; /* register value */
  152. u8 fan_min[2]; /* register value */
  153. u8 fan_div[2]; /* register value, shifted right */
  154. u8 aout; /* register value */
  155. u16 alarms; /* register values, combined */
  156. u8 vid; /* register values, combined */
  157. u8 vrm;
  158. };
  159. static inline int lm87_read_value(struct i2c_client *client, u8 reg)
  160. {
  161. return i2c_smbus_read_byte_data(client, reg);
  162. }
  163. static inline int lm87_write_value(struct i2c_client *client, u8 reg, u8 value)
  164. {
  165. return i2c_smbus_write_byte_data(client, reg, value);
  166. }
  167. static struct lm87_data *lm87_update_device(struct device *dev)
  168. {
  169. struct i2c_client *client = to_i2c_client(dev);
  170. struct lm87_data *data = i2c_get_clientdata(client);
  171. mutex_lock(&data->update_lock);
  172. if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
  173. int i, j;
  174. dev_dbg(&client->dev, "Updating data.\n");
  175. i = (data->channel & CHAN_TEMP3) ? 1 : 0;
  176. j = (data->channel & CHAN_TEMP3) ? 5 : 6;
  177. for (; i < j; i++) {
  178. data->in[i] = lm87_read_value(client,
  179. LM87_REG_IN(i));
  180. data->in_min[i] = lm87_read_value(client,
  181. LM87_REG_IN_MIN(i));
  182. data->in_max[i] = lm87_read_value(client,
  183. LM87_REG_IN_MAX(i));
  184. }
  185. for (i = 0; i < 2; i++) {
  186. if (data->channel & CHAN_NO_FAN(i)) {
  187. data->in[6+i] = lm87_read_value(client,
  188. LM87_REG_AIN(i));
  189. data->in_max[6+i] = lm87_read_value(client,
  190. LM87_REG_AIN_MAX(i));
  191. data->in_min[6+i] = lm87_read_value(client,
  192. LM87_REG_AIN_MIN(i));
  193. } else {
  194. data->fan[i] = lm87_read_value(client,
  195. LM87_REG_FAN(i));
  196. data->fan_min[i] = lm87_read_value(client,
  197. LM87_REG_FAN_MIN(i));
  198. }
  199. }
  200. j = (data->channel & CHAN_TEMP3) ? 3 : 2;
  201. for (i = 0 ; i < j; i++) {
  202. data->temp[i] = lm87_read_value(client,
  203. LM87_REG_TEMP[i]);
  204. data->temp_high[i] = lm87_read_value(client,
  205. LM87_REG_TEMP_HIGH[i]);
  206. data->temp_low[i] = lm87_read_value(client,
  207. LM87_REG_TEMP_LOW[i]);
  208. }
  209. i = lm87_read_value(client, LM87_REG_TEMP_HW_INT_LOCK);
  210. j = lm87_read_value(client, LM87_REG_TEMP_HW_INT);
  211. data->temp_crit_int = min(i, j);
  212. i = lm87_read_value(client, LM87_REG_TEMP_HW_EXT_LOCK);
  213. j = lm87_read_value(client, LM87_REG_TEMP_HW_EXT);
  214. data->temp_crit_ext = min(i, j);
  215. i = lm87_read_value(client, LM87_REG_VID_FAN_DIV);
  216. data->fan_div[0] = (i >> 4) & 0x03;
  217. data->fan_div[1] = (i >> 6) & 0x03;
  218. data->vid = (i & 0x0F)
  219. | (lm87_read_value(client, LM87_REG_VID4) & 0x01)
  220. << 4;
  221. data->alarms = lm87_read_value(client, LM87_REG_ALARMS1)
  222. | (lm87_read_value(client, LM87_REG_ALARMS2)
  223. << 8);
  224. data->aout = lm87_read_value(client, LM87_REG_AOUT);
  225. data->last_updated = jiffies;
  226. data->valid = 1;
  227. }
  228. mutex_unlock(&data->update_lock);
  229. return data;
  230. }
  231. /*
  232. * Sysfs stuff
  233. */
  234. #define show_in(offset) \
  235. static ssize_t show_in##offset##_input(struct device *dev, \
  236. struct device_attribute *attr, \
  237. char *buf) \
  238. { \
  239. struct lm87_data *data = lm87_update_device(dev); \
  240. return sprintf(buf, "%u\n", IN_FROM_REG(data->in[offset], \
  241. data->in_scale[offset])); \
  242. } \
  243. static ssize_t show_in##offset##_min(struct device *dev, \
  244. struct device_attribute *attr, char *buf) \
  245. { \
  246. struct lm87_data *data = lm87_update_device(dev); \
  247. return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[offset], \
  248. data->in_scale[offset])); \
  249. } \
  250. static ssize_t show_in##offset##_max(struct device *dev, \
  251. struct device_attribute *attr, char *buf) \
  252. { \
  253. struct lm87_data *data = lm87_update_device(dev); \
  254. return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[offset], \
  255. data->in_scale[offset])); \
  256. } \
  257. static DEVICE_ATTR(in##offset##_input, S_IRUGO, \
  258. show_in##offset##_input, NULL);
  259. show_in(0);
  260. show_in(1);
  261. show_in(2);
  262. show_in(3);
  263. show_in(4);
  264. show_in(5);
  265. show_in(6);
  266. show_in(7);
  267. static ssize_t set_in_min(struct device *dev, const char *buf, int nr,
  268. size_t count)
  269. {
  270. struct i2c_client *client = to_i2c_client(dev);
  271. struct lm87_data *data = i2c_get_clientdata(client);
  272. long val;
  273. int err;
  274. err = kstrtol(buf, 10, &val);
  275. if (err)
  276. return err;
  277. mutex_lock(&data->update_lock);
  278. data->in_min[nr] = IN_TO_REG(val, data->in_scale[nr]);
  279. lm87_write_value(client, nr < 6 ? LM87_REG_IN_MIN(nr) :
  280. LM87_REG_AIN_MIN(nr - 6), data->in_min[nr]);
  281. mutex_unlock(&data->update_lock);
  282. return count;
  283. }
  284. static ssize_t set_in_max(struct device *dev, const char *buf, int nr,
  285. size_t count)
  286. {
  287. struct i2c_client *client = to_i2c_client(dev);
  288. struct lm87_data *data = i2c_get_clientdata(client);
  289. long val;
  290. int err;
  291. err = kstrtol(buf, 10, &val);
  292. if (err)
  293. return err;
  294. mutex_lock(&data->update_lock);
  295. data->in_max[nr] = IN_TO_REG(val, data->in_scale[nr]);
  296. lm87_write_value(client, nr < 6 ? LM87_REG_IN_MAX(nr) :
  297. LM87_REG_AIN_MAX(nr - 6), data->in_max[nr]);
  298. mutex_unlock(&data->update_lock);
  299. return count;
  300. }
  301. #define set_in(offset) \
  302. static ssize_t set_in##offset##_min(struct device *dev, \
  303. struct device_attribute *attr, \
  304. const char *buf, size_t count) \
  305. { \
  306. return set_in_min(dev, buf, offset, count); \
  307. } \
  308. static ssize_t set_in##offset##_max(struct device *dev, \
  309. struct device_attribute *attr, \
  310. const char *buf, size_t count) \
  311. { \
  312. return set_in_max(dev, buf, offset, count); \
  313. } \
  314. static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
  315. show_in##offset##_min, set_in##offset##_min); \
  316. static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
  317. show_in##offset##_max, set_in##offset##_max);
  318. set_in(0);
  319. set_in(1);
  320. set_in(2);
  321. set_in(3);
  322. set_in(4);
  323. set_in(5);
  324. set_in(6);
  325. set_in(7);
  326. #define show_temp(offset) \
  327. static ssize_t show_temp##offset##_input(struct device *dev, \
  328. struct device_attribute *attr, \
  329. char *buf) \
  330. { \
  331. struct lm87_data *data = lm87_update_device(dev); \
  332. return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[offset - 1])); \
  333. } \
  334. static ssize_t show_temp##offset##_low(struct device *dev, \
  335. struct device_attribute *attr, \
  336. char *buf) \
  337. { \
  338. struct lm87_data *data = lm87_update_device(dev); \
  339. return sprintf(buf, "%d\n", \
  340. TEMP_FROM_REG(data->temp_low[offset - 1])); \
  341. } \
  342. static ssize_t show_temp##offset##_high(struct device *dev, \
  343. struct device_attribute *attr, \
  344. char *buf) \
  345. { \
  346. struct lm87_data *data = lm87_update_device(dev); \
  347. return sprintf(buf, "%d\n", \
  348. TEMP_FROM_REG(data->temp_high[offset - 1])); \
  349. } \
  350. static DEVICE_ATTR(temp##offset##_input, S_IRUGO, \
  351. show_temp##offset##_input, NULL);
  352. show_temp(1);
  353. show_temp(2);
  354. show_temp(3);
  355. static ssize_t set_temp_low(struct device *dev, const char *buf, int nr,
  356. size_t count)
  357. {
  358. struct i2c_client *client = to_i2c_client(dev);
  359. struct lm87_data *data = i2c_get_clientdata(client);
  360. long val;
  361. int err;
  362. err = kstrtol(buf, 10, &val);
  363. if (err)
  364. return err;
  365. mutex_lock(&data->update_lock);
  366. data->temp_low[nr] = TEMP_TO_REG(val);
  367. lm87_write_value(client, LM87_REG_TEMP_LOW[nr], data->temp_low[nr]);
  368. mutex_unlock(&data->update_lock);
  369. return count;
  370. }
  371. static ssize_t set_temp_high(struct device *dev, const char *buf, int nr,
  372. size_t count)
  373. {
  374. struct i2c_client *client = to_i2c_client(dev);
  375. struct lm87_data *data = i2c_get_clientdata(client);
  376. long val;
  377. int err;
  378. err = kstrtol(buf, 10, &val);
  379. if (err)
  380. return err;
  381. mutex_lock(&data->update_lock);
  382. data->temp_high[nr] = TEMP_TO_REG(val);
  383. lm87_write_value(client, LM87_REG_TEMP_HIGH[nr], data->temp_high[nr]);
  384. mutex_unlock(&data->update_lock);
  385. return count;
  386. }
  387. #define set_temp(offset) \
  388. static ssize_t set_temp##offset##_low(struct device *dev, \
  389. struct device_attribute *attr, \
  390. const char *buf, size_t count) \
  391. { \
  392. return set_temp_low(dev, buf, offset - 1, count); \
  393. } \
  394. static ssize_t set_temp##offset##_high(struct device *dev, \
  395. struct device_attribute *attr, \
  396. const char *buf, size_t count) \
  397. { \
  398. return set_temp_high(dev, buf, offset - 1, count); \
  399. } \
  400. static DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \
  401. show_temp##offset##_high, set_temp##offset##_high); \
  402. static DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \
  403. show_temp##offset##_low, set_temp##offset##_low);
  404. set_temp(1);
  405. set_temp(2);
  406. set_temp(3);
  407. static ssize_t show_temp_crit_int(struct device *dev,
  408. struct device_attribute *attr, char *buf)
  409. {
  410. struct lm87_data *data = lm87_update_device(dev);
  411. return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_crit_int));
  412. }
  413. static ssize_t show_temp_crit_ext(struct device *dev,
  414. struct device_attribute *attr, char *buf)
  415. {
  416. struct lm87_data *data = lm87_update_device(dev);
  417. return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_crit_ext));
  418. }
  419. static DEVICE_ATTR(temp1_crit, S_IRUGO, show_temp_crit_int, NULL);
  420. static DEVICE_ATTR(temp2_crit, S_IRUGO, show_temp_crit_ext, NULL);
  421. static DEVICE_ATTR(temp3_crit, S_IRUGO, show_temp_crit_ext, NULL);
  422. #define show_fan(offset) \
  423. static ssize_t show_fan##offset##_input(struct device *dev, \
  424. struct device_attribute *attr, \
  425. char *buf) \
  426. { \
  427. struct lm87_data *data = lm87_update_device(dev); \
  428. return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[offset - 1], \
  429. FAN_DIV_FROM_REG(data->fan_div[offset - 1]))); \
  430. } \
  431. static ssize_t show_fan##offset##_min(struct device *dev, \
  432. struct device_attribute *attr, \
  433. char *buf) \
  434. { \
  435. struct lm87_data *data = lm87_update_device(dev); \
  436. return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[offset - 1], \
  437. FAN_DIV_FROM_REG(data->fan_div[offset - 1]))); \
  438. } \
  439. static ssize_t show_fan##offset##_div(struct device *dev, \
  440. struct device_attribute *attr, \
  441. char *buf) \
  442. { \
  443. struct lm87_data *data = lm87_update_device(dev); \
  444. return sprintf(buf, "%d\n", \
  445. FAN_DIV_FROM_REG(data->fan_div[offset - 1])); \
  446. } \
  447. static DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
  448. show_fan##offset##_input, NULL);
  449. show_fan(1);
  450. show_fan(2);
  451. static ssize_t set_fan_min(struct device *dev, const char *buf, int nr,
  452. size_t count)
  453. {
  454. struct i2c_client *client = to_i2c_client(dev);
  455. struct lm87_data *data = i2c_get_clientdata(client);
  456. long val;
  457. int err;
  458. err = kstrtol(buf, 10, &val);
  459. if (err)
  460. return err;
  461. mutex_lock(&data->update_lock);
  462. data->fan_min[nr] = FAN_TO_REG(val,
  463. FAN_DIV_FROM_REG(data->fan_div[nr]));
  464. lm87_write_value(client, LM87_REG_FAN_MIN(nr), data->fan_min[nr]);
  465. mutex_unlock(&data->update_lock);
  466. return count;
  467. }
  468. /*
  469. * Note: we save and restore the fan minimum here, because its value is
  470. * determined in part by the fan clock divider. This follows the principle
  471. * of least surprise; the user doesn't expect the fan minimum to change just
  472. * because the divider changed.
  473. */
  474. static ssize_t set_fan_div(struct device *dev, const char *buf,
  475. size_t count, int nr)
  476. {
  477. struct i2c_client *client = to_i2c_client(dev);
  478. struct lm87_data *data = i2c_get_clientdata(client);
  479. long val;
  480. int err;
  481. unsigned long min;
  482. u8 reg;
  483. err = kstrtol(buf, 10, &val);
  484. if (err)
  485. return err;
  486. mutex_lock(&data->update_lock);
  487. min = FAN_FROM_REG(data->fan_min[nr],
  488. FAN_DIV_FROM_REG(data->fan_div[nr]));
  489. switch (val) {
  490. case 1:
  491. data->fan_div[nr] = 0;
  492. break;
  493. case 2:
  494. data->fan_div[nr] = 1;
  495. break;
  496. case 4:
  497. data->fan_div[nr] = 2;
  498. break;
  499. case 8:
  500. data->fan_div[nr] = 3;
  501. break;
  502. default:
  503. mutex_unlock(&data->update_lock);
  504. return -EINVAL;
  505. }
  506. reg = lm87_read_value(client, LM87_REG_VID_FAN_DIV);
  507. switch (nr) {
  508. case 0:
  509. reg = (reg & 0xCF) | (data->fan_div[0] << 4);
  510. break;
  511. case 1:
  512. reg = (reg & 0x3F) | (data->fan_div[1] << 6);
  513. break;
  514. }
  515. lm87_write_value(client, LM87_REG_VID_FAN_DIV, reg);
  516. data->fan_min[nr] = FAN_TO_REG(min, val);
  517. lm87_write_value(client, LM87_REG_FAN_MIN(nr),
  518. data->fan_min[nr]);
  519. mutex_unlock(&data->update_lock);
  520. return count;
  521. }
  522. #define set_fan(offset) \
  523. static ssize_t set_fan##offset##_min(struct device *dev, \
  524. struct device_attribute *attr, \
  525. const char *buf, size_t count) \
  526. { \
  527. return set_fan_min(dev, buf, offset - 1, count); \
  528. } \
  529. static ssize_t set_fan##offset##_div(struct device *dev, \
  530. struct device_attribute *attr, \
  531. const char *buf, size_t count) \
  532. { \
  533. return set_fan_div(dev, buf, count, offset - 1); \
  534. } \
  535. static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
  536. show_fan##offset##_min, set_fan##offset##_min); \
  537. static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
  538. show_fan##offset##_div, set_fan##offset##_div);
  539. set_fan(1);
  540. set_fan(2);
  541. static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
  542. char *buf)
  543. {
  544. struct lm87_data *data = lm87_update_device(dev);
  545. return sprintf(buf, "%d\n", data->alarms);
  546. }
  547. static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
  548. static ssize_t show_vid(struct device *dev, struct device_attribute *attr,
  549. char *buf)
  550. {
  551. struct lm87_data *data = lm87_update_device(dev);
  552. return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
  553. }
  554. static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
  555. static ssize_t show_vrm(struct device *dev, struct device_attribute *attr,
  556. char *buf)
  557. {
  558. struct lm87_data *data = dev_get_drvdata(dev);
  559. return sprintf(buf, "%d\n", data->vrm);
  560. }
  561. static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
  562. const char *buf, size_t count)
  563. {
  564. struct lm87_data *data = dev_get_drvdata(dev);
  565. unsigned long val;
  566. int err;
  567. err = kstrtoul(buf, 10, &val);
  568. if (err)
  569. return err;
  570. data->vrm = val;
  571. return count;
  572. }
  573. static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
  574. static ssize_t show_aout(struct device *dev, struct device_attribute *attr,
  575. char *buf)
  576. {
  577. struct lm87_data *data = lm87_update_device(dev);
  578. return sprintf(buf, "%d\n", AOUT_FROM_REG(data->aout));
  579. }
  580. static ssize_t set_aout(struct device *dev, struct device_attribute *attr,
  581. const char *buf, size_t count)
  582. {
  583. struct i2c_client *client = to_i2c_client(dev);
  584. struct lm87_data *data = i2c_get_clientdata(client);
  585. long val;
  586. int err;
  587. err = kstrtol(buf, 10, &val);
  588. if (err)
  589. return err;
  590. mutex_lock(&data->update_lock);
  591. data->aout = AOUT_TO_REG(val);
  592. lm87_write_value(client, LM87_REG_AOUT, data->aout);
  593. mutex_unlock(&data->update_lock);
  594. return count;
  595. }
  596. static DEVICE_ATTR(aout_output, S_IRUGO | S_IWUSR, show_aout, set_aout);
  597. static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
  598. char *buf)
  599. {
  600. struct lm87_data *data = lm87_update_device(dev);
  601. int bitnr = to_sensor_dev_attr(attr)->index;
  602. return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
  603. }
  604. static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
  605. static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
  606. static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
  607. static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
  608. static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8);
  609. static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9);
  610. static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6);
  611. static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7);
  612. static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4);
  613. static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5);
  614. static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 5);
  615. static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
  616. static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
  617. static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 14);
  618. static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_alarm, NULL, 15);
  619. /*
  620. * Real code
  621. */
  622. static struct attribute *lm87_attributes[] = {
  623. &dev_attr_in1_input.attr,
  624. &dev_attr_in1_min.attr,
  625. &dev_attr_in1_max.attr,
  626. &sensor_dev_attr_in1_alarm.dev_attr.attr,
  627. &dev_attr_in2_input.attr,
  628. &dev_attr_in2_min.attr,
  629. &dev_attr_in2_max.attr,
  630. &sensor_dev_attr_in2_alarm.dev_attr.attr,
  631. &dev_attr_in3_input.attr,
  632. &dev_attr_in3_min.attr,
  633. &dev_attr_in3_max.attr,
  634. &sensor_dev_attr_in3_alarm.dev_attr.attr,
  635. &dev_attr_in4_input.attr,
  636. &dev_attr_in4_min.attr,
  637. &dev_attr_in4_max.attr,
  638. &sensor_dev_attr_in4_alarm.dev_attr.attr,
  639. &dev_attr_temp1_input.attr,
  640. &dev_attr_temp1_max.attr,
  641. &dev_attr_temp1_min.attr,
  642. &dev_attr_temp1_crit.attr,
  643. &sensor_dev_attr_temp1_alarm.dev_attr.attr,
  644. &dev_attr_temp2_input.attr,
  645. &dev_attr_temp2_max.attr,
  646. &dev_attr_temp2_min.attr,
  647. &dev_attr_temp2_crit.attr,
  648. &sensor_dev_attr_temp2_alarm.dev_attr.attr,
  649. &sensor_dev_attr_temp2_fault.dev_attr.attr,
  650. &dev_attr_alarms.attr,
  651. &dev_attr_aout_output.attr,
  652. NULL
  653. };
  654. static const struct attribute_group lm87_group = {
  655. .attrs = lm87_attributes,
  656. };
  657. static struct attribute *lm87_attributes_in6[] = {
  658. &dev_attr_in6_input.attr,
  659. &dev_attr_in6_min.attr,
  660. &dev_attr_in6_max.attr,
  661. &sensor_dev_attr_in6_alarm.dev_attr.attr,
  662. NULL
  663. };
  664. static const struct attribute_group lm87_group_in6 = {
  665. .attrs = lm87_attributes_in6,
  666. };
  667. static struct attribute *lm87_attributes_fan1[] = {
  668. &dev_attr_fan1_input.attr,
  669. &dev_attr_fan1_min.attr,
  670. &dev_attr_fan1_div.attr,
  671. &sensor_dev_attr_fan1_alarm.dev_attr.attr,
  672. NULL
  673. };
  674. static const struct attribute_group lm87_group_fan1 = {
  675. .attrs = lm87_attributes_fan1,
  676. };
  677. static struct attribute *lm87_attributes_in7[] = {
  678. &dev_attr_in7_input.attr,
  679. &dev_attr_in7_min.attr,
  680. &dev_attr_in7_max.attr,
  681. &sensor_dev_attr_in7_alarm.dev_attr.attr,
  682. NULL
  683. };
  684. static const struct attribute_group lm87_group_in7 = {
  685. .attrs = lm87_attributes_in7,
  686. };
  687. static struct attribute *lm87_attributes_fan2[] = {
  688. &dev_attr_fan2_input.attr,
  689. &dev_attr_fan2_min.attr,
  690. &dev_attr_fan2_div.attr,
  691. &sensor_dev_attr_fan2_alarm.dev_attr.attr,
  692. NULL
  693. };
  694. static const struct attribute_group lm87_group_fan2 = {
  695. .attrs = lm87_attributes_fan2,
  696. };
  697. static struct attribute *lm87_attributes_temp3[] = {
  698. &dev_attr_temp3_input.attr,
  699. &dev_attr_temp3_max.attr,
  700. &dev_attr_temp3_min.attr,
  701. &dev_attr_temp3_crit.attr,
  702. &sensor_dev_attr_temp3_alarm.dev_attr.attr,
  703. &sensor_dev_attr_temp3_fault.dev_attr.attr,
  704. NULL
  705. };
  706. static const struct attribute_group lm87_group_temp3 = {
  707. .attrs = lm87_attributes_temp3,
  708. };
  709. static struct attribute *lm87_attributes_in0_5[] = {
  710. &dev_attr_in0_input.attr,
  711. &dev_attr_in0_min.attr,
  712. &dev_attr_in0_max.attr,
  713. &sensor_dev_attr_in0_alarm.dev_attr.attr,
  714. &dev_attr_in5_input.attr,
  715. &dev_attr_in5_min.attr,
  716. &dev_attr_in5_max.attr,
  717. &sensor_dev_attr_in5_alarm.dev_attr.attr,
  718. NULL
  719. };
  720. static const struct attribute_group lm87_group_in0_5 = {
  721. .attrs = lm87_attributes_in0_5,
  722. };
  723. static struct attribute *lm87_attributes_vid[] = {
  724. &dev_attr_cpu0_vid.attr,
  725. &dev_attr_vrm.attr,
  726. NULL
  727. };
  728. static const struct attribute_group lm87_group_vid = {
  729. .attrs = lm87_attributes_vid,
  730. };
  731. /* Return 0 if detection is successful, -ENODEV otherwise */
  732. static int lm87_detect(struct i2c_client *client, struct i2c_board_info *info)
  733. {
  734. struct i2c_adapter *adapter = client->adapter;
  735. const char *name;
  736. u8 cid, rev;
  737. if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
  738. return -ENODEV;
  739. if (lm87_read_value(client, LM87_REG_CONFIG) & 0x80)
  740. return -ENODEV;
  741. /* Now, we do the remaining detection. */
  742. cid = lm87_read_value(client, LM87_REG_COMPANY_ID);
  743. rev = lm87_read_value(client, LM87_REG_REVISION);
  744. if (cid == 0x02 /* National Semiconductor */
  745. && (rev >= 0x01 && rev <= 0x08))
  746. name = "lm87";
  747. else if (cid == 0x41 /* Analog Devices */
  748. && (rev & 0xf0) == 0x10)
  749. name = "adm1024";
  750. else {
  751. dev_dbg(&adapter->dev, "LM87 detection failed at 0x%02x\n",
  752. client->addr);
  753. return -ENODEV;
  754. }
  755. strlcpy(info->type, name, I2C_NAME_SIZE);
  756. return 0;
  757. }
  758. static void lm87_remove_files(struct i2c_client *client)
  759. {
  760. struct device *dev = &client->dev;
  761. sysfs_remove_group(&dev->kobj, &lm87_group);
  762. sysfs_remove_group(&dev->kobj, &lm87_group_in6);
  763. sysfs_remove_group(&dev->kobj, &lm87_group_fan1);
  764. sysfs_remove_group(&dev->kobj, &lm87_group_in7);
  765. sysfs_remove_group(&dev->kobj, &lm87_group_fan2);
  766. sysfs_remove_group(&dev->kobj, &lm87_group_temp3);
  767. sysfs_remove_group(&dev->kobj, &lm87_group_in0_5);
  768. sysfs_remove_group(&dev->kobj, &lm87_group_vid);
  769. }
  770. static void lm87_init_client(struct i2c_client *client)
  771. {
  772. struct lm87_data *data = i2c_get_clientdata(client);
  773. if (client->dev.platform_data) {
  774. data->channel = *(u8 *)client->dev.platform_data;
  775. lm87_write_value(client,
  776. LM87_REG_CHANNEL_MODE, data->channel);
  777. } else {
  778. data->channel = lm87_read_value(client, LM87_REG_CHANNEL_MODE);
  779. }
  780. data->config = lm87_read_value(client, LM87_REG_CONFIG) & 0x6F;
  781. if (!(data->config & 0x01)) {
  782. int i;
  783. /* Limits are left uninitialized after power-up */
  784. for (i = 1; i < 6; i++) {
  785. lm87_write_value(client, LM87_REG_IN_MIN(i), 0x00);
  786. lm87_write_value(client, LM87_REG_IN_MAX(i), 0xFF);
  787. }
  788. for (i = 0; i < 2; i++) {
  789. lm87_write_value(client, LM87_REG_TEMP_HIGH[i], 0x7F);
  790. lm87_write_value(client, LM87_REG_TEMP_LOW[i], 0x00);
  791. lm87_write_value(client, LM87_REG_AIN_MIN(i), 0x00);
  792. lm87_write_value(client, LM87_REG_AIN_MAX(i), 0xFF);
  793. }
  794. if (data->channel & CHAN_TEMP3) {
  795. lm87_write_value(client, LM87_REG_TEMP_HIGH[2], 0x7F);
  796. lm87_write_value(client, LM87_REG_TEMP_LOW[2], 0x00);
  797. } else {
  798. lm87_write_value(client, LM87_REG_IN_MIN(0), 0x00);
  799. lm87_write_value(client, LM87_REG_IN_MAX(0), 0xFF);
  800. }
  801. }
  802. /* Make sure Start is set and INT#_Clear is clear */
  803. if ((data->config & 0x09) != 0x01)
  804. lm87_write_value(client, LM87_REG_CONFIG,
  805. (data->config & 0x77) | 0x01);
  806. }
  807. static int lm87_probe(struct i2c_client *client, const struct i2c_device_id *id)
  808. {
  809. struct lm87_data *data;
  810. int err;
  811. data = kzalloc(sizeof(struct lm87_data), GFP_KERNEL);
  812. if (!data) {
  813. err = -ENOMEM;
  814. goto exit;
  815. }
  816. i2c_set_clientdata(client, data);
  817. data->valid = 0;
  818. mutex_init(&data->update_lock);
  819. /* Initialize the LM87 chip */
  820. lm87_init_client(client);
  821. data->in_scale[0] = 2500;
  822. data->in_scale[1] = 2700;
  823. data->in_scale[2] = (data->channel & CHAN_VCC_5V) ? 5000 : 3300;
  824. data->in_scale[3] = 5000;
  825. data->in_scale[4] = 12000;
  826. data->in_scale[5] = 2700;
  827. data->in_scale[6] = 1875;
  828. data->in_scale[7] = 1875;
  829. /* Register sysfs hooks */
  830. err = sysfs_create_group(&client->dev.kobj, &lm87_group);
  831. if (err)
  832. goto exit_free;
  833. if (data->channel & CHAN_NO_FAN(0)) {
  834. err = sysfs_create_group(&client->dev.kobj, &lm87_group_in6);
  835. if (err)
  836. goto exit_remove;
  837. } else {
  838. err = sysfs_create_group(&client->dev.kobj, &lm87_group_fan1);
  839. if (err)
  840. goto exit_remove;
  841. }
  842. if (data->channel & CHAN_NO_FAN(1)) {
  843. err = sysfs_create_group(&client->dev.kobj, &lm87_group_in7);
  844. if (err)
  845. goto exit_remove;
  846. } else {
  847. err = sysfs_create_group(&client->dev.kobj, &lm87_group_fan2);
  848. if (err)
  849. goto exit_remove;
  850. }
  851. if (data->channel & CHAN_TEMP3) {
  852. err = sysfs_create_group(&client->dev.kobj, &lm87_group_temp3);
  853. if (err)
  854. goto exit_remove;
  855. } else {
  856. err = sysfs_create_group(&client->dev.kobj, &lm87_group_in0_5);
  857. if (err)
  858. goto exit_remove;
  859. }
  860. if (!(data->channel & CHAN_NO_VID)) {
  861. data->vrm = vid_which_vrm();
  862. err = sysfs_create_group(&client->dev.kobj, &lm87_group_vid);
  863. if (err)
  864. goto exit_remove;
  865. }
  866. data->hwmon_dev = hwmon_device_register(&client->dev);
  867. if (IS_ERR(data->hwmon_dev)) {
  868. err = PTR_ERR(data->hwmon_dev);
  869. goto exit_remove;
  870. }
  871. return 0;
  872. exit_remove:
  873. lm87_remove_files(client);
  874. exit_free:
  875. lm87_write_value(client, LM87_REG_CONFIG, data->config);
  876. kfree(data);
  877. exit:
  878. return err;
  879. }
  880. static int lm87_remove(struct i2c_client *client)
  881. {
  882. struct lm87_data *data = i2c_get_clientdata(client);
  883. hwmon_device_unregister(data->hwmon_dev);
  884. lm87_remove_files(client);
  885. lm87_write_value(client, LM87_REG_CONFIG, data->config);
  886. kfree(data);
  887. return 0;
  888. }
  889. /*
  890. * Driver data (common to all clients)
  891. */
  892. static const struct i2c_device_id lm87_id[] = {
  893. { "lm87", lm87 },
  894. { "adm1024", adm1024 },
  895. { }
  896. };
  897. MODULE_DEVICE_TABLE(i2c, lm87_id);
  898. static struct i2c_driver lm87_driver = {
  899. .class = I2C_CLASS_HWMON,
  900. .driver = {
  901. .name = "lm87",
  902. },
  903. .probe = lm87_probe,
  904. .remove = lm87_remove,
  905. .id_table = lm87_id,
  906. .detect = lm87_detect,
  907. .address_list = normal_i2c,
  908. };
  909. module_i2c_driver(lm87_driver);
  910. MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org> and others");
  911. MODULE_DESCRIPTION("LM87 driver");
  912. MODULE_LICENSE("GPL");