]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/mmc/mmc.c
mmc: read extcsd and check if requested change of RST_N_FUNCTION is possible
[karo-tx-uboot.git] / drivers / mmc / mmc.c
index 85e9509ed19374115421bcc6fc5ba10c380f0a24..c0bab82714c50f2649af8095077464b3b5741423 100644 (file)
@@ -20,6 +20,7 @@
 
 static struct list_head mmc_devices;
 static int cur_dev_num = -1;
+static int mmc_dev_count;
 
 __weak int board_mmc_getwp(struct mmc *mmc)
 {
@@ -1549,6 +1550,7 @@ struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
        INIT_LIST_HEAD(&mmc->link);
 
        list_add_tail(&mmc->link, &mmc_devices);
+       mmc_dev_count++;
 
        return mmc;
 }
@@ -1721,6 +1723,11 @@ int get_mmc_num(void)
        return cur_dev_num;
 }
 
+int get_mmc_dev_count(void)
+{
+       return mmc_dev_count;
+}
+
 void mmc_set_preinit(struct mmc *mmc, int preinit)
 {
        mmc->preinit = preinit;
@@ -1874,6 +1881,19 @@ int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
  */
 int mmc_set_rst_n_function(struct mmc *mmc, u8 enable)
 {
+       int ret;
+       ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
+
+       ret = mmc_send_ext_csd(mmc, ext_csd);
+       if (ret)
+               return ret;
+
+       if (ext_csd[EXT_CSD_RST_N_FUNCTION] != 0 &&
+               ext_csd[EXT_CSD_RST_N_FUNCTION] != enable) {
+               printf("RST_N_FUNCTION is already set to %u; cannot change to %u\n",
+                       ext_csd[EXT_CSD_RST_N_FUNCTION], enable);
+               return -EINVAL;
+       }
        return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_RST_N_FUNCTION,
                          enable);
 }