Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx
[pandora-kernel.git] / drivers / hwmon / applesmc.c
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.
5  *
6  * Copyright (C) 2007 Nicolas Boichat <nicolas@boichat.ch>
7  *
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>
11  *
12  * Fan control based on smcFanControl:
13  * Copyright (C) 2006 Hendrik Holtmann <holtmann@mac.com>
14  *
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.
18  *
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.
23  *
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
27  */
28
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 <linux/io.h>
39 #include <linux/leds.h>
40 #include <linux/hwmon.h>
41 #include <linux/workqueue.h>
42
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
47
48 #define APPLESMC_NR_PORTS       32 /* 0x300-0x31f */
49
50 #define APPLESMC_MAX_DATA_LENGTH 32
51
52 #define APPLESMC_MIN_WAIT       0x0040
53 #define APPLESMC_MAX_WAIT       0x8000
54
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
60
61 #define KEY_COUNT_KEY           "#KEY" /* r-o ui32 */
62
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) */
66
67 #define CLAMSHELL_KEY           "MSLD" /* r-o ui8 (unused) */
68
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 */
73
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] */
82
83 /*
84  * Temperature sensors keys (sp78 - 2 bytes).
85  */
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 },
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 },
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",
144           NULL },
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 },
158 /* Set 21: MacBook Pro 6,2 */
159         { "TB0T", "TB1T", "TB2T", "TC0C", "TC0D", "TC0P", "TC1C", "TG0D",
160           "TG0P", "TG0T", "TMCD", "TP0P", "TPCD", "Th1H", "Th2H", "Tm0P",
161           "Ts0P", "Ts0S", NULL },
162 /* Set 22: MacBook Pro 7,1 */
163         { "TB0T", "TB1T", "TB2T", "TC0D", "TC0P", "TN0D", "TN0P", "TN0S",
164           "TN1D", "TN1F", "TN1G", "TN1S", "Th1H", "Ts0P", "Ts0S", NULL },
165 };
166
167 /* List of keys used to read/write fan speeds */
168 static const char* fan_speed_keys[] = {
169         FAN_ACTUAL_SPEED,
170         FAN_MIN_SPEED,
171         FAN_MAX_SPEED,
172         FAN_SAFE_SPEED,
173         FAN_TARGET_SPEED
174 };
175
176 #define INIT_TIMEOUT_MSECS      5000    /* wait up to 5s for device init ... */
177 #define INIT_WAIT_MSECS         50      /* ... in 50ms increments */
178
179 #define APPLESMC_POLL_INTERVAL  50      /* msecs */
180 #define APPLESMC_INPUT_FUZZ     4       /* input event threshold */
181 #define APPLESMC_INPUT_FLAT     4
182
183 #define SENSOR_X 0
184 #define SENSOR_Y 1
185 #define SENSOR_Z 2
186
187 /* Structure to be passed to DMI_MATCH function */
188 struct dmi_match_data {
189 /* Indicates whether this computer has an accelerometer. */
190         int accelerometer;
191 /* Indicates whether this computer has light sensors and keyboard backlight. */
192         int light;
193 /* Indicates which temperature sensors set to use. */
194         int temperature_set;
195 };
196
197 static const int debug;
198 static struct platform_device *pdev;
199 static s16 rest_x;
200 static s16 rest_y;
201 static u8 backlight_state[2];
202
203 static struct device *hwmon_dev;
204 static struct input_polled_dev *applesmc_idev;
205
206 /* Indicates whether this computer has an accelerometer. */
207 static unsigned int applesmc_accelerometer;
208
209 /* Indicates whether this computer has light sensors and keyboard backlight. */
210 static unsigned int applesmc_light;
211
212 /* The number of fans handled by the driver */
213 static unsigned int fans_handled;
214
215 /* Indicates which temperature sensors set to use. */
216 static unsigned int applesmc_temperature_set;
217
218 static DEFINE_MUTEX(applesmc_lock);
219
220 /*
221  * Last index written to key_at_index sysfs file, and value to use for all other
222  * key_at_index_* sysfs files.
223  */
224 static unsigned int key_at_index;
225
226 static struct workqueue_struct *applesmc_led_wq;
227
228 /*
229  * __wait_status - Wait up to 32ms for the status port to get a certain value
230  * (masked with 0x0f), returning zero if the value is obtained.  Callers must
231  * hold applesmc_lock.
232  */
233 static int __wait_status(u8 val)
234 {
235         int us;
236
237         val = val & APPLESMC_STATUS_MASK;
238
239         for (us = APPLESMC_MIN_WAIT; us < APPLESMC_MAX_WAIT; us <<= 1) {
240                 udelay(us);
241                 if ((inb(APPLESMC_CMD_PORT) & APPLESMC_STATUS_MASK) == val) {
242                         if (debug)
243                                 printk(KERN_DEBUG
244                                         "Waited %d us for status %x\n",
245                                         2 * us - APPLESMC_MIN_WAIT, val);
246                         return 0;
247                 }
248         }
249
250         printk(KERN_WARNING "applesmc: wait status failed: %x != %x\n",
251                                                 val, inb(APPLESMC_CMD_PORT));
252
253         return -EIO;
254 }
255
256 /*
257  * special treatment of command port - on newer macbooks, it seems necessary
258  * to resend the command byte before polling the status again. Callers must
259  * hold applesmc_lock.
260  */
261 static int send_command(u8 cmd)
262 {
263         int us;
264         for (us = APPLESMC_MIN_WAIT; us < APPLESMC_MAX_WAIT; us <<= 1) {
265                 outb(cmd, APPLESMC_CMD_PORT);
266                 udelay(us);
267                 if ((inb(APPLESMC_CMD_PORT) & APPLESMC_STATUS_MASK) == 0x0c)
268                         return 0;
269         }
270         printk(KERN_WARNING "applesmc: command failed: %x -> %x\n",
271                 cmd, inb(APPLESMC_CMD_PORT));
272         return -EIO;
273 }
274
275 /*
276  * applesmc_read_key - reads len bytes from a given key, and put them in buffer.
277  * Returns zero on success or a negative error on failure. Callers must
278  * hold applesmc_lock.
279  */
280 static int applesmc_read_key(const char* key, u8* buffer, u8 len)
281 {
282         int i;
283
284         if (len > APPLESMC_MAX_DATA_LENGTH) {
285                 printk(KERN_ERR "applesmc_read_key: cannot read more than "
286                                         "%d bytes\n", APPLESMC_MAX_DATA_LENGTH);
287                 return -EINVAL;
288         }
289
290         if (send_command(APPLESMC_READ_CMD))
291                 return -EIO;
292
293         for (i = 0; i < 4; i++) {
294                 outb(key[i], APPLESMC_DATA_PORT);
295                 if (__wait_status(0x04))
296                         return -EIO;
297         }
298         if (debug)
299                 printk(KERN_DEBUG "<%s", key);
300
301         outb(len, APPLESMC_DATA_PORT);
302         if (debug)
303                 printk(KERN_DEBUG ">%x", len);
304
305         for (i = 0; i < len; i++) {
306                 if (__wait_status(0x05))
307                         return -EIO;
308                 buffer[i] = inb(APPLESMC_DATA_PORT);
309                 if (debug)
310                         printk(KERN_DEBUG "<%x", buffer[i]);
311         }
312         if (debug)
313                 printk(KERN_DEBUG "\n");
314
315         return 0;
316 }
317
318 /*
319  * applesmc_write_key - writes len bytes from buffer to a given key.
320  * Returns zero on success or a negative error on failure. Callers must
321  * hold applesmc_lock.
322  */
323 static int applesmc_write_key(const char* key, u8* buffer, u8 len)
324 {
325         int i;
326
327         if (len > APPLESMC_MAX_DATA_LENGTH) {
328                 printk(KERN_ERR "applesmc_write_key: cannot write more than "
329                                         "%d bytes\n", APPLESMC_MAX_DATA_LENGTH);
330                 return -EINVAL;
331         }
332
333         if (send_command(APPLESMC_WRITE_CMD))
334                 return -EIO;
335
336         for (i = 0; i < 4; i++) {
337                 outb(key[i], APPLESMC_DATA_PORT);
338                 if (__wait_status(0x04))
339                         return -EIO;
340         }
341
342         outb(len, APPLESMC_DATA_PORT);
343
344         for (i = 0; i < len; i++) {
345                 if (__wait_status(0x04))
346                         return -EIO;
347                 outb(buffer[i], APPLESMC_DATA_PORT);
348         }
349
350         return 0;
351 }
352
353 /*
354  * applesmc_get_key_at_index - get key at index, and put the result in key
355  * (char[6]). Returns zero on success or a negative error on failure. Callers
356  * must hold applesmc_lock.
357  */
358 static int applesmc_get_key_at_index(int index, char* key)
359 {
360         int i;
361         u8 readkey[4];
362         readkey[0] = index >> 24;
363         readkey[1] = index >> 16;
364         readkey[2] = index >> 8;
365         readkey[3] = index;
366
367         if (send_command(APPLESMC_GET_KEY_BY_INDEX_CMD))
368                 return -EIO;
369
370         for (i = 0; i < 4; i++) {
371                 outb(readkey[i], APPLESMC_DATA_PORT);
372                 if (__wait_status(0x04))
373                         return -EIO;
374         }
375
376         outb(4, APPLESMC_DATA_PORT);
377
378         for (i = 0; i < 4; i++) {
379                 if (__wait_status(0x05))
380                         return -EIO;
381                 key[i] = inb(APPLESMC_DATA_PORT);
382         }
383         key[4] = 0;
384
385         return 0;
386 }
387
388 /*
389  * applesmc_get_key_type - get key type, and put the result in type (char[6]).
390  * Returns zero on success or a negative error on failure. Callers must
391  * hold applesmc_lock.
392  */
393 static int applesmc_get_key_type(char* key, char* type)
394 {
395         int i;
396
397         if (send_command(APPLESMC_GET_KEY_TYPE_CMD))
398                 return -EIO;
399
400         for (i = 0; i < 4; i++) {
401                 outb(key[i], APPLESMC_DATA_PORT);
402                 if (__wait_status(0x04))
403                         return -EIO;
404         }
405
406         outb(6, APPLESMC_DATA_PORT);
407
408         for (i = 0; i < 6; i++) {
409                 if (__wait_status(0x05))
410                         return -EIO;
411                 type[i] = inb(APPLESMC_DATA_PORT);
412         }
413         type[5] = 0;
414
415         return 0;
416 }
417
418 /*
419  * applesmc_read_motion_sensor - Read motion sensor (X, Y or Z). Callers must
420  * hold applesmc_lock.
421  */
422 static int applesmc_read_motion_sensor(int index, s16* value)
423 {
424         u8 buffer[2];
425         int ret;
426
427         switch (index) {
428         case SENSOR_X:
429                 ret = applesmc_read_key(MOTION_SENSOR_X_KEY, buffer, 2);
430                 break;
431         case SENSOR_Y:
432                 ret = applesmc_read_key(MOTION_SENSOR_Y_KEY, buffer, 2);
433                 break;
434         case SENSOR_Z:
435                 ret = applesmc_read_key(MOTION_SENSOR_Z_KEY, buffer, 2);
436                 break;
437         default:
438                 ret = -EINVAL;
439         }
440
441         *value = ((s16)buffer[0] << 8) | buffer[1];
442
443         return ret;
444 }
445
446 /*
447  * applesmc_device_init - initialize the accelerometer.  Returns zero on success
448  * and negative error code on failure.  Can sleep.
449  */
450 static int applesmc_device_init(void)
451 {
452         int total, ret = -ENXIO;
453         u8 buffer[2];
454
455         if (!applesmc_accelerometer)
456                 return 0;
457
458         mutex_lock(&applesmc_lock);
459
460         for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) {
461                 if (debug)
462                         printk(KERN_DEBUG "applesmc try %d\n", total);
463                 if (!applesmc_read_key(MOTION_SENSOR_KEY, buffer, 2) &&
464                                 (buffer[0] != 0x00 || buffer[1] != 0x00)) {
465                         if (total == INIT_TIMEOUT_MSECS) {
466                                 printk(KERN_DEBUG "applesmc: device has"
467                                                 " already been initialized"
468                                                 " (0x%02x, 0x%02x).\n",
469                                                 buffer[0], buffer[1]);
470                         } else {
471                                 printk(KERN_DEBUG "applesmc: device"
472                                                 " successfully initialized"
473                                                 " (0x%02x, 0x%02x).\n",
474                                                 buffer[0], buffer[1]);
475                         }
476                         ret = 0;
477                         goto out;
478                 }
479                 buffer[0] = 0xe0;
480                 buffer[1] = 0x00;
481                 applesmc_write_key(MOTION_SENSOR_KEY, buffer, 2);
482                 msleep(INIT_WAIT_MSECS);
483         }
484
485         printk(KERN_WARNING "applesmc: failed to init the device\n");
486
487 out:
488         mutex_unlock(&applesmc_lock);
489         return ret;
490 }
491
492 /*
493  * applesmc_get_fan_count - get the number of fans. Callers must NOT hold
494  * applesmc_lock.
495  */
496 static int applesmc_get_fan_count(void)
497 {
498         int ret;
499         u8 buffer[1];
500
501         mutex_lock(&applesmc_lock);
502
503         ret = applesmc_read_key(FANS_COUNT, buffer, 1);
504
505         mutex_unlock(&applesmc_lock);
506         if (ret)
507                 return ret;
508         else
509                 return buffer[0];
510 }
511
512 /* Device model stuff */
513 static int applesmc_probe(struct platform_device *dev)
514 {
515         int ret;
516
517         ret = applesmc_device_init();
518         if (ret)
519                 return ret;
520
521         printk(KERN_INFO "applesmc: device successfully initialized.\n");
522         return 0;
523 }
524
525 /* Synchronize device with memorized backlight state */
526 static int applesmc_pm_resume(struct device *dev)
527 {
528         mutex_lock(&applesmc_lock);
529         if (applesmc_light)
530                 applesmc_write_key(BACKLIGHT_KEY, backlight_state, 2);
531         mutex_unlock(&applesmc_lock);
532         return 0;
533 }
534
535 /* Reinitialize device on resume from hibernation */
536 static int applesmc_pm_restore(struct device *dev)
537 {
538         int ret = applesmc_device_init();
539         if (ret)
540                 return ret;
541         return applesmc_pm_resume(dev);
542 }
543
544 static const struct dev_pm_ops applesmc_pm_ops = {
545         .resume = applesmc_pm_resume,
546         .restore = applesmc_pm_restore,
547 };
548
549 static struct platform_driver applesmc_driver = {
550         .probe = applesmc_probe,
551         .driver = {
552                 .name = "applesmc",
553                 .owner = THIS_MODULE,
554                 .pm = &applesmc_pm_ops,
555         },
556 };
557
558 /*
559  * applesmc_calibrate - Set our "resting" values.  Callers must
560  * hold applesmc_lock.
561  */
562 static void applesmc_calibrate(void)
563 {
564         applesmc_read_motion_sensor(SENSOR_X, &rest_x);
565         applesmc_read_motion_sensor(SENSOR_Y, &rest_y);
566         rest_x = -rest_x;
567 }
568
569 static void applesmc_idev_poll(struct input_polled_dev *dev)
570 {
571         struct input_dev *idev = dev->input;
572         s16 x, y;
573
574         mutex_lock(&applesmc_lock);
575
576         if (applesmc_read_motion_sensor(SENSOR_X, &x))
577                 goto out;
578         if (applesmc_read_motion_sensor(SENSOR_Y, &y))
579                 goto out;
580
581         x = -x;
582         input_report_abs(idev, ABS_X, x - rest_x);
583         input_report_abs(idev, ABS_Y, y - rest_y);
584         input_sync(idev);
585
586 out:
587         mutex_unlock(&applesmc_lock);
588 }
589
590 /* Sysfs Files */
591
592 static ssize_t applesmc_name_show(struct device *dev,
593                                    struct device_attribute *attr, char *buf)
594 {
595         return snprintf(buf, PAGE_SIZE, "applesmc\n");
596 }
597
598 static ssize_t applesmc_position_show(struct device *dev,
599                                    struct device_attribute *attr, char *buf)
600 {
601         int ret;
602         s16 x, y, z;
603
604         mutex_lock(&applesmc_lock);
605
606         ret = applesmc_read_motion_sensor(SENSOR_X, &x);
607         if (ret)
608                 goto out;
609         ret = applesmc_read_motion_sensor(SENSOR_Y, &y);
610         if (ret)
611                 goto out;
612         ret = applesmc_read_motion_sensor(SENSOR_Z, &z);
613         if (ret)
614                 goto out;
615
616 out:
617         mutex_unlock(&applesmc_lock);
618         if (ret)
619                 return ret;
620         else
621                 return snprintf(buf, PAGE_SIZE, "(%d,%d,%d)\n", x, y, z);
622 }
623
624 static ssize_t applesmc_light_show(struct device *dev,
625                                 struct device_attribute *attr, char *sysfsbuf)
626 {
627         static int data_length;
628         int ret;
629         u8 left = 0, right = 0;
630         u8 buffer[10], query[6];
631
632         mutex_lock(&applesmc_lock);
633
634         if (!data_length) {
635                 ret = applesmc_get_key_type(LIGHT_SENSOR_LEFT_KEY, query);
636                 if (ret)
637                         goto out;
638                 data_length = clamp_val(query[0], 0, 10);
639                 printk(KERN_INFO "applesmc: light sensor data length set to "
640                         "%d\n", data_length);
641         }
642
643         ret = applesmc_read_key(LIGHT_SENSOR_LEFT_KEY, buffer, data_length);
644         /* newer macbooks report a single 10-bit bigendian value */
645         if (data_length == 10) {
646                 left = be16_to_cpu(*(__be16 *)(buffer + 6)) >> 2;
647                 goto out;
648         }
649         left = buffer[2];
650         if (ret)
651                 goto out;
652         ret = applesmc_read_key(LIGHT_SENSOR_RIGHT_KEY, buffer, data_length);
653         right = buffer[2];
654
655 out:
656         mutex_unlock(&applesmc_lock);
657         if (ret)
658                 return ret;
659         else
660                 return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", left, right);
661 }
662
663 /* Displays sensor key as label */
664 static ssize_t applesmc_show_sensor_label(struct device *dev,
665                         struct device_attribute *devattr, char *sysfsbuf)
666 {
667         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
668         const char *key =
669                 temperature_sensors_sets[applesmc_temperature_set][attr->index];
670
671         return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", key);
672 }
673
674 /* Displays degree Celsius * 1000 */
675 static ssize_t applesmc_show_temperature(struct device *dev,
676                         struct device_attribute *devattr, char *sysfsbuf)
677 {
678         int ret;
679         u8 buffer[2];
680         unsigned int temp;
681         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
682         const char* key =
683                 temperature_sensors_sets[applesmc_temperature_set][attr->index];
684
685         mutex_lock(&applesmc_lock);
686
687         ret = applesmc_read_key(key, buffer, 2);
688         temp = buffer[0]*1000;
689         temp += (buffer[1] >> 6) * 250;
690
691         mutex_unlock(&applesmc_lock);
692
693         if (ret)
694                 return ret;
695         else
696                 return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", temp);
697 }
698
699 static ssize_t applesmc_show_fan_speed(struct device *dev,
700                                 struct device_attribute *attr, char *sysfsbuf)
701 {
702         int ret;
703         unsigned int speed = 0;
704         char newkey[5];
705         u8 buffer[2];
706         struct sensor_device_attribute_2 *sensor_attr =
707                                                 to_sensor_dev_attr_2(attr);
708
709         newkey[0] = fan_speed_keys[sensor_attr->nr][0];
710         newkey[1] = '0' + sensor_attr->index;
711         newkey[2] = fan_speed_keys[sensor_attr->nr][2];
712         newkey[3] = fan_speed_keys[sensor_attr->nr][3];
713         newkey[4] = 0;
714
715         mutex_lock(&applesmc_lock);
716
717         ret = applesmc_read_key(newkey, buffer, 2);
718         speed = ((buffer[0] << 8 | buffer[1]) >> 2);
719
720         mutex_unlock(&applesmc_lock);
721         if (ret)
722                 return ret;
723         else
724                 return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", speed);
725 }
726
727 static ssize_t applesmc_store_fan_speed(struct device *dev,
728                                         struct device_attribute *attr,
729                                         const char *sysfsbuf, size_t count)
730 {
731         int ret;
732         u32 speed;
733         char newkey[5];
734         u8 buffer[2];
735         struct sensor_device_attribute_2 *sensor_attr =
736                                                 to_sensor_dev_attr_2(attr);
737
738         speed = simple_strtoul(sysfsbuf, NULL, 10);
739
740         if (speed > 0x4000) /* Bigger than a 14-bit value */
741                 return -EINVAL;
742
743         newkey[0] = fan_speed_keys[sensor_attr->nr][0];
744         newkey[1] = '0' + sensor_attr->index;
745         newkey[2] = fan_speed_keys[sensor_attr->nr][2];
746         newkey[3] = fan_speed_keys[sensor_attr->nr][3];
747         newkey[4] = 0;
748
749         mutex_lock(&applesmc_lock);
750
751         buffer[0] = (speed >> 6) & 0xff;
752         buffer[1] = (speed << 2) & 0xff;
753         ret = applesmc_write_key(newkey, buffer, 2);
754
755         mutex_unlock(&applesmc_lock);
756         if (ret)
757                 return ret;
758         else
759                 return count;
760 }
761
762 static ssize_t applesmc_show_fan_manual(struct device *dev,
763                         struct device_attribute *devattr, char *sysfsbuf)
764 {
765         int ret;
766         u16 manual = 0;
767         u8 buffer[2];
768         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
769
770         mutex_lock(&applesmc_lock);
771
772         ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
773         manual = ((buffer[0] << 8 | buffer[1]) >> attr->index) & 0x01;
774
775         mutex_unlock(&applesmc_lock);
776         if (ret)
777                 return ret;
778         else
779                 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", manual);
780 }
781
782 static ssize_t applesmc_store_fan_manual(struct device *dev,
783                                          struct device_attribute *devattr,
784                                          const char *sysfsbuf, size_t count)
785 {
786         int ret;
787         u8 buffer[2];
788         u32 input;
789         u16 val;
790         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
791
792         input = simple_strtoul(sysfsbuf, NULL, 10);
793
794         mutex_lock(&applesmc_lock);
795
796         ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
797         val = (buffer[0] << 8 | buffer[1]);
798         if (ret)
799                 goto out;
800
801         if (input)
802                 val = val | (0x01 << attr->index);
803         else
804                 val = val & ~(0x01 << attr->index);
805
806         buffer[0] = (val >> 8) & 0xFF;
807         buffer[1] = val & 0xFF;
808
809         ret = applesmc_write_key(FANS_MANUAL, buffer, 2);
810
811 out:
812         mutex_unlock(&applesmc_lock);
813         if (ret)
814                 return ret;
815         else
816                 return count;
817 }
818
819 static ssize_t applesmc_show_fan_position(struct device *dev,
820                                 struct device_attribute *attr, char *sysfsbuf)
821 {
822         int ret;
823         char newkey[5];
824         u8 buffer[17];
825         struct sensor_device_attribute_2 *sensor_attr =
826                                                 to_sensor_dev_attr_2(attr);
827
828         newkey[0] = FAN_POSITION[0];
829         newkey[1] = '0' + sensor_attr->index;
830         newkey[2] = FAN_POSITION[2];
831         newkey[3] = FAN_POSITION[3];
832         newkey[4] = 0;
833
834         mutex_lock(&applesmc_lock);
835
836         ret = applesmc_read_key(newkey, buffer, 16);
837         buffer[16] = 0;
838
839         mutex_unlock(&applesmc_lock);
840         if (ret)
841                 return ret;
842         else
843                 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", buffer+4);
844 }
845
846 static ssize_t applesmc_calibrate_show(struct device *dev,
847                                 struct device_attribute *attr, char *sysfsbuf)
848 {
849         return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", rest_x, rest_y);
850 }
851
852 static ssize_t applesmc_calibrate_store(struct device *dev,
853         struct device_attribute *attr, const char *sysfsbuf, size_t count)
854 {
855         mutex_lock(&applesmc_lock);
856         applesmc_calibrate();
857         mutex_unlock(&applesmc_lock);
858
859         return count;
860 }
861
862 static void applesmc_backlight_set(struct work_struct *work)
863 {
864         mutex_lock(&applesmc_lock);
865         applesmc_write_key(BACKLIGHT_KEY, backlight_state, 2);
866         mutex_unlock(&applesmc_lock);
867 }
868 static DECLARE_WORK(backlight_work, &applesmc_backlight_set);
869
870 static void applesmc_brightness_set(struct led_classdev *led_cdev,
871                                                 enum led_brightness value)
872 {
873         int ret;
874
875         backlight_state[0] = value;
876         ret = queue_work(applesmc_led_wq, &backlight_work);
877
878         if (debug && (!ret))
879                 printk(KERN_DEBUG "applesmc: work was already on the queue.\n");
880 }
881
882 static ssize_t applesmc_key_count_show(struct device *dev,
883                                 struct device_attribute *attr, char *sysfsbuf)
884 {
885         int ret;
886         u8 buffer[4];
887         u32 count;
888
889         mutex_lock(&applesmc_lock);
890
891         ret = applesmc_read_key(KEY_COUNT_KEY, buffer, 4);
892         count = ((u32)buffer[0]<<24) + ((u32)buffer[1]<<16) +
893                                                 ((u32)buffer[2]<<8) + buffer[3];
894
895         mutex_unlock(&applesmc_lock);
896         if (ret)
897                 return ret;
898         else
899                 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", count);
900 }
901
902 static ssize_t applesmc_key_at_index_read_show(struct device *dev,
903                                 struct device_attribute *attr, char *sysfsbuf)
904 {
905         char key[5];
906         char info[6];
907         int ret;
908
909         mutex_lock(&applesmc_lock);
910
911         ret = applesmc_get_key_at_index(key_at_index, key);
912
913         if (ret || !key[0]) {
914                 mutex_unlock(&applesmc_lock);
915
916                 return -EINVAL;
917         }
918
919         ret = applesmc_get_key_type(key, info);
920
921         if (ret) {
922                 mutex_unlock(&applesmc_lock);
923
924                 return ret;
925         }
926
927         /*
928          * info[0] maximum value (APPLESMC_MAX_DATA_LENGTH) is much lower than
929          * PAGE_SIZE, so we don't need any checks before writing to sysfsbuf.
930          */
931         ret = applesmc_read_key(key, sysfsbuf, info[0]);
932
933         mutex_unlock(&applesmc_lock);
934
935         if (!ret) {
936                 return info[0];
937         } else {
938                 return ret;
939         }
940 }
941
942 static ssize_t applesmc_key_at_index_data_length_show(struct device *dev,
943                                 struct device_attribute *attr, char *sysfsbuf)
944 {
945         char key[5];
946         char info[6];
947         int ret;
948
949         mutex_lock(&applesmc_lock);
950
951         ret = applesmc_get_key_at_index(key_at_index, key);
952
953         if (ret || !key[0]) {
954                 mutex_unlock(&applesmc_lock);
955
956                 return -EINVAL;
957         }
958
959         ret = applesmc_get_key_type(key, info);
960
961         mutex_unlock(&applesmc_lock);
962
963         if (!ret)
964                 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", info[0]);
965         else
966                 return ret;
967 }
968
969 static ssize_t applesmc_key_at_index_type_show(struct device *dev,
970                                 struct device_attribute *attr, char *sysfsbuf)
971 {
972         char key[5];
973         char info[6];
974         int ret;
975
976         mutex_lock(&applesmc_lock);
977
978         ret = applesmc_get_key_at_index(key_at_index, key);
979
980         if (ret || !key[0]) {
981                 mutex_unlock(&applesmc_lock);
982
983                 return -EINVAL;
984         }
985
986         ret = applesmc_get_key_type(key, info);
987
988         mutex_unlock(&applesmc_lock);
989
990         if (!ret)
991                 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", info+1);
992         else
993                 return ret;
994 }
995
996 static ssize_t applesmc_key_at_index_name_show(struct device *dev,
997                                 struct device_attribute *attr, char *sysfsbuf)
998 {
999         char key[5];
1000         int ret;
1001
1002         mutex_lock(&applesmc_lock);
1003
1004         ret = applesmc_get_key_at_index(key_at_index, key);
1005
1006         mutex_unlock(&applesmc_lock);
1007
1008         if (!ret && key[0])
1009                 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", key);
1010         else
1011                 return -EINVAL;
1012 }
1013
1014 static ssize_t applesmc_key_at_index_show(struct device *dev,
1015                                 struct device_attribute *attr, char *sysfsbuf)
1016 {
1017         return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", key_at_index);
1018 }
1019
1020 static ssize_t applesmc_key_at_index_store(struct device *dev,
1021         struct device_attribute *attr, const char *sysfsbuf, size_t count)
1022 {
1023         mutex_lock(&applesmc_lock);
1024
1025         key_at_index = simple_strtoul(sysfsbuf, NULL, 10);
1026
1027         mutex_unlock(&applesmc_lock);
1028
1029         return count;
1030 }
1031
1032 static struct led_classdev applesmc_backlight = {
1033         .name                   = "smc::kbd_backlight",
1034         .default_trigger        = "nand-disk",
1035         .brightness_set         = applesmc_brightness_set,
1036 };
1037
1038 static DEVICE_ATTR(name, 0444, applesmc_name_show, NULL);
1039
1040 static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL);
1041 static DEVICE_ATTR(calibrate, 0644,
1042                         applesmc_calibrate_show, applesmc_calibrate_store);
1043
1044 static struct attribute *accelerometer_attributes[] = {
1045         &dev_attr_position.attr,
1046         &dev_attr_calibrate.attr,
1047         NULL
1048 };
1049
1050 static const struct attribute_group accelerometer_attributes_group =
1051         { .attrs = accelerometer_attributes };
1052
1053 static DEVICE_ATTR(light, 0444, applesmc_light_show, NULL);
1054
1055 static DEVICE_ATTR(key_count, 0444, applesmc_key_count_show, NULL);
1056 static DEVICE_ATTR(key_at_index, 0644,
1057                 applesmc_key_at_index_show, applesmc_key_at_index_store);
1058 static DEVICE_ATTR(key_at_index_name, 0444,
1059                                         applesmc_key_at_index_name_show, NULL);
1060 static DEVICE_ATTR(key_at_index_type, 0444,
1061                                         applesmc_key_at_index_type_show, NULL);
1062 static DEVICE_ATTR(key_at_index_data_length, 0444,
1063                                 applesmc_key_at_index_data_length_show, NULL);
1064 static DEVICE_ATTR(key_at_index_data, 0444,
1065                                 applesmc_key_at_index_read_show, NULL);
1066
1067 static struct attribute *key_enumeration_attributes[] = {
1068         &dev_attr_key_count.attr,
1069         &dev_attr_key_at_index.attr,
1070         &dev_attr_key_at_index_name.attr,
1071         &dev_attr_key_at_index_type.attr,
1072         &dev_attr_key_at_index_data_length.attr,
1073         &dev_attr_key_at_index_data.attr,
1074         NULL
1075 };
1076
1077 static const struct attribute_group key_enumeration_group =
1078         { .attrs = key_enumeration_attributes };
1079
1080 /*
1081  * Macro defining SENSOR_DEVICE_ATTR for a fan sysfs entries.
1082  *  - show actual speed
1083  *  - show/store minimum speed
1084  *  - show maximum speed
1085  *  - show safe speed
1086  *  - show/store target speed
1087  *  - show/store manual mode
1088  */
1089 #define sysfs_fan_speeds_offset(offset) \
1090 static SENSOR_DEVICE_ATTR_2(fan##offset##_input, S_IRUGO, \
1091                         applesmc_show_fan_speed, NULL, 0, offset-1); \
1092 \
1093 static SENSOR_DEVICE_ATTR_2(fan##offset##_min, S_IRUGO | S_IWUSR, \
1094         applesmc_show_fan_speed, applesmc_store_fan_speed, 1, offset-1); \
1095 \
1096 static SENSOR_DEVICE_ATTR_2(fan##offset##_max, S_IRUGO, \
1097                         applesmc_show_fan_speed, NULL, 2, offset-1); \
1098 \
1099 static SENSOR_DEVICE_ATTR_2(fan##offset##_safe, S_IRUGO, \
1100                         applesmc_show_fan_speed, NULL, 3, offset-1); \
1101 \
1102 static SENSOR_DEVICE_ATTR_2(fan##offset##_output, S_IRUGO | S_IWUSR, \
1103         applesmc_show_fan_speed, applesmc_store_fan_speed, 4, offset-1); \
1104 \
1105 static SENSOR_DEVICE_ATTR(fan##offset##_manual, S_IRUGO | S_IWUSR, \
1106         applesmc_show_fan_manual, applesmc_store_fan_manual, offset-1); \
1107 \
1108 static SENSOR_DEVICE_ATTR(fan##offset##_label, S_IRUGO, \
1109         applesmc_show_fan_position, NULL, offset-1); \
1110 \
1111 static struct attribute *fan##offset##_attributes[] = { \
1112         &sensor_dev_attr_fan##offset##_input.dev_attr.attr, \
1113         &sensor_dev_attr_fan##offset##_min.dev_attr.attr, \
1114         &sensor_dev_attr_fan##offset##_max.dev_attr.attr, \
1115         &sensor_dev_attr_fan##offset##_safe.dev_attr.attr, \
1116         &sensor_dev_attr_fan##offset##_output.dev_attr.attr, \
1117         &sensor_dev_attr_fan##offset##_manual.dev_attr.attr, \
1118         &sensor_dev_attr_fan##offset##_label.dev_attr.attr, \
1119         NULL \
1120 };
1121
1122 /*
1123  * Create the needed functions for each fan using the macro defined above
1124  * (4 fans are supported)
1125  */
1126 sysfs_fan_speeds_offset(1);
1127 sysfs_fan_speeds_offset(2);
1128 sysfs_fan_speeds_offset(3);
1129 sysfs_fan_speeds_offset(4);
1130
1131 static const struct attribute_group fan_attribute_groups[] = {
1132         { .attrs = fan1_attributes },
1133         { .attrs = fan2_attributes },
1134         { .attrs = fan3_attributes },
1135         { .attrs = fan4_attributes },
1136 };
1137
1138 /*
1139  * Temperature sensors sysfs entries.
1140  */
1141 static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO,
1142                                         applesmc_show_sensor_label, NULL, 0);
1143 static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO,
1144                                         applesmc_show_sensor_label, NULL, 1);
1145 static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO,
1146                                         applesmc_show_sensor_label, NULL, 2);
1147 static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO,
1148                                         applesmc_show_sensor_label, NULL, 3);
1149 static SENSOR_DEVICE_ATTR(temp5_label, S_IRUGO,
1150                                         applesmc_show_sensor_label, NULL, 4);
1151 static SENSOR_DEVICE_ATTR(temp6_label, S_IRUGO,
1152                                         applesmc_show_sensor_label, NULL, 5);
1153 static SENSOR_DEVICE_ATTR(temp7_label, S_IRUGO,
1154                                         applesmc_show_sensor_label, NULL, 6);
1155 static SENSOR_DEVICE_ATTR(temp8_label, S_IRUGO,
1156                                         applesmc_show_sensor_label, NULL, 7);
1157 static SENSOR_DEVICE_ATTR(temp9_label, S_IRUGO,
1158                                         applesmc_show_sensor_label, NULL, 8);
1159 static SENSOR_DEVICE_ATTR(temp10_label, S_IRUGO,
1160                                         applesmc_show_sensor_label, NULL, 9);
1161 static SENSOR_DEVICE_ATTR(temp11_label, S_IRUGO,
1162                                         applesmc_show_sensor_label, NULL, 10);
1163 static SENSOR_DEVICE_ATTR(temp12_label, S_IRUGO,
1164                                         applesmc_show_sensor_label, NULL, 11);
1165 static SENSOR_DEVICE_ATTR(temp13_label, S_IRUGO,
1166                                         applesmc_show_sensor_label, NULL, 12);
1167 static SENSOR_DEVICE_ATTR(temp14_label, S_IRUGO,
1168                                         applesmc_show_sensor_label, NULL, 13);
1169 static SENSOR_DEVICE_ATTR(temp15_label, S_IRUGO,
1170                                         applesmc_show_sensor_label, NULL, 14);
1171 static SENSOR_DEVICE_ATTR(temp16_label, S_IRUGO,
1172                                         applesmc_show_sensor_label, NULL, 15);
1173 static SENSOR_DEVICE_ATTR(temp17_label, S_IRUGO,
1174                                         applesmc_show_sensor_label, NULL, 16);
1175 static SENSOR_DEVICE_ATTR(temp18_label, S_IRUGO,
1176                                         applesmc_show_sensor_label, NULL, 17);
1177 static SENSOR_DEVICE_ATTR(temp19_label, S_IRUGO,
1178                                         applesmc_show_sensor_label, NULL, 18);
1179 static SENSOR_DEVICE_ATTR(temp20_label, S_IRUGO,
1180                                         applesmc_show_sensor_label, NULL, 19);
1181 static SENSOR_DEVICE_ATTR(temp21_label, S_IRUGO,
1182                                         applesmc_show_sensor_label, NULL, 20);
1183 static SENSOR_DEVICE_ATTR(temp22_label, S_IRUGO,
1184                                         applesmc_show_sensor_label, NULL, 21);
1185 static SENSOR_DEVICE_ATTR(temp23_label, S_IRUGO,
1186                                         applesmc_show_sensor_label, NULL, 22);
1187 static SENSOR_DEVICE_ATTR(temp24_label, S_IRUGO,
1188                                         applesmc_show_sensor_label, NULL, 23);
1189 static SENSOR_DEVICE_ATTR(temp25_label, S_IRUGO,
1190                                         applesmc_show_sensor_label, NULL, 24);
1191 static SENSOR_DEVICE_ATTR(temp26_label, S_IRUGO,
1192                                         applesmc_show_sensor_label, NULL, 25);
1193 static SENSOR_DEVICE_ATTR(temp27_label, S_IRUGO,
1194                                         applesmc_show_sensor_label, NULL, 26);
1195 static SENSOR_DEVICE_ATTR(temp28_label, S_IRUGO,
1196                                         applesmc_show_sensor_label, NULL, 27);
1197 static SENSOR_DEVICE_ATTR(temp29_label, S_IRUGO,
1198                                         applesmc_show_sensor_label, NULL, 28);
1199 static SENSOR_DEVICE_ATTR(temp30_label, S_IRUGO,
1200                                         applesmc_show_sensor_label, NULL, 29);
1201 static SENSOR_DEVICE_ATTR(temp31_label, S_IRUGO,
1202                                         applesmc_show_sensor_label, NULL, 30);
1203 static SENSOR_DEVICE_ATTR(temp32_label, S_IRUGO,
1204                                         applesmc_show_sensor_label, NULL, 31);
1205 static SENSOR_DEVICE_ATTR(temp33_label, S_IRUGO,
1206                                         applesmc_show_sensor_label, NULL, 32);
1207 static SENSOR_DEVICE_ATTR(temp34_label, S_IRUGO,
1208                                         applesmc_show_sensor_label, NULL, 33);
1209 static SENSOR_DEVICE_ATTR(temp35_label, S_IRUGO,
1210                                         applesmc_show_sensor_label, NULL, 34);
1211 static SENSOR_DEVICE_ATTR(temp36_label, S_IRUGO,
1212                                         applesmc_show_sensor_label, NULL, 35);
1213 static SENSOR_DEVICE_ATTR(temp37_label, S_IRUGO,
1214                                         applesmc_show_sensor_label, NULL, 36);
1215 static SENSOR_DEVICE_ATTR(temp38_label, S_IRUGO,
1216                                         applesmc_show_sensor_label, NULL, 37);
1217 static SENSOR_DEVICE_ATTR(temp39_label, S_IRUGO,
1218                                         applesmc_show_sensor_label, NULL, 38);
1219 static SENSOR_DEVICE_ATTR(temp40_label, S_IRUGO,
1220                                         applesmc_show_sensor_label, NULL, 39);
1221 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO,
1222                                         applesmc_show_temperature, NULL, 0);
1223 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO,
1224                                         applesmc_show_temperature, NULL, 1);
1225 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO,
1226                                         applesmc_show_temperature, NULL, 2);
1227 static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO,
1228                                         applesmc_show_temperature, NULL, 3);
1229 static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO,
1230                                         applesmc_show_temperature, NULL, 4);
1231 static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO,
1232                                         applesmc_show_temperature, NULL, 5);
1233 static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO,
1234                                         applesmc_show_temperature, NULL, 6);
1235 static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO,
1236                                         applesmc_show_temperature, NULL, 7);
1237 static SENSOR_DEVICE_ATTR(temp9_input, S_IRUGO,
1238                                         applesmc_show_temperature, NULL, 8);
1239 static SENSOR_DEVICE_ATTR(temp10_input, S_IRUGO,
1240                                         applesmc_show_temperature, NULL, 9);
1241 static SENSOR_DEVICE_ATTR(temp11_input, S_IRUGO,
1242                                         applesmc_show_temperature, NULL, 10);
1243 static SENSOR_DEVICE_ATTR(temp12_input, S_IRUGO,
1244                                         applesmc_show_temperature, NULL, 11);
1245 static SENSOR_DEVICE_ATTR(temp13_input, S_IRUGO,
1246                                         applesmc_show_temperature, NULL, 12);
1247 static SENSOR_DEVICE_ATTR(temp14_input, S_IRUGO,
1248                                         applesmc_show_temperature, NULL, 13);
1249 static SENSOR_DEVICE_ATTR(temp15_input, S_IRUGO,
1250                                         applesmc_show_temperature, NULL, 14);
1251 static SENSOR_DEVICE_ATTR(temp16_input, S_IRUGO,
1252                                         applesmc_show_temperature, NULL, 15);
1253 static SENSOR_DEVICE_ATTR(temp17_input, S_IRUGO,
1254                                         applesmc_show_temperature, NULL, 16);
1255 static SENSOR_DEVICE_ATTR(temp18_input, S_IRUGO,
1256                                         applesmc_show_temperature, NULL, 17);
1257 static SENSOR_DEVICE_ATTR(temp19_input, S_IRUGO,
1258                                         applesmc_show_temperature, NULL, 18);
1259 static SENSOR_DEVICE_ATTR(temp20_input, S_IRUGO,
1260                                         applesmc_show_temperature, NULL, 19);
1261 static SENSOR_DEVICE_ATTR(temp21_input, S_IRUGO,
1262                                         applesmc_show_temperature, NULL, 20);
1263 static SENSOR_DEVICE_ATTR(temp22_input, S_IRUGO,
1264                                         applesmc_show_temperature, NULL, 21);
1265 static SENSOR_DEVICE_ATTR(temp23_input, S_IRUGO,
1266                                         applesmc_show_temperature, NULL, 22);
1267 static SENSOR_DEVICE_ATTR(temp24_input, S_IRUGO,
1268                                         applesmc_show_temperature, NULL, 23);
1269 static SENSOR_DEVICE_ATTR(temp25_input, S_IRUGO,
1270                                         applesmc_show_temperature, NULL, 24);
1271 static SENSOR_DEVICE_ATTR(temp26_input, S_IRUGO,
1272                                         applesmc_show_temperature, NULL, 25);
1273 static SENSOR_DEVICE_ATTR(temp27_input, S_IRUGO,
1274                                         applesmc_show_temperature, NULL, 26);
1275 static SENSOR_DEVICE_ATTR(temp28_input, S_IRUGO,
1276                                         applesmc_show_temperature, NULL, 27);
1277 static SENSOR_DEVICE_ATTR(temp29_input, S_IRUGO,
1278                                         applesmc_show_temperature, NULL, 28);
1279 static SENSOR_DEVICE_ATTR(temp30_input, S_IRUGO,
1280                                         applesmc_show_temperature, NULL, 29);
1281 static SENSOR_DEVICE_ATTR(temp31_input, S_IRUGO,
1282                                         applesmc_show_temperature, NULL, 30);
1283 static SENSOR_DEVICE_ATTR(temp32_input, S_IRUGO,
1284                                         applesmc_show_temperature, NULL, 31);
1285 static SENSOR_DEVICE_ATTR(temp33_input, S_IRUGO,
1286                                         applesmc_show_temperature, NULL, 32);
1287 static SENSOR_DEVICE_ATTR(temp34_input, S_IRUGO,
1288                                         applesmc_show_temperature, NULL, 33);
1289 static SENSOR_DEVICE_ATTR(temp35_input, S_IRUGO,
1290                                         applesmc_show_temperature, NULL, 34);
1291 static SENSOR_DEVICE_ATTR(temp36_input, S_IRUGO,
1292                                         applesmc_show_temperature, NULL, 35);
1293 static SENSOR_DEVICE_ATTR(temp37_input, S_IRUGO,
1294                                         applesmc_show_temperature, NULL, 36);
1295 static SENSOR_DEVICE_ATTR(temp38_input, S_IRUGO,
1296                                         applesmc_show_temperature, NULL, 37);
1297 static SENSOR_DEVICE_ATTR(temp39_input, S_IRUGO,
1298                                         applesmc_show_temperature, NULL, 38);
1299 static SENSOR_DEVICE_ATTR(temp40_input, S_IRUGO,
1300                                         applesmc_show_temperature, NULL, 39);
1301
1302 static struct attribute *label_attributes[] = {
1303         &sensor_dev_attr_temp1_label.dev_attr.attr,
1304         &sensor_dev_attr_temp2_label.dev_attr.attr,
1305         &sensor_dev_attr_temp3_label.dev_attr.attr,
1306         &sensor_dev_attr_temp4_label.dev_attr.attr,
1307         &sensor_dev_attr_temp5_label.dev_attr.attr,
1308         &sensor_dev_attr_temp6_label.dev_attr.attr,
1309         &sensor_dev_attr_temp7_label.dev_attr.attr,
1310         &sensor_dev_attr_temp8_label.dev_attr.attr,
1311         &sensor_dev_attr_temp9_label.dev_attr.attr,
1312         &sensor_dev_attr_temp10_label.dev_attr.attr,
1313         &sensor_dev_attr_temp11_label.dev_attr.attr,
1314         &sensor_dev_attr_temp12_label.dev_attr.attr,
1315         &sensor_dev_attr_temp13_label.dev_attr.attr,
1316         &sensor_dev_attr_temp14_label.dev_attr.attr,
1317         &sensor_dev_attr_temp15_label.dev_attr.attr,
1318         &sensor_dev_attr_temp16_label.dev_attr.attr,
1319         &sensor_dev_attr_temp17_label.dev_attr.attr,
1320         &sensor_dev_attr_temp18_label.dev_attr.attr,
1321         &sensor_dev_attr_temp19_label.dev_attr.attr,
1322         &sensor_dev_attr_temp20_label.dev_attr.attr,
1323         &sensor_dev_attr_temp21_label.dev_attr.attr,
1324         &sensor_dev_attr_temp22_label.dev_attr.attr,
1325         &sensor_dev_attr_temp23_label.dev_attr.attr,
1326         &sensor_dev_attr_temp24_label.dev_attr.attr,
1327         &sensor_dev_attr_temp25_label.dev_attr.attr,
1328         &sensor_dev_attr_temp26_label.dev_attr.attr,
1329         &sensor_dev_attr_temp27_label.dev_attr.attr,
1330         &sensor_dev_attr_temp28_label.dev_attr.attr,
1331         &sensor_dev_attr_temp29_label.dev_attr.attr,
1332         &sensor_dev_attr_temp30_label.dev_attr.attr,
1333         &sensor_dev_attr_temp31_label.dev_attr.attr,
1334         &sensor_dev_attr_temp32_label.dev_attr.attr,
1335         &sensor_dev_attr_temp33_label.dev_attr.attr,
1336         &sensor_dev_attr_temp34_label.dev_attr.attr,
1337         &sensor_dev_attr_temp35_label.dev_attr.attr,
1338         &sensor_dev_attr_temp36_label.dev_attr.attr,
1339         &sensor_dev_attr_temp37_label.dev_attr.attr,
1340         &sensor_dev_attr_temp38_label.dev_attr.attr,
1341         &sensor_dev_attr_temp39_label.dev_attr.attr,
1342         &sensor_dev_attr_temp40_label.dev_attr.attr,
1343         NULL
1344 };
1345
1346 static struct attribute *temperature_attributes[] = {
1347         &sensor_dev_attr_temp1_input.dev_attr.attr,
1348         &sensor_dev_attr_temp2_input.dev_attr.attr,
1349         &sensor_dev_attr_temp3_input.dev_attr.attr,
1350         &sensor_dev_attr_temp4_input.dev_attr.attr,
1351         &sensor_dev_attr_temp5_input.dev_attr.attr,
1352         &sensor_dev_attr_temp6_input.dev_attr.attr,
1353         &sensor_dev_attr_temp7_input.dev_attr.attr,
1354         &sensor_dev_attr_temp8_input.dev_attr.attr,
1355         &sensor_dev_attr_temp9_input.dev_attr.attr,
1356         &sensor_dev_attr_temp10_input.dev_attr.attr,
1357         &sensor_dev_attr_temp11_input.dev_attr.attr,
1358         &sensor_dev_attr_temp12_input.dev_attr.attr,
1359         &sensor_dev_attr_temp13_input.dev_attr.attr,
1360         &sensor_dev_attr_temp14_input.dev_attr.attr,
1361         &sensor_dev_attr_temp15_input.dev_attr.attr,
1362         &sensor_dev_attr_temp16_input.dev_attr.attr,
1363         &sensor_dev_attr_temp17_input.dev_attr.attr,
1364         &sensor_dev_attr_temp18_input.dev_attr.attr,
1365         &sensor_dev_attr_temp19_input.dev_attr.attr,
1366         &sensor_dev_attr_temp20_input.dev_attr.attr,
1367         &sensor_dev_attr_temp21_input.dev_attr.attr,
1368         &sensor_dev_attr_temp22_input.dev_attr.attr,
1369         &sensor_dev_attr_temp23_input.dev_attr.attr,
1370         &sensor_dev_attr_temp24_input.dev_attr.attr,
1371         &sensor_dev_attr_temp25_input.dev_attr.attr,
1372         &sensor_dev_attr_temp26_input.dev_attr.attr,
1373         &sensor_dev_attr_temp27_input.dev_attr.attr,
1374         &sensor_dev_attr_temp28_input.dev_attr.attr,
1375         &sensor_dev_attr_temp29_input.dev_attr.attr,
1376         &sensor_dev_attr_temp30_input.dev_attr.attr,
1377         &sensor_dev_attr_temp31_input.dev_attr.attr,
1378         &sensor_dev_attr_temp32_input.dev_attr.attr,
1379         &sensor_dev_attr_temp33_input.dev_attr.attr,
1380         &sensor_dev_attr_temp34_input.dev_attr.attr,
1381         &sensor_dev_attr_temp35_input.dev_attr.attr,
1382         &sensor_dev_attr_temp36_input.dev_attr.attr,
1383         &sensor_dev_attr_temp37_input.dev_attr.attr,
1384         &sensor_dev_attr_temp38_input.dev_attr.attr,
1385         &sensor_dev_attr_temp39_input.dev_attr.attr,
1386         &sensor_dev_attr_temp40_input.dev_attr.attr,
1387         NULL
1388 };
1389
1390 static const struct attribute_group temperature_attributes_group =
1391         { .attrs = temperature_attributes };
1392
1393 static const struct attribute_group label_attributes_group = {
1394         .attrs = label_attributes
1395 };
1396
1397 /* Module stuff */
1398
1399 /*
1400  * applesmc_dmi_match - found a match.  return one, short-circuiting the hunt.
1401  */
1402 static int applesmc_dmi_match(const struct dmi_system_id *id)
1403 {
1404         int i = 0;
1405         struct dmi_match_data* dmi_data = id->driver_data;
1406         printk(KERN_INFO "applesmc: %s detected:\n", id->ident);
1407         applesmc_accelerometer = dmi_data->accelerometer;
1408         printk(KERN_INFO "applesmc:  - Model %s accelerometer\n",
1409                                 applesmc_accelerometer ? "with" : "without");
1410         applesmc_light = dmi_data->light;
1411         printk(KERN_INFO "applesmc:  - Model %s light sensors and backlight\n",
1412                                         applesmc_light ? "with" : "without");
1413
1414         applesmc_temperature_set =  dmi_data->temperature_set;
1415         while (temperature_sensors_sets[applesmc_temperature_set][i] != NULL)
1416                 i++;
1417         printk(KERN_INFO "applesmc:  - Model with %d temperature sensors\n", i);
1418         return 1;
1419 }
1420
1421 /* Create accelerometer ressources */
1422 static int applesmc_create_accelerometer(void)
1423 {
1424         struct input_dev *idev;
1425         int ret;
1426
1427         ret = sysfs_create_group(&pdev->dev.kobj,
1428                                         &accelerometer_attributes_group);
1429         if (ret)
1430                 goto out;
1431
1432         applesmc_idev = input_allocate_polled_device();
1433         if (!applesmc_idev) {
1434                 ret = -ENOMEM;
1435                 goto out_sysfs;
1436         }
1437
1438         applesmc_idev->poll = applesmc_idev_poll;
1439         applesmc_idev->poll_interval = APPLESMC_POLL_INTERVAL;
1440
1441         /* initial calibrate for the input device */
1442         applesmc_calibrate();
1443
1444         /* initialize the input device */
1445         idev = applesmc_idev->input;
1446         idev->name = "applesmc";
1447         idev->id.bustype = BUS_HOST;
1448         idev->dev.parent = &pdev->dev;
1449         idev->evbit[0] = BIT_MASK(EV_ABS);
1450         input_set_abs_params(idev, ABS_X,
1451                         -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
1452         input_set_abs_params(idev, ABS_Y,
1453                         -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
1454
1455         ret = input_register_polled_device(applesmc_idev);
1456         if (ret)
1457                 goto out_idev;
1458
1459         return 0;
1460
1461 out_idev:
1462         input_free_polled_device(applesmc_idev);
1463
1464 out_sysfs:
1465         sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group);
1466
1467 out:
1468         printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
1469         return ret;
1470 }
1471
1472 /* Release all ressources used by the accelerometer */
1473 static void applesmc_release_accelerometer(void)
1474 {
1475         input_unregister_polled_device(applesmc_idev);
1476         input_free_polled_device(applesmc_idev);
1477         sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group);
1478 }
1479
1480 static __initdata struct dmi_match_data applesmc_dmi_data[] = {
1481 /* MacBook Pro: accelerometer, backlight and temperature set 0 */
1482         { .accelerometer = 1, .light = 1, .temperature_set = 0 },
1483 /* MacBook2: accelerometer and temperature set 1 */
1484         { .accelerometer = 1, .light = 0, .temperature_set = 1 },
1485 /* MacBook: accelerometer and temperature set 2 */
1486         { .accelerometer = 1, .light = 0, .temperature_set = 2 },
1487 /* MacMini: temperature set 3 */
1488         { .accelerometer = 0, .light = 0, .temperature_set = 3 },
1489 /* MacPro: temperature set 4 */
1490         { .accelerometer = 0, .light = 0, .temperature_set = 4 },
1491 /* iMac: temperature set 5 */
1492         { .accelerometer = 0, .light = 0, .temperature_set = 5 },
1493 /* MacBook3, MacBook4: accelerometer and temperature set 6 */
1494         { .accelerometer = 1, .light = 0, .temperature_set = 6 },
1495 /* MacBook Air: accelerometer, backlight and temperature set 7 */
1496         { .accelerometer = 1, .light = 1, .temperature_set = 7 },
1497 /* MacBook Pro 4: accelerometer, backlight and temperature set 8 */
1498         { .accelerometer = 1, .light = 1, .temperature_set = 8 },
1499 /* MacBook Pro 3: accelerometer, backlight and temperature set 9 */
1500         { .accelerometer = 1, .light = 1, .temperature_set = 9 },
1501 /* iMac 5: light sensor only, temperature set 10 */
1502         { .accelerometer = 0, .light = 0, .temperature_set = 10 },
1503 /* MacBook 5: accelerometer, backlight and temperature set 11 */
1504         { .accelerometer = 1, .light = 1, .temperature_set = 11 },
1505 /* MacBook Pro 5: accelerometer, backlight and temperature set 12 */
1506         { .accelerometer = 1, .light = 1, .temperature_set = 12 },
1507 /* iMac 8: light sensor only, temperature set 13 */
1508         { .accelerometer = 0, .light = 0, .temperature_set = 13 },
1509 /* iMac 6: light sensor only, temperature set 14 */
1510         { .accelerometer = 0, .light = 0, .temperature_set = 14 },
1511 /* MacBook Air 2,1: accelerometer, backlight and temperature set 15 */
1512         { .accelerometer = 1, .light = 1, .temperature_set = 15 },
1513 /* MacPro3,1: temperature set 16 */
1514         { .accelerometer = 0, .light = 0, .temperature_set = 16 },
1515 /* iMac 9,1: light sensor only, temperature set 17 */
1516         { .accelerometer = 0, .light = 0, .temperature_set = 17 },
1517 /* MacBook Pro 2,2: accelerometer, backlight and temperature set 18 */
1518         { .accelerometer = 1, .light = 1, .temperature_set = 18 },
1519 /* MacBook Pro 5,3: accelerometer, backlight and temperature set 19 */
1520         { .accelerometer = 1, .light = 1, .temperature_set = 19 },
1521 /* MacBook Pro 5,4: accelerometer, backlight and temperature set 20 */
1522         { .accelerometer = 1, .light = 1, .temperature_set = 20 },
1523 /* MacBook Pro 6,2: accelerometer, backlight and temperature set 21 */
1524         { .accelerometer = 1, .light = 1, .temperature_set = 21 },
1525 /* MacBook Pro 7,1: accelerometer, backlight and temperature set 22 */
1526         { .accelerometer = 1, .light = 1, .temperature_set = 22 },
1527 };
1528
1529 /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
1530  * So we need to put "Apple MacBook Pro" before "Apple MacBook". */
1531 static __initdata struct dmi_system_id applesmc_whitelist[] = {
1532         { applesmc_dmi_match, "Apple MacBook Air 2", {
1533           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1534           DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir2") },
1535                 &applesmc_dmi_data[15]},
1536         { applesmc_dmi_match, "Apple MacBook Air", {
1537           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1538           DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir") },
1539                 &applesmc_dmi_data[7]},
1540         { applesmc_dmi_match, "Apple MacBook Pro 7", {
1541           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1542           DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro7") },
1543                 &applesmc_dmi_data[22]},
1544         { applesmc_dmi_match, "Apple MacBook Pro 5,4", {
1545           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1546           DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,4") },
1547                 &applesmc_dmi_data[20]},
1548         { applesmc_dmi_match, "Apple MacBook Pro 5,3", {
1549           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1550           DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,3") },
1551                 &applesmc_dmi_data[19]},
1552         { applesmc_dmi_match, "Apple MacBook Pro 6", {
1553           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1554           DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro6") },
1555                 &applesmc_dmi_data[21]},
1556         { applesmc_dmi_match, "Apple MacBook Pro 5", {
1557           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1558           DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5") },
1559                 &applesmc_dmi_data[12]},
1560         { applesmc_dmi_match, "Apple MacBook Pro 4", {
1561           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1562           DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro4") },
1563                 &applesmc_dmi_data[8]},
1564         { applesmc_dmi_match, "Apple MacBook Pro 3", {
1565           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1566           DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3") },
1567                 &applesmc_dmi_data[9]},
1568         { applesmc_dmi_match, "Apple MacBook Pro 2,2", {
1569           DMI_MATCH(DMI_BOARD_VENDOR, "Apple Computer, Inc."),
1570           DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2") },
1571                 &applesmc_dmi_data[18]},
1572         { applesmc_dmi_match, "Apple MacBook Pro", {
1573           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1574           DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") },
1575                 &applesmc_dmi_data[0]},
1576         { applesmc_dmi_match, "Apple MacBook (v2)", {
1577           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1578           DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") },
1579                 &applesmc_dmi_data[1]},
1580         { applesmc_dmi_match, "Apple MacBook (v3)", {
1581           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1582           DMI_MATCH(DMI_PRODUCT_NAME,"MacBook3") },
1583                 &applesmc_dmi_data[6]},
1584         { applesmc_dmi_match, "Apple MacBook 4", {
1585           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1586           DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4") },
1587                 &applesmc_dmi_data[6]},
1588         { applesmc_dmi_match, "Apple MacBook 5", {
1589           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1590           DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5") },
1591                 &applesmc_dmi_data[11]},
1592         { applesmc_dmi_match, "Apple MacBook", {
1593           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1594           DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") },
1595                 &applesmc_dmi_data[2]},
1596         { applesmc_dmi_match, "Apple Macmini", {
1597           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1598           DMI_MATCH(DMI_PRODUCT_NAME,"Macmini") },
1599                 &applesmc_dmi_data[3]},
1600         { applesmc_dmi_match, "Apple MacPro2", {
1601           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1602           DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") },
1603                 &applesmc_dmi_data[4]},
1604         { applesmc_dmi_match, "Apple MacPro3", {
1605           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1606           DMI_MATCH(DMI_PRODUCT_NAME, "MacPro3") },
1607                 &applesmc_dmi_data[16]},
1608         { applesmc_dmi_match, "Apple MacPro", {
1609           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1610           DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") },
1611                 &applesmc_dmi_data[4]},
1612         { applesmc_dmi_match, "Apple iMac 9,1", {
1613           DMI_MATCH(DMI_BOARD_VENDOR, "Apple Inc."),
1614           DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1") },
1615                 &applesmc_dmi_data[17]},
1616         { applesmc_dmi_match, "Apple iMac 8", {
1617           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1618           DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") },
1619                 &applesmc_dmi_data[13]},
1620         { applesmc_dmi_match, "Apple iMac 6", {
1621           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1622           DMI_MATCH(DMI_PRODUCT_NAME, "iMac6") },
1623                 &applesmc_dmi_data[14]},
1624         { applesmc_dmi_match, "Apple iMac 5", {
1625           DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1626           DMI_MATCH(DMI_PRODUCT_NAME, "iMac5") },
1627                 &applesmc_dmi_data[10]},
1628         { applesmc_dmi_match, "Apple iMac", {
1629           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1630           DMI_MATCH(DMI_PRODUCT_NAME,"iMac") },
1631                 &applesmc_dmi_data[5]},
1632         { .ident = NULL }
1633 };
1634
1635 static int __init applesmc_init(void)
1636 {
1637         int ret;
1638         int count;
1639         int i;
1640
1641         if (!dmi_check_system(applesmc_whitelist)) {
1642                 printk(KERN_WARNING "applesmc: supported laptop not found!\n");
1643                 ret = -ENODEV;
1644                 goto out;
1645         }
1646
1647         if (!request_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS,
1648                                                                 "applesmc")) {
1649                 ret = -ENXIO;
1650                 goto out;
1651         }
1652
1653         ret = platform_driver_register(&applesmc_driver);
1654         if (ret)
1655                 goto out_region;
1656
1657         pdev = platform_device_register_simple("applesmc", APPLESMC_DATA_PORT,
1658                                                NULL, 0);
1659         if (IS_ERR(pdev)) {
1660                 ret = PTR_ERR(pdev);
1661                 goto out_driver;
1662         }
1663
1664         ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_name.attr);
1665         if (ret)
1666                 goto out_device;
1667
1668         /* Create key enumeration sysfs files */
1669         ret = sysfs_create_group(&pdev->dev.kobj, &key_enumeration_group);
1670         if (ret)
1671                 goto out_name;
1672
1673         /* create fan files */
1674         count = applesmc_get_fan_count();
1675         if (count < 0)
1676                 printk(KERN_ERR "applesmc: Cannot get the number of fans.\n");
1677         else
1678                 printk(KERN_INFO "applesmc: %d fans found.\n", count);
1679
1680         if (count > 4) {
1681                 count = 4;
1682                 printk(KERN_WARNING "applesmc: More than 4 fans found,"
1683                        " but at most 4 fans are supported"
1684                        " by the driver.\n");
1685         }
1686
1687         while (fans_handled < count) {
1688                 ret = sysfs_create_group(&pdev->dev.kobj,
1689                                          &fan_attribute_groups[fans_handled]);
1690                 if (ret)
1691                         goto out_fans;
1692                 fans_handled++;
1693         }
1694
1695         for (i = 0;
1696              temperature_sensors_sets[applesmc_temperature_set][i] != NULL;
1697              i++) {
1698                 if (temperature_attributes[i] == NULL ||
1699                     label_attributes[i] == NULL) {
1700                         printk(KERN_ERR "applesmc: More temperature sensors "
1701                                 "in temperature_sensors_sets (at least %i)"
1702                                 "than available sysfs files in "
1703                                 "temperature_attributes (%i), please report "
1704                                 "this bug.\n", i, i-1);
1705                         goto out_temperature;
1706                 }
1707                 ret = sysfs_create_file(&pdev->dev.kobj,
1708                                                 temperature_attributes[i]);
1709                 if (ret)
1710                         goto out_temperature;
1711                 ret = sysfs_create_file(&pdev->dev.kobj,
1712                                                 label_attributes[i]);
1713                 if (ret)
1714                         goto out_temperature;
1715         }
1716
1717         if (applesmc_accelerometer) {
1718                 ret = applesmc_create_accelerometer();
1719                 if (ret)
1720                         goto out_temperature;
1721         }
1722
1723         if (applesmc_light) {
1724                 /* Add light sensor file */
1725                 ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_light.attr);
1726                 if (ret)
1727                         goto out_accelerometer;
1728
1729                 /* Create the workqueue */
1730                 applesmc_led_wq = create_singlethread_workqueue("applesmc-led");
1731                 if (!applesmc_led_wq) {
1732                         ret = -ENOMEM;
1733                         goto out_light_sysfs;
1734                 }
1735
1736                 /* register as a led device */
1737                 ret = led_classdev_register(&pdev->dev, &applesmc_backlight);
1738                 if (ret < 0)
1739                         goto out_light_wq;
1740         }
1741
1742         hwmon_dev = hwmon_device_register(&pdev->dev);
1743         if (IS_ERR(hwmon_dev)) {
1744                 ret = PTR_ERR(hwmon_dev);
1745                 goto out_light_ledclass;
1746         }
1747
1748         printk(KERN_INFO "applesmc: driver successfully loaded.\n");
1749
1750         return 0;
1751
1752 out_light_ledclass:
1753         if (applesmc_light)
1754                 led_classdev_unregister(&applesmc_backlight);
1755 out_light_wq:
1756         if (applesmc_light)
1757                 destroy_workqueue(applesmc_led_wq);
1758 out_light_sysfs:
1759         if (applesmc_light)
1760                 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
1761 out_accelerometer:
1762         if (applesmc_accelerometer)
1763                 applesmc_release_accelerometer();
1764 out_temperature:
1765         sysfs_remove_group(&pdev->dev.kobj, &label_attributes_group);
1766         sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group);
1767 out_fans:
1768         while (fans_handled)
1769                 sysfs_remove_group(&pdev->dev.kobj,
1770                                    &fan_attribute_groups[--fans_handled]);
1771         sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
1772 out_name:
1773         sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
1774 out_device:
1775         platform_device_unregister(pdev);
1776 out_driver:
1777         platform_driver_unregister(&applesmc_driver);
1778 out_region:
1779         release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
1780 out:
1781         printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
1782         return ret;
1783 }
1784
1785 static void __exit applesmc_exit(void)
1786 {
1787         hwmon_device_unregister(hwmon_dev);
1788         if (applesmc_light) {
1789                 led_classdev_unregister(&applesmc_backlight);
1790                 destroy_workqueue(applesmc_led_wq);
1791                 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
1792         }
1793         if (applesmc_accelerometer)
1794                 applesmc_release_accelerometer();
1795         sysfs_remove_group(&pdev->dev.kobj, &label_attributes_group);
1796         sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group);
1797         while (fans_handled)
1798                 sysfs_remove_group(&pdev->dev.kobj,
1799                                    &fan_attribute_groups[--fans_handled]);
1800         sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
1801         sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
1802         platform_device_unregister(pdev);
1803         platform_driver_unregister(&applesmc_driver);
1804         release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
1805
1806         printk(KERN_INFO "applesmc: driver unloaded.\n");
1807 }
1808
1809 module_init(applesmc_init);
1810 module_exit(applesmc_exit);
1811
1812 MODULE_AUTHOR("Nicolas Boichat");
1813 MODULE_DESCRIPTION("Apple SMC");
1814 MODULE_LICENSE("GPL v2");
1815 MODULE_DEVICE_TABLE(dmi, applesmc_whitelist);