Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp810194ybl; Tue, 13 Aug 2019 03:02:06 -0700 (PDT) X-Google-Smtp-Source: APXvYqwiRZBX8I/0Tlumtmn5WAYW5AH8lvrXyladHm1GWFEGzuaGg4y0DmGWrn5uLtX72bBTpnIO X-Received: by 2002:a17:90b:8d8:: with SMTP id ds24mr1403503pjb.135.1565690525904; Tue, 13 Aug 2019 03:02:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565690525; cv=none; d=google.com; s=arc-20160816; b=0CiIC2hN0Nx/F8g9v1m+VolQvMnN1rZ6Y9RsS9elg8Yd0e8T50KX3paHIvqLy0fOpt bGaz/Ql/s371KrhiJe+GSspMpyt67QPrY42TCXBKKPuzm7TUpAQ1RTr1PrsyrdDtRMbM SnyjbD4B7lcEL+c1mrUaFfDqvadRxTsAoEgHljxFD4lnxjB6WXXG/scSn/npV3bFn1T6 X/teIapHXKo9D7dH3AJqS2QX2bLwuPX28N26JCYs9mPEG60+uXEkdhYY40aVL+jV7/MO 6UiCiv3fidx5UFPti2ZVIW3/GDgP4jZ+AcU5NrXS9wZT/j2FT+Be/cgEJgVZH5y0nuEg DSwg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=Ew0jpCMbOhB8LJL0i2smq1Jsu/IjtJ4+t0EckSDmj7s=; b=z3i0WfDZyFaKb0K5DlbY3uB4Yf3jXiZh/nseVFnieO2+4e3TTvxAMK8xRpHBct6ZM8 Vc+0SvrCukyTOKOiZRyobQ/WdIW3dVbRXDn86bBgMq3HLJ20gIzKC2c/Y/I57Humu7ib YfKb8ciMGVc1DZc7PPlN9M3ttkYa4HpqKm2RyshYRkHQYV0nA4a1fiWZyEK0ncxVqWWr MzXc6A+oqXy9ygmJugpp6a44s1N+ywlpwiLX6PahjAWD5dNKcLvvtWBDz2+JyBh2vgjs RH+Fvp1DfVP2tA+ly+tm2PyOtRfnf7xGC/CDjmQXbE5ooxfHwYSz/6hbxfnpaL9GZfL1 7WDA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@st.com header.s=STMicroelectronics header.b="vb/ucef+"; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t26si9293258pfh.275.2019.08.13.03.01.48; Tue, 13 Aug 2019 03:02:05 -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=@st.com header.s=STMicroelectronics header.b="vb/ucef+"; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728722AbfHMKAe (ORCPT + 99 others); Tue, 13 Aug 2019 06:00:34 -0400 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:51578 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728434AbfHMKAc (ORCPT ); Tue, 13 Aug 2019 06:00:32 -0400 Received: from pps.filterd (m0046661.ppops.net [127.0.0.1]) by mx08-00178001.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x7D9uvqx019950; Tue, 13 Aug 2019 12:00:21 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=STMicroelectronics; bh=Ew0jpCMbOhB8LJL0i2smq1Jsu/IjtJ4+t0EckSDmj7s=; b=vb/ucef+X+hg73LkawoYQfoCed3ejnD4d/mbq55LGlU4sWrxvvDUJIstPrhovBdrbS9I SrNkhWIIaM/LRJMD4WGd7LC4TacuSPc/8MBsF4VvSKy4Dh4OBTvHGMeZVqoiSR/TBJF6 FSXXFFJ04FRNIQKEGtywQYRtwrTs/hHyrY99Q+A6sbt/HsnTxuFDN7QDHo+hoPoTzQXb k3GJFr2VHTJ3zgfnvlPSIEVt/YzjOT4VMoCmEm7hcerchypN349F/8Vw1uBBH0qMCy3V wK3FR6twZS3la5n1cEpn3eeg4W+8G1ePoU4XhPmW8YNecF6xEs9eFRy/OlJKE57ciLy3 1w== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx08-00178001.pphosted.com with ESMTP id 2u9mtky9vp-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Tue, 13 Aug 2019 12:00:21 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 1041234; Tue, 13 Aug 2019 10:00:20 +0000 (GMT) Received: from Webmail-eu.st.com (Safex1hubcas22.st.com [10.75.90.92]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id EC7F32CC9D3; Tue, 13 Aug 2019 12:00:19 +0200 (CEST) Received: from SAFEX1HUBCAS23.st.com (10.75.90.47) by Safex1hubcas22.st.com (10.75.90.92) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 13 Aug 2019 12:00:19 +0200 Received: from lmecxl0923.lme.st.com (10.48.0.237) by webmail-ga.st.com (10.75.90.48) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 13 Aug 2019 12:00:18 +0200 From: Ludovic Barre To: Ulf Hansson , Rob Herring CC: , Maxime Coquelin , Alexandre Torgue , , , , , , Ludovic Barre Subject: [PATCH V5 3/3] mmc: mmci: sdmmc: add busy_complete callback Date: Tue, 13 Aug 2019 11:59:51 +0200 Message-ID: <20190813095951.26275-4-ludovic.Barre@st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190813095951.26275-1-ludovic.Barre@st.com> References: <20190813095951.26275-1-ludovic.Barre@st.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.48.0.237] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2019-08-13_04:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ludovic Barre This patch adds a specific busy_complete callback for sdmmc variant. sdmmc has 2 status flags: -busyd0: This is a hardware status flag (inverted value of d0 line). it does not generate an interrupt. -busyd0end: This indicates only end of busy following a CMD response. On busy to Not busy changes, an interrupt is generated (if unmask) and BUSYD0END status flag is set. Status flag is cleared by writing corresponding interrupt clear bit in MMCICLEAR. The legacy busy completion monitors step by step the busy progression start/in-progress/end. On sdmmc variant, the monitoring of busy steps is difficult and not adapted (the software can miss a step and locks the monitoring), the sdmmc has just need to wait the busyd0end bit without monitoring all the changes. Signed-off-by: Ludovic Barre --- drivers/mmc/host/mmci.c | 3 +++ drivers/mmc/host/mmci.h | 1 + drivers/mmc/host/mmci_stm32_sdmmc.c | 38 +++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 9eac3f482119..9bec82d2dbf7 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c @@ -260,6 +260,9 @@ static struct variant_data variant_stm32_sdmmc = { .datalength_bits = 25, .datactrl_blocksz = 14, .stm32_idmabsize_mask = GENMASK(12, 5), + .busy_timeout = true, + .busy_detect_flag = MCI_STM32_BUSYD0, + .busy_detect_mask = MCI_STM32_BUSYD0ENDMASK, .init = sdmmc_variant_init, }; diff --git a/drivers/mmc/host/mmci.h b/drivers/mmc/host/mmci.h index 733f9a035b06..841c5281beb5 100644 --- a/drivers/mmc/host/mmci.h +++ b/drivers/mmc/host/mmci.h @@ -164,6 +164,7 @@ #define MCI_ST_CARDBUSY (1 << 24) /* Extended status bits for the STM32 variants */ #define MCI_STM32_BUSYD0 BIT(20) +#define MCI_STM32_BUSYD0END BIT(21) #define MMCICLEAR 0x038 #define MCI_CMDCRCFAILCLR (1 << 0) diff --git a/drivers/mmc/host/mmci_stm32_sdmmc.c b/drivers/mmc/host/mmci_stm32_sdmmc.c index 8e83ae6920ae..bb5499cc9e81 100644 --- a/drivers/mmc/host/mmci_stm32_sdmmc.c +++ b/drivers/mmc/host/mmci_stm32_sdmmc.c @@ -282,6 +282,43 @@ static u32 sdmmc_get_dctrl_cfg(struct mmci_host *host) return datactrl; } +bool sdmmc_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) +{ + void __iomem *base = host->base; + u32 busy_d0, busy_d0end, mask; + + mask = readl_relaxed(base + MMCIMASK0); + busy_d0end = readl_relaxed(base + MMCISTATUS) & MCI_STM32_BUSYD0END; + busy_d0 = readl_relaxed(base + MMCISTATUS) & MCI_STM32_BUSYD0; + + /* complete if there is an error or busy_d0end */ + if ((status & err_msk) || busy_d0end) + goto complete; + + /* + * On response the busy signaling is reflected in the BUSYD0 flag. + * if busy_d0 is in-progress we must activate busyd0end interrupt + * to wait this completion. Else this request has no busy step. + */ + if (busy_d0) { + if (!host->busy_status) { + writel_relaxed(mask | host->variant->busy_detect_mask, + base + MMCIMASK0); + host->busy_status = status & + (MCI_CMDSENT | MCI_CMDRESPEND); + } + return false; + } + +complete: + writel_relaxed(mask & ~host->variant->busy_detect_mask, + base + MMCIMASK0); + writel_relaxed(host->variant->busy_detect_mask, base + MMCICLEAR); + host->busy_status = 0; + + return true; +} + static struct mmci_host_ops sdmmc_variant_ops = { .validate_data = sdmmc_idma_validate_data, .prep_data = sdmmc_idma_prep_data, @@ -292,6 +329,7 @@ static struct mmci_host_ops sdmmc_variant_ops = { .dma_finalize = sdmmc_idma_finalize, .set_clkreg = mmci_sdmmc_set_clkreg, .set_pwrreg = mmci_sdmmc_set_pwrreg, + .busy_complete = sdmmc_busy_complete, }; void sdmmc_variant_init(struct mmci_host *host) -- 2.17.1