From patchwork Fri Mar 21 12:14:03 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 26811 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ob0-f198.google.com (mail-ob0-f198.google.com [209.85.214.198]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 80C2F203AB for ; Fri, 21 Mar 2014 12:14:54 +0000 (UTC) Received: by mail-ob0-f198.google.com with SMTP id wn1sf8549686obc.5 for ; Fri, 21 Mar 2014 05:14:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :list-post:list-help:list-archive:list-unsubscribe; bh=pU6iCOpSf7jBeDGWU8L9g8G/Ogz8RLULRy7EmhdA7V8=; b=HUe3X4t1o1244jnN9U5OEoUKqtomcn8Mi85Lr+MkGALld/5J6NsiL3vrlxXb3+bGwX T4nGsFyvd1InD606VPezsAkF/PPp8j44umcY1ODL1NyywGTSPuNlHkogpy6y8F0RuuxL nq75hsbSSesbqmk0CXNL9LkSnr32MnnwHHlCcoi26Ym80lA3zpGrSLnwv3RcJGIvXsnS K+jmlJLy8+Sxtj05cTDyQ5sNmnqlQitLR0QLEcQsZj7R1VVvpNYw0tEgdKK3/IP0cFQq W8+XQTLkqVOQTIABLgLcHuK9unOG90upPZ5rLDHygrvT2A0cugCoYWU6CYnhRjqX9k9F M5tA== X-Gm-Message-State: ALoCoQnSTSm8zleHPVTdLUT4moqx892W+s5mUWfretxq3MSLKIsXqPsdy5KwqRLbVpVV3BNpEQ6Z X-Received: by 10.42.230.79 with SMTP id jl15mr16849207icb.7.1395404094037; Fri, 21 Mar 2014 05:14:54 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.103.77 with SMTP id x71ls174872qge.31.gmail; Fri, 21 Mar 2014 05:14:53 -0700 (PDT) X-Received: by 10.58.229.4 with SMTP id sm4mr37885789vec.10.1395404093954; Fri, 21 Mar 2014 05:14:53 -0700 (PDT) Received: from mail-ve0-f175.google.com (mail-ve0-f175.google.com [209.85.128.175]) by mx.google.com with ESMTPS id wg4si1070640vcb.146.2014.03.21.05.14.53 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 21 Mar 2014 05:14:53 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.128.175 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.128.175; Received: by mail-ve0-f175.google.com with SMTP id oz11so2418468veb.20 for ; Fri, 21 Mar 2014 05:14:53 -0700 (PDT) X-Received: by 10.58.201.5 with SMTP id jw5mr35861450vec.6.1395404093835; Fri, 21 Mar 2014 05:14:53 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patches@linaro.org Received: by 10.220.78.9 with SMTP id i9csp25972vck; Fri, 21 Mar 2014 05:14:52 -0700 (PDT) X-Received: by 10.152.120.195 with SMTP id le3mr34093247lab.6.1395404091927; Fri, 21 Mar 2014 05:14:51 -0700 (PDT) Received: from mail-lb0-f170.google.com (mail-lb0-f170.google.com [209.85.217.170]) by mx.google.com with ESMTPS id r10si3905304laj.66.2014.03.21.05.14.51 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 21 Mar 2014 05:14:51 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.217.170 is neither permitted nor denied by best guess record for domain of ulf.hansson@linaro.org) client-ip=209.85.217.170; Received: by mail-lb0-f170.google.com with SMTP id s7so1616158lbd.29 for ; Fri, 21 Mar 2014 05:14:51 -0700 (PDT) X-Received: by 10.112.118.20 with SMTP id ki20mr1229890lbb.45.1395404091369; Fri, 21 Mar 2014 05:14:51 -0700 (PDT) Received: from linaro-ulf.lan (90-231-160-185-no158.tbcn.telia.com. [90.231.160.185]) by mx.google.com with ESMTPSA id tq9sm3255263lbb.10.2014.03.21.05.14.49 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 21 Mar 2014 05:14:50 -0700 (PDT) From: Ulf Hansson To: linux-arm-kernel@lists.infradead.org, Russell King , Linus Walleij Cc: devicetree@vger.kernel.org, Ulf Hansson Subject: [PATCH 06/20] mmc: mmci: Use the common mmc DT parser Date: Fri, 21 Mar 2014 13:14:03 +0100 Message-Id: <1395404057-27835-7-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1395404057-27835-1-git-send-email-ulf.hansson@linaro.org> References: <1395404057-27835-1-git-send-email-ulf.hansson@linaro.org> X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: ulf.hansson@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.128.175 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Precedence: list Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org List-ID: X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Let mmci DT parser only handle the specific bindings related to mmci and extend the DT support by converting to the common mmc DT parser. While both DT and platform data exist, DT takes precedence. If there are supplied DT data, the card detect and write protect GPIOS are enforced to be provided through it. Signed-off-by: Ulf Hansson --- drivers/mmc/host/mmci.c | 92 +++++++++++++++++------------------------------ 1 file changed, 33 insertions(+), 59 deletions(-) diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 76e41ba..2e1d1b2 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c @@ -1386,58 +1386,31 @@ static struct mmc_host_ops mmci_ops = { .start_signal_voltage_switch = mmci_sig_volt_switch, }; -#ifdef CONFIG_OF static void mmci_dt_populate_generic_pdata(struct device_node *np, struct mmci_platform_data *pdata) { u32 sigdir = 0; - int bus_width = 0; if (!of_property_read_u32(np, "signal-direction", &sigdir)) { sigdir &= MCI_ST_DATA2DIREN|MCI_ST_CMDDIREN|MCI_ST_DATA0DIREN| MCI_ST_DATA31DIREN|MCI_ST_FBCLKEN|MCI_ST_DATA74DIREN; pdata->sigdir = sigdir; } +} - pdata->gpio_wp = of_get_named_gpio(np, "wp-gpios", 0); - pdata->gpio_cd = of_get_named_gpio(np, "cd-gpios", 0); - - if (of_get_property(np, "cd-inverted", NULL)) - pdata->cd_invert = true; - else - pdata->cd_invert = false; - - of_property_read_u32(np, "max-frequency", &pdata->f_max); - if (!pdata->f_max) - pr_warn("%s has no 'max-frequency' property\n", np->full_name); +static int mmci_of_parse(struct device_node *np, struct mmc_host *mmc) +{ + int ret = mmc_of_parse(mmc); + if (ret) + return ret; if (of_get_property(np, "mmc-cap-mmc-highspeed", NULL)) - pdata->capabilities |= MMC_CAP_MMC_HIGHSPEED; + mmc->caps |= MMC_CAP_MMC_HIGHSPEED; if (of_get_property(np, "mmc-cap-sd-highspeed", NULL)) - pdata->capabilities |= MMC_CAP_SD_HIGHSPEED; + mmc->caps |= MMC_CAP_SD_HIGHSPEED; - of_property_read_u32(np, "bus-width", &bus_width); - switch (bus_width) { - case 0 : - /* No bus-width supplied. */ - break; - case 4 : - pdata->capabilities |= MMC_CAP_4_BIT_DATA; - break; - case 8 : - pdata->capabilities |= MMC_CAP_8_BIT_DATA; - break; - default : - pr_warn("%s: Unsupported bus width\n", np->full_name); - } -} -#else -static void mmci_dt_populate_generic_pdata(struct device_node *np, - struct mmci_platform_data *pdata) -{ - return; + return 0; } -#endif static int mmci_probe(struct amba_device *dev, const struct amba_id *id) @@ -1472,6 +1445,10 @@ static int mmci_probe(struct amba_device *dev, if (!mmc) return -ENOMEM; + ret = mmci_of_parse(np, mmc); + if (ret) + goto host_free; + host = mmc_priv(mmc); host->mmc = mmc; @@ -1525,14 +1502,15 @@ static int mmci_probe(struct amba_device *dev, else mmc->f_min = DIV_ROUND_UP(host->mclk, 512); /* - * If the platform data supplies a maximum operating - * frequency, this takes precedence. Else, we fall back - * to using the module parameter, which has a (low) - * default value in case it is not specified. Either - * value must not exceed the clock rate into the block, - * of course. + * If no maximum operating frequency is supplied, fall back to use + * the module parameter, which has a (low) default value in case it + * is not specified. Either value must not exceed the clock rate into + * the block, of course. Also note that DT takes precedence over + * platform data. */ - if (plat->f_max) + if (mmc->f_max) + mmc->f_max = min(host->mclk, mmc->f_max); + else if (plat->f_max) mmc->f_max = min(host->mclk, plat->f_max); else mmc->f_max = min(host->mclk, fmax); @@ -1545,11 +1523,14 @@ static int mmci_probe(struct amba_device *dev, else if (plat->ocr_mask) dev_warn(mmc_dev(mmc), "Platform OCR mask is ignored\n"); - mmc->caps = plat->capabilities; - mmc->caps2 = plat->capabilities2; - if (!plat->cd_invert) - mmc->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH; - mmc->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH; + /* DT takes precedence over platform data. */ + mmc->caps = np ? mmc->caps : plat->capabilities; + mmc->caps2 = np ? mmc->caps2 : plat->capabilities2; + if (!np) { + if (!plat->cd_invert) + mmc->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH; + mmc->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH; + } if (variant->busy_detect) { mmci_ops.card_busy = mmci_card_busy; @@ -1561,7 +1542,7 @@ static int mmci_probe(struct amba_device *dev, mmc->ops = &mmci_ops; /* We support these PM capabilities. */ - mmc->pm_caps = MMC_PM_KEEP_POWER; + mmc->pm_caps |= MMC_PM_KEEP_POWER; /* * We can do SGIO @@ -1598,20 +1579,13 @@ static int mmci_probe(struct amba_device *dev, writel(0, host->base + MMCIMASK1); writel(0xfff, host->base + MMCICLEAR); - if (plat->gpio_cd == -EPROBE_DEFER) { - ret = -EPROBE_DEFER; - goto clk_disable; - } - if (gpio_is_valid(plat->gpio_cd)) { + /* If DT, cd/wp gpios must be supplied through it. */ + if (!np && gpio_is_valid(plat->gpio_cd)) { ret = mmc_gpio_request_cd(mmc, plat->gpio_cd, 0); if (ret) goto clk_disable; } - if (plat->gpio_wp == -EPROBE_DEFER) { - ret = -EPROBE_DEFER; - goto clk_disable; - } - if (gpio_is_valid(plat->gpio_wp)) { + if (!np && gpio_is_valid(plat->gpio_wp)) { ret = mmc_gpio_request_ro(mmc, plat->gpio_wp); if (ret) goto clk_disable;