diff -urN linux/Documentation/Configure.help linux-patched/Documentation/Configure.help
--- linux/Documentation/Configure.help	Sat Dec 22 02:41:53 2001
+++ linux-patched/Documentation/Configure.help	Mon Jan 28 12:50:38 2002
@@ -17134,6 +17134,13 @@
   This driver handles overheating conditions on laptops. It is HIGHLY
   recommended, as your laptop CPU may be damaged without it.
 
+ACPI Extras for Toshiba laptops
+CONFIG_ACPI_TOSHIBA
+  This driver provides access to custom ACPI methods that exist on
+  Toshiba laptops, such as LCD brightness control.  If you have a
+  year 2001 or newer Toshiba laptop with ACPI (such as the Libretto
+  L1 series), say Y.
+
 Advanced Power Management BIOS support
 CONFIG_APM
   APM is a BIOS specification for saving power using several different
diff -urN linux/drivers/acpi/Config.in linux-patched/drivers/acpi/Config.in
--- linux/drivers/acpi/Config.in	Thu Jun 21 09:47:39 2001
+++ linux-patched/drivers/acpi/Config.in	Mon Jan 28 12:50:38 2002
@@ -14,4 +14,6 @@
 dep_tristate '      Embedded Controller' CONFIG_ACPI_EC $CONFIG_ACPI_BUSMGR $CONFIG_ACPI
 dep_tristate '      Control Method Battery' CONFIG_ACPI_CMBATT $CONFIG_ACPI_BUSMGR $CONFIG_ACPI $CONFIG_ACPI_EC
 dep_tristate '      Thermal' CONFIG_ACPI_THERMAL $CONFIG_ACPI_BUSMGR $CONFIG_ACPI  $CONFIG_ACPI_EC
+dep_tristate '      Toshiba laptop extras' CONFIG_ACPI_TOSHIBA $CONFIG_ACPI_BUSMGR $CONFIG_ACPI
 #endmenu
+
diff -urN linux/drivers/acpi/ospm/Makefile linux-patched/drivers/acpi/ospm/Makefile
--- linux/drivers/acpi/ospm/Makefile	Thu Jun 21 09:47:40 2001
+++ linux-patched/drivers/acpi/ospm/Makefile	Mon Jan 28 12:50:38 2002
@@ -16,6 +16,7 @@
 subdir-$(CONFIG_ACPI_AC)	+= ac_adapter
 subdir-$(CONFIG_ACPI_BUTTON)	+= button
 subdir-$(CONFIG_ACPI_THERMAL)	+= thermal
+subdir-$(CONFIG_ACPI_TOSHIBA)	+= toshiba
 
 obj-y				+= $(foreach dir,$(subdir-y),$(dir)/ospm_$(dir).o)
 
diff -urN linux/drivers/acpi/ospm/toshiba/Makefile linux-patched/drivers/acpi/ospm/toshiba/Makefile
--- linux/drivers/acpi/ospm/toshiba/Makefile	Thu Jan  1 09:00:00 1970
+++ linux-patched/drivers/acpi/ospm/toshiba/Makefile	Mon Jan 28 12:50:38 2002
@@ -0,0 +1,6 @@
+O_TARGET	:= ospm_$(notdir $(CURDIR)).o
+obj-m		:= $(O_TARGET)
+EXTRA_CFLAGS	+= $(ACPI_CFLAGS)
+obj-y		:= $(patsubst %.c,%.o,$(wildcard *.c))
+
+include $(TOPDIR)/Rules.make
diff -urN linux/drivers/acpi/ospm/toshiba/toshiba_acpi.c linux-patched/drivers/acpi/ospm/toshiba/toshiba_acpi.c
--- linux/drivers/acpi/ospm/toshiba/toshiba_acpi.c	Thu Jan  1 09:00:00 1970
+++ linux-patched/drivers/acpi/ospm/toshiba/toshiba_acpi.c	Mon Jan 28 12:50:38 2002
@@ -0,0 +1,273 @@
+/*
+ *  toshiba_acpi.c - Toshiba Laptop ACPI Extras
+ *
+ *
+ *  Copyright (C) 2002 John Belmonte
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *
+ *  The devolpment page for this driver is located at
+ *  http://memebeam.org/toys/ToshibaAcpiDriver.
+ *
+ *  Credits:
+ *	 Jonathan A. Buzzard - Toshiba HCI info, and critical tips on reverse
+ *		engineering the Windows drivers
+ *
+ *
+ *  TODO
+ *	check for required functionality at init
+ *	add video switch control etc.
+ *	provide version info in proc
+ *	add Fn key status
+ *
+ */
+
+#define TOSHIBA_ACPI_VERSION "0.10"
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/proc_fs.h>
+#include <acpi.h>
+
+MODULE_NAME("toshiba_acpi");
+MODULE_AUTHOR("John Belmonte");
+MODULE_DESCRIPTION("Toshiba Laptop ACPI Extras Driver");
+MODULE_LICENSE("GPL");
+
+/* Toshiba ACPI method paths */
+#define METHOD_LCD_BRIGHTNESS	"\\_SB_.PCI0.VGA_.LCD_._BCM"
+#define METHOD_HCI		"\\_SB_.VALD.GHCI"
+
+/* Toshiba HCI interface definitions
+ *
+ * HCI is Toshiba's "Hardware Control Interface" which is supposed to
+ * be uniform across all their models.  Ideally we would just call
+ * dedicated ACPI methods instead of using this primitive interface.
+ * However the ACPI methods seem to be incomplete in some areas (for
+ * example they allow setting, but not reading, the LCD brightness value),
+ * so this is still useful.
+ */
+
+#define HCI_WORDS			6
+
+/* operations */
+#define HCI_SET				0xff00
+#define HCI_GET				0xfe00
+
+/* return codes */
+#define HCI_SUCCESS			0x0000
+#define HCI_FAILURE			0x1000
+#define HCI_NOT_SUPPORTED		0x8000
+
+/* registers */
+#define HCI_LCD_BRIGHTNESS		0x002a
+
+/* field definitions */
+#define HCI_LCD_BRIGHTNESS_BITS		3
+#define HCI_LCD_BRIGHTNESS_SHIFT	(16-HCI_LCD_BRIGHTNESS_BITS)
+#define HCI_LCD_BRIGHTNESS_LEVELS	(1 << HCI_LCD_BRIGHTNESS_BITS)
+
+/* Perform a raw HCI call.  Here we don't care about input or output buffer
+ * format.
+ */
+static acpi_status
+hci_raw(const u32 in[HCI_WORDS], u32 out[HCI_WORDS])
+{
+	acpi_object_list params;
+	acpi_object in_objs[HCI_WORDS];
+	acpi_buffer results;
+	acpi_object out_objs[HCI_WORDS+1];
+	acpi_status status;
+	int i;
+
+	params.count = HCI_WORDS;
+	params.pointer = in_objs;
+	for (i = 0; i < HCI_WORDS; ++i) {
+		in_objs[i].type = ACPI_TYPE_INTEGER;
+		in_objs[i].integer.value = in[i];
+		/*printk("%04x ", in[i]);*/
+	}
+	/*printk("\n");*/
+
+	results.length = sizeof(out_objs);
+	results.pointer = out_objs;
+
+	status = acpi_evaluate_object(0, METHOD_HCI, &params,
+		&results);
+	if ((status == AE_OK) && (out_objs->package.count <= HCI_WORDS)) {
+		for (i = 0; i < out_objs->package.count; ++i) {
+			out[i] = out_objs->package.elements[i].integer.value;
+			/*printk("%04x ", out[i]);*/
+		}
+		/*printk("\n");*/
+	}
+
+	return status;
+}
+
+/* common hci tasks (get or set one value)
+ *
+ * In addition to the ACPI status, the HCI system returns a result which
+ * may be useful (such as "not supported").
+ */
+
+static acpi_status
+hci_write1(u32 reg, u32 in1, u32* result)
+{
+	u32 in[HCI_WORDS] = { HCI_SET, reg, in1, 0, 0, 0 };
+	u32 out[HCI_WORDS];
+	acpi_status status = hci_raw(in, out);
+	*result = (status == AE_OK) ? out[0] : HCI_FAILURE;
+	return status;
+}
+
+static acpi_status
+hci_read1(u32 reg, u32* out1, u32* result)
+{
+	u32 in[HCI_WORDS] = { HCI_GET, reg, 0, 0, 0, 0 };
+	u32 out[HCI_WORDS];
+	acpi_status status = hci_raw(in, out);
+	*out1 = out[2];
+	*result = (status == AE_OK) ? out[0] : HCI_FAILURE;
+	return status;
+}
+
+#define PROC_ROOT		"toshiba"
+#define PROC_LCD		"lcd"
+
+extern struct proc_dir_entry	*bm_proc_root;
+static struct proc_dir_entry	*local_proc_root = NULL;
+
+static int
+proc_read_lcd(char* page, char** start, off_t off, int count, int* eof,
+	void* context)
+{
+	char* p = page;
+	int len = 0;
+	acpi_status status;
+	u32 hci_result;
+	u32 value;
+
+	if (off != 0) {
+		goto end;
+	}
+
+	status = hci_read1(HCI_LCD_BRIGHTNESS, &value, &hci_result);
+	if (hci_result == HCI_SUCCESS) {
+		value = value >> HCI_LCD_BRIGHTNESS_SHIFT;
+		p += sprintf(p, "brightness:              %d\n", value);
+		p += sprintf(p, "brightness levels:       %d\n",
+			HCI_LCD_BRIGHTNESS_LEVELS);
+	} else {
+		p += sprintf(p, "ERROR\n");
+		goto end;
+	}
+
+end:
+	len = (p - page);
+	if (len <= off+count) *eof = 1;
+	*start = page + off;
+	len -= off;
+	if (len>count) len = count;
+	if (len<0) len = 0;
+
+	return(len);
+}
+
+static int
+proc_write_lcd(struct file* file, const char* buffer, unsigned long count,
+	void* data)
+{
+	int value;
+	/*int byte_count;*/
+	u32 hci_result;
+
+	/* ISSUE: %i doesn't work with hex values as advertised */
+	if (sscanf(buffer, "brightness: %i", &value) == 1 &&
+			value >= 0 && value < HCI_LCD_BRIGHTNESS_LEVELS) {
+		value = value << HCI_LCD_BRIGHTNESS_SHIFT;
+		hci_write1(HCI_LCD_BRIGHTNESS, value, &hci_result);
+		if (hci_result != HCI_SUCCESS)
+			return -EFAULT;
+	}
+	else {
+		return -EINVAL;
+	}
+
+	return (count);
+}
+
+static acpi_status
+add_device(void)
+{
+	struct proc_dir_entry* proc;
+
+	proc = create_proc_read_entry(PROC_LCD, S_IFREG | S_IRUGO | S_IWUSR,
+		local_proc_root, proc_read_lcd, 0);
+	if (proc)
+		proc->write_proc = proc_write_lcd;
+
+	return(AE_OK);
+}
+
+static acpi_status
+remove_device(void)
+{
+	remove_proc_entry(PROC_LCD, local_proc_root);
+	return(AE_OK);
+}
+
+static int __init
+mod_init(void)
+{
+	acpi_status status = AE_OK;
+
+	printk("Toshiba ACPI Extras version %s\n", TOSHIBA_ACPI_VERSION);
+
+	/* abort if no busmgr */
+	if (!bm_proc_root)
+		return -ENODEV;
+
+	local_proc_root = proc_mkdir(PROC_ROOT, bm_proc_root);
+	if (!local_proc_root) {
+		status = AE_ERROR;
+	}
+	else {
+		status = add_device();
+		if (ACPI_FAILURE(status)) {
+			remove_proc_entry(PROC_ROOT, bm_proc_root);
+		}
+	}
+
+	return (ACPI_SUCCESS(status)) ? 0 : -ENODEV;
+}
+
+static void __exit
+mod_cleanup(void)
+{
+	remove_device();
+
+	if (local_proc_root) {
+		remove_proc_entry(PROC_ROOT, bm_proc_root);
+	}
+
+	return;
+}
+
+module_init(mod_init);
+module_exit(mod_cleanup);
