FAILED: patch "[PATCH] mmc: tmio: fix access width of Block Count Register" failed to apply to 4.9-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 5603731a15ef9ca317c122cc8c959f1dee1798b4 Mon Sep 17 00:00:00 2001
From: Takeshi Saito <[email protected]>
Date: Thu, 21 Feb 2019 20:38:05 +0100
Subject: [PATCH] mmc: tmio: fix access width of Block Count Register
In R-Car Gen2 or later, the maximum number of transfer blocks are changed from 0xFFFF to 0xFFFFFFFF. Therefore, Block Count Register should use iowrite32().
If another system (U-boot, Hypervisor OS, etc) uses bit[31:16], this value will not be cleared. So, SD/MMC card initialization fails.
So, check for the bigger register and use apropriate write. Also, mark the register as extended on Gen2.
drivers/mmc/host/renesas_sdhi_sys_dmac.c +1 -0
@@ -65,6 +65,7 @@ static const struct renesas_sdhi_of_data of_rcar_gen2_compatible = { .scc_offset = 0x0300, .taps = rcar_gen2_scc_taps, .taps_num = ARRAY_SIZE(rcar_gen2_scc_taps), + .max_blk_count = 0xffffffff, };/* Definitions for sampling clocks */
drivers/mmc/host/tmio_mmc.h +5 -0
@@ -277,6 +277,11 @@ static inline void sd_ctrl_write32_as_16_and_16(struct tmio_mmc_host *host,iowrite16 (val >>16 , host->ctl + ((addr +2 ) << host->bus_shift)); } +static inline void sd_ctrl_write32 (struct tmio_mmc_host *host,int addr,u32 val) +{ +iowrite32 (val, host->ctl + (addr << host->bus_shift)); +} +static inline void sd_ctrl_write32_rep (struct tmio_mmc_host *host,int addr,const u32 *buf,int count) {
drivers/mmc/host/tmio_mmc_core.c +5 -1
@@ -43,6 +43,7 @@#include <linux/regulator/consumer.h> #include <linux/mmc/sdio.h> #include <linux/scatterlist.h> +#include <linux/sizes.h> #include <linux/spinlock.h> #include <linux/swiotlb.h> #include <linux/workqueue.h>
@@ -703,7 +704,10 @@ static int tmio_mmc_start_data(struct tmio_mmc_host *host,/* Set transfer length / blocksize */ sd_ctrl_write16 (host,CTL_SD_XFER_LEN , data->blksz); -sd_ctrl_write16 (host,CTL_XFER_BLK_COUNT , data->blocks); +if (host->mmc->max_blk_count >=SZ_64K ) +sd_ctrl_write32 (host,CTL_XFER_BLK_COUNT , data->blocks); +else +sd_ctrl_write16 (host,CTL_XFER_BLK_COUNT , data->blocks);tmio_mmc_start_dma (host, data);