diff options
author | Jason Liu <jason.hui@linaro.org> | 2011-12-14 19:42:03 +0800 |
---|---|---|
committer | Jason Liu <r64343@freescale.com> | 2012-01-09 21:10:10 +0800 |
commit | d658b0ce7b9e0429f68ce892267d81f6bbb124a8 (patch) | |
tree | 337c196ae5cb301f8d164669379583c5f044af96 | |
parent | 50700a7e6a5d43a720362cd4f95305748417d831 (diff) |
Revert "ENGR00126228 eMMC: Configure boot_partition_enable"
This reverts commit b35268ca923a8785ab311170b0a84210b3c7863e.
-rw-r--r-- | drivers/mmc/core/mmc.c | 229 | ||||
-rw-r--r-- | include/linux/mmc/card.h | 1 | ||||
-rw-r--r-- | include/linux/mmc/mmc.h | 25 |
3 files changed, 23 insertions, 232 deletions
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 6af789fd6ed5..f53aa48b7100 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -287,7 +287,6 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) card->ext_csd.boot_info = ext_csd[EXT_CSD_BOOT_INFO]; card->ext_csd.boot_size_mult = ext_csd[EXT_CSD_BOOT_SIZE_MULT]; card->ext_csd.boot_config = ext_csd[EXT_CSD_BOOT_CONFIG]; - card->ext_csd.boot_bus_width = ext_csd[EXT_CSD_BOOT_BUS_WIDTH]; card->ext_csd.card_type = ext_csd[EXT_CSD_CARD_TYPE]; switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) { @@ -492,21 +491,34 @@ out: return err; } -/* configure the boot partitions */ +/* switch the partitions */ static ssize_t -setup_boot_partitions(struct device *dev, struct device_attribute *attr, +switch_partitions(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - int err, busy = 0; + int err; u32 part, new_part; u8 *ext_csd, boot_config; - struct mmc_command cmd; struct mmc_card *card = container_of(dev, struct mmc_card, dev); + struct mmc_host *host = card->host; BUG_ON(!card); + mmc_claim_host(card->host); sscanf(buf, "%d\n", &part); + /* partition must be - + * 0 - user area + * 1 - boot partition 1 + * 2 - boot partition 2 + */ + if (part > 2) { + printk(KERN_ERR "%s: wrong partition id" + " 0 (user area), 1 (boot1), 2 (boot2)\n", + mmc_hostname(card->host)); + return -EINVAL; + } + if (card->csd.mmca_vsn < CSD_SPEC_VER_4) { printk(KERN_ERR "%s: invalid mmc version" " mmc version is below version 4!)\n", @@ -529,7 +541,6 @@ setup_boot_partitions(struct device *dev, struct device_attribute *attr, return -ENOMEM; } - mmc_claim_host(card->host); err = mmc_send_ext_csd(card, ext_csd); if (err) { printk(KERN_ERR "%s: unable to read EXT_CSD.\n", @@ -537,62 +548,9 @@ setup_boot_partitions(struct device *dev, struct device_attribute *attr, goto err_rtn; } - /* enable the boot partition in boot mode */ - /* boot enable be - - * 0x00 - disable boot enable. - * 0x08 - boot partition 1 is enabled for boot. - * 0x10 - boot partition 2 is enabled for boot. - * 0x38 - User area is enabled for boot. - */ - switch (part & EXT_CSD_BOOT_PARTITION_ENABLE_MASK) { - case 0: - boot_config = (ext_csd[EXT_CSD_BOOT_CONFIG] - & ~EXT_CSD_BOOT_PARTITION_ENABLE_MASK - & ~EXT_CSD_BOOT_ACK_ENABLE); - break; - case EXT_CSD_BOOT_PARTITION_PART1: - boot_config = ((ext_csd[EXT_CSD_BOOT_CONFIG] - & ~EXT_CSD_BOOT_PARTITION_ENABLE_MASK) - | EXT_CSD_BOOT_PARTITION_PART1 - | EXT_CSD_BOOT_ACK_ENABLE); - break; - case EXT_CSD_BOOT_PARTITION_PART2: - boot_config = ((ext_csd[EXT_CSD_BOOT_CONFIG] - & ~EXT_CSD_BOOT_PARTITION_ENABLE_MASK) - | EXT_CSD_BOOT_PARTITION_PART2 - | EXT_CSD_BOOT_ACK_ENABLE); - break; - case EXT_CSD_BOOT_PARTITION_ENABLE_MASK: - boot_config = ((ext_csd[EXT_CSD_BOOT_CONFIG] - | EXT_CSD_BOOT_PARTITION_ENABLE_MASK) - & ~EXT_CSD_BOOT_ACK_ENABLE); - break; - default: - printk(KERN_ERR "%s: wrong boot config parameter" - " 00 (disable boot), 08 (enable boot1)," - "16 (enable boot2), 56 (User area)\n", - mmc_hostname(card->host)); - err = -EINVAL; - goto err_rtn; - } - - /* switch the partitions that used to be accessed in OS layer */ - /* partition must be - - * 0 - user area - * 1 - boot partition 1 - * 2 - boot partition 2 - */ - if ((part & EXT_CSD_BOOT_PARTITION_ACCESS_MASK) > 2) { - printk(KERN_ERR "%s: wrong partition id" - " 0 (user area), 1 (boot1), 2 (boot2)\n", - mmc_hostname(card->host)); - err = -EINVAL; - goto err_rtn; - } - /* Send SWITCH command to change partition for access */ - boot_config &= ~EXT_CSD_BOOT_PARTITION_ACCESS_MASK; - boot_config |= (part & EXT_CSD_BOOT_PARTITION_ACCESS_MASK); + boot_config = (ext_csd[EXT_CSD_BOOT_CONFIG] & + ~EXT_CSD_BOOT_PARTITION_ACCESS_MASK) | part; err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_CONFIG, boot_config); if (err) { @@ -602,41 +560,17 @@ setup_boot_partitions(struct device *dev, struct device_attribute *attr, goto err_rtn; } - /* waiting for the card to finish the busy state */ - do { - memset(&cmd, 0, sizeof(struct mmc_command)); - - cmd.opcode = MMC_SEND_STATUS; - cmd.arg = card->rca << 16; - cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; - - err = mmc_wait_for_cmd(card->host, &cmd, 0); - if (err || busy > 100) { - printk(KERN_ERR "%s: failed to wait for" - "the busy state to end.\n", - mmc_hostname(card->host)); - break; - } - - if (!busy && !(cmd.resp[0] & R1_READY_FOR_DATA)) { - printk(KERN_INFO "%s: card is in busy state" - "pls wait for busy state to end.\n", - mmc_hostname(card->host)); - } - busy++; - } while (!(cmd.resp[0] & R1_READY_FOR_DATA)); - /* Now check whether it works */ err = mmc_send_ext_csd(card, ext_csd); if (err) { - printk(KERN_ERR "%s: %d unable to re-read EXT_CSD.\n", + printk(KERN_ERR "%s: %d unable to read EXT_CSD.\n", mmc_hostname(card->host), err); goto err_rtn; } new_part = ext_csd[EXT_CSD_BOOT_CONFIG] & EXT_CSD_BOOT_PARTITION_ACCESS_MASK; - if ((part & EXT_CSD_BOOT_PARTITION_ACCESS_MASK) != new_part) { + if (part != new_part) { printk(KERN_ERR "%s: after SWITCH, current part id %d is not" " same as requested partition %d!\n", mmc_hostname(card->host), new_part, part); @@ -653,120 +587,6 @@ err_rtn: return count; } -/* configure the boot bus */ -static ssize_t -setup_boot_bus(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - int err, busy = 0; - u32 boot_bus, new_bus; - u8 *ext_csd; - struct mmc_command cmd; - struct mmc_card *card = container_of(dev, struct mmc_card, dev); - - BUG_ON(!card); - - sscanf(buf, "%d\n", &boot_bus); - - if (card->csd.mmca_vsn < CSD_SPEC_VER_4) { - printk(KERN_ERR "%s: invalid mmc version" - " mmc version is below version 4!)\n", - mmc_hostname(card->host)); - return -EINVAL; - } - - /* it's a normal SD/MMC but user request to configure boot bus */ - if (card->ext_csd.boot_size_mult <= 0) { - printk(KERN_ERR "%s: this is a normal SD/MMC card" - " but you request to configure boot bus !\n", - mmc_hostname(card->host)); - return -EINVAL; - } - - ext_csd = kmalloc(512, GFP_KERNEL); - if (!ext_csd) { - printk(KERN_ERR "%s: could not allocate a buffer to " - "receive the ext_csd.\n", mmc_hostname(card->host)); - return -ENOMEM; - } - - mmc_claim_host(card->host); - err = mmc_send_ext_csd(card, ext_csd); - if (err) { - printk(KERN_ERR "%s: unable to read EXT_CSD.\n", - mmc_hostname(card->host)); - goto err_rtn; - } - - /* Configure the boot bus width when boot partition is enabled */ - if (((boot_bus & EXT_CSD_BOOT_BUS_WIDTH_MODE_MASK) >> 3) > 2 - || (boot_bus & EXT_CSD_BOOT_BUS_WIDTH_WIDTH_MASK) > 2 - || (boot_bus & ~EXT_CSD_BOOT_BUS_WIDTH_MASK) > 0) { - printk(KERN_ERR "%s: Invalid inputs!\n", - mmc_hostname(card->host)); - err = -EINVAL; - goto err_rtn; - } - - err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, - EXT_CSD_BOOT_BUS_WIDTH, boot_bus); - if (err) { - printk(KERN_ERR "%s: fail to send SWITCH command to " - "card to swich partition for access!\n", - mmc_hostname(card->host)); - goto err_rtn; - } - - /* waiting for the card to finish the busy state */ - do { - memset(&cmd, 0, sizeof(struct mmc_command)); - - cmd.opcode = MMC_SEND_STATUS; - cmd.arg = card->rca << 16; - cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; - - err = mmc_wait_for_cmd(card->host, &cmd, 0); - if (err || busy > 100) { - printk(KERN_ERR "%s: failed to wait for" - "the busy state to end.\n", - mmc_hostname(card->host)); - break; - } - - if (!busy && !(cmd.resp[0] & R1_READY_FOR_DATA)) { - printk(KERN_INFO "%s: card is in busy state" - "pls wait for busy state to end.\n", - mmc_hostname(card->host)); - } - busy++; - } while (!(cmd.resp[0] & R1_READY_FOR_DATA)); - - /* Now check whether it works */ - err = mmc_send_ext_csd(card, ext_csd); - if (err) { - printk(KERN_ERR "%s: %d unable to re-read EXT_CSD.\n", - mmc_hostname(card->host), err); - goto err_rtn; - } - - new_bus = ext_csd[EXT_CSD_BOOT_BUS_WIDTH]; - if (boot_bus != new_bus) { - printk(KERN_ERR "%s: after SWITCH, current boot bus mode %d" - " is not same as requested bus mode %d!\n", - mmc_hostname(card->host), new_bus, boot_bus); - goto err_rtn; - } - card->ext_csd.boot_bus_width = ext_csd[EXT_CSD_BOOT_BUS_WIDTH]; - -err_rtn: - mmc_release_host(card->host); - kfree(ext_csd); - if (err) - return err; - else - return count; -} - MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1], card->raw_cid[2], card->raw_cid[3]); MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1], @@ -787,12 +607,6 @@ MMC_DEV_ATTR(boot_info, "Info:0x%02x;Size:0x%02xMB;Part:0x%02x\n", card->ext_csd.boot_info, card->ext_csd.boot_size_mult / 8, card->ext_csd.boot_config); DEVICE_ATTR(boot_config, S_IWUGO, NULL, switch_partitions); -MMC_DEV_ATTR(boot_info, "boot_info:0x%02x; boot_size:%04dKB;" - " boot_partition:0x%02x; boot_bus:0x%02x\n", - card->ext_csd.boot_info, card->ext_csd.boot_size_mult * 128, - card->ext_csd.boot_config, card->ext_csd.boot_bus_width); -DEVICE_ATTR(boot_config, S_IWUGO, NULL, setup_boot_partitions); -DEVICE_ATTR(boot_bus_config, S_IWUGO, NULL, setup_boot_bus); static struct attribute *mmc_std_attrs[] = { &dev_attr_cid.attr, @@ -810,7 +624,6 @@ static struct attribute *mmc_std_attrs[] = { &dev_attr_enhanced_area_size.attr, &dev_attr_boot_info.attr, &dev_attr_boot_config.attr, - &dev_attr_boot_bus_config.attr, NULL, }; diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index b7702db5ba46..621df95b28fa 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -81,7 +81,6 @@ struct mmc_ext_csd { unsigned char boot_info; unsigned char boot_size_mult; unsigned char boot_config; - unsigned char boot_bus_width; }; struct sd_scr { diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 78a398d3a76c..fe1da341e28d 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h @@ -286,7 +286,7 @@ struct _mmc_csd { #define EXT_CSD_BOOT_CONFIG 179 /* R/W */ #define EXT_CSD_BOOT_SIZE_MULT 226 /* RO, 1 bytes */ #define EXT_CSD_BOOT_INFO 228 /* RO, 1 bytes */ -#define EXT_CSD_BOOT_BUS_WIDTH 177 + /* * EXT_CSD field definitions */ @@ -321,28 +321,7 @@ struct _mmc_csd { #define EXT_CSD_SEC_BD_BLK_EN BIT(2) #define EXT_CSD_SEC_GB_CL_EN BIT(4) -#define EXT_CSD_BOOT_BUS_WIDTH_MASK (0x1F) -#define EXT_CSD_BOOT_BUS_WIDTH_MODE_MASK (0x3 << 3) -#define EXT_CSD_BOOT_BUS_WIDTH_MODE_SDR_NORMAL (0x0) -#define EXT_CSD_BOOT_BUS_WIDTH_MODE_SDR_HIGH (0x1) -#define EXT_CSD_BOOT_BUS_WIDTH_MODE_DDR (0x2) -#define EXT_CSD_BOOT_BUS_WIDTH_RST_WIDTH (1 << 2) -#define EXT_CSD_BOOT_BUS_WIDTH_WIDTH_MASK (0x3) -#define EXT_CSD_BOOT_BUS_WIDTH_1_SDR_4_DDR (0x0) -#define EXT_CSD_BOOT_BUS_WIDTH_4_SDR_4_DDR (0x1) -#define EXT_CSD_BOOT_BUS_WIDTH_8_SDR_8_DDR (0x2) - -#define EXT_CSD_BOOT_ACK_ENABLE (0x1 << 6) -#define EXT_CSD_BOOT_PARTITION_ENABLE_MASK (0x7 << 3) -#define EXT_CSD_BOOT_PARTITION_DISABLE (0x0) -#define EXT_CSD_BOOT_PARTITION_PART1 (0x1 << 3) -#define EXT_CSD_BOOT_PARTITION_PART2 (0x2 << 3) -#define EXT_CSD_BOOT_PARTITION_USER (0x7 << 3) - -#define EXT_CSD_BOOT_PARTITION_ACCESS_MASK (0x7) -#define EXT_CSD_BOOT_PARTITION_ACCESS_DISABLE (0x0) -#define EXT_CSD_BOOT_PARTITION_ACCESS_PART1 (0x1) -#define EXT_CSD_BOOT_PARTITION_ACCESS_PART2 (0x2) +#define EXT_CSD_BOOT_PARTITION_ACCESS_MASK (0x3) /* * MMC_SWITCH access modes |