]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
mmc: dw_mmc: Replace fifoth_val property with fifo-depth
authorSam Protsenko <semen.protsenko@linaro.org>
Thu, 8 Aug 2024 03:14:17 +0000 (22:14 -0500)
committerMinkyu Kang <mk7.kang@samsung.com>
Mon, 19 Aug 2024 07:09:06 +0000 (16:09 +0900)
Replace fifoth_val property with its fifo-depth counterpart in all DW
MMC drivers. fifo-depth is a common property used in upstream Linux
kernel. The FIFOTH register value will be calculated using fifo-depth
value in DW MMC core (dw_mmc.c). This change reduces code duplication in
platform drivers, and pulls common FIFOTH register value calculation
into core dw_mmc driver where it belongs.

No functional change.

Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org>
Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
drivers/mmc/dw_mmc.c
drivers/mmc/exynos_dw_mmc.c
drivers/mmc/ftsdc010_mci.h
drivers/mmc/hi6220_dw_mmc.c
drivers/mmc/nexell_dw_mmc.c
drivers/mmc/rockchip_dw_mmc.c
drivers/mmc/snps_dw_mmc.c
drivers/mmc/socfpga_dw_mmc.c
include/dwmmc.h

index 55eb8a54f5946dd814d22b5916f44157a790218b..47dcc37c2c7cb8c7c8c92c221a86ca847b55cf49 100644 (file)
@@ -218,8 +218,6 @@ static unsigned int dwmci_get_timeout(struct mmc *mmc, const unsigned int size)
 static int dwmci_data_transfer_fifo(struct dwmci_host *host,
                                    struct mmc_data *data, u32 mask)
 {
-       const u32 fifo_depth = (((host->fifoth_val & RX_WMARK_MASK) >>
-                                RX_WMARK_SHIFT) + 1) * 2;
        const u32 int_rx = mask & (DWMCI_INTMSK_RXDR | DWMCI_INTMSK_DTO);
        const u32 int_tx = mask & DWMCI_INTMSK_TXDR;
        int ret = 0;
@@ -254,8 +252,8 @@ static int dwmci_data_transfer_fifo(struct dwmci_host *host,
                        if (ret < 0)
                                break;
 
-                       len = fifo_depth - ((len >> DWMCI_FIFO_SHIFT) &
-                                           DWMCI_FIFO_MASK);
+                       len = host->fifo_depth - ((len >> DWMCI_FIFO_SHIFT) &
+                                                 DWMCI_FIFO_MASK);
                        len = min(size, len);
                        for (i = 0; i < len; i++)
                                dwmci_writel(host, DWMCI_DATA, *buf++);
@@ -655,16 +653,23 @@ static int dwmci_set_ios(struct mmc *mmc)
 
 static void dwmci_init_fifo(struct dwmci_host *host)
 {
-       if (!host->fifoth_val) {
+       u32 fifo_thr, fifoth_val;
+
+       if (!host->fifo_depth) {
                u32 fifo_size;
 
+               /*
+                * Automatically detect FIFO depth from FIFOTH register.
+                * Power-on value of RX_WMark is FIFO_DEPTH-1.
+                */
                fifo_size = dwmci_readl(host, DWMCI_FIFOTH);
                fifo_size = ((fifo_size & RX_WMARK_MASK) >> RX_WMARK_SHIFT) + 1;
-               host->fifoth_val = MSIZE(0x2) | RX_WMARK(fifo_size / 2 - 1) |
-                                  TX_WMARK(fifo_size / 2);
+               host->fifo_depth = fifo_size;
        }
 
-       dwmci_writel(host, DWMCI_FIFOTH, host->fifoth_val);
+       fifo_thr = host->fifo_depth / 2;
+       fifoth_val = MSIZE(0x2) | RX_WMARK(fifo_thr - 1) | TX_WMARK(fifo_thr);
+       dwmci_writel(host, DWMCI_FIFOTH, fifoth_val);
 }
 
 static void dwmci_init_dma(struct dwmci_host *host)
index a51f762988daa47b4bd1b0074316a973439131ed..377c9e6d90b95f4fa51f64a720460c1e11fdcfd6 100644 (file)
@@ -150,8 +150,8 @@ static int do_dwmci_init(struct dwmci_host *host)
        return exynos_dwmci_core_init(host);
 }
 
-static int exynos_dwmci_get_config(const void *blob, int node,
-                                  struct dwmci_host *host,
+static int exynos_dwmci_get_config(struct udevice *dev, const void *blob,
+                                  int node, struct dwmci_host *host,
                                   struct dwmci_exynos_priv_data *priv)
 {
        int err = 0;
@@ -200,7 +200,7 @@ static int exynos_dwmci_get_config(const void *blob, int node,
                        priv->sdr_timing = DWMMC_MMC2_SDR_TIMING_VAL;
        }
 
-       host->fifoth_val = fdtdec_get_int(blob, node, "fifoth_val", 0);
+       host->fifo_depth = dev_read_u32_default(dev, "fifo-depth", 0);
        host->bus_hz = fdtdec_get_int(blob, node, "bus_hz", 0);
        host->div = fdtdec_get_int(blob, node, "div", 0);
 
@@ -216,8 +216,8 @@ static int exynos_dwmmc_probe(struct udevice *dev)
        struct dwmci_host *host = &priv->host;
        int err;
 
-       err = exynos_dwmci_get_config(gd->fdt_blob, dev_of_offset(dev), host,
-                                     priv);
+       err = exynos_dwmci_get_config(dev, gd->fdt_blob, dev_of_offset(dev),
+                                     host, priv);
        if (err)
                return err;
        err = do_dwmci_init(host);
index 782d92be2f5f92774db24b5fa63b95200fe5c8df..36187cfa04f6c32778e584baa43fbae7fc3b6912 100644 (file)
@@ -28,7 +28,6 @@ struct ftsdc010_chip {
        int dev_index;
        int dev_id;
        int buswidth;
-       u32 fifoth_val;
        struct mmc *mmc;
        void *priv;
        bool fifo_mode;
index c68a9157bfccf16e642cb237dc57e58ab59173dc..0302f5c296b90c6fd89f7d32b91758291499f6af 100644 (file)
@@ -36,7 +36,7 @@ struct hi6220_dwmmc_priv_data {
 struct hisi_mmc_data {
        unsigned int clock;
        bool use_fifo;
-       u32 fifoth_val;
+       u32 fifo_depth;
 };
 
 static int hi6220_dwmmc_of_to_plat(struct udevice *dev)
@@ -125,7 +125,7 @@ static int hi6220_dwmmc_probe(struct udevice *dev)
        host->mmc = &plat->mmc;
 
        host->fifo_mode = mmc_data->use_fifo;
-       host->fifoth_val = mmc_data->fifoth_val;
+       host->fifo_depth = mmc_data->fifo_depth;
        host->mmc->priv = &priv->host;
        upriv->mmc = host->mmc;
        host->mmc->dev = dev;
@@ -158,8 +158,7 @@ static const struct hisi_mmc_data hi6220_mmc_data = {
 static const struct hisi_mmc_data hi3798mv2x_mmc_data = {
        .clock = 50000000,
        .use_fifo = false,
-       // FIFO depth is 256
-       .fifoth_val = MSIZE(4) | RX_WMARK(0x7f) | TX_WMARK(0x80),
+       .fifo_depth = 256,
 };
 
 static const struct udevice_id hi6220_dwmmc_ids[] = {
index 2e1ce54c7d50b4d73d5a5efcb0ae0f3ccf515f69..80df617e07e991f2c97058087e74f3e77b69a8a9 100644 (file)
@@ -186,10 +186,7 @@ static int nexell_dwmmc_probe(struct udevice *dev)
        struct dwmci_host *host = &priv->host;
        struct udevice *pwr_dev __maybe_unused;
 
-       host->fifoth_val = MSIZE(0x2) |
-               RX_WMARK(priv->fifo_size / 2 - 1) |
-               TX_WMARK(priv->fifo_size / 2);
-
+       host->fifo_depth = priv->fifo_size;
        host->fifo_mode = priv->fifo_mode;
 
        dwmci_setup_cfg(&plat->cfg, host, priv->max_freq, priv->min_freq);
index 549fb80f1988302121c2b204b8e25469c9eadeaf..fb77b049834501f6ce8a6628f9afccfe6b546279 100644 (file)
@@ -138,10 +138,7 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
        if (ret < 0)
                return ret;
 #endif
-       host->fifoth_val = MSIZE(0x2) |
-               RX_WMARK(priv->fifo_depth / 2 - 1) |
-               TX_WMARK(priv->fifo_depth / 2);
-
+       host->fifo_depth = priv->fifo_depth;
        host->fifo_mode = priv->fifo_mode;
 
 #if CONFIG_IS_ENABLED(MMC_PWRSEQ)
index 9bdbe5070b1dde414de521591e51360af8bd526f..f30331e51f7e660d3e4aa2b4c818ad5d4394b544 100644 (file)
@@ -81,7 +81,7 @@ static int snps_dwmmc_of_to_plat(struct udevice *dev)
        host->ioaddr = dev_read_addr_ptr(dev);
 
        /*
-        * If fifo-depth is unset don't set fifoth_val - we will try to
+        * If fifo-depth is unset don't set fifo_depth - we will try to
         * auto detect it.
         */
        ret = dev_read_u32(dev, "fifo-depth", &fifo_depth);
@@ -89,9 +89,7 @@ static int snps_dwmmc_of_to_plat(struct udevice *dev)
                if (fifo_depth < FIFO_MIN || fifo_depth > FIFO_MAX)
                        return -EINVAL;
 
-               host->fifoth_val = MSIZE(0x2) |
-                                  RX_WMARK(fifo_depth / 2 - 1) |
-                                  TX_WMARK(fifo_depth / 2);
+               host->fifo_depth = fifo_depth;
        }
 
        host->buswidth = dev_read_u32_default(dev, "bus-width", 4);
index f738019b835750270a05ae3b5c2e85624d7d9043..3147d3019c0a26c21c5c1cc2de4c8f1ae68daf65 100644 (file)
@@ -134,8 +134,8 @@ static int socfpga_dwmmc_of_to_plat(struct udevice *dev)
         * We only have one dwmmc block on gen5 SoCFPGA.
         */
        host->dev_index = 0;
-       host->fifoth_val = MSIZE(0x2) |
-               RX_WMARK(fifo_depth / 2 - 1) | TX_WMARK(fifo_depth / 2);
+
+       host->fifo_depth = fifo_depth;
        priv->drvsel = fdtdec_get_uint(gd->fdt_blob, dev_of_offset(dev),
                                       "drvsel", 3);
        priv->smplsel = fdtdec_get_uint(gd->fdt_blob, dev_of_offset(dev),
index de18fda68ac888723a79713419214a0d14da5480..7bb456e792b451457b1902b68ac802ff0f3e32c7 100644 (file)
@@ -187,7 +187,7 @@ struct dwmci_idmac_regs {
  * @dev_index: Arbitrary device index for use by controller
  * @dev_id:    Arbitrary device ID for use by controller
  * @buswidth:  Bus width in bits (8 or 4)
- * @fifoth_val:        Value for FIFOTH register (or 0 to leave unset)
+ * @fifo_depth:        Depth of FIFO, bytes (or 0 for automatic detection)
  * @mmc:       Pointer to generic MMC structure for this device
  * @priv:      Private pointer for use by controller
  * @dma_64bit_address: Whether DMA supports 64-bit address mode or not
@@ -204,7 +204,7 @@ struct dwmci_host {
        int dev_index;
        int dev_id;
        int buswidth;
-       u32 fifoth_val;
+       u32 fifo_depth;
        struct mmc *mmc;
        void *priv;