lm78.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116
  1. /*
  2. * lm78.c - Part of lm_sensors, Linux kernel modules for hardware
  3. * monitoring
  4. * Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
  5. * Copyright (c) 2007, 2011 Jean Delvare <jdelvare@suse.de>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  22. #include <linux/module.h>
  23. #include <linux/init.h>
  24. #include <linux/slab.h>
  25. #include <linux/jiffies.h>
  26. #include <linux/i2c.h>
  27. #include <linux/hwmon.h>
  28. #include <linux/hwmon-vid.h>
  29. #include <linux/hwmon-sysfs.h>
  30. #include <linux/err.h>
  31. #include <linux/mutex.h>
  32. #ifdef CONFIG_ISA
  33. #include <linux/platform_device.h>
  34. #include <linux/ioport.h>
  35. #include <linux/io.h>
  36. #endif
  37. /* Addresses to scan */
  38. static const unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d,
  39. 0x2e, 0x2f, I2C_CLIENT_END };
  40. enum chips { lm78, lm79 };
  41. /* Many LM78 constants specified below */
  42. /* Length of ISA address segment */
  43. #define LM78_EXTENT 8
  44. /* Where are the ISA address/data registers relative to the base address */
  45. #define LM78_ADDR_REG_OFFSET 5
  46. #define LM78_DATA_REG_OFFSET 6
  47. /* The LM78 registers */
  48. #define LM78_REG_IN_MAX(nr) (0x2b + (nr) * 2)
  49. #define LM78_REG_IN_MIN(nr) (0x2c + (nr) * 2)
  50. #define LM78_REG_IN(nr) (0x20 + (nr))
  51. #define LM78_REG_FAN_MIN(nr) (0x3b + (nr))
  52. #define LM78_REG_FAN(nr) (0x28 + (nr))
  53. #define LM78_REG_TEMP 0x27
  54. #define LM78_REG_TEMP_OVER 0x39
  55. #define LM78_REG_TEMP_HYST 0x3a
  56. #define LM78_REG_ALARM1 0x41
  57. #define LM78_REG_ALARM2 0x42
  58. #define LM78_REG_VID_FANDIV 0x47
  59. #define LM78_REG_CONFIG 0x40
  60. #define LM78_REG_CHIPID 0x49
  61. #define LM78_REG_I2C_ADDR 0x48
  62. /*
  63. * Conversions. Rounding and limit checking is only done on the TO_REG
  64. * variants.
  65. */
  66. /*
  67. * IN: mV (0V to 4.08V)
  68. * REG: 16mV/bit
  69. */
  70. static inline u8 IN_TO_REG(unsigned long val)
  71. {
  72. unsigned long nval = clamp_val(val, 0, 4080);
  73. return (nval + 8) / 16;
  74. }
  75. #define IN_FROM_REG(val) ((val) * 16)
  76. static inline u8 FAN_TO_REG(long rpm, int div)
  77. {
  78. if (rpm <= 0)
  79. return 255;
  80. if (rpm > 1350000)
  81. return 1;
  82. return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
  83. }
  84. static inline int FAN_FROM_REG(u8 val, int div)
  85. {
  86. return val == 0 ? -1 : val == 255 ? 0 : 1350000 / (val * div);
  87. }
  88. /*
  89. * TEMP: mC (-128C to +127C)
  90. * REG: 1C/bit, two's complement
  91. */
  92. static inline s8 TEMP_TO_REG(int val)
  93. {
  94. int nval = clamp_val(val, -128000, 127000) ;
  95. return nval < 0 ? (nval - 500) / 1000 : (nval + 500) / 1000;
  96. }
  97. static inline int TEMP_FROM_REG(s8 val)
  98. {
  99. return val * 1000;
  100. }
  101. #define DIV_FROM_REG(val) (1 << (val))
  102. struct lm78_data {
  103. struct i2c_client *client;
  104. struct device *hwmon_dev;
  105. struct mutex lock;
  106. enum chips type;
  107. /* For ISA device only */
  108. const char *name;
  109. int isa_addr;
  110. struct mutex update_lock;
  111. char valid; /* !=0 if following fields are valid */
  112. unsigned long last_updated; /* In jiffies */
  113. u8 in[7]; /* Register value */
  114. u8 in_max[7]; /* Register value */
  115. u8 in_min[7]; /* Register value */
  116. u8 fan[3]; /* Register value */
  117. u8 fan_min[3]; /* Register value */
  118. s8 temp; /* Register value */
  119. s8 temp_over; /* Register value */
  120. s8 temp_hyst; /* Register value */
  121. u8 fan_div[3]; /* Register encoding, shifted right */
  122. u8 vid; /* Register encoding, combined */
  123. u16 alarms; /* Register encoding, combined */
  124. };
  125. static int lm78_read_value(struct lm78_data *data, u8 reg);
  126. static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value);
  127. static struct lm78_data *lm78_update_device(struct device *dev);
  128. static void lm78_init_device(struct lm78_data *data);
  129. /* 7 Voltages */
  130. static ssize_t show_in(struct device *dev, struct device_attribute *da,
  131. char *buf)
  132. {
  133. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  134. struct lm78_data *data = lm78_update_device(dev);
  135. return sprintf(buf, "%d\n", IN_FROM_REG(data->in[attr->index]));
  136. }
  137. static ssize_t show_in_min(struct device *dev, struct device_attribute *da,
  138. char *buf)
  139. {
  140. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  141. struct lm78_data *data = lm78_update_device(dev);
  142. return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[attr->index]));
  143. }
  144. static ssize_t show_in_max(struct device *dev, struct device_attribute *da,
  145. char *buf)
  146. {
  147. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  148. struct lm78_data *data = lm78_update_device(dev);
  149. return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[attr->index]));
  150. }
  151. static ssize_t set_in_min(struct device *dev, struct device_attribute *da,
  152. const char *buf, size_t count)
  153. {
  154. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  155. struct lm78_data *data = dev_get_drvdata(dev);
  156. int nr = attr->index;
  157. unsigned long val;
  158. int err;
  159. err = kstrtoul(buf, 10, &val);
  160. if (err)
  161. return err;
  162. mutex_lock(&data->update_lock);
  163. data->in_min[nr] = IN_TO_REG(val);
  164. lm78_write_value(data, LM78_REG_IN_MIN(nr), data->in_min[nr]);
  165. mutex_unlock(&data->update_lock);
  166. return count;
  167. }
  168. static ssize_t set_in_max(struct device *dev, struct device_attribute *da,
  169. const char *buf, size_t count)
  170. {
  171. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  172. struct lm78_data *data = dev_get_drvdata(dev);
  173. int nr = attr->index;
  174. unsigned long val;
  175. int err;
  176. err = kstrtoul(buf, 10, &val);
  177. if (err)
  178. return err;
  179. mutex_lock(&data->update_lock);
  180. data->in_max[nr] = IN_TO_REG(val);
  181. lm78_write_value(data, LM78_REG_IN_MAX(nr), data->in_max[nr]);
  182. mutex_unlock(&data->update_lock);
  183. return count;
  184. }
  185. #define show_in_offset(offset) \
  186. static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \
  187. show_in, NULL, offset); \
  188. static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
  189. show_in_min, set_in_min, offset); \
  190. static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
  191. show_in_max, set_in_max, offset);
  192. show_in_offset(0);
  193. show_in_offset(1);
  194. show_in_offset(2);
  195. show_in_offset(3);
  196. show_in_offset(4);
  197. show_in_offset(5);
  198. show_in_offset(6);
  199. /* Temperature */
  200. static ssize_t show_temp(struct device *dev, struct device_attribute *da,
  201. char *buf)
  202. {
  203. struct lm78_data *data = lm78_update_device(dev);
  204. return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
  205. }
  206. static ssize_t show_temp_over(struct device *dev, struct device_attribute *da,
  207. char *buf)
  208. {
  209. struct lm78_data *data = lm78_update_device(dev);
  210. return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
  211. }
  212. static ssize_t set_temp_over(struct device *dev, struct device_attribute *da,
  213. const char *buf, size_t count)
  214. {
  215. struct lm78_data *data = dev_get_drvdata(dev);
  216. long val;
  217. int err;
  218. err = kstrtol(buf, 10, &val);
  219. if (err)
  220. return err;
  221. mutex_lock(&data->update_lock);
  222. data->temp_over = TEMP_TO_REG(val);
  223. lm78_write_value(data, LM78_REG_TEMP_OVER, data->temp_over);
  224. mutex_unlock(&data->update_lock);
  225. return count;
  226. }
  227. static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *da,
  228. char *buf)
  229. {
  230. struct lm78_data *data = lm78_update_device(dev);
  231. return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
  232. }
  233. static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *da,
  234. const char *buf, size_t count)
  235. {
  236. struct lm78_data *data = dev_get_drvdata(dev);
  237. long val;
  238. int err;
  239. err = kstrtol(buf, 10, &val);
  240. if (err)
  241. return err;
  242. mutex_lock(&data->update_lock);
  243. data->temp_hyst = TEMP_TO_REG(val);
  244. lm78_write_value(data, LM78_REG_TEMP_HYST, data->temp_hyst);
  245. mutex_unlock(&data->update_lock);
  246. return count;
  247. }
  248. static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
  249. static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
  250. show_temp_over, set_temp_over);
  251. static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
  252. show_temp_hyst, set_temp_hyst);
  253. /* 3 Fans */
  254. static ssize_t show_fan(struct device *dev, struct device_attribute *da,
  255. char *buf)
  256. {
  257. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  258. struct lm78_data *data = lm78_update_device(dev);
  259. int nr = attr->index;
  260. return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
  261. DIV_FROM_REG(data->fan_div[nr])));
  262. }
  263. static ssize_t show_fan_min(struct device *dev, struct device_attribute *da,
  264. char *buf)
  265. {
  266. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  267. struct lm78_data *data = lm78_update_device(dev);
  268. int nr = attr->index;
  269. return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[nr],
  270. DIV_FROM_REG(data->fan_div[nr])));
  271. }
  272. static ssize_t set_fan_min(struct device *dev, struct device_attribute *da,
  273. const char *buf, size_t count)
  274. {
  275. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  276. struct lm78_data *data = dev_get_drvdata(dev);
  277. int nr = attr->index;
  278. unsigned long val;
  279. int err;
  280. err = kstrtoul(buf, 10, &val);
  281. if (err)
  282. return err;
  283. mutex_lock(&data->update_lock);
  284. data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
  285. lm78_write_value(data, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
  286. mutex_unlock(&data->update_lock);
  287. return count;
  288. }
  289. static ssize_t show_fan_div(struct device *dev, struct device_attribute *da,
  290. char *buf)
  291. {
  292. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  293. struct lm78_data *data = lm78_update_device(dev);
  294. return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[attr->index]));
  295. }
  296. /*
  297. * Note: we save and restore the fan minimum here, because its value is
  298. * determined in part by the fan divisor. This follows the principle of
  299. * least surprise; the user doesn't expect the fan minimum to change just
  300. * because the divisor changed.
  301. */
  302. static ssize_t set_fan_div(struct device *dev, struct device_attribute *da,
  303. const char *buf, size_t count)
  304. {
  305. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  306. struct lm78_data *data = dev_get_drvdata(dev);
  307. int nr = attr->index;
  308. unsigned long min;
  309. u8 reg;
  310. unsigned long val;
  311. int err;
  312. err = kstrtoul(buf, 10, &val);
  313. if (err)
  314. return err;
  315. mutex_lock(&data->update_lock);
  316. min = FAN_FROM_REG(data->fan_min[nr],
  317. DIV_FROM_REG(data->fan_div[nr]));
  318. switch (val) {
  319. case 1:
  320. data->fan_div[nr] = 0;
  321. break;
  322. case 2:
  323. data->fan_div[nr] = 1;
  324. break;
  325. case 4:
  326. data->fan_div[nr] = 2;
  327. break;
  328. case 8:
  329. data->fan_div[nr] = 3;
  330. break;
  331. default:
  332. dev_err(dev,
  333. "fan_div value %ld not supported. Choose one of 1, 2, 4 or 8!\n",
  334. val);
  335. mutex_unlock(&data->update_lock);
  336. return -EINVAL;
  337. }
  338. reg = lm78_read_value(data, LM78_REG_VID_FANDIV);
  339. switch (nr) {
  340. case 0:
  341. reg = (reg & 0xcf) | (data->fan_div[nr] << 4);
  342. break;
  343. case 1:
  344. reg = (reg & 0x3f) | (data->fan_div[nr] << 6);
  345. break;
  346. }
  347. lm78_write_value(data, LM78_REG_VID_FANDIV, reg);
  348. data->fan_min[nr] =
  349. FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
  350. lm78_write_value(data, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
  351. mutex_unlock(&data->update_lock);
  352. return count;
  353. }
  354. #define show_fan_offset(offset) \
  355. static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
  356. show_fan, NULL, offset - 1); \
  357. static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
  358. show_fan_min, set_fan_min, offset - 1);
  359. show_fan_offset(1);
  360. show_fan_offset(2);
  361. show_fan_offset(3);
  362. /* Fan 3 divisor is locked in H/W */
  363. static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR,
  364. show_fan_div, set_fan_div, 0);
  365. static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
  366. show_fan_div, set_fan_div, 1);
  367. static SENSOR_DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2);
  368. /* VID */
  369. static ssize_t show_vid(struct device *dev, struct device_attribute *da,
  370. char *buf)
  371. {
  372. struct lm78_data *data = lm78_update_device(dev);
  373. return sprintf(buf, "%d\n", vid_from_reg(data->vid, 82));
  374. }
  375. static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
  376. /* Alarms */
  377. static ssize_t show_alarms(struct device *dev, struct device_attribute *da,
  378. char *buf)
  379. {
  380. struct lm78_data *data = lm78_update_device(dev);
  381. return sprintf(buf, "%u\n", data->alarms);
  382. }
  383. static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
  384. static ssize_t show_alarm(struct device *dev, struct device_attribute *da,
  385. char *buf)
  386. {
  387. struct lm78_data *data = lm78_update_device(dev);
  388. int nr = to_sensor_dev_attr(da)->index;
  389. return sprintf(buf, "%u\n", (data->alarms >> nr) & 1);
  390. }
  391. static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
  392. static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
  393. static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
  394. static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
  395. static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8);
  396. static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9);
  397. static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10);
  398. static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
  399. static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
  400. static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11);
  401. static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4);
  402. static struct attribute *lm78_attributes[] = {
  403. &sensor_dev_attr_in0_input.dev_attr.attr,
  404. &sensor_dev_attr_in0_min.dev_attr.attr,
  405. &sensor_dev_attr_in0_max.dev_attr.attr,
  406. &sensor_dev_attr_in0_alarm.dev_attr.attr,
  407. &sensor_dev_attr_in1_input.dev_attr.attr,
  408. &sensor_dev_attr_in1_min.dev_attr.attr,
  409. &sensor_dev_attr_in1_max.dev_attr.attr,
  410. &sensor_dev_attr_in1_alarm.dev_attr.attr,
  411. &sensor_dev_attr_in2_input.dev_attr.attr,
  412. &sensor_dev_attr_in2_min.dev_attr.attr,
  413. &sensor_dev_attr_in2_max.dev_attr.attr,
  414. &sensor_dev_attr_in2_alarm.dev_attr.attr,
  415. &sensor_dev_attr_in3_input.dev_attr.attr,
  416. &sensor_dev_attr_in3_min.dev_attr.attr,
  417. &sensor_dev_attr_in3_max.dev_attr.attr,
  418. &sensor_dev_attr_in3_alarm.dev_attr.attr,
  419. &sensor_dev_attr_in4_input.dev_attr.attr,
  420. &sensor_dev_attr_in4_min.dev_attr.attr,
  421. &sensor_dev_attr_in4_max.dev_attr.attr,
  422. &sensor_dev_attr_in4_alarm.dev_attr.attr,
  423. &sensor_dev_attr_in5_input.dev_attr.attr,
  424. &sensor_dev_attr_in5_min.dev_attr.attr,
  425. &sensor_dev_attr_in5_max.dev_attr.attr,
  426. &sensor_dev_attr_in5_alarm.dev_attr.attr,
  427. &sensor_dev_attr_in6_input.dev_attr.attr,
  428. &sensor_dev_attr_in6_min.dev_attr.attr,
  429. &sensor_dev_attr_in6_max.dev_attr.attr,
  430. &sensor_dev_attr_in6_alarm.dev_attr.attr,
  431. &dev_attr_temp1_input.attr,
  432. &dev_attr_temp1_max.attr,
  433. &dev_attr_temp1_max_hyst.attr,
  434. &sensor_dev_attr_temp1_alarm.dev_attr.attr,
  435. &sensor_dev_attr_fan1_input.dev_attr.attr,
  436. &sensor_dev_attr_fan1_min.dev_attr.attr,
  437. &sensor_dev_attr_fan1_div.dev_attr.attr,
  438. &sensor_dev_attr_fan1_alarm.dev_attr.attr,
  439. &sensor_dev_attr_fan2_input.dev_attr.attr,
  440. &sensor_dev_attr_fan2_min.dev_attr.attr,
  441. &sensor_dev_attr_fan2_div.dev_attr.attr,
  442. &sensor_dev_attr_fan2_alarm.dev_attr.attr,
  443. &sensor_dev_attr_fan3_input.dev_attr.attr,
  444. &sensor_dev_attr_fan3_min.dev_attr.attr,
  445. &sensor_dev_attr_fan3_div.dev_attr.attr,
  446. &sensor_dev_attr_fan3_alarm.dev_attr.attr,
  447. &dev_attr_alarms.attr,
  448. &dev_attr_cpu0_vid.attr,
  449. NULL
  450. };
  451. static const struct attribute_group lm78_group = {
  452. .attrs = lm78_attributes,
  453. };
  454. /*
  455. * ISA related code
  456. */
  457. #ifdef CONFIG_ISA
  458. /* ISA device, if found */
  459. static struct platform_device *pdev;
  460. static unsigned short isa_address = 0x290;
  461. /*
  462. * I2C devices get this name attribute automatically, but for ISA devices
  463. * we must create it by ourselves.
  464. */
  465. static ssize_t show_name(struct device *dev, struct device_attribute
  466. *devattr, char *buf)
  467. {
  468. struct lm78_data *data = dev_get_drvdata(dev);
  469. return sprintf(buf, "%s\n", data->name);
  470. }
  471. static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
  472. static struct lm78_data *lm78_data_if_isa(void)
  473. {
  474. return pdev ? platform_get_drvdata(pdev) : NULL;
  475. }
  476. /* Returns 1 if the I2C chip appears to be an alias of the ISA chip */
  477. static int lm78_alias_detect(struct i2c_client *client, u8 chipid)
  478. {
  479. struct lm78_data *isa;
  480. int i;
  481. if (!pdev) /* No ISA chip */
  482. return 0;
  483. isa = platform_get_drvdata(pdev);
  484. if (lm78_read_value(isa, LM78_REG_I2C_ADDR) != client->addr)
  485. return 0; /* Address doesn't match */
  486. if ((lm78_read_value(isa, LM78_REG_CHIPID) & 0xfe) != (chipid & 0xfe))
  487. return 0; /* Chip type doesn't match */
  488. /*
  489. * We compare all the limit registers, the config register and the
  490. * interrupt mask registers
  491. */
  492. for (i = 0x2b; i <= 0x3d; i++) {
  493. if (lm78_read_value(isa, i) !=
  494. i2c_smbus_read_byte_data(client, i))
  495. return 0;
  496. }
  497. if (lm78_read_value(isa, LM78_REG_CONFIG) !=
  498. i2c_smbus_read_byte_data(client, LM78_REG_CONFIG))
  499. return 0;
  500. for (i = 0x43; i <= 0x46; i++) {
  501. if (lm78_read_value(isa, i) !=
  502. i2c_smbus_read_byte_data(client, i))
  503. return 0;
  504. }
  505. return 1;
  506. }
  507. #else /* !CONFIG_ISA */
  508. static int lm78_alias_detect(struct i2c_client *client, u8 chipid)
  509. {
  510. return 0;
  511. }
  512. static struct lm78_data *lm78_data_if_isa(void)
  513. {
  514. return NULL;
  515. }
  516. #endif /* CONFIG_ISA */
  517. static int lm78_i2c_detect(struct i2c_client *client,
  518. struct i2c_board_info *info)
  519. {
  520. int i;
  521. struct lm78_data *isa = lm78_data_if_isa();
  522. const char *client_name;
  523. struct i2c_adapter *adapter = client->adapter;
  524. int address = client->addr;
  525. if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
  526. return -ENODEV;
  527. /*
  528. * We block updates of the ISA device to minimize the risk of
  529. * concurrent access to the same LM78 chip through different
  530. * interfaces.
  531. */
  532. if (isa)
  533. mutex_lock(&isa->update_lock);
  534. if ((i2c_smbus_read_byte_data(client, LM78_REG_CONFIG) & 0x80)
  535. || i2c_smbus_read_byte_data(client, LM78_REG_I2C_ADDR) != address)
  536. goto err_nodev;
  537. /* Explicitly prevent the misdetection of Winbond chips */
  538. i = i2c_smbus_read_byte_data(client, 0x4f);
  539. if (i == 0xa3 || i == 0x5c)
  540. goto err_nodev;
  541. /* Determine the chip type. */
  542. i = i2c_smbus_read_byte_data(client, LM78_REG_CHIPID);
  543. if (i == 0x00 || i == 0x20 /* LM78 */
  544. || i == 0x40) /* LM78-J */
  545. client_name = "lm78";
  546. else if ((i & 0xfe) == 0xc0)
  547. client_name = "lm79";
  548. else
  549. goto err_nodev;
  550. if (lm78_alias_detect(client, i)) {
  551. dev_dbg(&adapter->dev,
  552. "Device at 0x%02x appears to be the same as ISA device\n",
  553. address);
  554. goto err_nodev;
  555. }
  556. if (isa)
  557. mutex_unlock(&isa->update_lock);
  558. strlcpy(info->type, client_name, I2C_NAME_SIZE);
  559. return 0;
  560. err_nodev:
  561. if (isa)
  562. mutex_unlock(&isa->update_lock);
  563. return -ENODEV;
  564. }
  565. static int lm78_i2c_probe(struct i2c_client *client,
  566. const struct i2c_device_id *id)
  567. {
  568. struct lm78_data *data;
  569. int err;
  570. data = devm_kzalloc(&client->dev, sizeof(struct lm78_data), GFP_KERNEL);
  571. if (!data)
  572. return -ENOMEM;
  573. i2c_set_clientdata(client, data);
  574. data->client = client;
  575. data->type = id->driver_data;
  576. /* Initialize the LM78 chip */
  577. lm78_init_device(data);
  578. /* Register sysfs hooks */
  579. err = sysfs_create_group(&client->dev.kobj, &lm78_group);
  580. if (err)
  581. return err;
  582. data->hwmon_dev = hwmon_device_register(&client->dev);
  583. if (IS_ERR(data->hwmon_dev)) {
  584. err = PTR_ERR(data->hwmon_dev);
  585. goto error;
  586. }
  587. return 0;
  588. error:
  589. sysfs_remove_group(&client->dev.kobj, &lm78_group);
  590. return err;
  591. }
  592. static int lm78_i2c_remove(struct i2c_client *client)
  593. {
  594. struct lm78_data *data = i2c_get_clientdata(client);
  595. hwmon_device_unregister(data->hwmon_dev);
  596. sysfs_remove_group(&client->dev.kobj, &lm78_group);
  597. return 0;
  598. }
  599. static const struct i2c_device_id lm78_i2c_id[] = {
  600. { "lm78", lm78 },
  601. { "lm79", lm79 },
  602. { }
  603. };
  604. MODULE_DEVICE_TABLE(i2c, lm78_i2c_id);
  605. static struct i2c_driver lm78_driver = {
  606. .class = I2C_CLASS_HWMON,
  607. .driver = {
  608. .name = "lm78",
  609. },
  610. .probe = lm78_i2c_probe,
  611. .remove = lm78_i2c_remove,
  612. .id_table = lm78_i2c_id,
  613. .detect = lm78_i2c_detect,
  614. .address_list = normal_i2c,
  615. };
  616. /*
  617. * The SMBus locks itself, but ISA access must be locked explicitly!
  618. * We don't want to lock the whole ISA bus, so we lock each client
  619. * separately.
  620. * We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
  621. * would slow down the LM78 access and should not be necessary.
  622. */
  623. static int lm78_read_value(struct lm78_data *data, u8 reg)
  624. {
  625. struct i2c_client *client = data->client;
  626. #ifdef CONFIG_ISA
  627. if (!client) { /* ISA device */
  628. int res;
  629. mutex_lock(&data->lock);
  630. outb_p(reg, data->isa_addr + LM78_ADDR_REG_OFFSET);
  631. res = inb_p(data->isa_addr + LM78_DATA_REG_OFFSET);
  632. mutex_unlock(&data->lock);
  633. return res;
  634. } else
  635. #endif
  636. return i2c_smbus_read_byte_data(client, reg);
  637. }
  638. static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value)
  639. {
  640. struct i2c_client *client = data->client;
  641. #ifdef CONFIG_ISA
  642. if (!client) { /* ISA device */
  643. mutex_lock(&data->lock);
  644. outb_p(reg, data->isa_addr + LM78_ADDR_REG_OFFSET);
  645. outb_p(value, data->isa_addr + LM78_DATA_REG_OFFSET);
  646. mutex_unlock(&data->lock);
  647. return 0;
  648. } else
  649. #endif
  650. return i2c_smbus_write_byte_data(client, reg, value);
  651. }
  652. static void lm78_init_device(struct lm78_data *data)
  653. {
  654. u8 config;
  655. int i;
  656. /* Start monitoring */
  657. config = lm78_read_value(data, LM78_REG_CONFIG);
  658. if ((config & 0x09) != 0x01)
  659. lm78_write_value(data, LM78_REG_CONFIG,
  660. (config & 0xf7) | 0x01);
  661. /* A few vars need to be filled upon startup */
  662. for (i = 0; i < 3; i++) {
  663. data->fan_min[i] = lm78_read_value(data,
  664. LM78_REG_FAN_MIN(i));
  665. }
  666. mutex_init(&data->update_lock);
  667. }
  668. static struct lm78_data *lm78_update_device(struct device *dev)
  669. {
  670. struct lm78_data *data = dev_get_drvdata(dev);
  671. int i;
  672. mutex_lock(&data->update_lock);
  673. if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
  674. || !data->valid) {
  675. dev_dbg(dev, "Starting lm78 update\n");
  676. for (i = 0; i <= 6; i++) {
  677. data->in[i] =
  678. lm78_read_value(data, LM78_REG_IN(i));
  679. data->in_min[i] =
  680. lm78_read_value(data, LM78_REG_IN_MIN(i));
  681. data->in_max[i] =
  682. lm78_read_value(data, LM78_REG_IN_MAX(i));
  683. }
  684. for (i = 0; i < 3; i++) {
  685. data->fan[i] =
  686. lm78_read_value(data, LM78_REG_FAN(i));
  687. data->fan_min[i] =
  688. lm78_read_value(data, LM78_REG_FAN_MIN(i));
  689. }
  690. data->temp = lm78_read_value(data, LM78_REG_TEMP);
  691. data->temp_over =
  692. lm78_read_value(data, LM78_REG_TEMP_OVER);
  693. data->temp_hyst =
  694. lm78_read_value(data, LM78_REG_TEMP_HYST);
  695. i = lm78_read_value(data, LM78_REG_VID_FANDIV);
  696. data->vid = i & 0x0f;
  697. if (data->type == lm79)
  698. data->vid |=
  699. (lm78_read_value(data, LM78_REG_CHIPID) &
  700. 0x01) << 4;
  701. else
  702. data->vid |= 0x10;
  703. data->fan_div[0] = (i >> 4) & 0x03;
  704. data->fan_div[1] = i >> 6;
  705. data->alarms = lm78_read_value(data, LM78_REG_ALARM1) +
  706. (lm78_read_value(data, LM78_REG_ALARM2) << 8);
  707. data->last_updated = jiffies;
  708. data->valid = 1;
  709. data->fan_div[2] = 1;
  710. }
  711. mutex_unlock(&data->update_lock);
  712. return data;
  713. }
  714. #ifdef CONFIG_ISA
  715. static int lm78_isa_probe(struct platform_device *pdev)
  716. {
  717. int err;
  718. struct lm78_data *data;
  719. struct resource *res;
  720. /* Reserve the ISA region */
  721. res = platform_get_resource(pdev, IORESOURCE_IO, 0);
  722. if (!devm_request_region(&pdev->dev, res->start + LM78_ADDR_REG_OFFSET,
  723. 2, "lm78"))
  724. return -EBUSY;
  725. data = devm_kzalloc(&pdev->dev, sizeof(struct lm78_data), GFP_KERNEL);
  726. if (!data)
  727. return -ENOMEM;
  728. mutex_init(&data->lock);
  729. data->isa_addr = res->start;
  730. platform_set_drvdata(pdev, data);
  731. if (lm78_read_value(data, LM78_REG_CHIPID) & 0x80) {
  732. data->type = lm79;
  733. data->name = "lm79";
  734. } else {
  735. data->type = lm78;
  736. data->name = "lm78";
  737. }
  738. /* Initialize the LM78 chip */
  739. lm78_init_device(data);
  740. /* Register sysfs hooks */
  741. err = sysfs_create_group(&pdev->dev.kobj, &lm78_group);
  742. if (err)
  743. goto exit_remove_files;
  744. err = device_create_file(&pdev->dev, &dev_attr_name);
  745. if (err)
  746. goto exit_remove_files;
  747. data->hwmon_dev = hwmon_device_register(&pdev->dev);
  748. if (IS_ERR(data->hwmon_dev)) {
  749. err = PTR_ERR(data->hwmon_dev);
  750. goto exit_remove_files;
  751. }
  752. return 0;
  753. exit_remove_files:
  754. sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
  755. device_remove_file(&pdev->dev, &dev_attr_name);
  756. return err;
  757. }
  758. static int lm78_isa_remove(struct platform_device *pdev)
  759. {
  760. struct lm78_data *data = platform_get_drvdata(pdev);
  761. hwmon_device_unregister(data->hwmon_dev);
  762. sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
  763. device_remove_file(&pdev->dev, &dev_attr_name);
  764. return 0;
  765. }
  766. static struct platform_driver lm78_isa_driver = {
  767. .driver = {
  768. .owner = THIS_MODULE,
  769. .name = "lm78",
  770. },
  771. .probe = lm78_isa_probe,
  772. .remove = lm78_isa_remove,
  773. };
  774. /* return 1 if a supported chip is found, 0 otherwise */
  775. static int __init lm78_isa_found(unsigned short address)
  776. {
  777. int val, save, found = 0;
  778. int port;
  779. /*
  780. * Some boards declare base+0 to base+7 as a PNP device, some base+4
  781. * to base+7 and some base+5 to base+6. So we better request each port
  782. * individually for the probing phase.
  783. */
  784. for (port = address; port < address + LM78_EXTENT; port++) {
  785. if (!request_region(port, 1, "lm78")) {
  786. pr_debug("Failed to request port 0x%x\n", port);
  787. goto release;
  788. }
  789. }
  790. #define REALLY_SLOW_IO
  791. /*
  792. * We need the timeouts for at least some LM78-like
  793. * chips. But only if we read 'undefined' registers.
  794. */
  795. val = inb_p(address + 1);
  796. if (inb_p(address + 2) != val
  797. || inb_p(address + 3) != val
  798. || inb_p(address + 7) != val)
  799. goto release;
  800. #undef REALLY_SLOW_IO
  801. /*
  802. * We should be able to change the 7 LSB of the address port. The
  803. * MSB (busy flag) should be clear initially, set after the write.
  804. */
  805. save = inb_p(address + LM78_ADDR_REG_OFFSET);
  806. if (save & 0x80)
  807. goto release;
  808. val = ~save & 0x7f;
  809. outb_p(val, address + LM78_ADDR_REG_OFFSET);
  810. if (inb_p(address + LM78_ADDR_REG_OFFSET) != (val | 0x80)) {
  811. outb_p(save, address + LM78_ADDR_REG_OFFSET);
  812. goto release;
  813. }
  814. /* We found a device, now see if it could be an LM78 */
  815. outb_p(LM78_REG_CONFIG, address + LM78_ADDR_REG_OFFSET);
  816. val = inb_p(address + LM78_DATA_REG_OFFSET);
  817. if (val & 0x80)
  818. goto release;
  819. outb_p(LM78_REG_I2C_ADDR, address + LM78_ADDR_REG_OFFSET);
  820. val = inb_p(address + LM78_DATA_REG_OFFSET);
  821. if (val < 0x03 || val > 0x77) /* Not a valid I2C address */
  822. goto release;
  823. /* The busy flag should be clear again */
  824. if (inb_p(address + LM78_ADDR_REG_OFFSET) & 0x80)
  825. goto release;
  826. /* Explicitly prevent the misdetection of Winbond chips */
  827. outb_p(0x4f, address + LM78_ADDR_REG_OFFSET);
  828. val = inb_p(address + LM78_DATA_REG_OFFSET);
  829. if (val == 0xa3 || val == 0x5c)
  830. goto release;
  831. /* Explicitly prevent the misdetection of ITE chips */
  832. outb_p(0x58, address + LM78_ADDR_REG_OFFSET);
  833. val = inb_p(address + LM78_DATA_REG_OFFSET);
  834. if (val == 0x90)
  835. goto release;
  836. /* Determine the chip type */
  837. outb_p(LM78_REG_CHIPID, address + LM78_ADDR_REG_OFFSET);
  838. val = inb_p(address + LM78_DATA_REG_OFFSET);
  839. if (val == 0x00 || val == 0x20 /* LM78 */
  840. || val == 0x40 /* LM78-J */
  841. || (val & 0xfe) == 0xc0) /* LM79 */
  842. found = 1;
  843. if (found)
  844. pr_info("Found an %s chip at %#x\n",
  845. val & 0x80 ? "LM79" : "LM78", (int)address);
  846. release:
  847. for (port--; port >= address; port--)
  848. release_region(port, 1);
  849. return found;
  850. }
  851. static int __init lm78_isa_device_add(unsigned short address)
  852. {
  853. struct resource res = {
  854. .start = address,
  855. .end = address + LM78_EXTENT - 1,
  856. .name = "lm78",
  857. .flags = IORESOURCE_IO,
  858. };
  859. int err;
  860. pdev = platform_device_alloc("lm78", address);
  861. if (!pdev) {
  862. err = -ENOMEM;
  863. pr_err("Device allocation failed\n");
  864. goto exit;
  865. }
  866. err = platform_device_add_resources(pdev, &res, 1);
  867. if (err) {
  868. pr_err("Device resource addition failed (%d)\n", err);
  869. goto exit_device_put;
  870. }
  871. err = platform_device_add(pdev);
  872. if (err) {
  873. pr_err("Device addition failed (%d)\n", err);
  874. goto exit_device_put;
  875. }
  876. return 0;
  877. exit_device_put:
  878. platform_device_put(pdev);
  879. exit:
  880. pdev = NULL;
  881. return err;
  882. }
  883. static int __init lm78_isa_register(void)
  884. {
  885. int res;
  886. if (lm78_isa_found(isa_address)) {
  887. res = platform_driver_register(&lm78_isa_driver);
  888. if (res)
  889. goto exit;
  890. /* Sets global pdev as a side effect */
  891. res = lm78_isa_device_add(isa_address);
  892. if (res)
  893. goto exit_unreg_isa_driver;
  894. }
  895. return 0;
  896. exit_unreg_isa_driver:
  897. platform_driver_unregister(&lm78_isa_driver);
  898. exit:
  899. return res;
  900. }
  901. static void lm78_isa_unregister(void)
  902. {
  903. if (pdev) {
  904. platform_device_unregister(pdev);
  905. platform_driver_unregister(&lm78_isa_driver);
  906. }
  907. }
  908. #else /* !CONFIG_ISA */
  909. static int __init lm78_isa_register(void)
  910. {
  911. return 0;
  912. }
  913. static void lm78_isa_unregister(void)
  914. {
  915. }
  916. #endif /* CONFIG_ISA */
  917. static int __init sm_lm78_init(void)
  918. {
  919. int res;
  920. /*
  921. * We register the ISA device first, so that we can skip the
  922. * registration of an I2C interface to the same device.
  923. */
  924. res = lm78_isa_register();
  925. if (res)
  926. goto exit;
  927. res = i2c_add_driver(&lm78_driver);
  928. if (res)
  929. goto exit_unreg_isa_device;
  930. return 0;
  931. exit_unreg_isa_device:
  932. lm78_isa_unregister();
  933. exit:
  934. return res;
  935. }
  936. static void __exit sm_lm78_exit(void)
  937. {
  938. lm78_isa_unregister();
  939. i2c_del_driver(&lm78_driver);
  940. }
  941. MODULE_AUTHOR("Frodo Looijaard, Jean Delvare <jdelvare@suse.de>");
  942. MODULE_DESCRIPTION("LM78/LM79 driver");
  943. MODULE_LICENSE("GPL");
  944. module_init(sm_lm78_init);
  945. module_exit(sm_lm78_exit);