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