asus_atk0110.c 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244
  1. /*
  2. * Copyright (C) 2007-2009 Luca Tettamanti <kronos.it@gmail.com>
  3. *
  4. * This file is released under the GPLv2
  5. * See COPYING in the top level directory of the kernel tree.
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/hwmon.h>
  9. #include <linux/list.h>
  10. #include <linux/module.h>
  11. #include <acpi/acpi.h>
  12. #include <acpi/acpixf.h>
  13. #include <acpi/acpi_drivers.h>
  14. #include <acpi/acpi_bus.h>
  15. #define ATK_HID "ATK0110"
  16. /* Minimum time between readings, enforced in order to avoid
  17. * hogging the CPU.
  18. */
  19. #define CACHE_TIME HZ
  20. #define BOARD_ID "MBIF"
  21. #define METHOD_ENUMERATE "GGRP"
  22. #define METHOD_READ "GITM"
  23. #define METHOD_WRITE "SITM"
  24. #define METHOD_OLD_READ_TMP "RTMP"
  25. #define METHOD_OLD_READ_VLT "RVLT"
  26. #define METHOD_OLD_READ_FAN "RFAN"
  27. #define METHOD_OLD_ENUM_TMP "TSIF"
  28. #define METHOD_OLD_ENUM_VLT "VSIF"
  29. #define METHOD_OLD_ENUM_FAN "FSIF"
  30. #define ATK_MUX_HWMON 0x00000006ULL
  31. #define ATK_MUX_MGMT 0x00000011ULL
  32. #define ATK_CLASS_MASK 0xff000000ULL
  33. #define ATK_CLASS_FREQ_CTL 0x03000000ULL
  34. #define ATK_CLASS_FAN_CTL 0x04000000ULL
  35. #define ATK_CLASS_HWMON 0x06000000ULL
  36. #define ATK_CLASS_MGMT 0x11000000ULL
  37. #define ATK_TYPE_MASK 0x00ff0000ULL
  38. #define HWMON_TYPE_VOLT 0x00020000ULL
  39. #define HWMON_TYPE_TEMP 0x00030000ULL
  40. #define HWMON_TYPE_FAN 0x00040000ULL
  41. #define ATK_ELEMENT_ID_MASK 0x0000ffffULL
  42. #define ATK_EC_ID 0x11060004ULL
  43. enum atk_pack_member {
  44. HWMON_PACK_FLAGS,
  45. HWMON_PACK_NAME,
  46. HWMON_PACK_LIMIT1,
  47. HWMON_PACK_LIMIT2,
  48. HWMON_PACK_ENABLE
  49. };
  50. /* New package format */
  51. #define _HWMON_NEW_PACK_SIZE 7
  52. #define _HWMON_NEW_PACK_FLAGS 0
  53. #define _HWMON_NEW_PACK_NAME 1
  54. #define _HWMON_NEW_PACK_UNK1 2
  55. #define _HWMON_NEW_PACK_UNK2 3
  56. #define _HWMON_NEW_PACK_LIMIT1 4
  57. #define _HWMON_NEW_PACK_LIMIT2 5
  58. #define _HWMON_NEW_PACK_ENABLE 6
  59. /* Old package format */
  60. #define _HWMON_OLD_PACK_SIZE 5
  61. #define _HWMON_OLD_PACK_FLAGS 0
  62. #define _HWMON_OLD_PACK_NAME 1
  63. #define _HWMON_OLD_PACK_LIMIT1 2
  64. #define _HWMON_OLD_PACK_LIMIT2 3
  65. #define _HWMON_OLD_PACK_ENABLE 4
  66. struct atk_data {
  67. struct device *hwmon_dev;
  68. acpi_handle atk_handle;
  69. struct acpi_device *acpi_dev;
  70. bool old_interface;
  71. /* old interface */
  72. acpi_handle rtmp_handle;
  73. acpi_handle rvlt_handle;
  74. acpi_handle rfan_handle;
  75. /* new inteface */
  76. acpi_handle enumerate_handle;
  77. acpi_handle read_handle;
  78. acpi_handle write_handle;
  79. bool disable_ec;
  80. int voltage_count;
  81. int temperature_count;
  82. int fan_count;
  83. struct list_head sensor_list;
  84. };
  85. typedef ssize_t (*sysfs_show_func)(struct device *dev,
  86. struct device_attribute *attr, char *buf);
  87. static const struct acpi_device_id atk_ids[] = {
  88. {ATK_HID, 0},
  89. {"", 0},
  90. };
  91. MODULE_DEVICE_TABLE(acpi, atk_ids);
  92. #define ATTR_NAME_SIZE 16 /* Worst case is "tempN_input" */
  93. struct atk_sensor_data {
  94. struct list_head list;
  95. struct atk_data *data;
  96. struct device_attribute label_attr;
  97. struct device_attribute input_attr;
  98. struct device_attribute limit1_attr;
  99. struct device_attribute limit2_attr;
  100. char label_attr_name[ATTR_NAME_SIZE];
  101. char input_attr_name[ATTR_NAME_SIZE];
  102. char limit1_attr_name[ATTR_NAME_SIZE];
  103. char limit2_attr_name[ATTR_NAME_SIZE];
  104. u64 id;
  105. u64 type;
  106. u64 limit1;
  107. u64 limit2;
  108. u64 cached_value;
  109. unsigned long last_updated; /* in jiffies */
  110. bool is_valid;
  111. char const *acpi_name;
  112. };
  113. /* Return buffer format:
  114. * [0-3] "value" is valid flag
  115. * [4-7] value
  116. * [8- ] unknown stuff on newer mobos
  117. */
  118. struct atk_acpi_ret_buffer {
  119. u32 flags;
  120. u32 value;
  121. u8 data[];
  122. };
  123. /* Input buffer used for GITM and SITM methods */
  124. struct atk_acpi_input_buf {
  125. u32 id;
  126. u32 param1;
  127. u32 param2;
  128. };
  129. static int atk_add(struct acpi_device *device);
  130. static int atk_remove(struct acpi_device *device, int type);
  131. static void atk_print_sensor(struct atk_data *data, union acpi_object *obj);
  132. static int atk_read_value(struct atk_sensor_data *sensor, u64 *value);
  133. static void atk_free_sensors(struct atk_data *data);
  134. static struct acpi_driver atk_driver = {
  135. .name = ATK_HID,
  136. .class = "hwmon",
  137. .ids = atk_ids,
  138. .ops = {
  139. .add = atk_add,
  140. .remove = atk_remove,
  141. },
  142. };
  143. #define input_to_atk_sensor(attr) \
  144. container_of(attr, struct atk_sensor_data, input_attr)
  145. #define label_to_atk_sensor(attr) \
  146. container_of(attr, struct atk_sensor_data, label_attr)
  147. #define limit1_to_atk_sensor(attr) \
  148. container_of(attr, struct atk_sensor_data, limit1_attr)
  149. #define limit2_to_atk_sensor(attr) \
  150. container_of(attr, struct atk_sensor_data, limit2_attr)
  151. static ssize_t atk_input_show(struct device *dev,
  152. struct device_attribute *attr, char *buf)
  153. {
  154. struct atk_sensor_data *s = input_to_atk_sensor(attr);
  155. u64 value;
  156. int err;
  157. err = atk_read_value(s, &value);
  158. if (err)
  159. return err;
  160. if (s->type == HWMON_TYPE_TEMP)
  161. /* ACPI returns decidegree */
  162. value *= 100;
  163. return sprintf(buf, "%llu\n", value);
  164. }
  165. static ssize_t atk_label_show(struct device *dev,
  166. struct device_attribute *attr, char *buf)
  167. {
  168. struct atk_sensor_data *s = label_to_atk_sensor(attr);
  169. return sprintf(buf, "%s\n", s->acpi_name);
  170. }
  171. static ssize_t atk_limit1_show(struct device *dev,
  172. struct device_attribute *attr, char *buf)
  173. {
  174. struct atk_sensor_data *s = limit1_to_atk_sensor(attr);
  175. u64 value = s->limit1;
  176. if (s->type == HWMON_TYPE_TEMP)
  177. value *= 100;
  178. return sprintf(buf, "%lld\n", value);
  179. }
  180. static ssize_t atk_limit2_show(struct device *dev,
  181. struct device_attribute *attr, char *buf)
  182. {
  183. struct atk_sensor_data *s = limit2_to_atk_sensor(attr);
  184. u64 value = s->limit2;
  185. if (s->type == HWMON_TYPE_TEMP)
  186. value *= 100;
  187. return sprintf(buf, "%lld\n", value);
  188. }
  189. static ssize_t atk_name_show(struct device *dev,
  190. struct device_attribute *attr, char *buf)
  191. {
  192. return sprintf(buf, "atk0110\n");
  193. }
  194. static struct device_attribute atk_name_attr =
  195. __ATTR(name, 0444, atk_name_show, NULL);
  196. static void atk_init_attribute(struct device_attribute *attr, char *name,
  197. sysfs_show_func show)
  198. {
  199. attr->attr.name = name;
  200. attr->attr.mode = 0444;
  201. attr->show = show;
  202. attr->store = NULL;
  203. }
  204. static union acpi_object *atk_get_pack_member(struct atk_data *data,
  205. union acpi_object *pack,
  206. enum atk_pack_member m)
  207. {
  208. bool old_if = data->old_interface;
  209. int offset;
  210. switch (m) {
  211. case HWMON_PACK_FLAGS:
  212. offset = old_if ? _HWMON_OLD_PACK_FLAGS : _HWMON_NEW_PACK_FLAGS;
  213. break;
  214. case HWMON_PACK_NAME:
  215. offset = old_if ? _HWMON_OLD_PACK_NAME : _HWMON_NEW_PACK_NAME;
  216. break;
  217. case HWMON_PACK_LIMIT1:
  218. offset = old_if ? _HWMON_OLD_PACK_LIMIT1 :
  219. _HWMON_NEW_PACK_LIMIT1;
  220. break;
  221. case HWMON_PACK_LIMIT2:
  222. offset = old_if ? _HWMON_OLD_PACK_LIMIT2 :
  223. _HWMON_NEW_PACK_LIMIT2;
  224. break;
  225. case HWMON_PACK_ENABLE:
  226. offset = old_if ? _HWMON_OLD_PACK_ENABLE :
  227. _HWMON_NEW_PACK_ENABLE;
  228. break;
  229. default:
  230. return NULL;
  231. }
  232. return &pack->package.elements[offset];
  233. }
  234. /* New package format is:
  235. * - flag (int)
  236. * class - used for de-muxing the request to the correct GITn
  237. * type (volt, temp, fan)
  238. * sensor id |
  239. * sensor id - used for de-muxing the request _inside_ the GITn
  240. * - name (str)
  241. * - unknown (int)
  242. * - unknown (int)
  243. * - limit1 (int)
  244. * - limit2 (int)
  245. * - enable (int)
  246. *
  247. * The old package has the same format but it's missing the two unknown fields.
  248. */
  249. static int validate_hwmon_pack(struct atk_data *data, union acpi_object *obj)
  250. {
  251. struct device *dev = &data->acpi_dev->dev;
  252. union acpi_object *tmp;
  253. bool old_if = data->old_interface;
  254. int const expected_size = old_if ? _HWMON_OLD_PACK_SIZE :
  255. _HWMON_NEW_PACK_SIZE;
  256. if (obj->type != ACPI_TYPE_PACKAGE) {
  257. dev_warn(dev, "Invalid type: %d\n", obj->type);
  258. return -EINVAL;
  259. }
  260. if (obj->package.count != expected_size) {
  261. dev_warn(dev, "Invalid package size: %d, expected: %d\n",
  262. obj->package.count, expected_size);
  263. return -EINVAL;
  264. }
  265. tmp = atk_get_pack_member(data, obj, HWMON_PACK_FLAGS);
  266. if (tmp->type != ACPI_TYPE_INTEGER) {
  267. dev_warn(dev, "Invalid type (flag): %d\n", tmp->type);
  268. return -EINVAL;
  269. }
  270. tmp = atk_get_pack_member(data, obj, HWMON_PACK_NAME);
  271. if (tmp->type != ACPI_TYPE_STRING) {
  272. dev_warn(dev, "Invalid type (name): %d\n", tmp->type);
  273. return -EINVAL;
  274. }
  275. /* Don't check... we don't know what they're useful for anyway */
  276. #if 0
  277. tmp = &obj->package.elements[HWMON_PACK_UNK1];
  278. if (tmp->type != ACPI_TYPE_INTEGER) {
  279. dev_warn(dev, "Invalid type (unk1): %d\n", tmp->type);
  280. return -EINVAL;
  281. }
  282. tmp = &obj->package.elements[HWMON_PACK_UNK2];
  283. if (tmp->type != ACPI_TYPE_INTEGER) {
  284. dev_warn(dev, "Invalid type (unk2): %d\n", tmp->type);
  285. return -EINVAL;
  286. }
  287. #endif
  288. tmp = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT1);
  289. if (tmp->type != ACPI_TYPE_INTEGER) {
  290. dev_warn(dev, "Invalid type (limit1): %d\n", tmp->type);
  291. return -EINVAL;
  292. }
  293. tmp = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT2);
  294. if (tmp->type != ACPI_TYPE_INTEGER) {
  295. dev_warn(dev, "Invalid type (limit2): %d\n", tmp->type);
  296. return -EINVAL;
  297. }
  298. tmp = atk_get_pack_member(data, obj, HWMON_PACK_ENABLE);
  299. if (tmp->type != ACPI_TYPE_INTEGER) {
  300. dev_warn(dev, "Invalid type (enable): %d\n", tmp->type);
  301. return -EINVAL;
  302. }
  303. atk_print_sensor(data, obj);
  304. return 0;
  305. }
  306. #ifdef DEBUG
  307. static char const *atk_sensor_type(union acpi_object *flags)
  308. {
  309. u64 type = flags->integer.value & ATK_TYPE_MASK;
  310. char const *what;
  311. switch (type) {
  312. case HWMON_TYPE_VOLT:
  313. what = "voltage";
  314. break;
  315. case HWMON_TYPE_TEMP:
  316. what = "temperature";
  317. break;
  318. case HWMON_TYPE_FAN:
  319. what = "fan";
  320. break;
  321. default:
  322. what = "unknown";
  323. break;
  324. }
  325. return what;
  326. }
  327. #endif
  328. static void atk_print_sensor(struct atk_data *data, union acpi_object *obj)
  329. {
  330. #ifdef DEBUG
  331. struct device *dev = &data->acpi_dev->dev;
  332. union acpi_object *flags;
  333. union acpi_object *name;
  334. union acpi_object *limit1;
  335. union acpi_object *limit2;
  336. union acpi_object *enable;
  337. char const *what;
  338. flags = atk_get_pack_member(data, obj, HWMON_PACK_FLAGS);
  339. name = atk_get_pack_member(data, obj, HWMON_PACK_NAME);
  340. limit1 = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT1);
  341. limit2 = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT2);
  342. enable = atk_get_pack_member(data, obj, HWMON_PACK_ENABLE);
  343. what = atk_sensor_type(flags);
  344. dev_dbg(dev, "%s: %#llx %s [%llu-%llu] %s\n", what,
  345. flags->integer.value,
  346. name->string.pointer,
  347. limit1->integer.value, limit2->integer.value,
  348. enable->integer.value ? "enabled" : "disabled");
  349. #endif
  350. }
  351. static int atk_read_value_old(struct atk_sensor_data *sensor, u64 *value)
  352. {
  353. struct atk_data *data = sensor->data;
  354. struct device *dev = &data->acpi_dev->dev;
  355. struct acpi_object_list params;
  356. union acpi_object id;
  357. acpi_status status;
  358. acpi_handle method;
  359. switch (sensor->type) {
  360. case HWMON_TYPE_VOLT:
  361. method = data->rvlt_handle;
  362. break;
  363. case HWMON_TYPE_TEMP:
  364. method = data->rtmp_handle;
  365. break;
  366. case HWMON_TYPE_FAN:
  367. method = data->rfan_handle;
  368. break;
  369. default:
  370. return -EINVAL;
  371. }
  372. id.type = ACPI_TYPE_INTEGER;
  373. id.integer.value = sensor->id;
  374. params.count = 1;
  375. params.pointer = &id;
  376. status = acpi_evaluate_integer(method, NULL, &params, value);
  377. if (status != AE_OK) {
  378. dev_warn(dev, "%s: ACPI exception: %s\n", __func__,
  379. acpi_format_exception(status));
  380. return -EIO;
  381. }
  382. return 0;
  383. }
  384. static union acpi_object *atk_ggrp(struct atk_data *data, u16 mux)
  385. {
  386. struct device *dev = &data->acpi_dev->dev;
  387. struct acpi_buffer buf;
  388. acpi_status ret;
  389. struct acpi_object_list params;
  390. union acpi_object id;
  391. union acpi_object *pack;
  392. id.type = ACPI_TYPE_INTEGER;
  393. id.integer.value = mux;
  394. params.count = 1;
  395. params.pointer = &id;
  396. buf.length = ACPI_ALLOCATE_BUFFER;
  397. ret = acpi_evaluate_object(data->enumerate_handle, NULL, &params, &buf);
  398. if (ret != AE_OK) {
  399. dev_err(dev, "GGRP[%#x] ACPI exception: %s\n", mux,
  400. acpi_format_exception(ret));
  401. return ERR_PTR(-EIO);
  402. }
  403. pack = buf.pointer;
  404. if (pack->type != ACPI_TYPE_PACKAGE) {
  405. /* Execution was successful, but the id was not found */
  406. ACPI_FREE(pack);
  407. return ERR_PTR(-ENOENT);
  408. }
  409. if (pack->package.count < 1) {
  410. dev_err(dev, "GGRP[%#x] package is too small\n", mux);
  411. ACPI_FREE(pack);
  412. return ERR_PTR(-EIO);
  413. }
  414. return pack;
  415. }
  416. static union acpi_object *atk_gitm(struct atk_data *data, u64 id)
  417. {
  418. struct device *dev = &data->acpi_dev->dev;
  419. struct atk_acpi_input_buf buf;
  420. union acpi_object tmp;
  421. struct acpi_object_list params;
  422. struct acpi_buffer ret;
  423. union acpi_object *obj;
  424. acpi_status status;
  425. buf.id = id;
  426. buf.param1 = 0;
  427. buf.param2 = 0;
  428. tmp.type = ACPI_TYPE_BUFFER;
  429. tmp.buffer.pointer = (u8 *)&buf;
  430. tmp.buffer.length = sizeof(buf);
  431. params.count = 1;
  432. params.pointer = (void *)&tmp;
  433. ret.length = ACPI_ALLOCATE_BUFFER;
  434. status = acpi_evaluate_object_typed(data->read_handle, NULL, &params,
  435. &ret, ACPI_TYPE_BUFFER);
  436. if (status != AE_OK) {
  437. dev_warn(dev, "GITM[%#llx] ACPI exception: %s\n", id,
  438. acpi_format_exception(status));
  439. return ERR_PTR(-EIO);
  440. }
  441. obj = ret.pointer;
  442. /* Sanity check */
  443. if (obj->buffer.length < 8) {
  444. dev_warn(dev, "Unexpected ASBF length: %u\n",
  445. obj->buffer.length);
  446. ACPI_FREE(obj);
  447. return ERR_PTR(-EIO);
  448. }
  449. return obj;
  450. }
  451. static union acpi_object *atk_sitm(struct atk_data *data,
  452. struct atk_acpi_input_buf *buf)
  453. {
  454. struct device *dev = &data->acpi_dev->dev;
  455. struct acpi_object_list params;
  456. union acpi_object tmp;
  457. struct acpi_buffer ret;
  458. union acpi_object *obj;
  459. acpi_status status;
  460. tmp.type = ACPI_TYPE_BUFFER;
  461. tmp.buffer.pointer = (u8 *)buf;
  462. tmp.buffer.length = sizeof(*buf);
  463. params.count = 1;
  464. params.pointer = &tmp;
  465. ret.length = ACPI_ALLOCATE_BUFFER;
  466. status = acpi_evaluate_object_typed(data->write_handle, NULL, &params,
  467. &ret, ACPI_TYPE_BUFFER);
  468. if (status != AE_OK) {
  469. dev_warn(dev, "SITM[%#x] ACPI exception: %s\n", buf->id,
  470. acpi_format_exception(status));
  471. return ERR_PTR(-EIO);
  472. }
  473. obj = ret.pointer;
  474. /* Sanity check */
  475. if (obj->buffer.length < 8) {
  476. dev_warn(dev, "Unexpected ASBF length: %u\n",
  477. obj->buffer.length);
  478. ACPI_FREE(obj);
  479. return ERR_PTR(-EIO);
  480. }
  481. return obj;
  482. }
  483. static int atk_read_value_new(struct atk_sensor_data *sensor, u64 *value)
  484. {
  485. struct atk_data *data = sensor->data;
  486. struct device *dev = &data->acpi_dev->dev;
  487. union acpi_object *obj;
  488. struct atk_acpi_ret_buffer *buf;
  489. int err = 0;
  490. obj = atk_gitm(data, sensor->id);
  491. if (IS_ERR(obj))
  492. return PTR_ERR(obj);
  493. buf = (struct atk_acpi_ret_buffer *)obj->buffer.pointer;
  494. if (buf->flags == 0) {
  495. /* The reading is not valid, possible causes:
  496. * - sensor failure
  497. * - enumeration was FUBAR (and we didn't notice)
  498. */
  499. dev_warn(dev, "Read failed, sensor = %#llx\n", sensor->id);
  500. err = -EIO;
  501. goto out;
  502. }
  503. *value = buf->value;
  504. out:
  505. ACPI_FREE(obj);
  506. return err;
  507. }
  508. static int atk_read_value(struct atk_sensor_data *sensor, u64 *value)
  509. {
  510. int err;
  511. if (!sensor->is_valid ||
  512. time_after(jiffies, sensor->last_updated + CACHE_TIME)) {
  513. if (sensor->data->old_interface)
  514. err = atk_read_value_old(sensor, value);
  515. else
  516. err = atk_read_value_new(sensor, value);
  517. sensor->is_valid = true;
  518. sensor->last_updated = jiffies;
  519. sensor->cached_value = *value;
  520. } else {
  521. *value = sensor->cached_value;
  522. err = 0;
  523. }
  524. return err;
  525. }
  526. static int atk_add_sensor(struct atk_data *data, union acpi_object *obj)
  527. {
  528. struct device *dev = &data->acpi_dev->dev;
  529. union acpi_object *flags;
  530. union acpi_object *name;
  531. union acpi_object *limit1;
  532. union acpi_object *limit2;
  533. union acpi_object *enable;
  534. struct atk_sensor_data *sensor;
  535. char const *base_name;
  536. char const *limit1_name;
  537. char const *limit2_name;
  538. u64 type;
  539. int err;
  540. int *num;
  541. int start;
  542. if (obj->type != ACPI_TYPE_PACKAGE) {
  543. /* wft is this? */
  544. dev_warn(dev, "Unknown type for ACPI object: (%d)\n",
  545. obj->type);
  546. return -EINVAL;
  547. }
  548. err = validate_hwmon_pack(data, obj);
  549. if (err)
  550. return err;
  551. /* Ok, we have a valid hwmon package */
  552. type = atk_get_pack_member(data, obj, HWMON_PACK_FLAGS)->integer.value
  553. & ATK_TYPE_MASK;
  554. switch (type) {
  555. case HWMON_TYPE_VOLT:
  556. base_name = "in";
  557. limit1_name = "min";
  558. limit2_name = "max";
  559. num = &data->voltage_count;
  560. start = 0;
  561. break;
  562. case HWMON_TYPE_TEMP:
  563. base_name = "temp";
  564. limit1_name = "max";
  565. limit2_name = "crit";
  566. num = &data->temperature_count;
  567. start = 1;
  568. break;
  569. case HWMON_TYPE_FAN:
  570. base_name = "fan";
  571. limit1_name = "min";
  572. limit2_name = "max";
  573. num = &data->fan_count;
  574. start = 1;
  575. break;
  576. default:
  577. dev_warn(dev, "Unknown sensor type: %#llx\n", type);
  578. return -EINVAL;
  579. }
  580. enable = atk_get_pack_member(data, obj, HWMON_PACK_ENABLE);
  581. if (!enable->integer.value)
  582. /* sensor is disabled */
  583. return 0;
  584. flags = atk_get_pack_member(data, obj, HWMON_PACK_FLAGS);
  585. name = atk_get_pack_member(data, obj, HWMON_PACK_NAME);
  586. limit1 = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT1);
  587. limit2 = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT2);
  588. sensor = kzalloc(sizeof(*sensor), GFP_KERNEL);
  589. if (!sensor)
  590. return -ENOMEM;
  591. sensor->acpi_name = kstrdup(name->string.pointer, GFP_KERNEL);
  592. if (!sensor->acpi_name) {
  593. err = -ENOMEM;
  594. goto out;
  595. }
  596. INIT_LIST_HEAD(&sensor->list);
  597. sensor->type = type;
  598. sensor->data = data;
  599. sensor->id = flags->integer.value;
  600. sensor->limit1 = limit1->integer.value;
  601. if (data->old_interface)
  602. sensor->limit2 = limit2->integer.value;
  603. else
  604. /* The upper limit is expressed as delta from lower limit */
  605. sensor->limit2 = sensor->limit1 + limit2->integer.value;
  606. snprintf(sensor->input_attr_name, ATTR_NAME_SIZE,
  607. "%s%d_input", base_name, start + *num);
  608. atk_init_attribute(&sensor->input_attr,
  609. sensor->input_attr_name,
  610. atk_input_show);
  611. snprintf(sensor->label_attr_name, ATTR_NAME_SIZE,
  612. "%s%d_label", base_name, start + *num);
  613. atk_init_attribute(&sensor->label_attr,
  614. sensor->label_attr_name,
  615. atk_label_show);
  616. snprintf(sensor->limit1_attr_name, ATTR_NAME_SIZE,
  617. "%s%d_%s", base_name, start + *num, limit1_name);
  618. atk_init_attribute(&sensor->limit1_attr,
  619. sensor->limit1_attr_name,
  620. atk_limit1_show);
  621. snprintf(sensor->limit2_attr_name, ATTR_NAME_SIZE,
  622. "%s%d_%s", base_name, start + *num, limit2_name);
  623. atk_init_attribute(&sensor->limit2_attr,
  624. sensor->limit2_attr_name,
  625. atk_limit2_show);
  626. list_add(&sensor->list, &data->sensor_list);
  627. (*num)++;
  628. return 1;
  629. out:
  630. kfree(sensor->acpi_name);
  631. kfree(sensor);
  632. return err;
  633. }
  634. static int atk_enumerate_old_hwmon(struct atk_data *data)
  635. {
  636. struct device *dev = &data->acpi_dev->dev;
  637. struct acpi_buffer buf;
  638. union acpi_object *pack;
  639. acpi_status status;
  640. int i, ret;
  641. int count = 0;
  642. /* Voltages */
  643. buf.length = ACPI_ALLOCATE_BUFFER;
  644. status = acpi_evaluate_object_typed(data->atk_handle,
  645. METHOD_OLD_ENUM_VLT, NULL, &buf, ACPI_TYPE_PACKAGE);
  646. if (status != AE_OK) {
  647. dev_warn(dev, METHOD_OLD_ENUM_VLT ": ACPI exception: %s\n",
  648. acpi_format_exception(status));
  649. return -ENODEV;
  650. }
  651. pack = buf.pointer;
  652. for (i = 1; i < pack->package.count; i++) {
  653. union acpi_object *obj = &pack->package.elements[i];
  654. ret = atk_add_sensor(data, obj);
  655. if (ret > 0)
  656. count++;
  657. }
  658. ACPI_FREE(buf.pointer);
  659. /* Temperatures */
  660. buf.length = ACPI_ALLOCATE_BUFFER;
  661. status = acpi_evaluate_object_typed(data->atk_handle,
  662. METHOD_OLD_ENUM_TMP, NULL, &buf, ACPI_TYPE_PACKAGE);
  663. if (status != AE_OK) {
  664. dev_warn(dev, METHOD_OLD_ENUM_TMP ": ACPI exception: %s\n",
  665. acpi_format_exception(status));
  666. ret = -ENODEV;
  667. goto cleanup;
  668. }
  669. pack = buf.pointer;
  670. for (i = 1; i < pack->package.count; i++) {
  671. union acpi_object *obj = &pack->package.elements[i];
  672. ret = atk_add_sensor(data, obj);
  673. if (ret > 0)
  674. count++;
  675. }
  676. ACPI_FREE(buf.pointer);
  677. /* Fans */
  678. buf.length = ACPI_ALLOCATE_BUFFER;
  679. status = acpi_evaluate_object_typed(data->atk_handle,
  680. METHOD_OLD_ENUM_FAN, NULL, &buf, ACPI_TYPE_PACKAGE);
  681. if (status != AE_OK) {
  682. dev_warn(dev, METHOD_OLD_ENUM_FAN ": ACPI exception: %s\n",
  683. acpi_format_exception(status));
  684. ret = -ENODEV;
  685. goto cleanup;
  686. }
  687. pack = buf.pointer;
  688. for (i = 1; i < pack->package.count; i++) {
  689. union acpi_object *obj = &pack->package.elements[i];
  690. ret = atk_add_sensor(data, obj);
  691. if (ret > 0)
  692. count++;
  693. }
  694. ACPI_FREE(buf.pointer);
  695. return count;
  696. cleanup:
  697. atk_free_sensors(data);
  698. return ret;
  699. }
  700. static int atk_ec_present(struct atk_data *data)
  701. {
  702. struct device *dev = &data->acpi_dev->dev;
  703. union acpi_object *pack;
  704. union acpi_object *ec;
  705. int ret;
  706. int i;
  707. pack = atk_ggrp(data, ATK_MUX_MGMT);
  708. if (IS_ERR(pack)) {
  709. if (PTR_ERR(pack) == -ENOENT) {
  710. /* The MGMT class does not exists - that's ok */
  711. dev_dbg(dev, "Class %#llx not found\n", ATK_MUX_MGMT);
  712. return 0;
  713. }
  714. return PTR_ERR(pack);
  715. }
  716. /* Search the EC */
  717. ec = NULL;
  718. for (i = 0; i < pack->package.count; i++) {
  719. union acpi_object *obj = &pack->package.elements[i];
  720. union acpi_object *id;
  721. if (obj->type != ACPI_TYPE_PACKAGE)
  722. continue;
  723. id = &obj->package.elements[0];
  724. if (id->type != ACPI_TYPE_INTEGER)
  725. continue;
  726. if (id->integer.value == ATK_EC_ID) {
  727. ec = obj;
  728. break;
  729. }
  730. }
  731. ret = (ec != NULL);
  732. if (!ret)
  733. /* The system has no EC */
  734. dev_dbg(dev, "EC not found\n");
  735. ACPI_FREE(pack);
  736. return ret;
  737. }
  738. static int atk_ec_enabled(struct atk_data *data)
  739. {
  740. struct device *dev = &data->acpi_dev->dev;
  741. union acpi_object *obj;
  742. struct atk_acpi_ret_buffer *buf;
  743. int err;
  744. obj = atk_gitm(data, ATK_EC_ID);
  745. if (IS_ERR(obj)) {
  746. dev_err(dev, "Unable to query EC status\n");
  747. return PTR_ERR(obj);
  748. }
  749. buf = (struct atk_acpi_ret_buffer *)obj->buffer.pointer;
  750. if (buf->flags == 0) {
  751. dev_err(dev, "Unable to query EC status\n");
  752. err = -EIO;
  753. } else {
  754. err = (buf->value != 0);
  755. dev_dbg(dev, "EC is %sabled\n",
  756. err ? "en" : "dis");
  757. }
  758. ACPI_FREE(obj);
  759. return err;
  760. }
  761. static int atk_ec_ctl(struct atk_data *data, int enable)
  762. {
  763. struct device *dev = &data->acpi_dev->dev;
  764. union acpi_object *obj;
  765. struct atk_acpi_input_buf sitm;
  766. struct atk_acpi_ret_buffer *ec_ret;
  767. int err = 0;
  768. sitm.id = ATK_EC_ID;
  769. sitm.param1 = enable;
  770. sitm.param2 = 0;
  771. obj = atk_sitm(data, &sitm);
  772. if (IS_ERR(obj)) {
  773. dev_err(dev, "Failed to %sable the EC\n",
  774. enable ? "en" : "dis");
  775. return PTR_ERR(obj);
  776. }
  777. ec_ret = (struct atk_acpi_ret_buffer *)obj->buffer.pointer;
  778. if (ec_ret->flags == 0) {
  779. dev_err(dev, "Failed to %sable the EC\n",
  780. enable ? "en" : "dis");
  781. err = -EIO;
  782. } else {
  783. dev_info(dev, "EC %sabled\n",
  784. enable ? "en" : "dis");
  785. }
  786. ACPI_FREE(obj);
  787. return err;
  788. }
  789. static int atk_enumerate_new_hwmon(struct atk_data *data)
  790. {
  791. struct device *dev = &data->acpi_dev->dev;
  792. union acpi_object *pack;
  793. int err;
  794. int i;
  795. err = atk_ec_present(data);
  796. if (err < 0)
  797. return err;
  798. if (err) {
  799. err = atk_ec_enabled(data);
  800. if (err < 0)
  801. return err;
  802. /* If the EC was disabled we will disable it again on unload */
  803. data->disable_ec = err;
  804. err = atk_ec_ctl(data, 1);
  805. if (err) {
  806. data->disable_ec = false;
  807. return err;
  808. }
  809. }
  810. dev_dbg(dev, "Enumerating hwmon sensors\n");
  811. pack = atk_ggrp(data, ATK_MUX_HWMON);
  812. if (IS_ERR(pack))
  813. return PTR_ERR(pack);
  814. for (i = 0; i < pack->package.count; i++) {
  815. union acpi_object *obj = &pack->package.elements[i];
  816. atk_add_sensor(data, obj);
  817. }
  818. err = data->voltage_count + data->temperature_count + data->fan_count;
  819. ACPI_FREE(pack);
  820. return err;
  821. }
  822. static int atk_create_files(struct atk_data *data)
  823. {
  824. struct atk_sensor_data *s;
  825. int err;
  826. list_for_each_entry(s, &data->sensor_list, list) {
  827. err = device_create_file(data->hwmon_dev, &s->input_attr);
  828. if (err)
  829. return err;
  830. err = device_create_file(data->hwmon_dev, &s->label_attr);
  831. if (err)
  832. return err;
  833. err = device_create_file(data->hwmon_dev, &s->limit1_attr);
  834. if (err)
  835. return err;
  836. err = device_create_file(data->hwmon_dev, &s->limit2_attr);
  837. if (err)
  838. return err;
  839. }
  840. err = device_create_file(data->hwmon_dev, &atk_name_attr);
  841. return err;
  842. }
  843. static void atk_remove_files(struct atk_data *data)
  844. {
  845. struct atk_sensor_data *s;
  846. list_for_each_entry(s, &data->sensor_list, list) {
  847. device_remove_file(data->hwmon_dev, &s->input_attr);
  848. device_remove_file(data->hwmon_dev, &s->label_attr);
  849. device_remove_file(data->hwmon_dev, &s->limit1_attr);
  850. device_remove_file(data->hwmon_dev, &s->limit2_attr);
  851. }
  852. device_remove_file(data->hwmon_dev, &atk_name_attr);
  853. }
  854. static void atk_free_sensors(struct atk_data *data)
  855. {
  856. struct list_head *head = &data->sensor_list;
  857. struct atk_sensor_data *s, *tmp;
  858. list_for_each_entry_safe(s, tmp, head, list) {
  859. kfree(s->acpi_name);
  860. kfree(s);
  861. }
  862. }
  863. static int atk_register_hwmon(struct atk_data *data)
  864. {
  865. struct device *dev = &data->acpi_dev->dev;
  866. int err;
  867. dev_dbg(dev, "registering hwmon device\n");
  868. data->hwmon_dev = hwmon_device_register(dev);
  869. if (IS_ERR(data->hwmon_dev))
  870. return PTR_ERR(data->hwmon_dev);
  871. dev_dbg(dev, "populating sysfs directory\n");
  872. err = atk_create_files(data);
  873. if (err)
  874. goto remove;
  875. return 0;
  876. remove:
  877. /* Cleanup the registered files */
  878. atk_remove_files(data);
  879. hwmon_device_unregister(data->hwmon_dev);
  880. return err;
  881. }
  882. static int atk_check_old_if(struct atk_data *data)
  883. {
  884. struct device *dev = &data->acpi_dev->dev;
  885. acpi_handle ret;
  886. acpi_status status;
  887. /* RTMP: read temperature */
  888. status = acpi_get_handle(data->atk_handle, METHOD_OLD_READ_TMP, &ret);
  889. if (status != AE_OK) {
  890. dev_dbg(dev, "method " METHOD_OLD_READ_TMP " not found: %s\n",
  891. acpi_format_exception(status));
  892. return -ENODEV;
  893. }
  894. data->rtmp_handle = ret;
  895. /* RVLT: read voltage */
  896. status = acpi_get_handle(data->atk_handle, METHOD_OLD_READ_VLT, &ret);
  897. if (status != AE_OK) {
  898. dev_dbg(dev, "method " METHOD_OLD_READ_VLT " not found: %s\n",
  899. acpi_format_exception(status));
  900. return -ENODEV;
  901. }
  902. data->rvlt_handle = ret;
  903. /* RFAN: read fan status */
  904. status = acpi_get_handle(data->atk_handle, METHOD_OLD_READ_FAN, &ret);
  905. if (status != AE_OK) {
  906. dev_dbg(dev, "method " METHOD_OLD_READ_FAN " not found: %s\n",
  907. acpi_format_exception(status));
  908. return -ENODEV;
  909. }
  910. data->rfan_handle = ret;
  911. return 0;
  912. }
  913. static int atk_check_new_if(struct atk_data *data)
  914. {
  915. struct device *dev = &data->acpi_dev->dev;
  916. acpi_handle ret;
  917. acpi_status status;
  918. /* Enumeration */
  919. status = acpi_get_handle(data->atk_handle, METHOD_ENUMERATE, &ret);
  920. if (status != AE_OK) {
  921. dev_dbg(dev, "method " METHOD_ENUMERATE " not found: %s\n",
  922. acpi_format_exception(status));
  923. return -ENODEV;
  924. }
  925. data->enumerate_handle = ret;
  926. /* De-multiplexer (read) */
  927. status = acpi_get_handle(data->atk_handle, METHOD_READ, &ret);
  928. if (status != AE_OK) {
  929. dev_dbg(dev, "method " METHOD_READ " not found: %s\n",
  930. acpi_format_exception(status));
  931. return -ENODEV;
  932. }
  933. data->read_handle = ret;
  934. /* De-multiplexer (write) */
  935. status = acpi_get_handle(data->atk_handle, METHOD_WRITE, &ret);
  936. if (status != AE_OK) {
  937. dev_dbg(dev, "method " METHOD_READ " not found: %s\n",
  938. acpi_format_exception(status));
  939. return -ENODEV;
  940. }
  941. data->write_handle = ret;
  942. return 0;
  943. }
  944. static int atk_add(struct acpi_device *device)
  945. {
  946. acpi_status ret;
  947. int err;
  948. struct acpi_buffer buf;
  949. union acpi_object *obj;
  950. struct atk_data *data;
  951. dev_dbg(&device->dev, "adding...\n");
  952. data = kzalloc(sizeof(*data), GFP_KERNEL);
  953. if (!data)
  954. return -ENOMEM;
  955. data->acpi_dev = device;
  956. data->atk_handle = device->handle;
  957. INIT_LIST_HEAD(&data->sensor_list);
  958. data->disable_ec = false;
  959. buf.length = ACPI_ALLOCATE_BUFFER;
  960. ret = acpi_evaluate_object_typed(data->atk_handle, BOARD_ID, NULL,
  961. &buf, ACPI_TYPE_PACKAGE);
  962. if (ret != AE_OK) {
  963. dev_dbg(&device->dev, "atk: method MBIF not found\n");
  964. err = -ENODEV;
  965. goto out;
  966. }
  967. obj = buf.pointer;
  968. if (obj->package.count >= 2 &&
  969. obj->package.elements[1].type == ACPI_TYPE_STRING) {
  970. dev_dbg(&device->dev, "board ID = %s\n",
  971. obj->package.elements[1].string.pointer);
  972. }
  973. ACPI_FREE(buf.pointer);
  974. /* Check for hwmon methods: first check "old" style methods; note that
  975. * both may be present: in this case we stick to the old interface;
  976. * analysis of multiple DSDTs indicates that when both interfaces
  977. * are present the new one (GGRP/GITM) is not functional.
  978. */
  979. err = atk_check_old_if(data);
  980. if (!err) {
  981. dev_dbg(&device->dev, "Using old hwmon interface\n");
  982. data->old_interface = true;
  983. } else {
  984. err = atk_check_new_if(data);
  985. if (err)
  986. goto out;
  987. dev_dbg(&device->dev, "Using new hwmon interface\n");
  988. data->old_interface = false;
  989. }
  990. if (data->old_interface)
  991. err = atk_enumerate_old_hwmon(data);
  992. else
  993. err = atk_enumerate_new_hwmon(data);
  994. if (err < 0)
  995. goto out;
  996. if (err == 0) {
  997. dev_info(&device->dev,
  998. "No usable sensor detected, bailing out\n");
  999. err = -ENODEV;
  1000. goto out;
  1001. }
  1002. err = atk_register_hwmon(data);
  1003. if (err)
  1004. goto cleanup;
  1005. device->driver_data = data;
  1006. return 0;
  1007. cleanup:
  1008. atk_free_sensors(data);
  1009. out:
  1010. if (data->disable_ec)
  1011. atk_ec_ctl(data, 0);
  1012. kfree(data);
  1013. return err;
  1014. }
  1015. static int atk_remove(struct acpi_device *device, int type)
  1016. {
  1017. struct atk_data *data = device->driver_data;
  1018. dev_dbg(&device->dev, "removing...\n");
  1019. device->driver_data = NULL;
  1020. atk_remove_files(data);
  1021. atk_free_sensors(data);
  1022. hwmon_device_unregister(data->hwmon_dev);
  1023. if (data->disable_ec) {
  1024. if (atk_ec_ctl(data, 0))
  1025. dev_err(&device->dev, "Failed to disable EC\n");
  1026. }
  1027. kfree(data);
  1028. return 0;
  1029. }
  1030. static int __init atk0110_init(void)
  1031. {
  1032. int ret;
  1033. ret = acpi_bus_register_driver(&atk_driver);
  1034. if (ret)
  1035. pr_info("atk: acpi_bus_register_driver failed: %d\n", ret);
  1036. return ret;
  1037. }
  1038. static void __exit atk0110_exit(void)
  1039. {
  1040. acpi_bus_unregister_driver(&atk_driver);
  1041. }
  1042. module_init(atk0110_init);
  1043. module_exit(atk0110_exit);
  1044. MODULE_LICENSE("GPL");