mmc: davinci_mmc: Cleanup to use dt in U-boot and static platdata in SPL
authorFaiz Abbas <faiz_abbas@ti.com>
Fri, 22 May 2020 02:02:28 +0000 (07:32 +0530)
committerLokesh Vutla <lokeshvutla@ti.com>
Sat, 13 Jun 2020 17:42:17 +0000 (23:12 +0530)
Cleanup this driver to use dt in U-boot and static platdata in SPL.
This requires the following steps:

1. Move all platdata assignment from probe() to ofdata_to_platdata().
   This function is only called in U-boot.
2. Replicate all the platdata assignment being done in
   ofdata_to_platdata() in the omapl138 board file. This data is used in
   the SPL case where SPL_OF_CONTROL is not enabled.
3. Remove SPL_OF_CONTROL and related configs from omapl138_lcdk_defconfig

This cleanup effectively reverts 3ef94715cc ('mmc: davinci: fix mmc boot in SPL')

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Tested-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
arch/arm/mach-davinci/include/mach/sdmmc_defs.h
board/davinci/da8xxevm/omapl138_lcdk.c
configs/omapl138_lcdk_defconfig
drivers/mmc/davinci_mmc.c

index 46f6391aa21af75ce684afd2b10f2e5c82608ff4..f95a607e5264c552dff68df630d3263bbfe83c17 100644 (file)
@@ -152,6 +152,13 @@ struct davinci_mmc {
        struct mmc_config cfg;
 };
 
+#define DAVINCI_MAX_BLOCKS     (32)
+struct davinci_mmc_plat {
+       struct davinci_mmc_regs *reg_base;      /* Register base address */
+       struct mmc_config cfg;
+       struct mmc mmc;
+};
+
 int davinci_mmc_init(bd_t *bis, struct davinci_mmc *host);
 
 #endif /* _SDMMC_DEFS_H */
index adb56c6c8719dce87019a1bef7d0efb1ca968c24..84603cb117104dfc3f4800a3948609c58bc34045 100644 (file)
@@ -368,8 +368,20 @@ U_BOOT_DEVICE(omapl138_uart) = {
        .platdata = &serial_pdata,
 };
 
+static const struct davinci_mmc_plat mmc_platdata = {
+       .reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE,
+       .cfg = {
+               .f_min = 200000,
+               .f_max = 25000000,
+               .voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
+               .host_caps = MMC_MODE_4BIT,
+               .b_max = DAVINCI_MAX_BLOCKS,
+               .name = "da830-mmc",
+       },
+};
 U_BOOT_DEVICE(omapl138_mmc) = {
        .name = "davinci_mmc",
+       .platdata = &mmc_platdata,
 };
 
 void spl_board_init(void)
index 50cf09c7f182d22add0b6db30d61364725d586c9..b0a58de03d6c66e20d3237b3c02dab0ab9fc0c38 100644 (file)
@@ -40,16 +40,13 @@ CONFIG_CMD_MTDPARTS=y
 CONFIG_CMD_DIAG=y
 CONFIG_CMD_UBI=y
 CONFIG_OF_CONTROL=y
-CONFIG_SPL_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="da850-lcdk"
-CONFIG_SPL_OF_PLATDATA=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_DA8XX_GPIO=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_DAVINCI=y
@@ -82,4 +79,3 @@ CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_DA8XX=y
 CONFIG_USB_MUSB_PIO_ONLY=y
 CONFIG_USB_STORAGE=y
-# CONFIG_SPL_OF_LIBFDT is not set
index 2408a687d235d003125015ee8c16279d13161210..4ef9f7cc8bcb35b9ebae0ec682a0ba0471664db1 100644 (file)
@@ -18,7 +18,6 @@
 #include <asm-generic/gpio.h>
 #include <linux/delay.h>
 
-#define DAVINCI_MAX_BLOCKS     (32)
 #define WATCHDOG_COUNT         (100000)
 
 #define get_val(addr)          REG(addr)
@@ -34,12 +33,6 @@ struct davinci_mmc_priv {
        struct gpio_desc cd_gpio;       /* Card Detect GPIO */
        struct gpio_desc wp_gpio;       /* Write Protect GPIO */
 };
-
-struct davinci_mmc_plat
-{
-       struct mmc_config cfg;
-       struct mmc mmc;
-};
 #endif
 
 /* Set davinci clock prescalar value based on the required clock in HZ */
@@ -487,43 +480,16 @@ static int davinci_mmc_probe(struct udevice *dev)
        struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
        struct davinci_mmc_plat *plat = dev_get_platdata(dev);
        struct davinci_mmc_priv *priv = dev_get_priv(dev);
-       struct mmc_config *cfg = &plat->cfg;
-#ifdef CONFIG_SPL_BUILD
-       int ret;
-#endif
-
-       cfg->f_min = 200000;
-       cfg->f_max = 25000000;
-       cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
-       cfg->host_caps = MMC_MODE_4BIT, /* DA850 supports only 4-bit SD/MMC */
-       cfg->b_max = DAVINCI_MAX_BLOCKS;
-       cfg->name = "da830-mmc";
 
-       priv->reg_base = (struct davinci_mmc_regs *)dev_read_addr(dev);
+       priv->reg_base = plat->reg_base;
        priv->input_clk = clk_get(DAVINCI_MMCSD_CLKID);
-
 #if CONFIG_IS_ENABLED(DM_GPIO)
        /* These GPIOs are optional */
        gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, GPIOD_IS_IN);
        gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, GPIOD_IS_IN);
 #endif
-
        upriv->mmc = &plat->mmc;
 
-#ifdef CONFIG_SPL_BUILD
-       /*
-        * FIXME This is a temporary workaround to enable the driver model in
-        * SPL on omapl138-lcdk. For some reason the bind() callback is not
-        * being called in SPL for MMC which breaks the mmc boot - the hack
-        * is to call mmc_bind() from probe(). We also don't have full DT
-        * support in SPL, hence the hard-coded base register address.
-        */
-       priv->reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE;
-       ret = mmc_bind(dev, &plat->mmc, &plat->cfg);
-       if (ret)
-               return ret;
-#endif
-
        return davinci_dm_mmc_init(dev);
 }
 
@@ -534,21 +500,44 @@ static int davinci_mmc_bind(struct udevice *dev)
        return mmc_bind(dev, &plat->mmc, &plat->cfg);
 }
 
+#if CONFIG_IS_ENABLED(OF_CONTROL)
+static int davinci_mmc_ofdata_to_platdata(struct udevice *dev)
+{
+       struct davinci_mmc_plat *plat = dev_get_platdata(dev);
+       struct mmc_config *cfg = &plat->cfg;
+
+       plat->reg_base = (struct davinci_mmc_regs *)dev_read_addr(dev);
+       cfg->f_min = 200000;
+       cfg->f_max = 25000000;
+       cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
+       cfg->host_caps = MMC_MODE_4BIT, /* DA850 supports only 4-bit SD/MMC */
+       cfg->b_max = DAVINCI_MAX_BLOCKS;
+       cfg->name = "da830-mmc";
+
+       return 0;
+}
+
 static const struct udevice_id davinci_mmc_ids[] = {
        { .compatible = "ti,da830-mmc" },
        {},
 };
-
+#endif
 U_BOOT_DRIVER(davinci_mmc_drv) = {
        .name = "davinci_mmc",
        .id             = UCLASS_MMC,
+#if CONFIG_IS_ENABLED(OF_CONTROL)
        .of_match       = davinci_mmc_ids,
+       .platdata_auto_alloc_size = sizeof(struct davinci_mmc_plat),
+       .ofdata_to_platdata = davinci_mmc_ofdata_to_platdata,
+#endif
 #if CONFIG_BLK
        .bind           = davinci_mmc_bind,
 #endif
        .probe = davinci_mmc_probe,
        .ops = &davinci_mmc_ops,
-       .platdata_auto_alloc_size = sizeof(struct davinci_mmc_plat),
        .priv_auto_alloc_size = sizeof(struct davinci_mmc_priv),
+#if !CONFIG_IS_ENABLED(OF_CONTROL)
+       .flags  = DM_FLAG_PRE_RELOC,
+#endif
 };
 #endif