|
From: <nbo...@us...> - 2007-05-04 03:16:42
|
Revision: 122
http://svn.sourceforge.net/mactel-linux/?rev=122&view=rev
Author: nboichat
Date: 2007-05-03 20:16:41 -0700 (Thu, 03 May 2007)
Log Message:
-----------
Use "series" file provided by stgit to apply and unapply the patches.
Modified Paths:
--------------
trunk/kernel/mactel-patches-2.6.21/apply
trunk/kernel/mactel-patches-2.6.21/unapply
Added Paths:
-----------
trunk/kernel/mactel-patches-2.6.21/appleir.patch
trunk/kernel/mactel-patches-2.6.21/applesmc.patch
trunk/kernel/mactel-patches-2.6.21/applesmc_enum.patch
trunk/kernel/mactel-patches-2.6.21/applesmc_fix_sleep_in_led_brightness_set.patch
trunk/kernel/mactel-patches-2.6.21/applesmc_int.patch
trunk/kernel/mactel-patches-2.6.21/applesmc_joydev.patch
trunk/kernel/mactel-patches-2.6.21/applesmc_standard.patch
trunk/kernel/mactel-patches-2.6.21/appletouch.patch
trunk/kernel/mactel-patches-2.6.21/coretemp.patch
trunk/kernel/mactel-patches-2.6.21/msr-on-cpu.patch
trunk/kernel/mactel-patches-2.6.21/msr.patch
trunk/kernel/mactel-patches-2.6.21/series
trunk/kernel/mactel-patches-2.6.21/sigmatel_audio2.patch
trunk/kernel/mactel-patches-2.6.21/sigmatel_audio3.patch
Removed Paths:
-------------
trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch
trunk/kernel/mactel-patches-2.6.21/0002-appleir.patch
trunk/kernel/mactel-patches-2.6.21/0003-msr-on-cpu.patch
trunk/kernel/mactel-patches-2.6.21/0004-coretemp.patch
trunk/kernel/mactel-patches-2.6.21/0005-appletouch.patch
trunk/kernel/mactel-patches-2.6.21/0007-sigmatel_audio2.patch
trunk/kernel/mactel-patches-2.6.21/0008-msr.patch
trunk/kernel/mactel-patches-2.6.21/0009-applesmc_joydev.patch
trunk/kernel/mactel-patches-2.6.21/0010-sigmatel_audio3.patch
trunk/kernel/mactel-patches-2.6.21/0011-applesmc_standard.patch
trunk/kernel/mactel-patches-2.6.21/0012-applesmc_enum.patch
trunk/kernel/mactel-patches-2.6.21/0013-applesmc_fix_sleep_in_led_brightness_set.patch
trunk/kernel/mactel-patches-2.6.21/0014-applesmc_int.patch
Deleted: trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch 2007-05-03 09:24:38 UTC (rev 121)
+++ trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch 2007-05-04 03:16:41 UTC (rev 122)
@@ -1,1000 +0,0 @@
-This driver provides support for the Apple System Management Controller, which provides an accelerometer (Apple Sudden Motion Sensor), light sensors, temperature sensors, keyboard backlight control and fan control. Only Intel-based Apple's computers are supported (MacBook Pro, MacBook, MacMini). - SENT UPSTREAM - in mm tree
-
-From: Nicolas Boichat <ni...@bo...>
-
-
----
-
- MAINTAINERS | 6
- drivers/hwmon/Kconfig | 24 +
- drivers/hwmon/Makefile | 1
- drivers/hwmon/applesmc.c | 917 ++++++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 948 insertions(+), 0 deletions(-)
-
-diff --git a/MAINTAINERS b/MAINTAINERS
-index 277877a..4b83092 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -382,6 +382,12 @@ L: lin...@vg...
- W: http://www.canb.auug.org.au/~sfr/
- S: Supported
-
-+APPLE SMC DRIVER
-+P: Nicolas Boichat
-+M: ni...@bo...
-+L: mac...@li...
-+S: Maintained
-+
- APPLETALK NETWORK LAYER
- P: Arnaldo Carvalho de Melo
- M: ac...@co...
-diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
-index 6d105a1..25b72a4 100644
---- a/drivers/hwmon/Kconfig
-+++ b/drivers/hwmon/Kconfig
-@@ -594,6 +594,30 @@ config SENSORS_HDAPS
- Say Y here if you have an applicable laptop and want to experience
- the awesome power of hdaps.
-
-+config SENSORS_APPLESMC
-+ tristate "Apple SMC (Motion sensor, light sensor, keyboard backlight)"
-+ depends on HWMON && INPUT && X86
-+ select NEW_LEDS
-+ select LEDS_CLASS
-+ default n
-+ help
-+ This driver provides support for the Apple System Management
-+ Controller, which provides an accelerometer (Apple Sudden Motion
-+ Sensor), light sensors, temperature sensors, keyboard backlight
-+ control and fan control.
-+
-+ Only Intel-based Apple's computers are supported (MacBook Pro,
-+ MacBook, MacMini).
-+
-+ Data from the different sensors, keyboard backlight control and fan
-+ control are accessible via sysfs.
-+
-+ This driver also provides an absolute input class device, allowing
-+ the laptop to act as a pinball machine-esque joystick.
-+
-+ Say Y here if you have an applicable laptop and want to experience
-+ the awesome power of applesmc.
-+
- config HWMON_DEBUG_CHIP
- bool "Hardware Monitoring Chip debugging messages"
- depends on HWMON
-diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
-index 4165c27..544f8d8 100644
---- a/drivers/hwmon/Makefile
-+++ b/drivers/hwmon/Makefile
-@@ -20,6 +20,7 @@ obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o
- obj-$(CONFIG_SENSORS_ADM1029) += adm1029.o
- obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o
- obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o
-+obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o
- obj-$(CONFIG_SENSORS_AMS) += ams/
- obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
- obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
-diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
-new file mode 100644
-index 0000000..4060667
---- /dev/null
-+++ b/drivers/hwmon/applesmc.c
-@@ -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
-+ * computers.
-+ *
-+ * Copyright (C) 2007 Nicolas Boichat <ni...@bo...>
-+ *
-+ * Based on hdaps.c driver:
-+ * Copyright (C) 2005 Robert Love <rm...@no...>
-+ * Copyright (C) 2005 Jesper Juhl <jes...@gm...>
-+ *
-+ * Fan control based on smcFanControl:
-+ * Copyright (C) 2006 Hendrik Holtmann <hol...@ma...>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License v2 as published by the
-+ * Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-+ */
-+
-+#include <linux/delay.h>
-+#include <linux/platform_device.h>
-+#include <linux/input.h>
-+#include <linux/kernel.h>
-+#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>
-+
-+/* data port used by apple SMC */
-+#define APPLESMC_DATA_PORT 0x300
-+/* command/status port used by apple SMC */
-+#define APPLESMC_CMD_PORT 0x304
-+
-+#define APPLESMC_NR_PORTS 5 /* 0x300-0x304 */
-+
-+#define APPLESMC_STATUS_MASK 0x0f
-+#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 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 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] = {
-+ { "TB0T", "TC0D", "TC0P", "Th0H", "Ts0P", "Th1H", "Ts1P", NULL },
-+ { "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 */
-+
-+#define APPLESMC_POLL_PERIOD (HZ/20) /* poll for input every 1/20s */
-+#define APPLESMC_INPUT_FUZZ 4 /* input event threshold */
-+#define APPLESMC_INPUT_FLAT 4
-+
-+#define SENSOR_X 0
-+#define SENSOR_Y 1
-+#define SENSOR_Z 2
-+
-+/* Structure to be passed to DMI_MATCH function */
-+struct dmi_match_data {
-+/* Indicates whether this computer has an accelerometer. */
-+ int accelerometer;
-+/* Indicates whether this computer has light sensors and keyboard backlight. */
-+ int light;
-+/* Indicates which temperature sensors set to use. */
-+ int temperature_set;
-+};
-+
-+static int debug = 0;
-+static struct platform_device *pdev;
-+static s16 rest_x;
-+static s16 rest_y;
-+static struct timer_list applesmc_timer;
-+static struct input_dev *applesmc_idev;
-+
-+/* Indicates whether this computer has an accelerometer. */
-+static unsigned int applesmc_accelerometer;
-+
-+/* Indicates whether this computer has light sensors and keyboard backlight. */
-+static unsigned int applesmc_light;
-+
-+/* Indicates which temperature sensors set to use. */
-+static unsigned int applesmc_temperature_set;
-+
-+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_lock.
-+ */
-+static int __wait_status(u8 val)
-+{
-+ unsigned int i;
-+
-+ val = val & APPLESMC_STATUS_MASK;
-+
-+ for (i = 0; i < 10000; i++) {
-+ if ((inb(APPLESMC_CMD_PORT) & APPLESMC_STATUS_MASK) == val)
-+ return 0;
-+ udelay(10);
-+ }
-+
-+ printk(KERN_WARNING "applesmc: wait status failed: %x != %x\n",
-+ val, inb(APPLESMC_CMD_PORT));
-+
-+ return -EIO;
-+}
-+
-+/*
-+ * 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_lock.
-+ */
-+static int applesmc_read_key(const char* key, u8* buffer, u8 len)
-+{
-+ int ret = -EIO;
-+ int i;
-+
-+ outb(APPLESMC_READ_CMD, APPLESMC_CMD_PORT);
-+ if (__wait_status(0x0c))
-+ goto out;
-+
-+ for (i = 0; i < 4; i++) {
-+ outb(key[i], APPLESMC_DATA_PORT);
-+ if (__wait_status(0x04))
-+ goto out;
-+ }
-+ if (debug)
-+ printk(KERN_DEBUG "<%s", key);
-+
-+ outb(len, APPLESMC_DATA_PORT);
-+ 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 "\n");
-+
-+ ret = 0;
-+
-+out:
-+ return ret;
-+}
-+
-+/*
-+ * 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_lock.
-+ */
-+static int applesmc_write_key(const char* key, u8* buffer, u8 len)
-+{
-+ int ret = -EIO;
-+ int i;
-+
-+ outb(APPLESMC_WRITE_CMD, APPLESMC_CMD_PORT);
-+ if (__wait_status(0x0c))
-+ goto out;
-+
-+ for (i = 0; i < 4; i++) {
-+ outb(key[i], APPLESMC_DATA_PORT);
-+ if (__wait_status(0x04))
-+ goto out;
-+ }
-+
-+ outb(len, APPLESMC_DATA_PORT);
-+
-+ for (i = 0; i < len; i++) {
-+ if (__wait_status(0x04))
-+ goto out;
-+ outb(buffer[i], APPLESMC_DATA_PORT);
-+ }
-+
-+ ret = 0;
-+out:
-+ return ret;
-+}
-+
-+/*
-+ * applesmc_read_motion_sensor - Read motion sensor (X, Y or Z). Callers must
-+ * hold applesmc_lock.
-+ */
-+static int applesmc_read_motion_sensor(int index, s16* value)
-+{
-+ u8 buffer[2];
-+ int ret;
-+
-+ switch (index) {
-+ case SENSOR_X:
-+ ret = applesmc_read_key(MOTION_SENSOR_X_KEY, buffer, 2);
-+ break;
-+ case SENSOR_Y:
-+ ret = applesmc_read_key(MOTION_SENSOR_Y_KEY, buffer, 2);
-+ break;
-+ case SENSOR_Z:
-+ ret = applesmc_read_key(MOTION_SENSOR_Z_KEY, buffer, 2);
-+ break;
-+ default:
-+ ret = -EINVAL;
-+ }
-+
-+ *value = ((s16)buffer[0] << 8) | buffer[1];
-+
-+ return ret;
-+}
-+
-+/*
-+ * applesmc_device_init - initialize the accelerometer. Returns zero on success
-+ * and negative error code on failure. Can sleep.
-+ */
-+static int applesmc_device_init(void)
-+{
-+ int total, ret = -ENXIO;
-+ u8 buffer[2];
-+
-+ if (!applesmc_accelerometer)
-+ return 0;
-+
-+ 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 (!applesmc_read_key(MOTION_SENSOR_KEY, buffer, 2) &&
-+ (buffer[0] != 0x00 || buffer[1] != 0x00)) {
-+ if (total == INIT_TIMEOUT_MSECS) {
-+ printk(KERN_DEBUG "applesmc: device has"
-+ " already been initialized"
-+ " (0x%02x, 0x%02x).\n",
-+ buffer[0], buffer[1]);
-+ } else {
-+ printk(KERN_DEBUG "applesmc: device"
-+ " successfully initialized"
-+ " (0x%02x, 0x%02x).\n",
-+ buffer[0], buffer[1]);
-+ }
-+ ret = 0;
-+ goto out;
-+ }
-+ buffer[0] = 0xe0;
-+ buffer[1] = 0x00;
-+ applesmc_write_key(MOTION_SENSOR_KEY, buffer, 2);
-+ msleep(INIT_WAIT_MSECS);
-+ }
-+
-+ printk(KERN_WARNING "applesmc: failed to init the device\n");
-+
-+out:
-+ mutex_unlock(&applesmc_lock);
-+ return ret;
-+}
-+
-+/*
-+ * applesmc_get_fan_count - get the number of fans. Callers must NOT hold
-+ * applesmc_lock.
-+ */
-+static int applesmc_get_fan_count(void)
-+{
-+ int ret;
-+ u8 buffer[1];
-+
-+ mutex_lock(&applesmc_lock);
-+
-+ ret = applesmc_read_key(FANS_COUNT, buffer, 1);
-+
-+ mutex_unlock(&applesmc_lock);
-+ if (ret)
-+ return ret;
-+ else
-+ return buffer[0];
-+}
-+
-+/* Device model stuff */
-+static int applesmc_probe(struct platform_device *dev)
-+{
-+ int ret;
-+
-+ ret = applesmc_device_init();
-+ if (ret)
-+ return ret;
-+
-+ printk(KERN_INFO "applesmc: device successfully initialized.\n");
-+ return 0;
-+}
-+
-+static int applesmc_resume(struct platform_device *dev)
-+{
-+ return applesmc_device_init();
-+}
-+
-+static struct platform_driver applesmc_driver = {
-+ .probe = applesmc_probe,
-+ .resume = applesmc_resume,
-+ .driver = {
-+ .name = "applesmc",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+/*
-+ * applesmc_calibrate - Set our "resting" values. Callers must
-+ * hold applesmc_lock.
-+ */
-+static void applesmc_calibrate(void)
-+{
-+ applesmc_read_motion_sensor(SENSOR_X, &rest_x);
-+ applesmc_read_motion_sensor(SENSOR_Y, &rest_y);
-+}
-+
-+static void applesmc_mousedev_poll(unsigned long unused)
-+{
-+ s16 x, y;
-+
-+ /* Cannot sleep. Try nonblockingly. If we fail, try again later. */
-+ if (!mutex_trylock(&applesmc_lock)) {
-+ mod_timer(&applesmc_timer, jiffies + APPLESMC_POLL_PERIOD);
-+ return;
-+ }
-+
-+ if (applesmc_read_motion_sensor(SENSOR_X, &x))
-+ goto out;
-+ 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);
-+
-+out:
-+ mod_timer(&applesmc_timer, jiffies + APPLESMC_POLL_PERIOD);
-+
-+ mutex_unlock(&applesmc_lock);
-+}
-+
-+/* Sysfs Files */
-+
-+static ssize_t applesmc_position_show(struct device *dev,
-+ struct device_attribute *attr, char *buf)
-+{
-+ int ret;
-+ s16 x, y, z;
-+
-+ mutex_lock(&applesmc_lock);
-+
-+ ret = applesmc_read_motion_sensor(SENSOR_X, &x);
-+ if (ret)
-+ goto out;
-+ ret = applesmc_read_motion_sensor(SENSOR_Y, &y);
-+ if (ret)
-+ goto out;
-+ ret = applesmc_read_motion_sensor(SENSOR_Z, &z);
-+ if (ret)
-+ goto out;
-+
-+out:
-+ mutex_unlock(&applesmc_lock);
-+ if (ret)
-+ return ret;
-+ else
-+ return sprintf(buf, "(%d,%d,%d)\n", x, y, z);
-+}
-+
-+static ssize_t applesmc_light_show(struct device *dev,
-+ struct device_attribute *attr, char *sysfsbuf)
-+{
-+ int ret;
-+ u8 left = 0, right = 0;
-+ u8 buffer[6];
-+
-+ mutex_lock(&applesmc_lock);
-+
-+ ret = applesmc_read_key(LIGHT_SENSOR_LEFT_KEY, buffer, 6);
-+ left = buffer[2];
-+ if (ret)
-+ goto out;
-+ ret = applesmc_read_key(LIGHT_SENSOR_RIGHT_KEY, buffer, 6);
-+ right = buffer[2];
-+
-+out:
-+ mutex_unlock(&applesmc_lock);
-+ if (ret)
-+ return ret;
-+ else
-+ return sprintf(sysfsbuf, "(%d,%d)\n", left, right);
-+}
-+
-+/* 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];
-+
-+ mutex_lock(&applesmc_lock);
-+
-+ ret = applesmc_read_key(key, buffer, 2);
-+ temp = buffer[0]*100;
-+ temp += (buffer[1] >> 6) * 25;
-+
-+ mutex_unlock(&applesmc_lock);
-+
-+ if (ret)
-+ return ret;
-+ else
-+ return sprintf(sysfsbuf, "%u\n", temp);
-+}
-+
-+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] = 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;
-+
-+ mutex_lock(&applesmc_lock);
-+
-+ ret = applesmc_read_key(newkey, buffer, 2);
-+ speed = ((buffer[0] << 8 | buffer[1]) >> 2);
-+
-+ mutex_unlock(&applesmc_lock);
-+ if (ret)
-+ return ret;
-+ else
-+ return sprintf(sysfsbuf, "%u\n", speed);
-+}
-+
-+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(sysfsbuf, NULL, 10);
-+
-+ if (speed > 0x4000) /* Bigger than a 14-bit value */
-+ return -EINVAL;
-+
-+ 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;
-+
-+ mutex_lock(&applesmc_lock);
-+
-+ buffer[0] = (speed >> 6) & 0xff;
-+ buffer[1] = (speed << 2) & 0xff;
-+ ret = applesmc_write_key(newkey, buffer, 2);
-+
-+ mutex_unlock(&applesmc_lock);
-+ if (ret)
-+ return ret;
-+ else
-+ return count;
-+}
-+
-+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);
-+
-+ mutex_lock(&applesmc_lock);
-+
-+ ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
-+ manual = ((buffer[0] << 8 | buffer[1]) >> attr->index) & 0x01;
-+
-+ mutex_unlock(&applesmc_lock);
-+ if (ret)
-+ return ret;
-+ else
-+ return sprintf(sysfsbuf, "%d\n", manual);
-+}
-+
-+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(sysfsbuf, NULL, 10);
-+
-+ mutex_lock(&applesmc_lock);
-+
-+ ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
-+ val = (buffer[0] << 8 | buffer[1]);
-+ if (ret)
-+ goto out;
-+
-+ if (input)
-+ val = val | (0x01 << attr->index);
-+ else
-+ val = val & ~(0x01 << attr->index);
-+
-+ buffer[0] = (val >> 8) & 0xFF;
-+ buffer[1] = val & 0xFF;
-+
-+ ret = applesmc_write_key(FANS_MANUAL, buffer, 2);
-+
-+out:
-+ mutex_unlock(&applesmc_lock);
-+ if (ret)
-+ return ret;
-+ else
-+ return count;
-+}
-+
-+static ssize_t applesmc_calibrate_show(struct device *dev,
-+ struct device_attribute *attr, char *sysfsbuf)
-+{
-+ 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 *sysfsbuf, size_t count)
-+{
-+ mutex_lock(&applesmc_lock);
-+ applesmc_calibrate();
-+ mutex_unlock(&applesmc_lock);
-+
-+ return count;
-+}
-+
-+static void applesmc_backlight_set(struct led_classdev *led_cdev,
-+ enum led_brightness value)
-+{
-+ u8 buffer[2];
-+
-+ mutex_lock(&applesmc_lock);
-+ buffer[0] = value;
-+ buffer[1] = 0x00;
-+ applesmc_write_key(BACKLIGHT_KEY, buffer, 2);
-+ mutex_unlock(&applesmc_lock);
-+}
-+
-+static struct led_classdev applesmc_backlight = {
-+ .name = "smc:kbd_backlight",
-+ .default_trigger = "nand-disk",
-+ .brightness_set = applesmc_backlight_set,
-+};
-+
-+static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL);
-+static DEVICE_ATTR(calibrate, 0644,
-+ applesmc_calibrate_show, applesmc_calibrate_store);
-+
-+static DEVICE_ATTR(light, 0444, applesmc_light_show, NULL);
-+
-+/*
-+ * Macro defining SENSOR_DEVICE_ATTR for a fan sysfs entries.
-+ * - show actual speed
-+ * - show/store minimum speed
-+ * - show maximum speed
-+ * - show safe speed
-+ * - show/store target speed
-+ * - show/store manual mode
-+ */
-+#define sysfs_fan_speeds_offset(offset) \
-+static SENSOR_DEVICE_ATTR_2(fan##offset##_actual_speed, S_IRUGO, \
-+ applesmc_show_fan_speed, NULL, 0, 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 SENSOR_DEVICE_ATTR_2(fan##offset##_maximum_speed, S_IRUGO, \
-+ applesmc_show_fan_speed, NULL, 2, offset); \
-+\
-+static SENSOR_DEVICE_ATTR_2(fan##offset##_safe_speed, S_IRUGO, \
-+ applesmc_show_fan_speed, NULL, 3, 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
-+ * (2 fans are supported)
-+ */
-+sysfs_fan_speeds_offset(0);
-+sysfs_fan_speeds_offset(1);
-+
-+static const struct attribute_group fan_attribute_groups[] = {
-+ { .attrs = fan0_attributes },
-+ { .attrs = fan1_attributes }
-+};
-+
-+/*
-+ * Temperature sensors sysfs entries.
-+ */
-+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);
-+
-+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,
-+};
-+
-+/* Module stuff */
-+
-+/*
-+ * applesmc_dmi_match - found a match. return one, short-circuiting the hunt.
-+ */
-+static int applesmc_dmi_match(struct dmi_system_id *id)
-+{
-+ int i = 0;
-+ 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",
-+ applesmc_accelerometer ? "with" : "without");
-+ applesmc_light = dmi_data->light;
-+ printk(KERN_INFO "applesmc: - Model %s light sensors and backlight\n",
-+ applesmc_light ? "with" : "without");
-+
-+ applesmc_temperature_set = dmi_data->temperature_set;
-+ while (temperature_sensors_sets[applesmc_temperature_set][i] != NULL)
-+ i++;
-+ printk(KERN_INFO "applesmc: - Model with %d temperature sensors\n", i);
-+ return 1;
-+}
-+
-+/* Create accelerometer ressources */
-+static int applesmc_create_accelerometer(void)
-+{
-+ int ret;
-+
-+ ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_position.attr);
-+ if (ret)
-+ goto out;
-+
-+ ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_calibrate.attr);
-+ if (ret)
-+ goto out;
-+
-+ applesmc_idev = input_allocate_device();
-+ if (!applesmc_idev) {
-+ ret = -ENOMEM;
-+ goto out;
-+ }
-+
-+ /* initial calibrate for the input device */
-+ applesmc_calibrate();
-+
-+ /* initialize the input class */
-+ applesmc_idev->name = "applesmc";
-+ applesmc_idev->cdev.dev = &pdev->dev;
-+ applesmc_idev->evbit[0] = BIT(EV_ABS);
-+ input_set_abs_params(applesmc_idev, ABS_X,
-+ -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
-+ input_set_abs_params(applesmc_idev, ABS_Y,
-+ -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
-+
-+ input_register_device(applesmc_idev);
-+
-+ /* start up our timer for the input device */
-+ init_timer(&applesmc_timer);
-+ applesmc_timer.function = applesmc_mousedev_poll;
-+ applesmc_timer.expires = jiffies + APPLESMC_POLL_PERIOD;
-+ add_timer(&applesmc_timer);
-+
-+ return 0;
-+
-+out:
-+ printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
-+ return ret;
-+}
-+
-+/* Release all ressources used by the accelerometer */
-+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;
-+
-+ mutex_init(&applesmc_lock);
-+
-+ if (!dmi_check_system(applesmc_whitelist)) {
-+ printk(KERN_WARNING "applesmc: supported laptop not found!\n");
-+ ret = -ENODEV;
-+ goto out;
-+ }
-+
-+ if (!request_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS,
-+ "applesmc")) {
-+ ret = -ENXIO;
-+ goto out;
-+ }
-+
-+ ret = platform_driver_register(&applesmc_driver);
-+ if (ret)
-+ goto out_region;
-+
-+ pdev = platform_device_register_simple("applesmc", -1, NULL, 0);
-+ if (IS_ERR(pdev)) {
-+ ret = PTR_ERR(pdev);
-+ goto out_driver;
-+ }
-+
-+ /* create fan files */
-+ count = applesmc_get_fan_count();
-+ if (count < 0) {
-+ printk(KERN_ERR "applesmc: Cannot get the number of fans.\n");
-+ } else {
-+ printk(KERN_INFO "applesmc: %d fans found.\n", count);
-+
-+ switch (count) {
-+ default:
-+ printk(KERN_WARNING "applesmc: More than 2 fans found,"
-+ " but at most 2 fans are supported"
-+ " by the driver.\n");
-+ case 2:
-+ ret = sysfs_create_group(&pdev->dev.kobj,
-+ &fan_attribute_groups[1]);
-+ if (ret)
-+ goto out_device;
-+ case 1:
-+ ret = sysfs_create_group(&pdev->dev.kobj,
-+ &fan_attribute_groups[0]);
-+ if (ret)
-+ goto out_device;
-+ case 0:
-+ ;
-+ }
-+ }
-+
-+ 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;
-+ }
-+
-+ if (applesmc_accelerometer) {
-+ ret = applesmc_create_accelerometer();
-+ if (ret)
-+ goto out_device;
-+ }
-+
-+ if (applesmc_light) {
-+ /* Add light sensor file */
-+ ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_light.attr);
-+ if (ret)
-+ goto out_accelerometer;
-+
-+ /* register as a led device */
-+ ret = led_classdev_register(&pdev->dev, &applesmc_backlight);
-+ if (ret < 0)
-+ goto out_accelerometer;
-+ }
-+
-+ printk(KERN_INFO "applesmc: driver successfully loaded.\n");
-+ return 0;
-+
-+out_accelerometer:
-+ if (applesmc_accelerometer)
-+ applesmc_release_accelerometer();
-+out_device:
-+ platform_device_unregister(pdev);
-+out_driver:
-+ platform_driver_unregister(&applesmc_driver);
-+out_region:
-+ release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
-+out:
-+ printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
-+ return ret;
-+}
-+
-+static void __exit applesmc_exit(void)
-+{
-+ if (applesmc_light)
-+ led_classdev_unregister(&applesmc_backlight);
-+ if (applesmc_accelerometer)
-+ applesmc_release_accelerometer();
-+ platform_device_unregister(pdev);
-+ platform_driver_unregister(&applesmc_driver);
-+ release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
-+
-+ printk(KERN_INFO "applesmc: driver unloaded.\n");
-+}
-+
-+module_init(applesmc_init);
-+module_exit(applesmc_exit);
-+
-+MODULE_AUTHOR("Nicolas Boichat");
-+MODULE_DESCRIPTION("Apple SMC");
-+MODULE_LICENSE("GPL v2");
Deleted: trunk/kernel/mactel-patches-2.6.21/0002-appleir.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0002-appleir.patch 2007-05-03 09:24:38 UTC (rev 121)
+++ trunk/kernel/mactel-patches-2.6.21/0002-appleir.patch 2007-05-04 03:16:41 UTC (rev 122)
@@ -1,424 +0,0 @@
-Apple IR patch.
-
-From: James McKenzie <ma...@ma...>
-
-
----
-
- drivers/usb/input/Kconfig | 4
- drivers/usb/input/Makefile | 1
- drivers/usb/input/appleir.c | 379 +++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 384 insertions(+), 0 deletions(-)
-
-diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig
-index 69a9f3b..f88c132 100644
---- a/drivers/usb/input/Kconfig
-+++ b/drivers/usb/input/Kconfig
-@@ -185,6 +185,10 @@ config USB_ACECAD
- To compile this driver as a module, choose M here: the
- module will be called acecad.
-
-+config USB_APPLEIR
-+ tristate "Apple Mac Mini USB IR receiver (built in)"
-+ depends on USB && INPUT
-+
- config USB_KBTAB
- tristate "KB Gear JamStudio tablet support"
- depends on USB && INPUT
-diff --git a/drivers/usb/input/Makefile b/drivers/usb/input/Makefile
-index a9d206c..31c2509 100644
---- a/drivers/usb/input/Makefile
-+++ b/drivers/usb/input/Makefile
-@@ -36,6 +36,7 @@ obj-$(CONFIG_USB_ATI_REMOTE2) += ati_remote2.o
- obj-$(CONFIG_USB_HID) += usbhid.o
- obj-$(CONFIG_USB_KBD) += usbkbd.o
- obj-$(CONFIG_USB_KBTAB) += kbtab.o
-+obj-$(CONFIG_USB_APPLEIR) += appleir.o
- obj-$(CONFIG_USB_KEYSPAN_REMOTE) += keyspan_remote.o
- obj-$(CONFIG_USB_MOUSE) += usbmouse.o
- obj-$(CONFIG_USB_MTOUCH) += mtouchusb.o
-diff --git a/drivers/usb/input/appleir.c b/drivers/usb/input/appleir.c
-new file mode 100644
-index 0000000..170cee6
---- /dev/null
-+++ b/drivers/usb/input/appleir.c
-@@ -0,0 +1,379 @@
-+/*
-+ * drivers/usb/input/appleir.c - driver for Apple Intel-based Macs IR Receiver
-+ *
-+ * Copyright (C) 2006 James McKenzie <ma...@ma...>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License v2 as published by the
-+ * Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/input.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/usb.h>
-+#include <linux/usb/input.h>
-+#include <linux/mutex.h>
-+#include <asm/unaligned.h>
-+#include <asm/byteorder.h>
-+
-+#define DRIVER_VERSION "v1.2"
-+#define DRIVER_AUTHOR "James McKenzie"
-+#define DRIVER_DESC "USB Apple MacIntel IR Receiver driver"
-+#define DRIVER_LICENSE "GPL"
-+
-+MODULE_AUTHOR(DRIVER_AUTHOR);
-+MODULE_DESCRIPTION(DRIVER_DESC);
-+MODULE_LICENSE(DRIVER_LICENSE);
-+
-+#define USB_VENDOR_ID_APPLE 0x05ac
-+#define USB_DEVICE_ID_APPLE_IR 0x8240
-+
-+#define URB_SIZE 32
-+
-+#define MAX_KEYS 8
-+#define MAX_KEYS_MASK (MAX_KEYS - 1)
-+
-+static int debug = 1;
-+
-+struct appleir {
-+ struct input_dev *dev;
-+ uint8_t *data;
-+ dma_addr_t dma_buf;
-+ struct usb_device *usbdev;
-+ struct urb *urb;
-+ struct timer_list key_up_timer;
-+ int current_key;
-+ char phys[32];
-+};
-+
-+
-+static struct usb_device_id appleir_ids[] = {
-+ {
-+ USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IR),
-+ .driver_info = 0
-+ },
-+ {}
-+};
-+
-+MODULE_DEVICE_TABLE(usb, appleir_ids);
-+
-+/*
-+ * Devices report the following, where XX depends on the remote and/or the
-+ * receiver (at least 2a, 83, ca, ee have been reported as possible values, it
-+ * looks like it is remote control dependent).
-+ * The fifth byte's LSB also depends on the hardware.
-+ * 25 87 ee XX 0a/0b +
-+ * 25 87 ee XX 0c/0d -
-+ * 25 87 ee XX 09/08 <<
-+ * 25 87 ee XX 06/07 >>
-+ * 25 87 ee XX 05/04 >"
-+ * 25 87 ee 83 03/02 menu
-+ * 26 00 00 00 00 for key repeat
-+ *
-+ * Thomas Glanzmann also observes the following event sometimes sent after a key
-+ * is released, which I interpret as a flat battery message:
-+ * 25 87 e0 ca 06 flat battery
-+ */
-+
-+static int keymap[MAX_KEYS] = {
-+ KEY_RESERVED, KEY_MENU,
-+ KEY_PLAYPAUSE, KEY_NEXTSONG,
-+ KEY_PREVIOUSSONG, KEY_VOLUMEUP,
-+ KEY_VOLUMEDOWN, KEY_RESERVED
-+};
-+
-+static void dump_packet(struct appleir *appleir, char *msg,
-+ uint8_t * data, int len)
-+{
-+ int i;
-+
-+ printk(KERN_ERR "appleir: %s (%d bytes)", msg, len);
-+
-+ for (i = 0; i < len; ++i) {
-+ printk(" %02x", data[i]);
-+ }
-+
-+ printk("\n");
-+}
-+
-+
-+static void key_up(struct appleir *appleir, int key)
-+{
-+ if (debug)
-+ printk (KERN_DEBUG "key %d up\n", key);
-+
-+ input_report_key(appleir->dev, key, 0);
-+ input_sync(appleir->dev);
-+}
-+
-+static void key_down(struct appleir *appleir, int key)
-+{
-+ if (debug)
-+ printk (KERN_DEBUG "key %d down\n", key);
-+
-+ input_report_key(appleir->dev, key, 1);
-+ input_sync(appleir->dev);
-+}
-+
-+static void battery_flat(struct appleir *appleir)
-+{
-+ printk(KERN_WARNING "appleir: possible flat battery?\n");
-+}
-+
-+static void key_up_tick(unsigned long data)
-+{
-+ struct appleir *apple_ir = (struct appleir*)data;
-+
-+ if (apple_ir->current_key) {
-+ key_up(apple_ir, apple_ir->current_key);
-+ apple_ir->current_key = 0;
-+ }
-+}
-+
-+static void parse_data(struct appleir *apple_ir, uint8_t *data, int len)
-+{
-+ static const uint8_t keydown[] = { 0x25, 0x87, 0xee };
-+ static const uint8_t keyrepeat[] = { 0x26, 0x00, 0x00, 0x00, 0x00 };
-+ static const uint8_t flatbattery[] = { 0x25, 0x87, 0xe0 };
-+
-+ if (debug)
-+ dump_packet(apple_ir, "received", data, len);
-+
-+ if (len != 5)
-+ return;
-+
-+ if (!memcmp(data, keydown, sizeof(keydown))) {
-+ /*
-+ * If we already have a key down, take it up before marking
-+ * this one down.
-+ */
-+ if (apple_ir->current_key)
-+ key_up(apple_ir, apple_ir->current_key);
-+ apple_ir->current_key = keymap[(data[4] >> 1) & MAX_KEYS_MASK];
-+
-+ key_down(apple_ir, apple_ir->current_key);
-+
-+ /*
-+ * Remote doesn't do key up, either pull them up, in the test
-+ * above, or here set a timer which pulls them up after 1/8 s
-+ */
-+ mod_timer(&apple_ir->key_up_timer, jiffies + HZ / 8);
-+
-+ return;
-+ }
-+
-+ if (!memcmp(data, keyrepeat, sizeof(keyrepeat))) {
-+ key_down(apple_ir, apple_ir->current_key);
-+
-+ /*
-+ * Remote doesn't do key up, either pull them up, in the test
-+ * above, or here set a timer which pulls them up after 1/8 s
-+ */
-+ mod_timer(&apple_ir->key_up_timer, jiffies + HZ / 8);
-+ return;
-+ }
-+
-+ if (!memcmp(data, flatbattery, sizeof(flatbattery))) {
-+ battery_flat(apple_ir);
-+ /* Fall through */
-+ }
-+
-+ dump_packet(apple_ir, "unknown packet", data, len);
-+}
-+
-+static void appleir_urb(struct urb *urb)
-+{
-+ struct appleir *appleir = urb->context;
-+ int retval;
-+
-+ switch (urb->status) {
-+ case 0:
-+ parse_data(appleir, urb->transfer_buffer, urb->actual_length);
-+ break;
-+ case -ECONNRESET:
-+ case -ENOENT:
-+ case -ESHUTDOWN:
-+ /* this urb is terminated, clean up */
-+ dbg("%s - urb shutting down with status: %d",
-+ __FUNCTION__, urb->status);
-+ return;
-+ default:
-+ dbg("%s - nonzero urb status received: %d",
-+ __FUNCTION__, urb->status);
-+ }
-+
-+ retval = usb_submit_urb(urb, GFP_ATOMIC);
-+ if (retval)
-+ err("%s - usb_submit_urb failed with result %d",
-+ __FUNCTION__, retval);
-+}
-+
-+
-+static int appleir_open(struct input_dev *dev)
-+{
-+ struct appleir *appleir = dev->private;
-+
-+ if (usb_submit_urb(appleir->urb, GFP_KERNEL))
-+ return -EIO;
-+
-+ return 0;
-+}
-+
-+static void appleir_close(struct input_dev *dev)
-+{
-+ struct appleir *appleir = dev->private;
-+ usb_kill_urb(appleir->urb);
-+ del_timer_sync(&appleir->key_up_timer);
-+}
-+
-+static int appleir_probe(struct usb_interface *intf,
-+ const struct usb_device_id *id)
-+{
-+ struct usb_device *dev = interface_to_usbdev(intf);
-+ struct usb_endpoint_descriptor *endpoint;
-+ struct appleir *appleir = NULL;
-+ struct input_dev *input_dev;
-+ int i;
-+ int ret = -ENOMEM;
-+
-+ appleir = kzalloc(sizeof(struct appleir), GFP_KERNEL);
-+ if (!appleir)
-+ goto fail;
-+
-+ memset(appleir, 0, sizeof(struct appleir));
-+
-+ appleir->data =
-+ usb_buffer_alloc(dev, URB_SIZE, GFP_KERNEL, &appleir->dma_buf);
-+ if (!appleir->data)
-+ goto fail_appleir;
-+
-+ appleir->urb = usb_alloc_urb(0, GFP_KERNEL);
-+ if (!appleir->urb)
-+ goto fail_buffer;
-+
-+ appleir->usbdev = dev;
-+
-+ input_dev = input_allocate_device();
-+ if (!input_dev)
-+ goto fail_urb;
-+
-+ appleir->dev = input_dev;
-+
-+ if (usb_make_path(dev, appleir->phys, sizeof(appleir->phys)) < 0)
-+ goto fail_input_device;
-+
-+ strlcpy(appleir->phys, "/input0", sizeof(appleir->phys));
-+
-+ input_dev->name = "Apple MacIntel infrared remote control driver";
-+ input_dev->phys = appleir->phys;
-+ usb_to_input_id(dev, &input_dev->id);
-+ input_dev->cdev.dev = &intf->dev;
-+ input_dev->private = appleir;
-+
-+ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
-+ input_dev->ledbit[0] = 0;
-+
-+ for (i = 0; i < MAX_KEYS; i++) {
-+ set_bit(keymap[i], input_dev->keybit);
-+ }
-+
-+ clear_bit(0, input_dev->keybit);
-+
-+ input_dev->open = appleir_open;
-+ input_dev->close = appleir_close;
-+
-+ endpoint = &intf->cur_altsetting->endpoint[0].desc;
-+
-+ usb_fill_int_urb(appleir->urb, dev,
-+ usb_rcvintpipe(dev, endpoint->bEndpointAddress),
-+ appleir->data, 8,
-+ appleir_urb, appleir, endpoint->bInterval);
-+
-+ appleir->urb->transfer_dma = appleir->dma_buf;
-+ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-+
-+ usb_set_intfdata(intf, appleir);
-+
-+ init_timer(&appleir->key_up_timer);
-+
-+ appleir->key_up_timer.function = key_up_tick;
-+ appleir->key_up_timer.data = (unsigned long) appleir;
-+
-+ ret = input_register_device(appleir->dev);
-+ if (ret < 0)
-+ goto fail_timer;
-+
-+ return 0;
-+
-+fail_timer:
-+ del_timer_sync(&appleir->key_up_timer);
-+
-+fail_input_device:
-+ input_free_device(appleir->dev);
-+
-+fail_urb:
-+ usb_free_urb(appleir->urb);
-+
-+fail_buffer:
-+ usb_buffer_free(dev, URB_SIZE, appleir->data, appleir->dma_buf);
-+
-+fail_appleir:
-+ kfree(appleir);
-+
-+fail:
-+ return ret;
-+}
-+
-+static void appleir_disconnect(struct usb_interface *intf)
-+{
-+ struct appleir *appleir = usb_get_intfdata(intf);
-+
-+ usb_set_intfdata(intf, NULL);
-+ if (appleir) {
-+ input_unregister_device(appleir->dev);
-+ del_timer_sync(&appleir->key_up_timer);
-+ usb_kill_urb(appleir->urb);
-+ usb_free_urb(appleir->urb);
-+ usb_buffer_free(interface_to_usbdev(intf), URB_SIZE,
-+ appleir->data, appleir->dma_buf);
-+ kfree(appleir);
-+ }
-+}
-+
-+static struct usb_driver appleir_driver = {
-+ .name = "appleir",
-+ .probe = appleir_probe,
-+ .disconnect = appleir_disconnect,
-+ .id_table = appleir_ids,
-+};
-+
-+static int __init appleir_init(void)
-+{
-+ int retval;
-+ retval = usb_register(&appleir_driver);
-+ if (retval)
-+ goto out;
-+ info(DRIVER_VERSION ":" DRIVER_DESC);
-+ out:
-+ return retval;
-+}
-+
-+static void __exit appleir_exit(void)
-+{
-+ usb_deregister(&appleir_driver);
-+}
-+
-+module_init(appleir_init);
-+module_exit(appleir_exit);
Deleted: trunk/kernel/mactel-patches-2.6.21/0003-msr-on-cpu.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0003-msr-on-cpu.patch 2007-05-03 09:24:38 UTC (rev 121)
+++ trunk/kernel/mactel-patches-2.6.21/0003-msr-on-cpu.patch 2007-05-04 03:16:41 UTC (rev 122)
@@ -1,204 +0,0 @@
-This patch adds support for _safe (exception handled) variants of rdmsr_on_cpu and wrmsr_on_cpu. This is needed for the new coretemp driver, which might step into non-existing MSR (poorly documented). -- FROM UPSTREAM - in mm
-
-From: Rudolf Marek <r....@as...>
-
-
----
-
- arch/i386/lib/msr-on-cpu.c | 71 ++++++++++++++++++++++++++++++++++++++++----
- include/asm-i386/msr.h | 12 +++++++
- include/asm-x86_64/msr.h | 11 +++++++
- 3 files changed, 87 insertions(+), 7 deletions(-)
-
-diff --git a/arch/i386/lib/msr-on-cpu.c b/arch/i386/lib/msr-on-cpu.c
-index 1c46bda..bd9920b 100644
---- a/arch/i386/lib/msr-on-cpu.c
-+++ b/arch/i386/lib/msr-on-cpu.c
-@@ -6,6 +6,7 @@
- struct msr_info {
- u32 msr_no;
- u32 l, h;
-+ int err;
- };
-
- static void __rdmsr_on_cpu(void *info)
-@@ -15,20 +16,38 @@ static void __rdmsr_on_cpu(void *info)
- rdmsr(rv->msr_no, rv->l, rv->h);
- }
-
--void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
-+static void __rdmsr_safe_on_cpu(void *info)
- {
-+ struct msr_info *rv = info;
-+
-+ rv->err = rdmsr_safe(rv->msr_no, &rv->l, &rv->h);
-+}
-+
-+static int _rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h, int safe)
-+{
-+ int err = 0;
- preempt_disable();
- if (smp_processor_id() == cpu)
-- rdmsr(msr_no, *l, *h);
-+ if (safe)
-+ err = rdmsr_safe(msr_no, l, h);
-+ else
-+ rdmsr(msr_no, *l, *h);
- else {
- struct msr_info rv;
-
- rv.msr_no = msr_no;
-- smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 0, 1);
-+ if (safe) {
-+ smp_call_function_single(cpu, __rdmsr_safe_on_cpu,
-+ &rv, 0, 1);
-+ err = rv.err;
-+ } else {
-+ smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 0, 1);
-+ }
- *l = rv.l;
- *h = rv.h;
- }
- preempt_enable();
-+ return err;
- }
-
- static void __wrmsr_on_cpu(void *info)
-@@ -38,21 +57,61 @@ static void __wrmsr_on_cpu(void *info)
- wrmsr(rv->msr_no, rv->l, rv->h);
- }
-
--void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
-+static void __wrmsr_safe_on_cpu(void *info)
- {
-+ struct msr_info *rv = info;
-+
-+ rv->err = wrmsr_safe(rv->msr_no, rv->l, rv->h);
-+}
-+
-+static int _wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h, int safe)
-+{
-+ int err = 0;
- preempt_disable();
- if (smp_processor_id() == cpu)
-- wrmsr(msr_no, l, h);
-+ if (safe)
-+ err = wrmsr_safe(msr_no, l, h);
-+ else
-+ wrmsr(msr_no, l, h);
- else {
- struct msr_info rv;
-
- rv.msr_no = msr_no;
- rv.l = l;
- rv.h = h;
-- smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 0, 1);
-+ if (safe) {
-+ smp_call_function_single(cpu, __wrmsr_safe_on_cpu,
-+ &rv, 0, 1);
-+ err = rv.err;
-+ } else {
-+ smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 0, 1);
-+ }
- }
- preempt_enable();
-+ return err;
-+}
-+
-+void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
-+{
-+ _wrmsr_on_cpu(cpu, msr_no, l, h, 0);
-+}
-+
-+void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
-+{
-+ _rdmsr_on_cpu(cpu, msr_no, l, h, 0);
-+}
-+
-+int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
-+{
-+ return _wrmsr_on_cpu(cpu, msr_no, l, h, 1);
-+}
-+
-+int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
-+{
-+ return _rdmsr_on_cpu(cpu, msr_no, l, h, 1);
- }
-
- EXPORT_SYMBOL(rdmsr_on_cpu);
- EXPORT_SYMBOL(wrmsr_on_cpu);
-+EXPORT_SYMBOL(rdmsr_safe_on_cpu);
-+EXPORT_SYMBOL(wrmsr_safe_on_cpu);
-diff --git a/include/asm-i386/msr.h b/include/asm-i386/msr.h
-index 2ad3f30..e6a2a34 100644
---- a/include/asm-i386/msr.h
-+++ b/include/asm-i386/msr.h
-@@ -4,7 +4,7 @@
- #ifdef CONFIG_PARAVIRT
- #include <asm/paravirt.h>
- #else
--
-+#include <linux/errno.h>
- /*
- * Access to machine-specific registers (available on 586 and better only)
- * Note: the rd* operations modify the parameters directly (without using
-@@ -86,6 +86,8 @@ static inline void wrmsrl (unsigned long msr, unsigned long long val)
- #ifdef CONFIG_SMP
- void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h);
- void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h);
-+int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h);
-+int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h);
- #else /* CONFIG_SMP */
- static inline void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
- {
-@@ -95,6 +97,14 @@ static inline void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
- {
- wrmsr(msr_no, l, h);
- }
-+static inline int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
-+{
-+ return rdmsr_safe(msr_no, l, h);
-+}
-+static inline int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
-+{
-+ return wrmsr_safe(msr_no, l, h);
-+}
- #endif /* CONFIG_SMP */
-
- /* symbolic names for some interesting MSRs */
-diff --git a/include/asm-x86_64/msr.h b/include/asm-x86_64/msr.h
-index 902f9a5..0327f66 100644
---- a/include/asm-x86_64/msr.h
-+++ b/include/asm-x86_64/msr.h
-@@ -2,6 +2,7 @@
- #define X86_64_MSR_H 1
-
- #ifndef __ASSEMBLY__
-+#include <linux/errno.h>
- /*
- * Access to machine-specific registers (available on 586 and better only)
- * Note: the rd* operations modify the parameters directly (without using
-@@ -163,6 +164,8 @@ static inline unsigned int cpuid_edx(unsigned int op)
- #ifdef CONFIG_SMP
- void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h);
- void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h);
-+int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h);
-+int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h);
- #else /* CONFIG_SMP */
- static inline void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
- {
-@@ -172,6 +175,14 @@ static inline void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
- {
- wrmsr(msr_no, l, h);
- }
-+static inline int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
-+{
-+ return rdmsr_safe(msr_no, l, h);
-+}
-+static inline int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
-+{
-+ return wrmsr_safe(msr_no, l, h);
-+}
- #endif /* CONFIG_SMP */
-
- #endif
Deleted: trunk/kernel/mactel-patches-2.6.21/0004-coretemp.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0004-coretemp.patch 2007-05-03 09:24:38 UTC (rev 121)
+++ trunk/kernel/mactel-patches-2.6.21/0004-coretemp.patch 2007-05-04 03:16:41 UTC (rev 122)
@@ -1,516 +0,0 @@
-Intel Core CPU temperature monitor driver. -- FROM UPSTREAM - in mm
-
-From: lm-sensors mailing list <?>
-
-
----
-
- Documentation/hwmon/coretemp | 36 ++++
- MAINTAINERS | 6 +
- drivers/hwmon/Kconfig | 8 +
- drivers/hwmon/Makefile | 1
- drivers/hwmon/coretemp.c | 406 ++++++++++++++++++++++++++++++++++++++++++
- 5 files changed, 457 insertions(+), 0 deletions(-)
-
-diff --git a/Documentation/hwmon/coretemp b/Documentation/hwmon/coretemp
-new file mode 100644
-index 0000000..870cda9
---- /dev/null
-+++ b/Documentation/hwmon/coretemp
-@@ -0,0 +1,36 @@
-+Kernel driver coretemp
-+======================
-+
-+Supported chips:
-+ * All Intel Core family
-+ Prefix: 'coretemp'
-+ CPUID: family 0x6, models 0xe, 0xf
-+ Datasheet: Intel 64 and IA-32 Architectures Software Developer's Manual
-+ Volume 3A: System Programming Guide
-+
-+Author: Rudolf Marek
-+
-+Description
-+-----------
-+
-+This driver permits reading temperature sensor embedded inside Intel Core CPU.
-+Temperature is measured in degrees Celsius and measurement resolution is
-+1 degree C. Valid temperatures are from 0 to TjMax degrees C, because
-+the actual value of temperature register is in fact a delta from TjMax.
-+
-+Temperature known as TjMax is the maximum junction temperature of processor.
-+Intel defines this temperature as 85C or 100C. At this temperature, protection
-+mechanism will perform actions to forcibly cool down the processor. Alarm
-+may be raised, if the temperature grows enough (more than TjMax) to trigger
-+the Out-Of-Spec bit. Following table summarizes the exported sysfs files:
-+
-+temp1_input - Core temperature (in millidegrees Celsius).
-+temp1_crit - Maximum junction temperature (in millidegrees Celsius).
-+temp1_crit_alarm - Set when Out-of-spec bit is set, never clears.
-+ Correct CPU operation is no longer guaranteed.
-+temp1_label - Contains string "Core X", where X is processor
-+ number.
-+
-+The TjMax temperature is set to 85 degrees C if undocumented model specific
-+register (UMSR) 0xee has bit 30 set. If not the TjMax is 100 degrees C as
-+(sometimes) documented in processor datasheet.
-diff --git a/MAINTAINERS b/MAINTAINERS
-index 4b83092..3624a10 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -973,6 +973,12 @@ M: mh...@wi...
- W: http://www.wittsend.com/computone.html
- S: Maintained
-
-+CORETEMP HARDWARE MONITORING DRIVER
-+P: Rudolf Marek
-+M: r....@as...
-+L: lm-...@lm...
-+S: Maintained
-+
- COSA/SRP SYNC SERIAL DRIVER
- P: Jan "Yenya" Kasprzak
- M: ka...@fi...
-diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
-index 25b72a4..1d19717 100644
---- a/drivers/hwmon/Kconfig
-+++ b/drivers/hwmon/Kconfig
-@@ -167,6 +167,14 @@ config SENSORS_ATXP1
- This driver can also be built as a module. If so, the module
- will be called atxp1.
-
-+config SENSORS_CORETEMP
-+ tristate "Intel Core (2) Duo/Solo temperature sensor"
-+ depends on HWMON && X86 && EXPERIMENTAL
-+ help
-+ If you say yes here you get support for the temperature
-+ sensor inside your CPU. Supported all are all known variants
-+ of Intel Core family.
-+
- config SENSORS_DS1621
- tristate "Dallas Semiconductor DS1621 and DS1625"
- depends on HWMON && I2C
-diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
-index 544f8d8..06e86f5 100644
---- a/drivers/hwmon/Makefile
-+++ b/drivers/hwmon/Makefile
-@@ -23,6 +23,7 @@ obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o
- obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o
- obj-$(CONFIG_SENSORS_AMS) += ams/
- obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
-+obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o
- obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
- obj-$(CONFIG_SENSORS_F71805F) += f71805f.o
- obj-$(CONFIG_SENSORS_FSCHER) += fscher.o
-diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
-new file mode 100644
-index 0000000..a6d19c8
---- /dev/null
-+++ b/drivers/hwmon/coretemp.c
-@@ -0,0 +1,406 @@
-+/*
-+ * coretemp.c - Linux kernel module for hardware monitoring
-+ *
-+ * Copyright (C) 2007 Rudolf Marek <r....@as...>
-+ *
-+ * Inspired from many hwmon drivers
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; version 2 of the License.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-+ * 02110-1301 USA.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/delay.h>
-+#include <linux/init.h>
-+#include <linux/slab.h>
-+#include <linux/jiffies.h>
-+#include <linux/hwmon.h>
-+#include <linux/sysfs.h>
-+#include <linux/hwmon-sysfs.h>
-+#include <linux/err.h>
-+#include <linux/mutex.h>
-+#include <linux/list.h>
-+#include <linux/platform_device.h>
-+#include <linux/cpu.h>
-+#include <asm/msr.h>
-+#include <asm/processor.h>
-+
-+#define DRVNAME "coretemp"
-+
-+typedef enum { SHOW_TEMP, SHOW_TJMAX, SHOW_LABEL, SHOW_NAME } SHOW;
-+
-+/*
-+ * Functions declaration
-+ */
-+
-+static struct coretemp_data *coretemp_update_device(struct device *dev);
-+
-+struct coretemp_data {
-+ struct class_device *class_dev;
-+ struct mutex update_lock;
-+ const char *name;
-+ u32 id;
-+ char valid; /* zero until following fields are valid */
-+ unsigned long last_updated; /* in jiffies */
-+ int temp;
-+ int tjmax;
-+ u8 alarm;
-+};
-+
-+static struct coretemp_data *coretemp_update_device(struct device *dev);
-+
-+/*
-+ * Sysfs stuff
-+ */
-+
-+static ssize_t show_name(struct device *dev, struct device_attribute
-+ *devattr, char *buf)
-+{
-+ int ret;
-+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
-+ struct coretemp_data *data = dev_get_drvdata(dev);
-+
-+ if (attr->index == SHOW_NAME)
-+ ret = sprintf(buf, "%s\n", data->name);
-+ else /* show label */
-+ ret = sprintf(buf, "Core %d\n", data->id);
-+ return ret;
-+}
-+
-+static ssize_t show_alarm(struct device *dev, struct device_attribute
-+ *devattr, char *buf)
-+{
-+ struct coretemp_data *data = coretemp_update_device(dev);
-+ /* read the Out-of-spec log, never clear */
-+ return sprintf(buf, "%d\n", data->alarm);
-+}
-+
-+static ssize_t show_temp(struct device *dev,
-+ struct device_attribute *devattr, char *buf)
-+{
-+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
-+ struct coretemp_data *data = coretemp_update_device(dev);
-+ int err;
-+
-+ if (attr->index == SHOW_TEMP)
-+ err = data->valid ? sprintf(buf, "%d\n", data->temp) : -EAGAIN;
-+ else
-+ err = sprintf(buf, "%d\n", data->tjmax);
-+
-+ return err;
-+}
-+
-+static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL,
-+ SHOW_TEMP);
-+static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_temp, NULL,
-+ SHOW_TJMAX);
-+static DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL);
-+static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, show_name, NULL, SHOW_LABEL);
-+static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, SHOW_NAME);
-+
-+static struct attribute *coretemp_attributes[] = {
-+ &sensor_dev_attr_name.dev_attr.attr,
-+ &sensor_dev_attr_temp1_label.dev_attr.attr,
-+ &dev_attr_temp1_crit_alarm.attr,
-+ &sensor_dev_attr_temp1_input.dev_attr.attr,
-+ &sensor_dev_attr_temp1_crit.dev_attr.attr,
-+ NULL
-+};
-+
-+static const struct attribute_group coretemp_group = {
-+ .attrs = coretemp_attributes,
-+};
-+
-+static struct coretemp_data *coretemp_update_device(struct device *dev)
-+{
-+ struct coretemp_data *data = dev_get_drvdata(dev);
-+
-+ mutex_lock(&data->update_lock);
-+
-+ if (!data->valid || time_after(jiffies, data->last_updated + HZ)) {
-+ u32 eax, edx;
-+
-+ data->valid = 0;
-+ rdmsr_on_cpu(data->id, MSR_IA32_THERM_STATUS, &eax, &edx);
-+ data->alarm = (eax >> 5) & 1;
-+ /* update only if data has been valid */
-+ if (eax & 0x80000000) {
-+ data->temp = data->tjmax - (((eax >> 16)
-+ & 0x7f) * 1000);
-+ data->valid = 1;
-+ } else {
-+ dev_dbg(dev, "Temperature data invalid (0x%x)\n", eax);
-+ }
-+ data->last_updated = jiffies;
-+ }
-+
-+ mutex_unlock(&data->update_lock);
-+ return data;
-+}
-+
-+static int __devinit coretemp_probe(struct platform_device *pdev)
-+{
-+ struct coretemp_data *data;
-+ struct cpuinfo_x86 *c = &(cpu_data)[pdev->id];
-+ int err;
-+ u32 eax, edx;
-+
-+ if (!(data = kzalloc(sizeof(struct coretemp_data), GFP_KERNEL))) {
-+ err = -ENOMEM;
-+ dev_err(&pdev->dev, "Out of memory\n");
-+ goto exit;
-+ }
-+
-+ data->id = pdev->id;
-+ data->name = "coretemp";
-+ mutex_init(&data->update_lock);
-+ /* Tjmax default is 100 degrees C */
-+ data->tjmax = 100000;
-+
-+ /* test if we can access the THERM_STATUS MSR */
-+ err = rdmsr_safe_on_cpu(data->id, MSR_IA32_THERM_STATUS, &eax, &edx);
-+ if (err) {
-+ dev_err(&pdev->dev,
-+ "Unable to access THERM_STATUS MSR, giving up\n");
-+ goto exit_free;
-+ }
-+
-+ /* Some processors have Tjmax 85 following magic should detect it
-+ Intel won't disclose the information without signed NDA, but
-+ individuals cannot sign it. Catch(ed) 22.
-+ */
-+
-+ if (((c->x86_model == 0xf) && (c->x86_mask > 3)) ||
-+ (c->x86_model == 0xe)) {
-+ err = rdmsr_safe_on_cpu(data->id, 0xee, &eax, &edx);
-+ if (err) {
-+ dev_warn(&pdev->dev,
-+ "Unable to access MSR 0xEE, Tjmax left at %d"
-+ "C\n", data->tjmax/1000);
-+ } else if (eax & 0x40000000) {
-+ data->tjmax = 85000;
-+ }
-+ }
-+
-+ platform_set_drvdata(pdev, data);
-+
-+ if ((err = sysfs_create_group(&pdev->dev.kobj, &coretemp_group)))
-+ goto exit_free;
-+
-+ data->class_dev = hwmon_device_register(&pdev->dev);
-+ if (IS_ERR(data->class_dev)) {
-+ err = PTR_ERR(data->class_dev);
-+ dev_err(&pdev->dev, "Class registration failed (%d)\n",
-+ err);
-+ goto exit_class;
-+ }
-+
-+ return 0;
-+
-+exit_class:
-+ sysfs_remove_group(&pdev->dev.kobj, &coretemp_group);
-+exit_free:
-+ kfree(data);
-+exit:
-+ return err;
-+}
-+
-+static int __devexit coretemp_remove(struct platform_device *pdev)
-+{
-+ struct coretemp_data *data = platform_get_drvdata(pdev);
-+
-+ hwmon_device_unregister(data->class_dev);
-+ sysfs_remove_group(&pdev->dev.kobj, &coretemp_group);
-+ platform_set_drvdata(pdev, NULL);
-+ kfree(data);
-+ return 0;
-+}
-+
-+static struct platform_driver coretemp_driver = {
-+ .driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRVNAME,
-+ },
-+ .probe = coretemp_probe,
-+ .remove = __devexit_p(coretemp_remove),
-+};
-+
-+struct pdev_entry {
-+ struct list_head list;
-+ struct platform_device *pdev;
-+ unsigned int cpu;
-+};
-+
-+static LIST_HEAD(pdev_list);
-+static DEFINE_MUTEX(pdev_list_mutex);
-+
-+static int __cpuinit coretemp_device_add(unsigned int cpu)
-+{
-+ int err;
-+ struct platform_device *pdev;
-+ struct pdev_entry *pdev_entry;
-+
-+ pdev = platform_device_alloc(DRVNAME, cpu);
-+ if (!pdev) {
-+ err = -ENOMEM;
-+ printk(KERN_ERR DRVNAME ": Device allocation fail...
[truncated message content] |