Revision: 89
          http://svn.sourceforge.net/mactel-linux/?rev=89&view=rev
Author:   nboichat
Date:     2007-03-21 03:54:14 -0700 (Wed, 21 Mar 2007)

Log Message:
-----------
Fix applesmc, as asked by Andrew Morton.

Modified Paths:
--------------
    trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch

Modified: trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch      2007-03-17 
18:41:11 UTC (rev 88)
+++ trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch      2007-03-21 
10:54:14 UTC (rev 89)
@@ -5,11 +5,29 @@
 
 ---
 
+ MAINTAINERS              |    6 
  drivers/hwmon/Kconfig    |   24 +
  drivers/hwmon/Makefile   |    1 
- drivers/hwmon/applesmc.c |  964 ++++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 989 insertions(+), 0 deletions(-)
+ drivers/hwmon/applesmc.c |  917 ++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 948 insertions(+), 0 deletions(-)
 
+diff --git a/MAINTAINERS b/MAINTAINERS
+index 81bcc22..cbfdc3e 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -367,6 +367,12 @@ L:        [email protected]
+ W:    http://www.canb.auug.org.au/~sfr/
+ S:    Supported
+ 
++APPLE SMC DRIVER
++P:    Nicolas Boichat
++M:    [EMAIL PROTECTED]
++L:    [email protected]
++S:    Maintained
++
+ APPLETALK NETWORK LAYER
+ P:    Arnaldo Carvalho de Melo
+ M:    [EMAIL PROTECTED]
 diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
 index 6d105a1..25b72a4 100644
 --- a/drivers/hwmon/Kconfig
@@ -59,10 +77,10 @@
  obj-$(CONFIG_SENSORS_DS1621)  += ds1621.o
 diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
 new file mode 100644
-index 0000000..3bdd1a8
+index 0000000..4060667
 --- /dev/null
 +++ b/drivers/hwmon/applesmc.c
-@@ -0,0 +1,964 @@
+@@ -0,0 +1,917 @@
 +/*
 + * drivers/hwmon/applesmc.c - driver for Apple's SMC (accelerometer, 
temperature
 + * sensors, fan control, keyboard backlight control) used in Intel-based Apple
@@ -98,6 +116,8 @@
 +#include <linux/module.h>
 +#include <linux/timer.h>
 +#include <linux/dmi.h>
++#include <linux/mutex.h>
++#include <linux/hwmon-sysfs.h>
 +#include <asm/io.h>
 +#include <linux/leds.h>
 +
@@ -112,24 +132,24 @@
 +#define APPLESMC_READ_CMD     0x10
 +#define APPLESMC_WRITE_CMD    0x11
 +
-+#define LIGHT_SENSOR_LEFT_KEY "ALV0" //r-o length 6
-+#define LIGHT_SENSOR_RIGHT_KEY        "ALV1" //r-o length 6
-+#define BACKLIGHT_KEY                 "LKSB" //w-o
++#define LIGHT_SENSOR_LEFT_KEY "ALV0" /* r-o length 6 */
++#define LIGHT_SENSOR_RIGHT_KEY        "ALV1" /* r-o length 6 */
++#define BACKLIGHT_KEY                 "LKSB" /* w-o */
 +
-+#define CLAMSHELL_KEY                 "MSLD" //r-o length 1 (unused)
++#define CLAMSHELL_KEY                 "MSLD" /* r-o length 1 (unused) */
 +
-+#define MOTION_SENSOR_X_KEY   "MO_X" //r-o length 2
-+#define MOTION_SENSOR_Y_KEY   "MO_Y" //r-o length 2
-+#define MOTION_SENSOR_Z_KEY   "MO_Z" //r-o length 2
-+#define MOTION_SENSOR_KEY     "MOCN" //r/w length 2
++#define MOTION_SENSOR_X_KEY   "MO_X" /* r-o length 2 */
++#define MOTION_SENSOR_Y_KEY   "MO_Y" /* r-o length 2 */
++#define MOTION_SENSOR_Z_KEY   "MO_Z" /* r-o length 2 */
++#define MOTION_SENSOR_KEY     "MOCN" /* r/w length 2 */
 +
-+#define FANS_COUNT            "FNum" //r-o length 1
-+#define FANS_MANUAL           "FS! " //r-w length 2
-+#define FAN_ACTUAL_SPEED      "F0Ac" //r-o length 2
-+#define FAN_MIN_SPEED         "F0Mn" //r-o length 2
-+#define FAN_MAX_SPEED         "F0Mx" //r-o length 2
-+#define FAN_SAFE_SPEED                "F0Sf" //r-o length 2
-+#define FAN_TARGET_SPEED      "F0Tg" //r-w length 2
++#define FANS_COUNT            "FNum" /* r-o length 1 */
++#define FANS_MANUAL           "FS! " /* r-w length 2 */
++#define FAN_ACTUAL_SPEED      "F0Ac" /* r-o length 2 */
++#define FAN_MIN_SPEED         "F0Mn" /* r-o length 2 */
++#define FAN_MAX_SPEED         "F0Mx" /* r-o length 2 */
++#define FAN_SAFE_SPEED                "F0Sf" /* r-o length 2 */
++#define FAN_TARGET_SPEED      "F0Tg" /* r-w length 2 */
 +
 +/* Temperature sensors keys. First set for Macbook(Pro), second for Macmini */
 +static const char* temperature_sensors_sets[][8] = {
@@ -137,6 +157,15 @@
 +      { "TC0D", "TC0P", NULL }
 +};
 +
++/* List of keys used to read/write fan speeds */
++static const char* fan_speed_keys[] = {
++      FAN_ACTUAL_SPEED,
++      FAN_MIN_SPEED,
++      FAN_MAX_SPEED,
++      FAN_SAFE_SPEED,
++      FAN_TARGET_SPEED
++};
++
 +#define INIT_TIMEOUT_MSECS    5000    /* wait up to 5s for device init ... */
 +#define INIT_WAIT_MSECS               50      /* ... in 50ms increments */
 +
@@ -166,20 +195,20 @@
 +static struct input_dev *applesmc_idev;
 +
 +/* Indicates whether this computer has an accelerometer. */
-+static unsigned int applesmc_accelerometer = 0;
++static unsigned int applesmc_accelerometer;
 +
 +/* Indicates whether this computer has light sensors and keyboard backlight. 
*/
-+static unsigned int applesmc_light = 0;
++static unsigned int applesmc_light;
 +
 +/* Indicates which temperature sensors set to use. */
-+static unsigned int applesmc_temperature_set = 0;
++static unsigned int applesmc_temperature_set;
 +
-+static DECLARE_MUTEX(applesmc_sem);
++static struct mutex applesmc_lock;
 +
 +/*
 + * __wait_status - Wait up to 100ms for the status port to get a certain value
 + * (masked with 0x0f), returning zero if the value is obtained.  Callers must
-+ * hold applesmc_sem.
++ * hold applesmc_lock.
 + */
 +static int __wait_status(u8 val)
 +{
@@ -202,7 +231,7 @@
 +/*
 + * applesmc_read_key - reads len bytes from a given key, and put them in 
buffer.
 + * Returns zero on success or a negative error on failure. Callers must
-+ * hold applesmc_sem.
++ * hold applesmc_lock.
 + */
 +static int applesmc_read_key(const char* key, u8* buffer, u8 len)
 +{
@@ -218,18 +247,23 @@
 +              if (__wait_status(0x04))
 +                      goto out;
 +      }
-+      if (debug) printk(KERN_DEBUG "<%s", key);
++      if (debug)
++              printk(KERN_DEBUG "<%s", key);
 +
 +      outb(len, APPLESMC_DATA_PORT);
-+      if (debug) printk(KERN_DEBUG ">%x", len);
++      if (debug)
++              printk(KERN_DEBUG ">%x", len);
 +
 +      for (i = 0; i < len; i++) {
 +              if (__wait_status(0x05))
 +                      goto out;
 +              buffer[i] = inb(APPLESMC_DATA_PORT);
-+              if (debug) printk(KERN_DEBUG "<%x", buffer[i]);
++              if (debug)
++                      printk(KERN_DEBUG "<%x", buffer[i]);
 +      }
-+      if (debug) printk(KERN_DEBUG "\n");
++      if (debug)
++              printk(KERN_DEBUG "\n");
++
 +      ret = 0;
 +
 +out:
@@ -239,7 +273,7 @@
 +/*
 + * applesmc_write_key - writes len bytes from buffer to a given key.
 + * Returns zero on success or a negative error on failure. Callers must
-+ * hold applesmc_sem.
++ * hold applesmc_lock.
 + */
 +static int applesmc_write_key(const char* key, u8* buffer, u8 len)
 +{
@@ -271,7 +305,7 @@
 +
 +/*
 + * applesmc_read_motion_sensor - Read motion sensor (X, Y or Z). Callers must
-+ * hold applesmc_sem.
++ * hold applesmc_lock.
 + */
 +static int applesmc_read_motion_sensor(int index, s16* value)
 +{
@@ -306,12 +340,14 @@
 +      int total, ret = -ENXIO;
 +      u8 buffer[2];
 +
-+      if (!applesmc_accelerometer) return 0;
++      if (!applesmc_accelerometer)
++              return 0;
 +
-+      down(&applesmc_sem);
++      mutex_lock(&applesmc_lock);
 +
 +      for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) {
-+              if (debug) printk(KERN_DEBUG "applesmc try %d\n", total);
++              if (debug)
++                      printk(KERN_DEBUG "applesmc try %d\n", total);
 +              if (!applesmc_read_key(MOTION_SENSOR_KEY, buffer, 2) &&
 +                              (buffer[0] != 0x00 || buffer[1] != 0x00)) {
 +                      if (total == INIT_TIMEOUT_MSECS) {
@@ -319,8 +355,7 @@
 +                                              " already been initialized"
 +                                              " (0x%02x, 0x%02x).\n",
 +                                              buffer[0], buffer[1]);
-+                      }
-+                      else {
++                      } else {
 +                              printk(KERN_DEBUG "applesmc: device" 
 +                                              " successfully initialized"
 +                                              " (0x%02x, 0x%02x).\n",
@@ -338,24 +373,24 @@
 +      printk(KERN_WARNING "applesmc: failed to init the device\n");
 +
 +out:
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +      return ret;
 +}
 +
 +/*
 + * applesmc_get_fan_count - get the number of fans. Callers must NOT hold
-+ * applesmc_sem.
++ * applesmc_lock.
 + */
 +static int applesmc_get_fan_count(void)
 +{
 +      int ret;
 +      u8 buffer[1];
 +
-+      down(&applesmc_sem);
++      mutex_lock(&applesmc_lock);
 +
 +      ret = applesmc_read_key(FANS_COUNT, buffer, 1);
 +
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +      if (ret)
 +              return ret;
 +      else
@@ -391,7 +426,7 @@
 +
 +/*
 + * applesmc_calibrate - Set our "resting" values.  Callers must
-+ * hold applesmc_sem.
++ * hold applesmc_lock.
 + */
 +static void applesmc_calibrate(void)
 +{
@@ -404,7 +439,7 @@
 +      s16 x, y;
 +
 +      /* Cannot sleep.  Try nonblockingly.  If we fail, try again later. */
-+      if (down_trylock(&applesmc_sem)) {
++      if (!mutex_trylock(&applesmc_lock)) {
 +              mod_timer(&applesmc_timer, jiffies + APPLESMC_POLL_PERIOD);
 +              return;
 +      }
@@ -414,7 +449,6 @@
 +      if (applesmc_read_motion_sensor(SENSOR_Y, &y))
 +              goto out;
 +
-+
 +      input_report_abs(applesmc_idev, ABS_X, x - rest_x);
 +      input_report_abs(applesmc_idev, ABS_Y, y - rest_y);
 +      input_sync(applesmc_idev);
@@ -422,7 +456,7 @@
 +out:
 +      mod_timer(&applesmc_timer, jiffies + APPLESMC_POLL_PERIOD);
 +
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +}
 +
 +/* Sysfs Files */
@@ -433,7 +467,7 @@
 +      int ret;
 +      s16 x, y, z;
 +
-+      down(&applesmc_sem);
++      mutex_lock(&applesmc_lock);
 +
 +      ret = applesmc_read_motion_sensor(SENSOR_X, &x);
 +      if (ret)
@@ -446,7 +480,7 @@
 +              goto out;
 +
 +out:
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +      if (ret)
 +              return ret;
 +      else
@@ -454,13 +488,13 @@
 +}
 +
 +static ssize_t applesmc_light_show(struct device *dev,
-+                                 struct device_attribute *attr, char *buf)
++                              struct device_attribute *attr, char *sysfsbuf)
 +{
 +      int ret;
 +      u8 left = 0, right = 0;
 +      u8 buffer[6];
 +
-+      down(&applesmc_sem);
++      mutex_lock(&applesmc_lock);
 +
 +      ret = applesmc_read_key(LIGHT_SENSOR_LEFT_KEY, buffer, 6);
 +      left = buffer[2];
@@ -470,123 +504,134 @@
 +      right = buffer[2];
 +
 +out:
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +      if (ret)
 +              return ret;
 +      else
-+              return sprintf(buf, "(%d,%d)\n", left, right);
++              return sprintf(sysfsbuf, "(%d,%d)\n", left, right);
 +}
 +
-+/* Displays °C * 100 */
-+static ssize_t applesmc_show_temperature(struct device *dev, char *buf,
-+                                                              const char *key)
++/* Displays degree Celsius * 100 */
++static ssize_t applesmc_show_temperature(struct device *dev,
++                      struct device_attribute *devattr, char *sysfsbuf)
 +{
 +      int ret;
 +      u8 buffer[2];
 +      unsigned int temp;
++      struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++      const char* key =
++              temperature_sensors_sets[applesmc_temperature_set][attr->index];
 +      
-+      down(&applesmc_sem);
++      mutex_lock(&applesmc_lock);
 +
 +      ret = applesmc_read_key(key, buffer, 2);
 +      temp = buffer[0]*100;
 +      temp += (buffer[1] >> 6) * 25;
 +
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +
 +      if (ret)
-+      return ret;
++              return ret;
 +      else
-+      return sprintf(buf, "%u\n", temp);
++              return sprintf(sysfsbuf, "%u\n", temp);
 +}
 +
-+static ssize_t applesmc_show_fan_speed(struct device *dev, char *buf,
-+                                              const char* key, int offset)
++static ssize_t applesmc_show_fan_speed(struct device *dev,
++                              struct device_attribute *attr, char *sysfsbuf)
 +{
 +      int ret;
 +      unsigned int speed = 0;
 +      char newkey[5];
 +      u8 buffer[2];
++      struct sensor_device_attribute_2 *sensor_attr =
++                                              to_sensor_dev_attr_2(attr);
 +
-+      newkey[0] = key[0];
-+      newkey[1] = '0' + offset;
-+      newkey[2] = key[2];
-+      newkey[3] = key[3];
++      newkey[0] = fan_speed_keys[sensor_attr->nr][0];
++      newkey[1] = '0' + sensor_attr->index;
++      newkey[2] = fan_speed_keys[sensor_attr->nr][2];
++      newkey[3] = fan_speed_keys[sensor_attr->nr][3];
 +      newkey[4] = 0;
 +
-+      down(&applesmc_sem);
++      mutex_lock(&applesmc_lock);
 +
 +      ret = applesmc_read_key(newkey, buffer, 2);
 +      speed = ((buffer[0] << 8 | buffer[1]) >> 2);
 +
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +      if (ret)
 +              return ret;
 +      else
-+              return sprintf(buf, "%u\n", speed);
++              return sprintf(sysfsbuf, "%u\n", speed);
 +}
 +
-+static ssize_t applesmc_store_fan_speed(struct device *dev, const char *buf,
-+                              size_t count, const char* key, int offset)
++static ssize_t applesmc_store_fan_speed(struct device *dev,
++                                      struct device_attribute *attr,
++                                      const char *sysfsbuf, size_t count)
 +{
 +      int ret;
 +      u32 speed;
 +      char newkey[5];
 +      u8 buffer[2];
++      struct sensor_device_attribute_2 *sensor_attr =
++                                              to_sensor_dev_attr_2(attr);
 +
-+      speed = simple_strtoul(buf, NULL, 10);
++      speed = simple_strtoul(sysfsbuf, NULL, 10);
 +
 +      if (speed > 0x4000) /* Bigger than a 14-bit value */
 +              return -EINVAL;
 +
-+      newkey[0] = key[0];
-+      newkey[1] = '0' + offset;
-+      newkey[2] = key[2];
-+      newkey[3] = key[3];
++      newkey[0] = fan_speed_keys[sensor_attr->nr][0];
++      newkey[1] = '0' + sensor_attr->index;
++      newkey[2] = fan_speed_keys[sensor_attr->nr][2];
++      newkey[3] = fan_speed_keys[sensor_attr->nr][3];
 +      newkey[4] = 0;
 +
-+      down(&applesmc_sem);
++      mutex_lock(&applesmc_lock);
 +
 +      buffer[0] = (speed >> 6) & 0xff;
 +      buffer[1] = (speed << 2) & 0xff;
 +      ret = applesmc_write_key(newkey, buffer, 2);
 +
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +      if (ret)
 +              return ret;
 +      else
 +              return count;
 +}
 +
-+static ssize_t applesmc_show_fan_manual(struct device *dev, char *buf,
-+                                                              int offset)
++static ssize_t applesmc_show_fan_manual(struct device *dev,
++                      struct device_attribute *devattr, char *sysfsbuf)
 +{
 +      int ret;
 +      u16 manual = 0;
 +      u8 buffer[2];
++      struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 +
-+      down(&applesmc_sem);
++      mutex_lock(&applesmc_lock);
 +
 +      ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
-+      manual = ((buffer[0] << 8 | buffer[1]) >> offset) & 0x01;
++      manual = ((buffer[0] << 8 | buffer[1]) >> attr->index) & 0x01;
 +
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +      if (ret)
 +              return ret;
 +      else
-+              return sprintf(buf, "%d\n", manual);
++              return sprintf(sysfsbuf, "%d\n", manual);
 +}
 +
-+static ssize_t applesmc_store_fan_manual(struct device *dev, const char *buf,
-+                                              size_t count, int offset)
++static ssize_t applesmc_store_fan_manual(struct device *dev,
++                                       struct device_attribute *devattr, 
++                                       const char *sysfsbuf, size_t count)
 +{
 +      int ret;
 +      u8 buffer[2];
 +      u32 input;
 +      u16 val;
++      struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 +
-+      input = simple_strtoul(buf, NULL, 10);
++      input = simple_strtoul(sysfsbuf, NULL, 10);
 +
-+      down(&applesmc_sem);
++      mutex_lock(&applesmc_lock);
 +
 +      ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
 +      val = (buffer[0] << 8 | buffer[1]);
@@ -594,9 +639,9 @@
 +              goto out;
 +
 +      if (input)
-+              val = val | (0x01 << offset);
++              val = val | (0x01 << attr->index);
 +      else 
-+              val = val & ~(0x01 << offset);
++              val = val & ~(0x01 << attr->index);
 +
 +      buffer[0] = (val >> 8) & 0xFF;
 +      buffer[1] = val & 0xFF;
@@ -604,7 +649,7 @@
 +      ret = applesmc_write_key(FANS_MANUAL, buffer, 2);
 +
 +out:
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +      if (ret)
 +              return ret;
 +      else
@@ -612,17 +657,17 @@
 +}
 +
 +static ssize_t applesmc_calibrate_show(struct device *dev,
-+                                      struct device_attribute *attr, char 
*buf)
++                              struct device_attribute *attr, char *sysfsbuf)
 +{
-+      return sprintf(buf, "(%d,%d)\n", rest_x, rest_y);
++      return sprintf(sysfsbuf, "(%d,%d)\n", rest_x, rest_y);
 +}
 +
 +static ssize_t applesmc_calibrate_store(struct device *dev,
-+              struct device_attribute *attr, const char *buf, size_t count)
++      struct device_attribute *attr, const char *sysfsbuf, size_t count)
 +{
-+      down(&applesmc_sem);
++      mutex_lock(&applesmc_lock);
 +      applesmc_calibrate();
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +
 +      return count;
 +}
@@ -632,11 +677,11 @@
 +{
 +      u8 buffer[2];
 +      
-+      down(&applesmc_sem);
++      mutex_lock(&applesmc_lock);
 +      buffer[0] = value;
 +      buffer[1] = 0x00;
 +      applesmc_write_key(BACKLIGHT_KEY, buffer, 2);
-+      up(&applesmc_sem);
++      mutex_unlock(&applesmc_lock);
 +}
 +
 +static struct led_classdev applesmc_backlight = {
@@ -652,7 +697,7 @@
 +static DEVICE_ATTR(light, 0444, applesmc_light_show, NULL);
 +
 +/*
-+ * Macro defining helper functions and DEVICE_ATTR for a fan sysfs entries.
++ * Macro defining SENSOR_DEVICE_ATTR for a fan sysfs entries.
 + *  - show actual speed
 + *  - show/store minimum speed
 + *  - show maximum speed
@@ -661,67 +706,33 @@
 + *  - show/store manual mode
 + */
 +#define sysfs_fan_speeds_offset(offset) \
-+static ssize_t show_fan_actual_speed_##offset (struct device *dev, \
-+                              struct device_attribute *attr, char *buf) \
-+{ \
-+      return applesmc_show_fan_speed(dev, buf, FAN_ACTUAL_SPEED, offset); \
-+} \
-+static DEVICE_ATTR(fan##offset##_actual_speed, S_IRUGO, \
-+                                      show_fan_actual_speed_##offset, NULL); \
++static SENSOR_DEVICE_ATTR_2(fan##offset##_actual_speed, S_IRUGO, \
++                      applesmc_show_fan_speed, NULL, 0, offset); \
 +\
-+static ssize_t show_fan_minimum_speed_##offset (struct device *dev, \
-+                              struct device_attribute *attr, char *buf) \
-+{ \
-+      return applesmc_show_fan_speed(dev, buf, FAN_MIN_SPEED, offset); \
-+} \
-+static ssize_t store_fan_minimum_speed_##offset (struct device *dev, \
-+              struct device_attribute *attr, const char *buf, size_t count) \
-+{ \
-+      return applesmc_store_fan_speed(dev, buf, count, FAN_MIN_SPEED, 
offset); \
-+} \
-+static DEVICE_ATTR(fan##offset##_minimum_speed, S_IRUGO | S_IWUSR, \
-+      show_fan_minimum_speed_##offset, store_fan_minimum_speed_##offset); \
++static SENSOR_DEVICE_ATTR_2(fan##offset##_minimum_speed, S_IRUGO | S_IWUSR, \
++      applesmc_show_fan_speed, applesmc_store_fan_speed, 1, offset); \
 +\
-+static ssize_t show_fan_maximum_speed_##offset (struct device *dev, \
-+                              struct device_attribute *attr, char *buf) \
-+{ \
-+      return applesmc_show_fan_speed(dev, buf, FAN_MAX_SPEED, offset); \
-+} \
-+static DEVICE_ATTR(fan##offset##_maximum_speed, S_IRUGO, \
-+                              show_fan_maximum_speed_##offset, NULL); \
++static SENSOR_DEVICE_ATTR_2(fan##offset##_maximum_speed, S_IRUGO, \
++                      applesmc_show_fan_speed, NULL, 2, offset); \
 +\
-+static ssize_t show_fan_safe_speed_##offset (struct device *dev, \
-+                              struct device_attribute *attr, char *buf) \
-+{ \
-+      return applesmc_show_fan_speed(dev, buf, FAN_SAFE_SPEED, offset); \
-+} \
-+static DEVICE_ATTR(fan##offset##_safe_speed, S_IRUGO, \
-+                                      show_fan_safe_speed_##offset, NULL); \
++static SENSOR_DEVICE_ATTR_2(fan##offset##_safe_speed, S_IRUGO, \
++                      applesmc_show_fan_speed, NULL, 3, offset); \
 +\
-+static ssize_t show_fan_target_speed_##offset (struct device *dev, \
-+                              struct device_attribute *attr, char *buf) \
-+{ \
-+      return applesmc_show_fan_speed(dev, buf, FAN_TARGET_SPEED, offset); \
-+} \
-+static ssize_t store_fan_target_speed_##offset (struct device *dev, \
-+              struct device_attribute *attr, const char *buf, size_t count) \
-+{ \
-+      return applesmc_store_fan_speed(dev, buf, count, FAN_TARGET_SPEED, 
offset); \
-+} \
-+static DEVICE_ATTR(fan##offset##_target_speed, S_IRUGO | S_IWUSR, \
-+      show_fan_target_speed_##offset, store_fan_target_speed_##offset); \
-+static ssize_t show_fan_manual_##offset (struct device *dev, \
-+                              struct device_attribute *attr, char *buf) \
-+{ \
-+      return applesmc_show_fan_manual(dev, buf, offset); \
-+} \
-+static ssize_t store_fan_manual_##offset (struct device *dev, \
-+              struct device_attribute *attr, const char *buf, size_t count) \
-+{ \
-+      return applesmc_store_fan_manual(dev, buf, count, offset); \
-+} \
-+static DEVICE_ATTR(fan##offset##_manual, S_IRUGO | S_IWUSR, \
-+                 show_fan_manual_##offset, store_fan_manual_##offset);
++static SENSOR_DEVICE_ATTR_2(fan##offset##_target_speed, S_IRUGO | S_IWUSR, \
++      applesmc_show_fan_speed, applesmc_store_fan_speed, 4, offset); \
++\
++static SENSOR_DEVICE_ATTR(fan##offset##_manual, S_IRUGO | S_IWUSR, \
++      applesmc_show_fan_manual, applesmc_store_fan_manual, offset); \
++\
++static struct attribute *fan##offset##_attributes[] = { \
++      &sensor_dev_attr_fan##offset##_actual_speed.dev_attr.attr, \
++      &sensor_dev_attr_fan##offset##_minimum_speed.dev_attr.attr, \
++      &sensor_dev_attr_fan##offset##_maximum_speed.dev_attr.attr, \
++      &sensor_dev_attr_fan##offset##_safe_speed.dev_attr.attr, \
++      &sensor_dev_attr_fan##offset##_target_speed.dev_attr.attr, \
++      &sensor_dev_attr_fan##offset##_manual.dev_attr.attr, \
++      NULL \
++};
 +
 +/*
 + * Create the needed functions for each fan using the macro defined above 
@@ -730,54 +741,39 @@
 +sysfs_fan_speeds_offset(0);
 +sysfs_fan_speeds_offset(1);
 +
-+/* Macro creating the sysfs entries for a fan */
-+#define device_create_file_fan(ret, client, offset) \
-+do { \
-+ret = sysfs_create_file(client, &dev_attr_fan##offset##_actual_speed.attr); \
-+if (ret) break; \
-+ret = sysfs_create_file(client, &dev_attr_fan##offset##_minimum_speed.attr); \
-+if (ret) break; \
-+ret = sysfs_create_file(client, &dev_attr_fan##offset##_maximum_speed.attr); \
-+if (ret) break; \
-+ret = sysfs_create_file(client, &dev_attr_fan##offset##_safe_speed.attr); \
-+if (ret) break; \
-+ret = sysfs_create_file(client, &dev_attr_fan##offset##_target_speed.attr); \
-+if (ret) break; \
-+ret = sysfs_create_file(client, &dev_attr_fan##offset##_manual.attr); \
-+} while (0)
++static const struct attribute_group fan_attribute_groups[] = {
++      { .attrs = fan0_attributes },
++      { .attrs = fan1_attributes }
++};
 +
 +/*
-+ * Macro defining the helper function and DEVICE_ATTR for a temperature sensor
-+ * sysfs entry.
++ * Temperature sensors sysfs entries.
 + */
-+#define sysfs_temperature_offset(offset) \
-+static ssize_t show_temperature_##offset (struct device *dev, \
-+                              struct device_attribute *attr, char *buf) \
-+{ \
-+      return applesmc_show_temperature(dev, buf, \
-+              temperature_sensors_sets[applesmc_temperature_set][offset]);  \
-+} \
-+static DEVICE_ATTR(temperature_##offset, S_IRUGO, \
-+                                      show_temperature_##offset, NULL);
++static SENSOR_DEVICE_ATTR(temperature_0, S_IRUGO,
++                                      applesmc_show_temperature, NULL, 0);
++static SENSOR_DEVICE_ATTR(temperature_1, S_IRUGO,
++                                      applesmc_show_temperature, NULL, 1);
++static SENSOR_DEVICE_ATTR(temperature_2, S_IRUGO,
++                                      applesmc_show_temperature, NULL, 2);
++static SENSOR_DEVICE_ATTR(temperature_3, S_IRUGO,
++                                      applesmc_show_temperature, NULL, 3);
++static SENSOR_DEVICE_ATTR(temperature_4, S_IRUGO,
++                                      applesmc_show_temperature, NULL, 4);
++static SENSOR_DEVICE_ATTR(temperature_5, S_IRUGO,
++                                      applesmc_show_temperature, NULL, 5);
++static SENSOR_DEVICE_ATTR(temperature_6, S_IRUGO,
++                                      applesmc_show_temperature, NULL, 6);
 +
-+/*
-+ * Create the needed functions for each temperature sensors using the macro
-+ * defined above (7 temperature sensors are supported)
-+ */
-+sysfs_temperature_offset(0);
-+sysfs_temperature_offset(1);
-+sysfs_temperature_offset(2);
-+sysfs_temperature_offset(3);
-+sysfs_temperature_offset(4);
-+sysfs_temperature_offset(5);
-+sysfs_temperature_offset(6);
++static struct attribute *temperature_attributes[] = {
++      &sensor_dev_attr_temperature_0.dev_attr.attr,
++      &sensor_dev_attr_temperature_1.dev_attr.attr,
++      &sensor_dev_attr_temperature_2.dev_attr.attr,
++      &sensor_dev_attr_temperature_3.dev_attr.attr,
++      &sensor_dev_attr_temperature_4.dev_attr.attr,
++      &sensor_dev_attr_temperature_5.dev_attr.attr,
++      &sensor_dev_attr_temperature_6.dev_attr.attr,
++};
 +
-+/* Macro creating the sysfs entry for a temperature sensor */
-+#define device_create_files_temperature(ret, client, offset) \
-+{ \
-+      ret = sysfs_create_file(client, &dev_attr_temperature_##offset.attr); \
-+} while (0)
-+
 +/* Module stuff */
 +
 +/* 
@@ -786,8 +782,7 @@
 +static int applesmc_dmi_match(struct dmi_system_id *id)
 +{
 +      int i = 0;
-+      struct dmi_match_data* dmi_data =
-+                                      (struct dmi_match_data*)id->driver_data;
++      struct dmi_match_data* dmi_data = id->driver_data;
 +      printk(KERN_INFO "applesmc: %s detected:\n", id->ident);
 +      applesmc_accelerometer = dmi_data->accelerometer;
 +      printk(KERN_INFO "applesmc:  - Model %s accelerometer\n",
@@ -804,7 +799,8 @@
 +}
 +
 +/* Create accelerometer ressources */
-+static int applesmc_create_accelerometer(void) {
++static int applesmc_create_accelerometer(void)
++{
 +      int ret;
 +
 +      ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_position.attr);
@@ -849,43 +845,47 @@
 +}
 +
 +/* Release all ressources used by the accelerometer */
-+static void applesmc_release_accelerometer(void) {
++static void applesmc_release_accelerometer(void)
++{
 +      del_timer_sync(&applesmc_timer);
 +      input_unregister_device(applesmc_idev);
 +}
 +
++static __initdata struct dmi_match_data applesmc_dmi_data[] = {
++/* MacBook Pro: accelerometer, backlight and temperature set 0 */
++      { .accelerometer = 1, .light = 1, .temperature_set = 0 },
++/* MacBook: accelerometer and temperature set 0 */
++      { .accelerometer = 1, .light = 0, .temperature_set = 0 },
++/* MacBook: temperature set 1 */
++      { .accelerometer = 0, .light = 0, .temperature_set = 1 }
++};
++
++/* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
++ * So we need to put "Apple MacBook Pro" before "Apple MacBook". */
++static __initdata struct dmi_system_id applesmc_whitelist[] = {
++      { applesmc_dmi_match, "Apple MacBook Pro", {
++        DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
++        DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") },
++              (void*)&applesmc_dmi_data[0]},
++      { applesmc_dmi_match, "Apple MacBook", {
++        DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
++        DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") },
++              (void*)&applesmc_dmi_data[1]},
++      { applesmc_dmi_match, "Apple Macmini", {
++        DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
++        DMI_MATCH(DMI_PRODUCT_NAME,"Macmini") },
++              (void*)&applesmc_dmi_data[2]},
++      { .ident = NULL }
++};
++
 +static int __init applesmc_init(void)
 +{
 +      int ret;
 +      int count;
++      int i;
 +
-+      struct dmi_match_data applesmc_dmi_data[] = {
-+      /* MacBook Pro: accelerometer, backlight and temperature set 0 */
-+        { .accelerometer = 1, .light = 1, .temperature_set = 0 },
-+      /* MacBook: accelerometer and temperature set 0 */
-+        { .accelerometer = 1, .light = 0, .temperature_set = 0 },
-+      /* MacBook: temperature set 1 */
-+        { .accelerometer = 0, .light = 0, .temperature_set = 1 }
-+      };
++      mutex_init(&applesmc_lock);
 +
-+      /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
-+       * So we need to put "Apple MacBook Pro" before "Apple MacBook". */
-+      struct dmi_system_id applesmc_whitelist[] = {
-+              { applesmc_dmi_match, "Apple MacBook Pro", {
-+                DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
-+                DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") },
-+                      (void*)&applesmc_dmi_data[0]},
-+              { applesmc_dmi_match, "Apple MacBook", {
-+                DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
-+                DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") },
-+                      (void*)&applesmc_dmi_data[1]},
-+              { applesmc_dmi_match, "Apple Macmini", {
-+                DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
-+                DMI_MATCH(DMI_PRODUCT_NAME,"Macmini") },
-+                      (void*)&applesmc_dmi_data[2]},
-+              { .ident = NULL }
-+      };
-+
 +      if (!dmi_check_system(applesmc_whitelist)) {
 +              printk(KERN_WARNING "applesmc: supported laptop not found!\n");
 +              ret = -ENODEV;
@@ -912,8 +912,7 @@
 +      count = applesmc_get_fan_count();
 +      if (count < 0) {
 +              printk(KERN_ERR "applesmc: Cannot get the number of fans.\n");
-+      }
-+      else {
++      } else {
 +              printk(KERN_INFO "applesmc: %d fans found.\n", count);
 +
 +              switch (count) {
@@ -922,11 +921,13 @@
 +                                      " but at most 2 fans are supported"
 +                                              " by the driver.\n");
 +              case 2:
-+                      device_create_file_fan(ret, &pdev->dev.kobj, 1);
++                      ret = sysfs_create_group(&pdev->dev.kobj,
++                                               &fan_attribute_groups[1]);
 +                      if (ret)
 +                              goto out_device;
 +              case 1:
-+                      device_create_file_fan(ret, &pdev->dev.kobj, 0);
++                      ret = sysfs_create_group(&pdev->dev.kobj,
++                                               &fan_attribute_groups[0]);
 +                      if (ret)
 +                              goto out_device;
 +              case 0:
@@ -934,43 +935,13 @@
 +              }
 +      }
 +
-+      count = 0;
-+      while (temperature_sensors_sets[applesmc_temperature_set][count]
-+                                                                      != NULL)
-+              count++;
-+
-+      switch (count) {
-+      default:
-+      case 7:
-+              device_create_files_temperature(ret, &pdev->dev.kobj, 6);
++      for (i = 0;
++           temperature_sensors_sets[applesmc_temperature_set][i] != NULL;
++           i++) {
++              ret = sysfs_create_file(&pdev->dev.kobj,
++                                              temperature_attributes[i]);
 +              if (ret)
 +                      goto out_device;
-+      case 6:
-+              device_create_files_temperature(ret, &pdev->dev.kobj, 5);
-+              if (ret)
-+                      goto out_device;
-+      case 5:
-+              device_create_files_temperature(ret, &pdev->dev.kobj, 4);
-+              if (ret)
-+                      goto out_device;
-+      case 4:
-+              device_create_files_temperature(ret, &pdev->dev.kobj, 3);
-+              if (ret)
-+                      goto out_device;
-+      case 3:
-+              device_create_files_temperature(ret, &pdev->dev.kobj, 2);
-+              if (ret)
-+                      goto out_device;
-+      case 2:
-+              device_create_files_temperature(ret, &pdev->dev.kobj, 1);
-+              if (ret)
-+                      goto out_device;
-+      case 1:
-+              device_create_files_temperature(ret, &pdev->dev.kobj, 0);
-+              if (ret)
-+                      goto out_device;
-+      case 0:
-+              ;
 +      }
 +
 +      if (applesmc_accelerometer) {


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Mactel-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mactel-linux-devel

Reply via email to