aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorNicolas Pitre <nico@cam.org>2007-07-24 02:09:39 -0400
committerPierre Ossman <drzeus@drzeus.cx>2007-09-23 15:13:08 -0400
commit17b759aff916b4d02721e75ce5ed82b1903e5bd6 (patch)
treeeef4463cbc556e7ae4bd78dba0e6acd861b283c3 /drivers
parent112c9db91ee6bf19eca7cbb6854be3127381c229 (diff)
sdio: add interface for host side SDIO interrupt reporting
Signed-off-by: Nicolas Pitre <npitre@mvista.com> Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/core/host.c3
-rw-r--r--drivers/mmc/core/sdio_irq.c8
2 files changed, 10 insertions, 1 deletions
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
index 2c7ce8f43a9a..37b761891d67 100644
--- a/drivers/mmc/core/host.c
+++ b/drivers/mmc/core/host.c
@@ -100,6 +100,9 @@ int mmc_add_host(struct mmc_host *host)
100{ 100{
101 int err; 101 int err;
102 102
103 WARN_ON((host->caps & MMC_CAP_SDIO_IRQ) &&
104 !host->ops->enable_sdio_irq);
105
103 if (!idr_pre_get(&mmc_host_idr, GFP_KERNEL)) 106 if (!idr_pre_get(&mmc_host_idr, GFP_KERNEL))
104 return -ENOMEM; 107 return -ENOMEM;
105 108
diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c
index 01922d29241d..01daee934d16 100644
--- a/drivers/mmc/core/sdio_irq.c
+++ b/drivers/mmc/core/sdio_irq.c
@@ -70,7 +70,8 @@ static int sdio_irq_thread(void *_host)
70 * asynchronous notification of pending SDIO card interrupts 70 * asynchronous notification of pending SDIO card interrupts
71 * hence we poll for them in that case. 71 * hence we poll for them in that case.
72 */ 72 */
73 period = msecs_to_jiffies(10); 73 period = (host->caps & MMC_CAP_SDIO_IRQ) ?
74 MAX_SCHEDULE_TIMEOUT : msecs_to_jiffies(10);
74 75
75 pr_debug("%s: IRQ thread started (poll period = %lu jiffies)\n", 76 pr_debug("%s: IRQ thread started (poll period = %lu jiffies)\n",
76 mmc_hostname(host), period); 77 mmc_hostname(host), period);
@@ -104,11 +105,16 @@ static int sdio_irq_thread(void *_host)
104 ssleep(1); 105 ssleep(1);
105 106
106 set_task_state(current, TASK_INTERRUPTIBLE); 107 set_task_state(current, TASK_INTERRUPTIBLE);
108 if (host->caps & MMC_CAP_SDIO_IRQ)
109 host->ops->enable_sdio_irq(host, 1);
107 if (!kthread_should_stop()) 110 if (!kthread_should_stop())
108 schedule_timeout(period); 111 schedule_timeout(period);
109 set_task_state(current, TASK_RUNNING); 112 set_task_state(current, TASK_RUNNING);
110 } while (!kthread_should_stop()); 113 } while (!kthread_should_stop());
111 114
115 if (host->caps & MMC_CAP_SDIO_IRQ)
116 host->ops->enable_sdio_irq(host, 0);
117
112 pr_debug("%s: IRQ thread exiting with code %d\n", 118 pr_debug("%s: IRQ thread exiting with code %d\n",
113 mmc_hostname(host), ret); 119 mmc_hostname(host), ret);
114 120