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