162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Access SD/MMC cards through SPI master controllers 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * (C) Copyright 2005, Intec Automation, 662306a36Sopenharmony_ci * Mike Lavender (mike@steroidmicros) 762306a36Sopenharmony_ci * (C) Copyright 2006-2007, David Brownell 862306a36Sopenharmony_ci * (C) Copyright 2007, Axis Communications, 962306a36Sopenharmony_ci * Hans-Peter Nilsson (hp@axis.com) 1062306a36Sopenharmony_ci * (C) Copyright 2007, ATRON electronic GmbH, 1162306a36Sopenharmony_ci * Jan Nikitenko <jan.nikitenko@gmail.com> 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci#include <linux/sched.h> 1462306a36Sopenharmony_ci#include <linux/delay.h> 1562306a36Sopenharmony_ci#include <linux/slab.h> 1662306a36Sopenharmony_ci#include <linux/module.h> 1762306a36Sopenharmony_ci#include <linux/bio.h> 1862306a36Sopenharmony_ci#include <linux/dma-direction.h> 1962306a36Sopenharmony_ci#include <linux/crc7.h> 2062306a36Sopenharmony_ci#include <linux/crc-itu-t.h> 2162306a36Sopenharmony_ci#include <linux/scatterlist.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <linux/mmc/host.h> 2462306a36Sopenharmony_ci#include <linux/mmc/mmc.h> /* for R1_SPI_* bit values */ 2562306a36Sopenharmony_ci#include <linux/mmc/slot-gpio.h> 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#include <linux/spi/spi.h> 2862306a36Sopenharmony_ci#include <linux/spi/mmc_spi.h> 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#include <asm/unaligned.h> 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci/* NOTES: 3462306a36Sopenharmony_ci * 3562306a36Sopenharmony_ci * - For now, we won't try to interoperate with a real mmc/sd/sdio 3662306a36Sopenharmony_ci * controller, although some of them do have hardware support for 3762306a36Sopenharmony_ci * SPI protocol. The main reason for such configs would be mmc-ish 3862306a36Sopenharmony_ci * cards like DataFlash, which don't support that "native" protocol. 3962306a36Sopenharmony_ci * 4062306a36Sopenharmony_ci * We don't have a "DataFlash/MMC/SD/SDIO card slot" abstraction to 4162306a36Sopenharmony_ci * switch between driver stacks, and in any case if "native" mode 4262306a36Sopenharmony_ci * is available, it will be faster and hence preferable. 4362306a36Sopenharmony_ci * 4462306a36Sopenharmony_ci * - MMC depends on a different chipselect management policy than the 4562306a36Sopenharmony_ci * SPI interface currently supports for shared bus segments: it needs 4662306a36Sopenharmony_ci * to issue multiple spi_message requests with the chipselect active, 4762306a36Sopenharmony_ci * using the results of one message to decide the next one to issue. 4862306a36Sopenharmony_ci * 4962306a36Sopenharmony_ci * Pending updates to the programming interface, this driver expects 5062306a36Sopenharmony_ci * that it not share the bus with other drivers (precluding conflicts). 5162306a36Sopenharmony_ci * 5262306a36Sopenharmony_ci * - We tell the controller to keep the chipselect active from the 5362306a36Sopenharmony_ci * beginning of an mmc_host_ops.request until the end. So beware 5462306a36Sopenharmony_ci * of SPI controller drivers that mis-handle the cs_change flag! 5562306a36Sopenharmony_ci * 5662306a36Sopenharmony_ci * However, many cards seem OK with chipselect flapping up/down 5762306a36Sopenharmony_ci * during that time ... at least on unshared bus segments. 5862306a36Sopenharmony_ci */ 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* 6262306a36Sopenharmony_ci * Local protocol constants, internal to data block protocols. 6362306a36Sopenharmony_ci */ 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/* Response tokens used to ack each block written: */ 6662306a36Sopenharmony_ci#define SPI_MMC_RESPONSE_CODE(x) ((x) & 0x1f) 6762306a36Sopenharmony_ci#define SPI_RESPONSE_ACCEPTED ((2 << 1)|1) 6862306a36Sopenharmony_ci#define SPI_RESPONSE_CRC_ERR ((5 << 1)|1) 6962306a36Sopenharmony_ci#define SPI_RESPONSE_WRITE_ERR ((6 << 1)|1) 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* Read and write blocks start with these tokens and end with crc; 7262306a36Sopenharmony_ci * on error, read tokens act like a subset of R2_SPI_* values. 7362306a36Sopenharmony_ci */ 7462306a36Sopenharmony_ci#define SPI_TOKEN_SINGLE 0xfe /* single block r/w, multiblock read */ 7562306a36Sopenharmony_ci#define SPI_TOKEN_MULTI_WRITE 0xfc /* multiblock write */ 7662306a36Sopenharmony_ci#define SPI_TOKEN_STOP_TRAN 0xfd /* terminate multiblock write */ 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#define MMC_SPI_BLOCKSIZE 512 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#define MMC_SPI_R1B_TIMEOUT_MS 3000 8162306a36Sopenharmony_ci#define MMC_SPI_INIT_TIMEOUT_MS 3000 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* One of the critical speed parameters is the amount of data which may 8462306a36Sopenharmony_ci * be transferred in one command. If this value is too low, the SD card 8562306a36Sopenharmony_ci * controller has to do multiple partial block writes (argggh!). With 8662306a36Sopenharmony_ci * today (2008) SD cards there is little speed gain if we transfer more 8762306a36Sopenharmony_ci * than 64 KBytes at a time. So use this value until there is any indication 8862306a36Sopenharmony_ci * that we should do more here. 8962306a36Sopenharmony_ci */ 9062306a36Sopenharmony_ci#define MMC_SPI_BLOCKSATONCE 128 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci/****************************************************************************/ 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/* 9562306a36Sopenharmony_ci * Local Data Structures 9662306a36Sopenharmony_ci */ 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/* "scratch" is per-{command,block} data exchanged with the card */ 9962306a36Sopenharmony_cistruct scratch { 10062306a36Sopenharmony_ci u8 status[29]; 10162306a36Sopenharmony_ci u8 data_token; 10262306a36Sopenharmony_ci __be16 crc_val; 10362306a36Sopenharmony_ci}; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistruct mmc_spi_host { 10662306a36Sopenharmony_ci struct mmc_host *mmc; 10762306a36Sopenharmony_ci struct spi_device *spi; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci unsigned char power_mode; 11062306a36Sopenharmony_ci u16 powerup_msecs; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci struct mmc_spi_platform_data *pdata; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci /* for bulk data transfers */ 11562306a36Sopenharmony_ci struct spi_transfer token, t, crc, early_status; 11662306a36Sopenharmony_ci struct spi_message m; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci /* for status readback */ 11962306a36Sopenharmony_ci struct spi_transfer status; 12062306a36Sopenharmony_ci struct spi_message readback; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci /* buffer used for commands and for message "overhead" */ 12362306a36Sopenharmony_ci struct scratch *data; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci /* Specs say to write ones most of the time, even when the card 12662306a36Sopenharmony_ci * has no need to read its input data; and many cards won't care. 12762306a36Sopenharmony_ci * This is our source of those ones. 12862306a36Sopenharmony_ci */ 12962306a36Sopenharmony_ci void *ones; 13062306a36Sopenharmony_ci}; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci/****************************************************************************/ 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci/* 13662306a36Sopenharmony_ci * MMC-over-SPI protocol glue, used by the MMC stack interface 13762306a36Sopenharmony_ci */ 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistatic inline int mmc_cs_off(struct mmc_spi_host *host) 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci /* chipselect will always be inactive after setup() */ 14262306a36Sopenharmony_ci return spi_setup(host->spi); 14362306a36Sopenharmony_ci} 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistatic int mmc_spi_readbytes(struct mmc_spi_host *host, unsigned int len) 14662306a36Sopenharmony_ci{ 14762306a36Sopenharmony_ci if (len > sizeof(*host->data)) { 14862306a36Sopenharmony_ci WARN_ON(1); 14962306a36Sopenharmony_ci return -EIO; 15062306a36Sopenharmony_ci } 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci host->status.len = len; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci return spi_sync_locked(host->spi, &host->readback); 15562306a36Sopenharmony_ci} 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistatic int mmc_spi_skip(struct mmc_spi_host *host, unsigned long timeout, 15862306a36Sopenharmony_ci unsigned n, u8 byte) 15962306a36Sopenharmony_ci{ 16062306a36Sopenharmony_ci u8 *cp = host->data->status; 16162306a36Sopenharmony_ci unsigned long start = jiffies; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci do { 16462306a36Sopenharmony_ci int status; 16562306a36Sopenharmony_ci unsigned i; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci status = mmc_spi_readbytes(host, n); 16862306a36Sopenharmony_ci if (status < 0) 16962306a36Sopenharmony_ci return status; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci for (i = 0; i < n; i++) { 17262306a36Sopenharmony_ci if (cp[i] != byte) 17362306a36Sopenharmony_ci return cp[i]; 17462306a36Sopenharmony_ci } 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci /* If we need long timeouts, we may release the CPU */ 17762306a36Sopenharmony_ci cond_resched(); 17862306a36Sopenharmony_ci } while (time_is_after_jiffies(start + timeout)); 17962306a36Sopenharmony_ci return -ETIMEDOUT; 18062306a36Sopenharmony_ci} 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistatic inline int 18362306a36Sopenharmony_cimmc_spi_wait_unbusy(struct mmc_spi_host *host, unsigned long timeout) 18462306a36Sopenharmony_ci{ 18562306a36Sopenharmony_ci return mmc_spi_skip(host, timeout, sizeof(host->data->status), 0); 18662306a36Sopenharmony_ci} 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistatic int mmc_spi_readtoken(struct mmc_spi_host *host, unsigned long timeout) 18962306a36Sopenharmony_ci{ 19062306a36Sopenharmony_ci return mmc_spi_skip(host, timeout, 1, 0xff); 19162306a36Sopenharmony_ci} 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci/* 19562306a36Sopenharmony_ci * Note that for SPI, cmd->resp[0] is not the same data as "native" protocol 19662306a36Sopenharmony_ci * hosts return! The low byte holds R1_SPI bits. The next byte may hold 19762306a36Sopenharmony_ci * R2_SPI bits ... for SEND_STATUS, or after data read errors. 19862306a36Sopenharmony_ci * 19962306a36Sopenharmony_ci * cmd->resp[1] holds any four-byte response, for R3 (READ_OCR) and on 20062306a36Sopenharmony_ci * newer cards R7 (IF_COND). 20162306a36Sopenharmony_ci */ 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cistatic char *maptype(struct mmc_command *cmd) 20462306a36Sopenharmony_ci{ 20562306a36Sopenharmony_ci switch (mmc_spi_resp_type(cmd)) { 20662306a36Sopenharmony_ci case MMC_RSP_SPI_R1: return "R1"; 20762306a36Sopenharmony_ci case MMC_RSP_SPI_R1B: return "R1B"; 20862306a36Sopenharmony_ci case MMC_RSP_SPI_R2: return "R2/R5"; 20962306a36Sopenharmony_ci case MMC_RSP_SPI_R3: return "R3/R4/R7"; 21062306a36Sopenharmony_ci default: return "?"; 21162306a36Sopenharmony_ci } 21262306a36Sopenharmony_ci} 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci/* return zero, else negative errno after setting cmd->error */ 21562306a36Sopenharmony_cistatic int mmc_spi_response_get(struct mmc_spi_host *host, 21662306a36Sopenharmony_ci struct mmc_command *cmd, int cs_on) 21762306a36Sopenharmony_ci{ 21862306a36Sopenharmony_ci unsigned long timeout_ms; 21962306a36Sopenharmony_ci u8 *cp = host->data->status; 22062306a36Sopenharmony_ci u8 *end = cp + host->t.len; 22162306a36Sopenharmony_ci int value = 0; 22262306a36Sopenharmony_ci int bitshift; 22362306a36Sopenharmony_ci u8 leftover = 0; 22462306a36Sopenharmony_ci unsigned short rotator; 22562306a36Sopenharmony_ci int i; 22662306a36Sopenharmony_ci char tag[32]; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci snprintf(tag, sizeof(tag), " ... CMD%d response SPI_%s", 22962306a36Sopenharmony_ci cmd->opcode, maptype(cmd)); 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci /* Except for data block reads, the whole response will already 23262306a36Sopenharmony_ci * be stored in the scratch buffer. It's somewhere after the 23362306a36Sopenharmony_ci * command and the first byte we read after it. We ignore that 23462306a36Sopenharmony_ci * first byte. After STOP_TRANSMISSION command it may include 23562306a36Sopenharmony_ci * two data bits, but otherwise it's all ones. 23662306a36Sopenharmony_ci */ 23762306a36Sopenharmony_ci cp += 8; 23862306a36Sopenharmony_ci while (cp < end && *cp == 0xff) 23962306a36Sopenharmony_ci cp++; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci /* Data block reads (R1 response types) may need more data... */ 24262306a36Sopenharmony_ci if (cp == end) { 24362306a36Sopenharmony_ci cp = host->data->status; 24462306a36Sopenharmony_ci end = cp+1; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci /* Card sends N(CR) (== 1..8) bytes of all-ones then one 24762306a36Sopenharmony_ci * status byte ... and we already scanned 2 bytes. 24862306a36Sopenharmony_ci * 24962306a36Sopenharmony_ci * REVISIT block read paths use nasty byte-at-a-time I/O 25062306a36Sopenharmony_ci * so it can always DMA directly into the target buffer. 25162306a36Sopenharmony_ci * It'd probably be better to memcpy() the first chunk and 25262306a36Sopenharmony_ci * avoid extra i/o calls... 25362306a36Sopenharmony_ci * 25462306a36Sopenharmony_ci * Note we check for more than 8 bytes, because in practice, 25562306a36Sopenharmony_ci * some SD cards are slow... 25662306a36Sopenharmony_ci */ 25762306a36Sopenharmony_ci for (i = 2; i < 16; i++) { 25862306a36Sopenharmony_ci value = mmc_spi_readbytes(host, 1); 25962306a36Sopenharmony_ci if (value < 0) 26062306a36Sopenharmony_ci goto done; 26162306a36Sopenharmony_ci if (*cp != 0xff) 26262306a36Sopenharmony_ci goto checkstatus; 26362306a36Sopenharmony_ci } 26462306a36Sopenharmony_ci value = -ETIMEDOUT; 26562306a36Sopenharmony_ci goto done; 26662306a36Sopenharmony_ci } 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_cicheckstatus: 26962306a36Sopenharmony_ci bitshift = 0; 27062306a36Sopenharmony_ci if (*cp & 0x80) { 27162306a36Sopenharmony_ci /* Houston, we have an ugly card with a bit-shifted response */ 27262306a36Sopenharmony_ci rotator = *cp++ << 8; 27362306a36Sopenharmony_ci /* read the next byte */ 27462306a36Sopenharmony_ci if (cp == end) { 27562306a36Sopenharmony_ci value = mmc_spi_readbytes(host, 1); 27662306a36Sopenharmony_ci if (value < 0) 27762306a36Sopenharmony_ci goto done; 27862306a36Sopenharmony_ci cp = host->data->status; 27962306a36Sopenharmony_ci end = cp+1; 28062306a36Sopenharmony_ci } 28162306a36Sopenharmony_ci rotator |= *cp++; 28262306a36Sopenharmony_ci while (rotator & 0x8000) { 28362306a36Sopenharmony_ci bitshift++; 28462306a36Sopenharmony_ci rotator <<= 1; 28562306a36Sopenharmony_ci } 28662306a36Sopenharmony_ci cmd->resp[0] = rotator >> 8; 28762306a36Sopenharmony_ci leftover = rotator; 28862306a36Sopenharmony_ci } else { 28962306a36Sopenharmony_ci cmd->resp[0] = *cp++; 29062306a36Sopenharmony_ci } 29162306a36Sopenharmony_ci cmd->error = 0; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci /* Status byte: the entire seven-bit R1 response. */ 29462306a36Sopenharmony_ci if (cmd->resp[0] != 0) { 29562306a36Sopenharmony_ci if ((R1_SPI_PARAMETER | R1_SPI_ADDRESS) 29662306a36Sopenharmony_ci & cmd->resp[0]) 29762306a36Sopenharmony_ci value = -EFAULT; /* Bad address */ 29862306a36Sopenharmony_ci else if (R1_SPI_ILLEGAL_COMMAND & cmd->resp[0]) 29962306a36Sopenharmony_ci value = -ENOSYS; /* Function not implemented */ 30062306a36Sopenharmony_ci else if (R1_SPI_COM_CRC & cmd->resp[0]) 30162306a36Sopenharmony_ci value = -EILSEQ; /* Illegal byte sequence */ 30262306a36Sopenharmony_ci else if ((R1_SPI_ERASE_SEQ | R1_SPI_ERASE_RESET) 30362306a36Sopenharmony_ci & cmd->resp[0]) 30462306a36Sopenharmony_ci value = -EIO; /* I/O error */ 30562306a36Sopenharmony_ci /* else R1_SPI_IDLE, "it's resetting" */ 30662306a36Sopenharmony_ci } 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci switch (mmc_spi_resp_type(cmd)) { 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci /* SPI R1B == R1 + busy; STOP_TRANSMISSION (for multiblock reads) 31162306a36Sopenharmony_ci * and less-common stuff like various erase operations. 31262306a36Sopenharmony_ci */ 31362306a36Sopenharmony_ci case MMC_RSP_SPI_R1B: 31462306a36Sopenharmony_ci /* maybe we read all the busy tokens already */ 31562306a36Sopenharmony_ci while (cp < end && *cp == 0) 31662306a36Sopenharmony_ci cp++; 31762306a36Sopenharmony_ci if (cp == end) { 31862306a36Sopenharmony_ci timeout_ms = cmd->busy_timeout ? cmd->busy_timeout : 31962306a36Sopenharmony_ci MMC_SPI_R1B_TIMEOUT_MS; 32062306a36Sopenharmony_ci mmc_spi_wait_unbusy(host, msecs_to_jiffies(timeout_ms)); 32162306a36Sopenharmony_ci } 32262306a36Sopenharmony_ci break; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci /* SPI R2 == R1 + second status byte; SEND_STATUS 32562306a36Sopenharmony_ci * SPI R5 == R1 + data byte; IO_RW_DIRECT 32662306a36Sopenharmony_ci */ 32762306a36Sopenharmony_ci case MMC_RSP_SPI_R2: 32862306a36Sopenharmony_ci /* read the next byte */ 32962306a36Sopenharmony_ci if (cp == end) { 33062306a36Sopenharmony_ci value = mmc_spi_readbytes(host, 1); 33162306a36Sopenharmony_ci if (value < 0) 33262306a36Sopenharmony_ci goto done; 33362306a36Sopenharmony_ci cp = host->data->status; 33462306a36Sopenharmony_ci end = cp+1; 33562306a36Sopenharmony_ci } 33662306a36Sopenharmony_ci if (bitshift) { 33762306a36Sopenharmony_ci rotator = leftover << 8; 33862306a36Sopenharmony_ci rotator |= *cp << bitshift; 33962306a36Sopenharmony_ci cmd->resp[0] |= (rotator & 0xFF00); 34062306a36Sopenharmony_ci } else { 34162306a36Sopenharmony_ci cmd->resp[0] |= *cp << 8; 34262306a36Sopenharmony_ci } 34362306a36Sopenharmony_ci break; 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci /* SPI R3, R4, or R7 == R1 + 4 bytes */ 34662306a36Sopenharmony_ci case MMC_RSP_SPI_R3: 34762306a36Sopenharmony_ci rotator = leftover << 8; 34862306a36Sopenharmony_ci cmd->resp[1] = 0; 34962306a36Sopenharmony_ci for (i = 0; i < 4; i++) { 35062306a36Sopenharmony_ci cmd->resp[1] <<= 8; 35162306a36Sopenharmony_ci /* read the next byte */ 35262306a36Sopenharmony_ci if (cp == end) { 35362306a36Sopenharmony_ci value = mmc_spi_readbytes(host, 1); 35462306a36Sopenharmony_ci if (value < 0) 35562306a36Sopenharmony_ci goto done; 35662306a36Sopenharmony_ci cp = host->data->status; 35762306a36Sopenharmony_ci end = cp+1; 35862306a36Sopenharmony_ci } 35962306a36Sopenharmony_ci if (bitshift) { 36062306a36Sopenharmony_ci rotator |= *cp++ << bitshift; 36162306a36Sopenharmony_ci cmd->resp[1] |= (rotator >> 8); 36262306a36Sopenharmony_ci rotator <<= 8; 36362306a36Sopenharmony_ci } else { 36462306a36Sopenharmony_ci cmd->resp[1] |= *cp++; 36562306a36Sopenharmony_ci } 36662306a36Sopenharmony_ci } 36762306a36Sopenharmony_ci break; 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci /* SPI R1 == just one status byte */ 37062306a36Sopenharmony_ci case MMC_RSP_SPI_R1: 37162306a36Sopenharmony_ci break; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci default: 37462306a36Sopenharmony_ci dev_dbg(&host->spi->dev, "bad response type %04x\n", 37562306a36Sopenharmony_ci mmc_spi_resp_type(cmd)); 37662306a36Sopenharmony_ci if (value >= 0) 37762306a36Sopenharmony_ci value = -EINVAL; 37862306a36Sopenharmony_ci goto done; 37962306a36Sopenharmony_ci } 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci if (value < 0) 38262306a36Sopenharmony_ci dev_dbg(&host->spi->dev, "%s: resp %04x %08x\n", 38362306a36Sopenharmony_ci tag, cmd->resp[0], cmd->resp[1]); 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci /* disable chipselect on errors and some success cases */ 38662306a36Sopenharmony_ci if (value >= 0 && cs_on) 38762306a36Sopenharmony_ci return value; 38862306a36Sopenharmony_cidone: 38962306a36Sopenharmony_ci if (value < 0) 39062306a36Sopenharmony_ci cmd->error = value; 39162306a36Sopenharmony_ci mmc_cs_off(host); 39262306a36Sopenharmony_ci return value; 39362306a36Sopenharmony_ci} 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci/* Issue command and read its response. 39662306a36Sopenharmony_ci * Returns zero on success, negative for error. 39762306a36Sopenharmony_ci * 39862306a36Sopenharmony_ci * On error, caller must cope with mmc core retry mechanism. That 39962306a36Sopenharmony_ci * means immediate low-level resubmit, which affects the bus lock... 40062306a36Sopenharmony_ci */ 40162306a36Sopenharmony_cistatic int 40262306a36Sopenharmony_cimmc_spi_command_send(struct mmc_spi_host *host, 40362306a36Sopenharmony_ci struct mmc_request *mrq, 40462306a36Sopenharmony_ci struct mmc_command *cmd, int cs_on) 40562306a36Sopenharmony_ci{ 40662306a36Sopenharmony_ci struct scratch *data = host->data; 40762306a36Sopenharmony_ci u8 *cp = data->status; 40862306a36Sopenharmony_ci int status; 40962306a36Sopenharmony_ci struct spi_transfer *t; 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci /* We can handle most commands (except block reads) in one full 41262306a36Sopenharmony_ci * duplex I/O operation before either starting the next transfer 41362306a36Sopenharmony_ci * (data block or command) or else deselecting the card. 41462306a36Sopenharmony_ci * 41562306a36Sopenharmony_ci * First, write 7 bytes: 41662306a36Sopenharmony_ci * - an all-ones byte to ensure the card is ready 41762306a36Sopenharmony_ci * - opcode byte (plus start and transmission bits) 41862306a36Sopenharmony_ci * - four bytes of big-endian argument 41962306a36Sopenharmony_ci * - crc7 (plus end bit) ... always computed, it's cheap 42062306a36Sopenharmony_ci * 42162306a36Sopenharmony_ci * We init the whole buffer to all-ones, which is what we need 42262306a36Sopenharmony_ci * to write while we're reading (later) response data. 42362306a36Sopenharmony_ci */ 42462306a36Sopenharmony_ci memset(cp, 0xff, sizeof(data->status)); 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci cp[1] = 0x40 | cmd->opcode; 42762306a36Sopenharmony_ci put_unaligned_be32(cmd->arg, cp + 2); 42862306a36Sopenharmony_ci cp[6] = crc7_be(0, cp + 1, 5) | 0x01; 42962306a36Sopenharmony_ci cp += 7; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci /* Then, read up to 13 bytes (while writing all-ones): 43262306a36Sopenharmony_ci * - N(CR) (== 1..8) bytes of all-ones 43362306a36Sopenharmony_ci * - status byte (for all response types) 43462306a36Sopenharmony_ci * - the rest of the response, either: 43562306a36Sopenharmony_ci * + nothing, for R1 or R1B responses 43662306a36Sopenharmony_ci * + second status byte, for R2 responses 43762306a36Sopenharmony_ci * + four data bytes, for R3 and R7 responses 43862306a36Sopenharmony_ci * 43962306a36Sopenharmony_ci * Finally, read some more bytes ... in the nice cases we know in 44062306a36Sopenharmony_ci * advance how many, and reading 1 more is always OK: 44162306a36Sopenharmony_ci * - N(EC) (== 0..N) bytes of all-ones, before deselect/finish 44262306a36Sopenharmony_ci * - N(RC) (== 1..N) bytes of all-ones, before next command 44362306a36Sopenharmony_ci * - N(WR) (== 1..N) bytes of all-ones, before data write 44462306a36Sopenharmony_ci * 44562306a36Sopenharmony_ci * So in those cases one full duplex I/O of at most 21 bytes will 44662306a36Sopenharmony_ci * handle the whole command, leaving the card ready to receive a 44762306a36Sopenharmony_ci * data block or new command. We do that whenever we can, shaving 44862306a36Sopenharmony_ci * CPU and IRQ costs (especially when using DMA or FIFOs). 44962306a36Sopenharmony_ci * 45062306a36Sopenharmony_ci * There are two other cases, where it's not generally practical 45162306a36Sopenharmony_ci * to rely on a single I/O: 45262306a36Sopenharmony_ci * 45362306a36Sopenharmony_ci * - R1B responses need at least N(EC) bytes of all-zeroes. 45462306a36Sopenharmony_ci * 45562306a36Sopenharmony_ci * In this case we can *try* to fit it into one I/O, then 45662306a36Sopenharmony_ci * maybe read more data later. 45762306a36Sopenharmony_ci * 45862306a36Sopenharmony_ci * - Data block reads are more troublesome, since a variable 45962306a36Sopenharmony_ci * number of padding bytes precede the token and data. 46062306a36Sopenharmony_ci * + N(CX) (== 0..8) bytes of all-ones, before CSD or CID 46162306a36Sopenharmony_ci * + N(AC) (== 1..many) bytes of all-ones 46262306a36Sopenharmony_ci * 46362306a36Sopenharmony_ci * In this case we currently only have minimal speedups here: 46462306a36Sopenharmony_ci * when N(CR) == 1 we can avoid I/O in response_get(). 46562306a36Sopenharmony_ci */ 46662306a36Sopenharmony_ci if (cs_on && (mrq->data->flags & MMC_DATA_READ)) { 46762306a36Sopenharmony_ci cp += 2; /* min(N(CR)) + status */ 46862306a36Sopenharmony_ci /* R1 */ 46962306a36Sopenharmony_ci } else { 47062306a36Sopenharmony_ci cp += 10; /* max(N(CR)) + status + min(N(RC),N(WR)) */ 47162306a36Sopenharmony_ci if (cmd->flags & MMC_RSP_SPI_S2) /* R2/R5 */ 47262306a36Sopenharmony_ci cp++; 47362306a36Sopenharmony_ci else if (cmd->flags & MMC_RSP_SPI_B4) /* R3/R4/R7 */ 47462306a36Sopenharmony_ci cp += 4; 47562306a36Sopenharmony_ci else if (cmd->flags & MMC_RSP_BUSY) /* R1B */ 47662306a36Sopenharmony_ci cp = data->status + sizeof(data->status); 47762306a36Sopenharmony_ci /* else: R1 (most commands) */ 47862306a36Sopenharmony_ci } 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci dev_dbg(&host->spi->dev, " CMD%d, resp %s\n", 48162306a36Sopenharmony_ci cmd->opcode, maptype(cmd)); 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci /* send command, leaving chipselect active */ 48462306a36Sopenharmony_ci spi_message_init(&host->m); 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_ci t = &host->t; 48762306a36Sopenharmony_ci memset(t, 0, sizeof(*t)); 48862306a36Sopenharmony_ci t->tx_buf = t->rx_buf = data->status; 48962306a36Sopenharmony_ci t->len = cp - data->status; 49062306a36Sopenharmony_ci t->cs_change = 1; 49162306a36Sopenharmony_ci spi_message_add_tail(t, &host->m); 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci status = spi_sync_locked(host->spi, &host->m); 49462306a36Sopenharmony_ci if (status < 0) { 49562306a36Sopenharmony_ci dev_dbg(&host->spi->dev, " ... write returned %d\n", status); 49662306a36Sopenharmony_ci cmd->error = status; 49762306a36Sopenharmony_ci return status; 49862306a36Sopenharmony_ci } 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci /* after no-data commands and STOP_TRANSMISSION, chipselect off */ 50162306a36Sopenharmony_ci return mmc_spi_response_get(host, cmd, cs_on); 50262306a36Sopenharmony_ci} 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci/* Build data message with up to four separate transfers. For TX, we 50562306a36Sopenharmony_ci * start by writing the data token. And in most cases, we finish with 50662306a36Sopenharmony_ci * a status transfer. 50762306a36Sopenharmony_ci * 50862306a36Sopenharmony_ci * We always provide TX data for data and CRC. The MMC/SD protocol 50962306a36Sopenharmony_ci * requires us to write ones; but Linux defaults to writing zeroes; 51062306a36Sopenharmony_ci * so we explicitly initialize it to all ones on RX paths. 51162306a36Sopenharmony_ci */ 51262306a36Sopenharmony_cistatic void 51362306a36Sopenharmony_cimmc_spi_setup_data_message( 51462306a36Sopenharmony_ci struct mmc_spi_host *host, 51562306a36Sopenharmony_ci bool multiple, 51662306a36Sopenharmony_ci enum dma_data_direction direction) 51762306a36Sopenharmony_ci{ 51862306a36Sopenharmony_ci struct spi_transfer *t; 51962306a36Sopenharmony_ci struct scratch *scratch = host->data; 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_ci spi_message_init(&host->m); 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci /* for reads, readblock() skips 0xff bytes before finding 52462306a36Sopenharmony_ci * the token; for writes, this transfer issues that token. 52562306a36Sopenharmony_ci */ 52662306a36Sopenharmony_ci if (direction == DMA_TO_DEVICE) { 52762306a36Sopenharmony_ci t = &host->token; 52862306a36Sopenharmony_ci memset(t, 0, sizeof(*t)); 52962306a36Sopenharmony_ci t->len = 1; 53062306a36Sopenharmony_ci if (multiple) 53162306a36Sopenharmony_ci scratch->data_token = SPI_TOKEN_MULTI_WRITE; 53262306a36Sopenharmony_ci else 53362306a36Sopenharmony_ci scratch->data_token = SPI_TOKEN_SINGLE; 53462306a36Sopenharmony_ci t->tx_buf = &scratch->data_token; 53562306a36Sopenharmony_ci spi_message_add_tail(t, &host->m); 53662306a36Sopenharmony_ci } 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_ci /* Body of transfer is buffer, then CRC ... 53962306a36Sopenharmony_ci * either TX-only, or RX with TX-ones. 54062306a36Sopenharmony_ci */ 54162306a36Sopenharmony_ci t = &host->t; 54262306a36Sopenharmony_ci memset(t, 0, sizeof(*t)); 54362306a36Sopenharmony_ci t->tx_buf = host->ones; 54462306a36Sopenharmony_ci /* length and actual buffer info are written later */ 54562306a36Sopenharmony_ci spi_message_add_tail(t, &host->m); 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci t = &host->crc; 54862306a36Sopenharmony_ci memset(t, 0, sizeof(*t)); 54962306a36Sopenharmony_ci t->len = 2; 55062306a36Sopenharmony_ci if (direction == DMA_TO_DEVICE) { 55162306a36Sopenharmony_ci /* the actual CRC may get written later */ 55262306a36Sopenharmony_ci t->tx_buf = &scratch->crc_val; 55362306a36Sopenharmony_ci } else { 55462306a36Sopenharmony_ci t->tx_buf = host->ones; 55562306a36Sopenharmony_ci t->rx_buf = &scratch->crc_val; 55662306a36Sopenharmony_ci } 55762306a36Sopenharmony_ci spi_message_add_tail(t, &host->m); 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_ci /* 56062306a36Sopenharmony_ci * A single block read is followed by N(EC) [0+] all-ones bytes 56162306a36Sopenharmony_ci * before deselect ... don't bother. 56262306a36Sopenharmony_ci * 56362306a36Sopenharmony_ci * Multiblock reads are followed by N(AC) [1+] all-ones bytes before 56462306a36Sopenharmony_ci * the next block is read, or a STOP_TRANSMISSION is issued. We'll 56562306a36Sopenharmony_ci * collect that single byte, so readblock() doesn't need to. 56662306a36Sopenharmony_ci * 56762306a36Sopenharmony_ci * For a write, the one-byte data response follows immediately, then 56862306a36Sopenharmony_ci * come zero or more busy bytes, then N(WR) [1+] all-ones bytes. 56962306a36Sopenharmony_ci * Then single block reads may deselect, and multiblock ones issue 57062306a36Sopenharmony_ci * the next token (next data block, or STOP_TRAN). We can try to 57162306a36Sopenharmony_ci * minimize I/O ops by using a single read to collect end-of-busy. 57262306a36Sopenharmony_ci */ 57362306a36Sopenharmony_ci if (multiple || direction == DMA_TO_DEVICE) { 57462306a36Sopenharmony_ci t = &host->early_status; 57562306a36Sopenharmony_ci memset(t, 0, sizeof(*t)); 57662306a36Sopenharmony_ci t->len = (direction == DMA_TO_DEVICE) ? sizeof(scratch->status) : 1; 57762306a36Sopenharmony_ci t->tx_buf = host->ones; 57862306a36Sopenharmony_ci t->rx_buf = scratch->status; 57962306a36Sopenharmony_ci t->cs_change = 1; 58062306a36Sopenharmony_ci spi_message_add_tail(t, &host->m); 58162306a36Sopenharmony_ci } 58262306a36Sopenharmony_ci} 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_ci/* 58562306a36Sopenharmony_ci * Write one block: 58662306a36Sopenharmony_ci * - caller handled preceding N(WR) [1+] all-ones bytes 58762306a36Sopenharmony_ci * - data block 58862306a36Sopenharmony_ci * + token 58962306a36Sopenharmony_ci * + data bytes 59062306a36Sopenharmony_ci * + crc16 59162306a36Sopenharmony_ci * - an all-ones byte ... card writes a data-response byte 59262306a36Sopenharmony_ci * - followed by N(EC) [0+] all-ones bytes, card writes zero/'busy' 59362306a36Sopenharmony_ci * 59462306a36Sopenharmony_ci * Return negative errno, else success. 59562306a36Sopenharmony_ci */ 59662306a36Sopenharmony_cistatic int 59762306a36Sopenharmony_cimmc_spi_writeblock(struct mmc_spi_host *host, struct spi_transfer *t, 59862306a36Sopenharmony_ci unsigned long timeout) 59962306a36Sopenharmony_ci{ 60062306a36Sopenharmony_ci struct spi_device *spi = host->spi; 60162306a36Sopenharmony_ci int status, i; 60262306a36Sopenharmony_ci struct scratch *scratch = host->data; 60362306a36Sopenharmony_ci u32 pattern; 60462306a36Sopenharmony_ci 60562306a36Sopenharmony_ci if (host->mmc->use_spi_crc) 60662306a36Sopenharmony_ci scratch->crc_val = cpu_to_be16(crc_itu_t(0, t->tx_buf, t->len)); 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_ci status = spi_sync_locked(spi, &host->m); 60962306a36Sopenharmony_ci if (status != 0) { 61062306a36Sopenharmony_ci dev_dbg(&spi->dev, "write error (%d)\n", status); 61162306a36Sopenharmony_ci return status; 61262306a36Sopenharmony_ci } 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci /* 61562306a36Sopenharmony_ci * Get the transmission data-response reply. It must follow 61662306a36Sopenharmony_ci * immediately after the data block we transferred. This reply 61762306a36Sopenharmony_ci * doesn't necessarily tell whether the write operation succeeded; 61862306a36Sopenharmony_ci * it just says if the transmission was ok and whether *earlier* 61962306a36Sopenharmony_ci * writes succeeded; see the standard. 62062306a36Sopenharmony_ci * 62162306a36Sopenharmony_ci * In practice, there are (even modern SDHC-)cards which are late 62262306a36Sopenharmony_ci * in sending the response, and miss the time frame by a few bits, 62362306a36Sopenharmony_ci * so we have to cope with this situation and check the response 62462306a36Sopenharmony_ci * bit-by-bit. Arggh!!! 62562306a36Sopenharmony_ci */ 62662306a36Sopenharmony_ci pattern = get_unaligned_be32(scratch->status); 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_ci /* First 3 bit of pattern are undefined */ 62962306a36Sopenharmony_ci pattern |= 0xE0000000; 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci /* left-adjust to leading 0 bit */ 63262306a36Sopenharmony_ci while (pattern & 0x80000000) 63362306a36Sopenharmony_ci pattern <<= 1; 63462306a36Sopenharmony_ci /* right-adjust for pattern matching. Code is in bit 4..0 now. */ 63562306a36Sopenharmony_ci pattern >>= 27; 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ci switch (pattern) { 63862306a36Sopenharmony_ci case SPI_RESPONSE_ACCEPTED: 63962306a36Sopenharmony_ci status = 0; 64062306a36Sopenharmony_ci break; 64162306a36Sopenharmony_ci case SPI_RESPONSE_CRC_ERR: 64262306a36Sopenharmony_ci /* host shall then issue MMC_STOP_TRANSMISSION */ 64362306a36Sopenharmony_ci status = -EILSEQ; 64462306a36Sopenharmony_ci break; 64562306a36Sopenharmony_ci case SPI_RESPONSE_WRITE_ERR: 64662306a36Sopenharmony_ci /* host shall then issue MMC_STOP_TRANSMISSION, 64762306a36Sopenharmony_ci * and should MMC_SEND_STATUS to sort it out 64862306a36Sopenharmony_ci */ 64962306a36Sopenharmony_ci status = -EIO; 65062306a36Sopenharmony_ci break; 65162306a36Sopenharmony_ci default: 65262306a36Sopenharmony_ci status = -EPROTO; 65362306a36Sopenharmony_ci break; 65462306a36Sopenharmony_ci } 65562306a36Sopenharmony_ci if (status != 0) { 65662306a36Sopenharmony_ci dev_dbg(&spi->dev, "write error %02x (%d)\n", 65762306a36Sopenharmony_ci scratch->status[0], status); 65862306a36Sopenharmony_ci return status; 65962306a36Sopenharmony_ci } 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_ci t->tx_buf += t->len; 66262306a36Sopenharmony_ci 66362306a36Sopenharmony_ci /* Return when not busy. If we didn't collect that status yet, 66462306a36Sopenharmony_ci * we'll need some more I/O. 66562306a36Sopenharmony_ci */ 66662306a36Sopenharmony_ci for (i = 4; i < sizeof(scratch->status); i++) { 66762306a36Sopenharmony_ci /* card is non-busy if the most recent bit is 1 */ 66862306a36Sopenharmony_ci if (scratch->status[i] & 0x01) 66962306a36Sopenharmony_ci return 0; 67062306a36Sopenharmony_ci } 67162306a36Sopenharmony_ci return mmc_spi_wait_unbusy(host, timeout); 67262306a36Sopenharmony_ci} 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci/* 67562306a36Sopenharmony_ci * Read one block: 67662306a36Sopenharmony_ci * - skip leading all-ones bytes ... either 67762306a36Sopenharmony_ci * + N(AC) [1..f(clock,CSD)] usually, else 67862306a36Sopenharmony_ci * + N(CX) [0..8] when reading CSD or CID 67962306a36Sopenharmony_ci * - data block 68062306a36Sopenharmony_ci * + token ... if error token, no data or crc 68162306a36Sopenharmony_ci * + data bytes 68262306a36Sopenharmony_ci * + crc16 68362306a36Sopenharmony_ci * 68462306a36Sopenharmony_ci * After single block reads, we're done; N(EC) [0+] all-ones bytes follow 68562306a36Sopenharmony_ci * before dropping chipselect. 68662306a36Sopenharmony_ci * 68762306a36Sopenharmony_ci * For multiblock reads, caller either reads the next block or issues a 68862306a36Sopenharmony_ci * STOP_TRANSMISSION command. 68962306a36Sopenharmony_ci */ 69062306a36Sopenharmony_cistatic int 69162306a36Sopenharmony_cimmc_spi_readblock(struct mmc_spi_host *host, struct spi_transfer *t, 69262306a36Sopenharmony_ci unsigned long timeout) 69362306a36Sopenharmony_ci{ 69462306a36Sopenharmony_ci struct spi_device *spi = host->spi; 69562306a36Sopenharmony_ci int status; 69662306a36Sopenharmony_ci struct scratch *scratch = host->data; 69762306a36Sopenharmony_ci unsigned int bitshift; 69862306a36Sopenharmony_ci u8 leftover; 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_ci /* At least one SD card sends an all-zeroes byte when N(CX) 70162306a36Sopenharmony_ci * applies, before the all-ones bytes ... just cope with that. 70262306a36Sopenharmony_ci */ 70362306a36Sopenharmony_ci status = mmc_spi_readbytes(host, 1); 70462306a36Sopenharmony_ci if (status < 0) 70562306a36Sopenharmony_ci return status; 70662306a36Sopenharmony_ci status = scratch->status[0]; 70762306a36Sopenharmony_ci if (status == 0xff || status == 0) 70862306a36Sopenharmony_ci status = mmc_spi_readtoken(host, timeout); 70962306a36Sopenharmony_ci 71062306a36Sopenharmony_ci if (status < 0) { 71162306a36Sopenharmony_ci dev_dbg(&spi->dev, "read error %02x (%d)\n", status, status); 71262306a36Sopenharmony_ci return status; 71362306a36Sopenharmony_ci } 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci /* The token may be bit-shifted... 71662306a36Sopenharmony_ci * the first 0-bit precedes the data stream. 71762306a36Sopenharmony_ci */ 71862306a36Sopenharmony_ci bitshift = 7; 71962306a36Sopenharmony_ci while (status & 0x80) { 72062306a36Sopenharmony_ci status <<= 1; 72162306a36Sopenharmony_ci bitshift--; 72262306a36Sopenharmony_ci } 72362306a36Sopenharmony_ci leftover = status << 1; 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_ci status = spi_sync_locked(spi, &host->m); 72662306a36Sopenharmony_ci if (status < 0) { 72762306a36Sopenharmony_ci dev_dbg(&spi->dev, "read error %d\n", status); 72862306a36Sopenharmony_ci return status; 72962306a36Sopenharmony_ci } 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci if (bitshift) { 73262306a36Sopenharmony_ci /* Walk through the data and the crc and do 73362306a36Sopenharmony_ci * all the magic to get byte-aligned data. 73462306a36Sopenharmony_ci */ 73562306a36Sopenharmony_ci u8 *cp = t->rx_buf; 73662306a36Sopenharmony_ci unsigned int len; 73762306a36Sopenharmony_ci unsigned int bitright = 8 - bitshift; 73862306a36Sopenharmony_ci u8 temp; 73962306a36Sopenharmony_ci for (len = t->len; len; len--) { 74062306a36Sopenharmony_ci temp = *cp; 74162306a36Sopenharmony_ci *cp++ = leftover | (temp >> bitshift); 74262306a36Sopenharmony_ci leftover = temp << bitright; 74362306a36Sopenharmony_ci } 74462306a36Sopenharmony_ci cp = (u8 *) &scratch->crc_val; 74562306a36Sopenharmony_ci temp = *cp; 74662306a36Sopenharmony_ci *cp++ = leftover | (temp >> bitshift); 74762306a36Sopenharmony_ci leftover = temp << bitright; 74862306a36Sopenharmony_ci temp = *cp; 74962306a36Sopenharmony_ci *cp = leftover | (temp >> bitshift); 75062306a36Sopenharmony_ci } 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_ci if (host->mmc->use_spi_crc) { 75362306a36Sopenharmony_ci u16 crc = crc_itu_t(0, t->rx_buf, t->len); 75462306a36Sopenharmony_ci 75562306a36Sopenharmony_ci be16_to_cpus(&scratch->crc_val); 75662306a36Sopenharmony_ci if (scratch->crc_val != crc) { 75762306a36Sopenharmony_ci dev_dbg(&spi->dev, 75862306a36Sopenharmony_ci "read - crc error: crc_val=0x%04x, computed=0x%04x len=%d\n", 75962306a36Sopenharmony_ci scratch->crc_val, crc, t->len); 76062306a36Sopenharmony_ci return -EILSEQ; 76162306a36Sopenharmony_ci } 76262306a36Sopenharmony_ci } 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ci t->rx_buf += t->len; 76562306a36Sopenharmony_ci 76662306a36Sopenharmony_ci return 0; 76762306a36Sopenharmony_ci} 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_ci/* 77062306a36Sopenharmony_ci * An MMC/SD data stage includes one or more blocks, optional CRCs, 77162306a36Sopenharmony_ci * and inline handshaking. That handhaking makes it unlike most 77262306a36Sopenharmony_ci * other SPI protocol stacks. 77362306a36Sopenharmony_ci */ 77462306a36Sopenharmony_cistatic void 77562306a36Sopenharmony_cimmc_spi_data_do(struct mmc_spi_host *host, struct mmc_command *cmd, 77662306a36Sopenharmony_ci struct mmc_data *data, u32 blk_size) 77762306a36Sopenharmony_ci{ 77862306a36Sopenharmony_ci struct spi_device *spi = host->spi; 77962306a36Sopenharmony_ci struct spi_transfer *t; 78062306a36Sopenharmony_ci enum dma_data_direction direction = mmc_get_dma_dir(data); 78162306a36Sopenharmony_ci struct scatterlist *sg; 78262306a36Sopenharmony_ci unsigned n_sg; 78362306a36Sopenharmony_ci bool multiple = (data->blocks > 1); 78462306a36Sopenharmony_ci const char *write_or_read = (direction == DMA_TO_DEVICE) ? "write" : "read"; 78562306a36Sopenharmony_ci u32 clock_rate; 78662306a36Sopenharmony_ci unsigned long timeout; 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci mmc_spi_setup_data_message(host, multiple, direction); 78962306a36Sopenharmony_ci t = &host->t; 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_ci if (t->speed_hz) 79262306a36Sopenharmony_ci clock_rate = t->speed_hz; 79362306a36Sopenharmony_ci else 79462306a36Sopenharmony_ci clock_rate = spi->max_speed_hz; 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_ci timeout = data->timeout_ns / 1000 + 79762306a36Sopenharmony_ci data->timeout_clks * 1000000 / clock_rate; 79862306a36Sopenharmony_ci timeout = usecs_to_jiffies((unsigned int)timeout) + 1; 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_ci /* Handle scatterlist segments one at a time, with synch for 80162306a36Sopenharmony_ci * each 512-byte block 80262306a36Sopenharmony_ci */ 80362306a36Sopenharmony_ci for_each_sg(data->sg, sg, data->sg_len, n_sg) { 80462306a36Sopenharmony_ci int status = 0; 80562306a36Sopenharmony_ci void *kmap_addr; 80662306a36Sopenharmony_ci unsigned length = sg->length; 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_ci /* allow pio too; we don't allow highmem */ 80962306a36Sopenharmony_ci kmap_addr = kmap(sg_page(sg)); 81062306a36Sopenharmony_ci if (direction == DMA_TO_DEVICE) 81162306a36Sopenharmony_ci t->tx_buf = kmap_addr + sg->offset; 81262306a36Sopenharmony_ci else 81362306a36Sopenharmony_ci t->rx_buf = kmap_addr + sg->offset; 81462306a36Sopenharmony_ci 81562306a36Sopenharmony_ci /* transfer each block, and update request status */ 81662306a36Sopenharmony_ci while (length) { 81762306a36Sopenharmony_ci t->len = min(length, blk_size); 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_ci dev_dbg(&spi->dev, " %s block, %d bytes\n", write_or_read, t->len); 82062306a36Sopenharmony_ci 82162306a36Sopenharmony_ci if (direction == DMA_TO_DEVICE) 82262306a36Sopenharmony_ci status = mmc_spi_writeblock(host, t, timeout); 82362306a36Sopenharmony_ci else 82462306a36Sopenharmony_ci status = mmc_spi_readblock(host, t, timeout); 82562306a36Sopenharmony_ci if (status < 0) 82662306a36Sopenharmony_ci break; 82762306a36Sopenharmony_ci 82862306a36Sopenharmony_ci data->bytes_xfered += t->len; 82962306a36Sopenharmony_ci length -= t->len; 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_ci if (!multiple) 83262306a36Sopenharmony_ci break; 83362306a36Sopenharmony_ci } 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_ci /* discard mappings */ 83662306a36Sopenharmony_ci if (direction == DMA_FROM_DEVICE) 83762306a36Sopenharmony_ci flush_dcache_page(sg_page(sg)); 83862306a36Sopenharmony_ci kunmap(sg_page(sg)); 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_ci if (status < 0) { 84162306a36Sopenharmony_ci data->error = status; 84262306a36Sopenharmony_ci dev_dbg(&spi->dev, "%s status %d\n", write_or_read, status); 84362306a36Sopenharmony_ci break; 84462306a36Sopenharmony_ci } 84562306a36Sopenharmony_ci } 84662306a36Sopenharmony_ci 84762306a36Sopenharmony_ci /* NOTE some docs describe an MMC-only SET_BLOCK_COUNT (CMD23) that 84862306a36Sopenharmony_ci * can be issued before multiblock writes. Unlike its more widely 84962306a36Sopenharmony_ci * documented analogue for SD cards (SET_WR_BLK_ERASE_COUNT, ACMD23), 85062306a36Sopenharmony_ci * that can affect the STOP_TRAN logic. Complete (and current) 85162306a36Sopenharmony_ci * MMC specs should sort that out before Linux starts using CMD23. 85262306a36Sopenharmony_ci */ 85362306a36Sopenharmony_ci if (direction == DMA_TO_DEVICE && multiple) { 85462306a36Sopenharmony_ci struct scratch *scratch = host->data; 85562306a36Sopenharmony_ci int tmp; 85662306a36Sopenharmony_ci const unsigned statlen = sizeof(scratch->status); 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_ci dev_dbg(&spi->dev, " STOP_TRAN\n"); 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_ci /* Tweak the per-block message we set up earlier by morphing 86162306a36Sopenharmony_ci * it to hold single buffer with the token followed by some 86262306a36Sopenharmony_ci * all-ones bytes ... skip N(BR) (0..1), scan the rest for 86362306a36Sopenharmony_ci * "not busy any longer" status, and leave chip selected. 86462306a36Sopenharmony_ci */ 86562306a36Sopenharmony_ci INIT_LIST_HEAD(&host->m.transfers); 86662306a36Sopenharmony_ci list_add(&host->early_status.transfer_list, 86762306a36Sopenharmony_ci &host->m.transfers); 86862306a36Sopenharmony_ci 86962306a36Sopenharmony_ci memset(scratch->status, 0xff, statlen); 87062306a36Sopenharmony_ci scratch->status[0] = SPI_TOKEN_STOP_TRAN; 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_ci host->early_status.tx_buf = host->early_status.rx_buf; 87362306a36Sopenharmony_ci host->early_status.len = statlen; 87462306a36Sopenharmony_ci 87562306a36Sopenharmony_ci tmp = spi_sync_locked(spi, &host->m); 87662306a36Sopenharmony_ci if (tmp < 0) { 87762306a36Sopenharmony_ci if (!data->error) 87862306a36Sopenharmony_ci data->error = tmp; 87962306a36Sopenharmony_ci return; 88062306a36Sopenharmony_ci } 88162306a36Sopenharmony_ci 88262306a36Sopenharmony_ci /* Ideally we collected "not busy" status with one I/O, 88362306a36Sopenharmony_ci * avoiding wasteful byte-at-a-time scanning... but more 88462306a36Sopenharmony_ci * I/O is often needed. 88562306a36Sopenharmony_ci */ 88662306a36Sopenharmony_ci for (tmp = 2; tmp < statlen; tmp++) { 88762306a36Sopenharmony_ci if (scratch->status[tmp] != 0) 88862306a36Sopenharmony_ci return; 88962306a36Sopenharmony_ci } 89062306a36Sopenharmony_ci tmp = mmc_spi_wait_unbusy(host, timeout); 89162306a36Sopenharmony_ci if (tmp < 0 && !data->error) 89262306a36Sopenharmony_ci data->error = tmp; 89362306a36Sopenharmony_ci } 89462306a36Sopenharmony_ci} 89562306a36Sopenharmony_ci 89662306a36Sopenharmony_ci/****************************************************************************/ 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_ci/* 89962306a36Sopenharmony_ci * MMC driver implementation -- the interface to the MMC stack 90062306a36Sopenharmony_ci */ 90162306a36Sopenharmony_ci 90262306a36Sopenharmony_cistatic void mmc_spi_request(struct mmc_host *mmc, struct mmc_request *mrq) 90362306a36Sopenharmony_ci{ 90462306a36Sopenharmony_ci struct mmc_spi_host *host = mmc_priv(mmc); 90562306a36Sopenharmony_ci int status = -EINVAL; 90662306a36Sopenharmony_ci int crc_retry = 5; 90762306a36Sopenharmony_ci struct mmc_command stop; 90862306a36Sopenharmony_ci 90962306a36Sopenharmony_ci#ifdef DEBUG 91062306a36Sopenharmony_ci /* MMC core and layered drivers *MUST* issue SPI-aware commands */ 91162306a36Sopenharmony_ci { 91262306a36Sopenharmony_ci struct mmc_command *cmd; 91362306a36Sopenharmony_ci int invalid = 0; 91462306a36Sopenharmony_ci 91562306a36Sopenharmony_ci cmd = mrq->cmd; 91662306a36Sopenharmony_ci if (!mmc_spi_resp_type(cmd)) { 91762306a36Sopenharmony_ci dev_dbg(&host->spi->dev, "bogus command\n"); 91862306a36Sopenharmony_ci cmd->error = -EINVAL; 91962306a36Sopenharmony_ci invalid = 1; 92062306a36Sopenharmony_ci } 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_ci cmd = mrq->stop; 92362306a36Sopenharmony_ci if (cmd && !mmc_spi_resp_type(cmd)) { 92462306a36Sopenharmony_ci dev_dbg(&host->spi->dev, "bogus STOP command\n"); 92562306a36Sopenharmony_ci cmd->error = -EINVAL; 92662306a36Sopenharmony_ci invalid = 1; 92762306a36Sopenharmony_ci } 92862306a36Sopenharmony_ci 92962306a36Sopenharmony_ci if (invalid) { 93062306a36Sopenharmony_ci dump_stack(); 93162306a36Sopenharmony_ci mmc_request_done(host->mmc, mrq); 93262306a36Sopenharmony_ci return; 93362306a36Sopenharmony_ci } 93462306a36Sopenharmony_ci } 93562306a36Sopenharmony_ci#endif 93662306a36Sopenharmony_ci 93762306a36Sopenharmony_ci /* request exclusive bus access */ 93862306a36Sopenharmony_ci spi_bus_lock(host->spi->master); 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_cicrc_recover: 94162306a36Sopenharmony_ci /* issue command; then optionally data and stop */ 94262306a36Sopenharmony_ci status = mmc_spi_command_send(host, mrq, mrq->cmd, mrq->data != NULL); 94362306a36Sopenharmony_ci if (status == 0 && mrq->data) { 94462306a36Sopenharmony_ci mmc_spi_data_do(host, mrq->cmd, mrq->data, mrq->data->blksz); 94562306a36Sopenharmony_ci 94662306a36Sopenharmony_ci /* 94762306a36Sopenharmony_ci * The SPI bus is not always reliable for large data transfers. 94862306a36Sopenharmony_ci * If an occasional crc error is reported by the SD device with 94962306a36Sopenharmony_ci * data read/write over SPI, it may be recovered by repeating 95062306a36Sopenharmony_ci * the last SD command again. The retry count is set to 5 to 95162306a36Sopenharmony_ci * ensure the driver passes stress tests. 95262306a36Sopenharmony_ci */ 95362306a36Sopenharmony_ci if (mrq->data->error == -EILSEQ && crc_retry) { 95462306a36Sopenharmony_ci stop.opcode = MMC_STOP_TRANSMISSION; 95562306a36Sopenharmony_ci stop.arg = 0; 95662306a36Sopenharmony_ci stop.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; 95762306a36Sopenharmony_ci status = mmc_spi_command_send(host, mrq, &stop, 0); 95862306a36Sopenharmony_ci crc_retry--; 95962306a36Sopenharmony_ci mrq->data->error = 0; 96062306a36Sopenharmony_ci goto crc_recover; 96162306a36Sopenharmony_ci } 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci if (mrq->stop) 96462306a36Sopenharmony_ci status = mmc_spi_command_send(host, mrq, mrq->stop, 0); 96562306a36Sopenharmony_ci else 96662306a36Sopenharmony_ci mmc_cs_off(host); 96762306a36Sopenharmony_ci } 96862306a36Sopenharmony_ci 96962306a36Sopenharmony_ci /* release the bus */ 97062306a36Sopenharmony_ci spi_bus_unlock(host->spi->master); 97162306a36Sopenharmony_ci 97262306a36Sopenharmony_ci mmc_request_done(host->mmc, mrq); 97362306a36Sopenharmony_ci} 97462306a36Sopenharmony_ci 97562306a36Sopenharmony_ci/* See Section 6.4.1, in SD "Simplified Physical Layer Specification 2.0" 97662306a36Sopenharmony_ci * 97762306a36Sopenharmony_ci * NOTE that here we can't know that the card has just been powered up; 97862306a36Sopenharmony_ci * not all MMC/SD sockets support power switching. 97962306a36Sopenharmony_ci * 98062306a36Sopenharmony_ci * FIXME when the card is still in SPI mode, e.g. from a previous kernel, 98162306a36Sopenharmony_ci * this doesn't seem to do the right thing at all... 98262306a36Sopenharmony_ci */ 98362306a36Sopenharmony_cistatic void mmc_spi_initsequence(struct mmc_spi_host *host) 98462306a36Sopenharmony_ci{ 98562306a36Sopenharmony_ci /* Try to be very sure any previous command has completed; 98662306a36Sopenharmony_ci * wait till not-busy, skip debris from any old commands. 98762306a36Sopenharmony_ci */ 98862306a36Sopenharmony_ci mmc_spi_wait_unbusy(host, msecs_to_jiffies(MMC_SPI_INIT_TIMEOUT_MS)); 98962306a36Sopenharmony_ci mmc_spi_readbytes(host, 10); 99062306a36Sopenharmony_ci 99162306a36Sopenharmony_ci /* 99262306a36Sopenharmony_ci * Do a burst with chipselect active-high. We need to do this to 99362306a36Sopenharmony_ci * meet the requirement of 74 clock cycles with both chipselect 99462306a36Sopenharmony_ci * and CMD (MOSI) high before CMD0 ... after the card has been 99562306a36Sopenharmony_ci * powered up to Vdd(min), and so is ready to take commands. 99662306a36Sopenharmony_ci * 99762306a36Sopenharmony_ci * Some cards are particularly needy of this (e.g. Viking "SD256") 99862306a36Sopenharmony_ci * while most others don't seem to care. 99962306a36Sopenharmony_ci * 100062306a36Sopenharmony_ci * Note that this is one of the places MMC/SD plays games with the 100162306a36Sopenharmony_ci * SPI protocol. Another is that when chipselect is released while 100262306a36Sopenharmony_ci * the card returns BUSY status, the clock must issue several cycles 100362306a36Sopenharmony_ci * with chipselect high before the card will stop driving its output. 100462306a36Sopenharmony_ci * 100562306a36Sopenharmony_ci * SPI_CS_HIGH means "asserted" here. In some cases like when using 100662306a36Sopenharmony_ci * GPIOs for chip select, SPI_CS_HIGH is set but this will be logically 100762306a36Sopenharmony_ci * inverted by gpiolib, so if we want to ascertain to drive it high 100862306a36Sopenharmony_ci * we should toggle the default with an XOR as we do here. 100962306a36Sopenharmony_ci */ 101062306a36Sopenharmony_ci host->spi->mode ^= SPI_CS_HIGH; 101162306a36Sopenharmony_ci if (spi_setup(host->spi) != 0) { 101262306a36Sopenharmony_ci /* Just warn; most cards work without it. */ 101362306a36Sopenharmony_ci dev_warn(&host->spi->dev, 101462306a36Sopenharmony_ci "can't change chip-select polarity\n"); 101562306a36Sopenharmony_ci host->spi->mode ^= SPI_CS_HIGH; 101662306a36Sopenharmony_ci } else { 101762306a36Sopenharmony_ci mmc_spi_readbytes(host, 18); 101862306a36Sopenharmony_ci 101962306a36Sopenharmony_ci host->spi->mode ^= SPI_CS_HIGH; 102062306a36Sopenharmony_ci if (spi_setup(host->spi) != 0) { 102162306a36Sopenharmony_ci /* Wot, we can't get the same setup we had before? */ 102262306a36Sopenharmony_ci dev_err(&host->spi->dev, 102362306a36Sopenharmony_ci "can't restore chip-select polarity\n"); 102462306a36Sopenharmony_ci } 102562306a36Sopenharmony_ci } 102662306a36Sopenharmony_ci} 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_cistatic char *mmc_powerstring(u8 power_mode) 102962306a36Sopenharmony_ci{ 103062306a36Sopenharmony_ci switch (power_mode) { 103162306a36Sopenharmony_ci case MMC_POWER_OFF: return "off"; 103262306a36Sopenharmony_ci case MMC_POWER_UP: return "up"; 103362306a36Sopenharmony_ci case MMC_POWER_ON: return "on"; 103462306a36Sopenharmony_ci } 103562306a36Sopenharmony_ci return "?"; 103662306a36Sopenharmony_ci} 103762306a36Sopenharmony_ci 103862306a36Sopenharmony_cistatic void mmc_spi_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) 103962306a36Sopenharmony_ci{ 104062306a36Sopenharmony_ci struct mmc_spi_host *host = mmc_priv(mmc); 104162306a36Sopenharmony_ci 104262306a36Sopenharmony_ci if (host->power_mode != ios->power_mode) { 104362306a36Sopenharmony_ci int canpower; 104462306a36Sopenharmony_ci 104562306a36Sopenharmony_ci canpower = host->pdata && host->pdata->setpower; 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_ci dev_dbg(&host->spi->dev, "power %s (%d)%s\n", 104862306a36Sopenharmony_ci mmc_powerstring(ios->power_mode), 104962306a36Sopenharmony_ci ios->vdd, 105062306a36Sopenharmony_ci canpower ? ", can switch" : ""); 105162306a36Sopenharmony_ci 105262306a36Sopenharmony_ci /* switch power on/off if possible, accounting for 105362306a36Sopenharmony_ci * max 250msec powerup time if needed. 105462306a36Sopenharmony_ci */ 105562306a36Sopenharmony_ci if (canpower) { 105662306a36Sopenharmony_ci switch (ios->power_mode) { 105762306a36Sopenharmony_ci case MMC_POWER_OFF: 105862306a36Sopenharmony_ci case MMC_POWER_UP: 105962306a36Sopenharmony_ci host->pdata->setpower(&host->spi->dev, 106062306a36Sopenharmony_ci ios->vdd); 106162306a36Sopenharmony_ci if (ios->power_mode == MMC_POWER_UP) 106262306a36Sopenharmony_ci msleep(host->powerup_msecs); 106362306a36Sopenharmony_ci } 106462306a36Sopenharmony_ci } 106562306a36Sopenharmony_ci 106662306a36Sopenharmony_ci /* See 6.4.1 in the simplified SD card physical spec 2.0 */ 106762306a36Sopenharmony_ci if (ios->power_mode == MMC_POWER_ON) 106862306a36Sopenharmony_ci mmc_spi_initsequence(host); 106962306a36Sopenharmony_ci 107062306a36Sopenharmony_ci /* If powering down, ground all card inputs to avoid power 107162306a36Sopenharmony_ci * delivery from data lines! On a shared SPI bus, this 107262306a36Sopenharmony_ci * will probably be temporary; 6.4.2 of the simplified SD 107362306a36Sopenharmony_ci * spec says this must last at least 1msec. 107462306a36Sopenharmony_ci * 107562306a36Sopenharmony_ci * - Clock low means CPOL 0, e.g. mode 0 107662306a36Sopenharmony_ci * - MOSI low comes from writing zero 107762306a36Sopenharmony_ci * - Chipselect is usually active low... 107862306a36Sopenharmony_ci */ 107962306a36Sopenharmony_ci if (canpower && ios->power_mode == MMC_POWER_OFF) { 108062306a36Sopenharmony_ci int mres; 108162306a36Sopenharmony_ci u8 nullbyte = 0; 108262306a36Sopenharmony_ci 108362306a36Sopenharmony_ci host->spi->mode &= ~(SPI_CPOL|SPI_CPHA); 108462306a36Sopenharmony_ci mres = spi_setup(host->spi); 108562306a36Sopenharmony_ci if (mres < 0) 108662306a36Sopenharmony_ci dev_dbg(&host->spi->dev, 108762306a36Sopenharmony_ci "switch to SPI mode 0 failed\n"); 108862306a36Sopenharmony_ci 108962306a36Sopenharmony_ci if (spi_write(host->spi, &nullbyte, 1) < 0) 109062306a36Sopenharmony_ci dev_dbg(&host->spi->dev, 109162306a36Sopenharmony_ci "put spi signals to low failed\n"); 109262306a36Sopenharmony_ci 109362306a36Sopenharmony_ci /* 109462306a36Sopenharmony_ci * Now clock should be low due to spi mode 0; 109562306a36Sopenharmony_ci * MOSI should be low because of written 0x00; 109662306a36Sopenharmony_ci * chipselect should be low (it is active low) 109762306a36Sopenharmony_ci * power supply is off, so now MMC is off too! 109862306a36Sopenharmony_ci * 109962306a36Sopenharmony_ci * FIXME no, chipselect can be high since the 110062306a36Sopenharmony_ci * device is inactive and SPI_CS_HIGH is clear... 110162306a36Sopenharmony_ci */ 110262306a36Sopenharmony_ci msleep(10); 110362306a36Sopenharmony_ci if (mres == 0) { 110462306a36Sopenharmony_ci host->spi->mode |= (SPI_CPOL|SPI_CPHA); 110562306a36Sopenharmony_ci mres = spi_setup(host->spi); 110662306a36Sopenharmony_ci if (mres < 0) 110762306a36Sopenharmony_ci dev_dbg(&host->spi->dev, 110862306a36Sopenharmony_ci "switch back to SPI mode 3 failed\n"); 110962306a36Sopenharmony_ci } 111062306a36Sopenharmony_ci } 111162306a36Sopenharmony_ci 111262306a36Sopenharmony_ci host->power_mode = ios->power_mode; 111362306a36Sopenharmony_ci } 111462306a36Sopenharmony_ci 111562306a36Sopenharmony_ci if (host->spi->max_speed_hz != ios->clock && ios->clock != 0) { 111662306a36Sopenharmony_ci int status; 111762306a36Sopenharmony_ci 111862306a36Sopenharmony_ci host->spi->max_speed_hz = ios->clock; 111962306a36Sopenharmony_ci status = spi_setup(host->spi); 112062306a36Sopenharmony_ci dev_dbg(&host->spi->dev, " clock to %d Hz, %d\n", 112162306a36Sopenharmony_ci host->spi->max_speed_hz, status); 112262306a36Sopenharmony_ci } 112362306a36Sopenharmony_ci} 112462306a36Sopenharmony_ci 112562306a36Sopenharmony_cistatic const struct mmc_host_ops mmc_spi_ops = { 112662306a36Sopenharmony_ci .request = mmc_spi_request, 112762306a36Sopenharmony_ci .set_ios = mmc_spi_set_ios, 112862306a36Sopenharmony_ci .get_ro = mmc_gpio_get_ro, 112962306a36Sopenharmony_ci .get_cd = mmc_gpio_get_cd, 113062306a36Sopenharmony_ci}; 113162306a36Sopenharmony_ci 113262306a36Sopenharmony_ci 113362306a36Sopenharmony_ci/****************************************************************************/ 113462306a36Sopenharmony_ci 113562306a36Sopenharmony_ci/* 113662306a36Sopenharmony_ci * SPI driver implementation 113762306a36Sopenharmony_ci */ 113862306a36Sopenharmony_ci 113962306a36Sopenharmony_cistatic irqreturn_t 114062306a36Sopenharmony_cimmc_spi_detect_irq(int irq, void *mmc) 114162306a36Sopenharmony_ci{ 114262306a36Sopenharmony_ci struct mmc_spi_host *host = mmc_priv(mmc); 114362306a36Sopenharmony_ci u16 delay_msec = max(host->pdata->detect_delay, (u16)100); 114462306a36Sopenharmony_ci 114562306a36Sopenharmony_ci mmc_detect_change(mmc, msecs_to_jiffies(delay_msec)); 114662306a36Sopenharmony_ci return IRQ_HANDLED; 114762306a36Sopenharmony_ci} 114862306a36Sopenharmony_ci 114962306a36Sopenharmony_cistatic int mmc_spi_probe(struct spi_device *spi) 115062306a36Sopenharmony_ci{ 115162306a36Sopenharmony_ci void *ones; 115262306a36Sopenharmony_ci struct mmc_host *mmc; 115362306a36Sopenharmony_ci struct mmc_spi_host *host; 115462306a36Sopenharmony_ci int status; 115562306a36Sopenharmony_ci bool has_ro = false; 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci /* We rely on full duplex transfers, mostly to reduce 115862306a36Sopenharmony_ci * per-transfer overheads (by making fewer transfers). 115962306a36Sopenharmony_ci */ 116062306a36Sopenharmony_ci if (spi->master->flags & SPI_MASTER_HALF_DUPLEX) 116162306a36Sopenharmony_ci return -EINVAL; 116262306a36Sopenharmony_ci 116362306a36Sopenharmony_ci /* MMC and SD specs only seem to care that sampling is on the 116462306a36Sopenharmony_ci * rising edge ... meaning SPI modes 0 or 3. So either SPI mode 116562306a36Sopenharmony_ci * should be legit. We'll use mode 0 since the steady state is 0, 116662306a36Sopenharmony_ci * which is appropriate for hotplugging, unless the platform data 116762306a36Sopenharmony_ci * specify mode 3 (if hardware is not compatible to mode 0). 116862306a36Sopenharmony_ci */ 116962306a36Sopenharmony_ci if (spi->mode != SPI_MODE_3) 117062306a36Sopenharmony_ci spi->mode = SPI_MODE_0; 117162306a36Sopenharmony_ci spi->bits_per_word = 8; 117262306a36Sopenharmony_ci 117362306a36Sopenharmony_ci status = spi_setup(spi); 117462306a36Sopenharmony_ci if (status < 0) { 117562306a36Sopenharmony_ci dev_dbg(&spi->dev, "needs SPI mode %02x, %d KHz; %d\n", 117662306a36Sopenharmony_ci spi->mode, spi->max_speed_hz / 1000, 117762306a36Sopenharmony_ci status); 117862306a36Sopenharmony_ci return status; 117962306a36Sopenharmony_ci } 118062306a36Sopenharmony_ci 118162306a36Sopenharmony_ci /* We need a supply of ones to transmit. This is the only time 118262306a36Sopenharmony_ci * the CPU touches these, so cache coherency isn't a concern. 118362306a36Sopenharmony_ci * 118462306a36Sopenharmony_ci * NOTE if many systems use more than one MMC-over-SPI connector 118562306a36Sopenharmony_ci * it'd save some memory to share this. That's evidently rare. 118662306a36Sopenharmony_ci */ 118762306a36Sopenharmony_ci status = -ENOMEM; 118862306a36Sopenharmony_ci ones = kmalloc(MMC_SPI_BLOCKSIZE, GFP_KERNEL); 118962306a36Sopenharmony_ci if (!ones) 119062306a36Sopenharmony_ci goto nomem; 119162306a36Sopenharmony_ci memset(ones, 0xff, MMC_SPI_BLOCKSIZE); 119262306a36Sopenharmony_ci 119362306a36Sopenharmony_ci mmc = mmc_alloc_host(sizeof(*host), &spi->dev); 119462306a36Sopenharmony_ci if (!mmc) 119562306a36Sopenharmony_ci goto nomem; 119662306a36Sopenharmony_ci 119762306a36Sopenharmony_ci mmc->ops = &mmc_spi_ops; 119862306a36Sopenharmony_ci mmc->max_blk_size = MMC_SPI_BLOCKSIZE; 119962306a36Sopenharmony_ci mmc->max_segs = MMC_SPI_BLOCKSATONCE; 120062306a36Sopenharmony_ci mmc->max_req_size = MMC_SPI_BLOCKSATONCE * MMC_SPI_BLOCKSIZE; 120162306a36Sopenharmony_ci mmc->max_blk_count = MMC_SPI_BLOCKSATONCE; 120262306a36Sopenharmony_ci 120362306a36Sopenharmony_ci mmc->caps = MMC_CAP_SPI; 120462306a36Sopenharmony_ci 120562306a36Sopenharmony_ci /* SPI doesn't need the lowspeed device identification thing for 120662306a36Sopenharmony_ci * MMC or SD cards, since it never comes up in open drain mode. 120762306a36Sopenharmony_ci * That's good; some SPI masters can't handle very low speeds! 120862306a36Sopenharmony_ci * 120962306a36Sopenharmony_ci * However, low speed SDIO cards need not handle over 400 KHz; 121062306a36Sopenharmony_ci * that's the only reason not to use a few MHz for f_min (until 121162306a36Sopenharmony_ci * the upper layer reads the target frequency from the CSD). 121262306a36Sopenharmony_ci */ 121362306a36Sopenharmony_ci mmc->f_min = 400000; 121462306a36Sopenharmony_ci mmc->f_max = spi->max_speed_hz; 121562306a36Sopenharmony_ci 121662306a36Sopenharmony_ci host = mmc_priv(mmc); 121762306a36Sopenharmony_ci host->mmc = mmc; 121862306a36Sopenharmony_ci host->spi = spi; 121962306a36Sopenharmony_ci 122062306a36Sopenharmony_ci host->ones = ones; 122162306a36Sopenharmony_ci 122262306a36Sopenharmony_ci dev_set_drvdata(&spi->dev, mmc); 122362306a36Sopenharmony_ci 122462306a36Sopenharmony_ci /* Platform data is used to hook up things like card sensing 122562306a36Sopenharmony_ci * and power switching gpios. 122662306a36Sopenharmony_ci */ 122762306a36Sopenharmony_ci host->pdata = mmc_spi_get_pdata(spi); 122862306a36Sopenharmony_ci if (host->pdata) 122962306a36Sopenharmony_ci mmc->ocr_avail = host->pdata->ocr_mask; 123062306a36Sopenharmony_ci if (!mmc->ocr_avail) { 123162306a36Sopenharmony_ci dev_warn(&spi->dev, "ASSUMING 3.2-3.4 V slot power\n"); 123262306a36Sopenharmony_ci mmc->ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34; 123362306a36Sopenharmony_ci } 123462306a36Sopenharmony_ci if (host->pdata && host->pdata->setpower) { 123562306a36Sopenharmony_ci host->powerup_msecs = host->pdata->powerup_msecs; 123662306a36Sopenharmony_ci if (!host->powerup_msecs || host->powerup_msecs > 250) 123762306a36Sopenharmony_ci host->powerup_msecs = 250; 123862306a36Sopenharmony_ci } 123962306a36Sopenharmony_ci 124062306a36Sopenharmony_ci /* Preallocate buffers */ 124162306a36Sopenharmony_ci host->data = kmalloc(sizeof(*host->data), GFP_KERNEL); 124262306a36Sopenharmony_ci if (!host->data) 124362306a36Sopenharmony_ci goto fail_nobuf1; 124462306a36Sopenharmony_ci 124562306a36Sopenharmony_ci /* setup message for status/busy readback */ 124662306a36Sopenharmony_ci spi_message_init(&host->readback); 124762306a36Sopenharmony_ci 124862306a36Sopenharmony_ci spi_message_add_tail(&host->status, &host->readback); 124962306a36Sopenharmony_ci host->status.tx_buf = host->ones; 125062306a36Sopenharmony_ci host->status.rx_buf = &host->data->status; 125162306a36Sopenharmony_ci host->status.cs_change = 1; 125262306a36Sopenharmony_ci 125362306a36Sopenharmony_ci /* register card detect irq */ 125462306a36Sopenharmony_ci if (host->pdata && host->pdata->init) { 125562306a36Sopenharmony_ci status = host->pdata->init(&spi->dev, mmc_spi_detect_irq, mmc); 125662306a36Sopenharmony_ci if (status != 0) 125762306a36Sopenharmony_ci goto fail_glue_init; 125862306a36Sopenharmony_ci } 125962306a36Sopenharmony_ci 126062306a36Sopenharmony_ci /* pass platform capabilities, if any */ 126162306a36Sopenharmony_ci if (host->pdata) { 126262306a36Sopenharmony_ci mmc->caps |= host->pdata->caps; 126362306a36Sopenharmony_ci mmc->caps2 |= host->pdata->caps2; 126462306a36Sopenharmony_ci } 126562306a36Sopenharmony_ci 126662306a36Sopenharmony_ci status = mmc_add_host(mmc); 126762306a36Sopenharmony_ci if (status != 0) 126862306a36Sopenharmony_ci goto fail_glue_init; 126962306a36Sopenharmony_ci 127062306a36Sopenharmony_ci /* 127162306a36Sopenharmony_ci * Index 0 is card detect 127262306a36Sopenharmony_ci * Old boardfiles were specifying 1 ms as debounce 127362306a36Sopenharmony_ci */ 127462306a36Sopenharmony_ci status = mmc_gpiod_request_cd(mmc, NULL, 0, false, 1000); 127562306a36Sopenharmony_ci if (status == -EPROBE_DEFER) 127662306a36Sopenharmony_ci goto fail_gpiod_request; 127762306a36Sopenharmony_ci if (!status) { 127862306a36Sopenharmony_ci /* 127962306a36Sopenharmony_ci * The platform has a CD GPIO signal that may support 128062306a36Sopenharmony_ci * interrupts, so let mmc_gpiod_request_cd_irq() decide 128162306a36Sopenharmony_ci * if polling is needed or not. 128262306a36Sopenharmony_ci */ 128362306a36Sopenharmony_ci mmc->caps &= ~MMC_CAP_NEEDS_POLL; 128462306a36Sopenharmony_ci mmc_gpiod_request_cd_irq(mmc); 128562306a36Sopenharmony_ci } 128662306a36Sopenharmony_ci mmc_detect_change(mmc, 0); 128762306a36Sopenharmony_ci 128862306a36Sopenharmony_ci /* Index 1 is write protect/read only */ 128962306a36Sopenharmony_ci status = mmc_gpiod_request_ro(mmc, NULL, 1, 0); 129062306a36Sopenharmony_ci if (status == -EPROBE_DEFER) 129162306a36Sopenharmony_ci goto fail_gpiod_request; 129262306a36Sopenharmony_ci if (!status) 129362306a36Sopenharmony_ci has_ro = true; 129462306a36Sopenharmony_ci 129562306a36Sopenharmony_ci dev_info(&spi->dev, "SD/MMC host %s%s%s%s\n", 129662306a36Sopenharmony_ci dev_name(&mmc->class_dev), 129762306a36Sopenharmony_ci has_ro ? "" : ", no WP", 129862306a36Sopenharmony_ci (host->pdata && host->pdata->setpower) 129962306a36Sopenharmony_ci ? "" : ", no poweroff", 130062306a36Sopenharmony_ci (mmc->caps & MMC_CAP_NEEDS_POLL) 130162306a36Sopenharmony_ci ? ", cd polling" : ""); 130262306a36Sopenharmony_ci return 0; 130362306a36Sopenharmony_ci 130462306a36Sopenharmony_cifail_gpiod_request: 130562306a36Sopenharmony_ci mmc_remove_host(mmc); 130662306a36Sopenharmony_cifail_glue_init: 130762306a36Sopenharmony_ci kfree(host->data); 130862306a36Sopenharmony_cifail_nobuf1: 130962306a36Sopenharmony_ci mmc_spi_put_pdata(spi); 131062306a36Sopenharmony_ci mmc_free_host(mmc); 131162306a36Sopenharmony_cinomem: 131262306a36Sopenharmony_ci kfree(ones); 131362306a36Sopenharmony_ci return status; 131462306a36Sopenharmony_ci} 131562306a36Sopenharmony_ci 131662306a36Sopenharmony_ci 131762306a36Sopenharmony_cistatic void mmc_spi_remove(struct spi_device *spi) 131862306a36Sopenharmony_ci{ 131962306a36Sopenharmony_ci struct mmc_host *mmc = dev_get_drvdata(&spi->dev); 132062306a36Sopenharmony_ci struct mmc_spi_host *host = mmc_priv(mmc); 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci /* prevent new mmc_detect_change() calls */ 132362306a36Sopenharmony_ci if (host->pdata && host->pdata->exit) 132462306a36Sopenharmony_ci host->pdata->exit(&spi->dev, mmc); 132562306a36Sopenharmony_ci 132662306a36Sopenharmony_ci mmc_remove_host(mmc); 132762306a36Sopenharmony_ci 132862306a36Sopenharmony_ci kfree(host->data); 132962306a36Sopenharmony_ci kfree(host->ones); 133062306a36Sopenharmony_ci 133162306a36Sopenharmony_ci spi->max_speed_hz = mmc->f_max; 133262306a36Sopenharmony_ci mmc_spi_put_pdata(spi); 133362306a36Sopenharmony_ci mmc_free_host(mmc); 133462306a36Sopenharmony_ci} 133562306a36Sopenharmony_ci 133662306a36Sopenharmony_cistatic const struct spi_device_id mmc_spi_dev_ids[] = { 133762306a36Sopenharmony_ci { "mmc-spi-slot"}, 133862306a36Sopenharmony_ci { }, 133962306a36Sopenharmony_ci}; 134062306a36Sopenharmony_ciMODULE_DEVICE_TABLE(spi, mmc_spi_dev_ids); 134162306a36Sopenharmony_ci 134262306a36Sopenharmony_cistatic const struct of_device_id mmc_spi_of_match_table[] = { 134362306a36Sopenharmony_ci { .compatible = "mmc-spi-slot", }, 134462306a36Sopenharmony_ci {}, 134562306a36Sopenharmony_ci}; 134662306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, mmc_spi_of_match_table); 134762306a36Sopenharmony_ci 134862306a36Sopenharmony_cistatic struct spi_driver mmc_spi_driver = { 134962306a36Sopenharmony_ci .driver = { 135062306a36Sopenharmony_ci .name = "mmc_spi", 135162306a36Sopenharmony_ci .of_match_table = mmc_spi_of_match_table, 135262306a36Sopenharmony_ci }, 135362306a36Sopenharmony_ci .id_table = mmc_spi_dev_ids, 135462306a36Sopenharmony_ci .probe = mmc_spi_probe, 135562306a36Sopenharmony_ci .remove = mmc_spi_remove, 135662306a36Sopenharmony_ci}; 135762306a36Sopenharmony_ci 135862306a36Sopenharmony_cimodule_spi_driver(mmc_spi_driver); 135962306a36Sopenharmony_ci 136062306a36Sopenharmony_ciMODULE_AUTHOR("Mike Lavender, David Brownell, Hans-Peter Nilsson, Jan Nikitenko"); 136162306a36Sopenharmony_ciMODULE_DESCRIPTION("SPI SD/MMC host driver"); 136262306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 136362306a36Sopenharmony_ciMODULE_ALIAS("spi:mmc_spi"); 1364