]>
Commit | Line | Data |
---|---|---|
6c840dcf GKH |
1 | From 8a64c0f6b7ec7f758c4ef445e49f479e27fa2236 Mon Sep 17 00:00:00 2001 |
2 | From: Daniel Mack <daniel@caiaq.de> | |
3 | Date: Tue, 6 Apr 2010 10:52:44 +0200 | |
4 | Subject: libertas/sdio: 8686: set ECSI bit for 1-bit transfers | |
5 | ||
6 | From: Daniel Mack <daniel@caiaq.de> | |
7 | ||
8 | commit 8a64c0f6b7ec7f758c4ef445e49f479e27fa2236 upstream. | |
9 | ||
10 | When operating in 1-bit mode, SDAT1 is used as dedicated interrupt line. | |
11 | However, the 8686 will only drive this line when the ECSI bit is set in | |
12 | the CCCR_IF register. | |
13 | ||
14 | Thanks to Alagu Sankar for pointing me in the right direction. | |
15 | ||
16 | Signed-off-by: Daniel Mack <daniel@caiaq.de> | |
17 | Cc: Alagu Sankar <alagusankar@embwise.com> | |
18 | Cc: Volker Ernst <volker.ernst@txtr.com> | |
19 | Cc: Dan Williams <dcbw@redhat.com> | |
20 | Cc: John W. Linville <linville@tuxdriver.com> | |
21 | Cc: Holger Schurig <hs4233@mail.mn-solutions.de> | |
22 | Cc: Bing Zhao <bzhao@marvell.com> | |
23 | Cc: libertas-dev@lists.infradead.org | |
24 | Cc: linux-wireless@vger.kernel.org | |
25 | Cc: linux-mmc@vger.kernel.org | |
26 | Acked-by: Dan Williams <dcbw@redhat.com> | |
27 | Signed-off-by: John W. Linville <linville@tuxdriver.com> | |
28 | Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> | |
29 | ||
30 | --- | |
31 | drivers/net/wireless/libertas/if_sdio.c | 22 ++++++++++++++++++++++ | |
32 | include/linux/mmc/sdio.h | 2 ++ | |
33 | 2 files changed, 24 insertions(+) | |
34 | ||
35 | --- a/drivers/net/wireless/libertas/if_sdio.c | |
36 | +++ b/drivers/net/wireless/libertas/if_sdio.c | |
37 | @@ -34,6 +34,8 @@ | |
38 | #include <linux/mmc/card.h> | |
39 | #include <linux/mmc/sdio_func.h> | |
40 | #include <linux/mmc/sdio_ids.h> | |
41 | +#include <linux/mmc/sdio.h> | |
42 | +#include <linux/mmc/host.h> | |
43 | ||
44 | #include "host.h" | |
45 | #include "decl.h" | |
46 | @@ -883,6 +885,7 @@ static int if_sdio_probe(struct sdio_fun | |
47 | int ret, i; | |
48 | unsigned int model; | |
49 | struct if_sdio_packet *packet; | |
50 | + struct mmc_host *host = func->card->host; | |
51 | ||
52 | lbs_deb_enter(LBS_DEB_SDIO); | |
53 | ||
54 | @@ -963,6 +966,25 @@ static int if_sdio_probe(struct sdio_fun | |
55 | if (ret) | |
56 | goto disable; | |
57 | ||
58 | + /* For 1-bit transfers to the 8686 model, we need to enable the | |
59 | + * interrupt flag in the CCCR register. Set the MMC_QUIRK_LENIENT_FN0 | |
60 | + * bit to allow access to non-vendor registers. */ | |
61 | + if ((card->model == IF_SDIO_MODEL_8686) && | |
62 | + (host->caps & MMC_CAP_SDIO_IRQ) && | |
63 | + (host->ios.bus_width == MMC_BUS_WIDTH_1)) { | |
64 | + u8 reg; | |
65 | + | |
66 | + func->card->quirks |= MMC_QUIRK_LENIENT_FN0; | |
67 | + reg = sdio_f0_readb(func, SDIO_CCCR_IF, &ret); | |
68 | + if (ret) | |
69 | + goto release_int; | |
70 | + | |
71 | + reg |= SDIO_BUS_ECSI; | |
72 | + sdio_f0_writeb(func, reg, SDIO_CCCR_IF, &ret); | |
73 | + if (ret) | |
74 | + goto release_int; | |
75 | + } | |
76 | + | |
77 | card->ioport = sdio_readb(func, IF_SDIO_IOPORT, &ret); | |
78 | if (ret) | |
79 | goto release_int; | |
80 | --- a/include/linux/mmc/sdio.h | |
81 | +++ b/include/linux/mmc/sdio.h | |
82 | @@ -94,6 +94,8 @@ | |
83 | ||
84 | #define SDIO_BUS_WIDTH_1BIT 0x00 | |
85 | #define SDIO_BUS_WIDTH_4BIT 0x02 | |
86 | +#define SDIO_BUS_ECSI 0x20 /* Enable continuous SPI interrupt */ | |
87 | +#define SDIO_BUS_SCSI 0x40 /* Support continuous SPI interrupt */ | |
88 | ||
89 | #define SDIO_BUS_CD_DISABLE 0x80 /* disable pull-up on DAT3 (pin 1) */ | |
90 |