Code drop from //branches/cupcake/...@124589
diff --git a/led/Android.mk b/led/Android.mk
index 3ecaff8..2b6ac0b 100644
--- a/led/Android.mk
+++ b/led/Android.mk
@@ -1,12 +1,15 @@
 # Copyright 2006 The Android Open Source Project
 
-ifeq ($(TARGET_PRODUCT),sooner)
+ifeq ($(TARGET_DEVICE),sooner)
 LOCAL_SRC_FILES += led/led_sardine.c
-else
-ifeq ($(TARGET_PRODUCT),dream)
+LOCAL_CFLAGS    += -DCONFIG_LED_SARDINE
+endif
+ifeq ($(TARGET_DEVICE),dream)
 LOCAL_SRC_FILES += led/led_trout.c
-else
+LOCAL_CFLAGS    += -DCONFIG_LED_TROUT
+endif
+ifeq ($(QEMU_HARDWARE),true)
+LOCAL_CFLAGS    += -DCONFIG_LED_QEMU
+endif
 LOCAL_SRC_FILES += led/led_stub.c
-endif
-endif
 
diff --git a/led/led_qemu.c b/led/led_qemu.c
new file mode 100644
index 0000000..c98402b
--- /dev/null
+++ b/led/led_qemu.c
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "qemu.h"
+
+int
+qemu_set_led_state(unsigned color, int on, int off)
+{
+    qemu_control_command( "set_led_state:%08x:%d:%d", color, on, off );
+    return 0;
+}
diff --git a/led/led_sardine.c b/led/led_sardine.c
index a53729f..a5e6fad 100644
--- a/led/led_sardine.c
+++ b/led/led_sardine.c
@@ -1,3 +1,18 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 #include <hardware/led.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -27,7 +42,7 @@
     return amt >= 0 ? 0 : errno;
 }
 
-int set_led_state(unsigned colorARGB, int onMS, int offMS)
+int sardine_set_led_state(unsigned colorARGB, int onMS, int offMS)
 {
     int len;
     char buf[30];
diff --git a/led/led_stub.c b/led/led_stub.c
index 644efe3..1deac2f 100644
--- a/led/led_stub.c
+++ b/led/led_stub.c
@@ -1,7 +1,51 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 #include <hardware/led.h>
 
+typedef int  (*LedFunc)(unsigned, int, int);
+
+#ifdef CONFIG_LED_SARDINE
+extern int  sardine_set_led_state(unsigned, int, int);
+#  define HW_LED_FUNC  sardine_set_led_state
+#endif
+
+#ifdef CONFIG_LED_TROUT
+extern int  trout_set_led_state(unsigned, int, int);
+#  define HW_LED_FUNC  trout_set_led_state
+#endif
+
+#ifdef CONFIG_LED_QEMU
+#include "qemu.h"
+static int
+qemu_set_led_state(unsigned color, int on, int off)
+{
+    qemu_control_command( "set_led_state:%08x:%d:%d", color, on, off );
+    return 0;
+}
+#endif
+
 int
 set_led_state(unsigned color, int on, int off)
 {
+#ifdef CONFIG_LED_QEMU
+    QEMU_FALLBACK(set_led_state(color,on,off));
+#endif
+#ifdef HW_LED_FUNC
+    return HW_LED_FUNC(color, on, off);
+#else
     return 0;
+#endif
 }
diff --git a/led/led_trout.c b/led/led_trout.c
index 847b6bc..99d6bb0 100644
--- a/led/led_trout.c
+++ b/led/led_trout.c
@@ -1,3 +1,18 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 #include <hardware/led.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -38,7 +53,7 @@
     return amt >= 0 ? 0 : errno;
 }
 
-int set_led_state(unsigned colorARGB, int onMS, int offMS)
+int trout_set_led_state(unsigned colorARGB, int onMS, int offMS)
 {
     int len;
     char buf[30];