I've always wanted to control my XE4500's "audio mute" LED and misuse it 
as an e-mail indicator :) Having spent quite some time figuring out how 
HP's Windows OneTouch utility switches on and off the LED and studying 
the omnibook kernel module source code, I've found it's quite easy to 
switch the LED on and off. It works just like enabling/disabling the 
OneTouch buttons. I've put together a dirty patch to create a new proc 
entry /proc/omnibook/muteled, to which you can echo "1" or "0" to switch 
the LED on and off.

Patch ticket: http://sourceforge.net/tracker/index.php?func=detail&aid=1488524&group_id=48623&atid=453670

This patch has been incorporated into a fork of the omnibook kernel module: 

http://svn.sourceforge.net/viewvc/omnibook/omnibook/trunk/muteled.c?revision=HEAD&view=markup

diff -ru omnibook-20060126/doc/ChangeLog omnibook-20060126_with-muteled/doc/ChangeLog
--- omnibook-20060126/doc/ChangeLog	2006-05-15 01:05:19.000000000 +0200
+++ omnibook-20060126_with-muteled/doc/ChangeLog	2006-05-15 01:05:27.000000000 +0200
@@ -1,6 +1,9 @@
 Changelog file for omnibook package:
 ------------------------------------
 
+2006-05-15 Thomas Perl <thp@perli.net>
+* Added support for xe4500's "audio mute" led
+
 2006-01-26 Soós Péter <sp@osb.hu>
 * Added support for kernels >= 2.6.15 (pm_legacy.h)
 * Added Toshiba Satellite M30X
diff -ru omnibook-20060126/doc/README-OneTouch omnibook-20060126_with-muteled/doc/README-OneTouch
--- omnibook-20060126/doc/README-OneTouch	2006-01-25 18:36:10.000000000 +0100
+++ omnibook-20060126_with-muteled/doc/README-OneTouch	2006-05-15 01:08:47.000000000 +0200
@@ -188,3 +188,16 @@
 
 The volume control buttons on the docking station of OB500 are real OneTouch
 buttons (see above).
+
+
+hp's onetouch windows utility
+-----------------------------
+
+When installing hp's onetouch utility in Windows, you can find a ONETOUCH.CFG 
+file in the installation folder which seems to contain EC Controller commands 
+for some special features of the embedded controller (like mute led, etc..).
+
+It looks like the Windows DLL that sends commands to the EC controller is 
+LgKCUtl.DLL, also found in the onetouch installation folder. Maybe this is 
+useful to somebody someday :)
+
diff -ru omnibook-20060126/ec.h omnibook-20060126_with-muteled/ec.h
--- omnibook-20060126/ec.h	2004-01-14 20:16:09.000000000 +0100
+++ omnibook-20060126_with-muteled/ec.h	2006-05-15 00:42:10.000000000 +0200
@@ -268,6 +268,8 @@
 #define OMNIBOOK_KBC_CMD_TOUCHPAD_DISABLE	0xA9	/* Disables toucpad */
 #define OMNIBOOK_KBC_CMD_LCD_ON			0xE1	/* Turns LCD display on */
 #define OMNIBOOK_KBC_CMD_LCD_OFF		0xE2	/* Turns LCD display off */
+#define OMNIBOOK_KBC_CMD_MUTELED_ON     	0x94	/* Turns (xe4500) Mute LED on */
+#define OMNIBOOK_KBC_CMD_MUTELED_OFF    	0x95	/* Turns (xe4500) Mute LED off */
 #define OMNIBOOK_KBC_CMD_AC_POWER_ENABLE	0xC2	/* Enable AC power */
 #define OMNIBOOK_KBC_CMD_AC_POWER_DISABLE	0xC1	/* Disable AC power */
 
diff -ru omnibook-20060126/onetouch.c omnibook-20060126_with-muteled/onetouch.c
--- omnibook-20060126/onetouch.c	2006-01-25 18:46:45.000000000 +0100
+++ omnibook-20060126_with-muteled/onetouch.c	2006-05-15 00:58:44.000000000 +0200
@@ -45,10 +45,14 @@
 static pm_callback pm_onetouch_callback = NULL;
 
 static struct proc_dir_entry *proc_onetouch;
+static struct proc_dir_entry *proc_muteled;
 
 /* There is no information about reading OneTouch status */
 int omnibook_onetouch_enabled = 0;
 
+/* Same for the MUTE LED */
+int omnibook_muteled_enabled = 0;
+
 static int omnibook_onetouch_on(void)
 {
 	if (omnibook_kbc_command(OMNIBOOK_KBC_CONTROL_CMD, OMNIBOOK_KBC_CMD_ONETOUCH_ENABLE)) {
@@ -67,6 +71,40 @@
 	return 0;
 }
 
+static int omnibook_muteled_on(void)
+{
+	if (omnibook_kbc_command(OMNIBOOK_KBC_CONTROL_CMD, OMNIBOOK_KBC_CMD_MUTELED_ON)) {
+		printk(KERN_ERR "%s: failed muteled on command.\n", OMNIBOOK_MODULE_NAME);
+		return -EIO;
+	}
+        omnibook_muteled_enabled = 1;
+	return 0;
+}
+
+static int omnibook_muteled_off(void)
+{
+	if (omnibook_kbc_command(OMNIBOOK_KBC_CONTROL_CMD, OMNIBOOK_KBC_CMD_MUTELED_OFF)) {
+		printk(KERN_ERR "%s: failed muteled off command.\n", OMNIBOOK_MODULE_NAME);
+		return -EIO;
+	}
+        omnibook_muteled_enabled = 0;
+	return 0;
+}
+
+
+int omnibook_muteled_disable(void)
+{
+        omnibook_muteled_off();
+        return 0;
+}
+
+int omnibook_muteled_enable(void)
+{
+        omnibook_muteled_on();
+        return 0;
+}
+
+
 /*
  * Power management handler: on resume it reenables the OneTouch buttons it they were enabled previously
  */
@@ -167,6 +205,15 @@
 	return omnibook_proc_len(buffer, start, off, count, eof, b);
 }
 
+static int omnibook_muteled_status(char *buffer, char **start, off_t off, int count, int *eof, void *data)
+{
+	char *b = buffer;
+
+	b += sprintf(b, "The mute LED is %s\n", (omnibook_muteled_enabled) ? "on" : "off");
+
+	return omnibook_proc_len(buffer, start, off, count, eof, b);
+}
+
 static int omnibook_onetouch_set(struct file *file, const char *buffer, unsigned long count, void *data)
 {
 	char status[1] = {'\0'};
@@ -186,6 +233,25 @@
 	return count;
 }
 
+static int omnibook_muteled_set(struct file *file, const char *buffer, unsigned long count, void *data)
+{
+	char status[1] = {'\0'};
+
+	if (copy_from_user(status, buffer, 1))
+		return -EFAULT;
+	switch (*status) {
+	case '0':
+		omnibook_muteled_disable();
+		break;
+	case '1':
+		omnibook_muteled_enable();
+		break;
+	default:
+		count = -EINVAL;
+	}
+	return count;
+}
+
 int __init omnibook_onetouch_init(void)
 {
 #ifdef CONFIG_VT
@@ -207,6 +273,7 @@
 		if (omnibook_userset)
 			pmode = pmode | S_IWUGO;
 		proc_onetouch = create_proc_entry("onetouch", pmode, omnibook_proc_root);
+                proc_muteled = create_proc_entry("muteled", pmode, omnibook_proc_root);
 		break;
 	default:
 		printk(KERN_INFO "%s: OneTouch button handling is unsupported on this machine.\n", OMNIBOOK_MODULE_NAME);
@@ -220,6 +287,13 @@
 		printk(KERN_ERR "%s: Unable to create /proc/%s/onetouch.\n", OMNIBOOK_MODULE_NAME, OMNIBOOK_MODULE_NAME);
 		return -ENOENT;
 	}
+        if (proc_muteled) {
+		proc_muteled->read_proc = omnibook_muteled_status;
+		proc_muteled->write_proc = omnibook_muteled_set;
+        } else {
+		printk(KERN_ERR "%s: Unable to create /proc/%s/muteled.\n", OMNIBOOK_MODULE_NAME, OMNIBOOK_MODULE_NAME);
+		return -ENOENT;
+        }
 	if ((retval = omnibook_onetouch_register()))
 		return retval;
 	if ((retval = omnibook_onetouch_enable()))
@@ -238,15 +312,21 @@
 #ifdef CONFIG_VT
 	if (proc_onetouch)
 		remove_proc_entry("onetouch", omnibook_proc_root);
+        if (proc_muteled)
+                remove_proc_entry("muteled", omnibook_proc_root);
 	if (pm_onetouch)
 		omnibook_onetouch_unregister();
 	
 	omnibook_onetouch_disable();
+        omnibook_muteled_disable();
 #endif
 }
 
 EXPORT_SYMBOL(omnibook_onetouch_enabled);
 EXPORT_SYMBOL(omnibook_onetouch_enable);
 EXPORT_SYMBOL(omnibook_onetouch_disable);
+EXPORT_SYMBOL(omnibook_muteled_enabled);
+EXPORT_SYMBOL(omnibook_muteled_enable);
+EXPORT_SYMBOL(omnibook_muteled_disable);
 
 /* End of file */
