From patchwork Thu Jul 25 00:38:11 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haijun.Zhang@freescale.com X-Patchwork-Id: 2833175 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 0888DC0319 for ; Thu, 25 Jul 2013 01:29:57 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 08B35200ED for ; Thu, 25 Jul 2013 01:29:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 19576200C2 for ; Thu, 25 Jul 2013 01:29:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753394Ab3GYB3x (ORCPT ); Wed, 24 Jul 2013 21:29:53 -0400 Received: from co9ehsobe004.messaging.microsoft.com ([207.46.163.27]:58133 "EHLO co9outboundpool.messaging.microsoft.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752871Ab3GYB3w (ORCPT ); Wed, 24 Jul 2013 21:29:52 -0400 Received: from mail216-co9-R.bigfish.com (10.236.132.237) by CO9EHSOBE036.bigfish.com (10.236.130.99) with Microsoft SMTP Server id 14.1.225.22; Thu, 25 Jul 2013 01:29:52 +0000 Received: from mail216-co9 (localhost [127.0.0.1]) by mail216-co9-R.bigfish.com (Postfix) with ESMTP id EA3FE1C0344; Thu, 25 Jul 2013 01:29:51 +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: 1 X-BigFish: VS1(zzzz1f42h208ch1ee6h1de0h1fdah2073h1202h1e76h1d1ah1d2ah1fc6hzd2iz1de098h1de097h8275bhz2dh2a8h668h839he5bhf0ah1288h12a5h12a9h12bdh12e5h137ah139eh13b6h1441h1504h1537h162dh1631h1758h1898h18e1h1946h19b5h1ad9h1b0ah1d0ch1d2eh1d3fh1dc1h1dfeh1dffh1e23h1155h) Received: from mail216-co9 (localhost.localdomain [127.0.0.1]) by mail216-co9 (MessageSwitch) id 1374715790147024_24730; Thu, 25 Jul 2013 01:29:50 +0000 (UTC) Received: from CO9EHSMHS008.bigfish.com (unknown [10.236.132.247]) by mail216-co9.bigfish.com (Postfix) with ESMTP id 1F22126004A; Thu, 25 Jul 2013 01:29:50 +0000 (UTC) Received: from mail.freescale.net (70.37.183.190) by CO9EHSMHS008.bigfish.com (10.236.130.18) with Microsoft SMTP Server (TLS) id 14.16.227.3; Thu, 25 Jul 2013 01:29:48 +0000 Received: from tx30smr01.am.freescale.net (10.81.153.31) by 039-SN1MMR1-004.039d.mgd.msft.net (10.84.1.14) with Microsoft SMTP Server (TLS) id 14.3.136.1; Thu, 25 Jul 2013 01:29:47 +0000 Received: from rock.am.freescale.net (rock.ap.freescale.net [10.193.20.106]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id r6P1Tg7k011637; Wed, 24 Jul 2013 18:29:44 -0700 From: Haijun Zhang To: , CC: , , , , Haijun Zhang , Haijun Zhang Subject: [PATCH 2/2 V2] mmc: esdhc: get voltage from dts file Date: Thu, 25 Jul 2013 08:38:11 +0800 Message-ID: <1374712691-12807-1-git-send-email-Haijun.Zhang@freescale.com> X-Mailer: git-send-email 1.8.0 MIME-Version: 1.0 X-OriginatorOrg: freescale.com X-FOPE-CONNECTOR: Id%0$Dn%*$RO%0$TLS%0$FQDN%$TlsDn% 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 Add voltage-range support in esdhc of T4, So we can choose to read voltages from dts file as one optional. If we can get a valid voltage-range from device node, we use this voltage as the final voltage support. Else we still read from capacity or from other provider. Signed-off-by: Haijun Zhang Signed-off-by: Anton Vorontsov --- changes for V2: - change dev_info to dev_err - share function in pltfm.c drivers/mmc/host/sdhci-of-esdhc.c | 1 + drivers/mmc/host/sdhci-pltfm.c | 32 ++++++++++++++++++++++++++++++++ drivers/mmc/host/sdhci-pltfm.h | 1 + drivers/mmc/host/sdhci.c | 3 +++ include/linux/mmc/sdhci.h | 1 + 5 files changed, 38 insertions(+) diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c index 15039e2..cdfb08b 100644 --- a/drivers/mmc/host/sdhci-of-esdhc.c +++ b/drivers/mmc/host/sdhci-of-esdhc.c @@ -304,6 +304,7 @@ static int sdhci_esdhc_probe(struct platform_device *pdev) return PTR_ERR(host); sdhci_get_of_property(pdev); + sdhci_get_voltage(pdev); np = pdev->dev.of_node; if (of_device_is_compatible(np, "fsl,p2020-esdhc")) { diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c index e2065a4..4682aba 100644 --- a/drivers/mmc/host/sdhci-pltfm.c +++ b/drivers/mmc/host/sdhci-pltfm.c @@ -109,10 +109,42 @@ void sdhci_get_of_property(struct platform_device *pdev) host->mmc->pm_caps |= MMC_PM_WAKE_SDIO_IRQ; } } + +void sdhci_get_voltage(struct platform_device *pdev) +{ + struct sdhci_host *host = platform_get_drvdata(pdev); + const u32 *voltage_ranges; + int num_ranges, i; + struct device_node *np; + + np = pdev->dev.of_node; + voltage_ranges = of_get_property(np, "voltage-ranges", &num_ranges); + num_ranges = num_ranges / sizeof(*voltage_ranges) / 2; + if (!voltage_ranges || !num_ranges) { + dev_info(&pdev->dev, "OF: voltage-ranges unspecified\n"); + return; + } + + for (i = 0; i < num_ranges; i++) { + const int j = i * 2; + u32 mask; + + mask = mmc_vddrange_to_ocrmask(be32_to_cpu(voltage_ranges[j]), + be32_to_cpu(voltage_ranges[j + 1])); + if (!mask) { + dev_err(&pdev->dev, + "OF: voltage-range #%d is invalid\n", i); + return; + } + host->ocr_mask |= mask; + } +} #else void sdhci_get_of_property(struct platform_device *pdev) {} +void sdhci_get_voltage(struct platform_device *pdev) {} #endif /* CONFIG_OF */ EXPORT_SYMBOL_GPL(sdhci_get_of_property); +EXPORT_SYMBOL_GPL(sdhci_get_voltage); struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev, const struct sdhci_pltfm_data *pdata, diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h index e15ced79..aba8253 100644 --- a/drivers/mmc/host/sdhci-pltfm.h +++ b/drivers/mmc/host/sdhci-pltfm.h @@ -92,6 +92,7 @@ static inline void sdhci_be32bs_writeb(struct sdhci_host *host, u8 val, int reg) #endif /* CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER */ extern void sdhci_get_of_property(struct platform_device *pdev); +extern void sdhci_get_voltage(struct platform_device *pdev); extern struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev, const struct sdhci_pltfm_data *pdata, diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index a78bd4f..57541e0 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -3119,6 +3119,9 @@ int sdhci_add_host(struct sdhci_host *host) SDHCI_MAX_CURRENT_MULTIPLIER; } + if (host->ocr_mask) + ocr_avail = host->ocr_mask; + mmc->ocr_avail = ocr_avail; mmc->ocr_avail_sdio = ocr_avail; if (host->ocr_avail_sdio) diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index e3c6a74..3e781b8 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h @@ -171,6 +171,7 @@ struct sdhci_host { unsigned int ocr_avail_sdio; /* OCR bit masks */ unsigned int ocr_avail_sd; unsigned int ocr_avail_mmc; + u32 ocr_mask; /* available voltages */ wait_queue_head_t buf_ready_int; /* Waitqueue for Buffer Read Ready interrupt */ unsigned int tuning_done; /* Condition flag set when CMD19 succeeds */