HID: add antec-branded soundgraph imon devices to blacklist
[linux-2.6/mini2440.git] / drivers / hwmon / applesmc.c
blobe301862365889e1e2750d1514807a45d6489644b
1 /*
2 * drivers/hwmon/applesmc.c - driver for Apple's SMC (accelerometer, temperature
3 * sensors, fan control, keyboard backlight control) used in Intel-based Apple
4 * computers.
6 * Copyright (C) 2007 Nicolas Boichat <nicolas@boichat.ch>
8 * Based on hdaps.c driver:
9 * Copyright (C) 2005 Robert Love <rml@novell.com>
10 * Copyright (C) 2005 Jesper Juhl <jesper.juhl@gmail.com>
12 * Fan control based on smcFanControl:
13 * Copyright (C) 2006 Hendrik Holtmann <holtmann@mac.com>
15 * This program is free software; you can redistribute it and/or modify it
16 * under the terms of the GNU General Public License v2 as published by the
17 * Free Software Foundation.
19 * This program is distributed in the hope that it will be useful, but WITHOUT
20 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
22 * more details.
24 * You should have received a copy of the GNU General Public License along with
25 * this program; if not, write to the Free Software Foundation, Inc.,
26 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
29 #include <linux/delay.h>
30 #include <linux/platform_device.h>
31 #include <linux/input-polldev.h>
32 #include <linux/kernel.h>
33 #include <linux/module.h>
34 #include <linux/timer.h>
35 #include <linux/dmi.h>
36 #include <linux/mutex.h>
37 #include <linux/hwmon-sysfs.h>
38 #include <asm/io.h>
39 #include <linux/leds.h>
40 #include <linux/hwmon.h>
41 #include <linux/workqueue.h>
43 /* data port used by Apple SMC */
44 #define APPLESMC_DATA_PORT 0x300
45 /* command/status port used by Apple SMC */
46 #define APPLESMC_CMD_PORT 0x304
48 #define APPLESMC_NR_PORTS 32 /* 0x300-0x31f */
50 #define APPLESMC_MAX_DATA_LENGTH 32
52 #define APPLESMC_MIN_WAIT 0x0040
53 #define APPLESMC_MAX_WAIT 0x8000
55 #define APPLESMC_STATUS_MASK 0x0f
56 #define APPLESMC_READ_CMD 0x10
57 #define APPLESMC_WRITE_CMD 0x11
58 #define APPLESMC_GET_KEY_BY_INDEX_CMD 0x12
59 #define APPLESMC_GET_KEY_TYPE_CMD 0x13
61 #define KEY_COUNT_KEY "#KEY" /* r-o ui32 */
63 #define LIGHT_SENSOR_LEFT_KEY "ALV0" /* r-o {alv (6-10 bytes) */
64 #define LIGHT_SENSOR_RIGHT_KEY "ALV1" /* r-o {alv (6-10 bytes) */
65 #define BACKLIGHT_KEY "LKSB" /* w-o {lkb (2 bytes) */
67 #define CLAMSHELL_KEY "MSLD" /* r-o ui8 (unused) */
69 #define MOTION_SENSOR_X_KEY "MO_X" /* r-o sp78 (2 bytes) */
70 #define MOTION_SENSOR_Y_KEY "MO_Y" /* r-o sp78 (2 bytes) */
71 #define MOTION_SENSOR_Z_KEY "MO_Z" /* r-o sp78 (2 bytes) */
72 #define MOTION_SENSOR_KEY "MOCN" /* r/w ui16 */
74 #define FANS_COUNT "FNum" /* r-o ui8 */
75 #define FANS_MANUAL "FS! " /* r-w ui16 */
76 #define FAN_ACTUAL_SPEED "F0Ac" /* r-o fpe2 (2 bytes) */
77 #define FAN_MIN_SPEED "F0Mn" /* r-o fpe2 (2 bytes) */
78 #define FAN_MAX_SPEED "F0Mx" /* r-o fpe2 (2 bytes) */
79 #define FAN_SAFE_SPEED "F0Sf" /* r-o fpe2 (2 bytes) */
80 #define FAN_TARGET_SPEED "F0Tg" /* r-w fpe2 (2 bytes) */
81 #define FAN_POSITION "F0ID" /* r-o char[16] */
84 * Temperature sensors keys (sp78 - 2 bytes).
86 static const char* temperature_sensors_sets[][36] = {
87 /* Set 0: Macbook Pro */
88 { "TA0P", "TB0T", "TC0D", "TC0P", "TG0H", "TG0P", "TG0T", "Th0H",
89 "Th1H", "Tm0P", "Ts0P", "Ts1P", NULL },
90 /* Set 1: Macbook2 set */
91 { "TB0T", "TC0D", "TC0P", "TM0P", "TN0P", "TN1P", "TTF0", "Th0H",
92 "Th0S", "Th1H", NULL },
93 /* Set 2: Macbook set */
94 { "TB0T", "TC0D", "TC0P", "TM0P", "TN0P", "TN1P", "Th0H", "Th0S",
95 "Th1H", "Ts0P", NULL },
96 /* Set 3: Macmini set */
97 { "TC0D", "TC0P", NULL },
98 /* Set 4: Mac Pro (2 x Quad-Core) */
99 { "TA0P", "TCAG", "TCAH", "TCBG", "TCBH", "TC0C", "TC0D", "TC0P",
100 "TC1C", "TC1D", "TC2C", "TC2D", "TC3C", "TC3D", "THTG", "TH0P",
101 "TH1P", "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S",
102 "TM1P", "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P",
103 "TM9S", "TN0H", "TS0C", NULL },
104 /* Set 5: iMac */
105 { "TC0D", "TA0P", "TG0P", "TG0D", "TG0H", "TH0P", "Tm0P", "TO0P",
106 "Tp0C", NULL },
107 /* Set 6: Macbook3 set */
108 { "TB0T", "TC0D", "TC0P", "TM0P", "TN0P", "TTF0", "TW0P", "Th0H",
109 "Th0S", "Th1H", NULL },
110 /* Set 7: Macbook Air */
111 { "TB0T", "TB1S", "TB1T", "TB2S", "TB2T", "TC0D", "TC0P", "TCFP",
112 "TTF0", "TW0P", "Th0H", "Tp0P", "TpFP", "Ts0P", "Ts0S", NULL },
113 /* Set 8: Macbook Pro 4,1 (Penryn) */
114 { "TB0T", "TC0D", "TC0P", "TG0D", "TG0H", "TTF0", "TW0P", "Th0H",
115 "Th1H", "Th2H", "Tm0P", "Ts0P", NULL },
116 /* Set 9: Macbook Pro 3,1 (Santa Rosa) */
117 { "TALP", "TB0T", "TC0D", "TC0P", "TG0D", "TG0H", "TTF0", "TW0P",
118 "Th0H", "Th1H", "Th2H", "Tm0P", "Ts0P", NULL },
119 /* Set 10: iMac 5,1 */
120 { "TA0P", "TC0D", "TC0P", "TG0D", "TH0P", "TO0P", "Tm0P", NULL },
121 /* Set 11: Macbook 5,1 */
122 { "TB0T", "TB1T", "TB2T", "TB3T", "TC0D", "TC0P", "TN0D", "TN0P",
123 "TTF0", "Th0H", "Th1H", "ThFH", "Ts0P", "Ts0S", NULL },
124 /* Set 12: Macbook Pro 5,1 */
125 { "TB0T", "TB1T", "TB2T", "TB3T", "TC0D", "TC0F", "TC0P", "TG0D",
126 "TG0F", "TG0H", "TG0P", "TG0T", "TG1H", "TN0D", "TN0P", "TTF0",
127 "Th2H", "Tm0P", "Ts0P", "Ts0S", NULL },
128 /* Set 13: iMac 8,1 */
129 { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P",
130 "TL0P", "TO0P", "TW0P", "Tm0P", "Tp0P", NULL },
131 /* Set 14: iMac 6,1 */
132 { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P",
133 "TO0P", "Tp0P", NULL },
134 /* Set 15: MacBook Air 2,1 */
135 { "TB0T", "TB1S", "TB1T", "TB2S", "TB2T", "TC0D", "TN0D", "TTF0",
136 "TV0P", "TVFP", "TW0P", "Th0P", "Tp0P", "Tp1P", "TpFP", "Ts0P",
137 "Ts0S", NULL },
140 /* List of keys used to read/write fan speeds */
141 static const char* fan_speed_keys[] = {
142 FAN_ACTUAL_SPEED,
143 FAN_MIN_SPEED,
144 FAN_MAX_SPEED,
145 FAN_SAFE_SPEED,
146 FAN_TARGET_SPEED
149 #define INIT_TIMEOUT_MSECS 5000 /* wait up to 5s for device init ... */
150 #define INIT_WAIT_MSECS 50 /* ... in 50ms increments */
152 #define APPLESMC_POLL_INTERVAL 50 /* msecs */
153 #define APPLESMC_INPUT_FUZZ 4 /* input event threshold */
154 #define APPLESMC_INPUT_FLAT 4
156 #define SENSOR_X 0
157 #define SENSOR_Y 1
158 #define SENSOR_Z 2
160 /* Structure to be passed to DMI_MATCH function */
161 struct dmi_match_data {
162 /* Indicates whether this computer has an accelerometer. */
163 int accelerometer;
164 /* Indicates whether this computer has light sensors and keyboard backlight. */
165 int light;
166 /* Indicates which temperature sensors set to use. */
167 int temperature_set;
170 static const int debug;
171 static struct platform_device *pdev;
172 static s16 rest_x;
173 static s16 rest_y;
174 static struct device *hwmon_dev;
175 static struct input_polled_dev *applesmc_idev;
177 /* Indicates whether this computer has an accelerometer. */
178 static unsigned int applesmc_accelerometer;
180 /* Indicates whether this computer has light sensors and keyboard backlight. */
181 static unsigned int applesmc_light;
183 /* Indicates which temperature sensors set to use. */
184 static unsigned int applesmc_temperature_set;
186 static DEFINE_MUTEX(applesmc_lock);
189 * Last index written to key_at_index sysfs file, and value to use for all other
190 * key_at_index_* sysfs files.
192 static unsigned int key_at_index;
194 static struct workqueue_struct *applesmc_led_wq;
197 * __wait_status - Wait up to 32ms for the status port to get a certain value
198 * (masked with 0x0f), returning zero if the value is obtained. Callers must
199 * hold applesmc_lock.
201 static int __wait_status(u8 val)
203 int us;
205 val = val & APPLESMC_STATUS_MASK;
207 for (us = APPLESMC_MIN_WAIT; us < APPLESMC_MAX_WAIT; us <<= 1) {
208 udelay(us);
209 if ((inb(APPLESMC_CMD_PORT) & APPLESMC_STATUS_MASK) == val) {
210 if (debug)
211 printk(KERN_DEBUG
212 "Waited %d us for status %x\n",
213 2 * us - APPLESMC_MIN_WAIT, val);
214 return 0;
218 printk(KERN_WARNING "applesmc: wait status failed: %x != %x\n",
219 val, inb(APPLESMC_CMD_PORT));
221 return -EIO;
225 * special treatment of command port - on newer macbooks, it seems necessary
226 * to resend the command byte before polling the status again. Callers must
227 * hold applesmc_lock.
229 static int send_command(u8 cmd)
231 int us;
232 for (us = APPLESMC_MIN_WAIT; us < APPLESMC_MAX_WAIT; us <<= 1) {
233 outb(cmd, APPLESMC_CMD_PORT);
234 udelay(us);
235 if ((inb(APPLESMC_CMD_PORT) & APPLESMC_STATUS_MASK) == 0x0c)
236 return 0;
238 printk(KERN_WARNING "applesmc: command failed: %x -> %x\n",
239 cmd, inb(APPLESMC_CMD_PORT));
240 return -EIO;
244 * applesmc_read_key - reads len bytes from a given key, and put them in buffer.
245 * Returns zero on success or a negative error on failure. Callers must
246 * hold applesmc_lock.
248 static int applesmc_read_key(const char* key, u8* buffer, u8 len)
250 int i;
252 if (len > APPLESMC_MAX_DATA_LENGTH) {
253 printk(KERN_ERR "applesmc_read_key: cannot read more than "
254 "%d bytes\n", APPLESMC_MAX_DATA_LENGTH);
255 return -EINVAL;
258 if (send_command(APPLESMC_READ_CMD))
259 return -EIO;
261 for (i = 0; i < 4; i++) {
262 outb(key[i], APPLESMC_DATA_PORT);
263 if (__wait_status(0x04))
264 return -EIO;
266 if (debug)
267 printk(KERN_DEBUG "<%s", key);
269 outb(len, APPLESMC_DATA_PORT);
270 if (debug)
271 printk(KERN_DEBUG ">%x", len);
273 for (i = 0; i < len; i++) {
274 if (__wait_status(0x05))
275 return -EIO;
276 buffer[i] = inb(APPLESMC_DATA_PORT);
277 if (debug)
278 printk(KERN_DEBUG "<%x", buffer[i]);
280 if (debug)
281 printk(KERN_DEBUG "\n");
283 return 0;
287 * applesmc_write_key - writes len bytes from buffer to a given key.
288 * Returns zero on success or a negative error on failure. Callers must
289 * hold applesmc_lock.
291 static int applesmc_write_key(const char* key, u8* buffer, u8 len)
293 int i;
295 if (len > APPLESMC_MAX_DATA_LENGTH) {
296 printk(KERN_ERR "applesmc_write_key: cannot write more than "
297 "%d bytes\n", APPLESMC_MAX_DATA_LENGTH);
298 return -EINVAL;
301 if (send_command(APPLESMC_WRITE_CMD))
302 return -EIO;
304 for (i = 0; i < 4; i++) {
305 outb(key[i], APPLESMC_DATA_PORT);
306 if (__wait_status(0x04))
307 return -EIO;
310 outb(len, APPLESMC_DATA_PORT);
312 for (i = 0; i < len; i++) {
313 if (__wait_status(0x04))
314 return -EIO;
315 outb(buffer[i], APPLESMC_DATA_PORT);
318 return 0;
322 * applesmc_get_key_at_index - get key at index, and put the result in key
323 * (char[6]). Returns zero on success or a negative error on failure. Callers
324 * must hold applesmc_lock.
326 static int applesmc_get_key_at_index(int index, char* key)
328 int i;
329 u8 readkey[4];
330 readkey[0] = index >> 24;
331 readkey[1] = index >> 16;
332 readkey[2] = index >> 8;
333 readkey[3] = index;
335 if (send_command(APPLESMC_GET_KEY_BY_INDEX_CMD))
336 return -EIO;
338 for (i = 0; i < 4; i++) {
339 outb(readkey[i], APPLESMC_DATA_PORT);
340 if (__wait_status(0x04))
341 return -EIO;
344 outb(4, APPLESMC_DATA_PORT);
346 for (i = 0; i < 4; i++) {
347 if (__wait_status(0x05))
348 return -EIO;
349 key[i] = inb(APPLESMC_DATA_PORT);
351 key[4] = 0;
353 return 0;
357 * applesmc_get_key_type - get key type, and put the result in type (char[6]).
358 * Returns zero on success or a negative error on failure. Callers must
359 * hold applesmc_lock.
361 static int applesmc_get_key_type(char* key, char* type)
363 int i;
365 if (send_command(APPLESMC_GET_KEY_TYPE_CMD))
366 return -EIO;
368 for (i = 0; i < 4; i++) {
369 outb(key[i], APPLESMC_DATA_PORT);
370 if (__wait_status(0x04))
371 return -EIO;
374 outb(6, APPLESMC_DATA_PORT);
376 for (i = 0; i < 6; i++) {
377 if (__wait_status(0x05))
378 return -EIO;
379 type[i] = inb(APPLESMC_DATA_PORT);
381 type[5] = 0;
383 return 0;
387 * applesmc_read_motion_sensor - Read motion sensor (X, Y or Z). Callers must
388 * hold applesmc_lock.
390 static int applesmc_read_motion_sensor(int index, s16* value)
392 u8 buffer[2];
393 int ret;
395 switch (index) {
396 case SENSOR_X:
397 ret = applesmc_read_key(MOTION_SENSOR_X_KEY, buffer, 2);
398 break;
399 case SENSOR_Y:
400 ret = applesmc_read_key(MOTION_SENSOR_Y_KEY, buffer, 2);
401 break;
402 case SENSOR_Z:
403 ret = applesmc_read_key(MOTION_SENSOR_Z_KEY, buffer, 2);
404 break;
405 default:
406 ret = -EINVAL;
409 *value = ((s16)buffer[0] << 8) | buffer[1];
411 return ret;
415 * applesmc_device_init - initialize the accelerometer. Returns zero on success
416 * and negative error code on failure. Can sleep.
418 static int applesmc_device_init(void)
420 int total, ret = -ENXIO;
421 u8 buffer[2];
423 if (!applesmc_accelerometer)
424 return 0;
426 mutex_lock(&applesmc_lock);
428 for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) {
429 if (debug)
430 printk(KERN_DEBUG "applesmc try %d\n", total);
431 if (!applesmc_read_key(MOTION_SENSOR_KEY, buffer, 2) &&
432 (buffer[0] != 0x00 || buffer[1] != 0x00)) {
433 if (total == INIT_TIMEOUT_MSECS) {
434 printk(KERN_DEBUG "applesmc: device has"
435 " already been initialized"
436 " (0x%02x, 0x%02x).\n",
437 buffer[0], buffer[1]);
438 } else {
439 printk(KERN_DEBUG "applesmc: device"
440 " successfully initialized"
441 " (0x%02x, 0x%02x).\n",
442 buffer[0], buffer[1]);
444 ret = 0;
445 goto out;
447 buffer[0] = 0xe0;
448 buffer[1] = 0x00;
449 applesmc_write_key(MOTION_SENSOR_KEY, buffer, 2);
450 msleep(INIT_WAIT_MSECS);
453 printk(KERN_WARNING "applesmc: failed to init the device\n");
455 out:
456 mutex_unlock(&applesmc_lock);
457 return ret;
461 * applesmc_get_fan_count - get the number of fans. Callers must NOT hold
462 * applesmc_lock.
464 static int applesmc_get_fan_count(void)
466 int ret;
467 u8 buffer[1];
469 mutex_lock(&applesmc_lock);
471 ret = applesmc_read_key(FANS_COUNT, buffer, 1);
473 mutex_unlock(&applesmc_lock);
474 if (ret)
475 return ret;
476 else
477 return buffer[0];
480 /* Device model stuff */
481 static int applesmc_probe(struct platform_device *dev)
483 int ret;
485 ret = applesmc_device_init();
486 if (ret)
487 return ret;
489 printk(KERN_INFO "applesmc: device successfully initialized.\n");
490 return 0;
493 static int applesmc_resume(struct platform_device *dev)
495 return applesmc_device_init();
498 static struct platform_driver applesmc_driver = {
499 .probe = applesmc_probe,
500 .resume = applesmc_resume,
501 .driver = {
502 .name = "applesmc",
503 .owner = THIS_MODULE,
508 * applesmc_calibrate - Set our "resting" values. Callers must
509 * hold applesmc_lock.
511 static void applesmc_calibrate(void)
513 applesmc_read_motion_sensor(SENSOR_X, &rest_x);
514 applesmc_read_motion_sensor(SENSOR_Y, &rest_y);
515 rest_x = -rest_x;
518 static void applesmc_idev_poll(struct input_polled_dev *dev)
520 struct input_dev *idev = dev->input;
521 s16 x, y;
523 mutex_lock(&applesmc_lock);
525 if (applesmc_read_motion_sensor(SENSOR_X, &x))
526 goto out;
527 if (applesmc_read_motion_sensor(SENSOR_Y, &y))
528 goto out;
530 x = -x;
531 input_report_abs(idev, ABS_X, x - rest_x);
532 input_report_abs(idev, ABS_Y, y - rest_y);
533 input_sync(idev);
535 out:
536 mutex_unlock(&applesmc_lock);
539 /* Sysfs Files */
541 static ssize_t applesmc_name_show(struct device *dev,
542 struct device_attribute *attr, char *buf)
544 return snprintf(buf, PAGE_SIZE, "applesmc\n");
547 static ssize_t applesmc_position_show(struct device *dev,
548 struct device_attribute *attr, char *buf)
550 int ret;
551 s16 x, y, z;
553 mutex_lock(&applesmc_lock);
555 ret = applesmc_read_motion_sensor(SENSOR_X, &x);
556 if (ret)
557 goto out;
558 ret = applesmc_read_motion_sensor(SENSOR_Y, &y);
559 if (ret)
560 goto out;
561 ret = applesmc_read_motion_sensor(SENSOR_Z, &z);
562 if (ret)
563 goto out;
565 out:
566 mutex_unlock(&applesmc_lock);
567 if (ret)
568 return ret;
569 else
570 return snprintf(buf, PAGE_SIZE, "(%d,%d,%d)\n", x, y, z);
573 static ssize_t applesmc_light_show(struct device *dev,
574 struct device_attribute *attr, char *sysfsbuf)
576 static int data_length;
577 int ret;
578 u8 left = 0, right = 0;
579 u8 buffer[10], query[6];
581 mutex_lock(&applesmc_lock);
583 if (!data_length) {
584 ret = applesmc_get_key_type(LIGHT_SENSOR_LEFT_KEY, query);
585 if (ret)
586 goto out;
587 data_length = clamp_val(query[0], 0, 10);
588 printk(KERN_INFO "applesmc: light sensor data length set to "
589 "%d\n", data_length);
592 ret = applesmc_read_key(LIGHT_SENSOR_LEFT_KEY, buffer, data_length);
593 /* newer macbooks report a single 10-bit bigendian value */
594 if (data_length == 10) {
595 left = be16_to_cpu(*(__be16 *)(buffer + 6)) >> 2;
596 goto out;
598 left = buffer[2];
599 if (ret)
600 goto out;
601 ret = applesmc_read_key(LIGHT_SENSOR_RIGHT_KEY, buffer, data_length);
602 right = buffer[2];
604 out:
605 mutex_unlock(&applesmc_lock);
606 if (ret)
607 return ret;
608 else
609 return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", left, right);
612 /* Displays degree Celsius * 1000 */
613 static ssize_t applesmc_show_temperature(struct device *dev,
614 struct device_attribute *devattr, char *sysfsbuf)
616 int ret;
617 u8 buffer[2];
618 unsigned int temp;
619 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
620 const char* key =
621 temperature_sensors_sets[applesmc_temperature_set][attr->index];
623 mutex_lock(&applesmc_lock);
625 ret = applesmc_read_key(key, buffer, 2);
626 temp = buffer[0]*1000;
627 temp += (buffer[1] >> 6) * 250;
629 mutex_unlock(&applesmc_lock);
631 if (ret)
632 return ret;
633 else
634 return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", temp);
637 static ssize_t applesmc_show_fan_speed(struct device *dev,
638 struct device_attribute *attr, char *sysfsbuf)
640 int ret;
641 unsigned int speed = 0;
642 char newkey[5];
643 u8 buffer[2];
644 struct sensor_device_attribute_2 *sensor_attr =
645 to_sensor_dev_attr_2(attr);
647 newkey[0] = fan_speed_keys[sensor_attr->nr][0];
648 newkey[1] = '0' + sensor_attr->index;
649 newkey[2] = fan_speed_keys[sensor_attr->nr][2];
650 newkey[3] = fan_speed_keys[sensor_attr->nr][3];
651 newkey[4] = 0;
653 mutex_lock(&applesmc_lock);
655 ret = applesmc_read_key(newkey, buffer, 2);
656 speed = ((buffer[0] << 8 | buffer[1]) >> 2);
658 mutex_unlock(&applesmc_lock);
659 if (ret)
660 return ret;
661 else
662 return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", speed);
665 static ssize_t applesmc_store_fan_speed(struct device *dev,
666 struct device_attribute *attr,
667 const char *sysfsbuf, size_t count)
669 int ret;
670 u32 speed;
671 char newkey[5];
672 u8 buffer[2];
673 struct sensor_device_attribute_2 *sensor_attr =
674 to_sensor_dev_attr_2(attr);
676 speed = simple_strtoul(sysfsbuf, NULL, 10);
678 if (speed > 0x4000) /* Bigger than a 14-bit value */
679 return -EINVAL;
681 newkey[0] = fan_speed_keys[sensor_attr->nr][0];
682 newkey[1] = '0' + sensor_attr->index;
683 newkey[2] = fan_speed_keys[sensor_attr->nr][2];
684 newkey[3] = fan_speed_keys[sensor_attr->nr][3];
685 newkey[4] = 0;
687 mutex_lock(&applesmc_lock);
689 buffer[0] = (speed >> 6) & 0xff;
690 buffer[1] = (speed << 2) & 0xff;
691 ret = applesmc_write_key(newkey, buffer, 2);
693 mutex_unlock(&applesmc_lock);
694 if (ret)
695 return ret;
696 else
697 return count;
700 static ssize_t applesmc_show_fan_manual(struct device *dev,
701 struct device_attribute *devattr, char *sysfsbuf)
703 int ret;
704 u16 manual = 0;
705 u8 buffer[2];
706 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
708 mutex_lock(&applesmc_lock);
710 ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
711 manual = ((buffer[0] << 8 | buffer[1]) >> attr->index) & 0x01;
713 mutex_unlock(&applesmc_lock);
714 if (ret)
715 return ret;
716 else
717 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", manual);
720 static ssize_t applesmc_store_fan_manual(struct device *dev,
721 struct device_attribute *devattr,
722 const char *sysfsbuf, size_t count)
724 int ret;
725 u8 buffer[2];
726 u32 input;
727 u16 val;
728 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
730 input = simple_strtoul(sysfsbuf, NULL, 10);
732 mutex_lock(&applesmc_lock);
734 ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
735 val = (buffer[0] << 8 | buffer[1]);
736 if (ret)
737 goto out;
739 if (input)
740 val = val | (0x01 << attr->index);
741 else
742 val = val & ~(0x01 << attr->index);
744 buffer[0] = (val >> 8) & 0xFF;
745 buffer[1] = val & 0xFF;
747 ret = applesmc_write_key(FANS_MANUAL, buffer, 2);
749 out:
750 mutex_unlock(&applesmc_lock);
751 if (ret)
752 return ret;
753 else
754 return count;
757 static ssize_t applesmc_show_fan_position(struct device *dev,
758 struct device_attribute *attr, char *sysfsbuf)
760 int ret;
761 char newkey[5];
762 u8 buffer[17];
763 struct sensor_device_attribute_2 *sensor_attr =
764 to_sensor_dev_attr_2(attr);
766 newkey[0] = FAN_POSITION[0];
767 newkey[1] = '0' + sensor_attr->index;
768 newkey[2] = FAN_POSITION[2];
769 newkey[3] = FAN_POSITION[3];
770 newkey[4] = 0;
772 mutex_lock(&applesmc_lock);
774 ret = applesmc_read_key(newkey, buffer, 16);
775 buffer[16] = 0;
777 mutex_unlock(&applesmc_lock);
778 if (ret)
779 return ret;
780 else
781 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", buffer+4);
784 static ssize_t applesmc_calibrate_show(struct device *dev,
785 struct device_attribute *attr, char *sysfsbuf)
787 return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", rest_x, rest_y);
790 static ssize_t applesmc_calibrate_store(struct device *dev,
791 struct device_attribute *attr, const char *sysfsbuf, size_t count)
793 mutex_lock(&applesmc_lock);
794 applesmc_calibrate();
795 mutex_unlock(&applesmc_lock);
797 return count;
800 /* Store the next backlight value to be written by the work */
801 static unsigned int backlight_value;
803 static void applesmc_backlight_set(struct work_struct *work)
805 u8 buffer[2];
807 mutex_lock(&applesmc_lock);
808 buffer[0] = backlight_value;
809 buffer[1] = 0x00;
810 applesmc_write_key(BACKLIGHT_KEY, buffer, 2);
811 mutex_unlock(&applesmc_lock);
813 static DECLARE_WORK(backlight_work, &applesmc_backlight_set);
815 static void applesmc_brightness_set(struct led_classdev *led_cdev,
816 enum led_brightness value)
818 int ret;
820 backlight_value = value;
821 ret = queue_work(applesmc_led_wq, &backlight_work);
823 if (debug && (!ret))
824 printk(KERN_DEBUG "applesmc: work was already on the queue.\n");
827 static ssize_t applesmc_key_count_show(struct device *dev,
828 struct device_attribute *attr, char *sysfsbuf)
830 int ret;
831 u8 buffer[4];
832 u32 count;
834 mutex_lock(&applesmc_lock);
836 ret = applesmc_read_key(KEY_COUNT_KEY, buffer, 4);
837 count = ((u32)buffer[0]<<24) + ((u32)buffer[1]<<16) +
838 ((u32)buffer[2]<<8) + buffer[3];
840 mutex_unlock(&applesmc_lock);
841 if (ret)
842 return ret;
843 else
844 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", count);
847 static ssize_t applesmc_key_at_index_read_show(struct device *dev,
848 struct device_attribute *attr, char *sysfsbuf)
850 char key[5];
851 char info[6];
852 int ret;
854 mutex_lock(&applesmc_lock);
856 ret = applesmc_get_key_at_index(key_at_index, key);
858 if (ret || !key[0]) {
859 mutex_unlock(&applesmc_lock);
861 return -EINVAL;
864 ret = applesmc_get_key_type(key, info);
866 if (ret) {
867 mutex_unlock(&applesmc_lock);
869 return ret;
873 * info[0] maximum value (APPLESMC_MAX_DATA_LENGTH) is much lower than
874 * PAGE_SIZE, so we don't need any checks before writing to sysfsbuf.
876 ret = applesmc_read_key(key, sysfsbuf, info[0]);
878 mutex_unlock(&applesmc_lock);
880 if (!ret) {
881 return info[0];
882 } else {
883 return ret;
887 static ssize_t applesmc_key_at_index_data_length_show(struct device *dev,
888 struct device_attribute *attr, char *sysfsbuf)
890 char key[5];
891 char info[6];
892 int ret;
894 mutex_lock(&applesmc_lock);
896 ret = applesmc_get_key_at_index(key_at_index, key);
898 if (ret || !key[0]) {
899 mutex_unlock(&applesmc_lock);
901 return -EINVAL;
904 ret = applesmc_get_key_type(key, info);
906 mutex_unlock(&applesmc_lock);
908 if (!ret)
909 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", info[0]);
910 else
911 return ret;
914 static ssize_t applesmc_key_at_index_type_show(struct device *dev,
915 struct device_attribute *attr, char *sysfsbuf)
917 char key[5];
918 char info[6];
919 int ret;
921 mutex_lock(&applesmc_lock);
923 ret = applesmc_get_key_at_index(key_at_index, key);
925 if (ret || !key[0]) {
926 mutex_unlock(&applesmc_lock);
928 return -EINVAL;
931 ret = applesmc_get_key_type(key, info);
933 mutex_unlock(&applesmc_lock);
935 if (!ret)
936 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", info+1);
937 else
938 return ret;
941 static ssize_t applesmc_key_at_index_name_show(struct device *dev,
942 struct device_attribute *attr, char *sysfsbuf)
944 char key[5];
945 int ret;
947 mutex_lock(&applesmc_lock);
949 ret = applesmc_get_key_at_index(key_at_index, key);
951 mutex_unlock(&applesmc_lock);
953 if (!ret && key[0])
954 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", key);
955 else
956 return -EINVAL;
959 static ssize_t applesmc_key_at_index_show(struct device *dev,
960 struct device_attribute *attr, char *sysfsbuf)
962 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", key_at_index);
965 static ssize_t applesmc_key_at_index_store(struct device *dev,
966 struct device_attribute *attr, const char *sysfsbuf, size_t count)
968 mutex_lock(&applesmc_lock);
970 key_at_index = simple_strtoul(sysfsbuf, NULL, 10);
972 mutex_unlock(&applesmc_lock);
974 return count;
977 static struct led_classdev applesmc_backlight = {
978 .name = "smc::kbd_backlight",
979 .default_trigger = "nand-disk",
980 .brightness_set = applesmc_brightness_set,
983 static DEVICE_ATTR(name, 0444, applesmc_name_show, NULL);
985 static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL);
986 static DEVICE_ATTR(calibrate, 0644,
987 applesmc_calibrate_show, applesmc_calibrate_store);
989 static struct attribute *accelerometer_attributes[] = {
990 &dev_attr_position.attr,
991 &dev_attr_calibrate.attr,
992 NULL
995 static const struct attribute_group accelerometer_attributes_group =
996 { .attrs = accelerometer_attributes };
998 static DEVICE_ATTR(light, 0444, applesmc_light_show, NULL);
1000 static DEVICE_ATTR(key_count, 0444, applesmc_key_count_show, NULL);
1001 static DEVICE_ATTR(key_at_index, 0644,
1002 applesmc_key_at_index_show, applesmc_key_at_index_store);
1003 static DEVICE_ATTR(key_at_index_name, 0444,
1004 applesmc_key_at_index_name_show, NULL);
1005 static DEVICE_ATTR(key_at_index_type, 0444,
1006 applesmc_key_at_index_type_show, NULL);
1007 static DEVICE_ATTR(key_at_index_data_length, 0444,
1008 applesmc_key_at_index_data_length_show, NULL);
1009 static DEVICE_ATTR(key_at_index_data, 0444,
1010 applesmc_key_at_index_read_show, NULL);
1012 static struct attribute *key_enumeration_attributes[] = {
1013 &dev_attr_key_count.attr,
1014 &dev_attr_key_at_index.attr,
1015 &dev_attr_key_at_index_name.attr,
1016 &dev_attr_key_at_index_type.attr,
1017 &dev_attr_key_at_index_data_length.attr,
1018 &dev_attr_key_at_index_data.attr,
1019 NULL
1022 static const struct attribute_group key_enumeration_group =
1023 { .attrs = key_enumeration_attributes };
1026 * Macro defining SENSOR_DEVICE_ATTR for a fan sysfs entries.
1027 * - show actual speed
1028 * - show/store minimum speed
1029 * - show maximum speed
1030 * - show safe speed
1031 * - show/store target speed
1032 * - show/store manual mode
1034 #define sysfs_fan_speeds_offset(offset) \
1035 static SENSOR_DEVICE_ATTR_2(fan##offset##_input, S_IRUGO, \
1036 applesmc_show_fan_speed, NULL, 0, offset-1); \
1038 static SENSOR_DEVICE_ATTR_2(fan##offset##_min, S_IRUGO | S_IWUSR, \
1039 applesmc_show_fan_speed, applesmc_store_fan_speed, 1, offset-1); \
1041 static SENSOR_DEVICE_ATTR_2(fan##offset##_max, S_IRUGO, \
1042 applesmc_show_fan_speed, NULL, 2, offset-1); \
1044 static SENSOR_DEVICE_ATTR_2(fan##offset##_safe, S_IRUGO, \
1045 applesmc_show_fan_speed, NULL, 3, offset-1); \
1047 static SENSOR_DEVICE_ATTR_2(fan##offset##_output, S_IRUGO | S_IWUSR, \
1048 applesmc_show_fan_speed, applesmc_store_fan_speed, 4, offset-1); \
1050 static SENSOR_DEVICE_ATTR(fan##offset##_manual, S_IRUGO | S_IWUSR, \
1051 applesmc_show_fan_manual, applesmc_store_fan_manual, offset-1); \
1053 static SENSOR_DEVICE_ATTR(fan##offset##_label, S_IRUGO, \
1054 applesmc_show_fan_position, NULL, offset-1); \
1056 static struct attribute *fan##offset##_attributes[] = { \
1057 &sensor_dev_attr_fan##offset##_input.dev_attr.attr, \
1058 &sensor_dev_attr_fan##offset##_min.dev_attr.attr, \
1059 &sensor_dev_attr_fan##offset##_max.dev_attr.attr, \
1060 &sensor_dev_attr_fan##offset##_safe.dev_attr.attr, \
1061 &sensor_dev_attr_fan##offset##_output.dev_attr.attr, \
1062 &sensor_dev_attr_fan##offset##_manual.dev_attr.attr, \
1063 &sensor_dev_attr_fan##offset##_label.dev_attr.attr, \
1064 NULL \
1068 * Create the needed functions for each fan using the macro defined above
1069 * (4 fans are supported)
1071 sysfs_fan_speeds_offset(1);
1072 sysfs_fan_speeds_offset(2);
1073 sysfs_fan_speeds_offset(3);
1074 sysfs_fan_speeds_offset(4);
1076 static const struct attribute_group fan_attribute_groups[] = {
1077 { .attrs = fan1_attributes },
1078 { .attrs = fan2_attributes },
1079 { .attrs = fan3_attributes },
1080 { .attrs = fan4_attributes },
1084 * Temperature sensors sysfs entries.
1086 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO,
1087 applesmc_show_temperature, NULL, 0);
1088 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO,
1089 applesmc_show_temperature, NULL, 1);
1090 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO,
1091 applesmc_show_temperature, NULL, 2);
1092 static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO,
1093 applesmc_show_temperature, NULL, 3);
1094 static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO,
1095 applesmc_show_temperature, NULL, 4);
1096 static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO,
1097 applesmc_show_temperature, NULL, 5);
1098 static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO,
1099 applesmc_show_temperature, NULL, 6);
1100 static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO,
1101 applesmc_show_temperature, NULL, 7);
1102 static SENSOR_DEVICE_ATTR(temp9_input, S_IRUGO,
1103 applesmc_show_temperature, NULL, 8);
1104 static SENSOR_DEVICE_ATTR(temp10_input, S_IRUGO,
1105 applesmc_show_temperature, NULL, 9);
1106 static SENSOR_DEVICE_ATTR(temp11_input, S_IRUGO,
1107 applesmc_show_temperature, NULL, 10);
1108 static SENSOR_DEVICE_ATTR(temp12_input, S_IRUGO,
1109 applesmc_show_temperature, NULL, 11);
1110 static SENSOR_DEVICE_ATTR(temp13_input, S_IRUGO,
1111 applesmc_show_temperature, NULL, 12);
1112 static SENSOR_DEVICE_ATTR(temp14_input, S_IRUGO,
1113 applesmc_show_temperature, NULL, 13);
1114 static SENSOR_DEVICE_ATTR(temp15_input, S_IRUGO,
1115 applesmc_show_temperature, NULL, 14);
1116 static SENSOR_DEVICE_ATTR(temp16_input, S_IRUGO,
1117 applesmc_show_temperature, NULL, 15);
1118 static SENSOR_DEVICE_ATTR(temp17_input, S_IRUGO,
1119 applesmc_show_temperature, NULL, 16);
1120 static SENSOR_DEVICE_ATTR(temp18_input, S_IRUGO,
1121 applesmc_show_temperature, NULL, 17);
1122 static SENSOR_DEVICE_ATTR(temp19_input, S_IRUGO,
1123 applesmc_show_temperature, NULL, 18);
1124 static SENSOR_DEVICE_ATTR(temp20_input, S_IRUGO,
1125 applesmc_show_temperature, NULL, 19);
1126 static SENSOR_DEVICE_ATTR(temp21_input, S_IRUGO,
1127 applesmc_show_temperature, NULL, 20);
1128 static SENSOR_DEVICE_ATTR(temp22_input, S_IRUGO,
1129 applesmc_show_temperature, NULL, 21);
1130 static SENSOR_DEVICE_ATTR(temp23_input, S_IRUGO,
1131 applesmc_show_temperature, NULL, 22);
1132 static SENSOR_DEVICE_ATTR(temp24_input, S_IRUGO,
1133 applesmc_show_temperature, NULL, 23);
1134 static SENSOR_DEVICE_ATTR(temp25_input, S_IRUGO,
1135 applesmc_show_temperature, NULL, 24);
1136 static SENSOR_DEVICE_ATTR(temp26_input, S_IRUGO,
1137 applesmc_show_temperature, NULL, 25);
1138 static SENSOR_DEVICE_ATTR(temp27_input, S_IRUGO,
1139 applesmc_show_temperature, NULL, 26);
1140 static SENSOR_DEVICE_ATTR(temp28_input, S_IRUGO,
1141 applesmc_show_temperature, NULL, 27);
1142 static SENSOR_DEVICE_ATTR(temp29_input, S_IRUGO,
1143 applesmc_show_temperature, NULL, 28);
1144 static SENSOR_DEVICE_ATTR(temp30_input, S_IRUGO,
1145 applesmc_show_temperature, NULL, 29);
1146 static SENSOR_DEVICE_ATTR(temp31_input, S_IRUGO,
1147 applesmc_show_temperature, NULL, 30);
1148 static SENSOR_DEVICE_ATTR(temp32_input, S_IRUGO,
1149 applesmc_show_temperature, NULL, 31);
1150 static SENSOR_DEVICE_ATTR(temp33_input, S_IRUGO,
1151 applesmc_show_temperature, NULL, 32);
1152 static SENSOR_DEVICE_ATTR(temp34_input, S_IRUGO,
1153 applesmc_show_temperature, NULL, 33);
1154 static SENSOR_DEVICE_ATTR(temp35_input, S_IRUGO,
1155 applesmc_show_temperature, NULL, 34);
1157 static struct attribute *temperature_attributes[] = {
1158 &sensor_dev_attr_temp1_input.dev_attr.attr,
1159 &sensor_dev_attr_temp2_input.dev_attr.attr,
1160 &sensor_dev_attr_temp3_input.dev_attr.attr,
1161 &sensor_dev_attr_temp4_input.dev_attr.attr,
1162 &sensor_dev_attr_temp5_input.dev_attr.attr,
1163 &sensor_dev_attr_temp6_input.dev_attr.attr,
1164 &sensor_dev_attr_temp7_input.dev_attr.attr,
1165 &sensor_dev_attr_temp8_input.dev_attr.attr,
1166 &sensor_dev_attr_temp9_input.dev_attr.attr,
1167 &sensor_dev_attr_temp10_input.dev_attr.attr,
1168 &sensor_dev_attr_temp11_input.dev_attr.attr,
1169 &sensor_dev_attr_temp12_input.dev_attr.attr,
1170 &sensor_dev_attr_temp13_input.dev_attr.attr,
1171 &sensor_dev_attr_temp14_input.dev_attr.attr,
1172 &sensor_dev_attr_temp15_input.dev_attr.attr,
1173 &sensor_dev_attr_temp16_input.dev_attr.attr,
1174 &sensor_dev_attr_temp17_input.dev_attr.attr,
1175 &sensor_dev_attr_temp18_input.dev_attr.attr,
1176 &sensor_dev_attr_temp19_input.dev_attr.attr,
1177 &sensor_dev_attr_temp20_input.dev_attr.attr,
1178 &sensor_dev_attr_temp21_input.dev_attr.attr,
1179 &sensor_dev_attr_temp22_input.dev_attr.attr,
1180 &sensor_dev_attr_temp23_input.dev_attr.attr,
1181 &sensor_dev_attr_temp24_input.dev_attr.attr,
1182 &sensor_dev_attr_temp25_input.dev_attr.attr,
1183 &sensor_dev_attr_temp26_input.dev_attr.attr,
1184 &sensor_dev_attr_temp27_input.dev_attr.attr,
1185 &sensor_dev_attr_temp28_input.dev_attr.attr,
1186 &sensor_dev_attr_temp29_input.dev_attr.attr,
1187 &sensor_dev_attr_temp30_input.dev_attr.attr,
1188 &sensor_dev_attr_temp31_input.dev_attr.attr,
1189 &sensor_dev_attr_temp32_input.dev_attr.attr,
1190 &sensor_dev_attr_temp33_input.dev_attr.attr,
1191 &sensor_dev_attr_temp34_input.dev_attr.attr,
1192 &sensor_dev_attr_temp35_input.dev_attr.attr,
1193 NULL
1196 static const struct attribute_group temperature_attributes_group =
1197 { .attrs = temperature_attributes };
1199 /* Module stuff */
1202 * applesmc_dmi_match - found a match. return one, short-circuiting the hunt.
1204 static int applesmc_dmi_match(const struct dmi_system_id *id)
1206 int i = 0;
1207 struct dmi_match_data* dmi_data = id->driver_data;
1208 printk(KERN_INFO "applesmc: %s detected:\n", id->ident);
1209 applesmc_accelerometer = dmi_data->accelerometer;
1210 printk(KERN_INFO "applesmc: - Model %s accelerometer\n",
1211 applesmc_accelerometer ? "with" : "without");
1212 applesmc_light = dmi_data->light;
1213 printk(KERN_INFO "applesmc: - Model %s light sensors and backlight\n",
1214 applesmc_light ? "with" : "without");
1216 applesmc_temperature_set = dmi_data->temperature_set;
1217 while (temperature_sensors_sets[applesmc_temperature_set][i] != NULL)
1218 i++;
1219 printk(KERN_INFO "applesmc: - Model with %d temperature sensors\n", i);
1220 return 1;
1223 /* Create accelerometer ressources */
1224 static int applesmc_create_accelerometer(void)
1226 struct input_dev *idev;
1227 int ret;
1229 ret = sysfs_create_group(&pdev->dev.kobj,
1230 &accelerometer_attributes_group);
1231 if (ret)
1232 goto out;
1234 applesmc_idev = input_allocate_polled_device();
1235 if (!applesmc_idev) {
1236 ret = -ENOMEM;
1237 goto out_sysfs;
1240 applesmc_idev->poll = applesmc_idev_poll;
1241 applesmc_idev->poll_interval = APPLESMC_POLL_INTERVAL;
1243 /* initial calibrate for the input device */
1244 applesmc_calibrate();
1246 /* initialize the input device */
1247 idev = applesmc_idev->input;
1248 idev->name = "applesmc";
1249 idev->id.bustype = BUS_HOST;
1250 idev->dev.parent = &pdev->dev;
1251 idev->evbit[0] = BIT_MASK(EV_ABS);
1252 input_set_abs_params(idev, ABS_X,
1253 -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
1254 input_set_abs_params(idev, ABS_Y,
1255 -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
1257 ret = input_register_polled_device(applesmc_idev);
1258 if (ret)
1259 goto out_idev;
1261 return 0;
1263 out_idev:
1264 input_free_polled_device(applesmc_idev);
1266 out_sysfs:
1267 sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group);
1269 out:
1270 printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
1271 return ret;
1274 /* Release all ressources used by the accelerometer */
1275 static void applesmc_release_accelerometer(void)
1277 input_unregister_polled_device(applesmc_idev);
1278 input_free_polled_device(applesmc_idev);
1279 sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group);
1282 static __initdata struct dmi_match_data applesmc_dmi_data[] = {
1283 /* MacBook Pro: accelerometer, backlight and temperature set 0 */
1284 { .accelerometer = 1, .light = 1, .temperature_set = 0 },
1285 /* MacBook2: accelerometer and temperature set 1 */
1286 { .accelerometer = 1, .light = 0, .temperature_set = 1 },
1287 /* MacBook: accelerometer and temperature set 2 */
1288 { .accelerometer = 1, .light = 0, .temperature_set = 2 },
1289 /* MacMini: temperature set 3 */
1290 { .accelerometer = 0, .light = 0, .temperature_set = 3 },
1291 /* MacPro: temperature set 4 */
1292 { .accelerometer = 0, .light = 0, .temperature_set = 4 },
1293 /* iMac: temperature set 5 */
1294 { .accelerometer = 0, .light = 0, .temperature_set = 5 },
1295 /* MacBook3, MacBook4: accelerometer and temperature set 6 */
1296 { .accelerometer = 1, .light = 0, .temperature_set = 6 },
1297 /* MacBook Air: accelerometer, backlight and temperature set 7 */
1298 { .accelerometer = 1, .light = 1, .temperature_set = 7 },
1299 /* MacBook Pro 4: accelerometer, backlight and temperature set 8 */
1300 { .accelerometer = 1, .light = 1, .temperature_set = 8 },
1301 /* MacBook Pro 3: accelerometer, backlight and temperature set 9 */
1302 { .accelerometer = 1, .light = 1, .temperature_set = 9 },
1303 /* iMac 5: light sensor only, temperature set 10 */
1304 { .accelerometer = 0, .light = 0, .temperature_set = 10 },
1305 /* MacBook 5: accelerometer, backlight and temperature set 11 */
1306 { .accelerometer = 1, .light = 1, .temperature_set = 11 },
1307 /* MacBook Pro 5: accelerometer, backlight and temperature set 12 */
1308 { .accelerometer = 1, .light = 1, .temperature_set = 12 },
1309 /* iMac 8: light sensor only, temperature set 13 */
1310 { .accelerometer = 0, .light = 0, .temperature_set = 13 },
1311 /* iMac 6: light sensor only, temperature set 14 */
1312 { .accelerometer = 0, .light = 0, .temperature_set = 14 },
1313 /* MacBook Air 2,1: accelerometer, backlight and temperature set 15 */
1314 { .accelerometer = 1, .light = 1, .temperature_set = 15 },
1317 /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
1318 * So we need to put "Apple MacBook Pro" before "Apple MacBook". */
1319 static __initdata struct dmi_system_id applesmc_whitelist[] = {
1320 { applesmc_dmi_match, "Apple MacBook Air 2", {
1321 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1322 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir2") },
1323 &applesmc_dmi_data[15]},
1324 { applesmc_dmi_match, "Apple MacBook Air", {
1325 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1326 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir") },
1327 &applesmc_dmi_data[7]},
1328 { applesmc_dmi_match, "Apple MacBook Pro 5", {
1329 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1330 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5") },
1331 &applesmc_dmi_data[12]},
1332 { applesmc_dmi_match, "Apple MacBook Pro 4", {
1333 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1334 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro4") },
1335 &applesmc_dmi_data[8]},
1336 { applesmc_dmi_match, "Apple MacBook Pro 3", {
1337 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1338 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3") },
1339 &applesmc_dmi_data[9]},
1340 { applesmc_dmi_match, "Apple MacBook Pro", {
1341 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1342 DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") },
1343 &applesmc_dmi_data[0]},
1344 { applesmc_dmi_match, "Apple MacBook (v2)", {
1345 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1346 DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") },
1347 &applesmc_dmi_data[1]},
1348 { applesmc_dmi_match, "Apple MacBook (v3)", {
1349 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1350 DMI_MATCH(DMI_PRODUCT_NAME,"MacBook3") },
1351 &applesmc_dmi_data[6]},
1352 { applesmc_dmi_match, "Apple MacBook 4", {
1353 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1354 DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4") },
1355 &applesmc_dmi_data[6]},
1356 { applesmc_dmi_match, "Apple MacBook 5", {
1357 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1358 DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5") },
1359 &applesmc_dmi_data[11]},
1360 { applesmc_dmi_match, "Apple MacBook", {
1361 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1362 DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") },
1363 &applesmc_dmi_data[2]},
1364 { applesmc_dmi_match, "Apple Macmini", {
1365 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1366 DMI_MATCH(DMI_PRODUCT_NAME,"Macmini") },
1367 &applesmc_dmi_data[3]},
1368 { applesmc_dmi_match, "Apple MacPro2", {
1369 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1370 DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") },
1371 &applesmc_dmi_data[4]},
1372 { applesmc_dmi_match, "Apple MacPro", {
1373 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1374 DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") },
1375 &applesmc_dmi_data[4]},
1376 { applesmc_dmi_match, "Apple iMac 8", {
1377 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1378 DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") },
1379 &applesmc_dmi_data[13]},
1380 { applesmc_dmi_match, "Apple iMac 6", {
1381 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1382 DMI_MATCH(DMI_PRODUCT_NAME, "iMac6") },
1383 &applesmc_dmi_data[14]},
1384 { applesmc_dmi_match, "Apple iMac 5", {
1385 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1386 DMI_MATCH(DMI_PRODUCT_NAME, "iMac5") },
1387 &applesmc_dmi_data[10]},
1388 { applesmc_dmi_match, "Apple iMac", {
1389 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1390 DMI_MATCH(DMI_PRODUCT_NAME,"iMac") },
1391 &applesmc_dmi_data[5]},
1392 { .ident = NULL }
1395 static int __init applesmc_init(void)
1397 int ret;
1398 int count;
1399 int i;
1401 if (!dmi_check_system(applesmc_whitelist)) {
1402 printk(KERN_WARNING "applesmc: supported laptop not found!\n");
1403 ret = -ENODEV;
1404 goto out;
1407 if (!request_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS,
1408 "applesmc")) {
1409 ret = -ENXIO;
1410 goto out;
1413 ret = platform_driver_register(&applesmc_driver);
1414 if (ret)
1415 goto out_region;
1417 pdev = platform_device_register_simple("applesmc", APPLESMC_DATA_PORT,
1418 NULL, 0);
1419 if (IS_ERR(pdev)) {
1420 ret = PTR_ERR(pdev);
1421 goto out_driver;
1424 ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_name.attr);
1425 if (ret)
1426 goto out_device;
1428 /* Create key enumeration sysfs files */
1429 ret = sysfs_create_group(&pdev->dev.kobj, &key_enumeration_group);
1430 if (ret)
1431 goto out_name;
1433 /* create fan files */
1434 count = applesmc_get_fan_count();
1435 if (count < 0) {
1436 printk(KERN_ERR "applesmc: Cannot get the number of fans.\n");
1437 } else {
1438 printk(KERN_INFO "applesmc: %d fans found.\n", count);
1440 switch (count) {
1441 default:
1442 printk(KERN_WARNING "applesmc: More than 4 fans found,"
1443 " but at most 4 fans are supported"
1444 " by the driver.\n");
1445 case 4:
1446 ret = sysfs_create_group(&pdev->dev.kobj,
1447 &fan_attribute_groups[3]);
1448 if (ret)
1449 goto out_key_enumeration;
1450 case 3:
1451 ret = sysfs_create_group(&pdev->dev.kobj,
1452 &fan_attribute_groups[2]);
1453 if (ret)
1454 goto out_key_enumeration;
1455 case 2:
1456 ret = sysfs_create_group(&pdev->dev.kobj,
1457 &fan_attribute_groups[1]);
1458 if (ret)
1459 goto out_key_enumeration;
1460 case 1:
1461 ret = sysfs_create_group(&pdev->dev.kobj,
1462 &fan_attribute_groups[0]);
1463 if (ret)
1464 goto out_fan_1;
1465 case 0:
1470 for (i = 0;
1471 temperature_sensors_sets[applesmc_temperature_set][i] != NULL;
1472 i++) {
1473 if (temperature_attributes[i] == NULL) {
1474 printk(KERN_ERR "applesmc: More temperature sensors "
1475 "in temperature_sensors_sets (at least %i)"
1476 "than available sysfs files in "
1477 "temperature_attributes (%i), please report "
1478 "this bug.\n", i, i-1);
1479 goto out_temperature;
1481 ret = sysfs_create_file(&pdev->dev.kobj,
1482 temperature_attributes[i]);
1483 if (ret)
1484 goto out_temperature;
1487 if (applesmc_accelerometer) {
1488 ret = applesmc_create_accelerometer();
1489 if (ret)
1490 goto out_temperature;
1493 if (applesmc_light) {
1494 /* Add light sensor file */
1495 ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_light.attr);
1496 if (ret)
1497 goto out_accelerometer;
1499 /* Create the workqueue */
1500 applesmc_led_wq = create_singlethread_workqueue("applesmc-led");
1501 if (!applesmc_led_wq) {
1502 ret = -ENOMEM;
1503 goto out_light_sysfs;
1506 /* register as a led device */
1507 ret = led_classdev_register(&pdev->dev, &applesmc_backlight);
1508 if (ret < 0)
1509 goto out_light_wq;
1512 hwmon_dev = hwmon_device_register(&pdev->dev);
1513 if (IS_ERR(hwmon_dev)) {
1514 ret = PTR_ERR(hwmon_dev);
1515 goto out_light_ledclass;
1518 printk(KERN_INFO "applesmc: driver successfully loaded.\n");
1520 return 0;
1522 out_light_ledclass:
1523 if (applesmc_light)
1524 led_classdev_unregister(&applesmc_backlight);
1525 out_light_wq:
1526 if (applesmc_light)
1527 destroy_workqueue(applesmc_led_wq);
1528 out_light_sysfs:
1529 if (applesmc_light)
1530 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
1531 out_accelerometer:
1532 if (applesmc_accelerometer)
1533 applesmc_release_accelerometer();
1534 out_temperature:
1535 sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group);
1536 sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[0]);
1537 out_fan_1:
1538 sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]);
1539 out_key_enumeration:
1540 sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
1541 out_name:
1542 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
1543 out_device:
1544 platform_device_unregister(pdev);
1545 out_driver:
1546 platform_driver_unregister(&applesmc_driver);
1547 out_region:
1548 release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
1549 out:
1550 printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
1551 return ret;
1554 static void __exit applesmc_exit(void)
1556 hwmon_device_unregister(hwmon_dev);
1557 if (applesmc_light) {
1558 led_classdev_unregister(&applesmc_backlight);
1559 destroy_workqueue(applesmc_led_wq);
1560 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
1562 if (applesmc_accelerometer)
1563 applesmc_release_accelerometer();
1564 sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group);
1565 sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[0]);
1566 sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]);
1567 sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
1568 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
1569 platform_device_unregister(pdev);
1570 platform_driver_unregister(&applesmc_driver);
1571 release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
1573 printk(KERN_INFO "applesmc: driver unloaded.\n");
1576 module_init(applesmc_init);
1577 module_exit(applesmc_exit);
1579 MODULE_AUTHOR("Nicolas Boichat");
1580 MODULE_DESCRIPTION("Apple SMC");
1581 MODULE_LICENSE("GPL v2");
1582 MODULE_DEVICE_TABLE(dmi, applesmc_whitelist);