From patchwork Mon Mar 31 15:18:07 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 27461 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-vc0-f197.google.com (mail-vc0-f197.google.com [209.85.220.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 57EB4202E0 for ; Mon, 31 Mar 2014 15:18:40 +0000 (UTC) Received: by mail-vc0-f197.google.com with SMTP id if11sf19743855vcb.8 for ; Mon, 31 Mar 2014 08:18:40 -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=OTVUuEGehEM0mmPbXL0uPMQy+oS/UcUb3Pctzx2zuak=; b=M6XEOiSNvs6hXdMY3GPDrpqAJsgj34Kjb1PYH3qn+GP5LxDnVXtRDhHoAUipJLojJD 2PmrV1w3m769urXkQU3N3KJRvAl+Q3vOvE8pGSwpHqHFhgPO8H35xJ3hecHshEC2ixBo ADt2PpLsm5g9vgwEYPfzi2CGABXLsVogHcngL0v0VK54EaooL3PxG+Du9+2TvvCXY2Jd PGv/XlgE0peZNJhDZN31vNHAjOoRph0Jw+skyD9DfVd4/jRqLDfk42GXRZo1z8PN5phV YIxT96+UOJ5dQUjto66TeJ6xOQ+H7CsOyHABo0wJsrDcHQeWbJG9PJrnN4e/F0HT8imb 9HLQ== X-Gm-Message-State: ALoCoQm7NPyYKDHQAhB0S7jj3dowfYSPLbwqQ1VZuWw43EqgfaUmv9C/e0pzNXQ+dQYoYX0qsgaI X-Received: by 10.236.43.14 with SMTP id k14mr8028500yhb.37.1396279120122; Mon, 31 Mar 2014 08:18:40 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.43.134 with SMTP id e6ls2450296qga.17.gmail; Mon, 31 Mar 2014 08:18:40 -0700 (PDT) X-Received: by 10.221.55.133 with SMTP id vy5mr7903729vcb.17.1396279119973; Mon, 31 Mar 2014 08:18:39 -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 10si964767vcu.78.2014.03.31.08.18.39 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 31 Mar 2014 08:18:39 -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 oz11so8295745veb.34 for ; Mon, 31 Mar 2014 08:18:39 -0700 (PDT) X-Received: by 10.220.167.2 with SMTP id o2mr23778597vcy.8.1396279119866; Mon, 31 Mar 2014 08:18:39 -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.12.8 with SMTP id v8csp150774vcv; Mon, 31 Mar 2014 08:18:38 -0700 (PDT) X-Received: by 10.181.9.65 with SMTP id dq1mr13086767wid.51.1396279118033; Mon, 31 Mar 2014 08:18:38 -0700 (PDT) Received: from mail-we0-f178.google.com (mail-we0-f178.google.com [74.125.82.178]) by mx.google.com with ESMTPS id u3si3435610wjz.239.2014.03.31.08.18.37 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 31 Mar 2014 08:18:38 -0700 (PDT) Received-SPF: neutral (google.com: 74.125.82.178 is neither permitted nor denied by best guess record for domain of ulf.hansson@linaro.org) client-ip=74.125.82.178; Received: by mail-we0-f178.google.com with SMTP id u56so4996843wes.9 for ; Mon, 31 Mar 2014 08:18:37 -0700 (PDT) X-Received: by 10.194.185.148 with SMTP id fc20mr15261203wjc.27.1396279117544; Mon, 31 Mar 2014 08:18:37 -0700 (PDT) Received: from localhost.localdomain ([85.235.11.236]) by mx.google.com with ESMTPSA id wl6sm13547488wjb.3.2014.03.31.08.18.36 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 31 Mar 2014 08:18:36 -0700 (PDT) From: Ulf Hansson To: linux-arm-kernel@lists.infradead.org, Russell King , Linus Walleij Cc: devicetree@vger.kernel.org, Rob Herring , Ulf Hansson Subject: [PATCH V2 06/19] mmc: mmci: Use the common mmc DT parser Date: Mon, 31 Mar 2014 17:18:07 +0200 Message-Id: <1396279100-2920-7-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1396279100-2920-1-git-send-email-ulf.hansson@linaro.org> References: <1396279100-2920-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 3663bc15..892921d 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c @@ -1386,12 +1386,9 @@ 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) { - int bus_width = 0; - if (of_get_property(np, "st,sig-dir-dat0", NULL)) pdata->sigdir |= MCI_ST_DATA0DIREN; if (of_get_property(np, "st,sig-dir-dat2", NULL)) @@ -1404,46 +1401,22 @@ static void mmci_dt_populate_generic_pdata(struct device_node *np, pdata->sigdir |= MCI_ST_CMDDIREN; if (of_get_property(np, "st,sig-pin-fbclk", NULL)) pdata->sigdir |= MCI_ST_FBCLKEN; +} - 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; +static int mmci_of_parse(struct device_node *np, struct mmc_host *mmc) +{ + int ret = mmc_of_parse(mmc); - 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); + 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) @@ -1478,6 +1451,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; @@ -1531,14 +1508,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); @@ -1551,11 +1529,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; @@ -1567,7 +1548,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 @@ -1604,20 +1585,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;