From patchwork Tue Feb 18 18:47:47 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kaustabh Chakraborty X-Patchwork-Id: 13980592 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3855DC021AA for ; Tue, 18 Feb 2025 19:01:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=2RlBH3Qp6HPjNbjhCNObXkvE9dt830vcRgHg1hGq3pk=; b=wjlXOvZRkU8+Nsfrufucb8Jf8a PTcD3EfAY4GZtdpVLNePqiYlZCCy0TTZFDMZpEVWpxQM6f+ozZ1q9Q5iDBfo9VlUMygwpBTneDNoU ud8CeS6X4kvUE/Mu5t+oGDpPeqMEE75omhRUPr8jb72ZPpjKR2S+w/315vgJUVPX1WELfeCyp4QeV 7tP2/3t/aGKr85RWeiiPm5bHBg3t2bMnIVjNOe7DP+xv9uSe1ZQFkXgKRbIFBCGw4qrbfjCJFBiz4 0EcjqV3hLGXMTgqBU1kARNbziNc+LkDyDwAMqaZrNVP5qT2hpaNXOGgMaItec9wstBSMrXtwm0xN7 ZKrb7lTw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkSq6-00000009Tj3-0HNN; Tue, 18 Feb 2025 19:01:02 +0000 Received: from layka.disroot.org ([178.21.23.139]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkSe7-00000009QQt-1LEd for linux-arm-kernel@lists.infradead.org; Tue, 18 Feb 2025 18:48:40 +0000 Received: from mail01.disroot.lan (localhost [127.0.0.1]) by disroot.org (Postfix) with ESMTP id B904525FA1; Tue, 18 Feb 2025 19:48:37 +0100 (CET) X-Virus-Scanned: SPAM Filter at disroot.org Received: from layka.disroot.org ([127.0.0.1]) by localhost (disroot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id eNog1CxFu2AY; Tue, 18 Feb 2025 19:48:37 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=disroot.org; s=mail; t=1739904517; bh=Wftp7MvsLHIwZb3fOvJ0W49HFyWbpQRWeey9OqYXAME=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=OfYLH2/6RVtJyn5DA4KOqwNwpkm4900+aC1aXIhRfVmz5bdi1Qg5fac8G8oIRrvgV hDImMkouqWxyWqPNLUwKCkJB+3JKiccxAku1GkT1unH6/TmwR3Ijo0WO7ZIut0ClPQ WGkZlw/RtZsK+eVbEvPKPY6I3SIkkdlidyRij3/l02++B2KlaTCr3ONdSeqyWY0/WF 1EehaOdrHLE9SGjnul/pfF8rnflbinJrPukRkoQVrWww51NGNiRM/SB9kELI3drSB2 IlmEHeGCLyE5UfGkE6P9/ezr7OsAy2x/nJC7xZrNBscQBpdjKM4vSfhNHKHBiHANFO SjxQDnDjb7fZw== From: Kaustabh Chakraborty Date: Wed, 19 Feb 2025 00:17:47 +0530 Subject: [PATCH v2 1/3] dt-bindings: mmc: samsung,exynos-dw-mshc: add exynos7870 support MIME-Version: 1.0 Message-Id: <20250219-exynos7870-mmc-v2-1-b4255a3e39ed@disroot.org> References: <20250219-exynos7870-mmc-v2-0-b4255a3e39ed@disroot.org> In-Reply-To: <20250219-exynos7870-mmc-v2-0-b4255a3e39ed@disroot.org> To: Ulf Hansson , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alim Akhtar , Jaehoon Chung Cc: Krzysztof Kozlowski , linux-mmc@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Kaustabh Chakraborty , Krzysztof Kozlowski X-Developer-Signature: v=1; a=ed25519-sha256; t=1739904507; l=1075; i=kauschluss@disroot.org; s=20250202; h=from:subject:message-id; bh=Wftp7MvsLHIwZb3fOvJ0W49HFyWbpQRWeey9OqYXAME=; b=9tuGtTjedvLmLgkheSktSM8qsQuCnfnX2opXXbt1t35cYbJZPqOH3FWv+RHB665dj07x7NA2v 1oJIaOeZuJtDzpu2PGXZ1NXySiSP7Vksn/GQodZFORqV7MErTJJQofH X-Developer-Key: i=kauschluss@disroot.org; a=ed25519; pk=h2xeR+V2I1+GrfDPAhZa3M+NWA0Cnbdkkq1bH3ct1hE= X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250218_104839_493354_63C35F14 X-CRM114-Status: UNSURE ( 8.85 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Document the compatibles for Exynos7870's DW MMC driver, for both non-SMU and SMU variants. Signed-off-by: Kaustabh Chakraborty Reviewed-by: Krzysztof Kozlowski --- Documentation/devicetree/bindings/mmc/samsung,exynos-dw-mshc.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/mmc/samsung,exynos-dw-mshc.yaml b/Documentation/devicetree/bindings/mmc/samsung,exynos-dw-mshc.yaml index ef2d1d7c92fc8ad7456379bde498badf7b3201c8..e8bd49d46794ee19e994860564a1612bc9d6e642 100644 --- a/Documentation/devicetree/bindings/mmc/samsung,exynos-dw-mshc.yaml +++ b/Documentation/devicetree/bindings/mmc/samsung,exynos-dw-mshc.yaml @@ -24,6 +24,8 @@ properties: - samsung,exynos5420-dw-mshc-smu - samsung,exynos7-dw-mshc - samsung,exynos7-dw-mshc-smu + - samsung,exynos7870-dw-mshc + - samsung,exynos7870-dw-mshc-smu - items: - enum: - samsung,exynos5433-dw-mshc-smu From patchwork Tue Feb 18 18:47:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kaustabh Chakraborty X-Patchwork-Id: 13980593 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id BF389C021AA for ; Tue, 18 Feb 2025 19:02:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=Rb0g9Ak+GVN0cAePLNRTEVDTO+HC/9t88wAy3SSnZI4=; b=XzF369SWrU0bIkxQRodcI0m2GX wnHJHyTJFePi2QyIseBje39NK8BdkZZ5Go4PuRMuurDhs+psoPj58tgP5AZ7+f0BdQa9OKD+Z4XNC 111+L8ZYJou33M6LLYaVJUWbubLSh5Djt9Os7qr7CGKOzBpvsF3rkaMvr3HvST/0JQMTJhjP8Xdg5 qPFux92bu4wPDvCbHdVHC1LBWdU8b1Nd7LVNbE7B58rEccfPOeXCSPllkPeMaDTe6AwYFyxBm+zed z0JMiGPlAtyJDKtQXztWj7FTucbTrlOaONASxZ4EdQLNOiPzShegZZqA1tKat8rL0XbcKW7+MBQJi l1KyUKRg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkSrX-00000009U3l-3CuU; Tue, 18 Feb 2025 19:02:31 +0000 Received: from layka.disroot.org ([178.21.23.139]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkSeG-00000009QT4-0T3h for linux-arm-kernel@lists.infradead.org; Tue, 18 Feb 2025 18:48:49 +0000 Received: from mail01.disroot.lan (localhost [127.0.0.1]) by disroot.org (Postfix) with ESMTP id D8F3D25E18; Tue, 18 Feb 2025 19:48:46 +0100 (CET) X-Virus-Scanned: SPAM Filter at disroot.org Received: from layka.disroot.org ([127.0.0.1]) by localhost (disroot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id xhzeHVZjEg3j; Tue, 18 Feb 2025 19:48:42 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=disroot.org; s=mail; t=1739904522; bh=BzQwL6YQQNTYsgvAYKFO1zeGbFnGDhA1HDzmJYmBXvs=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=ee96fI/Phlp524d00l8jBYvxsOxZ6w6uoQadF4AZgWOjw3GnpBGEjU5NqvLxjv6b1 i6GXQtDwgKqzzNrrHW0QpAJLv6iD1JtmCcAI3po/E70COogmRJrAG+NAqls/pyCOH9 isCZ9pTOyFGxdrsXvA3YjoF0nSPpVW8aO9QrmsLk+RFHjDfPer6Npqhb522w6AuWGO hdWpHDTVqo5jjvTY0AlyToWNbiI324vORQLWf3xx37e3kep/56UAhHlyBuPWVYDRBs LMOndg/++8gFTfQaGzyrfNNkTbRgTul2u8JB7n+16eArLiEXq7unc24AjvNtHb3zIx y/i3U/+QXB2Og== From: Kaustabh Chakraborty Date: Wed, 19 Feb 2025 00:17:48 +0530 Subject: [PATCH v2 2/3] mmc: dw_mmc: add a quirk for accessing 64-bit FIFOs in two halves MIME-Version: 1.0 Message-Id: <20250219-exynos7870-mmc-v2-2-b4255a3e39ed@disroot.org> References: <20250219-exynos7870-mmc-v2-0-b4255a3e39ed@disroot.org> In-Reply-To: <20250219-exynos7870-mmc-v2-0-b4255a3e39ed@disroot.org> To: Ulf Hansson , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alim Akhtar , Jaehoon Chung Cc: Krzysztof Kozlowski , linux-mmc@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Kaustabh Chakraborty X-Developer-Signature: v=1; a=ed25519-sha256; t=1739904507; l=5212; i=kauschluss@disroot.org; s=20250202; h=from:subject:message-id; bh=BzQwL6YQQNTYsgvAYKFO1zeGbFnGDhA1HDzmJYmBXvs=; b=wZPInEMV2Q1x7ZaITUQdT0Rjy+RAgj17gTaoiCzL5BRH+R6DIIx/eoYdtMTVcL3nXsze+s/I0 cRc5wCmXXhxD9vQqxFaiTBRUG4u5hCujHhLoZehNGeconPns5iyXtd2 X-Developer-Key: i=kauschluss@disroot.org; a=ed25519; pk=h2xeR+V2I1+GrfDPAhZa3M+NWA0Cnbdkkq1bH3ct1hE= X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250218_104848_416297_CD8D7D1E X-CRM114-Status: GOOD ( 20.97 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org In certain DW MMC implementations (such as in some Exynos7870 controllers), 64-bit read/write is not allowed from a 64-bit FIFO. Add a quirk which facilitates accessing the 64-bit FIFO registers in two 32-bit halves. Signed-off-by: Kaustabh Chakraborty --- drivers/mmc/host/dw_mmc.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++- drivers/mmc/host/dw_mmc.h | 27 ++++++++++++++ 2 files changed, 119 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 3cbda98d08d28722d16ba2e855342249ac878ad3..74f224647bf1ed3c5ca83b573594f8c6843dd1e4 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -2579,6 +2579,91 @@ static void dw_mci_pull_data64(struct dw_mci *host, void *buf, int cnt) } } +static void dw_mci_push_data64_32(struct dw_mci *host, void *buf, int cnt) +{ + struct mmc_data *data = host->data; + int init_cnt = cnt; + + /* try and push anything in the part_buf */ + if (unlikely(host->part_buf_count)) { + int len = dw_mci_push_part_bytes(host, buf, cnt); + + buf += len; + cnt -= len; + + if (host->part_buf_count == 8) { + mci_fifo_l_writeq(host->fifo_reg, host->part_buf); + host->part_buf_count = 0; + } + } +#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS + if (unlikely((unsigned long)buf & 0x7)) { + while (cnt >= 8) { + u64 aligned_buf[16]; + int len = min(cnt & -8, (int)sizeof(aligned_buf)); + int items = len >> 3; + int i; + /* memcpy from input buffer into aligned buffer */ + memcpy(aligned_buf, buf, len); + buf += len; + cnt -= len; + /* push data from aligned buffer into fifo */ + for (i = 0; i < items; ++i) + mci_fifo_l_writeq(host->fifo_reg, aligned_buf[i]); + } + } else +#endif + { + u64 *pdata = buf; + + for (; cnt >= 8; cnt -= 8) + mci_fifo_l_writeq(host->fifo_reg, *pdata++); + buf = pdata; + } + /* put anything remaining in the part_buf */ + if (cnt) { + dw_mci_set_part_bytes(host, buf, cnt); + /* Push data if we have reached the expected data length */ + if ((data->bytes_xfered + init_cnt) == + (data->blksz * data->blocks)) + mci_fifo_l_writeq(host->fifo_reg, host->part_buf); + } +} + +static void dw_mci_pull_data64_32(struct dw_mci *host, void *buf, int cnt) +{ +#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS + if (unlikely((unsigned long)buf & 0x7)) { + while (cnt >= 8) { + /* pull data from fifo into aligned buffer */ + u64 aligned_buf[16]; + int len = min(cnt & -8, (int)sizeof(aligned_buf)); + int items = len >> 3; + int i; + + for (i = 0; i < items; ++i) + aligned_buf[i] = mci_fifo_l_readq(host->fifo_reg); + + /* memcpy from aligned buffer into output buffer */ + memcpy(buf, aligned_buf, len); + buf += len; + cnt -= len; + } + } else +#endif + { + u64 *pdata = buf; + + for (; cnt >= 8; cnt -= 8) + *pdata++ = mci_fifo_l_readq(host->fifo_reg); + buf = pdata; + } + if (cnt) { + host->part_buf = mci_fifo_l_readq(host->fifo_reg); + dw_mci_pull_final_bytes(host, buf, cnt); + } +} + static void dw_mci_pull_data(struct dw_mci *host, void *buf, int cnt) { int len; @@ -3379,8 +3464,13 @@ int dw_mci_probe(struct dw_mci *host) width = 16; host->data_shift = 1; } else if (i == 2) { - host->push_data = dw_mci_push_data64; - host->pull_data = dw_mci_pull_data64; + if ((host->quirks & DW_MMC_QUIRK_FIFO64_32)) { + host->push_data = dw_mci_push_data64_32; + host->pull_data = dw_mci_pull_data64_32; + } else { + host->push_data = dw_mci_push_data64; + host->pull_data = dw_mci_pull_data64; + } width = 64; host->data_shift = 3; } else { diff --git a/drivers/mmc/host/dw_mmc.h b/drivers/mmc/host/dw_mmc.h index 6447b916990dcd9ce91fca46e38985054d7e9612..5463392dc8110541c4fed74d600ab88dbd0faf7d 100644 --- a/drivers/mmc/host/dw_mmc.h +++ b/drivers/mmc/host/dw_mmc.h @@ -281,6 +281,8 @@ struct dw_mci_board { /* Support for longer data read timeout */ #define DW_MMC_QUIRK_EXTENDED_TMOUT BIT(0) +/* Force 32-bit access to the FIFO */ +#define DW_MMC_QUIRK_FIFO64_32 BIT(1) #define DW_MMC_240A 0x240a #define DW_MMC_280A 0x280a @@ -472,6 +474,31 @@ struct dw_mci_board { #define mci_fifo_writel(__value, __reg) __raw_writel(__reg, __value) #define mci_fifo_writeq(__value, __reg) __raw_writeq(__reg, __value) +/* + * Some dw_mmc devices have 64-bit FIFOs, but expect them to be + * accessed using two 32-bit accesses. If such controller is used + * with a 64-bit kernel, this has to be done explicitly. + */ +static inline u64 mci_fifo_l_readq(void __iomem *addr) +{ + u64 ans; + u32 proxy[2]; + + proxy[0] = mci_fifo_readl(addr); + proxy[1] = mci_fifo_readl(addr + 4); + memcpy(&ans, proxy, 8); + return ans; +} + +static inline void mci_fifo_l_writeq(void __iomem *addr, u64 value) +{ + u32 proxy[2]; + + memcpy(proxy, &value, 8); + mci_fifo_writel(addr, proxy[0]); + mci_fifo_writel(addr + 4, proxy[1]); +} + /* Register access macros */ #define mci_readl(dev, reg) \ readl_relaxed((dev)->regs + SDMMC_##reg) From patchwork Tue Feb 18 18:48:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kaustabh Chakraborty X-Patchwork-Id: 13980582 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5222CC021AD for ; Tue, 18 Feb 2025 18:59:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=57L6XvENOvnqDaZS5O6btau3+crg8XqEgsqhAVyHDRU=; b=3ENH4IEGqwhywVCNojxjlxhpIv zlmLnbzWTi6jxNptMPd1qN32qLFmgBl7LkjyVt1vcUSoFlQOiB5n3SJieGmTTw8Zf6lR6QxNtu8ny BC83YMfolScUgtGNBMLETMb9Oa0UY7d2QktL2XA7ljAwrkchZCUBNnuO3P49WHfXiClVSXrcuelLD Jd+TdHvN0lx92SUkVDFtSSUUmWEU6q55Q+xKq+NVTFjetz+3LnkdjUdvgGK+gJYPtyxjR1AJQiA3H CqvuM+6GD4Nppj6Rp0ID7DEZkBww9JZtIuyHktJI6fHpjXABfI87Z4y6QsNgakttaWMhca6DkYitv zsMViC0Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkSoe-00000009TK0-0odl; Tue, 18 Feb 2025 18:59:32 +0000 Received: from layka.disroot.org ([178.21.23.139]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkSf0-00000009Qd7-2RNs for linux-arm-kernel@lists.infradead.org; Tue, 18 Feb 2025 18:49:35 +0000 Received: from mail01.disroot.lan (localhost [127.0.0.1]) by disroot.org (Postfix) with ESMTP id 51D97234ED; Tue, 18 Feb 2025 19:49:33 +0100 (CET) X-Virus-Scanned: SPAM Filter at disroot.org Received: from layka.disroot.org ([127.0.0.1]) by localhost (disroot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id LCYEcoZQnwQW; Tue, 18 Feb 2025 19:49:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=disroot.org; s=mail; t=1739904572; bh=CzffE0iAb+LNe57ihRfjLLgBYfwAr+KOT5fivJbV43k=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=kJfywxO7Nfg6qC2sl2J22Avrkfzj6ARm9M4Cb1/uJBdY4D6l9yOxz1ZABTsGj0U2V hXuM8cK7ZpepMaM09odm09QcxZB0jibyNZXMHXlSWxaZIYobFiuuE2awv3NgOvLqjz ZJPZMp38uGisl+YDhTFTd5hOutBII4Uq7lub9kyPOaH3s5MGIeis1aJiNPqTcts3nf evYXZn4ZpWBbfLnSleBTjmg4WlVph6zMV8i17ToNVVhOY77YsEtxXmPv1RW09zEQCM SOqLm6oqponRPwUNNqGDYekSCcDxZl4hDgvlRg+7VcCPtt96SIhFkOGOk7uK1CdfMd c7JCBYypdr8dA== From: Kaustabh Chakraborty Date: Wed, 19 Feb 2025 00:18:59 +0530 Subject: [PATCH v2 3/3] pinctrl: samsung: add support for exynos7870 pinctrl MIME-Version: 1.0 Message-Id: <20250219-exynos7870-pinctrl-v2-3-1ff9b10bf913@disroot.org> References: <20250219-exynos7870-pinctrl-v2-0-1ff9b10bf913@disroot.org> In-Reply-To: <20250219-exynos7870-pinctrl-v2-0-1ff9b10bf913@disroot.org> To: Krzysztof Kozlowski , Sylwester Nawrocki , Alim Akhtar , Linus Walleij , Rob Herring , Conor Dooley , Tomasz Figa Cc: linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Kaustabh Chakraborty X-Developer-Signature: v=1; a=ed25519-sha256; t=1739904552; l=10044; i=kauschluss@disroot.org; s=20250202; h=from:subject:message-id; bh=CzffE0iAb+LNe57ihRfjLLgBYfwAr+KOT5fivJbV43k=; b=tnxGx1qP7tyxNGaIIqYr9Uys+DalH5eDzNQSx8vKsRHziFs7j9Iw7sxZfnolXqBACDjMx2FVO 0bfC4kiSJpEClCWMrrb8/U0fdCVKjpq5MbvhwXDrWNNjAXf6MYBUb/W X-Developer-Key: i=kauschluss@disroot.org; a=ed25519; pk=h2xeR+V2I1+GrfDPAhZa3M+NWA0Cnbdkkq1bH3ct1hE= X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250218_104934_899088_7913D7F0 X-CRM114-Status: GOOD ( 14.40 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Add support for the Exynos7870 SoC pin-controller in the pinctrl driver. It has 8 GPIO banks, and 3-bit PINCFG_TYPE_DRV width. Signed-off-by: Kaustabh Chakraborty --- drivers/pinctrl/samsung/pinctrl-exynos-arm64.c | 141 +++++++++++++++++++++++++ drivers/pinctrl/samsung/pinctrl-exynos.h | 29 +++++ drivers/pinctrl/samsung/pinctrl-samsung.c | 2 + drivers/pinctrl/samsung/pinctrl-samsung.h | 1 + 4 files changed, 173 insertions(+) diff --git a/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c b/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c index 3ea7106ce5eae3c21f11790b5a40037042c1d407..90343cbd8e6a252acedb921662cd2284547a21a7 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c @@ -40,6 +40,17 @@ static const struct samsung_pin_bank_type exynos5433_bank_type_alive = { .reg_offset = { 0x00, 0x04, 0x08, 0x0c, }, }; +/* Exynos7870 has the 3bit widths for PINCFG_TYPE_DRV bitfields. */ +static const struct samsung_pin_bank_type exynos7870_bank_type_off = { + .fld_width = { 4, 1, 2, 3, 2, 2, }, + .reg_offset = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, }, +}; + +static const struct samsung_pin_bank_type exynos7870_bank_type_alive = { + .fld_width = { 4, 1, 2, 3, }, + .reg_offset = { 0x00, 0x04, 0x08, 0x0c, }, +}; + /* * Bank type for non-alive type. Bit fields: * CON: 4, DAT: 1, PUD: 4, DRV: 4, CONPDN: 2, PUDPDN: 4 @@ -450,6 +461,136 @@ const struct samsung_pinctrl_of_match_data exynos7_of_data __initconst = { .num_ctrl = ARRAY_SIZE(exynos7_pin_ctrl), }; +/* pin banks of exynos7870 pin-controller 0 (ALIVE) */ +static const struct samsung_pin_bank_data exynos7870_pin_banks0[] __initconst = { + EXYNOS7870_PIN_BANK_EINTN(6, 0x000, "etc0"), + EXYNOS7870_PIN_BANK_EINTN(3, 0x020, "etc1"), + EXYNOS7870_PIN_BANK_EINTW(8, 0x040, "gpa0", 0x00), + EXYNOS7870_PIN_BANK_EINTW(8, 0x060, "gpa1", 0x04), + EXYNOS7870_PIN_BANK_EINTW(8, 0x080, "gpa2", 0x08), + EXYNOS7870_PIN_BANK_EINTN(2, 0x0c0, "gpq0"), +}; + +/* pin banks of exynos7870 pin-controller 1 (DISPAUD) */ +static const struct samsung_pin_bank_data exynos7870_pin_banks1[] __initconst = { + EXYNOS7870_PIN_BANK_EINTG(4, 0x000, "gpz0", 0x00), + EXYNOS7870_PIN_BANK_EINTG(6, 0x020, "gpz1", 0x04), + EXYNOS7870_PIN_BANK_EINTG(4, 0x040, "gpz2", 0x08), +}; + +/* pin banks of exynos7870 pin-controller 2 (ESE) */ +static const struct samsung_pin_bank_data exynos7870_pin_banks2[] __initconst = { + EXYNOS7870_PIN_BANK_EINTG(5, 0x000, "gpc7", 0x00), +}; + +/* pin banks of exynos7870 pin-controller 3 (FSYS) */ +static const struct samsung_pin_bank_data exynos7870_pin_banks3[] __initconst = { + EXYNOS7870_PIN_BANK_EINTG(3, 0x000, "gpr0", 0x00), + EXYNOS7870_PIN_BANK_EINTG(8, 0x020, "gpr1", 0x04), + EXYNOS7870_PIN_BANK_EINTG(2, 0x040, "gpr2", 0x08), + EXYNOS7870_PIN_BANK_EINTG(4, 0x060, "gpr3", 0x0c), + EXYNOS7870_PIN_BANK_EINTG(6, 0x080, "gpr4", 0x10), +}; + +/* pin banks of exynos7870 pin-controller 4 (MIF) */ +static const struct samsung_pin_bank_data exynos7870_pin_banks4[] __initconst = { + EXYNOS7870_PIN_BANK_EINTG(2, 0x000, "gpm0", 0x00), +}; + +/* pin banks of exynos7870 pin-controller 5 (NFC) */ +static const struct samsung_pin_bank_data exynos7870_pin_banks5[] __initconst = { + EXYNOS7870_PIN_BANK_EINTG(4, 0x000, "gpc2", 0x00), +}; + +/* pin banks of exynos7870 pin-controller 6 (TOP) */ +static const struct samsung_pin_bank_data exynos7870_pin_banks6[] __initconst = { + EXYNOS7870_PIN_BANK_EINTG(4, 0x000, "gpb0", 0x00), + EXYNOS7870_PIN_BANK_EINTG(3, 0x020, "gpc0", 0x04), + EXYNOS7870_PIN_BANK_EINTG(4, 0x040, "gpc1", 0x08), + EXYNOS7870_PIN_BANK_EINTG(4, 0x060, "gpc4", 0x0c), + EXYNOS7870_PIN_BANK_EINTG(2, 0x080, "gpc5", 0x10), + EXYNOS7870_PIN_BANK_EINTG(4, 0x0a0, "gpc6", 0x14), + EXYNOS7870_PIN_BANK_EINTG(2, 0x0c0, "gpc8", 0x18), + EXYNOS7870_PIN_BANK_EINTG(2, 0x0e0, "gpc9", 0x1c), + EXYNOS7870_PIN_BANK_EINTG(7, 0x100, "gpd1", 0x20), + EXYNOS7870_PIN_BANK_EINTG(6, 0x120, "gpd2", 0x24), + EXYNOS7870_PIN_BANK_EINTG(8, 0x140, "gpd3", 0x28), + EXYNOS7870_PIN_BANK_EINTG(7, 0x160, "gpd4", 0x2c), + EXYNOS7870_PIN_BANK_EINTG(3, 0x1a0, "gpe0", 0x34), + EXYNOS7870_PIN_BANK_EINTG(4, 0x1c0, "gpf0", 0x38), + EXYNOS7870_PIN_BANK_EINTG(2, 0x1e0, "gpf1", 0x3c), + EXYNOS7870_PIN_BANK_EINTG(2, 0x200, "gpf2", 0x40), + EXYNOS7870_PIN_BANK_EINTG(4, 0x220, "gpf3", 0x44), + EXYNOS7870_PIN_BANK_EINTG(5, 0x240, "gpf4", 0x48), +}; + +/* pin banks of exynos7870 pin-controller 7 (TOUCH) */ +static const struct samsung_pin_bank_data exynos7870_pin_banks7[] __initconst = { + EXYNOS7870_PIN_BANK_EINTG(3, 0x000, "gpc3", 0x00), +}; + +static const struct samsung_pin_ctrl exynos7870_pin_ctrl[] __initconst = { + { + /* pin-controller instance 0 Alive data */ + .pin_banks = exynos7870_pin_banks0, + .nr_banks = ARRAY_SIZE(exynos7870_pin_banks0), + .eint_wkup_init = exynos_eint_wkup_init, + .suspend = exynos_pinctrl_suspend, + .resume = exynos_pinctrl_resume, + }, { + /* pin-controller instance 1 DISPAUD data */ + .pin_banks = exynos7870_pin_banks1, + .nr_banks = ARRAY_SIZE(exynos7870_pin_banks1), + }, { + /* pin-controller instance 2 ESE data */ + .pin_banks = exynos7870_pin_banks2, + .nr_banks = ARRAY_SIZE(exynos7870_pin_banks2), + .eint_gpio_init = exynos_eint_gpio_init, + .suspend = exynos_pinctrl_suspend, + .resume = exynos_pinctrl_resume, + }, { + /* pin-controller instance 3 FSYS data */ + .pin_banks = exynos7870_pin_banks3, + .nr_banks = ARRAY_SIZE(exynos7870_pin_banks3), + .eint_gpio_init = exynos_eint_gpio_init, + .suspend = exynos_pinctrl_suspend, + .resume = exynos_pinctrl_resume, + }, { + /* pin-controller instance 4 MIF data */ + .pin_banks = exynos7870_pin_banks4, + .nr_banks = ARRAY_SIZE(exynos7870_pin_banks4), + .eint_gpio_init = exynos_eint_gpio_init, + .suspend = exynos_pinctrl_suspend, + .resume = exynos_pinctrl_resume, + }, { + /* pin-controller instance 5 NFC data */ + .pin_banks = exynos7870_pin_banks5, + .nr_banks = ARRAY_SIZE(exynos7870_pin_banks5), + .eint_gpio_init = exynos_eint_gpio_init, + .suspend = exynos_pinctrl_suspend, + .resume = exynos_pinctrl_resume, + }, { + /* pin-controller instance 6 TOP data */ + .pin_banks = exynos7870_pin_banks6, + .nr_banks = ARRAY_SIZE(exynos7870_pin_banks6), + .eint_gpio_init = exynos_eint_gpio_init, + .suspend = exynos_pinctrl_suspend, + .resume = exynos_pinctrl_resume, + }, { + /* pin-controller instance 7 TOUCH data */ + .pin_banks = exynos7870_pin_banks7, + .nr_banks = ARRAY_SIZE(exynos7870_pin_banks7), + .eint_gpio_init = exynos_eint_gpio_init, + .suspend = exynos_pinctrl_suspend, + .resume = exynos_pinctrl_resume, + }, +}; + +const struct samsung_pinctrl_of_match_data exynos7870_of_data __initconst = { + .ctrl = exynos7870_pin_ctrl, + .num_ctrl = ARRAY_SIZE(exynos7870_pin_ctrl), +}; + /* pin banks of exynos7885 pin-controller 0 (ALIVE) */ static const struct samsung_pin_bank_data exynos7885_pin_banks0[] __initconst = { EXYNOS_PIN_BANK_EINTN(3, 0x000, "etc0"), diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.h b/drivers/pinctrl/samsung/pinctrl-exynos.h index 7b7ff7ffeb56bdde2504ec90c8df13bdd1ace70e..81c4b4a1acc20aeefe086ecf1fcf8644c3ca4395 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos.h +++ b/drivers/pinctrl/samsung/pinctrl-exynos.h @@ -112,6 +112,35 @@ .pctl_res_idx = pctl_idx, \ } \ +#define EXYNOS7870_PIN_BANK_EINTN(pins, reg, id) \ + { \ + .type = &exynos7870_bank_type_alive, \ + .pctl_offset = reg, \ + .nr_pins = pins, \ + .eint_type = EINT_TYPE_NONE, \ + .name = id \ + } + +#define EXYNOS7870_PIN_BANK_EINTG(pins, reg, id, offs) \ + { \ + .type = &exynos7870_bank_type_off, \ + .pctl_offset = reg, \ + .nr_pins = pins, \ + .eint_type = EINT_TYPE_GPIO, \ + .eint_offset = offs, \ + .name = id \ + } + +#define EXYNOS7870_PIN_BANK_EINTW(pins, reg, id, offs) \ + { \ + .type = &exynos7870_bank_type_alive, \ + .pctl_offset = reg, \ + .nr_pins = pins, \ + .eint_type = EINT_TYPE_WKUP, \ + .eint_offset = offs, \ + .name = id \ + } + #define EXYNOS850_PIN_BANK_EINTN(pins, reg, id) \ { \ .type = &exynos850_bank_type_alive, \ diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c index cfced7afd4ca6e99c7e72a588d780f0542990ed9..e1962b78cef4ff63a7f3a71c1aa55adb84b70bf2 100644 --- a/drivers/pinctrl/samsung/pinctrl-samsung.c +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c @@ -1473,6 +1473,8 @@ static const struct of_device_id samsung_pinctrl_dt_match[] = { .data = &exynos5433_of_data }, { .compatible = "samsung,exynos7-pinctrl", .data = &exynos7_of_data }, + { .compatible = "samsung,exynos7870-pinctrl", + .data = &exynos7870_of_data }, { .compatible = "samsung,exynos7885-pinctrl", .data = &exynos7885_of_data }, { .compatible = "samsung,exynos850-pinctrl", diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.h b/drivers/pinctrl/samsung/pinctrl-samsung.h index bb0689d52ea0b4392714fa9bcdcbae8d253c73a1..3e82aab3eae8accb0586295c2ffd89667ad0c56a 100644 --- a/drivers/pinctrl/samsung/pinctrl-samsung.h +++ b/drivers/pinctrl/samsung/pinctrl-samsung.h @@ -382,6 +382,7 @@ extern const struct samsung_pinctrl_of_match_data exynos5410_of_data; extern const struct samsung_pinctrl_of_match_data exynos5420_of_data; extern const struct samsung_pinctrl_of_match_data exynos5433_of_data; extern const struct samsung_pinctrl_of_match_data exynos7_of_data; +extern const struct samsung_pinctrl_of_match_data exynos7870_of_data; extern const struct samsung_pinctrl_of_match_data exynos7885_of_data; extern const struct samsung_pinctrl_of_match_data exynos850_of_data; extern const struct samsung_pinctrl_of_match_data exynos8895_of_data;