|
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 *dev) ++{ ++ struct appleir *appleir = dev->private; ++ ++ //appleir->urb->dev = appleir->usbdev; ++ ++ if (usb_submit_urb (appleir->urb, GFP_KERNEL)) ++ return -EIO; ++ ++ return 0; ++} ++ ++static void ++appleir_close (struct input_dev *dev) ++{ ++ struct appleir *appleir = dev->private; ++ usb_kill_urb (appleir->urb); ++ del_timer_sync (&appleir->key_up_timer); ++} ++ ++ ++ ++ ++static int ++appleir_probe (struct usb_interface *intf, const struct usb_device_id *id) ++{ ++ struct usb_device *dev = interface_to_usbdev (intf); ++ struct usb_endpoint_descriptor *endpoint; ++ struct appleir *appleir = NULL; ++ struct input_dev *input_dev; ++ int i; ++ ++ appleir = kzalloc (sizeof (struct appleir), GFP_KERNEL); ++ if (!appleir) ++ goto fail; ++ ++ memset (appleir, 0, sizeof (struct appleir)); ++ ++ ++ appleir->data = ++ usb_buffer_alloc (dev, URB_SIZE, GFP_KERNEL, &appleir->dma_buf); ++ if (!appleir->data) ++ goto fail; ++ ++ appleir->urb = usb_alloc_urb (0, GFP_KERNEL); ++ if (!appleir->urb) ++ goto fail; ++ ++ appleir->usbdev = dev; ++ ++ input_dev = input_allocate_device (); ++ if (!input_dev) ++ goto fail; ++ ++ appleir->dev = input_dev; ++ ++ ++ usb_make_path (dev, appleir->phys, sizeof (appleir->phys)); ++ strlcpy (appleir->phys, "/input0", sizeof (appleir->phys)); ++ ++ input_dev->name = "Apple Mac mini infrared remote control driver"; ++ input_dev->phys = appleir->phys; ++ usb_to_input_id (dev, &input_dev->id); ++ input_dev->cdev.dev = &intf->dev; ++ input_dev->private = appleir; ++ ++ input_dev->evbit[0] = BIT (EV_KEY) | BIT (EV_REP); ++ input_dev->ledbit[0] = 0; ++ ++ for (i = 0; i < MAX_KEYS; i++) ++ { ++ set_bit (keymap[i], input_dev->keybit); ++ } ++ ++ clear_bit (0, input_dev->keybit); ++ ++ input_dev->open = appleir_open; ++ input_dev->close = appleir_close; ++ ++ endpoint = &intf->cur_altsetting->endpoint[0].desc; ++ ++ usb_fill_int_urb (appleir->urb, dev, ++ usb_rcvintpipe (dev, endpoint->bEndpointAddress), ++ appleir->data, 8, ++ appleir_urb, appleir, endpoint->bInterval); ++ ++ appleir->urb->transfer_dma = appleir->dma_buf; ++ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; ++ ++ usb_set_intfdata (intf, appleir); ++ ++ init_timer (&appleir->key_up_timer); ++ ++ appleir->key_up_timer.function = key_up_tick; ++ appleir->key_up_timer.data = (unsigned long) appleir; ++ ++ appleir->timer_initted++; ++ ++ input_register_device (appleir->dev); ++ ++ return 0; ++ ++fail: ++ ++ if (appleir) ++ { ++ ++ ++ if (appleir->data) ++ usb_buffer_free (dev, URB_SIZE, appleir->data, appleir->dma_buf); ++ ++ if (appleir->timer_initted) ++ del_timer_sync (&appleir->key_up_timer); ++ ++ if (appleir->dev) ++ input_free_device (appleir->dev); ++ ++ kfree (appleir); ++ } ++ ++ return -ENOMEM; ++} ++ ++static void ++appleir_disconnect (struct usb_interface *intf) ++{ ++ struct appleir *appleir = usb_get_intfdata (intf); ++ ++ usb_set_intfdata (intf, NULL); ++ if (appleir) ++ { ++ input_unregister_device (appleir->dev); ++ if (appleir->timer_initted) ++ del_timer_sync (&appleir->key_up_timer); ++ usb_kill_urb (appleir->urb); ++ usb_free_urb (appleir->urb); ++ usb_buffer_free (interface_to_usbdev (intf), URB_SIZE, appleir->data, ++ appleir->dma_buf); ++ kfree (appleir); ++ } ++} ++ ++static struct usb_driver appleir_driver = { ++ .name = "appleir", ++ .probe = appleir_probe, ++ .disconnect = appleir_disconnect, ++ .id_table = appleir_ids, ++}; ++ ++static int __init ++appleir_init (void) ++{ ++ int retval; ++ retval = usb_register (&appleir_driver); ++ if (retval) ++ goto out; ++ info (DRIVER_VERSION ":" DRIVER_DESC); ++out: ++ return retval; ++} ++ ++static void __exit ++appleir_exit (void) ++{ ++ usb_deregister (&appleir_driver); ++} ++ ++module_init (appleir_init); ++module_exit (appleir_exit); Added: trunk/kernel/mactel-patches-2.6.18/mouseemu.patch =================================================================== --- trunk/kernel/mactel-patches-2.6.18/mouseemu.patch (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/mouseemu.patch 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,32 @@ +diff -uNr linux-2.6.16.1/drivers/Makefile linux-2.6.16.1-imac/drivers/Makefile +--- linux-2.6.16.1/drivers/Makefile 2006-03-20 05:53:29.000000000 +0000 ++++ linux-2.6.16.1-imac/drivers/Makefile 2006-04-01 23:51:38.000000000 +0000 +@@ -30,7 +30,7 @@ + obj-y += base/ block/ misc/ mfd/ net/ media/ + obj-$(CONFIG_NUBUS) += nubus/ + obj-$(CONFIG_ATM) += atm/ +-obj-$(CONFIG_PPC_PMAC) += macintosh/ ++obj-y += macintosh/ + obj-$(CONFIG_IDE) += ide/ + obj-$(CONFIG_FC4) += fc4/ + obj-$(CONFIG_SCSI) += scsi/ +diff -uNr linux-2.6.16.1/drivers/macintosh/Kconfig linux-2.6.16.1-imac/drivers/macintosh/Kconfig +--- linux-2.6.16.1/drivers/macintosh/Kconfig 2006-03-20 05:53:29.000000000 +0000 ++++ linux-2.6.16.1-imac/drivers/macintosh/Kconfig 2006-04-01 23:51:38.000000000 +0000 +@@ -1,6 +1,6 @@ + + menu "Macintosh device drivers" +- depends on PPC || MAC ++ depends on PPC || MAC || X86 + + config ADB + bool "Apple Desktop Bus (ADB) support" +@@ -162,7 +162,7 @@ + + config MAC_EMUMOUSEBTN + bool "Support for mouse button 2+3 emulation" +- depends on INPUT_ADBHID ++# depends on INPUT_ADBHID + help + This provides generic support for emulating the 2nd and 3rd mouse + button with keypresses. If you say Y here, the emulation is still Added: trunk/kernel/mactel-patches-2.6.18/piix.ich7.patch =================================================================== --- trunk/kernel/mactel-patches-2.6.18/piix.ich7.patch (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/piix.ich7.patch 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,21 @@ +--- linux-2.6.16.1/drivers/ide/ide-io.c 2006-03-28 07:49:02.000000000 +0100 ++++ linux-2.6.16.1-imac-sky2-rtc/drivers/ide/ide-io.c 2006-05-15 03:24:57.000000000 +0100 +@@ -1594,6 +1594,8 @@ + * Whack the status register, just in case + * we have a leftover pending IRQ. + */ ++ /* Ack the interrupt for ich7 - XXX possible race */ ++ hwif->OUTB( (hwif->INB(hwif->dma_status) |4) & ~2, hwif->dma_status); + (void) hwif->INB(hwif->io_ports[IDE_STATUS_OFFSET]); + #endif /* CONFIG_BLK_DEV_IDEPCI */ + } +@@ -1636,6 +1636,9 @@ + startstop = handler(drive); + spin_lock_irq(&ide_lock); + ++ /* Ack the interrupt for ich7 - XXX possible race */ ++ hwif->OUTB( (hwif->INB(hwif->dma_status) |4) & ~2, hwif->dma_status); ++ + /* + * Note that handler() may have set things up for another + * interrupt to occur soon, but it cannot happen until Added: trunk/kernel/mactel-patches-2.6.18/s3.patch =================================================================== --- trunk/kernel/mactel-patches-2.6.18/s3.patch (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/s3.patch 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,20 @@ +--- a/drivers/acpi/sleep/poweroff.c 2006-06-11 05:22:53.000000000 -0700 ++++ b/drivers/acpi/sleep/poweroff.c 2006-06-11 05:06:36.000000000 -0700 +@@ -63,8 +63,15 @@ static int acpi_shutdown(struct sys_devi + } + } + ++static int acpi_resume(struct sys_device *x) ++{ ++ acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1, ACPI_MTX_DO_NOT_LOCK); ++ return 0; ++} ++ + static struct sysdev_class acpi_sysclass = { + set_kset_name("acpi"), ++ .resume = acpi_resume, + .shutdown = acpi_shutdown + }; + + + Added: trunk/kernel/mactel-patches-2.6.18/sci_en.patch =================================================================== --- trunk/kernel/mactel-patches-2.6.18/sci_en.patch (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/sci_en.patch 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,91 @@ +From: Ryan Lortie <de...@de...> +Date: Sat, 10 Jun 2006 20:22:56 +0000 (-0400) +Subject: [UBUNTU:ich7-sci-en-quirk] poke the SCI_EN bit on Macbook resume +X-Git-Url: http://www.kernel.org/git/?p=linux/kernel/git/bcollins/ubuntu-dapper.git;a=commitdiff;h=d1d9b907570c5c9178e3d66ff208bd483d1dfd61 + +[UBUNTU:ich7-sci-en-quirk] poke the SCI_EN bit on Macbook resume + +The following patch deals with the problem that the SCI_EN bit is +disabled when the Macbook comes back from sleeping. + +It does this by registering a quirk in the exact way that another one is +registered in the same file (for a Toshiba laptop with a similar +problem). + +The quirk matches based on DMI product name of "MacBook1,1" so it should +really only affect the Macbook. + +The actual bit-poking is done immediately on return from +do_suspend_lowlevel(). If I do it in the 'finish' function it is too +late (as at this point IRQs have been enabled again for some time). + +Cheers. + +Signed-off-by: Ben Collins <bco...@ub...> +--- + +--- a/drivers/acpi/sleep/main.c ++++ b/drivers/acpi/sleep/main.c +@@ -17,6 +17,7 @@ + #include <linux/suspend.h> + #include <acpi/acpi_bus.h> + #include <acpi/acpi_drivers.h> ++#include <asm/io.h> + #include "sleep.h" + + u8 sleep_states[ACPI_S_STATE_COUNT]; +@@ -34,6 +35,7 @@ static u32 acpi_suspend_states[] = { + }; + + static int init_8259A_after_S1; ++static int ich7_sci_en_quirk_enabled; + + /** + * acpi_pm_prepare - Do preliminary suspend work. +@@ -92,6 +94,14 @@ static int acpi_pm_enter(suspend_state_t + + case PM_SUSPEND_MEM: + do_suspend_lowlevel(); ++ ++ if (ich7_sci_en_quirk_enabled) ++ { ++ int pm1c = inw(0x404); ++ pm1c |= 0x01; /* SCI_EN */ ++ outw (pm1c, 0x404); ++ } ++ + break; + + case PM_SUSPEND_DISK: +@@ -191,12 +201,31 @@ static int __init init_ints_after_s1(str + return 0; + } + ++/* ++ * Apple Macbook comes back from sleep with the SCI_EN bit disabled ++ * causing a flood of unacknowledged IRQ9s. We need to set SCI_EN ++ * as soon as we come back ++ */ ++static int __init init_ich7_sci_en_quirk(struct dmi_system_id *d) ++{ ++ printk(KERN_WARNING "%s detected (ICH7 SCI_EN quirk enabled)\n", ++ d->ident); ++ ich7_sci_en_quirk_enabled = 1; ++ return 0; ++} ++ ++ + static struct dmi_system_id __initdata acpisleep_dmi_table[] = { + { + .callback = init_ints_after_s1, + .ident = "Toshiba Satellite 4030cdt", + .matches = {DMI_MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),}, + }, ++ { ++ .callback = init_ich7_sci_en_quirk, ++ .ident = "Apple MacBook", ++ .matches = {DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),}, ++ }, + {}, + }; + Added: trunk/kernel/mactel-patches-2.6.18/sigmatel_audio.patch =================================================================== --- trunk/kernel/mactel-patches-2.6.18/sigmatel_audio.patch (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/sigmatel_audio.patch 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,61 @@ +diff -pruN linux/sound/pci/hda.vanilla/patch_sigmatel.c linux/sound/pci/hda/patch_sigmatel.c +--- linux/sound/pci/hda.vanilla/patch_sigmatel.c 2006-07-23 14:43:17.000000000 +0200 ++++ linux/sound/pci/hda/patch_sigmatel.c 2006-07-23 18:03:25.000000000 +0200 +@@ -41,7 +41,7 @@ + #define STAC_REF 0 + #define STAC_D945GTP3 1 + #define STAC_D945GTP5 2 +-#define STAC_MACMINI 3 ++#define STAC_APPLE 3 + #define STAC_D965_2112 4 + #define STAC_D965_284B 5 + #define STAC_922X_MODELS 6 /* number of 922x models */ +@@ -341,6 +341,12 @@ static unsigned int d945gtp5_pin_configs + 0x02a19320, 0x40000100, + }; + ++static unsigned int apple_pin_configs[10] = { ++ 0x0121E230, 0x90A70120, 0x9017E110, 0x400000FE, ++ 0x400000FD, 0x0181E021, 0x1145E040, 0x400000FA, ++ 0x400000FC, 0x400000FB, ++}; ++ + static unsigned int d965_2112_pin_configs[10] = { + 0x0221401f, 0x40000100, 0x40000100, 0x01014011, + 0x01a19021, 0x01813024, 0x01452130, 0x40000100, +@@ -351,7 +357,7 @@ static unsigned int *stac922x_brd_tbl[ST + [STAC_REF] = ref922x_pin_configs, + [STAC_D945GTP3] = d945gtp3_pin_configs, + [STAC_D945GTP5] = d945gtp5_pin_configs, +- [STAC_MACMINI] = d945gtp5_pin_configs, ++ [STAC_APPLE] = apple_pin_configs, + [STAC_D965_2112] = d965_2112_pin_configs, + }; + +@@ -386,7 +392,7 @@ static struct hda_board_config stac922x_ + .config = STAC_D945GTP5 }, /* Intel D975XBK - 5 Stack */ + { .pci_subvendor = 0x8384, + .pci_subdevice = 0x7680, +- .config = STAC_MACMINI }, /* Apple Mac Mini (early 2006) */ ++ .config = STAC_APPLE }, /* Apple Mac Mini (early 2006), Macbook and Macbook Pro */ + { .pci_subvendor = PCI_VENDOR_ID_INTEL, + .pci_subdevice = 0x2112, + .config = STAC_D965_2112 }, +@@ -437,7 +443,7 @@ static void stac92xx_set_config_regs(str + pin_cfg = snd_hda_codec_read(codec, spec->pin_nids[i], 0, + AC_VERB_GET_CONFIG_DEFAULT, + 0x00); +- snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x pin config %8.8x\n", spec->pin_nids[i], pin_cfg); ++ snd_printk(KERN_INFO "hda_codec: pin nid %2.2x pin config %8.8x\n", spec->pin_nids[i], pin_cfg); + } + } + +@@ -1306,7 +1312,7 @@ static int patch_stac922x(struct hda_cod + return err; + } + +- if (spec->board_config == STAC_MACMINI) ++ if (spec->board_config == STAC_APPLE) + spec->gpio_mute = 1; + + codec->patch_ops = stac92xx_patch_ops; Added: trunk/kernel/mactel-patches-2.6.18/unapply =================================================================== --- trunk/kernel/mactel-patches-2.6.18/unapply (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/unapply 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 -r $WORK/*.patch` +do + patch -R -p1 --dry-run < $i > /dev/null + if [ "$?" != "0" ]; then + echo "$i would not unapply cleanly" + exit + fi +done + +for i in `ls $WORK/*.patch` +do + patch -R -p1 < $i +done Property changes on: trunk/kernel/mactel-patches-2.6.18/unapply ___________________________________________________________________ Name: svn:executable + * Added: trunk/kernel/mactel-patches-2.6.18/usb-storage-zerowait.patch =================================================================== --- trunk/kernel/mactel-patches-2.6.18/usb-storage-zerowait.patch (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/usb-storage-zerowait.patch 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,12 @@ +diff -uNr linux-2.6.16.1/drivers/usb/storage/usb.c linux-2.6.16.1-imac/drivers/usb/storage/usb.c +--- linux-2.6.16.1/drivers/usb/storage/usb.c 2006-03-20 05:53:29.000000000 +0000 ++++ linux-2.6.16.1-imac/drivers/usb/storage/usb.c 2006-04-01 23:51:38.000000000 +0000 +@@ -104,7 +104,7 @@ + MODULE_DESCRIPTION("USB Mass Storage driver for Linux"); + MODULE_LICENSE("GPL"); + +-static unsigned int delay_use = 5; ++static unsigned int delay_use = 0; + module_param(delay_use, uint, S_IRUGO | S_IWUSR); + MODULE_PARM_DESC(delay_use, "seconds to delay before using a new device"); + Added: trunk/kernel/mactel-patches-2.6.18/version.patch =================================================================== --- trunk/kernel/mactel-patches-2.6.18/version.patch (rev 0) +++ trunk/kernel/mactel-patches-2.6.18/version.patch 2006-08-09 03:53:56 UTC (rev 37) @@ -0,0 +1,11 @@ +--- a/Makefile 2006-06-18 11:57:31.000000000 +0200 ++++ b/Makefile 2006-06-18 11:57:38.000000000 +0200 +@@ -1,7 +1,7 @@ + VERSION = 2 + PATCHLEVEL = 6 + SUBLEVEL = 18 +-EXTRAVERSION = -rc4 ++EXTRAVERSION = -rc4-mactel + NAME=Crazed Snow-Weasel + + # *DOCUMENTATION* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |