Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp3673540imm; Mon, 1 Oct 2018 02:33:38 -0700 (PDT) X-Google-Smtp-Source: ACcGV61qrCBVOK7LdSCEGRpPvPQ3/QO2p6F6Fpi3FsazugIOEnkeksSh6BTVrCr4LAQqPn5hFBDo X-Received: by 2002:a63:2d43:: with SMTP id t64-v6mr9569037pgt.128.1538386417944; Mon, 01 Oct 2018 02:33:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538386417; cv=none; d=google.com; s=arc-20160816; b=TvKOFHRCVQyeuP6C1wu7wsUDcjODMMSnzzstUb50zrl6PJ46p8znnKunhmjZ1gF2qK DRloz8K7YuG82t5YgWquRmN7eRae8Vg+XIP83Ff+AZjIRHjBNbsioIZRs9i1mFg37FpL xXM+aodB1ZwcBi3VYTXbVE5zRUmQ7FEmdiSitj8f8QnkQt1U/me2jPMj28kKwsZNmyMS saF11YjEZ2Ta1/AhoR8PZ9zSRhRcGpxWMffUflHrXfVVcDOoIf8ViWTjUs3YNegcLpAR gYVruV+nAavuI/ujVQQ/9aCiAwhZKp6rqsGsjUPLW2oq39JcEKZ+vMOIsKulEcabKKrm jbCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature; bh=a6B9eFCfwy+91HljvxI9fNHxjHis4C1w5UsXMZigrWY=; b=QG/qgxjMxrNuLOl9bDRt4wTbzd83NHetX0rYjuGiCAqc6pnGKaUiN1W5RgijZQe4CR OmcSkAzLuhVZC9H5jbE1gpB73YGs3TQ0jFFPvTJTNxRnArL3PUQaRCpOzp0K59INyqJ0 qk7o+WO4wpG+RhPf3hide1BujepL7myBvtKij1lSwsfFkpqIrhI3f/cele1MaRN12TZq 0IJCEo8W+OwSfuKO6ujgPN9GerabWTXf6KxdIgVJXmRIxmiYWamBV6RJVyqxo91pSbxv 9trbt1V4wZLNZ7fs6Ll/46t9vjmanTYi3WmIEVTx3SJRNlANbVTM9QSUh6qNAdVLuAbn bLHA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="NwXAxC/u"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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. [209.132.180.67]) by mx.google.com with ESMTP id d31-v6si12724861pla.256.2018.10.01.02.33.23; Mon, 01 Oct 2018 02:33:37 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="NwXAxC/u"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 S1729263AbeJAQJS (ORCPT + 99 others); Mon, 1 Oct 2018 12:09:18 -0400 Received: from mail-io1-f67.google.com ([209.85.166.67]:39051 "EHLO mail-io1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728978AbeJAQJS (ORCPT ); Mon, 1 Oct 2018 12:09:18 -0400 Received: by mail-io1-f67.google.com with SMTP id z16-v6so3181957iol.6 for ; Mon, 01 Oct 2018 02:32:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=a6B9eFCfwy+91HljvxI9fNHxjHis4C1w5UsXMZigrWY=; b=NwXAxC/uhrSdw0zh4A9EbCRfvwv+IyncbgWbcwBzsf7UbWCdVSiM3HN3V89fmbIRna TKpRaPsQq0o1wipbBbwVCTW1fc7/C/3i+mRlDMndI5K6ugeFOCN9xCb4yd5UX3JjURr/ vhctq1hun5JqNQPogdr6AeoQpM5viKxoW9yqA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=a6B9eFCfwy+91HljvxI9fNHxjHis4C1w5UsXMZigrWY=; b=dKGUhiussYQqy5aRfeoSJCb2Kt73LN3oEBuiknfQCslAnTHLEc9m/9aHdWM/lO3Fgf IO4IxPMkolQGpWOi9+OUU3/kcOuAb0Vzk3uqiXi4sS2CercKHeeOl6khODRiA6GafaUt WrrUMSlZMqybadVxuqIYSLcutkT+Q9ln2bEl/IiWNC+TTrlJ24DA9uP9aCxY01U4Kr4M xp4/nqdYz5wNKo75uw9k6ya6s6VoInEk/R1tjAU50sMah4rRWqZA4D7C+LQ7ZHkS2lBv u9YkSU9jwQcf8caLxb7wW7ec1cJNw/eNiS4oY4D9hNTf4xogZaW0eXmPLl4pb7smQQiF JUBg== X-Gm-Message-State: ABuFfoib0HFAIkQBypiSSesi29DH6GUk/Nhivut2QKnCYkIUKCMyg2ZF p+isns7V3GthS6hxHDkI/0Dri8ntmJOBuNqpAnFkHw== X-Received: by 2002:a6b:144b:: with SMTP id 72-v6mr6264255iou.218.1538386345077; Mon, 01 Oct 2018 02:32:25 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a02:3941:0:0:0:0:0 with HTTP; Mon, 1 Oct 2018 02:31:44 -0700 (PDT) In-Reply-To: <1537523181-14578-28-git-send-email-ludovic.Barre@st.com> References: <1537523181-14578-1-git-send-email-ludovic.Barre@st.com> <1537523181-14578-28-git-send-email-ludovic.Barre@st.com> From: Ulf Hansson Date: Mon, 1 Oct 2018 11:31:44 +0200 Message-ID: Subject: Re: [PATCH V2 27/27] mmc: mmci: add stm32 sdmmc variant To: Ludovic Barre Cc: Rob Herring , Maxime Coquelin , Alexandre Torgue , Benjamin Gaignard , Gerald Baeza , Loic Pallardy , Linux ARM , Linux Kernel Mailing List , DTML , "linux-mmc@vger.kernel.org" , linux-stm32@st-md-mailman.stormreply.com Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 21 September 2018 at 11:46, Ludovic Barre wrote: > From: Ludovic Barre > > This patch adds a stm32 sdmmc variant, rev 1.1. > Introduces a new Manufacturer id "0x53, ascii 'S' to define > new stm32 sdmmc family with clean range of amba > revision/configurations bits (corresponding to sdmmc_ver > register with major/minor fields). > > Signed-off-by: Ludovic Barre > --- > drivers/mmc/host/Kconfig | 10 ++ > drivers/mmc/host/Makefile | 1 + > drivers/mmc/host/mmci.c | 25 ++++ > drivers/mmc/host/mmci.h | 5 + > drivers/mmc/host/mmci_stm32_sdmmc.c | 282 ++++++++++++++++++++++++++++++++++++ > 5 files changed, 323 insertions(+) > create mode 100644 drivers/mmc/host/mmci_stm32_sdmmc.c > > diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig > index 5ab2eb0..e59671a 100644 > --- a/drivers/mmc/host/Kconfig > +++ b/drivers/mmc/host/Kconfig > @@ -34,6 +34,16 @@ config MMC_QCOM_DML > > if unsure, say N. > > +config MMC_STM32_SDMMC > + bool "STMicroelectronics STM32 SDMMC Controller" > + depends on MMC_ARMMMCI > + default y > + help > + This selects the STMicroelectronics STM32 SDMMC host controller. > + If you have a STM32 sdmmc host with internal dma say Y or M here. > + > + If unsure, say N. > + > config MMC_PXA > tristate "Intel PXA25x/26x/27x Multimedia Card Interface support" > depends on ARCH_PXA > diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile > index ce8398e..f14410f 100644 > --- a/drivers/mmc/host/Makefile > +++ b/drivers/mmc/host/Makefile > @@ -6,6 +6,7 @@ > obj-$(CONFIG_MMC_ARMMMCI) += armmmci.o > armmmci-y := mmci.o > armmmci-$(CONFIG_MMC_QCOM_DML) += mmci_qcom_dml.o > +armmmci-$(CONFIG_MMC_STM32_SDMMC) += mmci_stm32_sdmmc.o > obj-$(CONFIG_MMC_PXA) += pxamci.o > obj-$(CONFIG_MMC_MXC) += mxcmmc.o > obj-$(CONFIG_MMC_MXS) += mxs-mmc.o > diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c > index 4057456..ca2e483 100644 > --- a/drivers/mmc/host/mmci.c > +++ b/drivers/mmc/host/mmci.c > @@ -254,6 +254,26 @@ static struct variant_data variant_stm32 = { > .init = mmci_variant_init, > }; > > +static struct variant_data variant_stm32_sdmmc = { > + .fifosize = 16 * 4, > + .fifohalfsize = 8 * 4, > + .f_max = 208000000, > + .stm32_clkdiv = true, > + .reset = true, > + .cmdreg_cpsm_enable = MCI_CPSM_STM32_ENABLE, > + .cmdreg_lrsp_crc = MCI_CPSM_STM32_LRSP_CRC, > + .cmdreg_srsp_crc = MCI_CPSM_STM32_SRSP_CRC, > + .cmdreg_srsp = MCI_CPSM_STM32_SRSP, > + .data_cmd_enable = MCI_CPSM_STM32_CMDTRANS, > + .irq_pio_mask = MCI_IRQ_PIO_STM32_MASK, > + .datactrl_first = true, > + .datacnt_useless = true, > + .datalength_bits = 25, > + .datactrl_blocksz = 14, > + .stm32_idmabsize_mask = GENMASK(12, 5), > + .init = sdmmc_variant_init, > +}; > + > static struct variant_data variant_qcom = { > .fifosize = 16 * 4, > .fifohalfsize = 8 * 4, > @@ -2180,6 +2200,11 @@ static const struct amba_id mmci_ids[] = { > .mask = 0x00ffffff, > .data = &variant_stm32, > }, > + { > + .id = 0x10153180, > + .mask = 0xf0ffffff, > + .data = &variant_stm32_sdmmc, > + }, > /* Qualcomm variants */ > { > .id = 0x00051180, > diff --git a/drivers/mmc/host/mmci.h b/drivers/mmc/host/mmci.h > index 017d9b8..581b9b1 100644 > --- a/drivers/mmc/host/mmci.h > +++ b/drivers/mmc/host/mmci.h > @@ -305,6 +305,8 @@ struct mmci_host; > * register. > * @opendrain: bitmask identifying the OPENDRAIN bit inside MMCIPOWER register > * @reset: true if variant has need reset signal. > + * @dma_lli: true if variant has dma link list feature. > + * @stm32_idmabsize_mask: stm32 sdmmc idma buffer size. > */ > struct variant_data { > unsigned int clkreg; > @@ -348,6 +350,8 @@ struct variant_data { > unsigned int irq_pio_mask; > u32 start_err; > u32 opendrain; > + bool dma_lli; > + u32 stm32_idmabsize_mask; What are these? > void (*init)(struct mmci_host *host); > }; > > @@ -421,6 +425,7 @@ void mmci_write_clkreg(struct mmci_host *host, u32 clk); > void mmci_write_pwrreg(struct mmci_host *host, u32 pwr); > > void mmci_variant_init(struct mmci_host *host); > +void sdmmc_variant_init(struct mmci_host *host); > > int mmci_dmae_prep_data(struct mmci_host *host, struct mmc_data *data, > bool next); > diff --git a/drivers/mmc/host/mmci_stm32_sdmmc.c b/drivers/mmc/host/mmci_stm32_sdmmc.c > new file mode 100644 > index 0000000..cfbfc6f > --- /dev/null > +++ b/drivers/mmc/host/mmci_stm32_sdmmc.c > @@ -0,0 +1,282 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) STMicroelectronics 2018 - All Rights Reserved > + * Author: Ludovic.barre@st.com for STMicroelectronics. > + */ > +#include > +#include > +#include > +#include > +#include > +#include > +#include "mmci.h" > + > +#define SDMMC_LLI_BUF_LEN PAGE_SIZE > +#define SDMMC_IDMA_BURST BIT(MMCI_STM32_IDMABNDT_SHIFT) > + > +struct sdmmc_lli_desc { > + u32 idmalar; > + u32 idmabase; > + u32 idmasize; > +}; > + > +struct sdmmc_priv { > + dma_addr_t sg_dma; > + void *sg_cpu; > +}; > + > +int sdmmc_idma_validate_data(struct mmci_host *host, > + struct mmc_data *data) > +{ > + struct scatterlist *sg; > + int i; > + > + /* > + * idma has constraints on idmabase & idmasize for each element > + * excepted the last element which has no constraint on idmasize > + */ > + for_each_sg(data->sg, sg, data->sg_len - 1, i) { > + if (!IS_ALIGNED(sg_dma_address(data->sg), sizeof(u32)) || > + !IS_ALIGNED(sg_dma_len(data->sg), SDMMC_IDMA_BURST)) { > + dev_err(mmc_dev(host->mmc), > + "unaligned scatterlist: ofst:%x length:%d\n", > + data->sg->offset, data->sg->length); > + return -EINVAL; > + } > + } > + > + if (!IS_ALIGNED(sg_dma_address(data->sg), sizeof(u32))) { > + dev_err(mmc_dev(host->mmc), > + "unaligned last scatterlist: ofst:%x length:%d\n", > + data->sg->offset, data->sg->length); > + return -EINVAL; > + } > + > + return 0; > +} > + > +static int _sdmmc_idma_prep_data(struct mmci_host *host, > + struct mmc_data *data) > +{ > + int n_elem; > + > + n_elem = dma_map_sg(mmc_dev(host->mmc), > + data->sg, > + data->sg_len, > + mmc_get_dma_dir(data)); > + > + if (!n_elem) { > + dev_err(mmc_dev(host->mmc), "dma_map_sg failed\n"); > + return -EINVAL; > + } > + > + return 0; > +} > + > +static int sdmmc_idma_prep_data(struct mmci_host *host, > + struct mmc_data *data, bool next) > +{ > + /* Check if job is already prepared. */ > + if (!next && data->host_cookie == host->next_cookie) > + return 0; > + > + return _sdmmc_idma_prep_data(host, data); > +} > + > +static void sdmmc_idma_unprep_data(struct mmci_host *host, > + struct mmc_data *data, int err) > +{ > + dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, > + mmc_get_dma_dir(data)); > +} The sdmmc_idma_prep_data() and sdmmc_idma_unprep_data(), seems very similar to what the mmci core driver needs to do in this regards. Can we perhaps avoid adding these callbacks altogether, but rather rely on common code in the mmci core driver? [...] Kind regards Uffe