mmc: add led trigger
authorPierre Ossman <drzeus@drzeus.cx>
Mon, 24 Sep 2007 05:15:48 +0000 (07:15 +0200)
committerPierre Ossman <drzeus@drzeus.cx>
Mon, 24 Sep 2007 05:15:48 +0000 (07:15 +0200)
Add a led trigger for each host controller that indicates if there
is a request active on the controller.

Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
drivers/mmc/core/core.c
drivers/mmc/core/host.c
include/linux/mmc/host.h

index bad39442f8fe68519873a44869d2d2cec0ddea82..09435e0ec6806fa4771fb616227413bbc5c2dd33 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/delay.h>
 #include <linux/pagemap.h>
 #include <linux/err.h>
+#include <linux/leds.h>
 #include <asm/scatterlist.h>
 #include <linux/scatterlist.h>
 
@@ -92,6 +93,8 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq)
                cmd->error = 0;
                host->ops->request(host, mrq);
        } else {
+               led_trigger_event(host->led, LED_OFF);
+
                pr_debug("%s: req done (CMD%u): %d: %08x %08x %08x %08x\n",
                        mmc_hostname(host), cmd->opcode, err,
                        cmd->resp[0], cmd->resp[1],
@@ -146,6 +149,8 @@ mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
 
        WARN_ON(!host->claimed);
 
+       led_trigger_event(host->led, LED_FULL);
+
        mrq->cmd->error = 0;
        mrq->cmd->mrq = mrq;
        if (mrq->data) {
index 37b761891d67577fc3f9f327f43603e785d496b3..64fbc9759a30757426de0270b0afa25d5c31ea94 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/err.h>
 #include <linux/idr.h>
 #include <linux/pagemap.h>
+#include <linux/leds.h>
 
 #include <linux/mmc/host.h>
 
@@ -115,6 +116,8 @@ int mmc_add_host(struct mmc_host *host)
        snprintf(host->class_dev.bus_id, BUS_ID_SIZE,
                 "mmc%d", host->index);
 
+       led_trigger_register_simple(host->class_dev.bus_id, &host->led);
+
        err = device_add(&host->class_dev);
        if (err)
                return err;
@@ -140,6 +143,8 @@ void mmc_remove_host(struct mmc_host *host)
 
        device_del(&host->class_dev);
 
+       led_trigger_unregister(host->led);
+
        spin_lock(&mmc_host_lock);
        idr_remove(&mmc_host_idr, host->index);
        spin_unlock(&mmc_host_lock);
index 76eef94782f8a8f0586c3b9430597c4360070743..125eee1407ff1c5ee34d2cce2984d0a6fc14c5f0 100644 (file)
@@ -10,6 +10,8 @@
 #ifndef LINUX_MMC_HOST_H
 #define LINUX_MMC_HOST_H
 
+#include <linux/leds.h>
+
 #include <linux/mmc/core.h>
 
 struct mmc_ios {
@@ -133,6 +135,10 @@ struct mmc_host {
        struct task_struct      *sdio_irq_thread;
        atomic_t                sdio_irq_thread_abort;
 
+#ifdef CONFIG_LEDS_TRIGGERS
+       struct led_trigger      *led;           /* activity led */
+#endif
+
        unsigned long           private[0] ____cacheline_aligned;
 };