Lines Matching full:host

21 #include <linux/mmc/host.h>
30 static int sdio_get_pending_irqs(struct mmc_host *host, u8 *pending) in sdio_get_pending_irqs() argument
32 struct mmc_card *card = host->card; in sdio_get_pending_irqs()
35 WARN_ON(!host->claimed); in sdio_get_pending_irqs()
45 !(host->caps & MMC_CAP_SDIO_IRQ)) { in sdio_get_pending_irqs()
58 static int process_sdio_pending_irqs(struct mmc_host *host) in process_sdio_pending_irqs() argument
60 struct mmc_card *card = host->card; in process_sdio_pending_irqs()
62 bool sdio_irq_pending = host->sdio_irq_pending; in process_sdio_pending_irqs()
71 host->sdio_irq_pending = false; in process_sdio_pending_irqs()
84 ret = sdio_get_pending_irqs(host, &pending); in process_sdio_pending_irqs()
113 static void sdio_run_irqs(struct mmc_host *host) in sdio_run_irqs() argument
115 mmc_claim_host(host); in sdio_run_irqs()
116 if (host->sdio_irqs) { in sdio_run_irqs()
117 process_sdio_pending_irqs(host); in sdio_run_irqs()
118 if (!host->sdio_irq_pending) in sdio_run_irqs()
119 host->ops->ack_sdio_irq(host); in sdio_run_irqs()
121 mmc_release_host(host); in sdio_run_irqs()
126 struct mmc_host *host = in sdio_irq_work() local
129 sdio_run_irqs(host); in sdio_irq_work()
132 void sdio_signal_irq(struct mmc_host *host) in sdio_signal_irq() argument
134 host->sdio_irq_pending = true; in sdio_signal_irq()
135 schedule_work(&host->sdio_irq_work); in sdio_signal_irq()
141 struct mmc_host *host = _host; in sdio_irq_thread() local
149 * aware hosts. One thing that non SDIO host cannot do is in sdio_irq_thread()
154 period = (host->caps & MMC_CAP_SDIO_IRQ) ? in sdio_irq_thread()
158 mmc_hostname(host), period); in sdio_irq_thread()
162 * We claim the host here on drivers behalf for a couple in sdio_irq_thread()
171 * holding of the host lock does not cover too much work in sdio_irq_thread()
174 ret = __mmc_claim_host(host, NULL, in sdio_irq_thread()
175 &host->sdio_irq_thread_abort); in sdio_irq_thread()
178 ret = process_sdio_pending_irqs(host); in sdio_irq_thread()
179 mmc_release_host(host); in sdio_irq_thread()
197 if (!(host->caps & MMC_CAP_SDIO_IRQ)) { in sdio_irq_thread()
208 if (host->caps & MMC_CAP_SDIO_IRQ) in sdio_irq_thread()
209 host->ops->enable_sdio_irq(host, 1); in sdio_irq_thread()
215 if (host->caps & MMC_CAP_SDIO_IRQ) in sdio_irq_thread()
216 host->ops->enable_sdio_irq(host, 0); in sdio_irq_thread()
219 mmc_hostname(host), ret); in sdio_irq_thread()
226 struct mmc_host *host = card->host; in sdio_card_irq_get() local
228 WARN_ON(!host->claimed); in sdio_card_irq_get()
230 if (!host->sdio_irqs++) { in sdio_card_irq_get()
231 if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) { in sdio_card_irq_get()
232 atomic_set(&host->sdio_irq_thread_abort, 0); in sdio_card_irq_get()
233 host->sdio_irq_thread = in sdio_card_irq_get()
234 kthread_run(sdio_irq_thread, host, in sdio_card_irq_get()
235 "ksdioirqd/%s", mmc_hostname(host)); in sdio_card_irq_get()
236 if (IS_ERR(host->sdio_irq_thread)) { in sdio_card_irq_get()
237 int err = PTR_ERR(host->sdio_irq_thread); in sdio_card_irq_get()
238 host->sdio_irqs--; in sdio_card_irq_get()
241 } else if (host->caps & MMC_CAP_SDIO_IRQ) { in sdio_card_irq_get()
242 host->ops->enable_sdio_irq(host, 1); in sdio_card_irq_get()
251 struct mmc_host *host = card->host; in sdio_card_irq_put() local
253 WARN_ON(!host->claimed); in sdio_card_irq_put()
255 if (host->sdio_irqs < 1) in sdio_card_irq_put()
258 if (!--host->sdio_irqs) { in sdio_card_irq_put()
259 if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) { in sdio_card_irq_put()
260 atomic_set(&host->sdio_irq_thread_abort, 1); in sdio_card_irq_put()
261 kthread_stop(host->sdio_irq_thread); in sdio_card_irq_put()
262 } else if (host->caps & MMC_CAP_SDIO_IRQ) { in sdio_card_irq_put()
263 host->ops->enable_sdio_irq(host, 0); in sdio_card_irq_put()
277 if ((card->host->caps & MMC_CAP_SDIO_IRQ) && in sdio_single_irq_set()
278 card->host->sdio_irqs == 1) { in sdio_single_irq_set()
295 * handler will be called when that IRQ is asserted. The host is always