From patchwork Fri Sep 21 09:08:34 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Huang Changming-R66093 X-Patchwork-Id: 1490871 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 033E2DF28C for ; Fri, 21 Sep 2012 09:43:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751604Ab2IUJnh (ORCPT ); Fri, 21 Sep 2012 05:43:37 -0400 Received: from tx2ehsobe001.messaging.microsoft.com ([65.55.88.11]:31514 "EHLO tx2outboundpool.messaging.microsoft.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751132Ab2IUJng (ORCPT ); Fri, 21 Sep 2012 05:43:36 -0400 Received: from mail123-tx2-R.bigfish.com (10.9.14.251) by TX2EHSOBE003.bigfish.com (10.9.40.23) with Microsoft SMTP Server id 14.1.225.23; Fri, 21 Sep 2012 09:43:35 +0000 Received: from mail123-tx2 (localhost [127.0.0.1]) by mail123-tx2-R.bigfish.com (Postfix) with ESMTP id 1EE714E0202; Fri, 21 Sep 2012 09:43:35 +0000 (UTC) X-Forefront-Antispam-Report: CIP:70.37.183.190; KIP:(null); UIP:(null); IPV:NLI; H:mail.freescale.net; RD:none; EFVD:NLI X-SpamScore: 0 X-BigFish: VS0(zzzz1202h1d1ah1d2ahzz8275bhz2dh2a8h668h839hd24he5bhf0ah107ah1288h12a5h12a9h12bdh12e5h137ah1155h) Received: from mail123-tx2 (localhost.localdomain [127.0.0.1]) by mail123-tx2 (MessageSwitch) id 1348220614270844_26192; Fri, 21 Sep 2012 09:43:34 +0000 (UTC) Received: from TX2EHSMHS039.bigfish.com (unknown [10.9.14.251]) by mail123-tx2.bigfish.com (Postfix) with ESMTP id 3EE2F4A0045; Fri, 21 Sep 2012 09:43:34 +0000 (UTC) Received: from mail.freescale.net (70.37.183.190) by TX2EHSMHS039.bigfish.com (10.9.99.139) with Microsoft SMTP Server (TLS) id 14.1.225.23; Fri, 21 Sep 2012 09:43:33 +0000 Received: from az84smr01.freescale.net (10.64.34.197) by 039-SN1MMR1-002.039d.mgd.msft.net (10.84.1.15) with Microsoft SMTP Server (TLS) id 14.2.309.3; Fri, 21 Sep 2012 04:43:32 -0500 Received: from localhost (rock.ap.freescale.net [10.193.20.106]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id q8L9hUWr006352; Fri, 21 Sep 2012 02:43:31 -0700 From: To: CC: Jerry Huang , Shaohui Xie , Anton Vorontsov Subject: [PATCH v2] powerpc/esdhc: disable CMD23 for some Freescale SoCs Date: Fri, 21 Sep 2012 17:08:34 +0800 Message-ID: <1348218514-30655-1-git-send-email-r66093@freescale.com> X-Mailer: git-send-email 1.6.4 MIME-Version: 1.0 X-OriginatorOrg: freescale.com Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org From: Jerry Huang CMD23 causes lots of errors in kernel on some freescale SoCs (P1020, P1021, P1022, P1024, P1025 and P4080) when mmc card used, which is because these controllers does not support CMD23, but even on SoCs which declare CMD23 is supported, so we'll not use CMD23. Signed-off-by: Jerry Huang Signed-off-by: Shaohui Xie CC: Anton Vorontsov --- changes for v2: - discard the property mode and add the processor detection drivers/mmc/host/sdhci-pltfm.c | 32 ++++++++++++++++++++++++++++++++ drivers/mmc/host/sdhci.c | 3 +++ include/linux/mmc/sdhci.h | 1 + 3 files changed, 36 insertions(+) diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c index d9a4ef4..ad55181 100644 --- a/drivers/mmc/host/sdhci-pltfm.c +++ b/drivers/mmc/host/sdhci-pltfm.c @@ -93,6 +93,36 @@ void sdhci_get_of_property(struct platform_device *pdev) {} #endif /* CONFIG_OF */ EXPORT_SYMBOL_GPL(sdhci_get_of_property); +static const u32 processor_table[] = { + /* P1020 Dual/Single core */ + 0x80EC00, 0x80E400, 0x80ED00, 0x80E500, + /* P1021 Dual/Single core */ + 0x80EC01, 0x80E401, 0x80ED01, 0x80E501, + /* P1022 Dual/Single core */ + 0x80EE00, 0x80E600, 0x80EF00, 0x80E700, + /* P1024 Dual/Single core */ + 0x80EC02, 0x80E402, 0x80ED02, 0x80E502, + /* P1025 Dual/Single core */ + 0x80EC03, 0x80E403, 0x80ED03, 0x80E503, + /* P4080 and P4040 */ + 0x820000, 0x820800, 0x820100, 0x820900 +}; + +void sdhci_detect_limitation(struct platform_device *pdev) +{ + struct sdhci_host *host = platform_get_drvdata(pdev); + u32 svr = mfspr(SPRN_SVR) >> 8; + u32 table_size = ARRAY_SIZE(processor_table); + int i; + + for (i = 0; i < table_size; i++) { + if (processor_table[i] == svr) { + host->quirks2 |= SDHCI_QUIRK2_HOST_NO_CMD23; + break; + } + } +} + struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev, struct sdhci_pltfm_data *pdata) { @@ -185,6 +215,8 @@ int sdhci_pltfm_register(struct platform_device *pdev, sdhci_get_of_property(pdev); + sdhci_detect_limitation(pdev); + ret = sdhci_add_host(host); if (ret) sdhci_pltfm_free(pdev); diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 9a11dc3..6208a8b 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -2795,6 +2795,9 @@ int sdhci_add_host(struct sdhci_host *host) if (!(host->quirks & SDHCI_QUIRK_FORCE_1_BIT_DATA)) mmc->caps |= MMC_CAP_4_BIT_DATA; + if (host->quirks2 & SDHCI_QUIRK2_HOST_NO_CMD23) + mmc->caps &= ~MMC_CAP_CMD23; + if (caps[0] & SDHCI_CAN_DO_HISPD) mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED; diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index ac83b10..97c73f5 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h @@ -91,6 +91,7 @@ struct sdhci_host { unsigned int quirks2; /* More deviations from spec. */ #define SDHCI_QUIRK2_HOST_OFF_CARD_ON (1<<0) +#define SDHCI_QUIRK2_HOST_NO_CMD23 (1<<1) int irq; /* Device IRQ */ void __iomem *ioaddr; /* Mapped address */