All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <c7220277-3f90-9f1c-badf-94a77955f960@gmail.com>

diff --git a/a/1.txt b/N1/1.txt
index 3025e15..bf39ffe 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1292,4 +1292,33 @@ By the way, if you go with latest next kernel:
 STMMAC ethernet driver is broken currently, I had to go back to version from March 10th.
 
 Thanks in advance,
-Heiner
\ No newline at end of file
+Heiner
+
+-------------- next part --------------
+A non-text attachment was scrubbed...
+Name: 0001-factor-out-set-blksz.patch
+Type: text/x-diff
+Size: 2462 bytes
+Desc: not available
+URL: <http://lists.infradead.org/pipermail/linux-amlogic/attachments/20170329/e208851b/attachment.bin>
+-------------- next part --------------
+A non-text attachment was scrubbed...
+Name: 0002-factor-out-setting-response-bits.patch
+Type: text/x-diff
+Size: 1893 bytes
+Desc: not available
+URL: <http://lists.infradead.org/pipermail/linux-amlogic/attachments/20170329/e208851b/attachment-0001.bin>
+-------------- next part --------------
+A non-text attachment was scrubbed...
+Name: 0003-fix-sdio.patch
+Type: text/x-diff
+Size: 1651 bytes
+Desc: not available
+URL: <http://lists.infradead.org/pipermail/linux-amlogic/attachments/20170329/e208851b/attachment-0002.bin>
+-------------- next part --------------
+A non-text attachment was scrubbed...
+Name: 0004-change-to-desc-chain-mode.patch
+Type: text/x-diff
+Size: 8287 bytes
+Desc: not available
+URL: <http://lists.infradead.org/pipermail/linux-amlogic/attachments/20170329/e208851b/attachment-0003.bin>
\ No newline at end of file
diff --git a/a/2.hdr b/a/2.hdr
deleted file mode 100644
index 87071f1..0000000
--- a/a/2.hdr
+++ /dev/null
@@ -1,5 +0,0 @@
-Content-Type: text/x-diff;
- name="0001-factor-out-set-blksz.patch"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: attachment;
- filename="0001-factor-out-set-blksz.patch"
diff --git a/a/2.txt b/a/2.txt
deleted file mode 100644
index 2fce3cc..0000000
--- a/a/2.txt
+++ /dev/null
@@ -1,76 +0,0 @@
->From 24a33649061c56613955983b133b381c1cfc84fc Mon Sep 17 00:00:00 2001
-From: Heiner Kallweit <hkallweit1@gmail.com>
-Date: Sun, 26 Mar 2017 17:37:00 +0200
-Subject: [PATCH 1/4] factor out set blksz
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
----
- drivers/mmc/host/meson-gx-mmc.c | 42 ++++++++++++++++++++++++++---------------
- 1 file changed, 27 insertions(+), 15 deletions(-)
-
-diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
-index f5dd5cc7..0de32008 100644
---- a/drivers/mmc/host/meson-gx-mmc.c
-+++ b/drivers/mmc/host/meson-gx-mmc.c
-@@ -431,12 +431,36 @@ static void meson_mmc_request_done(struct mmc_host *mmc,
- 	mmc_request_done(host->mmc, mrq);
- }
- 
-+static void meson_mmc_set_blksz(struct mmc_host *mmc, unsigned int blksz)
-+{
-+	struct meson_host *host = mmc_priv(mmc);
-+	u32 cfg, blksz_old;
-+
-+	cfg = readl(host->regs + SD_EMMC_CFG);
-+	blksz_old = FIELD_GET(CFG_BLK_LEN_MASK, cfg);
-+
-+	if (!is_power_of_2(blksz))
-+		dev_err(host->dev, "blksz %u is not a power of 2\n", blksz);
-+
-+	blksz = ilog2(blksz);
-+
-+	/* check if block-size matches, if not update */
-+	if (blksz == blksz_old)
-+		return;
-+
-+	dev_dbg(host->dev, "%s: update blk_len %d -> %d\n", __func__,
-+		blksz_old, blksz);
-+
-+	cfg &= ~CFG_BLK_LEN_MASK;
-+	cfg |= FIELD_PREP(CFG_BLK_LEN_MASK, blksz);
-+	writel(cfg, host->regs + SD_EMMC_CFG);
-+}
-+
- static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)
- {
- 	struct meson_host *host = mmc_priv(mmc);
- 	struct mmc_data *data = cmd->data;
--	u32 cfg, cmd_cfg = 0, cmd_data = 0;
--	u8 blk_len;
-+	u32 cmd_cfg = 0, cmd_data = 0;
- 	unsigned int xfer_bytes = 0;
- 
- 	/* Setup descriptors */
-@@ -470,19 +494,7 @@ static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)
- 			cmd_cfg |= CMD_CFG_BLOCK_MODE;
- 			cmd_cfg |= FIELD_PREP(CMD_CFG_LENGTH_MASK,
- 					      data->blocks);
--
--			/* check if block-size matches, if not update */
--			cfg = readl(host->regs + SD_EMMC_CFG);
--			blk_len = FIELD_GET(CFG_BLK_LEN_MASK, cfg);
--			if (blk_len != ilog2(data->blksz)) {
--				dev_dbg(host->dev, "%s: update blk_len %d -> %d\n",
--					__func__, blk_len,
--					ilog2(data->blksz));
--				blk_len = ilog2(data->blksz);
--				cfg &= ~CFG_BLK_LEN_MASK;
--				cfg |= FIELD_PREP(CFG_BLK_LEN_MASK, blk_len);
--				writel(cfg, host->regs + SD_EMMC_CFG);
--			}
-+			meson_mmc_set_blksz(mmc, data->blksz);
- 		} else {
- 			cmd_cfg |= FIELD_PREP(CMD_CFG_LENGTH_MASK, data->blksz);
- 		}
--- 
-2.12.1
\ No newline at end of file
diff --git a/a/3.hdr b/a/3.hdr
deleted file mode 100644
index e5c4f9f..0000000
--- a/a/3.hdr
+++ /dev/null
@@ -1,5 +0,0 @@
-Content-Type: text/x-diff;
- name="0002-factor-out-setting-response-bits.patch"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: attachment;
- filename="0002-factor-out-setting-response-bits.patch"
diff --git a/a/3.txt b/a/3.txt
deleted file mode 100644
index 8df102e..0000000
--- a/a/3.txt
+++ /dev/null
@@ -1,62 +0,0 @@
->From 86b1374413af88de7f3e98c072a474ae81956bef Mon Sep 17 00:00:00 2001
-From: Heiner Kallweit <hkallweit1@gmail.com>
-Date: Sun, 26 Mar 2017 17:57:09 +0200
-Subject: [PATCH 2/4] factor out setting response bits
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
----
- drivers/mmc/host/meson-gx-mmc.c | 32 ++++++++++++++++++--------------
- 1 file changed, 18 insertions(+), 14 deletions(-)
-
-diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
-index 0de32008..0036680b 100644
---- a/drivers/mmc/host/meson-gx-mmc.c
-+++ b/drivers/mmc/host/meson-gx-mmc.c
-@@ -456,6 +456,23 @@ static void meson_mmc_set_blksz(struct mmc_host *mmc, unsigned int blksz)
- 	writel(cfg, host->regs + SD_EMMC_CFG);
- }
- 
-+static void meson_mmc_set_response_bits(struct mmc_command *cmd, u32 *cmd_cfg)
-+{
-+	if (cmd->flags & MMC_RSP_PRESENT) {
-+		if (cmd->flags & MMC_RSP_136)
-+			*cmd_cfg |= CMD_CFG_RESP_128;
-+		*cmd_cfg |= CMD_CFG_RESP_NUM;
-+
-+		if (!(cmd->flags & MMC_RSP_CRC))
-+			*cmd_cfg |= CMD_CFG_RESP_NOCRC;
-+
-+		if (cmd->flags & MMC_RSP_BUSY)
-+			*cmd_cfg |= CMD_CFG_R1B;
-+	} else {
-+		*cmd_cfg |= CMD_CFG_NO_RESP;
-+	}
-+}
-+
- static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)
- {
- 	struct meson_host *host = mmc_priv(mmc);
-@@ -469,20 +486,7 @@ static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)
- 	cmd_cfg |= FIELD_PREP(CMD_CFG_CMD_INDEX_MASK, cmd->opcode);
- 	cmd_cfg |= CMD_CFG_OWNER;  /* owned by CPU */
- 
--	/* Response */
--	if (cmd->flags & MMC_RSP_PRESENT) {
--		if (cmd->flags & MMC_RSP_136)
--			cmd_cfg |= CMD_CFG_RESP_128;
--		cmd_cfg |= CMD_CFG_RESP_NUM;
--
--		if (!(cmd->flags & MMC_RSP_CRC))
--			cmd_cfg |= CMD_CFG_RESP_NOCRC;
--
--		if (cmd->flags & MMC_RSP_BUSY)
--			cmd_cfg |= CMD_CFG_R1B;
--	} else {
--		cmd_cfg |= CMD_CFG_NO_RESP;
--	}
-+	meson_mmc_set_response_bits(cmd, &cmd_cfg);
- 
- 	/* data? */
- 	if (data) {
--- 
-2.12.1
\ No newline at end of file
diff --git a/a/4.hdr b/a/4.hdr
deleted file mode 100644
index b115245..0000000
--- a/a/4.hdr
+++ /dev/null
@@ -1,5 +0,0 @@
-Content-Type: text/x-diff;
- name="0003-fix-sdio.patch"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: attachment;
- filename="0003-fix-sdio.patch"
diff --git a/a/4.txt b/a/4.txt
deleted file mode 100644
index 2a5a657..0000000
--- a/a/4.txt
+++ /dev/null
@@ -1,56 +0,0 @@
->From 7a12460466035b605ec311ff0b8bcd1cd1844e28 Mon Sep 17 00:00:00 2001
-From: Heiner Kallweit <hkallweit1@gmail.com>
-Date: Tue, 28 Mar 2017 20:21:13 +0200
-Subject: [PATCH 3/4] fix sdio
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
----
- drivers/mmc/core/sdio_bus.c   | 12 +++++++++++-
- include/linux/mmc/sdio_func.h |  2 +-
- 2 files changed, 12 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
-index e992a7f8..2b32b889 100644
---- a/drivers/mmc/core/sdio_bus.c
-+++ b/drivers/mmc/core/sdio_bus.c
-@@ -267,7 +267,7 @@ static void sdio_release_func(struct device *dev)
- 	sdio_free_func_cis(func);
- 
- 	kfree(func->info);
--
-+	kfree(func->tmpbuf);
- 	kfree(func);
- }
- 
-@@ -282,6 +282,16 @@ struct sdio_func *sdio_alloc_func(struct mmc_card *card)
- 	if (!func)
- 		return ERR_PTR(-ENOMEM);
- 
-+	/*
-+	 * allocate buffer separately to make sure it's properly aligned for
-+	 * DMA usage (incl. 64 bit DMA)
-+	 */
-+	func->tmpbuf = kmalloc(4, GFP_KERNEL);
-+	if (!func->tmpbuf) {
-+		kfree(func);
-+		return ERR_PTR(-ENOMEM);
-+	}
-+
- 	func->card = card;
- 
- 	device_initialize(&func->dev);
-diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
-index aab032a6..97ca1053 100644
---- a/include/linux/mmc/sdio_func.h
-+++ b/include/linux/mmc/sdio_func.h
-@@ -53,7 +53,7 @@ struct sdio_func {
- 	unsigned int		state;		/* function state */
- #define SDIO_STATE_PRESENT	(1<<0)		/* present in sysfs */
- 
--	u8			tmpbuf[4];	/* DMA:able scratch buffer */
-+	u8			*tmpbuf;	/* DMA:able scratch buffer */
- 
- 	unsigned		num_info;	/* number of info strings */
- 	const char		**info;		/* info strings */
--- 
-2.12.1
\ No newline at end of file
diff --git a/a/5.hdr b/a/5.hdr
deleted file mode 100644
index cb74257..0000000
--- a/a/5.hdr
+++ /dev/null
@@ -1,5 +0,0 @@
-Content-Type: text/x-diff;
- name="0004-change-to-desc-chain-mode.patch"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: attachment;
- filename="0004-change-to-desc-chain-mode.patch"
diff --git a/a/5.txt b/a/5.txt
deleted file mode 100644
index f98b6b2..0000000
--- a/a/5.txt
+++ /dev/null
@@ -1,268 +0,0 @@
->From 3433341319cab08552ab7c8225bcf3b6c4770a02 Mon Sep 17 00:00:00 2001
-From: Heiner Kallweit <hkallweit1@gmail.com>
-Date: Tue, 28 Mar 2017 21:05:53 +0200
-Subject: [PATCH 4/4] change to desc chain mode
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
----
- drivers/mmc/host/meson-gx-mmc.c | 143 ++++++++++++++++++++++++----------------
- 1 file changed, 87 insertions(+), 56 deletions(-)
-
-diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
-index 0036680b..1a64cb91 100644
---- a/drivers/mmc/host/meson-gx-mmc.c
-+++ b/drivers/mmc/host/meson-gx-mmc.c
-@@ -109,8 +109,16 @@
- #define SD_EMMC_CMD_TIMEOUT 1024 /* in ms */
- #define SD_EMMC_CMD_TIMEOUT_DATA 4096 /* in ms */
- #define SD_EMMC_CFG_CMD_GAP 16 /* in clock cycles */
-+#define SD_EMMC_DESC_BUF_LEN PAGE_SIZE
- #define MUX_CLK_NUM_PARENTS 2
- 
-+struct sd_emmc_desc {
-+	u32 cmd_cfg;
-+	u32 cmd_arg;
-+	u32 cmd_data;
-+	u32 cmd_resp;
-+};
-+
- struct meson_host {
- 	struct	device		*dev;
- 	struct	mmc_host	*mmc;
-@@ -126,20 +134,12 @@ struct meson_host {
- 	struct clk_divider cfg_div;
- 	struct clk *cfg_div_clk;
- 
--	unsigned int bounce_buf_size;
--	void *bounce_buf;
--	dma_addr_t bounce_dma_addr;
-+	struct sd_emmc_desc *descs;
-+	dma_addr_t descs_dma_addr;
- 
- 	bool vqmmc_enabled;
- };
- 
--struct sd_emmc_desc {
--	u32 cmd_cfg;
--	u32 cmd_arg;
--	u32 cmd_data;
--	u32 cmd_resp;
--};
--
- #define CMD_CFG_LENGTH_MASK GENMASK(8, 0)
- #define CMD_CFG_BLOCK_MODE BIT(9)
- #define CMD_CFG_R1B BIT(10)
-@@ -186,6 +186,31 @@ static struct mmc_command *meson_mmc_get_next_command(struct mmc_command *cmd)
- 		return NULL;
- }
- 
-+static void meson_mmc_pre_req(struct mmc_host *mmc, struct mmc_request *mrq)
-+{
-+	struct mmc_data *data = mrq->data;
-+
-+	if (!data)
-+		return;
-+
-+	data->host_cookie = true;
-+
-+	data->sg_count = dma_map_sg(mmc_dev(mmc), data->sg, data->sg_len,
-+				    mmc_get_dma_dir(data));
-+	if (!data->sg_count)
-+		dev_err(mmc_dev(mmc), "dma_map_sg failed");
-+}
-+
-+static void meson_mmc_post_req(struct mmc_host *mmc, struct mmc_request *mrq,
-+			       int err)
-+{
-+	struct mmc_data *data = mrq->data;
-+
-+	if (data && data->sg_count)
-+		dma_unmap_sg(mmc_dev(mmc), data->sg, data->sg_len,
-+			     mmc_get_dma_dir(data));
-+}
-+
- static int meson_mmc_clk_set(struct meson_host *host, unsigned long clk_rate)
- {
- 	struct mmc_host *mmc = host->mmc;
-@@ -476,9 +501,11 @@ static void meson_mmc_set_response_bits(struct mmc_command *cmd, u32 *cmd_cfg)
- static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)
- {
- 	struct meson_host *host = mmc_priv(mmc);
-+	struct sd_emmc_desc *desc = host->descs;
- 	struct mmc_data *data = cmd->data;
--	u32 cmd_cfg = 0, cmd_data = 0;
--	unsigned int xfer_bytes = 0;
-+	u32 cfg, cmd_cfg = 0;
-+	struct scatterlist *sg;
-+	int i;
- 
- 	/* Setup descriptors */
- 	dma_rmb();
-@@ -490,57 +517,68 @@ static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)
- 
- 	/* data? */
- 	if (data) {
-+		data->bytes_xfered = 0;
- 		cmd_cfg |= CMD_CFG_DATA_IO;
- 		cmd_cfg |= FIELD_PREP(CMD_CFG_TIMEOUT_MASK,
- 				      ilog2(meson_mmc_get_timeout_msecs(data)));
-+		if (data->flags & MMC_DATA_WRITE)
-+			cmd_cfg |= CMD_CFG_DATA_WR;
- 
- 		if (data->blocks > 1) {
- 			cmd_cfg |= CMD_CFG_BLOCK_MODE;
--			cmd_cfg |= FIELD_PREP(CMD_CFG_LENGTH_MASK,
--					      data->blocks);
- 			meson_mmc_set_blksz(mmc, data->blksz);
--		} else {
--			cmd_cfg |= FIELD_PREP(CMD_CFG_LENGTH_MASK, data->blksz);
- 		}
- 
--		data->bytes_xfered = 0;
--		xfer_bytes = data->blksz * data->blocks;
--		if (data->flags & MMC_DATA_WRITE) {
--			cmd_cfg |= CMD_CFG_DATA_WR;
--			WARN_ON(xfer_bytes > host->bounce_buf_size);
--			sg_copy_to_buffer(data->sg, data->sg_len,
--					  host->bounce_buf, xfer_bytes);
--			dma_wmb();
--		}
-+		for_each_sg(data->sg, sg, data->sg_count, i) {
-+			unsigned int len = sg_dma_len(sg);
-+
-+			/* check proper alignment for 64 bit DMA */
-+			WARN_ON(sg_dma_address(sg) & 0x7);
- 
--		cmd_data = host->bounce_dma_addr & CMD_DATA_MASK;
-+			if (data->blocks > 1)
-+				len /= data->blksz;
-+
-+			desc[i].cmd_cfg = cmd_cfg;
-+			desc[i].cmd_cfg |= FIELD_PREP(CMD_CFG_LENGTH_MASK, len);
-+			if (i > 0)
-+				desc[i].cmd_cfg |= CMD_CFG_NO_CMD;
-+			desc[i].cmd_arg = cmd->arg;
-+			desc[i].cmd_resp = 0;
-+			desc[i].cmd_data = sg_dma_address(sg);
-+		}
-+		desc[data->sg_count - 1].cmd_cfg |= CMD_CFG_END_OF_CHAIN;
- 	} else {
- 		cmd_cfg |= FIELD_PREP(CMD_CFG_TIMEOUT_MASK,
- 				      ilog2(SD_EMMC_CMD_TIMEOUT));
-+		cmd_cfg |= CMD_CFG_END_OF_CHAIN;
-+		desc[0].cmd_cfg = cmd_cfg;
-+		desc[0].cmd_arg = cmd->arg;
-+		desc[0].cmd_resp = 0;
-+		desc[0].cmd_data = 0;
- 	}
- 
- 	host->cmd = cmd;
- 
--	/* Last descriptor */
--	cmd_cfg |= CMD_CFG_END_OF_CHAIN;
--	writel(cmd_cfg, host->regs + SD_EMMC_CMD_CFG);
--	writel(cmd_data, host->regs + SD_EMMC_CMD_DAT);
--	writel(0, host->regs + SD_EMMC_CMD_RSP);
- 	wmb(); /* ensure descriptor is written before kicked */
--	writel(cmd->arg, host->regs + SD_EMMC_CMD_ARG);
-+	cfg = host->descs_dma_addr | START_DESC_BUSY;
-+	writel(cfg, host->regs + SD_EMMC_START);
- }
- 
- static void meson_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
- {
- 	struct meson_host *host = mmc_priv(mmc);
-+	bool needs_pre_post_req = mrq->data && !mrq->data->host_cookie;
-+
-+	if (needs_pre_post_req)
-+		meson_mmc_pre_req(mmc, mrq);
- 
- 	/* Stop execution */
- 	writel(0, host->regs + SD_EMMC_START);
- 
--	if (mrq->sbc)
--		meson_mmc_start_cmd(mmc, mrq->sbc);
--	else
--		meson_mmc_start_cmd(mmc, mrq->cmd);
-+	meson_mmc_start_cmd(mmc, mrq->sbc ?: mrq->cmd);
-+
-+	if (needs_pre_post_req)
-+		meson_mmc_post_req(mmc, mrq, 0);
- }
- 
- static void meson_mmc_read_resp(struct mmc_host *mmc, struct mmc_command *cmd)
-@@ -618,7 +656,9 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
- 	if (status & (IRQ_END_OF_CHAIN | IRQ_RESP_STATUS)) {
- 		if (data && !cmd->error)
- 			data->bytes_xfered = data->blksz * data->blocks;
--		ret = IRQ_WAKE_THREAD;
-+
-+		if (meson_mmc_get_next_command(cmd))
-+			ret = IRQ_WAKE_THREAD;
- 	} else {
- 		dev_warn(host->dev, "Unknown IRQ! status=0x%04x: MMC CMD%u arg=0x%08x flags=0x%08x stop=%d\n",
- 			 status, cmd->opcode, cmd->arg,
-@@ -648,20 +688,10 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id)
- {
- 	struct meson_host *host = dev_id;
- 	struct mmc_command *next_cmd, *cmd = host->cmd;
--	struct mmc_data *data;
--	unsigned int xfer_bytes;
- 
- 	if (WARN_ON(!cmd))
- 		return IRQ_NONE;
- 
--	data = cmd->data;
--	if (data && data->flags & MMC_DATA_READ) {
--		xfer_bytes = data->blksz * data->blocks;
--		WARN_ON(xfer_bytes > host->bounce_buf_size);
--		sg_copy_from_buffer(data->sg, data->sg_len,
--				    host->bounce_buf, xfer_bytes);
--	}
--
- 	next_cmd = meson_mmc_get_next_command(cmd);
- 	if (next_cmd)
- 		meson_mmc_start_cmd(host->mmc, next_cmd);
-@@ -701,6 +731,8 @@ static const struct mmc_host_ops meson_mmc_ops = {
- 	.request	= meson_mmc_request,
- 	.set_ios	= meson_mmc_set_ios,
- 	.get_cd         = meson_mmc_get_cd,
-+	.pre_req	= meson_mmc_pre_req,
-+	.post_req	= meson_mmc_post_req,
- };
- 
- static int meson_mmc_probe(struct platform_device *pdev)
-@@ -781,14 +813,13 @@ static int meson_mmc_probe(struct platform_device *pdev)
- 	mmc->caps |= MMC_CAP_CMD23;
- 	mmc->max_blk_count = CMD_CFG_LENGTH_MASK;
- 	mmc->max_req_size = mmc->max_blk_count * mmc->max_blk_size;
-+	mmc->max_segs = SD_EMMC_DESC_BUF_LEN / sizeof(struct sd_emmc_desc);
-+	mmc->max_seg_size = mmc->max_req_size;
- 
--	/* data bounce buffer */
--	host->bounce_buf_size = mmc->max_req_size;
--	host->bounce_buf =
--		dma_alloc_coherent(host->dev, host->bounce_buf_size,
--				   &host->bounce_dma_addr, GFP_KERNEL);
--	if (host->bounce_buf == NULL) {
--		dev_err(host->dev, "Unable to map allocate DMA bounce buffer.\n");
-+	host->descs = dma_alloc_coherent(host->dev, SD_EMMC_DESC_BUF_LEN,
-+					 &host->descs_dma_addr, GFP_KERNEL);
-+	if (!host->descs) {
-+		dev_err(host->dev, "Allocating descriptor DMA buffer failed\n");
- 		ret = -ENOMEM;
- 		goto err_div_clk;
- 	}
-@@ -816,8 +847,8 @@ static int meson_mmc_remove(struct platform_device *pdev)
- 	/* disable interrupts */
- 	writel(0, host->regs + SD_EMMC_IRQ_EN);
- 
--	dma_free_coherent(host->dev, host->bounce_buf_size,
--			  host->bounce_buf, host->bounce_dma_addr);
-+	dma_free_coherent(host->dev, SD_EMMC_DESC_BUF_LEN,
-+			  host->descs, host->descs_dma_addr);
- 
- 	clk_disable_unprepare(host->cfg_div_clk);
- 	clk_disable_unprepare(host->core_clk);
--- 
-2.12.1
\ No newline at end of file
diff --git a/a/content_digest b/N1/content_digest
index f42539b..5efbb2d 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -41,23 +41,19 @@
   "ref\0000442ae99-de48-2410-eccb-0b1f44afa249\@gmail.com\0"
 ]
 [
-  "From\0Heiner Kallweit <hkallweit1\@gmail.com>\0"
+  "From\0hkallweit1\@gmail.com (Heiner Kallweit)\0"
 ]
 [
-  "Subject\0Re: meson-gx-mmc: 2nd patch set\0"
+  "Subject\0meson-gx-mmc: 2nd patch set\0"
 ]
 [
   "Date\0Wed, 29 Mar 2017 07:46:03 +0200\0"
 ]
 [
-  "To\0Helmut Klein <hgkr.klein\@gmail.com>\0"
+  "To\0linus-amlogic\@lists.infradead.org\0"
 ]
 [
-  "Cc\0linux-mmc\@vger.kernel.org <linux-mmc\@vger.kernel.org>",
-  " linux-amlogic\@lists.infradead.org\0"
-]
-[
-  "\0001:1\0"
+  "\0000:1\0"
 ]
 [
   "b\0"
@@ -1357,513 +1353,36 @@
   "STMMAC ethernet driver is broken currently, I had to go back to version from March 10th.\n",
   "\n",
   "Thanks in advance,\n",
-  "Heiner"
-]
-[
-  "\0001:2\0"
-]
-[
-  "fn\0000001-factor-out-set-blksz.patch\0"
-]
-[
-  "b\0"
-]
-[
-  ">From 24a33649061c56613955983b133b381c1cfc84fc Mon Sep 17 00:00:00 2001\n",
-  "From: Heiner Kallweit <hkallweit1\@gmail.com>\n",
-  "Date: Sun, 26 Mar 2017 17:37:00 +0200\n",
-  "Subject: [PATCH 1/4] factor out set blksz\n",
-  "\n",
-  "Signed-off-by: Heiner Kallweit <hkallweit1\@gmail.com>\n",
-  "---\n",
-  " drivers/mmc/host/meson-gx-mmc.c | 42 ++++++++++++++++++++++++++---------------\n",
-  " 1 file changed, 27 insertions(+), 15 deletions(-)\n",
-  "\n",
-  "diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c\n",
-  "index f5dd5cc7..0de32008 100644\n",
-  "--- a/drivers/mmc/host/meson-gx-mmc.c\n",
-  "+++ b/drivers/mmc/host/meson-gx-mmc.c\n",
-  "\@\@ -431,12 +431,36 \@\@ static void meson_mmc_request_done(struct mmc_host *mmc,\n",
-  " \tmmc_request_done(host->mmc, mrq);\n",
-  " }\n",
-  " \n",
-  "+static void meson_mmc_set_blksz(struct mmc_host *mmc, unsigned int blksz)\n",
-  "+{\n",
-  "+\tstruct meson_host *host = mmc_priv(mmc);\n",
-  "+\tu32 cfg, blksz_old;\n",
-  "+\n",
-  "+\tcfg = readl(host->regs + SD_EMMC_CFG);\n",
-  "+\tblksz_old = FIELD_GET(CFG_BLK_LEN_MASK, cfg);\n",
-  "+\n",
-  "+\tif (!is_power_of_2(blksz))\n",
-  "+\t\tdev_err(host->dev, \"blksz %u is not a power of 2\\n\", blksz);\n",
-  "+\n",
-  "+\tblksz = ilog2(blksz);\n",
-  "+\n",
-  "+\t/* check if block-size matches, if not update */\n",
-  "+\tif (blksz == blksz_old)\n",
-  "+\t\treturn;\n",
-  "+\n",
-  "+\tdev_dbg(host->dev, \"%s: update blk_len %d -> %d\\n\", __func__,\n",
-  "+\t\tblksz_old, blksz);\n",
-  "+\n",
-  "+\tcfg &= ~CFG_BLK_LEN_MASK;\n",
-  "+\tcfg |= FIELD_PREP(CFG_BLK_LEN_MASK, blksz);\n",
-  "+\twritel(cfg, host->regs + SD_EMMC_CFG);\n",
-  "+}\n",
-  "+\n",
-  " static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)\n",
-  " {\n",
-  " \tstruct meson_host *host = mmc_priv(mmc);\n",
-  " \tstruct mmc_data *data = cmd->data;\n",
-  "-\tu32 cfg, cmd_cfg = 0, cmd_data = 0;\n",
-  "-\tu8 blk_len;\n",
-  "+\tu32 cmd_cfg = 0, cmd_data = 0;\n",
-  " \tunsigned int xfer_bytes = 0;\n",
-  " \n",
-  " \t/* Setup descriptors */\n",
-  "\@\@ -470,19 +494,7 \@\@ static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)\n",
-  " \t\t\tcmd_cfg |= CMD_CFG_BLOCK_MODE;\n",
-  " \t\t\tcmd_cfg |= FIELD_PREP(CMD_CFG_LENGTH_MASK,\n",
-  " \t\t\t\t\t      data->blocks);\n",
-  "-\n",
-  "-\t\t\t/* check if block-size matches, if not update */\n",
-  "-\t\t\tcfg = readl(host->regs + SD_EMMC_CFG);\n",
-  "-\t\t\tblk_len = FIELD_GET(CFG_BLK_LEN_MASK, cfg);\n",
-  "-\t\t\tif (blk_len != ilog2(data->blksz)) {\n",
-  "-\t\t\t\tdev_dbg(host->dev, \"%s: update blk_len %d -> %d\\n\",\n",
-  "-\t\t\t\t\t__func__, blk_len,\n",
-  "-\t\t\t\t\tilog2(data->blksz));\n",
-  "-\t\t\t\tblk_len = ilog2(data->blksz);\n",
-  "-\t\t\t\tcfg &= ~CFG_BLK_LEN_MASK;\n",
-  "-\t\t\t\tcfg |= FIELD_PREP(CFG_BLK_LEN_MASK, blk_len);\n",
-  "-\t\t\t\twritel(cfg, host->regs + SD_EMMC_CFG);\n",
-  "-\t\t\t}\n",
-  "+\t\t\tmeson_mmc_set_blksz(mmc, data->blksz);\n",
-  " \t\t} else {\n",
-  " \t\t\tcmd_cfg |= FIELD_PREP(CMD_CFG_LENGTH_MASK, data->blksz);\n",
-  " \t\t}\n",
-  "-- \n",
-  "2.12.1"
-]
-[
-  "\0001:3\0"
-]
-[
-  "fn\0000002-factor-out-setting-response-bits.patch\0"
-]
-[
-  "b\0"
-]
-[
-  ">From 86b1374413af88de7f3e98c072a474ae81956bef Mon Sep 17 00:00:00 2001\n",
-  "From: Heiner Kallweit <hkallweit1\@gmail.com>\n",
-  "Date: Sun, 26 Mar 2017 17:57:09 +0200\n",
-  "Subject: [PATCH 2/4] factor out setting response bits\n",
-  "\n",
-  "Signed-off-by: Heiner Kallweit <hkallweit1\@gmail.com>\n",
-  "---\n",
-  " drivers/mmc/host/meson-gx-mmc.c | 32 ++++++++++++++++++--------------\n",
-  " 1 file changed, 18 insertions(+), 14 deletions(-)\n",
-  "\n",
-  "diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c\n",
-  "index 0de32008..0036680b 100644\n",
-  "--- a/drivers/mmc/host/meson-gx-mmc.c\n",
-  "+++ b/drivers/mmc/host/meson-gx-mmc.c\n",
-  "\@\@ -456,6 +456,23 \@\@ static void meson_mmc_set_blksz(struct mmc_host *mmc, unsigned int blksz)\n",
-  " \twritel(cfg, host->regs + SD_EMMC_CFG);\n",
-  " }\n",
-  " \n",
-  "+static void meson_mmc_set_response_bits(struct mmc_command *cmd, u32 *cmd_cfg)\n",
-  "+{\n",
-  "+\tif (cmd->flags & MMC_RSP_PRESENT) {\n",
-  "+\t\tif (cmd->flags & MMC_RSP_136)\n",
-  "+\t\t\t*cmd_cfg |= CMD_CFG_RESP_128;\n",
-  "+\t\t*cmd_cfg |= CMD_CFG_RESP_NUM;\n",
-  "+\n",
-  "+\t\tif (!(cmd->flags & MMC_RSP_CRC))\n",
-  "+\t\t\t*cmd_cfg |= CMD_CFG_RESP_NOCRC;\n",
-  "+\n",
-  "+\t\tif (cmd->flags & MMC_RSP_BUSY)\n",
-  "+\t\t\t*cmd_cfg |= CMD_CFG_R1B;\n",
-  "+\t} else {\n",
-  "+\t\t*cmd_cfg |= CMD_CFG_NO_RESP;\n",
-  "+\t}\n",
-  "+}\n",
-  "+\n",
-  " static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)\n",
-  " {\n",
-  " \tstruct meson_host *host = mmc_priv(mmc);\n",
-  "\@\@ -469,20 +486,7 \@\@ static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)\n",
-  " \tcmd_cfg |= FIELD_PREP(CMD_CFG_CMD_INDEX_MASK, cmd->opcode);\n",
-  " \tcmd_cfg |= CMD_CFG_OWNER;  /* owned by CPU */\n",
-  " \n",
-  "-\t/* Response */\n",
-  "-\tif (cmd->flags & MMC_RSP_PRESENT) {\n",
-  "-\t\tif (cmd->flags & MMC_RSP_136)\n",
-  "-\t\t\tcmd_cfg |= CMD_CFG_RESP_128;\n",
-  "-\t\tcmd_cfg |= CMD_CFG_RESP_NUM;\n",
-  "-\n",
-  "-\t\tif (!(cmd->flags & MMC_RSP_CRC))\n",
-  "-\t\t\tcmd_cfg |= CMD_CFG_RESP_NOCRC;\n",
-  "-\n",
-  "-\t\tif (cmd->flags & MMC_RSP_BUSY)\n",
-  "-\t\t\tcmd_cfg |= CMD_CFG_R1B;\n",
-  "-\t} else {\n",
-  "-\t\tcmd_cfg |= CMD_CFG_NO_RESP;\n",
-  "-\t}\n",
-  "+\tmeson_mmc_set_response_bits(cmd, &cmd_cfg);\n",
-  " \n",
-  " \t/* data? */\n",
-  " \tif (data) {\n",
-  "-- \n",
-  "2.12.1"
-]
-[
-  "\0001:4\0"
-]
-[
-  "fn\0000003-fix-sdio.patch\0"
-]
-[
-  "b\0"
-]
-[
-  ">From 7a12460466035b605ec311ff0b8bcd1cd1844e28 Mon Sep 17 00:00:00 2001\n",
-  "From: Heiner Kallweit <hkallweit1\@gmail.com>\n",
-  "Date: Tue, 28 Mar 2017 20:21:13 +0200\n",
-  "Subject: [PATCH 3/4] fix sdio\n",
-  "\n",
-  "Signed-off-by: Heiner Kallweit <hkallweit1\@gmail.com>\n",
-  "---\n",
-  " drivers/mmc/core/sdio_bus.c   | 12 +++++++++++-\n",
-  " include/linux/mmc/sdio_func.h |  2 +-\n",
-  " 2 files changed, 12 insertions(+), 2 deletions(-)\n",
-  "\n",
-  "diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c\n",
-  "index e992a7f8..2b32b889 100644\n",
-  "--- a/drivers/mmc/core/sdio_bus.c\n",
-  "+++ b/drivers/mmc/core/sdio_bus.c\n",
-  "\@\@ -267,7 +267,7 \@\@ static void sdio_release_func(struct device *dev)\n",
-  " \tsdio_free_func_cis(func);\n",
-  " \n",
-  " \tkfree(func->info);\n",
-  "-\n",
-  "+\tkfree(func->tmpbuf);\n",
-  " \tkfree(func);\n",
-  " }\n",
-  " \n",
-  "\@\@ -282,6 +282,16 \@\@ struct sdio_func *sdio_alloc_func(struct mmc_card *card)\n",
-  " \tif (!func)\n",
-  " \t\treturn ERR_PTR(-ENOMEM);\n",
-  " \n",
-  "+\t/*\n",
-  "+\t * allocate buffer separately to make sure it's properly aligned for\n",
-  "+\t * DMA usage (incl. 64 bit DMA)\n",
-  "+\t */\n",
-  "+\tfunc->tmpbuf = kmalloc(4, GFP_KERNEL);\n",
-  "+\tif (!func->tmpbuf) {\n",
-  "+\t\tkfree(func);\n",
-  "+\t\treturn ERR_PTR(-ENOMEM);\n",
-  "+\t}\n",
-  "+\n",
-  " \tfunc->card = card;\n",
-  " \n",
-  " \tdevice_initialize(&func->dev);\n",
-  "diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h\n",
-  "index aab032a6..97ca1053 100644\n",
-  "--- a/include/linux/mmc/sdio_func.h\n",
-  "+++ b/include/linux/mmc/sdio_func.h\n",
-  "\@\@ -53,7 +53,7 \@\@ struct sdio_func {\n",
-  " \tunsigned int\t\tstate;\t\t/* function state */\n",
-  " #define SDIO_STATE_PRESENT\t(1<<0)\t\t/* present in sysfs */\n",
-  " \n",
-  "-\tu8\t\t\ttmpbuf[4];\t/* DMA:able scratch buffer */\n",
-  "+\tu8\t\t\t*tmpbuf;\t/* DMA:able scratch buffer */\n",
-  " \n",
-  " \tunsigned\t\tnum_info;\t/* number of info strings */\n",
-  " \tconst char\t\t**info;\t\t/* info strings */\n",
-  "-- \n",
-  "2.12.1"
-]
-[
-  "\0001:5\0"
-]
-[
-  "fn\0000004-change-to-desc-chain-mode.patch\0"
-]
-[
-  "b\0"
-]
-[
-  ">From 3433341319cab08552ab7c8225bcf3b6c4770a02 Mon Sep 17 00:00:00 2001\n",
-  "From: Heiner Kallweit <hkallweit1\@gmail.com>\n",
-  "Date: Tue, 28 Mar 2017 21:05:53 +0200\n",
-  "Subject: [PATCH 4/4] change to desc chain mode\n",
-  "\n",
-  "Signed-off-by: Heiner Kallweit <hkallweit1\@gmail.com>\n",
-  "---\n",
-  " drivers/mmc/host/meson-gx-mmc.c | 143 ++++++++++++++++++++++++----------------\n",
-  " 1 file changed, 87 insertions(+), 56 deletions(-)\n",
+  "Heiner\n",
   "\n",
-  "diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c\n",
-  "index 0036680b..1a64cb91 100644\n",
-  "--- a/drivers/mmc/host/meson-gx-mmc.c\n",
-  "+++ b/drivers/mmc/host/meson-gx-mmc.c\n",
-  "\@\@ -109,8 +109,16 \@\@\n",
-  " #define SD_EMMC_CMD_TIMEOUT 1024 /* in ms */\n",
-  " #define SD_EMMC_CMD_TIMEOUT_DATA 4096 /* in ms */\n",
-  " #define SD_EMMC_CFG_CMD_GAP 16 /* in clock cycles */\n",
-  "+#define SD_EMMC_DESC_BUF_LEN PAGE_SIZE\n",
-  " #define MUX_CLK_NUM_PARENTS 2\n",
-  " \n",
-  "+struct sd_emmc_desc {\n",
-  "+\tu32 cmd_cfg;\n",
-  "+\tu32 cmd_arg;\n",
-  "+\tu32 cmd_data;\n",
-  "+\tu32 cmd_resp;\n",
-  "+};\n",
-  "+\n",
-  " struct meson_host {\n",
-  " \tstruct\tdevice\t\t*dev;\n",
-  " \tstruct\tmmc_host\t*mmc;\n",
-  "\@\@ -126,20 +134,12 \@\@ struct meson_host {\n",
-  " \tstruct clk_divider cfg_div;\n",
-  " \tstruct clk *cfg_div_clk;\n",
-  " \n",
-  "-\tunsigned int bounce_buf_size;\n",
-  "-\tvoid *bounce_buf;\n",
-  "-\tdma_addr_t bounce_dma_addr;\n",
-  "+\tstruct sd_emmc_desc *descs;\n",
-  "+\tdma_addr_t descs_dma_addr;\n",
-  " \n",
-  " \tbool vqmmc_enabled;\n",
-  " };\n",
-  " \n",
-  "-struct sd_emmc_desc {\n",
-  "-\tu32 cmd_cfg;\n",
-  "-\tu32 cmd_arg;\n",
-  "-\tu32 cmd_data;\n",
-  "-\tu32 cmd_resp;\n",
-  "-};\n",
-  "-\n",
-  " #define CMD_CFG_LENGTH_MASK GENMASK(8, 0)\n",
-  " #define CMD_CFG_BLOCK_MODE BIT(9)\n",
-  " #define CMD_CFG_R1B BIT(10)\n",
-  "\@\@ -186,6 +186,31 \@\@ static struct mmc_command *meson_mmc_get_next_command(struct mmc_command *cmd)\n",
-  " \t\treturn NULL;\n",
-  " }\n",
-  " \n",
-  "+static void meson_mmc_pre_req(struct mmc_host *mmc, struct mmc_request *mrq)\n",
-  "+{\n",
-  "+\tstruct mmc_data *data = mrq->data;\n",
-  "+\n",
-  "+\tif (!data)\n",
-  "+\t\treturn;\n",
-  "+\n",
-  "+\tdata->host_cookie = true;\n",
-  "+\n",
-  "+\tdata->sg_count = dma_map_sg(mmc_dev(mmc), data->sg, data->sg_len,\n",
-  "+\t\t\t\t    mmc_get_dma_dir(data));\n",
-  "+\tif (!data->sg_count)\n",
-  "+\t\tdev_err(mmc_dev(mmc), \"dma_map_sg failed\");\n",
-  "+}\n",
-  "+\n",
-  "+static void meson_mmc_post_req(struct mmc_host *mmc, struct mmc_request *mrq,\n",
-  "+\t\t\t       int err)\n",
-  "+{\n",
-  "+\tstruct mmc_data *data = mrq->data;\n",
-  "+\n",
-  "+\tif (data && data->sg_count)\n",
-  "+\t\tdma_unmap_sg(mmc_dev(mmc), data->sg, data->sg_len,\n",
-  "+\t\t\t     mmc_get_dma_dir(data));\n",
-  "+}\n",
-  "+\n",
-  " static int meson_mmc_clk_set(struct meson_host *host, unsigned long clk_rate)\n",
-  " {\n",
-  " \tstruct mmc_host *mmc = host->mmc;\n",
-  "\@\@ -476,9 +501,11 \@\@ static void meson_mmc_set_response_bits(struct mmc_command *cmd, u32 *cmd_cfg)\n",
-  " static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)\n",
-  " {\n",
-  " \tstruct meson_host *host = mmc_priv(mmc);\n",
-  "+\tstruct sd_emmc_desc *desc = host->descs;\n",
-  " \tstruct mmc_data *data = cmd->data;\n",
-  "-\tu32 cmd_cfg = 0, cmd_data = 0;\n",
-  "-\tunsigned int xfer_bytes = 0;\n",
-  "+\tu32 cfg, cmd_cfg = 0;\n",
-  "+\tstruct scatterlist *sg;\n",
-  "+\tint i;\n",
-  " \n",
-  " \t/* Setup descriptors */\n",
-  " \tdma_rmb();\n",
-  "\@\@ -490,57 +517,68 \@\@ static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)\n",
-  " \n",
-  " \t/* data? */\n",
-  " \tif (data) {\n",
-  "+\t\tdata->bytes_xfered = 0;\n",
-  " \t\tcmd_cfg |= CMD_CFG_DATA_IO;\n",
-  " \t\tcmd_cfg |= FIELD_PREP(CMD_CFG_TIMEOUT_MASK,\n",
-  " \t\t\t\t      ilog2(meson_mmc_get_timeout_msecs(data)));\n",
-  "+\t\tif (data->flags & MMC_DATA_WRITE)\n",
-  "+\t\t\tcmd_cfg |= CMD_CFG_DATA_WR;\n",
-  " \n",
-  " \t\tif (data->blocks > 1) {\n",
-  " \t\t\tcmd_cfg |= CMD_CFG_BLOCK_MODE;\n",
-  "-\t\t\tcmd_cfg |= FIELD_PREP(CMD_CFG_LENGTH_MASK,\n",
-  "-\t\t\t\t\t      data->blocks);\n",
-  " \t\t\tmeson_mmc_set_blksz(mmc, data->blksz);\n",
-  "-\t\t} else {\n",
-  "-\t\t\tcmd_cfg |= FIELD_PREP(CMD_CFG_LENGTH_MASK, data->blksz);\n",
-  " \t\t}\n",
-  " \n",
-  "-\t\tdata->bytes_xfered = 0;\n",
-  "-\t\txfer_bytes = data->blksz * data->blocks;\n",
-  "-\t\tif (data->flags & MMC_DATA_WRITE) {\n",
-  "-\t\t\tcmd_cfg |= CMD_CFG_DATA_WR;\n",
-  "-\t\t\tWARN_ON(xfer_bytes > host->bounce_buf_size);\n",
-  "-\t\t\tsg_copy_to_buffer(data->sg, data->sg_len,\n",
-  "-\t\t\t\t\t  host->bounce_buf, xfer_bytes);\n",
-  "-\t\t\tdma_wmb();\n",
-  "-\t\t}\n",
-  "+\t\tfor_each_sg(data->sg, sg, data->sg_count, i) {\n",
-  "+\t\t\tunsigned int len = sg_dma_len(sg);\n",
-  "+\n",
-  "+\t\t\t/* check proper alignment for 64 bit DMA */\n",
-  "+\t\t\tWARN_ON(sg_dma_address(sg) & 0x7);\n",
-  " \n",
-  "-\t\tcmd_data = host->bounce_dma_addr & CMD_DATA_MASK;\n",
-  "+\t\t\tif (data->blocks > 1)\n",
-  "+\t\t\t\tlen /= data->blksz;\n",
-  "+\n",
-  "+\t\t\tdesc[i].cmd_cfg = cmd_cfg;\n",
-  "+\t\t\tdesc[i].cmd_cfg |= FIELD_PREP(CMD_CFG_LENGTH_MASK, len);\n",
-  "+\t\t\tif (i > 0)\n",
-  "+\t\t\t\tdesc[i].cmd_cfg |= CMD_CFG_NO_CMD;\n",
-  "+\t\t\tdesc[i].cmd_arg = cmd->arg;\n",
-  "+\t\t\tdesc[i].cmd_resp = 0;\n",
-  "+\t\t\tdesc[i].cmd_data = sg_dma_address(sg);\n",
-  "+\t\t}\n",
-  "+\t\tdesc[data->sg_count - 1].cmd_cfg |= CMD_CFG_END_OF_CHAIN;\n",
-  " \t} else {\n",
-  " \t\tcmd_cfg |= FIELD_PREP(CMD_CFG_TIMEOUT_MASK,\n",
-  " \t\t\t\t      ilog2(SD_EMMC_CMD_TIMEOUT));\n",
-  "+\t\tcmd_cfg |= CMD_CFG_END_OF_CHAIN;\n",
-  "+\t\tdesc[0].cmd_cfg = cmd_cfg;\n",
-  "+\t\tdesc[0].cmd_arg = cmd->arg;\n",
-  "+\t\tdesc[0].cmd_resp = 0;\n",
-  "+\t\tdesc[0].cmd_data = 0;\n",
-  " \t}\n",
-  " \n",
-  " \thost->cmd = cmd;\n",
-  " \n",
-  "-\t/* Last descriptor */\n",
-  "-\tcmd_cfg |= CMD_CFG_END_OF_CHAIN;\n",
-  "-\twritel(cmd_cfg, host->regs + SD_EMMC_CMD_CFG);\n",
-  "-\twritel(cmd_data, host->regs + SD_EMMC_CMD_DAT);\n",
-  "-\twritel(0, host->regs + SD_EMMC_CMD_RSP);\n",
-  " \twmb(); /* ensure descriptor is written before kicked */\n",
-  "-\twritel(cmd->arg, host->regs + SD_EMMC_CMD_ARG);\n",
-  "+\tcfg = host->descs_dma_addr | START_DESC_BUSY;\n",
-  "+\twritel(cfg, host->regs + SD_EMMC_START);\n",
-  " }\n",
-  " \n",
-  " static void meson_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)\n",
-  " {\n",
-  " \tstruct meson_host *host = mmc_priv(mmc);\n",
-  "+\tbool needs_pre_post_req = mrq->data && !mrq->data->host_cookie;\n",
-  "+\n",
-  "+\tif (needs_pre_post_req)\n",
-  "+\t\tmeson_mmc_pre_req(mmc, mrq);\n",
-  " \n",
-  " \t/* Stop execution */\n",
-  " \twritel(0, host->regs + SD_EMMC_START);\n",
-  " \n",
-  "-\tif (mrq->sbc)\n",
-  "-\t\tmeson_mmc_start_cmd(mmc, mrq->sbc);\n",
-  "-\telse\n",
-  "-\t\tmeson_mmc_start_cmd(mmc, mrq->cmd);\n",
-  "+\tmeson_mmc_start_cmd(mmc, mrq->sbc ?: mrq->cmd);\n",
-  "+\n",
-  "+\tif (needs_pre_post_req)\n",
-  "+\t\tmeson_mmc_post_req(mmc, mrq, 0);\n",
-  " }\n",
-  " \n",
-  " static void meson_mmc_read_resp(struct mmc_host *mmc, struct mmc_command *cmd)\n",
-  "\@\@ -618,7 +656,9 \@\@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)\n",
-  " \tif (status & (IRQ_END_OF_CHAIN | IRQ_RESP_STATUS)) {\n",
-  " \t\tif (data && !cmd->error)\n",
-  " \t\t\tdata->bytes_xfered = data->blksz * data->blocks;\n",
-  "-\t\tret = IRQ_WAKE_THREAD;\n",
-  "+\n",
-  "+\t\tif (meson_mmc_get_next_command(cmd))\n",
-  "+\t\t\tret = IRQ_WAKE_THREAD;\n",
-  " \t} else {\n",
-  " \t\tdev_warn(host->dev, \"Unknown IRQ! status=0x%04x: MMC CMD%u arg=0x%08x flags=0x%08x stop=%d\\n\",\n",
-  " \t\t\t status, cmd->opcode, cmd->arg,\n",
-  "\@\@ -648,20 +688,10 \@\@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id)\n",
-  " {\n",
-  " \tstruct meson_host *host = dev_id;\n",
-  " \tstruct mmc_command *next_cmd, *cmd = host->cmd;\n",
-  "-\tstruct mmc_data *data;\n",
-  "-\tunsigned int xfer_bytes;\n",
-  " \n",
-  " \tif (WARN_ON(!cmd))\n",
-  " \t\treturn IRQ_NONE;\n",
-  " \n",
-  "-\tdata = cmd->data;\n",
-  "-\tif (data && data->flags & MMC_DATA_READ) {\n",
-  "-\t\txfer_bytes = data->blksz * data->blocks;\n",
-  "-\t\tWARN_ON(xfer_bytes > host->bounce_buf_size);\n",
-  "-\t\tsg_copy_from_buffer(data->sg, data->sg_len,\n",
-  "-\t\t\t\t    host->bounce_buf, xfer_bytes);\n",
-  "-\t}\n",
-  "-\n",
-  " \tnext_cmd = meson_mmc_get_next_command(cmd);\n",
-  " \tif (next_cmd)\n",
-  " \t\tmeson_mmc_start_cmd(host->mmc, next_cmd);\n",
-  "\@\@ -701,6 +731,8 \@\@ static const struct mmc_host_ops meson_mmc_ops = {\n",
-  " \t.request\t= meson_mmc_request,\n",
-  " \t.set_ios\t= meson_mmc_set_ios,\n",
-  " \t.get_cd         = meson_mmc_get_cd,\n",
-  "+\t.pre_req\t= meson_mmc_pre_req,\n",
-  "+\t.post_req\t= meson_mmc_post_req,\n",
-  " };\n",
-  " \n",
-  " static int meson_mmc_probe(struct platform_device *pdev)\n",
-  "\@\@ -781,14 +813,13 \@\@ static int meson_mmc_probe(struct platform_device *pdev)\n",
-  " \tmmc->caps |= MMC_CAP_CMD23;\n",
-  " \tmmc->max_blk_count = CMD_CFG_LENGTH_MASK;\n",
-  " \tmmc->max_req_size = mmc->max_blk_count * mmc->max_blk_size;\n",
-  "+\tmmc->max_segs = SD_EMMC_DESC_BUF_LEN / sizeof(struct sd_emmc_desc);\n",
-  "+\tmmc->max_seg_size = mmc->max_req_size;\n",
-  " \n",
-  "-\t/* data bounce buffer */\n",
-  "-\thost->bounce_buf_size = mmc->max_req_size;\n",
-  "-\thost->bounce_buf =\n",
-  "-\t\tdma_alloc_coherent(host->dev, host->bounce_buf_size,\n",
-  "-\t\t\t\t   &host->bounce_dma_addr, GFP_KERNEL);\n",
-  "-\tif (host->bounce_buf == NULL) {\n",
-  "-\t\tdev_err(host->dev, \"Unable to map allocate DMA bounce buffer.\\n\");\n",
-  "+\thost->descs = dma_alloc_coherent(host->dev, SD_EMMC_DESC_BUF_LEN,\n",
-  "+\t\t\t\t\t &host->descs_dma_addr, GFP_KERNEL);\n",
-  "+\tif (!host->descs) {\n",
-  "+\t\tdev_err(host->dev, \"Allocating descriptor DMA buffer failed\\n\");\n",
-  " \t\tret = -ENOMEM;\n",
-  " \t\tgoto err_div_clk;\n",
-  " \t}\n",
-  "\@\@ -816,8 +847,8 \@\@ static int meson_mmc_remove(struct platform_device *pdev)\n",
-  " \t/* disable interrupts */\n",
-  " \twritel(0, host->regs + SD_EMMC_IRQ_EN);\n",
-  " \n",
-  "-\tdma_free_coherent(host->dev, host->bounce_buf_size,\n",
-  "-\t\t\t  host->bounce_buf, host->bounce_dma_addr);\n",
-  "+\tdma_free_coherent(host->dev, SD_EMMC_DESC_BUF_LEN,\n",
-  "+\t\t\t  host->descs, host->descs_dma_addr);\n",
-  " \n",
-  " \tclk_disable_unprepare(host->cfg_div_clk);\n",
-  " \tclk_disable_unprepare(host->core_clk);\n",
-  "-- \n",
-  "2.12.1"
+  "-------------- next part --------------\n",
+  "A non-text attachment was scrubbed...\n",
+  "Name: 0001-factor-out-set-blksz.patch\n",
+  "Type: text/x-diff\n",
+  "Size: 2462 bytes\n",
+  "Desc: not available\n",
+  "URL: <http://lists.infradead.org/pipermail/linux-amlogic/attachments/20170329/e208851b/attachment.bin>\n",
+  "-------------- next part --------------\n",
+  "A non-text attachment was scrubbed...\n",
+  "Name: 0002-factor-out-setting-response-bits.patch\n",
+  "Type: text/x-diff\n",
+  "Size: 1893 bytes\n",
+  "Desc: not available\n",
+  "URL: <http://lists.infradead.org/pipermail/linux-amlogic/attachments/20170329/e208851b/attachment-0001.bin>\n",
+  "-------------- next part --------------\n",
+  "A non-text attachment was scrubbed...\n",
+  "Name: 0003-fix-sdio.patch\n",
+  "Type: text/x-diff\n",
+  "Size: 1651 bytes\n",
+  "Desc: not available\n",
+  "URL: <http://lists.infradead.org/pipermail/linux-amlogic/attachments/20170329/e208851b/attachment-0002.bin>\n",
+  "-------------- next part --------------\n",
+  "A non-text attachment was scrubbed...\n",
+  "Name: 0004-change-to-desc-chain-mode.patch\n",
+  "Type: text/x-diff\n",
+  "Size: 8287 bytes\n",
+  "Desc: not available\n",
+  "URL: <http://lists.infradead.org/pipermail/linux-amlogic/attachments/20170329/e208851b/attachment-0003.bin>"
 ]
 
-76d75ebe2973b63ee4fdda89d95e7412416be89a1d94253b385dcb202242dbda
+1c455fe9296906fb047110ed51c13270f25af9cf9d96a71605c95a9de97678d5

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.