Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a0eaf0f9 authored by Russell King's avatar Russell King Committed by Ulf Hansson
Browse files

mmc: sdhci: prepare DMA address/size quirk handling consolidation



Prepare to consolidate the DMA address/size quirk handling into one
single loop.

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Tested-by: default avatarGregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent add8913d
Loading
Loading
Loading
Loading
+15 −13
Original line number Diff line number Diff line
@@ -733,21 +733,22 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
	 * scatterlist.
	 */
	if (host->flags & SDHCI_REQ_USE_DMA) {
		int broken, i;
		struct scatterlist *sg;
		unsigned int length_mask;
		int i;

		broken = 0;
		length_mask = 0;
		if (host->flags & SDHCI_USE_ADMA) {
			if (host->quirks & SDHCI_QUIRK_32BIT_ADMA_SIZE)
				broken = 1;
				length_mask = 3;
		} else {
			if (host->quirks & SDHCI_QUIRK_32BIT_DMA_SIZE)
				broken = 1;
				length_mask = 3;
		}

		if (unlikely(broken)) {
		if (unlikely(length_mask)) {
			for_each_sg(data->sg, sg, data->sg_len, i) {
				if (sg->length & 0x3) {
				if (sg->length & length_mask) {
					DBG("Reverting to PIO because of transfer size (%d)\n",
					    sg->length);
					host->flags &= ~SDHCI_REQ_USE_DMA;
@@ -762,10 +763,11 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
	 * translation to device address space.
	 */
	if (host->flags & SDHCI_REQ_USE_DMA) {
		int broken, i;
		struct scatterlist *sg;
		unsigned int offset_mask;
		int i;

		broken = 0;
		offset_mask = 0;
		if (host->flags & SDHCI_USE_ADMA) {
			/*
			 * As we use 3 byte chunks to work around
@@ -773,15 +775,15 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
			 * quirk.
			 */
			if (host->quirks & SDHCI_QUIRK_32BIT_ADMA_SIZE)
				broken = 1;
				offset_mask = 3;
		} else {
			if (host->quirks & SDHCI_QUIRK_32BIT_DMA_ADDR)
				broken = 1;
				offset_mask = 3;
		}

		if (unlikely(broken)) {
		if (unlikely(offset_mask)) {
			for_each_sg(data->sg, sg, data->sg_len, i) {
				if (sg->offset & 0x3) {
				if (sg->offset & offset_mask) {
					DBG("Reverting to PIO because of bad alignment\n");
					host->flags &= ~SDHCI_REQ_USE_DMA;
					break;