Lines Matching defs:wb
97 wb_sdmmc_read_data(struct wb_softc *wb, uint8_t *data, int len)
99 bus_space_read_multi_1(wb->wb_iot, wb->wb_ioh, WB_SD_FIFO, data, len);
103 wb_sdmmc_write_data(struct wb_softc *wb, uint8_t *data, int len)
105 bus_space_write_multi_1(wb->wb_iot, wb->wb_ioh, WB_SD_FIFO, data, len);
111 struct wb_softc *wb = opaque;
113 REPORT(wb, "TRACE: discover(wb)\n");
115 sdmmc_needs_discover(wb->wb_sdmmc_dev);
119 wb_sdmmc_enable(struct wb_softc *wb)
123 REPORT(wb, "TRACE: enable(wb)\n");
126 wb_idx_write(wb, WB_INDEX_SETUP, WB_SETUP_SOFT_RST);
127 while (--i > 0 && wb_idx_read(wb, WB_INDEX_SETUP) & WB_SETUP_SOFT_RST)
130 aprint_error_dev(wb->wb_dev, "timeout resetting device\n");
133 wb_idx_write(wb, WB_INDEX_CLK, wb->wb_sdmmc_clk);
134 wb_idx_write(wb, WB_INDEX_FIFOEN, 0);
135 wb_idx_write(wb, WB_INDEX_DMA, 0);
136 wb_idx_write(wb, WB_INDEX_PBSMSB, 0);
137 wb_idx_write(wb, WB_INDEX_PBSLSB, 0);
139 while ((wb_read(wb, WB_SD_FIFOSTS) & WB_FIFO_EMPTY) == 0)
140 wb_read(wb, WB_SD_FIFO);
142 wb_write(wb, WB_SD_CSR, 0);
144 wb_write(wb, WB_SD_INTCTL, WB_INT_DEFAULT);
146 wb_sdmmc_card_detect(wb);
152 wb_sdmmc_disable(struct wb_softc *wb)
156 REPORT(wb, "TRACE: disable(wb)\n");
158 val = wb_read(wb, WB_SD_CSR);
160 wb_write(wb, WB_SD_CSR, val);
166 wb_sdmmc_attach(struct wb_softc *wb)
170 callout_init(&wb->wb_sdmmc_callout, 0);
171 callout_setfunc(&wb->wb_sdmmc_callout, wb_sdmmc_discover, wb);
173 wb->wb_sdmmc_width = 1;
174 wb->wb_sdmmc_clk = WB_CLK_375K;
176 if (wb_sdmmc_enable(wb) == false)
182 saa.saa_sch = wb;
185 if (!ISSET(wb->wb_quirks, WB_QUIRK_1BIT))
188 wb->wb_sdmmc_dev = config_found(wb->wb_dev, &saa, NULL, CFARGS_NONE);
192 wb_sdmmc_detach(struct wb_softc *wb, int flags)
196 error = config_detach_children(wb->wb_dev, flags);
199 wb_sdmmc_disable(wb);
201 callout_halt(&wb->wb_sdmmc_callout, NULL);
202 callout_destroy(&wb->wb_sdmmc_callout);
213 REPORT(sch, "TRACE: sdmmc/host_reset(wb)\n");
221 REPORT(sch, "TRACE: sdmmc/host_ocr(wb)\n");
229 REPORT(sch, "TRACE: sdmmc/host_maxblklen(wb)\n");
237 struct wb_softc *wb = sch;
240 wb_led(wb, true);
241 rv = (wb_read(wb, WB_SD_CSR) & WB_CSR_CARD_PRESENT) ? 1 : 0;
242 wb_led(wb, false);
244 REPORT(wb, "TRACE: sdmmc/card_detect(wb) -> %d\n", rv);
252 struct wb_softc *wb = sch;
255 wb_led(wb, true);
256 rv = (wb_read(wb, WB_SD_CSR) & WB_CSR_WRITE_PROTECT) ? 1 : 0;
257 wb_led(wb, false);
259 REPORT(wb, "TRACE: sdmmc/write_protect(wb) -> %d\n", rv);
267 REPORT(sch, "TRACE: sdmmc/bus_power(wb, ocr=%x)\n", ocr);
275 struct wb_softc *wb = sch;
278 REPORT(wb, "TRACE: sdmmc/bus_clock(wb, freq=%d)\n", freq);
289 wb->wb_sdmmc_clk = clk;
291 if (wb_idx_read(wb, WB_INDEX_CLK) != clk)
292 wb_idx_write(wb, WB_INDEX_CLK, clk);
300 struct wb_softc *wb = sch;
302 REPORT(wb, "TRACE: sdmmc/bus_width(wb, width=%d)\n", width);
307 wb->wb_sdmmc_width = width;
322 wb_sdmmc_rsp_read_long(struct wb_softc *wb, struct sdmmc_command *cmd)
327 if (wb_idx_read(wb, WB_INDEX_RESPLEN) != 1) {
334 p[3] = wb_idx_read(wb, WB_INDEX_RESP(i + 0));
335 p[2] = wb_idx_read(wb, WB_INDEX_RESP(i + 1));
336 p[1] = wb_idx_read(wb, WB_INDEX_RESP(i + 2));
337 p[0] = wb_idx_read(wb, WB_INDEX_RESP(i + 3));
339 p[0] = wb_idx_read(wb, WB_INDEX_RESP(i + 0));
340 p[1] = wb_idx_read(wb, WB_INDEX_RESP(i + 1));
341 p[2] = wb_idx_read(wb, WB_INDEX_RESP(i + 2));
342 p[3] = wb_idx_read(wb, WB_INDEX_RESP(i + 3));
344 REPORT(wb, "TRACE: sdmmc/read_long (%d) 0x%08x\n",
351 wb_sdmmc_rsp_read_short(struct wb_softc *wb, struct sdmmc_command *cmd)
355 if (wb_idx_read(wb, WB_INDEX_RESPLEN) != 0) {
361 p[3] = wb_idx_read(wb, WB_INDEX_RESP(12));
362 p[2] = wb_idx_read(wb, WB_INDEX_RESP(13));
363 p[1] = wb_idx_read(wb, WB_INDEX_RESP(14));
364 p[0] = wb_idx_read(wb, WB_INDEX_RESP(15));
366 p[0] = wb_idx_read(wb, WB_INDEX_RESP(12));
367 p[1] = wb_idx_read(wb, WB_INDEX_RESP(13));
368 p[2] = wb_idx_read(wb, WB_INDEX_RESP(14));
369 p[3] = wb_idx_read(wb, WB_INDEX_RESP(15));
371 REPORT(wb, "TRACE: sdmmc/read_short 0x%08x\n",
376 wb_sdmmc_transfer_data(struct wb_softc *wb, struct sdmmc_command *cmd)
381 if (wb->wb_sdmmc_intsts & WB_INT_CARD)
384 fifosts = wb_read(wb, WB_SD_FIFOSTS);
388 fifosts = wb_read(wb, WB_SD_FIFOSTS);
404 fifosts = wb_read(wb, WB_SD_FIFOSTS);
422 wb_sdmmc_read_data(wb, cmd->c_buf, datalen);
424 wb_sdmmc_write_data(wb, cmd->c_buf, datalen);
439 struct wb_softc *wb = sch;
446 REPORT(wb, "TRACE: sdmmc/exec_command(wb, cmd) "
458 aprint_debug_dev(wb->wb_dev,
467 aprint_error_dev(wb->wb_dev,
474 blklen = blklen + 2 * wb->wb_sdmmc_width;
475 wb_idx_write(wb, WB_INDEX_PBSMSB,
476 ((blklen >> 4) & 0xf0) | (wb->wb_sdmmc_width / 4));
477 wb_idx_write(wb, WB_INDEX_PBSLSB, blklen & 0xff);
480 val = wb_idx_read(wb, WB_INDEX_SETUP);
482 wb_idx_write(wb, WB_INDEX_SETUP, val);
483 while (wb_idx_read(wb, WB_INDEX_SETUP) & WB_SETUP_FIFO_RST)
491 wb_idx_write(wb, WB_INDEX_FIFOEN, WB_FIFOEN_FULL | 8);
493 wb_idx_write(wb, WB_INDEX_FIFOEN, WB_FIFOEN_EMPTY | 8);
496 error = wb_sdmmc_transfer_data(wb, cmd);
505 wb->wb_sdmmc_intsts = 0;
506 wb_write(wb, WB_SD_COMMAND, cmd->c_opcode);
507 wb_write(wb, WB_SD_COMMAND, (cmd->c_arg >> 24) & 0xff);
508 wb_write(wb, WB_SD_COMMAND, (cmd->c_arg >> 16) & 0xff);
509 wb_write(wb, WB_SD_COMMAND, (cmd->c_arg >> 8) & 0xff);
510 wb_write(wb, WB_SD_COMMAND, (cmd->c_arg >> 0) & 0xff);
514 while (wb_idx_read(wb, WB_INDEX_STATUS) & WB_STATUS_CARD_TRAFFIC) {
519 if (wb_idx_read(wb, WB_INDEX_STATUS) & WB_STATUS_CARD_TRAFFIC) {
520 REPORT(wb,
522 wb_idx_read(wb, WB_INDEX_STATUS));
528 if (wb->wb_sdmmc_intsts & WB_INT_TIMEOUT) {
534 wb_sdmmc_rsp_read_long(wb, cmd);
536 wb_sdmmc_rsp_read_short(wb, cmd);
540 wb_led(wb, true);
542 error = wb_sdmmc_transfer_data(wb, cmd);
548 wb_led(wb, false);
555 REPORT(wb,
567 REPORT(sch, "TRACE: sdmmc/card_enable_intr(wb, enable=%d)\n", enable);
573 REPORT(sch, "TRACE: sdmmc/card_intr_ack(wb)\n");
580 wb_sdmmc_intr(struct wb_softc *wb)
584 val = wb_read(wb, WB_SD_INTSTS);
588 if (wb->wb_sdmmc_dev == NULL)
591 wb->wb_sdmmc_intsts |= val;
599 REPORT(wb, "WB_SD_INTSTS = %s\n", buf);
603 callout_schedule(&wb->wb_sdmmc_callout, hz / 4);
612 wb_sdmmc_suspend(struct wb_softc *wb)
614 return wb_sdmmc_disable(wb);
618 wb_sdmmc_resume(struct wb_softc *wb)
622 val = wb_read(wb, WB_SD_CSR);
624 wb_write(wb, WB_SD_CSR, val);
626 if (wb_sdmmc_enable(wb) == false)
629 if (wb_idx_read(wb, WB_INDEX_CLK) != wb->wb_sdmmc_clk)
630 wb_idx_write(wb, WB_INDEX_CLK, wb->wb_sdmmc_clk);