From nobody Sun Feb 8 20:59:37 2026 Received: from smtpbgjp3.qq.com (smtpbgjp3.qq.com [54.92.39.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A9FFC31326C; Fri, 26 Dec 2025 08:33:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.92.39.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766738017; cv=none; b=Nbo3luDHVfJkGL9823zcCQ8c4hRY4HPh//vV4E6JbtIZ066cM4C3AnzDVu1xyNTWoTzHqeawJsRgx2g4q66wcaXQu0YlhFZYvL3K4aAX5xrLpyRrrnZibE+SFoXdI2uGVwueXSM5o5N2Z71XhbGI2zaUP2T99UQ8jObuxRcygJU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766738017; c=relaxed/simple; bh=4WF7PpSbGiAEocf+vpDDLvscterKabWsWS0qOo26+rs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gC/pZ9i0o8Q+dV1nt7VdVCCjHe31ViCT7UBvLXeoW35vq/va/Envon9yHMUYZw86Mo6RiUnq1JzsDSS8C7ewOqgy2+DzaFZbogYOIeJUnM+dTzJcJBkA/KO7ceTf60F6yDELSJDd/q8IUo6R8V+iWY15DVQKvW+xUM0aBZ6TTJM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=mJhcpjrb; arc=none smtp.client-ip=54.92.39.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="mJhcpjrb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1766737936; bh=UeRZTj3RgL+C0LFt7dsn6u9FGTvGMeuehM6rrW+shiI=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=mJhcpjrbeGThy0ehyJV+9LUlK+DF/FsBL80FztQfBY/Z6BhFIFe+WktLCNS0aAzBT hjwkZL0wb1Y7kOQzU7/uv1xtLISs6fkRiW9quFsGQsr2syyAFKctUy6VhRQ0kTDKSg GCyKl5U4tkYwCEaKxxlqDjI90QUJ44J+BZnXZhZI= X-QQ-mid: esmtpsz18t1766737930t654bff71 X-QQ-Originating-IP: xxPuGQWHfUB+ZjzOWJRulHKNXe3Xaa+AWCBb4JYA1Pw= Received: from = ( [120.239.196.19]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 26 Dec 2025 16:32:08 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 4478349540645840041 EX-QQ-RecipientCnt: 8 From: Troy Mitchell Date: Fri, 26 Dec 2025 16:31:59 +0800 Subject: [PATCH v5 1/3] i2c: spacemit: drop useless spaces 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 Message-Id: <20251226-k1-i2c-ilcr-v5-1-b5807b7dd0e6@linux.spacemit.com> References: <20251226-k1-i2c-ilcr-v5-0-b5807b7dd0e6@linux.spacemit.com> In-Reply-To: <20251226-k1-i2c-ilcr-v5-0-b5807b7dd0e6@linux.spacemit.com> To: Andi Shyti , Yixun Lan , Alex Elder Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1766737924; l=1067; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=4WF7PpSbGiAEocf+vpDDLvscterKabWsWS0qOo26+rs=; b=KJMJPL6qdCMVv2K9MWdKfiPFYf7zIVqzvL6gfg4ecAxDEfxEgo4gP9417pUbzM07yL6rSG/3q 7f3PLcX914TDjDXzmDvTmMK70AbxOpS1DVZyxTUocqQ7UYAmuY3e63I X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:linux.spacemit.com:qybglogicsvrgz:qybglogicsvrgz3a-0 X-QQ-XMAILINFO: MQaNw+J8Qgodt8wxrv8k7I9ZNKv8IuZP0w2xAALaZmv8umk0faUXObGI V/IQT0hhFYpDQ5SFPY9BZeO17BhzLtTJm2UINXRsHsJFn4jn9NzGJ44DM6ikrP753RCky6L uh9SwxsKrI/nYtkha0V8l+sQwToFrVWOtl9PW8VgvPPSmqpi39lwy71h1SH6bhlM1qzk/Cp vIGFmizy6Qov3h7QlTnhf8SOu/lQLx7HkzGmhExxH21BLUtvjo0zKyq+qdZhCp8KpvvmNIK bjt4ptZzbXYX/MHA1/wln5xJ4ahsEheNfA0g+umA5KSShXR53QhuCRE3E+Gg1ezx1uL7nls lI7duOtetNqxb7rpuKw2FRon0l9SHK9LIqEX9Ul+b03fNNgJw4oS3fWptB5ngsZ6bWBWhpt K6R7AESJy4vp02EI6OZM+tcHooHw5URJt3icq4/rrXUiEt+5DB28JWCKOsjp8hZAKMTmtgA RGoObos3qqdTjnoOoGY3C61kPeX+4TPJgnuc8qfBRslOscOhdrCj7LvFaHPDMOTDV0T1kM8 MC/ysC58DERFTshc1/Kvrg7sgOwzAx3qujIIfrNMeWNUHE/I5EK+m5tr4umb/aQp5QZFGPI 7ILL9Pfelaopmr+gv1ndKjENgNg+KyYBvHbWeVfCqC83ebFGBfb6nxlbefVEPcQ/kX0DG69 mueAVHNiLv4Qdw8lwLCgSfBA7N1wW91xdrYuWjFuvLSdZckVkQT63KBg9sTCsPOHc0X1bQI Y9dXesWdB7LURb33wUwqp+aQaF7A7hfOQiMFvG/LaBezesFgHkmp7wcX2uKKmkBFFbQIIfl oX7Wh2eqhUoPty9XTzFnVJ/4eQhQJWsRHYdMDUTX07OE0yLCjjhzQapOWjn81OYvxk5VReL 8ognfjQ3JJcxTvHOpZBiA/cPnmxyqKN9rMxutZwZ+yGZxp+PVkQrUg9eIG29j3L340Wc+oi KR7o915D6podvNewCjnxWpC5Hx1KSsHkGhj8FkYQ18Rzaik5L03tP8CFFXejO/0DYKcuNsN Fqa4XcP+A0Tz2HO87htYoXZfnNhaoGRLi93n9JCBUJ7mZGH2x9+IzzMHFaWRJNwhWhUsHuU sP4OkWiGh8ejRgsxsxmWjAGahi3Uzdqvhu9MAb4ykO6yPk+stAlo25WdMyBirur1oT71ozf CfvF X-QQ-XMRINFO: NyFYKkN4Ny6FuXrnB5Ye7Aabb3ujjtK+gg== X-QQ-RECHKSPAM: 0 Previously, the I2C driver had an extra leading space in column 0 of included header lines. This commit removes the redundant whitespace. Signed-off-by: Troy Mitchell Reviewed-by: Alex Elder --- drivers/i2c/busses/i2c-k1.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c index d42c03ef5db5984ea8e06b3d7eb485b4f899e616..30cdf733deef264061c8ea56563= 4c5a17f5aebfd 100644 --- a/drivers/i2c/busses/i2c-k1.c +++ b/drivers/i2c/busses/i2c-k1.c @@ -4,12 +4,12 @@ */ =20 #include - #include - #include - #include - #include - #include - #include +#include +#include +#include +#include +#include +#include =20 /* spacemit i2c registers */ #define SPACEMIT_ICR 0x0 /* Control register */ --=20 2.52.0 From nobody Sun Feb 8 20:59:37 2026 Received: from smtpbguseast1.qq.com (smtpbguseast1.qq.com [54.204.34.129]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 16273314D2B; Fri, 26 Dec 2025 08:33:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.204.34.129 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766738022; cv=none; b=ryOoLS9g01BQ0HskrJAPTEw/rLukQehsBkTYIEkH3nQgatMr4K73dNVskpkVI6IOPKIO/uFxv+Hsl6boZxEQchxC3irJFZrR39tuEavXwf0YztdHaQD1+29wwiGma3NVujVAIci6A7pjiCooTHlV1QQoBA8MuhCE6Yl4pqouenE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766738022; c=relaxed/simple; bh=I/F4O6OvL9CNOoglUGCCtM/ENUOiU3Z4Par3dafj4UI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tQfzKIfK0ToYclbe7c9dUzjlXLoORHPbB4M5xlBrKP0sFke+dzc5V1ihrvb1LZS7CQLbi7zS38Fa9EkIEYEqfTvsAgtpBzQu/ZcxG410U/RgyU4h3J4J/XB5aXES97DWtvmxkxnJOlivRaB082NnbSXHTKtlvSIO4ohhri4k+PE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=nzHinCQY; arc=none smtp.client-ip=54.204.34.129 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="nzHinCQY" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1766737940; bh=PCELiQb7TCEJrUREId7rk04F0GLa7oCrPY4mgq8XjWw=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=nzHinCQYZKVR7V8X+q2u50sxaslixdKySUrUktHHKVT1JK1YMbfOqxLhei8t9Ly8b INxehJnJ2wdRGJHjyVKwvcIEB+NypQEaRayLJA7bglJ6oB6Q84zYoagKB2luu/ZyVP WzLwvgkAzvpWqu2hbZ+2uD/GRMGGUixNDITJdlmQ= X-QQ-mid: zesmtpsz6t1766737933t24b325ba X-QQ-Originating-IP: cALO0R3bG1M7vFqLfGGJf6Z6IDAg9jNXl+jgESR3DbA= Received: from = ( [120.239.196.19]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 26 Dec 2025 16:32:11 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 2815579874784846442 EX-QQ-RecipientCnt: 8 From: Troy Mitchell Date: Fri, 26 Dec 2025 16:32:00 +0800 Subject: [PATCH v5 2/3] i2c: spacemit: configure ILCR for accurate SCL frequency 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 Message-Id: <20251226-k1-i2c-ilcr-v5-2-b5807b7dd0e6@linux.spacemit.com> References: <20251226-k1-i2c-ilcr-v5-0-b5807b7dd0e6@linux.spacemit.com> In-Reply-To: <20251226-k1-i2c-ilcr-v5-0-b5807b7dd0e6@linux.spacemit.com> To: Andi Shyti , Yixun Lan , Alex Elder Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1766737924; l=10380; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=I/F4O6OvL9CNOoglUGCCtM/ENUOiU3Z4Par3dafj4UI=; b=LvVtMeATBMCZuz2ueHs/uaqQm17tymVVCAolfql7mqtTli1A7lpr8tUWWXCmrskG5Qq/Ow2NQ yn/AdCLmvmeAN6Sm6jzhJ02D+SX8nlTUaWSOcGxXr3xsn4jhm3Px+VL X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:linux.spacemit.com:qybglogicsvrgz:qybglogicsvrgz3a-0 X-QQ-XMAILINFO: MkJWcWIqqE1TmhRQNmlBx9zUcobMzhx/1QOM0ezY3RrgwEMyvyrMFlrK mJUqT0d+yTgNwrKfE5QcmxDBes8L5zp4cP5UedxU5r4yc7k4e8H6owUaQE6uS3jzo6LMI2N ulNTjiGDB3jsasXs2KHQgF8grucBTQ+LDdSJC3jjZXKO0Pl9xJAIuRG5xzpVlOMA/1kd6t6 lR1uX+31/69jDPouN4I/QZ26+sg5SZ2lPcMph9c5kPaJn3Wc+pB4emjrJpvE0pZN2wNU6OJ /l5IQKn08qyrg5zGnSqq2aUpD7H8n0jqMgTVY4YWx/iS8u89lH3tdu0cYCXdYo6Y93LGcfZ FVfmiUDgxARHaPKPYnuwwnAOeuyfXa0VhwSHqFMwTXriMiqKAQ028HeSDGIZKyBMGhQZtvw SAvgmz0HawVSItEkUamciYhXX+XNMOMGbiOCj7zsYOnNbGRPpgFD2CJM8nXjlhwRi1+9JKE RsoGx0mG8rt0b4K9fnGa+YJ/ueFLVSMG+fXLxzXkeOshzFBDoeulHD8zx6mminKRYofHAtv ocbbf6G9YcFwlwXlq4LlMyd1aDQol08BGljN9vcsxuoR84dnc74l/uH+z1qz1PXcs4hjGm6 9RdDA0eIKY7dZZzAWnL6UPdX5q/8qvLJWy/HQxacbZVug64uVbCmJS8m3vx1Uw25WXxwCJj vo2RQTCyAJ740Vsm1Dsgm0AVYMUgrs2oF2ZmqFboEJkS5nTr9Vmlt6Jso82JzxPo0AavoMJ 0X1Wv3NpBELeWCA/Pnp+q7jXMY/2wwMIecjGhtOyuCoK092ZlUHoZOJhcc7XsVUBlki+FTE 4TiMGd0fkGUZbHxubnmvRfOwwxNIpT+YLJQxBVk9T/2H6DcVeHuIC2jD6ktVhDZyeR15MRn adASSqnD7xyUNZ/Wwrf3DYRUKiNEqcXCwX71u1/+WD7aOZStW231IJ20O4bxOy5ScXRiGf7 Alln7AVHw7+8CZgvZ+9gOuIKVCjwS+LSpbUstOBhji8ENrXM817WB3Kt1L2W29uFxpZobD2 ndWuqpspttslf/dwvnozgpYlNXQ00IbMVfIXtu4v2mO3hnRzjQ/y01bOQmJFaqdUuQ9ovjl aq9tkk8j39AIQtEV3q455JBjpUqEpr9KAdZ0P5I8OTtYUUnasxyYIReQoVKqeXN7w== X-QQ-XMRINFO: NS+P29fieYNwqS3WCnRCOn9D1NpZuCnCRA== X-QQ-RECHKSPAM: 0 The SpacemiT I2C controller's SCL (Serial Clock Line) frequency for master mode operations is determined by the ILCR (I2C Load Count Register). Previously, the driver relied on the hardware's reset default values for this register. The hardware's default ILCR values (SLV=3D0x156, FLV=3D0x5d) yield SCL frequencies lower than intended. For example, with the default 31.5 MHz input clock, these default settings result in an SCL frequency of approximately 93 kHz (standard mode) when targeting 100 kHz, and approximately 338 kHz (fast mode) when targeting 400 kHz. These frequencies are below the 100 kHz/400 kHz nominal speeds. This patch integrates the SCL frequency management into the Common Clock Framework (CCF). Specifically, the ILCR register, which acts as a frequency divider for the SCL clock, is now registered as a managed clock (scl_clk) within the CCF. This patch also cleans up unnecessary whitespace in the included header files. Reviewed-by: Yixun Lan Signed-off-by: Troy Mitchell --- Changelog in v5: - use __ffs() instead of *_SHIFT - remove useless *_SHIFT - check return value when scl clk name array is truncated - rebase to v6.19-rc1 - Link to v3: https://lore.kernel.org/all/20251017-k1-i2c-ilcr-v4-1-eed4903= ecdb9@linux.spacemit.com/ Changelog in v4: - initialize clk_init_data with {} so that init.flags is implicitly set to 0 - minor cleanup and style fixes for better readability - remove unused spacemit_i2c_scl_clk_exclusive_put() cleanup callback - replace clk_set_rate_exclusive()/clk_rate_exclusive_put() pair with clk_s= et_rate() - simplify LCR LV field macros by using FIELD_GET/FIELD_MAX helpers - Link to v3: https://lore.kernel.org/all/20250814-k1-i2c-ilcr-v3-1-317723e= 74bcd@linux.spacemit.com/ Changelog in v3: - use MASK macro in `recalc_rate` function - rename clock name - Link to v2: https://lore.kernel.org/r/20250718-k1-i2c-ilcr-v2-1-b4c68f13d= cb1@linux.spacemit.com Changelog in v2: - Align line breaks. - Check `lv` in `clk_set_rate` function. - Force fast mode when SCL frequency is illegal or unavailable. - Change "linux/bits.h" to - Kconfig: Add dependency on CCF. - Link to v1: https://lore.kernel.org/all/20250710-k1-i2c-ilcr-v1-1-188d1f4= 60c7d@linux.spacemit.com/ --- drivers/i2c/busses/Kconfig | 2 +- drivers/i2c/busses/i2c-k1.c | 146 ++++++++++++++++++++++++++++++++++++++++= +--- 2 files changed, 139 insertions(+), 9 deletions(-) diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index cea87fcb4a1a945f805e9eff25d2f7ab9f61ddf9..b13fb7155786c246229f5e17aa5= 7603c5e755683 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig @@ -799,7 +799,7 @@ config I2C_JZ4780 config I2C_K1 tristate "SpacemiT K1 I2C adapter" depends on ARCH_SPACEMIT || COMPILE_TEST - depends on OF + depends on OF && COMMON_CLK help This option enables support for the I2C interface on the SpacemiT K1 platform. diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c index 30cdf733deef264061c8ea565634c5a17f5aebfd..f0c35e23f4f2e139da0d09f314f= 3eb0e0462a382 100644 --- a/drivers/i2c/busses/i2c-k1.c +++ b/drivers/i2c/busses/i2c-k1.c @@ -4,7 +4,9 @@ */ =20 #include +#include #include +#include #include #include #include @@ -16,6 +18,7 @@ #define SPACEMIT_ISR 0x4 /* Status register */ #define SPACEMIT_IDBR 0xc /* Data buffer register */ #define SPACEMIT_IRCR 0x18 /* Reset cycle counter */ +#define SPACEMIT_ILCR 0x10 /* Load Count Register */ #define SPACEMIT_IBMR 0x1c /* Bus monitor register */ =20 /* SPACEMIT_ICR register fields */ @@ -87,6 +90,11 @@ #define SPACEMIT_BMR_SDA BIT(0) /* SDA line level */ #define SPACEMIT_BMR_SCL BIT(1) /* SCL line level */ =20 +#define SPACEMIT_LCR_LV_STANDARD_MASK GENMASK(8, 0) +#define SPACEMIT_LCR_LV_FAST_MASK GENMASK(17, 9) +#define SPACEMIT_LCR_LV_STANDARD_MAX_VALUE FIELD_MAX(SPACEMIT_LCR_LV_STAND= ARD_MASK) +#define SPACEMIT_LCR_LV_FAST_MAX_VALUE FIELD_MAX(SPACEMIT_LCR_LV_FAST_MAS= K) + /* i2c bus recover timeout: us */ #define SPACEMIT_I2C_BUS_BUSY_TIMEOUT 100000 =20 @@ -104,11 +112,20 @@ enum spacemit_i2c_state { SPACEMIT_STATE_WRITE, }; =20 +enum spacemit_i2c_mode { + SPACEMIT_MODE_STANDARD, + SPACEMIT_MODE_FAST +}; + /* i2c-spacemit driver's main struct */ struct spacemit_i2c_dev { struct device *dev; struct i2c_adapter adapt; =20 + struct clk_hw scl_clk_hw; + struct clk *scl_clk; + enum spacemit_i2c_mode mode; + /* hardware resources */ void __iomem *base; int irq; @@ -129,6 +146,77 @@ struct spacemit_i2c_dev { u32 status; }; =20 +static void spacemit_i2c_scl_clk_disable_unprepare(void *data) +{ + struct spacemit_i2c_dev *i2c =3D data; + + clk_disable_unprepare(i2c->scl_clk); +} + +static int spacemit_i2c_clk_set_rate(struct clk_hw *hw, unsigned long rate, + unsigned long parent_rate) +{ + struct spacemit_i2c_dev *i2c =3D container_of(hw, struct spacemit_i2c_dev= , scl_clk_hw); + u32 lv, lcr, mask, max_lv; + + lv =3D DIV_ROUND_UP(parent_rate, rate); + + if (i2c->mode =3D=3D SPACEMIT_MODE_STANDARD) { + mask =3D SPACEMIT_LCR_LV_STANDARD_MASK; + max_lv =3D SPACEMIT_LCR_LV_STANDARD_MAX_VALUE; + } else if (i2c->mode =3D=3D SPACEMIT_MODE_FAST) { + mask =3D SPACEMIT_LCR_LV_FAST_MASK; + max_lv =3D SPACEMIT_LCR_LV_FAST_MAX_VALUE; + } + + if (!lv || lv > max_lv) { + dev_err(i2c->dev, "set scl clock failed: lv 0x%x", lv); + return -EINVAL; + } + + lcr =3D readl(i2c->base + SPACEMIT_ILCR); + lcr &=3D ~mask; + lcr |=3D lv << __ffs(mask); + writel(lcr, i2c->base + SPACEMIT_ILCR); + + return 0; +} + +static long spacemit_i2c_clk_round_rate(struct clk_hw *hw, unsigned long r= ate, + unsigned long *parent_rate) +{ + u32 lv, freq; + + lv =3D DIV_ROUND_UP(*parent_rate, rate); + freq =3D DIV_ROUND_UP(*parent_rate, lv); + + return freq; +} + +static unsigned long spacemit_i2c_clk_recalc_rate(struct clk_hw *hw, + unsigned long parent_rate) +{ + struct spacemit_i2c_dev *i2c =3D container_of(hw, struct spacemit_i2c_dev= , scl_clk_hw); + u32 lcr, lv =3D 0; + + lcr =3D readl(i2c->base + SPACEMIT_ILCR); + + if (i2c->mode =3D=3D SPACEMIT_MODE_STANDARD) + lv =3D FIELD_GET(SPACEMIT_LCR_LV_STANDARD_MASK, lcr); + else if (i2c->mode =3D=3D SPACEMIT_MODE_FAST) + lv =3D FIELD_GET(SPACEMIT_LCR_LV_FAST_MASK, lcr); + else + return 0; + + return DIV_ROUND_UP(parent_rate, lv); +} + +static const struct clk_ops spacemit_i2c_clk_ops =3D { + .set_rate =3D spacemit_i2c_clk_set_rate, + .round_rate =3D spacemit_i2c_clk_round_rate, + .recalc_rate =3D spacemit_i2c_clk_recalc_rate, +}; + static void spacemit_i2c_enable(struct spacemit_i2c_dev *i2c) { u32 val; @@ -147,6 +235,29 @@ static void spacemit_i2c_disable(struct spacemit_i2c_d= ev *i2c) writel(val, i2c->base + SPACEMIT_ICR); } =20 +static struct clk *spacemit_i2c_register_scl_clk(struct spacemit_i2c_dev *= i2c, + struct clk *parent) +{ + struct clk_init_data init =3D {}; + char name[64]; + int ret; + + ret =3D snprintf(name, sizeof(name), "%s_scl_clk", dev_name(i2c->dev)); + if (ret >=3D ARRAY_SIZE(name)) + dev_warn(i2c->dev, "scl clock name truncated"); + + init.name =3D name; + init.ops =3D &spacemit_i2c_clk_ops; + init.parent_data =3D (struct clk_parent_data[]) { + { .fw_name =3D "func" }, + }; + init.num_parents =3D 1; + + i2c->scl_clk_hw.init =3D &init; + + return devm_clk_register(i2c->dev, &i2c->scl_clk_hw); +} + static void spacemit_i2c_reset(struct spacemit_i2c_dev *i2c) { writel(SPACEMIT_CR_UR, i2c->base + SPACEMIT_ICR); @@ -257,7 +368,7 @@ static void spacemit_i2c_init(struct spacemit_i2c_dev *= i2c) */ val |=3D SPACEMIT_CR_DRFIE; =20 - if (i2c->clock_freq =3D=3D SPACEMIT_I2C_MAX_FAST_MODE_FREQ) + if (i2c->mode =3D=3D SPACEMIT_MODE_FAST) val |=3D SPACEMIT_CR_MODE_FAST; =20 /* disable response to general call */ @@ -545,14 +656,15 @@ static int spacemit_i2c_probe(struct platform_device = *pdev) dev_warn(dev, "failed to read clock-frequency property: %d\n", ret); =20 /* For now, this driver doesn't support high-speed. */ - if (!i2c->clock_freq || i2c->clock_freq > SPACEMIT_I2C_MAX_FAST_MODE_FREQ= ) { - dev_warn(dev, "unsupported clock frequency %u; using %u\n", - i2c->clock_freq, SPACEMIT_I2C_MAX_FAST_MODE_FREQ); + if (i2c->clock_freq > SPACEMIT_I2C_MAX_STANDARD_MODE_FREQ && + i2c->clock_freq <=3D SPACEMIT_I2C_MAX_FAST_MODE_FREQ) { + i2c->mode =3D SPACEMIT_MODE_FAST; + } else if (i2c->clock_freq && i2c->clock_freq <=3D SPACEMIT_I2C_MAX_STAND= ARD_MODE_FREQ) { + i2c->mode =3D SPACEMIT_MODE_STANDARD; + } else { + dev_warn(i2c->dev, "invalid clock-frequency, fallback to fast mode"); + i2c->mode =3D SPACEMIT_MODE_FAST; i2c->clock_freq =3D SPACEMIT_I2C_MAX_FAST_MODE_FREQ; - } else if (i2c->clock_freq < SPACEMIT_I2C_MAX_STANDARD_MODE_FREQ) { - dev_warn(dev, "unsupported clock frequency %u; using %u\n", - i2c->clock_freq, SPACEMIT_I2C_MAX_STANDARD_MODE_FREQ); - i2c->clock_freq =3D SPACEMIT_I2C_MAX_STANDARD_MODE_FREQ; } =20 i2c->dev =3D &pdev->dev; @@ -574,10 +686,28 @@ static int spacemit_i2c_probe(struct platform_device = *pdev) if (IS_ERR(clk)) return dev_err_probe(dev, PTR_ERR(clk), "failed to enable func clock"); =20 + i2c->scl_clk =3D spacemit_i2c_register_scl_clk(i2c, clk); + if (IS_ERR(i2c->scl_clk)) + return dev_err_probe(&pdev->dev, PTR_ERR(i2c->scl_clk), + "failed to register scl clock\n"); + clk =3D devm_clk_get_enabled(dev, "bus"); if (IS_ERR(clk)) return dev_err_probe(dev, PTR_ERR(clk), "failed to enable bus clock"); =20 + ret =3D clk_set_rate(i2c->scl_clk, i2c->clock_freq); + if (ret) + return dev_err_probe(&pdev->dev, ret, "failed to set rate for SCL clock"= ); + + ret =3D clk_prepare_enable(i2c->scl_clk); + if (ret) + return dev_err_probe(&pdev->dev, ret, "failed to prepare and enable cloc= k"); + + ret =3D devm_add_action_or_reset(dev, spacemit_i2c_scl_clk_disable_unprep= are, i2c); + if (ret) + return dev_err_probe(&pdev->dev, ret, + "failed to register cleanup action for clk disable and unprepare"= ); + spacemit_i2c_reset(i2c); =20 i2c_set_adapdata(&i2c->adapt, i2c); --=20 2.52.0 From nobody Sun Feb 8 20:59:37 2026 Received: from smtpbgjp3.qq.com (smtpbgjp3.qq.com [54.92.39.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29AB6314B88; Fri, 26 Dec 2025 08:33:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.92.39.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766738020; cv=none; b=EFdlXifNM5u/apWug2q+20uHt6sbE71z2OnZNzI3fwb9fZ1j+gNDLoLQCGTPNQkvMZvnGxYMNJO81HGJry5N62Q8tMqj0bm8HZa8r+Ank28BMnbue2WfuLpVcHx9uE6PQxq3D+L5x7h6ag3POLrK/d981rfB5TsePflYj4DMDKc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766738020; c=relaxed/simple; bh=rZVjpRq6diTZDodTgrmoHPQRzPHbVK6nvZDYYBcO8PI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HDopCA1SqqnGiIwyKt788+WfRWPIi7z3m/tC3zBXqKi4k81E0WEji3hZvy3Q+lbJ/7l5ednL+cFqFoc1muIc2go7PtwF8dQAebwdG6vZKIIr1k75voHkG2c/Ee9fzdNn8Vxwxrf2Fr6foD3Mhe01CFGLM8eX28RYWdybpLrLAbE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=Ufla0bYw; arc=none smtp.client-ip=54.92.39.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="Ufla0bYw" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1766737943; bh=q144s+Pxl/YxIsHlfK2SeNs5pf4/4KxmIRh1XcAJfTw=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=Ufla0bYwSK2amOo7gEdg199je3q4b9owsWUHJZct1Ik/6gW13XSNREramQi5gso4D Z+dttbxEpFHSYIh7eXCJ5V6B0+aDm0U6DDy0UUp/vyNraqN2fMJFviQZjoFS+08yoe xoNxHu8bo5b11EPztRn9yBYCs75s2wetCJ00fno8= X-QQ-mid: zesmtpsz3t1766737937tf0740520 X-QQ-Originating-IP: fBMC0oz+qlcaXygVvZVVCJP+JsZzqHCoEj+yiZMonz4= Received: from = ( [120.239.196.19]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 26 Dec 2025 16:32:15 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 1856170875034812761 EX-QQ-RecipientCnt: 8 From: Troy Mitchell Date: Fri, 26 Dec 2025 16:32:01 +0800 Subject: [PATCH v5 3/3] i2c: spacemit: drop warning when clock-frequency property is absent 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 Message-Id: <20251226-k1-i2c-ilcr-v5-3-b5807b7dd0e6@linux.spacemit.com> References: <20251226-k1-i2c-ilcr-v5-0-b5807b7dd0e6@linux.spacemit.com> In-Reply-To: <20251226-k1-i2c-ilcr-v5-0-b5807b7dd0e6@linux.spacemit.com> To: Andi Shyti , Yixun Lan , Alex Elder Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1766737924; l=1201; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=rZVjpRq6diTZDodTgrmoHPQRzPHbVK6nvZDYYBcO8PI=; b=jpYwIH4OkDuOt9w3reh51VpSYcGMuiHBl4FOC9ZnknYAMeR/Jfjh6jb3/8XpNJc7l6KDPBqa/ P7cZc0uEvIaCx0slzGfd4VRRQe1kBmTTldGeq5hE9zgY7BTPAZemize X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpsz:linux.spacemit.com:qybglogicsvrgz:qybglogicsvrgz3a-0 X-QQ-XMAILINFO: Ngwq0BL9nhqbWZY7lCf2IIsITybFV6mN3zjf6mm7u6sz+zDtwZEc5qCm weyQSRfbzJqWlEMvpiqF4EqQnoNdPyWQFUtxe+7FunXLTesJ1PVzHem5BU3vHgZYrfEOoIG BA4Qny/qpPLl4cT5tHN4qB82bektIxshyLQNs70nWauDXEPGQ9C+iAOiau/hTfVjsk/8O7G HDXdCfFzU+h31ps2x61p8C7UHe8hqITez+RgFUXyC7SgJMNjT5T8NeKJ0EjKdqh3RLDKdAk SCHXmDuClwU+tbaHyxn7BOmYvB0cGHvtccvNO/xtEVWkst2GN4paiHwiRz+hlVeGGjPw2Y4 KAX+TpT2BRU70qxuhC49ozulFQKgnroRTi0cSfmoEm/7Q8HkXwHBL9bB7w0dHiNdBvpzhEZ i4azMgfpu+jU0Tb8wx164yOGqud+kpOxU/7PVKONHbCrxv+F6fPIcyrarQY9aP2xaN2nmBP qertTE6Emsyt0I9B/sHTuke4PmVJSHlRQ69SUnH6+r/8PWi+I1e+Q4H2B9BoUzKy72AJwHD cCmLlNlYF/tbHzqC71Rq8XGHYYxt7oorvsKPYMC8+X/HYgEBw0udk73mj8pQZCZG3AOivgH wiIriZfzPO52QHWV4DkM4kC0bOLvQApkjo2lzGO1UteOPn9az72lJ6kTMlmwaRuTM+I/3pN ZcRI9qNgjo3i3xeqc00k/9UejFpnZVrWRdwEBnnhjFkjyl0N4zC8NMwxkGKFD+V1JkclVdg yElZ921Xm8XCqDZ5sh8OtVh/PDwAmSJY2j8BiReN3bawcbSQOH2EBwoZFFbG0VgDeQTjCOf W8ogXPLZ1E8DNRLO7OiEbARCMDcAkklMeG2aup8heYWNUVv9XfMAZZgHsFhvHMYHFB4lhzo WmlCKKugsc2U8+WIv2La36VSvCYCC5Bo0Vi6ZXyFUWv4DwfZNbRWABX+ovUq7mtkrXM0DV2 Xl0zLD/BLgheBScj2skLMG2IvI3oxhlOYJDERn6xGf5lCmYFXcfxeBDlV+Fi5RccBXqaxmf pktHzib4DyiYn5aFaN1dviqvjPedlh+HvvSft3va/UHOWriot8b9tbPsFGG2xqUy/yra68f OliGDZxupXspFEo8fhH7kw1n4XyH+GkPP3kLsAfi2HA X-QQ-XMRINFO: OWPUhxQsoeAVwkVaQIEGSKwwgKCxK/fD5g== X-QQ-RECHKSPAM: 0 The clock-frequency property is optional according to the DT binding. Do not emit a warning when the property is missing and fall back to the default frequency instead. Fixes: 5ea558473fa31 ("i2c: spacemit: add support for SpacemiT K1 SoC") Suggested-by: Alex Elder Signed-off-by: Troy Mitchell --- drivers/i2c/busses/i2c-k1.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c index f0c35e23f4f2e139da0d09f314f3eb0e0462a382..c829618a66a214a12b46d63bf06= ba7947b9dbbb8 100644 --- a/drivers/i2c/busses/i2c-k1.c +++ b/drivers/i2c/busses/i2c-k1.c @@ -651,9 +651,7 @@ static int spacemit_i2c_probe(struct platform_device *p= dev) if (!i2c) return -ENOMEM; =20 - ret =3D of_property_read_u32(of_node, "clock-frequency", &i2c->clock_freq= ); - if (ret && ret !=3D -EINVAL) - dev_warn(dev, "failed to read clock-frequency property: %d\n", ret); + of_property_read_u32(of_node, "clock-frequency", &i2c->clock_freq); =20 /* For now, this driver doesn't support high-speed. */ if (i2c->clock_freq > SPACEMIT_I2C_MAX_STANDARD_MODE_FREQ && --=20 2.52.0