Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp961345pxk; Mon, 31 Aug 2020 06:18:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwoNUQXRBHetBCe1cJdUYCr/z6IgX6BD749fahCWsQ5Ro/d798WklIFSukhEgVxBAzmrzI2 X-Received: by 2002:aa7:d697:: with SMTP id d23mr1281025edr.13.1598879919177; Mon, 31 Aug 2020 06:18:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598879919; cv=none; d=google.com; s=arc-20160816; b=rkrz6ia6GrQ6qYGupOKM09CZaBwgOIuXErO3ldgamLT0y6HqUZUtWscuwkbUV+SEvS pqkTG7JsZARR0OubMuvsyswEdXEDgPfWKtMOFWFEAWbEn1odwurOPTCIIsOXc4FNxoYw wn6F0zZE0GWe1fZnuNaAS6EmU+aBB1THZSv9e6+t89dTJIvbh5jC/isPcksLGw6TqY3+ jNBy8aiBJpL6o7O396A/3+pJ/ftggZeqD6bndTANCvSJ1VViaIIh5/8zQMrzcOqdZHeW khpHruJ6vzpld6c38luS8TVOahyA2iByIl3L4SOslHI4yabHtjoUYRBzEDBitjzWt9tG IH/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=UQoI1GeQhVK5+wMgW0TP/WghvzBAWuVFG8q6FGoAyEw=; b=AnjJMjdJa0GQ3c9EvmyuhK03BUFxKE/euYJXKF06n810fSy9m4+D67aYr0IXELvTBN hVpma1eqGYohC0mqnRH8k5RbfmiNhaSh0CT0jteZvP7B5ukDmtM9bmQzd2/OyRAULDal NlXS2C5j2DvkXSy3Iz1RkJhjNJzZhiJ/sueTZcK+DeMU2+f2hDYP6oIMZn2ggmkFxLdD XGtosaxPbldkezLl7CQLrorXj84GGqeFh9GPkRXS4kDaC4CW306KNydkPhZMDdqoOOoE 4RtsuKcCWy6oxfuoxrR3nQ+fRDrBvLl/XlUmnF9vSrF2b44SqNiQDxEefNm+8e22qSwV JaLA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=mDVAQkQ4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b6si5630086eja.559.2020.08.31.06.18.15; Mon, 31 Aug 2020 06:18:39 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=mDVAQkQ4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726948AbgHaNQ6 (ORCPT + 99 others); Mon, 31 Aug 2020 09:16:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34416 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726359AbgHaNQp (ORCPT ); Mon, 31 Aug 2020 09:16:45 -0400 Received: from mail-lf1-x142.google.com (mail-lf1-x142.google.com [IPv6:2a00:1450:4864:20::142]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 23987C061575 for ; Mon, 31 Aug 2020 06:16:45 -0700 (PDT) Received: by mail-lf1-x142.google.com with SMTP id q8so3472466lfb.6 for ; Mon, 31 Aug 2020 06:16:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=UQoI1GeQhVK5+wMgW0TP/WghvzBAWuVFG8q6FGoAyEw=; b=mDVAQkQ4nwJalyxEi62enizY/JY4FUg76of5iT2j26oB8IYHKuIH0RQKSkJMimjeYj 0S5G5EZYatzFkdiTnmlS8MwYw0MPgHU41vlt6+++tl0KCq/GGznPC/W9y65RmVXYTRc4 VDICi+t+zpxh+MpHqK+4I7aEZCf7KqDyrTQ+6+7BKTcoMbTatXvzKZ3CiEA7TX+PsaAr hqaIH3zCSVXnfdWcPx7ZICi+56VMHe/BOromwtM+N268RTyEgRFZaQXWHIs5sxx8WWgd qP1cecE9ppABFVqGBmxsEW3AFkH96rRNsGH3nbtQTSRgtztLSZANcdoU34bj7OnSMIQf cKwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=UQoI1GeQhVK5+wMgW0TP/WghvzBAWuVFG8q6FGoAyEw=; b=rprCfRUl+JbttDK/iA6sd5wOW8sguTJXMZ63b9Up3kKQbgkfhU9klU65RPhtvR37P3 oL5Xlr7NwJLL2r1HHNHVhpycVANX/6XkYb6Y4kCdMkJ7umKVnkNyiiMvjI+S7eQzpjYq iUBW4QTnMH7F4ajAuoHFLeP9aevHCnwpxAQ0vsmlRbUJX7Hww68Op0k2QN3oyU6+baqD L4UjqjH1zwNk6QgU+hjiZrUfEIms205Kk/5p8F7eKwS/AbjaCh5p0V6QYetoucDcsRIA 2PSSifaYWyM588KJKy2mJ3OgtGh8j9THxhtwVrsNjlJ+HHhMt3+Ym+m+iDBb+mQAGlSK 0Q4A== X-Gm-Message-State: AOAM530vTQbvqXWuK7TyCrF4ws+UxUuvuSy05HI/854tGVJVS40+V6N1 txcF1/rsp79Nu9jIpjw+rnzlpA== X-Received: by 2002:ac2:4253:: with SMTP id m19mr696212lfl.81.1598879803345; Mon, 31 Aug 2020 06:16:43 -0700 (PDT) Received: from localhost.localdomain (h-98-128-180-79.NA.cust.bahnhof.se. [98.128.180.79]) by smtp.gmail.com with ESMTPSA id b16sm1570435ljk.24.2020.08.31.06.16.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2020 06:16:42 -0700 (PDT) From: Ulf Hansson To: linux-mmc@vger.kernel.org, Ulf Hansson , Rich Felker , Christoph Hellwig Cc: Mark Brown , linux-sh@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] mmc: mmc_spi: Don't use dma mappings unless CONFIG_HAS_DMA is set Date: Mon, 31 Aug 2020 15:16:36 +0200 Message-Id: <20200831131636.51502-1-ulf.hansson@linaro.org> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The commit cd57d07b1e4e ("sh: don't allow non-coherent DMA for NOMMU") made CONFIG_NO_DMA to be set for some platforms, for good reasons. Consequentially, CONFIG_HAS_DMA doesn't get set, which makes the DMA mapping interface to be built as stub functions. For weird reasons this causes the mmc_spi driver to fail to ->probe(), as it relies on the dma mappings APIs, no matter of CONFIG_HAS_DMA is set or not. This is wrong, so let's fix this. Fixes: cd57d07b1e4e ("sh: don't allow non-coherent DMA for NOMMU") Reported-by: Rich Felker Suggested-by: Christoph Hellwig Signed-off-by: Ulf Hansson --- drivers/mmc/host/mmc_spi.c | 86 +++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 34 deletions(-) diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c index 39bb1e30c2d7..5055a7eb134a 100644 --- a/drivers/mmc/host/mmc_spi.c +++ b/drivers/mmc/host/mmc_spi.c @@ -1278,6 +1278,52 @@ mmc_spi_detect_irq(int irq, void *mmc) return IRQ_HANDLED; } +#ifdef CONFIG_HAS_DMA +static int mmc_spi_dma_alloc(struct mmc_spi_host *host) +{ + struct spi_device *spi = host->spi; + struct device *dev; + + if (!spi->master->dev.parent->dma_mask) + return 0; + + dev = spi->master->dev.parent; + + host->ones_dma = dma_map_single(dev, host->ones, MMC_SPI_BLOCKSIZE, + DMA_TO_DEVICE); + if (dma_mapping_error(dev, host->ones_dma)) + return -ENOMEM; + + host->data_dma = dma_map_single(dev, host->data, sizeof(*host->data), + DMA_BIDIRECTIONAL); + if (dma_mapping_error(dev, host->data_dma)) { + dma_unmap_single(dev, host->ones_dma, MMC_SPI_BLOCKSIZE, + DMA_TO_DEVICE); + return -ENOMEM; + } + + dma_sync_single_for_cpu(dev, host->data_dma, sizeof(*host->data), + DMA_BIDIRECTIONAL); + + host->dma_dev = dev; + return 0; +} + +static void mmc_spi_dma_free(struct mmc_spi_host *host) +{ + if (!host->dma_dev) + return; + + dma_unmap_single(host->dma_dev, host->ones_dma, MMC_SPI_BLOCKSIZE, + DMA_TO_DEVICE); + dma_unmap_single(host->dma_dev, host->data_dma, sizeof(*host->data), + DMA_BIDIRECTIONAL); +} +#else +static inline mmc_spi_dma_alloc(struct mmc_spi_host *host) { return 0; } +static inline void mmc_spi_dma_free(struct mmc_spi_host *host) {} +#endif + static int mmc_spi_probe(struct spi_device *spi) { void *ones; @@ -1374,23 +1420,9 @@ static int mmc_spi_probe(struct spi_device *spi) if (!host->data) goto fail_nobuf1; - if (spi->master->dev.parent->dma_mask) { - struct device *dev = spi->master->dev.parent; - - host->dma_dev = dev; - host->ones_dma = dma_map_single(dev, ones, - MMC_SPI_BLOCKSIZE, DMA_TO_DEVICE); - if (dma_mapping_error(dev, host->ones_dma)) - goto fail_ones_dma; - host->data_dma = dma_map_single(dev, host->data, - sizeof(*host->data), DMA_BIDIRECTIONAL); - if (dma_mapping_error(dev, host->data_dma)) - goto fail_data_dma; - - dma_sync_single_for_cpu(host->dma_dev, - host->data_dma, sizeof(*host->data), - DMA_BIDIRECTIONAL); - } + status = mmc_spi_dma_alloc(host); + if (status) + goto fail_dma; /* setup message for status/busy readback */ spi_message_init(&host->readback); @@ -1458,20 +1490,12 @@ static int mmc_spi_probe(struct spi_device *spi) fail_add_host: mmc_remove_host(mmc); fail_glue_init: - if (host->dma_dev) - dma_unmap_single(host->dma_dev, host->data_dma, - sizeof(*host->data), DMA_BIDIRECTIONAL); -fail_data_dma: - if (host->dma_dev) - dma_unmap_single(host->dma_dev, host->ones_dma, - MMC_SPI_BLOCKSIZE, DMA_TO_DEVICE); -fail_ones_dma: + mmc_spi_dma_free(host); +fail_dma: kfree(host->data); - fail_nobuf1: mmc_free_host(mmc); mmc_spi_put_pdata(spi); - nomem: kfree(ones); return status; @@ -1489,13 +1513,7 @@ static int mmc_spi_remove(struct spi_device *spi) mmc_remove_host(mmc); - if (host->dma_dev) { - dma_unmap_single(host->dma_dev, host->ones_dma, - MMC_SPI_BLOCKSIZE, DMA_TO_DEVICE); - dma_unmap_single(host->dma_dev, host->data_dma, - sizeof(*host->data), DMA_BIDIRECTIONAL); - } - + mmc_spi_dma_free(host); kfree(host->data); kfree(host->ones); -- 2.25.1