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