2  * drivers/hwmon/applesmc.c - driver for Apple's SMC (accelerometer, temperature
 
   3  * sensors, fan control, keyboard backlight control) used in Intel-based Apple
 
   6  * Copyright (C) 2007 Nicolas Boichat <nicolas@boichat.ch>
 
   8  * Based on hdaps.c driver:
 
   9  * Copyright (C) 2005 Robert Love <rml@novell.com>
 
  10  * Copyright (C) 2005 Jesper Juhl <jesper.juhl@gmail.com>
 
  12  * Fan control based on smcFanControl:
 
  13  * Copyright (C) 2006 Hendrik Holtmann <holtmann@mac.com>
 
  15  * This program is free software; you can redistribute it and/or modify it
 
  16  * under the terms of the GNU General Public License v2 as published by the
 
  17  * Free Software Foundation.
 
  19  * This program is distributed in the hope that it will be useful, but WITHOUT
 
  20  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 
  21  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 
  24  * You should have received a copy of the GNU General Public License along with
 
  25  * this program; if not, write to the Free Software Foundation, Inc.,
 
  26  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 
  29 #include <linux/delay.h>
 
  30 #include <linux/platform_device.h>
 
  31 #include <linux/input-polldev.h>
 
  32 #include <linux/kernel.h>
 
  33 #include <linux/module.h>
 
  34 #include <linux/timer.h>
 
  35 #include <linux/dmi.h>
 
  36 #include <linux/mutex.h>
 
  37 #include <linux/hwmon-sysfs.h>
 
  39 #include <linux/leds.h>
 
  40 #include <linux/hwmon.h>
 
  41 #include <linux/workqueue.h>
 
  43 /* data port used by Apple SMC */
 
  44 #define APPLESMC_DATA_PORT      0x300
 
  45 /* command/status port used by Apple SMC */
 
  46 #define APPLESMC_CMD_PORT       0x304
 
  48 #define APPLESMC_NR_PORTS       32 /* 0x300-0x31f */
 
  50 #define APPLESMC_MAX_DATA_LENGTH 32
 
  52 #define APPLESMC_STATUS_MASK    0x0f
 
  53 #define APPLESMC_READ_CMD       0x10
 
  54 #define APPLESMC_WRITE_CMD      0x11
 
  55 #define APPLESMC_GET_KEY_BY_INDEX_CMD   0x12
 
  56 #define APPLESMC_GET_KEY_TYPE_CMD       0x13
 
  58 #define KEY_COUNT_KEY           "#KEY" /* r-o ui32 */
 
  60 #define LIGHT_SENSOR_LEFT_KEY   "ALV0" /* r-o {alv (6 bytes) */
 
  61 #define LIGHT_SENSOR_RIGHT_KEY  "ALV1" /* r-o {alv (6 bytes) */
 
  62 #define BACKLIGHT_KEY           "LKSB" /* w-o {lkb (2 bytes) */
 
  64 #define CLAMSHELL_KEY           "MSLD" /* r-o ui8 (unused) */
 
  66 #define MOTION_SENSOR_X_KEY     "MO_X" /* r-o sp78 (2 bytes) */
 
  67 #define MOTION_SENSOR_Y_KEY     "MO_Y" /* r-o sp78 (2 bytes) */
 
  68 #define MOTION_SENSOR_Z_KEY     "MO_Z" /* r-o sp78 (2 bytes) */
 
  69 #define MOTION_SENSOR_KEY       "MOCN" /* r/w ui16 */
 
  71 #define FANS_COUNT              "FNum" /* r-o ui8 */
 
  72 #define FANS_MANUAL             "FS! " /* r-w ui16 */
 
  73 #define FAN_ACTUAL_SPEED        "F0Ac" /* r-o fpe2 (2 bytes) */
 
  74 #define FAN_MIN_SPEED           "F0Mn" /* r-o fpe2 (2 bytes) */
 
  75 #define FAN_MAX_SPEED           "F0Mx" /* r-o fpe2 (2 bytes) */
 
  76 #define FAN_SAFE_SPEED          "F0Sf" /* r-o fpe2 (2 bytes) */
 
  77 #define FAN_TARGET_SPEED        "F0Tg" /* r-w fpe2 (2 bytes) */
 
  78 #define FAN_POSITION            "F0ID" /* r-o char[16] */
 
  81  * Temperature sensors keys (sp78 - 2 bytes).
 
  83 static const char* temperature_sensors_sets[][36] = {
 
  84 /* Set 0: Macbook Pro */
 
  85         { "TA0P", "TB0T", "TC0D", "TC0P", "TG0H", "TG0P", "TG0T", "Th0H",
 
  86           "Th1H", "Tm0P", "Ts0P", "Ts1P", NULL },
 
  87 /* Set 1: Macbook2 set */
 
  88         { "TB0T", "TC0D", "TC0P", "TM0P", "TN0P", "TN1P", "TTF0", "Th0H",
 
  89           "Th0S", "Th1H", NULL },
 
  90 /* Set 2: Macbook set */
 
  91         { "TB0T", "TC0D", "TC0P", "TM0P", "TN0P", "TN1P", "Th0H", "Th0S",
 
  92           "Th1H", "Ts0P", NULL },
 
  93 /* Set 3: Macmini set */
 
  94         { "TC0D", "TC0P", NULL },
 
  95 /* Set 4: Mac Pro (2 x Quad-Core) */
 
  96         { "TA0P", "TCAG", "TCAH", "TCBG", "TCBH", "TC0C", "TC0D", "TC0P",
 
  97           "TC1C", "TC1D", "TC2C", "TC2D", "TC3C", "TC3D", "THTG", "TH0P",
 
  98           "TH1P", "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S",
 
  99           "TM1P", "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P",
 
 100           "TM9S", "TN0H", "TS0C", NULL },
 
 102         { "TC0D", "TA0P", "TG0P", "TG0D", "TG0H", "TH0P", "Tm0P", "TO0P",
 
 104 /* Set 6: Macbook3 set */
 
 105         { "TB0T", "TC0D", "TC0P", "TM0P", "TN0P", "TTF0", "TW0P", "Th0H",
 
 106           "Th0S", "Th1H", NULL },
 
 109 /* List of keys used to read/write fan speeds */
 
 110 static const char* fan_speed_keys[] = {
 
 118 #define INIT_TIMEOUT_MSECS      5000    /* wait up to 5s for device init ... */
 
 119 #define INIT_WAIT_MSECS         50      /* ... in 50ms increments */
 
 121 #define APPLESMC_POLL_INTERVAL  50      /* msecs */
 
 122 #define APPLESMC_INPUT_FUZZ     4       /* input event threshold */
 
 123 #define APPLESMC_INPUT_FLAT     4
 
 129 /* Structure to be passed to DMI_MATCH function */
 
 130 struct dmi_match_data {
 
 131 /* Indicates whether this computer has an accelerometer. */
 
 133 /* Indicates whether this computer has light sensors and keyboard backlight. */
 
 135 /* Indicates which temperature sensors set to use. */
 
 139 static const int debug;
 
 140 static struct platform_device *pdev;
 
 143 static struct device *hwmon_dev;
 
 144 static struct input_polled_dev *applesmc_idev;
 
 146 /* Indicates whether this computer has an accelerometer. */
 
 147 static unsigned int applesmc_accelerometer;
 
 149 /* Indicates whether this computer has light sensors and keyboard backlight. */
 
 150 static unsigned int applesmc_light;
 
 152 /* Indicates which temperature sensors set to use. */
 
 153 static unsigned int applesmc_temperature_set;
 
 155 static DEFINE_MUTEX(applesmc_lock);
 
 158  * Last index written to key_at_index sysfs file, and value to use for all other
 
 159  * key_at_index_* sysfs files.
 
 161 static unsigned int key_at_index;
 
 163 static struct workqueue_struct *applesmc_led_wq;
 
 166  * __wait_status - Wait up to 2ms for the status port to get a certain value
 
 167  * (masked with 0x0f), returning zero if the value is obtained.  Callers must
 
 168  * hold applesmc_lock.
 
 170 static int __wait_status(u8 val)
 
 174         val = val & APPLESMC_STATUS_MASK;
 
 176         for (i = 0; i < 200; i++) {
 
 177                 if ((inb(APPLESMC_CMD_PORT) & APPLESMC_STATUS_MASK) == val) {
 
 180                                                 "Waited %d us for status %x\n",
 
 187         printk(KERN_WARNING "applesmc: wait status failed: %x != %x\n",
 
 188                                                 val, inb(APPLESMC_CMD_PORT));
 
 194  * applesmc_read_key - reads len bytes from a given key, and put them in buffer.
 
 195  * Returns zero on success or a negative error on failure. Callers must
 
 196  * hold applesmc_lock.
 
 198 static int applesmc_read_key(const char* key, u8* buffer, u8 len)
 
 202         if (len > APPLESMC_MAX_DATA_LENGTH) {
 
 203                 printk(KERN_ERR "applesmc_read_key: cannot read more than "
 
 204                                         "%d bytes\n", APPLESMC_MAX_DATA_LENGTH);
 
 208         outb(APPLESMC_READ_CMD, APPLESMC_CMD_PORT);
 
 209         if (__wait_status(0x0c))
 
 212         for (i = 0; i < 4; i++) {
 
 213                 outb(key[i], APPLESMC_DATA_PORT);
 
 214                 if (__wait_status(0x04))
 
 218                 printk(KERN_DEBUG "<%s", key);
 
 220         outb(len, APPLESMC_DATA_PORT);
 
 222                 printk(KERN_DEBUG ">%x", len);
 
 224         for (i = 0; i < len; i++) {
 
 225                 if (__wait_status(0x05))
 
 227                 buffer[i] = inb(APPLESMC_DATA_PORT);
 
 229                         printk(KERN_DEBUG "<%x", buffer[i]);
 
 232                 printk(KERN_DEBUG "\n");
 
 238  * applesmc_write_key - writes len bytes from buffer to a given key.
 
 239  * Returns zero on success or a negative error on failure. Callers must
 
 240  * hold applesmc_lock.
 
 242 static int applesmc_write_key(const char* key, u8* buffer, u8 len)
 
 246         if (len > APPLESMC_MAX_DATA_LENGTH) {
 
 247                 printk(KERN_ERR "applesmc_write_key: cannot write more than "
 
 248                                         "%d bytes\n", APPLESMC_MAX_DATA_LENGTH);
 
 252         outb(APPLESMC_WRITE_CMD, APPLESMC_CMD_PORT);
 
 253         if (__wait_status(0x0c))
 
 256         for (i = 0; i < 4; i++) {
 
 257                 outb(key[i], APPLESMC_DATA_PORT);
 
 258                 if (__wait_status(0x04))
 
 262         outb(len, APPLESMC_DATA_PORT);
 
 264         for (i = 0; i < len; i++) {
 
 265                 if (__wait_status(0x04))
 
 267                 outb(buffer[i], APPLESMC_DATA_PORT);
 
 274  * applesmc_get_key_at_index - get key at index, and put the result in key
 
 275  * (char[6]). Returns zero on success or a negative error on failure. Callers
 
 276  * must hold applesmc_lock.
 
 278 static int applesmc_get_key_at_index(int index, char* key)
 
 282         readkey[0] = index >> 24;
 
 283         readkey[1] = index >> 16;
 
 284         readkey[2] = index >> 8;
 
 287         outb(APPLESMC_GET_KEY_BY_INDEX_CMD, APPLESMC_CMD_PORT);
 
 288         if (__wait_status(0x0c))
 
 291         for (i = 0; i < 4; i++) {
 
 292                 outb(readkey[i], APPLESMC_DATA_PORT);
 
 293                 if (__wait_status(0x04))
 
 297         outb(4, APPLESMC_DATA_PORT);
 
 299         for (i = 0; i < 4; i++) {
 
 300                 if (__wait_status(0x05))
 
 302                 key[i] = inb(APPLESMC_DATA_PORT);
 
 310  * applesmc_get_key_type - get key type, and put the result in type (char[6]).
 
 311  * Returns zero on success or a negative error on failure. Callers must
 
 312  * hold applesmc_lock.
 
 314 static int applesmc_get_key_type(char* key, char* type)
 
 318         outb(APPLESMC_GET_KEY_TYPE_CMD, APPLESMC_CMD_PORT);
 
 319         if (__wait_status(0x0c))
 
 322         for (i = 0; i < 4; i++) {
 
 323                 outb(key[i], APPLESMC_DATA_PORT);
 
 324                 if (__wait_status(0x04))
 
 328         outb(5, APPLESMC_DATA_PORT);
 
 330         for (i = 0; i < 6; i++) {
 
 331                 if (__wait_status(0x05))
 
 333                 type[i] = inb(APPLESMC_DATA_PORT);
 
 341  * applesmc_read_motion_sensor - Read motion sensor (X, Y or Z). Callers must
 
 342  * hold applesmc_lock.
 
 344 static int applesmc_read_motion_sensor(int index, s16* value)
 
 351                 ret = applesmc_read_key(MOTION_SENSOR_X_KEY, buffer, 2);
 
 354                 ret = applesmc_read_key(MOTION_SENSOR_Y_KEY, buffer, 2);
 
 357                 ret = applesmc_read_key(MOTION_SENSOR_Z_KEY, buffer, 2);
 
 363         *value = ((s16)buffer[0] << 8) | buffer[1];
 
 369  * applesmc_device_init - initialize the accelerometer.  Returns zero on success
 
 370  * and negative error code on failure.  Can sleep.
 
 372 static int applesmc_device_init(void)
 
 374         int total, ret = -ENXIO;
 
 377         if (!applesmc_accelerometer)
 
 380         mutex_lock(&applesmc_lock);
 
 382         for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) {
 
 384                         printk(KERN_DEBUG "applesmc try %d\n", total);
 
 385                 if (!applesmc_read_key(MOTION_SENSOR_KEY, buffer, 2) &&
 
 386                                 (buffer[0] != 0x00 || buffer[1] != 0x00)) {
 
 387                         if (total == INIT_TIMEOUT_MSECS) {
 
 388                                 printk(KERN_DEBUG "applesmc: device has"
 
 389                                                 " already been initialized"
 
 390                                                 " (0x%02x, 0x%02x).\n",
 
 391                                                 buffer[0], buffer[1]);
 
 393                                 printk(KERN_DEBUG "applesmc: device"
 
 394                                                 " successfully initialized"
 
 395                                                 " (0x%02x, 0x%02x).\n",
 
 396                                                 buffer[0], buffer[1]);
 
 403                 applesmc_write_key(MOTION_SENSOR_KEY, buffer, 2);
 
 404                 msleep(INIT_WAIT_MSECS);
 
 407         printk(KERN_WARNING "applesmc: failed to init the device\n");
 
 410         mutex_unlock(&applesmc_lock);
 
 415  * applesmc_get_fan_count - get the number of fans. Callers must NOT hold
 
 418 static int applesmc_get_fan_count(void)
 
 423         mutex_lock(&applesmc_lock);
 
 425         ret = applesmc_read_key(FANS_COUNT, buffer, 1);
 
 427         mutex_unlock(&applesmc_lock);
 
 434 /* Device model stuff */
 
 435 static int applesmc_probe(struct platform_device *dev)
 
 439         ret = applesmc_device_init();
 
 443         printk(KERN_INFO "applesmc: device successfully initialized.\n");
 
 447 static int applesmc_resume(struct platform_device *dev)
 
 449         return applesmc_device_init();
 
 452 static struct platform_driver applesmc_driver = {
 
 453         .probe = applesmc_probe,
 
 454         .resume = applesmc_resume,
 
 457                 .owner = THIS_MODULE,
 
 462  * applesmc_calibrate - Set our "resting" values.  Callers must
 
 463  * hold applesmc_lock.
 
 465 static void applesmc_calibrate(void)
 
 467         applesmc_read_motion_sensor(SENSOR_X, &rest_x);
 
 468         applesmc_read_motion_sensor(SENSOR_Y, &rest_y);
 
 472 static void applesmc_idev_poll(struct input_polled_dev *dev)
 
 474         struct input_dev *idev = dev->input;
 
 477         mutex_lock(&applesmc_lock);
 
 479         if (applesmc_read_motion_sensor(SENSOR_X, &x))
 
 481         if (applesmc_read_motion_sensor(SENSOR_Y, &y))
 
 485         input_report_abs(idev, ABS_X, x - rest_x);
 
 486         input_report_abs(idev, ABS_Y, y - rest_y);
 
 490         mutex_unlock(&applesmc_lock);
 
 495 static ssize_t applesmc_name_show(struct device *dev,
 
 496                                    struct device_attribute *attr, char *buf)
 
 498         return snprintf(buf, PAGE_SIZE, "applesmc\n");
 
 501 static ssize_t applesmc_position_show(struct device *dev,
 
 502                                    struct device_attribute *attr, char *buf)
 
 507         mutex_lock(&applesmc_lock);
 
 509         ret = applesmc_read_motion_sensor(SENSOR_X, &x);
 
 512         ret = applesmc_read_motion_sensor(SENSOR_Y, &y);
 
 515         ret = applesmc_read_motion_sensor(SENSOR_Z, &z);
 
 520         mutex_unlock(&applesmc_lock);
 
 524                 return snprintf(buf, PAGE_SIZE, "(%d,%d,%d)\n", x, y, z);
 
 527 static ssize_t applesmc_light_show(struct device *dev,
 
 528                                 struct device_attribute *attr, char *sysfsbuf)
 
 531         u8 left = 0, right = 0;
 
 534         mutex_lock(&applesmc_lock);
 
 536         ret = applesmc_read_key(LIGHT_SENSOR_LEFT_KEY, buffer, 6);
 
 540         ret = applesmc_read_key(LIGHT_SENSOR_RIGHT_KEY, buffer, 6);
 
 544         mutex_unlock(&applesmc_lock);
 
 548                 return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", left, right);
 
 551 /* Displays degree Celsius * 1000 */
 
 552 static ssize_t applesmc_show_temperature(struct device *dev,
 
 553                         struct device_attribute *devattr, char *sysfsbuf)
 
 558         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 560                 temperature_sensors_sets[applesmc_temperature_set][attr->index];
 
 562         mutex_lock(&applesmc_lock);
 
 564         ret = applesmc_read_key(key, buffer, 2);
 
 565         temp = buffer[0]*1000;
 
 566         temp += (buffer[1] >> 6) * 250;
 
 568         mutex_unlock(&applesmc_lock);
 
 573                 return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", temp);
 
 576 static ssize_t applesmc_show_fan_speed(struct device *dev,
 
 577                                 struct device_attribute *attr, char *sysfsbuf)
 
 580         unsigned int speed = 0;
 
 583         struct sensor_device_attribute_2 *sensor_attr =
 
 584                                                 to_sensor_dev_attr_2(attr);
 
 586         newkey[0] = fan_speed_keys[sensor_attr->nr][0];
 
 587         newkey[1] = '0' + sensor_attr->index;
 
 588         newkey[2] = fan_speed_keys[sensor_attr->nr][2];
 
 589         newkey[3] = fan_speed_keys[sensor_attr->nr][3];
 
 592         mutex_lock(&applesmc_lock);
 
 594         ret = applesmc_read_key(newkey, buffer, 2);
 
 595         speed = ((buffer[0] << 8 | buffer[1]) >> 2);
 
 597         mutex_unlock(&applesmc_lock);
 
 601                 return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", speed);
 
 604 static ssize_t applesmc_store_fan_speed(struct device *dev,
 
 605                                         struct device_attribute *attr,
 
 606                                         const char *sysfsbuf, size_t count)
 
 612         struct sensor_device_attribute_2 *sensor_attr =
 
 613                                                 to_sensor_dev_attr_2(attr);
 
 615         speed = simple_strtoul(sysfsbuf, NULL, 10);
 
 617         if (speed > 0x4000) /* Bigger than a 14-bit value */
 
 620         newkey[0] = fan_speed_keys[sensor_attr->nr][0];
 
 621         newkey[1] = '0' + sensor_attr->index;
 
 622         newkey[2] = fan_speed_keys[sensor_attr->nr][2];
 
 623         newkey[3] = fan_speed_keys[sensor_attr->nr][3];
 
 626         mutex_lock(&applesmc_lock);
 
 628         buffer[0] = (speed >> 6) & 0xff;
 
 629         buffer[1] = (speed << 2) & 0xff;
 
 630         ret = applesmc_write_key(newkey, buffer, 2);
 
 632         mutex_unlock(&applesmc_lock);
 
 639 static ssize_t applesmc_show_fan_manual(struct device *dev,
 
 640                         struct device_attribute *devattr, char *sysfsbuf)
 
 645         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 647         mutex_lock(&applesmc_lock);
 
 649         ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
 
 650         manual = ((buffer[0] << 8 | buffer[1]) >> attr->index) & 0x01;
 
 652         mutex_unlock(&applesmc_lock);
 
 656                 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", manual);
 
 659 static ssize_t applesmc_store_fan_manual(struct device *dev,
 
 660                                          struct device_attribute *devattr,
 
 661                                          const char *sysfsbuf, size_t count)
 
 667         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 669         input = simple_strtoul(sysfsbuf, NULL, 10);
 
 671         mutex_lock(&applesmc_lock);
 
 673         ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
 
 674         val = (buffer[0] << 8 | buffer[1]);
 
 679                 val = val | (0x01 << attr->index);
 
 681                 val = val & ~(0x01 << attr->index);
 
 683         buffer[0] = (val >> 8) & 0xFF;
 
 684         buffer[1] = val & 0xFF;
 
 686         ret = applesmc_write_key(FANS_MANUAL, buffer, 2);
 
 689         mutex_unlock(&applesmc_lock);
 
 696 static ssize_t applesmc_show_fan_position(struct device *dev,
 
 697                                 struct device_attribute *attr, char *sysfsbuf)
 
 702         struct sensor_device_attribute_2 *sensor_attr =
 
 703                                                 to_sensor_dev_attr_2(attr);
 
 705         newkey[0] = FAN_POSITION[0];
 
 706         newkey[1] = '0' + sensor_attr->index;
 
 707         newkey[2] = FAN_POSITION[2];
 
 708         newkey[3] = FAN_POSITION[3];
 
 711         mutex_lock(&applesmc_lock);
 
 713         ret = applesmc_read_key(newkey, buffer, 16);
 
 716         mutex_unlock(&applesmc_lock);
 
 720                 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", buffer+4);
 
 723 static ssize_t applesmc_calibrate_show(struct device *dev,
 
 724                                 struct device_attribute *attr, char *sysfsbuf)
 
 726         return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", rest_x, rest_y);
 
 729 static ssize_t applesmc_calibrate_store(struct device *dev,
 
 730         struct device_attribute *attr, const char *sysfsbuf, size_t count)
 
 732         mutex_lock(&applesmc_lock);
 
 733         applesmc_calibrate();
 
 734         mutex_unlock(&applesmc_lock);
 
 739 /* Store the next backlight value to be written by the work */
 
 740 static unsigned int backlight_value;
 
 742 static void applesmc_backlight_set(struct work_struct *work)
 
 746         mutex_lock(&applesmc_lock);
 
 747         buffer[0] = backlight_value;
 
 749         applesmc_write_key(BACKLIGHT_KEY, buffer, 2);
 
 750         mutex_unlock(&applesmc_lock);
 
 752 static DECLARE_WORK(backlight_work, &applesmc_backlight_set);
 
 754 static void applesmc_brightness_set(struct led_classdev *led_cdev,
 
 755                                                 enum led_brightness value)
 
 759         backlight_value = value;
 
 760         ret = queue_work(applesmc_led_wq, &backlight_work);
 
 763                 printk(KERN_DEBUG "applesmc: work was already on the queue.\n");
 
 766 static ssize_t applesmc_key_count_show(struct device *dev,
 
 767                                 struct device_attribute *attr, char *sysfsbuf)
 
 773         mutex_lock(&applesmc_lock);
 
 775         ret = applesmc_read_key(KEY_COUNT_KEY, buffer, 4);
 
 776         count = ((u32)buffer[0]<<24) + ((u32)buffer[1]<<16) +
 
 777                                                 ((u32)buffer[2]<<8) + buffer[3];
 
 779         mutex_unlock(&applesmc_lock);
 
 783                 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", count);
 
 786 static ssize_t applesmc_key_at_index_read_show(struct device *dev,
 
 787                                 struct device_attribute *attr, char *sysfsbuf)
 
 793         mutex_lock(&applesmc_lock);
 
 795         ret = applesmc_get_key_at_index(key_at_index, key);
 
 797         if (ret || !key[0]) {
 
 798                 mutex_unlock(&applesmc_lock);
 
 803         ret = applesmc_get_key_type(key, info);
 
 806                 mutex_unlock(&applesmc_lock);
 
 812          * info[0] maximum value (APPLESMC_MAX_DATA_LENGTH) is much lower than
 
 813          * PAGE_SIZE, so we don't need any checks before writing to sysfsbuf.
 
 815         ret = applesmc_read_key(key, sysfsbuf, info[0]);
 
 817         mutex_unlock(&applesmc_lock);
 
 826 static ssize_t applesmc_key_at_index_data_length_show(struct device *dev,
 
 827                                 struct device_attribute *attr, char *sysfsbuf)
 
 833         mutex_lock(&applesmc_lock);
 
 835         ret = applesmc_get_key_at_index(key_at_index, key);
 
 837         if (ret || !key[0]) {
 
 838                 mutex_unlock(&applesmc_lock);
 
 843         ret = applesmc_get_key_type(key, info);
 
 845         mutex_unlock(&applesmc_lock);
 
 848                 return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", info[0]);
 
 853 static ssize_t applesmc_key_at_index_type_show(struct device *dev,
 
 854                                 struct device_attribute *attr, char *sysfsbuf)
 
 860         mutex_lock(&applesmc_lock);
 
 862         ret = applesmc_get_key_at_index(key_at_index, key);
 
 864         if (ret || !key[0]) {
 
 865                 mutex_unlock(&applesmc_lock);
 
 870         ret = applesmc_get_key_type(key, info);
 
 872         mutex_unlock(&applesmc_lock);
 
 875                 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", info+1);
 
 880 static ssize_t applesmc_key_at_index_name_show(struct device *dev,
 
 881                                 struct device_attribute *attr, char *sysfsbuf)
 
 886         mutex_lock(&applesmc_lock);
 
 888         ret = applesmc_get_key_at_index(key_at_index, key);
 
 890         mutex_unlock(&applesmc_lock);
 
 893                 return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", key);
 
 898 static ssize_t applesmc_key_at_index_show(struct device *dev,
 
 899                                 struct device_attribute *attr, char *sysfsbuf)
 
 901         return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", key_at_index);
 
 904 static ssize_t applesmc_key_at_index_store(struct device *dev,
 
 905         struct device_attribute *attr, const char *sysfsbuf, size_t count)
 
 907         mutex_lock(&applesmc_lock);
 
 909         key_at_index = simple_strtoul(sysfsbuf, NULL, 10);
 
 911         mutex_unlock(&applesmc_lock);
 
 916 static struct led_classdev applesmc_backlight = {
 
 917         .name                   = "smc::kbd_backlight",
 
 918         .default_trigger        = "nand-disk",
 
 919         .brightness_set         = applesmc_brightness_set,
 
 922 static DEVICE_ATTR(name, 0444, applesmc_name_show, NULL);
 
 924 static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL);
 
 925 static DEVICE_ATTR(calibrate, 0644,
 
 926                         applesmc_calibrate_show, applesmc_calibrate_store);
 
 928 static struct attribute *accelerometer_attributes[] = {
 
 929         &dev_attr_position.attr,
 
 930         &dev_attr_calibrate.attr,
 
 934 static const struct attribute_group accelerometer_attributes_group =
 
 935         { .attrs = accelerometer_attributes };
 
 937 static DEVICE_ATTR(light, 0444, applesmc_light_show, NULL);
 
 939 static DEVICE_ATTR(key_count, 0444, applesmc_key_count_show, NULL);
 
 940 static DEVICE_ATTR(key_at_index, 0644,
 
 941                 applesmc_key_at_index_show, applesmc_key_at_index_store);
 
 942 static DEVICE_ATTR(key_at_index_name, 0444,
 
 943                                         applesmc_key_at_index_name_show, NULL);
 
 944 static DEVICE_ATTR(key_at_index_type, 0444,
 
 945                                         applesmc_key_at_index_type_show, NULL);
 
 946 static DEVICE_ATTR(key_at_index_data_length, 0444,
 
 947                                 applesmc_key_at_index_data_length_show, NULL);
 
 948 static DEVICE_ATTR(key_at_index_data, 0444,
 
 949                                 applesmc_key_at_index_read_show, NULL);
 
 951 static struct attribute *key_enumeration_attributes[] = {
 
 952         &dev_attr_key_count.attr,
 
 953         &dev_attr_key_at_index.attr,
 
 954         &dev_attr_key_at_index_name.attr,
 
 955         &dev_attr_key_at_index_type.attr,
 
 956         &dev_attr_key_at_index_data_length.attr,
 
 957         &dev_attr_key_at_index_data.attr,
 
 961 static const struct attribute_group key_enumeration_group =
 
 962         { .attrs = key_enumeration_attributes };
 
 965  * Macro defining SENSOR_DEVICE_ATTR for a fan sysfs entries.
 
 966  *  - show actual speed
 
 967  *  - show/store minimum speed
 
 968  *  - show maximum speed
 
 970  *  - show/store target speed
 
 971  *  - show/store manual mode
 
 973 #define sysfs_fan_speeds_offset(offset) \
 
 974 static SENSOR_DEVICE_ATTR_2(fan##offset##_input, S_IRUGO, \
 
 975                         applesmc_show_fan_speed, NULL, 0, offset-1); \
 
 977 static SENSOR_DEVICE_ATTR_2(fan##offset##_min, S_IRUGO | S_IWUSR, \
 
 978         applesmc_show_fan_speed, applesmc_store_fan_speed, 1, offset-1); \
 
 980 static SENSOR_DEVICE_ATTR_2(fan##offset##_max, S_IRUGO, \
 
 981                         applesmc_show_fan_speed, NULL, 2, offset-1); \
 
 983 static SENSOR_DEVICE_ATTR_2(fan##offset##_safe, S_IRUGO, \
 
 984                         applesmc_show_fan_speed, NULL, 3, offset-1); \
 
 986 static SENSOR_DEVICE_ATTR_2(fan##offset##_output, S_IRUGO | S_IWUSR, \
 
 987         applesmc_show_fan_speed, applesmc_store_fan_speed, 4, offset-1); \
 
 989 static SENSOR_DEVICE_ATTR(fan##offset##_manual, S_IRUGO | S_IWUSR, \
 
 990         applesmc_show_fan_manual, applesmc_store_fan_manual, offset-1); \
 
 992 static SENSOR_DEVICE_ATTR(fan##offset##_label, S_IRUGO, \
 
 993         applesmc_show_fan_position, NULL, offset-1); \
 
 995 static struct attribute *fan##offset##_attributes[] = { \
 
 996         &sensor_dev_attr_fan##offset##_input.dev_attr.attr, \
 
 997         &sensor_dev_attr_fan##offset##_min.dev_attr.attr, \
 
 998         &sensor_dev_attr_fan##offset##_max.dev_attr.attr, \
 
 999         &sensor_dev_attr_fan##offset##_safe.dev_attr.attr, \
 
1000         &sensor_dev_attr_fan##offset##_output.dev_attr.attr, \
 
1001         &sensor_dev_attr_fan##offset##_manual.dev_attr.attr, \
 
1002         &sensor_dev_attr_fan##offset##_label.dev_attr.attr, \
 
1007  * Create the needed functions for each fan using the macro defined above
 
1008  * (4 fans are supported)
 
1010 sysfs_fan_speeds_offset(1);
 
1011 sysfs_fan_speeds_offset(2);
 
1012 sysfs_fan_speeds_offset(3);
 
1013 sysfs_fan_speeds_offset(4);
 
1015 static const struct attribute_group fan_attribute_groups[] = {
 
1016         { .attrs = fan1_attributes },
 
1017         { .attrs = fan2_attributes },
 
1018         { .attrs = fan3_attributes },
 
1019         { .attrs = fan4_attributes },
 
1023  * Temperature sensors sysfs entries.
 
1025 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO,
 
1026                                         applesmc_show_temperature, NULL, 0);
 
1027 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO,
 
1028                                         applesmc_show_temperature, NULL, 1);
 
1029 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO,
 
1030                                         applesmc_show_temperature, NULL, 2);
 
1031 static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO,
 
1032                                         applesmc_show_temperature, NULL, 3);
 
1033 static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO,
 
1034                                         applesmc_show_temperature, NULL, 4);
 
1035 static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO,
 
1036                                         applesmc_show_temperature, NULL, 5);
 
1037 static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO,
 
1038                                         applesmc_show_temperature, NULL, 6);
 
1039 static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO,
 
1040                                         applesmc_show_temperature, NULL, 7);
 
1041 static SENSOR_DEVICE_ATTR(temp9_input, S_IRUGO,
 
1042                                         applesmc_show_temperature, NULL, 8);
 
1043 static SENSOR_DEVICE_ATTR(temp10_input, S_IRUGO,
 
1044                                         applesmc_show_temperature, NULL, 9);
 
1045 static SENSOR_DEVICE_ATTR(temp11_input, S_IRUGO,
 
1046                                         applesmc_show_temperature, NULL, 10);
 
1047 static SENSOR_DEVICE_ATTR(temp12_input, S_IRUGO,
 
1048                                         applesmc_show_temperature, NULL, 11);
 
1049 static SENSOR_DEVICE_ATTR(temp13_input, S_IRUGO,
 
1050                                         applesmc_show_temperature, NULL, 12);
 
1051 static SENSOR_DEVICE_ATTR(temp14_input, S_IRUGO,
 
1052                                         applesmc_show_temperature, NULL, 13);
 
1053 static SENSOR_DEVICE_ATTR(temp15_input, S_IRUGO,
 
1054                                         applesmc_show_temperature, NULL, 14);
 
1055 static SENSOR_DEVICE_ATTR(temp16_input, S_IRUGO,
 
1056                                         applesmc_show_temperature, NULL, 15);
 
1057 static SENSOR_DEVICE_ATTR(temp17_input, S_IRUGO,
 
1058                                         applesmc_show_temperature, NULL, 16);
 
1059 static SENSOR_DEVICE_ATTR(temp18_input, S_IRUGO,
 
1060                                         applesmc_show_temperature, NULL, 17);
 
1061 static SENSOR_DEVICE_ATTR(temp19_input, S_IRUGO,
 
1062                                         applesmc_show_temperature, NULL, 18);
 
1063 static SENSOR_DEVICE_ATTR(temp20_input, S_IRUGO,
 
1064                                         applesmc_show_temperature, NULL, 19);
 
1065 static SENSOR_DEVICE_ATTR(temp21_input, S_IRUGO,
 
1066                                         applesmc_show_temperature, NULL, 20);
 
1067 static SENSOR_DEVICE_ATTR(temp22_input, S_IRUGO,
 
1068                                         applesmc_show_temperature, NULL, 21);
 
1069 static SENSOR_DEVICE_ATTR(temp23_input, S_IRUGO,
 
1070                                         applesmc_show_temperature, NULL, 22);
 
1071 static SENSOR_DEVICE_ATTR(temp24_input, S_IRUGO,
 
1072                                         applesmc_show_temperature, NULL, 23);
 
1073 static SENSOR_DEVICE_ATTR(temp25_input, S_IRUGO,
 
1074                                         applesmc_show_temperature, NULL, 24);
 
1075 static SENSOR_DEVICE_ATTR(temp26_input, S_IRUGO,
 
1076                                         applesmc_show_temperature, NULL, 25);
 
1077 static SENSOR_DEVICE_ATTR(temp27_input, S_IRUGO,
 
1078                                         applesmc_show_temperature, NULL, 26);
 
1079 static SENSOR_DEVICE_ATTR(temp28_input, S_IRUGO,
 
1080                                         applesmc_show_temperature, NULL, 27);
 
1081 static SENSOR_DEVICE_ATTR(temp29_input, S_IRUGO,
 
1082                                         applesmc_show_temperature, NULL, 28);
 
1083 static SENSOR_DEVICE_ATTR(temp30_input, S_IRUGO,
 
1084                                         applesmc_show_temperature, NULL, 29);
 
1085 static SENSOR_DEVICE_ATTR(temp31_input, S_IRUGO,
 
1086                                         applesmc_show_temperature, NULL, 30);
 
1087 static SENSOR_DEVICE_ATTR(temp32_input, S_IRUGO,
 
1088                                         applesmc_show_temperature, NULL, 31);
 
1089 static SENSOR_DEVICE_ATTR(temp33_input, S_IRUGO,
 
1090                                         applesmc_show_temperature, NULL, 32);
 
1091 static SENSOR_DEVICE_ATTR(temp34_input, S_IRUGO,
 
1092                                         applesmc_show_temperature, NULL, 33);
 
1093 static SENSOR_DEVICE_ATTR(temp35_input, S_IRUGO,
 
1094                                         applesmc_show_temperature, NULL, 34);
 
1096 static struct attribute *temperature_attributes[] = {
 
1097         &sensor_dev_attr_temp1_input.dev_attr.attr,
 
1098         &sensor_dev_attr_temp2_input.dev_attr.attr,
 
1099         &sensor_dev_attr_temp3_input.dev_attr.attr,
 
1100         &sensor_dev_attr_temp4_input.dev_attr.attr,
 
1101         &sensor_dev_attr_temp5_input.dev_attr.attr,
 
1102         &sensor_dev_attr_temp6_input.dev_attr.attr,
 
1103         &sensor_dev_attr_temp7_input.dev_attr.attr,
 
1104         &sensor_dev_attr_temp8_input.dev_attr.attr,
 
1105         &sensor_dev_attr_temp9_input.dev_attr.attr,
 
1106         &sensor_dev_attr_temp10_input.dev_attr.attr,
 
1107         &sensor_dev_attr_temp11_input.dev_attr.attr,
 
1108         &sensor_dev_attr_temp12_input.dev_attr.attr,
 
1109         &sensor_dev_attr_temp13_input.dev_attr.attr,
 
1110         &sensor_dev_attr_temp14_input.dev_attr.attr,
 
1111         &sensor_dev_attr_temp15_input.dev_attr.attr,
 
1112         &sensor_dev_attr_temp16_input.dev_attr.attr,
 
1113         &sensor_dev_attr_temp17_input.dev_attr.attr,
 
1114         &sensor_dev_attr_temp18_input.dev_attr.attr,
 
1115         &sensor_dev_attr_temp19_input.dev_attr.attr,
 
1116         &sensor_dev_attr_temp20_input.dev_attr.attr,
 
1117         &sensor_dev_attr_temp21_input.dev_attr.attr,
 
1118         &sensor_dev_attr_temp22_input.dev_attr.attr,
 
1119         &sensor_dev_attr_temp23_input.dev_attr.attr,
 
1120         &sensor_dev_attr_temp24_input.dev_attr.attr,
 
1121         &sensor_dev_attr_temp25_input.dev_attr.attr,
 
1122         &sensor_dev_attr_temp26_input.dev_attr.attr,
 
1123         &sensor_dev_attr_temp27_input.dev_attr.attr,
 
1124         &sensor_dev_attr_temp28_input.dev_attr.attr,
 
1125         &sensor_dev_attr_temp29_input.dev_attr.attr,
 
1126         &sensor_dev_attr_temp30_input.dev_attr.attr,
 
1127         &sensor_dev_attr_temp31_input.dev_attr.attr,
 
1128         &sensor_dev_attr_temp32_input.dev_attr.attr,
 
1129         &sensor_dev_attr_temp33_input.dev_attr.attr,
 
1130         &sensor_dev_attr_temp34_input.dev_attr.attr,
 
1131         &sensor_dev_attr_temp35_input.dev_attr.attr,
 
1135 static const struct attribute_group temperature_attributes_group =
 
1136         { .attrs = temperature_attributes };
 
1141  * applesmc_dmi_match - found a match.  return one, short-circuiting the hunt.
 
1143 static int applesmc_dmi_match(const struct dmi_system_id *id)
 
1146         struct dmi_match_data* dmi_data = id->driver_data;
 
1147         printk(KERN_INFO "applesmc: %s detected:\n", id->ident);
 
1148         applesmc_accelerometer = dmi_data->accelerometer;
 
1149         printk(KERN_INFO "applesmc:  - Model %s accelerometer\n",
 
1150                                 applesmc_accelerometer ? "with" : "without");
 
1151         applesmc_light = dmi_data->light;
 
1152         printk(KERN_INFO "applesmc:  - Model %s light sensors and backlight\n",
 
1153                                         applesmc_light ? "with" : "without");
 
1155         applesmc_temperature_set =  dmi_data->temperature_set;
 
1156         while (temperature_sensors_sets[applesmc_temperature_set][i] != NULL)
 
1158         printk(KERN_INFO "applesmc:  - Model with %d temperature sensors\n", i);
 
1162 /* Create accelerometer ressources */
 
1163 static int applesmc_create_accelerometer(void)
 
1165         struct input_dev *idev;
 
1168         ret = sysfs_create_group(&pdev->dev.kobj,
 
1169                                         &accelerometer_attributes_group);
 
1173         applesmc_idev = input_allocate_polled_device();
 
1174         if (!applesmc_idev) {
 
1179         applesmc_idev->poll = applesmc_idev_poll;
 
1180         applesmc_idev->poll_interval = APPLESMC_POLL_INTERVAL;
 
1182         /* initial calibrate for the input device */
 
1183         applesmc_calibrate();
 
1185         /* initialize the input device */
 
1186         idev = applesmc_idev->input;
 
1187         idev->name = "applesmc";
 
1188         idev->id.bustype = BUS_HOST;
 
1189         idev->dev.parent = &pdev->dev;
 
1190         idev->evbit[0] = BIT_MASK(EV_ABS);
 
1191         input_set_abs_params(idev, ABS_X,
 
1192                         -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
 
1193         input_set_abs_params(idev, ABS_Y,
 
1194                         -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
 
1196         ret = input_register_polled_device(applesmc_idev);
 
1203         input_free_polled_device(applesmc_idev);
 
1206         sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group);
 
1209         printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
 
1213 /* Release all ressources used by the accelerometer */
 
1214 static void applesmc_release_accelerometer(void)
 
1216         input_unregister_polled_device(applesmc_idev);
 
1217         input_free_polled_device(applesmc_idev);
 
1218         sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group);
 
1221 static __initdata struct dmi_match_data applesmc_dmi_data[] = {
 
1222 /* MacBook Pro: accelerometer, backlight and temperature set 0 */
 
1223         { .accelerometer = 1, .light = 1, .temperature_set = 0 },
 
1224 /* MacBook2: accelerometer and temperature set 1 */
 
1225         { .accelerometer = 1, .light = 0, .temperature_set = 1 },
 
1226 /* MacBook: accelerometer and temperature set 2 */
 
1227         { .accelerometer = 1, .light = 0, .temperature_set = 2 },
 
1228 /* MacMini: temperature set 3 */
 
1229         { .accelerometer = 0, .light = 0, .temperature_set = 3 },
 
1230 /* MacPro: temperature set 4 */
 
1231         { .accelerometer = 0, .light = 0, .temperature_set = 4 },
 
1232 /* iMac: temperature set 5 */
 
1233         { .accelerometer = 0, .light = 0, .temperature_set = 5 },
 
1234 /* MacBook3: accelerometer and temperature set 6 */
 
1235         { .accelerometer = 1, .light = 0, .temperature_set = 6 },
 
1238 /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
 
1239  * So we need to put "Apple MacBook Pro" before "Apple MacBook". */
 
1240 static __initdata struct dmi_system_id applesmc_whitelist[] = {
 
1241         { applesmc_dmi_match, "Apple MacBook Pro", {
 
1242           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
 
1243           DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") },
 
1244                 (void*)&applesmc_dmi_data[0]},
 
1245         { applesmc_dmi_match, "Apple MacBook (v2)", {
 
1246           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
 
1247           DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") },
 
1248                 (void*)&applesmc_dmi_data[1]},
 
1249         { applesmc_dmi_match, "Apple MacBook (v3)", {
 
1250           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
 
1251           DMI_MATCH(DMI_PRODUCT_NAME,"MacBook3") },
 
1252                 (void*)&applesmc_dmi_data[6]},
 
1253         { applesmc_dmi_match, "Apple MacBook", {
 
1254           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
 
1255           DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") },
 
1256                 (void*)&applesmc_dmi_data[2]},
 
1257         { applesmc_dmi_match, "Apple Macmini", {
 
1258           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
 
1259           DMI_MATCH(DMI_PRODUCT_NAME,"Macmini") },
 
1260                 (void*)&applesmc_dmi_data[3]},
 
1261         { applesmc_dmi_match, "Apple MacPro2", {
 
1262           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
 
1263           DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") },
 
1264                 (void*)&applesmc_dmi_data[4]},
 
1265         { applesmc_dmi_match, "Apple iMac", {
 
1266           DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
 
1267           DMI_MATCH(DMI_PRODUCT_NAME,"iMac") },
 
1268                 (void*)&applesmc_dmi_data[5]},
 
1272 static int __init applesmc_init(void)
 
1278         if (!dmi_check_system(applesmc_whitelist)) {
 
1279                 printk(KERN_WARNING "applesmc: supported laptop not found!\n");
 
1284         if (!request_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS,
 
1290         ret = platform_driver_register(&applesmc_driver);
 
1294         pdev = platform_device_register_simple("applesmc", APPLESMC_DATA_PORT,
 
1297                 ret = PTR_ERR(pdev);
 
1301         ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_name.attr);
 
1305         /* Create key enumeration sysfs files */
 
1306         ret = sysfs_create_group(&pdev->dev.kobj, &key_enumeration_group);
 
1310         /* create fan files */
 
1311         count = applesmc_get_fan_count();
 
1313                 printk(KERN_ERR "applesmc: Cannot get the number of fans.\n");
 
1315                 printk(KERN_INFO "applesmc: %d fans found.\n", count);
 
1319                         printk(KERN_WARNING "applesmc: More than 4 fans found,"
 
1320                                         " but at most 4 fans are supported"
 
1321                                                 " by the driver.\n");
 
1323                         ret = sysfs_create_group(&pdev->dev.kobj,
 
1324                                                  &fan_attribute_groups[3]);
 
1326                                 goto out_key_enumeration;
 
1328                         ret = sysfs_create_group(&pdev->dev.kobj,
 
1329                                                  &fan_attribute_groups[2]);
 
1331                                 goto out_key_enumeration;
 
1333                         ret = sysfs_create_group(&pdev->dev.kobj,
 
1334                                                  &fan_attribute_groups[1]);
 
1336                                 goto out_key_enumeration;
 
1338                         ret = sysfs_create_group(&pdev->dev.kobj,
 
1339                                                  &fan_attribute_groups[0]);
 
1348              temperature_sensors_sets[applesmc_temperature_set][i] != NULL;
 
1350                 if (temperature_attributes[i] == NULL) {
 
1351                         printk(KERN_ERR "applesmc: More temperature sensors "
 
1352                                 "in temperature_sensors_sets (at least %i)"
 
1353                                 "than available sysfs files in "
 
1354                                 "temperature_attributes (%i), please report "
 
1355                                 "this bug.\n", i, i-1);
 
1356                         goto out_temperature;
 
1358                 ret = sysfs_create_file(&pdev->dev.kobj,
 
1359                                                 temperature_attributes[i]);
 
1361                         goto out_temperature;
 
1364         if (applesmc_accelerometer) {
 
1365                 ret = applesmc_create_accelerometer();
 
1367                         goto out_temperature;
 
1370         if (applesmc_light) {
 
1371                 /* Add light sensor file */
 
1372                 ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_light.attr);
 
1374                         goto out_accelerometer;
 
1376                 /* Create the workqueue */
 
1377                 applesmc_led_wq = create_singlethread_workqueue("applesmc-led");
 
1378                 if (!applesmc_led_wq) {
 
1380                         goto out_light_sysfs;
 
1383                 /* register as a led device */
 
1384                 ret = led_classdev_register(&pdev->dev, &applesmc_backlight);
 
1389         hwmon_dev = hwmon_device_register(&pdev->dev);
 
1390         if (IS_ERR(hwmon_dev)) {
 
1391                 ret = PTR_ERR(hwmon_dev);
 
1392                 goto out_light_ledclass;
 
1395         printk(KERN_INFO "applesmc: driver successfully loaded.\n");
 
1401                 led_classdev_unregister(&applesmc_backlight);
 
1404                 destroy_workqueue(applesmc_led_wq);
 
1407                 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
 
1409         if (applesmc_accelerometer)
 
1410                 applesmc_release_accelerometer();
 
1412         sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group);
 
1413         sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[0]);
 
1415         sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]);
 
1416 out_key_enumeration:
 
1417         sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
 
1419         sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
 
1421         platform_device_unregister(pdev);
 
1423         platform_driver_unregister(&applesmc_driver);
 
1425         release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
 
1427         printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
 
1431 static void __exit applesmc_exit(void)
 
1433         hwmon_device_unregister(hwmon_dev);
 
1434         if (applesmc_light) {
 
1435                 led_classdev_unregister(&applesmc_backlight);
 
1436                 destroy_workqueue(applesmc_led_wq);
 
1437                 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
 
1439         if (applesmc_accelerometer)
 
1440                 applesmc_release_accelerometer();
 
1441         sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group);
 
1442         sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[0]);
 
1443         sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]);
 
1444         sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
 
1445         sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
 
1446         platform_device_unregister(pdev);
 
1447         platform_driver_unregister(&applesmc_driver);
 
1448         release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
 
1450         printk(KERN_INFO "applesmc: driver unloaded.\n");
 
1453 module_init(applesmc_init);
 
1454 module_exit(applesmc_exit);
 
1456 MODULE_AUTHOR("Nicolas Boichat");
 
1457 MODULE_DESCRIPTION("Apple SMC");
 
1458 MODULE_LICENSE("GPL v2");