From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A3B7947F764 for ; Thu, 20 Aug 2026 17:17:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246225; cv=none; b=QNi/UTPX3mBIh/cp/JQIl8MUBwLueeWljEsDE6ElG3Kpx0JBPno0JrQJzILx2ZoEoN+Lw5e46a7+Afb1z5CHNm2cETAZ9Ubv3d4F7a8864wlYlOzvjslT4FRobY/8xMB0WSaFyNvtr98GZTTbuvJElQjU8pEqbaoXIEMgarX8sU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246225; c=relaxed/simple; bh=LeJpvsmE8/8oIBqIo77XO1N7ZMpxYFIy1g4h/XeP6k0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ErDU+vEt5B2IQLK4Fsx5PTjXnKMGeLwxoxGXf4Tr89jKZ8hu57pMwmEdYQpBReAnaVrvUf21RPNc6+d9L/PwPe178rz4AO7PQRK7bJb88KzVGl10opJO3Y24MIFOsJsmtOUn5ouMF3znFDTbZMFleJ7zk2PW3XfUMy3i2LRGS8U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=EqtgzFvC; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EqtgzFvC" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-4955aa106b1so863965e9.0 for ; Thu, 20 Aug 2026 10:17:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246221; x=1787851021; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=LF21JGxH17vVW7bu66t9RUZbiTMUiqLzjDtcuysGx8g=; b=EqtgzFvC/8tZwSIQeZ3NNUYmSPpWX99V0e/Gt71iqqI9VMA7aCbgxRy/oRwXfOE1+G Ja7rlwRkm5LHoKpNvubzzdPXjEi31BwHDK5wWGIPTGgc9HqKKlAVuR6va6uMQspv/Er7 9t7D+a9vAIOpS+JS/CLZvIz4ePEcyLHxAmYA0dwiqxq1W9pjXvHfzuEw3FLNadKXL/5p PeyvNuSVYeqw4s76vxMgE7rl0etGisRS6QO9qFgUqGYxV2uPZKWVwPykEczXtEfsStH3 lB4goOmmK8Sm/6blHFyQXaFOhMfRbmej1m4RC1dX77vDSpS9oEJOc07xWF+LM6duG8gd Q0NQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246221; x=1787851021; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=LF21JGxH17vVW7bu66t9RUZbiTMUiqLzjDtcuysGx8g=; b=dKN2s1CQIiNok4pdnDf8uGUTV5+aVT55ci55043MW7z/KvHjGmijN5oBBG57UKDElt EK4EkyJzrmb97WerpwfdEJvmgXAQPuEnRdXClijpY+n5iXUQkovuV+H2imhal2K9/TrT Fy7iW4HMRLotuuVBHlUFpKG31YPNE3RD1G3aYT3uees9213OuzlISTVSGh+/0kQ5hCMC oIvk7Hn9nNnRvNZ3SyAZXBpiGTJzGJztQ4EOLXNeDFh/ClFw7i1FM652Ktxl/ToYmh4W h949kUCCrE+V0J8sQBIML01SuAkkiuN8qYq/6YRgKDI6KGvsKRJr0U/SLR+Ii4DZK9G8 PY0w== X-Forwarded-Encrypted: i=1; AHgh+RqHnan1dX+1ezndoc8ciqXwUXeJNYTfUN27drk8nd8JCpk1G7lfYFigNRL/QTPWHwL/2Y9My3+nonzdiao=@vger.kernel.org X-Gm-Message-State: AOJu0Yy7xSaDES4XeVY1Gknpt6GlreSNHYzRaOF0vvkgMhacjS04S7Uq 1H1XmSKOtRfQEymKqIalefr7GOZW9YgTPvuOI+37tat73ReSvcjzDWyg X-Gm-Gg: AR+sD12ZO6qL9bIvcw6TxoxNVeHaT/p3xk8jb6J9gspMIjgMOmQE1uHOLK8fT+v/UDD jhtKUECQRZx5NJEjAVEM0XuPLRxnMJNKGxIiij8VskGblT581pMXSdrr0rcZr+vD74J3IcaTvXx ngDrMWiU+f+lgMsHgj2WIXYKDXiykqrtfuF+6fsW4q6BUR+WOrpaQKtQ8Pu8WRWtEHMEq3fb/kL Ae4TNH5gvEmuR7SbSEmrI5YjQx56R68Bqx6a+L+c7Teyj2MvqUE9ewbW5o98F+dJC9tUW9lbSYL ecM2/sF/pwMEc6sS3DhgM2lqy4qyNKqTPYkHpZ1jruJrttuief01fwlKnyf3/JrernDZe2ZoPuU rvRm/8XqyqUsEXeotaEvUu+bmxDq/EilOFKQVn4NBwHSwDdVWvlDZqfauqb48HDnrTmzOwtLeHV mu8hzjOwVBzihJaeosKysmUh09elJnN6aNqX2SqbJM/zp6BHNP781eefPCYUnLY9leaWFJzQ== X-Received: by 2002:a05:600c:6211:b0:499:621a:2ec2 with SMTP id 5b1f17b1804b1-499b82e8e9dmr9581305e9.3.1787246220686; Thu, 20 Aug 2026 10:17:00 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.16.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:00 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Ulf Hansson , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Geert Uytterhoeven , Magnus Damm Cc: Biju Das , Wolfram Sang , linux-mmc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Prabhakar Mahadev Lad , Biju Das , Conor Dooley Subject: [PATCH v24 01/15] dt-bindings: mmc: renesas,sdhi: Document RZ/G3L (r9a08g046) SoC Date: Thu, 20 Aug 2026 18:16:31 +0100 Message-ID: <20260820171657.62815-2-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das Document the RZ/G3L (r9a08g046) SDHI controller. The RZ/G3L SDHI controller is similar to RZ/G2L but has five clocks (core, clkh, cd, aclkm, aclks) and three resets (rst, axim, axis), so update the clocks/clock-names maximum to 5 and resets/reset-names maximum to 3. It has an internal divider for all modes except HS400, and a 2048-bit divider compared to 512 on others. Acked-by: Conor Dooley Signed-off-by: Biju Das Reviewed-by: Wolfram Sang Tested-by: Geert Uytterhoeven --- v23->v24: * No change. v22->v23: * No change. v21->v22: * No change. v20->v21: * No change. v19->v20: * No change. v18->v19: * Updated commit description * Updated clock and reset description with AXI master and AXI slave * Added else condition for reset and reset-names. * Renamed aclk->aclkm and reordered the axi clocks similar to resets. * Retained the tag as the changes are trivial. v17->v18: * No change. v1->v17: * Collected tag. --- .../devicetree/bindings/mmc/renesas,sdhi.yaml | 108 +++++++++++++----- 1 file changed, 81 insertions(+), 27 deletions(-) diff --git a/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml b/Docu= mentation/devicetree/bindings/mmc/renesas,sdhi.yaml index 4d66966ce290..6d229a41a4b5 100644 --- a/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml +++ b/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml @@ -18,6 +18,7 @@ properties: - renesas,sdhi-r7s9210 # SH-Mobile AG5 - renesas,sdhi-r8a73a4 # R-Mobile APE6 - renesas,sdhi-r8a7740 # R-Mobile A1 + - renesas,sdhi-r9a08g046 # RZ/G3L - renesas,sdhi-r9a09g057 # RZ/V2H(P) - renesas,sdhi-sh73a0 # R-Mobile APE6 - items: @@ -86,11 +87,11 @@ properties: =20 clocks: minItems: 1 - maxItems: 4 + maxItems: 5 =20 clock-names: minItems: 1 - maxItems: 4 + maxItems: 5 =20 dmas: minItems: 4 @@ -116,7 +117,12 @@ properties: maxItems: 1 =20 resets: - maxItems: 1 + minItems: 1 + maxItems: 3 + + reset-names: + minItems: 1 + maxItems: 3 =20 pinctrl-0: minItems: 1 @@ -155,60 +161,106 @@ allOf: properties: compatible: contains: - enum: - - renesas,sdhi-r9a09g057 - - renesas,rzg2l-sdhi + const: renesas,sdhi-r9a08g046 then: properties: clocks: items: - description: IMCLK, SDHI channel main clock1. - description: CLK_HS, SDHI channel High speed clock which o= perates - 4 times that of SDHI channel main clock1. + 2 times that of SDHI channel main clock1. - description: IMCLK2, SDHI channel main clock2. When this c= lock is turned off, external SD card detection cannot= be detected. - - description: ACLK, SDHI channel bus clock. + - description: IACLKM, SDHI channel AXI master bus clock. + - description: IACLKS, SDHI channel AXI slave bus clock. clock-names: items: - const: core - const: clkh - const: cd - - const: aclk + - const: aclkm + - const: aclks + resets: + items: + - description: rst, Core reset. + - description: axim, SDHI channel AXI master bus reset. + - description: axis, SDHI channel AXI slave bus reset. + reset-names: + items: + - const: rst + - const: axim + - const: axis required: - clock-names - resets + - reset-names else: + properties: + resets: + maxItems: 1 + reset-names: + maxItems: 1 if: properties: compatible: contains: enum: - - renesas,rcar-gen2-sdhi - - renesas,rcar-gen3-sdhi - - renesas,rcar-gen4-sdhi + - renesas,sdhi-r9a09g057 + - renesas,rzg2l-sdhi then: properties: clocks: - minItems: 1 - maxItems: 3 - clock-names: - minItems: 1 - uniqueItems: true items: - - const: core - - enum: [ clkh, cd ] - - const: cd - else: - properties: - clocks: - minItems: 1 - maxItems: 2 + - description: IMCLK, SDHI channel main clock1. + - description: CLK_HS, SDHI channel High speed clock which= operates + 4 times that of SDHI channel main clock1. + - description: IMCLK2, SDHI channel main clock2. When this= clock is + turned off, external SD card detection cann= ot be + detected. + - description: ACLK, SDHI channel bus clock. clock-names: - minItems: 1 items: - const: core + - const: clkh - const: cd + - const: aclk + resets: + maxItems: 1 + required: + - clock-names + - resets + else: + if: + properties: + compatible: + contains: + enum: + - renesas,rcar-gen2-sdhi + - renesas,rcar-gen3-sdhi + - renesas,rcar-gen4-sdhi + then: + properties: + clocks: + minItems: 1 + maxItems: 3 + clock-names: + minItems: 1 + uniqueItems: true + items: + - const: core + - enum: [ clkh, cd ] + - const: cd + else: + properties: + clocks: + minItems: 1 + maxItems: 2 + clock-names: + minItems: 1 + items: + - const: core + - const: cd =20 - if: properties: @@ -247,7 +299,9 @@ allOf: properties: compatible: contains: - const: renesas,sdhi-r9a09g057 + enum: + - renesas,sdhi-r9a08g046 + - renesas,sdhi-r9a09g057 then: properties: vqmmc-regulator: --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4745847F78A for ; Thu, 20 Aug 2026 17:17:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246226; cv=none; b=RnU8pxS1ON+gcBzcjQ/PXy2+MlhdCFgKzeWBoDPjFtyS7fntxy8MXP1h4zIpEKk07H9PPRiMFOkJWQ4X2vx8HSvu0DS5Tr8EqeUINd9n/usOZLwRRixtmG1CHH0HdN6fDMUmVyRv8ts/g+o3FiCYrWPJigR8T0dywNqnYn88rK0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246226; c=relaxed/simple; bh=ipr+MBhDJMbp5Zx5PlUAdWHCNAfdnVJiOsjptFpzaq8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UXyvyA662X6O8qtF905hbMoNLjdSZKwI+szYMpKjB+fBEz7AW9kxAtrOCTy8+rRed+YdTOdl73GHUaR57J+IWYjnDOg/9h1C15VP3+8tmUnJoDuR7dzIiRC6ktJtW/NfrYEYfDaMX5vlhIs0r/P6QwwgjWttB7uoGbaZ2nZYacY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XKl7bFd9; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XKl7bFd9" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-49557167508so642325e9.1 for ; Thu, 20 Aug 2026 10:17:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246221; x=1787851021; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=mu5nSbIV7ZVCPgjYekLBicE5GIjpuU6QCDUMJ/qyzLI=; b=XKl7bFd9eqmYkYGMe24uHacDeXKeNh1yMLHWAcXmcgUbsDDNj1BZ4qdSouR7kYo+GE QDZ7SGjgqGtmcxliprYe0vROB7QyjujfO99G+bVaUTK9zjbJmaqglyjsYhTih+vsM5gF aYnt876TCVShI6+TtOECRykGeCjkLEHEpj4rWZadphW/nYg1+spRS4xOpK1mIypAGAmG 5QRPzKncpcs+KI1PbfUPSaCYK24dwNGB6FoVYKAg9uuWBOvYKQk+um9i23sAKqtsWxTG hi18cT2dlKyBwMA6J78mqjr+nSbGCrJeGYeYp6OP97OPqEhWwM9MKB7+HBNHWrb4EJTL 9eiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246221; x=1787851021; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=mu5nSbIV7ZVCPgjYekLBicE5GIjpuU6QCDUMJ/qyzLI=; b=aGQy53+rUBhMJlfaeBlSIeS5isSDwGW9VPqjAcR2phZ6kdTvNqS5qNGvqwtPLe1jvd 6qu+zx3N3jQNZ2/2G0ETaOtUcv1ZfHdBeohi7qtUhrhlMSxrSOKir0vi0W92aDxCDlg1 HKBApIV48SEq3GI7UJQTNUvggrEDcRlaRl3ePviSbW57aKskk5olXkTGgppH4bxC2csM RsmiZE2l6QVMRI0Wq9uEmnR4pACtwAZjIB8Wxj0XVNVY7PqeV7nqSLcvjngJHnB5OIyd 2N0K4bE0SsN4rA7GBB14MM27+OOqqcChKTweHqQQJ4e1T7Hato10ciHYv16TNBC/M0W7 z+XA== X-Forwarded-Encrypted: i=1; AHgh+RrSAJ4cOaYDIBb5kbType/ATAQ76m5CvBAADWfESRcTYiyiVm1Gw9CVW0OxkQTHmnwz69xlpxAyM2oi5js=@vger.kernel.org X-Gm-Message-State: AOJu0YyEp6ycRcZl9fZhv24RSFmlGYnnmGFHli1obkwAjE968DrpeC5B AV3HSA4qssaPOOq8oXeOwIIQCRXgR6Ku5A9RDWH9jguK5Me5I/O16k8K X-Gm-Gg: AR+sD13mKwuQGcWtMHgjTuP/oQ2i6FCTrhlXiFUWm9M8h8pVJSGd/G0GRAebhPWxbAD Xr87LA3BUr3tmS0VDpnlQxM/9tRPDWWVPjxIVdccxN616COUKsedWNTgSa5xLKXBfImdfKK6eLP h47FRjMCu9P/igOg41w1mDVjFepBhl48fAIBqS7PmMLetC4DBlI6/goMeGTjZcd4TTCP/j3U797 +X/kyxJEfqOT7+ZZ1/DkLNZpaK7X6qYUYy3dCHvxGjsYo83J1anT08AdHPjZfOCQpmZSnt3oqrM EVq8AchS4wblDzA6aBSZMr4Y1jo8LBhBE/Xrp62a9FnOHAFx354HH0wg5aUZJeTBfDReVXvn3Xt 75g5uExjRelmXhfif4RFCINi0ejqVUx3Sev5ENpUDgerzug/xLvKKGD5KEb+tDNEmG/R+3jfGHE Cts4YbXa2b04fUp8106JLBGxdFhaTO5WCrNNoL1bYHOPNj00NONQjNzrLGMu+hWvGpWeKb X-Received: by 2002:a05:600c:64c6:b0:499:afcb:24c1 with SMTP id 5b1f17b1804b1-499b82e8528mr9852195e9.5.1787246221245; Thu, 20 Aug 2026 10:17:01 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:00 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 02/15] mmc: renesas_sdhi: Clean up whitespace and add OF table sentinels Date: Thu, 20 Aug 2026 18:16:32 +0100 Message-ID: <20260820171657.62815-3-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das Clean up coding style inconsistencies across the Renesas SDHI host driver files. Remove redundant internal spacing in the struct definitions and static initializers to enforce a single space separator or uniform tabs, aligning the code with standard kernel formatting guidelines. While at it, add a "Sentinel." comment block to the empty terminating entries of the Open Firmware (OF) device matching tables to improve code readability and explicitly mark the table boundaries. Reviewed-by: Wolfram Sang Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * No change. v22->v23: * No change. v21->v22: * No change. v20->v21: * No change. v19->v20: * No change. v18->v19: * Updated commit description. v17->v18: * Merged patch#4 and #5 * Updated commit description * Annotate the empty sentinel entries in the OF match tables with a "Sentinel." comment for clarity. * Retained the tag as it is trivial cleanups. v1->v17: * No change. --- drivers/mmc/host/renesas_sdhi.h | 2 +- drivers/mmc/host/renesas_sdhi_internal_dmac.c | 6 +++--- drivers/mmc/host/renesas_sdhi_sys_dmac.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdh= i.h index afc36a407c2c..09bf9b24a8c3 100644 --- a/drivers/mmc/host/renesas_sdhi.h +++ b/drivers/mmc/host/renesas_sdhi.h @@ -25,7 +25,7 @@ struct renesas_sdhi_scc { =20 struct renesas_sdhi_of_data { unsigned long tmio_flags; - u32 tmio_ocr_mask; + u32 tmio_ocr_mask; unsigned long capabilities; unsigned long capabilities2; enum dma_slave_buswidth dma_buswidth; diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/ho= st/renesas_sdhi_internal_dmac.c index 0c3967f758c2..b3f4a5f8dec0 100644 --- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c @@ -271,8 +271,8 @@ static const struct renesas_sdhi_of_data_with_quirks of= _rcar_gen3_nohs400_compat }; =20 static const struct renesas_sdhi_of_data_with_quirks of_rza2_compatible = =3D { - .of_data =3D &of_data_rza2, - .quirks =3D &sdhi_quirks_fixed_addr, + .of_data =3D &of_data_rza2, + .quirks =3D &sdhi_quirks_fixed_addr, }; =20 static const struct of_device_id renesas_sdhi_internal_dmac_of_match[] =3D= { @@ -293,7 +293,7 @@ static const struct of_device_id renesas_sdhi_internal_= dmac_of_match[] =3D { { .compatible =3D "renesas,rzg2l-sdhi", .data =3D &of_rzg2l_compatible, }, { .compatible =3D "renesas,rcar-gen3-sdhi", .data =3D &of_rcar_gen3_compa= tible, }, { .compatible =3D "renesas,rcar-gen4-sdhi", .data =3D &of_rcar_gen3_compa= tible, }, - {}, + { /* Sentinel. */ } }; MODULE_DEVICE_TABLE(of, renesas_sdhi_internal_dmac_of_match); =20 diff --git a/drivers/mmc/host/renesas_sdhi_sys_dmac.c b/drivers/mmc/host/re= nesas_sdhi_sys_dmac.c index 426308b73b49..7ae488e5c1e0 100644 --- a/drivers/mmc/host/renesas_sdhi_sys_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_sys_dmac.c @@ -27,7 +27,7 @@ #define TMIO_MMC_MIN_DMA_LEN 8 =20 static const struct renesas_sdhi_of_data of_default_cfg =3D { - .tmio_flags =3D TMIO_MMC_HAS_IDLE_WAIT, + .tmio_flags =3D TMIO_MMC_HAS_IDLE_WAIT, }; =20 static const struct renesas_sdhi_of_data of_rz_compatible =3D { @@ -89,7 +89,7 @@ static const struct of_device_id renesas_sdhi_sys_dmac_of= _match[] =3D { { .compatible =3D "renesas,rcar-gen1-sdhi", .data =3D &of_rcar_gen1_compa= tible, }, { .compatible =3D "renesas,rcar-gen2-sdhi", .data =3D &of_rcar_gen2_compa= tible, }, { .compatible =3D "renesas,sdhi-shmobile" }, - {}, + { /* Sentinel. */ } }; MODULE_DEVICE_TABLE(of, renesas_sdhi_sys_dmac_of_match); =20 --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D6C7047F78E for ; Thu, 20 Aug 2026 17:17:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246226; cv=none; b=HR4uOL37bxr5zLoLx26+AJdqiG/DZRRe1RbSEvF5EHr+rTOqpiiLqh2ziED26bmDa9OG9nRJ05vSWwWV/eucLoB+j4yFd/XWtyOAl3LlnweX+bx7rE2TdTBJZhTykkVmJ4PGWWMiDu0k3mrcoLL9yxSAYGrrsqwcfY39Xfw7bnM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246226; c=relaxed/simple; bh=MIdD7l2DQCkP5wfUpXnqfZxfdpV/bFJmApBkKppM7LY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZbNe3xJFpfKyToYWy20eeV7ax0XO8ePrhIkEishfmay9YBUyOOjKEMR0J19+F7jqNmrD8hBl+iKlo4CbGGKmd7ETEFf+aWgl1HpSCaw0FSk9mHE9TD034Dur7AaWPbNNhVP3vLJ9SMNwQWSjM7klgjywMwbMcTTuHP1LmO/bilk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=eflgeA07; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="eflgeA07" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-4980dc26022so630415e9.1 for ; Thu, 20 Aug 2026 10:17:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246222; x=1787851022; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ttBWRnKNE8jjSldWqGeInhpyIrJnsW92DY0J8lKBoNQ=; b=eflgeA07umZYC0jSx+8zzETmhyKBbKN6IG8ftjjebfDJ3R/y/sX82I4qSuPJOM5HSV R9M9IBPwAc4ZmZEtMylbq3iZWunmsxWbmlcdbEssexvkvhXzlcDZhKsV9/axrFVTM6Qu ILy0L6couZMv/XYDM/5TRyVRMtRzjM0Qn2gmUrNmVLtDBZRMNzXhwVNFFrKif+TMD7JC a4cPx/+v8yINuomZQIcPujLzlH4w0670jyuijypdv3AVF00MDte+LqHkw2ByrTEuOVfY G76tnZpzXGCZOznxDTUAXBpYSn46y/tDQ4I5oSxLiwGbRdKYkMM7MjvKnDgxsJ02AXkx 27aQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246222; x=1787851022; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=ttBWRnKNE8jjSldWqGeInhpyIrJnsW92DY0J8lKBoNQ=; b=kSZR8iyPs/N4Fw32q/J2D1MRbxkzzvxIH9XMnrC8CNXeYVysk4Y45bseabKtqxIsa0 iPNLq1z2rsgLtlPi4aif1j91WeBvduK0CZ0h7LQpb0XYlTsNrOXRIOHOkthNYVzsIVqw onW5fUumPvuu96suSo04rYgKaxwVOLw4CIHvxjel1qbOZ9UJRIfCBvfpk59bnj+b7iU2 f7SrF3M4ho1pGgYkToU8mYW9GCir5HbyqplYB+Xi6bjNuZozS16I+e8Zr1EHarc+GolZ Ir3DsMxbZnQy4UDbyUjQcDgnY6EiaPg1PATnX3E+cpiJRB9quSr6CGK5x8SBtOt8QxkT 6mpg== X-Forwarded-Encrypted: i=1; AHgh+RpL/nDjIdjDRJvPZ+ccxMro8QdliGqVxplpUFbreNEWfjDlpgWK8vR3VHNidZP+KkiFrrwH9PI17jGIjIk=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/YAKRJ/150ozqWw8Gndr0b73dltdldYxkxBed7XQYLW4WKJZ7 HsZO/pnQDzji6DTHYuvXk1hQtsRvyv0O6NAbABSP2LmlMObqrXkn3532clYa2Q== X-Gm-Gg: AR+sD10ZkhMKitqINnvim4CeK/H7037BBH3LHAxJwsKXNP4kjzL70c1+2+Uny40OYuR hVg4EMtMn8dRW0VeDpZzXMG9Fv8X6XXHPLDpys/iLe2yLSEQglIEKeNlhOwZj4soZ6xSBuLd6QF mPw+WHK/jfdRouagBc0ReeoiWEtCP/VewSaBb8sN105gOqrGBFYQMSowYqYDSDTsuiuRRb82COt 8NK8MAar6pIdrAP+6SCk0lGlFjzcvJQjji43Knb/ZBIvsaBOrH665xPPhor3V4tgqwk0+zhgftX 7jVHywo6dna3bPdd0CkRYAtDrq6BwSH004nfmRTblr/regjyCL08JzTndDiy8IxNzLYsG6HHxFz gPEtgfxR7Jejr2QzIqc4tP0deCA6CZsPbuOrqgkP0TzZ6xDHfLmLvEcr3h28eL86DYCukpNkRI9 WWW3b52NkY68Pt4f3oKFoJFLV2nkr+Zv1sSGYIWaiCpzmbdSd9lsHu3Yjvs6gU9/dVEYu+ X-Received: by 2002:a05:600c:3486:b0:499:781e:25fc with SMTP id 5b1f17b1804b1-499b828e031mr11293425e9.3.1787246221805; Thu, 20 Aug 2026 10:17:01 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:01 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 03/15] mmc: renesas_sdhi: Add clk_mask field to support flexible clock divider widths Date: Thu, 20 Aug 2026 18:16:33 +0100 Message-ID: <20260820171657.62815-4-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das The clock divider on the RZ/G3L SoC features an 11-bit width, requiring a wider clock mask (0x200000200) in renesas_sdhi_set_clock() than the historically hardcoded 32-bit value (0x80000080). To accommodate SoC variants with wider clock divider masks, expand the internal clock control variables (clk and clock) from u32 to u64. Introduce a clk_mask field to both struct renesas_sdhi_of_data and struct tmio_mmc_data to allow platform configuration data to supply SoC-specific mask properties. Update renesas_sdhi_set_clock() to read the dynamic mask from platform data. During the probe phase, assign a default mask fallback of SDHI_CLK_MASK_DEFAULT (0x80000080) if no specific mask is specified, ensuring backward compatibility with existing hardware variants. Finally, explicitly populate clk_mask with the default value across all current internal and system DMAC configuration profiles, in preparation for the upcoming RZ/G3L clock customization. Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * No change. v22->v23: * No change. v21->v22: * No change. v20->v21: * No change. v19->v20: * Replaced the check mmd->clk_mask with mmc_data->clk_mask and moved the code after assignment of variable mmd, this ensures assigning the default values for non-DT platforms and DT platforms with no device data. v18->v19: * Fixed the clk_mask for non-DT platforms. v18: * New patch dropping struct renesas_sdhi_hw_info instead using renesas_sdhi_of_data and tmio_mmc_data. --- drivers/mmc/host/renesas_sdhi.h | 2 ++ drivers/mmc/host/renesas_sdhi_core.c | 8 ++++++-- drivers/mmc/host/renesas_sdhi_internal_dmac.c | 3 +++ drivers/mmc/host/renesas_sdhi_sys_dmac.c | 4 ++++ include/linux/platform_data/tmio.h | 1 + 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdh= i.h index 09bf9b24a8c3..f926a36f213c 100644 --- a/drivers/mmc/host/renesas_sdhi.h +++ b/drivers/mmc/host/renesas_sdhi.h @@ -22,6 +22,7 @@ struct renesas_sdhi_scc { }; =20 #define SDHI_FLAG_NEED_CLKH_FALLBACK BIT(0) +#define SDHI_CLK_MASK_DEFAULT 0x80000080 =20 struct renesas_sdhi_of_data { unsigned long tmio_flags; @@ -37,6 +38,7 @@ struct renesas_sdhi_of_data { unsigned int max_blk_count; unsigned short max_segs; unsigned long sdhi_flags; + u64 clk_mask; }; =20 #define SDHI_CALIB_TABLE_MAX 32 diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index f9ec78d699f4..604d886e483c 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -194,7 +194,7 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host= *host, unsigned int new_clock) { unsigned int clk_margin; - u32 clk =3D 0, clock; + u64 clk =3D 0, clock; =20 sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN & sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL)); @@ -213,7 +213,7 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host= *host, * provided for actual_clock in renesas_sdhi_clk_update(). */ clk_margin =3D new_clock >> 10; - for (clk =3D 0x80000080; new_clock + clk_margin >=3D (clock << 1); clk >>= =3D 1) + for (clk =3D host->pdata->clk_mask; new_clock + clk_margin >=3D (clock <<= 1); clk >>=3D 1) clock <<=3D 1; =20 /* 1/1 clock is option */ @@ -1136,6 +1136,7 @@ int renesas_sdhi_probe(struct platform_device *pdev, mmc_data->dma_rx_offset =3D of_data->dma_rx_offset; mmc_data->max_blk_count =3D of_data->max_blk_count; mmc_data->max_segs =3D of_data->max_segs; + mmc_data->clk_mask =3D of_data->clk_mask; dma_priv->dma_buswidth =3D of_data->dma_buswidth; host->bus_shift =3D of_data->bus_shift; /* Fallback for old DTs */ @@ -1178,6 +1179,9 @@ int renesas_sdhi_probe(struct platform_device *pdev, if (mmd) *mmc_data =3D *mmd; =20 + if (!mmc_data->clk_mask) + mmc_data->clk_mask =3D SDHI_CLK_MASK_DEFAULT; + dma_priv->filter =3D shdma_chan_filter; dma_priv->enable =3D renesas_sdhi_enable_dma; =20 diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/ho= st/renesas_sdhi_internal_dmac.c index b3f4a5f8dec0..c6db0418de15 100644 --- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c @@ -101,6 +101,7 @@ static const struct renesas_sdhi_of_data of_data_rza2 = =3D { /* DMAC can handle 32bit blk count but only 1 segment */ .max_blk_count =3D UINT_MAX / TMIO_MAX_BLK_SIZE, .max_segs =3D 1, + .clk_mask =3D SDHI_CLK_MASK_DEFAULT, }; =20 static const struct renesas_sdhi_of_data of_data_rcar_gen3 =3D { @@ -118,6 +119,7 @@ static const struct renesas_sdhi_of_data of_data_rcar_g= en3 =3D { .max_blk_count =3D UINT_MAX / TMIO_MAX_BLK_SIZE, .max_segs =3D 1, .sdhi_flags =3D SDHI_FLAG_NEED_CLKH_FALLBACK, + .clk_mask =3D SDHI_CLK_MASK_DEFAULT, }; =20 static const struct renesas_sdhi_of_data of_data_rcar_gen3_no_sdh_fallback= =3D { @@ -134,6 +136,7 @@ static const struct renesas_sdhi_of_data of_data_rcar_g= en3_no_sdh_fallback =3D { /* DMAC can handle 32bit blk count but only 1 segment */ .max_blk_count =3D UINT_MAX / TMIO_MAX_BLK_SIZE, .max_segs =3D 1, + .clk_mask =3D SDHI_CLK_MASK_DEFAULT, }; =20 static const u8 r8a7796_es13_calib_table[2][SDHI_CALIB_TABLE_MAX] =3D { diff --git a/drivers/mmc/host/renesas_sdhi_sys_dmac.c b/drivers/mmc/host/re= nesas_sdhi_sys_dmac.c index 7ae488e5c1e0..fcd2edfa69db 100644 --- a/drivers/mmc/host/renesas_sdhi_sys_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_sys_dmac.c @@ -28,6 +28,7 @@ =20 static const struct renesas_sdhi_of_data of_default_cfg =3D { .tmio_flags =3D TMIO_MMC_HAS_IDLE_WAIT, + .clk_mask =3D SDHI_CLK_MASK_DEFAULT, }; =20 static const struct renesas_sdhi_of_data of_rz_compatible =3D { @@ -36,6 +37,7 @@ static const struct renesas_sdhi_of_data of_rz_compatible= =3D { .tmio_ocr_mask =3D MMC_VDD_32_33, .capabilities =3D MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | MMC_CAP_WAIT_WHILE_BUSY, + .clk_mask =3D SDHI_CLK_MASK_DEFAULT, }; =20 static const struct renesas_sdhi_of_data of_rcar_gen1_compatible =3D { @@ -43,6 +45,7 @@ static const struct renesas_sdhi_of_data of_rcar_gen1_com= patible =3D { .capabilities =3D MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | MMC_CAP_WAIT_WHILE_BUSY, .capabilities2 =3D MMC_CAP2_NO_WRITE_PROTECT, + .clk_mask =3D SDHI_CLK_MASK_DEFAULT, }; =20 /* Definitions for sampling clocks */ @@ -70,6 +73,7 @@ static const struct renesas_sdhi_of_data of_rcar_gen2_com= patible =3D { .taps =3D rcar_gen2_scc_taps, .taps_num =3D ARRAY_SIZE(rcar_gen2_scc_taps), .max_blk_count =3D UINT_MAX / TMIO_MAX_BLK_SIZE, + .clk_mask =3D SDHI_CLK_MASK_DEFAULT, }; =20 static const struct of_device_id renesas_sdhi_sys_dmac_of_match[] =3D { diff --git a/include/linux/platform_data/tmio.h b/include/linux/platform_da= ta/tmio.h index 426291713b83..76056d49f5e0 100644 --- a/include/linux/platform_data/tmio.h +++ b/include/linux/platform_data/tmio.h @@ -61,5 +61,6 @@ struct tmio_mmc_data { dma_addr_t dma_rx_offset; unsigned int max_blk_count; unsigned short max_segs; + u64 clk_mask; }; #endif --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E262347F79B for ; Thu, 20 Aug 2026 17:17:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246227; cv=none; b=hNFbIvHSmUEExQwiA7VNcqm02Qc5EFxitGKpDEFqErjXMmGP+1JYoQAfzNnDX067GnNQaBxCt0JLDiX9eLrN9E63RNVYclK+M/bH/HCwhu4zfEzgZGy9tHduZyHEJe034h/OgAdj6NrPNfv4m9W1s7EF2/rmCt6iSnt8To87VZM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246227; c=relaxed/simple; bh=8cm4BeqcrQCOUar1YPf113elo9vnL8mJWpDMLklWUa0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EjkIUmkfL4pVzuYC7bNfbusVT10Mle1Rmoyqf2Kuergpg/h1XNnpiKoIifRhWNowuK63RNmZNfp+nLZsvaD+OFt135gf6aOrx7ny/+9Z/C6rAr4Cc7IWrBXL/3MsRKK8bEtFugt37a1eqZjtzAwfNSzuqhCMQ+oOL6dbNZEUzgg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=B2PPBa7m; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="B2PPBa7m" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-499a4d1d7f1so429955e9.3 for ; Thu, 20 Aug 2026 10:17:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246223; x=1787851023; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=tjlIlyJqcZ5O8Mw+uqpVBJkQhSAn3bbui3EtIXDtxR8=; b=B2PPBa7mLErgCHxX4uagcG3ljDFTFVNpbB2iQNVf4IRjBrk+l8yRkdJRvUUrObzonN JQyxtLukwJEYOJPlNM3BdikzbbdFqQriRyvbzA1dFbVE0smNq8Y/iLd2dxFnSWRvsXJo 1p+GvR6trSeHZ0ZpZdrgkmEb4s0JEIlgxTno+RHpVHkZF6HOz6V+P+FqLxXSi79Y8n4+ gK52AH/74OTTBDpTKi4uPBGBH7fJP9HOAoUP8UggV5NO7HQfUp4EQoFld94WlIah6P3/ w69C0fRYKs+XWvQTZ6cxksj+xPqgDOS3zJ0whmJjAN8RTuUkAqiAFpZGTgr0m3+mr4QZ CEfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246223; x=1787851023; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=tjlIlyJqcZ5O8Mw+uqpVBJkQhSAn3bbui3EtIXDtxR8=; b=L05y1ulHj0l9/EKoUQNJ2Gqeb2BJ/HczESPUqAvcLUOSJmJRz6V99MYFP9JnpioY7z oNGqjpwRLNV3fx1ffN+F8ouvk/j4gRMNre+qa5Cipyzant+bnAr7OrAw7kdtPsVkRp/U TFF2yolP1Tq5X7jYlKEguoB5aVYd98Vxe3fImwQCFOZHpVhOWYAaEe5Fd8a86RxMVf/H H633GmN7meAgR3J2m/b1LM7+EujUm4sKhuKwQf13ijG3dVQEcLbfIvfKMCLObEMdgmz9 0OTYgfiOWWBZUgA+uCGG4ynGU+2xjPEDZS3R1ZR0CnwblU41nvY7q28X4MNI9JyY5q0b nW3A== X-Forwarded-Encrypted: i=1; AHgh+Rqo5cjI+PkS71S7gqZfLpOK7ShV998J4BfvfidPEoxqtggyOigrXSoqXMCR/Ue7mNMx5zhO60M0FusUn00=@vger.kernel.org X-Gm-Message-State: AOJu0YwADEsVhZDEbJYgA1Hesq210f0qP+F0qZ4WVDQMQNX/Xu2VONUb TNhH5yf86C6NTXM6PfwklESR+TbMIAsJozLfQN7aiVTiPkXxAFASoPNs X-Gm-Gg: AR+sD11OTfKtRMAA1UT/IND66fZVKRCzQ1qimGu8uqhNL2fPpzE1Wuli/mWItasEY2O 89FfOLGXLdVmCX9A359qtPbvWeZQcbe0IbuqF4WMSODc562NAwLk6VvcghAXMkq+WxJFsicIhK0 sOOPxddh6heTYhZvXBnxL9X+7S7UA7EfHlNy0ee8HaExLpPLKW10oCZCzuI/VnYmq9mLu/R7p/+ lmFoLnabHf+LXbk6w7pSBfrG5Ad6MaIzFFP9LBYAatF0/yawM71UqaNOYqCKxtdKGHLABPDUahE GjHH72CbtNSb8yqWfNLDR+MLDxCKIsIP04tsW8OngGh6JNpjhyv8lNTXTfPXU3c/FRL6XCmphkU ttLvg885D7QJXD2Vr9qxLkAxG7aHEfbit9iAC+8gQD445FWcF1La/GkVHEvQJwDowh0SB/LZKFF L9D2zU76tWdFetNH1ieiYJk8Eawu87Oa9vWlNYLF8P1H+P+WmvNLdRhHn4ift1HvtTypLm X-Received: by 2002:a05:600c:1548:b0:499:841c:2016 with SMTP id 5b1f17b1804b1-499b8273456mr11277915e9.0.1787246222825; Thu, 20 Aug 2026 10:17:02 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:02 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 04/15] mmc: renesas_sdhi: Add max_divider field to support SoC-specific clock ranges Date: Thu, 20 Aug 2026 18:16:34 +0100 Message-ID: <20260820171657.62815-5-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das RZ/G3L supports a wider clock divider range than the hardcoded 512 used by existing SoCs. Add a max_divider field to renesas_sdhi_of_data and tmio_mmc_data, and use it in renesas_sdhi_clk_enable(), renesas_sdhi_clk_update(), and renesas_sdhi_set_clock() instead of the fixed value. Default to SDHI_MAX_DIVIDER_DEFAULT (512) at probe time when platform data doesn't set it, and populate all existing internal/ sys DMAC of_data tables with this default to keep current SoCs unaffected. This paves the way for RZ/G3L's extended divider support. Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * No change. v22->v23: * Changed the data type of max_divider from unsigned int to signed int. v21->v22: * Updated comit description. v20->v21: * No change. v19->v20: * Replaced the check mmd->max_divider with mmc_data->max_divider and moved the code after assignment of variable mmd, this ensures assigning the default values for non-DT platforms and DT platforms with no device data. v18->v19: * Fixed max-divider setting for non-DT platforms. * Replaced the magic number '9' with ilog2 function in renesas_sdhi_clk_enable(). v18: * New patch. --- drivers/mmc/host/renesas_sdhi.h | 2 ++ drivers/mmc/host/renesas_sdhi_core.c | 12 ++++++++---- drivers/mmc/host/renesas_sdhi_internal_dmac.c | 3 +++ drivers/mmc/host/renesas_sdhi_sys_dmac.c | 4 ++++ include/linux/platform_data/tmio.h | 1 + 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdh= i.h index f926a36f213c..af56b4bfb1d4 100644 --- a/drivers/mmc/host/renesas_sdhi.h +++ b/drivers/mmc/host/renesas_sdhi.h @@ -23,6 +23,7 @@ struct renesas_sdhi_scc { =20 #define SDHI_FLAG_NEED_CLKH_FALLBACK BIT(0) #define SDHI_CLK_MASK_DEFAULT 0x80000080 +#define SDHI_MAX_DIVIDER_DEFAULT 512 =20 struct renesas_sdhi_of_data { unsigned long tmio_flags; @@ -39,6 +40,7 @@ struct renesas_sdhi_of_data { unsigned short max_segs; unsigned long sdhi_flags; u64 clk_mask; + int max_divider; }; =20 #define SDHI_CALIB_TABLE_MAX 32 diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index 604d886e483c..d893a263e770 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -117,7 +117,7 @@ static int renesas_sdhi_clk_enable(struct tmio_mmc_host= *host) * Minimum frequency is the minimum input clock frequency * divided by our maximum divider. */ - mmc->f_min =3D max(clk_round_rate(priv->clk, 1) / 512, 1L); + mmc->f_min =3D max(clk_round_rate(priv->clk, 1) / host->pdata->max_divide= r, 1L); =20 /* enable 16bit data access on SDBUF as default */ renesas_sdhi_sdbuf_width(host, 16); @@ -156,7 +156,7 @@ static unsigned int renesas_sdhi_clk_update(struct tmio= _mmc_host *host, /* * We want the bus clock to be as close as possible to, but no * greater than, new_clock. As we can divide by 1 << i for - * any i in [0, 9] we want the input clock to be as close as + * any i in [0, {9,11}] we want the input clock to be as close as * possible, but no greater than, new_clock << i. * * Add an upper limit of 1/1024 rate higher to the clock rate to fix @@ -165,7 +165,7 @@ static unsigned int renesas_sdhi_clk_update(struct tmio= _mmc_host *host, * for 533.333333 MHz will selects a slower 400 MHz due to rounding * error (533333333 Hz / 4 * 4 =3D 533333332 Hz < 533333333 Hz)). */ - for (i =3D min(9, ilog2(UINT_MAX / new_clock)); i >=3D 0; i--) { + for (i =3D min(ilog2(host->pdata->max_divider), ilog2(UINT_MAX / new_cloc= k)); i >=3D 0; i--) { freq =3D clk_round_rate(ref_clk, new_clock << i); new_upper_limit =3D (new_clock << i) + ((new_clock << i) >> 10); if (freq > new_upper_limit) { @@ -205,7 +205,7 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host= *host, } =20 host->mmc->actual_clock =3D renesas_sdhi_clk_update(host, new_clock); - clock =3D host->mmc->actual_clock / 512; + clock =3D host->mmc->actual_clock / host->pdata->max_divider; =20 /* * Add a margin of 1/1024 rate higher to the clock rate in order @@ -1137,6 +1137,7 @@ int renesas_sdhi_probe(struct platform_device *pdev, mmc_data->max_blk_count =3D of_data->max_blk_count; mmc_data->max_segs =3D of_data->max_segs; mmc_data->clk_mask =3D of_data->clk_mask; + mmc_data->max_divider =3D of_data->max_divider; dma_priv->dma_buswidth =3D of_data->dma_buswidth; host->bus_shift =3D of_data->bus_shift; /* Fallback for old DTs */ @@ -1182,6 +1183,9 @@ int renesas_sdhi_probe(struct platform_device *pdev, if (!mmc_data->clk_mask) mmc_data->clk_mask =3D SDHI_CLK_MASK_DEFAULT; =20 + if (!mmc_data->max_divider) + mmc_data->max_divider =3D SDHI_MAX_DIVIDER_DEFAULT; + dma_priv->filter =3D shdma_chan_filter; dma_priv->enable =3D renesas_sdhi_enable_dma; =20 diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/ho= st/renesas_sdhi_internal_dmac.c index c6db0418de15..2bf354331b2d 100644 --- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c @@ -102,6 +102,7 @@ static const struct renesas_sdhi_of_data of_data_rza2 = =3D { .max_blk_count =3D UINT_MAX / TMIO_MAX_BLK_SIZE, .max_segs =3D 1, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, + .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, }; =20 static const struct renesas_sdhi_of_data of_data_rcar_gen3 =3D { @@ -120,6 +121,7 @@ static const struct renesas_sdhi_of_data of_data_rcar_g= en3 =3D { .max_segs =3D 1, .sdhi_flags =3D SDHI_FLAG_NEED_CLKH_FALLBACK, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, + .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, }; =20 static const struct renesas_sdhi_of_data of_data_rcar_gen3_no_sdh_fallback= =3D { @@ -137,6 +139,7 @@ static const struct renesas_sdhi_of_data of_data_rcar_g= en3_no_sdh_fallback =3D { .max_blk_count =3D UINT_MAX / TMIO_MAX_BLK_SIZE, .max_segs =3D 1, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, + .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, }; =20 static const u8 r8a7796_es13_calib_table[2][SDHI_CALIB_TABLE_MAX] =3D { diff --git a/drivers/mmc/host/renesas_sdhi_sys_dmac.c b/drivers/mmc/host/re= nesas_sdhi_sys_dmac.c index fcd2edfa69db..bb66ff7de065 100644 --- a/drivers/mmc/host/renesas_sdhi_sys_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_sys_dmac.c @@ -29,6 +29,7 @@ static const struct renesas_sdhi_of_data of_default_cfg =3D { .tmio_flags =3D TMIO_MMC_HAS_IDLE_WAIT, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, + .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, }; =20 static const struct renesas_sdhi_of_data of_rz_compatible =3D { @@ -38,6 +39,7 @@ static const struct renesas_sdhi_of_data of_rz_compatible= =3D { .capabilities =3D MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | MMC_CAP_WAIT_WHILE_BUSY, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, + .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, }; =20 static const struct renesas_sdhi_of_data of_rcar_gen1_compatible =3D { @@ -46,6 +48,7 @@ static const struct renesas_sdhi_of_data of_rcar_gen1_com= patible =3D { MMC_CAP_WAIT_WHILE_BUSY, .capabilities2 =3D MMC_CAP2_NO_WRITE_PROTECT, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, + .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, }; =20 /* Definitions for sampling clocks */ @@ -74,6 +77,7 @@ static const struct renesas_sdhi_of_data of_rcar_gen2_com= patible =3D { .taps_num =3D ARRAY_SIZE(rcar_gen2_scc_taps), .max_blk_count =3D UINT_MAX / TMIO_MAX_BLK_SIZE, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, + .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, }; =20 static const struct of_device_id renesas_sdhi_sys_dmac_of_match[] =3D { diff --git a/include/linux/platform_data/tmio.h b/include/linux/platform_da= ta/tmio.h index 76056d49f5e0..e104718cf21f 100644 --- a/include/linux/platform_data/tmio.h +++ b/include/linux/platform_data/tmio.h @@ -62,5 +62,6 @@ struct tmio_mmc_data { unsigned int max_blk_count; unsigned short max_segs; u64 clk_mask; + int max_divider; }; #endif --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD20A47F2CD for ; Thu, 20 Aug 2026 17:17:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246229; cv=none; b=HMswpi0bWHoo9wF/h41saL3xkAYvYI5m2qahGTR3m4V7mFbDRBRFf/WRYZLRbqDOXtnCyb10DQG4TV7rUxof7GsPEOpeFNmnWPXjOMgZvEiPD6BDiIEiauAjqWw6INcVmW2TmEs4mxFT5prZflHLY/PY4hP/VtCZ4J5GFYlbD8Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246229; c=relaxed/simple; bh=LMVqByU38FdLjG5rLAA7ZHIC7mjY2Ws+ctnXmi6/sFA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Rx8cdXWHDaVaBrDz6rXtrPNggGKM0uhlbxlGG8kn+Lt9RsE2c3k8wpwO4sf0NSWX8MvH28sgg/cM6KUiIrOn36OID/nRZsWj2hzWIKGdlbuXBH2tP4DmOaODHwH0nUJwHog+pqpiB5O0ALaxL+K09Oz0LuHYtv27jWmnQ1yoy6k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Zo7pnHop; arc=none smtp.client-ip=209.85.128.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Zo7pnHop" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-4957eefd361so522315e9.1 for ; Thu, 20 Aug 2026 10:17:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246224; x=1787851024; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Evee9pCw6wURFV/VMZdiihB+PWUJ4VouwconvXAOZkM=; b=Zo7pnHop9ef+0pFsqEgAIf5hZ8cpbfHDFw6ItDwRxlFQvqa8177yf0PB8hkKyYVl3H kox9QZA6D5D8Kfed2yJch8Yx9WS68/t7ybxNLGFuOihtFekoOQZ5DacmqD6lHn8CzMvL 0T9WrOKmlvZt5mszrsnQgQeuWecacFonr3AhHk0QUYI6TwALQlM2Civje9U54q/yw6Hw XQKHqipXIuSX14EtAVr+5kdX4OvwCqr8kN2Aro0Lrlf9uCpE9S+XOZX88SBgxzkaiWgs BF3xRhRgTFpuXTcudd6lrU97hBT+G5oPPfsrXoP1egBQXcKb0ajQDjmbd1bb9ZRSopp4 gAHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246224; x=1787851024; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Evee9pCw6wURFV/VMZdiihB+PWUJ4VouwconvXAOZkM=; b=fBR5OELf4kMgqdbErQJzjN1EhTnSBdcdYXivgiyPGJGD4op9whVhUjLmNDfPhsmTl0 lNO2gPJvZuHr+xzAhqxxfPZyw5Mt+qHlnuSPv33QcBqnRCJEIjk4pSX3SFn9bkslh9a5 qASuVQeioY81heyuVy/9K9vxuJwpXOp5TOmmPUevlHXLGuBeiL6+YtziB+Rn8XpKLMSg M3iv6ROmlFflVooBic6k2cqcGJcY8dpAX4JfaBCrNN+OKsMCoTw+qd6Rs1oTEu79X4mc FUEYMQ+gzVuL6Bh/P1fRdQ6a1M+ZK2Wux2jdHYL7hVp7wFZ6sUcw9zZZKM1VU6/G8OqC 9+Tg== X-Forwarded-Encrypted: i=1; AHgh+RrAc/YcHCm6tDq/yjGi/maOUbqoK0/E+Y5UM3uCA49MZGzrqxJNL2lL/pmRvxQjnT9aE2yw9umsG0OYwpk=@vger.kernel.org X-Gm-Message-State: AOJu0YyONrUwTpXmCIIev3jMCG9/NSqMksqBUrLuJUkknJERVRV5aOXi +NkS3pRCOlp5DHtywBxR+zXov9IGGlR/CZTHqYs8N5aD10FUgRCY+cGV X-Gm-Gg: AR+sD10BGCOosPvis7GtuoBvtCI+zpNNE+5M0R1tLI3OcGVY9pAtKWqCUxPWt88fbca P5WGSjBIxguUeo7+AA9v4ml/yJLBxg8QcIG6LJ+BJBEYMbWa9yaU+OhNvMR04NQmgvXaeXiqdHC Xmh9B/oLpK76r6I68vyrxGi39TtYqdV0OkpXT4z/C8+t5Xn+CcT0OCOArovD6PYZAwy+edwr7jl x5nRpu9zg8g/qJCdMEgI5Dma0Nf/RL0N1cxSM5heJXvvf6w8SrR5WmsJuI9WPdy/QFftl47tsoi cRCaeGbm1lJwxRye7X7auOOZNFHwSLJu5Jugb0I3OdbMgbAMo+cso6uSbGqbmyORaW5NJmueT6S eC3WGXUOMwYMZ3smIqswfhKjnejnfFsO6i/dnDensHN8FHcK6H2+OL53+BCVbVjvNzM4Q/rgk7F u1caWd4+TI5BpisML7chfaElByppZctSP3D5qn2WKXHQbxX/LBQRVNCX1VmZFtyRuXJ5nj X-Received: by 2002:a05:600c:1d07:b0:496:c93d:e2f with SMTP id 5b1f17b1804b1-499b857fa7bmr5025685e9.15.1787246223525; Thu, 20 Aug 2026 10:17:03 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:03 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 05/15] mmc: renesas_sdhi: Add SDHI_SD_CLK_CTL_DIV1 macro for 1/1 option Date: Thu, 20 Aug 2026 18:16:35 +0100 Message-ID: <20260820171657.62815-6-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das Replace the magic number 0xff, used for selecting the SD clock 1/1 divider option, with a new SDHI_SD_CLK_CTL_DIV1 macro. This improves readability and self-documents the purpose of the value at each use site (setting/clearing the divider bits and comparing against CLK_CTL_DIV_MASK). No functional change. Signed-off-by: Biju Das Reviewed-by: Wolfram Sang Tested-by: Geert Uytterhoeven --- v24: * New patch --- drivers/mmc/host/renesas_sdhi.h | 1 + drivers/mmc/host/renesas_sdhi_core.c | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdh= i.h index af56b4bfb1d4..a1b2761ceccc 100644 --- a/drivers/mmc/host/renesas_sdhi.h +++ b/drivers/mmc/host/renesas_sdhi.h @@ -24,6 +24,7 @@ struct renesas_sdhi_scc { #define SDHI_FLAG_NEED_CLKH_FALLBACK BIT(0) #define SDHI_CLK_MASK_DEFAULT 0x80000080 #define SDHI_MAX_DIVIDER_DEFAULT 512 +#define SDHI_SD_CLK_CTL_DIV1 0xff =20 struct renesas_sdhi_of_data { unsigned long tmio_flags; diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index d893a263e770..fbc0a8317b30 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -219,13 +219,13 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_ho= st *host, /* 1/1 clock is option */ if ((host->pdata->flags & TMIO_MMC_CLK_ACTUAL) && ((clk >> 22) & 0x1)) { if (!(host->mmc->ios.timing =3D=3D MMC_TIMING_MMC_HS400)) - clk |=3D 0xff; + clk |=3D SDHI_SD_CLK_CTL_DIV1; else - clk &=3D ~0xff; + clk &=3D ~SDHI_SD_CLK_CTL_DIV1; } =20 clock =3D clk & CLK_CTL_DIV_MASK; - if (clock !=3D CLK_CTL_DIV_MASK) + if (clock !=3D SDHI_SD_CLK_CTL_DIV1) host->mmc->actual_clock /=3D (1 << (ffs(clock) + 1)); =20 sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clock); --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 609FF481A86 for ; Thu, 20 Aug 2026 17:17:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246230; cv=none; b=Z6nCziw2O1tvnj0PfRAoZ/IJdUCSG84HSSjA96cy2wIA4T2OSkO5hOl9tIhs2fNxxqOx7TttBb51nmz0nGM/k41Su2oPeFbG32VH8ifY1IphoMPA3qxZgExYQC6xRB3B3cinIpTaP7h6+4BkpG4Oo+s0bYy07XrG3f6TErispN0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246230; c=relaxed/simple; bh=ELy1SYX43E2A5YfHEENcygQp07Ma+0lnFG47zqjAuUo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rUU5A0ydXMp0COQWaNlKjdhLvkGJUchx+Uao3WU04/ih5a6XbgMXECzmmCCHpxUGnsbTdNTs+e/VJS/yjJ/KgtIkedQDO1BBKjjHJywnP0gDoyx9mtqu2ChrpjXcmE+ABDbFFEyVVHa6+LsWKRB3TH62qyJri20Cq8sTDn/49TI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=pDd8iOQU; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="pDd8iOQU" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4957eefd361so522555e9.1 for ; Thu, 20 Aug 2026 10:17:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246225; x=1787851025; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=6zjAEfquqUIqfee4UdVSzVIYDAGu85RBGZc/axrKJpc=; b=pDd8iOQUfJ7SsdY807lCQvF0Djh5+1UsqZGa3CmOz3WBRsXP3qpzm8Lluk8pSWCL8o CHrMdE8DxTqV5o2uesw4G3KLzhvv+5gqK6WvYhuWdmEytXRv+IBHbsy78O6oVA7rVkfY 4Q355gJzsT7GL8gqqONJT6APYfs3UR2CRmCRUIBSp8276OKxICDyIUoFUSVk9lV/U/b4 RB8M9bvleOcAiS8D2Td0eJR7h0YvGBN+0ncPwQVqDY7Ym5isGKy+540B3iuKmLVJx7E2 E9AV66iztqhVZHXsTVuxQNrWMb7Z0xUr66Lh/zKxBnrBGB5i4v1yn6zqrZyVhVPbT7ci o/cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246225; x=1787851025; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=6zjAEfquqUIqfee4UdVSzVIYDAGu85RBGZc/axrKJpc=; b=MnM3sIiDAok1MSRAja62oyWBiSYeXIORp+Xro3oIrkH6Ofl9UnX2SvW9EKXUgQD8RM A3VzxNe4W/kq2p0wk/b7EsE9cHxdkWv/JVAa/A+cho0tAfsc/fL+f4iARftRWIfSNc+L rKhiV+tUbyGqfBT0DuoYZcbOIQh5gC4Dfpon/l1XRrnZv8T38/rMYgabWO6wj35vu38T kNqfWZY/dw+fZdjv7P1CPkmL8hVzUFuHXCxjREXeXgsy2ZjYeb/wq7t/mmVgZCtKhugt rUvXmS+GqsqP4NpkvM0mmAIXZ+p4J3AZNdNSzOpSF8PCGuCzM0J9GSE/wpU0DzL24+5b N3fg== X-Forwarded-Encrypted: i=1; AHgh+RrnFto6LNvYdCdAf9h0azkqo01lD/u7Ep4X6+XA0p4NWf23dCIQG8laZc5xJBn+UI5y3xpaQ2PzHpOtq0M=@vger.kernel.org X-Gm-Message-State: AOJu0YzmAyx2E4TM23IG367odJwbrhdnJuTUajQulAiu0yVXV3kbWziC wWbaGxNa2kqLJc/gu8zJvLEb7gEG/FGZbIYA88kBR7A7RYLzYFASRV33 X-Gm-Gg: AR+sD12Gy6mouBY8eVn5s3xpxxikCPdA24gSoUwiale7s2KmdX6h/2OTb4mc9gco1Rn xPN6SDzgLp6me1BcMBk2P/xq/YQbJTejOC9DDiU1vp/IUzUhuNilBHpL73drX9jSoxigrP+pWOa PFofThg8VpVtXbM3HfTdUsdI2qrHXIcNetmcqWJWDsrc4MOKRP+0HyJbj3VgD8aPF+P1vO+ODYC +Kic/f3CbVm8Z/Wr0RUmNxJOQhuguzvYa/68Jk67382wjfwxT86lj6n5KMlxBB0h6T9pGKiDXEV OTsNa+2PfHDUzdti5P/F5NlWZ2kYCrjYbMvq3x+sTczYpJzEdbpIPP7JVSaVt+o9Wp7fCKIoWyL 5F/GCTKYPAJdHxsiv6PZUpgPRlafU2kp31y/SVNwhcbuy1B0LGf7FsaplcII6qMDtw1QOtCRPkr OxLoPy7iuZMHVb1BHJawJJ9lFzW5cZV4rTQFmaa5a4jpuB73TcXlR1JWU+dIFtIgOccHpH X-Received: by 2002:a05:600c:1548:b0:495:5fdf:2075 with SMTP id 5b1f17b1804b1-499b8277214mr10768745e9.0.1787246225271; Thu, 20 Aug 2026 10:17:05 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:03 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 06/15] mmc: renesas_sdhi: Make clock divider mask configurable Date: Thu, 20 Aug 2026 18:16:36 +0100 Message-ID: <20260820171657.62815-7-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das Add a clk_div_mask field to renesas_sdhi_of_data and tmio_mmc_data so each SoC can specify its own divider mask instead of the hardcoded CLK_CTL_DIV_MASK used in renesas_sdhi_set_clock(). Default to CLK_CTL_DIV_MASK at probe time when unset, and populate all existing internal/sys DMAC of_data tables with this value to keep current SoCs unaffected. This lets RZ/G3L, which has a wider divider field, reuse the same clock-setting code. Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * Updated commit description. * Replaced GENMASK(7, 0) with CLK_CTL_DIV_MASK. v22->v23: * Assigned of_data->clk_div_mask in renesas_sdhi_probe(). v21->v22: * Updated commit description. * Added clk_div_mask to of_default_cfg and of_rcar_gen2_compatible. v21: * New patch. --- drivers/mmc/host/renesas_sdhi.h | 1 + drivers/mmc/host/renesas_sdhi_core.c | 6 +++++- drivers/mmc/host/renesas_sdhi_internal_dmac.c | 3 +++ drivers/mmc/host/renesas_sdhi_sys_dmac.c | 4 ++++ include/linux/platform_data/tmio.h | 1 + 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdh= i.h index a1b2761ceccc..cef043d22dba 100644 --- a/drivers/mmc/host/renesas_sdhi.h +++ b/drivers/mmc/host/renesas_sdhi.h @@ -42,6 +42,7 @@ struct renesas_sdhi_of_data { unsigned long sdhi_flags; u64 clk_mask; int max_divider; + u16 clk_div_mask; }; =20 #define SDHI_CALIB_TABLE_MAX 32 diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index fbc0a8317b30..e11d357225a1 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -224,7 +224,7 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host= *host, clk &=3D ~SDHI_SD_CLK_CTL_DIV1; } =20 - clock =3D clk & CLK_CTL_DIV_MASK; + clock =3D clk & host->pdata->clk_div_mask; if (clock !=3D SDHI_SD_CLK_CTL_DIV1) host->mmc->actual_clock /=3D (1 << (ffs(clock) + 1)); =20 @@ -1138,6 +1138,7 @@ int renesas_sdhi_probe(struct platform_device *pdev, mmc_data->max_segs =3D of_data->max_segs; mmc_data->clk_mask =3D of_data->clk_mask; mmc_data->max_divider =3D of_data->max_divider; + mmc_data->clk_div_mask =3D of_data->clk_div_mask; dma_priv->dma_buswidth =3D of_data->dma_buswidth; host->bus_shift =3D of_data->bus_shift; /* Fallback for old DTs */ @@ -1186,6 +1187,9 @@ int renesas_sdhi_probe(struct platform_device *pdev, if (!mmc_data->max_divider) mmc_data->max_divider =3D SDHI_MAX_DIVIDER_DEFAULT; =20 + if (!mmc_data->clk_div_mask) + mmc_data->clk_div_mask =3D CLK_CTL_DIV_MASK; + dma_priv->filter =3D shdma_chan_filter; dma_priv->enable =3D renesas_sdhi_enable_dma; =20 diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/ho= st/renesas_sdhi_internal_dmac.c index 2bf354331b2d..b2622ea9ce20 100644 --- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c @@ -103,6 +103,7 @@ static const struct renesas_sdhi_of_data of_data_rza2 = =3D { .max_segs =3D 1, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, + .clk_div_mask =3D CLK_CTL_DIV_MASK, }; =20 static const struct renesas_sdhi_of_data of_data_rcar_gen3 =3D { @@ -122,6 +123,7 @@ static const struct renesas_sdhi_of_data of_data_rcar_g= en3 =3D { .sdhi_flags =3D SDHI_FLAG_NEED_CLKH_FALLBACK, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, + .clk_div_mask =3D CLK_CTL_DIV_MASK, }; =20 static const struct renesas_sdhi_of_data of_data_rcar_gen3_no_sdh_fallback= =3D { @@ -140,6 +142,7 @@ static const struct renesas_sdhi_of_data of_data_rcar_g= en3_no_sdh_fallback =3D { .max_segs =3D 1, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, + .clk_div_mask =3D CLK_CTL_DIV_MASK, }; =20 static const u8 r8a7796_es13_calib_table[2][SDHI_CALIB_TABLE_MAX] =3D { diff --git a/drivers/mmc/host/renesas_sdhi_sys_dmac.c b/drivers/mmc/host/re= nesas_sdhi_sys_dmac.c index bb66ff7de065..7a7d254fbba4 100644 --- a/drivers/mmc/host/renesas_sdhi_sys_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_sys_dmac.c @@ -30,6 +30,7 @@ static const struct renesas_sdhi_of_data of_default_cfg = =3D { .tmio_flags =3D TMIO_MMC_HAS_IDLE_WAIT, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, + .clk_div_mask =3D CLK_CTL_DIV_MASK, }; =20 static const struct renesas_sdhi_of_data of_rz_compatible =3D { @@ -40,6 +41,7 @@ static const struct renesas_sdhi_of_data of_rz_compatible= =3D { MMC_CAP_WAIT_WHILE_BUSY, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, + .clk_div_mask =3D CLK_CTL_DIV_MASK, }; =20 static const struct renesas_sdhi_of_data of_rcar_gen1_compatible =3D { @@ -49,6 +51,7 @@ static const struct renesas_sdhi_of_data of_rcar_gen1_com= patible =3D { .capabilities2 =3D MMC_CAP2_NO_WRITE_PROTECT, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, + .clk_div_mask =3D CLK_CTL_DIV_MASK, }; =20 /* Definitions for sampling clocks */ @@ -78,6 +81,7 @@ static const struct renesas_sdhi_of_data of_rcar_gen2_com= patible =3D { .max_blk_count =3D UINT_MAX / TMIO_MAX_BLK_SIZE, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, + .clk_div_mask =3D CLK_CTL_DIV_MASK, }; =20 static const struct of_device_id renesas_sdhi_sys_dmac_of_match[] =3D { diff --git a/include/linux/platform_data/tmio.h b/include/linux/platform_da= ta/tmio.h index e104718cf21f..e4232934c7fe 100644 --- a/include/linux/platform_data/tmio.h +++ b/include/linux/platform_data/tmio.h @@ -63,5 +63,6 @@ struct tmio_mmc_data { unsigned short max_segs; u64 clk_mask; int max_divider; + u16 clk_div_mask; }; #endif --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4E61247F77D for ; Thu, 20 Aug 2026 17:17:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246231; cv=none; b=eVSLF5FRovZs766kOy82ejhHr2Shduz830whlxMakNxUMkCgCxme/zs7Dlg6D3CTxEwrm+ciSlgjpR5th2GHEfKxjAYTmiOzt+MIbxszPgX2qyk1EJXm58dOcvMSCm6b1QyLlRqO3T0uUeJR9LN09qNhU5urJvMl6bsxjv1jIHA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246231; c=relaxed/simple; bh=bLrtTJTAuBtltqT4KT6hk3htf9Q9jGCVfNrCvvTJ3aM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AAuegSU/dK2HSbsVSwxQkPlqzS7wNJOckx94w5EGNWSk91yOUiN6n4aRieRCVrDGNzj5geV4HP5lU+fnhp0EMlgVQwko+p4bSyeFYbjd96rRajwiGcD28OeVY+QNUrT0KRDclWTfmUn4yj8mWagoPzxy7doP0r0ZWwPQliSwJ14= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iCqL+Kel; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iCqL+Kel" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-4956869750eso538995e9.2 for ; Thu, 20 Aug 2026 10:17:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246226; x=1787851026; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Uw7ZIY4K40hB6INAbjLrOXE3eSBXoJzhfQ1DFzL+dVo=; b=iCqL+KelarYgLIDP8t8GFmXHD6a2OOCi9FMNGImaBQRWvw4zZeZUBDZsd9VCtmj2Ke 6ypqQwZGjr5RjySvp0LJXz4ayquXsRlyDcC0L3PQ+Ahf1ifnjkyfSNvLrprDB/k188JM yinpVPvzeRLGo9cXh8/ur7f6YH+95bNU6o71mv4pqxaDf9pTHLSp0XrdBfIKg7lJlEYR Lqw5uMLwg7kbQAKkpBFZiRImzDIsRFzTqP3vy+z95UTkhQO+xwnu6pp9nBpvlacWLhUN lDj9ebpkZNYwBu5VJkM4MNKrfmjSQwANalv8Q7HVpkimYgCkgba3MpiWEwxxKX4Xxj3+ juKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246226; x=1787851026; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Uw7ZIY4K40hB6INAbjLrOXE3eSBXoJzhfQ1DFzL+dVo=; b=RCD/8fcptxY7yyy1bliUgeC4Vaup8opn5ExiYhrCxWYvZ62DqMdMjO1QNbvbUIAhYm Q3avmpGY9SiTkdEHZRnSFPoi0CORihNa4EJbBNYpKdeE092FWf+qEEzLNKLjPI+kBuWD JG5jTyyye/819FtphryNubUayUqVWenHS/R4MM/A21Hlt8EC5Yav2LppkTZleCmhqpbP owcUmeqm51Yw3CRF85Ww9EssJcLGNhmYvnN8Qx5yPFV7nEAHhlDxQzCph8qakXF6LFz7 C8yjQDurl5MKlaiG4o0JC0bD/t9IWoQBQeXmzdHuY4+HF7xCVbqwLSfKjj/C7a5mV9tr rT3Q== X-Forwarded-Encrypted: i=1; AHgh+RrZBbZKgK8ibWgBe56b1RcetAcLO29lM8llPbabONlSIXy3XCg29Rn2BGjwP6N7zqB4Hw5+Z4OyxP+MZts=@vger.kernel.org X-Gm-Message-State: AOJu0YwDrNcrGN5VKzBhVb4lLWIoY25PF2rvvKemmW0frSCfTRyJgrks tLzEaRv6pawc03pkeQ0sssaw9LD+1jif35pFpEwn9ZwtL/YmcSnGpWxl X-Gm-Gg: AR+sD12q/m/PqoZmP3s9HQfXeeE2zCI13lrjc6p9oScDxwreCrq8S9m8bZs1WWhj+cg QNBKVVHspGaaAz+eouyCnPEjU8Y8DMC+muEtuQAntO1/LPNxXa6yGC2xPG8//G7Ficbvj+WKzGA +LaY7Acocv/zaIu2SrMxv+QKFgrzc9lGf6Zjb54jGamfaP/p0jQKWYn9sX1bfftvI/OnkcpiUkH Gk+25YUeIGgHghX2THoQUyBWWvtESkw4XeNRl+ELN7Cued45KENyZy+PvOAqQSDJ7Exi/HNka00 sgMRrtT80/pYWYm5gB187JmAZImkewZ+VU5AGsFuN4MLSJOyutIOeEJQmsREbt5c1IEdsJVbTZZ ABwFLhMVliR5Za1ttZ7LshNEj3j8ZcQwENtVXcPBSCAlZIk7Qkwt3Dg8BGa1mFoR508p2QUYwvx XHFdHCpWKQsCTX0FqE/ocpR7f7BKo4KdjeRpogOZOsfnuFcoR2NEfdIRGZq8hwNshEIN/j X-Received: by 2002:a05:600c:1548:b0:493:aa0a:45ad with SMTP id 5b1f17b1804b1-499b828db5bmr10433165e9.2.1787246226358; Thu, 20 Aug 2026 10:17:06 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:05 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 07/15] mmc: renesas_sdhi: Add tuning delay support for RZ/G2L Date: Thu, 20 Aug 2026 18:16:37 +0100 Message-ID: <20260820171657.62815-8-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das RZ/G2L and later SoCs need a hardware adjustment delay written to SCC_TMPPORT2 on signal-voltage switch during tuning: 0x1 for 1.8V, 0x0 for 3.3V. Add a TMIO_MMC_TUNING_DELAY flag and renesas_sdhi_set_hw_adjustment_delay(), called from renesas_sdhi_start_signal_voltage_switch() after the regulator is set, and reset SCC_TMPPORT2 to 0 at the start of renesas_sdhi_execute_tuning() when the flag is set and tap_num =3D=3D 8. Add a dedicated of_data_rz_g2l descriptor with this flag and switch of_rzg2l_compatible to use it instead of the generic R-Car Gen3 descriptor. Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * Replaced GENMASK(7, 0) with CLK_CTL_DIV_MASK. v22->v23: * No change. v21->v22: * Updated commit description. * Added a renesas_sdhi_set_hw_adjustment_delay() call to renesas_sdhi_init_tuning(). v20->v21: * Added clk_div_mask to RZ/G2L of_data. v19->v20: * No change. v18->v19: * No change. v18: * New patch. --- drivers/mmc/host/renesas_sdhi_core.c | 88 ++++++++++++------- drivers/mmc/host/renesas_sdhi_internal_dmac.c | 22 ++++- include/linux/platform_data/tmio.h | 3 + 3 files changed, 78 insertions(+), 35 deletions(-) diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index e11d357225a1..ff428b6187bb 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -256,40 +256,6 @@ static int renesas_sdhi_card_busy(struct mmc_host *mmc) TMIO_STAT_DAT0); } =20 -static int renesas_sdhi_start_signal_voltage_switch(struct mmc_host *mmc, - struct mmc_ios *ios) -{ - struct tmio_mmc_host *host =3D mmc_priv(mmc); - struct renesas_sdhi *priv =3D host_to_priv(host); - struct pinctrl_state *pin_state; - int ret; - - switch (ios->signal_voltage) { - case MMC_SIGNAL_VOLTAGE_330: - pin_state =3D priv->pins_default; - break; - case MMC_SIGNAL_VOLTAGE_180: - pin_state =3D priv->pins_uhs; - break; - default: - return -EINVAL; - } - - /* - * If anything is missing, assume signal voltage is fixed at - * 3.3V and succeed/fail accordingly. - */ - if (IS_ERR(priv->pinctrl) || IS_ERR(pin_state)) - return ios->signal_voltage =3D=3D - MMC_SIGNAL_VOLTAGE_330 ? 0 : -EINVAL; - - ret =3D mmc_regulator_set_vqmmc(host->mmc, ios); - if (ret < 0) - return ret; - - return pinctrl_select_state(priv->pinctrl, pin_state); -} - /* SCC registers */ #define SH_MOBILE_SDHI_SCC_DTCNTL 0x000 #define SH_MOBILE_SDHI_SCC_TAPSET 0x002 @@ -350,6 +316,55 @@ static inline void sd_scc_write32(struct tmio_mmc_host= *host, writel(val, priv->scc_ctl + (addr << host->bus_shift)); } =20 +static void renesas_sdhi_set_hw_adjustment_delay(struct tmio_mmc_host *hos= t) +{ + struct renesas_sdhi *priv =3D host_to_priv(host); + + if (!(host->pdata->flags & TMIO_MMC_TUNING_DELAY)) + return; + + if (host->mmc->ios.signal_voltage =3D=3D MMC_SIGNAL_VOLTAGE_330) + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, 0x0); + else + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, 0x1); +} + +static int renesas_sdhi_start_signal_voltage_switch(struct mmc_host *mmc, + struct mmc_ios *ios) +{ + struct tmio_mmc_host *host =3D mmc_priv(mmc); + struct renesas_sdhi *priv =3D host_to_priv(host); + struct pinctrl_state *pin_state; + int ret; + + switch (ios->signal_voltage) { + case MMC_SIGNAL_VOLTAGE_330: + pin_state =3D priv->pins_default; + break; + case MMC_SIGNAL_VOLTAGE_180: + pin_state =3D priv->pins_uhs; + break; + default: + return -EINVAL; + } + + /* + * If anything is missing, assume signal voltage is fixed at + * 3.3V and succeed/fail accordingly. + */ + if (IS_ERR(priv->pinctrl) || IS_ERR(pin_state)) + return ios->signal_voltage =3D=3D + MMC_SIGNAL_VOLTAGE_330 ? 0 : -EINVAL; + + ret =3D mmc_regulator_set_vqmmc(host->mmc, ios); + if (ret < 0) + return ret; + + renesas_sdhi_set_hw_adjustment_delay(host); + + return pinctrl_select_state(priv->pinctrl, pin_state); +} + static unsigned int renesas_sdhi_init_tuning(struct tmio_mmc_host *host) { struct renesas_sdhi *priv; @@ -377,6 +392,8 @@ static unsigned int renesas_sdhi_init_tuning(struct tmi= o_mmc_host *host) =20 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DT2FF, priv->scc_tappos); =20 + renesas_sdhi_set_hw_adjustment_delay(host); + sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN | sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL)); =20 @@ -709,6 +726,9 @@ static int renesas_sdhi_execute_tuning(struct mmc_host = *mmc, u32 opcode) if (!priv->tap_num) return 0; /* Tuning is not supported */ =20 + if ((host->pdata->flags & TMIO_MMC_TUNING_DELAY) && priv->tap_num =3D=3D = 8) + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, 0); + if (priv->tap_num * 2 >=3D sizeof(priv->taps) * BITS_PER_BYTE) { dev_err(&host->pdev->dev, "Too many taps, please update 'taps' in tmio_mmc_host!\n"); diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/ho= st/renesas_sdhi_internal_dmac.c index b2622ea9ce20..f2c14ec680a8 100644 --- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c @@ -145,6 +145,26 @@ static const struct renesas_sdhi_of_data of_data_rcar_= gen3_no_sdh_fallback =3D { .clk_div_mask =3D CLK_CTL_DIV_MASK, }; =20 +static const struct renesas_sdhi_of_data of_data_rz_g2l =3D { + .tmio_flags =3D TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_CLK_ACTUAL | + TMIO_MMC_HAVE_CBSY | TMIO_MMC_MIN_RCAR2 | + TMIO_MMC_64BIT_DATA_PORT | TMIO_MMC_TUNING_DELAY, + .capabilities =3D MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | + MMC_CAP_CMD23 | MMC_CAP_WAIT_WHILE_BUSY, + .capabilities2 =3D MMC_CAP2_NO_WRITE_PROTECT | MMC_CAP2_MERGE_CAPABLE, + .bus_shift =3D 2, + .scc_offset =3D 0x1000, + .taps =3D rcar_gen3_scc_taps, + .taps_num =3D ARRAY_SIZE(rcar_gen3_scc_taps), + /* DMAC can handle 32bit blk count but only 1 segment */ + .max_blk_count =3D UINT_MAX / TMIO_MAX_BLK_SIZE, + .max_segs =3D 1, + .sdhi_flags =3D SDHI_FLAG_NEED_CLKH_FALLBACK, + .clk_mask =3D SDHI_CLK_MASK_DEFAULT, + .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, + .clk_div_mask =3D CLK_CTL_DIV_MASK, +}; + static const u8 r8a7796_es13_calib_table[2][SDHI_CALIB_TABLE_MAX] =3D { { 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10, 15, 16, 16, 16, 16, 16, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25 }, @@ -266,7 +286,7 @@ static const struct renesas_sdhi_of_data_with_quirks of= _r8a77990_compatible =3D { }; =20 static const struct renesas_sdhi_of_data_with_quirks of_rzg2l_compatible = =3D { - .of_data =3D &of_data_rcar_gen3, + .of_data =3D &of_data_rz_g2l, .quirks =3D &sdhi_quirks_rzg2l, }; =20 diff --git a/include/linux/platform_data/tmio.h b/include/linux/platform_da= ta/tmio.h index e4232934c7fe..abf4134a8bd8 100644 --- a/include/linux/platform_data/tmio.h +++ b/include/linux/platform_data/tmio.h @@ -50,6 +50,9 @@ /* Some controllers have a 64-bit wide data port register */ #define TMIO_MMC_64BIT_DATA_PORT BIT(12) =20 +/* Some controllers have tuning delay */ +#define TMIO_MMC_TUNING_DELAY BIT(13) + struct tmio_mmc_data { void *chan_priv_tx; void *chan_priv_rx; --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4EE9D484257 for ; Thu, 20 Aug 2026 17:17:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246232; cv=none; b=Vf+qEOQReEtob6XZNCAjBIJa1pTElKZZOSzbHOkxiQbcgGvyA84+JoIrHNMTHTyAsLMvKjvGWo7Iips8GBzAiKK5t7TYoNA7YGiEz+hx4qO7WoAb/r/4TuY+NlgOT8vhQr8guCziDqr9Nu9MHvfnJyftADZ0TVzlGgtxDHreLQ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246232; c=relaxed/simple; bh=uvEVZrsTmsZfHrJ6REwxpuKWQsGP/OMPoPdCJOMN3uw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nGnXu94CwYkwHn+CejqbJppb/XA05++srfBiimywB8nYrng96MSTyOx1W2jd+05dhXXqEb4qA+9XmI31Yh3nuixp/eqfW0NsOiBkkrbGQu1shisTK3Lq7Fpr0uX7jsgGEp1iaCcoAXJmFkzxSPOoFxi/ptAiLwGe8DEZYqD1mo0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ln8Jq261; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ln8Jq261" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-49554ebb87dso546685e9.3 for ; Thu, 20 Aug 2026 10:17:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246227; x=1787851027; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ZruPNUmecmT47tLASIyFaVykHI9/Lk+W+uqbdFD73Vo=; b=ln8Jq261fZGFwZJI0I9q4b/zC0bVXBwC+gY2dUmVR3dIzNXvCYGWisdA4jvhqL3Zk6 DKyEsvRMRHXKvvm13o4pK1uGVdEftkTEQjA6WzVq+7jPTixWyiYExf57FXJCnW1zgm0g bnnVsk81+qY3YLiPEkovisn0mPnqHOxnuFE2HT6lsUGnZXAVFNeMXROlB5mA2YQRifxg UeGPu4br62RG2HNdOTb3Vwcg9+tondSDN/2U5D7ENvhNiGC7vUmqBo/nS7zW1JaKdAJa aHSJf2ZzoMYN0KRo5Cb2P1veQf13+QhjzSAXyjfzL3Y9AM8OEPGun8kSqkx+OKGE5Q4V 4CVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246227; x=1787851027; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=ZruPNUmecmT47tLASIyFaVykHI9/Lk+W+uqbdFD73Vo=; b=fwlbjOv0kIWjgngDC5qeeeUBywaEnuh9I0b8fgZE55VbORXdO9xmuMtg+mPWCalTpu pGGyMVj6VGat8utbFsfqsAc84ZrR4pwg3xU+p+HDhRTAhyybUq8nYhM/KYeqaLI3DEY4 PNbYxe4f2hnBNd8iEODA+x3n88Bz3fGlbGUjHKHQ71xn2nr8QYhDhTjfrUbkNKqFYlel 5HYDhyx4Bc7Djyg30ZfmJux8V9fw31bQruOH095Jv00kyRO+QQ/aThu/6EXGtUYRimXl nhK8hq1RB47DL6T5LoKKZP0D4398mhzT3e1ac1N/FBYwVQeQ0PLg3cSXk5Wrgz8FRr6w 6voA== X-Forwarded-Encrypted: i=1; AHgh+RpLzrJQ6cgCr7tq1zPJ+odHDKaP8TrCdCqMd7lC0HPpz2VssM4vj2SWdxZcTvnn0ADZ7imzogIAJPIdRc4=@vger.kernel.org X-Gm-Message-State: AOJu0YxxQw8npztWbZhLCntKYsukbEkw9W3hN5HRyiHYZyom44AAOS6D YYA/mkmpcWxz1LiU2ybrLYJqthBEeRWjnuP3cRswIveFGAieR9nhoLDK X-Gm-Gg: AR+sD10v77dZLNEtkUeJC9p0dzcXBZtWkYIb5jEEqb0bjiyR5FOyN7T7Kmg3RgtbVum z5b9eUgjwCKzxBACk1bgI2BbMtreBGTVxEeGwwK/a85LaGAM3sAKeqp11cQcyNElH+SHzHKpx5J kfc5uTzq2ycyMoTiVAISED/pbxMHmbsxgft/bZOf/oybPyOKVs7QLgBmDz5js4+pIgnYzNUli4D Na/M0fiKpBVu4EljFwlK2FjwwCMg6gCDsDnS/x6T2MsSd74c5ib2QauTGVggmhhdyTh2md1ZgVX G3Q+fwtOkQ/QJBD1DG5BviZH3VDANrlET2jn9NIjpIktT2H2pPTMqYC/bMys31gPgxZlVsw/ZXV UTmYD9kG1zvddW85ZNk0LukmCXRjqMGS6jRIskATkDyeC0Gt/6ARSuNqEndRUSTG0q9GU5Lde3k LGiB/SjBx8tNAjuizDVbrsOp5QuCtUo8vxOFkch4iBlAjwH9w+K9URaol1pONh2rwhba4swJYAe A== X-Received: by 2002:a05:600c:3b08:b0:499:b402:6c0 with SMTP id 5b1f17b1804b1-499b830d671mr5964415e9.3.1787246227251; Thu, 20 Aug 2026 10:17:07 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:06 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 08/15] mmc: renesas_sdhi: Add TMIO_MMC_INTERNAL_DIVIDER flag Date: Thu, 20 Aug 2026 18:16:38 +0100 Message-ID: <20260820171657.62815-9-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das RZ/G3L has a fixed internal /2 clock divider active in all bus timing modes except HS400, where the divider is bypassed. Add a TMIO_MMC_INTERNAL_DIVIDER flag to mark controllers with this divider. Add renesas_sdhi_clk_get_rate() to fold the /2 division into the reported clock rate when the flag is set, and use it in renesas_sdhi_clk_update() in place of clk_get_rate(). HS400 is not yet supported in software for this SoC. Adjust clkh_shift for the internal divider case. No existing platform sets this flag, so this is infrastructure only, with no functional change for current SoCs. Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * No change. v22->v23: * Updated commit description. v21->v22: * Updated commit description. * Added renesas_sdhi_is_internal_divider_enabled() and renesas_sdhi_clk_get_rate() to simplify the clock rate logic. v20->v21: * No change. v19->v20: * No change. v18->v19: * Updated commit description. * Dropped divider variable from struct renesas_sdhi. * Updated renesas_sdhi_clk_update() to return rate for HS400mode and nonHS400mode(uses 1/2 internal divider). v18: * New patch using flag. --- drivers/mmc/host/renesas_sdhi_core.c | 31 +++++++++++++++++++++++++--- include/linux/platform_data/tmio.h | 3 +++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index ff428b6187bb..b5f2ff68db75 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -125,6 +125,27 @@ static int renesas_sdhi_clk_enable(struct tmio_mmc_hos= t *host) return 0; } =20 +static bool renesas_sdhi_is_internal_divider_enabled(struct tmio_mmc_host = *host) +{ + bool enable =3D false; + + if (host->pdata->flags & TMIO_MMC_INTERNAL_DIVIDER) + enable =3D true; + + return enable; +} + +static unsigned int renesas_sdhi_clk_get_rate(struct tmio_mmc_host *host, + struct clk *clk) +{ + unsigned int freq =3D clk_get_rate(clk); + + if (renesas_sdhi_is_internal_divider_enabled(host)) + freq /=3D 2; + + return freq; +} + static unsigned int renesas_sdhi_clk_update(struct tmio_mmc_host *host, unsigned int wanted_clock) { @@ -141,7 +162,7 @@ static unsigned int renesas_sdhi_clk_update(struct tmio= _mmc_host *host, * clock during tuning, so we don't change the external clock setup. */ if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2) || mmc_doing_tune(host->mm= c)) - return clk_get_rate(priv->clk); + return renesas_sdhi_clk_get_rate(host, priv->clk); =20 if (priv->clkh) { /* HS400 with 4TAP needs different clock settings */ @@ -184,10 +205,14 @@ static unsigned int renesas_sdhi_clk_update(struct tm= io_mmc_host *host, =20 clk_set_rate(ref_clk, best_freq); =20 - if (priv->clkh) + if (priv->clkh) { + if (host->pdata->flags & TMIO_MMC_INTERNAL_DIVIDER) + clkh_shift =3D 1; + clk_set_rate(priv->clk, best_freq >> clkh_shift); + } =20 - return clk_get_rate(priv->clk); + return renesas_sdhi_clk_get_rate(host, priv->clk); } =20 static void renesas_sdhi_set_clock(struct tmio_mmc_host *host, diff --git a/include/linux/platform_data/tmio.h b/include/linux/platform_da= ta/tmio.h index abf4134a8bd8..8d435f7690a5 100644 --- a/include/linux/platform_data/tmio.h +++ b/include/linux/platform_data/tmio.h @@ -53,6 +53,9 @@ /* Some controllers have tuning delay */ #define TMIO_MMC_TUNING_DELAY BIT(13) =20 +/* Some controllers have internal divider */ +#define TMIO_MMC_INTERNAL_DIVIDER BIT(14) + struct tmio_mmc_data { void *chan_priv_tx; void *chan_priv_rx; --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E3344481A87 for ; Thu, 20 Aug 2026 17:17:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246235; cv=none; b=RXeDgsE4FNBifaGrpR/GvSFNNmaMSKDHX2ISUc6iec/4P6s8HxmKya1wXERfU+rXcXmxHSlKdEwLbl7yxJvuhhoO5GT0COcIblUw44N3Qil3QGJ0e09rwRcb8muKXzTn5fpVLTSrkxIaflgyh/2tIyAMdYOb6VXf6tA85IKqkKE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246235; c=relaxed/simple; bh=09RqqplIdr6aOQ9UECulsqoZJISUbIr50rncFfrWAkI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q217McDukX/CUKrgVvBEwJfmFP+24cFQUTdDt32P/6U3cu3YHTSceHfXJj/RwP2PkrhZqfoDWZeP4BD4ZvDK+oxRnlTcSh6Qc9z5ZZBe6cZb0YRZ/X881iguYH+5kU+n2NGR3GNKy9WLeheYIWNVy61ExfQwj9mBrTXlpZ//6oM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=L3gCKOoT; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="L3gCKOoT" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-498028b3d5eso787955e9.1 for ; Thu, 20 Aug 2026 10:17:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246229; x=1787851029; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=qWMq2FvPjpeh+c3cKg73BE3wVk+QVZLulbIJQI7NR4w=; b=L3gCKOoT/12cw3h6gI0tlVb1rx4jN+bsMWlYM+JH0Pz2CtMwy9egrUdH/klWE7J1q4 60S7CUZFTV1d4oyok4yhA0F4bq5Iaez94qgsDafxTi/xHR3oIyhDiApvBhDnraPBiIDV 7s1s+TliVXQjm4ybqaXzpdhaX/7VoRbBqTLs8Wc66eqqtn/veEMLCI1nyQqlqCAV37bJ RgRWVrg5KGdjpwhicseON1RRWb4hqdpNTpBSk3Okc+PSja18IjtKzn9CV/D17yF7MJQJ E7fitCB3ij+L1mZGRr5+fJSwzKhZTfGV4wfE84YA75LkLlQ6RnTrWPZGBgqzrU9aFAg9 oTYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246229; x=1787851029; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=qWMq2FvPjpeh+c3cKg73BE3wVk+QVZLulbIJQI7NR4w=; b=fZ9EsxY5471mNxiYtHBBvCVQ9J6k10stUPMpAnZujfEJmlODc1xs5ovSA6/t8CVbUa JdaHhYVleJ41S/xRJZKP9/6TFDK4IIYKOUvKCueFoVlGzBbrz88XQpG+zAEeEEzJGZew 6nYSL7VokzN2vqSnK9XOSOaoeglSO5lNplYxxjgjGoKQ1yZ20wurF4yAlK5KioycrbhZ qlZo9WNk2HjGqlDzBkb/WS05FOVJZXxCHG8GiW+bJ2DKXVyzvtF3bCo+n/bPgJmwtinn QSrnoNWQwctGVaf1sVE4G5zautwzHyhx+BI3IFkwRiY9qhlGGZ/L3I/2Hae7eSRZYvWM q85Q== X-Forwarded-Encrypted: i=1; AHgh+Ro/1WXpUy/cUicDWJSBw7TvqmCn2hq1x5ges6/shYCWSJ8RR/ioFHVbZnBlSWb70nZbezjJUJks5IeTOhA=@vger.kernel.org X-Gm-Message-State: AOJu0Yx9lPCnXnju2UNoX/UKBQJP67JoXXevgiQ0s3qzOphex2n7uPIe AfV19HS7uFrN3W3Y93a7y8AWiwCz0S3mTzpjifV33SGYPD0Plx/usQKE X-Gm-Gg: AR+sD10JlVCfBbZymqbBfi7Zqwfue6XjTRbMc5LDw7UYIlax34tM8unIu6aW+ImVynk vLSdHlB8p2l9jGLw4GaKG46FMDLbj1l6Zo9THVjG82sO5mjPBJcxDiwnCfOPZa2znV3rJkfBpsC 4+f1Kc2INtzkiGxlY6fGzikJAA0/qbCo5rDEQdqgZcQeClan6F7hi0rs3OtGDYAezF8n23ZhYuc wrotVU+4BpM0GC2M+c7/5t2GuCYRVQc8yIAmgqaPH90jJt5sLXu5mKXKdmavuCkF3Z8FRPVcjss vDrHkNbPKCD14rSTuJNA12VAgoBrLh/jJtrh5lQ3dMs+fxTCRWLpfL1fQZ6T0sZRVSMfYKl+CHu 0hUKKLrF8YC6bZ8t1beBPL5Fxqi0voVGi1KwA8V0dv2l61OHvBPMeFTeGqEb4g/rI6SrthitIX7 WSuc5UAIs/dVky/mxOudf8+yIjJZY/HztszzJ21tNHE5tb6K4q9feMN7tn+2xwYamhP10m X-Received: by 2002:a05:600c:8105:b0:499:8b00:5261 with SMTP id 5b1f17b1804b1-499b831e255mr8632185e9.8.1787246229323; Thu, 20 Aug 2026 10:17:09 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:07 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson , Philipp Zabel Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 09/15] mmc: renesas_sdhi: Add optional axis/axim reset controls Date: Thu, 20 Aug 2026 18:16:39 +0100 Message-ID: <20260820171657.62815-10-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das The RZ/G3L SoC has axis/axim resets compared to other SoCs. Add two optional reset controls, rstc_axis and rstc_axim, to the renesas_sdhi struct. Both are acquired at probe time using devm_reset_control_get_optional_exclusive_deasserted() with the "axis" and "axim" reset names respectively. Include them alongside the existing rstc in bulk reset/assert/deassert operations: triggered together in renesas_sdhi_reset(), and managed via reset_control_bulk_assert/deassert() in the suspend and resume paths, replacing the previous single-control calls. Being optional, these resets are a no-op on platforms that do not provide them, so existing behaviour is preserved. Signed-off-by: Biju Das Reviewed-by: Wolfram Sang Tested-by: Geert Uytterhoeven --- v23->v24: * No change. v22->v23: * No change. v21->v22: * No change. v20->v21: * No change. v19->v20: * Fixed the ordering of resets in suspend/resume paths. V18->v19: * No change. v17->v18: * Fixed ordering of reset in renesas_sdhi_reset(). v1->v17: * No change. --- drivers/mmc/host/renesas_sdhi.h | 2 ++ drivers/mmc/host/renesas_sdhi_core.c | 26 +++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdh= i.h index cef043d22dba..25a313e9e7ac 100644 --- a/drivers/mmc/host/renesas_sdhi.h +++ b/drivers/mmc/host/renesas_sdhi.h @@ -102,6 +102,8 @@ struct renesas_sdhi { unsigned int tap_set; =20 struct reset_control *rstc; + struct reset_control *rstc_axis; + struct reset_control *rstc_axim; struct tmio_mmc_host *host; struct regulator_dev *rdev; }; diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index b5f2ff68db75..99f57f22a7b2 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -641,6 +641,8 @@ static void renesas_sdhi_reset(struct tmio_mmc_host *ho= st, bool preserve) sd_status =3D sd_ctrl_read32(host, CTL_SD_STATUS); =20 reset_control_reset(priv->rstc); + reset_control_reset(priv->rstc_axim); + reset_control_reset(priv->rstc_axis); /* Unknown why but without polling reset status, it will hang */ read_poll_timeout(reset_control_status, ret, ret =3D=3D 0, 1, 100, false, priv->rstc); @@ -1155,6 +1157,14 @@ int renesas_sdhi_probe(struct platform_device *pdev, if (IS_ERR(priv->rstc)) return PTR_ERR(priv->rstc); =20 + priv->rstc_axim =3D devm_reset_control_get_optional_exclusive_deasserted(= &pdev->dev, "axim"); + if (IS_ERR(priv->rstc_axim)) + return PTR_ERR(priv->rstc_axim); + + priv->rstc_axis =3D devm_reset_control_get_optional_exclusive_deasserted(= &pdev->dev, "axis"); + if (IS_ERR(priv->rstc_axis)) + return PTR_ERR(priv->rstc_axis); + priv->pinctrl =3D devm_pinctrl_get(&pdev->dev); if (!IS_ERR(priv->pinctrl)) { priv->pins_default =3D pinctrl_lookup_state(priv->pinctrl, @@ -1385,13 +1395,18 @@ int renesas_sdhi_suspend(struct device *dev) { struct tmio_mmc_host *host =3D dev_get_drvdata(dev); struct renesas_sdhi *priv =3D host_to_priv(host); + struct reset_control_bulk_data resets[] =3D { + { .rstc =3D priv->rstc_axis }, + { .rstc =3D priv->rstc_axim }, + { .rstc =3D priv->rstc }, + }; int ret; =20 ret =3D pm_runtime_force_suspend(dev); if (ret) return ret; =20 - ret =3D reset_control_assert(priv->rstc); + ret =3D reset_control_bulk_assert(ARRAY_SIZE(resets), resets); if (ret) pm_runtime_force_resume(dev); =20 @@ -1403,15 +1418,20 @@ int renesas_sdhi_resume(struct device *dev) { struct tmio_mmc_host *host =3D dev_get_drvdata(dev); struct renesas_sdhi *priv =3D host_to_priv(host); + struct reset_control_bulk_data resets[] =3D { + { .rstc =3D priv->rstc_axis }, + { .rstc =3D priv->rstc_axim }, + { .rstc =3D priv->rstc }, + }; int ret; =20 - ret =3D reset_control_deassert(priv->rstc); + ret =3D reset_control_bulk_deassert(ARRAY_SIZE(resets), resets); if (ret) return ret; =20 ret =3D pm_runtime_force_resume(dev); if (ret) - reset_control_assert(priv->rstc); + reset_control_bulk_assert(ARRAY_SIZE(resets), resets); =20 return ret; } --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 45616486B9A for ; Thu, 20 Aug 2026 17:17:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246238; cv=none; b=VpV8o3MT6WhxvVeda27YE1EhgspVSRruRifX2xuXJHse37d7B1JSdmEZr7menkgbbE+G+tnCaZtSYWf1teJjy3jZxKgiW7AV8pv73iwmkn+cJqN3sAWpNAOC6uObVs0TlfJOL4zZ7IRTjafLWbCnTF0ma+Gob//uMdcYbP9jG/0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246238; c=relaxed/simple; bh=Wn0Fttu7yxYczERMUEb7S+VTosmJt8StZV399ITfmHE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hr0hO7X5pmJ2Qh8gP5KYPuFjaIgN87l4rO+W8sBf5k2mM2mSQlErTTWQyQi31n7sAJY67kw0BvP2PcsXnyFNB2LY6Lp8BFOaUT+gu+oR8MUfDaNiCLQIT+cJQS3GBpj/H9z1N+21lbuMqu06U9sDObuaATmOlUPT7PI89Cx8bC4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BfFNlQRW; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BfFNlQRW" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-4956242332dso538275e9.2 for ; Thu, 20 Aug 2026 10:17:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246231; x=1787851031; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=xjNS5+CwaZyA0qQvtDzfd31asexWeBhEBr6vcNzwuKc=; b=BfFNlQRWtjdeb2P1US20VesJYyButzm3I9AYq+se1wIBEA1hIE4XxRDrWBwTNaEYm4 noUUtk7wmqAwY+uUvz5OLs+JngWKq1Vz0+5eGzEaODlqvraq0GYN4NXLFQcMFAV2i292 +ZTTYw8iJTxDVla+NbpRPNUTcGYPtoENVgKHfbk/Y2i6/JUV2+CIUrpTZNwmh6nSYQmo 7Nd7/dfxAh8+aXYOoCA18MYIeeJ0rVDWwbu4sZrLIYzesTk2F5P9kNwyelRKjejnNLT9 N1z8iITsFvMVdrO4RVIHPmPKeFCXPJ8kKaYL1OLX8RbAcvRBMYzOnXLrzNVkZQmcv5Db KXuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246231; x=1787851031; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=xjNS5+CwaZyA0qQvtDzfd31asexWeBhEBr6vcNzwuKc=; b=XqmwxvawNNBUmXjrVK8NcXylfF7J2FnRgh4LDl9XYWsb/4fDPkfTDFIQOQhFTJT3O9 JHmIXQ6NibRe7hmFjTf267gH60NFYksOc/LQoKWsgyHtY1hPCoanUj67fW3sbKZNUsP1 RZUO3ecpYGwRBSddfxVxQka4Fd2DfqLtrUbjLZOTh0HEseLtvURf3cUeX5VsUuVNjb8j jp60IHXK+apcCqg9cpBEMWwWFgElzZB6THQsyx7BO1DGbKyAOHbg+SN8ezcB33rTvTEG 9edFQIggGXSdECGpOfU5sUyDwoxaQrTBp+w0FG37GAV5UbqegH5wqE3/QBwTUqOIDBvJ Wj+g== X-Forwarded-Encrypted: i=1; AHgh+RoisfQsfGzevO4tfaLDAR05ohAmTIOhv8eKuzcqzH+owMZU0v+RbAdh+QIQxtRCcNQa7q1amzSbV6v0S5k=@vger.kernel.org X-Gm-Message-State: AOJu0YwpGpMvMEB0KoL1ZUiGsVaOSP0hdZ87/WSIxlirpMYynvzACzYV b8D+0OSU+w4vXnPmxqOwzFaYaTjfjwryicl3c2MS0ink0VlbCD0UE5NVX+ILCg== X-Gm-Gg: AR+sD10GUvkBhSxttgdYimzCaXJ1a1zs2zpFlBq3m93TIP9L7WxTNbJLtXTSo3kkeE9 bV5E+4tgxnsfZmMLPvP+UaPxv5pDFNYT4WVVnOUz4QJqfBpqAoqusv8djSVZwO3KLBrTqvywyoA 7D7mVts9HSV0MNi2rGvhmGyyti/KqK0XUPlZmD7+cMP1lmVFNh3PQN1kUOVH+nZrIUVGNp1vwi2 7b2lldScF5WpWwFZLiV+vbPqySUaPEO1Gh1vb57BjBoA/cuaQN+dTdTQFaG3O/JzgZ2PP6a536k ETo4oW7zc54w2VqTCeK3Zux5Ci8aR41yTMmRJ7Cx5TlFKXnFZ1JrEuyA6HtknPe4mjSLPeXS1gb kzfrDwKOGDAEpCJ+x1tjs1oadsADv+8EW6OzpiHotffyyLBU6QxuTNFrP6nFfJV7Uqrh+o2qVcp XRt2N+9CxxQJF2iKLgmLzw9OU2ylgg06WxcQZ1RLz3rMKvZC2sL/HHqITuEg+bMQZcIHmr X-Received: by 2002:a05:600c:3509:b0:499:8f9f:e9ee with SMTP id 5b1f17b1804b1-499b8337d36mr6144805e9.7.1787246230948; Thu, 20 Aug 2026 10:17:10 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:10 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 10/15] mmc: renesas_sdhi: Add write32_hook for CTL_SD_CARD_CLK_CTL register writes Date: Thu, 20 Aug 2026 18:16:40 +0100 Message-ID: <20260820171657.62815-11-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das Add a write32_hook, analogous to the existing write16_hook, so that sd_ctrl_write32() can wait for the SD bus to become idle before certain 32-bit register writes. renesas_sdhi_write32_hook() checks whether the target register is CTL_SD_CARD_CLK_CTL and, if so, waits for TMIO_STAT_SCLKDIVEN via renesas_sdhi_wait_idle() before the write proceeds. Other registers are unaffected. As with write16_hook, the write is skipped if the hook returns a non-zero error. Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * No change. v23: * New patch. --- drivers/mmc/host/renesas_sdhi_core.c | 9 +++++++++ drivers/mmc/host/tmio_mmc.h | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index 99f57f22a7b2..065e175f3b45 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -969,6 +969,14 @@ static int renesas_sdhi_write16_hook(struct tmio_mmc_h= ost *host, int addr) return 0; } =20 +static int renesas_sdhi_write32_hook(struct tmio_mmc_host *host, int addr) +{ + if (addr =3D=3D CTL_SD_CARD_CLK_CTL) + return renesas_sdhi_wait_idle(host, TMIO_STAT_SCLKDIVEN); + + return 0; +} + static int renesas_sdhi_multi_io_quirk(struct mmc_card *card, unsigned int direction, int blk_size) { @@ -1203,6 +1211,7 @@ int renesas_sdhi_probe(struct platform_device *pdev, } =20 host->write16_hook =3D renesas_sdhi_write16_hook; + host->write32_hook =3D renesas_sdhi_write32_hook; host->clk_enable =3D renesas_sdhi_clk_enable; host->clk_disable =3D renesas_sdhi_clk_disable; host->set_clock =3D renesas_sdhi_set_clock; diff --git a/drivers/mmc/host/tmio_mmc.h b/drivers/mmc/host/tmio_mmc.h index b9de03325c58..8d6d65a51be7 100644 --- a/drivers/mmc/host/tmio_mmc.h +++ b/drivers/mmc/host/tmio_mmc.h @@ -190,6 +190,7 @@ struct tmio_mmc_host { int (*multi_io_quirk)(struct mmc_card *card, unsigned int direction, int blk_size); int (*write16_hook)(struct tmio_mmc_host *host, int addr); + int (*write32_hook)(struct tmio_mmc_host *host, int addr); void (*reset)(struct tmio_mmc_host *host, bool preserve); bool (*check_retune)(struct tmio_mmc_host *host, struct mmc_request *mrq); void (*fixup_request)(struct tmio_mmc_host *host, struct mmc_request *mrq= ); @@ -284,6 +285,12 @@ static inline void sd_ctrl_write32_as_16_and_16(struct= tmio_mmc_host *host, =20 static inline void sd_ctrl_write32(struct tmio_mmc_host *host, int addr, u= 32 val) { + /* If there is a hook and it returns non-zero then there + * is an error and the write should be skipped + */ + if (host->write32_hook && host->write32_hook(host, addr)) + return; + iowrite32(val, host->ctl + (addr << host->bus_shift)); } =20 --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EE833486BBC for ; Thu, 20 Aug 2026 17:17:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246240; cv=none; b=mLT3yAFpg35tlh1KDeoWvplM6PtMBES8jE2PbKDcS8w0bJE26fyCYzlduIK+jHomhX/gyoveju335dEZXtu4d2p89c0mxT+CdD981zrnhDyIQxhM6cDtbsc2VLM5Z9dofVgPwRXILk+wxWJ/PgdKH3U6ASgN2IlNgl4XHdKOL2o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246240; c=relaxed/simple; bh=LOk7qbXopEe0VwmRtE5xKZPfKml37oZQS5FVnqfGio0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=rWSbeSy+gqSLTIkFRdSn02d67mDEUQik/8QJB1v8rIqNJX9vlMSACrT0otsHVizMmuDdjX7QDyP0s+lpBCL3E0odwAo2WpZi0EtcPLVqFjzzFi5SH0K9wMqUUdJbo4mRXBdAHIdqLdn8pja4A+9SXzHyIcW0kM7XnUz5UjuoFhU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=DEfD7aHv; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DEfD7aHv" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-4980dc26022so631765e9.1 for ; Thu, 20 Aug 2026 10:17:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246232; x=1787851032; darn=vger.kernel.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=PIbVu5FtxEZrMqJjZSFEHLUAWGt28dXmr5cqkgO1qng=; b=DEfD7aHv6aU18yf+r3w8mmjaWe9yfKIE+EyPsma4097ozBjCcpUFRSqK/8y4n/DLgE E39cK8kc9SoIeaq+R0BuhXYS7Hd4SqcgFyIRAnivkSjUoPErfwlhQ0YZrCqjKGlbko/d w8TG4FxNJ1cUMvmVc1QE1l8k3lCtu5LdcBp/KKwF16SQdq0m20Chu+JAHJtz6TWvbwH7 hjBlW2BQcor7NSGI6ci5yrEtORQqn0JPIaEId73p/U9oVyb3es+p2dUjJC946VsGJYlp n+53GwV004EbnZ2A5GpD8kVR0RAnaip1NwpCYld8X5iVwn1bO06MXlsvVmXZT7nRp2Rz SvrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246232; x=1787851032; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=PIbVu5FtxEZrMqJjZSFEHLUAWGt28dXmr5cqkgO1qng=; b=rYfFXbc47M/ItKD6t9uVvfFPj0qvzw/wAFAqVBnzSx4KMZHa1i/m7WZY40QQxMt6cb +zxM34b+lJIcAPt0C+GVVE7uF7ibnQyg2mRcpTX0++AIZ4eaKq0aMAqbHqUikpcBXlUr 2lMWazSOZuBGwPIsFc7UFvoMX5EKzS56FJ9FH1qfvyPF8azjScNSMjYfksVRlp0Q4o7K hus7WwXqWIGZ1eFzP8PLTcNBGzyk3LABZYGrDgT63a0dfop6iUMKTr+osaoPh714pOG7 SsDoni4qnYNud6rYVi9pzzz95MaXHjqQjunpODIVTVI6M+C/eeOfz13MnThWR0xrPFt6 IPqg== X-Forwarded-Encrypted: i=1; AHgh+Rr6ATgi0QOmW2G9Wh+Sm82TcZhruJ9fXvRZHNycijIgLjTqRiRgVLQOz8ttbiTEHjNdzuxbi8gxEfx/Y9Q=@vger.kernel.org X-Gm-Message-State: AOJu0Yyox/7ytIHogCwcvZiORfIW3uzJM5aMSERIq6uNxbo52x23eOvQ LWvE77Nf1H/+/lGx7NoPaY/olvL+rcJi/PHGzunMQTgG6ByGW3JAgCSC X-Gm-Gg: AR+sD13bUIOdCDDeaoTzBL246/Dq+5oeqIXe46L96jS5KEAHd978PIXv+aochYGn85J HNSWriK2IP619uObqspQ5v9D2OHrUt6jIutGejturXrCEpRms/UNErT1+Vhzj6a92XVCCSEPz3l 2wsdF9QXm94Zv6JyBhtzmPeLFKOZC/wM/+/X9rGFdCuF9GqOf7GoQiLFSVy4FLaFc23TGKBiZRN nu47uL8DOjyVosIfBmFMRF+4Jyanoh9OOIkJnxtGsBr15q4uyua15oUfTRg2c8xZiPsBM168Cqw 3z4W25RYuwHHWe6Am4C0U4q1hK0GI9DeCAPwRmYeJNDotpn3rXwr0lnwp3WhJvGXpPLK7isO6vD egeN5C7WVYPLcHUp5XsklBFidhIqBKISj1uWh/BOq3K3EzKOLuGVk5o6LHE+sFk6Oo0Gxx35vql +SXVZQKo3lt+DM5Bec1uMdMNyFTi+8/hyOzKbsdbTk7KMgyLRejkgVDpgByltTv28OnmjntDtPW lkmtpBl X-Received: by 2002:a05:600c:620c:b0:499:5210:c537 with SMTP id 5b1f17b1804b1-499b828dfcamr10609445e9.1.1787246231927; Thu, 20 Aug 2026 10:17:11 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:11 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 11/15] mmc: renesas_sdhi: Add RZ/G3L SDHI support Date: Thu, 20 Aug 2026 18:16:41 +0100 Message-ID: <20260820171657.62815-12-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Biju Das RZ/G3L (r9a08g046) has an SDHI controller that differs from existing platforms in clock divider width, a second HW adjustment register, and an extra tuning register. Add TMIO_MMC_HWADJ to mark controllers with a second HWADJ2 register (offset 0x010), programmed by renesas_sdhi_set_hw_adjustment_delay() alongside TMPPORT2 (0x3FFF at 3.3V, 0xFF at 1.8V). Clear the new HWADJ4 register (0x022) at tuning start when TMIO_MMC_INTERNAL_DIVIDER is set. Update renesas_sdhi_set_clock() to write the clock control register with a 32-bit access when max_divider isn't the default, moving bits [9:8] of the clock value into bits [17:16] of the register =E2=80=94 needed to drive RZ/G3L's wider 11-bit divider field via the max_divider/ clk_div_mask support added earlier in this series. Add SDHI_VER_RZ_G3L_SDMMC (0xce10) and handle it in renesas_sdhi_sdbuf_width(). Add of_data_rzg3l with RZ/G3L's wider clk_mask, an 11-bit max_divider of 2048, a dedicated tap table, and the relevant flags including TMIO_MMC_INTERNAL_DIVIDER and TMIO_MMC_HWADJ. Wire it up via of_rzg3l_compatible (fixed_addr_mode quirk) and register the "renesas,sdhi-r9a08g046" compatible string. Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * Replaced magic bits GENMASK(9, 8) and GENMASK(17, 16) with RZG3L_CLK_CTL_DIV9_DIV8 and RZG3L_CLK_CTL_DIV9_DIV8_SRC. v22->v23: * Updated tmio_mmc_reset() to handle 32 bit divider register in RZ/G3L. v21->v22: * Updated commit description. * Added `clock &=3D ~GENMASK(9, 8)` to clear the divider mask bits in the register value. v20->v21: * Added clk_div_mask to RZ/G3L of_data. * Restored actual_clk calculation in renesas_sdhi_set_clock(). v19->v20: * Added bitfield.h header file. * Reworked on renesas_sdhi_set_clock() to handle the 11-bit divider case and the 32-bit register write. v18->v19: * Update commit description. * Updated handling for clk divider. * Renamed TMIO_MMC_HWADJ2->TMIO_MMC_HWADJ to make it generic for hardware tuning delays * Dropped duplicate SH_MOBILE_SDHI_SCC_TMPPORT2 macro v18: * New patch. --- drivers/mmc/host/renesas_sdhi_core.c | 34 +++++++++++++++-- drivers/mmc/host/renesas_sdhi_internal_dmac.c | 38 +++++++++++++++++++ drivers/mmc/host/tmio_mmc_core.c | 13 ++++++- include/linux/platform_data/tmio.h | 3 ++ 4 files changed, 82 insertions(+), 6 deletions(-) diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index 065e175f3b45..d85db4541160 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -18,6 +18,7 @@ * */ =20 +#include #include #include #include @@ -59,9 +60,13 @@ #define SDHI_VER_GEN2_SDR104 0xcb0d #define SDHI_VER_GEN3_SD 0xcc10 #define SDHI_VER_GEN3_SDMMC 0xcd10 +#define SDHI_VER_RZ_G3L_SDMMC 0xce10 =20 #define SDHI_GEN3_MMC0_ADDR 0xee140000 =20 +#define RZG3L_CLK_CTL_DIV9_DIV8 GENMASK(17, 16) +#define RZG3L_CLK_CTL_DIV9_DIV8_SRC GENMASK(9, 8) + static void renesas_sdhi_sdbuf_width(struct tmio_mmc_host *host, int width) { u32 val; @@ -79,6 +84,7 @@ static void renesas_sdhi_sdbuf_width(struct tmio_mmc_host= *host, int width) break; case SDHI_VER_GEN3_SD: case SDHI_VER_GEN3_SDMMC: + case SDHI_VER_RZ_G3L_SDMMC: if (width =3D=3D 64) val =3D HOST_MODE_GEN3_64BIT; else if (width =3D=3D 32) @@ -253,7 +259,17 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_hos= t *host, if (clock !=3D SDHI_SD_CLK_CTL_DIV1) host->mmc->actual_clock /=3D (1 << (ffs(clock) + 1)); =20 - sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clock); + if (host->pdata->max_divider !=3D SDHI_MAX_DIVIDER_DEFAULT) { + u64 tmp; + + tmp =3D FIELD_GET(RZG3L_CLK_CTL_DIV9_DIV8_SRC, clk); + clock |=3D FIELD_PREP(RZG3L_CLK_CTL_DIV9_DIV8, tmp); + clock &=3D ~RZG3L_CLK_CTL_DIV9_DIV8_SRC; + sd_ctrl_write32(host, CTL_SD_CARD_CLK_CTL, clock); + } else { + sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clock); + } + if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2)) usleep_range(10000, 11000); =20 @@ -289,12 +305,14 @@ static int renesas_sdhi_card_busy(struct mmc_host *mm= c) #define SH_MOBILE_SDHI_SCC_RVSCNTL 0x008 #define SH_MOBILE_SDHI_SCC_RVSREQ 0x00A #define SH_MOBILE_SDHI_SCC_SMPCMP 0x00C -#define SH_MOBILE_SDHI_SCC_TMPPORT2 0x00E +#define SH_MOBILE_SDHI_SCC_TMPPORT2 0x00E /* G3L: SDm_SCC_HS400MODE1 */ +#define RZG3L_SDHI_SCC_HWADJ2 0x010 #define SH_MOBILE_SDHI_SCC_TMPPORT3 0x014 #define SH_MOBILE_SDHI_SCC_TMPPORT4 0x016 #define SH_MOBILE_SDHI_SCC_TMPPORT5 0x018 #define SH_MOBILE_SDHI_SCC_TMPPORT6 0x01A #define SH_MOBILE_SDHI_SCC_TMPPORT7 0x01C +#define RZG3L_SDHI_SCC_HWADJ4 0x022 =20 #define SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN BIT(0) #define SH_MOBILE_SDHI_SCC_DTCNTL_TAPNUM_SHIFT 16 @@ -344,14 +362,20 @@ static inline void sd_scc_write32(struct tmio_mmc_hos= t *host, static void renesas_sdhi_set_hw_adjustment_delay(struct tmio_mmc_host *hos= t) { struct renesas_sdhi *priv =3D host_to_priv(host); + bool hwadj2 =3D host->pdata->flags & TMIO_MMC_HWADJ; =20 if (!(host->pdata->flags & TMIO_MMC_TUNING_DELAY)) return; =20 - if (host->mmc->ios.signal_voltage =3D=3D MMC_SIGNAL_VOLTAGE_330) + if (host->mmc->ios.signal_voltage =3D=3D MMC_SIGNAL_VOLTAGE_330) { sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, 0x0); - else + if (hwadj2) + sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HWADJ2, 0x3FFF); + } else { sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, 0x1); + if (hwadj2) + sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HWADJ2, 0xFF); + } } =20 static int renesas_sdhi_start_signal_voltage_switch(struct mmc_host *mmc, @@ -418,6 +442,8 @@ static unsigned int renesas_sdhi_init_tuning(struct tmi= o_mmc_host *host) sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DT2FF, priv->scc_tappos); =20 renesas_sdhi_set_hw_adjustment_delay(host); + if (host->pdata->flags & TMIO_MMC_HWADJ) + sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HWADJ4, 0x0); =20 sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN | sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL)); diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/ho= st/renesas_sdhi_internal_dmac.c index f2c14ec680a8..3eccad143526 100644 --- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c @@ -88,6 +88,13 @@ static struct renesas_sdhi_scc rcar_gen3_scc_taps[] =3D { }, }; =20 +static struct renesas_sdhi_scc rzg3l_scc_taps[] =3D { + { + .clk_rate =3D 0, + .tap =3D 0x00000300, + }, +}; + static const struct renesas_sdhi_of_data of_data_rza2 =3D { .tmio_flags =3D TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_CLK_ACTUAL | TMIO_MMC_HAVE_CBSY, @@ -165,6 +172,27 @@ static const struct renesas_sdhi_of_data of_data_rz_g2= l =3D { .clk_div_mask =3D CLK_CTL_DIV_MASK, }; =20 +static const struct renesas_sdhi_of_data of_data_rzg3l =3D { + .tmio_flags =3D TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_CLK_ACTUAL | + TMIO_MMC_HAVE_CBSY | TMIO_MMC_MIN_RCAR2 | + TMIO_MMC_64BIT_DATA_PORT | TMIO_MMC_TUNING_DELAY | + TMIO_MMC_INTERNAL_DIVIDER | TMIO_MMC_HWADJ, + .capabilities =3D MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | + MMC_CAP_CMD23 | MMC_CAP_WAIT_WHILE_BUSY, + .capabilities2 =3D MMC_CAP2_NO_WRITE_PROTECT | MMC_CAP2_MERGE_CAPABLE, + .bus_shift =3D 2, + .scc_offset =3D 0x1000, + .taps =3D rzg3l_scc_taps, + .taps_num =3D ARRAY_SIZE(rzg3l_scc_taps), + /* DMAC can handle 32bit blk count but only 1 segment */ + .max_blk_count =3D UINT_MAX / TMIO_MAX_BLK_SIZE, + .max_segs =3D 1, + .sdhi_flags =3D SDHI_FLAG_NEED_CLKH_FALLBACK, + .clk_mask =3D 0x200000200, + .max_divider =3D 2048, + .clk_div_mask =3D GENMASK(9, 0), +}; + static const u8 r8a7796_es13_calib_table[2][SDHI_CALIB_TABLE_MAX] =3D { { 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10, 15, 16, 16, 16, 16, 16, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25 }, @@ -245,6 +273,10 @@ static const struct renesas_sdhi_quirks sdhi_quirks_rz= g2l =3D { .hs400_disabled =3D true, }; =20 +static const struct renesas_sdhi_quirks sdhi_quirks_rzg3l =3D { + .fixed_addr_mode =3D true, +}; + /* * Note for r8a7796 / r8a774a1: we can't distinguish ES1.1 and 1.2 as of n= ow. * So, we want to treat them equally and only have a match for ES1.2 to en= force @@ -304,6 +336,11 @@ static const struct renesas_sdhi_of_data_with_quirks o= f_rza2_compatible =3D { .quirks =3D &sdhi_quirks_fixed_addr, }; =20 +static const struct renesas_sdhi_of_data_with_quirks of_rzg3l_compatible = =3D { + .of_data =3D &of_data_rzg3l, + .quirks =3D &sdhi_quirks_rzg3l, +}; + static const struct of_device_id renesas_sdhi_internal_dmac_of_match[] =3D= { { .compatible =3D "renesas,sdhi-r7s9210", .data =3D &of_rza2_compatible, = }, { .compatible =3D "renesas,sdhi-mmc-r8a77470", .data =3D &of_rcar_gen3_co= mpatible, }, @@ -317,6 +354,7 @@ static const struct of_device_id renesas_sdhi_internal_= dmac_of_match[] =3D { { .compatible =3D "renesas,sdhi-r8a77990", .data =3D &of_r8a77990_compati= ble, }, { .compatible =3D "renesas,sdhi-r8a77995", .data =3D &of_rcar_gen3_nohs40= 0_compatible, }, { .compatible =3D "renesas,sdhi-r8a779md", .data =3D &of_rcar_gen3_nohs40= 0_compatible, }, + { .compatible =3D "renesas,sdhi-r9a08g046", .data =3D &of_rzg3l_compatibl= e, }, { .compatible =3D "renesas,sdhi-r9a09g011", .data =3D &of_rzg2l_compatibl= e, }, { .compatible =3D "renesas,sdhi-r9a09g057", .data =3D &of_rzg2l_compatibl= e, }, { .compatible =3D "renesas,rzg2l-sdhi", .data =3D &of_rzg2l_compatible, }, diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_c= ore.c index 775e0d9353d5..8a34f7d29396 100644 --- a/drivers/mmc/host/tmio_mmc_core.c +++ b/drivers/mmc/host/tmio_mmc_core.c @@ -182,10 +182,15 @@ static void tmio_mmc_set_bus_width(struct tmio_mmc_ho= st *host, static void tmio_mmc_reset(struct tmio_mmc_host *host, bool preserve) { u16 card_opt, clk_ctrl, sdif_mode; + u32 clk_ctrl_32; =20 if (preserve) { card_opt =3D sd_ctrl_read16(host, CTL_SD_MEM_CARD_OPT); - clk_ctrl =3D sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL); + if (host->pdata->flags & TMIO_MMC_INTERNAL_DIVIDER) + clk_ctrl_32 =3D sd_ctrl_read32(host, CTL_SD_CARD_CLK_CTL); + else + clk_ctrl =3D sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL); + if (host->pdata->flags & TMIO_MMC_MIN_RCAR2) sdif_mode =3D sd_ctrl_read16(host, CTL_SDIF_MODE); } @@ -217,7 +222,11 @@ static void tmio_mmc_reset(struct tmio_mmc_host *host,= bool preserve) =20 if (preserve) { sd_ctrl_write16(host, CTL_SD_MEM_CARD_OPT, card_opt); - sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clk_ctrl); + if (host->pdata->flags & TMIO_MMC_INTERNAL_DIVIDER) + sd_ctrl_write32(host, CTL_SD_CARD_CLK_CTL, clk_ctrl_32); + else + sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clk_ctrl); + if (host->pdata->flags & TMIO_MMC_MIN_RCAR2) sd_ctrl_write16(host, CTL_SDIF_MODE, sdif_mode); } diff --git a/include/linux/platform_data/tmio.h b/include/linux/platform_da= ta/tmio.h index 8d435f7690a5..e2273a262a23 100644 --- a/include/linux/platform_data/tmio.h +++ b/include/linux/platform_data/tmio.h @@ -56,6 +56,9 @@ /* Some controllers have internal divider */ #define TMIO_MMC_INTERNAL_DIVIDER BIT(14) =20 +/* Some controllers have hw adjustment delay */ +#define TMIO_MMC_HWADJ BIT(15) + struct tmio_mmc_data { void *chan_priv_tx; void *chan_priv_rx; --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0D17648423D for ; Thu, 20 Aug 2026 17:17:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246239; cv=none; b=RqyTKpCt/zWMO5jKNNJdxG5jzLZj6SYewtJWRodth9O3dAY2mq5SqsFn5dwxVd/NEbTpi7Ja/vs9AS+PMF6lOy5LnXjnGmsyzK78paoGTvFg19XQEwiXj2SfhZK+GtcRn0N4VQQT8RXvjBXq5Qu6+uQhBmI2PzBcEjmDfM2F/fI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246239; c=relaxed/simple; bh=T0n2OcsY7D0hezKJLYQT/Joj73872z/OFhoCfzbHJbM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TFohxnm5509UHJwPRmjNxMADnpkiVO2VBPkbx4cdO1K66CRca/eXqH1EZ9BSR8Zzw5aIpDqlNTZrD76nFKrQ6JzWsxOrMnLwpiYZp8TGkO8cfVCMIyZnxMu6MYJJauPYWH0zbyXV5loHiOX8aIkZzZbM0Ax+nLF96CLJDbJ061c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=If7Upj+b; arc=none smtp.client-ip=209.85.221.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="If7Upj+b" Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-47f59f25ec4so84147f8f.2 for ; Thu, 20 Aug 2026 10:17:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246233; x=1787851033; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=YqAj7jZF26Xz35brabY95dCAhY9r9WKkIDnDRdXuljE=; b=If7Upj+be4xOyS3urgky5bu73EJiusa7ZaE0bGynowLUE62LpxKJSlaY06sP5JYPmp sBNWSwiFlsc+WBf4qwzHTZLvuNoMPXCbJdw97KX+GAn2CDeHOXDhcMnZg+br7qcukZyR SeUR50P9KUNjZ36Qoql7KMcdjMRASonqa3j2DEMVLmx9y/rV2b+LXc8qEHMK8sWnc8JW uXMrOqw6hj+3gTIfJ88gXpGgVGJvqmWEHKd0xqO4BvO0Lch+Whrilsn8Sf/Lkp2fBSNH q1JBY4DdT6reniq5CuVD/mgd9W82op8Lh1tu7rI7TbVenQ4uBi/QPnSqIdafJwsc3pSa AEuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246233; x=1787851033; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=YqAj7jZF26Xz35brabY95dCAhY9r9WKkIDnDRdXuljE=; b=Gqi2XsX1JbJ6LGTfSdMSyTG9oyXH2wllMZdPcI3IZoC5PG97uTeizUpWvu/Tc9tayF EIura6I4C1J3UOYWWSVRCRBfajQWA5kO+LI5uRVZJvHBjizhg9/onP4Ds2FhfQWKabcU rVJpRSXKINRL4enGsG8tBMXgbuyTsmkTiAflZ1DbwO5PSh17rNVk/1ZLXujqRP4tNqnq R63k53R8rSX9R2LSWaRywCS3lf1/oVwPnJlUwvHdWYb8WqRvLpUkHJoyUlS9k/ilTQpr cLqxfgnufjeDccjsr+xBboX+/pFc0qzCZ5fTpuSAk3IJ9Q+qz3aeIKMZVWcDv6htbgfy We3Q== X-Forwarded-Encrypted: i=1; AHgh+RrbdkBUZ43QXLoPLXMHpMj5sR0C+6vakOrro4hSV5+qc42kO9rgjeWx6HgnwuFqrWIteVlyXwPP/zR7U8w=@vger.kernel.org X-Gm-Message-State: AOJu0YwonXKGdAmfOZNBZ5x6BXUqw+bBS8z2HU71Uf15CEFvggkwuVvl xMP8u4Rkn/RhsIYX8pC97Ugyqae6K/RvZmzXrjJzhfpD6BbqDxdJ9pS8 X-Gm-Gg: AR+sD12yvgjWgzB5VB8iOtVOkYEOYrG89OPcegBeRsBLg6eUAmauT9+d9ktMlSI9sAL /R/FrVJylt5F+rJ2YHFFXTIfdOx7JU86DnmjSfvFNWDrXYVlDKFvM6zapd0JGEAqLdWo5gPsAvk RJwwjqyaXDe4N2mx0KyWS1bb3713usKe9BxpAu43a0Hi/TRRQ9qa1U7J6lVFgHa260jH/JRBZYq tyO9oVxmvO31pE57wib96tcFsQkZpNr77+lJ8oX1/OwP3nqrNKHyLeNX3WHgqeMa25++ON/2W8S wKN/K9mVBasIMYYXcWPKeFEQH08e9F9tW2OYGXHu9QRPEt5a15VLRpvSE4/hu2v4HstqUWe8TzA UkmkfkLfbkRhWFf/A+b/y+NLosj3WBtWlkKxBGK9ucoZQnUzySmKfnS4P6iJK9Bv+4jlrXAJym1 Q5KYgvkfTO6Cd036i3l9hEOsnetb+1XDu/PGNsakyuAOD+WlNUUlQnHnsbCRtQCJsgnOtr X-Received: by 2002:a05:600c:a00e:b0:499:8b13:3a98 with SMTP id 5b1f17b1804b1-499b830d384mr9327625e9.4.1787246232707; Thu, 20 Aug 2026 10:17:12 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:12 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 12/15] mmc: renesas_sdhi: Save and restore IOVS across suspend/resume Date: Thu, 20 Aug 2026 18:16:42 +0100 Message-ID: <20260820171657.62815-13-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das The SD_STATUS register, specifically the IOVS (I/O Voltage Switch) bit, is not automatically restored after a suspend/resume cycle, causing the regulator to report an incorrect voltage on resume. Fix this by caching the CTL_SD_STATUS register value in the renesas_sdhi private struct at suspend time and writing it back during resume. The save/restore is only performed when a regulator device (rdev) is present, as the IOVS bit is only relevant in that context. Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * No change. v22->v23: * No change. v21->v22: * No change. v20->v21: * No change. v19->v20: * Updated resume() with scoped PM runtime call. v18->v19: * Updated suspend/resume with scoped runtime calls in suspend. v17->v18: * No change. v1->v17: * No change. --- drivers/mmc/host/renesas_sdhi.h | 2 ++ drivers/mmc/host/renesas_sdhi_core.c | 26 +++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdh= i.h index 25a313e9e7ac..dd650dd24b27 100644 --- a/drivers/mmc/host/renesas_sdhi.h +++ b/drivers/mmc/host/renesas_sdhi.h @@ -106,6 +106,8 @@ struct renesas_sdhi { struct reset_control *rstc_axim; struct tmio_mmc_host *host; struct regulator_dev *rdev; + + u32 cache_sd_status; }; =20 #define host_to_priv(host) \ diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index d85db4541160..2f5e02537a94 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -1437,6 +1437,15 @@ int renesas_sdhi_suspend(struct device *dev) }; int ret; =20 + if (priv->rdev) { + PM_RUNTIME_ACQUIRE_IF_ENABLED(dev, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret < 0) + return ret; + + priv->cache_sd_status =3D sd_ctrl_read32(host, CTL_SD_STATUS); + } + ret =3D pm_runtime_force_suspend(dev); if (ret) return ret; @@ -1466,8 +1475,23 @@ int renesas_sdhi_resume(struct device *dev) =20 ret =3D pm_runtime_force_resume(dev); if (ret) - reset_control_bulk_assert(ARRAY_SIZE(resets), resets); + goto err_assert; + + if (priv->rdev) { + PM_RUNTIME_ACQUIRE_IF_ENABLED(dev, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret < 0) + goto err_pm; + + sd_ctrl_write32(host, CTL_SD_STATUS, priv->cache_sd_status); + } + + return 0; =20 +err_pm: + pm_runtime_force_suspend(dev); +err_assert: + reset_control_bulk_assert(ARRAY_SIZE(resets), resets); return ret; } EXPORT_SYMBOL_GPL(renesas_sdhi_resume); --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 64322488DA0 for ; Thu, 20 Aug 2026 17:17:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246245; cv=none; b=fOyS7k2BKhOLAYZZlSejaM0BpFJIJDWLTPpqk45ujmwGlxDdJ1e6J9ZJYDnuPW8mhitxu+yGMVJjbdmdJFRBXHSozoIxiPksMQEF48EIDCNkbWQ8bMH20s5cUctJuoBCHW0B+/e5AQIGikfIhgqJPMIu/CsnojhPmPpQcZAg31I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246245; c=relaxed/simple; bh=U54RaZKAqZC8aHk39WCNLShm7fi09cuGQeTreWgZzWY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mr+aMTNjBzmC2FvwwebI57mB7ghOEgVnv1ewMmPur621H+oe/7q5ppHxmt88iI4LaHubcnph5AyrDZmiOMtiyQK5wnBiu76EoFFRPi3FSePWoYCNladG/WWGGKiowUT0xmmtw5nqk+om1mD3xfEPNkw35NFtVQx1VUwgGJbwaWY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=i353f/V/; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="i353f/V/" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-4980dc26022so632075e9.1 for ; Thu, 20 Aug 2026 10:17:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246234; x=1787851034; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=0T1NM5S7Ehgk9tTC+v8Mhk7l+caWHzRm98uhzY5VU74=; b=i353f/V/PdqCyGaw0VKaNckThx5pfVvumWyiE59Ogtjv9jOjszz6V5X03rHISkhKHB WmyqEkw3rmdDQNyQFm5kXyt7kLgfVzAiskHWBd7DcaRlOlkpWaklFjOnCXxOn3bGNbKM 8nT5jG7OQleWR0bUtSZAnM5v2nj2Y8NOCNBcj4b8PnkvVSH/UVp0NJkYOCN5rHWBfnhT GtInx3KA2vVlrH8BSjyLoBmcAGlTDIk2JBR0l+Rvum7T65HZJARDuto4i7tDhbaayYYL cPo2NJMWX3t7P4l60MCjiIdXrs0zY3bIDMYauqxz4EmKRJdL+BZuXdBxbuVWwNtwsFB6 +k4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246234; x=1787851034; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=0T1NM5S7Ehgk9tTC+v8Mhk7l+caWHzRm98uhzY5VU74=; b=L3RjuOFeGm1yw22B6KYCvXSSw22jLp6yXMbnYr8t79LfwohmYl8JDPV9LlXXkqiMHX scTGt1jDY5XI5yFZF44UEd0ZLVuABYCnhWq4eXYK/dOPj2GtqG/HOYTR/gIoCdi8ZQeR T/d9Ch9ndm18PG80EZm0xElxaC23//irEsjJjGpGkwPPoyHPZsPviH2rZMP+ln4B2ZgP KSYeF78ZMC/1wK1cQjJahkw9EkIBjJ2gTZQHN9jN/rERQDdmExomrDFSbaLdpI9mP0XF BwSVc8fttJa8e+2dsjWVbpNybnEtLhcmNoCZy7nnD0x5+1v82/qFfsvzmdKGfZNydy6H 5a8A== X-Forwarded-Encrypted: i=1; AHgh+Rq7sPj1ROUlYHS+RDsPlJViyqUPmx860YntDD9FgDzZ8VJurfe/py0y+VuvhfeLuPDQCrN5Yj2vSCrd11A=@vger.kernel.org X-Gm-Message-State: AOJu0YwuqrFKdvv7J1seefZOb+DwIsk9eqJ0YI/EcPDXC1bsCNbpovu0 bXHbEqdGxHgGvVb9W2DBl1YV3EOTKP5h1eDexU5wha5/IatfaJOnVwtH X-Gm-Gg: AR+sD13r1S4LCan9chDdYGV2daj9yjWawbtLelOqRmxPH9Ct5mRBfUoM6KS2ChDbt+y Q+FO7fR4gZ86uwPsz+BUzpLhi9j6dAsCaafqjDGwRkVqtoiEGf/OxrxX27P9etlf4eLRBlo8Hdo 1mRRL7OKa60AnvSMTCcxSjwTKudqaLADxi52kylh+puD8Me27+4s3s6O4uEN7th+0VzCZgcQiEI MJLLC1vGgR/cSerHAJQANR59ywKsbUQEEYAsNIdy8QONP/ClGdLJwrk1TxOLQeKKUVy6o9vVpFR Ki00PViQ6RtUiniCiSd22sffw7ukjHaWz5RZPOr2Fc39ZhutTpKV3jrC0o2wIxnbKLBmRIp0/TH +dWV4KDfvyOW7PON4o/WOR3EKlin3VxldMbyeLZifsM2vPoNsWbSdMgQlzZpzGmBUP0goynkEgc Gv0JvwH04niTjteh6jzVFVEipk9hsUQluQODhC3Ob58hpCt8lVo7ZD0uw4vkRisvTMDAE7 X-Received: by 2002:a05:600c:3486:b0:499:781e:25fc with SMTP id 5b1f17b1804b1-499b828e031mr11322555e9.3.1787246233653; Thu, 20 Aug 2026 10:17:13 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:13 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 13/15] mmc: renesas_sdhi: Make HS400 OSEL bit configurable per SoC Date: Thu, 20 Aug 2026 18:16:43 +0100 Message-ID: <20260820171657.62815-14-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das RZ/G3L and R-Car both use SH_MOBILE_SDHI_SCC_TMPPORT2 but interpret its bitfields differently. R-Car uses BIT(4) (HS400OSEL) to control HS400 data output timing, while RZ/G3L uses the lower 16 bits for tuning delay and does not require the OSEL bit. Remove the hardcoded SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL constant and replace it with a per-platform osel_tmpout field in both renesas_sdhi_of_data and tmio_mmc_data. The field is propagated during probe and consumed in renesas_sdhi_hs400_complete() and renesas_sdhi_reset_hs400_mode() when setting or clearing the HS400EN bit in TMPPORT2. Set osel_tmpout =3D BIT(4) explicitly on of_data_rcar_gen3 and of_data_rcar_gen3_no_sdh_fallback; platforms that omit it (such as RZ/G2L and RZ/G3L) default to zero, leaving the OSEL bit untouched during HS400 mode transitions. Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * No change. v22->v23: * No change. v21->v22: * No change. v20->v21: * No change. v19->v20: * No change. v18->v19: * No change. v18: * New patch. --- drivers/mmc/host/renesas_sdhi.h | 1 + drivers/mmc/host/renesas_sdhi_core.c | 6 +++--- drivers/mmc/host/renesas_sdhi_internal_dmac.c | 2 ++ include/linux/platform_data/tmio.h | 1 + 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdh= i.h index dd650dd24b27..7c562074d119 100644 --- a/drivers/mmc/host/renesas_sdhi.h +++ b/drivers/mmc/host/renesas_sdhi.h @@ -42,6 +42,7 @@ struct renesas_sdhi_of_data { unsigned long sdhi_flags; u64 clk_mask; int max_divider; + u32 osel_tmpout; u16 clk_div_mask; }; =20 diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index 2f5e02537a94..23332539ac65 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -330,7 +330,6 @@ static int renesas_sdhi_card_busy(struct mmc_host *mmc) #define SH_MOBILE_SDHI_SCC_SMPCMP_CMD_REQUP BIT(24) #define SH_MOBILE_SDHI_SCC_SMPCMP_CMD_ERR (BIT(8) | BIT(24)) =20 -#define SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL BIT(4) #define SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN BIT(31) =20 /* Definitions for values the SH_MOBILE_SDHI_SCC_TMPPORT4 register */ @@ -478,7 +477,7 @@ static void renesas_sdhi_hs400_complete(struct mmc_host= *mmc) =20 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, (SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN | - SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL) | + host->pdata->osel_tmpout) | sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2)); =20 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL, @@ -619,7 +618,7 @@ static void renesas_sdhi_reset_hs400_mode(struct tmio_m= mc_host *host, =20 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, ~(SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN | - SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL) & + host->pdata->osel_tmpout) & sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2)); =20 if (sdhi_has_quirk(priv, hs400_calib_table) || sdhi_has_quirk(priv, hs400= _bad_taps)) @@ -1228,6 +1227,7 @@ int renesas_sdhi_probe(struct platform_device *pdev, mmc_data->clk_mask =3D of_data->clk_mask; mmc_data->max_divider =3D of_data->max_divider; mmc_data->clk_div_mask =3D of_data->clk_div_mask; + mmc_data->osel_tmpout =3D of_data->osel_tmpout; dma_priv->dma_buswidth =3D of_data->dma_buswidth; host->bus_shift =3D of_data->bus_shift; /* Fallback for old DTs */ diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/ho= st/renesas_sdhi_internal_dmac.c index 3eccad143526..de570f7fc9c4 100644 --- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c @@ -130,6 +130,7 @@ static const struct renesas_sdhi_of_data of_data_rcar_g= en3 =3D { .sdhi_flags =3D SDHI_FLAG_NEED_CLKH_FALLBACK, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, + .osel_tmpout =3D BIT(4), .clk_div_mask =3D CLK_CTL_DIV_MASK, }; =20 @@ -149,6 +150,7 @@ static const struct renesas_sdhi_of_data of_data_rcar_g= en3_no_sdh_fallback =3D { .max_segs =3D 1, .clk_mask =3D SDHI_CLK_MASK_DEFAULT, .max_divider =3D SDHI_MAX_DIVIDER_DEFAULT, + .osel_tmpout =3D BIT(4), .clk_div_mask =3D CLK_CTL_DIV_MASK, }; =20 diff --git a/include/linux/platform_data/tmio.h b/include/linux/platform_da= ta/tmio.h index e2273a262a23..fecc61e082de 100644 --- a/include/linux/platform_data/tmio.h +++ b/include/linux/platform_data/tmio.h @@ -72,6 +72,7 @@ struct tmio_mmc_data { unsigned short max_segs; u64 clk_mask; int max_divider; + u32 osel_tmpout; u16 clk_div_mask; }; #endif --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5EDC3488D92 for ; Thu, 20 Aug 2026 17:17:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246241; cv=none; b=CsAufnlp9ABJE3HrMlSbKsU//tT6Z/UIbGiiZLXUTGKb8Om6aOiVFJiVWXInNYiWjA5NMcOdsNDCGQzoh4frVPV1wVNIdjjv1QoUPTk8IwIfB7YDra1qP8gXWh3TH4w7pIdNWyNIVUGeLff0P3IMyxXhXmT7f1xihxDp5FBiG5E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246241; c=relaxed/simple; bh=sYyllewJ3cgttHo6UftyUPHYObPBe0SizxN8dLtDyOI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L5DZNBBLVe1QEwH4m2+B2/wYlwaXHAFbsL5pPeVd8NVew6RLAgigkaRsKFYp7UxRmNptZzTZ35zOShF74TjtUUOB1f14xCpCXPpsa+d7C7GG0tGqEygU0GKGSOtgXlc32a+sBpEyCLoZIUuOmdSMysTNlfZE4tlmkpjBph6lHa4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ohkiDP9Y; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ohkiDP9Y" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-490cf322ed0so809025e9.1 for ; Thu, 20 Aug 2026 10:17:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246234; x=1787851034; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HSHbTPTM8Mxt+MBjuk5J1lN1jUlzEGCaJlBkk8fdSrE=; b=ohkiDP9Y7rM2L0tHoEQKGnCTWFCNkxOnZYK45sjBHD86gDlyXCw2QFIn9OXhM+o1bE o5KQowDZo8pI155rMJ65yaxpeJLKcta7/SN5OFajt2MDBYZnsKd4QLvrOuni60LxU8ZT r278KrvxUrX379y4vdER0mCbAHMLJ27no4IF5AvzahZ2/JCUnOpTu9xSsQIZkClRSsMU UkLA7dDg1HnTrxW4ukR4FqueZJbmaL7m6+o/UyDO5sNC2GqL6TnCOe8YmJ0klOdfaJlR VTbREYIzSgkC/IGUrjA31Cv0wxDNfN129UUAXrdLH7rlTqXwwLnAIK+uL4bKyJBBQtX6 IOyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246234; x=1787851034; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=HSHbTPTM8Mxt+MBjuk5J1lN1jUlzEGCaJlBkk8fdSrE=; b=UvSpMzmJ8FFyyu4zo0RkBOwf7vRfjZXFf2DUCb4d3RuriXo8VZje2nONLwCE2VctyE 6M4SGpg7V8ttbqSWt+zYyJte+R1BxGDMqp5AZ27/UJVTTp4lSIiikQtxJodmDM+dS170 n/0DZ7lgAGnIlzlzVbKE8aFavG69vkQ9M7FnzPHAC28eq+ebWcN72VsRSS2DKHzl28MA Xa8qBcNWR4Y+yNhuMKPfsHyEw0GyLHnehSGs0w+WLJ9st05q0zbuePXiIAH104IEEsy6 vKnfCPqcB2wabewSdpO9v2hI0qQ6kYoPj8mant9tjSsRWe/fZG/x6ixqLhlKvilIcwo+ t57A== X-Forwarded-Encrypted: i=1; AHgh+RrJJMMZqOa6IJsg6rq31DCv/wjUDF1d1p8dVrTWz2DPtWHk3I4779MbRHGfDOy1HScyTnGscZW0SPvNsj8=@vger.kernel.org X-Gm-Message-State: AOJu0YxaYxxdSkPjIARqTi7vr+5ss6G8qRxinFSyBUWpm7hyWasUZlvO AjZGsAPbmiP6382xqHz0C/t67cSA1K2rZ/fmvEP8Pow2/l9Fdez4bRwL X-Gm-Gg: AR+sD12XtFAsCOoSuiH2JcpVw95fuqLgkPihii/BNzcJCVDtf1PC2Ebf4z8Zs4HzQd9 nIj1VYrKjgmFtCsYyTVvzTs+D6TmlVjRxCxluAmq9S1hTozpaz9iCa5VrSJKrEMgX4AWTzaOMvL sLqkFkfx+ghIVOEk1Op1QJ9L7H2cLUQGi+CNzJmbBF15g0mHctzLnn+8/e3xMG7YDaJA3hDMUXJ qLuaSrF7iN8pBo/c06rDnA3d0BbatfaI9nlZk1NmollaWJNris59UfIc3eD8DpyD2V28/AiGDpK AOSB7MwOyDb/LvYSR3LqRAv3HrMC6+CCGzPKNTtijeC5BiMULPIBR381zcRc89KNq8KOM4ODSww ABH/iurbX4dHh7s3UKE3q2gEd0a6osbPgQi5I5G52URhbEi7YHHZ+0P2YfV5OP+MOecDOcjgpMp TNzahePDrUmrceAgDVbvUaOakGCACbsFnp2hB2ldkgU4fM643BOeBG4M4g1i+kCbcoGEqN X-Received: by 2002:a05:600c:4fc5:b0:499:b000:b828 with SMTP id 5b1f17b1804b1-499b830db9fmr7670915e9.4.1787246234380; Thu, 20 Aug 2026 10:17:14 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:14 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 14/15] mmc: renesas_sdhi: Add RZ/G3L HS400 support Date: Thu, 20 Aug 2026 18:16:44 +0100 Message-ID: <20260820171657.62815-15-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das Add HS400 support for the RZ/G3L SoC. RZ/G3L needs a second HS400 enable register, SDm_SCC_HS400MODE2 (offset 0x020), alongside the existing TMPPORT2 path. Add a TMIO_MMC_HS400MODE2 flag (bit 16) for controllers that need it. renesas_sdhi_hs400_complete() now also sets HS400EN2 in HS400MODE2 when the flag is set, and renesas_sdhi_reset_hs400_mode() clears it on exit. Add renesas_sdhi_set_tmpport() to mask off only the lower 16 bits (TMPOUT) of TMPPORT2 when writing it, preserving the upper bits on controllers with HS400MODE2, instead of the previous unconditional zero write. RZ/G3L HS400 supports only one divider value, so renesas_sdhi_set_clock() now forces the clock value to 0 before masking when HS400MODE2 is set and the internal divider isn't currently enabled, rejecting any other divider. This also completes renesas_sdhi_is_internal_divider_enabled() from earlier in the series, which now additionally checks that the current timing mode is not MMC_TIMING_MMC_HS400 before reporting the internal divider as enabled. Enable TMIO_MMC_HS400MODE2 in of_data_rzg3l to complete RZ/G3L HS400 support. Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * Simplified renesas_sdhi_set_tmpport(). * Replaced GENMASK(15, 0) with RZG3L_SDHI_SCC_HS400MODE1_TMPOUT. v22->v23: * No change. v21->v22: * Updated commit description * Added a renesas_sdhi_set_tmpport() helper to set delay values. * Added a check in renesas_sdhi_is_internal_divider_enabled() to return disabled status when in HS400 mode. v20->v21: * Updated renesas_sdhi_set_clock() for RZ/G3L HS400 clock handling as it supports only single clk divider value and other values are prohibited. * Updated commit description. v19->v20: * No change. v18->v19: * Updated commit description. * Fixed extra space in HS400MODE2 comment block. * Updated the comment HS400mode2->HS400MODE2. * Dropped the updation of clk handling as it is taken care in previous patches. v18: * New patch. --- drivers/mmc/host/renesas_sdhi_core.c | 40 +++++++++++++++++-- drivers/mmc/host/renesas_sdhi_internal_dmac.c | 3 +- include/linux/platform_data/tmio.h | 3 ++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index 23332539ac65..5d9d3c7dedf9 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -135,7 +135,8 @@ static bool renesas_sdhi_is_internal_divider_enabled(st= ruct tmio_mmc_host *host) { bool enable =3D false; =20 - if (host->pdata->flags & TMIO_MMC_INTERNAL_DIVIDER) + if ((host->pdata->flags & TMIO_MMC_INTERNAL_DIVIDER) && + host->mmc->ios.timing !=3D MMC_TIMING_MMC_HS400) enable =3D true; =20 return enable; @@ -255,6 +256,14 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_hos= t *host, clk &=3D ~SDHI_SD_CLK_CTL_DIV1; } =20 + /* + * RZ/G3L SoC HS400 mode has only 1 divider value. + * Other divider values are prohibited + */ + if ((host->pdata->flags & TMIO_MMC_HS400MODE2) && + !renesas_sdhi_is_internal_divider_enabled(host)) + clk =3D 0; + clock =3D clk & host->pdata->clk_div_mask; if (clock !=3D SDHI_SD_CLK_CTL_DIV1) host->mmc->actual_clock /=3D (1 << (ffs(clock) + 1)); @@ -312,6 +321,7 @@ static int renesas_sdhi_card_busy(struct mmc_host *mmc) #define SH_MOBILE_SDHI_SCC_TMPPORT5 0x018 #define SH_MOBILE_SDHI_SCC_TMPPORT6 0x01A #define SH_MOBILE_SDHI_SCC_TMPPORT7 0x01C +#define RZG3L_SDHI_SCC_HS400MODE2 0x020 #define RZG3L_SDHI_SCC_HWADJ4 0x022 =20 #define SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN BIT(0) @@ -344,6 +354,9 @@ static int renesas_sdhi_card_busy(struct mmc_host *mmc) #define SH_MOBILE_SDHI_SCC_TMPPORT_DISABLE_WP_CODE 0xa5000000 #define SH_MOBILE_SDHI_SCC_TMPPORT_CALIB_CODE_MASK 0x1f #define SH_MOBILE_SDHI_SCC_TMPPORT_MANUAL_MODE BIT(7) +#define RZG3L_SDHI_SCC_HS400MODE2_HS400EN2 BIT(0) + +#define RZG3L_SDHI_SCC_HS400MODE1_TMPOUT GENMASK(15, 0) =20 static inline u32 sd_scc_read32(struct tmio_mmc_host *host, struct renesas_sdhi *priv, int addr) @@ -358,6 +371,18 @@ static inline void sd_scc_write32(struct tmio_mmc_host= *host, writel(val, priv->scc_ctl + (addr << host->bus_shift)); } =20 +static void renesas_sdhi_set_tmpport(struct tmio_mmc_host *host, u32 tmppo= rt) +{ + struct renesas_sdhi *priv =3D host_to_priv(host); + u32 val =3D tmpport; + + if (host->pdata->flags & TMIO_MMC_HS400MODE2) + val |=3D sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2) & + ~RZG3L_SDHI_SCC_HS400MODE1_TMPOUT; + + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, val); +} + static void renesas_sdhi_set_hw_adjustment_delay(struct tmio_mmc_host *hos= t) { struct renesas_sdhi *priv =3D host_to_priv(host); @@ -367,11 +392,11 @@ static void renesas_sdhi_set_hw_adjustment_delay(stru= ct tmio_mmc_host *host) return; =20 if (host->mmc->ios.signal_voltage =3D=3D MMC_SIGNAL_VOLTAGE_330) { - sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, 0x0); + renesas_sdhi_set_tmpport(host, 0x0); if (hwadj2) sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HWADJ2, 0x3FFF); } else { - sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, 0x1); + renesas_sdhi_set_tmpport(host, 0x1); if (hwadj2) sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HWADJ2, 0xFF); } @@ -480,6 +505,10 @@ static void renesas_sdhi_hs400_complete(struct mmc_hos= t *mmc) host->pdata->osel_tmpout) | sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2)); =20 + if (host->pdata->flags & TMIO_MMC_HS400MODE2) + sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HS400MODE2, + RZG3L_SDHI_SCC_HS400MODE2_HS400EN2); + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL, SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN | sd_scc_read32(host, priv, @@ -621,6 +650,9 @@ static void renesas_sdhi_reset_hs400_mode(struct tmio_m= mc_host *host, host->pdata->osel_tmpout) & sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2)); =20 + if (host->pdata->flags & TMIO_MMC_HS400MODE2) + sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HS400MODE2, 0x0); + if (sdhi_has_quirk(priv, hs400_calib_table) || sdhi_has_quirk(priv, hs400= _bad_taps)) renesas_sdhi_adjust_hs400_mode_disable(host); =20 @@ -779,7 +811,7 @@ static int renesas_sdhi_execute_tuning(struct mmc_host = *mmc, u32 opcode) return 0; /* Tuning is not supported */ =20 if ((host->pdata->flags & TMIO_MMC_TUNING_DELAY) && priv->tap_num =3D=3D = 8) - sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, 0); + renesas_sdhi_set_tmpport(host, 0); =20 if (priv->tap_num * 2 >=3D sizeof(priv->taps) * BITS_PER_BYTE) { dev_err(&host->pdev->dev, diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/ho= st/renesas_sdhi_internal_dmac.c index de570f7fc9c4..afe259c1566d 100644 --- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c @@ -178,7 +178,8 @@ static const struct renesas_sdhi_of_data of_data_rzg3l = =3D { .tmio_flags =3D TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_CLK_ACTUAL | TMIO_MMC_HAVE_CBSY | TMIO_MMC_MIN_RCAR2 | TMIO_MMC_64BIT_DATA_PORT | TMIO_MMC_TUNING_DELAY | - TMIO_MMC_INTERNAL_DIVIDER | TMIO_MMC_HWADJ, + TMIO_MMC_INTERNAL_DIVIDER | TMIO_MMC_HWADJ | + TMIO_MMC_HS400MODE2, .capabilities =3D MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | MMC_CAP_CMD23 | MMC_CAP_WAIT_WHILE_BUSY, .capabilities2 =3D MMC_CAP2_NO_WRITE_PROTECT | MMC_CAP2_MERGE_CAPABLE, diff --git a/include/linux/platform_data/tmio.h b/include/linux/platform_da= ta/tmio.h index fecc61e082de..88a3744f965a 100644 --- a/include/linux/platform_data/tmio.h +++ b/include/linux/platform_data/tmio.h @@ -59,6 +59,9 @@ /* Some controllers have hw adjustment delay */ #define TMIO_MMC_HWADJ BIT(15) =20 +/* Some controllers have HS400MODE2 */ +#define TMIO_MMC_HS400MODE2 BIT(16) + struct tmio_mmc_data { void *chan_priv_tx; void *chan_priv_rx; --=20 2.43.0 From nobody Mon Sep 28 15:34:36 2026 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 83BC247F774 for ; Thu, 20 Aug 2026 17:17:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246242; cv=none; b=aUWhsuXMAAM5ExHo8YUXudqt2UtJQNR1z4Zt0Sfu44gpzWI12/eDew7XOtd5qhACIc9gbDnTQ9oU177D2bphsD+26ympXpWBRjIBO34Wtg5wggwjEHqcwps+2DsoEKCXIgOUoYUX56zgkRhX/Y0Sxtg/GoJUYaj74Ks/HI1d4p4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787246242; c=relaxed/simple; bh=/D3sAoqU+MeT14mSSA6gTS+Z3nkAtgml2Luib8E7qmc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gW31TkCukiXMPXGi4M6joz5jGE6NPG/f5YR6egUEwkd2iSXxr8JMRJmCWWj+i4obPoHB6Xc/5e8Fdra51wiVO6TcnR184INmIGe3CN5pCfy5RKvlrXrnPngk0cK3Wz3EkqwgWwTa/4hwizh0a2JnneXy8y70hXmVdiVexQyAvUU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iTVVAIOD; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iTVVAIOD" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-4995b0343c1so505895e9.3 for ; Thu, 20 Aug 2026 10:17:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787246235; x=1787851035; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=VXrYMLQOAJ1MDGDIN0etPVycCMAfznFnFAv9LaQaKX4=; b=iTVVAIODoeyz5+FlDz/SUJ9MVH2cgevOtcyYtZZb2+UZP38Xw7mrNrUxv27vFk4W0q tZ6kOp5UW8Vy9Y6dx6sDRZ9wMx0T+d7Ib8ArRbTv/DNFOx7UGX0okFpx7llEIoVFX62r 43gVRI5fGMZlcR4zcIJF+2HzdCLk1aUexExChqmSwR3h1d2wwuQLxP+C+Fnrd/T5gUaA x5okTEStZZaiXI5dskrVsWQ++WQEQ23lIb9+tmYHtHhiO3FnxbWIjdb5l5fDFRobW5fm SI8JO0ImAvUHxWcxKGmGzeowtHbajDiHTtFo5X9E1Zi7V9xvPlctMv8zr4Cumawh1c6Z h1Rg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787246235; x=1787851035; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=VXrYMLQOAJ1MDGDIN0etPVycCMAfznFnFAv9LaQaKX4=; b=JIPuxEm5j1yX+e6rAzLcFU/jZj0It9jf/aevAV6YjRdRjY8cl7AleR3KaLdWdfl6ul 0fUOno5bWV+NV1hnwjIc43ieWYVqV3IS25kSxQzYELF5AjRpvvt1tgmmcHDt3lnePmFg JRvvHwm5gOxlE2aaP3gDzc/UDcoMalnscWumYogryTt6QwSXeeGcn5tpJSqQrCnCfS84 anSt1fckpxeYhC/iwTWVU/Vimc/eRm8guWKbxCcey6xC+QFPJo0y+YjVbc5VbeKWOzOt UY0Y6d6+ps2c86UJjpr+clOZ1CIUh9crTIeDqikkltmWS9vvOO+159c85ofAFtJdKiH7 35DQ== X-Forwarded-Encrypted: i=1; AHgh+Rr3noRdhAzv09Beg+xGHP4o0DqllYBovGHENzcvqhHMlrCEeweXVcvFF8EEk7GghZQO2H9Xh2QTg08j9jU=@vger.kernel.org X-Gm-Message-State: AOJu0Yzf+wQ1GjFj9PejFlT0B8RbK5ySBUDDuf1g4U4iQ2UKNQuWey39 grtYWKhD2tKdmw6jc6ZD6Du+N7yXPDoarxwG9DbDa0E4qw6OTyBjWS9Z X-Gm-Gg: AR+sD121HcNgX5aRuSy+KqBJ0NTqA6hvIqfEhOb1cUPyYmD/l7IF/vkP9cVRX0bKH7y FALF18W37Sgknec0sdHHQjXu4Gsdb7Poo7XJnc6Zmq4TS7PXLb5z1vSQ7lavx5IY/f1MyTszTeC m6Kq6h+25+/7ANRlp38KRxF4XBQZkqHlnxawQTWk35r4iEFmMIavoNOSeSu3k51B7smHD6wSRfx DuxfrtIdJae7iVKikWJWc+lASX3CPG9za1Cy/VxqZNcqH6D9zfQcQuYqlHsWStSOJd0g1zGM5Vr P7y4wtVD1vTg+GivRQ7r6xZXzgMXUFUMxS94GhaTCeeTJc2NqaL1gXG8hHLZYe59sWNeg8IUyPW J54otYBEUqD94R5+KPwm+LeqcUcPcZNPcEmxmw/ld7lXRU1I6hx4eQ7WvHWGFqRL17fMv7/4Yf+ XibzcTR8LZIcXqyrs/d/oyzZchFJWs/6dUPjfnnZV5aNn38zhYRimrJmpB4qtkcQFOf7Y4 X-Received: by 2002:a05:600c:a088:b0:499:7a19:408b with SMTP id 5b1f17b1804b1-499b83572bbmr8819065e9.11.1787246235358; Thu, 20 Aug 2026 10:17:15 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a702:d301:eda0:8ef1:e1ab:c2b1]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499aa0fd728sm219313495e9.3.2026.08.20.10.17.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Aug 2026 10:17:14 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Wolfram Sang , Ulf Hansson Cc: Biju Das , linux-mmc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das Subject: [PATCH v24 15/15] mmc: renesas_sdhi: Add HS400 enhanced strobe support for RZ/G3L Date: Thu, 20 Aug 2026 18:16:45 +0100 Message-ID: <20260820171657.62815-16-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> References: <20260820171657.62815-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das RZ/G3L's HS400 enhanced strobe mode needs extra SCC register programming beyond the standard HS400 path. Add a TMIO_MMC_HS400ES flag (bit 17) for controllers that support it. Add renesas_sdhi_hs400_enhanced_strobe(), registered as host->ops.hs400_enhanced_strobe when the flag is set. On enable, it clears DTSEL and TAPEN, programs TMPPORT3 and HWADJ2, sets the HS400 interface bit in SDIF_MODE, sets HS400EN2 in HS400MODE2, and sets HS400EN plus the new HS400MODE1_ENHANCED_STROBE bit in TMPPORT2. On disable, only the enhanced-strobe-related bits are cleared. Also mask off HS400MODE1_ENHANCED_STROBE in renesas_sdhi_reset_hs400_mode() when TMIO_MMC_HS400ES is set, for a clean reset on mode exit. Since a controller reset clears these SCC registers, renesas_sdhi_reset() now re-invokes renesas_sdhi_hs400_enhanced_strobe() after reset whenever TMIO_MMC_HS400ES is set and the controller is currently in HS400 with enhanced strobe active, restoring the enhanced-strobe state instead of losing it across a reset. Enable TMIO_MMC_HS400ES in of_data_rzg3l to finalize RZ/G3L HS400 support. Signed-off-by: Biju Das Tested-by: Geert Uytterhoeven --- v23->v24: * No change. v22->v23: * No change. v21->v22: * Updated commit description. * Restored the patch after fixing inode corruption. * renesas_sdhi_reset() now restores data strobe register values after reset. v20->v21: * Dropped the patch due to inode corruption during boot. v19->v20: * SD_CLK_CTRL clk enable turned off before updating SCC_CKSEL_DTSEL register. v18->v19: * Updated commit description. * HS400ES support is enabled based on of_data. * Fixed the space in HS400ES comment block. v18: * New patch. --- drivers/mmc/host/renesas_sdhi_core.c | 68 +++++++++++++++++-- drivers/mmc/host/renesas_sdhi_internal_dmac.c | 2 +- include/linux/platform_data/tmio.h | 3 + 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesa= s_sdhi_core.c index 5d9d3c7dedf9..fc58f2188852 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -340,7 +340,8 @@ static int renesas_sdhi_card_busy(struct mmc_host *mmc) #define SH_MOBILE_SDHI_SCC_SMPCMP_CMD_REQUP BIT(24) #define SH_MOBILE_SDHI_SCC_SMPCMP_CMD_ERR (BIT(8) | BIT(24)) =20 -#define SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN BIT(31) +#define SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN BIT(31) +#define SH_MOBILE_SDHI_SCC_HS400MODE1_ENHANCED_STROBE BIT(30) =20 /* Definitions for values the SH_MOBILE_SDHI_SCC_TMPPORT4 register */ #define SH_MOBILE_SDHI_SCC_TMPPORT4_DLL_ACC_START BIT(0) @@ -636,6 +637,8 @@ static void renesas_sdhi_adjust_hs400_mode_disable(stru= ct tmio_mmc_host *host) static void renesas_sdhi_reset_hs400_mode(struct tmio_mmc_host *host, struct renesas_sdhi *priv) { + u32 val =3D ~(SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN | host->pdata->osel_tmp= out); + sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN & sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL)); =20 @@ -645,10 +648,11 @@ static void renesas_sdhi_reset_hs400_mode(struct tmio= _mmc_host *host, =20 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DT2FF, priv->scc_tappos); =20 + if (host->pdata->flags & TMIO_MMC_HS400ES) + val &=3D ~SH_MOBILE_SDHI_SCC_HS400MODE1_ENHANCED_STROBE; + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, - ~(SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN | - host->pdata->osel_tmpout) & - sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2)); + val & sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2)); =20 if (host->pdata->flags & TMIO_MMC_HS400MODE2) sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HS400MODE2, 0x0); @@ -679,6 +683,53 @@ static void renesas_sdhi_scc_reset(struct tmio_mmc_hos= t *host, struct renesas_sd sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL)); } =20 +static void renesas_sdhi_hs400_enhanced_strobe(struct mmc_host *mmc, + struct mmc_ios *ios) +{ + struct tmio_mmc_host *host =3D mmc_priv(mmc); + struct renesas_sdhi *priv =3D host_to_priv(host); + u32 val =3D sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2); + + if (!(host->pdata->flags & TMIO_MMC_HS400ES)) + return; + + if (ios->enhanced_strobe) { + sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN & + sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL)); + + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_CKSEL, + ~SH_MOBILE_SDHI_SCC_CKSEL_DTSEL & + sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_CKSEL)); + + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL, + ~SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN & + sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL)); + + sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN | + sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL)); + + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT3, BIT(8) | BIT(9)); + sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HWADJ2, 0xFF); + sd_ctrl_write16(host, CTL_SDIF_MODE, SDIF_MODE_HS400 | + sd_ctrl_read16(host, CTL_SDIF_MODE)); + sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HS400MODE2, + RZG3L_SDHI_SCC_HS400MODE2_HS400EN2); + + val |=3D SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN | + SH_MOBILE_SDHI_SCC_HS400MODE1_ENHANCED_STROBE; + } else { + val &=3D ~(SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN | + SH_MOBILE_SDHI_SCC_HS400MODE1_ENHANCED_STROBE); + + sd_ctrl_write16(host, CTL_SDIF_MODE, ~SDIF_MODE_HS400 & + sd_ctrl_read16(host, CTL_SDIF_MODE)); + + sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HS400MODE2, 0); + } + + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, val); +} + /* only populated for TMIO_MMC_MIN_RCAR2 */ static void renesas_sdhi_reset(struct tmio_mmc_host *host, bool preserve) { @@ -703,6 +754,13 @@ static void renesas_sdhi_reset(struct tmio_mmc_host *h= ost, bool preserve) /* Unknown why but without polling reset status, it will hang */ read_poll_timeout(reset_control_status, ret, ret =3D=3D 0, 1, 100, false, priv->rstc); + + /* Restore data strobe registers */ + if ((host->pdata->flags & TMIO_MMC_HS400ES) && + host->mmc->ios.timing =3D=3D MMC_TIMING_MMC_HS400 && + host->mmc->ios.enhanced_strobe) + renesas_sdhi_hs400_enhanced_strobe(host->mmc, &host->mmc->ios); + /* At least SDHI_VER_GEN2_SDR50 needs manual release of reset */ sd_ctrl_write16(host, CTL_RESET_SD, 0x0001); if (priv->rdev) @@ -1410,6 +1468,8 @@ int renesas_sdhi_probe(struct platform_device *pdev, host->ops.prepare_hs400_tuning =3D renesas_sdhi_prepare_hs400_tuning; host->ops.hs400_downgrade =3D renesas_sdhi_disable_scc; host->ops.hs400_complete =3D renesas_sdhi_hs400_complete; + if (host->pdata->flags & TMIO_MMC_HS400ES) + host->ops.hs400_enhanced_strobe =3D renesas_sdhi_hs400_enhanced_strobe; } =20 sd_ctrl_write32_as_16_and_16(host, CTL_IRQ_MASK, host->sdcard_irq_mask_al= l); diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/ho= st/renesas_sdhi_internal_dmac.c index afe259c1566d..c64993ee3ec5 100644 --- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c +++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c @@ -179,7 +179,7 @@ static const struct renesas_sdhi_of_data of_data_rzg3l = =3D { TMIO_MMC_HAVE_CBSY | TMIO_MMC_MIN_RCAR2 | TMIO_MMC_64BIT_DATA_PORT | TMIO_MMC_TUNING_DELAY | TMIO_MMC_INTERNAL_DIVIDER | TMIO_MMC_HWADJ | - TMIO_MMC_HS400MODE2, + TMIO_MMC_HS400MODE2 | TMIO_MMC_HS400ES, .capabilities =3D MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | MMC_CAP_CMD23 | MMC_CAP_WAIT_WHILE_BUSY, .capabilities2 =3D MMC_CAP2_NO_WRITE_PROTECT | MMC_CAP2_MERGE_CAPABLE, diff --git a/include/linux/platform_data/tmio.h b/include/linux/platform_da= ta/tmio.h index 88a3744f965a..ca1435441628 100644 --- a/include/linux/platform_data/tmio.h +++ b/include/linux/platform_data/tmio.h @@ -62,6 +62,9 @@ /* Some controllers have HS400MODE2 */ #define TMIO_MMC_HS400MODE2 BIT(16) =20 +/* Some controllers have HS400ES */ +#define TMIO_MMC_HS400ES BIT(17) + struct tmio_mmc_data { void *chan_priv_tx; void *chan_priv_rx; --=20 2.43.0