Lines Matching +full:12 +full:bit +full:- +full:clkdiv +full:- +full:mode

2  * OMAP on-chip MMC/SD host emulation.
6 * Copyright (C) 2006-2007 Andrzej Zaborowski <balrog@zabor.org>
41 int mode; member
49 int clkdiv; member
73 qemu_set_irq(s->irq, !!(s->status & s->mask)); in omap_mmc_interrupts_update()
78 if (!host->transfer && !host->fifo_len) { in omap_mmc_fifolevel_update()
79 host->status &= 0xf3ff; in omap_mmc_fifolevel_update()
83 if (host->fifo_len > host->af_level && host->ddir) { in omap_mmc_fifolevel_update()
84 if (host->rx_dma) { in omap_mmc_fifolevel_update()
85 host->status &= 0xfbff; in omap_mmc_fifolevel_update()
86 qemu_irq_raise(host->dma[1]); in omap_mmc_fifolevel_update()
88 host->status |= 0x0400; in omap_mmc_fifolevel_update()
90 host->status &= 0xfbff; in omap_mmc_fifolevel_update()
91 qemu_irq_lower(host->dma[1]); in omap_mmc_fifolevel_update()
94 if (host->fifo_len < host->ae_level && !host->ddir) { in omap_mmc_fifolevel_update()
95 if (host->tx_dma) { in omap_mmc_fifolevel_update()
96 host->status &= 0xf7ff; in omap_mmc_fifolevel_update()
97 qemu_irq_raise(host->dma[0]); in omap_mmc_fifolevel_update()
99 host->status |= 0x0800; in omap_mmc_fifolevel_update()
101 qemu_irq_lower(host->dma[0]); in omap_mmc_fifolevel_update()
102 host->status &= 0xf7ff; in omap_mmc_fifolevel_update()
113 sd_r1b = -1,
118 SD_TYPE_BC = 0, /* broadcast -- no response */
120 SD_TYPE_AC = 2, /* addressed -- no data transfer */
134 host->status |= 0x0001; in omap_mmc_command()
142 host->fifo_start = 0; in omap_mmc_command()
143 host->fifo_len = 0; in omap_mmc_command()
144 host->transfer = 1; in omap_mmc_command()
145 host->ddir = dir; in omap_mmc_command()
147 host->transfer = 0; in omap_mmc_command()
153 request.arg = host->arg; in omap_mmc_command()
156 rsplen = sd_do_command(host->card, &request, response); in omap_mmc_command()
177 if (host->sdio & (1 << 13)) in omap_mmc_command()
199 host->status &= 0xe000; in omap_mmc_command()
201 host->status |= 0x1000; in omap_mmc_command()
216 host->status |= 0x4000; in omap_mmc_command()
218 host->status &= 0xb000; in omap_mmc_command()
222 host->rsp[~rsplen & 7] = response[(rsplen << 1) | 1] | in omap_mmc_command()
226 host->status |= 0x0080; in omap_mmc_command()
227 else if (cmd == 12) in omap_mmc_command()
228 host->status |= 0x0005; /* Makes it more real */ in omap_mmc_command()
230 host->status |= 0x0001; in omap_mmc_command()
237 if (!host->transfer) in omap_mmc_transfer()
241 if (host->ddir) { in omap_mmc_transfer()
242 if (host->fifo_len > host->af_level) in omap_mmc_transfer()
245 value = sd_read_byte(host->card); in omap_mmc_transfer()
246 host->fifo[(host->fifo_start + host->fifo_len) & 31] = value; in omap_mmc_transfer()
247 if (-- host->blen_counter) { in omap_mmc_transfer()
248 value = sd_read_byte(host->card); in omap_mmc_transfer()
249 host->fifo[(host->fifo_start + host->fifo_len) & 31] |= in omap_mmc_transfer()
251 host->blen_counter --; in omap_mmc_transfer()
254 host->fifo_len ++; in omap_mmc_transfer()
256 if (!host->fifo_len) in omap_mmc_transfer()
259 value = host->fifo[host->fifo_start] & 0xff; in omap_mmc_transfer()
260 sd_write_byte(host->card, value); in omap_mmc_transfer()
261 if (-- host->blen_counter) { in omap_mmc_transfer()
262 value = host->fifo[host->fifo_start] >> 8; in omap_mmc_transfer()
263 sd_write_byte(host->card, value); in omap_mmc_transfer()
264 host->blen_counter --; in omap_mmc_transfer()
267 host->fifo_start ++; in omap_mmc_transfer()
268 host->fifo_len --; in omap_mmc_transfer()
269 host->fifo_start &= 31; in omap_mmc_transfer()
272 if (host->blen_counter == 0) { in omap_mmc_transfer()
273 host->nblk_counter --; in omap_mmc_transfer()
274 host->blen_counter = host->blen; in omap_mmc_transfer()
276 if (host->nblk_counter == 0) { in omap_mmc_transfer()
277 host->nblk_counter = host->nblk; in omap_mmc_transfer()
278 host->transfer = 0; in omap_mmc_transfer()
279 host->status |= 0x0008; in omap_mmc_transfer()
296 host->status = 0; in omap_mmc_pseudo_reset()
297 host->fifo_len = 0; in omap_mmc_pseudo_reset()
302 host->last_cmd = 0; in omap_mmc_reset()
303 memset(host->rsp, 0, sizeof(host->rsp)); in omap_mmc_reset()
304 host->arg = 0; in omap_mmc_reset()
305 host->dw = 0; in omap_mmc_reset()
306 host->mode = 0; in omap_mmc_reset()
307 host->enable = 0; in omap_mmc_reset()
308 host->mask = 0; in omap_mmc_reset()
309 host->cto = 0; in omap_mmc_reset()
310 host->dto = 0; in omap_mmc_reset()
311 host->blen = 0; in omap_mmc_reset()
312 host->blen_counter = 0; in omap_mmc_reset()
313 host->nblk = 0; in omap_mmc_reset()
314 host->nblk_counter = 0; in omap_mmc_reset()
315 host->tx_dma = 0; in omap_mmc_reset()
316 host->rx_dma = 0; in omap_mmc_reset()
317 host->ae_level = 0x00; in omap_mmc_reset()
318 host->af_level = 0x1f; in omap_mmc_reset()
319 host->transfer = 0; in omap_mmc_reset()
320 host->cdet_wakeup = 0; in omap_mmc_reset()
321 host->cdet_enable = 0; in omap_mmc_reset()
322 qemu_set_irq(host->coverswitch, host->cdet_state); in omap_mmc_reset()
323 host->clkdiv = 0; in omap_mmc_reset()
331 device_cold_reset(DEVICE(host->card)); in omap_mmc_reset()
345 return s->last_cmd; in omap_mmc_read()
348 return s->arg & 0x0000ffff; in omap_mmc_read()
351 return s->arg >> 16; in omap_mmc_read()
354 return (s->dw << 15) | (s->mode << 12) | (s->enable << 11) | in omap_mmc_read()
355 (s->be << 10) | s->clkdiv; in omap_mmc_read()
358 return s->status; in omap_mmc_read()
361 return s->mask; in omap_mmc_read()
364 return s->cto; in omap_mmc_read()
367 return s->dto; in omap_mmc_read()
370 /* TODO: support 8-bit access */ in omap_mmc_read()
371 i = s->fifo[s->fifo_start]; in omap_mmc_read()
372 if (s->fifo_len == 0) { in omap_mmc_read()
376 s->fifo_start ++; in omap_mmc_read()
377 s->fifo_len --; in omap_mmc_read()
378 s->fifo_start &= 31; in omap_mmc_read()
385 return s->blen_counter; in omap_mmc_read()
388 return s->nblk_counter; in omap_mmc_read()
391 return (s->rx_dma << 15) | (s->af_level << 8) | in omap_mmc_read()
392 (s->tx_dma << 7) | s->ae_level; in omap_mmc_read()
397 return (s->cdet_wakeup << 2) | (s->cdet_enable) | s->sdio; in omap_mmc_read()
402 return s->rev; in omap_mmc_read()
412 return s->rsp[(offset - 0x40) >> 2]; in omap_mmc_read()
414 /* OMAP2-specific */ in omap_mmc_read()
439 if (!s->enable) in omap_mmc_write()
442 s->last_cmd = value; in omap_mmc_write()
444 s->rsp[i] = 0x0000; in omap_mmc_write()
446 (MMCCmdType)((value >> 12) & 3), in omap_mmc_write()
454 s->arg &= 0xffff0000; in omap_mmc_write()
455 s->arg |= 0x0000ffff & value; in omap_mmc_write()
459 s->arg &= 0x0000ffff; in omap_mmc_write()
460 s->arg |= value << 16; in omap_mmc_write()
464 s->dw = (value >> 15) & 1; in omap_mmc_write()
465 s->mode = (value >> 12) & 3; in omap_mmc_write()
466 s->enable = (value >> 11) & 1; in omap_mmc_write()
467 s->be = (value >> 10) & 1; in omap_mmc_write()
468 s->clkdiv = (value >> 0) & (s->rev >= 2 ? 0x3ff : 0xff); in omap_mmc_write()
469 if (s->mode != 0) { in omap_mmc_write()
471 "omap_mmc_wr: mode #%i unimplemented\n", s->mode); in omap_mmc_write()
473 if (s->be != 0) { in omap_mmc_write()
477 if (s->dw != 0 && s->lines < 4) in omap_mmc_write()
478 printf("4-bit SD bus enabled\n"); in omap_mmc_write()
479 if (!s->enable) in omap_mmc_write()
484 s->status &= ~value; in omap_mmc_write()
489 s->mask = value & 0x7fff; in omap_mmc_write()
494 s->cto = value & 0xff; in omap_mmc_write()
495 if (s->cto > 0xfd && s->rev <= 1) in omap_mmc_write()
500 s->dto = value & 0xffff; in omap_mmc_write()
504 /* TODO: support 8-bit access */ in omap_mmc_write()
505 if (s->fifo_len == 32) in omap_mmc_write()
507 s->fifo[(s->fifo_start + s->fifo_len) & 31] = value; in omap_mmc_write()
508 s->fifo_len ++; in omap_mmc_write()
515 s->blen = (value & 0x07ff) + 1; in omap_mmc_write()
516 s->blen_counter = s->blen; in omap_mmc_write()
520 s->nblk = (value & 0x07ff) + 1; in omap_mmc_write()
521 s->nblk_counter = s->nblk; in omap_mmc_write()
522 s->blen_counter = s->blen; in omap_mmc_write()
526 s->rx_dma = (value >> 15) & 1; in omap_mmc_write()
527 s->af_level = (value >> 8) & 0x1f; in omap_mmc_write()
528 s->tx_dma = (value >> 7) & 1; in omap_mmc_write()
529 s->ae_level = value & 0x1f; in omap_mmc_write()
531 if (s->rx_dma) in omap_mmc_write()
532 s->status &= 0xfbff; in omap_mmc_write()
533 if (s->tx_dma) in omap_mmc_write()
534 s->status &= 0xf7ff; in omap_mmc_write()
543 s->sdio = value & (s->rev >= 2 ? 0xfbf3 : 0x2020); in omap_mmc_write()
544 s->cdet_wakeup = (value >> 9) & 1; in omap_mmc_write()
545 s->cdet_enable = (value >> 2) & 1; in omap_mmc_write()
562 /* OMAP2-specific */ in omap_mmc_write()
593 s->irq = irq; in omap_mmc_init()
594 s->dma = dma; in omap_mmc_init()
595 s->clk = clk; in omap_mmc_init()
596 s->lines = 1; /* TODO: needs to be settable per-board */ in omap_mmc_init()
597 s->rev = 1; in omap_mmc_init()
599 memory_region_init_io(&s->iomem, NULL, &omap_mmc_ops, s, "omap.mmc", 0x800); in omap_mmc_init()
600 memory_region_add_subregion(sysmem, base, &s->iomem); in omap_mmc_init()
603 s->card = sd_init(blk, false); in omap_mmc_init()
604 if (s->card == NULL) { in omap_mmc_init()