From patchwork Sun Jan 17 14:59:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Wahren X-Patchwork-Id: 8050731 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 736C89F6FA for ; Sun, 17 Jan 2016 15:00:43 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8D1622015E for ; Sun, 17 Jan 2016 15:00:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A88D02025B for ; Sun, 17 Jan 2016 15:00:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752599AbcAQPAi (ORCPT ); Sun, 17 Jan 2016 10:00:38 -0500 Received: from mout.kundenserver.de ([212.227.126.135]:62396 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752669AbcAQPAQ (ORCPT ); Sun, 17 Jan 2016 10:00:16 -0500 Received: from localhost.localdomain ([95.91.39.67]) by mrelayeu.kundenserver.de (mreue001) with ESMTPSA (Nemesis) id 0LwRR9-1a5bCq3CSV-018NM5; Sun, 17 Jan 2016 15:59:36 +0100 From: Stefan Wahren To: Scott Branden , Ray Jui , Jon Mason , Stephen Warren , Lee Jones , Eric Anholt Cc: Rob Herring , Mark Rutland , Arnd Bergmann , Ulf Hansson , kernel@martin.sperl.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-mmc@vger.kernel.org, bcm-kernel-feedback-list@broadcom.com, Stefan Wahren Subject: [PATCH 4/5 RFC] mmc: sdhci-iproc: add bcm2835 support Date: Sun, 17 Jan 2016 14:59:03 +0000 Message-Id: <1453042744-16196-5-git-send-email-stefan.wahren@i2se.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1453042744-16196-1-git-send-email-stefan.wahren@i2se.com> References: <1453042744-16196-1-git-send-email-stefan.wahren@i2se.com> X-Provags-ID: V03:K0:G1ovdt/LVELzDcSIygQcwCksQpPrC5UwZPq8zaXRsGxGIz/vyMh aWgWUC6NWZ4cLJP9dJoIOYgK1LwuajmNf6tpaALQHkT9YVkxQOal/tOc2vLBOEnfRmH+k2y qUJZZ56AU3N5lKL9BeEHQmQDnht6L+HmoC6vf7r3KtET4pBfYECjNdZXTOeNdwLNm9f+z0y YDyv3DBkVRfPn/xlJ5eSA== X-UI-Out-Filterresults: notjunk:1; V01:K0:PL/2Hn3DjIs=:ie8JaMp9gFfg4zghj1k35p GbNL2XYCNXgBleHxttU8hDd1UMo9Mb2C2kpjPqEWeo9RvOOvN54Y3at8YZIUXIzkBCrPhqzjT RFxq0euYnPCjlHl1lHe1B2MY3zsmXv5ZPVBlw+iLMzN2+r8RuBHDCTrqD/XGUs1l6TWTnjZYi 3LYnnEU+PTRPa8p4usPFobSGKerKURevoiAZ8oqqIiP3O/OH7myh9oBqXC92uu7w7aGYWhxSp P478R3UUjJczrmy4zqzv4NifuowrvE0dIBq41GysZ5KiJb6NwxuIIoNXGXANc44xXVCDzbvEc 7lKcYmrQzRoNSG1gKDz9eZCfVBLxX1zrnqjLPuT2EC3uKl23ddfSOxD8Wl80bEDeJBxAwppy2 kqOrtOX6zFkoiq4Wk8dRKL5iz5wMr+rdJ+6KsiGSUfu1oQyF+qZasLzXrljbnOsaOD3ufKydO 3Aea7kohFUcLAov4NEX8yElguzWEv/Mw1xLsOZyyWlxambSFZQopm2awMzA+12FQUKF0/hAjo 0wik9hgbS2cWcX6IyOUBIn91hq8gm/71jOSfZjyoUjWikX60ZDgRKNExH4CV+9F8Lk9LzSLSw bEYj0BTkFOgxE95ol2gRZXFM3DPAHseblngdq1J6hKSIvJrBC+zY2qmfmccmS/00sZ0YCc6u0 W+V+fX+NZXfdITPpwtNSnmzjT2TTaJoOhew7gzAvKVeX/oyp7K43gatwux9dtxe8Wq9k= Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Scott Branden from Broadcom said that the BCM2835 eMMC IP core is very similar to IPROC and share most of the quirks. So use this driver instead of separate one. The sdhci-iproc contains a better workaround for the clock domain crossing problem which doesn't need any delays. This results in a better write performance. Btw we get the rid of the SDHCI_CAPABILITIES hack in the sdhci_readl function. Suggested-by: Scott Branden Signed-off-by: Stefan Wahren --- drivers/mmc/host/Kconfig | 6 +++--- drivers/mmc/host/sdhci-iproc.c | 20 ++++++++++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig index 1526b8a..60de1e4 100644 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -318,15 +318,15 @@ config MMC_SDHCI_F_SDH30 If unsure, say N. config MMC_SDHCI_IPROC - tristate "SDHCI platform support for the iProc SD/MMC Controller" - depends on ARCH_BCM_IPROC || COMPILE_TEST + tristate "SDHCI support for the BCM2835 & iProc SD/MMC Controller" + depends on ARCH_BCM2835 || ARCH_BCM_IPROC || COMPILE_TEST depends on MMC_SDHCI_PLTFM default ARCH_BCM_IPROC select MMC_SDHCI_IO_ACCESSORS help This selects the iProc SD/MMC controller. - If you have an IPROC platform with SD or MMC devices, + If you have a BCM2835 or IPROC platform with SD or MMC devices, say Y or M here. If unsure, say N. diff --git a/drivers/mmc/host/sdhci-iproc.c b/drivers/mmc/host/sdhci-iproc.c index 55bc348..88399eb 100644 --- a/drivers/mmc/host/sdhci-iproc.c +++ b/drivers/mmc/host/sdhci-iproc.c @@ -167,7 +167,20 @@ static const struct sdhci_iproc_data iproc_data = { .caps1 = 0x00000064, }; +static const struct sdhci_pltfm_data sdhci_bcm2835_pltfm_data = { + .quirks = SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK + | SDHCI_QUIRK_MISSING_CAPS, + .ops = &sdhci_iproc_ops, +}; + +static const struct sdhci_iproc_data bcm2835_data = { + .pdata = &sdhci_bcm2835_pltfm_data, + .caps = SDHCI_CAN_VDD_330, + .caps1 = 0x00000000, +}; + static const struct of_device_id sdhci_iproc_of_match[] = { + { .compatible = "brcm,bcm2835-sdhci", .data = &bcm2835_data }, { .compatible = "brcm,sdhci-iproc-cygnus", .data = &iproc_data }, { } }; @@ -180,6 +193,7 @@ static int sdhci_iproc_probe(struct platform_device *pdev) struct sdhci_host *host; struct sdhci_iproc_host *iproc_host; struct sdhci_pltfm_host *pltfm_host; + struct device_node *np = pdev->dev.of_node; int ret; match = of_match_device(sdhci_iproc_of_match, &pdev->dev); @@ -199,8 +213,10 @@ static int sdhci_iproc_probe(struct platform_device *pdev) mmc_of_parse(host->mmc); sdhci_get_of_property(pdev); - /* Enable EMMC 1/8V DDR capable */ - host->mmc->caps |= MMC_CAP_1_8V_DDR; + if (of_device_is_compatible(np, "brcm,sdhci-iproc-cygnus")) { + /* Enable EMMC 1/8V DDR capable */ + host->mmc->caps |= MMC_CAP_1_8V_DDR; + } pltfm_host->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(pltfm_host->clk)) {