mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Steffen Trumtrar <s.trumtrar@pengutronix.de>
To: barebox@lists.infradead.org, Sascha Hauer <s.hauer@pengutronix.de>
Cc: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Subject: [PATCH v2 1/6] mci: add data segment to mci_cmd
Date: Mon, 09 Mar 2026 13:04:33 +0100	[thread overview]
Message-ID: <20260309-v2025-11-0-topic-socfpga-agilex5-sdhci-v2-1-fcc1f327acf8@pengutronix.de> (raw)
In-Reply-To: <20260309-v2025-11-0-topic-socfpga-agilex5-sdhci-v2-0-fcc1f327acf8@pengutronix.de>

In Linux the struct mmc_command includes the mmc_data field and doesn't
hand it around in the function calls.

Do the same here and remove the mci_data parameter from the send_cmd
callback. The mci-core sets up the mci_cmd->data field and the drivers
can get the mmc_data from the mci_cmd struct.

A lot of the calls in mci-core don't use data in the mci_send_cmd call.
Explicitly initialize the mci_cmd struct with 0 (and therefore the
mci_data struct with NULL) on declaration.

When data is used and set up before mci_send_cmd is called the pointer
is xzalloc'd where it previously was setup on the stack.

Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
---
 drivers/mci/am654-sdhci.c            |   4 +-
 drivers/mci/arasan-sdhci.c           |   4 +-
 drivers/mci/atmel-sdhci.c            |   5 +-
 drivers/mci/atmel_mci.c              |   5 +-
 drivers/mci/atmel_mci_pbl.c          |   5 +-
 drivers/mci/bcm2835-sdhost.c         |   4 +-
 drivers/mci/dove-sdhci.c             |   4 +-
 drivers/mci/dw_mmc.c                 |   3 +-
 drivers/mci/dwcmshc-sdhci.c          |   5 +-
 drivers/mci/imx-esdhc.c              |   5 +-
 drivers/mci/imx.c                    |   4 +-
 drivers/mci/mci-bcm2835.c            |   5 +-
 drivers/mci/mci-core.c               | 187 ++++++++++++++++++-----------------
 drivers/mci/mci_spi.c                |   3 +-
 drivers/mci/mmci.c                   |   6 +-
 drivers/mci/mxs.c                    |   7 +-
 drivers/mci/omap_hsmmc.c             |   5 +-
 drivers/mci/pxamci.c                 |   4 +-
 drivers/mci/rockchip-dwcmshc-sdhci.c |   4 +-
 drivers/mci/sdhci.c                  |   4 +-
 drivers/mci/stm32_sdmmc2.c           |   4 +-
 drivers/mci/sunxi-mmc.c              |   4 +-
 drivers/mci/tegra-sdmmc.c            |   4 +-
 include/mci.h                        |   5 +-
 24 files changed, 147 insertions(+), 143 deletions(-)

diff --git a/drivers/mci/am654-sdhci.c b/drivers/mci/am654-sdhci.c
index 4ceea226f7..cea0451c1a 100644
--- a/drivers/mci/am654-sdhci.c
+++ b/drivers/mci/am654-sdhci.c
@@ -454,13 +454,13 @@ static void print_error(struct am654_sdhci_plat *host, int cmdidx)
 		sdhci_read32(&host->sdhci, SDHCI_INT_NORMAL_STATUS));
 }
 
-static int am654_sdhci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
-				struct mci_data *data)
+static int am654_sdhci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct am654_sdhci_plat *host = container_of(mci, struct am654_sdhci_plat, mci);
 	u32 mask, command, xfer;
 	int ret;
 	dma_addr_t dma;
+	struct mci_data *data = cmd->data;
 
 	ret = sdhci_wait_idle(&host->sdhci, cmd, data);
 	if (ret)
diff --git a/drivers/mci/arasan-sdhci.c b/drivers/mci/arasan-sdhci.c
index 4adaaa243d..4e0e7b3793 100644
--- a/drivers/mci/arasan-sdhci.c
+++ b/drivers/mci/arasan-sdhci.c
@@ -244,13 +244,13 @@ static void print_error(struct arasan_sdhci_host *host, int cmdidx, int ret)
 		sdhci_read32(&host->sdhci, SDHCI_INT_NORMAL_STATUS));
 }
 
-static int arasan_sdhci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
-				 struct mci_data *data)
+static int arasan_sdhci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct arasan_sdhci_host *host = to_arasan_sdhci_host(mci);
 	u32 mask, command, xfer;
 	dma_addr_t dma;
 	int ret;
+	struct mci_data *data = cmd->data;
 
 	ret = sdhci_wait_idle(&host->sdhci, cmd, data);
 	if (ret)
diff --git a/drivers/mci/atmel-sdhci.c b/drivers/mci/atmel-sdhci.c
index 7bf8004707..462cf21bc2 100644
--- a/drivers/mci/atmel-sdhci.c
+++ b/drivers/mci/atmel-sdhci.c
@@ -29,10 +29,9 @@ struct at91_sdhci_priv {
 
 #define to_priv(h) container_of(h, struct at91_sdhci_priv, mci)
 
-static int at91_sdhci_mci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
-				   struct mci_data *data)
+static int at91_sdhci_mci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
-	return at91_sdhci_send_command(&to_priv(mci)->host, cmd, data);
+	return at91_sdhci_send_command(&to_priv(mci)->host, cmd, cmd->data);
 }
 
 static void at91_sdhci_mci_set_ios(struct mci_host *mci, struct mci_ios *ios)
diff --git a/drivers/mci/atmel_mci.c b/drivers/mci/atmel_mci.c
index 1012feb6c2..65e53d7202 100644
--- a/drivers/mci/atmel_mci.c
+++ b/drivers/mci/atmel_mci.c
@@ -23,12 +23,11 @@ static void atmci_set_ios(struct mci_host *mci, struct mci_ios *ios)
 	atmci_common_set_ios(host, ios);
 }
 
-static int atmci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
-		  struct mci_data *data)
+static int atmci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct atmel_mci *host = to_mci_host(mci);
 
-	return atmci_common_request(host, cmd, data);
+	return atmci_common_request(host, cmd, cmd->data);
 }
 
 static void atmci_info(struct device *mci_dev)
diff --git a/drivers/mci/atmel_mci_pbl.c b/drivers/mci/atmel_mci_pbl.c
index 27727b2734..b70997a918 100644
--- a/drivers/mci/atmel_mci_pbl.c
+++ b/drivers/mci/atmel_mci_pbl.c
@@ -9,10 +9,9 @@
 #define SUPPORT_MAX_BLOCKS		16U
 
 static int pbl_atmci_common_request(struct pbl_mci *mci,
-				    struct mci_cmd *cmd,
-				    struct mci_data *data)
+				    struct mci_cmd *cmd)
 {
-	return atmci_common_request(mci->priv, cmd, data);
+	return atmci_common_request(mci->priv, cmd, cmd->data);
 }
 
 static struct atmel_mci atmci_host;
diff --git a/drivers/mci/bcm2835-sdhost.c b/drivers/mci/bcm2835-sdhost.c
index 9ed7cffb55..31c28ef3fb 100644
--- a/drivers/mci/bcm2835-sdhost.c
+++ b/drivers/mci/bcm2835-sdhost.c
@@ -521,10 +521,10 @@ static void bcm2835_set_clock(struct bcm2835_host *host, unsigned int clock)
 	writel(clock / 2, host->regs + SDTOUT);
 }
 
-static int bcm2835_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
-			    struct mci_data *data)
+static int bcm2835_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct bcm2835_host *host = to_bcm2835_host(mci);
+	struct mci_data *data = cmd->data;
 	u32 edm, fsm;
 	int ret = 0;
 
diff --git a/drivers/mci/dove-sdhci.c b/drivers/mci/dove-sdhci.c
index 71045016a1..45b996cca8 100644
--- a/drivers/mci/dove-sdhci.c
+++ b/drivers/mci/dove-sdhci.c
@@ -54,13 +54,13 @@ static int dove_sdhci_wait_for_done(struct dove_sdhci *host, u16 mask)
 	return 0;
 }
 
-static int dove_sdhci_mci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
-				struct mci_data *data)
+static int dove_sdhci_mci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	u32 command, xfer;
 	int ret;
 	unsigned int num_bytes = 0;
 	struct dove_sdhci *host = priv_from_mci_host(mci);
+	struct mci_data *data = cmd->data;
 
 	ret = sdhci_wait_idle_data(&host->sdhci, cmd);
 	if (ret)
diff --git a/drivers/mci/dw_mmc.c b/drivers/mci/dw_mmc.c
index 30e5d56944..9944693d01 100644
--- a/drivers/mci/dw_mmc.c
+++ b/drivers/mci/dw_mmc.c
@@ -263,7 +263,7 @@ static int dwmci_write_data_pio(struct dwmci_host *host, struct mci_data *data)
 }
 
 static int
-dwmci_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
+dwmci_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct dwmci_host *host = to_dwmci_host(mci);
 	int flags = 0;
@@ -273,6 +273,7 @@ dwmci_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
 	int ret;
 	unsigned int num_bytes = 0;
 	dma_addr_t dma = 0;
+	struct mci_data *data = cmd->data;
 
 	start = get_time_ns();
 	while (1) {
diff --git a/drivers/mci/dwcmshc-sdhci.c b/drivers/mci/dwcmshc-sdhci.c
index 6fdbb61565..7f467e52b5 100644
--- a/drivers/mci/dwcmshc-sdhci.c
+++ b/drivers/mci/dwcmshc-sdhci.c
@@ -102,12 +102,11 @@ static int do_abort_sequence(struct mci_host *mci, struct mci_cmd *current_cmd)
 	return ret;
 }
 
-static int dwcmshc_mci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
-				struct mci_data *data)
+static int dwcmshc_mci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
 		return do_abort_sequence(mci, cmd);
-	return do_send_cmd(mci, cmd, data);
+	return do_send_cmd(mci, cmd, cmd->data);
 }
 
 static int do_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c
index 6dd3bef457..ba33daffc4 100644
--- a/drivers/mci/imx-esdhc.c
+++ b/drivers/mci/imx-esdhc.c
@@ -75,12 +75,11 @@
  * Sends a command out on the bus.  Takes the mci pointer,
  * a command pointer, and an optional data pointer.
  */
-static int
-esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
+static int esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct fsl_esdhc_host *host = to_fsl_esdhc(mci);
 
-	return  __esdhc_send_cmd(host, cmd, data);
+	return  __esdhc_send_cmd(host, cmd, cmd->data);
 }
 
 static void set_sysctl(struct mci_host *mci, u32 clock, bool ddr)
diff --git a/drivers/mci/imx.c b/drivers/mci/imx.c
index d462cb8843..15f80697ba 100644
--- a/drivers/mci/imx.c
+++ b/drivers/mci/imx.c
@@ -378,10 +378,10 @@ static int mxcmci_cmd_done(struct mxcmci_host *host, unsigned int stat)
 	return ret;
 }
 
-static int mxcmci_request(struct mci_host *mci, struct mci_cmd *cmd,
-		struct mci_data *data)
+static int mxcmci_request(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct mxcmci_host *host = to_mxcmci(mci);
+	struct mci_data *data = cmd->data;
 	unsigned int cmdat = host->cmdat;
 	u32 stat;
 	int ret;
diff --git a/drivers/mci/mci-bcm2835.c b/drivers/mci/mci-bcm2835.c
index aad5ae0d9e..d33e54d2ab 100644
--- a/drivers/mci/mci-bcm2835.c
+++ b/drivers/mci/mci-bcm2835.c
@@ -114,11 +114,12 @@ static void bcm2835_mci_reset_emmc(struct bcm2835_mci_host *host, u32 reset,
  * @param data The data to handle in the command (can be NULL)
  * @return 0 on success, negative value else
  */
-static int bcm2835_mci_request(struct mci_host *mci, struct mci_cmd *cmd,
-		struct mci_data *data) {
+static int bcm2835_mci_request(struct mci_host *mci, struct mci_cmd *cmd)
+{
 	u32 command, block_data = 0, transfer_mode = 0;
 	int ret;
 	struct bcm2835_mci_host *host = to_bcm2835_host(mci);
+	struct mci_data *data = cmd->data;
 
 	sdhci_set_cmd_xfer_mode(&host->sdhci, cmd, data, false,
 				&command, &transfer_mode);
diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index 37d864b3d0..69ae52a29a 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -72,11 +72,11 @@ static inline unsigned mci_caps(struct mci *mci)
  * @param data The data according to the command (can be NULL)
  * @return Driver's answer (0 on success)
  */
-int mci_send_cmd(struct mci *mci, struct mci_cmd *cmd, struct mci_data *data)
+int mci_send_cmd(struct mci *mci, struct mci_cmd *cmd)
 {
 	struct mci_host *host = mci->host;
 
-	return host->ops.send_cmd(mci->host, cmd, data);
+	return host->ops.send_cmd(mci->host, cmd);
 }
 
 /**
@@ -90,12 +90,12 @@ int mci_send_cmd(struct mci *mci, struct mci_cmd *cmd, struct mci_data *data)
  * Return: 0 if ok, -ve on error
  */
 static int mci_send_cmd_retry(struct mci *mci, struct mci_cmd *cmd,
-			      struct mci_data *data, unsigned retries)
+			      unsigned int retries)
 {
 	int ret;
 
 	do
-		ret = mci_send_cmd(mci, cmd, data);
+		ret = mci_send_cmd(mci, cmd);
 	while (ret && retries--);
 
 	return ret;
@@ -108,11 +108,11 @@ static int mci_send_cmd_retry(struct mci *mci, struct mci_cmd *cmd,
  */
 static int mci_set_dsr(struct mci *mci)
 {
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 
 	mci_setup_cmd(&cmd, MMC_CMD_SET_DSR,
 			(mci->host->dsr_val >> 16) | 0xffff, MMC_RSP_NONE);
-	return mci_send_cmd(mci, &cmd, NULL);
+	return mci_send_cmd(mci, &cmd);
 }
 
 /**
@@ -123,13 +123,13 @@ static int mci_set_dsr(struct mci *mci)
  */
 static int mci_set_blocklen(struct mci *mci, unsigned len)
 {
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 
 	if (mci->host->ios.timing == MMC_TIMING_MMC_DDR52)
 		return 0;
 
 	mci_setup_cmd(&cmd, MMC_CMD_SET_BLOCKLEN, len, MMC_RSP_R1);
-	return mci_send_cmd_retry(mci, &cmd, NULL, 4);
+	return mci_send_cmd_retry(mci, &cmd, 4);
 }
 
 static void *sector_buf;
@@ -137,7 +137,7 @@ static void *sector_buf;
 static int mci_send_status(struct mci *mci, unsigned int *status)
 {
 	struct mci_host *host = mci->host;
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 	int ret;
 
 	/*
@@ -151,7 +151,7 @@ static int mci_send_status(struct mci *mci, unsigned int *status)
 	cmd.resp_type = MMC_RSP_R1;
 	cmd.cmdarg = mci->rca << 16;
 
-	ret = mci_send_cmd_retry(mci, &cmd, NULL, 4);
+	ret = mci_send_cmd_retry(mci, &cmd, 4);
 	if (!ret)
 		*status = cmd.response[0];
 
@@ -161,14 +161,13 @@ static int mci_send_status(struct mci *mci, unsigned int *status)
 static int mci_app_sd_status(struct mci *mci, __be32 *ssr)
 {
 	int err;
-	struct mci_cmd cmd = {};
-	struct mci_data data;
+	struct mci_cmd cmd = {0};
 
 	cmd.cmdidx = MMC_CMD_APP_CMD;
 	cmd.resp_type = MMC_RSP_R1;
 	cmd.cmdarg = mci->rca << 16;
 
-	err = mci_send_cmd_retry(mci, &cmd, NULL, 4);
+	err = mci_send_cmd_retry(mci, &cmd, 4);
 	if (err)
 		return err;
 
@@ -176,12 +175,14 @@ static int mci_app_sd_status(struct mci *mci, __be32 *ssr)
 	cmd.resp_type = MMC_RSP_R1;
 	cmd.cmdarg = 0;
 
-	data.dest = (u8 *)ssr;
-	data.blocksize = 64;
-	data.blocks = 1;
-	data.flags = MMC_DATA_READ;
+	cmd.data = xzalloc(sizeof(struct mci_data));
+
+	cmd.data->dest = (u8 *)ssr;
+	cmd.data->blocksize = 64;
+	cmd.data->blocks = 1;
+	cmd.data->flags = MMC_DATA_READ;
 
-	return mci_send_cmd_retry(mci, &cmd, &data, 3);
+	return mci_send_cmd_retry(mci, &cmd, 3);
 }
 
 static int mmc_switch_status_error(struct mci_host *host, u32 status)
@@ -262,7 +263,6 @@ static int mci_block_write(struct mci *mci, const void *src, int blocknum,
 			   int blocks)
 {
 	struct mci_cmd cmd = {};
-	struct mci_data data;
 	unsigned mmccmd;
 	int ret;
 
@@ -287,16 +287,19 @@ static int mci_block_write(struct mci *mci, const void *src, int blocknum,
 		mci->high_capacity != 0 ? blocknum : blocknum * mci->write_bl_len,
 		MMC_RSP_R1);
 
-	data.src = src;
-	data.blocks = blocks;
-	data.blocksize = mci->write_bl_len;
-	data.flags = MMC_DATA_WRITE;
+	cmd.data = xzalloc(sizeof(struct mci_data));
+
+	cmd.data->src = src;
+	cmd.data->blocks = blocks;
+	cmd.data->blocksize = mci->write_bl_len;
+	cmd.data->flags = MMC_DATA_WRITE;
 
-	ret = mci_send_cmd(mci, &cmd, &data);
+	ret = mci_send_cmd(mci, &cmd);
 
 	if (ret || blocks > 1) {
 		mci_setup_cmd(&cmd, MMC_CMD_STOP_TRANSMISSION, 0, MMC_RSP_R1b);
-		mci_send_cmd(mci, &cmd, NULL);
+		cmd.data = NULL;
+		mci_send_cmd(mci, &cmd);
         }
 
 	return ret;
@@ -313,7 +316,7 @@ static int mci_block_erase(struct mci *card, unsigned int from,
 			   unsigned int blkcnt, unsigned int arg)
 {
 	unsigned int to = from + blkcnt - 1;
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 	int err;
 
 	if (!card->high_capacity) {
@@ -324,7 +327,7 @@ static int mci_block_erase(struct mci *card, unsigned int from,
 	cmd.cmdidx = IS_SD(card) ? SD_ERASE_WR_BLK_START : MMC_ERASE_GROUP_START;
 	cmd.cmdarg = from;
 	cmd.resp_type = MMC_RSP_R1;
-	err = mci_send_cmd(card, &cmd, NULL);
+	err = mci_send_cmd(card, &cmd);
 	if (err)
 		goto err_out;
 
@@ -332,7 +335,7 @@ static int mci_block_erase(struct mci *card, unsigned int from,
 	cmd.cmdidx = IS_SD(card) ? SD_ERASE_WR_BLK_END : MMC_ERASE_GROUP_END;
 	cmd.cmdarg = to;
 	cmd.resp_type = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC;
-	err = mci_send_cmd(card, &cmd, NULL);
+	err = mci_send_cmd(card, &cmd);
 	if (err)
 		goto err_out;
 
@@ -340,8 +343,7 @@ static int mci_block_erase(struct mci *card, unsigned int from,
 	cmd.cmdidx = MMC_ERASE;
 	cmd.cmdarg = arg;
 	cmd.resp_type = MMC_RSP_R1b;
-
-	err = mci_send_cmd(card, &cmd, NULL);
+	err = mci_send_cmd(card, &cmd);
 	if (err)
 		goto err_out;
 
@@ -355,11 +357,11 @@ static int mci_block_erase(struct mci *card, unsigned int from,
 
 int mci_set_blockcount(struct mci *mci, unsigned int cmdarg)
 {
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 
 	mci_setup_cmd(&cmd, MMC_CMD_SET_BLOCK_COUNT, cmdarg, MMC_RSP_R1);
 
-	return mci_send_cmd(mci, &cmd, NULL);
+	return mci_send_cmd(mci, &cmd);
 }
 
 /**
@@ -373,7 +375,6 @@ static int mci_block_read(struct mci *mci, void *dst, int blocknum,
 			  int blocks)
 {
 	struct mci_cmd cmd = {};
-	struct mci_data data;
 	int ret;
 	unsigned mmccmd;
 
@@ -387,17 +388,20 @@ static int mci_block_read(struct mci *mci, void *dst, int blocknum,
 		mci->high_capacity != 0 ? blocknum : blocknum * mci->read_bl_len,
 		MMC_RSP_R1);
 
-	data.dest = dst;
-	data.blocks = blocks;
-	data.blocksize = mci->read_bl_len;
-	data.flags = MMC_DATA_READ;
+	cmd.data = xzalloc(sizeof(struct mci_data));
 
-	ret = mci_send_cmd(mci, &cmd, &data);
+	cmd.data->dest = dst;
+	cmd.data->blocks = blocks;
+	cmd.data->blocksize = mci->read_bl_len;
+	cmd.data->flags = MMC_DATA_READ;
+
+	ret = mci_send_cmd(mci, &cmd);
 
 	if (ret || blocks > 1) {
 		mci_setup_cmd(&cmd, MMC_CMD_STOP_TRANSMISSION, 0,
 			      IS_SD(mci) ? MMC_RSP_R1b : MMC_RSP_R1);
-		mci_send_cmd(mci, &cmd, NULL);
+		cmd.data = NULL;
+		mci_send_cmd(mci, &cmd);
 	}
 	return ret;
 }
@@ -409,13 +413,13 @@ static int mci_block_read(struct mci *mci, void *dst, int blocknum,
  */
 static int mci_go_idle(struct mci *mci)
 {
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 	int err;
 
 	udelay(1000);
 
 	mci_setup_cmd(&cmd, MMC_CMD_GO_IDLE_STATE, 0, MMC_RSP_NONE);
-	err = mci_send_cmd(mci, &cmd, NULL);
+	err = mci_send_cmd(mci, &cmd);
 
 	if (err) {
 		dev_dbg(&mci->dev, "Activating IDLE state failed: %d\n", err);
@@ -429,11 +433,11 @@ static int mci_go_idle(struct mci *mci)
 
 static int sdio_send_op_cond(struct mci *mci)
 {
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 
 	mci_setup_cmd(&cmd, SD_IO_SEND_OP_COND, 0, MMC_RSP_SPI_R4 | MMC_RSP_R4 | MMC_CMD_BCR);
 
-	return mci_send_cmd(mci, &cmd, NULL);
+	return mci_send_cmd(mci, &cmd);
 }
 
 /**
@@ -444,7 +448,7 @@ static int sdio_send_op_cond(struct mci *mci)
 static int sd_send_op_cond(struct mci *mci)
 {
 	struct mci_host *host = mci->host;
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 	int timeout = 1000;
 	int err;
 	unsigned voltages;
@@ -462,7 +466,7 @@ static int sd_send_op_cond(struct mci *mci)
 
 	do {
 		mci_setup_cmd(&cmd, MMC_CMD_APP_CMD, 0, MMC_RSP_R1);
-		err = mci_send_cmd(mci, &cmd, NULL);
+		err = mci_send_cmd(mci, &cmd);
 		if (err) {
 			dev_dbg(&mci->dev, "Preparing SD for operating conditions failed: %d\n", err);
 			return err;
@@ -474,7 +478,7 @@ static int sd_send_op_cond(struct mci *mci)
 			arg |= OCR_HCS;
 
 		mci_setup_cmd(&cmd, SD_CMD_APP_SEND_OP_COND, arg, MMC_RSP_R3);
-		err = mci_send_cmd(mci, &cmd, NULL);
+		err = mci_send_cmd(mci, &cmd);
 		if (err) {
 			dev_dbg(&mci->dev, "SD operation condition set failed: %d\n", err);
 			return err;
@@ -498,7 +502,7 @@ static int sd_send_op_cond(struct mci *mci)
 
 	if (mmc_host_is_spi(host)) { /* read OCR for spi */
 		mci_setup_cmd(&cmd, MMC_CMD_SPI_READ_OCR, 0, MMC_RSP_R3);
-		err = mci_send_cmd(mci, &cmd, NULL);
+		err = mci_send_cmd(mci, &cmd);
 		if (err)
 			return err;
 	}
@@ -519,7 +523,7 @@ static int sd_send_op_cond(struct mci *mci)
 static int mmc_send_op_cond(struct mci *mci)
 {
 	struct mci_host *host = mci->host;
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 	int timeout = 1000;
 	int err;
 
@@ -529,7 +533,7 @@ static int mmc_send_op_cond(struct mci *mci)
 	do {
 		mci_setup_cmd(&cmd, MMC_CMD_SEND_OP_COND, OCR_HCS |
 				host->voltages, MMC_RSP_R3);
-		err = mci_send_cmd(mci, &cmd, NULL);
+		err = mci_send_cmd(mci, &cmd);
 
 		if (err) {
 			dev_dbg(&mci->dev, "Preparing MMC for operating conditions failed: %d\n", err);
@@ -565,17 +569,18 @@ static int mmc_send_op_cond(struct mci *mci)
 int mci_send_ext_csd(struct mci *mci, char *ext_csd)
 {
 	struct mci_cmd cmd = {};
-	struct mci_data data;
 
 	/* Get the Card Status Register */
 	mci_setup_cmd(&cmd, MMC_CMD_SEND_EXT_CSD, 0, MMC_RSP_R1);
 
-	data.dest = ext_csd;
-	data.blocks = 1;
-	data.blocksize = 512;
-	data.flags = MMC_DATA_READ;
+	cmd.data = xzalloc(sizeof(struct mci_data));
+
+	cmd.data->dest = ext_csd;
+	cmd.data->blocks = 1;
+	cmd.data->blocksize = 512;
+	cmd.data->flags = MMC_DATA_READ;
 
-	return mci_send_cmd(mci, &cmd, &data);
+	return mci_send_cmd(mci, &cmd);
 }
 
 /**
@@ -593,7 +598,7 @@ int mci_send_ext_csd(struct mci *mci, char *ext_csd)
 int mci_switch(struct mci *mci, unsigned index, unsigned value)
 {
 	unsigned int status;
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 	int ret;
 
 	mci_setup_cmd(&cmd, MMC_CMD_SWITCH,
@@ -602,7 +607,7 @@ int mci_switch(struct mci *mci, unsigned index, unsigned value)
 		(value << 8),
 		 MMC_RSP_R1b);
 
-	ret = mci_send_cmd(mci, &cmd, NULL);
+	ret = mci_send_cmd(mci, &cmd);
 	if (ret)
 		return ret;
 
@@ -853,7 +858,6 @@ static int sd_switch(struct mci *mci, unsigned mode, unsigned group,
 			unsigned value, uint8_t *resp)
 {
 	struct mci_cmd cmd = {};
-	struct mci_data data;
 	unsigned arg;
 
 	arg = (mode << 31) | 0xffffff;
@@ -863,12 +867,13 @@ static int sd_switch(struct mci *mci, unsigned mode, unsigned group,
 	/* Switch the frequency */
 	mci_setup_cmd(&cmd, SD_CMD_SWITCH_FUNC, arg, MMC_RSP_R1);
 
-	data.dest = resp;
-	data.blocksize = 64;
-	data.blocks = 1;
-	data.flags = MMC_DATA_READ;
+	cmd.data = xzalloc(sizeof(struct mci_data));
+	cmd.data->dest = resp;
+	cmd.data->blocksize = 64;
+	cmd.data->blocks = 1;
+	cmd.data->flags = MMC_DATA_READ;
 
-	return mci_send_cmd(mci, &cmd, &data);
+	return mci_send_cmd(mci, &cmd);
 }
 
 static int sd_read_ssr(struct mci *mci)
@@ -921,8 +926,7 @@ static int sd_read_ssr(struct mci *mci)
  */
 static int sd_change_freq(struct mci *mci)
 {
-	struct mci_cmd cmd = {};
-	struct mci_data data;
+	struct mci_cmd cmd = {0};
 	struct mci_host *host = mci->host;
 	uint32_t *switch_status = sector_buf;
 	uint32_t *scr = sector_buf;
@@ -937,7 +941,7 @@ static int sd_change_freq(struct mci *mci)
 
 	/* Read the SCR to find out if this card supports higher speeds */
 	mci_setup_cmd(&cmd, MMC_CMD_APP_CMD, mci->rca << 16, MMC_RSP_R1);
-	err = mci_send_cmd(mci, &cmd, NULL);
+	err = mci_send_cmd(mci, &cmd);
 	if (err) {
 		dev_dbg(&mci->dev, "Query SD card capabilities failed: %d\n", err);
 		return err;
@@ -947,14 +951,17 @@ static int sd_change_freq(struct mci *mci)
 
 	timeout = 3;
 
+	cmd.data = xzalloc(sizeof(struct mci_data));
+
 retry_scr:
 	dev_dbg(&mci->dev, "Trying to read the SCR (try %d of %d)\n", 4 - timeout, 3);
-	data.dest = (char *)scr;
-	data.blocksize = 8;
-	data.blocks = 1;
-	data.flags = MMC_DATA_READ;
 
-	err = mci_send_cmd(mci, &cmd, &data);
+	cmd.data->dest = (char *)scr;
+	cmd.data->blocksize = 8;
+	cmd.data->blocks = 1;
+	cmd.data->flags = MMC_DATA_READ;
+
+	err = mci_send_cmd(mci, &cmd);
 	if (err) {
 		dev_dbg(&mci->dev, " Catch error (%d)", err);
 		if (timeout--) {
@@ -1449,7 +1456,8 @@ static int mci_startup_sd(struct mci *mci)
 	if (mci_caps(mci) & MMC_CAP_4_BIT_DATA) {
 		dev_dbg(&mci->dev, "Prepare for bus width change\n");
 		mci_setup_cmd(&cmd, MMC_CMD_APP_CMD, mci->rca << 16, MMC_RSP_R1);
-		err = mci_send_cmd(mci, &cmd, NULL);
+		cmd.data = NULL;
+		err = mci_send_cmd(mci, &cmd);
 		if (err) {
 			dev_dbg(&mci->dev, "Preparing SD for bus width change failed: %d\n", err);
 			return err;
@@ -1457,7 +1465,7 @@ static int mci_startup_sd(struct mci *mci)
 
 		dev_dbg(&mci->dev, "Set SD bus width to 4 bit\n");
 		mci_setup_cmd(&cmd, SD_CMD_APP_SET_BUS_WIDTH, 2, MMC_RSP_R1);
-		err = mci_send_cmd(mci, &cmd, NULL);
+		err = mci_send_cmd(mci, &cmd);
 		if (err) {
 			dev_warn(&mci->dev, "Changing SD bus width failed: %d\n", err);
 			/* TODO continue with 1 bit? */
@@ -1644,7 +1652,6 @@ static const u8 tuning_blk_pattern_8bit[] = {
 int mmc_send_tuning(struct mci *mci, u32 opcode)
 {
 	struct mci_cmd cmd = {};
-	struct mci_data data = {};
 	const u8 *tuning_block_pattern;
 	int size, err = 0;
 	u8 *data_buf;
@@ -1664,19 +1671,19 @@ int mmc_send_tuning(struct mci *mci, u32 opcode)
 
 	mci_setup_cmd(&cmd, opcode, 0, MMC_RSP_R1 | MMC_CMD_ADTC);
 
-
-	data.blocksize = size;
-	data.blocks = 1;
-	data.flags = MMC_DATA_READ;
+	cmd.data = xzalloc(sizeof(struct mci_data));
+	cmd.data->blocksize = size;
+	cmd.data->blocks = 1;
+	cmd.data->flags = MMC_DATA_READ;
 
 	/*
 	 * According to the tuning specs, Tuning process
 	 * is normally shorter 40 executions of CMD19,
 	 * and timeout value should be shorter than 150 ms
 	 */
-	data.timeout_ns = 150 * NSEC_PER_MSEC;
+	cmd.data->timeout_ns = 150 * NSEC_PER_MSEC;
 
-	err = mci_send_cmd(mci, &cmd, &data);
+	err = mci_send_cmd(mci, &cmd);
 	if (err)
 		goto out;
 
@@ -1691,7 +1698,7 @@ EXPORT_SYMBOL_GPL(mmc_send_tuning);
 
 int mci_send_abort_tuning(struct mci *mci, u32 opcode)
 {
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 
 	/*
 	 * eMMC specification specifies that CMD12 can be used to stop a tuning
@@ -1704,7 +1711,7 @@ int mci_send_abort_tuning(struct mci *mci, u32 opcode)
 	cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
 	cmd.resp_type = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC;
 
-	return mci_send_cmd(mci, &cmd, NULL);
+	return mci_send_cmd(mci, &cmd);
 }
 EXPORT_SYMBOL_GPL(mci_send_abort_tuning);
 
@@ -2022,13 +2029,13 @@ static void mci_init_erase(struct mci *card)
 static int mci_startup(struct mci *mci)
 {
 	struct mci_host *host = mci->host;
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 	int err;
 
 	if (IS_ENABLED(CONFIG_MMC_SPI_CRC_ON) && mmc_host_is_spi(host)) { /* enable CRC check for spi */
 
 		mci_setup_cmd(&cmd, MMC_CMD_SPI_CRC_ON_OFF, 1, MMC_RSP_R1);
-		err = mci_send_cmd(mci, &cmd, NULL);
+		err = mci_send_cmd(mci, &cmd);
 
 		if (err) {
 			dev_dbg(&mci->dev, "Can't enable CRC check : %d\n", err);
@@ -2040,7 +2047,7 @@ static int mci_startup(struct mci *mci)
 
 	/* Put the Card in Identify Mode */
 	mci_setup_cmd(&cmd, mmc_host_is_spi(host) ? MMC_CMD_SEND_CID : MMC_CMD_ALL_SEND_CID, 0, MMC_RSP_R2);
-	err = mci_send_cmd(mci, &cmd, NULL);
+	err = mci_send_cmd(mci, &cmd);
 	if (err) {
 		dev_dbg(&mci->dev, "Can't bring card into identify mode: %d\n", err);
 		return err;
@@ -2059,7 +2066,7 @@ static int mci_startup(struct mci *mci)
 	if (!mmc_host_is_spi(host)) { /* cmd not supported in spi */
 		dev_dbg(&mci->dev, "Get/Set relative address\n");
 		mci_setup_cmd(&cmd, SD_CMD_SEND_RELATIVE_ADDR, mci->rca << 16, MMC_RSP_R6);
-		err = mci_send_cmd(mci, &cmd, NULL);
+		err = mci_send_cmd(mci, &cmd);
 		if (err) {
 			dev_dbg(&mci->dev, "Get/Set relative address failed: %d\n", err);
 			return err;
@@ -2072,7 +2079,7 @@ static int mci_startup(struct mci *mci)
 	dev_dbg(&mci->dev, "Get card's specific data\n");
 	/* Get the Card-Specific Data */
 	mci_setup_cmd(&cmd, MMC_CMD_SEND_CSD, mci->rca << 16, MMC_RSP_R2);
-	err = mci_send_cmd(mci, &cmd, NULL);
+	err = mci_send_cmd(mci, &cmd);
 	if (err) {
 		dev_dbg(&mci->dev, "Getting card's specific data failed: %d\n", err);
 		return err;
@@ -2111,7 +2118,7 @@ static int mci_startup(struct mci *mci)
 		dev_dbg(&mci->dev, "Select the card, and put it into Transfer Mode\n");
 		/* Select the card, and put it into Transfer Mode */
 		mci_setup_cmd(&cmd, MMC_CMD_SELECT_CARD, mci->rca << 16, MMC_RSP_R1b);
-		err = mci_send_cmd(mci, &cmd, NULL);
+		err = mci_send_cmd(mci, &cmd);
 		if (err) {
 			dev_dbg(&mci->dev, "Putting in transfer mode failed: %d\n", err);
 			return err;
@@ -2166,14 +2173,14 @@ static int mci_startup(struct mci *mci)
 static int sd_send_if_cond(struct mci *mci)
 {
 	struct mci_host *host = mci->host;
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 	int err;
 
 	mci_setup_cmd(&cmd, SD_CMD_SEND_IF_COND,
 	/* We set the bit if the host supports voltages between 2.7 and 3.6 V */
 		((host->voltages & 0x00ff8000) != 0) << 8 | 0xaa,
 		MMC_RSP_R7);
-	err = mci_send_cmd(mci, &cmd, NULL);
+	err = mci_send_cmd(mci, &cmd);
 	if (err) {
 		dev_dbg(&mci->dev, "Query interface conditions failed: %d\n", err);
 		return err;
diff --git a/drivers/mci/mci_spi.c b/drivers/mci/mci_spi.c
index 3ab90d768f..06693a5811 100644
--- a/drivers/mci/mci_spi.c
+++ b/drivers/mci/mci_spi.c
@@ -235,9 +235,10 @@ static uint mmc_spi_writedata(struct mmc_spi_host *host, const void *xbuf,
 	return r1;
 }
 
-static int mmc_spi_request(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
+static int mmc_spi_request(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct mmc_spi_host	*host = to_spi_host(mci);
+	struct mci_data *data = cmd->data;
 	uint8_t r1;
 	int i;
 	int ret = 0;
diff --git a/drivers/mci/mmci.c b/drivers/mci/mmci.c
index 1a70776bb1..7e1b5e3f2c 100644
--- a/drivers/mci/mmci.c
+++ b/drivers/mci/mmci.c
@@ -421,12 +421,12 @@ static int do_data_transfer(struct mci_host *mci, struct mci_cmd *cmd, struct mc
 	return error;
 }
 
-static int mci_request(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
+static int mci_request(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	int result;
 
-	if (data)
-		result = do_data_transfer(mci, cmd, data);
+	if (cmd->data)
+		result = do_data_transfer(mci, cmd, cmd->data);
 	else
 		result = do_command(mci, cmd);
 
diff --git a/drivers/mci/mxs.c b/drivers/mci/mxs.c
index 63a4813ff4..b297a978aa 100644
--- a/drivers/mci/mxs.c
+++ b/drivers/mci/mxs.c
@@ -461,16 +461,15 @@ static int mxs_mci_initialize(struct mci_host *host, struct device *mci_dev)
  * @param data The data to handle in the command (can be NULL)
  * @return 0 on success, negative value else
  */
-static int mxs_mci_request(struct mci_host *host, struct mci_cmd *cmd,
-			struct mci_data *data)
+static int mxs_mci_request(struct mci_host *host, struct mci_cmd *cmd)
 {
 	struct mxs_mci_host *mxs_mci = to_mxs_mci(host);
 	int rc;
 
-	if ((cmd->resp_type == 0) || (data == NULL))
+	if ((cmd->resp_type == 0) || (cmd->data == NULL))
 		rc = mxs_mci_std_cmds(mxs_mci, cmd);
 	else
-		rc = mxs_mci_adtc(mxs_mci, cmd, data);	/* with response and data */
+		rc = mxs_mci_adtc(mxs_mci, cmd, cmd->data);	/* with response and data */
 
 	mxs_mci_finish_request(mxs_mci);	/* TODO */
 	return rc;
diff --git a/drivers/mci/omap_hsmmc.c b/drivers/mci/omap_hsmmc.c
index 03f71eb453..4bc3ea4092 100644
--- a/drivers/mci/omap_hsmmc.c
+++ b/drivers/mci/omap_hsmmc.c
@@ -53,12 +53,11 @@ static int mmc_init_setup(struct mci_host *mci, struct device *dev)
 	return omap_hsmmc_init(hsmmc);
 }
 
-static int mmc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
-		struct mci_data *data)
+static int mmc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct omap_hsmmc *hsmmc = to_hsmmc(mci);
 
-	return omap_hsmmc_send_cmd(hsmmc, cmd, data);
+	return omap_hsmmc_send_cmd(hsmmc, cmd, cmd->data);
 }
 
 static void mmc_set_ios(struct mci_host *mci, struct mci_ios *ios)
diff --git a/drivers/mci/pxamci.c b/drivers/mci/pxamci.c
index 6b3e213be5..f337ea48ef 100644
--- a/drivers/mci/pxamci.c
+++ b/drivers/mci/pxamci.c
@@ -258,10 +258,10 @@ static int pxamci_mmccmd(struct pxamci_host *host, struct mci_cmd *cmd,
 	return ret;
 }
 
-static int pxamci_request(struct mci_host *mci, struct mci_cmd *cmd,
-			  struct mci_data *data)
+static int pxamci_request(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct pxamci_host *host = to_pxamci(mci);
+	struct mci_data *data = cmd->data;
 	unsigned int cmdat;
 	int ret;
 
diff --git a/drivers/mci/rockchip-dwcmshc-sdhci.c b/drivers/mci/rockchip-dwcmshc-sdhci.c
index c4c03f703a..eb1c8760bf 100644
--- a/drivers/mci/rockchip-dwcmshc-sdhci.c
+++ b/drivers/mci/rockchip-dwcmshc-sdhci.c
@@ -241,10 +241,10 @@ static void print_error(struct rk_sdhci_host *host, int cmdidx)
 		sdhci_read32(&host->sdhci, SDHCI_INT_NORMAL_STATUS));
 }
 
-static int rk_sdhci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
-				 struct mci_data *data)
+static int rk_sdhci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct rk_sdhci_host *host = to_rk_sdhci_host(mci);
+	struct mci_data *data = cmd->data;
 	u32 command, xfer;
 	int ret;
 	dma_addr_t dma;
diff --git a/drivers/mci/sdhci.c b/drivers/mci/sdhci.c
index 2d32a8b311..847c0dc516 100644
--- a/drivers/mci/sdhci.c
+++ b/drivers/mci/sdhci.c
@@ -62,7 +62,7 @@ static int sdhci_send_command_retry(struct sdhci *host, struct mci_cmd *cmd)
 		mdelay(1);
 	}
 
-	return host->mci->ops.send_cmd(host->mci, cmd, NULL);
+	return host->mci->ops.send_cmd(host->mci, cmd);
 }
 
 /*
@@ -74,7 +74,7 @@ static int sdhci_send_command_retry(struct sdhci *host, struct mci_cmd *cmd)
  */
 static int sdhci_send_tuning(struct sdhci *host, u32 opcode)
 {
-	struct mci_cmd cmd = {};
+	struct mci_cmd cmd = {0};
 	int ret;
 
 	cmd.cmdidx = opcode;
diff --git a/drivers/mci/stm32_sdmmc2.c b/drivers/mci/stm32_sdmmc2.c
index 8aeda6e988..36273ac270 100644
--- a/drivers/mci/stm32_sdmmc2.c
+++ b/drivers/mci/stm32_sdmmc2.c
@@ -476,10 +476,10 @@ static int stm32_sdmmc2_end_data(struct stm32_sdmmc2_priv *priv,
 	return 0;
 }
 
-static int stm32_sdmmc2_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
-				 struct mci_data *data)
+static int stm32_sdmmc2_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct stm32_sdmmc2_priv *priv = to_mci_host(mci);
+	struct mci_data *data = cmd->data;
 	u32 cmdat = data ? SDMMC_CMD_CMDTRANS : 0;
 	dma_addr_t dma_addr = DMA_ERROR_CODE;
 	u32 data_length = 0;
diff --git a/drivers/mci/sunxi-mmc.c b/drivers/mci/sunxi-mmc.c
index 376ef2c0a9..297e053ac8 100644
--- a/drivers/mci/sunxi-mmc.c
+++ b/drivers/mci/sunxi-mmc.c
@@ -20,14 +20,14 @@
 #include "sunxi-mmc.h"
 #include "sunxi-mmc-common.c"
 
-static int sdxc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
+static int sdxc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct sunxi_mmc_host *host = to_sunxi_mmc_host(mci);
 	struct device *dev = mci->hw_dev;
 	const char *why = "";
 	int ret;
 
-	ret = sunxi_mmc_send_cmd(host, cmd, data, &why);
+	ret = sunxi_mmc_send_cmd(host, cmd, cmd->data, &why);
 	if (ret && ret != -ETIMEDOUT && ret != -EINVAL)
 		dev_err(dev, "error %s CMD%d (%d)\n", why, cmd->cmdidx, ret);
 	if (ret == -ETIMEDOUT)
diff --git a/drivers/mci/tegra-sdmmc.c b/drivers/mci/tegra-sdmmc.c
index ce868b48ce..bc6a7728db 100644
--- a/drivers/mci/tegra-sdmmc.c
+++ b/drivers/mci/tegra-sdmmc.c
@@ -96,10 +96,10 @@ static int tegra_sdmmc_wait_inhibit(struct tegra_sdmmc_host *host,
 	return 0;
 }
 
-static int tegra_sdmmc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd,
-				struct mci_data *data)
+static int tegra_sdmmc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct tegra_sdmmc_host *host = to_tegra_sdmmc_host(mci);
+	struct mci_data *data = cmd->data;
 	unsigned int num_bytes = 0;
 	u32 val = 0, command, xfer;
 	int ret;
diff --git a/include/mci.h b/include/mci.h
index 50214aaae7..667829c489 100644
--- a/include/mci.h
+++ b/include/mci.h
@@ -489,6 +489,7 @@ struct mci_cmd {
 	unsigned cmdarg;	/**< Command's arguments */
 	unsigned busy_timeout;	/**< Busy timeout in ms */
 	unsigned response[4];	/**< card's response */
+	struct mci_data		*data;		/* data segment associated with cmd */
 };
 
 /**
@@ -575,7 +576,7 @@ struct mci_ops {
 	/** change host interface settings */
 	void (*set_ios)(struct mci_host*, struct mci_ios *);
 	/** handle a command */
-	int (*send_cmd)(struct mci_host*, struct mci_cmd*, struct mci_data*);
+	int (*send_cmd)(struct mci_host *host, struct mci_cmd *cmd);
 	/** check if a card is inserted */
 	int (*card_present)(struct mci_host *);
 	/** check if a card is write protected */
@@ -788,7 +789,7 @@ static inline int mci_send_abort_tuning(struct mci *mci, u32 opcode) { return -E
 int mmc_select_timing(struct mci *mci);
 int mci_set_blockcount(struct mci *mci, unsigned int cmdarg);
 int mci_blk_part_switch(struct mci_part *part);
-int mci_send_cmd(struct mci *mci, struct mci_cmd *cmd, struct mci_data *data);
+int mci_send_cmd(struct mci *mci, struct mci_cmd *cmd);
 struct mci *mci_get_rpmb_dev(unsigned int id);
 int mci_rpmb_route_frames(struct mci *mci, void *req, unsigned long reqlen,
 			  void *rsp, unsigned long rsplen);

-- 
2.52.0




  reply	other threads:[~2026-03-09 12:05 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-09 12:04 [PATCH v2 0/6] mci: cadence: add v6 support Steffen Trumtrar
2026-03-09 12:04 ` Steffen Trumtrar [this message]
2026-03-09 12:04 ` [PATCH v2 2/6] mci: sdhci: add sdhci_send_cmd Steffen Trumtrar
2026-03-09 12:04 ` [PATCH v2 3/6] mci: sdhci: add set_uhs_signaling callback Steffen Trumtrar
2026-03-09 12:04 ` [PATCH v2 4/6] mci: cadence: remove driver Steffen Trumtrar
2026-03-09 12:04 ` [PATCH v2 5/6] mci: cadence: add support for version 6 Steffen Trumtrar
2026-03-09 12:04 ` [PATCH v2 6/6] ARM: socfpga-agilex5_defconfig: enable cadencen-sdhci Steffen Trumtrar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260309-v2025-11-0-topic-socfpga-agilex5-sdhci-v2-1-fcc1f327acf8@pengutronix.de \
    --to=s.trumtrar@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=s.hauer@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox