mmc: dw_mmc: use resource_size_t to store physical address
authorArnd Bergmann <arnd@arndb.de>
Thu, 12 Nov 2015 14:14:23 +0000 (15:14 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 24 Sep 2016 08:07:42 +0000 (10:07 +0200)
commit 260b31643691e8a58683a4ccc3bdf7abfd86f54a upstream.

The dw_mmc driver stores the physical address of the MMIO registers
in a pointer, which requires the use of type casts, and is actually
broken if anyone ever has this device on a 32-bit SoC in registers
above 4GB. Gcc warns about this possibility when the driver is built
with ARM LPAE enabled:

mmc/host/dw_mmc.c: In function 'dw_mci_edmac_start_dma':
mmc/host/dw_mmc.c:702:17: warning: cast from pointer to integer of different size
  cfg.dst_addr = (dma_addr_t)(host->phy_regs + fifo_offset);
                 ^
mmc/host/dw_mmc-pltfm.c: In function 'dw_mci_pltfm_register':
mmc/host/dw_mmc-pltfm.c:63:19: warning: cast to pointer from integer of different size
  host->phy_regs = (void *)(regs->start);

This changes the code to use resource_size_t, which gets rid of the
warning, the bug and the useless casts.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/mmc/host/dw_mmc-pltfm.c
drivers/mmc/host/dw_mmc.c
include/linux/mmc/dw_mmc.h

index 7e1d13b68b062b4199e65d914c7cac464e2b0daf..81bdeeb05a4d23426ecf39119a54d544eb8342f9 100644 (file)
@@ -60,7 +60,7 @@ int dw_mci_pltfm_register(struct platform_device *pdev,
 
        regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        /* Get registers' physical base address */
-       host->phy_regs = (void *)(regs->start);
+       host->phy_regs = regs->start;
        host->regs = devm_ioremap_resource(&pdev->dev, regs);
        if (IS_ERR(host->regs))
                return PTR_ERR(host->regs);
index 7a6cedbe48a837e7fd5800c9fe1da131d569df51..fb204ee6ff89289f57920cafdc54434defc08c5a 100644 (file)
@@ -699,7 +699,7 @@ static int dw_mci_edmac_start_dma(struct dw_mci *host,
        int ret = 0;
 
        /* Set external dma config: burst size, burst width */
-       cfg.dst_addr = (dma_addr_t)(host->phy_regs + fifo_offset);
+       cfg.dst_addr = host->phy_regs + fifo_offset;
        cfg.src_addr = cfg.dst_addr;
        cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
        cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
index f67b2ec18e6d87c8df27b314f7320e49163850f5..7776afb0ffa5833bc784d32317cece83f1ea2cbd 100644 (file)
@@ -172,7 +172,7 @@ struct dw_mci {
        /* For edmac */
        struct dw_mci_dma_slave *dms;
        /* Registers's physical base address */
-       void                    *phy_regs;
+       resource_size_t         phy_regs;
 
        u32                     cmd_status;
        u32                     data_status;