static uint mmc_spi_writedata(struct mmc_spi_host *host, const void *xbuf, uint32_t bcnt, uint32_t bsize, int multi) { const uint8_t *buf = xbuf; uint8_t r1; uint16_t crc = 0; uint8_t tok[2]; int i; tok[0] = 0xff; tok[1] = multi ? SPI_TOKEN_MULTI_WRITE : SPI_TOKEN_SINGLE; while (bcnt--) { #ifdef CONFIG_MMC_SPI_CRC_ON crc = be16_to_cpu(cyg_crc16((u8 *)buf, bsize)); #endif mmc_spi_writebytes(host, 2, tok); mmc_spi_writebytes(host, bsize, (void *)buf); mmc_spi_writebytes(host, 2, &crc); for (i = 0; i < CTOUT; i++) { mmc_spi_readbytes(host, 1, &r1); if ((r1 & 0x11) == 0x01) /* response token */ break; } dev_dbg(host->dev,"%s : TOKEN%d RESP 0x%X\n", __func__, i, r1); if (SPI_MMC_RESPONSE_CODE(r1) == SPI_RESPONSE_ACCEPTED) { for (i = 0; i < WTOUT; i++) { /* wait busy */ mmc_spi_readbytes(host, 1, &r1); if (i && r1 == 0xff) { r1 = 0; break; } } if (i == WTOUT) { dev_dbg(host->dev, "%s: wtout %x\n", __func__, r1); r1 = R1_SPI_ERROR; break; } } else { dev_dbg(host->dev, "%s: err %x\n", __func__, r1); r1 = R1_SPI_COM_CRC; break; } buf += bsize; } if (multi && bcnt == -1) { /* stop multi write */ tok[1] = SPI_TOKEN_STOP_TRAN; mmc_spi_writebytes(host, 2, tok); for (i = 0; i < WTOUT; i++) { /* wait busy */ mmc_spi_readbytes(host, 1, &r1); if (i && r1 == 0xff) { r1 = 0; break; } } if (i == WTOUT) { dev_dbg(host->dev, "%s: wstop %x\n", __func__, r1); r1 = R1_SPI_ERROR; } } return r1; }
static uint mmc_spi_writedata(struct mmc *mmc, const void *xbuf, u32 bcnt, u32 bsize, int multi) { struct spi_slave *spi = mmc->priv; const u8 *buf = xbuf; u8 r1; u16 crc; u8 tok[2]; int i; tok[0] = 0xff; tok[1] = multi ? SPI_TOKEN_MULTI_WRITE : SPI_TOKEN_SINGLE; while (bcnt--) { #ifdef CONFIG_MMC_SPI_CRC_ON crc = cpu_to_be16(cyg_crc16((u8 *)buf, bsize)); #endif spi_xfer(spi, 2 * 8, tok, NULL, 0); spi_xfer(spi, bsize * 8, buf, NULL, 0); spi_xfer(spi, 2 * 8, &crc, NULL, 0); for (i = 0; i < CTOUT; i++) { spi_xfer(spi, 1 * 8, NULL, &r1, 0); if ((r1 & 0x10) == 0) /* response token */ break; } debug("%s:tok%d %x\n", __func__, i, r1); if (SPI_MMC_RESPONSE_CODE(r1) == SPI_RESPONSE_ACCEPTED) { for (i = 0; i < WTOUT; i++) { /* wait busy */ spi_xfer(spi, 1 * 8, NULL, &r1, 0); if (i && r1 == 0xff) { r1 = 0; break; } } if (i == WTOUT) { debug("%s:wtout %x\n", __func__, r1); r1 = R1_SPI_ERROR; break; } } else { debug("%s: err %x\n", __func__, r1); r1 = R1_SPI_COM_CRC; break; } buf += bsize; } if (multi && bcnt == -1) { /* stop multi write */ tok[1] = SPI_TOKEN_STOP_TRAN; spi_xfer(spi, 2 * 8, tok, NULL, 0); for (i = 0; i < WTOUT; i++) { /* wait busy */ spi_xfer(spi, 1 * 8, NULL, &r1, 0); if (i && r1 == 0xff) { r1 = 0; break; } } if (i == WTOUT) { debug("%s:wstop %x\n", __func__, r1); r1 = R1_SPI_ERROR; } } return r1; }