smsc47m1.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956
  1. /*
  2. * smsc47m1.c - Part of lm_sensors, Linux kernel modules
  3. * for hardware monitoring
  4. *
  5. * Supports the SMSC LPC47B27x, LPC47M10x, LPC47M112, LPC47M13x,
  6. * LPC47M14x, LPC47M15x, LPC47M192, LPC47M292 and LPC47M997
  7. * Super-I/O chips.
  8. *
  9. * Copyright (C) 2002 Mark D. Studebaker <mdsxyz123@yahoo.com>
  10. * Copyright (C) 2004-2007 Jean Delvare <jdelvare@suse.de>
  11. * Ported to Linux 2.6 by Gabriele Gorla <gorlik@yahoo.com>
  12. * and Jean Delvare
  13. *
  14. * This program is free software; you can redistribute it and/or modify
  15. * it under the terms of the GNU General Public License as published by
  16. * the Free Software Foundation; either version 2 of the License, or
  17. * (at your option) any later version.
  18. *
  19. * This program is distributed in the hope that it will be useful,
  20. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  22. * GNU General Public License for more details.
  23. *
  24. * You should have received a copy of the GNU General Public License
  25. * along with this program; if not, write to the Free Software
  26. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  27. */
  28. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  29. #include <linux/module.h>
  30. #include <linux/slab.h>
  31. #include <linux/ioport.h>
  32. #include <linux/jiffies.h>
  33. #include <linux/platform_device.h>
  34. #include <linux/hwmon.h>
  35. #include <linux/hwmon-sysfs.h>
  36. #include <linux/err.h>
  37. #include <linux/init.h>
  38. #include <linux/mutex.h>
  39. #include <linux/sysfs.h>
  40. #include <linux/acpi.h>
  41. #include <linux/io.h>
  42. static unsigned short force_id;
  43. module_param(force_id, ushort, 0);
  44. MODULE_PARM_DESC(force_id, "Override the detected device ID");
  45. static struct platform_device *pdev;
  46. #define DRVNAME "smsc47m1"
  47. enum chips { smsc47m1, smsc47m2 };
  48. /* Super-I/0 registers and commands */
  49. #define REG 0x2e /* The register to read/write */
  50. #define VAL 0x2f /* The value to read/write */
  51. static inline void
  52. superio_outb(int reg, int val)
  53. {
  54. outb(reg, REG);
  55. outb(val, VAL);
  56. }
  57. static inline int
  58. superio_inb(int reg)
  59. {
  60. outb(reg, REG);
  61. return inb(VAL);
  62. }
  63. /* logical device for fans is 0x0A */
  64. #define superio_select() superio_outb(0x07, 0x0A)
  65. static inline int
  66. superio_enter(void)
  67. {
  68. if (!request_muxed_region(REG, 2, DRVNAME))
  69. return -EBUSY;
  70. outb(0x55, REG);
  71. return 0;
  72. }
  73. static inline void
  74. superio_exit(void)
  75. {
  76. outb(0xAA, REG);
  77. release_region(REG, 2);
  78. }
  79. #define SUPERIO_REG_ACT 0x30
  80. #define SUPERIO_REG_BASE 0x60
  81. #define SUPERIO_REG_DEVID 0x20
  82. #define SUPERIO_REG_DEVREV 0x21
  83. /* Logical device registers */
  84. #define SMSC_EXTENT 0x80
  85. /* nr is 0 or 1 in the macros below */
  86. #define SMSC47M1_REG_ALARM 0x04
  87. #define SMSC47M1_REG_TPIN(nr) (0x34 - (nr))
  88. #define SMSC47M1_REG_PPIN(nr) (0x36 - (nr))
  89. #define SMSC47M1_REG_FANDIV 0x58
  90. static const u8 SMSC47M1_REG_FAN[3] = { 0x59, 0x5a, 0x6b };
  91. static const u8 SMSC47M1_REG_FAN_PRELOAD[3] = { 0x5b, 0x5c, 0x6c };
  92. static const u8 SMSC47M1_REG_PWM[3] = { 0x56, 0x57, 0x69 };
  93. #define SMSC47M2_REG_ALARM6 0x09
  94. #define SMSC47M2_REG_TPIN1 0x38
  95. #define SMSC47M2_REG_TPIN2 0x37
  96. #define SMSC47M2_REG_TPIN3 0x2d
  97. #define SMSC47M2_REG_PPIN3 0x2c
  98. #define SMSC47M2_REG_FANDIV3 0x6a
  99. #define MIN_FROM_REG(reg, div) ((reg) >= 192 ? 0 : \
  100. 983040 / ((192 - (reg)) * (div)))
  101. #define FAN_FROM_REG(reg, div, preload) ((reg) <= (preload) || (reg) == 255 ? \
  102. 0 : \
  103. 983040 / (((reg) - (preload)) * (div)))
  104. #define DIV_FROM_REG(reg) (1 << (reg))
  105. #define PWM_FROM_REG(reg) (((reg) & 0x7E) << 1)
  106. #define PWM_EN_FROM_REG(reg) ((~(reg)) & 0x01)
  107. #define PWM_TO_REG(reg) (((reg) >> 1) & 0x7E)
  108. struct smsc47m1_data {
  109. unsigned short addr;
  110. const char *name;
  111. enum chips type;
  112. struct device *hwmon_dev;
  113. struct mutex update_lock;
  114. unsigned long last_updated; /* In jiffies */
  115. u8 fan[3]; /* Register value */
  116. u8 fan_preload[3]; /* Register value */
  117. u8 fan_div[3]; /* Register encoding, shifted right */
  118. u8 alarms; /* Register encoding */
  119. u8 pwm[3]; /* Register value (bit 0 is disable) */
  120. };
  121. struct smsc47m1_sio_data {
  122. enum chips type;
  123. u8 activate; /* Remember initial device state */
  124. };
  125. static inline int smsc47m1_read_value(struct smsc47m1_data *data, u8 reg)
  126. {
  127. return inb_p(data->addr + reg);
  128. }
  129. static inline void smsc47m1_write_value(struct smsc47m1_data *data, u8 reg,
  130. u8 value)
  131. {
  132. outb_p(value, data->addr + reg);
  133. }
  134. static struct smsc47m1_data *smsc47m1_update_device(struct device *dev,
  135. int init)
  136. {
  137. struct smsc47m1_data *data = dev_get_drvdata(dev);
  138. mutex_lock(&data->update_lock);
  139. if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || init) {
  140. int i, fan_nr;
  141. fan_nr = data->type == smsc47m2 ? 3 : 2;
  142. for (i = 0; i < fan_nr; i++) {
  143. data->fan[i] = smsc47m1_read_value(data,
  144. SMSC47M1_REG_FAN[i]);
  145. data->fan_preload[i] = smsc47m1_read_value(data,
  146. SMSC47M1_REG_FAN_PRELOAD[i]);
  147. data->pwm[i] = smsc47m1_read_value(data,
  148. SMSC47M1_REG_PWM[i]);
  149. }
  150. i = smsc47m1_read_value(data, SMSC47M1_REG_FANDIV);
  151. data->fan_div[0] = (i >> 4) & 0x03;
  152. data->fan_div[1] = i >> 6;
  153. data->alarms = smsc47m1_read_value(data,
  154. SMSC47M1_REG_ALARM) >> 6;
  155. /* Clear alarms if needed */
  156. if (data->alarms)
  157. smsc47m1_write_value(data, SMSC47M1_REG_ALARM, 0xC0);
  158. if (fan_nr >= 3) {
  159. data->fan_div[2] = (smsc47m1_read_value(data,
  160. SMSC47M2_REG_FANDIV3) >> 4) & 0x03;
  161. data->alarms |= (smsc47m1_read_value(data,
  162. SMSC47M2_REG_ALARM6) & 0x40) >> 4;
  163. /* Clear alarm if needed */
  164. if (data->alarms & 0x04)
  165. smsc47m1_write_value(data,
  166. SMSC47M2_REG_ALARM6,
  167. 0x40);
  168. }
  169. data->last_updated = jiffies;
  170. }
  171. mutex_unlock(&data->update_lock);
  172. return data;
  173. }
  174. static ssize_t get_fan(struct device *dev, struct device_attribute
  175. *devattr, char *buf)
  176. {
  177. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  178. struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
  179. int nr = attr->index;
  180. /*
  181. * This chip (stupidly) stops monitoring fan speed if PWM is
  182. * enabled and duty cycle is 0%. This is fine if the monitoring
  183. * and control concern the same fan, but troublesome if they are
  184. * not (which could as well happen).
  185. */
  186. int rpm = (data->pwm[nr] & 0x7F) == 0x00 ? 0 :
  187. FAN_FROM_REG(data->fan[nr],
  188. DIV_FROM_REG(data->fan_div[nr]),
  189. data->fan_preload[nr]);
  190. return sprintf(buf, "%d\n", rpm);
  191. }
  192. static ssize_t get_fan_min(struct device *dev, struct device_attribute
  193. *devattr, char *buf)
  194. {
  195. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  196. struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
  197. int nr = attr->index;
  198. int rpm = MIN_FROM_REG(data->fan_preload[nr],
  199. DIV_FROM_REG(data->fan_div[nr]));
  200. return sprintf(buf, "%d\n", rpm);
  201. }
  202. static ssize_t get_fan_div(struct device *dev, struct device_attribute
  203. *devattr, char *buf)
  204. {
  205. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  206. struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
  207. return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[attr->index]));
  208. }
  209. static ssize_t get_fan_alarm(struct device *dev, struct device_attribute
  210. *devattr, char *buf)
  211. {
  212. int bitnr = to_sensor_dev_attr(devattr)->index;
  213. struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
  214. return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
  215. }
  216. static ssize_t get_pwm(struct device *dev, struct device_attribute
  217. *devattr, char *buf)
  218. {
  219. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  220. struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
  221. return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm[attr->index]));
  222. }
  223. static ssize_t get_pwm_en(struct device *dev, struct device_attribute
  224. *devattr, char *buf)
  225. {
  226. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  227. struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
  228. return sprintf(buf, "%d\n", PWM_EN_FROM_REG(data->pwm[attr->index]));
  229. }
  230. static ssize_t alarms_show(struct device *dev,
  231. struct device_attribute *devattr, char *buf)
  232. {
  233. struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
  234. return sprintf(buf, "%d\n", data->alarms);
  235. }
  236. static ssize_t set_fan_min(struct device *dev, struct device_attribute
  237. *devattr, const char *buf, size_t count)
  238. {
  239. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  240. struct smsc47m1_data *data = dev_get_drvdata(dev);
  241. int nr = attr->index;
  242. long rpmdiv;
  243. long val;
  244. int err;
  245. err = kstrtol(buf, 10, &val);
  246. if (err)
  247. return err;
  248. mutex_lock(&data->update_lock);
  249. rpmdiv = val * DIV_FROM_REG(data->fan_div[nr]);
  250. if (983040 > 192 * rpmdiv || 2 * rpmdiv > 983040) {
  251. mutex_unlock(&data->update_lock);
  252. return -EINVAL;
  253. }
  254. data->fan_preload[nr] = 192 - ((983040 + rpmdiv / 2) / rpmdiv);
  255. smsc47m1_write_value(data, SMSC47M1_REG_FAN_PRELOAD[nr],
  256. data->fan_preload[nr]);
  257. mutex_unlock(&data->update_lock);
  258. return count;
  259. }
  260. /*
  261. * Note: we save and restore the fan minimum here, because its value is
  262. * determined in part by the fan clock divider. This follows the principle
  263. * of least surprise; the user doesn't expect the fan minimum to change just
  264. * because the divider changed.
  265. */
  266. static ssize_t set_fan_div(struct device *dev, struct device_attribute
  267. *devattr, const char *buf, size_t count)
  268. {
  269. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  270. struct smsc47m1_data *data = dev_get_drvdata(dev);
  271. int nr = attr->index;
  272. long new_div;
  273. int err;
  274. long tmp;
  275. u8 old_div = DIV_FROM_REG(data->fan_div[nr]);
  276. err = kstrtol(buf, 10, &new_div);
  277. if (err)
  278. return err;
  279. if (new_div == old_div) /* No change */
  280. return count;
  281. mutex_lock(&data->update_lock);
  282. switch (new_div) {
  283. case 1:
  284. data->fan_div[nr] = 0;
  285. break;
  286. case 2:
  287. data->fan_div[nr] = 1;
  288. break;
  289. case 4:
  290. data->fan_div[nr] = 2;
  291. break;
  292. case 8:
  293. data->fan_div[nr] = 3;
  294. break;
  295. default:
  296. mutex_unlock(&data->update_lock);
  297. return -EINVAL;
  298. }
  299. switch (nr) {
  300. case 0:
  301. case 1:
  302. tmp = smsc47m1_read_value(data, SMSC47M1_REG_FANDIV)
  303. & ~(0x03 << (4 + 2 * nr));
  304. tmp |= data->fan_div[nr] << (4 + 2 * nr);
  305. smsc47m1_write_value(data, SMSC47M1_REG_FANDIV, tmp);
  306. break;
  307. case 2:
  308. tmp = smsc47m1_read_value(data, SMSC47M2_REG_FANDIV3) & 0xCF;
  309. tmp |= data->fan_div[2] << 4;
  310. smsc47m1_write_value(data, SMSC47M2_REG_FANDIV3, tmp);
  311. break;
  312. }
  313. /* Preserve fan min */
  314. tmp = 192 - (old_div * (192 - data->fan_preload[nr])
  315. + new_div / 2) / new_div;
  316. data->fan_preload[nr] = clamp_val(tmp, 0, 191);
  317. smsc47m1_write_value(data, SMSC47M1_REG_FAN_PRELOAD[nr],
  318. data->fan_preload[nr]);
  319. mutex_unlock(&data->update_lock);
  320. return count;
  321. }
  322. static ssize_t set_pwm(struct device *dev, struct device_attribute
  323. *devattr, const char *buf, size_t count)
  324. {
  325. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  326. struct smsc47m1_data *data = dev_get_drvdata(dev);
  327. int nr = attr->index;
  328. long val;
  329. int err;
  330. err = kstrtol(buf, 10, &val);
  331. if (err)
  332. return err;
  333. if (val < 0 || val > 255)
  334. return -EINVAL;
  335. mutex_lock(&data->update_lock);
  336. data->pwm[nr] &= 0x81; /* Preserve additional bits */
  337. data->pwm[nr] |= PWM_TO_REG(val);
  338. smsc47m1_write_value(data, SMSC47M1_REG_PWM[nr],
  339. data->pwm[nr]);
  340. mutex_unlock(&data->update_lock);
  341. return count;
  342. }
  343. static ssize_t set_pwm_en(struct device *dev, struct device_attribute
  344. *devattr, const char *buf, size_t count)
  345. {
  346. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  347. struct smsc47m1_data *data = dev_get_drvdata(dev);
  348. int nr = attr->index;
  349. unsigned long val;
  350. int err;
  351. err = kstrtoul(buf, 10, &val);
  352. if (err)
  353. return err;
  354. if (val > 1)
  355. return -EINVAL;
  356. mutex_lock(&data->update_lock);
  357. data->pwm[nr] &= 0xFE; /* preserve the other bits */
  358. data->pwm[nr] |= !val;
  359. smsc47m1_write_value(data, SMSC47M1_REG_PWM[nr],
  360. data->pwm[nr]);
  361. mutex_unlock(&data->update_lock);
  362. return count;
  363. }
  364. #define fan_present(offset) \
  365. static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, get_fan, \
  366. NULL, offset - 1); \
  367. static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
  368. get_fan_min, set_fan_min, offset - 1); \
  369. static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
  370. get_fan_div, set_fan_div, offset - 1); \
  371. static SENSOR_DEVICE_ATTR(fan##offset##_alarm, S_IRUGO, get_fan_alarm, \
  372. NULL, offset - 1); \
  373. static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \
  374. get_pwm, set_pwm, offset - 1); \
  375. static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \
  376. get_pwm_en, set_pwm_en, offset - 1)
  377. fan_present(1);
  378. fan_present(2);
  379. fan_present(3);
  380. static DEVICE_ATTR_RO(alarms);
  381. static ssize_t name_show(struct device *dev, struct device_attribute
  382. *devattr, char *buf)
  383. {
  384. struct smsc47m1_data *data = dev_get_drvdata(dev);
  385. return sprintf(buf, "%s\n", data->name);
  386. }
  387. static DEVICE_ATTR_RO(name);
  388. static struct attribute *smsc47m1_attributes_fan1[] = {
  389. &sensor_dev_attr_fan1_input.dev_attr.attr,
  390. &sensor_dev_attr_fan1_min.dev_attr.attr,
  391. &sensor_dev_attr_fan1_div.dev_attr.attr,
  392. &sensor_dev_attr_fan1_alarm.dev_attr.attr,
  393. NULL
  394. };
  395. static const struct attribute_group smsc47m1_group_fan1 = {
  396. .attrs = smsc47m1_attributes_fan1,
  397. };
  398. static struct attribute *smsc47m1_attributes_fan2[] = {
  399. &sensor_dev_attr_fan2_input.dev_attr.attr,
  400. &sensor_dev_attr_fan2_min.dev_attr.attr,
  401. &sensor_dev_attr_fan2_div.dev_attr.attr,
  402. &sensor_dev_attr_fan2_alarm.dev_attr.attr,
  403. NULL
  404. };
  405. static const struct attribute_group smsc47m1_group_fan2 = {
  406. .attrs = smsc47m1_attributes_fan2,
  407. };
  408. static struct attribute *smsc47m1_attributes_fan3[] = {
  409. &sensor_dev_attr_fan3_input.dev_attr.attr,
  410. &sensor_dev_attr_fan3_min.dev_attr.attr,
  411. &sensor_dev_attr_fan3_div.dev_attr.attr,
  412. &sensor_dev_attr_fan3_alarm.dev_attr.attr,
  413. NULL
  414. };
  415. static const struct attribute_group smsc47m1_group_fan3 = {
  416. .attrs = smsc47m1_attributes_fan3,
  417. };
  418. static struct attribute *smsc47m1_attributes_pwm1[] = {
  419. &sensor_dev_attr_pwm1.dev_attr.attr,
  420. &sensor_dev_attr_pwm1_enable.dev_attr.attr,
  421. NULL
  422. };
  423. static const struct attribute_group smsc47m1_group_pwm1 = {
  424. .attrs = smsc47m1_attributes_pwm1,
  425. };
  426. static struct attribute *smsc47m1_attributes_pwm2[] = {
  427. &sensor_dev_attr_pwm2.dev_attr.attr,
  428. &sensor_dev_attr_pwm2_enable.dev_attr.attr,
  429. NULL
  430. };
  431. static const struct attribute_group smsc47m1_group_pwm2 = {
  432. .attrs = smsc47m1_attributes_pwm2,
  433. };
  434. static struct attribute *smsc47m1_attributes_pwm3[] = {
  435. &sensor_dev_attr_pwm3.dev_attr.attr,
  436. &sensor_dev_attr_pwm3_enable.dev_attr.attr,
  437. NULL
  438. };
  439. static const struct attribute_group smsc47m1_group_pwm3 = {
  440. .attrs = smsc47m1_attributes_pwm3,
  441. };
  442. static struct attribute *smsc47m1_attributes[] = {
  443. &dev_attr_alarms.attr,
  444. &dev_attr_name.attr,
  445. NULL
  446. };
  447. static const struct attribute_group smsc47m1_group = {
  448. .attrs = smsc47m1_attributes,
  449. };
  450. static int __init smsc47m1_find(struct smsc47m1_sio_data *sio_data)
  451. {
  452. u8 val;
  453. unsigned short addr;
  454. int err;
  455. err = superio_enter();
  456. if (err)
  457. return err;
  458. val = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID);
  459. /*
  460. * SMSC LPC47M10x/LPC47M112/LPC47M13x (device id 0x59), LPC47M14x
  461. * (device id 0x5F) and LPC47B27x (device id 0x51) have fan control.
  462. * The LPC47M15x and LPC47M192 chips "with hardware monitoring block"
  463. * can do much more besides (device id 0x60).
  464. * The LPC47M997 is undocumented, but seems to be compatible with
  465. * the LPC47M192, and has the same device id.
  466. * The LPC47M292 (device id 0x6B) is somewhat compatible, but it
  467. * supports a 3rd fan, and the pin configuration registers are
  468. * unfortunately different.
  469. * The LPC47M233 has the same device id (0x6B) but is not compatible.
  470. * We check the high bit of the device revision register to
  471. * differentiate them.
  472. */
  473. switch (val) {
  474. case 0x51:
  475. pr_info("Found SMSC LPC47B27x\n");
  476. sio_data->type = smsc47m1;
  477. break;
  478. case 0x59:
  479. pr_info("Found SMSC LPC47M10x/LPC47M112/LPC47M13x\n");
  480. sio_data->type = smsc47m1;
  481. break;
  482. case 0x5F:
  483. pr_info("Found SMSC LPC47M14x\n");
  484. sio_data->type = smsc47m1;
  485. break;
  486. case 0x60:
  487. pr_info("Found SMSC LPC47M15x/LPC47M192/LPC47M997\n");
  488. sio_data->type = smsc47m1;
  489. break;
  490. case 0x6B:
  491. if (superio_inb(SUPERIO_REG_DEVREV) & 0x80) {
  492. pr_debug("Found SMSC LPC47M233, unsupported\n");
  493. superio_exit();
  494. return -ENODEV;
  495. }
  496. pr_info("Found SMSC LPC47M292\n");
  497. sio_data->type = smsc47m2;
  498. break;
  499. default:
  500. superio_exit();
  501. return -ENODEV;
  502. }
  503. superio_select();
  504. addr = (superio_inb(SUPERIO_REG_BASE) << 8)
  505. | superio_inb(SUPERIO_REG_BASE + 1);
  506. if (addr == 0) {
  507. pr_info("Device address not set, will not use\n");
  508. superio_exit();
  509. return -ENODEV;
  510. }
  511. /*
  512. * Enable only if address is set (needed at least on the
  513. * Compaq Presario S4000NX)
  514. */
  515. sio_data->activate = superio_inb(SUPERIO_REG_ACT);
  516. if ((sio_data->activate & 0x01) == 0) {
  517. pr_info("Enabling device\n");
  518. superio_outb(SUPERIO_REG_ACT, sio_data->activate | 0x01);
  519. }
  520. superio_exit();
  521. return addr;
  522. }
  523. /* Restore device to its initial state */
  524. static void smsc47m1_restore(const struct smsc47m1_sio_data *sio_data)
  525. {
  526. if ((sio_data->activate & 0x01) == 0) {
  527. if (!superio_enter()) {
  528. superio_select();
  529. pr_info("Disabling device\n");
  530. superio_outb(SUPERIO_REG_ACT, sio_data->activate);
  531. superio_exit();
  532. } else {
  533. pr_warn("Failed to disable device\n");
  534. }
  535. }
  536. }
  537. #define CHECK 1
  538. #define REQUEST 2
  539. /*
  540. * This function can be used to:
  541. * - test for resource conflicts with ACPI
  542. * - request the resources
  543. * We only allocate the I/O ports we really need, to minimize the risk of
  544. * conflicts with ACPI or with other drivers.
  545. */
  546. static int __init smsc47m1_handle_resources(unsigned short address,
  547. enum chips type, int action,
  548. struct device *dev)
  549. {
  550. static const u8 ports_m1[] = {
  551. /* register, region length */
  552. 0x04, 1,
  553. 0x33, 4,
  554. 0x56, 7,
  555. };
  556. static const u8 ports_m2[] = {
  557. /* register, region length */
  558. 0x04, 1,
  559. 0x09, 1,
  560. 0x2c, 2,
  561. 0x35, 4,
  562. 0x56, 7,
  563. 0x69, 4,
  564. };
  565. int i, ports_size, err;
  566. const u8 *ports;
  567. switch (type) {
  568. case smsc47m1:
  569. default:
  570. ports = ports_m1;
  571. ports_size = ARRAY_SIZE(ports_m1);
  572. break;
  573. case smsc47m2:
  574. ports = ports_m2;
  575. ports_size = ARRAY_SIZE(ports_m2);
  576. break;
  577. }
  578. for (i = 0; i + 1 < ports_size; i += 2) {
  579. unsigned short start = address + ports[i];
  580. unsigned short len = ports[i + 1];
  581. switch (action) {
  582. case CHECK:
  583. /* Only check for conflicts */
  584. err = acpi_check_region(start, len, DRVNAME);
  585. if (err)
  586. return err;
  587. break;
  588. case REQUEST:
  589. /* Request the resources */
  590. if (!devm_request_region(dev, start, len, DRVNAME)) {
  591. dev_err(dev,
  592. "Region 0x%hx-0x%hx already in use!\n",
  593. start, start + len);
  594. return -EBUSY;
  595. }
  596. break;
  597. }
  598. }
  599. return 0;
  600. }
  601. static void smsc47m1_remove_files(struct device *dev)
  602. {
  603. sysfs_remove_group(&dev->kobj, &smsc47m1_group);
  604. sysfs_remove_group(&dev->kobj, &smsc47m1_group_fan1);
  605. sysfs_remove_group(&dev->kobj, &smsc47m1_group_fan2);
  606. sysfs_remove_group(&dev->kobj, &smsc47m1_group_fan3);
  607. sysfs_remove_group(&dev->kobj, &smsc47m1_group_pwm1);
  608. sysfs_remove_group(&dev->kobj, &smsc47m1_group_pwm2);
  609. sysfs_remove_group(&dev->kobj, &smsc47m1_group_pwm3);
  610. }
  611. static int __init smsc47m1_probe(struct platform_device *pdev)
  612. {
  613. struct device *dev = &pdev->dev;
  614. struct smsc47m1_sio_data *sio_data = dev_get_platdata(dev);
  615. struct smsc47m1_data *data;
  616. struct resource *res;
  617. int err;
  618. int fan1, fan2, fan3, pwm1, pwm2, pwm3;
  619. static const char * const names[] = {
  620. "smsc47m1",
  621. "smsc47m2",
  622. };
  623. res = platform_get_resource(pdev, IORESOURCE_IO, 0);
  624. err = smsc47m1_handle_resources(res->start, sio_data->type,
  625. REQUEST, dev);
  626. if (err < 0)
  627. return err;
  628. data = devm_kzalloc(dev, sizeof(struct smsc47m1_data), GFP_KERNEL);
  629. if (!data)
  630. return -ENOMEM;
  631. data->addr = res->start;
  632. data->type = sio_data->type;
  633. data->name = names[sio_data->type];
  634. mutex_init(&data->update_lock);
  635. platform_set_drvdata(pdev, data);
  636. /*
  637. * If no function is properly configured, there's no point in
  638. * actually registering the chip.
  639. */
  640. pwm1 = (smsc47m1_read_value(data, SMSC47M1_REG_PPIN(0)) & 0x05)
  641. == 0x04;
  642. pwm2 = (smsc47m1_read_value(data, SMSC47M1_REG_PPIN(1)) & 0x05)
  643. == 0x04;
  644. if (data->type == smsc47m2) {
  645. fan1 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN1)
  646. & 0x0d) == 0x09;
  647. fan2 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN2)
  648. & 0x0d) == 0x09;
  649. fan3 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN3)
  650. & 0x0d) == 0x0d;
  651. pwm3 = (smsc47m1_read_value(data, SMSC47M2_REG_PPIN3)
  652. & 0x0d) == 0x08;
  653. } else {
  654. fan1 = (smsc47m1_read_value(data, SMSC47M1_REG_TPIN(0))
  655. & 0x05) == 0x05;
  656. fan2 = (smsc47m1_read_value(data, SMSC47M1_REG_TPIN(1))
  657. & 0x05) == 0x05;
  658. fan3 = 0;
  659. pwm3 = 0;
  660. }
  661. if (!(fan1 || fan2 || fan3 || pwm1 || pwm2 || pwm3)) {
  662. dev_warn(dev, "Device not configured, will not use\n");
  663. return -ENODEV;
  664. }
  665. /*
  666. * Some values (fan min, clock dividers, pwm registers) may be
  667. * needed before any update is triggered, so we better read them
  668. * at least once here. We don't usually do it that way, but in
  669. * this particular case, manually reading 5 registers out of 8
  670. * doesn't make much sense and we're better using the existing
  671. * function.
  672. */
  673. smsc47m1_update_device(dev, 1);
  674. /* Register sysfs hooks */
  675. if (fan1) {
  676. err = sysfs_create_group(&dev->kobj,
  677. &smsc47m1_group_fan1);
  678. if (err)
  679. goto error_remove_files;
  680. } else
  681. dev_dbg(dev, "Fan 1 not enabled by hardware, skipping\n");
  682. if (fan2) {
  683. err = sysfs_create_group(&dev->kobj,
  684. &smsc47m1_group_fan2);
  685. if (err)
  686. goto error_remove_files;
  687. } else
  688. dev_dbg(dev, "Fan 2 not enabled by hardware, skipping\n");
  689. if (fan3) {
  690. err = sysfs_create_group(&dev->kobj,
  691. &smsc47m1_group_fan3);
  692. if (err)
  693. goto error_remove_files;
  694. } else if (data->type == smsc47m2)
  695. dev_dbg(dev, "Fan 3 not enabled by hardware, skipping\n");
  696. if (pwm1) {
  697. err = sysfs_create_group(&dev->kobj,
  698. &smsc47m1_group_pwm1);
  699. if (err)
  700. goto error_remove_files;
  701. } else
  702. dev_dbg(dev, "PWM 1 not enabled by hardware, skipping\n");
  703. if (pwm2) {
  704. err = sysfs_create_group(&dev->kobj,
  705. &smsc47m1_group_pwm2);
  706. if (err)
  707. goto error_remove_files;
  708. } else
  709. dev_dbg(dev, "PWM 2 not enabled by hardware, skipping\n");
  710. if (pwm3) {
  711. err = sysfs_create_group(&dev->kobj,
  712. &smsc47m1_group_pwm3);
  713. if (err)
  714. goto error_remove_files;
  715. } else if (data->type == smsc47m2)
  716. dev_dbg(dev, "PWM 3 not enabled by hardware, skipping\n");
  717. err = sysfs_create_group(&dev->kobj, &smsc47m1_group);
  718. if (err)
  719. goto error_remove_files;
  720. data->hwmon_dev = hwmon_device_register(dev);
  721. if (IS_ERR(data->hwmon_dev)) {
  722. err = PTR_ERR(data->hwmon_dev);
  723. goto error_remove_files;
  724. }
  725. return 0;
  726. error_remove_files:
  727. smsc47m1_remove_files(dev);
  728. return err;
  729. }
  730. static int __exit smsc47m1_remove(struct platform_device *pdev)
  731. {
  732. struct smsc47m1_data *data = platform_get_drvdata(pdev);
  733. hwmon_device_unregister(data->hwmon_dev);
  734. smsc47m1_remove_files(&pdev->dev);
  735. return 0;
  736. }
  737. static struct platform_driver smsc47m1_driver = {
  738. .driver = {
  739. .name = DRVNAME,
  740. },
  741. .remove = __exit_p(smsc47m1_remove),
  742. };
  743. static int __init smsc47m1_device_add(unsigned short address,
  744. const struct smsc47m1_sio_data *sio_data)
  745. {
  746. struct resource res = {
  747. .start = address,
  748. .end = address + SMSC_EXTENT - 1,
  749. .name = DRVNAME,
  750. .flags = IORESOURCE_IO,
  751. };
  752. int err;
  753. err = smsc47m1_handle_resources(address, sio_data->type, CHECK, NULL);
  754. if (err)
  755. goto exit;
  756. pdev = platform_device_alloc(DRVNAME, address);
  757. if (!pdev) {
  758. err = -ENOMEM;
  759. pr_err("Device allocation failed\n");
  760. goto exit;
  761. }
  762. err = platform_device_add_resources(pdev, &res, 1);
  763. if (err) {
  764. pr_err("Device resource addition failed (%d)\n", err);
  765. goto exit_device_put;
  766. }
  767. err = platform_device_add_data(pdev, sio_data,
  768. sizeof(struct smsc47m1_sio_data));
  769. if (err) {
  770. pr_err("Platform data allocation failed\n");
  771. goto exit_device_put;
  772. }
  773. err = platform_device_add(pdev);
  774. if (err) {
  775. pr_err("Device addition failed (%d)\n", err);
  776. goto exit_device_put;
  777. }
  778. return 0;
  779. exit_device_put:
  780. platform_device_put(pdev);
  781. exit:
  782. return err;
  783. }
  784. static int __init sm_smsc47m1_init(void)
  785. {
  786. int err;
  787. unsigned short address;
  788. struct smsc47m1_sio_data sio_data;
  789. err = smsc47m1_find(&sio_data);
  790. if (err < 0)
  791. return err;
  792. address = err;
  793. /* Sets global pdev as a side effect */
  794. err = smsc47m1_device_add(address, &sio_data);
  795. if (err)
  796. return err;
  797. err = platform_driver_probe(&smsc47m1_driver, smsc47m1_probe);
  798. if (err)
  799. goto exit_device;
  800. return 0;
  801. exit_device:
  802. platform_device_unregister(pdev);
  803. smsc47m1_restore(&sio_data);
  804. return err;
  805. }
  806. static void __exit sm_smsc47m1_exit(void)
  807. {
  808. platform_driver_unregister(&smsc47m1_driver);
  809. smsc47m1_restore(dev_get_platdata(&pdev->dev));
  810. platform_device_unregister(pdev);
  811. }
  812. MODULE_AUTHOR("Mark D. Studebaker <mdsxyz123@yahoo.com>");
  813. MODULE_DESCRIPTION("SMSC LPC47M1xx fan sensors driver");
  814. MODULE_LICENSE("GPL");
  815. module_init(sm_smsc47m1_init);
  816. module_exit(sm_smsc47m1_exit);