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.