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