--- zzzz-none-000/linux-2.6.39.4/drivers/mmc/core/mmc.c 2011-08-03 19:43:28.000000000 +0000 +++ puma6-atom-6490-729/linux-2.6.39.4/drivers/mmc/core/mmc.c 2021-11-10 13:38:15.000000000 +0000 @@ -10,6 +10,15 @@ * published by the Free Software Foundation. */ + +/****************************************************************** + + Includes Intel Corporation's changes/modifications dated: 07/2011. + Changed/modified portions - Copyright(c) 2011, Intel Corporation. + +******************************************************************/ + + #include #include @@ -21,6 +30,10 @@ #include "bus.h" #include "mmc_ops.h" +#ifdef CONFIG_ARCH_GEN3 +extern int intelce_boot_mode; +#endif + static const unsigned int tran_exp[] = { 10000, 100000, 1000000, 10000000, 0, 0, 0, 0 @@ -179,6 +192,9 @@ { int err; u8 *ext_csd; +#if defined(CONFIG_ARCH_GEN3) || defined(CONFIG_ARCH_GEN3_MMC) + int i; +#endif BUG_ON(!card); @@ -241,8 +257,11 @@ if (card->ext_csd.rev > 5) { printk(KERN_ERR "%s: unrecognised EXT_CSD revision %d\n", mmc_hostname(card->host), card->ext_csd.rev); + /* AVM/TKL: ext_csd is supposed to be forward compatible */ +#if 0 err = -EINVAL; goto out; +#endif } if (card->ext_csd.rev >= 2) { @@ -257,6 +276,39 @@ mmc_card_set_blockaddr(card); } +#if defined(CONFIG_ARCH_GEN3) || defined(CONFIG_ARCH_GEN3_MMC) + card->ext_csd.boot_size_mult = ext_csd[EXT_CSD_BOOT_SIZE_MULT]; + card->ext_csd.boot_config = ext_csd[EXT_CSD_BOOT_CONFIG]; + + if (ext_csd[EXT_CSD_REV] == 5) { + for (i = 0; i < 4; i++) { + card->ext_csd.gp_size[i] = + (ext_csd[EXT_CSD_GP_SIZE_MULT + i * 3] + + ext_csd[EXT_CSD_GP_SIZE_MULT + i * 3 + 1] * 256 + + ext_csd[EXT_CSD_GP_SIZE_MULT + i * 3 + 2] * 65536) * + ext_csd[EXT_CSD_HC_WP_GRP_SIZE] * + ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024 * + (ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x1); + } + } + else if (ext_csd[EXT_CSD_REV] == 4) { + for (i = 0; i < 4; i++) { + card->ext_csd.gp_size[i] = + (ext_csd[EXT_CSD_GP_SIZE_MULT + i * 3] + + ext_csd[EXT_CSD_GP_SIZE_MULT + i * 3 + 1] * 8 + + ext_csd[EXT_CSD_GP_SIZE_MULT + i * 3 + 2] * 64) * + ext_csd[EXT_CSD_HC_WP_GRP_SIZE] * + ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024 * + (ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x1); + } + } + else { + for (i = 0; i < 4; i++) { + card->ext_csd.gp_size[i] = 0; + } + } +#endif + switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) { case EXT_CSD_CARD_TYPE_DDR_52 | EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26: @@ -459,7 +511,13 @@ goto err; if (oldcard) { - if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) { + + //printk("[PowerOn] mmc_init_card: oldcard = true.\n"); + if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) + { + printk("Error: new CID [%.8X %.8X %.8X %.8X], does not match Old CID [%.8X %.8X %.8X %.8X]\n", + cid[0],cid[1],cid[2],cid[3], + oldcard->raw_cid[0],oldcard->raw_cid[1],oldcard->raw_cid[2],oldcard->raw_cid[3]); err = -ENOENT; goto err; } @@ -522,7 +580,13 @@ */ err = mmc_read_ext_csd(card); if (err) + { +#ifdef CONFIG_ARCH_GEN3_MMC + /* WA for eMMC errors (CRC erorr interrupt) */ + host->caps |= MMC_CAP_NEEDS_POLL; +#endif goto free_card; + } /* If doing byte addressing, check if required to do sector * addressing. Handle the case of <2GB cards needing sector @@ -708,6 +772,7 @@ BUG_ON(!host); BUG_ON(!host->card); + mmc_claim_host(host); /* @@ -891,19 +956,56 @@ err = mmc_init_card(host, host->ocr, NULL); if (err) goto err; - +#if defined(CONFIG_ARCH_GEN3) + if (intelce_boot_mode == 1) { + mmc_release_host_no_hwmutex(host); + } else { + mmc_release_host(host); + } +#else mmc_release_host(host); +#endif + err = mmc_add_card(host->card); + +#if defined(CONFIG_ARCH_GEN3) + if (intelce_boot_mode == 1) { + mmc_claim_host_no_hwmutex(host); + } else { + mmc_claim_host(host); + } +#else mmc_claim_host(host); +#endif + if (err) goto remove_card; return 0; remove_card: +#if defined(CONFIG_ARCH_GEN3) + if (intelce_boot_mode == 1) { + mmc_release_host_no_hwmutex(host); + } else { + mmc_release_host(host); + } +#else mmc_release_host(host); +#endif + mmc_remove_card(host->card); +#if defined(CONFIG_ARCH_GEN3) + if (intelce_boot_mode == 1) { + mmc_claim_host_no_hwmutex(host); + } else { + mmc_claim_host(host); + } +#else mmc_claim_host(host); +#endif + + host->card = NULL; err: mmc_detach_bus(host);