Author: wolvverine                   Date: Tue Sep 26 22:05:55 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- for toshiba laptops

---- Files affected:
SOURCES:
   linux-2.6-toshiba_acpi_0.18-dev_toshiba_test4.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/linux-2.6-toshiba_acpi_0.18-dev_toshiba_test4.patch
diff -u /dev/null 
SOURCES/linux-2.6-toshiba_acpi_0.18-dev_toshiba_test4.patch:1.1
--- /dev/null   Wed Sep 27 00:05:55 2006
+++ SOURCES/linux-2.6-toshiba_acpi_0.18-dev_toshiba_test4.patch Wed Sep 27 
00:05:50 2006
@@ -0,0 +1,247 @@
+--- toshiba_acpi.c.orig        2006-06-22 21:39:40.000000000 -0400
++++ toshiba_acpi.c     2006-06-22 21:48:07.000000000 -0400
+@@ -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 <asm/uaccess.h>
+ 
+ #include <acpi/acpi_drivers.h>
+@@ -463,6 +480,179 @@
+       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(&regs, (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(&regs);
++
++      if (copy_to_user((SMMRegisters*)arg, &regs, 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\n",
++              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\")\n",
++                      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
+  */
+ 
+@@ -510,6 +700,7 @@
+ {
+       acpi_status status = AE_OK;
+       u32 hci_result;
++      int status2;
+ 
+       if (acpi_disabled)
+               return -ENODEV;
+@@ -530,6 +721,9 @@
+              TOSHIBA_ACPI_VERSION);
+       printk(MY_INFO "    HCI method: %s\n", method_hci);
+ 
++      if ((status2 = old_driver_emulation_init()))
++              return status2;
++
+       force_fan = 0;
+       key_event_valid = 0;
+ 
+@@ -556,6 +750,8 @@
+       if (toshiba_proc_dir)
+               remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
+ 
++      old_driver_emulation_exit();
++
+       return;
+ }
+ 
================================================================
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to