|
From: <nbo...@us...> - 2006-08-09 03:54:12
|
Revision: 37 Author: nboichat Date: 2006-08-08 20:53:56 -0700 (Tue, 08 Aug 2006) ViewCVS: http://svn.sourceforge.net/mactel-linux/?rev=37&view=rev Log Message: ----------- Updated patchset for 2.6.18-rc4 (see ChangeLog). Added Paths: ----------- trunk/kernel/mactel-patches-2.6.18/ trunk/kernel/mactel-patches-2.6.18/Changelog trunk/kernel/mactel-patches-2.6.18/acpi-blacklist-fix.patch trunk/kernel/mactel-patches-2.6.18/applesmc.patch trunk/kernel/mactel-patches-2.6.18/apply trunk/kernel/mactel-patches-2.6.18/efi_e820_all_mapped_fix.patch trunk/kernel/mactel-patches-2.6.18/ir.patch trunk/kernel/mactel-patches-2.6.18/mouseemu.patch trunk/kernel/mactel-patches-2.6.18/piix.ich7.patch trunk/kernel/mactel-patches-2.6.18/s3.patch trunk/kernel/mactel-patches-2.6.18/sci_en.patch trunk/kernel/mactel-patches-2.6.18/sigmatel_audio.patch trunk/kernel/mactel-patches-2.6.18/unapply trunk/kernel/mactel-patches-2.6.18/usb-storage-zerowait.patch trunk/kernel/mactel-patches-2.6.18/version.patch Added: trunk/kernel/mactel-patches-2.6.18/Changelog =================================================================== --- trunk/kernel/mactel-patches-2.6.18/Changelog (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/Changelog 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,33 @@ +Changes since 2.6.17: + +Unchanged: +acpi-blacklist-fix.patch +ir.patch +s3.patch +usb-storage-zerowait.patch + +Updated: +applesmc.patch: offsets +efi_e820_all_mapped_fix.patch: offsets +mouseemu.patch: offsets + removed useless hunk for x86 +piix.ich7.patch: offsets +sigmatel_audio.patch: various fixes +version.patch + +Updated, need check: +sci_en.patch: updated from mailing list + offsets + +Removed: +appletouch.patch: included in kernel +intelfb-945g.patch: included in kernel, in a cleanest way +keyboard_hid.patch + +Removed, need check: +acpi-smart-battery.patch: included in vanilla (not absolutely sure) +intel_mac_sata_resume_fix.patch: major changes in vanilla kernel, maybe is it not needed anymore +sata_resume.patch: same as intel_mac_sata_resume_fix.patch + +To be updated: +config-2.6.18 +config-2.6.18-MBP +imacfb.patch: included in kernel, but maybe gimli did other updates Added: trunk/kernel/mactel-patches-2.6.18/acpi-blacklist-fix.patch =================================================================== --- trunk/kernel/mactel-patches-2.6.18/acpi-blacklist-fix.patch (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/acpi-blacklist-fix.patch 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,13 @@ +--- a/drivers/acpi/blacklist.c 2006-06-26 08:32:21.000000000 +0200 ++++ a/drivers/acpi/blacklist.c 2006-06-26 08:32:59.000000000 +0200 +@@ -78,6 +78,10 @@ + static int __init blacklist_by_year(void) + { + int year = dmi_get_year(DMI_BIOS_DATE); ++ ++ if (efi_enabled) ++ return 0; ++ + /* Doesn't exist? Likely an old system */ + if (year == -1) + return 1; Added: trunk/kernel/mactel-patches-2.6.18/applesmc.patch =================================================================== --- trunk/kernel/mactel-patches-2.6.18/applesmc.patch (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/applesmc.patch 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,617 @@ +diff -pruN linux/drivers/hwmon.vanilla/Kconfig linux/drivers/hwmon/Kconfig +--- linux/drivers/hwmon.vanilla/Kconfig 2006-07-07 14:50:32.000000000 +0200 ++++ linux/drivers/hwmon/Kconfig 2006-07-11 11:34:20.000000000 +0200 +@@ -507,6 +507,26 @@ 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 ++ default n ++ help ++ This driver provides support for the Apple System Management ++ Controller, which provides an accelerometer (Apple Sudden Motion ++ Sensor), light sensors, and keyboard backlight control. ++ ++ Only Intel-based Apple's laptops are supported (MacBook Pro, MacBook). ++ ++ The accelerometer and light sensors data is readable via sysfs, and ++ the keyboard backlight is writable. ++ ++ 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 -pruN linux/drivers/hwmon.vanilla/Makefile linux/drivers/hwmon/Makefile +--- linux/drivers/hwmon.vanilla/Makefile 2006-07-07 14:50:32.000000000 +0200 ++++ linux/drivers/hwmon/Makefile 2006-07-10 17:37:16.000000000 +0200 +@@ -18,6 +18,7 @@ obj-$(CONFIG_SENSORS_ADM1025) += adm1025 + obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o + obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o + obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o ++obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o + obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o + obj-$(CONFIG_SENSORS_DS1621) += ds1621.o + obj-$(CONFIG_SENSORS_F71805F) += f71805f.o +diff -pruN linux/drivers/hwmon.vanilla/applesmc.c linux/drivers/hwmon/applesmc.c +--- linux/drivers/hwmon.vanilla/applesmc.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux/drivers/hwmon/applesmc.c 2006-07-13 23:08:17.000000000 +0200 +@@ -0,0 +1,572 @@ ++/* ++ * drivers/hwmon/applesmc.c - driver for Apple's SMC (various sensors) ++ * ++ * Copyright (C) 2006 Nicolas Boichat <ni...@bo...> ++ * ++ * Based on hdaps.c driver : ++ * Copyright (C) 2005 Robert Love <rm...@no...> ++ * Copyright (C) 2005 Jesper Juhl <jes...@gm...> ++ * ++ * 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 <asm/io.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" //0x414c5630, r-o length 6 ++#define LIGHT_SENSOR_RIGHT_KEY "ALV1" //0x414c5631, r-o length 6 ++#define BACKLIGHT_KEY "LKSB" //0x4c4b5342, w-o ++#define CLAMSHELL_KEY "MSLD" //0x4d534c44, r-o length 1 (unused) ++#define MOTION_SENSOR_X_KEY "MO_X" //0x4d4f5f58, r-o length 2 ++#define MOTION_SENSOR_Y_KEY "MO_Y" //0x4d4f5f58, r-o length 2 ++#define MOTION_SENSOR_Z_KEY "MO_Z" //0x4d4f5f58, r-o length 2 ++#define MOTION_SENSOR_KEY "MOCN" //0x4d4f434e, r/w length 2 ++ ++#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 ++ ++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; ++ ++/* Indicate whether this computer has light sensors and keyboard backlight. */ ++static unsigned int applesmc_light = 0; ++ ++#if 0 ++static unsigned int hdaps_invert; ++static u8 km_activity; ++#endif ++ ++static DECLARE_MUTEX(applesmc_sem); ++ ++/* ++ * __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. ++ */ ++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_sem. ++ */ ++static int applesmc_read_key(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_sem. ++ */ ++static int applesmc_write_key(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_sem. ++ */ ++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]; ++ ++ down(&applesmc_sem); ++ ++ 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: ++ up(&applesmc_sem); ++ return ret; ++} ++ ++ ++/* 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_sem. ++ */ ++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 (down_trylock(&applesmc_sem)) { ++ 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); ++ ++ up(&applesmc_sem); ++} ++ ++/* Sysfs Files */ ++ ++static ssize_t applesmc_position_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ int ret; ++ s16 x, y, z; ++ ++ down(&applesmc_sem); ++ ++ 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: ++ up(&applesmc_sem); ++ 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 *buf) ++{ ++ int ret; ++ u8 left = 0, right = 0; ++ u8 buffer[6]; ++ ++ down(&applesmc_sem); ++ ++ 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]; ++ if (ret) ++ goto out; ++ ++out: ++ up(&applesmc_sem); ++ if (ret) ++ return ret; ++ else ++ return sprintf(buf, "(%d,%d)\n", left, right); ++} ++ ++static ssize_t applesmc_keyboard_backlight_store(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ int ret; ++ u8 buffer[2]; ++ long val = simple_strtol(buf, NULL, 10); ++ ++ if (val < 0 || val > 255) ++ return EINVAL; ++ ++ down(&applesmc_sem); ++ buffer[0] = val; ++ buffer[1] = 0x00; ++ ret = applesmc_write_key(BACKLIGHT_KEY, buffer, 2); ++ up(&applesmc_sem); ++ ++ if (ret) ++ return ret; ++ ++ return count; ++} ++ ++static ssize_t applesmc_calibrate_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ return sprintf(buf, "(%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) ++{ ++ down(&applesmc_sem); ++ applesmc_calibrate(); ++ up(&applesmc_sem); ++ ++ return count; ++} ++ ++static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL); ++static DEVICE_ATTR(light, 0444, applesmc_light_show, NULL); ++static DEVICE_ATTR(keyboard_backlight, 0220, NULL, applesmc_keyboard_backlight_store); ++static DEVICE_ATTR(calibrate, 0644, applesmc_calibrate_show,applesmc_calibrate_store); ++ ++static struct attribute *applesmc_light_attributes[] = { ++ &dev_attr_position.attr, ++ &dev_attr_light.attr, ++ &dev_attr_keyboard_backlight.attr, ++ &dev_attr_calibrate.attr, ++ NULL, ++}; ++ ++static struct attribute_group applesmc_light_attribute_group = { ++ .attrs = applesmc_light_attributes, ++}; ++ ++static struct attribute *applesmc_attributes[] = { ++ &dev_attr_position.attr, ++ &dev_attr_calibrate.attr, ++ NULL, ++}; ++ ++static struct attribute_group applesmc_attribute_group = { ++ .attrs = applesmc_attributes, ++}; ++ ++ ++/* Module stuff */ ++ ++/* applesmc_light_dmi_match - found a match. return one, short-circuiting the hunt. */ ++static int applesmc_light_dmi_match(struct dmi_system_id *id) ++{ ++ applesmc_light = 1; ++ printk(KERN_INFO "applesmc: %s detected (model with light" ++ " sensors and backlight).\n", id->ident); ++ return 1; ++} ++ ++/* applesmc_dmi_match - found a match. return one, short-circuiting the hunt. */ ++static int applesmc_dmi_match(struct dmi_system_id *id) ++{ ++ printk(KERN_INFO "applesmc: %s detected (model without light" ++ " sensors and backlight).\n", id->ident); ++ return 1; ++} ++ ++#define APPLESMC_DMI_MATCH(model) { \ ++ .ident = "Apple " model, \ ++ .callback = applesmc_dmi_match, \ ++ .matches = { \ ++ DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), \ ++ DMI_MATCH(DMI_PRODUCT_NAME, model) \ ++ } \ ++} ++ ++#define APPLESMC_LIGHT_DMI_MATCH(model) { \ ++ .ident = "Apple " model, \ ++ .callback = applesmc_light_dmi_match, \ ++ .matches = { \ ++ DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), \ ++ DMI_MATCH(DMI_PRODUCT_NAME, model) \ ++ } \ ++} ++ ++static int __init applesmc_init(void) ++{ ++ int ret; ++ ++ /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". ++ * So we need to put MacBookPro before MacBook... */ ++ struct dmi_system_id applesmc_whitelist[] = { ++ APPLESMC_LIGHT_DMI_MATCH("MacBookPro"), ++ APPLESMC_DMI_MATCH("MacBook"), ++ { .ident = NULL } ++ }; ++ ++ 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; ++ } ++ ++ if (applesmc_light) ++ ret = sysfs_create_group(&pdev->dev.kobj, ++ &applesmc_light_attribute_group); ++ else ++ ret = sysfs_create_group(&pdev->dev.kobj, ++ &applesmc_attribute_group); ++ if (ret) ++ goto out_device; ++ ++ applesmc_idev = input_allocate_device(); ++ if (!applesmc_idev) { ++ ret = -ENOMEM; ++ goto out_group; ++ } ++ ++ /* 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); ++ ++ printk(KERN_INFO "applesmc: driver successfully loaded.\n"); ++ return 0; ++ ++out_group: ++ sysfs_remove_group(&pdev->dev.kobj, &applesmc_attribute_group); ++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) ++{ ++ del_timer_sync(&applesmc_timer); ++ input_unregister_device(applesmc_idev); ++ if (applesmc_light) ++ sysfs_remove_group(&pdev->dev.kobj, ++ &applesmc_light_attribute_group); ++ else ++ sysfs_remove_group(&pdev->dev.kobj, &applesmc_attribute_group); ++ 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"); Added: trunk/kernel/mactel-patches-2.6.18/apply =================================================================== --- trunk/kernel/mactel-patches-2.6.18/apply (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/apply 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,24 @@ +#!/bin/sh + +if [ "$1" == "" ]; then + echo "usage ./apply kerneldir" + exit 0 +fi + +WORK=$PWD + +cd $1 + +for i in `ls $WORK/*.patch` +do + patch -p1 --dry-run < $i > /dev/null + if [ "$?" != "0" ]; then + echo "$i would not apply cleanly" + exit + fi +done + +for i in `ls $WORK/*.patch` +do + patch -p1 < $i +done Property changes on: trunk/kernel/mactel-patches-2.6.18/apply ___________________________________________________________________ Name: svn:executable + * Added: trunk/kernel/mactel-patches-2.6.18/efi_e820_all_mapped_fix.patch =================================================================== --- trunk/kernel/mactel-patches-2.6.18/efi_e820_all_mapped_fix.patch (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/efi_e820_all_mapped_fix.patch 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,48 @@ +--- a/arch/i386/kernel/setup.c 2006-06-19 09:12:09.000000000 +0200 ++++ b/arch/i386/kernel/setup.c 2006-06-19 09:12:24.000000000 +0200 +@@ -968,24 +968,28 @@ + u64 start = s; + u64 end = e; + int i; +- for (i = 0; i < e820.nr_map; i++) { +- struct e820entry *ei = &e820.map[i]; +- if (type && ei->type != type) +- continue; +- /* is the region (part) in overlap with the current region ?*/ +- if (ei->addr >= end || ei->addr + ei->size <= start) +- continue; +- /* if the region is at the beginning of <start,end> we move +- * start to the end of the region since it's ok until there +- */ +- if (ei->addr <= start) +- start = ei->addr + ei->size; +- /* if start is now at or beyond end, we're done, full +- * coverage */ +- if (start >= end) +- return 1; /* we're done */ ++ if(!efi_enabled) { ++ for (i = 0; i < e820.nr_map; i++) { ++ struct e820entry *ei = &e820.map[i]; ++ if (type && ei->type != type) ++ continue; ++ /* is the region (part) in overlap with the current region ?*/ ++ if (ei->addr >= end || ei->addr + ei->size <= start) ++ continue; ++ /* if the region is at the beginning of <start,end> we move ++ * start to the end of the region since it's ok until there ++ */ ++ if (ei->addr <= start) ++ start = ei->addr + ei->size; ++ /* if start is now at or beyond end, we're done, full ++ * coverage */ ++ if (start >= end) ++ return 1; /* we're done */ ++ } ++ return 0; ++ } else { ++ return 1; + } +- return 0; + } + + /* Added: trunk/kernel/mactel-patches-2.6.18/ir.patch =================================================================== --- trunk/kernel/mactel-patches-2.6.18/ir.patch (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/ir.patch 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,416 @@ +--- linux-2.6.16.1/drivers/usb/input/Makefile 2006-03-28 07:49:02.000000000 +0100 ++++ linux-2.6.16.1-imac-sky2-rtc/drivers/usb/input/Makefile 2006-05-22 13:14:40.000000000 +0100 +@@ -32,6 +32,7 @@ + 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 +--- linux-2.6.16.1/drivers/usb/input/Kconfig 2006-03-28 07:49:02.000000000 +0100 ++++ linux-2.6.16.1-imac-sky2-rtc/drivers/usb/input/Kconfig 2006-05-22 13:15:16.000000000 +0100 +@@ -173,6 +173,10 @@ + 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 +--- linux-2.6.16.1/drivers/usb/input/appleir.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.16.1-imac-sky2-rtc/drivers/usb/input/appleir.c 2006-05-29 09:47:40.000000000 +0100 +@@ -0,0 +1,390 @@ ++#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 <asm/unaligned.h> ++#include <asm/byteorder.h> ++ ++/* ++ * Version Information ++ * ++ */ ++ ++#if 0 ++#define DUMP_PACKETS ++#else ++#undef DUMP_PACKETS ++#endif ++ ++#define DRIVER_VERSION "v1.1" ++#define DRIVER_AUTHOR "James McKenzie" ++#define DRIVER_DESC "USB Apple MacMini IR Receiver driver" ++#define DRIVER_LICENSE "GPL" ++ ++MODULE_AUTHOR (DRIVER_AUTHOR); ++MODULE_DESCRIPTION (DRIVER_DESC); ++MODULE_LICENSE (DRIVER_LICENSE); ++ ++#ifndef USB_VENDOR_ID_APPLE ++#define USB_VENDOR_ID_APPLE 0x05ac ++#endif ++#ifndef USB_DEVICE_ID_APPLE_IR ++#define USB_DEVICE_ID_APPLE_IR 0x8240 ++#endif ++ ++#define URB_SIZE 32 ++ ++#define MAX_KEYS 8 ++#define MAX_KEYS_MASK (MAX_KEYS - 1 ) ++ ++struct appleir ++{ ++ struct input_dev *dev; ++ uint8_t *data; ++ dma_addr_t dma_buf; ++ struct usb_device *usbdev; ++ struct urb *urb; ++ int timer_initted; ++ 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); ++ ++ ++/* I have two devices both of which report the following */ ++/* 25 87 ee 83 0a + */ ++/* 25 87 ee 83 0c - */ ++/* 25 87 ee 83 09 << */ ++/* 25 87 ee 83 06 >> */ ++/* 25 87 ee 83 05 >" */ ++/* 25 87 ee 83 03 menu */ ++/* 26 00 00 00 00 for key repeat*/ ++ ++/* Thomas Glanzmann reports the following responses */ ++/* 25 87 ee ca 0b + */ ++/* 25 87 ee ca 0d - */ ++/* 25 87 ee ca 08 << */ ++/* 25 87 ee ca 07 >> */ ++/* 25 87 ee ca 04 >" */ ++/* 25 87 ee ca 02 menu */ ++/* 26 00 00 00 00 for key repeat*/ ++/* He also observes the following event sometimes */ ++/* sent after a key is release, 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) ++{ ++ //printk (KERN_ERR "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) ++{ ++ //printk (KERN_ERR "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_ERR "appleir: possible flat battery?\n"); ++} ++ ++static void ++key_up_tick (unsigned long data) ++{ ++ struct appleir *appleir = (struct appleir *) data; ++ ++ if (appleir->current_key) ++ { ++ key_up (appleir, appleir->current_key); ++ appleir->current_key = 0; ++ } ++} ++ ++static void ++new_data (struct appleir *appleir, 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 }; ++ ++#ifdef DUMP_PACKETS ++ dump_packet (appleir, "received", data, len); ++#endif ++ ++ 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 (appleir->current_key) ++ key_up (appleir, appleir->current_key); ++ appleir->current_key = keymap[(data[4] >> 1) & MAX_KEYS_MASK]; ++ ++ key_down (appleir, appleir->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 (&appleir->key_up_timer, jiffies + HZ / 8); ++ ++ return; ++ } ++ ++ if (!memcmp (data, keyrepeat, sizeof (keyrepeat))) ++ { ++ key_down (appleir, appleir->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 (&appleir->key_up_timer, jiffies + HZ / 8); ++ return; ++ } ++ ++ if (!memcmp (data, flatbattery, sizeof (flatbattery))) ++ { ++ battery_flat (appleir); ++ /*Fall through */ ++ } ++ ++ dump_packet (appleir, "unknown packet", data, len); ++} ++ ++static void ++appleir_urb (struct urb *urb, struct pt_regs *regs) ++{ ++ struct appleir *appleir = urb->context; ++ int retval; ++ ++ switch (urb->status) ++ { ++ case 0: ++ new_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... [truncated message content] |
|
From: <nbo...@us...> - 2006-11-26 10:49:07
|
Revision: 63
http://svn.sourceforge.net/mactel-linux/?rev=63&view=rev
Author: nboichat
Date: 2006-11-26 02:49:01 -0800 (Sun, 26 Nov 2006)
Log Message:
-----------
Patches for 2.6.19-rc6.
Added Paths:
-----------
trunk/kernel/mactel-patches-2.6.19/
trunk/kernel/mactel-patches-2.6.19/Changelog
trunk/kernel/mactel-patches-2.6.19/acpi-blacklist-fix.patch
trunk/kernel/mactel-patches-2.6.19/applesmc.patch
trunk/kernel/mactel-patches-2.6.19/apply
trunk/kernel/mactel-patches-2.6.19/ir.patch
trunk/kernel/mactel-patches-2.6.19/mouseemu.patch
trunk/kernel/mactel-patches-2.6.19/piix.ich7.patch
trunk/kernel/mactel-patches-2.6.19/s3.patch
trunk/kernel/mactel-patches-2.6.19/sci_en.patch
trunk/kernel/mactel-patches-2.6.19/sigmatel_audio.patch
trunk/kernel/mactel-patches-2.6.19/unapply
trunk/kernel/mactel-patches-2.6.19/usb-storage-zerowait.patch
Added: trunk/kernel/mactel-patches-2.6.19/Changelog
===================================================================
--- trunk/kernel/mactel-patches-2.6.19/Changelog (rev 0)
+++ trunk/kernel/mactel-patches-2.6.19/Changelog 2006-11-26 10:49:01 UTC (rev 63)
@@ -0,0 +1,61 @@
+Changes since 2.6.18:
+
+NOTE: SATA doesn't rely on SCSI anymore, so you need to set ATA=y and
+ ATA_PIIX=y to get a bootable system.
+
+Unchanged:
+acpi-blacklist-fix.patch
+mouseemu.patch
+s3.patch
+
+Updated:
+applesmc.patch: offsets
+ir.patch: offsets
+piix.ich7.patch: offsets
+
+Updated, need check:
+sci_en.patch (needs check since since 2.6.18)
+sigmatel_audio.patch (works perfectly on Macbook Pro, jack detection, mic...
+ Needs check on Macbook/Macmini)
+
+Removed:
+version.patch, replaced by a sed script
+
+Removed, need check:
+
+Changes since 2.6.17:
+
+NOTE: applesmc now implements a LED class to control keyboard backlight,
+so you need to enable CONFIG_NEW_LEDS and CONFIG_LEDS_CLASS in your kernel config.
+
+Unchanged:
+acpi-blacklist-fix.patch
+ir.patch
+s3.patch
+usb-storage-zerowait.patch
+
+Updated:
+applesmc.patch: offsets
+mouseemu.patch: offsets + removed useless hunk for x86
+piix.ich7.patch: offsets
+sigmatel_audio.patch: various fixes
+version.patch
+
+Updated, need check:
+sci_en.patch: updated from mailing list + offsets
+
+Removed:
+appletouch.patch: included in kernel
+intelfb-945g.patch: included in kernel, in a cleanest way
+keyboard_hid.patch
+
+Removed, need check:
+acpi-smart-battery.patch: included in vanilla (not absolutely sure)
+intel_mac_sata_resume_fix.patch: major changes in vanilla kernel, maybe is it not needed anymore
+sata_resume.patch: same as intel_mac_sata_resume_fix.patch
+efi_e820_all_mapped_fix.patch: major changes in vanilla kernel, maybe is it not needed anymore
+
+To be updated:
+config-2.6.18
+config-2.6.18-MBP
+imacfb.patch: included in kernel, but maybe gimli did other updates
Added: trunk/kernel/mactel-patches-2.6.19/acpi-blacklist-fix.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.19/acpi-blacklist-fix.patch (rev 0)
+++ trunk/kernel/mactel-patches-2.6.19/acpi-blacklist-fix.patch 2006-11-26 10:49:01 UTC (rev 63)
@@ -0,0 +1,13 @@
+--- a/drivers/acpi/blacklist.c 2006-06-26 08:32:21.000000000 +0200
++++ a/drivers/acpi/blacklist.c 2006-06-26 08:32:59.000000000 +0200
+@@ -78,6 +78,10 @@
+ static int __init blacklist_by_year(void)
+ {
+ int year = dmi_get_year(DMI_BIOS_DATE);
++
++ if (efi_enabled)
++ return 0;
++
+ /* Doesn't exist? Likely an old system */
+ if (year == -1)
+ return 1;
Added: trunk/kernel/mactel-patches-2.6.19/applesmc.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.19/applesmc.patch (rev 0)
+++ trunk/kernel/mactel-patches-2.6.19/applesmc.patch 2006-11-26 10:49:01 UTC (rev 63)
@@ -0,0 +1,958 @@
+diff -pruN linux/drivers/hwmon.vanilla/Kconfig linux/drivers/hwmon/Kconfig
+--- linux/drivers/hwmon.vanilla/Kconfig 2006-11-25 22:12:16.000000000 +0800
++++ linux/drivers/hwmon/Kconfig 2006-11-25 22:12:33.000000000 +0800
+@@ -530,6 +530,26 @@ 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
++ default n
++ help
++ This driver provides support for the Apple System Management
++ Controller, which provides an accelerometer (Apple Sudden Motion
++ Sensor), light sensors, and keyboard backlight control.
++
++ Only Intel-based Apple's laptops are supported (MacBook Pro, MacBook).
++
++ The accelerometer and light sensors data is readable via sysfs, and
++ the keyboard backlight is writable.
++
++ 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 -pruN linux/drivers/hwmon.vanilla/Makefile linux/drivers/hwmon/Makefile
+--- linux/drivers/hwmon.vanilla/Makefile 2006-11-25 22:12:16.000000000 +0800
++++ linux/drivers/hwmon/Makefile 2006-11-25 22:12:33.000000000 +0800
+@@ -18,6 +18,7 @@ obj-$(CONFIG_SENSORS_ADM1025) += adm1025
+ obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o
+ obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o
+ obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o
++obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o
+ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
+ obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
+ obj-$(CONFIG_SENSORS_F71805F) += f71805f.o
+diff -pruN linux/drivers/hwmon.vanilla/applesmc.c linux/drivers/hwmon/applesmc.c
+--- linux/drivers/hwmon.vanilla/applesmc.c 1970-01-01 07:30:00.000000000 +0730
++++ linux/drivers/hwmon/applesmc.c 2006-11-25 22:12:58.000000000 +0800
+@@ -0,0 +1,913 @@
++/*
++ * drivers/hwmon/applesmc.c - driver for Apple's SMC (various sensors,
++ * fan control)
++ *
++ * Copyright (C) 2006 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 <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
++
++static const char* temperature_sensors_sets[][8] =
++{
++ { "TB0T", "TC0D", "TC0P", "Th0H", "Ts0P", "Th1H", "Ts1P", NULL },
++ { "TC0D", "TC0P", NULL }
++};
++
++#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 {
++/* Indicate whether this computer has an accelerometer. */
++ int accelerometer;
++/* Indicate whether this computer has light sensors and keyboard backlight. */
++ int light;
++/* Indicate 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;
++
++/* Indicate whether this computer has an accelerometer. */
++static unsigned int applesmc_accelerometer = 0;
++
++/* Indicate whether this computer has light sensors and keyboard backlight. */
++static unsigned int applesmc_light = 0;
++
++/* Indicate which temperature sensors set to use. */
++static unsigned int applesmc_temperature_set = 0;
++
++static DECLARE_MUTEX(applesmc_sem);
++
++/*
++ * __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.
++ */
++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_sem.
++ */
++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_sem.
++ */
++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_sem.
++ */
++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;
++
++ down(&applesmc_sem);
++
++ 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:
++ up(&applesmc_sem);
++ return ret;
++}
++
++/*
++ * applesmc_get_fan_count - get the number of fans. Callers must NOT hold
++ * applesmc_sem.
++ */
++static int applesmc_get_fan_count(void)
++{
++ int ret;
++ u8 buffer[1];
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(FANS_COUNT, buffer, 1);
++
++ up(&applesmc_sem);
++ 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_sem.
++ */
++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 (down_trylock(&applesmc_sem)) {
++ 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);
++
++ up(&applesmc_sem);
++}
++
++/* Sysfs Files */
++
++static ssize_t applesmc_position_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ int ret;
++ s16 x, y, z;
++
++ down(&applesmc_sem);
++
++ 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:
++ up(&applesmc_sem);
++ 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 *buf)
++{
++ int ret;
++ u8 left = 0, right = 0;
++ u8 buffer[6];
++
++ down(&applesmc_sem);
++
++ 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:
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "(%d,%d)\n", left, right);
++}
++
++/* Displays °C * 100 */
++static ssize_t applesmc_show_temperature(struct device *dev, char *buf, const char *key)
++{
++ int ret;
++ u8 buffer[2];
++ unsigned int temp;
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(key, buffer, 2);
++ temp = buffer[0]*100;
++ temp += (buffer[1] >> 6) * 25;
++
++ up(&applesmc_sem);
++
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "%u\n", temp);
++}
++
++static ssize_t applesmc_show_fan_speed(struct device *dev, char *buf,
++ const char* key, int offset)
++{
++ int ret;
++ unsigned int speed = 0;
++ char newkey[5];
++ u8 buffer[2];
++
++ newkey[0] = key[0];
++ newkey[1] = '0' + offset;
++ newkey[2] = key[2];
++ newkey[3] = key[3];
++ newkey[4] = 0;
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(newkey, buffer, 2);
++ speed = ((buffer[0] << 8 | buffer[1]) >> 2);
++
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "%u\n", speed);
++}
++
++static ssize_t applesmc_store_fan_speed(struct device *dev, const char *buf,
++ size_t count, const char* key, int offset)
++{
++ int ret;
++ u32 speed;
++ char newkey[5];
++ u8 buffer[2];
++
++ speed = simple_strtoul(buf, 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[4] = 0;
++
++ down(&applesmc_sem);
++
++ buffer[0] = (speed >> 6) & 0xff;
++ buffer[1] = (speed << 2) & 0xff;
++ ret = applesmc_write_key(newkey, buffer, 2);
++
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return count;
++}
++
++static ssize_t applesmc_show_fan_manual(struct device *dev, char *buf,
++ int offset)
++{
++ int ret;
++ u16 manual = 0;
++ u8 buffer[2];
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
++ manual = ((buffer[0] << 8 | buffer[1]) >> offset) & 0x01;
++
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "%d\n", manual);
++}
++
++static ssize_t applesmc_store_fan_manual(struct device *dev, const char *buf,
++ size_t count, int offset)
++{
++ int ret;
++ u8 buffer[2];
++ u32 input;
++ u16 val;
++
++ input = simple_strtoul(buf, NULL, 10);
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
++ val = (buffer[0] << 8 | buffer[1]);
++ if (ret)
++ goto out;
++
++ if (input)
++ val = val | (0x01 << offset);
++ else
++ val = val & ~(0x01 << offset);
++
++ buffer[0] = (val >> 8) & 0xFF;
++ buffer[1] = val & 0xFF;
++
++ ret = applesmc_write_key(FANS_MANUAL, buffer, 2);
++
++out:
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return count;
++}
++
++static ssize_t applesmc_calibrate_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ return sprintf(buf, "(%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)
++{
++ down(&applesmc_sem);
++ applesmc_calibrate();
++ up(&applesmc_sem);
++
++ return count;
++}
++
++static void applesmc_backlight_set(struct led_classdev *led_cdev,
++ enum led_brightness value)
++{
++ u8 buffer[2];
++
++ down(&applesmc_sem);
++ buffer[0] = value;
++ buffer[1] = 0x00;
++ applesmc_write_key(BACKLIGHT_KEY, buffer, 2);
++ up(&applesmc_sem);
++}
++
++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);
++
++#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 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 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 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 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);
++
++#define sysfs_fan_manual_offset(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);
++
++
++sysfs_fan_speeds_offset(0);
++sysfs_fan_manual_offset(0);
++sysfs_fan_speeds_offset(1);
++sysfs_fan_manual_offset(1);
++
++#define device_create_file_fan(client, offset) \
++do { \
++sysfs_create_file(client, &dev_attr_fan##offset##_actual_speed.attr); \
++sysfs_create_file(client, &dev_attr_fan##offset##_minimum_speed.attr); \
++sysfs_create_file(client, &dev_attr_fan##offset##_maximum_speed.attr); \
++sysfs_create_file(client, &dev_attr_fan##offset##_safe_speed.attr); \
++sysfs_create_file(client, &dev_attr_fan##offset##_target_speed.attr); \
++sysfs_create_file(client, &dev_attr_fan##offset##_manual.attr); \
++} while (0)
++
++#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);
++
++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);
++
++#define device_create_files_temperature(client, offset) \
++{ \
++ sysfs_create_file(client, &dev_attr_temperature_##offset.attr); \
++} while (0)
++
++/* 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 =
++ (struct dmi_match_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 int __init applesmc_init(void)
++{
++ int ret;
++
++ struct dmi_match_data applesmc_dmi_data[] = {
++ { .accelerometer = 1, .light = 1, .temperature_set = 0 },
++ { .accelerometer = 1, .light = 0, .temperature_set = 0 },
++ { .accelerometer = 0, .light = 0, .temperature_set = 1 }
++ };
++
++ /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
++ * So we need to put APPLESMC_MACBOOKPRO_DMI_MATCH before
++ * APPLESMC_MACBOOK_DMI_MATCH. */
++ 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;
++ 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 */
++ ret = applesmc_get_fan_count();
++ if (ret < 0) {
++ printk(KERN_ERR "applesmc: Cannot get the number of fans.\n");
++ }
++ else {
++ printk(KERN_INFO "applesmc: %d fans found.\n", ret);
++
++ switch (ret) {
++ default:
++ printk(KERN_WARNING "applesmc: More than 2 fans found,"
++ " but at most 2 fans are supported"
++ " by the driver.\n");
++ case 2:
++ device_create_file_fan(&pdev->dev.kobj, 1);
++ case 1:
++ device_create_file_fan(&pdev->dev.kobj, 0);
++ case 0:
++ ;
++ }
++ }
++
++ ret = 0;
++ while (temperature_sensors_sets[applesmc_temperature_set][ret] != NULL) ret++;
++
++ switch (ret) {
++ default:
++ case 7:
++ device_create_files_temperature(&pdev->dev.kobj, 6);
++ case 6:
++ device_create_files_temperature(&pdev->dev.kobj, 5);
++ case 5:
++ device_create_files_temperature(&pdev->dev.kobj, 4);
++ case 4:
++ device_create_files_temperature(&pdev->dev.kobj, 3);
++ case 3:
++ device_create_files_temperature(&pdev->dev.kobj, 2);
++ case 2:
++ device_create_files_temperature(&pdev->dev.kobj, 1);
++ case 1:
++ device_create_files_temperature(&pdev->dev.kobj, 0);
++ case 0:
++ ;
++ }
++
++ 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...
[truncated message content] |
|
From: Tino K. <tin...@ti...> - 2006-11-28 19:50:46
|
On Sun, Nov 26, 2006 at 02:49:03 -0800, nbo...@us... wrote: > Revision: 63 > http://svn.sourceforge.net/mactel-linux/?rev=63&view=rev > Author: nboichat > Date: 2006-11-26 02:49:01 -0800 (Sun, 26 Nov 2006) > > Log Message: > ----------- > Patches for 2.6.19-rc6. > > Added Paths: > ----------- > trunk/kernel/mactel-patches-2.6.19/ > trunk/kernel/mactel-patches-2.6.19/Changelog > trunk/kernel/mactel-patches-2.6.19/acpi-blacklist-fix.patch > trunk/kernel/mactel-patches-2.6.19/applesmc.patch This doesn't work for me on the mini: applesmc: supported laptop not found! applesmc: driver init failed (ret=-19)! This worked with 2.8.18. How comes? Interdiff only shows changes in the kernel config help section. Regards, Tino |
|
From: Tino K. <tin...@ti...> - 2006-11-28 19:58:26
|
On Tue, Nov 28, 2006 at 20:50:30 +0100, Tino Keitel wrote: > On Sun, Nov 26, 2006 at 02:49:03 -0800, nbo...@us... wrote: > > Revision: 63 > > http://svn.sourceforge.net/mactel-linux/?rev=63&view=rev > > Author: nboichat > > Date: 2006-11-26 02:49:01 -0800 (Sun, 26 Nov 2006) > > > > Log Message: > > ----------- > > Patches for 2.6.19-rc6. > > > > Added Paths: > > ----------- > > trunk/kernel/mactel-patches-2.6.19/ > > trunk/kernel/mactel-patches-2.6.19/Changelog > > trunk/kernel/mactel-patches-2.6.19/acpi-blacklist-fix.patch > > trunk/kernel/mactel-patches-2.6.19/applesmc.patch > > This doesn't work for me on the mini: > > applesmc: supported laptop not found! > applesmc: driver init failed (ret=-19)! > > This worked with 2.8.18. How comes? Interdiff only shows changes in the > kernel config help section. Erm, I made a diff between my 2.6.18 and 2.6.19-rc6 source trees and it seems like there is a lot of stuff missing, e.g. the whole temperature stuff. Regards, Tino |
|
From: Tino K. <tin...@ti...> - 2006-11-29 10:04:40
Attachments:
applesmc_macmini_dmi_match.diff
|
On Tue, Nov 28, 2006 at 20:58:18 +0100, Tino Keitel wrote: > On Tue, Nov 28, 2006 at 20:50:30 +0100, Tino Keitel wrote: > > On Sun, Nov 26, 2006 at 02:49:03 -0800, nbo...@us... wrote: > > > Revision: 63 > > > http://svn.sourceforge.net/mactel-linux/?rev=63&view=rev > > > Author: nboichat > > > Date: 2006-11-26 02:49:01 -0800 (Sun, 26 Nov 2006) > > > > > > Log Message: > > > ----------- > > > Patches for 2.6.19-rc6. > > > > > > Added Paths: > > > ----------- > > > trunk/kernel/mactel-patches-2.6.19/ > > > trunk/kernel/mactel-patches-2.6.19/Changelog > > > trunk/kernel/mactel-patches-2.6.19/acpi-blacklist-fix.patch > > > trunk/kernel/mactel-patches-2.6.19/applesmc.patch > > > > This doesn't work for me on the mini: > > > > applesmc: supported laptop not found! > > applesmc: driver init failed (ret=-19)! > > > > This worked with 2.8.18. How comes? Interdiff only shows changes in the > > kernel config help section. > > Erm, I made a diff between my 2.6.18 and 2.6.19-rc6 source trees and it > seems like there is a lot of stuff missing, e.g. the whole temperature > stuff. Obviously, the latest applesmc patch was never tested on a mini. I fixed the DMI match to test for a lowercase product string, and now the module loads here: applesmc: Apple Macmini detected: applesmc: - Model without accelerometer applesmc: - Model without light sensors and backlight applesmc: - Model with 2 temperature sensors applesmc: device successfully initialized. applesmc: 1 fans found. applesmc: driver successfully loaded. Regards, Tino |
|
From: Nicolas B. <ni...@bo...> - 2006-11-30 09:02:24
|
Tino Keitel wrote: > On Tue, Nov 28, 2006 at 20:58:18 +0100, Tino Keitel wrote: > >> On Tue, Nov 28, 2006 at 20:50:30 +0100, Tino Keitel wrote: >> >>> On Sun, Nov 26, 2006 at 02:49:03 -0800, nbo...@us... wrote: >>> >>>> Revision: 63 >>>> http://svn.sourceforge.net/mactel-linux/?rev=63&view=rev >>>> Author: nboichat >>>> Date: 2006-11-26 02:49:01 -0800 (Sun, 26 Nov 2006) >>>> >>>> Log Message: >>>> ----------- >>>> Patches for 2.6.19-rc6. >>>> >>>> Added Paths: >>>> ----------- >>>> trunk/kernel/mactel-patches-2.6.19/ >>>> trunk/kernel/mactel-patches-2.6.19/Changelog >>>> trunk/kernel/mactel-patches-2.6.19/acpi-blacklist-fix.patch >>>> trunk/kernel/mactel-patches-2.6.19/applesmc.patch >>>> >>> This doesn't work for me on the mini: >>> >>> applesmc: supported laptop not found! >>> applesmc: driver init failed (ret=-19)! >>> >>> This worked with 2.8.18. How comes? Interdiff only shows changes in the >>> kernel config help section. >>> >> Erm, I made a diff between my 2.6.18 and 2.6.19-rc6 source trees and it >> seems like there is a lot of stuff missing, e.g. the whole temperature >> stuff. >> > > Obviously, the latest applesmc patch was never tested on a mini. No. It wasn't... Stupid spelling mistake... Thank you for testing, and reporting the problem. Best regards, Nicolas |
|
From: <nbo...@us...> - 2006-11-30 09:42:26
|
Revision: 71
http://svn.sourceforge.net/mactel-linux/?rev=71&view=rev
Author: nboichat
Date: 2006-11-30 01:42:25 -0800 (Thu, 30 Nov 2006)
Log Message:
-----------
Update Changelogs.
Modified Paths:
--------------
trunk/kernel/mactel-patches-2.6.18/Changelog
trunk/kernel/mactel-patches-2.6.19/Changelog
Modified: trunk/kernel/mactel-patches-2.6.18/Changelog
===================================================================
--- trunk/kernel/mactel-patches-2.6.18/Changelog 2006-11-30 09:41:41 UTC (rev 70)
+++ trunk/kernel/mactel-patches-2.6.18/Changelog 2006-11-30 09:42:25 UTC (rev 71)
@@ -3,11 +3,15 @@
NOTE: applesmc now implements a LED class to control keyboard backlight,
so you need to enable CONFIG_NEW_LEDS and CONFIG_LEDS_CLASS in your kernel config.
+New patch:
+appletouch-geyser4.patch
+
Unchanged:
acpi-blacklist-fix.patch
ir.patch
s3.patch
usb-storage-zerowait.patch
+efi_e820_all_mapped_fix.patch
Updated:
applesmc.patch: offsets
@@ -28,7 +32,6 @@
acpi-smart-battery.patch: included in vanilla (not absolutely sure)
intel_mac_sata_resume_fix.patch: major changes in vanilla kernel, maybe is it not needed anymore
sata_resume.patch: same as intel_mac_sata_resume_fix.patch
-efi_e820_all_mapped_fix.patch: major changes in vanilla kernel, maybe is it not needed anymore
To be updated:
config-2.6.18
Modified: trunk/kernel/mactel-patches-2.6.19/Changelog
===================================================================
--- trunk/kernel/mactel-patches-2.6.19/Changelog 2006-11-30 09:41:41 UTC (rev 70)
+++ trunk/kernel/mactel-patches-2.6.19/Changelog 2006-11-30 09:42:25 UTC (rev 71)
@@ -3,11 +3,10 @@
NOTE: SATA doesn't rely on SCSI anymore, so you need to set ATA=y and
ATA_PIIX=y to get a bootable system.
-New patch:
-appletouch-geyser4.patch
-
Unchanged:
acpi-blacklist-fix.patch
+appletouch-geyser4.patch
+efi_e820_all_mapped_fix.patch
mouseemu.patch
s3.patch
@@ -16,6 +15,7 @@
ir.patch: offsets
piix.ich7.patch: offsets
usbhid.patch: offsets, and add support for Geyser 4 devices
+usb-storage-zerowait.patch: offsets
Updated, need check:
sci_en.patch (needs check since since 2.6.18)
@@ -26,40 +26,3 @@
version.patch, replaced by a sed script
Removed, need check:
-
-Changes since 2.6.17:
-
-NOTE: applesmc now implements a LED class to control keyboard backlight,
-so you need to enable CONFIG_NEW_LEDS and CONFIG_LEDS_CLASS in your kernel config.
-
-Unchanged:
-acpi-blacklist-fix.patch
-ir.patch
-s3.patch
-usb-storage-zerowait.patch
-
-Updated:
-applesmc.patch: offsets
-mouseemu.patch: offsets + removed useless hunk for x86
-piix.ich7.patch: offsets
-sigmatel_audio.patch: various fixes
-version.patch
-
-Updated, need check:
-sci_en.patch: updated from mailing list + offsets
-
-Removed:
-appletouch.patch: included in kernel
-intelfb-945g.patch: included in kernel, in a cleanest way
-keyboard_hid.patch
-
-Removed, need check:
-acpi-smart-battery.patch: included in vanilla (not absolutely sure)
-intel_mac_sata_resume_fix.patch: major changes in vanilla kernel, maybe is it not needed anymore
-sata_resume.patch: same as intel_mac_sata_resume_fix.patch
-efi_e820_all_mapped_fix.patch: major changes in vanilla kernel, maybe is it not needed anymore
-
-To be updated:
-config-2.6.18
-config-2.6.18-MBP
-imacfb.patch: included in kernel, but maybe gimli did other updates
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <hu...@us...> - 2007-02-05 10:04:41
|
Revision: 82
http://svn.sourceforge.net/mactel-linux/?rev=82&view=rev
Author: huceke
Date: 2007-02-05 02:04:17 -0800 (Mon, 05 Feb 2007)
Log Message:
-----------
Initial 2.6.20 patches
Added Paths:
-----------
trunk/kernel/mactel-patches-2.6.20/
trunk/kernel/mactel-patches-2.6.20/applesmc.patch
trunk/kernel/mactel-patches-2.6.20/appletouch.patch
trunk/kernel/mactel-patches-2.6.20/apply
trunk/kernel/mactel-patches-2.6.20/coretemp.patch
trunk/kernel/mactel-patches-2.6.20/mouseemu.patch
trunk/kernel/mactel-patches-2.6.20/sigmatel_audio.patch
trunk/kernel/mactel-patches-2.6.20/unapply
trunk/kernel/mactel-patches-2.6.20/usb-storage-zerowait.patch
trunk/kernel/mactel-patches-2.6.20/usbhid.patch
Added: trunk/kernel/mactel-patches-2.6.20/applesmc.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.20/applesmc.patch (rev 0)
+++ trunk/kernel/mactel-patches-2.6.20/applesmc.patch 2007-02-05 10:04:17 UTC (rev 82)
@@ -0,0 +1,960 @@
+diff -pruN linux/drivers/hwmon.vanilla/Kconfig linux/drivers/hwmon/Kconfig
+--- linux/drivers/hwmon.vanilla/Kconfig 2006-11-30 21:14:48.000000000 +0800
++++ linux/drivers/hwmon/Kconfig 2006-11-30 20:52:23.000000000 +0800
+@@ -539,6 +539,28 @@ 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, and keyboard backlight control.
++
++ Only Intel-based Apple's laptops are supported (MacBook Pro, MacBook).
++
++ The accelerometer and light sensors data is readable via sysfs, and
++ the keyboard backlight is writable.
++
++ 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 -pruN linux/drivers/hwmon.vanilla/Makefile linux/drivers/hwmon/Makefile
+--- linux/drivers/hwmon.vanilla/Makefile 2006-11-30 21:14:48.000000000 +0800
++++ linux/drivers/hwmon/Makefile 2006-11-30 20:47:51.000000000 +0800
+@@ -19,6 +19,7 @@ obj-$(CONFIG_SENSORS_ADM1025) += adm1025
+ obj-$(CONFIG_SENSORS_ADM1026) += adm1026.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 -pruN linux/drivers/hwmon.vanilla/applesmc.c linux/drivers/hwmon/applesmc.c
+--- linux/drivers/hwmon.vanilla/applesmc.c 1970-01-01 07:30:00.000000000 +0730
++++ linux/drivers/hwmon/applesmc.c 2006-11-30 20:47:51.000000000 +0800
+@@ -0,0 +1,913 @@
++/*
++ * drivers/hwmon/applesmc.c - driver for Apple's SMC (various sensors,
++ * fan control)
++ *
++ * Copyright (C) 2006 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 <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
++
++static const char* temperature_sensors_sets[][8] =
++{
++ { "TB0T", "TC0D", "TC0P", "Th0H", "Ts0P", "Th1H", "Ts1P", NULL },
++ { "TC0D", "TC0P", NULL }
++};
++
++#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 {
++/* Indicate whether this computer has an accelerometer. */
++ int accelerometer;
++/* Indicate whether this computer has light sensors and keyboard backlight. */
++ int light;
++/* Indicate 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;
++
++/* Indicate whether this computer has an accelerometer. */
++static unsigned int applesmc_accelerometer = 0;
++
++/* Indicate whether this computer has light sensors and keyboard backlight. */
++static unsigned int applesmc_light = 0;
++
++/* Indicate which temperature sensors set to use. */
++static unsigned int applesmc_temperature_set = 0;
++
++static DECLARE_MUTEX(applesmc_sem);
++
++/*
++ * __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.
++ */
++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_sem.
++ */
++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_sem.
++ */
++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_sem.
++ */
++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;
++
++ down(&applesmc_sem);
++
++ 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:
++ up(&applesmc_sem);
++ return ret;
++}
++
++/*
++ * applesmc_get_fan_count - get the number of fans. Callers must NOT hold
++ * applesmc_sem.
++ */
++static int applesmc_get_fan_count(void)
++{
++ int ret;
++ u8 buffer[1];
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(FANS_COUNT, buffer, 1);
++
++ up(&applesmc_sem);
++ 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_sem.
++ */
++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 (down_trylock(&applesmc_sem)) {
++ 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);
++
++ up(&applesmc_sem);
++}
++
++/* Sysfs Files */
++
++static ssize_t applesmc_position_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ int ret;
++ s16 x, y, z;
++
++ down(&applesmc_sem);
++
++ 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:
++ up(&applesmc_sem);
++ 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 *buf)
++{
++ int ret;
++ u8 left = 0, right = 0;
++ u8 buffer[6];
++
++ down(&applesmc_sem);
++
++ 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:
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "(%d,%d)\n", left, right);
++}
++
++/* Displays °C * 100 */
++static ssize_t applesmc_show_temperature(struct device *dev, char *buf, const char *key)
++{
++ int ret;
++ u8 buffer[2];
++ unsigned int temp;
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(key, buffer, 2);
++ temp = buffer[0]*100;
++ temp += (buffer[1] >> 6) * 25;
++
++ up(&applesmc_sem);
++
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "%u\n", temp);
++}
++
++static ssize_t applesmc_show_fan_speed(struct device *dev, char *buf,
++ const char* key, int offset)
++{
++ int ret;
++ unsigned int speed = 0;
++ char newkey[5];
++ u8 buffer[2];
++
++ newkey[0] = key[0];
++ newkey[1] = '0' + offset;
++ newkey[2] = key[2];
++ newkey[3] = key[3];
++ newkey[4] = 0;
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(newkey, buffer, 2);
++ speed = ((buffer[0] << 8 | buffer[1]) >> 2);
++
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "%u\n", speed);
++}
++
++static ssize_t applesmc_store_fan_speed(struct device *dev, const char *buf,
++ size_t count, const char* key, int offset)
++{
++ int ret;
++ u32 speed;
++ char newkey[5];
++ u8 buffer[2];
++
++ speed = simple_strtoul(buf, 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[4] = 0;
++
++ down(&applesmc_sem);
++
++ buffer[0] = (speed >> 6) & 0xff;
++ buffer[1] = (speed << 2) & 0xff;
++ ret = applesmc_write_key(newkey, buffer, 2);
++
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return count;
++}
++
++static ssize_t applesmc_show_fan_manual(struct device *dev, char *buf,
++ int offset)
++{
++ int ret;
++ u16 manual = 0;
++ u8 buffer[2];
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
++ manual = ((buffer[0] << 8 | buffer[1]) >> offset) & 0x01;
++
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "%d\n", manual);
++}
++
++static ssize_t applesmc_store_fan_manual(struct device *dev, const char *buf,
++ size_t count, int offset)
++{
++ int ret;
++ u8 buffer[2];
++ u32 input;
++ u16 val;
++
++ input = simple_strtoul(buf, NULL, 10);
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
++ val = (buffer[0] << 8 | buffer[1]);
++ if (ret)
++ goto out;
++
++ if (input)
++ val = val | (0x01 << offset);
++ else
++ val = val & ~(0x01 << offset);
++
++ buffer[0] = (val >> 8) & 0xFF;
++ buffer[1] = val & 0xFF;
++
++ ret = applesmc_write_key(FANS_MANUAL, buffer, 2);
++
++out:
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return count;
++}
++
++static ssize_t applesmc_calibrate_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ return sprintf(buf, "(%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)
++{
++ down(&applesmc_sem);
++ applesmc_calibrate();
++ up(&applesmc_sem);
++
++ return count;
++}
++
++static void applesmc_backlight_set(struct led_classdev *led_cdev,
++ enum led_brightness value)
++{
++ u8 buffer[2];
++
++ down(&applesmc_sem);
++ buffer[0] = value;
++ buffer[1] = 0x00;
++ applesmc_write_key(BACKLIGHT_KEY, buffer, 2);
++ up(&applesmc_sem);
++}
++
++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);
++
++#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 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 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 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 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);
++
++#define sysfs_fan_manual_offset(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);
++
++
++sysfs_fan_speeds_offset(0);
++sysfs_fan_manual_offset(0);
++sysfs_fan_speeds_offset(1);
++sysfs_fan_manual_offset(1);
++
++#define device_create_file_fan(client, offset) \
++do { \
++sysfs_create_file(client, &dev_attr_fan##offset##_actual_speed.attr); \
++sysfs_create_file(client, &dev_attr_fan##offset##_minimum_speed.attr); \
++sysfs_create_file(client, &dev_attr_fan##offset##_maximum_speed.attr); \
++sysfs_create_file(client, &dev_attr_fan##offset##_safe_speed.attr); \
++sysfs_create_file(client, &dev_attr_fan##offset##_target_speed.attr); \
++sysfs_create_file(client, &dev_attr_fan##offset##_manual.attr); \
++} while (0)
++
++#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);
++
++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);
++
++#define device_create_files_temperature(client, offset) \
++{ \
++ sysfs_create_file(client, &dev_attr_temperature_##offset.attr); \
++} while (0)
++
++/* 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 =
++ (struct dmi_match_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 int __init applesmc_init(void)
++{
++ int ret;
++
++ struct dmi_match_data applesmc_dmi_data[] = {
++ { .accelerometer = 1, .light = 1, .temperature_set = 0 },
++ { .accelerometer = 1, .light = 0, .temperature_set = 0 },
++ { .accelerometer = 0, .light = 0, .temperature_set = 1 }
++ };
++
++ /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
++ * So we need to put APPLESMC_MACBOOKPRO_DMI_MATCH before
++ * APPLESMC_MACBOOK_DMI_MATCH. */
++ 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;
++ 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 */
++ ret = applesmc_get_fan_count();
++ if (ret < 0) {
++ printk(KERN_ERR "applesmc: Cannot get the number of fans.\n");
++ }
++ else {
++ printk(KERN_INFO "applesmc: %d fans found.\n", ret);
++
++ switch (ret) {
++ default:
++ printk(KERN_WARNING "applesmc: More than 2 fans found,"
++ " but at most 2 fans are supported"
++ " by the driver.\n");
++ case 2:
++ device_create_file_fan(&pdev->dev.kobj, 1);
++ case 1:
++ device_create_file_fan(&pdev->dev.kobj, 0);
++ case 0:
++ ;
++ }
++ }
++
++ ret = 0;
++ while (temperature_sensors_sets[applesmc_temperature_set][ret] != NULL) ret++;
++
++ switch (ret) {
++ default:
++ case 7:
++ device_create_files_temperature(&pdev->dev.kobj, 6);
++ case 6:
++ device_create_files_temperature(&pdev->dev.kobj, 5);
++ case 5:
++ device_create_files_temperature(&pdev->dev.kobj, 4);
++ case 4:
++ device_create_files_temperature(&pdev->dev.kobj, 3);
++ case 3:
++ device_create_files_temperature(&pdev->dev.kobj, 2);
++ case 2:
++ device_create_files_temperature(&pdev->dev.kobj, 1);
++ case 1:
++ device_create_files_temperature(&pdev->dev.kobj, 0);
++ case 0:
++ ;
++ }
++
++ 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");
Added: trunk/kernel/mactel-patches-2.6.20/appletouch.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.20/appletouch.patch (rev 0)
+++ trunk/kernel/mactel-patches-2.6.20/appletouch.patch 2007-02-05 10:04:17 UTC (rev 82)
@@ -0,0 +1,11 @@
+--- a/drivers/usb/input/appletouch.c.orig 2007-01-13 19:59:19.000000000 +0100
++++ b/drivers/usb/input/appletouch.c 2007-01-13 20:00:19.000000000 +0100
+@@ -127,7 +127,7 @@
+ * Threshold for the touchpad sensors. Any change less than ATP_THRESHOLD is
+ * ignored.
+ */
+-#define ATP_THRESHOLD 5
++#define ATP_THRESHOLD 3
+
+ /* MacBook Pro (Geyser 3 & 4) initialization constants */
+ #define ATP_GEYSER3_MODE_READ_REQUEST_ID 1
Added: trunk/kernel/mactel-patches-2.6.20/apply
===================================================================
--- trunk/kernel/mactel-patches-2.6.20/apply (rev 0)
+++ trunk/kernel/mactel-patches-2.6.20/apply 2007-02-05 10:04:17 UTC (rev 82)
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+if [ "$1" == "" ]; then
+ echo "usage ./apply kerneldir"
+ exit 0
+fi
+
+WORK=$PWD
+
+cd $1
+
+for i in `ls $WORK/*.patch`
+do
+ patch -p1 --dry-run < $i > /dev/null
+ if [ "$?" != "0" ]; then
+ echo "$i would not apply cleanly"
+ exit
+ fi
+done
+
+for i in `ls $WORK/*.patch`
+do
+ echo "$i" | sed -e "s/.*\/\(.*\)$/Applying \1.../"
+ patch -p1 < $i
+done
+
+grep "^EXTRAVERSION *=.*-mactel$" Makefile > /dev/null
+if [ $? != 0 ]; then
+ echo "changing version in Makefile"
+ sed -i Makefile -e "s/^\(EXTRAVERSION *=.*\)$/\1-mactel/"
+fi
Property changes on: trunk/kernel/mactel-patches-2.6.20/apply
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/kernel/mactel-patches-2.6.20/...
[truncated message content] |
|
From: <pe...@pe...> - 2007-02-05 11:45:38
|
On 2/5/07, hu...@us... <hu...@us...> wrote: > Revision: 82 > http://svn.sourceforge.net/mactel-linux/?rev=82&view=rev > Author: huceke > Date: 2007-02-05 02:04:17 -0800 (Mon, 05 Feb 2007) > > Log Message: > ----------- > Initial 2.6.20 patches Is anyone pushing the mactel patches to the mainline kernel? Pedro. |
|
From: gimli <gi...@da...> - 2007-02-05 12:25:42
|
Good news, using 2.6.20 and latest patches i submited today, sleep works the first time on the Core 2 Duo Macbook. cu Edgar (gimli) Hucek |
|
From: Matteo B. <mat...@gm...> - 2007-02-05 21:27:18
|
.config? On Monday 05 February 2007 13:25, gimli wrote: > Good news, > > using 2.6.20 and latest patches i submited today, > sleep works the first time on the Core 2 Duo Macbook. > > cu > > Edgar (gimli) Hucek > > ------------------------------------------------------------------------- > Using Tomcat but need to do more? Need to support web services, security? > Get stuff done quickly with pre-integrated technology to make your job > easier. Download IBM WebSphere Application Server v.1.0.1 based on Apache > Geronimo > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 > _______________________________________________ > Mactel-linux-devel mailing list > Mac...@li... > https://lists.sourceforge.net/lists/listinfo/mactel-linux-devel |
|
From: Stefan B. <br...@cs...> - 2007-02-05 23:17:34
|
At 13:25 +0100 on 2007-2-5 gimli wrote: > > using 2.6.20 and latest patches i submited today, > sleep works the first time on the Core 2 Duo Macbook. With what ati-drivers? 8.30.3-r1 fails to build and 8.33.6 caues the machine to reboot upon wakeup from suspend to RAM. Suspend to RAM worked better with 2.6.19 + revision 81 of the mactel patches actually. Also 2.6.20 + mactel-patched rev 82 appears to miss the F-function first feature from usbhid (still looking for it, but it is certanly not in the usual place). The microphone no longer works (it used to work fine in 2.6.19 + mactel-patches 81). In all, compared to the previous version this is almost unusable, suspend to RAM being the big showstopper (was not completely reliable in the previous incarnation but at least it worked). And I still have the battery information disappearing in a matter of hours or less from boot. Maybe I am missing something though, if so please let me know. I am especially interested in finding out how do you guys cope with the ati-drivers. Running a 64-bit system (could this be it?), kernel config at <http://turing.ubishops.ca/misc/config-2.6.20-mactel>. Cheers, Stefan -- If it was so, it might be; and if it were so, it would be; but as it isn't, it ain't. That's logic. --Lewis Carroll, Through the Looking-Glass |
|
From: gimli <gi...@da...> - 2007-02-06 07:32:38
Attachments:
config-2.6.20
|
Here is my config. BTW: i talk about the macbook, not the macbook pro. cu Edgar (gimli) Hucek Stefan Bruda schrieb: > At 13:25 +0100 on 2007-2-5 gimli wrote: > > > > using 2.6.20 and latest patches i submited today, > > sleep works the first time on the Core 2 Duo Macbook. > > With what ati-drivers? 8.30.3-r1 fails to build and 8.33.6 caues the > machine to reboot upon wakeup from suspend to RAM. Suspend to RAM > worked better with 2.6.19 + revision 81 of the mactel patches > actually. > > Also 2.6.20 + mactel-patched rev 82 appears to miss the F-function > first feature from usbhid (still looking for it, but it is certanly > not in the usual place). The microphone no longer works (it used to > work fine in 2.6.19 + mactel-patches 81). > > In all, compared to the previous version this is almost unusable, > suspend to RAM being the big showstopper (was not completely reliable > in the previous incarnation but at least it worked). And I still have > the battery information disappearing in a matter of hours or less from > boot. > > Maybe I am missing something though, if so please let me know. I am > especially interested in finding out how do you guys cope with the > ati-drivers. > > Running a 64-bit system (could this be it?), kernel config at > <http://turing.ubishops.ca/misc/config-2.6.20-mactel>. > > Cheers, > Stefan > |
|
From: Frederic R. <fre...@gm...> - 2007-02-06 08:39:05
|
2007/2/6, gimli <gi...@da...>: > Here is my config. BTW: i talk about the macbook, not the > macbook pro. Looking at the .config, you use a 32 bit kernel whereas the Core 2 is an x86_64, isn't it? What are the reasons for you to use a 'degraded' kernel like that? Fred. |
|
From: gimli <gi...@da...> - 2007-02-06 08:45:44
|
Hm... why should i use a 64 bit kernel ? Sure i could access a realy large amount of memory if the chipset would handle it ;) >From the performance point it shouldn't matter. Amd64 distros have the disadvantage that not all applications works well with 64bit. cu Edgar (gimli) Hucek Frederic Riss schrieb: > 2007/2/6, gimli <gi...@da...>: >> Here is my config. BTW: i talk about the macbook, not the >> macbook pro. > > Looking at the .config, you use a 32 bit kernel whereas the Core 2 is > an x86_64, isn't it? What are the reasons for you to use a 'degraded' > kernel like that? > > Fred. > > ------------------------------------------------------------------------- > Using Tomcat but need to do more? Need to support web services, security? > Get stuff done quickly with pre-integrated technology to make your job easier. > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 > _______________________________________________ > Mactel-linux-users mailing list > Mac...@li... > https://lists.sourceforge.net/lists/listinfo/mactel-linux-users > |
|
From: Frederic R. <fre...@gm...> - 2007-02-06 09:36:10
|
2007/2/6, gimli <gi...@da...>: > Hm... why should i use a 64 bit kernel ? Sure i could access a realy large > amount of memory if the chipset would handle it ;) > From the performance point it shouldn't matter. Amd64 distros have the > disadvantage that not all applications works well with 64bit. You can run a 32 bit userland on a 64-bit kernel if you want to. But the kernel being 64 bit isn't only a memory-size thing, the instruction set isn't the same for example. I don't have neither numbers nor 64bits H/W to test, but I guess there are performace benefits in using the processor's native instruction set. BTW, are you using elilo or the BIOS emulation? There's currently no support for booting x86_64 kernels from EFI. But I'm quite sure it's not safe to boot a 32bit kernel on 64bits H/W in EFI mode (see lkml http://lkml.org/lkml/2007/2/1/335 ). Fred. |
|
From: Stefan B. <br...@cs...> - 2007-02-06 13:44:18
|
At 09:45 +0100 on 2007-2-6 gimli wrote:
>
> From the performance point it shouldn't matter. Amd64 distros have
> the disadvantage that not all applications works well with 64bit.
On the other hand I have not realy had any serios problem on the
application side (in Gentoo). Took me a while to figure out how to
use 32-bit plugins in Firefox (nspluginwrapper turned out to be my
friend) but that's pretty much it.
On the hardware support side I have a number of issues, but I am not
sure how many would be resolved should I switch to 32 bit. The issues
are: ati-drivers (no Powerplay, no DVI-I out, versions newer than
8.30.3 cause the system to reboot on wakeup), unreliable battery
reporting, somehow unreliable wakeup (followed by a kernel oops some
times).
Abybody seeing this in 32-bit land?
Stefan
--
If it was so, it might be; and if it were so, it would be; but as
it isn't, it ain't. That's logic.
--Lewis Carroll, Through the Looking-Glass
|
|
From: Scott L. P. <pr...@df...> - 2007-02-06 14:09:29
|
Do you have the wireless lan working in 64bit? That is the only reason I am not running 64bit. I have all of the same issues in 32bit mode, although I have never used the DVI-I. Scott =) Stefan Bruda wrote: > At 09:45 +0100 on 2007-2-6 gimli wrote: > > > > From the performance point it shouldn't matter. Amd64 distros have > > the disadvantage that not all applications works well with 64bit. > > On the other hand I have not realy had any serios problem on the > application side (in Gentoo). Took me a while to figure out how to > use 32-bit plugins in Firefox (nspluginwrapper turned out to be my > friend) but that's pretty much it. > > On the hardware support side I have a number of issues, but I am not > sure how many would be resolved should I switch to 32 bit. The issues > are: ati-drivers (no Powerplay, no DVI-I out, versions newer than > 8.30.3 cause the system to reboot on wakeup), unreliable battery > reporting, somehow unreliable wakeup (followed by a kernel oops some > times). > > Abybody seeing this in 32-bit land? > > Stefan > -- Electrical Engineering/Web Development Hunt Utilities Group LLC http://www.hugllc.com Pine River, MN (218) 587-5001 Hopkins, MN (952) 935-2418 |
|
From: Stefan B. <br...@cs...> - 2007-02-06 19:44:23
|
At 08:09 -0600 on 2007-2-6 Scott L. Price wrote:
>
> Do you have the wireless lan working in 64bit?
Unfortunately the Wlan card is not yet supported by the madwifi-ng
HAL. There is one person in charge of this and nobody knows when will
he get to it. It could be a matter of months until this chip gets
into the madwifi HAL.
So what I did in the meantime is to purchase a dirt cheap Dell
Wireless 1390 Expresscard/34 off eBay (currently selling for under USD
45 all inclussive, though I got it cheaper). This uses the Broadcom
chip which is supported by both in-kernel modules and ndiswrappers.
Except for a protruding thing that has Dell written on it, everything
is fine and I can thus afford the wait.
> I have all of the same issues in 32bit mode, although I have never
> used the DVI-I.
Yeah, this is what I thought. Thanks for the confirmation.
Cheers,
Stefan
--
If it was so, it might be; and if it were so, it would be; but as
it isn't, it ain't. That's logic.
--Lewis Carroll, Through the Looking-Glass
|
|
From: gimli <gi...@da...> - 2007-02-06 19:49:14
|
On the macbook pro that would work, but for the macbook the only alternative is an usb stick. this is more than unhandy. cu Edgar (gimli) Hucek Stefan Bruda schrieb: > At 08:09 -0600 on 2007-2-6 Scott L. Price wrote: > > > > Do you have the wireless lan working in 64bit? > > Unfortunately the Wlan card is not yet supported by the madwifi-ng > HAL. There is one person in charge of this and nobody knows when will > he get to it. It could be a matter of months until this chip gets > into the madwifi HAL. > > So what I did in the meantime is to purchase a dirt cheap Dell > Wireless 1390 Expresscard/34 off eBay (currently selling for under USD > 45 all inclussive, though I got it cheaper). This uses the Broadcom > chip which is supported by both in-kernel modules and ndiswrappers. > Except for a protruding thing that has Dell written on it, everything > is fine and I can thus afford the wait. > > > I have all of the same issues in 32bit mode, although I have never > > used the DVI-I. > > Yeah, this is what I thought. Thanks for the confirmation. > > Cheers, > Stefan > |
|
From: Matteo B. <mat...@gm...> - 2007-02-06 11:48:36
|
With kernel 2.6.20 + mactel patch + gimli's config my macbook core2duo 1,83ghz not work (suspend) use lilo? xorg versione? dist? sky2 module remove before suspend? what are command to suspend? echo -n "mem" > /sys/power/state or s2ram -f -XXX Please give us more information! Cu Matteo Buferli P.s. sorry for english On Tuesday 06 February 2007 09:32, gimli wrote: > Here is my config. BTW: i talk about the macbook, not the > macbook pro. > > cu > > Edgar (gimli) Hucek > > Stefan Bruda schrieb: > > At 13:25 +0100 on 2007-2-5 gimli wrote: > > > using 2.6.20 and latest patches i submited today, > > > sleep works the first time on the Core 2 Duo Macbook. > > > > With what ati-drivers? 8.30.3-r1 fails to build and 8.33.6 caues the > > machine to reboot upon wakeup from suspend to RAM. Suspend to RAM > > worked better with 2.6.19 + revision 81 of the mactel patches > > actually. > > > > Also 2.6.20 + mactel-patched rev 82 appears to miss the F-function > > first feature from usbhid (still looking for it, but it is certanly > > not in the usual place). The microphone no longer works (it used to > > work fine in 2.6.19 + mactel-patches 81). > > > > In all, compared to the previous version this is almost unusable, > > suspend to RAM being the big showstopper (was not completely reliable > > in the previous incarnation but at least it worked). And I still have > > the battery information disappearing in a matter of hours or less from > > boot. > > > > Maybe I am missing something though, if so please let me know. I am > > especially interested in finding out how do you guys cope with the > > ati-drivers. > > > > Running a 64-bit system (could this be it?), kernel config at > > <http://turing.ubishops.ca/misc/config-2.6.20-mactel>. > > > > Cheers, > > Stefan |
|
From: gimli <gi...@da...> - 2007-02-06 11:56:43
|
> use lilo?
grub
> xorg versione?
> dist?
ubuntu edgy
> sky2 module remove before suspend?
> what are command to suspend? echo -n "mem" > /sys/power/state or s2ram -f -XXX
gentoo-pwermanager
/usr/sbin/laptop-detect was chaged to return 0
root@macbook:/usr/src/kvm# cat /usr/sbin/laptop-detect
#!/bin/sh -e
exit 0
# Are we a mac?
if test -d /proc/pmu; then
batteries=$(grep Battery /proc/pmu/info| cut -f2 -d:)
if test "$batteries" -ne 0; then
# echo "We're a laptop" &>2;
exit 0
fi
exit 1
fi
if [ -r /dev/mem -a -x /usr/sbin/dmidecode ]; then
# dmidecode to grab the Chassis type
dmitype=$(dmidecode|grep Chassis -A 10|grep -m1 Type|sed -e 's/.*Type: \(.*\)/\1/')
if test "$dmitype" = "Notebook" || test "$dmitype" = "Portable"; then
# echo "We're a laptop" >&2;
exit 0;
fi
# turn back on for debugging
#echo "$dmitype"
fi
# check for any ACPI batteries
if [ -d /proc/acpi/battery ]; then
results=`find /proc/acpi/battery/ -mindepth 1 -type d`
if [ ! -z "$results" ]; then
#we're almost certainly a laptop
# echo "We're a laptop" >&2;
exit 0
fi
fi
# check for APM batteries. This sucks, because we'll only get a valid response
# if the laptop has a battery fitted at the time
if [ -f /proc/apm ]; then
battery=`awk '{print $6}' </proc/apm`
if [ "$battery" != "0xff" ] && [ "$battery" != "0x80" ]; then
# There's a battery
exit 0;
fi
fi
#probably not a laptop; exit
exit 1
cu
Edgar (gimli) Hucek
|
|
From: <od...@od...> - 2007-02-06 09:48:18
|
gimli wrote: > Hm... why should i use a 64 bit kernel ? Processes can have > 2GB of address space in x86-64. That is of much interest mostly to server applications such as an Oracle DB. Odi |
|
From: Miguel S. F. <mig...@gm...> - 2007-02-07 18:26:42
|
Hi, On 2/6/07, Ortwin Gl=FCck <od...@od...> wrote: > > > gimli wrote: > > Hm... why should i use a 64 bit kernel ? > > Processes can have > 2GB of address space in x86-64. That is of much > interest mostly to server applications such as an Oracle DB. > Having the kernel in 64bit mode also brings: no-executable stack. Regards, --=20 Miguel Sousa Filipe |
|
From: Miguel S. F. <mig...@gm...> - 2007-02-06 10:40:39
|
Hi, On 2/5/07, Pedro C=F4rte-Real <pe...@pe...> wrote: > On 2/5/07, hu...@us... <hu...@us...> wr= ote: > > Revision: 82 > > http://svn.sourceforge.net/mactel-linux/?rev=3D82&view=3Drev > > Author: huceke > > Date: 2007-02-05 02:04:17 -0800 (Mon, 05 Feb 2007) > > > > Log Message: > > ----------- > > Initial 2.6.20 patches > > Is anyone pushing the mactel patches to the mainline kernel? Last time that was asked the answer was: - several mactel patches are undocumented and therefore, not apt for mainline submission. For instance: - usb-storage-zerowait.patch doesn't seem to have anything to do with mactel specifics, looks more like some mactel developer personal preference about flushing usb storage ASAP. However, the number of patches on mactel svn seem to be diminishing.. Best regards, --=20 Miguel Sousa Filipe |