2 * drivers/hwmon/applesmc.c - driver for Apple's SMC (accelerometer, temperature
3 * sensors, fan control, keyboard backlight control) used in Intel-based Apple
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
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>
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[][41] = {
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 },
105 { "TC0D", "TA0P", "TG0P", "TG0D", "TG0H", "TH0P", "Tm0P", "TO0P",
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",
138 /* Set 16: Mac Pro 3,1 (2 x Quad-Core) */
139 { "TA0P", "TCAG", "TCAH", "TCBG", "TCBH", "TC0C", "TC0D", "TC0P",
140 "TC1C", "TC1D", "TC2C", "TC2D", "TC3C", "TC3D", "TH0P", "TH1P",
141 "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S", "TM1P",
142 "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P", "TM9S",
143 "TN0C", "TN0D", "TN0H", "TS0C", "Tp0C", "Tp1C", "Tv0S", "Tv1S",
145 /* Set 17: iMac 9,1 */
146 { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TH0P", "TL0P",
147 "TN0D", "TN0H", "TN0P", "TO0P", "Tm0P", "Tp0P", NULL },
148 /* Set 18: MacBook Pro 2,2 */
149 { "TB0T", "TC0D", "TC0P", "TG0H", "TG0P", "TG0T", "TM0P", "TTF0",
150 "Th0H", "Th1H", "Tm0P", "Ts0P", NULL },
151 /* Set 19: Macbook Pro 5,3 */
152 { "TB0T", "TB1T", "TB2T", "TB3T", "TC0D", "TC0F", "TC0P", "TG0D",
153 "TG0F", "TG0H", "TG0P", "TG0T", "TN0D", "TN0P", "TTF0", "Th2H",
154 "Tm0P", "Ts0P", "Ts0S", NULL },
155 /* Set 20: MacBook Pro 5,4 */
156 { "TB0T", "TB1T", "TB2T", "TB3T", "TC0D", "TC0F", "TC0P", "TN0D",
157 "TN0P", "TTF0", "Th2H", "Ts0P", "Ts0S", NULL },
160 /* List of keys used to read/write fan speeds */
161 static const char* fan_speed_keys[] = {
169 #define INIT_TIMEOUT_MSECS 5000 /* wait up to 5s for device init ... */
170 #define INIT_WAIT_MSECS 50 /* ... in 50ms increments */
172 #define APPLESMC_POLL_INTERVAL 50 /* msecs */
173 #define APPLESMC_INPUT_FUZZ 4 /* input event threshold */
174 #define APPLESMC_INPUT_FLAT 4
180 /* Structure to be passed to DMI_MATCH function */
181 struct dmi_match_data {
182 /* Indicates whether this computer has an accelerometer. */
184 /* Indicates whether this computer has light sensors and keyboard backlight. */
186 /* Indicates which temperature sensors set to use. */
190 static const int debug;
191 static struct platform_device *pdev;
194 static u8 backlight_state[2];
196 static struct device *hwmon_dev;
197 static struct input_polled_dev *applesmc_idev;
199 /* Indicates whether this computer has an accelerometer. */
200 static unsigned int applesmc_accelerometer;
202 /* Indicates whether this computer has light sensors and keyboard backlight. */
203 static unsigned int applesmc_light;
205 /* The number of fans handled by the driver */
206 static unsigned int fans_handled;
208 /* Indicates which temperature sensors set to use. */
209 static unsigned int applesmc_temperature_set;
211 static DEFINE_MUTEX(applesmc_lock);
214 * Last index written to key_at_index sysfs file, and value to use for all other
215 * key_at_index_* sysfs files.
217 static unsigned int key_at_index;
219 static struct workqueue_struct *applesmc_led_wq;
222 * __wait_status - Wait up to 32ms for the status port to get a certain value
223 * (masked with 0x0f), returning zero if the value is obtained. Callers must
224 * hold applesmc_lock.
226 static int __wait_status(u8 val)
230 val = val & APPLESMC_STATUS_MASK;
232 for (us = APPLESMC_MIN_WAIT; us < APPLESMC_MAX_WAIT; us <<= 1) {
234 if ((inb(APPLESMC_CMD_PORT) & APPLESMC_STATUS_MASK) == val) {
237 "Waited %d us for status %x\n",
238 2 * us - APPLESMC_MIN_WAIT, val);
243 printk(KERN_WARNING "applesmc: wait status failed: %x != %x\n",
244 val, inb(APPLESMC_CMD_PORT));
250 * special treatment of command port - on newer macbooks, it seems necessary
251 * to resend the command byte before polling the status again. Callers must
252 * hold applesmc_lock.
254 static int send_command(u8 cmd)
257 for (us = APPLESMC_MIN_WAIT; us < APPLESMC_MAX_WAIT; us <<= 1) {
258 outb(cmd, APPLESMC_CMD_PORT);
260 if ((inb(APPLESMC_CMD_PORT) & APPLESMC_STATUS_MASK) == 0x0c)
263 printk(KERN_WARNING "applesmc: command failed: %x -> %x\n",
264 cmd, inb(APPLESMC_CMD_PORT));
269 * applesmc_read_key - reads len bytes from a given key, and put them in buffer.
270 * Returns zero on success or a negative error on failure. Callers must
271 * hold applesmc_lock.
273 static int applesmc_read_key(const char* key, u8* buffer, u8 len)
277 if (len > APPLESMC_MAX_DATA_LENGTH) {
278 printk(KERN_ERR "applesmc_read_key: cannot read more than "
279 "%d bytes\n", APPLESMC_MAX_DATA_LENGTH);
283 if (send_command(APPLESMC_READ_CMD))
286 for (i = 0; i < 4; i++) {
287 outb(key[i], APPLESMC_DATA_PORT);
288 if (__wait_status(0x04))
292 printk(KERN_DEBUG "<%s", key);
294 outb(len, APPLESMC_DATA_PORT);
296 printk(KERN_DEBUG ">%x", len);
298 for (i = 0; i < len; i++) {
299 if (__wait_status(0x05))
301 buffer[i] = inb(APPLESMC_DATA_PORT);
303 printk(KERN_DEBUG "<%x", buffer[i]);
306 printk(KERN_DEBUG "\n");
312 * applesmc_write_key - writes len bytes from buffer to a given key.
313 * Returns zero on success or a negative error on failure. Callers must
314 * hold applesmc_lock.
316 static int applesmc_write_key(const char* key, u8* buffer, u8 len)
320 if (len > APPLESMC_MAX_DATA_LENGTH) {
321 printk(KERN_ERR "applesmc_write_key: cannot write more than "
322 "%d bytes\n", APPLESMC_MAX_DATA_LENGTH);
326 if (send_command(APPLESMC_WRITE_CMD))
329 for (i = 0; i < 4; i++) {
330 outb(key[i], APPLESMC_DATA_PORT);
331 if (__wait_status(0x04))
335 outb(len, APPLESMC_DATA_PORT);
337 for (i = 0; i < len; i++) {
338 if (__wait_status(0x04))
340 outb(buffer[i], APPLESMC_DATA_PORT);
347 * applesmc_get_key_at_index - get key at index, and put the result in key
348 * (char[6]). Returns zero on success or a negative error on failure. Callers
349 * must hold applesmc_lock.
351 static int applesmc_get_key_at_index(int index, char* key)
355 readkey[0] = index >> 24;
356 readkey[1] = index >> 16;
357 readkey[2] = index >> 8;
360 if (send_command(APPLESMC_GET_KEY_BY_INDEX_CMD))
363 for (i = 0; i < 4; i++) {
364 outb(readkey[i], APPLESMC_DATA_PORT);
365 if (__wait_status(0x04))
369 outb(4, APPLESMC_DATA_PORT);
371 for (i = 0; i < 4; i++) {
372 if (__wait_status(0x05))
374 key[i] = inb(APPLESMC_DATA_PORT);
382 * applesmc_get_key_type - get key type, and put the result in type (char[6]).
383 * Returns zero on success or a negative error on failure. Callers must
384 * hold applesmc_lock.
386 static int applesmc_get_key_type(char* key, char* type)
390 if (send_command(APPLESMC_GET_KEY_TYPE_CMD))
393 for (i = 0; i < 4; i++) {
394 outb(key[i], APPLESMC_DATA_PORT);
395 if (__wait_status(0x04))
399 outb(6, APPLESMC_DATA_PORT);
401 for (i = 0; i < 6; i++) {
402 if (__wait_status(0x05))
404 type[i] = inb(APPLESMC_DATA_PORT);
412 * applesmc_read_motion_sensor - Read motion sensor (X, Y or Z). Callers must
413 * hold applesmc_lock.
415 static int applesmc_read_motion_sensor(int index, s16* value)
422 ret = applesmc_read_key(MOTION_SENSOR_X_KEY, buffer, 2);
425 ret = applesmc_read_key(MOTION_SENSOR_Y_KEY, buffer, 2);
428 ret = applesmc_read_key(MOTION_SENSOR_Z_KEY, buffer, 2);
434 *value = ((s16)buffer[0] << 8) | buffer[1];
440 * applesmc_device_init - initialize the accelerometer. Returns zero on success
441 * and negative error code on failure. Can sleep.
443 static int applesmc_device_init(void)
445 int total, ret = -ENXIO;
448 if (!applesmc_accelerometer)
451 mutex_lock(&applesmc_lock);
453 for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) {
455 printk(KERN_DEBUG "applesmc try %d\n", total);
456 if (!applesmc_read_key(MOTION_SENSOR_KEY, buffer, 2) &&
457 (buffer[0] != 0x00 || buffer[1] != 0x00)) {
458 if (total == INIT_TIMEOUT_MSECS) {
459 printk(KERN_DEBUG "applesmc: device has"
460 " already been initialized"
461 " (0x%02x, 0x%02x).\n",
462 buffer[0], buffer[1]);
464 printk(KERN_DEBUG "applesmc: device"
465 " successfully initialized"
466 " (0x%02x, 0x%02x).\n",
467 buffer[0], buffer[1]);
474 applesmc_write_key(MOTION_SENSOR_KEY, buffer, 2);
475 msleep(INIT_WAIT_MSECS);
478 printk(KERN_WARNING "applesmc: failed to init the device\n");
481 mutex_unlock(&applesmc_lock);
486 * applesmc_get_fan_count - get the number of fans. Callers must NOT hold
489 static int applesmc_get_fan_count(void)
494 mutex_lock(&applesmc_lock);
496 ret = applesmc_read_key(FANS_COUNT, buffer, 1);
498 mutex_unlock(&applesmc_lock);
505 /* Device model stuff */
506 static int applesmc_probe(struct platform_device *dev)
510 ret = applesmc_device_init();
514 printk(KERN_INFO "applesmc: device successfully initialized.\n");
518 /* Synchronize device with memorized backlight state */
519 static int applesmc_pm_resume(struct device *dev)
521 mutex_lock(&applesmc_lock);
523 applesmc_write_key(BACKLIGHT_KEY, backlight_state, 2);
524 mutex_unlock(&applesmc_lock);
528 /* Reinitialize device on resume from hibernation */
529 static int applesmc_pm_restore(struct device *dev)
531 int ret = applesmc_device_init();
534 return applesmc_pm_resume(dev);
537 static const struct dev_pm_ops applesmc_pm_ops = {
538 .resume = applesmc_pm_resume,
539 .restore = applesmc_pm_restore,
542 static struct platform_driver applesmc_driver = {
543 .probe = applesmc_probe,
546 .owner = THIS_MODULE,
547 .pm = &applesmc_pm_ops,
552 * applesmc_calibrate - Set our "resting" values. Callers must
553 * hold applesmc_lock.
555 static void applesmc_calibrate(void)
557 applesmc_read_motion_sensor(SENSOR_X, &rest_x);
558 applesmc_read_motion_sensor(SENSOR_Y, &rest_y);
562 static void applesmc_idev_poll(struct input_polled_dev *dev)
564 struct input_dev *idev = dev->input;
567 mutex_lock(&applesmc_lock);
569 if (applesmc_read_motion_sensor(SENSOR_X, &x))
571 if (applesmc_read_motion_sensor(SENSOR_Y, &y))
575 input_report_abs(idev, ABS_X, x - rest_x);
576 input_report_abs(idev, ABS_Y, y - rest_y);
580 mutex_unlock(&applesmc_lock);
585 static ssize_t applesmc_name_show(struct device *dev,
586 struct device_attribute *attr, char *buf)
588 return snprintf(buf, PAGE_SIZE, "applesmc\n");
591 static ssize_t applesmc_position_show(struct device *dev,
592 struct device_attribute *attr, char *buf)
597 mutex_lock(&applesmc_lock);
599 ret = applesmc_read_motion_sensor(SENSOR_X, &x);
602 ret = applesmc_read_motion_sensor(SENSOR_Y, &y);
605 ret = applesmc_read_motion_sensor(SENSOR_Z, &z);
610 mutex_unlock(&applesmc_lock);
614 return snprintf(buf, PAGE_SIZE, "(%d,%d,%d)\n", x, y, z);
617 static ssize_t applesmc_light_show(struct device *dev,
618 struct device_attribute *attr, char *sysfsbuf)
620 static int data_length;
622 u8 left = 0, right = 0;
623 u8 buffer[10], query[6];
625 mutex_lock(&applesmc_lock);
628 ret = applesmc_get_key_type(LIGHT_SENSOR_LEFT_KEY, query);
631 data_length = clamp_val(query[0], 0, 10);
632 printk(KERN_INFO "applesmc: light sensor data length set to "
633 "%d\n", data_length);
636 ret = applesmc_read_key(LIGHT_SENSOR_LEFT_KEY, buffer, data_length);
637 /* newer macbooks report a single 10-bit bigendian value */
638 if (data_length == 10) {
639 left = be16_to_cpu(*(__be16 *)(buffer + 6)) >> 2;
645 ret = applesmc_read_key(LIGHT_SENSOR_RIGHT_KEY, buffer, data_length);
649 mutex_unlock(&applesmc_lock);
653 return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", left, right);
656 /* Displays degree Celsius * 1000 */
657 static ssize_t applesmc_show_temperature(struct device *dev,
658 struct device_attribute *devattr, char *sysfsbuf)
663 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
665 temperature_sensors_sets[applesmc_temperature_set][attr->index];
667 mutex_lock(&applesmc_lock);
669 ret = applesmc_read_key(key, buffer, 2);
670 temp = buffer[0]*1000;
671 temp += (buffer[1] >> 6) * 250;
673 mutex_unlock(&applesmc_lock);
678 return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", temp);
681 static ssize_t applesmc_show_fan_speed(struct device *dev,
682 struct device_attribute *attr, char *sysfsbuf)
685 unsigned int speed = 0;
688 struct sensor_device_attribute_2 *sensor_attr =
689 to_sensor_dev_attr_2(attr);
691 newkey[0] = fan_speed_keys[sensor_attr->nr][0];
692 newkey[1] = '0' + sensor_attr->index;
693 newkey[2] = fan_speed_keys[sensor_attr->nr][2];
694 newkey[3] = fan_speed_keys[sensor_attr->nr][3];
697 mutex_lock(&applesmc_lock);
699 ret = applesmc_read_key(newkey, buffer, 2);
700 speed = ((buffer[0] << 8 | buffer[1]) >> 2);
702 mutex_unlock(&applesmc_lock);
706 return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", speed);
709 static ssize_t applesmc_store_fan_speed(struct device *dev,
710 struct device_attribute *attr,
711 const char *sysfsbuf, size_t count)
717 struct sensor_device_attribute_2 *sensor_attr =
718 to_sensor_dev_attr_2(attr);
720 speed = simple_strtoul(sysfsbuf, NULL, 10);
722 if (speed > 0x4000) /* Bigger than a 14-bit value */
725 newkey[0] = fan_speed_keys[sensor_attr->nr][0];
726 newkey[1] = '0' + sensor_attr->index;
727 newkey[2] = fan_speed_keys[sensor_attr->nr][2];
728 newkey[3] = fan_speed_keys[sensor_attr->nr][3];
731 mutex_lock(&applesmc_lock);
733 buffer[0] = (speed >> 6) & 0xff;
734 buffer[1] = (speed << 2) & 0xff;
735 ret = applesmc_write_key(newkey, buffer, 2);
737 mutex_unlock(&applesmc_lock);
744 static ssize_t applesmc_show_fan_manual(struct device *dev,
745 struct device_attribute *devattr, char *sysfsbuf)
750 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
752 mutex_lock(&applesmc_lock);
754 ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
755 manual = ((buffer[0] << 8 | buffer[1]) >> attr->index) & 0x01;
757 mutex_unlock(&applesmc_lock);
761 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", manual);
764 static ssize_t applesmc_store_fan_manual(struct device *dev,
765 struct device_attribute *devattr,
766 const char *sysfsbuf, size_t count)
772 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
774 input = simple_strtoul(sysfsbuf, NULL, 10);
776 mutex_lock(&applesmc_lock);
778 ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
779 val = (buffer[0] << 8 | buffer[1]);
784 val = val | (0x01 << attr->index);
786 val = val & ~(0x01 << attr->index);
788 buffer[0] = (val >> 8) & 0xFF;
789 buffer[1] = val & 0xFF;
791 ret = applesmc_write_key(FANS_MANUAL, buffer, 2);
794 mutex_unlock(&applesmc_lock);
801 static ssize_t applesmc_show_fan_position(struct device *dev,
802 struct device_attribute *attr, char *sysfsbuf)
807 struct sensor_device_attribute_2 *sensor_attr =
808 to_sensor_dev_attr_2(attr);
810 newkey[0] = FAN_POSITION[0];
811 newkey[1] = '0' + sensor_attr->index;
812 newkey[2] = FAN_POSITION[2];
813 newkey[3] = FAN_POSITION[3];
816 mutex_lock(&applesmc_lock);
818 ret = applesmc_read_key(newkey, buffer, 16);
821 mutex_unlock(&applesmc_lock);
825 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", buffer+4);
828 static ssize_t applesmc_calibrate_show(struct device *dev,
829 struct device_attribute *attr, char *sysfsbuf)
831 return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", rest_x, rest_y);
834 static ssize_t applesmc_calibrate_store(struct device *dev,
835 struct device_attribute *attr, const char *sysfsbuf, size_t count)
837 mutex_lock(&applesmc_lock);
838 applesmc_calibrate();
839 mutex_unlock(&applesmc_lock);
844 static void applesmc_backlight_set(struct work_struct *work)
846 mutex_lock(&applesmc_lock);
847 applesmc_write_key(BACKLIGHT_KEY, backlight_state, 2);
848 mutex_unlock(&applesmc_lock);
850 static DECLARE_WORK(backlight_work, &applesmc_backlight_set);
852 static void applesmc_brightness_set(struct led_classdev *led_cdev,
853 enum led_brightness value)
857 backlight_state[0] = value;
858 ret = queue_work(applesmc_led_wq, &backlight_work);
861 printk(KERN_DEBUG "applesmc: work was already on the queue.\n");
864 static ssize_t applesmc_key_count_show(struct device *dev,
865 struct device_attribute *attr, char *sysfsbuf)
871 mutex_lock(&applesmc_lock);
873 ret = applesmc_read_key(KEY_COUNT_KEY, buffer, 4);
874 count = ((u32)buffer[0]<<24) + ((u32)buffer[1]<<16) +
875 ((u32)buffer[2]<<8) + buffer[3];
877 mutex_unlock(&applesmc_lock);
881 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", count);
884 static ssize_t applesmc_key_at_index_read_show(struct device *dev,
885 struct device_attribute *attr, char *sysfsbuf)
891 mutex_lock(&applesmc_lock);
893 ret = applesmc_get_key_at_index(key_at_index, key);
895 if (ret || !key[0]) {
896 mutex_unlock(&applesmc_lock);
901 ret = applesmc_get_key_type(key, info);
904 mutex_unlock(&applesmc_lock);
910 * info[0] maximum value (APPLESMC_MAX_DATA_LENGTH) is much lower than
911 * PAGE_SIZE, so we don't need any checks before writing to sysfsbuf.
913 ret = applesmc_read_key(key, sysfsbuf, info[0]);
915 mutex_unlock(&applesmc_lock);
924 static ssize_t applesmc_key_at_index_data_length_show(struct device *dev,
925 struct device_attribute *attr, char *sysfsbuf)
931 mutex_lock(&applesmc_lock);
933 ret = applesmc_get_key_at_index(key_at_index, key);
935 if (ret || !key[0]) {
936 mutex_unlock(&applesmc_lock);
941 ret = applesmc_get_key_type(key, info);
943 mutex_unlock(&applesmc_lock);
946 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", info[0]);
951 static ssize_t applesmc_key_at_index_type_show(struct device *dev,
952 struct device_attribute *attr, char *sysfsbuf)
958 mutex_lock(&applesmc_lock);
960 ret = applesmc_get_key_at_index(key_at_index, key);
962 if (ret || !key[0]) {
963 mutex_unlock(&applesmc_lock);
968 ret = applesmc_get_key_type(key, info);
970 mutex_unlock(&applesmc_lock);
973 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", info+1);
978 static ssize_t applesmc_key_at_index_name_show(struct device *dev,
979 struct device_attribute *attr, char *sysfsbuf)
984 mutex_lock(&applesmc_lock);
986 ret = applesmc_get_key_at_index(key_at_index, key);
988 mutex_unlock(&applesmc_lock);
991 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", key);
996 static ssize_t applesmc_key_at_index_show(struct device *dev,
997 struct device_attribute *attr, char *sysfsbuf)
999 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", key_at_index);
1002 static ssize_t applesmc_key_at_index_store(struct device *dev,
1003 struct device_attribute *attr, const char *sysfsbuf, size_t count)
1005 mutex_lock(&applesmc_lock);
1007 key_at_index = simple_strtoul(sysfsbuf, NULL, 10);
1009 mutex_unlock(&applesmc_lock);
1014 static struct led_classdev applesmc_backlight = {
1015 .name = "smc::kbd_backlight",
1016 .default_trigger = "nand-disk",
1017 .brightness_set = applesmc_brightness_set,
1020 static DEVICE_ATTR(name, 0444, applesmc_name_show, NULL);
1022 static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL);
1023 static DEVICE_ATTR(calibrate, 0644,
1024 applesmc_calibrate_show, applesmc_calibrate_store);
1026 static struct attribute *accelerometer_attributes[] = {
1027 &dev_attr_position.attr,
1028 &dev_attr_calibrate.attr,
1032 static const struct attribute_group accelerometer_attributes_group =
1033 { .attrs = accelerometer_attributes };
1035 static DEVICE_ATTR(light, 0444, applesmc_light_show, NULL);
1037 static DEVICE_ATTR(key_count, 0444, applesmc_key_count_show, NULL);
1038 static DEVICE_ATTR(key_at_index, 0644,
1039 applesmc_key_at_index_show, applesmc_key_at_index_store);
1040 static DEVICE_ATTR(key_at_index_name, 0444,
1041 applesmc_key_at_index_name_show, NULL);
1042 static DEVICE_ATTR(key_at_index_type, 0444,
1043 applesmc_key_at_index_type_show, NULL);
1044 static DEVICE_ATTR(key_at_index_data_length, 0444,
1045 applesmc_key_at_index_data_length_show, NULL);
1046 static DEVICE_ATTR(key_at_index_data, 0444,
1047 applesmc_key_at_index_read_show, NULL);
1049 static struct attribute *key_enumeration_attributes[] = {
1050 &dev_attr_key_count.attr,
1051 &dev_attr_key_at_index.attr,
1052 &dev_attr_key_at_index_name.attr,
1053 &dev_attr_key_at_index_type.attr,
1054 &dev_attr_key_at_index_data_length.attr,
1055 &dev_attr_key_at_index_data.attr,
1059 static const struct attribute_group key_enumeration_group =
1060 { .attrs = key_enumeration_attributes };
1063 * Macro defining SENSOR_DEVICE_ATTR for a fan sysfs entries.
1064 * - show actual speed
1065 * - show/store minimum speed
1066 * - show maximum speed
1068 * - show/store target speed
1069 * - show/store manual mode
1071 #define sysfs_fan_speeds_offset(offset) \
1072 static SENSOR_DEVICE_ATTR_2(fan##offset##_input, S_IRUGO, \
1073 applesmc_show_fan_speed, NULL, 0, offset-1); \
1075 static SENSOR_DEVICE_ATTR_2(fan##offset##_min, S_IRUGO | S_IWUSR, \
1076 applesmc_show_fan_speed, applesmc_store_fan_speed, 1, offset-1); \
1078 static SENSOR_DEVICE_ATTR_2(fan##offset##_max, S_IRUGO, \
1079 applesmc_show_fan_speed, NULL, 2, offset-1); \
1081 static SENSOR_DEVICE_ATTR_2(fan##offset##_safe, S_IRUGO, \
1082 applesmc_show_fan_speed, NULL, 3, offset-1); \
1084 static SENSOR_DEVICE_ATTR_2(fan##offset##_output, S_IRUGO | S_IWUSR, \
1085 applesmc_show_fan_speed, applesmc_store_fan_speed, 4, offset-1); \
1087 static SENSOR_DEVICE_ATTR(fan##offset##_manual, S_IRUGO | S_IWUSR, \
1088 applesmc_show_fan_manual, applesmc_store_fan_manual, offset-1); \
1090 static SENSOR_DEVICE_ATTR(fan##offset##_label, S_IRUGO, \
1091 applesmc_show_fan_position, NULL, offset-1); \
1093 static struct attribute *fan##offset##_attributes[] = { \
1094 &sensor_dev_attr_fan##offset##_input.dev_attr.attr, \
1095 &sensor_dev_attr_fan##offset##_min.dev_attr.attr, \
1096 &sensor_dev_attr_fan##offset##_max.dev_attr.attr, \
1097 &sensor_dev_attr_fan##offset##_safe.dev_attr.attr, \
1098 &sensor_dev_attr_fan##offset##_output.dev_attr.attr, \
1099 &sensor_dev_attr_fan##offset##_manual.dev_attr.attr, \
1100 &sensor_dev_attr_fan##offset##_label.dev_attr.attr, \
1105 * Create the needed functions for each fan using the macro defined above
1106 * (4 fans are supported)
1108 sysfs_fan_speeds_offset(1);
1109 sysfs_fan_speeds_offset(2);
1110 sysfs_fan_speeds_offset(3);
1111 sysfs_fan_speeds_offset(4);
1113 static const struct attribute_group fan_attribute_groups[] = {
1114 { .attrs = fan1_attributes },
1115 { .attrs = fan2_attributes },
1116 { .attrs = fan3_attributes },
1117 { .attrs = fan4_attributes },
1121 * Temperature sensors sysfs entries.
1123 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO,
1124 applesmc_show_temperature, NULL, 0);
1125 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO,
1126 applesmc_show_temperature, NULL, 1);
1127 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO,
1128 applesmc_show_temperature, NULL, 2);
1129 static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO,
1130 applesmc_show_temperature, NULL, 3);
1131 static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO,
1132 applesmc_show_temperature, NULL, 4);
1133 static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO,
1134 applesmc_show_temperature, NULL, 5);
1135 static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO,
1136 applesmc_show_temperature, NULL, 6);
1137 static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO,
1138 applesmc_show_temperature, NULL, 7);
1139 static SENSOR_DEVICE_ATTR(temp9_input, S_IRUGO,
1140 applesmc_show_temperature, NULL, 8);
1141 static SENSOR_DEVICE_ATTR(temp10_input, S_IRUGO,
1142 applesmc_show_temperature, NULL, 9);
1143 static SENSOR_DEVICE_ATTR(temp11_input, S_IRUGO,
1144 applesmc_show_temperature, NULL, 10);
1145 static SENSOR_DEVICE_ATTR(temp12_input, S_IRUGO,
1146 applesmc_show_temperature, NULL, 11);
1147 static SENSOR_DEVICE_ATTR(temp13_input, S_IRUGO,
1148 applesmc_show_temperature, NULL, 12);
1149 static SENSOR_DEVICE_ATTR(temp14_input, S_IRUGO,
1150 applesmc_show_temperature, NULL, 13);
1151 static SENSOR_DEVICE_ATTR(temp15_input, S_IRUGO,
1152 applesmc_show_temperature, NULL, 14);
1153 static SENSOR_DEVICE_ATTR(temp16_input, S_IRUGO,
1154 applesmc_show_temperature, NULL, 15);
1155 static SENSOR_DEVICE_ATTR(temp17_input, S_IRUGO,
1156 applesmc_show_temperature, NULL, 16);
1157 static SENSOR_DEVICE_ATTR(temp18_input, S_IRUGO,
1158 applesmc_show_temperature, NULL, 17);
1159 static SENSOR_DEVICE_ATTR(temp19_input, S_IRUGO,
1160 applesmc_show_temperature, NULL, 18);
1161 static SENSOR_DEVICE_ATTR(temp20_input, S_IRUGO,
1162 applesmc_show_temperature, NULL, 19);
1163 static SENSOR_DEVICE_ATTR(temp21_input, S_IRUGO,
1164 applesmc_show_temperature, NULL, 20);
1165 static SENSOR_DEVICE_ATTR(temp22_input, S_IRUGO,
1166 applesmc_show_temperature, NULL, 21);
1167 static SENSOR_DEVICE_ATTR(temp23_input, S_IRUGO,
1168 applesmc_show_temperature, NULL, 22);
1169 static SENSOR_DEVICE_ATTR(temp24_input, S_IRUGO,
1170 applesmc_show_temperature, NULL, 23);
1171 static SENSOR_DEVICE_ATTR(temp25_input, S_IRUGO,
1172 applesmc_show_temperature, NULL, 24);
1173 static SENSOR_DEVICE_ATTR(temp26_input, S_IRUGO,
1174 applesmc_show_temperature, NULL, 25);
1175 static SENSOR_DEVICE_ATTR(temp27_input, S_IRUGO,
1176 applesmc_show_temperature, NULL, 26);
1177 static SENSOR_DEVICE_ATTR(temp28_input, S_IRUGO,
1178 applesmc_show_temperature, NULL, 27);
1179 static SENSOR_DEVICE_ATTR(temp29_input, S_IRUGO,
1180 applesmc_show_temperature, NULL, 28);
1181 static SENSOR_DEVICE_ATTR(temp30_input, S_IRUGO,
1182 applesmc_show_temperature, NULL, 29);
1183 static SENSOR_DEVICE_ATTR(temp31_input, S_IRUGO,
1184 applesmc_show_temperature, NULL, 30);
1185 static SENSOR_DEVICE_ATTR(temp32_input, S_IRUGO,
1186 applesmc_show_temperature, NULL, 31);
1187 static SENSOR_DEVICE_ATTR(temp33_input, S_IRUGO,
1188 applesmc_show_temperature, NULL, 32);
1189 static SENSOR_DEVICE_ATTR(temp34_input, S_IRUGO,
1190 applesmc_show_temperature, NULL, 33);
1191 static SENSOR_DEVICE_ATTR(temp35_input, S_IRUGO,
1192 applesmc_show_temperature, NULL, 34);
1193 static SENSOR_DEVICE_ATTR(temp36_input, S_IRUGO,
1194 applesmc_show_temperature, NULL, 35);
1195 static SENSOR_DEVICE_ATTR(temp37_input, S_IRUGO,
1196 applesmc_show_temperature, NULL, 36);
1197 static SENSOR_DEVICE_ATTR(temp38_input, S_IRUGO,
1198 applesmc_show_temperature, NULL, 37);
1199 static SENSOR_DEVICE_ATTR(temp39_input, S_IRUGO,
1200 applesmc_show_temperature, NULL, 38);
1201 static SENSOR_DEVICE_ATTR(temp40_input, S_IRUGO,
1202 applesmc_show_temperature, NULL, 39);
1204 static struct attribute *temperature_attributes[] = {
1205 &sensor_dev_attr_temp1_input.dev_attr.attr,
1206 &sensor_dev_attr_temp2_input.dev_attr.attr,
1207 &sensor_dev_attr_temp3_input.dev_attr.attr,
1208 &sensor_dev_attr_temp4_input.dev_attr.attr,
1209 &sensor_dev_attr_temp5_input.dev_attr.attr,
1210 &sensor_dev_attr_temp6_input.dev_attr.attr,
1211 &sensor_dev_attr_temp7_input.dev_attr.attr,
1212 &sensor_dev_attr_temp8_input.dev_attr.attr,
1213 &sensor_dev_attr_temp9_input.dev_attr.attr,
1214 &sensor_dev_attr_temp10_input.dev_attr.attr,
1215 &sensor_dev_attr_temp11_input.dev_attr.attr,
1216 &sensor_dev_attr_temp12_input.dev_attr.attr,
1217 &sensor_dev_attr_temp13_input.dev_attr.attr,
1218 &sensor_dev_attr_temp14_input.dev_attr.attr,
1219 &sensor_dev_attr_temp15_input.dev_attr.attr,
1220 &sensor_dev_attr_temp16_input.dev_attr.attr,
1221 &sensor_dev_attr_temp17_input.dev_attr.attr,
1222 &sensor_dev_attr_temp18_input.dev_attr.attr,
1223 &sensor_dev_attr_temp19_input.dev_attr.attr,
1224 &sensor_dev_attr_temp20_input.dev_attr.attr,
1225 &sensor_dev_attr_temp21_input.dev_attr.attr,
1226 &sensor_dev_attr_temp22_input.dev_attr.attr,
1227 &sensor_dev_attr_temp23_input.dev_attr.attr,
1228 &sensor_dev_attr_temp24_input.dev_attr.attr,
1229 &sensor_dev_attr_temp25_input.dev_attr.attr,
1230 &sensor_dev_attr_temp26_input.dev_attr.attr,
1231 &sensor_dev_attr_temp27_input.dev_attr.attr,
1232 &sensor_dev_attr_temp28_input.dev_attr.attr,
1233 &sensor_dev_attr_temp29_input.dev_attr.attr,
1234 &sensor_dev_attr_temp30_input.dev_attr.attr,
1235 &sensor_dev_attr_temp31_input.dev_attr.attr,
1236 &sensor_dev_attr_temp32_input.dev_attr.attr,
1237 &sensor_dev_attr_temp33_input.dev_attr.attr,
1238 &sensor_dev_attr_temp34_input.dev_attr.attr,
1239 &sensor_dev_attr_temp35_input.dev_attr.attr,
1240 &sensor_dev_attr_temp36_input.dev_attr.attr,
1241 &sensor_dev_attr_temp37_input.dev_attr.attr,
1242 &sensor_dev_attr_temp38_input.dev_attr.attr,
1243 &sensor_dev_attr_temp39_input.dev_attr.attr,
1244 &sensor_dev_attr_temp40_input.dev_attr.attr,
1248 static const struct attribute_group temperature_attributes_group =
1249 { .attrs = temperature_attributes };
1254 * applesmc_dmi_match - found a match. return one, short-circuiting the hunt.
1256 static int applesmc_dmi_match(const struct dmi_system_id *id)
1259 struct dmi_match_data* dmi_data = id->driver_data;
1260 printk(KERN_INFO "applesmc: %s detected:\n", id->ident);
1261 applesmc_accelerometer = dmi_data->accelerometer;
1262 printk(KERN_INFO "applesmc: - Model %s accelerometer\n",
1263 applesmc_accelerometer ? "with" : "without");
1264 applesmc_light = dmi_data->light;
1265 printk(KERN_INFO "applesmc: - Model %s light sensors and backlight\n",
1266 applesmc_light ? "with" : "without");
1268 applesmc_temperature_set = dmi_data->temperature_set;
1269 while (temperature_sensors_sets[applesmc_temperature_set][i] != NULL)
1271 printk(KERN_INFO "applesmc: - Model with %d temperature sensors\n", i);
1275 /* Create accelerometer ressources */
1276 static int applesmc_create_accelerometer(void)
1278 struct input_dev *idev;
1281 ret = sysfs_create_group(&pdev->dev.kobj,
1282 &accelerometer_attributes_group);
1286 applesmc_idev = input_allocate_polled_device();
1287 if (!applesmc_idev) {
1292 applesmc_idev->poll = applesmc_idev_poll;
1293 applesmc_idev->poll_interval = APPLESMC_POLL_INTERVAL;
1295 /* initial calibrate for the input device */
1296 applesmc_calibrate();
1298 /* initialize the input device */
1299 idev = applesmc_idev->input;
1300 idev->name = "applesmc";
1301 idev->id.bustype = BUS_HOST;
1302 idev->dev.parent = &pdev->dev;
1303 idev->evbit[0] = BIT_MASK(EV_ABS);
1304 input_set_abs_params(idev, ABS_X,
1305 -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
1306 input_set_abs_params(idev, ABS_Y,
1307 -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
1309 ret = input_register_polled_device(applesmc_idev);
1316 input_free_polled_device(applesmc_idev);
1319 sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group);
1322 printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
1326 /* Release all ressources used by the accelerometer */
1327 static void applesmc_release_accelerometer(void)
1329 input_unregister_polled_device(applesmc_idev);
1330 input_free_polled_device(applesmc_idev);
1331 sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group);
1334 static __initdata struct dmi_match_data applesmc_dmi_data[] = {
1335 /* MacBook Pro: accelerometer, backlight and temperature set 0 */
1336 { .accelerometer = 1, .light = 1, .temperature_set = 0 },
1337 /* MacBook2: accelerometer and temperature set 1 */
1338 { .accelerometer = 1, .light = 0, .temperature_set = 1 },
1339 /* MacBook: accelerometer and temperature set 2 */
1340 { .accelerometer = 1, .light = 0, .temperature_set = 2 },
1341 /* MacMini: temperature set 3 */
1342 { .accelerometer = 0, .light = 0, .temperature_set = 3 },
1343 /* MacPro: temperature set 4 */
1344 { .accelerometer = 0, .light = 0, .temperature_set = 4 },
1345 /* iMac: temperature set 5 */
1346 { .accelerometer = 0, .light = 0, .temperature_set = 5 },
1347 /* MacBook3, MacBook4: accelerometer and temperature set 6 */
1348 { .accelerometer = 1, .light = 0, .temperature_set = 6 },
1349 /* MacBook Air: accelerometer, backlight and temperature set 7 */
1350 { .accelerometer = 1, .light = 1, .temperature_set = 7 },
1351 /* MacBook Pro 4: accelerometer, backlight and temperature set 8 */
1352 { .accelerometer = 1, .light = 1, .temperature_set = 8 },
1353 /* MacBook Pro 3: accelerometer, backlight and temperature set 9 */
1354 { .accelerometer = 1, .light = 1, .temperature_set = 9 },
1355 /* iMac 5: light sensor only, temperature set 10 */
1356 { .accelerometer = 0, .light = 0, .temperature_set = 10 },
1357 /* MacBook 5: accelerometer, backlight and temperature set 11 */
1358 { .accelerometer = 1, .light = 1, .temperature_set = 11 },
1359 /* MacBook Pro 5: accelerometer, backlight and temperature set 12 */
1360 { .accelerometer = 1, .light = 1, .temperature_set = 12 },
1361 /* iMac 8: light sensor only, temperature set 13 */
1362 { .accelerometer = 0, .light = 0, .temperature_set = 13 },
1363 /* iMac 6: light sensor only, temperature set 14 */
1364 { .accelerometer = 0, .light = 0, .temperature_set = 14 },
1365 /* MacBook Air 2,1: accelerometer, backlight and temperature set 15 */
1366 { .accelerometer = 1, .light = 1, .temperature_set = 15 },
1367 /* MacPro3,1: temperature set 16 */
1368 { .accelerometer = 0, .light = 0, .temperature_set = 16 },
1369 /* iMac 9,1: light sensor only, temperature set 17 */
1370 { .accelerometer = 0, .light = 0, .temperature_set = 17 },
1371 /* MacBook Pro 2,2: accelerometer, backlight and temperature set 18 */
1372 { .accelerometer = 1, .light = 1, .temperature_set = 18 },
1373 /* MacBook Pro 5,3: accelerometer, backlight and temperature set 19 */
1374 { .accelerometer = 1, .light = 1, .temperature_set = 19 },
1375 /* MacBook Pro 5,4: accelerometer, backlight and temperature set 20 */
1376 { .accelerometer = 1, .light = 1, .temperature_set = 20 },
1379 /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
1380 * So we need to put "Apple MacBook Pro" before "Apple MacBook". */
1381 static __initdata struct dmi_system_id applesmc_whitelist[] = {
1382 { applesmc_dmi_match, "Apple MacBook Air 2", {
1383 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1384 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir2") },
1385 &applesmc_dmi_data[15]},
1386 { applesmc_dmi_match, "Apple MacBook Air", {
1387 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1388 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir") },
1389 &applesmc_dmi_data[7]},
1390 { applesmc_dmi_match, "Apple MacBook Pro 5,4", {
1391 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1392 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,4") },
1393 &applesmc_dmi_data[20]},
1394 { applesmc_dmi_match, "Apple MacBook Pro 5,3", {
1395 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1396 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,3") },
1397 &applesmc_dmi_data[19]},
1398 { applesmc_dmi_match, "Apple MacBook Pro 5", {
1399 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1400 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5") },
1401 &applesmc_dmi_data[12]},
1402 { applesmc_dmi_match, "Apple MacBook Pro 4", {
1403 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1404 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro4") },
1405 &applesmc_dmi_data[8]},
1406 { applesmc_dmi_match, "Apple MacBook Pro 3", {
1407 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1408 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3") },
1409 &applesmc_dmi_data[9]},
1410 { applesmc_dmi_match, "Apple MacBook Pro 2,2", {
1411 DMI_MATCH(DMI_BOARD_VENDOR, "Apple Computer, Inc."),
1412 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2") },
1413 &applesmc_dmi_data[18]},
1414 { applesmc_dmi_match, "Apple MacBook Pro", {
1415 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1416 DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") },
1417 &applesmc_dmi_data[0]},
1418 { applesmc_dmi_match, "Apple MacBook (v2)", {
1419 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1420 DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") },
1421 &applesmc_dmi_data[1]},
1422 { applesmc_dmi_match, "Apple MacBook (v3)", {
1423 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1424 DMI_MATCH(DMI_PRODUCT_NAME,"MacBook3") },
1425 &applesmc_dmi_data[6]},
1426 { applesmc_dmi_match, "Apple MacBook 4", {
1427 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1428 DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4") },
1429 &applesmc_dmi_data[6]},
1430 { applesmc_dmi_match, "Apple MacBook 5", {
1431 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1432 DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5") },
1433 &applesmc_dmi_data[11]},
1434 { applesmc_dmi_match, "Apple MacBook", {
1435 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1436 DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") },
1437 &applesmc_dmi_data[2]},
1438 { applesmc_dmi_match, "Apple Macmini", {
1439 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1440 DMI_MATCH(DMI_PRODUCT_NAME,"Macmini") },
1441 &applesmc_dmi_data[3]},
1442 { applesmc_dmi_match, "Apple MacPro2", {
1443 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1444 DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") },
1445 &applesmc_dmi_data[4]},
1446 { applesmc_dmi_match, "Apple MacPro3", {
1447 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1448 DMI_MATCH(DMI_PRODUCT_NAME, "MacPro3") },
1449 &applesmc_dmi_data[16]},
1450 { applesmc_dmi_match, "Apple MacPro", {
1451 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1452 DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") },
1453 &applesmc_dmi_data[4]},
1454 { applesmc_dmi_match, "Apple iMac 9,1", {
1455 DMI_MATCH(DMI_BOARD_VENDOR, "Apple Inc."),
1456 DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1") },
1457 &applesmc_dmi_data[17]},
1458 { applesmc_dmi_match, "Apple iMac 8", {
1459 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1460 DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") },
1461 &applesmc_dmi_data[13]},
1462 { applesmc_dmi_match, "Apple iMac 6", {
1463 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1464 DMI_MATCH(DMI_PRODUCT_NAME, "iMac6") },
1465 &applesmc_dmi_data[14]},
1466 { applesmc_dmi_match, "Apple iMac 5", {
1467 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1468 DMI_MATCH(DMI_PRODUCT_NAME, "iMac5") },
1469 &applesmc_dmi_data[10]},
1470 { applesmc_dmi_match, "Apple iMac", {
1471 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1472 DMI_MATCH(DMI_PRODUCT_NAME,"iMac") },
1473 &applesmc_dmi_data[5]},
1477 static int __init applesmc_init(void)
1483 if (!dmi_check_system(applesmc_whitelist)) {
1484 printk(KERN_WARNING "applesmc: supported laptop not found!\n");
1489 if (!request_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS,
1495 ret = platform_driver_register(&applesmc_driver);
1499 pdev = platform_device_register_simple("applesmc", APPLESMC_DATA_PORT,
1502 ret = PTR_ERR(pdev);
1506 ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_name.attr);
1510 /* Create key enumeration sysfs files */
1511 ret = sysfs_create_group(&pdev->dev.kobj, &key_enumeration_group);
1515 /* create fan files */
1516 count = applesmc_get_fan_count();
1518 printk(KERN_ERR "applesmc: Cannot get the number of fans.\n");
1520 printk(KERN_INFO "applesmc: %d fans found.\n", count);
1524 printk(KERN_WARNING "applesmc: More than 4 fans found,"
1525 " but at most 4 fans are supported"
1526 " by the driver.\n");
1529 while (fans_handled < count) {
1530 ret = sysfs_create_group(&pdev->dev.kobj,
1531 &fan_attribute_groups[fans_handled]);
1538 temperature_sensors_sets[applesmc_temperature_set][i] != NULL;
1540 if (temperature_attributes[i] == NULL) {
1541 printk(KERN_ERR "applesmc: More temperature sensors "
1542 "in temperature_sensors_sets (at least %i)"
1543 "than available sysfs files in "
1544 "temperature_attributes (%i), please report "
1545 "this bug.\n", i, i-1);
1546 goto out_temperature;
1548 ret = sysfs_create_file(&pdev->dev.kobj,
1549 temperature_attributes[i]);
1551 goto out_temperature;
1554 if (applesmc_accelerometer) {
1555 ret = applesmc_create_accelerometer();
1557 goto out_temperature;
1560 if (applesmc_light) {
1561 /* Add light sensor file */
1562 ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_light.attr);
1564 goto out_accelerometer;
1566 /* Create the workqueue */
1567 applesmc_led_wq = create_singlethread_workqueue("applesmc-led");
1568 if (!applesmc_led_wq) {
1570 goto out_light_sysfs;
1573 /* register as a led device */
1574 ret = led_classdev_register(&pdev->dev, &applesmc_backlight);
1579 hwmon_dev = hwmon_device_register(&pdev->dev);
1580 if (IS_ERR(hwmon_dev)) {
1581 ret = PTR_ERR(hwmon_dev);
1582 goto out_light_ledclass;
1585 printk(KERN_INFO "applesmc: driver successfully loaded.\n");
1591 led_classdev_unregister(&applesmc_backlight);
1594 destroy_workqueue(applesmc_led_wq);
1597 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
1599 if (applesmc_accelerometer)
1600 applesmc_release_accelerometer();
1602 sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group);
1604 while (fans_handled)
1605 sysfs_remove_group(&pdev->dev.kobj,
1606 &fan_attribute_groups[--fans_handled]);
1607 sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
1609 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
1611 platform_device_unregister(pdev);
1613 platform_driver_unregister(&applesmc_driver);
1615 release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
1617 printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
1621 static void __exit applesmc_exit(void)
1623 hwmon_device_unregister(hwmon_dev);
1624 if (applesmc_light) {
1625 led_classdev_unregister(&applesmc_backlight);
1626 destroy_workqueue(applesmc_led_wq);
1627 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
1629 if (applesmc_accelerometer)
1630 applesmc_release_accelerometer();
1631 sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group);
1632 while (fans_handled)
1633 sysfs_remove_group(&pdev->dev.kobj,
1634 &fan_attribute_groups[--fans_handled]);
1635 sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
1636 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
1637 platform_device_unregister(pdev);
1638 platform_driver_unregister(&applesmc_driver);
1639 release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
1641 printk(KERN_INFO "applesmc: driver unloaded.\n");
1644 module_init(applesmc_init);
1645 module_exit(applesmc_exit);
1647 MODULE_AUTHOR("Nicolas Boichat");
1648 MODULE_DESCRIPTION("Apple SMC");
1649 MODULE_LICENSE("GPL v2");
1650 MODULE_DEVICE_TABLE(dmi, applesmc_whitelist);