Commit 2f730fec authored by Pierre Ossman's avatar Pierre Ossman

sdhci: allow led to be controlled freely

Hook up the controller LED to the LED subsystem, allowing more flexible
control than simply indicating an ongoing request.
Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent b69c9058
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/leds.h>
#include <linux/mmc/host.h> #include <linux/mmc/host.h>
#include "sdhci.h" #include "sdhci.h"
...@@ -252,6 +254,24 @@ static void sdhci_deactivate_led(struct sdhci_host *host) ...@@ -252,6 +254,24 @@ static void sdhci_deactivate_led(struct sdhci_host *host)
writeb(ctrl, host->ioaddr + SDHCI_HOST_CONTROL); writeb(ctrl, host->ioaddr + SDHCI_HOST_CONTROL);
} }
#ifdef CONFIG_LEDS_CLASS
static void sdhci_led_control(struct led_classdev *led,
enum led_brightness brightness)
{
struct sdhci_host *host = container_of(led, struct sdhci_host, led);
unsigned long flags;
spin_lock_irqsave(&host->lock, flags);
if (brightness == LED_OFF)
sdhci_deactivate_led(host);
else
sdhci_activate_led(host);
spin_unlock_irqrestore(&host->lock, flags);
}
#endif
/*****************************************************************************\ /*****************************************************************************\
* * * *
* Core functions * * Core functions *
...@@ -769,7 +789,9 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) ...@@ -769,7 +789,9 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
WARN_ON(host->mrq != NULL); WARN_ON(host->mrq != NULL);
#ifndef CONFIG_LEDS_CLASS
sdhci_activate_led(host); sdhci_activate_led(host);
#endif
host->mrq = mrq; host->mrq = mrq;
...@@ -961,7 +983,9 @@ static void sdhci_tasklet_finish(unsigned long param) ...@@ -961,7 +983,9 @@ static void sdhci_tasklet_finish(unsigned long param)
host->cmd = NULL; host->cmd = NULL;
host->data = NULL; host->data = NULL;
#ifndef CONFIG_LEDS_CLASS
sdhci_deactivate_led(host); sdhci_deactivate_led(host);
#endif
mmiowb(); mmiowb();
spin_unlock_irqrestore(&host->lock, flags); spin_unlock_irqrestore(&host->lock, flags);
...@@ -1485,6 +1509,17 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot) ...@@ -1485,6 +1509,17 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
sdhci_dumpregs(host); sdhci_dumpregs(host);
#endif #endif
#ifdef CONFIG_LEDS_CLASS
host->led.name = mmc_hostname(mmc);
host->led.brightness = LED_OFF;
host->led.default_trigger = mmc_hostname(mmc);
host->led.brightness_set = sdhci_led_control;
ret = led_classdev_register(&pdev->dev, &host->led);
if (ret)
goto reset;
#endif
mmiowb(); mmiowb();
mmc_add_host(mmc); mmc_add_host(mmc);
...@@ -1495,6 +1530,11 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot) ...@@ -1495,6 +1530,11 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
return 0; return 0;
#ifdef CONFIG_LEDS_CLASS
reset:
sdhci_reset(host, SDHCI_RESET_ALL);
free_irq(host->irq, host);
#endif
untasklet: untasklet:
tasklet_kill(&host->card_tasklet); tasklet_kill(&host->card_tasklet);
tasklet_kill(&host->finish_tasklet); tasklet_kill(&host->finish_tasklet);
...@@ -1522,6 +1562,10 @@ static void sdhci_remove_slot(struct pci_dev *pdev, int slot) ...@@ -1522,6 +1562,10 @@ static void sdhci_remove_slot(struct pci_dev *pdev, int slot)
mmc_remove_host(mmc); mmc_remove_host(mmc);
#ifdef CONFIG_LEDS_CLASS
led_classdev_unregister(&host->led);
#endif
sdhci_reset(host, SDHCI_RESET_ALL); sdhci_reset(host, SDHCI_RESET_ALL);
free_irq(host->irq, host); free_irq(host->irq, host);
......
...@@ -168,6 +168,10 @@ struct sdhci_host { ...@@ -168,6 +168,10 @@ struct sdhci_host {
struct sdhci_chip *chip; struct sdhci_chip *chip;
struct mmc_host *mmc; /* MMC structure */ struct mmc_host *mmc; /* MMC structure */
#ifdef CONFIG_LEDS_CLASS
struct led_classdev led; /* LED control */
#endif
spinlock_t lock; /* Mutex */ spinlock_t lock; /* Mutex */
int flags; /* Host attributes */ int flags; /* Host attributes */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment