diff options
author | Daniel Hillenbrand <daniel.hillenbrand@codeworkx.de> | 2012-07-21 23:04:45 +0200 |
---|---|---|
committer | Daniel Hillenbrand <daniel.hillenbrand@codeworkx.de> | 2012-07-21 23:04:45 +0200 |
commit | 0a1182796f6475b8cb2ff1781dad873a744b3197 (patch) | |
tree | e15b5256dac226c49a25b5e24594cd638e2fec2c /drivers/mmc | |
parent | 633018c13fe06461d9c60692fbb114734aa37802 (diff) | |
download | kernel_samsung_smdk4412-0a1182796f6475b8cb2ff1781dad873a744b3197.zip kernel_samsung_smdk4412-0a1182796f6475b8cb2ff1781dad873a744b3197.tar.gz kernel_samsung_smdk4412-0a1182796f6475b8cb2ff1781dad873a744b3197.tar.bz2 |
samsung opensource update3
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/card/block.c | 27 | ||||
-rw-r--r-- | drivers/mmc/core/core.c | 5 | ||||
-rw-r--r-- | drivers/mmc/core/mmc.c | 163 | ||||
-rw-r--r-- | drivers/mmc/core/sd.c | 6 | ||||
-rw-r--r-- | drivers/mmc/core/sdio.c | 8 | ||||
-rw-r--r-- | drivers/mmc/host/mshci-s3c.c | 7 | ||||
-rw-r--r-- | drivers/mmc/host/mshci.c | 7 |
7 files changed, 117 insertions, 106 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index e505132..bb89b20 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1008,12 +1008,11 @@ static int mmc_blk_err_check(struct mmc_card *card, brq->data.error) { #if defined(CONFIG_MACH_M0) || defined(CONFIG_MACH_P4NOTE) || \ defined(CONFIG_MACH_C1_USA_ATT) - /* dh0421.hwang */ if (mmc_card_mmc(card)) { - printk(KERN_ERR "[TEST] brq->sbc.opcode=%d," + pr_err("brq->sbc.opcode=%d," "brq->cmd.opcode=%d.\n", brq->sbc.opcode, brq->cmd.opcode); - printk(KERN_ERR "[TEST] brq->sbc.error=%d," + pr_err("brq->sbc.error=%d," "brq->cmd.error=%d, brq->stop.error=%d," "brq->data.error=%d.\n", brq->sbc.error, brq->cmd.error, brq->stop.error, @@ -1934,35 +1933,21 @@ snd_packed_rd: #if defined(CONFIG_MACH_M0) || defined(CONFIG_MACH_P4NOTE) || \ defined(CONFIG_MACH_C1_USA_ATT) /* - * dh0421.hwang * It's for Engineering DEBUGGING only * This has to be removed before PVR(guessing) * Please refer mshci reg dumps */ if (mmc_card_mmc(card) && status != 3) { - printk(KERN_ERR "[TEST] CMD aborting case in" + pr_err("CMD aborting case in " "MMC's block layer ret %d.\n", ret); - printk(KERN_ERR "%s: CMD%d, ARG=0x%x.\n", + pr_err("%s: CMD%d, ARG=0x%x.\n", req->rq_disk->disk_name, brq->cmd.opcode, brq->cmd.arg); - printk(KERN_ERR "[TEST] If PACKED_NONE," - "confirm end_request done\n"); - printk(KERN_ERR "packed CMD type = %d.\n", + pr_err("packed CMD type = %d.\n", mq_rq ? mq_rq->packed_cmd : -1); - printk(KERN_ERR "[TEST] mmc%d, request returns %d.\n", + pr_err("mmc%d, request returns %d.\n", card->host->index, status); - printk(KERN_ERR "[TEST] err means...\n"); - printk(KERN_ERR "\t1: MMC_BLK_PARTIAL.\n"); - printk(KERN_ERR "\t2: MMC_BLK_CMD_ERR.\n"); - printk(KERN_ERR "\t3: MMC_BLK_RETRY.\n"); - printk(KERN_ERR "\t4: MMC_BLK_ABORT.\n"); - printk(KERN_ERR "\t5: MMC_BLK_DATA_ERR.\n"); - printk(KERN_ERR "\t6: MMC_BLK_ECC_ERR.\n"); - if (!rqc) { - panic("[TEST] mmc%d, returns %d.\n", - card->host->index, status); - } } #endif diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 8051835..0b2b5b4 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -2373,12 +2373,9 @@ int mmc_flush_cache(struct mmc_card *card) (card->ext_csd.cache_ctrl & 1)) { err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_FLUSH_CACHE, 1, 0); - if (err) { + if (err) pr_err("%s: cache flush error %d\n", mmc_hostname(card->host), err); - panic("[TEST] mmc%d, %s returns %d.\n", - host->index, __func__, err); - } } return err; diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index d118f3b..596098b 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -28,9 +28,11 @@ #define MMC_RETRY_READ_EXT_CSD #else /* For debugging about ext_csd register value */ +#if 0 #define MMC_CHECK_EXT_CSD #endif #endif +#endif static const unsigned int tran_exp[] = { 10000, 100000, 1000000, 10000000, @@ -208,15 +210,6 @@ static void mmc_error_ext_csd(struct mmc_card *card, u8 *ext_csd, } memcpy(ext_csd_backup, ext_csd, 512); -#if 0 /* Just checking */ -#define EXT_CSD_REV 192 /* RO */ -#define EXT_CSD_STRUCTURE 194 /* RO */ -#define EXT_CSD_CARD_TYPE 196 /* RO */ -#endif - pr_err("[TEST] eMMC check : %d, %d, %d.\n", - ext_csd_backup[EXT_CSD_REV], - ext_csd_backup[EXT_CSD_STRUCTURE], - ext_csd_backup[EXT_CSD_CARD_TYPE]); } else { ext_csd_new = kmalloc(512, GFP_KERNEL); if (!ext_csd_new) { @@ -225,12 +218,12 @@ static void mmc_error_ext_csd(struct mmc_card *card, u8 *ext_csd, } else { err = mmc_send_ext_csd(card, ext_csd_new); if (err) - pr_err("[TEST] Fail to get new EXT_CSD.\n"); + pr_err("Fail to get new EXT_CSD.\n"); else available_new = 1; } - pr_err("[TEST] %s: starting diff ext_csd.\n", __func__); - pr_err("[TEST] %s: error on slice %d: backup=%d, now=%d," + pr_err("%s: starting diff ext_csd.\n", __func__); + pr_err("%s: error on slice %d: backup=%d, now=%d," "new=%d.\n", __func__, slice, ext_csd_backup[slice], ext_csd[slice], @@ -384,62 +377,104 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) mmc_card_set_blockaddr(card); } card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE]; - switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) { - case EXT_CSD_CARD_TYPE_SDR_ALL: - case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V: - case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V: - case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52: - card->ext_csd.hs_max_dtr = 200000000; - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_200; - break; - case EXT_CSD_CARD_TYPE_SDR_1_2V_ALL: - case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_8V: - case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_2V: - case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_52: - card->ext_csd.hs_max_dtr = 200000000; - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_1_2V; - break; - case EXT_CSD_CARD_TYPE_SDR_1_8V_ALL: - case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_8V: - case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_2V: - case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_52: - card->ext_csd.hs_max_dtr = 200000000; - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_1_8V; - break; - case EXT_CSD_CARD_TYPE_DDR_52 | EXT_CSD_CARD_TYPE_52 | - EXT_CSD_CARD_TYPE_26: - card->ext_csd.hs_max_dtr = 52000000; - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_52; - break; - case EXT_CSD_CARD_TYPE_DDR_1_2V | EXT_CSD_CARD_TYPE_52 | - EXT_CSD_CARD_TYPE_26: - card->ext_csd.hs_max_dtr = 52000000; - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_2V; - break; - case EXT_CSD_CARD_TYPE_DDR_1_8V | EXT_CSD_CARD_TYPE_52 | - EXT_CSD_CARD_TYPE_26: - card->ext_csd.hs_max_dtr = 52000000; - card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_8V; - break; - case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26: - card->ext_csd.hs_max_dtr = 52000000; - break; - case EXT_CSD_CARD_TYPE_26: - card->ext_csd.hs_max_dtr = 26000000; - break; - default: + if (card->host->caps2 & MMC_CAP2_HS200) { + switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) { + case EXT_CSD_CARD_TYPE_SDR_ALL: + case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V: + case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V: + case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52: + card->ext_csd.hs_max_dtr = 200000000; + card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_200; + break; + case EXT_CSD_CARD_TYPE_SDR_1_2V_ALL: + case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_8V: + case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_2V: + case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_52: + card->ext_csd.hs_max_dtr = 200000000; + card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_1_2V; + break; + case EXT_CSD_CARD_TYPE_SDR_1_8V_ALL: + case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_8V: + case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_2V: + case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_52: + card->ext_csd.hs_max_dtr = 200000000; + card->ext_csd.card_type = EXT_CSD_CARD_TYPE_SDR_1_8V; + break; + case EXT_CSD_CARD_TYPE_DDR_52 | EXT_CSD_CARD_TYPE_52 | + EXT_CSD_CARD_TYPE_26: + card->ext_csd.hs_max_dtr = 52000000; + card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_52; + break; + case EXT_CSD_CARD_TYPE_DDR_1_2V | EXT_CSD_CARD_TYPE_52 | + EXT_CSD_CARD_TYPE_26: + card->ext_csd.hs_max_dtr = 52000000; + card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_2V; + break; + case EXT_CSD_CARD_TYPE_DDR_1_8V | EXT_CSD_CARD_TYPE_52 | + EXT_CSD_CARD_TYPE_26: + card->ext_csd.hs_max_dtr = 52000000; + card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_8V; + break; + case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26: + card->ext_csd.hs_max_dtr = 52000000; + break; + case EXT_CSD_CARD_TYPE_26: + card->ext_csd.hs_max_dtr = 26000000; + break; + default: #if defined(MMC_CHECK_EXT_CSD) - /* For debugging about ext_csd register value */ - mmc_error_ext_csd(card, ext_csd, 0, EXT_CSD_CARD_TYPE); + /* For debugging about ext_csd register value */ + mmc_error_ext_csd(card, ext_csd, 0, EXT_CSD_CARD_TYPE); #endif - /* MMC v4 spec says this cannot happen */ - printk(KERN_WARNING "%s: card is mmc v4 but doesn't " - "support any high-speed modes.\n", - mmc_hostname(card->host)); + /* MMC v4 spec says this cannot happen */ + printk(KERN_WARNING "%s: card is mmc v4 but doesn't " + "support any high-speed modes.\n", + mmc_hostname(card->host)); #if defined(MMC_RETRY_READ_EXT_CSD) - err = -EINVAL; - goto out; + err = -EINVAL; + goto out; #endif + } + } else { + pr_debug("%s: Ignore device type HS200.\n", + mmc_hostname(card->host)); + switch (ext_csd[EXT_CSD_CARD_TYPE] & + EXT_CSD_CARD_TYPE_NO_HS200_MASK) { + case EXT_CSD_CARD_TYPE_DDR_52 | EXT_CSD_CARD_TYPE_52 | + EXT_CSD_CARD_TYPE_26: + card->ext_csd.hs_max_dtr = 52000000; + card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_52; + break; + case EXT_CSD_CARD_TYPE_DDR_1_2V | EXT_CSD_CARD_TYPE_52 | + EXT_CSD_CARD_TYPE_26: + card->ext_csd.hs_max_dtr = 52000000; + card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_2V; + break; + case EXT_CSD_CARD_TYPE_DDR_1_8V | EXT_CSD_CARD_TYPE_52 | + EXT_CSD_CARD_TYPE_26: + card->ext_csd.hs_max_dtr = 52000000; + card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_8V; + break; + case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26: + card->ext_csd.hs_max_dtr = 52000000; + break; + case EXT_CSD_CARD_TYPE_26: + card->ext_csd.hs_max_dtr = 26000000; + break; + default: +#if defined(MMC_CHECK_EXT_CSD) + /* For debugging about ext_csd register value */ + mmc_error_ext_csd(card, ext_csd, 0, EXT_CSD_CARD_TYPE); +#endif + /* MMC v4 spec says this cannot happen */ + printk(KERN_WARNING "%s: card is mmc v4 but doesn't " + "support any high-speed modes.\n", + mmc_hostname(card->host)); +#if defined(MMC_RETRY_READ_EXT_CSD) + err = -EINVAL; + goto out; +#endif + } } card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT]; diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 4586eaa..e4271fa 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -934,7 +934,7 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, if (!mmc_host_is_spi(host)) { err = mmc_send_relative_addr(host, &card->rca); if (err) - return err; + goto free_card; mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL); } @@ -942,7 +942,7 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, if (!oldcard) { err = mmc_sd_get_csd(host, card); if (err) - return err; + goto free_card; mmc_decode_cid(card); } @@ -953,7 +953,7 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, if (!mmc_host_is_spi(host)) { err = mmc_select_card(card); if (err) - return err; + goto free_card; } err = mmc_sd_setup_card(host, card, oldcard != NULL); diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 26e42d8..979cf0b 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -1058,9 +1058,6 @@ static const struct mmc_bus_ops mmc_sdio_ops = { .alive = mmc_sdio_alive, }; -#if defined(CONFIG_MACH_M0) && defined(CONFIG_TARGET_LOCALE_EUR) -extern void print_epll_con0(void); -#endif /* * Starting point for SDIO card init. */ @@ -1077,11 +1074,6 @@ int mmc_attach_sdio(struct mmc_host *host) if (err) return err; -#if defined(CONFIG_MACH_M0) && defined(CONFIG_TARGET_LOCALE_EUR) - /* a sdio module is detected. print EPLL */ - print_epll_con0(); -#endif - mmc_attach_bus(host, &mmc_sdio_ops); if (host->ocr_avail_sdio) host->ocr_avail = host->ocr_avail_sdio; diff --git a/drivers/mmc/host/mshci-s3c.c b/drivers/mmc/host/mshci-s3c.c index 323f115..5023d10 100644 --- a/drivers/mmc/host/mshci-s3c.c +++ b/drivers/mmc/host/mshci-s3c.c @@ -487,6 +487,13 @@ static int __devinit mshci_s3c_probe(struct platform_device *pdev) if (pdata->cd_type == S3C_MSHCI_CD_PERMANENT) { host->quirks |= MSHCI_QUIRK_BROKEN_PRESENT_BIT; host->mmc->caps |= MMC_CAP_NONREMOVABLE; + if (pdata->int_power_gpio) { + gpio_set_value(pdata->int_power_gpio, 1); + s3c_gpio_cfgpin(pdata->int_power_gpio, + S3C_GPIO_OUTPUT); + s3c_gpio_setpull(pdata->int_power_gpio, + S3C_GPIO_PULL_NONE); + } } /* IF SD controller's WP pin donsn't connected with SD card and there diff --git a/drivers/mmc/host/mshci.c b/drivers/mmc/host/mshci.c index 73de297..9431405 100644 --- a/drivers/mmc/host/mshci.c +++ b/drivers/mmc/host/mshci.c @@ -1620,7 +1620,6 @@ static void mshci_cmd_irq(struct mshci_host *host, u32 intmask) host->error_state = 1; #if defined(CONFIG_MACH_M0) || defined(CONFIG_MACH_P4NOTE) || \ defined(CONFIG_MACH_C1_USA_ATT) - /* dh0421.hwang */ if (host->mmc && host->mmc->card) mshci_dumpregs(host); #endif @@ -1662,11 +1661,8 @@ static void mshci_data_irq(struct mshci_host *host, u32 intmask, u8 intr_src) printk(KERN_ERR "%s: Host timeout error\n", mmc_hostname(host->mmc)); host->data->error = -ETIMEDOUT; -#if 1 /* debugging for Host timeout error */ + /* debugging for Host timeout error */ mshci_dumpregs(host); - panic("[TEST] %s: HTO error interrupt occured\n", - mmc_hostname(host->mmc)); -#endif } else if (intmask & INTMSK_DRTO) { printk(KERN_ERR "%s: Data read timeout error\n", mmc_hostname(host->mmc)); @@ -1709,7 +1705,6 @@ static void mshci_data_irq(struct mshci_host *host, u32 intmask, u8 intr_src) host->error_state = 1; #if defined(CONFIG_MACH_M0) || defined(CONFIG_MACH_P4NOTE) || \ defined(CONFIG_MACH_C1_USA_ATT) - /* dh0421.hwang */ if (host->mmc && host->mmc->card) mshci_dumpregs(host); #endif |