UBUNTU: SAUCE: update toshiba_acpi module to development snapshot 19a
On Tue, 2008-11-18 at 16:27 +0000, Andy Whitcroft wrote:
> OriginalLocation: http://memebeam.org/free-software/toshiba_acpi/toshiba_acpi-dev_toshiba_test5-linux_2.6.21.patch > Bug: #269831 > > Update the toshiba_acpi module to the latest development snapshot from > the URL above, plus local modifications required for our acpi tooling. > This is a direct pull forward of the changes as applied to Hardy. > > Signed-off-by: Andy Whitcroft <apw@canonical.com> ACK > --- > drivers/acpi/toshiba_acpi.c | 198 ++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 197 insertions(+), 1 deletions(-) > > diff --git a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c > index 0a43c8e..f320918 100644 > --- a/drivers/acpi/toshiba_acpi.c > +++ b/drivers/acpi/toshiba_acpi.c > @@ -28,12 +28,26 @@ > * Yasushi Nagato - changes for linux kernel 2.4 -> 2.5 > * Rob Miller - TV out and hotkeys help > * > + * PLEASE NOTE > + * > + * This is an experimental version of toshiba_acpi which includes emulation > + * of the original toshiba driver's /proc/toshiba and /dev/toshiba, > + * allowing Toshiba userspace utilities to work. The relevant code was > + * based on toshiba.c (copyright 1996-2001 Jonathan A. Buzzard) and > + * incorporated into this driver with help from Gintautas Miliauskas, > + * Charles Schwieters, and Christoph Burger-Scheidlin. > + * > + * Caveats: > + * * hotkey status in /proc/toshiba is not implemented > + * * to make accesses to /dev/toshiba load this driver instead of > + * the original driver, you will have to modify your module > + * auto-loading configuration > * > * TODO > * > */ > > -#define TOSHIBA_ACPI_VERSION "0.18" > +#define TOSHIBA_ACPI_VERSION "experimental-dev-toshiba-test-5" > #define PROC_INTERFACE_VERSION 1 > > #include <linux/kernel.h> > @@ -41,6 +55,9 @@ > #include <linux/init.h> > #include <linux/types.h> > #include <linux/proc_fs.h> > +#include <linux/miscdevice.h> > +#include <linux/toshiba.h> > +#include <asm/io.h> > #include <linux/backlight.h> > > #include <asm/uaccess.h> > @@ -497,6 +514,179 @@ static char *read_version(char *p) > return p; > } > > +/* /dev/toshiba and /proc/toshiba handlers {{{ > + * > + * ISSUE: lots of magic numbers and mysterious code > + */ > + > +#define TOSH_MINOR_DEV 181 > +#define OLD_PROC_TOSHIBA "toshiba" > + > +static int > +tosh_acpi_bridge(SMMRegisters* regs) > +{ > + acpi_status status; > + > + /* assert(sizeof(SMMRegisters) == sizeof(u32)*HCI_WORDS); */ > + status = hci_raw((u32*)regs, (u32*)regs); > + if (status == AE_OK && (regs->eax & 0xff00) == HCI_SUCCESS) > + return 0; > + > + return -EINVAL; > +} > + > +static int > +tosh_ioctl(struct inode* ip, struct file* fp, unsigned int cmd, > + unsigned long arg) > +{ > + SMMRegisters regs; > + unsigned short ax,bx; > + int err; > + > + if ((!arg) || (cmd != TOSH_SMM)) > + return -EINVAL; > + > + if (copy_from_user(®s, (SMMRegisters*)arg, sizeof(SMMRegisters))) > + return -EFAULT; > + > + ax = regs.eax & 0xff00; > + bx = regs.ebx & 0xffff; > + > + /* block HCI calls to read/write memory & PCI devices */ > + if (((ax==HCI_SET) || (ax==HCI_GET)) && (bx>0x0069)) > + return -EINVAL; > + > + err = tosh_acpi_bridge(®s); > + > + if (copy_to_user((SMMRegisters*)arg, ®s, sizeof(SMMRegisters))) > + return -EFAULT; > + > + return err; > +} > + > +static int > +tosh_get_machine_id(void __iomem *bios) > +{ > + int id; > + unsigned short bx,cx; > + unsigned long address; > + > + id = (0x100*(int) readb(bios+0xfffe))+((int) readb(bios+0xfffa)); > + > + /* do we have a SCTTable machine identication number on our hands */ > + if (id==0xfc2f) { > + bx = 0xe6f5; /* cheat */ > + /* now twiddle with our pointer a bit */ > + address = 0x00000000 + bx; > + cx = readw(bios + address); > + address = 0x00000009 + bx + cx; > + cx = readw(bios + address); > + address = 0x0000000a + cx; > + cx = readw(bios + address); > + /* now construct our machine identification number */ > + id = ((cx & 0xff)<<8)+((cx & 0xff00)>>8); > + } > + > + return id; > +} > + > +static int tosh_id; > +static int tosh_bios; > +static int tosh_date; > +static int tosh_sci; > + > +static struct file_operations tosh_fops = { > + .owner = THIS_MODULE, > + .ioctl = tosh_ioctl > +}; > + > +static struct miscdevice tosh_device = { > + TOSH_MINOR_DEV, > + "toshiba", > + &tosh_fops > +}; > + > +static void > +setup_tosh_info(void __iomem *bios) > +{ > + int major, minor; > + int day, month, year; > + > + tosh_id = tosh_get_machine_id(bios); > + > + /* get the BIOS version */ > + major = readb(bios + 0xe009)-'0'; > + minor = ((readb(bios + 0xe00b)-'0')*10)+(readb(bios + 0xe00c)-'0'); > + tosh_bios = (major*0x100)+minor; > + > + /* get the BIOS date */ > + day = ((readb(bios + 0xfff5)-'0')*10)+(readb(bios + 0xfff6)-'0'); > + month = ((readb(bios + 0xfff8)-'0')*10)+(readb(bios + 0xfff9)-'0'); > + year = ((readb(bios + 0xfffb)-'0')*10)+(readb(bios + 0xfffc)-'0'); > + tosh_date = (((year-90) & 0x1f)<<10) | ((month & 0xf)<<6) > + | ((day & 0x1f)<<1); > +} > + > +/* /proc/toshiba read handler */ > +static int > +tosh_get_info(char* buffer, char** start, off_t fpos, int length) > +{ > + char* temp = buffer; > + /* TODO: tosh_fn_status() */ > + int key = 0; > + > + /* Format: > + * 0) Linux driver version (this will change if format changes) > + * 1) Machine ID > + * 2) SCI version > + * 3) BIOS version (major, minor) > + * 4) BIOS date (in SCI date format) > + * 5) Fn Key status > + */ > + > + temp += sprintf(temp, "1.1 0x%04x %d.%d %d.%d 0x%04x 0x%02x ", > + tosh_id, > + (tosh_sci & 0xff00)>>8, > + tosh_sci & 0xff, > + (tosh_bios & 0xff00)>>8, > + tosh_bios & 0xff, > + tosh_date, > + key); > + > + return temp-buffer; > +} > + > +static int __init > +old_driver_emulation_init(void) > +{ > + int status; > + void __iomem *bios = ioremap(0xf0000, 0x10000); > + if (!bios) > + return -ENOMEM; > + > + if ((status = misc_register(&tosh_device))) { > + printk(MY_ERR "failed to register misc device %d ("%s") ", > + tosh_device.minor, tosh_device.name); > + return status; > + } > + > + setup_tosh_info(bios); > + create_proc_info_entry(OLD_PROC_TOSHIBA, 0, NULL, tosh_get_info); > + > + iounmap(bios); > + > + return 0; > +} > + > +static void __exit > +old_driver_emulation_exit(void) > +{ > + remove_proc_entry(OLD_PROC_TOSHIBA, NULL); > + misc_deregister(&tosh_device); > +} > + > +/* }}} end of /dev/toshiba and /proc/toshiba handlers */ > + > /* proc and module init > */ > > @@ -555,6 +745,8 @@ static void toshiba_acpi_exit(void) > if (toshiba_proc_dir) > remove_proc_entry(PROC_TOSHIBA, acpi_root_dir); > > + old_driver_emulation_exit(); > + > return; > } > > @@ -562,6 +754,7 @@ static int __init toshiba_acpi_init(void) > { > acpi_status status = AE_OK; > u32 hci_result; > + int status2; > > if (acpi_disabled) > return -ENODEV; > @@ -578,6 +771,9 @@ static int __init toshiba_acpi_init(void) > TOSHIBA_ACPI_VERSION); > printk(MY_INFO " HCI method: %s ", method_hci); > > + if ((status2 = old_driver_emulation_init())) > + return status2; > + > force_fan = 0; > key_event_valid = 0; > > -- > 1.6.0.4.911.gc990 > > -- kernel-team mailing list kernel-team@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/kernel-team |
| All times are GMT. The time now is 12:19 PM. |
VBulletin, Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.