| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: sdmmc_mem.c,v 1.50 2015/12/22 09:56:06 mlelstv Exp $ */ | | 1 | /* $NetBSD: sdmmc_mem.c,v 1.51 2016/03/13 09:12:16 tsutsui Exp $ */ |
2 | /* $OpenBSD: sdmmc_mem.c,v 1.10 2009/01/09 10:55:22 jsg Exp $ */ | | 2 | /* $OpenBSD: sdmmc_mem.c,v 1.10 2009/01/09 10:55:22 jsg Exp $ */ |
3 | | | 3 | |
4 | /* | | 4 | /* |
5 | * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org> | | 5 | * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org> |
6 | * | | 6 | * |
7 | * Permission to use, copy, modify, and distribute this software for any | | 7 | * Permission to use, copy, modify, and distribute this software for any |
8 | * purpose with or without fee is hereby granted, provided that the above | | 8 | * purpose with or without fee is hereby granted, provided that the above |
9 | * copyright notice and this permission notice appear in all copies. | | 9 | * copyright notice and this permission notice appear in all copies. |
10 | * | | 10 | * |
11 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | | 11 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
12 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | | 12 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
13 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | | 13 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
14 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | | 14 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| @@ -35,27 +35,27 @@ | | | @@ -35,27 +35,27 @@ |
35 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | | 35 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
36 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | | 36 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
37 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | | 37 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
38 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | | 38 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
39 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | | 39 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
40 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | | 40 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
41 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | | 41 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
42 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | | 42 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
43 | */ | | 43 | */ |
44 | | | 44 | |
45 | /* Routines for SD/MMC memory cards. */ | | 45 | /* Routines for SD/MMC memory cards. */ |
46 | | | 46 | |
47 | #include <sys/cdefs.h> | | 47 | #include <sys/cdefs.h> |
48 | __KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.50 2015/12/22 09:56:06 mlelstv Exp $"); | | 48 | __KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.51 2016/03/13 09:12:16 tsutsui Exp $"); |
49 | | | 49 | |
50 | #ifdef _KERNEL_OPT | | 50 | #ifdef _KERNEL_OPT |
51 | #include "opt_sdmmc.h" | | 51 | #include "opt_sdmmc.h" |
52 | #endif | | 52 | #endif |
53 | | | 53 | |
54 | #include <sys/param.h> | | 54 | #include <sys/param.h> |
55 | #include <sys/kernel.h> | | 55 | #include <sys/kernel.h> |
56 | #include <sys/malloc.h> | | 56 | #include <sys/malloc.h> |
57 | #include <sys/systm.h> | | 57 | #include <sys/systm.h> |
58 | #include <sys/device.h> | | 58 | #include <sys/device.h> |
59 | #include <sys/bitops.h> | | 59 | #include <sys/bitops.h> |
60 | #include <sys/evcnt.h> | | 60 | #include <sys/evcnt.h> |
61 | | | 61 | |
| @@ -188,35 +188,34 @@ mmc_mode: | | | @@ -188,35 +188,34 @@ mmc_mode: |
188 | goto out; | | 188 | goto out; |
189 | } | | 189 | } |
190 | } | | 190 | } |
191 | | | 191 | |
192 | /* Set the lowest voltage supported by the card and host. */ | | 192 | /* Set the lowest voltage supported by the card and host. */ |
193 | host_ocr = sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch); | | 193 | host_ocr = sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch); |
194 | error = sdmmc_set_bus_power(sc, host_ocr, card_ocr); | | 194 | error = sdmmc_set_bus_power(sc, host_ocr, card_ocr); |
195 | if (error) { | | 195 | if (error) { |
196 | DPRINTF(("%s: couldn't supply voltage requested by card\n", | | 196 | DPRINTF(("%s: couldn't supply voltage requested by card\n", |
197 | SDMMCDEVNAME(sc))); | | 197 | SDMMCDEVNAME(sc))); |
198 | goto out; | | 198 | goto out; |
199 | } | | 199 | } |
200 | | | 200 | |
201 | /* Tell the card(s) to enter the idle state (again). */ | | | |
202 | sdmmc_go_idle_state(sc); | | | |
203 | | | | |
204 | DPRINTF(("%s: host_ocr 0x%08x\n", SDMMCDEVNAME(sc), host_ocr)); | | 201 | DPRINTF(("%s: host_ocr 0x%08x\n", SDMMCDEVNAME(sc), host_ocr)); |
205 | DPRINTF(("%s: card_ocr 0x%08x\n", SDMMCDEVNAME(sc), card_ocr)); | | 202 | DPRINTF(("%s: card_ocr 0x%08x\n", SDMMCDEVNAME(sc), card_ocr)); |
206 | | | 203 | |
207 | host_ocr &= card_ocr; /* only allow the common voltages */ | | 204 | host_ocr &= card_ocr; /* only allow the common voltages */ |
208 | if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { | | 205 | if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { |
209 | if (ISSET(sc->sc_flags, SMF_SD_MODE)) { | | 206 | if (ISSET(sc->sc_flags, SMF_SD_MODE)) { |
| | | 207 | /* Tell the card(s) to enter the idle state (again). */ |
| | | 208 | sdmmc_go_idle_state(sc); |
210 | /* Check SD Ver.2 */ | | 209 | /* Check SD Ver.2 */ |
211 | error = sdmmc_mem_send_if_cond(sc, 0x1aa, &card_ocr); | | 210 | error = sdmmc_mem_send_if_cond(sc, 0x1aa, &card_ocr); |
212 | if (error == 0 && card_ocr == 0x1aa) | | 211 | if (error == 0 && card_ocr == 0x1aa) |
213 | SET(ocr, MMC_OCR_HCS); | | 212 | SET(ocr, MMC_OCR_HCS); |
214 | | | 213 | |
215 | if (sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch) & MMC_OCR_S18A) | | 214 | if (sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch) & MMC_OCR_S18A) |
216 | SET(ocr, MMC_OCR_S18A); | | 215 | SET(ocr, MMC_OCR_S18A); |
217 | } else { | | 216 | } else { |
218 | SET(ocr, MMC_OCR_ACCESS_MODE_SECTOR); | | 217 | SET(ocr, MMC_OCR_ACCESS_MODE_SECTOR); |
219 | } | | 218 | } |
220 | } | | 219 | } |
221 | host_ocr |= ocr; | | 220 | host_ocr |= ocr; |
222 | | | 221 | |