|
6 | 6 | * Copyright (c) 2010, ST-Ericsson
|
7 | 7 | */
|
8 | 8 | #include <linux/module.h>
|
| 9 | +#include <linux/mmc/sdio.h> |
9 | 10 | #include <linux/mmc/sdio_func.h>
|
10 | 11 | #include <linux/mmc/card.h>
|
11 | 12 | #include <linux/interrupt.h>
|
12 | 13 | #include <linux/of_irq.h>
|
| 14 | +#include <linux/irq.h> |
13 | 15 |
|
14 | 16 | #include "bus.h"
|
15 | 17 | #include "wfx.h"
|
@@ -106,31 +108,41 @@ static irqreturn_t wfx_sdio_irq_handler_ext(int irq, void *priv)
|
106 | 108 |
|
107 | 109 | static int wfx_sdio_irq_subscribe(struct wfx_sdio_priv *bus)
|
108 | 110 | {
|
| 111 | + u32 flags; |
109 | 112 | int ret;
|
| 113 | + u8 cccr; |
110 | 114 |
|
111 |
| - if (bus->of_irq) { |
112 |
| - ret = request_irq(bus->of_irq, wfx_sdio_irq_handler_ext, |
113 |
| - IRQF_TRIGGER_RISING, "wfx", bus); |
114 |
| - } else { |
| 115 | + if (!bus->of_irq) { |
115 | 116 | sdio_claim_host(bus->func);
|
116 | 117 | ret = sdio_claim_irq(bus->func, wfx_sdio_irq_handler);
|
117 | 118 | sdio_release_host(bus->func);
|
| 119 | + return ret; |
118 | 120 | }
|
119 |
| - return ret; |
| 121 | + |
| 122 | + sdio_claim_host(bus->func); |
| 123 | + cccr = sdio_f0_readb(bus->func, SDIO_CCCR_IENx, NULL); |
| 124 | + cccr |= BIT(0); |
| 125 | + cccr |= BIT(bus->func->num); |
| 126 | + sdio_f0_writeb(bus->func, cccr, SDIO_CCCR_IENx, NULL); |
| 127 | + sdio_release_host(bus->func); |
| 128 | + flags = irq_get_trigger_type(bus->of_irq); |
| 129 | + if (!flags) |
| 130 | + flags = IRQF_TRIGGER_HIGH; |
| 131 | + flags |= IRQF_ONESHOT; |
| 132 | + return devm_request_threaded_irq(&bus->func->dev, bus->of_irq, NULL, |
| 133 | + wfx_sdio_irq_handler_ext, flags, |
| 134 | + "wfx", bus); |
120 | 135 | }
|
121 | 136 |
|
122 | 137 | static int wfx_sdio_irq_unsubscribe(struct wfx_sdio_priv *bus)
|
123 | 138 | {
|
124 | 139 | int ret;
|
125 | 140 |
|
126 |
| - if (bus->of_irq) { |
127 |
| - free_irq(bus->of_irq, bus); |
128 |
| - ret = 0; |
129 |
| - } else { |
130 |
| - sdio_claim_host(bus->func); |
131 |
| - ret = sdio_release_irq(bus->func); |
132 |
| - sdio_release_host(bus->func); |
133 |
| - } |
| 141 | + if (bus->of_irq) |
| 142 | + devm_free_irq(&bus->func->dev, bus->of_irq, bus); |
| 143 | + sdio_claim_host(bus->func); |
| 144 | + ret = sdio_release_irq(bus->func); |
| 145 | + sdio_release_host(bus->func); |
134 | 146 | return ret;
|
135 | 147 | }
|
136 | 148 |
|
|
0 commit comments