1/*- 2 * Copyright (c) 2006 Bernd Walter. All rights reserved. 3 * Copyright (c) 2006 M. Warner Losh. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * 25 * Portions of this software may have been developed with reference to 26 * the SD Simplified Specification. The following disclaimer may apply: 27 * 28 * The following conditions apply to the release of the simplified 29 * specification ("Simplified Specification") by the SD Card Association and 30 * the SD Group. The Simplified Specification is a subset of the complete SD 31 * Specification which is owned by the SD Card Association and the SD 32 * Group. This Simplified Specification is provided on a non-confidential 33 * basis subject to the disclaimers below. Any implementation of the 34 * Simplified Specification may require a license from the SD Card 35 * Association, SD Group, SD-3C LLC or other third parties. 36 * 37 * Disclaimers: 38 * 39 * The information contained in the Simplified Specification is presented only 40 * as a standard specification for SD Cards and SD Host/Ancillary products and 41 * is provided "AS-IS" without any representations or warranties of any 42 * kind. No responsibility is assumed by the SD Group, SD-3C LLC or the SD 43 * Card Association for any damages, any infringements of patents or other 44 * right of the SD Group, SD-3C LLC, the SD Card Association or any third 45 * parties, which may result from its use. No license is granted by 46 * implication, estoppel or otherwise under any patent or other rights of the 47 * SD Group, SD-3C LLC, the SD Card Association or any third party. Nothing 48 * herein shall be construed as an obligation by the SD Group, the SD-3C LLC 49 * or the SD Card Association to disclose or distribute any technical 50 * information, know-how or other confidential information to any third party. 51 */ 52 53#include <sys/cdefs.h>
| 1/*- 2 * Copyright (c) 2006 Bernd Walter. All rights reserved. 3 * Copyright (c) 2006 M. Warner Losh. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * 25 * Portions of this software may have been developed with reference to 26 * the SD Simplified Specification. The following disclaimer may apply: 27 * 28 * The following conditions apply to the release of the simplified 29 * specification ("Simplified Specification") by the SD Card Association and 30 * the SD Group. The Simplified Specification is a subset of the complete SD 31 * Specification which is owned by the SD Card Association and the SD 32 * Group. This Simplified Specification is provided on a non-confidential 33 * basis subject to the disclaimers below. Any implementation of the 34 * Simplified Specification may require a license from the SD Card 35 * Association, SD Group, SD-3C LLC or other third parties. 36 * 37 * Disclaimers: 38 * 39 * The information contained in the Simplified Specification is presented only 40 * as a standard specification for SD Cards and SD Host/Ancillary products and 41 * is provided "AS-IS" without any representations or warranties of any 42 * kind. No responsibility is assumed by the SD Group, SD-3C LLC or the SD 43 * Card Association for any damages, any infringements of patents or other 44 * right of the SD Group, SD-3C LLC, the SD Card Association or any third 45 * parties, which may result from its use. No license is granted by 46 * implication, estoppel or otherwise under any patent or other rights of the 47 * SD Group, SD-3C LLC, the SD Card Association or any third party. Nothing 48 * herein shall be construed as an obligation by the SD Group, the SD-3C LLC 49 * or the SD Card Association to disclose or distribute any technical 50 * information, know-how or other confidential information to any third party. 51 */ 52 53#include <sys/cdefs.h>
|
54__FBSDID("$FreeBSD: head/sys/dev/mmc/mmc.c 183542 2008-10-02 07:06:59Z imp $");
| 54__FBSDID("$FreeBSD: head/sys/dev/mmc/mmc.c 183704 2008-10-08 17:35:41Z mav $");
|
55 56#include <sys/param.h> 57#include <sys/systm.h> 58#include <sys/kernel.h> 59#include <sys/malloc.h> 60#include <sys/lock.h> 61#include <sys/module.h> 62#include <sys/mutex.h> 63#include <sys/bus.h>
| 55 56#include <sys/param.h> 57#include <sys/systm.h> 58#include <sys/kernel.h> 59#include <sys/malloc.h> 60#include <sys/lock.h> 61#include <sys/module.h> 62#include <sys/mutex.h> 63#include <sys/bus.h>
|
| 64#include <sys/endian.h>
|
64 65#include <dev/mmc/mmcreg.h> 66#include <dev/mmc/mmcbrvar.h> 67#include <dev/mmc/mmcvar.h> 68#include "mmcbr_if.h" 69#include "mmcbus_if.h" 70 71struct mmc_softc { 72 device_t dev; 73 struct mtx sc_mtx; 74 struct intr_config_hook config_intrhook; 75 device_t owner; 76 uint32_t last_rca; 77}; 78 79/* 80 * Per-card data 81 */ 82struct mmc_ivars { 83 uint32_t raw_cid[4]; /* Raw bits of the CID */ 84 uint32_t raw_csd[4]; /* Raw bits of the CSD */
| 65 66#include <dev/mmc/mmcreg.h> 67#include <dev/mmc/mmcbrvar.h> 68#include <dev/mmc/mmcvar.h> 69#include "mmcbr_if.h" 70#include "mmcbus_if.h" 71 72struct mmc_softc { 73 device_t dev; 74 struct mtx sc_mtx; 75 struct intr_config_hook config_intrhook; 76 device_t owner; 77 uint32_t last_rca; 78}; 79 80/* 81 * Per-card data 82 */ 83struct mmc_ivars { 84 uint32_t raw_cid[4]; /* Raw bits of the CID */ 85 uint32_t raw_csd[4]; /* Raw bits of the CSD */
|
| 86 uint32_t raw_scr[2]; /* Raw bits of the SCR */ 87 uint8_t raw_ext_csd[512]; /* Raw bits of the EXT_CSD */
|
85 uint16_t rca; 86 enum mmc_card_mode mode; 87 struct mmc_cid cid; /* cid decoded */ 88 struct mmc_csd csd; /* csd decoded */
| 88 uint16_t rca; 89 enum mmc_card_mode mode; 90 struct mmc_cid cid; /* cid decoded */ 91 struct mmc_csd csd; /* csd decoded */
|
| 92 struct mmc_scr scr; /* scr decoded */
|
89 u_char read_only; /* True when the device is read-only */
| 93 u_char read_only; /* True when the device is read-only */
|
| 94 u_char bus_width; /* Bus width to use */ 95 u_char timing; /* Bus timing support */ 96 u_char high_cap; /* High Capacity card */ 97 uint32_t tran_speed; /* Max speed in normal mode */ 98 uint32_t hs_tran_speed; /* Max speed in high speed mode */
|
90}; 91 92#define CMD_RETRIES 3 93 94/* bus entry points */ 95static int mmc_probe(device_t dev); 96static int mmc_attach(device_t dev); 97static int mmc_detach(device_t dev); 98 99#define MMC_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) 100#define MMC_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) 101#define MMC_LOCK_INIT(_sc) \ 102 mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->dev), \ 103 "mmc", MTX_DEF) 104#define MMC_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx); 105#define MMC_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); 106#define MMC_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); 107 108static void mmc_delayed_attach(void *); 109static void mmc_power_down(struct mmc_softc *sc); 110static int mmc_wait_for_cmd(struct mmc_softc *sc, struct mmc_command *cmd, 111 int retries); 112static int mmc_wait_for_command(struct mmc_softc *sc, uint32_t opcode, 113 uint32_t arg, uint32_t flags, uint32_t *resp, int retries);
| 99}; 100 101#define CMD_RETRIES 3 102 103/* bus entry points */ 104static int mmc_probe(device_t dev); 105static int mmc_attach(device_t dev); 106static int mmc_detach(device_t dev); 107 108#define MMC_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) 109#define MMC_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) 110#define MMC_LOCK_INIT(_sc) \ 111 mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->dev), \ 112 "mmc", MTX_DEF) 113#define MMC_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx); 114#define MMC_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); 115#define MMC_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); 116 117static void mmc_delayed_attach(void *); 118static void mmc_power_down(struct mmc_softc *sc); 119static int mmc_wait_for_cmd(struct mmc_softc *sc, struct mmc_command *cmd, 120 int retries); 121static int mmc_wait_for_command(struct mmc_softc *sc, uint32_t opcode, 122 uint32_t arg, uint32_t flags, uint32_t *resp, int retries);
|
| 123static int mmc_select_card(struct mmc_softc *sc, uint16_t rca); 124static int mmc_set_bus_width(struct mmc_softc *sc, uint16_t rca, int width); 125static int mmc_app_send_scr(struct mmc_softc *sc, uint16_t rca, uint32_t *rawscr); 126static void mmc_app_decode_scr(uint32_t *raw_scr, struct mmc_scr *scr); 127static int mmc_send_ext_csd(struct mmc_softc *sc, uint8_t *rawextcsd);
|
114 115static void 116mmc_ms_delay(int ms) 117{ 118 DELAY(1000 * ms); /* XXX BAD */ 119} 120 121static int 122mmc_probe(device_t dev) 123{ 124 125 device_set_desc(dev, "MMC/SD bus"); 126 return (0); 127} 128 129static int 130mmc_attach(device_t dev) 131{ 132 struct mmc_softc *sc; 133 134 sc = device_get_softc(dev); 135 sc->dev = dev; 136 MMC_LOCK_INIT(sc); 137 138 /* We'll probe and attach our children later, but before / mount */ 139 sc->config_intrhook.ich_func = mmc_delayed_attach; 140 sc->config_intrhook.ich_arg = sc; 141 if (config_intrhook_establish(&sc->config_intrhook) != 0) 142 device_printf(dev, "config_intrhook_establish failed\n"); 143 return (0); 144} 145 146static int 147mmc_detach(device_t dev) 148{ 149 struct mmc_softc *sc = device_get_softc(dev); 150 device_t *kids; 151 int i, nkid; 152 153 /* kill children [ph33r]. -sorbo */ 154 if (device_get_children(sc->dev, &kids, &nkid) != 0) 155 return (0); 156 for (i = 0; i < nkid; i++) { 157 device_t kid = kids[i]; 158 void *ivar = device_get_ivars(kid); 159 160 device_detach(kid); 161 device_delete_child(sc->dev, kid); 162 free(ivar, M_DEVBUF); 163 } 164 free(kids, M_TEMP); 165 mmc_power_down(sc); 166 167 MMC_LOCK_DESTROY(sc); 168 169 return (0); 170} 171 172static int 173mmc_acquire_bus(device_t busdev, device_t dev) 174{ 175 struct mmc_softc *sc;
| 128 129static void 130mmc_ms_delay(int ms) 131{ 132 DELAY(1000 * ms); /* XXX BAD */ 133} 134 135static int 136mmc_probe(device_t dev) 137{ 138 139 device_set_desc(dev, "MMC/SD bus"); 140 return (0); 141} 142 143static int 144mmc_attach(device_t dev) 145{ 146 struct mmc_softc *sc; 147 148 sc = device_get_softc(dev); 149 sc->dev = dev; 150 MMC_LOCK_INIT(sc); 151 152 /* We'll probe and attach our children later, but before / mount */ 153 sc->config_intrhook.ich_func = mmc_delayed_attach; 154 sc->config_intrhook.ich_arg = sc; 155 if (config_intrhook_establish(&sc->config_intrhook) != 0) 156 device_printf(dev, "config_intrhook_establish failed\n"); 157 return (0); 158} 159 160static int 161mmc_detach(device_t dev) 162{ 163 struct mmc_softc *sc = device_get_softc(dev); 164 device_t *kids; 165 int i, nkid; 166 167 /* kill children [ph33r]. -sorbo */ 168 if (device_get_children(sc->dev, &kids, &nkid) != 0) 169 return (0); 170 for (i = 0; i < nkid; i++) { 171 device_t kid = kids[i]; 172 void *ivar = device_get_ivars(kid); 173 174 device_detach(kid); 175 device_delete_child(sc->dev, kid); 176 free(ivar, M_DEVBUF); 177 } 178 free(kids, M_TEMP); 179 mmc_power_down(sc); 180 181 MMC_LOCK_DESTROY(sc); 182 183 return (0); 184} 185 186static int 187mmc_acquire_bus(device_t busdev, device_t dev) 188{ 189 struct mmc_softc *sc;
|
| 190 struct mmc_ivars *ivar;
|
176 int err; 177 int rca; 178 179 err = MMCBR_ACQUIRE_HOST(device_get_parent(busdev), busdev); 180 if (err) 181 return (err); 182 sc = device_get_softc(busdev); 183 MMC_LOCK(sc); 184 if (sc->owner) 185 panic("mmc: host bridge didn't seralize us."); 186 sc->owner = dev; 187 MMC_UNLOCK(sc); 188 189 if (busdev != dev) { 190 /* 191 * Keep track of the last rca that we've selected. If 192 * we're asked to do it again, don't. We never 193 * unselect unless the bus code itself wants the mmc 194 * bus, and constantly reselecting causes problems. 195 */ 196 rca = mmc_get_rca(dev); 197 if (sc->last_rca != rca) {
| 191 int err; 192 int rca; 193 194 err = MMCBR_ACQUIRE_HOST(device_get_parent(busdev), busdev); 195 if (err) 196 return (err); 197 sc = device_get_softc(busdev); 198 MMC_LOCK(sc); 199 if (sc->owner) 200 panic("mmc: host bridge didn't seralize us."); 201 sc->owner = dev; 202 MMC_UNLOCK(sc); 203 204 if (busdev != dev) { 205 /* 206 * Keep track of the last rca that we've selected. If 207 * we're asked to do it again, don't. We never 208 * unselect unless the bus code itself wants the mmc 209 * bus, and constantly reselecting causes problems. 210 */ 211 rca = mmc_get_rca(dev); 212 if (sc->last_rca != rca) {
|
198 mmc_wait_for_command(sc, MMC_SELECT_CARD, rca << 16, 199 MMC_RSP_R1 | MMC_CMD_AC, NULL, CMD_RETRIES);
| 213 mmc_select_card(sc, rca);
|
200 sc->last_rca = rca;
| 214 sc->last_rca = rca;
|
| 215 /* Prepare bus width for the new card. */ 216 ivar = device_get_ivars(dev); 217 device_printf(busdev, 218 "setting bus width to %d bits\n", 219 (ivar->bus_width == bus_width_4)?4: 220 (ivar->bus_width == bus_width_8)?8:1); 221 mmc_set_bus_width(sc, rca, ivar->bus_width); 222 mmcbr_set_bus_width(busdev, ivar->bus_width); 223 mmcbr_update_ios(busdev);
|
201 }
| 224 }
|
202 /* XXX should set bus width here? */
| |
203 } else { 204 /* 205 * If there's a card selected, stand down. 206 */ 207 if (sc->last_rca != 0) {
| 225 } else { 226 /* 227 * If there's a card selected, stand down. 228 */ 229 if (sc->last_rca != 0) {
|
208 mmc_wait_for_command(sc, MMC_SELECT_CARD, 0, 209 MMC_RSP_R1 | MMC_CMD_AC, NULL, CMD_RETRIES);
| 230 mmc_select_card(sc, 0);
|
210 sc->last_rca = 0; 211 }
| 231 sc->last_rca = 0; 232 }
|
212 /* XXX should set bus width here? */
| |
213 } 214 215 return (0); 216} 217 218static int 219mmc_release_bus(device_t busdev, device_t dev) 220{ 221 struct mmc_softc *sc; 222 int err; 223 224 sc = device_get_softc(busdev); 225 226 MMC_LOCK(sc); 227 if (!sc->owner) 228 panic("mmc: releasing unowned bus."); 229 if (sc->owner != dev) 230 panic("mmc: you don't own the bus. game over."); 231 MMC_UNLOCK(sc); 232 err = MMCBR_RELEASE_HOST(device_get_parent(busdev), busdev); 233 if (err) 234 return (err); 235 MMC_LOCK(sc); 236 sc->owner = NULL; 237 MMC_UNLOCK(sc); 238 return (0); 239} 240 241static void 242mmc_rescan_cards(struct mmc_softc *sc) 243{ 244 /* XXX: Look at the children and see if they respond to status */ 245} 246 247static uint32_t 248mmc_select_vdd(struct mmc_softc *sc, uint32_t ocr) 249{ 250 251 return (ocr & MMC_OCR_VOLTAGE); 252} 253 254static int 255mmc_highest_voltage(uint32_t ocr) 256{ 257 int i; 258 259 for (i = 30; i >= 0; i--) 260 if (ocr & (1 << i)) 261 return (i); 262 return (-1); 263} 264 265static void 266mmc_wakeup(struct mmc_request *req) 267{ 268 struct mmc_softc *sc; 269 270/* printf("Wakeup for req %p done_data %p\n", req, req->done_data); */ 271 sc = (struct mmc_softc *)req->done_data; 272 MMC_LOCK(sc); 273 req->flags |= MMC_REQ_DONE; 274 wakeup(req); 275 MMC_UNLOCK(sc); 276} 277 278static int 279mmc_wait_for_req(struct mmc_softc *sc, struct mmc_request *req) 280{ 281 int err; 282 283 req->done = mmc_wakeup; 284 req->done_data = sc; 285/* printf("Submitting request %p sc %p\n", req, sc); */ 286 MMCBR_REQUEST(device_get_parent(sc->dev), sc->dev, req); 287 MMC_LOCK(sc); 288 do { 289 err = msleep(req, &sc->sc_mtx, PZERO | PCATCH, "mmcreq", 290 hz / 10); 291 } while (!(req->flags & MMC_REQ_DONE) && err == EAGAIN); 292/* printf("Request %p done with error %d\n", req, err); */ 293 MMC_UNLOCK(sc); 294 return (err); 295} 296 297static int 298mmc_wait_for_request(device_t brdev, device_t reqdev, struct mmc_request *req) 299{ 300 struct mmc_softc *sc = device_get_softc(brdev); 301 302 return (mmc_wait_for_req(sc, req)); 303} 304 305static int 306mmc_wait_for_cmd(struct mmc_softc *sc, struct mmc_command *cmd, int retries) 307{ 308 struct mmc_request mreq; 309 310 memset(&mreq, 0, sizeof(mreq)); 311 memset(cmd->resp, 0, sizeof(cmd->resp)); 312 cmd->retries = retries; 313 mreq.cmd = cmd; 314/* printf("CMD: %x ARG %x\n", cmd->opcode, cmd->arg); */ 315 mmc_wait_for_req(sc, &mreq); 316 return (cmd->error); 317} 318 319static int 320mmc_wait_for_app_cmd(struct mmc_softc *sc, uint32_t rca, 321 struct mmc_command *cmd, int retries) 322{ 323 struct mmc_command appcmd; 324 int err = MMC_ERR_NONE, i; 325 326 for (i = 0; i <= retries; i++) { 327 appcmd.opcode = MMC_APP_CMD; 328 appcmd.arg = rca << 16; 329 appcmd.flags = MMC_RSP_R1 | MMC_CMD_AC; 330 appcmd.data = NULL; 331 mmc_wait_for_cmd(sc, &appcmd, 0); 332 err = appcmd.error; 333 if (err != MMC_ERR_NONE) 334 continue; 335 if (!(appcmd.resp[0] & R1_APP_CMD)) 336 return MMC_ERR_FAILED; 337 mmc_wait_for_cmd(sc, cmd, 0); 338 err = cmd->error; 339 if (err == MMC_ERR_NONE) 340 break; 341 } 342 return (err); 343} 344 345static int 346mmc_wait_for_command(struct mmc_softc *sc, uint32_t opcode, 347 uint32_t arg, uint32_t flags, uint32_t *resp, int retries) 348{ 349 struct mmc_command cmd; 350 int err; 351 352 memset(&cmd, 0, sizeof(cmd)); 353 cmd.opcode = opcode; 354 cmd.arg = arg; 355 cmd.flags = flags; 356 cmd.data = NULL; 357 err = mmc_wait_for_cmd(sc, &cmd, retries); 358 if (err) 359 return (err); 360 if (cmd.error) 361 return (cmd.error); 362 if (resp) { 363 if (flags & MMC_RSP_136) 364 memcpy(resp, cmd.resp, 4 * sizeof(uint32_t)); 365 else 366 *resp = cmd.resp[0]; 367 } 368 return (0); 369} 370 371static void 372mmc_idle_cards(struct mmc_softc *sc) 373{ 374 device_t dev; 375 struct mmc_command cmd; 376 377 dev = sc->dev; 378 mmcbr_set_chip_select(dev, cs_high); 379 mmcbr_update_ios(dev); 380 mmc_ms_delay(1); 381 382 memset(&cmd, 0, sizeof(cmd)); 383 cmd.opcode = MMC_GO_IDLE_STATE; 384 cmd.arg = 0; 385 cmd.flags = MMC_RSP_NONE | MMC_CMD_BC; 386 cmd.data = NULL; 387 mmc_wait_for_cmd(sc, &cmd, 0); 388 mmc_ms_delay(1); 389 390 mmcbr_set_chip_select(dev, cs_dontcare); 391 mmcbr_update_ios(dev); 392 mmc_ms_delay(1); 393} 394 395static int 396mmc_send_app_op_cond(struct mmc_softc *sc, uint32_t ocr, uint32_t *rocr) 397{ 398 struct mmc_command cmd; 399 int err = MMC_ERR_NONE, i; 400 401 memset(&cmd, 0, sizeof(cmd)); 402 cmd.opcode = ACMD_SD_SEND_OP_COND; 403 cmd.arg = ocr; 404 cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR; 405 cmd.data = NULL; 406 407 for (i = 0; i < 100; i++) { 408 err = mmc_wait_for_app_cmd(sc, 0, &cmd, CMD_RETRIES); 409 if (err != MMC_ERR_NONE) 410 break; 411 if ((cmd.resp[0] & MMC_OCR_CARD_BUSY) || ocr == 0) 412 break; 413 err = MMC_ERR_TIMEOUT; 414 mmc_ms_delay(10); 415 } 416 if (rocr && err == MMC_ERR_NONE) 417 *rocr = cmd.resp[0]; 418 return (err); 419} 420 421static int 422mmc_send_op_cond(struct mmc_softc *sc, uint32_t ocr, uint32_t *rocr) 423{ 424 struct mmc_command cmd; 425 int err = MMC_ERR_NONE, i; 426 427 memset(&cmd, 0, sizeof(cmd)); 428 cmd.opcode = MMC_SEND_OP_COND; 429 cmd.arg = ocr; 430 cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR; 431 cmd.data = NULL; 432 433 for (i = 0; i < 100; i++) { 434 err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES); 435 if (err != MMC_ERR_NONE) 436 break; 437 if ((cmd.resp[0] & MMC_OCR_CARD_BUSY) || ocr == 0) 438 break; 439 err = MMC_ERR_TIMEOUT; 440 mmc_ms_delay(10); 441 } 442 if (rocr && err == MMC_ERR_NONE) 443 *rocr = cmd.resp[0]; 444 return (err); 445} 446
| 233 } 234 235 return (0); 236} 237 238static int 239mmc_release_bus(device_t busdev, device_t dev) 240{ 241 struct mmc_softc *sc; 242 int err; 243 244 sc = device_get_softc(busdev); 245 246 MMC_LOCK(sc); 247 if (!sc->owner) 248 panic("mmc: releasing unowned bus."); 249 if (sc->owner != dev) 250 panic("mmc: you don't own the bus. game over."); 251 MMC_UNLOCK(sc); 252 err = MMCBR_RELEASE_HOST(device_get_parent(busdev), busdev); 253 if (err) 254 return (err); 255 MMC_LOCK(sc); 256 sc->owner = NULL; 257 MMC_UNLOCK(sc); 258 return (0); 259} 260 261static void 262mmc_rescan_cards(struct mmc_softc *sc) 263{ 264 /* XXX: Look at the children and see if they respond to status */ 265} 266 267static uint32_t 268mmc_select_vdd(struct mmc_softc *sc, uint32_t ocr) 269{ 270 271 return (ocr & MMC_OCR_VOLTAGE); 272} 273 274static int 275mmc_highest_voltage(uint32_t ocr) 276{ 277 int i; 278 279 for (i = 30; i >= 0; i--) 280 if (ocr & (1 << i)) 281 return (i); 282 return (-1); 283} 284 285static void 286mmc_wakeup(struct mmc_request *req) 287{ 288 struct mmc_softc *sc; 289 290/* printf("Wakeup for req %p done_data %p\n", req, req->done_data); */ 291 sc = (struct mmc_softc *)req->done_data; 292 MMC_LOCK(sc); 293 req->flags |= MMC_REQ_DONE; 294 wakeup(req); 295 MMC_UNLOCK(sc); 296} 297 298static int 299mmc_wait_for_req(struct mmc_softc *sc, struct mmc_request *req) 300{ 301 int err; 302 303 req->done = mmc_wakeup; 304 req->done_data = sc; 305/* printf("Submitting request %p sc %p\n", req, sc); */ 306 MMCBR_REQUEST(device_get_parent(sc->dev), sc->dev, req); 307 MMC_LOCK(sc); 308 do { 309 err = msleep(req, &sc->sc_mtx, PZERO | PCATCH, "mmcreq", 310 hz / 10); 311 } while (!(req->flags & MMC_REQ_DONE) && err == EAGAIN); 312/* printf("Request %p done with error %d\n", req, err); */ 313 MMC_UNLOCK(sc); 314 return (err); 315} 316 317static int 318mmc_wait_for_request(device_t brdev, device_t reqdev, struct mmc_request *req) 319{ 320 struct mmc_softc *sc = device_get_softc(brdev); 321 322 return (mmc_wait_for_req(sc, req)); 323} 324 325static int 326mmc_wait_for_cmd(struct mmc_softc *sc, struct mmc_command *cmd, int retries) 327{ 328 struct mmc_request mreq; 329 330 memset(&mreq, 0, sizeof(mreq)); 331 memset(cmd->resp, 0, sizeof(cmd->resp)); 332 cmd->retries = retries; 333 mreq.cmd = cmd; 334/* printf("CMD: %x ARG %x\n", cmd->opcode, cmd->arg); */ 335 mmc_wait_for_req(sc, &mreq); 336 return (cmd->error); 337} 338 339static int 340mmc_wait_for_app_cmd(struct mmc_softc *sc, uint32_t rca, 341 struct mmc_command *cmd, int retries) 342{ 343 struct mmc_command appcmd; 344 int err = MMC_ERR_NONE, i; 345 346 for (i = 0; i <= retries; i++) { 347 appcmd.opcode = MMC_APP_CMD; 348 appcmd.arg = rca << 16; 349 appcmd.flags = MMC_RSP_R1 | MMC_CMD_AC; 350 appcmd.data = NULL; 351 mmc_wait_for_cmd(sc, &appcmd, 0); 352 err = appcmd.error; 353 if (err != MMC_ERR_NONE) 354 continue; 355 if (!(appcmd.resp[0] & R1_APP_CMD)) 356 return MMC_ERR_FAILED; 357 mmc_wait_for_cmd(sc, cmd, 0); 358 err = cmd->error; 359 if (err == MMC_ERR_NONE) 360 break; 361 } 362 return (err); 363} 364 365static int 366mmc_wait_for_command(struct mmc_softc *sc, uint32_t opcode, 367 uint32_t arg, uint32_t flags, uint32_t *resp, int retries) 368{ 369 struct mmc_command cmd; 370 int err; 371 372 memset(&cmd, 0, sizeof(cmd)); 373 cmd.opcode = opcode; 374 cmd.arg = arg; 375 cmd.flags = flags; 376 cmd.data = NULL; 377 err = mmc_wait_for_cmd(sc, &cmd, retries); 378 if (err) 379 return (err); 380 if (cmd.error) 381 return (cmd.error); 382 if (resp) { 383 if (flags & MMC_RSP_136) 384 memcpy(resp, cmd.resp, 4 * sizeof(uint32_t)); 385 else 386 *resp = cmd.resp[0]; 387 } 388 return (0); 389} 390 391static void 392mmc_idle_cards(struct mmc_softc *sc) 393{ 394 device_t dev; 395 struct mmc_command cmd; 396 397 dev = sc->dev; 398 mmcbr_set_chip_select(dev, cs_high); 399 mmcbr_update_ios(dev); 400 mmc_ms_delay(1); 401 402 memset(&cmd, 0, sizeof(cmd)); 403 cmd.opcode = MMC_GO_IDLE_STATE; 404 cmd.arg = 0; 405 cmd.flags = MMC_RSP_NONE | MMC_CMD_BC; 406 cmd.data = NULL; 407 mmc_wait_for_cmd(sc, &cmd, 0); 408 mmc_ms_delay(1); 409 410 mmcbr_set_chip_select(dev, cs_dontcare); 411 mmcbr_update_ios(dev); 412 mmc_ms_delay(1); 413} 414 415static int 416mmc_send_app_op_cond(struct mmc_softc *sc, uint32_t ocr, uint32_t *rocr) 417{ 418 struct mmc_command cmd; 419 int err = MMC_ERR_NONE, i; 420 421 memset(&cmd, 0, sizeof(cmd)); 422 cmd.opcode = ACMD_SD_SEND_OP_COND; 423 cmd.arg = ocr; 424 cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR; 425 cmd.data = NULL; 426 427 for (i = 0; i < 100; i++) { 428 err = mmc_wait_for_app_cmd(sc, 0, &cmd, CMD_RETRIES); 429 if (err != MMC_ERR_NONE) 430 break; 431 if ((cmd.resp[0] & MMC_OCR_CARD_BUSY) || ocr == 0) 432 break; 433 err = MMC_ERR_TIMEOUT; 434 mmc_ms_delay(10); 435 } 436 if (rocr && err == MMC_ERR_NONE) 437 *rocr = cmd.resp[0]; 438 return (err); 439} 440 441static int 442mmc_send_op_cond(struct mmc_softc *sc, uint32_t ocr, uint32_t *rocr) 443{ 444 struct mmc_command cmd; 445 int err = MMC_ERR_NONE, i; 446 447 memset(&cmd, 0, sizeof(cmd)); 448 cmd.opcode = MMC_SEND_OP_COND; 449 cmd.arg = ocr; 450 cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR; 451 cmd.data = NULL; 452 453 for (i = 0; i < 100; i++) { 454 err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES); 455 if (err != MMC_ERR_NONE) 456 break; 457 if ((cmd.resp[0] & MMC_OCR_CARD_BUSY) || ocr == 0) 458 break; 459 err = MMC_ERR_TIMEOUT; 460 mmc_ms_delay(10); 461 } 462 if (rocr && err == MMC_ERR_NONE) 463 *rocr = cmd.resp[0]; 464 return (err); 465} 466
|
| 467static int 468mmc_send_if_cond(struct mmc_softc *sc, uint8_t vhs) 469{ 470 struct mmc_command cmd; 471 int err; 472 473 memset(&cmd, 0, sizeof(cmd)); 474 cmd.opcode = SD_SEND_IF_COND; 475 cmd.arg = (vhs << 8) + 0xAA; 476 cmd.flags = MMC_RSP_R7 | MMC_CMD_BCR; 477 cmd.data = NULL; 478 479 err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES); 480 return (err); 481} 482
|
447static void 448mmc_power_up(struct mmc_softc *sc) 449{ 450 device_t dev; 451 452 dev = sc->dev; 453 mmcbr_set_vdd(dev, mmc_highest_voltage(mmcbr_get_host_ocr(dev))); 454 mmcbr_set_bus_mode(dev, opendrain); 455 mmcbr_set_chip_select(dev, cs_dontcare); 456 mmcbr_set_bus_width(dev, bus_width_1); 457 mmcbr_set_power_mode(dev, power_up); 458 mmcbr_set_clock(dev, 0); 459 mmcbr_update_ios(dev); 460 mmc_ms_delay(1); 461 462 mmcbr_set_clock(dev, mmcbr_get_f_min(sc->dev));
| 483static void 484mmc_power_up(struct mmc_softc *sc) 485{ 486 device_t dev; 487 488 dev = sc->dev; 489 mmcbr_set_vdd(dev, mmc_highest_voltage(mmcbr_get_host_ocr(dev))); 490 mmcbr_set_bus_mode(dev, opendrain); 491 mmcbr_set_chip_select(dev, cs_dontcare); 492 mmcbr_set_bus_width(dev, bus_width_1); 493 mmcbr_set_power_mode(dev, power_up); 494 mmcbr_set_clock(dev, 0); 495 mmcbr_update_ios(dev); 496 mmc_ms_delay(1); 497 498 mmcbr_set_clock(dev, mmcbr_get_f_min(sc->dev));
|
| 499 mmcbr_set_timing(dev, bus_timing_normal);
|
463 mmcbr_set_power_mode(dev, power_on); 464 mmcbr_update_ios(dev); 465 mmc_ms_delay(2); 466} 467 468static void 469mmc_power_down(struct mmc_softc *sc) 470{ 471 device_t dev = sc->dev; 472 473 mmcbr_set_bus_mode(dev, opendrain); 474 mmcbr_set_chip_select(dev, cs_dontcare); 475 mmcbr_set_bus_width(dev, bus_width_1); 476 mmcbr_set_power_mode(dev, power_off); 477 mmcbr_set_clock(dev, 0);
| 500 mmcbr_set_power_mode(dev, power_on); 501 mmcbr_update_ios(dev); 502 mmc_ms_delay(2); 503} 504 505static void 506mmc_power_down(struct mmc_softc *sc) 507{ 508 device_t dev = sc->dev; 509 510 mmcbr_set_bus_mode(dev, opendrain); 511 mmcbr_set_chip_select(dev, cs_dontcare); 512 mmcbr_set_bus_width(dev, bus_width_1); 513 mmcbr_set_power_mode(dev, power_off); 514 mmcbr_set_clock(dev, 0);
|
| 515 mmcbr_set_timing(dev, bus_timing_normal);
|
478 mmcbr_update_ios(dev); 479} 480
| 516 mmcbr_update_ios(dev); 517} 518
|
| 519static int 520mmc_select_card(struct mmc_softc *sc, uint16_t rca) 521{ 522 return (mmc_wait_for_command(sc, MMC_SELECT_CARD, ((uint32_t)rca) << 16, 523 MMC_RSP_R1B | MMC_CMD_AC, NULL, CMD_RETRIES)); 524} 525 526static int 527mmc_switch(struct mmc_softc *sc, uint8_t set, uint8_t index, uint8_t value) 528{ 529 struct mmc_command cmd; 530 int err; 531 532 cmd.opcode = MMC_SWITCH_FUNC; 533 cmd.arg = (MMC_SWITCH_FUNC_WR << 24) | 534 (index << 16) | 535 (value << 8) | 536 set; 537 cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; 538 cmd.data = NULL; 539 err = mmc_wait_for_cmd(sc, &cmd, 0); 540 return (err); 541} 542 543static int 544mmc_sd_switch(struct mmc_softc *sc, uint8_t mode, uint8_t grp, uint8_t value, uint8_t *res) 545{ 546 int err; 547 struct mmc_command cmd; 548 struct mmc_data data; 549 550 memset(&cmd, 0, sizeof(struct mmc_command)); 551 memset(&data, 0, sizeof(struct mmc_data)); 552 553 memset(res, 0, 64); 554 cmd.opcode = SD_SWITCH_FUNC; 555 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; 556 cmd.arg = mode << 31; 557 cmd.arg |= 0x00FFFFFF; 558 cmd.arg &= ~(0xF << grp); 559 cmd.arg |= value << grp; 560 cmd.data = &data; 561 562 data.data = res; 563 data.len = 64; 564 data.flags = MMC_DATA_READ; 565 566 err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES); 567 return (err); 568} 569 570static int 571mmc_set_bus_width(struct mmc_softc *sc, uint16_t rca, int width) 572{ 573 int err; 574 575 if (mmcbr_get_mode(sc->dev) == mode_sd) { 576 struct mmc_command cmd; 577 578 memset(&cmd, 0, sizeof(struct mmc_command)); 579 cmd.opcode = ACMD_SET_BUS_WIDTH; 580 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; 581 switch (width) { 582 case bus_width_1: 583 cmd.arg = SD_BUS_WIDTH_1; 584 break; 585 case bus_width_4: 586 cmd.arg = SD_BUS_WIDTH_4; 587 break; 588 default: 589 return (MMC_ERR_INVALID); 590 } 591 err = mmc_wait_for_app_cmd(sc, rca, &cmd, CMD_RETRIES); 592 } else { 593 uint8_t value; 594 595 switch (width) { 596 case bus_width_1: 597 value = EXT_CSD_BUS_WIDTH_1; 598 break; 599 case bus_width_4: 600 value = EXT_CSD_BUS_WIDTH_4; 601 break; 602 case bus_width_8: 603 value = EXT_CSD_BUS_WIDTH_8; 604 break; 605 default: 606 return (MMC_ERR_INVALID); 607 } 608 err = mmc_switch(sc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, value); 609 } 610 return (err); 611} 612 613static int 614mmc_set_timing(struct mmc_softc *sc, int timing) 615{ 616 int err; 617 uint8_t value; 618 619 switch (timing) { 620 case bus_timing_normal: 621 value = 0; 622 break; 623 case bus_timing_hs: 624 value = 1; 625 break; 626 default: 627 return (MMC_ERR_INVALID); 628 } 629 if (mmcbr_get_mode(sc->dev) == mode_sd) { 630 u_char switch_res[64]; 631 632 err = mmc_sd_switch(sc, 1, 0, value, switch_res); 633 } else { 634 err = mmc_switch(sc, EXT_CSD_CMD_SET_NORMAL, 635 EXT_CSD_HS_TIMING, value); 636 } 637 return (err); 638} 639 640static int 641mmc_test_bus_width(struct mmc_softc *sc) 642{ 643 struct mmc_command cmd; 644 struct mmc_data data; 645 int err; 646 uint8_t buf[8]; 647 uint8_t p8[8] = { 0x55, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 648 uint8_t p8ok[8] = { 0xAA, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 649 uint8_t p4[4] = { 0x5A, 0x00, 0x00, 0x00, }; 650 uint8_t p4ok[4] = { 0xA5, 0x00, 0x00, 0x00, }; 651 652 if (mmcbr_get_caps(sc->dev) & MMC_CAP_8_BIT_DATA) { 653 mmcbr_set_bus_width(sc->dev, bus_width_8); 654 mmcbr_update_ios(sc->dev); 655 656 cmd.opcode = MMC_BUSTEST_W; 657 cmd.arg = 0; 658 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; 659 cmd.data = &data; 660 661 data.data = p8; 662 data.len = 8; 663 data.flags = MMC_DATA_WRITE; 664 mmc_wait_for_cmd(sc, &cmd, 0); 665 666 cmd.opcode = MMC_BUSTEST_R; 667 cmd.arg = 0; 668 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; 669 cmd.data = &data; 670 671 data.data = buf; 672 data.len = 8; 673 data.flags = MMC_DATA_READ; 674 err = mmc_wait_for_cmd(sc, &cmd, 0); 675 676 mmcbr_set_bus_width(sc->dev, bus_width_1); 677 mmcbr_update_ios(sc->dev); 678 679 if (err == MMC_ERR_NONE && memcmp(buf, p8ok, 8) == 0) 680 return (bus_width_8); 681 } 682 683 if (mmcbr_get_caps(sc->dev) & MMC_CAP_4_BIT_DATA) { 684 mmcbr_set_bus_width(sc->dev, bus_width_4); 685 mmcbr_update_ios(sc->dev); 686 687 cmd.opcode = MMC_BUSTEST_W; 688 cmd.arg = 0; 689 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; 690 cmd.data = &data; 691 692 data.data = p4; 693 data.len = 4; 694 data.flags = MMC_DATA_WRITE; 695 mmc_wait_for_cmd(sc, &cmd, 0); 696 697 cmd.opcode = MMC_BUSTEST_R; 698 cmd.arg = 0; 699 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; 700 cmd.data = &data; 701 702 data.data = buf; 703 data.len = 4; 704 data.flags = MMC_DATA_READ; 705 err = mmc_wait_for_cmd(sc, &cmd, 0); 706 707 mmcbr_set_bus_width(sc->dev, bus_width_1); 708 mmcbr_update_ios(sc->dev); 709 710 if (err == MMC_ERR_NONE && memcmp(buf, p4ok, 4) == 0) 711 return (bus_width_4); 712 } 713 return (bus_width_1); 714} 715
|
481static uint32_t 482mmc_get_bits(uint32_t *bits, int start, int size) 483{ 484 const int i = 3 - (start / 32); 485 const int shift = start & 31; 486 uint32_t retval = bits[i] >> shift; 487 if (size + shift > 32) 488 retval |= bits[i - 1] << (32 - shift); 489 return (retval & ((1 << size) - 1)); 490} 491 492static void 493mmc_decode_cid(int is_sd, uint32_t *raw_cid, struct mmc_cid *cid) 494{ 495 int i; 496 497 memset(cid, 0, sizeof(*cid)); 498 if (is_sd) { 499 /* There's no version info, so we take it on faith */ 500 cid->mid = mmc_get_bits(raw_cid, 120, 8); 501 cid->oid = mmc_get_bits(raw_cid, 104, 16); 502 for (i = 0; i < 5; i++) 503 cid->pnm[i] = mmc_get_bits(raw_cid, 96 - i * 8, 8); 504 cid->prv = mmc_get_bits(raw_cid, 56, 8); 505 cid->psn = mmc_get_bits(raw_cid, 24, 32); 506 cid->mdt_year = mmc_get_bits(raw_cid, 12, 8) + 2001; 507 cid->mdt_month = mmc_get_bits(raw_cid, 8, 4); 508 } else {
| 716static uint32_t 717mmc_get_bits(uint32_t *bits, int start, int size) 718{ 719 const int i = 3 - (start / 32); 720 const int shift = start & 31; 721 uint32_t retval = bits[i] >> shift; 722 if (size + shift > 32) 723 retval |= bits[i - 1] << (32 - shift); 724 return (retval & ((1 << size) - 1)); 725} 726 727static void 728mmc_decode_cid(int is_sd, uint32_t *raw_cid, struct mmc_cid *cid) 729{ 730 int i; 731 732 memset(cid, 0, sizeof(*cid)); 733 if (is_sd) { 734 /* There's no version info, so we take it on faith */ 735 cid->mid = mmc_get_bits(raw_cid, 120, 8); 736 cid->oid = mmc_get_bits(raw_cid, 104, 16); 737 for (i = 0; i < 5; i++) 738 cid->pnm[i] = mmc_get_bits(raw_cid, 96 - i * 8, 8); 739 cid->prv = mmc_get_bits(raw_cid, 56, 8); 740 cid->psn = mmc_get_bits(raw_cid, 24, 32); 741 cid->mdt_year = mmc_get_bits(raw_cid, 12, 8) + 2001; 742 cid->mdt_month = mmc_get_bits(raw_cid, 8, 4); 743 } else {
|
509 /* XXX write me */ 510 panic("write mmc cid decoder");
| 744 cid->mid = mmc_get_bits(raw_cid, 120, 8); 745 cid->oid = mmc_get_bits(raw_cid, 104, 8); 746 for (i = 0; i < 6; i++) 747 cid->pnm[i] = mmc_get_bits(raw_cid, 96 - i * 8, 8); 748 cid->prv = mmc_get_bits(raw_cid, 48, 8); 749 cid->psn = mmc_get_bits(raw_cid, 16, 32); 750 cid->mdt_month = mmc_get_bits(raw_cid, 12, 4); 751 cid->mdt_year = mmc_get_bits(raw_cid, 8, 4) + 1997;
|
511 } 512} 513 514static const int exp[8] = { 515 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000 516}; 517static const int mant[16] = { 518 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80 519}; 520static const int cur_min[8] = { 521 500, 1000, 5000, 10000, 25000, 35000, 60000, 100000 522}; 523static const int cur_max[8] = { 524 1000, 5000, 10000, 25000, 35000, 45000, 800000, 200000 525}; 526 527static void 528mmc_decode_csd(int is_sd, uint32_t *raw_csd, struct mmc_csd *csd) 529{ 530 int v; 531 int m; 532 int e; 533 534 memset(csd, 0, sizeof(*csd)); 535 if (is_sd) { 536 csd->csd_structure = v = mmc_get_bits(raw_csd, 126, 2); 537 if (v == 0) { 538 m = mmc_get_bits(raw_csd, 115, 4); 539 e = mmc_get_bits(raw_csd, 112, 3); 540 csd->tacc = exp[e] * mant[m] + 9 / 10; 541 csd->nsac = mmc_get_bits(raw_csd, 104, 8) * 100; 542 m = mmc_get_bits(raw_csd, 99, 4); 543 e = mmc_get_bits(raw_csd, 96, 3); 544 csd->tran_speed = exp[e] * 10000 * mant[m]; 545 csd->ccc = mmc_get_bits(raw_csd, 84, 12); 546 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 80, 4); 547 csd->read_bl_partial = mmc_get_bits(raw_csd, 79, 1); 548 csd->write_blk_misalign = mmc_get_bits(raw_csd, 78, 1); 549 csd->read_blk_misalign = mmc_get_bits(raw_csd, 77, 1); 550 csd->dsr_imp = mmc_get_bits(raw_csd, 76, 1); 551 csd->vdd_r_curr_min = cur_min[mmc_get_bits(raw_csd, 59, 3)]; 552 csd->vdd_r_curr_max = cur_max[mmc_get_bits(raw_csd, 56, 3)]; 553 csd->vdd_w_curr_min = cur_min[mmc_get_bits(raw_csd, 53, 3)]; 554 csd->vdd_w_curr_max = cur_max[mmc_get_bits(raw_csd, 50, 3)]; 555 m = mmc_get_bits(raw_csd, 62, 12); 556 e = mmc_get_bits(raw_csd, 47, 3); 557 csd->capacity = ((1 + m) << (e + 2)) * csd->read_bl_len; 558 csd->erase_blk_en = mmc_get_bits(raw_csd, 46, 1); 559 csd->sector_size = mmc_get_bits(raw_csd, 39, 7); 560 csd->wp_grp_size = mmc_get_bits(raw_csd, 32, 7); 561 csd->wp_grp_enable = mmc_get_bits(raw_csd, 31, 1); 562 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 26, 3); 563 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 22, 4); 564 csd->write_bl_partial = mmc_get_bits(raw_csd, 21, 1); 565 } else if (v == 1) {
| 752 } 753} 754 755static const int exp[8] = { 756 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000 757}; 758static const int mant[16] = { 759 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80 760}; 761static const int cur_min[8] = { 762 500, 1000, 5000, 10000, 25000, 35000, 60000, 100000 763}; 764static const int cur_max[8] = { 765 1000, 5000, 10000, 25000, 35000, 45000, 800000, 200000 766}; 767 768static void 769mmc_decode_csd(int is_sd, uint32_t *raw_csd, struct mmc_csd *csd) 770{ 771 int v; 772 int m; 773 int e; 774 775 memset(csd, 0, sizeof(*csd)); 776 if (is_sd) { 777 csd->csd_structure = v = mmc_get_bits(raw_csd, 126, 2); 778 if (v == 0) { 779 m = mmc_get_bits(raw_csd, 115, 4); 780 e = mmc_get_bits(raw_csd, 112, 3); 781 csd->tacc = exp[e] * mant[m] + 9 / 10; 782 csd->nsac = mmc_get_bits(raw_csd, 104, 8) * 100; 783 m = mmc_get_bits(raw_csd, 99, 4); 784 e = mmc_get_bits(raw_csd, 96, 3); 785 csd->tran_speed = exp[e] * 10000 * mant[m]; 786 csd->ccc = mmc_get_bits(raw_csd, 84, 12); 787 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 80, 4); 788 csd->read_bl_partial = mmc_get_bits(raw_csd, 79, 1); 789 csd->write_blk_misalign = mmc_get_bits(raw_csd, 78, 1); 790 csd->read_blk_misalign = mmc_get_bits(raw_csd, 77, 1); 791 csd->dsr_imp = mmc_get_bits(raw_csd, 76, 1); 792 csd->vdd_r_curr_min = cur_min[mmc_get_bits(raw_csd, 59, 3)]; 793 csd->vdd_r_curr_max = cur_max[mmc_get_bits(raw_csd, 56, 3)]; 794 csd->vdd_w_curr_min = cur_min[mmc_get_bits(raw_csd, 53, 3)]; 795 csd->vdd_w_curr_max = cur_max[mmc_get_bits(raw_csd, 50, 3)]; 796 m = mmc_get_bits(raw_csd, 62, 12); 797 e = mmc_get_bits(raw_csd, 47, 3); 798 csd->capacity = ((1 + m) << (e + 2)) * csd->read_bl_len; 799 csd->erase_blk_en = mmc_get_bits(raw_csd, 46, 1); 800 csd->sector_size = mmc_get_bits(raw_csd, 39, 7); 801 csd->wp_grp_size = mmc_get_bits(raw_csd, 32, 7); 802 csd->wp_grp_enable = mmc_get_bits(raw_csd, 31, 1); 803 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 26, 3); 804 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 22, 4); 805 csd->write_bl_partial = mmc_get_bits(raw_csd, 21, 1); 806 } else if (v == 1) {
|
566 panic("Write SDHC CSD parser");
| 807 m = mmc_get_bits(raw_csd, 115, 4); 808 e = mmc_get_bits(raw_csd, 112, 3); 809 csd->tacc = exp[e] * mant[m] + 9 / 10; 810 csd->nsac = mmc_get_bits(raw_csd, 104, 8) * 100; 811 m = mmc_get_bits(raw_csd, 99, 4); 812 e = mmc_get_bits(raw_csd, 96, 3); 813 csd->tran_speed = exp[e] * 10000 * mant[m]; 814 csd->ccc = mmc_get_bits(raw_csd, 84, 12); 815 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 80, 4); 816 csd->read_bl_partial = mmc_get_bits(raw_csd, 79, 1); 817 csd->write_blk_misalign = mmc_get_bits(raw_csd, 78, 1); 818 csd->read_blk_misalign = mmc_get_bits(raw_csd, 77, 1); 819 csd->dsr_imp = mmc_get_bits(raw_csd, 76, 1); 820 csd->capacity = ((uint64_t)mmc_get_bits(raw_csd, 48, 22) + 1) * 821 512 * 1024; 822 csd->erase_blk_en = mmc_get_bits(raw_csd, 46, 1); 823 csd->sector_size = mmc_get_bits(raw_csd, 39, 7); 824 csd->wp_grp_size = mmc_get_bits(raw_csd, 32, 7); 825 csd->wp_grp_enable = mmc_get_bits(raw_csd, 31, 1); 826 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 26, 3); 827 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 22, 4); 828 csd->write_bl_partial = mmc_get_bits(raw_csd, 21, 1);
|
567 } else 568 panic("unknown SD CSD version"); 569 } else {
| 829 } else 830 panic("unknown SD CSD version"); 831 } else {
|
570 panic("Write a MMC CSD parser");
| 832 csd->csd_structure = mmc_get_bits(raw_csd, 126, 2); 833 csd->spec_vers = mmc_get_bits(raw_csd, 122, 4); 834 m = mmc_get_bits(raw_csd, 115, 4); 835 e = mmc_get_bits(raw_csd, 112, 3); 836 csd->tacc = exp[e] * mant[m] + 9 / 10; 837 csd->nsac = mmc_get_bits(raw_csd, 104, 8) * 100; 838 m = mmc_get_bits(raw_csd, 99, 4); 839 e = mmc_get_bits(raw_csd, 96, 3); 840 csd->tran_speed = exp[e] * 10000 * mant[m]; 841 csd->ccc = mmc_get_bits(raw_csd, 84, 12); 842 csd->read_bl_len = 1 << mmc_get_bits(raw_csd, 80, 4); 843 csd->read_bl_partial = mmc_get_bits(raw_csd, 79, 1); 844 csd->write_blk_misalign = mmc_get_bits(raw_csd, 78, 1); 845 csd->read_blk_misalign = mmc_get_bits(raw_csd, 77, 1); 846 csd->dsr_imp = mmc_get_bits(raw_csd, 76, 1); 847 csd->vdd_r_curr_min = cur_min[mmc_get_bits(raw_csd, 59, 3)]; 848 csd->vdd_r_curr_max = cur_max[mmc_get_bits(raw_csd, 56, 3)]; 849 csd->vdd_w_curr_min = cur_min[mmc_get_bits(raw_csd, 53, 3)]; 850 csd->vdd_w_curr_max = cur_max[mmc_get_bits(raw_csd, 50, 3)]; 851 m = mmc_get_bits(raw_csd, 62, 12); 852 e = mmc_get_bits(raw_csd, 47, 3); 853 csd->capacity = ((1 + m) << (e + 2)) * csd->read_bl_len; 854// csd->erase_blk_en = mmc_get_bits(raw_csd, 46, 1); 855// csd->sector_size = mmc_get_bits(raw_csd, 39, 7); 856 csd->wp_grp_size = mmc_get_bits(raw_csd, 32, 5); 857 csd->wp_grp_enable = mmc_get_bits(raw_csd, 31, 1); 858 csd->r2w_factor = 1 << mmc_get_bits(raw_csd, 26, 3); 859 csd->write_bl_len = 1 << mmc_get_bits(raw_csd, 22, 4); 860 csd->write_bl_partial = mmc_get_bits(raw_csd, 21, 1);
|
571 } 572} 573
| 861 } 862} 863
|
| 864static void 865mmc_app_decode_scr(uint32_t *raw_scr, struct mmc_scr *scr) 866{ 867 unsigned int scr_struct; 868 uint32_t tmp[4]; 869 870 tmp[3] = raw_scr[1]; 871 tmp[2] = raw_scr[0]; 872 873 memset(scr, 0, sizeof(*scr)); 874 875 scr_struct = mmc_get_bits(tmp, 60, 4); 876 if (scr_struct != 0) { 877 printf("Unrecognised SCR structure version %d\n", 878 scr_struct); 879 return; 880 } 881 scr->sda_vsn = mmc_get_bits(tmp, 56, 4); 882 scr->bus_widths = mmc_get_bits(tmp, 48, 4); 883} 884
|
574static int 575mmc_all_send_cid(struct mmc_softc *sc, uint32_t *rawcid) 576{ 577 struct mmc_command cmd; 578 int err; 579 580 cmd.opcode = MMC_ALL_SEND_CID; 581 cmd.arg = 0; 582 cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR; 583 cmd.data = NULL; 584 err = mmc_wait_for_cmd(sc, &cmd, 0); 585 memcpy(rawcid, cmd.resp, 4 * sizeof(uint32_t)); 586 return (err); 587} 588 589static int 590mmc_send_csd(struct mmc_softc *sc, uint16_t rca, uint32_t *rawcid) 591{ 592 struct mmc_command cmd; 593 int err; 594 595 cmd.opcode = MMC_SEND_CSD; 596 cmd.arg = rca << 16; 597 cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR; 598 cmd.data = NULL; 599 err = mmc_wait_for_cmd(sc, &cmd, 0); 600 memcpy(rawcid, cmd.resp, 4 * sizeof(uint32_t)); 601 return (err); 602} 603 604static int
| 885static int 886mmc_all_send_cid(struct mmc_softc *sc, uint32_t *rawcid) 887{ 888 struct mmc_command cmd; 889 int err; 890 891 cmd.opcode = MMC_ALL_SEND_CID; 892 cmd.arg = 0; 893 cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR; 894 cmd.data = NULL; 895 err = mmc_wait_for_cmd(sc, &cmd, 0); 896 memcpy(rawcid, cmd.resp, 4 * sizeof(uint32_t)); 897 return (err); 898} 899 900static int 901mmc_send_csd(struct mmc_softc *sc, uint16_t rca, uint32_t *rawcid) 902{ 903 struct mmc_command cmd; 904 int err; 905 906 cmd.opcode = MMC_SEND_CSD; 907 cmd.arg = rca << 16; 908 cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR; 909 cmd.data = NULL; 910 err = mmc_wait_for_cmd(sc, &cmd, 0); 911 memcpy(rawcid, cmd.resp, 4 * sizeof(uint32_t)); 912 return (err); 913} 914 915static int
|
| 916mmc_app_send_scr(struct mmc_softc *sc, uint16_t rca, uint32_t *rawscr) 917{ 918 int err; 919 struct mmc_command cmd; 920 struct mmc_data data; 921 922 memset(&cmd, 0, sizeof(struct mmc_command)); 923 memset(&data, 0, sizeof(struct mmc_data)); 924 925 memset(rawscr, 0, 8); 926 cmd.opcode = ACMD_SEND_SCR; 927 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; 928 cmd.arg = 0; 929 cmd.data = &data; 930 931 data.data = rawscr; 932 data.len = 8; 933 data.flags = MMC_DATA_READ; 934 935 err = mmc_wait_for_app_cmd(sc, rca, &cmd, CMD_RETRIES); 936 rawscr[0] = be32toh(rawscr[0]); 937 rawscr[1] = be32toh(rawscr[1]); 938 return (err); 939} 940 941static int 942mmc_send_ext_csd(struct mmc_softc *sc, uint8_t *rawextcsd) 943{ 944 int err; 945 struct mmc_command cmd; 946 struct mmc_data data; 947 948 memset(&cmd, 0, sizeof(struct mmc_command)); 949 memset(&data, 0, sizeof(struct mmc_data)); 950 951 memset(rawextcsd, 0, 512); 952 cmd.opcode = MMC_SEND_EXT_CSD; 953 cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; 954 cmd.arg = 0; 955 cmd.data = &data; 956 957 data.data = rawextcsd; 958 data.len = 512; 959 data.flags = MMC_DATA_READ; 960 961 err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES); 962 return (err); 963} 964 965static int 966mmc_set_relative_addr(struct mmc_softc *sc, uint16_t resp) 967{ 968 struct mmc_command cmd; 969 int err; 970 971 cmd.opcode = MMC_SET_RELATIVE_ADDR; 972 cmd.arg = resp << 16; 973 cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR; 974 cmd.data = NULL; 975 err = mmc_wait_for_cmd(sc, &cmd, 0); 976 return (err); 977} 978 979static int
|
605mmc_send_relative_addr(struct mmc_softc *sc, uint32_t *resp) 606{ 607 struct mmc_command cmd; 608 int err; 609 610 cmd.opcode = SD_SEND_RELATIVE_ADDR; 611 cmd.arg = 0; 612 cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR; 613 cmd.data = NULL; 614 err = mmc_wait_for_cmd(sc, &cmd, 0); 615 *resp = cmd.resp[0]; 616 return (err); 617} 618 619static void 620mmc_discover_cards(struct mmc_softc *sc) 621{ 622 struct mmc_ivars *ivar; 623 int err; 624 uint32_t resp; 625 device_t child;
| 980mmc_send_relative_addr(struct mmc_softc *sc, uint32_t *resp) 981{ 982 struct mmc_command cmd; 983 int err; 984 985 cmd.opcode = SD_SEND_RELATIVE_ADDR; 986 cmd.arg = 0; 987 cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR; 988 cmd.data = NULL; 989 err = mmc_wait_for_cmd(sc, &cmd, 0); 990 *resp = cmd.resp[0]; 991 return (err); 992} 993 994static void 995mmc_discover_cards(struct mmc_softc *sc) 996{ 997 struct mmc_ivars *ivar; 998 int err; 999 uint32_t resp; 1000 device_t child;
|
| 1001 uint16_t rca = 2; 1002 u_char switch_res[64];
|
626 627 while (1) { 628 ivar = malloc(sizeof(struct mmc_ivars), M_DEVBUF, 629 M_WAITOK | M_ZERO); 630 if (!ivar) 631 return; 632 err = mmc_all_send_cid(sc, ivar->raw_cid); 633 if (err == MMC_ERR_TIMEOUT) 634 break; 635 if (err != MMC_ERR_NONE) { 636 device_printf(sc->dev, "Error reading CID %d\n", err); 637 break; 638 }
| 1003 1004 while (1) { 1005 ivar = malloc(sizeof(struct mmc_ivars), M_DEVBUF, 1006 M_WAITOK | M_ZERO); 1007 if (!ivar) 1008 return; 1009 err = mmc_all_send_cid(sc, ivar->raw_cid); 1010 if (err == MMC_ERR_TIMEOUT) 1011 break; 1012 if (err != MMC_ERR_NONE) { 1013 device_printf(sc->dev, "Error reading CID %d\n", err); 1014 break; 1015 }
|
639 if (mmcbr_get_mode(sc->dev) == mode_sd) { 640 ivar->mode = mode_sd;
| 1016 if (mmcbr_get_ro(sc->dev)) 1017 ivar->read_only = 1; 1018 ivar->bus_width = bus_width_1; 1019 ivar->mode = mmcbr_get_mode(sc->dev); 1020 if (ivar->mode == mode_sd) {
|
641 mmc_decode_cid(1, ivar->raw_cid, &ivar->cid); 642 mmc_send_relative_addr(sc, &resp); 643 ivar->rca = resp >> 16;
| 1021 mmc_decode_cid(1, ivar->raw_cid, &ivar->cid); 1022 mmc_send_relative_addr(sc, &resp); 1023 ivar->rca = resp >> 16;
|
644 if (mmcbr_get_ro(sc->dev)) 645 ivar->read_only = 1;
| 1024 /* Get card CSD. */
|
646 mmc_send_csd(sc, ivar->rca, ivar->raw_csd); 647 mmc_decode_csd(1, ivar->raw_csd, &ivar->csd);
| 1025 mmc_send_csd(sc, ivar->rca, ivar->raw_csd); 1026 mmc_decode_csd(1, ivar->raw_csd, &ivar->csd);
|
648 printf("SD CARD: %lld bytes\n", (long long) 649 ivar->csd.capacity);
| 1027 if (ivar->csd.csd_structure > 0) 1028 ivar->high_cap = 1; 1029 ivar->tran_speed = ivar->csd.tran_speed; 1030 /* Get card SCR. Card must be selected to fetch it. */ 1031 mmc_select_card(sc, ivar->rca); 1032 mmc_app_send_scr(sc, ivar->rca, ivar->raw_scr); 1033 mmc_app_decode_scr(ivar->raw_scr, &ivar->scr); 1034 /* Get card switch capabilities. */ 1035 if ((ivar->scr.sda_vsn >= 1) && 1036 (ivar->csd.ccc & (1<<10))) { 1037 mmc_sd_switch(sc, 0, 0, 0xF, switch_res); 1038 if (switch_res[13] & 2) { 1039 ivar->timing = bus_timing_hs; 1040 ivar->hs_tran_speed = 50000000; 1041 } 1042 } 1043 mmc_select_card(sc, 0); 1044 /* Find max supported bus width. */ 1045 if ((mmcbr_get_caps(sc->dev) & MMC_CAP_4_BIT_DATA) && 1046 (ivar->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) 1047 ivar->bus_width = bus_width_4; 1048 /* Add device. */
|
650 child = device_add_child(sc->dev, NULL, -1); 651 device_set_ivars(child, ivar); 652 return; 653 }
| 1049 child = device_add_child(sc->dev, NULL, -1); 1050 device_set_ivars(child, ivar); 1051 return; 1052 }
|
654 panic("Write MMC card code here");
| 1053 mmc_decode_cid(0, ivar->raw_cid, &ivar->cid); 1054 ivar->rca = rca++; 1055 mmc_set_relative_addr(sc, ivar->rca); 1056 /* Get card CSD. */ 1057 mmc_send_csd(sc, ivar->rca, ivar->raw_csd); 1058 mmc_decode_csd(0, ivar->raw_csd, &ivar->csd); 1059 ivar->tran_speed = ivar->csd.tran_speed; 1060 /* Only MMC >= 4.x cards support EXT_CSD. */ 1061 if (ivar->csd.spec_vers >= 4) { 1062 /* Card must be selected to fetch EXT_CSD. */ 1063 mmc_select_card(sc, ivar->rca); 1064 mmc_send_ext_csd(sc, ivar->raw_ext_csd); 1065 /* Get card speed in high speed mode. */ 1066 ivar->timing = bus_timing_hs; 1067 if (((uint8_t *)(ivar->raw_ext_csd))[EXT_CSD_CARD_TYPE] 1068 & EXT_CSD_CARD_TYPE_52) 1069 ivar->hs_tran_speed = 52000000; 1070 else if (((uint8_t *)(ivar->raw_ext_csd))[EXT_CSD_CARD_TYPE] 1071 & EXT_CSD_CARD_TYPE_26) 1072 ivar->hs_tran_speed = 26000000; 1073 else 1074 ivar->hs_tran_speed = ivar->tran_speed; 1075 /* Find max supported bus width. */ 1076 ivar->bus_width = mmc_test_bus_width(sc); 1077 mmc_select_card(sc, 0); 1078 } else { 1079 ivar->bus_width = bus_width_1; 1080 ivar->timing = bus_timing_normal; 1081 } 1082 /* Add device. */ 1083 child = device_add_child(sc->dev, NULL, -1); 1084 device_set_ivars(child, ivar);
|
655 } 656 free(ivar, M_DEVBUF); 657} 658 659static void 660mmc_go_discovery(struct mmc_softc *sc) 661{ 662 uint32_t ocr; 663 device_t dev;
| 1085 } 1086 free(ivar, M_DEVBUF); 1087} 1088 1089static void 1090mmc_go_discovery(struct mmc_softc *sc) 1091{ 1092 uint32_t ocr; 1093 device_t dev;
|
| 1094 int err;
|
664 665 dev = sc->dev; 666 if (mmcbr_get_power_mode(dev) != power_on) { 667 /* 668 * First, try SD modes 669 */ 670 mmcbr_set_mode(dev, mode_sd); 671 mmc_power_up(sc); 672 mmcbr_set_bus_mode(dev, pushpull); 673 mmc_idle_cards(sc);
| 1095 1096 dev = sc->dev; 1097 if (mmcbr_get_power_mode(dev) != power_on) { 1098 /* 1099 * First, try SD modes 1100 */ 1101 mmcbr_set_mode(dev, mode_sd); 1102 mmc_power_up(sc); 1103 mmcbr_set_bus_mode(dev, pushpull); 1104 mmc_idle_cards(sc);
|
674 if (mmc_send_app_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) {
| 1105 err = mmc_send_if_cond(sc, 1); 1106 if (mmc_send_app_op_cond(sc, err?0:MMC_OCR_CCS, &ocr) != 1107 MMC_ERR_NONE) {
|
675 /* 676 * Failed, try MMC 677 */ 678 mmcbr_set_mode(dev, mode_mmc); 679 if (mmc_send_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) 680 return; /* Failed both, punt! XXX powerdown? */ 681 } 682 mmcbr_set_ocr(dev, mmc_select_vdd(sc, ocr)); 683 if (mmcbr_get_ocr(dev) != 0) 684 mmc_idle_cards(sc); 685 } else { 686 mmcbr_set_bus_mode(dev, opendrain); 687 mmcbr_set_clock(dev, mmcbr_get_f_min(dev)); 688 mmcbr_update_ios(dev); 689 /* XXX recompute vdd based on new cards? */ 690 } 691 /* 692 * Make sure that we have a mutually agreeable voltage to at least 693 * one card on the bus. 694 */ 695 if (mmcbr_get_ocr(dev) == 0) 696 return; 697 /* 698 * Reselect the cards after we've idled them above. 699 */
| 1108 /* 1109 * Failed, try MMC 1110 */ 1111 mmcbr_set_mode(dev, mode_mmc); 1112 if (mmc_send_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) 1113 return; /* Failed both, punt! XXX powerdown? */ 1114 } 1115 mmcbr_set_ocr(dev, mmc_select_vdd(sc, ocr)); 1116 if (mmcbr_get_ocr(dev) != 0) 1117 mmc_idle_cards(sc); 1118 } else { 1119 mmcbr_set_bus_mode(dev, opendrain); 1120 mmcbr_set_clock(dev, mmcbr_get_f_min(dev)); 1121 mmcbr_update_ios(dev); 1122 /* XXX recompute vdd based on new cards? */ 1123 } 1124 /* 1125 * Make sure that we have a mutually agreeable voltage to at least 1126 * one card on the bus. 1127 */ 1128 if (mmcbr_get_ocr(dev) == 0) 1129 return; 1130 /* 1131 * Reselect the cards after we've idled them above. 1132 */
|
700 if (mmcbr_get_mode(dev) == mode_sd) 701 mmc_send_app_op_cond(sc, mmcbr_get_ocr(dev), NULL); 702 else
| 1133 if (mmcbr_get_mode(dev) == mode_sd) { 1134 err = mmc_send_if_cond(sc, 1); 1135 mmc_send_app_op_cond(sc, 1136 (err?0:MMC_OCR_CCS)|mmcbr_get_ocr(dev), NULL); 1137 } else
|
703 mmc_send_op_cond(sc, mmcbr_get_ocr(dev), NULL); 704 mmc_discover_cards(sc); 705 706 mmcbr_set_bus_mode(dev, pushpull); 707 mmcbr_update_ios(dev); 708 bus_generic_attach(dev); 709/* mmc_update_children_sysctl(dev);*/ 710} 711 712static int 713mmc_calculate_clock(struct mmc_softc *sc) 714{
| 1138 mmc_send_op_cond(sc, mmcbr_get_ocr(dev), NULL); 1139 mmc_discover_cards(sc); 1140 1141 mmcbr_set_bus_mode(dev, pushpull); 1142 mmcbr_update_ios(dev); 1143 bus_generic_attach(dev); 1144/* mmc_update_children_sysctl(dev);*/ 1145} 1146 1147static int 1148mmc_calculate_clock(struct mmc_softc *sc) 1149{
|
715 int max_dtr = 0;
| 1150 int max_dtr, max_hs_dtr, max_timing;
|
716 int nkid, i, f_min, f_max; 717 device_t *kids;
| 1151 int nkid, i, f_min, f_max; 1152 device_t *kids;
|
| 1153 struct mmc_ivars *ivar;
|
718 719 f_min = mmcbr_get_f_min(sc->dev); 720 f_max = mmcbr_get_f_max(sc->dev);
| 1154 1155 f_min = mmcbr_get_f_min(sc->dev); 1156 f_max = mmcbr_get_f_max(sc->dev);
|
721 max_dtr = f_max;
| 1157 max_dtr = max_hs_dtr = f_max; 1158 if ((mmcbr_get_caps(sc->dev) & MMC_CAP_HSPEED)) 1159 max_timing = bus_timing_hs; 1160 else 1161 max_timing = bus_timing_normal;
|
722 if (device_get_children(sc->dev, &kids, &nkid) != 0) 723 panic("can't get children");
| 1162 if (device_get_children(sc->dev, &kids, &nkid) != 0) 1163 panic("can't get children");
|
724 for (i = 0; i < nkid; i++) 725 if (mmc_get_tran_speed(kids[i]) < max_dtr) 726 max_dtr = mmc_get_tran_speed(kids[i]);
| 1164 for (i = 0; i < nkid; i++) { 1165 ivar = device_get_ivars(kids[i]); 1166 if (ivar->timing < max_timing) 1167 max_timing = ivar->timing; 1168 if (ivar->tran_speed < max_dtr) 1169 max_dtr = ivar->tran_speed; 1170 if (ivar->hs_tran_speed < max_dtr) 1171 max_hs_dtr = ivar->hs_tran_speed; 1172 } 1173 for (i = 0; i < nkid; i++) { 1174 ivar = device_get_ivars(kids[i]); 1175 if (ivar->timing == bus_timing_normal) 1176 continue; 1177 mmc_select_card(sc, ivar->rca); 1178 mmc_set_timing(sc, max_timing); 1179 } 1180 mmc_select_card(sc, 0);
|
727 free(kids, M_TEMP);
| 1181 free(kids, M_TEMP);
|
728 device_printf(sc->dev, "setting transfer rate to %d.%03dMHz\n", 729 max_dtr / 1000000, (max_dtr / 1000) % 1000); 730 return (max_dtr);
| 1182 if (max_timing == bus_timing_hs) 1183 max_dtr = max_hs_dtr; 1184 device_printf(sc->dev, "setting transfer rate to %d.%03dMHz%s\n", 1185 max_dtr / 1000000, (max_dtr / 1000) % 1000, 1186 (max_timing == bus_timing_hs)?" with high speed timing":""); 1187 mmcbr_set_timing(sc->dev, max_timing); 1188 mmcbr_set_clock(sc->dev, max_dtr); 1189 mmcbr_update_ios(sc->dev); 1190 return max_dtr;
|
731} 732 733static void 734mmc_scan(struct mmc_softc *sc) 735{ 736 device_t dev; 737 738 dev = sc->dev; 739 mmc_acquire_bus(dev, dev); 740 741 if (mmcbr_get_power_mode(dev) == power_on) 742 mmc_rescan_cards(sc); 743 mmc_go_discovery(sc);
| 1191} 1192 1193static void 1194mmc_scan(struct mmc_softc *sc) 1195{ 1196 device_t dev; 1197 1198 dev = sc->dev; 1199 mmc_acquire_bus(dev, dev); 1200 1201 if (mmcbr_get_power_mode(dev) == power_on) 1202 mmc_rescan_cards(sc); 1203 mmc_go_discovery(sc);
|
744 mmcbr_set_clock(dev, mmc_calculate_clock(sc)); 745 mmcbr_update_ios(dev);
| 1204 mmc_calculate_clock(sc);
|
746 747 mmc_release_bus(dev, dev); 748 /* XXX probe/attach/detach children? */ 749} 750 751static int 752mmc_read_ivar(device_t bus, device_t child, int which, u_char *result) 753{ 754 struct mmc_ivars *ivar = device_get_ivars(child); 755 756 switch (which) { 757 default: 758 return (EINVAL); 759 case MMC_IVAR_DSR_IMP: 760 *(int *)result = ivar->csd.dsr_imp; 761 break; 762 case MMC_IVAR_MEDIA_SIZE: 763 *(off_t *)result = ivar->csd.capacity / MMC_SECTOR_SIZE; 764 break; 765 case MMC_IVAR_RCA: 766 *(int *)result = ivar->rca; 767 break; 768 case MMC_IVAR_SECTOR_SIZE: 769 *(int *)result = MMC_SECTOR_SIZE; 770 break; 771 case MMC_IVAR_TRAN_SPEED: 772 *(int *)result = ivar->csd.tran_speed; 773 break; 774 case MMC_IVAR_READ_ONLY: 775 *(int *)result = ivar->read_only; 776 break;
| 1205 1206 mmc_release_bus(dev, dev); 1207 /* XXX probe/attach/detach children? */ 1208} 1209 1210static int 1211mmc_read_ivar(device_t bus, device_t child, int which, u_char *result) 1212{ 1213 struct mmc_ivars *ivar = device_get_ivars(child); 1214 1215 switch (which) { 1216 default: 1217 return (EINVAL); 1218 case MMC_IVAR_DSR_IMP: 1219 *(int *)result = ivar->csd.dsr_imp; 1220 break; 1221 case MMC_IVAR_MEDIA_SIZE: 1222 *(off_t *)result = ivar->csd.capacity / MMC_SECTOR_SIZE; 1223 break; 1224 case MMC_IVAR_RCA: 1225 *(int *)result = ivar->rca; 1226 break; 1227 case MMC_IVAR_SECTOR_SIZE: 1228 *(int *)result = MMC_SECTOR_SIZE; 1229 break; 1230 case MMC_IVAR_TRAN_SPEED: 1231 *(int *)result = ivar->csd.tran_speed; 1232 break; 1233 case MMC_IVAR_READ_ONLY: 1234 *(int *)result = ivar->read_only; 1235 break;
|
| 1236 case MMC_IVAR_HIGH_CAP: 1237 *(int *)result = ivar->high_cap; 1238 break;
|
777 } 778 return (0); 779} 780 781static int 782mmc_write_ivar(device_t bus, device_t child, int which, uintptr_t value) 783{ 784 /* 785 * None are writable ATM 786 */ 787 return (EINVAL); 788} 789 790 791static void 792mmc_delayed_attach(void *xsc) 793{ 794 struct mmc_softc *sc = xsc; 795 796 mmc_scan(sc); 797 config_intrhook_disestablish(&sc->config_intrhook); 798} 799 800static device_method_t mmc_methods[] = { 801 /* device_if */ 802 DEVMETHOD(device_probe, mmc_probe), 803 DEVMETHOD(device_attach, mmc_attach), 804 DEVMETHOD(device_detach, mmc_detach), 805 806 /* Bus interface */ 807 DEVMETHOD(bus_read_ivar, mmc_read_ivar), 808 DEVMETHOD(bus_write_ivar, mmc_write_ivar), 809 810 /* MMC Bus interface */ 811 DEVMETHOD(mmcbus_wait_for_request, mmc_wait_for_request), 812 DEVMETHOD(mmcbus_acquire_bus, mmc_acquire_bus), 813 DEVMETHOD(mmcbus_release_bus, mmc_release_bus), 814 815 {0, 0}, 816}; 817 818static driver_t mmc_driver = { 819 "mmc", 820 mmc_methods, 821 sizeof(struct mmc_softc), 822}; 823static devclass_t mmc_devclass; 824 825 826DRIVER_MODULE(mmc, at91_mci, mmc_driver, mmc_devclass, 0, 0); 827DRIVER_MODULE(mmc, sdh, mmc_driver, mmc_devclass, 0, 0);
| 1239 } 1240 return (0); 1241} 1242 1243static int 1244mmc_write_ivar(device_t bus, device_t child, int which, uintptr_t value) 1245{ 1246 /* 1247 * None are writable ATM 1248 */ 1249 return (EINVAL); 1250} 1251 1252 1253static void 1254mmc_delayed_attach(void *xsc) 1255{ 1256 struct mmc_softc *sc = xsc; 1257 1258 mmc_scan(sc); 1259 config_intrhook_disestablish(&sc->config_intrhook); 1260} 1261 1262static device_method_t mmc_methods[] = { 1263 /* device_if */ 1264 DEVMETHOD(device_probe, mmc_probe), 1265 DEVMETHOD(device_attach, mmc_attach), 1266 DEVMETHOD(device_detach, mmc_detach), 1267 1268 /* Bus interface */ 1269 DEVMETHOD(bus_read_ivar, mmc_read_ivar), 1270 DEVMETHOD(bus_write_ivar, mmc_write_ivar), 1271 1272 /* MMC Bus interface */ 1273 DEVMETHOD(mmcbus_wait_for_request, mmc_wait_for_request), 1274 DEVMETHOD(mmcbus_acquire_bus, mmc_acquire_bus), 1275 DEVMETHOD(mmcbus_release_bus, mmc_release_bus), 1276 1277 {0, 0}, 1278}; 1279 1280static driver_t mmc_driver = { 1281 "mmc", 1282 mmc_methods, 1283 sizeof(struct mmc_softc), 1284}; 1285static devclass_t mmc_devclass; 1286 1287 1288DRIVER_MODULE(mmc, at91_mci, mmc_driver, mmc_devclass, 0, 0); 1289DRIVER_MODULE(mmc, sdh, mmc_driver, mmc_devclass, 0, 0);
|