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

Commit 2f1d7918 authored by Nicolas Ferre's avatar Nicolas Ferre Committed by Chris Ball
Browse files

mmc: atmel-mci: fix multiblock SDIO transfers



Based on report made by Yauhen in:
"MMC: Fix multiblock SDIO transfers in AT91 MCI" patch,
I report those changes to the brother driver: atmel-mci.

So, this patch sets SDIO transfer types: SDIO block and SDIO byte
transfers instead of using ordinary MMC block transfers.
It is checking opcode for SDIO CMD53 and setting transfer
type in MCI_CMDR register properly.

Reported-by: default avatarYauhen Kharuzhy <yauhen.kharuzhy@promwad.com>
Cc: <stable@kernel.org>
Signed-off-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
Acked-by: default avatarJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent a2255ff4
Loading
Loading
Loading
Loading
+12 −6
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@
#include <linux/stat.h>
#include <linux/stat.h>


#include <linux/mmc/host.h>
#include <linux/mmc/host.h>
#include <linux/mmc/sdio.h>


#include <mach/atmel-mci.h>
#include <mach/atmel-mci.h>
#include <linux/atmel-mci.h>
#include <linux/atmel-mci.h>
@@ -532,12 +533,17 @@ static u32 atmci_prepare_command(struct mmc_host *mmc,
	data = cmd->data;
	data = cmd->data;
	if (data) {
	if (data) {
		cmdr |= MCI_CMDR_START_XFER;
		cmdr |= MCI_CMDR_START_XFER;

		if (cmd->opcode == SD_IO_RW_EXTENDED) {
			cmdr |= MCI_CMDR_SDIO_BLOCK;
		} else {
			if (data->flags & MMC_DATA_STREAM)
			if (data->flags & MMC_DATA_STREAM)
				cmdr |= MCI_CMDR_STREAM;
				cmdr |= MCI_CMDR_STREAM;
			else if (data->blocks > 1)
			else if (data->blocks > 1)
				cmdr |= MCI_CMDR_MULTI_BLOCK;
				cmdr |= MCI_CMDR_MULTI_BLOCK;
			else
			else
				cmdr |= MCI_CMDR_BLOCK;
				cmdr |= MCI_CMDR_BLOCK;
		}


		if (data->flags & MMC_DATA_READ)
		if (data->flags & MMC_DATA_READ)
			cmdr |= MCI_CMDR_TRDIR_READ;
			cmdr |= MCI_CMDR_TRDIR_READ;