]> git.sur5r.net Git - u-boot/blobdiff - drivers/mmc/mmc.c
mmc: sdhci: combine the Host controller v3.0 feature into one condition
[u-boot] / drivers / mmc / mmc.c
index d6b7e4f510c93c3faadaa6b84646bc7402e68b1b..9f8368a123a119bcf2d259b1dd74c168159c6c48 100644 (file)
@@ -30,6 +30,29 @@ static const unsigned int sd_au_size[] = {
        SZ_16M / 512,   (SZ_16M + SZ_8M) / 512, SZ_32M / 512,   SZ_64M / 512,
 };
 
+#if CONFIG_IS_ENABLED(MMC_TINY)
+static struct mmc mmc_static;
+struct mmc *find_mmc_device(int dev_num)
+{
+       return &mmc_static;
+}
+
+void mmc_do_preinit(void)
+{
+       struct mmc *m = &mmc_static;
+#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
+       mmc_set_preinit(m, 1);
+#endif
+       if (m->preinit)
+               mmc_start_init(m);
+}
+
+struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
+{
+       return &mmc->block_dev;
+}
+#endif
+
 #ifndef CONFIG_DM_MMC_OPS
 __weak int board_mmc_getwp(struct mmc *mmc)
 {
@@ -259,7 +282,11 @@ ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
        if (!mmc)
                return 0;
 
-       err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
+       if (CONFIG_IS_ENABLED(MMC_TINY))
+               err = mmc_switch_part(mmc, block_dev->hwpart);
+       else
+               err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
+
        if (err < 0)
                return 0;
 
@@ -1708,7 +1735,7 @@ static int mmc_complete_init(struct mmc *mmc)
 int mmc_init(struct mmc *mmc)
 {
        int err = 0;
-       unsigned start;
+       __maybe_unused unsigned start;
 #ifdef CONFIG_DM_MMC
        struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
 
@@ -1804,7 +1831,9 @@ int mmc_initialize(bd_t *bis)
        initialized = 1;
 
 #ifndef CONFIG_BLK
+#if !CONFIG_IS_ENABLED(MMC_TINY)
        mmc_list_init();
+#endif
 #endif
        ret = mmc_probe(bis);
        if (ret)
@@ -1817,3 +1846,37 @@ int mmc_initialize(bd_t *bis)
        mmc_do_preinit();
        return 0;
 }
+
+#ifdef CONFIG_CMD_BKOPS_ENABLE
+int mmc_set_bkops_enable(struct mmc *mmc)
+{
+       int err;
+       ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
+
+       err = mmc_send_ext_csd(mmc, ext_csd);
+       if (err) {
+               puts("Could not get ext_csd register values\n");
+               return err;
+       }
+
+       if (!(ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1)) {
+               puts("Background operations not supported on device\n");
+               return -EMEDIUMTYPE;
+       }
+
+       if (ext_csd[EXT_CSD_BKOPS_EN] & 0x1) {
+               puts("Background operations already enabled\n");
+               return 0;
+       }
+
+       err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BKOPS_EN, 1);
+       if (err) {
+               puts("Failed to enable manual background operations\n");
+               return err;
+       }
+
+       puts("Enabled manual background operations\n");
+
+       return 0;
+}
+#endif