aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
authorDaniel Hillenbrand <daniel.hillenbrand@codeworkx.de>2012-07-21 23:04:45 +0200
committerDaniel Hillenbrand <daniel.hillenbrand@codeworkx.de>2012-07-21 23:04:45 +0200
commit0a1182796f6475b8cb2ff1781dad873a744b3197 (patch)
treee15b5256dac226c49a25b5e24594cd638e2fec2c /drivers/mmc
parent633018c13fe06461d9c60692fbb114734aa37802 (diff)
downloadkernel_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.c27
-rw-r--r--drivers/mmc/core/core.c5
-rw-r--r--drivers/mmc/core/mmc.c163
-rw-r--r--drivers/mmc/core/sd.c6
-rw-r--r--drivers/mmc/core/sdio.c8
-rw-r--r--drivers/mmc/host/mshci-s3c.c7
-rw-r--r--drivers/mmc/host/mshci.c7
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