From patchwork Thu Apr 10 12:20:49 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 28170 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-oa0-f72.google.com (mail-oa0-f72.google.com [209.85.219.72]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id DB55020671 for ; Thu, 10 Apr 2014 12:21:24 +0000 (UTC) Received: by mail-oa0-f72.google.com with SMTP id eb12sf17649983oac.7 for ; Thu, 10 Apr 2014 05:21:24 -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=pR0L6yd3B9GX/vaoRfTUjr1LuBQZ91Frk4ZjoOQwe4k=; b=L19zaY5G7d0JyabfRcwWx1xEsK2kauAz4bolPZROYvsfhYjU+ScAV0bN1r3QUKnRsv Dj3i2LU8BMG0VZ1gqXN6GhdxAz4ysq85aevrOGdEXOJWhppud5p8RDo9wVbxU7Womtx0 WjvW5GBqz0yFu/nq50eZlIC3eJxy3fuW7EhU7JfHdNmexqMo/c4yyECTK/HTjKkdyqMX A7K3tsI3BzeQbqN13uCF1hbQ1TJS8AJ7bsIM+nmOHTpdCWzKDQduGdOc2LoN7+U9j/Ep rCt2roA+2/ZUTPeuUjve13mR2cxOLqULeGaxnHdtvDP5GHZcGZaYX+7ai5h9q0TPiLlk fvLw== X-Gm-Message-State: ALoCoQm28IQSQbR31Co+RGiNLU350Q5i/Vy2f8W3G5i02K5A+NiuVyVg6fbIDe4o++hKTmoRJzz2 X-Received: by 10.183.11.101 with SMTP id eh5mr8121334obd.41.1397132484318; Thu, 10 Apr 2014 05:21:24 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.20.138 with SMTP id 10ls1095831qgj.92.gmail; Thu, 10 Apr 2014 05:21:24 -0700 (PDT) X-Received: by 10.221.34.7 with SMTP id sq7mr14282313vcb.5.1397132484219; Thu, 10 Apr 2014 05:21:24 -0700 (PDT) Received: from mail-vc0-f175.google.com (mail-vc0-f175.google.com [209.85.220.175]) by mx.google.com with ESMTPS id z4si658798vcp.132.2014.04.10.05.21.24 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 10 Apr 2014 05:21:24 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.220.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.220.175; Received: by mail-vc0-f175.google.com with SMTP id lh14so3327155vcb.34 for ; Thu, 10 Apr 2014 05:21:24 -0700 (PDT) X-Received: by 10.58.38.166 with SMTP id h6mr1362057vek.22.1397132484131; Thu, 10 Apr 2014 05:21:24 -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.221.72 with SMTP id ib8csp54560vcb; Thu, 10 Apr 2014 05:21:23 -0700 (PDT) X-Received: by 10.180.106.134 with SMTP id gu6mr42057635wib.61.1397132483538; Thu, 10 Apr 2014 05:21:23 -0700 (PDT) Received: from mail-wi0-f181.google.com (mail-wi0-f181.google.com [209.85.212.181]) by mx.google.com with ESMTPS id xb3si1487353wjc.34.2014.04.10.05.21.23 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 10 Apr 2014 05:21:23 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.212.181 is neither permitted nor denied by best guess record for domain of ulf.hansson@linaro.org) client-ip=209.85.212.181; Received: by mail-wi0-f181.google.com with SMTP id hm4so4868548wib.2 for ; Thu, 10 Apr 2014 05:21:23 -0700 (PDT) X-Received: by 10.180.80.3 with SMTP id n3mr21214442wix.36.1397132483001; Thu, 10 Apr 2014 05:21:23 -0700 (PDT) Received: from localhost.localdomain ([85.235.11.236]) by mx.google.com with ESMTPSA id ej7sm16437292wib.9.2014.04.10.05.21.21 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 10 Apr 2014 05:21:22 -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 V3 06/19] mmc: mmci: Use the common mmc DT parser Date: Thu, 10 Apr 2014 14:20:49 +0200 Message-Id: <1397132462-8005-7-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1397132462-8005-1-git-send-email-ulf.hansson@linaro.org> References: <1397132462-8005-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.220.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 173e7de..d21136c 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) @@ -1474,6 +1447,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; @@ -1526,14 +1503,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); @@ -1546,11 +1524,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; @@ -1562,7 +1543,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 @@ -1599,20 +1580,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;