adt7470.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116
  1. /*
  2. * A hwmon driver for the Analog Devices ADT7470
  3. * Copyright (C) 2007 IBM
  4. *
  5. * Author: Darrick J. Wong <djwong@us.ibm.com>
  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20. */
  21. #include <linux/module.h>
  22. #include <linux/jiffies.h>
  23. #include <linux/i2c.h>
  24. #include <linux/hwmon.h>
  25. #include <linux/hwmon-sysfs.h>
  26. #include <linux/err.h>
  27. #include <linux/mutex.h>
  28. #include <linux/delay.h>
  29. #include <linux/log2.h>
  30. /* Addresses to scan */
  31. static const unsigned short normal_i2c[] = { 0x2C, 0x2E, 0x2F, I2C_CLIENT_END };
  32. /* Insmod parameters */
  33. I2C_CLIENT_INSMOD_1(adt7470);
  34. /* ADT7470 registers */
  35. #define ADT7470_REG_BASE_ADDR 0x20
  36. #define ADT7470_REG_TEMP_BASE_ADDR 0x20
  37. #define ADT7470_REG_TEMP_MAX_ADDR 0x29
  38. #define ADT7470_REG_FAN_BASE_ADDR 0x2A
  39. #define ADT7470_REG_FAN_MAX_ADDR 0x31
  40. #define ADT7470_REG_PWM_BASE_ADDR 0x32
  41. #define ADT7470_REG_PWM_MAX_ADDR 0x35
  42. #define ADT7470_REG_PWM_MAX_BASE_ADDR 0x38
  43. #define ADT7470_REG_PWM_MAX_MAX_ADDR 0x3B
  44. #define ADT7470_REG_CFG 0x40
  45. #define ADT7470_FSPD_MASK 0x04
  46. #define ADT7470_REG_ALARM1 0x41
  47. #define ADT7470_R1T_ALARM 0x01
  48. #define ADT7470_R2T_ALARM 0x02
  49. #define ADT7470_R3T_ALARM 0x04
  50. #define ADT7470_R4T_ALARM 0x08
  51. #define ADT7470_R5T_ALARM 0x10
  52. #define ADT7470_R6T_ALARM 0x20
  53. #define ADT7470_R7T_ALARM 0x40
  54. #define ADT7470_OOL_ALARM 0x80
  55. #define ADT7470_REG_ALARM2 0x42
  56. #define ADT7470_R8T_ALARM 0x01
  57. #define ADT7470_R9T_ALARM 0x02
  58. #define ADT7470_R10T_ALARM 0x04
  59. #define ADT7470_FAN1_ALARM 0x10
  60. #define ADT7470_FAN2_ALARM 0x20
  61. #define ADT7470_FAN3_ALARM 0x40
  62. #define ADT7470_FAN4_ALARM 0x80
  63. #define ADT7470_REG_TEMP_LIMITS_BASE_ADDR 0x44
  64. #define ADT7470_REG_TEMP_LIMITS_MAX_ADDR 0x57
  65. #define ADT7470_REG_FAN_MIN_BASE_ADDR 0x58
  66. #define ADT7470_REG_FAN_MIN_MAX_ADDR 0x5F
  67. #define ADT7470_REG_FAN_MAX_BASE_ADDR 0x60
  68. #define ADT7470_REG_FAN_MAX_MAX_ADDR 0x67
  69. #define ADT7470_REG_PWM_CFG_BASE_ADDR 0x68
  70. #define ADT7470_REG_PWM12_CFG 0x68
  71. #define ADT7470_PWM2_AUTO_MASK 0x40
  72. #define ADT7470_PWM1_AUTO_MASK 0x80
  73. #define ADT7470_REG_PWM34_CFG 0x69
  74. #define ADT7470_PWM3_AUTO_MASK 0x40
  75. #define ADT7470_PWM4_AUTO_MASK 0x80
  76. #define ADT7470_REG_PWM_MIN_BASE_ADDR 0x6A
  77. #define ADT7470_REG_PWM_MIN_MAX_ADDR 0x6D
  78. #define ADT7470_REG_PWM_TEMP_MIN_BASE_ADDR 0x6E
  79. #define ADT7470_REG_PWM_TEMP_MIN_MAX_ADDR 0x71
  80. #define ADT7470_REG_ACOUSTICS12 0x75
  81. #define ADT7470_REG_ACOUSTICS34 0x76
  82. #define ADT7470_REG_DEVICE 0x3D
  83. #define ADT7470_REG_VENDOR 0x3E
  84. #define ADT7470_REG_REVISION 0x3F
  85. #define ADT7470_REG_ALARM1_MASK 0x72
  86. #define ADT7470_REG_ALARM2_MASK 0x73
  87. #define ADT7470_REG_PWM_AUTO_TEMP_BASE_ADDR 0x7C
  88. #define ADT7470_REG_PWM_AUTO_TEMP_MAX_ADDR 0x7D
  89. #define ADT7470_REG_MAX_ADDR 0x81
  90. #define ADT7470_TEMP_COUNT 10
  91. #define ADT7470_TEMP_REG(x) (ADT7470_REG_TEMP_BASE_ADDR + (x))
  92. #define ADT7470_TEMP_MIN_REG(x) (ADT7470_REG_TEMP_LIMITS_BASE_ADDR + ((x) * 2))
  93. #define ADT7470_TEMP_MAX_REG(x) (ADT7470_REG_TEMP_LIMITS_BASE_ADDR + \
  94. ((x) * 2) + 1)
  95. #define ADT7470_FAN_COUNT 4
  96. #define ADT7470_REG_FAN(x) (ADT7470_REG_FAN_BASE_ADDR + ((x) * 2))
  97. #define ADT7470_REG_FAN_MIN(x) (ADT7470_REG_FAN_MIN_BASE_ADDR + ((x) * 2))
  98. #define ADT7470_REG_FAN_MAX(x) (ADT7470_REG_FAN_MAX_BASE_ADDR + ((x) * 2))
  99. #define ADT7470_PWM_COUNT 4
  100. #define ADT7470_REG_PWM(x) (ADT7470_REG_PWM_BASE_ADDR + (x))
  101. #define ADT7470_REG_PWM_MAX(x) (ADT7470_REG_PWM_MAX_BASE_ADDR + (x))
  102. #define ADT7470_REG_PWM_MIN(x) (ADT7470_REG_PWM_MIN_BASE_ADDR + (x))
  103. #define ADT7470_REG_PWM_TMIN(x) (ADT7470_REG_PWM_TEMP_MIN_BASE_ADDR + (x))
  104. #define ADT7470_REG_PWM_CFG(x) (ADT7470_REG_PWM_CFG_BASE_ADDR + ((x) / 2))
  105. #define ADT7470_REG_PWM_AUTO_TEMP(x) (ADT7470_REG_PWM_AUTO_TEMP_BASE_ADDR + \
  106. ((x) / 2))
  107. #define ALARM2(x) ((x) << 8)
  108. #define ADT7470_VENDOR 0x41
  109. #define ADT7470_DEVICE 0x70
  110. /* datasheet only mentions a revision 2 */
  111. #define ADT7470_REVISION 0x02
  112. /* "all temps" according to hwmon sysfs interface spec */
  113. #define ADT7470_PWM_ALL_TEMPS 0x3FF
  114. /* How often do we reread sensors values? (In jiffies) */
  115. #define SENSOR_REFRESH_INTERVAL (5 * HZ)
  116. /* How often do we reread sensor limit values? (In jiffies) */
  117. #define LIMIT_REFRESH_INTERVAL (60 * HZ)
  118. /* sleep 1s while gathering temperature data */
  119. #define TEMP_COLLECTION_TIME 1000
  120. /* datasheet says to divide this number by the fan reading to get fan rpm */
  121. #define FAN_PERIOD_TO_RPM(x) ((90000 * 60) / (x))
  122. #define FAN_RPM_TO_PERIOD FAN_PERIOD_TO_RPM
  123. #define FAN_PERIOD_INVALID 65535
  124. #define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID)
  125. struct adt7470_data {
  126. struct device *hwmon_dev;
  127. struct attribute_group attrs;
  128. struct mutex lock;
  129. char sensors_valid;
  130. char limits_valid;
  131. unsigned long sensors_last_updated; /* In jiffies */
  132. unsigned long limits_last_updated; /* In jiffies */
  133. s8 temp[ADT7470_TEMP_COUNT];
  134. s8 temp_min[ADT7470_TEMP_COUNT];
  135. s8 temp_max[ADT7470_TEMP_COUNT];
  136. u16 fan[ADT7470_FAN_COUNT];
  137. u16 fan_min[ADT7470_FAN_COUNT];
  138. u16 fan_max[ADT7470_FAN_COUNT];
  139. u16 alarm;
  140. u16 alarms_mask;
  141. u8 force_pwm_max;
  142. u8 pwm[ADT7470_PWM_COUNT];
  143. u8 pwm_max[ADT7470_PWM_COUNT];
  144. u8 pwm_automatic[ADT7470_PWM_COUNT];
  145. u8 pwm_min[ADT7470_PWM_COUNT];
  146. s8 pwm_tmin[ADT7470_PWM_COUNT];
  147. u8 pwm_auto_temp[ADT7470_PWM_COUNT];
  148. };
  149. static int adt7470_probe(struct i2c_client *client,
  150. const struct i2c_device_id *id);
  151. static int adt7470_detect(struct i2c_client *client, int kind,
  152. struct i2c_board_info *info);
  153. static int adt7470_remove(struct i2c_client *client);
  154. static const struct i2c_device_id adt7470_id[] = {
  155. { "adt7470", adt7470 },
  156. { }
  157. };
  158. MODULE_DEVICE_TABLE(i2c, adt7470_id);
  159. static struct i2c_driver adt7470_driver = {
  160. .class = I2C_CLASS_HWMON,
  161. .driver = {
  162. .name = "adt7470",
  163. },
  164. .probe = adt7470_probe,
  165. .remove = adt7470_remove,
  166. .id_table = adt7470_id,
  167. .detect = adt7470_detect,
  168. .address_data = &addr_data,
  169. };
  170. /*
  171. * 16-bit registers on the ADT7470 are low-byte first. The data sheet says
  172. * that the low byte must be read before the high byte.
  173. */
  174. static inline int adt7470_read_word_data(struct i2c_client *client, u8 reg)
  175. {
  176. u16 foo;
  177. foo = i2c_smbus_read_byte_data(client, reg);
  178. foo |= ((u16)i2c_smbus_read_byte_data(client, reg + 1) << 8);
  179. return foo;
  180. }
  181. static inline int adt7470_write_word_data(struct i2c_client *client, u8 reg,
  182. u16 value)
  183. {
  184. return i2c_smbus_write_byte_data(client, reg, value & 0xFF)
  185. && i2c_smbus_write_byte_data(client, reg + 1, value >> 8);
  186. }
  187. static void adt7470_init_client(struct i2c_client *client)
  188. {
  189. int reg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG);
  190. if (reg < 0) {
  191. dev_err(&client->dev, "cannot read configuration register\n");
  192. } else {
  193. /* start monitoring (and do a self-test) */
  194. i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, reg | 3);
  195. }
  196. }
  197. static struct adt7470_data *adt7470_update_device(struct device *dev)
  198. {
  199. struct i2c_client *client = to_i2c_client(dev);
  200. struct adt7470_data *data = i2c_get_clientdata(client);
  201. unsigned long local_jiffies = jiffies;
  202. u8 cfg;
  203. int i;
  204. mutex_lock(&data->lock);
  205. if (time_before(local_jiffies, data->sensors_last_updated +
  206. SENSOR_REFRESH_INTERVAL)
  207. && data->sensors_valid)
  208. goto no_sensor_update;
  209. /* start reading temperature sensors */
  210. cfg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG);
  211. cfg |= 0x80;
  212. i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, cfg);
  213. /*
  214. * Delay is 200ms * number of tmp05 sensors. Too bad
  215. * there's no way to figure out how many are connected.
  216. * For now, assume 1s will work.
  217. */
  218. msleep(TEMP_COLLECTION_TIME);
  219. /* done reading temperature sensors */
  220. cfg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG);
  221. cfg &= ~0x80;
  222. i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, cfg);
  223. for (i = 0; i < ADT7470_TEMP_COUNT; i++)
  224. data->temp[i] = i2c_smbus_read_byte_data(client,
  225. ADT7470_TEMP_REG(i));
  226. for (i = 0; i < ADT7470_FAN_COUNT; i++)
  227. data->fan[i] = adt7470_read_word_data(client,
  228. ADT7470_REG_FAN(i));
  229. for (i = 0; i < ADT7470_PWM_COUNT; i++) {
  230. int reg;
  231. int reg_mask;
  232. data->pwm[i] = i2c_smbus_read_byte_data(client,
  233. ADT7470_REG_PWM(i));
  234. if (i % 2)
  235. reg_mask = ADT7470_PWM2_AUTO_MASK;
  236. else
  237. reg_mask = ADT7470_PWM1_AUTO_MASK;
  238. reg = ADT7470_REG_PWM_CFG(i);
  239. if (i2c_smbus_read_byte_data(client, reg) & reg_mask)
  240. data->pwm_automatic[i] = 1;
  241. else
  242. data->pwm_automatic[i] = 0;
  243. reg = ADT7470_REG_PWM_AUTO_TEMP(i);
  244. cfg = i2c_smbus_read_byte_data(client, reg);
  245. if (!(i % 2))
  246. data->pwm_auto_temp[i] = cfg >> 4;
  247. else
  248. data->pwm_auto_temp[i] = cfg & 0xF;
  249. }
  250. if (i2c_smbus_read_byte_data(client, ADT7470_REG_CFG) &
  251. ADT7470_FSPD_MASK)
  252. data->force_pwm_max = 1;
  253. else
  254. data->force_pwm_max = 0;
  255. data->alarm = i2c_smbus_read_byte_data(client, ADT7470_REG_ALARM1);
  256. if (data->alarm & ADT7470_OOL_ALARM)
  257. data->alarm |= ALARM2(i2c_smbus_read_byte_data(client,
  258. ADT7470_REG_ALARM2));
  259. data->alarms_mask = adt7470_read_word_data(client,
  260. ADT7470_REG_ALARM1_MASK);
  261. data->sensors_last_updated = local_jiffies;
  262. data->sensors_valid = 1;
  263. no_sensor_update:
  264. if (time_before(local_jiffies, data->limits_last_updated +
  265. LIMIT_REFRESH_INTERVAL)
  266. && data->limits_valid)
  267. goto out;
  268. for (i = 0; i < ADT7470_TEMP_COUNT; i++) {
  269. data->temp_min[i] = i2c_smbus_read_byte_data(client,
  270. ADT7470_TEMP_MIN_REG(i));
  271. data->temp_max[i] = i2c_smbus_read_byte_data(client,
  272. ADT7470_TEMP_MAX_REG(i));
  273. }
  274. for (i = 0; i < ADT7470_FAN_COUNT; i++) {
  275. data->fan_min[i] = adt7470_read_word_data(client,
  276. ADT7470_REG_FAN_MIN(i));
  277. data->fan_max[i] = adt7470_read_word_data(client,
  278. ADT7470_REG_FAN_MAX(i));
  279. }
  280. for (i = 0; i < ADT7470_PWM_COUNT; i++) {
  281. data->pwm_max[i] = i2c_smbus_read_byte_data(client,
  282. ADT7470_REG_PWM_MAX(i));
  283. data->pwm_min[i] = i2c_smbus_read_byte_data(client,
  284. ADT7470_REG_PWM_MIN(i));
  285. data->pwm_tmin[i] = i2c_smbus_read_byte_data(client,
  286. ADT7470_REG_PWM_TMIN(i));
  287. }
  288. data->limits_last_updated = local_jiffies;
  289. data->limits_valid = 1;
  290. out:
  291. mutex_unlock(&data->lock);
  292. return data;
  293. }
  294. static ssize_t show_temp_min(struct device *dev,
  295. struct device_attribute *devattr,
  296. char *buf)
  297. {
  298. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  299. struct adt7470_data *data = adt7470_update_device(dev);
  300. return sprintf(buf, "%d\n", 1000 * data->temp_min[attr->index]);
  301. }
  302. static ssize_t set_temp_min(struct device *dev,
  303. struct device_attribute *devattr,
  304. const char *buf,
  305. size_t count)
  306. {
  307. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  308. struct i2c_client *client = to_i2c_client(dev);
  309. struct adt7470_data *data = i2c_get_clientdata(client);
  310. int temp = simple_strtol(buf, NULL, 10) / 1000;
  311. mutex_lock(&data->lock);
  312. data->temp_min[attr->index] = temp;
  313. i2c_smbus_write_byte_data(client, ADT7470_TEMP_MIN_REG(attr->index),
  314. temp);
  315. mutex_unlock(&data->lock);
  316. return count;
  317. }
  318. static ssize_t show_temp_max(struct device *dev,
  319. struct device_attribute *devattr,
  320. char *buf)
  321. {
  322. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  323. struct adt7470_data *data = adt7470_update_device(dev);
  324. return sprintf(buf, "%d\n", 1000 * data->temp_max[attr->index]);
  325. }
  326. static ssize_t set_temp_max(struct device *dev,
  327. struct device_attribute *devattr,
  328. const char *buf,
  329. size_t count)
  330. {
  331. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  332. struct i2c_client *client = to_i2c_client(dev);
  333. struct adt7470_data *data = i2c_get_clientdata(client);
  334. int temp = simple_strtol(buf, NULL, 10) / 1000;
  335. mutex_lock(&data->lock);
  336. data->temp_max[attr->index] = temp;
  337. i2c_smbus_write_byte_data(client, ADT7470_TEMP_MAX_REG(attr->index),
  338. temp);
  339. mutex_unlock(&data->lock);
  340. return count;
  341. }
  342. static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
  343. char *buf)
  344. {
  345. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  346. struct adt7470_data *data = adt7470_update_device(dev);
  347. return sprintf(buf, "%d\n", 1000 * data->temp[attr->index]);
  348. }
  349. static ssize_t show_alarm_mask(struct device *dev,
  350. struct device_attribute *devattr,
  351. char *buf)
  352. {
  353. struct adt7470_data *data = adt7470_update_device(dev);
  354. return sprintf(buf, "%x\n", data->alarms_mask);
  355. }
  356. static ssize_t show_fan_max(struct device *dev,
  357. struct device_attribute *devattr,
  358. char *buf)
  359. {
  360. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  361. struct adt7470_data *data = adt7470_update_device(dev);
  362. if (FAN_DATA_VALID(data->fan_max[attr->index]))
  363. return sprintf(buf, "%d\n",
  364. FAN_PERIOD_TO_RPM(data->fan_max[attr->index]));
  365. else
  366. return sprintf(buf, "0\n");
  367. }
  368. static ssize_t set_fan_max(struct device *dev,
  369. struct device_attribute *devattr,
  370. const char *buf, size_t count)
  371. {
  372. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  373. struct i2c_client *client = to_i2c_client(dev);
  374. struct adt7470_data *data = i2c_get_clientdata(client);
  375. int temp = simple_strtol(buf, NULL, 10);
  376. if (!temp)
  377. return -EINVAL;
  378. temp = FAN_RPM_TO_PERIOD(temp);
  379. mutex_lock(&data->lock);
  380. data->fan_max[attr->index] = temp;
  381. adt7470_write_word_data(client, ADT7470_REG_FAN_MAX(attr->index), temp);
  382. mutex_unlock(&data->lock);
  383. return count;
  384. }
  385. static ssize_t show_fan_min(struct device *dev,
  386. struct device_attribute *devattr,
  387. char *buf)
  388. {
  389. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  390. struct adt7470_data *data = adt7470_update_device(dev);
  391. if (FAN_DATA_VALID(data->fan_min[attr->index]))
  392. return sprintf(buf, "%d\n",
  393. FAN_PERIOD_TO_RPM(data->fan_min[attr->index]));
  394. else
  395. return sprintf(buf, "0\n");
  396. }
  397. static ssize_t set_fan_min(struct device *dev,
  398. struct device_attribute *devattr,
  399. const char *buf, size_t count)
  400. {
  401. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  402. struct i2c_client *client = to_i2c_client(dev);
  403. struct adt7470_data *data = i2c_get_clientdata(client);
  404. int temp = simple_strtol(buf, NULL, 10);
  405. if (!temp)
  406. return -EINVAL;
  407. temp = FAN_RPM_TO_PERIOD(temp);
  408. mutex_lock(&data->lock);
  409. data->fan_min[attr->index] = temp;
  410. adt7470_write_word_data(client, ADT7470_REG_FAN_MIN(attr->index), temp);
  411. mutex_unlock(&data->lock);
  412. return count;
  413. }
  414. static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
  415. char *buf)
  416. {
  417. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  418. struct adt7470_data *data = adt7470_update_device(dev);
  419. if (FAN_DATA_VALID(data->fan[attr->index]))
  420. return sprintf(buf, "%d\n",
  421. FAN_PERIOD_TO_RPM(data->fan[attr->index]));
  422. else
  423. return sprintf(buf, "0\n");
  424. }
  425. static ssize_t show_force_pwm_max(struct device *dev,
  426. struct device_attribute *devattr,
  427. char *buf)
  428. {
  429. struct adt7470_data *data = adt7470_update_device(dev);
  430. return sprintf(buf, "%d\n", data->force_pwm_max);
  431. }
  432. static ssize_t set_force_pwm_max(struct device *dev,
  433. struct device_attribute *devattr,
  434. const char *buf,
  435. size_t count)
  436. {
  437. struct i2c_client *client = to_i2c_client(dev);
  438. struct adt7470_data *data = i2c_get_clientdata(client);
  439. int temp = simple_strtol(buf, NULL, 10);
  440. u8 reg;
  441. mutex_lock(&data->lock);
  442. data->force_pwm_max = temp;
  443. reg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG);
  444. if (temp)
  445. reg |= ADT7470_FSPD_MASK;
  446. else
  447. reg &= ~ADT7470_FSPD_MASK;
  448. i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, reg);
  449. mutex_unlock(&data->lock);
  450. return count;
  451. }
  452. static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
  453. char *buf)
  454. {
  455. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  456. struct adt7470_data *data = adt7470_update_device(dev);
  457. return sprintf(buf, "%d\n", data->pwm[attr->index]);
  458. }
  459. static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr,
  460. const char *buf, size_t count)
  461. {
  462. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  463. struct i2c_client *client = to_i2c_client(dev);
  464. struct adt7470_data *data = i2c_get_clientdata(client);
  465. int temp = simple_strtol(buf, NULL, 10);
  466. mutex_lock(&data->lock);
  467. data->pwm[attr->index] = temp;
  468. i2c_smbus_write_byte_data(client, ADT7470_REG_PWM(attr->index), temp);
  469. mutex_unlock(&data->lock);
  470. return count;
  471. }
  472. static ssize_t show_pwm_max(struct device *dev,
  473. struct device_attribute *devattr,
  474. char *buf)
  475. {
  476. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  477. struct adt7470_data *data = adt7470_update_device(dev);
  478. return sprintf(buf, "%d\n", data->pwm_max[attr->index]);
  479. }
  480. static ssize_t set_pwm_max(struct device *dev,
  481. struct device_attribute *devattr,
  482. const char *buf,
  483. size_t count)
  484. {
  485. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  486. struct i2c_client *client = to_i2c_client(dev);
  487. struct adt7470_data *data = i2c_get_clientdata(client);
  488. int temp = simple_strtol(buf, NULL, 10);
  489. mutex_lock(&data->lock);
  490. data->pwm_max[attr->index] = temp;
  491. i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_MAX(attr->index),
  492. temp);
  493. mutex_unlock(&data->lock);
  494. return count;
  495. }
  496. static ssize_t show_pwm_min(struct device *dev,
  497. struct device_attribute *devattr,
  498. char *buf)
  499. {
  500. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  501. struct adt7470_data *data = adt7470_update_device(dev);
  502. return sprintf(buf, "%d\n", data->pwm_min[attr->index]);
  503. }
  504. static ssize_t set_pwm_min(struct device *dev,
  505. struct device_attribute *devattr,
  506. const char *buf,
  507. size_t count)
  508. {
  509. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  510. struct i2c_client *client = to_i2c_client(dev);
  511. struct adt7470_data *data = i2c_get_clientdata(client);
  512. int temp = simple_strtol(buf, NULL, 10);
  513. mutex_lock(&data->lock);
  514. data->pwm_min[attr->index] = temp;
  515. i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_MIN(attr->index),
  516. temp);
  517. mutex_unlock(&data->lock);
  518. return count;
  519. }
  520. static ssize_t show_pwm_tmax(struct device *dev,
  521. struct device_attribute *devattr,
  522. char *buf)
  523. {
  524. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  525. struct adt7470_data *data = adt7470_update_device(dev);
  526. /* the datasheet says that tmax = tmin + 20C */
  527. return sprintf(buf, "%d\n", 1000 * (20 + data->pwm_tmin[attr->index]));
  528. }
  529. static ssize_t show_pwm_tmin(struct device *dev,
  530. struct device_attribute *devattr,
  531. char *buf)
  532. {
  533. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  534. struct adt7470_data *data = adt7470_update_device(dev);
  535. return sprintf(buf, "%d\n", 1000 * data->pwm_tmin[attr->index]);
  536. }
  537. static ssize_t set_pwm_tmin(struct device *dev,
  538. struct device_attribute *devattr,
  539. const char *buf,
  540. size_t count)
  541. {
  542. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  543. struct i2c_client *client = to_i2c_client(dev);
  544. struct adt7470_data *data = i2c_get_clientdata(client);
  545. int temp = simple_strtol(buf, NULL, 10) / 1000;
  546. mutex_lock(&data->lock);
  547. data->pwm_tmin[attr->index] = temp;
  548. i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_TMIN(attr->index),
  549. temp);
  550. mutex_unlock(&data->lock);
  551. return count;
  552. }
  553. static ssize_t show_pwm_auto(struct device *dev,
  554. struct device_attribute *devattr,
  555. char *buf)
  556. {
  557. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  558. struct adt7470_data *data = adt7470_update_device(dev);
  559. return sprintf(buf, "%d\n", 1 + data->pwm_automatic[attr->index]);
  560. }
  561. static ssize_t set_pwm_auto(struct device *dev,
  562. struct device_attribute *devattr,
  563. const char *buf,
  564. size_t count)
  565. {
  566. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  567. struct i2c_client *client = to_i2c_client(dev);
  568. struct adt7470_data *data = i2c_get_clientdata(client);
  569. int temp = simple_strtol(buf, NULL, 10);
  570. int pwm_auto_reg = ADT7470_REG_PWM_CFG(attr->index);
  571. int pwm_auto_reg_mask;
  572. u8 reg;
  573. if (attr->index % 2)
  574. pwm_auto_reg_mask = ADT7470_PWM2_AUTO_MASK;
  575. else
  576. pwm_auto_reg_mask = ADT7470_PWM1_AUTO_MASK;
  577. if (temp != 2 && temp != 1)
  578. return -EINVAL;
  579. temp--;
  580. mutex_lock(&data->lock);
  581. data->pwm_automatic[attr->index] = temp;
  582. reg = i2c_smbus_read_byte_data(client, pwm_auto_reg);
  583. if (temp)
  584. reg |= pwm_auto_reg_mask;
  585. else
  586. reg &= ~pwm_auto_reg_mask;
  587. i2c_smbus_write_byte_data(client, pwm_auto_reg, reg);
  588. mutex_unlock(&data->lock);
  589. return count;
  590. }
  591. static ssize_t show_pwm_auto_temp(struct device *dev,
  592. struct device_attribute *devattr,
  593. char *buf)
  594. {
  595. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  596. struct adt7470_data *data = adt7470_update_device(dev);
  597. u8 ctrl = data->pwm_auto_temp[attr->index];
  598. if (ctrl)
  599. return sprintf(buf, "%d\n", 1 << (ctrl - 1));
  600. else
  601. return sprintf(buf, "%d\n", ADT7470_PWM_ALL_TEMPS);
  602. }
  603. static int cvt_auto_temp(int input)
  604. {
  605. if (input == ADT7470_PWM_ALL_TEMPS)
  606. return 0;
  607. if (input < 1 || !is_power_of_2(input))
  608. return -EINVAL;
  609. return ilog2(input) + 1;
  610. }
  611. static ssize_t set_pwm_auto_temp(struct device *dev,
  612. struct device_attribute *devattr,
  613. const char *buf,
  614. size_t count)
  615. {
  616. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  617. struct i2c_client *client = to_i2c_client(dev);
  618. struct adt7470_data *data = i2c_get_clientdata(client);
  619. int temp = cvt_auto_temp(simple_strtol(buf, NULL, 10));
  620. int pwm_auto_reg = ADT7470_REG_PWM_AUTO_TEMP(attr->index);
  621. u8 reg;
  622. if (temp < 0)
  623. return temp;
  624. mutex_lock(&data->lock);
  625. data->pwm_automatic[attr->index] = temp;
  626. reg = i2c_smbus_read_byte_data(client, pwm_auto_reg);
  627. if (!(attr->index % 2)) {
  628. reg &= 0xF;
  629. reg |= (temp << 4) & 0xF0;
  630. } else {
  631. reg &= 0xF0;
  632. reg |= temp & 0xF;
  633. }
  634. i2c_smbus_write_byte_data(client, pwm_auto_reg, reg);
  635. mutex_unlock(&data->lock);
  636. return count;
  637. }
  638. static ssize_t show_alarm(struct device *dev,
  639. struct device_attribute *devattr,
  640. char *buf)
  641. {
  642. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  643. struct adt7470_data *data = adt7470_update_device(dev);
  644. if (data->alarm & attr->index)
  645. return sprintf(buf, "1\n");
  646. else
  647. return sprintf(buf, "0\n");
  648. }
  649. static DEVICE_ATTR(alarm_mask, S_IRUGO, show_alarm_mask, NULL);
  650. static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max,
  651. set_temp_max, 0);
  652. static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp_max,
  653. set_temp_max, 1);
  654. static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_temp_max,
  655. set_temp_max, 2);
  656. static SENSOR_DEVICE_ATTR(temp4_max, S_IWUSR | S_IRUGO, show_temp_max,
  657. set_temp_max, 3);
  658. static SENSOR_DEVICE_ATTR(temp5_max, S_IWUSR | S_IRUGO, show_temp_max,
  659. set_temp_max, 4);
  660. static SENSOR_DEVICE_ATTR(temp6_max, S_IWUSR | S_IRUGO, show_temp_max,
  661. set_temp_max, 5);
  662. static SENSOR_DEVICE_ATTR(temp7_max, S_IWUSR | S_IRUGO, show_temp_max,
  663. set_temp_max, 6);
  664. static SENSOR_DEVICE_ATTR(temp8_max, S_IWUSR | S_IRUGO, show_temp_max,
  665. set_temp_max, 7);
  666. static SENSOR_DEVICE_ATTR(temp9_max, S_IWUSR | S_IRUGO, show_temp_max,
  667. set_temp_max, 8);
  668. static SENSOR_DEVICE_ATTR(temp10_max, S_IWUSR | S_IRUGO, show_temp_max,
  669. set_temp_max, 9);
  670. static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp_min,
  671. set_temp_min, 0);
  672. static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_temp_min,
  673. set_temp_min, 1);
  674. static SENSOR_DEVICE_ATTR(temp3_min, S_IWUSR | S_IRUGO, show_temp_min,
  675. set_temp_min, 2);
  676. static SENSOR_DEVICE_ATTR(temp4_min, S_IWUSR | S_IRUGO, show_temp_min,
  677. set_temp_min, 3);
  678. static SENSOR_DEVICE_ATTR(temp5_min, S_IWUSR | S_IRUGO, show_temp_min,
  679. set_temp_min, 4);
  680. static SENSOR_DEVICE_ATTR(temp6_min, S_IWUSR | S_IRUGO, show_temp_min,
  681. set_temp_min, 5);
  682. static SENSOR_DEVICE_ATTR(temp7_min, S_IWUSR | S_IRUGO, show_temp_min,
  683. set_temp_min, 6);
  684. static SENSOR_DEVICE_ATTR(temp8_min, S_IWUSR | S_IRUGO, show_temp_min,
  685. set_temp_min, 7);
  686. static SENSOR_DEVICE_ATTR(temp9_min, S_IWUSR | S_IRUGO, show_temp_min,
  687. set_temp_min, 8);
  688. static SENSOR_DEVICE_ATTR(temp10_min, S_IWUSR | S_IRUGO, show_temp_min,
  689. set_temp_min, 9);
  690. static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
  691. static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
  692. static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2);
  693. static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 3);
  694. static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_temp, NULL, 4);
  695. static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO, show_temp, NULL, 5);
  696. static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO, show_temp, NULL, 6);
  697. static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO, show_temp, NULL, 7);
  698. static SENSOR_DEVICE_ATTR(temp9_input, S_IRUGO, show_temp, NULL, 8);
  699. static SENSOR_DEVICE_ATTR(temp10_input, S_IRUGO, show_temp, NULL, 9);
  700. static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL,
  701. ADT7470_R1T_ALARM);
  702. static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL,
  703. ADT7470_R2T_ALARM);
  704. static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL,
  705. ADT7470_R3T_ALARM);
  706. static SENSOR_DEVICE_ATTR(temp4_alarm, S_IRUGO, show_alarm, NULL,
  707. ADT7470_R4T_ALARM);
  708. static SENSOR_DEVICE_ATTR(temp5_alarm, S_IRUGO, show_alarm, NULL,
  709. ADT7470_R5T_ALARM);
  710. static SENSOR_DEVICE_ATTR(temp6_alarm, S_IRUGO, show_alarm, NULL,
  711. ADT7470_R6T_ALARM);
  712. static SENSOR_DEVICE_ATTR(temp7_alarm, S_IRUGO, show_alarm, NULL,
  713. ADT7470_R7T_ALARM);
  714. static SENSOR_DEVICE_ATTR(temp8_alarm, S_IRUGO, show_alarm, NULL,
  715. ALARM2(ADT7470_R8T_ALARM));
  716. static SENSOR_DEVICE_ATTR(temp9_alarm, S_IRUGO, show_alarm, NULL,
  717. ALARM2(ADT7470_R9T_ALARM));
  718. static SENSOR_DEVICE_ATTR(temp10_alarm, S_IRUGO, show_alarm, NULL,
  719. ALARM2(ADT7470_R10T_ALARM));
  720. static SENSOR_DEVICE_ATTR(fan1_max, S_IWUSR | S_IRUGO, show_fan_max,
  721. set_fan_max, 0);
  722. static SENSOR_DEVICE_ATTR(fan2_max, S_IWUSR | S_IRUGO, show_fan_max,
  723. set_fan_max, 1);
  724. static SENSOR_DEVICE_ATTR(fan3_max, S_IWUSR | S_IRUGO, show_fan_max,
  725. set_fan_max, 2);
  726. static SENSOR_DEVICE_ATTR(fan4_max, S_IWUSR | S_IRUGO, show_fan_max,
  727. set_fan_max, 3);
  728. static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min,
  729. set_fan_min, 0);
  730. static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min,
  731. set_fan_min, 1);
  732. static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min,
  733. set_fan_min, 2);
  734. static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min,
  735. set_fan_min, 3);
  736. static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0);
  737. static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1);
  738. static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2);
  739. static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3);
  740. static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL,
  741. ALARM2(ADT7470_FAN1_ALARM));
  742. static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL,
  743. ALARM2(ADT7470_FAN2_ALARM));
  744. static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL,
  745. ALARM2(ADT7470_FAN3_ALARM));
  746. static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL,
  747. ALARM2(ADT7470_FAN4_ALARM));
  748. static SENSOR_DEVICE_ATTR(force_pwm_max, S_IWUSR | S_IRUGO,
  749. show_force_pwm_max, set_force_pwm_max, 0);
  750. static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0);
  751. static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1);
  752. static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2);
  753. static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3);
  754. static SENSOR_DEVICE_ATTR(pwm1_auto_point1_pwm, S_IWUSR | S_IRUGO,
  755. show_pwm_min, set_pwm_min, 0);
  756. static SENSOR_DEVICE_ATTR(pwm2_auto_point1_pwm, S_IWUSR | S_IRUGO,
  757. show_pwm_min, set_pwm_min, 1);
  758. static SENSOR_DEVICE_ATTR(pwm3_auto_point1_pwm, S_IWUSR | S_IRUGO,
  759. show_pwm_min, set_pwm_min, 2);
  760. static SENSOR_DEVICE_ATTR(pwm4_auto_point1_pwm, S_IWUSR | S_IRUGO,
  761. show_pwm_min, set_pwm_min, 3);
  762. static SENSOR_DEVICE_ATTR(pwm1_auto_point2_pwm, S_IWUSR | S_IRUGO,
  763. show_pwm_max, set_pwm_max, 0);
  764. static SENSOR_DEVICE_ATTR(pwm2_auto_point2_pwm, S_IWUSR | S_IRUGO,
  765. show_pwm_max, set_pwm_max, 1);
  766. static SENSOR_DEVICE_ATTR(pwm3_auto_point2_pwm, S_IWUSR | S_IRUGO,
  767. show_pwm_max, set_pwm_max, 2);
  768. static SENSOR_DEVICE_ATTR(pwm4_auto_point2_pwm, S_IWUSR | S_IRUGO,
  769. show_pwm_max, set_pwm_max, 3);
  770. static SENSOR_DEVICE_ATTR(pwm1_auto_point1_temp, S_IWUSR | S_IRUGO,
  771. show_pwm_tmin, set_pwm_tmin, 0);
  772. static SENSOR_DEVICE_ATTR(pwm2_auto_point1_temp, S_IWUSR | S_IRUGO,
  773. show_pwm_tmin, set_pwm_tmin, 1);
  774. static SENSOR_DEVICE_ATTR(pwm3_auto_point1_temp, S_IWUSR | S_IRUGO,
  775. show_pwm_tmin, set_pwm_tmin, 2);
  776. static SENSOR_DEVICE_ATTR(pwm4_auto_point1_temp, S_IWUSR | S_IRUGO,
  777. show_pwm_tmin, set_pwm_tmin, 3);
  778. static SENSOR_DEVICE_ATTR(pwm1_auto_point2_temp, S_IRUGO, show_pwm_tmax,
  779. NULL, 0);
  780. static SENSOR_DEVICE_ATTR(pwm2_auto_point2_temp, S_IRUGO, show_pwm_tmax,
  781. NULL, 1);
  782. static SENSOR_DEVICE_ATTR(pwm3_auto_point2_temp, S_IRUGO, show_pwm_tmax,
  783. NULL, 2);
  784. static SENSOR_DEVICE_ATTR(pwm4_auto_point2_temp, S_IRUGO, show_pwm_tmax,
  785. NULL, 3);
  786. static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
  787. set_pwm_auto, 0);
  788. static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
  789. set_pwm_auto, 1);
  790. static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
  791. set_pwm_auto, 2);
  792. static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, show_pwm_auto,
  793. set_pwm_auto, 3);
  794. static SENSOR_DEVICE_ATTR(pwm1_auto_channels_temp, S_IWUSR | S_IRUGO,
  795. show_pwm_auto_temp, set_pwm_auto_temp, 0);
  796. static SENSOR_DEVICE_ATTR(pwm2_auto_channels_temp, S_IWUSR | S_IRUGO,
  797. show_pwm_auto_temp, set_pwm_auto_temp, 1);
  798. static SENSOR_DEVICE_ATTR(pwm3_auto_channels_temp, S_IWUSR | S_IRUGO,
  799. show_pwm_auto_temp, set_pwm_auto_temp, 2);
  800. static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IWUSR | S_IRUGO,
  801. show_pwm_auto_temp, set_pwm_auto_temp, 3);
  802. static struct attribute *adt7470_attr[] =
  803. {
  804. &dev_attr_alarm_mask.attr,
  805. &sensor_dev_attr_temp1_max.dev_attr.attr,
  806. &sensor_dev_attr_temp2_max.dev_attr.attr,
  807. &sensor_dev_attr_temp3_max.dev_attr.attr,
  808. &sensor_dev_attr_temp4_max.dev_attr.attr,
  809. &sensor_dev_attr_temp5_max.dev_attr.attr,
  810. &sensor_dev_attr_temp6_max.dev_attr.attr,
  811. &sensor_dev_attr_temp7_max.dev_attr.attr,
  812. &sensor_dev_attr_temp8_max.dev_attr.attr,
  813. &sensor_dev_attr_temp9_max.dev_attr.attr,
  814. &sensor_dev_attr_temp10_max.dev_attr.attr,
  815. &sensor_dev_attr_temp1_min.dev_attr.attr,
  816. &sensor_dev_attr_temp2_min.dev_attr.attr,
  817. &sensor_dev_attr_temp3_min.dev_attr.attr,
  818. &sensor_dev_attr_temp4_min.dev_attr.attr,
  819. &sensor_dev_attr_temp5_min.dev_attr.attr,
  820. &sensor_dev_attr_temp6_min.dev_attr.attr,
  821. &sensor_dev_attr_temp7_min.dev_attr.attr,
  822. &sensor_dev_attr_temp8_min.dev_attr.attr,
  823. &sensor_dev_attr_temp9_min.dev_attr.attr,
  824. &sensor_dev_attr_temp10_min.dev_attr.attr,
  825. &sensor_dev_attr_temp1_input.dev_attr.attr,
  826. &sensor_dev_attr_temp2_input.dev_attr.attr,
  827. &sensor_dev_attr_temp3_input.dev_attr.attr,
  828. &sensor_dev_attr_temp4_input.dev_attr.attr,
  829. &sensor_dev_attr_temp5_input.dev_attr.attr,
  830. &sensor_dev_attr_temp6_input.dev_attr.attr,
  831. &sensor_dev_attr_temp7_input.dev_attr.attr,
  832. &sensor_dev_attr_temp8_input.dev_attr.attr,
  833. &sensor_dev_attr_temp9_input.dev_attr.attr,
  834. &sensor_dev_attr_temp10_input.dev_attr.attr,
  835. &sensor_dev_attr_temp1_alarm.dev_attr.attr,
  836. &sensor_dev_attr_temp2_alarm.dev_attr.attr,
  837. &sensor_dev_attr_temp3_alarm.dev_attr.attr,
  838. &sensor_dev_attr_temp4_alarm.dev_attr.attr,
  839. &sensor_dev_attr_temp5_alarm.dev_attr.attr,
  840. &sensor_dev_attr_temp6_alarm.dev_attr.attr,
  841. &sensor_dev_attr_temp7_alarm.dev_attr.attr,
  842. &sensor_dev_attr_temp8_alarm.dev_attr.attr,
  843. &sensor_dev_attr_temp9_alarm.dev_attr.attr,
  844. &sensor_dev_attr_temp10_alarm.dev_attr.attr,
  845. &sensor_dev_attr_fan1_max.dev_attr.attr,
  846. &sensor_dev_attr_fan2_max.dev_attr.attr,
  847. &sensor_dev_attr_fan3_max.dev_attr.attr,
  848. &sensor_dev_attr_fan4_max.dev_attr.attr,
  849. &sensor_dev_attr_fan1_min.dev_attr.attr,
  850. &sensor_dev_attr_fan2_min.dev_attr.attr,
  851. &sensor_dev_attr_fan3_min.dev_attr.attr,
  852. &sensor_dev_attr_fan4_min.dev_attr.attr,
  853. &sensor_dev_attr_fan1_input.dev_attr.attr,
  854. &sensor_dev_attr_fan2_input.dev_attr.attr,
  855. &sensor_dev_attr_fan3_input.dev_attr.attr,
  856. &sensor_dev_attr_fan4_input.dev_attr.attr,
  857. &sensor_dev_attr_fan1_alarm.dev_attr.attr,
  858. &sensor_dev_attr_fan2_alarm.dev_attr.attr,
  859. &sensor_dev_attr_fan3_alarm.dev_attr.attr,
  860. &sensor_dev_attr_fan4_alarm.dev_attr.attr,
  861. &sensor_dev_attr_force_pwm_max.dev_attr.attr,
  862. &sensor_dev_attr_pwm1.dev_attr.attr,
  863. &sensor_dev_attr_pwm2.dev_attr.attr,
  864. &sensor_dev_attr_pwm3.dev_attr.attr,
  865. &sensor_dev_attr_pwm4.dev_attr.attr,
  866. &sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr,
  867. &sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr,
  868. &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr,
  869. &sensor_dev_attr_pwm4_auto_point1_pwm.dev_attr.attr,
  870. &sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr,
  871. &sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr,
  872. &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr,
  873. &sensor_dev_attr_pwm4_auto_point2_pwm.dev_attr.attr,
  874. &sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr,
  875. &sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr,
  876. &sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr,
  877. &sensor_dev_attr_pwm4_auto_point1_temp.dev_attr.attr,
  878. &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr,
  879. &sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr,
  880. &sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr,
  881. &sensor_dev_attr_pwm4_auto_point2_temp.dev_attr.attr,
  882. &sensor_dev_attr_pwm1_enable.dev_attr.attr,
  883. &sensor_dev_attr_pwm2_enable.dev_attr.attr,
  884. &sensor_dev_attr_pwm3_enable.dev_attr.attr,
  885. &sensor_dev_attr_pwm4_enable.dev_attr.attr,
  886. &sensor_dev_attr_pwm1_auto_channels_temp.dev_attr.attr,
  887. &sensor_dev_attr_pwm2_auto_channels_temp.dev_attr.attr,
  888. &sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr,
  889. &sensor_dev_attr_pwm4_auto_channels_temp.dev_attr.attr,
  890. NULL
  891. };
  892. /* Return 0 if detection is successful, -ENODEV otherwise */
  893. static int adt7470_detect(struct i2c_client *client, int kind,
  894. struct i2c_board_info *info)
  895. {
  896. struct i2c_adapter *adapter = client->adapter;
  897. if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
  898. return -ENODEV;
  899. if (kind <= 0) {
  900. int vendor, device, revision;
  901. vendor = i2c_smbus_read_byte_data(client, ADT7470_REG_VENDOR);
  902. if (vendor != ADT7470_VENDOR)
  903. return -ENODEV;
  904. device = i2c_smbus_read_byte_data(client, ADT7470_REG_DEVICE);
  905. if (device != ADT7470_DEVICE)
  906. return -ENODEV;
  907. revision = i2c_smbus_read_byte_data(client,
  908. ADT7470_REG_REVISION);
  909. if (revision != ADT7470_REVISION)
  910. return -ENODEV;
  911. } else
  912. dev_dbg(&adapter->dev, "detection forced\n");
  913. strlcpy(info->type, "adt7470", I2C_NAME_SIZE);
  914. return 0;
  915. }
  916. static int adt7470_probe(struct i2c_client *client,
  917. const struct i2c_device_id *id)
  918. {
  919. struct adt7470_data *data;
  920. int err;
  921. data = kzalloc(sizeof(struct adt7470_data), GFP_KERNEL);
  922. if (!data) {
  923. err = -ENOMEM;
  924. goto exit;
  925. }
  926. i2c_set_clientdata(client, data);
  927. mutex_init(&data->lock);
  928. dev_info(&client->dev, "%s chip found\n", client->name);
  929. /* Initialize the ADT7470 chip */
  930. adt7470_init_client(client);
  931. /* Register sysfs hooks */
  932. data->attrs.attrs = adt7470_attr;
  933. if ((err = sysfs_create_group(&client->dev.kobj, &data->attrs)))
  934. goto exit_free;
  935. data->hwmon_dev = hwmon_device_register(&client->dev);
  936. if (IS_ERR(data->hwmon_dev)) {
  937. err = PTR_ERR(data->hwmon_dev);
  938. goto exit_remove;
  939. }
  940. return 0;
  941. exit_remove:
  942. sysfs_remove_group(&client->dev.kobj, &data->attrs);
  943. exit_free:
  944. kfree(data);
  945. exit:
  946. return err;
  947. }
  948. static int adt7470_remove(struct i2c_client *client)
  949. {
  950. struct adt7470_data *data = i2c_get_clientdata(client);
  951. hwmon_device_unregister(data->hwmon_dev);
  952. sysfs_remove_group(&client->dev.kobj, &data->attrs);
  953. kfree(data);
  954. return 0;
  955. }
  956. static int __init adt7470_init(void)
  957. {
  958. return i2c_add_driver(&adt7470_driver);
  959. }
  960. static void __exit adt7470_exit(void)
  961. {
  962. i2c_del_driver(&adt7470_driver);
  963. }
  964. MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>");
  965. MODULE_DESCRIPTION("ADT7470 driver");
  966. MODULE_LICENSE("GPL");
  967. module_init(adt7470_init);
  968. module_exit(adt7470_exit);