From nobody Fri Oct 3 13:21:30 2025 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.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 4BA56246786; Sun, 31 Aug 2025 10:05:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634723; cv=none; b=opkxm3tq4LZHTrLvpMcuA3lyeOILNjOwZ+A16H+wvVq0REu9YuJeOqqqKbJI3ctfAHdry5aXECg5aLwsZlepROfukUVnoyF7wacb7TkhiEzTHSwZXCNJyWJbsvw2iLqDP4cjGykeO44McSND69Gy4cUTJlnbP4IAjntCpsNd2eU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634723; c=relaxed/simple; bh=GtFM1HYwM7wm50NlvOK2RSNtRdnB1lWGFKfcajn9FBE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=II4ct/An+zLMC0/KGo75GbOU9j7VNF8/6C4TjpXZDolOshoMQ1wXQ0VrvmOsqM+0vUH+e4RMSbU+AHa5wxpBgHou/WlbtCDh/BDtV/YZuWLdS4RgpCT/xRqsPHolreS90m0P6P5zbAf5r3E73sS3rO245O7jMP8CdhyzFyrmH4w= 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=IEXDzPgu; arc=none smtp.client-ip=209.85.221.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="IEXDzPgu" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-3c46686d1e6so2170607f8f.3; Sun, 31 Aug 2025 03:05:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634720; x=1757239520; 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; bh=KAsPc/o3sHthydrZSTY/uysR9XBCOf9eN2RiNd/nsG8=; b=IEXDzPguu+2NwCjcZkWhbXz2uIZkX6eIF5UtA04PgQPnsrsNk6HkzCjGwvxknW2Uk+ u+ET5dkqRumGe4klNrR3qlE+olhgZP6kBQ4/EGN3aYw3mlnIYaqhVhJcSHS8hVzPAeO6 G+Ni01/rYwDaQZeTkm6id99crQb6EIa9MVUWVGbrJMzr8SdT73cNR8RqAFiP4Fbl7sJt WO0aYMj9+c32JtveSgpUmla+NJq6pFJDdBLy6MBBghQhe1fMGaFNMCTXG0uPbZMOsgqD Dz8CbSJElOTbwkGROn31U/eZ5qkYdQhOFZtxysh9N58gt1v9cCVxmWVSNwhIOTE3WfYM GdqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634720; x=1757239520; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KAsPc/o3sHthydrZSTY/uysR9XBCOf9eN2RiNd/nsG8=; b=BWJMOJZCfqYpex33kQAGvRpM+vhh+HtWtfEEglBZgqkgdtbRlFpq3ugUlPwvgyQzOv i76+BMelQjH0smf82yKI0Zu4lWZd7LE2KFl+VBiiBQvqbSzLKorvs2YCbgOiUkt4YOmr OXgXqvp5+3PU9b7XwcoCrsNVbo5UB4yBeN8SE/xM8hEBRCVHfyYkyoDPWQPy4CZhwhst p8sk9QFanvgMo+R5VJpSFdF4/CqcmShCFXLGXhMeBfDai9NR0JBcD5KnTdo+2xmS9H8d 2O7eBeVenFqNTGU7ImlVTtgDgDTeXUSLYWnYfJ8Tre/H/dqqlIgIbZ1lPmqvWFxvMdjW tEaA== X-Forwarded-Encrypted: i=1; AJvYcCUYYASeJ9zWbmlMp7/Ad/9wLgeANvjDSzPoIhhuRaHIVENA4V/uG8+pxQ5QNE/Zk8zCqj8YQnn/@vger.kernel.org, AJvYcCUfwoURx8cG3x7cLGsmAKqaxSpyxmm4+PGd68hbp7Z+yh+7ulORt63QRoqXymcsKVo0z9Dqph6k776P@vger.kernel.org, AJvYcCXGvlx4Zu9agOPBSXKYB5eM1miBt1Pq4fCWU4cBZrbG5XbwtvNpI/e9HW6MD3SpS3DQjYIEALRyYh6X+BTd@vger.kernel.org X-Gm-Message-State: AOJu0YyoVdFVA2TwSUVHQGgS30hna/5W2COibem7lyDltR/BxIMLi2Wc +vJr97FT7B1QZkyBihd6+34Hl0HJVjrXqRgHhPtvlxBzfaVaaroqF68N X-Gm-Gg: ASbGncv+O8/Wl+018SIzqyVvkUE6Tmso2gBpxWHT1lUtfrPGDKVeQvxYtKqyju8aci+ Lx04LesoDvEVkoHv2Q6J5jWSedllK0TJGuSiQhsvi8CS7sjHmLhO+2+9mkf8X+tRz4giowritA8 tu3RA0rdq87RBEhZa7Crk8jdRNQWcVZkHkcZBkXNaQN8P1RVM9yZ0/V2chwlyuNTqYN2fFsUQhb idh1fW2gzHW5U99gtsv2BAXg7nF3xQ/jp2Bklc+boS5NLPHlrTElWAKgGW2+k949obpaiUfBGCA a74ng/A7F9EOu1GZ8J2oWQdA4H50vJUtEbyMgVIO/Lbk8SVdN0ZxR1zri9NNoI/x/LHnag24Um3 fa5qtghwMSMO+6j32AHSo7F+eu+tsBxNpOvpqoRNa5Dr6NHN0VS8l X-Google-Smtp-Source: AGHT+IGfYQ1rNBJY3kQiqNVIFxgvAuXKhq26+A96rjTUwsQk1D9qn+uE3W98XbYUc64ySDby93qClQ== X-Received: by 2002:a05:6000:4312:b0:3ca:7d27:6d6e with SMTP id ffacd0b85a97d-3d1de4ba747mr3226702f8f.28.1756634719535; Sun, 31 Aug 2025 03:05:19 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:18 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek , stable@vger.kernel.org Subject: [PATCH v7 01/12] i2c: rtl9300: fix channel number bound check Date: Sun, 31 Aug 2025 10:04:46 +0000 Message-ID: <20250831100457.3114-2-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" Fix the current check for number of channels (child nodes in the device tree). Before, this was: if (device_get_child_node_count(dev) >=3D RTL9300_I2C_MUX_NCHAN) RTL9300_I2C_MUX_NCHAN gives the maximum number of channels so checking with '>=3D' isn't correct because it doesn't allow the last channel number. Thus, fix it to: if (device_get_child_node_count(dev) > RTL9300_I2C_MUX_NCHAN) Issue occured on a TP-Link TL-ST1008F v2.0 device (8 SFP+ ports) and fix is tested there. Fixes: c366be720235 ("i2c: Add driver for the RTL9300 I2C controller") Cc: # v6.13+ Signed-off-by: Jonas Jelonek Tested-by: Sven Eckelmann Reviewed-by: Chris Packham Tested-by: Chris Packham # On RTL9302C = based board Tested-by: Markus Stockhausen --- drivers/i2c/busses/i2c-rtl9300.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-rtl9300.c b/drivers/i2c/busses/i2c-rtl9= 300.c index 4b215f9a24e6..19c367703eaf 100644 --- a/drivers/i2c/busses/i2c-rtl9300.c +++ b/drivers/i2c/busses/i2c-rtl9300.c @@ -382,7 +382,7 @@ static int rtl9300_i2c_probe(struct platform_device *pd= ev) =20 platform_set_drvdata(pdev, i2c); =20 - if (device_get_child_node_count(dev) >=3D RTL9300_I2C_MUX_NCHAN) + if (device_get_child_node_count(dev) > RTL9300_I2C_MUX_NCHAN) return dev_err_probe(dev, -EINVAL, "Too many channels\n"); =20 device_for_each_child_node(dev, child) { --=20 2.48.1 From nobody Fri Oct 3 13:21:30 2025 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 8618324E4C4; Sun, 31 Aug 2025 10:05:22 +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=1756634724; cv=none; b=jVsTAqxjKLcZ017IkLtaY8ew96CoFrVXesaiI+UuwjicCFTyRWWpMT4v5W3hk0d5GF8BJAtry5yIDYYHGC/Qm7gOrcErHFixZCNuKXyt3sGuzYx4vRasIq+yaHdSQKEVWoJuCWrDUaofJ9sjpJY8KjFZ6kRUFrlSPgEazWmZcfs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634724; c=relaxed/simple; bh=2FU7jBaL5l0F7FcLIVYyLqFdd43eJjmVXTGQeNPVYEU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OPuSXjeZxczld+oCNJLm2V51mcC0Nrmv2R5THol/6EOU+Pln8UIdrtW1KYCSOwABWSag4J19OzHl7FCmOj5NCxiRJQl7V6KpDjnfJBYSevEwDyw4iOHOaM0L7e5BaXcIR3vi2SILk9JjklgwSx1L69y1Q3KBiMZhxFIscJ9bg7U= 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=aB3pBqWz; 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="aB3pBqWz" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-45b84367affso11463085e9.3; Sun, 31 Aug 2025 03:05:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634721; x=1757239521; 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; bh=W12vvSGCow+ngePVEZ+KVEnYiYSPCEptwt7U5jJOCgo=; b=aB3pBqWzTEnoJU7y3bdm392hkid/J7A/lArz5+OJ6+UXQWYs3FufJkQuIA4F4JO5B+ XGi+lQi55S8KeHK5PCtz6MB8jUYjAIPJWC8vbG68FxEH8JVlYLgi/krUwLbP+y67a2qk GxbpjtUJUN1snZRgmWJi5ZP9J5r+g2YTj29diVhLd0htQQoMsAaidmy1z9HUACNm9sHL aM6FrPfgrzKClSqtSyxg4ie3yenPyvW3pnG/idZM6ep+B8HGP/ghj75aYWSZ5O8VE9at vkz4NooIjASGT7nKeUSgxKLMYrRt5LO+kPMHDkh3bzTWm9fKd1d+mS3ApsRl6wYRecsX 3XHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634721; x=1757239521; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=W12vvSGCow+ngePVEZ+KVEnYiYSPCEptwt7U5jJOCgo=; b=RhHj1HX8QBInnve2h99xOORcuJ7L2n0sU8/Aun1PruPSJwkUnippUgve+9LyJ4qWMy O+vPeLx30HxpSK9WrmNvMWmbUGU2KFR2ri2xAdMh/XXVt1OIH/7fQlsiZl8CA6VRFaF8 /poZnZ3FgCisl5BpBlEohRskMDKQqISTb23WcKu3AAHhlM8GOROuJ7HaRiDTdjoXdNeg SdEBDQmF7XAxh57PwHgu9SMEPMCZsXThZhKgihtOZ8RQEckqlSuo0ynZxlO149VRmodE tRuRFPcvrm8gctYT3oNGEojqZasIYLE1BnBTL47PjyJzQ+2d4tmV0vfgkDGkrT6ehx3r yINg== X-Forwarded-Encrypted: i=1; AJvYcCU3WFhJ1Y5I7vzs28QdwHtB17+d9f2WbufYmCS/puQNh3rGXk8DrBnoBtl0RQd+lgLSALTk4uwukVT3@vger.kernel.org, AJvYcCVM4fE9hc2Y2z7pEmOhIOpxsxR9k550A4/6BmAfv/4Y2n3QCkQFrfyyM9AyJVNn+kmpU7vKxfGW@vger.kernel.org, AJvYcCWOIekxS7ZXNb8SPrDa7UVNf7j+ULvgvxu+TYSJiCI/q7GiwZWtz9Yd02WIQ9R8yIjMPxN7Db8Oasgjcw2/@vger.kernel.org X-Gm-Message-State: AOJu0YyOJlAuVCOB4mNfV9vdZp0RxkMAvEHnYvekj3BUsb2rUaL5R76I iDxAFxW82ZPeM8eaztZhE2E6f/xHhXL4559WGtak75za1M2GWA4KlPiqDJF8UA== X-Gm-Gg: ASbGncsORDFseVf49WnotRYYWagY5wDx5hrIzs73PTuVcyDc4LB4QSz0zJmOqX/heQr HA9UsRGYCTEr49FJBhAI63UifPwf2fJGhmVbWNOsvbCN9lNfGKEzaRGI8VFqE1Hme5otWt507LC 1r+AhXx2oPaY23AAOq41OY+05rfW4XhX0qzUe7eZBsloW3Nq+UWnYS0LF140qVnorfqoA8LS6nO 0AntETAA37vbP9oUicBgqrYA7HSsX06Cy5MluufFldK0ZaUc/pkIPHZQTbdhQp4ttqa2DdIkbtw /82gSucTOZ+AdfCF9xGWAYsb2AaeTwjBpIbuWcLz0sPpcty40yXaKB/gMiUVXKFq8sCzq2JypfN VvoMY7LqlYztB6cFfjNcuUMLaTQea2wxxmCdf6tHYFDJPmUNpXZjG/tXO4gu5+jk= X-Google-Smtp-Source: AGHT+IFkWnyvylZ2juEpqteyJqOwih5EpHzSQ+mIV9sjGoVUu4+5hFmvjDcz3l9qFan61AE9CskVNw== X-Received: by 2002:a05:600c:4f0a:b0:45b:8a20:5437 with SMTP id 5b1f17b1804b1-45b8a2055e2mr14437765e9.31.1756634720443; Sun, 31 Aug 2025 03:05:20 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:20 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek , stable@vger.kernel.org Subject: [PATCH v7 02/12] i2c: rtl9300: ensure data length is within supported range Date: Sun, 31 Aug 2025 10:04:47 +0000 Message-ID: <20250831100457.3114-3-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" Add an explicit check for the xfer length to 'rtl9300_i2c_config_xfer' to ensure the data length isn't within the supported range. In particular a data length of 0 is not supported by the hardware and causes unintended or destructive behaviour. This limitation becomes obvious when looking at the register documentation [1]. 4 bits are reserved for DATA_WIDTH and the value of these 4 bits is used as N + 1, allowing a data length range of 1 <=3D len <=3D 16. Affected by this is the SMBus Quick Operation which works with a data length of 0. Passing 0 as the length causes an underflow of the value due to: (len - 1) & 0xf and effectively specifying a transfer length of 16 via the registers. This causes a 16-byte write operation instead of a Quick Write. For example, on SFP modules without write-protected EEPROM this soft-bricks them by overwriting some initial bytes. For completeness, also add a quirk for the zero length. [1] https://svanheule.net/realtek/longan/register/i2c_mst1_ctrl2 Fixes: c366be720235 ("i2c: Add driver for the RTL9300 I2C controller") Cc: # v6.13+ Signed-off-by: Jonas Jelonek Tested-by: Sven Eckelmann Reviewed-by: Chris Packham Tested-by: Chris Packham # On RTL9302C = based board Tested-by: Markus Stockhausen --- drivers/i2c/busses/i2c-rtl9300.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-rtl9300.c b/drivers/i2c/busses/i2c-rtl9= 300.c index 19c367703eaf..ebd4a85e1bde 100644 --- a/drivers/i2c/busses/i2c-rtl9300.c +++ b/drivers/i2c/busses/i2c-rtl9300.c @@ -99,6 +99,9 @@ static int rtl9300_i2c_config_xfer(struct rtl9300_i2c *i2= c, struct rtl9300_i2c_c { u32 val, mask; =20 + if (len < 1 || len > 16) + return -EINVAL; + val =3D chan->bus_freq << RTL9300_I2C_MST_CTRL2_SCL_FREQ_OFS; mask =3D RTL9300_I2C_MST_CTRL2_SCL_FREQ_MASK; =20 @@ -352,7 +355,7 @@ static const struct i2c_algorithm rtl9300_i2c_algo =3D { }; =20 static struct i2c_adapter_quirks rtl9300_i2c_quirks =3D { - .flags =3D I2C_AQ_NO_CLK_STRETCH, + .flags =3D I2C_AQ_NO_CLK_STRETCH | I2C_AQ_NO_ZERO_LEN, .max_read_len =3D 16, .max_write_len =3D 16, }; --=20 2.48.1 From nobody Fri Oct 3 13:21:30 2025 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (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 4CCE625333F; Sun, 31 Aug 2025 10:05:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634725; cv=none; b=KJWN1iGS84jrHgfr0msZ1mFj1uHITa7C67aIoKjrt0KgRu0pDoHy6GOyt42IlADdSWcP1Yp4UOUc82BAAc75BLEWHTxhINIw6VZCvZlOA3wL/jlF/pzGbvUVpys61eQOEl29iAk8BgNAKPS616EeSVvz2wS7SAeHmuSYtF38K/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634725; c=relaxed/simple; bh=c0/Sv0HbkGOwQACB9q6lcyzn2W0r+1nlzG1a9H7dUlo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AgFWfg8R7Bp7IVz1CqwSdudsKmmrMbBb6luW+OSk/b7qceSq8kw1TTvJJ0IkVp6McP6Gd5oqzhLAqZursypYwH6aP4LD1YqWkxEukyEcGw8vsETmJuIVjGKEn6MGeTNTTWnHpmXtAO6i3B/q94DusqWdrCPlZw1vNsJtUmdd3EU= 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=HFbFYvEb; arc=none smtp.client-ip=209.85.128.44 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="HFbFYvEb" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-45b89147cfbso4263245e9.3; Sun, 31 Aug 2025 03:05:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634722; x=1757239522; 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; bh=I83+DpOGB8BLeWuxSsvCnBXK47razkPCuWBaTDf4aQE=; b=HFbFYvEbSGNO1cZHfBTUOwU67fAsnn6cbYNvIMq87JISuB4zhRdTJsIQbFk/Xw8AlP aPw5CCF4fCX8hiaJcEB+HGc8eO4FV/hbJRs3QvUL+Ce1VhnsXkaYKweG0YAAcJD0dtTG Lzb/7CirnU/SckU98Hj1/sWiqaZuZURt+gX6OY50rkY2rqvO9Opm1yAWlVWmtnHgETLu cQdLR4230cLJLdXoTDBeSFwdFZhEBkIOvioKhRUovtTD7VX0fsg9/plJZpjDLZkmxsu+ ynujdnxyMD1Ii8Jje4JknQgoNpANnZgKfCZVErFrYt+jh02+v1pvnfB/CrNvTbqqwHNC sMEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634722; x=1757239522; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=I83+DpOGB8BLeWuxSsvCnBXK47razkPCuWBaTDf4aQE=; b=VCtzbOvBJqg69MNt33y5uliIYg5OrS6Z1wZTVA1YxwE5wwvJBH+EBPBOCE998TUPwZ kyI39fAlKXmBZLLmXwDjJfdTFyHjiju/B0xZjwyMDSBB+a5GluU2VN1GzwUeo2PjVV5b tJXtE5+uOJl/WX7jBcneyInYig2Oq7DL7gQ2A8I2L82tUlegnYpKYVv+SIviTDcxrlZW JZ3hbw35d0Hv6KENJDI/g4fcgXNk5Ms9l/EFcEw4Bq34pzkSeyXRMLea1OZ13gHd97UZ c9eTbLZRUd3DWcnlN8FEs+phycsbOmJc6Y1EN6HbDisU4R68gzuWQCSx46ioqIJExhdS cl3w== X-Forwarded-Encrypted: i=1; AJvYcCX7u5dbet7M/FoTqKSGW63JDfo8BVjuty0+P66RLmfEeGLiT9xpW6kxiGXof0kzr/IKk0eCYGIc5UR4jcR6@vger.kernel.org, AJvYcCXIMehmxubBNwQHacGIaSNPatR4jq9mDiUKTGt1pqWJIa4rciGTNmG/TDzLqNUh8viMdUUgpwph7RWi@vger.kernel.org, AJvYcCXgYFK7rN7f+4hFztekVhXomXZN/V0lQQIFOpHUTjVSKtWklT+CW2RtUpoBs7teIZfSzn4SncLd@vger.kernel.org X-Gm-Message-State: AOJu0YwZ2IhsQad5YwcPwc5dWW2jUzgUxabXCXHjLpq0AjrOAD7V4Hfm pnI7l8UiAaB3EJ0r2m+u0uSJQAnpK0FzSgcW/LVF9Iz9ys7q1zhzgzh+ X-Gm-Gg: ASbGnctq8oIpY7SfLKeTIS2VQjDusDv4/YU5kuYwP85x4Ka+gfHXEsZ3mw2VrT0VKOd Kc2Ye+90StVDRw7Etgp4pNkXeSNeRk7WvZR9+A7V6uCTU3bT/Rtsh3Q7N7tFXmgLVqlVy8UWttS lY4WvyFOs8kH10T1cT7mrYXkJU51qWazwc9QmcfRqyOLNEudpTejf2qMWe4fwIPoDiiLjnuJSA3 AiSdbz3TR8geaFSq/5uH9csaGv/kuHrpjYR88ATuLeNilqjggoVn0bqLbwMnswk7uIn9MdpefuG aSs1kpIOHvmBRAaTQgak/3N5tg2tnaCuONSx4lTAWGowG1xlqqK8zdT5wyaYoh7SKou4uzX/Bir IQTCYGoplVvv8YhPAvN42G/8XD1GMF/AOlqAayVaEEi8Q4mG0AjOI X-Google-Smtp-Source: AGHT+IEibhSWnWE1MjJC3R8FtcJ7xPHK79tg4sHdHyBpZriX1kYAe8F7wgBhmcL8NFLqOUEO3nh6vA== X-Received: by 2002:a05:600c:478f:b0:45b:86e1:61e3 with SMTP id 5b1f17b1804b1-45b86e16457mr22690895e9.31.1756634721394; Sun, 31 Aug 2025 03:05:21 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:20 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek , stable@vger.kernel.org Subject: [PATCH v7 03/12] i2c: rtl9300: remove broken SMBus Quick operation support Date: Sun, 31 Aug 2025 10:04:48 +0000 Message-ID: <20250831100457.3114-4-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" Remove the SMBus Quick operation from this driver because it is not natively supported by the hardware and is wrongly implemented in the driver. The I2C controllers in Realtek RTL9300 and RTL9310 are SMBus-compliant but there doesn't seem to be native support for the SMBus Quick operation. It is not explicitly mentioned in the documentation but looking at the registers which configure an SMBus transaction, one can see that the data length cannot be set to 0. This suggests that the hardware doesn't allow any SMBus message without data bytes (except for those it does on it's own, see SMBus Block Read). The current implementation of SMBus Quick operation passes a length of 0 (which is actually invalid). Before the fix of a bug in a previous commit, this led to a read operation of 16 bytes from any register (the one of a former transaction or any other value. This caused issues like soft-bricked SFP modules after a simple probe with i2cdetect which uses Quick by default. Running this with SFP modules whose EEPROM isn't write-protected, some of the initial bytes are overwritten because a 16-byte write operation is executed instead of a Quick Write. (This temporarily soft-bricked one of my DAC cables.) Because SMBus Quick operation is obviously not supported on these controllers (because a length of 0 cannot be set, even when no register address is set), remove that instead of claiming there is support. There also shouldn't be any kind of emulated 'Quick' which just does another kind of operation in the background. Otherwise, specific issues occur in case of a 'Quick' Write which actually writes unknown data to an unknown register. Fixes: c366be720235 ("i2c: Add driver for the RTL9300 I2C controller") Cc: # v6.13+ Signed-off-by: Jonas Jelonek Tested-by: Sven Eckelmann Reviewed-by: Chris Packham Tested-by: Chris Packham # On RTL9302C = based board Tested-by: Markus Stockhausen --- drivers/i2c/busses/i2c-rtl9300.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/busses/i2c-rtl9300.c b/drivers/i2c/busses/i2c-rtl9= 300.c index ebd4a85e1bde..9e6232075137 100644 --- a/drivers/i2c/busses/i2c-rtl9300.c +++ b/drivers/i2c/busses/i2c-rtl9300.c @@ -235,15 +235,6 @@ static int rtl9300_i2c_smbus_xfer(struct i2c_adapter *= adap, u16 addr, unsigned s } =20 switch (size) { - case I2C_SMBUS_QUICK: - ret =3D rtl9300_i2c_config_xfer(i2c, chan, addr, 0); - if (ret) - goto out_unlock; - ret =3D rtl9300_i2c_reg_addr_set(i2c, 0, 0); - if (ret) - goto out_unlock; - break; - case I2C_SMBUS_BYTE: if (read_write =3D=3D I2C_SMBUS_WRITE) { ret =3D rtl9300_i2c_config_xfer(i2c, chan, addr, 0); @@ -344,9 +335,9 @@ static int rtl9300_i2c_smbus_xfer(struct i2c_adapter *a= dap, u16 addr, unsigned s =20 static u32 rtl9300_i2c_func(struct i2c_adapter *a) { - return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | - I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | - I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_I2C_BLOCK; + return I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_BLOCK_DATA | + I2C_FUNC_SMBUS_I2C_BLOCK; } =20 static const struct i2c_algorithm rtl9300_i2c_algo =3D { --=20 2.48.1 From nobody Fri Oct 3 13:21:30 2025 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.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 38D2825487A; Sun, 31 Aug 2025 10:05:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634726; cv=none; b=MHIEMS5cX/EVX1ZmtkpNtjBZqKPkNk3Wd5MZFABMVYyNWOEKfb0UF4isNY8ZZ1MfhaH73mxXO82CcL6Ll9beNPsbNayfWIcdtlfdHrJ78QrP0IFv8rdrSKYCRf4B+1Cgr3RnYU8/0lCq9j83NXrkguoxwTu8ggNlUA/BBTOqiFc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634726; c=relaxed/simple; bh=e1QmY1QLK1yolowpwxNvclifAJinhERgzj4RMDddsB8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bTfR5ZlJ6BtMo5RthH3Aqc2uxLegLTkB/ej3Y2IIDFaxcqeVGlxoReXKCtQtnJaeOyCE8qm4h+ZyGa1KOjptiut39HfMCCvz+Fao3FxEH04EzSEeydHcn6WK30kwPbJrjOeGA6AytcqvxFCIS0yOsMFI6MUHcE/RiJqfRh3tjXw= 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=BHua9oCL; arc=none smtp.client-ip=209.85.221.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="BHua9oCL" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-3b9edf4cf6cso2706379f8f.3; Sun, 31 Aug 2025 03:05:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634723; x=1757239523; 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; bh=od1k1bZUO2AlNGRYR4IfvamUlDJTyLsYC0w2AJXA07Q=; b=BHua9oCL+scS36jzdDKg3u7GFtXn0j9jKR85klhr6XCQaVYoikCbQ/3hOaWmurnUiR 2EugoA5KdfE4DozGavx3LRbXyPT1uXAg+8xNd/6nWaZES0gpfseTV6cCF/JEK9kznhHF Fb7h94+m1Es/AfSrVIJW836tC92ZwWiNrRMbk+BZDDx+wRg2RILcvnH62U4iX2375QO1 tlu1mvaH1G8gSyAPmvAZ0vSFyoQ06Z5BW1ZW5rKLuKTQkumYhkzCULjTYQwo7jp1FPzK On4Pv600FjSGMuJkppcyW3YwhOW4dsGTrvr5OcAnpfv8isSIhPvHFybvWn6k+G9nFzs1 yGLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634723; x=1757239523; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=od1k1bZUO2AlNGRYR4IfvamUlDJTyLsYC0w2AJXA07Q=; b=OPwBh6ANYjoh12KhR2XC1UD+80oomjVcaQ8CC5FDfB2bp1GK2cqBsn+SpSjKgeJi7X tXY5y4Vu5u7OYITzY6O4NLCeC6x0Bw2nW+FG7GlUj8IgAXsnJjmQ3RmuzeZjm5Y6EnVK 8nX1pe7lNe6RBid1JQH2NaJML6Wbe2HS+XwcE2Qm63ZCzlc+4FP+qzPnHluPltUQJWno aII2M88D4dcDRG3oe06bd5mrkRzDLL/3vD+mzKrAnZkxzTL2KXK6zDE6iZ7qmjEU7iTd j6AcpTzqct1kb8sQ/Hbbs4sZj+H3qk/6rAHyLyFBfboJOUELu98tR0TNshyL275uTsOk 40ig== X-Forwarded-Encrypted: i=1; AJvYcCVwsMLA8EHlDoaFW2y91Fpv1sgvJGAX7INSvNbsN9SS3mDxuFBYRxHf8ePTT8b689jCitT5rW4+9i/b@vger.kernel.org, AJvYcCVzdnl2V5hmffFKSeViRRfATwhtlEpqP9THeKxLlqRBs1mlZ/7YLkYRzEaArKOEWRzHS+f0vuoX3eBHhnqD@vger.kernel.org X-Gm-Message-State: AOJu0YwnZMxxsT/zYCYX+D4jLTpPmOENlI0uJqK7zEFqx5pwofcgK/YR ooVCQJ6P92Ed7l84IBQCEx9tPqLkmMrBNy7EGInWpYGBDiFrkrrxDOih X-Gm-Gg: ASbGncvJuPr3XCQpOgNL21igWNjvj6gxfYL8OjoKxa7wckm4+vgN2WGFMAFrFoQccer 3iXFhBeD9aFSj31dhAtpZa9W9UzI6EA6Eq+SsOyeT1hhDT5hDTAYAjb/pD1PsK5PFpgS4mPkVVP DgTDjgcuX/PEmOAiEL8Xht0Br56S3qMxMIQBV/N0mvK3hO/4C4SdULI6POI/kyg2nik8wpTKm5q 78ygcXnEky9DeEbBJa3vZXEAznyirqYYF/mqf+DiU8NjHbVvVqn05+mY6RXEj8uurClF/RyAtfJ UTA1STCloJCAdKjk04BCKCAm9Vir5nUoyhoDwiI/2HdSRNK4jUeCpak+vdbQPTTFfNQvtT/VOPs yCo4jDbYn9HxHNuEW78VE+YTCZLPO9R3vUcBHD6cT8IZ9163KoxtY6Mrw9tAfxco= X-Google-Smtp-Source: AGHT+IFqErpUlbrUHsMeO79dLfwRP1lG8w0jDbgd1dqPjOZJ0HMl/RAKe54yOMHQpDt57ObPosLFVg== X-Received: by 2002:a05:6000:250a:b0:3ca:d8b9:a4b4 with SMTP id ffacd0b85a97d-3d1de5b06c5mr2845182f8f.35.1756634722453; Sun, 31 Aug 2025 03:05:22 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:21 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek Subject: [PATCH v7 04/12] i2c: rtl9300: use regmap fields and API for registers Date: Sun, 31 Aug 2025 10:04:49 +0000 Message-ID: <20250831100457.3114-5-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" Adapt the RTL9300 I2C controller driver to use more of the regmap API, especially make use of reg_field and regmap_field instead of macros to represent registers. Most register operations are performed through regmap_field_* API then. Handle SCL selection using separate chip-specific functions since this is already known to differ between the Realtek SoC families in such a way that this cannot be properly handled using just a different reg_field. This makes it easier to add support for newer generations or to handle differences between specific revisions within a series. Just by defining a separate driver data structure with the corresponding register field definitions and linking it to a new compatible. Signed-off-by: Jonas Jelonek Tested-by: Sven Eckelmann Reviewed-by: Chris Packham Tested-by: Chris Packham # On RTL9302C = based board Tested-by: Markus Stockhausen --- drivers/i2c/busses/i2c-rtl9300.c | 192 ++++++++++++++++++++----------- 1 file changed, 124 insertions(+), 68 deletions(-) diff --git a/drivers/i2c/busses/i2c-rtl9300.c b/drivers/i2c/busses/i2c-rtl9= 300.c index 9e6232075137..8483bab72146 100644 --- a/drivers/i2c/busses/i2c-rtl9300.c +++ b/drivers/i2c/busses/i2c-rtl9300.c @@ -23,97 +23,117 @@ struct rtl9300_i2c_chan { u8 sda_pin; }; =20 +enum rtl9300_i2c_reg_scope { + REG_SCOPE_GLOBAL, + REG_SCOPE_MASTER, +}; + +struct rtl9300_i2c_reg_field { + struct reg_field field; + enum rtl9300_i2c_reg_scope scope; +}; + +enum rtl9300_i2c_reg_fields { + F_DATA_WIDTH =3D 0, + F_DEV_ADDR, + F_I2C_FAIL, + F_I2C_TRIG, + F_MEM_ADDR, + F_MEM_ADDR_WIDTH, + F_RD_MODE, + F_RWOP, + F_SCL_FREQ, + F_SCL_SEL, + F_SDA_OUT_SEL, + F_SDA_SEL, + + /* keep last */ + F_NUM_FIELDS +}; + +struct rtl9300_i2c_drv_data { + struct rtl9300_i2c_reg_field field_desc[F_NUM_FIELDS]; + int (*select_scl)(struct rtl9300_i2c *i2c, u8 scl); + u32 data_reg; + u8 max_nchan; +}; + #define RTL9300_I2C_MUX_NCHAN 8 =20 struct rtl9300_i2c { struct regmap *regmap; struct device *dev; struct rtl9300_i2c_chan chans[RTL9300_I2C_MUX_NCHAN]; + struct regmap_field *fields[F_NUM_FIELDS]; u32 reg_base; + u32 data_reg; u8 sda_pin; struct mutex lock; }; =20 #define RTL9300_I2C_MST_CTRL1 0x0 -#define RTL9300_I2C_MST_CTRL1_MEM_ADDR_OFS 8 -#define RTL9300_I2C_MST_CTRL1_MEM_ADDR_MASK GENMASK(31, 8) -#define RTL9300_I2C_MST_CTRL1_SDA_OUT_SEL_OFS 4 -#define RTL9300_I2C_MST_CTRL1_SDA_OUT_SEL_MASK GENMASK(6, 4) -#define RTL9300_I2C_MST_CTRL1_GPIO_SCL_SEL BIT(3) -#define RTL9300_I2C_MST_CTRL1_RWOP BIT(2) -#define RTL9300_I2C_MST_CTRL1_I2C_FAIL BIT(1) -#define RTL9300_I2C_MST_CTRL1_I2C_TRIG BIT(0) #define RTL9300_I2C_MST_CTRL2 0x4 -#define RTL9300_I2C_MST_CTRL2_RD_MODE BIT(15) -#define RTL9300_I2C_MST_CTRL2_DEV_ADDR_OFS 8 -#define RTL9300_I2C_MST_CTRL2_DEV_ADDR_MASK GENMASK(14, 8) -#define RTL9300_I2C_MST_CTRL2_DATA_WIDTH_OFS 4 -#define RTL9300_I2C_MST_CTRL2_DATA_WIDTH_MASK GENMASK(7, 4) -#define RTL9300_I2C_MST_CTRL2_MEM_ADDR_WIDTH_OFS 2 -#define RTL9300_I2C_MST_CTRL2_MEM_ADDR_WIDTH_MASK GENMASK(3, 2) -#define RTL9300_I2C_MST_CTRL2_SCL_FREQ_OFS 0 -#define RTL9300_I2C_MST_CTRL2_SCL_FREQ_MASK GENMASK(1, 0) #define RTL9300_I2C_MST_DATA_WORD0 0x8 #define RTL9300_I2C_MST_DATA_WORD1 0xc #define RTL9300_I2C_MST_DATA_WORD2 0x10 #define RTL9300_I2C_MST_DATA_WORD3 0x14 - #define RTL9300_I2C_MST_GLB_CTRL 0x384 =20 static int rtl9300_i2c_reg_addr_set(struct rtl9300_i2c *i2c, u32 reg, u16 = len) { - u32 val, mask; int ret; =20 - val =3D len << RTL9300_I2C_MST_CTRL2_MEM_ADDR_WIDTH_OFS; - mask =3D RTL9300_I2C_MST_CTRL2_MEM_ADDR_WIDTH_MASK; - - ret =3D regmap_update_bits(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_C= TRL2, mask, val); + ret =3D regmap_field_write(i2c->fields[F_MEM_ADDR_WIDTH], len); if (ret) return ret; =20 - val =3D reg << RTL9300_I2C_MST_CTRL1_MEM_ADDR_OFS; - mask =3D RTL9300_I2C_MST_CTRL1_MEM_ADDR_MASK; + return regmap_field_write(i2c->fields[F_MEM_ADDR], reg); +} =20 - return regmap_update_bits(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CT= RL1, mask, val); +static int rtl9300_i2c_select_scl(struct rtl9300_i2c *i2c, u8 scl) +{ + return regmap_field_write(i2c->fields[F_SCL_SEL], 1); } =20 static int rtl9300_i2c_config_io(struct rtl9300_i2c *i2c, u8 sda_pin) { + struct rtl9300_i2c_drv_data *drv_data; int ret; - u32 val, mask; =20 - ret =3D regmap_update_bits(i2c->regmap, RTL9300_I2C_MST_GLB_CTRL, BIT(sda= _pin), BIT(sda_pin)); + drv_data =3D (struct rtl9300_i2c_drv_data *)device_get_match_data(i2c->de= v); + + ret =3D regmap_field_update_bits(i2c->fields[F_SDA_SEL], BIT(sda_pin), BI= T(sda_pin)); if (ret) return ret; =20 - val =3D (sda_pin << RTL9300_I2C_MST_CTRL1_SDA_OUT_SEL_OFS) | - RTL9300_I2C_MST_CTRL1_GPIO_SCL_SEL; - mask =3D RTL9300_I2C_MST_CTRL1_SDA_OUT_SEL_MASK | RTL9300_I2C_MST_CTRL1_G= PIO_SCL_SEL; + ret =3D regmap_field_write(i2c->fields[F_SDA_OUT_SEL], sda_pin); + if (ret) + return ret; =20 - return regmap_update_bits(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CT= RL1, mask, val); + return drv_data->select_scl(i2c, 0); } =20 static int rtl9300_i2c_config_xfer(struct rtl9300_i2c *i2c, struct rtl9300= _i2c_chan *chan, u16 addr, u16 len) { - u32 val, mask; + int ret; =20 if (len < 1 || len > 16) return -EINVAL; =20 - val =3D chan->bus_freq << RTL9300_I2C_MST_CTRL2_SCL_FREQ_OFS; - mask =3D RTL9300_I2C_MST_CTRL2_SCL_FREQ_MASK; - - val |=3D addr << RTL9300_I2C_MST_CTRL2_DEV_ADDR_OFS; - mask |=3D RTL9300_I2C_MST_CTRL2_DEV_ADDR_MASK; + ret =3D regmap_field_write(i2c->fields[F_SCL_FREQ], chan->bus_freq); + if (ret) + return ret; =20 - val |=3D ((len - 1) & 0xf) << RTL9300_I2C_MST_CTRL2_DATA_WIDTH_OFS; - mask |=3D RTL9300_I2C_MST_CTRL2_DATA_WIDTH_MASK; + ret =3D regmap_field_write(i2c->fields[F_DEV_ADDR], addr); + if (ret) + return ret; =20 - mask |=3D RTL9300_I2C_MST_CTRL2_RD_MODE; + ret =3D regmap_field_write(i2c->fields[F_DATA_WIDTH], (len - 1) & 0xf); + if (ret) + return ret; =20 - return regmap_update_bits(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CT= RL2, mask, val); + return regmap_field_write(i2c->fields[F_RD_MODE], 0); } =20 static int rtl9300_i2c_read(struct rtl9300_i2c *i2c, u8 *buf, int len) @@ -124,8 +144,7 @@ static int rtl9300_i2c_read(struct rtl9300_i2c *i2c, u8= *buf, int len) if (len > 16) return -EIO; =20 - ret =3D regmap_bulk_read(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_DAT= A_WORD0, - vals, ARRAY_SIZE(vals)); + ret =3D regmap_bulk_read(i2c->regmap, i2c->data_reg, vals, ARRAY_SIZE(val= s)); if (ret) return ret; =20 @@ -152,52 +171,49 @@ static int rtl9300_i2c_write(struct rtl9300_i2c *i2c,= u8 *buf, int len) vals[reg] |=3D buf[i] << shift; } =20 - return regmap_bulk_write(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_DAT= A_WORD0, - vals, ARRAY_SIZE(vals)); + return regmap_bulk_write(i2c->regmap, i2c->data_reg, vals, ARRAY_SIZE(val= s)); } =20 static int rtl9300_i2c_writel(struct rtl9300_i2c *i2c, u32 data) { - return regmap_write(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_DATA_WOR= D0, data); + return regmap_write(i2c->regmap, i2c->data_reg, data); } =20 static int rtl9300_i2c_execute_xfer(struct rtl9300_i2c *i2c, char read_wri= te, int size, union i2c_smbus_data *data, int len) { - u32 val, mask; + u32 val; int ret; =20 - val =3D read_write =3D=3D I2C_SMBUS_WRITE ? RTL9300_I2C_MST_CTRL1_RWOP : = 0; - mask =3D RTL9300_I2C_MST_CTRL1_RWOP; - - val |=3D RTL9300_I2C_MST_CTRL1_I2C_TRIG; - mask |=3D RTL9300_I2C_MST_CTRL1_I2C_TRIG; + ret =3D regmap_field_write(i2c->fields[F_RWOP], read_write =3D=3D I2C_SMB= US_WRITE); + if (ret) + return ret; =20 - ret =3D regmap_update_bits(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_C= TRL1, mask, val); + ret =3D regmap_field_write(i2c->fields[F_I2C_TRIG], 1); if (ret) return ret; =20 - ret =3D regmap_read_poll_timeout(i2c->regmap, i2c->reg_base + RTL9300_I2C= _MST_CTRL1, - val, !(val & RTL9300_I2C_MST_CTRL1_I2C_TRIG), 100, 100000); + ret =3D regmap_field_read_poll_timeout(i2c->fields[F_I2C_TRIG], val, !val= , 100, 100000); if (ret) return ret; =20 - if (val & RTL9300_I2C_MST_CTRL1_I2C_FAIL) + ret =3D regmap_field_read(i2c->fields[F_I2C_FAIL], &val); + if (ret) + return ret; + if (val) return -EIO; =20 if (read_write =3D=3D I2C_SMBUS_READ) { switch (size) { case I2C_SMBUS_BYTE: case I2C_SMBUS_BYTE_DATA: - ret =3D regmap_read(i2c->regmap, - i2c->reg_base + RTL9300_I2C_MST_DATA_WORD0, &val); + ret =3D regmap_read(i2c->regmap, i2c->data_reg, &val); if (ret) return ret; data->byte =3D val & 0xff; break; case I2C_SMBUS_WORD_DATA: - ret =3D regmap_read(i2c->regmap, - i2c->reg_base + RTL9300_I2C_MST_DATA_WORD0, &val); + ret =3D regmap_read(i2c->regmap, i2c->data_reg, &val); if (ret) return ret; data->word =3D val & 0xffff; @@ -355,9 +371,11 @@ static int rtl9300_i2c_probe(struct platform_device *p= dev) { struct device *dev =3D &pdev->dev; struct rtl9300_i2c *i2c; + struct fwnode_handle *child; + struct rtl9300_i2c_drv_data *drv_data; + struct reg_field fields[F_NUM_FIELDS]; u32 clock_freq, sda_pin; int ret, i =3D 0; - struct fwnode_handle *child; =20 i2c =3D devm_kzalloc(dev, sizeof(*i2c), GFP_KERNEL); if (!i2c) @@ -376,9 +394,22 @@ static int rtl9300_i2c_probe(struct platform_device *p= dev) =20 platform_set_drvdata(pdev, i2c); =20 - if (device_get_child_node_count(dev) > RTL9300_I2C_MUX_NCHAN) + drv_data =3D (struct rtl9300_i2c_drv_data *)device_get_match_data(i2c->de= v); + if (device_get_child_node_count(dev) > drv_data->max_nchan) return dev_err_probe(dev, -EINVAL, "Too many channels\n"); =20 + i2c->data_reg =3D i2c->reg_base + drv_data->data_reg; + for (i =3D 0; i < F_NUM_FIELDS; i++) { + fields[i] =3D drv_data->field_desc[i].field; + if (drv_data->field_desc[i].scope =3D=3D REG_SCOPE_MASTER) + fields[i].reg +=3D i2c->reg_base; + } + ret =3D devm_regmap_field_bulk_alloc(dev, i2c->regmap, i2c->fields, + fields, F_NUM_FIELDS); + if (ret) + return ret; + + i =3D 0; device_for_each_child_node(dev, child) { struct rtl9300_i2c_chan *chan =3D &i2c->chans[i]; struct i2c_adapter *adap =3D &chan->adap; @@ -395,7 +426,6 @@ static int rtl9300_i2c_probe(struct platform_device *pd= ev) case I2C_MAX_STANDARD_MODE_FREQ: chan->bus_freq =3D RTL9300_I2C_STD_FREQ; break; - case I2C_MAX_FAST_MODE_FREQ: chan->bus_freq =3D RTL9300_I2C_FAST_FREQ; break; @@ -427,11 +457,37 @@ static int rtl9300_i2c_probe(struct platform_device *= pdev) return 0; } =20 +#define GLB_REG_FIELD(reg, msb, lsb) \ + { .field =3D REG_FIELD(reg, msb, lsb), .scope =3D REG_SCOPE_GLOBAL } +#define MST_REG_FIELD(reg, msb, lsb) \ + { .field =3D REG_FIELD(reg, msb, lsb), .scope =3D REG_SCOPE_MASTER } + +static const struct rtl9300_i2c_drv_data rtl9300_i2c_drv_data =3D { + .field_desc =3D { + [F_MEM_ADDR] =3D MST_REG_FIELD(RTL9300_I2C_MST_CTRL1, 8, 31), + [F_SDA_OUT_SEL] =3D MST_REG_FIELD(RTL9300_I2C_MST_CTRL1, 4, 6), + [F_SCL_SEL] =3D MST_REG_FIELD(RTL9300_I2C_MST_CTRL1, 3, 3), + [F_RWOP] =3D MST_REG_FIELD(RTL9300_I2C_MST_CTRL1, 2, 2), + [F_I2C_FAIL] =3D MST_REG_FIELD(RTL9300_I2C_MST_CTRL1, 1, 1), + [F_I2C_TRIG] =3D MST_REG_FIELD(RTL9300_I2C_MST_CTRL1, 0, 0), + [F_RD_MODE] =3D MST_REG_FIELD(RTL9300_I2C_MST_CTRL2, 15, 15), + [F_DEV_ADDR] =3D MST_REG_FIELD(RTL9300_I2C_MST_CTRL2, 8, 14), + [F_DATA_WIDTH] =3D MST_REG_FIELD(RTL9300_I2C_MST_CTRL2, 4, 7), + [F_MEM_ADDR_WIDTH] =3D MST_REG_FIELD(RTL9300_I2C_MST_CTRL2, 2, 3), + [F_SCL_FREQ] =3D MST_REG_FIELD(RTL9300_I2C_MST_CTRL2, 0, 1), + [F_SDA_SEL] =3D GLB_REG_FIELD(RTL9300_I2C_MST_GLB_CTRL, 0, 7), + }, + .select_scl =3D rtl9300_i2c_select_scl, + .data_reg =3D RTL9300_I2C_MST_DATA_WORD0, + .max_nchan =3D RTL9300_I2C_MUX_NCHAN, +}; + + static const struct of_device_id i2c_rtl9300_dt_ids[] =3D { - { .compatible =3D "realtek,rtl9301-i2c" }, - { .compatible =3D "realtek,rtl9302b-i2c" }, - { .compatible =3D "realtek,rtl9302c-i2c" }, - { .compatible =3D "realtek,rtl9303-i2c" }, + { .compatible =3D "realtek,rtl9301-i2c", .data =3D (void *) &rtl9300_i2c_= drv_data }, + { .compatible =3D "realtek,rtl9302b-i2c", .data =3D (void *) &rtl9300_i2c= _drv_data }, + { .compatible =3D "realtek,rtl9302c-i2c", .data =3D (void *) &rtl9300_i2c= _drv_data }, + { .compatible =3D "realtek,rtl9303-i2c", .data =3D (void *) &rtl9300_i2c_= drv_data }, {} }; MODULE_DEVICE_TABLE(of, i2c_rtl9300_dt_ids); --=20 2.48.1 From nobody Fri Oct 3 13:21:30 2025 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.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 2D3F12561C2; Sun, 31 Aug 2025 10:05:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634726; cv=none; b=Cx88XyJjD+gpIo/q2XBYzOXRa9AlT2aLcrQgZZaB+KYRTpu3/zgVAeGfxQCKVugqLdXfFaNg2hjmTTs3MFC4sVHQtRE3tpS0PylvB7Atac0RCblTuhBdHjbKjCzIz6TvLNYyoM9fSQtfah5tMAak9tkVpwqNxNjH2bZjGPubKI0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634726; c=relaxed/simple; bh=Ll33ycNIWhblme6tiFpLduL39Kk1FOG/s0GEQJ/3Kkc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YWM4TF2rOzufycoYZh26sexele0MqwOuo6g4ZWRInaJg1OPoHVlW71tDIsY+MzT/wfSZLjNWRzLNkXjg59vXo1xzkgdatxP5NvhV/0j7rPlWAHGMRE5yxsZg7WpIzLTM1Vy/b/s2OEEn76oy55DF+zGwYjrv4Bd81xDl787Cbhs= 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=WCsE25b4; arc=none smtp.client-ip=209.85.221.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="WCsE25b4" Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-3b9edf4cf6cso2706386f8f.3; Sun, 31 Aug 2025 03:05:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634723; x=1757239523; 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; bh=MY8qwrmK4KpRQmuFNf2j7FLHohlWWrtwD6aQcm5+d3A=; b=WCsE25b44X07anbLSuIlRj+4yOUtX0Y/DUGBw0O3kml+4j2vwjxzadJE93nzVE6O9C JLrf3ksrA32E6P5pO+qZrxTBgYTRdFi0zpowG3c/nCwZfjBuU20BjiYwnxoV10Aulr3N tTJVAeZN0jHkaf60vlHo6MNLhg9iwBMpwSNtEB+vNTjt/XNjZXIIw0+O+k03OujdgqGJ V6Lh5XPCLEKygX39fcCH1QyFMbNlAYuGVES/mq6+UG2KfAKtIjsvCbigipx1qUh5AK2B cEIoW2Mb415aEcfb2HCzLvC2N00JnW97UI0BIcCkpZ9yvtdB4/90wTmfy+7Rl4RAx2Xx pVQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634723; x=1757239523; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MY8qwrmK4KpRQmuFNf2j7FLHohlWWrtwD6aQcm5+d3A=; b=uN1ltnTp6G9Vfurs0QvTnzGIKf6eCHvn5/SJGZfWGWXuMDRp7BW4I6bygRjkEd6NBn 56t0HVO4Ve8BJQ2BpbqNSErTJFHpmrnz7NDgBWLlJmHywM6AymN7qrWqsH5qil4T7LfK 5fRhnuznmDO0kr169Dm9/OfyJeqnxns6S4d734umFhNCbeQcCpv+FN3V55UXjeBHmxST tw2Dn88NhwFkdrhVWs+NgKBuBjmacqSrrT1V0rLhq/yi5mbBXtWgJbDXDco6hQSaVqPq khk8I8nDYSuOzpBHgAFPA2dtZptZG+KFpbtUBS0LU0tY2o5CaTqDn+JZJbRNhVlVjFhv aZXQ== X-Forwarded-Encrypted: i=1; AJvYcCUJDCLv6f0UpiKwIrZM8SnU4TLUJZ7AWw+IUcn1DoMYrdrxTTJaaVLn1WvQEb+0kwx0apDyB0FXTUgPKhCt@vger.kernel.org, AJvYcCW/FWlaVjHuplxSa1wFZG7sDoQKTceueV3GQPm9r87IAgFcmvtkGvfgWmRKEgWgXFinGxE1ydQIyLEP@vger.kernel.org X-Gm-Message-State: AOJu0YwDS9EitwThx3SzeJtyuFwTvMShwWIgjA7GXQVPMsOg1QFGyRti iLpR63rhEq3EtDJwcBXpeLf+/l7qxgLd0k79NmD7D4eMTxu7wXZ6wqIf X-Gm-Gg: ASbGncud3Ftp5O2V49q3qq7FwOk6ngoF8yN9rzgrGCSNPB5E+JUkehKrPF9Gf73Gt24 VoSbXsGGyj2q1J/F65EBr+8X+c269RjX1aTwJXjwdheNW7N+bRjhOWC9rm1UmvxVv+lwlRnUuxC lf13Z8vRRylOpG3QJJ0RGzfXgKcq9gjGgyYl/yD0oUnz1clnCNgbmEEZ6VPlHK9Zqtyw9NOxkPv Oyakw/fEc31soyerBcmqNTzgBBQJsyQt3lj97524JuJ3ZgRCUwTH2UmuxowZC8J5L+qstvvIbM1 lAQR5abuzOOZbRFeEFLnj5dcepKUkxh2izUIdwhZk/Zssabdjxko9kqRSnYGo0cQArYWTzg9f/8 aVN6W4+MeI2m3eUFKjr1Ow6XZeTupMb3DYhT8jmykG086eWidVUjr X-Google-Smtp-Source: AGHT+IGEWQq3T5l6eBDGheMEMEaj3FJPHu2nebRC/A1DyvDw8+kzBaqjsmDTU47+NiY5GXyLVg8XQg== X-Received: by 2002:adf:a350:0:b0:3d2:52e3:920c with SMTP id ffacd0b85a97d-3d252e39ae7mr1893886f8f.44.1756634723405; Sun, 31 Aug 2025 03:05:23 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:22 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek Subject: [PATCH v7 05/12] dt-bindings: i2c: realtek,rtl9301-i2c: fix wording and typos Date: Sun, 31 Aug 2025 10:04:50 +0000 Message-ID: <20250831100457.3114-6-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" Fix wording of binding description to use plural because there is not only a single RTL9300 SoC. RTL9300 describes a whole family of Realtek SoCs. Add missing word 'of' in description of reg property. Change 'SDA pin' to 'SDA line number' because the property must contain the SDA (channel) number ranging from 0-7 instead of a real pin number. Signed-off-by: Jonas Jelonek Reviewed-by: Rob Herring (Arm) Reviewed-by: Chris Packham Tested-by: Chris Packham # On RTL9302C = based board Tested-by: Markus Stockhausen --- .../devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml= b/Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml index 69ac5db8b914..274e2ab8b612 100644 --- a/Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml +++ b/Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml @@ -10,7 +10,7 @@ maintainers: - Chris Packham =20 description: - The RTL9300 SoC has two I2C controllers. Each of these has an SCL line (= which + RTL9300 SoCs have two I2C controllers. Each of these has an SCL line (wh= ich if not-used for SCL can be a GPIO). There are 8 common SDA lines that ca= n be assigned to either I2C controller. =20 @@ -27,7 +27,7 @@ properties: =20 reg: items: - - description: Register offset and size this I2C controller. + - description: Register offset and size of this I2C controller. =20 "#address-cells": const: 1 @@ -42,7 +42,7 @@ patternProperties: =20 properties: reg: - description: The SDA pin associated with the I2C bus. + description: The SDA line number associated with the I2C bus. maxItems: 1 =20 required: --=20 2.48.1 From nobody Fri Oct 3 13:21:30 2025 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (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 28C03257453; Sun, 31 Aug 2025 10:05:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634728; cv=none; b=urCNJgUSf7BKu//vYv4GrfG5aNG5it1M3JfFLKFkvhtn+DzR3FSerNuDqVjMKWU7aMEAm3+QHxvvLzeGoPmujrdXhHgIE3+IqQ4acHxw4VcQdxg67LKcWPU8hV2Xrp2oO/8oFi5X6F2UkQr0Jg1mikL8s/VqIF/AAhlyS4PSzT0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634728; c=relaxed/simple; bh=2GCjGAmxaqdnNa1gX1x/7BofCtSlrnlXaasLQu8+NAQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OHybEVusUHYroUHQnKXultMkTVZg9elQHKZfne35CtpvICj1fTIfANm94Xn6kcyUFqdQ+fVeYoN9P5pWnG/vQVWNwlrU929hI0llTUB69Z6kcrexEnCQWKC5CE7GjDNBeSZDWRf2Z6BpUeKDhwB2R08QIktDlLBkXSV/zpryi/M= 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=hraYQVhI; arc=none smtp.client-ip=209.85.128.48 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="hraYQVhI" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-45b873a2092so7271235e9.1; Sun, 31 Aug 2025 03:05:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634724; x=1757239524; 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; bh=TkmZ10FKl6mvyrUUIGFDD4hFu3/JPG8wZl/qSp4EmOc=; b=hraYQVhINdSSgTId9TrwA4Mm4mTTCWkB63TOQkNCXtExAgqMrmBIGMql7k8ndcV/EE XcZL5inKWUHVTBjH0mkrrAGTMQYLxowmjNsVjSkQb3mYdI1VYlwBE9GiGTkcWQiBz/oc Ecl4EPMCFA2vd28pn+Yw9RM/UH9XSGo5jRNDqhJiXKsLA7GyJGRz6K4YkQrkcFXBSTC/ H8w2bqugl55pKV55k6D0cqaAGPFKQAybvB4+RD0q4C0LBU5WN5KzdHNbHPNPYvs2t7Th 01LXGxK7dq5ptKmqD9kt98VOPjbkQ1CoZYbFDdo5lpnn0Qc6LwA7nB8p1895y98Vix6G qbXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634724; x=1757239524; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TkmZ10FKl6mvyrUUIGFDD4hFu3/JPG8wZl/qSp4EmOc=; b=Fk+VilIYPxSbeh0y36U0uZFayLAXbvomOQYdy7N7V54c95OkoMGFEFmY13nT4DqjO4 ujxzDiWYzgZq1U3r/10MNg5BJgblzeLZmr/hXh7KD/6Fhbx3eCR5F3hRe7FoJBW5CQCl j6p4qZWgxWI+FyU1REXqajGN/dlHXEHHI99F/7IsATkq/2bRcS1+2CmxG2w/XPyKmbfQ MbYxzC1o+jzTHcDdpuSPY+s+nF/EoAZKJiNDl2+aSuDMqOKHabezeYVccRjOE2wfIfEn 6ppv8NupjpkWKEpkLwVea62WgR7pPbnZAK6LHDh8LbSdUv8VdbPC2polqMxmTDJtnWO4 NJZw== X-Forwarded-Encrypted: i=1; AJvYcCWYDVi0vaSxB6sRhKiL8OSftZ+mwdTIfwOSqUUr8MaopKSKGqDOLrMrCJQaSbfwZkTW3O6XPWhocAFC@vger.kernel.org, AJvYcCWnNjr1rspfGIc/G1M6YAm/oPhaCCE/jQ0HHRuM1c4wxZlmpHEqjDKtpURwL6h00TINrDbtDaAkHpFbCQV6@vger.kernel.org X-Gm-Message-State: AOJu0YzA03XhzU2TutKn0anO3b+dltNBcXDY78koDhDUn9Y9Eh4CzXpE ucD4NJAGPhAF8nNM16VgkwJ3ZS0kJuRA+K7XEAABVwH6tCVffuqzjni/ X-Gm-Gg: ASbGncvi1oGw7MUOamFjSike3Hb7vvIy8D4kF9S3e1RIiziriSyrjELe50eIeRtAF96 1bZF9oGz2LEyGAAmVUka0Mlrld4ai2l7PtZcq/tKTFTZ3q0jm7L4IwBUsxFgzFNRJbYPH4Q6s0+ Olsv7/4wpkIVTj/pmNWSpcUhGZzrcgEvf3H5opbnMvFfFh2uVrtQMZNxfUtqTdZR2OGVavgJqk1 jeFD9184yln/i50UO2FmtD3Ri02gQkHHrAf5JTC5Dw6DNQfoKG6H0wv4Dn7JvAJQprQaTdNI04g rbakJt8G0Fh+ZxLx98ffeQg1i8mRdZ6oIJJ3J5B6+9TVYM9CESD1lvfQ/hhYo28CNT6aCvXUl7y VQ4MlGxNJkXd+CDFQfLATn4RimY9RV6sru6PqNe6LFP/l+9sm0f28w5FCrrlvNfg= X-Google-Smtp-Source: AGHT+IFHd+cbxTNTyLSm6Sh19e8IA78Gv2awYFjRBvAOtqm+vZGnDpnebu//bf+QZgIR1WCesi0+8w== X-Received: by 2002:a05:600c:4e07:b0:45b:8795:4caa with SMTP id 5b1f17b1804b1-45b87954e09mr23579645e9.36.1756634724285; Sun, 31 Aug 2025 03:05:24 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:23 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek Subject: [PATCH v7 06/12] i2c: rtl9300: rename internal sda_pin to sda_num Date: Sun, 31 Aug 2025 10:04:51 +0000 Message-ID: <20250831100457.3114-7-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" Rename the internally used 'sda_pin' to 'sda_num' to make it clear that this is NOT the actual pin number of the GPIO pin but rather the logical SDA channel number. Although the alternate function SDA_Y is sometimes given with the GPIO number, this is not always the case. Thus, avoid any confusion or misconfiguration by giving the variable the correct name. This follows the description change in the devicetree bindings. Signed-off-by: Jonas Jelonek Tested-by: Sven Eckelmann Reviewed-by: Chris Packham Tested-by: Chris Packham # On RTL9302C = based board Tested-by: Markus Stockhausen --- drivers/i2c/busses/i2c-rtl9300.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/busses/i2c-rtl9300.c b/drivers/i2c/busses/i2c-rtl9= 300.c index 8483bab72146..f9b5ac7670c2 100644 --- a/drivers/i2c/busses/i2c-rtl9300.c +++ b/drivers/i2c/busses/i2c-rtl9300.c @@ -20,7 +20,7 @@ struct rtl9300_i2c_chan { struct i2c_adapter adap; struct rtl9300_i2c *i2c; enum rtl9300_bus_freq bus_freq; - u8 sda_pin; + u8 sda_num; }; =20 enum rtl9300_i2c_reg_scope { @@ -67,7 +67,7 @@ struct rtl9300_i2c { struct regmap_field *fields[F_NUM_FIELDS]; u32 reg_base; u32 data_reg; - u8 sda_pin; + u8 sda_num; struct mutex lock; }; =20 @@ -102,11 +102,11 @@ static int rtl9300_i2c_config_io(struct rtl9300_i2c *= i2c, u8 sda_pin) =20 drv_data =3D (struct rtl9300_i2c_drv_data *)device_get_match_data(i2c->de= v); =20 - ret =3D regmap_field_update_bits(i2c->fields[F_SDA_SEL], BIT(sda_pin), BI= T(sda_pin)); + ret =3D regmap_field_update_bits(i2c->fields[F_SDA_SEL], BIT(sda_num), BI= T(sda_num)); if (ret) return ret; =20 - ret =3D regmap_field_write(i2c->fields[F_SDA_OUT_SEL], sda_pin); + ret =3D regmap_field_write(i2c->fields[F_SDA_OUT_SEL], sda_num); if (ret) return ret; =20 @@ -243,11 +243,11 @@ static int rtl9300_i2c_smbus_xfer(struct i2c_adapter = *adap, u16 addr, unsigned s int len =3D 0, ret; =20 mutex_lock(&i2c->lock); - if (chan->sda_pin !=3D i2c->sda_pin) { + if (chan->sda_num !=3D i2c->sda_num) { ret =3D rtl9300_i2c_config_io(i2c, chan->sda_pin); if (ret) goto out_unlock; - i2c->sda_pin =3D chan->sda_pin; + i2c->sda_num =3D chan->sda_num; } =20 switch (size) { @@ -374,7 +374,7 @@ static int rtl9300_i2c_probe(struct platform_device *pd= ev) struct fwnode_handle *child; struct rtl9300_i2c_drv_data *drv_data; struct reg_field fields[F_NUM_FIELDS]; - u32 clock_freq, sda_pin; + u32 clock_freq, sda_num; int ret, i =3D 0; =20 i2c =3D devm_kzalloc(dev, sizeof(*i2c), GFP_KERNEL); @@ -414,7 +414,7 @@ static int rtl9300_i2c_probe(struct platform_device *pd= ev) struct rtl9300_i2c_chan *chan =3D &i2c->chans[i]; struct i2c_adapter *adap =3D &chan->adap; =20 - ret =3D fwnode_property_read_u32(child, "reg", &sda_pin); + ret =3D fwnode_property_read_u32(child, "reg", &sda_num); if (ret) return ret; =20 @@ -431,11 +431,11 @@ static int rtl9300_i2c_probe(struct platform_device *= pdev) break; default: dev_warn(i2c->dev, "SDA%d clock-frequency %d not supported using defaul= t\n", - sda_pin, clock_freq); + sda_num, clock_freq); break; } =20 - chan->sda_pin =3D sda_pin; + chan->sda_num =3D sda_num; chan->i2c =3D i2c; adap =3D &i2c->chans[i].adap; adap->owner =3D THIS_MODULE; @@ -445,14 +445,14 @@ static int rtl9300_i2c_probe(struct platform_device *= pdev) adap->dev.parent =3D dev; i2c_set_adapdata(adap, chan); adap->dev.of_node =3D to_of_node(child); - snprintf(adap->name, sizeof(adap->name), "%s SDA%d\n", dev_name(dev), sd= a_pin); + snprintf(adap->name, sizeof(adap->name), "%s SDA%d\n", dev_name(dev), sd= a_num); i++; =20 ret =3D devm_i2c_add_adapter(dev, adap); if (ret) return ret; } - i2c->sda_pin =3D 0xff; + i2c->sda_num =3D 0xff; =20 return 0; } --=20 2.48.1 From nobody Fri Oct 3 13:21:30 2025 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 E21DD2580D1; Sun, 31 Aug 2025 10:05:26 +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=1756634728; cv=none; b=eUsszHv5unBD4dxWBYfADPgP3rTbUV1jZPpGJHHcmNBMQ7NAY5aiIG+qEWKy1l6CmvLSbrHANKOmpe/fAkcgYeTHV4xuJn+AcsmI9RY/yq2ffy1/L9sk5MyrLZ6nTLlKVbVISPV9GQHSOonftUoMQf9kfnl/TFwHtuE7DJgPYvg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634728; c=relaxed/simple; bh=AFqIY5K8sOwwkDorLtwVJ59nbbKz5t+8UF9iXhMSMFU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BUi95sN7B+LnIblvyg0ZIDr63FPELEt51ayFN9DPZ6yBb/vWqdY3dnDO/QvZUhtPiA+HNfgXmK/OfyI4S7V6Q1e2wKlBmivyoJRYqOzcJ8m4zzRYplCkILEjaZI/7X2ZoFOT1HNBbA8j3juZXxwUIh0rWMCHy7GzkqRPscjCxGo= 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=DSsfooEt; 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="DSsfooEt" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-45b7d485204so25257175e9.0; Sun, 31 Aug 2025 03:05:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634725; x=1757239525; 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; bh=o66Q1Lw8zZ/26/utPV4SsAzNqR677/9mko2KdXqHbnM=; b=DSsfooEtYEzekMaveLKepVn/aRZ8OwCAOQV1YrupQWzumoyBtRq6pZW/FXkgE5uxy2 DiLTfYs2ytV0572u/1zGw76EXCDiVp5b+RHzqmW09gAlCqMcZG9ynQt6kFSyEZ/F/NU0 R3NkBgBlvJac3/BjoCWt+dwrSmdXHnj/J4i57wYIRQGLnubSycPy1gisLLI3ZnrcvIGH lyWWggNTn2go29804ZLAm2RdyzM+BFLW78r9mK/npEJilljL2yEkn6CKqyw2a3/CNafK mhFmWw+xLWUAexchMCZTR4A82uC5QfQRdA+Hc/D+WhqRErZsL8m+byoWb3TrK3NU/7Wf hgcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634725; x=1757239525; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=o66Q1Lw8zZ/26/utPV4SsAzNqR677/9mko2KdXqHbnM=; b=fRbPOK1Yd0mN68b5bv9lKiQp50ANi35JjUVO31gSlGry7UtH6obY8Bb+BAobrfkqv9 ZDTdshkGM3crG6zwMj/gySOzFLPquA4keqbosoYb10rHKb/qR73TNATpC3/T1IxSBg+j hjQca7yuHBTTOcXr8ByDKgfehobxunXu0NI5RIWtE45/Y+gEtdXs2H2CWeGsGNqZLlB1 i0ONp8MB3KNNFVAwdbOzWIovthkEy7R2T+XjE7SURhuz6cR2xGHaib00yzVmqpFNguhL R6ijI8YWh5r3CBXpiibGBVSzYXHokwUYuFdYj5f9mkOvItGBWzusd8+I5uCgF5yHtpuN 7qig== X-Forwarded-Encrypted: i=1; AJvYcCW6InqrHKdWUcto3rxR5w0sLtCQs4EIJpY6jbTOw2Q3EGbM3Z733pm4Gh9wpqp7oQ2hduptzcx01qRT2yfz@vger.kernel.org, AJvYcCWNXuOefI1NjdeF2/DXE5h2+SPOM0HfYlZJDBbAQwJN3LTzoGKp/Bqwhtg/XJaRhF8JD+ec6JEXmsjp@vger.kernel.org X-Gm-Message-State: AOJu0YwlQ2wvALQ23VfI948czVp8tDRVjvrCiYXvqCbTY4Gd/4XGYeEs efseoVFeDGEwoMOFz8E0SSyYrcBTXUAuI0X6kN4JwQMnul4VIAgO7Htx X-Gm-Gg: ASbGnctA8/p5b8Gm5OnlNqnpAemJrPT6NgNG5j7Jj0JDDH7v9qOEuoRtdGjqAqc0xE1 gfJ+wPhu8bOhbBrhjlVc3+CSBwVY7FoTYHUZ2AVyQTx930GxjyuGkBhFShX9pNeGY9Rd7mStbJv VZzR3FbGtWsRFYNWhn0v3fsPAAQEwD0RHL1xrbz/ELGe0BKpCt0ZY08fcLWWJ0BinUvvrR8nURO UN9aup1zPvccdc4003P/S3SgeOcYoHrVdYELroQzum1J1KGpYRnuRo70ypWWm0Qs7y8sB53pkAw BusPpd5rw2ap3i4YySH3sG2ues4PA4yDwVSsMQ6MfSuXQcSb61kRjDPfwYolPkotGes5u3zRIlI yYb/lKApEucZc1+VIiHvNGyyV2Hmhgq7liiRMV3w71P+ZCtBpS4lM8AQUG2Vfb4g= X-Google-Smtp-Source: AGHT+IH3jKttu8rAtw8BSFmnn0cJTwUT4uzNMmOU7IgfEmOeVmCI6xNeewf1huJJhLnE12ik36596g== X-Received: by 2002:a05:600c:3b16:b0:459:d709:e5d4 with SMTP id 5b1f17b1804b1-45b8549c493mr30476145e9.0.1756634725111; Sun, 31 Aug 2025 03:05:25 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:24 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek Subject: [PATCH v7 07/12] i2c: rtl9300: move setting SCL frequency to config_io Date: Sun, 31 Aug 2025 10:04:52 +0000 Message-ID: <20250831100457.3114-8-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" Move the register operation to set the SCL frequency to the rtl9300_i2c_config_io function instead of the rtl9300_i2c_config_xfer function. This rather belongs there next to selecting the current SDA output line. Signed-off-by: Jonas Jelonek Tested-by: Sven Eckelmann Reviewed-by: Chris Packham Tested-by: Chris Packham # On RTL9302C = based board Tested-by: Markus Stockhausen --- drivers/i2c/busses/i2c-rtl9300.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/i2c/busses/i2c-rtl9300.c b/drivers/i2c/busses/i2c-rtl9= 300.c index f9b5ac7670c2..4177cfb77094 100644 --- a/drivers/i2c/busses/i2c-rtl9300.c +++ b/drivers/i2c/busses/i2c-rtl9300.c @@ -95,18 +95,23 @@ static int rtl9300_i2c_select_scl(struct rtl9300_i2c *i= 2c, u8 scl) return regmap_field_write(i2c->fields[F_SCL_SEL], 1); } =20 -static int rtl9300_i2c_config_io(struct rtl9300_i2c *i2c, u8 sda_pin) +static int rtl9300_i2c_config_io(struct rtl9300_i2c *i2c, struct rtl9300_i= 2c_chan *chan) { struct rtl9300_i2c_drv_data *drv_data; int ret; =20 drv_data =3D (struct rtl9300_i2c_drv_data *)device_get_match_data(i2c->de= v); =20 - ret =3D regmap_field_update_bits(i2c->fields[F_SDA_SEL], BIT(sda_num), BI= T(sda_num)); + ret =3D regmap_field_update_bits(i2c->fields[F_SDA_SEL], BIT(chan->sda_nu= m), + BIT(chan->sda_num)); if (ret) return ret; =20 - ret =3D regmap_field_write(i2c->fields[F_SDA_OUT_SEL], sda_num); + ret =3D regmap_field_write(i2c->fields[F_SDA_OUT_SEL], chan->sda_num); + if (ret) + return ret; + + ret =3D regmap_field_write(i2c->fields[F_SCL_FREQ], chan->bus_freq); if (ret) return ret; =20 @@ -121,10 +126,6 @@ static int rtl9300_i2c_config_xfer(struct rtl9300_i2c = *i2c, struct rtl9300_i2c_c if (len < 1 || len > 16) return -EINVAL; =20 - ret =3D regmap_field_write(i2c->fields[F_SCL_FREQ], chan->bus_freq); - if (ret) - return ret; - ret =3D regmap_field_write(i2c->fields[F_DEV_ADDR], addr); if (ret) return ret; @@ -244,7 +245,7 @@ static int rtl9300_i2c_smbus_xfer(struct i2c_adapter *a= dap, u16 addr, unsigned s =20 mutex_lock(&i2c->lock); if (chan->sda_num !=3D i2c->sda_num) { - ret =3D rtl9300_i2c_config_io(i2c, chan->sda_pin); + ret =3D rtl9300_i2c_config_io(i2c, chan); if (ret) goto out_unlock; i2c->sda_num =3D chan->sda_num; --=20 2.48.1 From nobody Fri Oct 3 13:21:30 2025 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (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 27D3824676D; Sun, 31 Aug 2025 10:05:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634730; cv=none; b=A+bqWJ8Bh1JUsV5KFURhpVuIGKtsTTPTy0rlzClBUUaYZHd8CXfS+Mad0H+Rwwn+nQtUH/tgLtPnB9/Riws3lQ4Gov2Fjc3yQsPdVbrC4Jf5nDKE+Iar25ArkSKkEAmnFpOsNdJRtFXdICP48Njp35lINGyQ5kfTnS5gXi8nikU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634730; c=relaxed/simple; bh=326M5U9OojDe1lhkwFS7orxwbfULH69OkT0S7OD+L1E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WbrEYhI+B5baTn2Bcu05zthULQiuTaqgY2KEIhZtHazttX/jFQx1bPH1XH/kUIuOFAw7D3LE/K8wBOMsZLXTu9H58YrEUZVF5jbO2blvPrrwIFhgSzg7SnYFKR6Bwoz6ixbVskmJ5j/3NJd1XqmR+KJUXGBHNkn9HLotv7Qtmtg= 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=KePVivY0; arc=none smtp.client-ip=209.85.128.41 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="KePVivY0" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-45b873a2092so7271375e9.1; Sun, 31 Aug 2025 03:05:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634726; x=1757239526; 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; bh=yqzVllIT2yt3PFzcaYved+nt+MYV4oPu8rzPsTcO43Y=; b=KePVivY01b+sEWZUFkZ4lR8GYP2dKre9sSBKpDRT+2NAA7N15mgg6DkLUlrEJH6HqO J5Y4dHT6Qi1FH1CB0BhQIMYCOwgNw8ITvQotwn/x0bdjxw+kXrUc0NYjFRjeccOH38Ay MlLKUD+91nDx7nlFXn+MlV/pEsVlTMnUblXW8jiYl6pl5Aa8U8MFRRSc1aVvjobganz+ OSL56++uMCdrbInbGPaOAEL33mVSt20NZMwKQKeTR2Fjtz9afNT1IoWqr7EHpaSnAVFl EX8UGNVhX85CtDrpapJdSVO9lQxixzI2CVqYQiYjBStWtYIwiRYVS5xMbkAwyV27/nVT ClOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634726; x=1757239526; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=yqzVllIT2yt3PFzcaYved+nt+MYV4oPu8rzPsTcO43Y=; b=he2U/pGONLLj2WcJcZoHdHQYr5k8n3P9sq959frsdBoXqd3KRUWhjQZa41fw7ppPRM CdjMZuqzCvIbvEYIS9hr/oPxBZy2CHnTmhaX0eojVzcPAxlVNM858uoltmoitZLcbKOI vs9idZQAC1py4Nmicbq2jy06MyJiDwS4miixC2xWJr2qxDv2URWtSTxMz0tFY9fLBSy4 m4EenpDQf9KydX5Ef1zLHVNd9PFaQCxGEbGx/ixLlj9+XGS5s94w8XXr3DHgChKRz87G Fx4ml8pbrVNi/8XNx5ejoNb5lfX+BH7ryNfw1lXnctJ7Q92Gp+zorQZchV04sHAnfS6N 9hbA== X-Forwarded-Encrypted: i=1; AJvYcCVkHQ+/LGigQeZA8LmCrcBVIN/Tv9YTY5QnKtuxociHWWqyDWjn+Qoas8YhP91dZWkW+sPUe8I7vEEJC3qL@vger.kernel.org, AJvYcCWbmQ8nmbftEz03pVo+rIfwNP+J93uXPZgoMijplOPkEh5T9USGj0b2UAIjYAAiCB6XUn0YbExbokJj@vger.kernel.org X-Gm-Message-State: AOJu0YyS4Dx0zlRTHvtHS4t7FDmb+igCO0YCLqFEf23bgFumgm0EOhCM g+vjk1ZXEDHAZgDb1LKL47wMYl2YUS9j1calzCpQpR54rCAeLyZyEYBh X-Gm-Gg: ASbGnct/363vkl8sT2Xe7oPVzb7JHZELqqBigZlJ+LSaoAmFtDIpTNS3Fh8mijfBhoY R0DZrBzbhMFfVwO1a3pvHVXKxkwy18gQ0iRl20PcDeQy2eSUK1ya2Upk6VZU6Gtj39m19xZgQTU bnavVP3qni19F+001FxMOaPUgocg3ASzREA6qPvGeJNNMge0zGqvbTgWyGuLGMzqmR65c3GuYZq hfj46vkCFPJXuYsDNzsOcQhux32CRCPfMkNuVM2UiIvOr6w6JA7L3U0Tfuz/yT+f7s4g+yZfcZ4 cpHI2SvmbbOrk1M5bptWMcfFinPdrzmUUDIibONgbRX+OUvK9Oled6HQP0tu65KYsJJ0ncA4ZjV 8djCjOFBi4D9S18nCbrXfSYms9sMJackeoJiDG+xx1KMCdCzytxhf X-Google-Smtp-Source: AGHT+IE2G+a5prT+qXpeyJ3UQTjX9jm7OkOdX2x3Am5y8oGbKbwjj+GGkhgmDbyNqWoBEjoWWPwiiQ== X-Received: by 2002:a05:600c:c8a:b0:45b:8bce:40c4 with SMTP id 5b1f17b1804b1-45b8bce4223mr3003655e9.31.1756634725971; Sun, 31 Aug 2025 03:05:25 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:25 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek Subject: [PATCH v7 08/12] i2c: rtl9300: do not set read mode on every transfer Date: Sun, 31 Aug 2025 10:04:53 +0000 Message-ID: <20250831100457.3114-9-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" Move the operation to set the read mode from config_xfer to probe. The I2C controller of RTL9300 and RTL9310 support a legacy message mode for READs with 'Read Address Data' instead of the standard format 'Write Address ; Read Data'. There is no way to pass that via smbus_xfer, thus there is no point in supported this in the driver and moreover no point in setting this on every transaction. Setting this once in the probe call is sufficient. Signed-off-by: Jonas Jelonek Tested-by: Sven Eckelmann Reviewed-by: Chris Packham Tested-by: Chris Packham # On RTL9302C = based board Tested-by: Markus Stockhausen --- drivers/i2c/busses/i2c-rtl9300.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/i2c/busses/i2c-rtl9300.c b/drivers/i2c/busses/i2c-rtl9= 300.c index 4177cfb77094..9e3517b09b3d 100644 --- a/drivers/i2c/busses/i2c-rtl9300.c +++ b/drivers/i2c/busses/i2c-rtl9300.c @@ -130,11 +130,7 @@ static int rtl9300_i2c_config_xfer(struct rtl9300_i2c = *i2c, struct rtl9300_i2c_c if (ret) return ret; =20 - ret =3D regmap_field_write(i2c->fields[F_DATA_WIDTH], (len - 1) & 0xf); - if (ret) - return ret; - - return regmap_field_write(i2c->fields[F_RD_MODE], 0); + return regmap_field_write(i2c->fields[F_DATA_WIDTH], (len - 1) & 0xf); } =20 static int rtl9300_i2c_read(struct rtl9300_i2c *i2c, u8 *buf, int len) @@ -455,6 +451,11 @@ static int rtl9300_i2c_probe(struct platform_device *p= dev) } i2c->sda_num =3D 0xff; =20 + /* only use standard read format */ + ret =3D regmap_field_write(i2c->fields[F_RD_MODE], 0); + if (ret) + return ret; + return 0; } =20 --=20 2.48.1 From nobody Fri Oct 3 13:21:30 2025 Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) (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 E8A09257851; Sun, 31 Aug 2025 10:05:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634731; cv=none; b=nsGD9TTb7SrPlv8sHAMeI/O/r80L6bCoaGKL1NN+1BgLMeFVPRVo5XIIbIZiWs8rzzBKuGURScXlbxWYqK9EF/lZ/etFgFIC1pKDX6QV+YFCbxxuMxB07GQGw5PKYqg43PkXYCbMvR9JjK6fNuTQtyCQcMsriOWTsiniUk/lvqY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634731; c=relaxed/simple; bh=GPOFKt13/FNDlZX7rRsEbrM35HRXtQFY1CfTF4pC0u0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=U2+kOEBqvFwJ6kDVfob6Bw+3CqDa3TJxhLIdkfJq1SW/UEaFr5CI0Yana3Ae+uySVHt3LGnPkTMurrtKRLEe2nEnttdduMgrKPM3ULAcee2SM9hnoPijpMXaGWeXEwj+K4STQazH4mNRK89lAPhdHqfaD+3JH4qevb4SnuhOTmY= 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=kMfrT1ES; arc=none smtp.client-ip=209.85.221.47 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="kMfrT1ES" Received: by mail-wr1-f47.google.com with SMTP id ffacd0b85a97d-3d3f46e231fso442366f8f.3; Sun, 31 Aug 2025 03:05:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634727; x=1757239527; 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; bh=X3jDFjCLGk6E0Gk7i6q1zKlf4ViBoITsu0/4LLG3MPo=; b=kMfrT1ES+g4GZHXG4axxZq9aIz77VQPIFIhPEJx/W/mLI1SVqruzF3EwO08T4sfexe s4smvOwg0e2qK90B19OHt8UKZtCSYR10a0xsjXo7w3USm8LztXriay2t9qzTo/AFXboh 1dzawYwfNQdYAxwJCwFWd0hdbYXGLDesK0uNf+C1E/vBgITBaO8oAtNEemHj2Y5TWeuq dR+43LN1j52vjvWVzwzDiOLkCVsEMH+5vPN5H/XgTd2Blqj+lrqEzY5j5w0jxBJaH9ex 4V5Mgl4WEmHIIqeMUgQNn6EYwml+sFliBWrW5N9BBb5wW0xsBCFymCwCy4zwKEdUP2cd aptw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634727; x=1757239527; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=X3jDFjCLGk6E0Gk7i6q1zKlf4ViBoITsu0/4LLG3MPo=; b=XQF9I+QIuAtd0L1ep3AruP9lEWlBepz4EthqH9SNi5ekczfivRsqgxdzolylHSf6Ov 7dy8xb64veIGj/oLY5z6cze7CD2x4+QUp6nuVFoo85LbjUrjviPbY6YiTUEY0Wc4WbmA Mpx8y1v4OLXSWWi+RuVNl7vJ6qZtM0QE1iYZvYQLvJlREjtsHD8YdjDCMIlxMG3hDXg/ 6eB00aSAqJJ8r9lpvHK7W7IIKNTLUrBd9yeRtSc6KrSCxbZErxrgB+npkxHPczCGA/dZ lr1lbUpcGPEjX7try6xjlxWUb+4ra7U4al2Od8SflcKDfJg9jtV7D0AmtH8SMRgZoILM KuXg== X-Forwarded-Encrypted: i=1; AJvYcCUEVIsUs4WnecLCMaWNsYLxLP75BriTYcckVafH4qyURDHDKVQHhEW7vLnH8MnfyRV0DfKxB7hOGoMu@vger.kernel.org, AJvYcCWBfpFyzoJ2sS9N7mjteRX/+IEFteBYzkDLgcUjbncztoJgk3xjHLGthJPYNhwkugBJQftQht0T3HSa+ea8@vger.kernel.org X-Gm-Message-State: AOJu0YwmXb4rnPxu+yHpMfDdl1eWaFq/eoJLmjfpswqZumhpzD/Dqq4c QZg44i5gl/yZCM7TnjsxGrC5ZaemaYLvboSRdL/JhZr/lAoVX5LSeZtS X-Gm-Gg: ASbGncuZJ3OTZ0TEEi7gX2AUM9jdhq08HODIJcswlYDS5QycqfSjbTesi6s/CS3uu5n AUoju/VNDV7sScPMJBS82CsBcD0oU6CKP8awC7NgsaqZim7Eu1CysM170mVQyi4GtWOo0nkasfw mYQWQ0f2YtgijCOMfjO9l5O6svmngo/dmO5NkcKn9tZ5N8KzlMtfErG5ZDcwQ7I6Eaw3nKTT4yw q3xWordR2UQjl0J7ZlxhHHgEHJQEF9SYYLWganZ3z9OFLZvxfdBNzfWti7O/gqasQ0UBSp2WejX RU3DvUdOIJEAK4xoWr9VKhozaaRQKwEIa6O4Qf+O4ZkCyztYj+au0TwAe4SgoxCmZlzTLb/KXou Tu5BioD661ANQbd0pgAFp06U5iAguvKTzNAyTDQ9jhs7KdywnHSVxuoZrxHvsrSU= X-Google-Smtp-Source: AGHT+IGrGMnnJZq8f9JRXIrltyj1uZjqBRAgxmnmLutVBQZmgpK6Uyp/FhpfSDHuEvn8Ielja496fQ== X-Received: by 2002:a05:6000:2884:b0:3d1:b783:bbd6 with SMTP id ffacd0b85a97d-3d1dc699f69mr2459704f8f.3.1756634726904; Sun, 31 Aug 2025 03:05:26 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:26 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek Subject: [PATCH v7 09/12] i2c: rtl9300: separate xfer configuration and execution Date: Sun, 31 Aug 2025 10:04:54 +0000 Message-ID: <20250831100457.3114-10-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" So far, the rtl9300_i2c_smbus_xfer code is quite a mess with function calls distributed over the whole function setting different values in different cases. Calls to rtl9300_i2c_config_xfer and rtl9300_i2c_reg_addr_set are used in every case-block with varying values whose meaning is not instantly obvious. In some cases, there are additional calls within these case-blocks doing more things. This is in general a bad design and especially really bad for readability and maintainability because it distributes changes or issues to multiple locations due to the same function being called with different hardcoded values in different places. To have a good structure, setting different parameters based on the desired operation should not be interleaved with applying these parameters to the hardware registers. Or in different words, the parameter site should be mixed with the call site. Thus, separate configuration and execution of an SMBus xfer within rtl9300_i2c_smbus_xfer to improve readability and maintainability. Add a new 'struct rtl9300_i2c_xfer' to carry the required parameters for an xfer which are configured based on the input parameters within a single switch-case block, without having any function calls within this block. The function calls to actually apply these values to the hardware registers then appear below in a single place and just operate on the passed instance of 'struct rtl9300_i2c_xfer'. These are 'rtl9300_i2c_prepare_xfer' which combines applying all parameters of the xfer to the corresponding register, and 'rtl9300_i2c_do_xfer' which actually executes the xfer and does post-processing if needed. Signed-off-by: Jonas Jelonek Tested-by: Sven Eckelmann Reviewed-by: Chris Packham Tested-by: Chris Packham # On RTL9302C = based board Tested-by: Markus Stockhausen --- drivers/i2c/busses/i2c-rtl9300.c | 234 +++++++++++++++---------------- 1 file changed, 114 insertions(+), 120 deletions(-) diff --git a/drivers/i2c/busses/i2c-rtl9300.c b/drivers/i2c/busses/i2c-rtl9= 300.c index 9e3517b09b3d..fb3ebbd46a18 100644 --- a/drivers/i2c/busses/i2c-rtl9300.c +++ b/drivers/i2c/busses/i2c-rtl9300.c @@ -8,6 +8,7 @@ #include #include #include +#include =20 enum rtl9300_bus_freq { RTL9300_I2C_STD_FREQ, @@ -71,6 +72,22 @@ struct rtl9300_i2c { struct mutex lock; }; =20 +enum rtl9300_i2c_xfer_type { + RTL9300_I2C_XFER_BYTE, + RTL9300_I2C_XFER_WORD, + RTL9300_I2C_XFER_BLOCK, +}; + +struct rtl9300_i2c_xfer { + enum rtl9300_i2c_xfer_type type; + u16 dev_addr; + u8 reg_addr; + u8 reg_addr_len; + u8 *data; + u8 data_len; + bool write; +}; + #define RTL9300_I2C_MST_CTRL1 0x0 #define RTL9300_I2C_MST_CTRL2 0x4 #define RTL9300_I2C_MST_DATA_WORD0 0x8 @@ -95,45 +112,37 @@ static int rtl9300_i2c_select_scl(struct rtl9300_i2c *= i2c, u8 scl) return regmap_field_write(i2c->fields[F_SCL_SEL], 1); } =20 -static int rtl9300_i2c_config_io(struct rtl9300_i2c *i2c, struct rtl9300_i= 2c_chan *chan) +static int rtl9300_i2c_config_chan(struct rtl9300_i2c *i2c, struct rtl9300= _i2c_chan *chan) { struct rtl9300_i2c_drv_data *drv_data; int ret; =20 - drv_data =3D (struct rtl9300_i2c_drv_data *)device_get_match_data(i2c->de= v); + if (i2c->sda_num =3D=3D chan->sda_num) + return 0; =20 - ret =3D regmap_field_update_bits(i2c->fields[F_SDA_SEL], BIT(chan->sda_nu= m), - BIT(chan->sda_num)); + ret =3D regmap_field_write(i2c->fields[F_SCL_FREQ], chan->bus_freq); if (ret) return ret; =20 - ret =3D regmap_field_write(i2c->fields[F_SDA_OUT_SEL], chan->sda_num); + drv_data =3D (struct rtl9300_i2c_drv_data *)device_get_match_data(i2c->de= v); + ret =3D drv_data->select_scl(i2c, 0); if (ret) return ret; =20 - ret =3D regmap_field_write(i2c->fields[F_SCL_FREQ], chan->bus_freq); + ret =3D regmap_field_update_bits(i2c->fields[F_SDA_SEL], BIT(chan->sda_nu= m), + BIT(chan->sda_num)); if (ret) return ret; =20 - return drv_data->select_scl(i2c, 0); -} - -static int rtl9300_i2c_config_xfer(struct rtl9300_i2c *i2c, struct rtl9300= _i2c_chan *chan, - u16 addr, u16 len) -{ - int ret; - - if (len < 1 || len > 16) - return -EINVAL; - - ret =3D regmap_field_write(i2c->fields[F_DEV_ADDR], addr); + ret =3D regmap_field_write(i2c->fields[F_SDA_OUT_SEL], chan->sda_num); if (ret) return ret; =20 - return regmap_field_write(i2c->fields[F_DATA_WIDTH], (len - 1) & 0xf); + i2c->sda_num =3D chan->sda_num; + return 0; } =20 -static int rtl9300_i2c_read(struct rtl9300_i2c *i2c, u8 *buf, int len) +static int rtl9300_i2c_read(struct rtl9300_i2c *i2c, u8 *buf, u8 len) { u32 vals[4] =3D {}; int i, ret; @@ -153,7 +162,7 @@ static int rtl9300_i2c_read(struct rtl9300_i2c *i2c, u8= *buf, int len) return 0; } =20 -static int rtl9300_i2c_write(struct rtl9300_i2c *i2c, u8 *buf, int len) +static int rtl9300_i2c_write(struct rtl9300_i2c *i2c, u8 *buf, u8 len) { u32 vals[4] =3D {}; int i; @@ -176,16 +185,51 @@ static int rtl9300_i2c_writel(struct rtl9300_i2c *i2c= , u32 data) return regmap_write(i2c->regmap, i2c->data_reg, data); } =20 -static int rtl9300_i2c_execute_xfer(struct rtl9300_i2c *i2c, char read_wri= te, - int size, union i2c_smbus_data *data, int len) +static int rtl9300_i2c_prepare_xfer(struct rtl9300_i2c *i2c, struct rtl930= 0_i2c_xfer *xfer) { - u32 val; int ret; =20 - ret =3D regmap_field_write(i2c->fields[F_RWOP], read_write =3D=3D I2C_SMB= US_WRITE); + if (xfer->data_len < 1 || xfer->data_len > 16) + return -EINVAL; + + ret =3D regmap_field_write(i2c->fields[F_DEV_ADDR], xfer->dev_addr); + if (ret) + return ret; + + ret =3D rtl9300_i2c_reg_addr_set(i2c, xfer->reg_addr, xfer->reg_addr_len); + if (ret) + return ret; + + ret =3D regmap_field_write(i2c->fields[F_RWOP], xfer->write); + if (ret) + return ret; + + ret =3D regmap_field_write(i2c->fields[F_DATA_WIDTH], (xfer->data_len - 1= ) & 0xf); if (ret) return ret; =20 + if (xfer->write) { + switch (xfer->type) { + case RTL9300_I2C_XFER_BYTE: + ret =3D rtl9300_i2c_writel(i2c, *xfer->data); + break; + case RTL9300_I2C_XFER_WORD: + ret =3D rtl9300_i2c_writel(i2c, get_unaligned((const u16 *)xfer->data)); + break; + default: + ret =3D rtl9300_i2c_write(i2c, xfer->data, xfer->data_len); + break; + } + } + + return ret; +} + +static int rtl9300_i2c_do_xfer(struct rtl9300_i2c *i2c, struct rtl9300_i2c= _xfer *xfer) +{ + u32 val; + int ret; + ret =3D regmap_field_write(i2c->fields[F_I2C_TRIG], 1); if (ret) return ret; @@ -200,28 +244,24 @@ static int rtl9300_i2c_execute_xfer(struct rtl9300_i2= c *i2c, char read_write, if (val) return -EIO; =20 - if (read_write =3D=3D I2C_SMBUS_READ) { - switch (size) { - case I2C_SMBUS_BYTE: - case I2C_SMBUS_BYTE_DATA: + if (!xfer->write) { + switch (xfer->type) { + case RTL9300_I2C_XFER_BYTE: ret =3D regmap_read(i2c->regmap, i2c->data_reg, &val); if (ret) return ret; - data->byte =3D val & 0xff; + + *xfer->data =3D val & 0xff; break; - case I2C_SMBUS_WORD_DATA: + case RTL9300_I2C_XFER_WORD: ret =3D regmap_read(i2c->regmap, i2c->data_reg, &val); if (ret) return ret; - data->word =3D val & 0xffff; - break; - case I2C_SMBUS_I2C_BLOCK_DATA: - ret =3D rtl9300_i2c_read(i2c, &data->block[1], len); - if (ret) - return ret; + + put_unaligned(val & 0xffff, (u16*)xfer->data); break; default: - ret =3D rtl9300_i2c_read(i2c, &data->block[0], len); + ret =3D rtl9300_i2c_read(i2c, xfer->data, xfer->data_len); if (ret) return ret; break; @@ -237,108 +277,62 @@ static int rtl9300_i2c_smbus_xfer(struct i2c_adapter= *adap, u16 addr, unsigned s { struct rtl9300_i2c_chan *chan =3D i2c_get_adapdata(adap); struct rtl9300_i2c *i2c =3D chan->i2c; - int len =3D 0, ret; + struct rtl9300_i2c_xfer xfer =3D {0}; + int ret; + + if (addr > 0x7f) + return -EINVAL; =20 mutex_lock(&i2c->lock); - if (chan->sda_num !=3D i2c->sda_num) { - ret =3D rtl9300_i2c_config_io(i2c, chan); - if (ret) - goto out_unlock; - i2c->sda_num =3D chan->sda_num; - } + + ret =3D rtl9300_i2c_config_chan(i2c, chan); + if (ret) + goto out_unlock; + + xfer.dev_addr =3D addr & 0x7f; + xfer.write =3D (read_write =3D=3D I2C_SMBUS_WRITE); + xfer.reg_addr =3D command; + xfer.reg_addr_len =3D 1; =20 switch (size) { case I2C_SMBUS_BYTE: - if (read_write =3D=3D I2C_SMBUS_WRITE) { - ret =3D rtl9300_i2c_config_xfer(i2c, chan, addr, 0); - if (ret) - goto out_unlock; - ret =3D rtl9300_i2c_reg_addr_set(i2c, command, 1); - if (ret) - goto out_unlock; - } else { - ret =3D rtl9300_i2c_config_xfer(i2c, chan, addr, 1); - if (ret) - goto out_unlock; - ret =3D rtl9300_i2c_reg_addr_set(i2c, 0, 0); - if (ret) - goto out_unlock; - } + xfer.data =3D (read_write =3D=3D I2C_SMBUS_READ) ? &data->byte : &comman= d; + xfer.data_len =3D 1; + xfer.reg_addr =3D 0; + xfer.reg_addr_len =3D 0; + xfer.type =3D RTL9300_I2C_XFER_BYTE; break; - case I2C_SMBUS_BYTE_DATA: - ret =3D rtl9300_i2c_reg_addr_set(i2c, command, 1); - if (ret) - goto out_unlock; - ret =3D rtl9300_i2c_config_xfer(i2c, chan, addr, 1); - if (ret) - goto out_unlock; - if (read_write =3D=3D I2C_SMBUS_WRITE) { - ret =3D rtl9300_i2c_writel(i2c, data->byte); - if (ret) - goto out_unlock; - } + xfer.data =3D &data->byte; + xfer.data_len =3D 1; + xfer.type =3D RTL9300_I2C_XFER_BYTE; break; - case I2C_SMBUS_WORD_DATA: - ret =3D rtl9300_i2c_reg_addr_set(i2c, command, 1); - if (ret) - goto out_unlock; - ret =3D rtl9300_i2c_config_xfer(i2c, chan, addr, 2); - if (ret) - goto out_unlock; - if (read_write =3D=3D I2C_SMBUS_WRITE) { - ret =3D rtl9300_i2c_writel(i2c, data->word); - if (ret) - goto out_unlock; - } + xfer.data =3D (u8 *)&data->word; + xfer.data_len =3D 2; + xfer.type =3D RTL9300_I2C_XFER_WORD; break; - case I2C_SMBUS_BLOCK_DATA: - ret =3D rtl9300_i2c_reg_addr_set(i2c, command, 1); - if (ret) - goto out_unlock; - if (data->block[0] < 1 || data->block[0] > I2C_SMBUS_BLOCK_MAX) { - ret =3D -EINVAL; - goto out_unlock; - } - ret =3D rtl9300_i2c_config_xfer(i2c, chan, addr, data->block[0] + 1); - if (ret) - goto out_unlock; - if (read_write =3D=3D I2C_SMBUS_WRITE) { - ret =3D rtl9300_i2c_write(i2c, &data->block[0], data->block[0] + 1); - if (ret) - goto out_unlock; - } - len =3D data->block[0] + 1; + xfer.data =3D &data->block[0]; + xfer.data_len =3D data->block[0] + 1; + xfer.type =3D RTL9300_I2C_XFER_BLOCK; break; - case I2C_SMBUS_I2C_BLOCK_DATA: - ret =3D rtl9300_i2c_reg_addr_set(i2c, command, 1); - if (ret) - goto out_unlock; - if (data->block[0] < 1 || data->block[0] > I2C_SMBUS_BLOCK_MAX) { - ret =3D -EINVAL; - goto out_unlock; - } - ret =3D rtl9300_i2c_config_xfer(i2c, chan, addr, data->block[0]); - if (ret) - goto out_unlock; - if (read_write =3D=3D I2C_SMBUS_WRITE) { - ret =3D rtl9300_i2c_write(i2c, &data->block[1], data->block[0]); - if (ret) - goto out_unlock; - } - len =3D data->block[0]; + xfer.data =3D &data->block[1]; + xfer.data_len =3D data->block[0]; + xfer.type =3D RTL9300_I2C_XFER_BLOCK; break; - default: dev_err(&adap->dev, "Unsupported transaction %d\n", size); ret =3D -EOPNOTSUPP; goto out_unlock; } =20 - ret =3D rtl9300_i2c_execute_xfer(i2c, read_write, size, data, len); + ret =3D rtl9300_i2c_prepare_xfer(i2c, &xfer); + if (ret) + goto out_unlock; + + ret =3D rtl9300_i2c_do_xfer(i2c, &xfer); =20 out_unlock: mutex_unlock(&i2c->lock); --=20 2.48.1 From nobody Fri Oct 3 13:21:30 2025 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 A937A25A35D; Sun, 31 Aug 2025 10:05:29 +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=1756634733; cv=none; b=VkzUAsZPVFUIyQZksXgnf7uQ927sSJyrAGkQVjWnlSBjC22OMlLIgZ116858unXe0qXTDy3QXP7v4me8V3FUzD2b4jxyeGRH/v/2C5bUOW0AOMjQhx8DnLxk2jLCnvrTph9tWECB/MPZfDwW6ODMW1ckbz/evjjg4PQgA0U7sFc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634733; c=relaxed/simple; bh=vEHdMu4fZDG0pv0OrxT4yCsQ2r9RoDo1W3KJXPI34so=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hFDoJkDkIteBYaMpEH2h+6pqpfL4f2fUXfLVCHp/N6DTpl/qz8tzLBLEgtQHOz/tTQ/twmfo6n9/srBiYe8yFDOyDGiQpbtgisL6/VTzJsomSPse+28lIG0fn9wtykyBaWyutAz6+PLNP5fV0/4qG35LA4QVSOMgTskHuSn8Iz8= 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=fHR/jSx6; 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="fHR/jSx6" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-45b7d485173so19551385e9.0; Sun, 31 Aug 2025 03:05:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634728; x=1757239528; 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; bh=rVYljPZ7zSakciHIair+w4BKANbFUIx4H7fyvtM/0P4=; b=fHR/jSx6S87PuSQfhS8v6Sw402yAOSA3+2ccMCID74C8pBDGGWgl4RmNKPGPtxGJbh 39rB9jCnA0GkhKiZHKAJl6c/sVWOBSnn0pUy7tuccTV77aOlj1u7g7SzTH05hAOaNWN4 7wHr2R3y6+mJBeuchUw7rxLNDAEAllZkEkf+O9z3un1un56c2sc1MZBw4z3yJLMC6UZT zfiZ0ajs2ugFx1K3HH69iwYyVgKdDcTt4IYWK33gsRD231quHbLkkOqPX7i22Ucv2pMM 66zYJWyDajwaSM6WjadjSi3DXTOOeYUvnp1fdaFK9+jN9NIHblo+WkeQg0aIBiGm+4kR fIhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634728; x=1757239528; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rVYljPZ7zSakciHIair+w4BKANbFUIx4H7fyvtM/0P4=; b=n7DXI82CkUB3kvlQfYoNTtpolOfWqj03e5/V7fZI/2M+NQYgClxKkMgFLqNdPUfwLm Vm4sWuXK1npn+Yo4O0+Kd2F9w3l28HuPSNnPysMHJZdrxzk43OrBHk3AXUGSElTYlpFP QjbEnvrn3ptTZo3GN0ohbfBGmMdjL1EvDo8t8E6kr0n456YHGpBE5bMuZIfTXZR/5kgn ItH3AwQMitBvf2qdKsUW1IhyaIcFo4a9YC9IcC1TkPn15D9t/bvED2aTzpe3SzpR12ZP OyPtZOYGZiKaomRDaKMmt13VVuLhfOiW7OYS76cbJEosV9SQGj/2wMZAgiMQiu6ys2J3 fYSA== X-Forwarded-Encrypted: i=1; AJvYcCVGGVnRVj9y2TVFi+VHizPGx37tgPDZCc3TSjCAQN+AXtqKGOx+mejKlflm/eVCSoTdLjW3jZfYgZDb@vger.kernel.org, AJvYcCVqnm2tJ+ZKlJNkZk8geXZDIOLf5hnKaUMUVUpr9ryWzVLyZEVmAxVqx/+ImFgY2Df1iZVUsluhtYfWAqGx@vger.kernel.org X-Gm-Message-State: AOJu0YyucFeIOg54kF26UgWaEsNFca3LSW9CwQ4jzXQbZffBG+pPIo1n UpbPB+SFXPAB48q+riBxt2P24ToG38KNHlcfrTjM8MYKUIQGYwbc12yY/I3TCA== X-Gm-Gg: ASbGncsJ6KvHQMU15RccvWpEzGTSUADQUaf/cNZkv15+Xld2jm5V0fkIqycvXh/sJSt 7DsyA8eW/1s+2RDTMTLvFdaLncoaaYPJJtmdDTGOYa+TQ9HHGMaaqT4FmaLgxDQzVJJucpAEYpA bhy6Px7BzNbiZe/qGnc1nF5uvYkDWOsB+q9dfkbEBHSSRoLXhYYAGigMcK2/829WkAdK1c1odqy /a7iw7wM7vCPP/97Rb4ZXkOpcENwAnvqydfZObvIK/pq+zDEcGL9+DeX0K7E/g4MiA9pmLGsnWA q0g31NjDegghMaI/sTkY+jAWjZpxer9YJqCuqTq3EhFNy9g1C71nQlZXHJ56AatSu7B1JJ7t2rS j0mcj2zVMlnGmx0w4CNbwC5HLu8vlBwk1LOLLVonI+ci21FyRXl5i X-Google-Smtp-Source: AGHT+IFscJ7ti8f3py0rgPMa3sPM+GkbBJW2hqxoKCX38wnkA/sFJZEDxaFRipo1X1CkGm+y6e6s3w== X-Received: by 2002:a05:600c:474f:b0:45b:7951:92a2 with SMTP id 5b1f17b1804b1-45b85571351mr29190805e9.18.1756634727754; Sun, 31 Aug 2025 03:05:27 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:27 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek Subject: [PATCH v7 10/12] i2c: rtl9300: use scoped guard instead of explicit lock/unlock Date: Sun, 31 Aug 2025 10:04:55 +0000 Message-ID: <20250831100457.3114-11-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" Use the scoped guard infrastructure which unlocks a mutex automatically when the guard goes out of scope, instead of explicit lock and unlock. This simplifies the code and control flow in rtl9300_i2c_smbus_xfer and removes the need of using goto in error cases to unlock before returning. Signed-off-by: Jonas Jelonek Reviewed-by: Chris Packham Tested-by: Chris Packham # On RTL9302C = based board Tested-by: Markus Stockhausen --- drivers/i2c/busses/i2c-rtl9300.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/drivers/i2c/busses/i2c-rtl9300.c b/drivers/i2c/busses/i2c-rtl9= 300.c index fb3ebbd46a18..c67463228604 100644 --- a/drivers/i2c/busses/i2c-rtl9300.c +++ b/drivers/i2c/busses/i2c-rtl9300.c @@ -72,6 +72,8 @@ struct rtl9300_i2c { struct mutex lock; }; =20 +DEFINE_GUARD(rtl9300_i2c, struct rtl9300_i2c *, mutex_lock(&_T->lock), mut= ex_unlock(&_T->lock)) + enum rtl9300_i2c_xfer_type { RTL9300_I2C_XFER_BYTE, RTL9300_I2C_XFER_WORD, @@ -283,11 +285,11 @@ static int rtl9300_i2c_smbus_xfer(struct i2c_adapter = *adap, u16 addr, unsigned s if (addr > 0x7f) return -EINVAL; =20 - mutex_lock(&i2c->lock); + guard(rtl9300_i2c)(i2c); =20 ret =3D rtl9300_i2c_config_chan(i2c, chan); if (ret) - goto out_unlock; + return ret; =20 xfer.dev_addr =3D addr & 0x7f; xfer.write =3D (read_write =3D=3D I2C_SMBUS_WRITE); @@ -324,20 +326,14 @@ static int rtl9300_i2c_smbus_xfer(struct i2c_adapter = *adap, u16 addr, unsigned s break; default: dev_err(&adap->dev, "Unsupported transaction %d\n", size); - ret =3D -EOPNOTSUPP; - goto out_unlock; + return -EOPNOTSUPP; } =20 ret =3D rtl9300_i2c_prepare_xfer(i2c, &xfer); if (ret) - goto out_unlock; - - ret =3D rtl9300_i2c_do_xfer(i2c, &xfer); - -out_unlock: - mutex_unlock(&i2c->lock); + return ret; =20 - return ret; + return rtl9300_i2c_do_xfer(i2c, &xfer); } =20 static u32 rtl9300_i2c_func(struct i2c_adapter *a) --=20 2.48.1 From nobody Fri Oct 3 13:21:30 2025 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.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 9CFC325C818; Sun, 31 Aug 2025 10:05:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634732; cv=none; b=AhRLYdg5lht7B7qLPnqJpE6KvEjJasZb2NRXAUSPyFdO+5QxP5lqp2UD+JfxLmJ561td1XMLf7w40AZYAifb+Ug20qsBkyXyPpkzlvaDewuhnIz7DeaGFkaOzqvd5XjH/n1s92K0UicaDJ3uNkjyLdP6XyCh6qM0Jcj9ODlFFSU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634732; c=relaxed/simple; bh=gnOswjnbXmBMi405dgP0uHVoleNWn/lcXZxumvVI8g0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VxJieNrDN/aSCU4iOrHKlafEe7Vya00XvUNjDGkzkRfaG0t2kdcjHUdF5htBZb6CBqlHYo3zFwI0NDbOWPZHZOqTVh3WLnNSpyq0fxm6QspF7CtHoIr7pK7h7+N+xREdDAbZVdBLYC/95786xbcoY8iSGGPZGpHxBBXL2X7OtEo= 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=MiIBObdt; arc=none smtp.client-ip=209.85.221.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="MiIBObdt" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-3cf991e8bb8so1239540f8f.2; Sun, 31 Aug 2025 03:05:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634729; x=1757239529; 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; bh=uocL+F5w2WClnJd2wZcawwJDtccp4StZfUc4QhYk9C0=; b=MiIBObdtWPGtA+P48QPdY8lv6vk034KA01rUjqIe3rpIUoIqWUbWhYkH/Qv6C8kxz7 7A35oRSDp7bGM2NOuagDNDU5kP8RVpyQg0NU0twjFUEr3mBfjCJwkUilEVTbfqQmjA1z lDDnXIyJQpNl/nKQQcAUW1N0w7j3EinqIGXkX7ZhLhUit/kgYncc9zt7oQUG347k6e32 EvnBuk6ZJwYUrJVHeSOwE54ERB/N/tUo4gNOQqcICKtmv9nWRxXEkag2U6ryR3h1/DHs bNSxjMbnwzPsTMrYk6liZpvizZHSBb1a/SSv9wUYb8QpzOk00gycm2siKq9vQrQGtUwE UloA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634729; x=1757239529; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uocL+F5w2WClnJd2wZcawwJDtccp4StZfUc4QhYk9C0=; b=Azy6t6yGOoLMo6hebfCtFcbn0I0X1rgYhnDK9PM3JowgZcoVVydOGvx3dN6dYw54HM w/oCOcViCAdR4eMMFjg6EIyO/9bHCoXpK9RDPFuSa0cJa0VtzxzbzU/afE5VsyaWQZCu 7Ojg+TT7nu+JvX2VmyxQK18O1kV59xu8aDQ84z9tAAPTEnuQ0jzm2M5RglhKDvF3461J 6WHNBopehNYNkUrg2Vj/DltDeJNmaWvysEIBHsu78jhZwsMGhVmnPJJQERWZ23R35H9c BEF1dlDQMALyRgDvELLpp56emlTFfZM0SUka98cFZT0jaa1AnyzYJg2HJU8FaU7PhZ8o CyWQ== X-Forwarded-Encrypted: i=1; AJvYcCVoy/TQDj5wEdggVfuNc0eLJ4OvIsf4UOyB+nTYrr7m2AaJCnAFSs0ay3yK0fBIG3OWPQ6xHenJVrcs@vger.kernel.org, AJvYcCXQzqc2Uc4rtj4bvhj31ZmwVLSoAAyqiX7Oal+KduGjB7JEbN863QpDRM1+64b6mTTAb6JhZWpaKZhem7Iy@vger.kernel.org X-Gm-Message-State: AOJu0YyNrVPNzf/cAQhsOW1vRoinqdSxNvf3KFXBMTcWg3VwxgEHjLjm jhqGrd8WSQks06krQJYMpKV7Zg+VKiWV1f07hJ3V0E4GSHW9jN9kqEFR X-Gm-Gg: ASbGncvpAJZZis2wFcsFmdhX4ulzUhHwoK3azkDr/01dIhmdrHWwMgeSq6on7Ku+IXu DF4I8IheSDkJe2KaAlDSp43dMDr2WntFdO0GNv+HFUyz3FHZSBqzZZCyoICnQ9boxgBvws66hUJ TEns0MsIl20Z1mssJL8w6QMpJs2M2uZzyayAIOsJQHeK8ZEAX0NiJIe1IYAdiBbUvuAP8wAlpFn VKT1bC9i7SnfG56JVveyTo+C0PdLSXphz4zNopp2RAhMT6dTT2bI1I3/a4SQ633EOaq+u92gsDr v4yCSfP+2GFiEB9qi4q2UhO/Vf4zxZXCGqYA9vqYGXynF6ZhjeW2l4vjrCk4AGx5FScypWDgMfW R3eUT8cpWYDlT7vH3Ffrsg6TP+NbG8iY9m3JWM0AO20Ht1MeKdvBwAvfOy/yVSMo= X-Google-Smtp-Source: AGHT+IHetUik0B3udRPnKTN7h6+/KE0rVCAilRvNcqH5Mw2Tl8c/PIvkRa5PaAOMC1bYbZwCQqX7Jg== X-Received: by 2002:a05:6000:1786:b0:3d1:4c3d:1933 with SMTP id ffacd0b85a97d-3d1dea8c5e9mr3146432f8f.43.1756634728744; Sun, 31 Aug 2025 03:05:28 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:28 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek Subject: [PATCH v7 11/12] dt-bindings: i2c: realtek,rtl9301-i2c: extend for RTL9310 support Date: Sun, 31 Aug 2025 10:04:56 +0000 Message-ID: <20250831100457.3114-12-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" Adjust the regex for child-node address to account for the fact that RTL9310 supports 12 instead of only 8 SDA lines. Also, narrow this per variant. Add a vendor-specific property to explicitly specify the SCL line number of the defined I2C controller/master. This is required, in particular for RTL9310, to operate on the correct SCL for each controller. Require this property to be specified for RTL9310. Add compatibles for known SoC variants RTL9311, RTL9312 and RTL9313. Signed-off-by: Jonas Jelonek Reviewed-by: Rob Herring (Arm) Reviewed-by: Chris Packham Tested-by: Markus Stockhausen --- .../bindings/i2c/realtek,rtl9301-i2c.yaml | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml= b/Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml index 274e2ab8b612..17ce39c19ab1 100644 --- a/Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml +++ b/Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml @@ -13,6 +13,8 @@ description: RTL9300 SoCs have two I2C controllers. Each of these has an SCL line (wh= ich if not-used for SCL can be a GPIO). There are 8 common SDA lines that ca= n be assigned to either I2C controller. + RTL9310 SoCs have equal capabilities but support 12 common SDA lines whi= ch + can be assigned to either I2C controller. =20 properties: compatible: @@ -23,7 +25,15 @@ properties: - realtek,rtl9302c-i2c - realtek,rtl9303-i2c - const: realtek,rtl9301-i2c - - const: realtek,rtl9301-i2c + - items: + - enum: + - realtek,rtl9311-i2c + - realtek,rtl9312-i2c + - realtek,rtl9313-i2c + - const: realtek,rtl9310-i2c + - enum: + - realtek,rtl9301-i2c + - realtek,rtl9310-i2c =20 reg: items: @@ -35,8 +45,14 @@ properties: "#size-cells": const: 0 =20 + realtek,scl: + $ref: /schemas/types.yaml#/definitions/uint32 + description: + The SCL line number of this I2C controller. + enum: [ 0, 1 ] + patternProperties: - '^i2c@[0-7]$': + '^i2c@[0-9ab]$': $ref: /schemas/i2c/i2c-controller.yaml unevaluatedProperties: false =20 @@ -48,6 +64,25 @@ patternProperties: required: - reg =20 + +allOf: + - if: + properties: + compatible: + contains: + const: realtek,rtl9310-i2c + then: + required: + - realtek,scl + - if: + properties: + compatible: + contains: + const: realtek,rtl9301-i2c + then: + patternProperties: + '^i2c@[89ab]$': false + required: - compatible - reg --=20 2.48.1 From nobody Fri Oct 3 13:21:30 2025 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 BC7A825F97D; Sun, 31 Aug 2025 10:05:31 +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=1756634733; cv=none; b=IwxCPNI+3DpjlMVQmWBud7LQ5HedfQ+UMoSrrz39l2+9KsAuimlupCc72Y6B6TUV5cc7eUQXn/IPPRVt+wDESXMZQay723wA1HLaMWxwdUnrPou1VVpiQ2/dkyYv5bX+5EUH+mMjVn5RzlCHB2bzks1pH0P1q1Ez5BZJ7ADgl5I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756634733; c=relaxed/simple; bh=Vzjm7joS6TNhuBvIAFP80rG1TH5jXTY6DxX9TbFyJh4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PwbqiOJVFP6iGt/pVOmBtY8Vr5alHyU2nWdUquXMlZmF1VVQImWJ5Mq/sD1xPmAO8XtQ1y9Hk5YJCMPOjCTA48JYSnNN6/ybNtsgDe4bG068PvqIbLk3KG5KnWEZ66UCqvX92XX9tbx3k77x/GgMVmUchLajmKfIUD/xHWrXPlU= 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=TXjHFo1H; 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="TXjHFo1H" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-45b89147cfbso4263815e9.3; Sun, 31 Aug 2025 03:05:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756634730; x=1757239530; 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; bh=GzcOO2e4Ry0i+kLlkzZN4mufx+GKN499/UHIR5vQ3tk=; b=TXjHFo1HCYZhLNh+gSKW9diT7miTkltC3DAY9VB47oLCh1qFZGtLRwhmveXhuYWP8q Ce0k43VrmlNvM5pozCUjWsHLngaersBvXDHZTmKiNWDTui49oq0YkxlUogzoL25GT2Zk 7RYaP/Cz6uJupm5V063JwN+NlkSePBxb1VqjckLT9iHL+CdEjRgpmgr5K9QOM+Xbms3E EUdXRGEPHeDG7PKu+lwFmA2xNhmYeAP97hO0JqEH9NBiB91V2iJY19YQhpEKiUFgZV38 6+OUYT1P3+ePw654Oo5BSUd0muhwdeO3spNK4ZB1cgWnttdrOjp/BlGDx6O/kroTcriQ Qiig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756634730; x=1757239530; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GzcOO2e4Ry0i+kLlkzZN4mufx+GKN499/UHIR5vQ3tk=; b=C8TnCOov5noICOprq6s6fm42XNfLWqES3MrxHXuzHUGY6VxUx4iHnLM1nHgCUcUzir 9ELZl10tsmKGniIOOtzlCKZYx8K+GC76EtOPS7etPxKXI2GIoO7RXqb8nEGyCcHCch36 9vNEmt4iGIYWp+WXCKbHLGpY4a1K9CtdLi8rIlfTugt0qH+SxGYd/qbhkvHOpQAIvw7F nGG8mHQEJgCPkMmQA1hc7RHb3oVunJTEy4Y3yljCfOXDkg3qQO0Jd+w6Vjb59xDhBcrR CndjzC88PT7XEhPF4wOIoRRVPA/dilT8J7MXRoOq1tWJPhG6OVoRrM5qkyZPp6K53a8J wMGQ== X-Forwarded-Encrypted: i=1; AJvYcCUgMY84WaDa74ed/HUGZLL6J4SnA0mXVFhLQflKrQIA8yKVH+kQIloj8HcFm3hIrVoDDV/366p/mS1P@vger.kernel.org, AJvYcCWC7Tnl9UbcxIoeDnnv9BA3Q1WZQZujWuSmkP9eSNLIBFgt2b/GtD7Cgvh1jbFBs26FdGbKtAn5g1fRURBD@vger.kernel.org X-Gm-Message-State: AOJu0YwlHmlWkP3UKzTEQ1OYScDiWMfQU8RDtvf69tSocLdXRTu0SgkT GfsXTmcebCwMl33aRD8Qlg/9m1rG43ZhvhKOIhzIE3XL8VAM7wDOYXO3 X-Gm-Gg: ASbGncsif9fvLUbgOYHWSjEemaR6SDMKX6ftrrCrgtJ8YjI1gFHw3Qx310TKQTtXHLK rc0GPIxPIP7BS2x/wfcVJwZ6GqFA8xz01Kr7JcLVQJMdEtgDhobVLOZwnUlpcfLHG2FYpKRa1CD 88i9/Kcy9t7KORGo+kOkiPYjOpcmH/0SgpzGkwV9aQ2tjKxlh5D2QOXP2ediee2mdCv45ENE885 a9xZaTicLiXW1KMFpY5g2wlpBkcK0cDDio0uhP3lQLXiqjVT9kSqRDqapLmZhXCJKvKrWQE6gJ9 Cjoo9JemH6ZUwq8JLNbAoICexfGzPvHc8Jeoir2lvDhjpB3zZ4B41Zymkew0uNlgQ1C2ke0jHNU FFhOO6fiyRkHwpWXoUN34kgW9FSLP7ahZHSTXv/X85NwQZd3kLtRPGIMPhHJhLKI= X-Google-Smtp-Source: AGHT+IFBD/cApG8HQpujj3LWHIsNhhHzLUkJ3ts9jMF+J08udJTyquiiidHsKiTmUgLATrpyM1TN8g== X-Received: by 2002:a05:600c:1c03:b0:45b:88ed:959b with SMTP id 5b1f17b1804b1-45b88ed9ca9mr16800685e9.29.1756634729947; Sun, 31 Aug 2025 03:05:29 -0700 (PDT) Received: from builder.. (39-10-142-46.pool.kielnet.net. [46.142.10.39]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e68c83asm117505565e9.20.2025.08.31.03.05.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Aug 2025 03:05:29 -0700 (PDT) From: Jonas Jelonek To: Chris Packham , Andi Shyti , Rob Herring , Krzysztof Kozlowski Cc: linux-i2c@vger.kernel.org, Conor Dooley , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Stockhausen , Sven Eckelmann , Harshal Gohel , Wolfram Sang , Jonas Jelonek Subject: [PATCH v7 12/12] i2c: rtl9300: add support for RTL9310 I2C controller Date: Sun, 31 Aug 2025 10:04:57 +0000 Message-ID: <20250831100457.3114-13-jelonek.jonas@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250831100457.3114-1-jelonek.jonas@gmail.com> References: <20250831100457.3114-1-jelonek.jonas@gmail.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" Add support for the internal I2C controllers of RTL9310 series based SoCs to the driver for RTL9300. Add register definitions, chip-specific functions and compatible strings for known RTL9310-based SoCs RTL9311, RTL9312 and RTL9313. Make use of a new device tree property 'realtek,scl' which needs to be specified in case both or only the second master is used. This is required due how the register layout changed in contrast to RTL9300, which has SCL selection in a global register instead of a master-specific one. Signed-off-by: Jonas Jelonek Tested-by: Sven Eckelmann Reviewed-by: Chris Packham Tested-by: Markus Stockhausen --- drivers/i2c/busses/i2c-rtl9300.c | 44 ++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/busses/i2c-rtl9300.c b/drivers/i2c/busses/i2c-rtl9= 300.c index c67463228604..bfceca24ad7d 100644 --- a/drivers/i2c/busses/i2c-rtl9300.c +++ b/drivers/i2c/busses/i2c-rtl9300.c @@ -60,14 +60,16 @@ struct rtl9300_i2c_drv_data { }; =20 #define RTL9300_I2C_MUX_NCHAN 8 +#define RTL9310_I2C_MUX_NCHAN 12 =20 struct rtl9300_i2c { struct regmap *regmap; struct device *dev; - struct rtl9300_i2c_chan chans[RTL9300_I2C_MUX_NCHAN]; + struct rtl9300_i2c_chan chans[RTL9310_I2C_MUX_NCHAN]; struct regmap_field *fields[F_NUM_FIELDS]; u32 reg_base; u32 data_reg; + u8 scl_num; u8 sda_num; struct mutex lock; }; @@ -98,6 +100,12 @@ struct rtl9300_i2c_xfer { #define RTL9300_I2C_MST_DATA_WORD3 0x14 #define RTL9300_I2C_MST_GLB_CTRL 0x384 =20 +#define RTL9310_I2C_MST_IF_CTRL 0x1004 +#define RTL9310_I2C_MST_IF_SEL 0x1008 +#define RTL9310_I2C_MST_CTRL 0x0 +#define RTL9310_I2C_MST_MEMADDR_CTRL 0x4 +#define RTL9310_I2C_MST_DATA_CTRL 0x8 + static int rtl9300_i2c_reg_addr_set(struct rtl9300_i2c *i2c, u32 reg, u16 = len) { int ret; @@ -114,6 +122,11 @@ static int rtl9300_i2c_select_scl(struct rtl9300_i2c *= i2c, u8 scl) return regmap_field_write(i2c->fields[F_SCL_SEL], 1); } =20 +static int rtl9310_i2c_select_scl(struct rtl9300_i2c *i2c, u8 scl) +{ + return regmap_field_update_bits(i2c->fields[F_SCL_SEL], BIT(scl), BIT(scl= )); +} + static int rtl9300_i2c_config_chan(struct rtl9300_i2c *i2c, struct rtl9300= _i2c_chan *chan) { struct rtl9300_i2c_drv_data *drv_data; @@ -127,7 +140,7 @@ static int rtl9300_i2c_config_chan(struct rtl9300_i2c *= i2c, struct rtl9300_i2c_c return ret; =20 drv_data =3D (struct rtl9300_i2c_drv_data *)device_get_match_data(i2c->de= v); - ret =3D drv_data->select_scl(i2c, 0); + ret =3D drv_data->select_scl(i2c, i2c->scl_num); if (ret) return ret; =20 @@ -379,6 +392,10 @@ static int rtl9300_i2c_probe(struct platform_device *p= dev) if (ret) return ret; =20 + ret =3D device_property_read_u8(dev, "realtek,scl", &i2c->scl_num); + if (ret || i2c->scl_num !=3D 1) + i2c->scl_num =3D 0; + platform_set_drvdata(pdev, i2c); =20 drv_data =3D (struct rtl9300_i2c_drv_data *)device_get_match_data(i2c->de= v); @@ -474,12 +491,35 @@ static const struct rtl9300_i2c_drv_data rtl9300_i2c_= drv_data =3D { .max_nchan =3D RTL9300_I2C_MUX_NCHAN, }; =20 +static const struct rtl9300_i2c_drv_data rtl9310_i2c_drv_data =3D { + .field_desc =3D { + [F_SCL_SEL] =3D GLB_REG_FIELD(RTL9310_I2C_MST_IF_SEL, 12, 13), + [F_SDA_SEL] =3D GLB_REG_FIELD(RTL9310_I2C_MST_IF_SEL, 0, 11), + [F_SCL_FREQ] =3D MST_REG_FIELD(RTL9310_I2C_MST_CTRL, 30, 31), + [F_DEV_ADDR] =3D MST_REG_FIELD(RTL9310_I2C_MST_CTRL, 11, 17), + [F_SDA_OUT_SEL] =3D MST_REG_FIELD(RTL9310_I2C_MST_CTRL, 18, 21), + [F_MEM_ADDR_WIDTH] =3D MST_REG_FIELD(RTL9310_I2C_MST_CTRL, 9, 10), + [F_DATA_WIDTH] =3D MST_REG_FIELD(RTL9310_I2C_MST_CTRL, 5, 8), + [F_RD_MODE] =3D MST_REG_FIELD(RTL9310_I2C_MST_CTRL, 4, 4), + [F_RWOP] =3D MST_REG_FIELD(RTL9310_I2C_MST_CTRL, 2, 2), + [F_I2C_FAIL] =3D MST_REG_FIELD(RTL9310_I2C_MST_CTRL, 1, 1), + [F_I2C_TRIG] =3D MST_REG_FIELD(RTL9310_I2C_MST_CTRL, 0, 0), + [F_MEM_ADDR] =3D MST_REG_FIELD(RTL9310_I2C_MST_MEMADDR_CTRL, 0, 23), + }, + .select_scl =3D rtl9310_i2c_select_scl, + .data_reg =3D RTL9310_I2C_MST_DATA_CTRL, + .max_nchan =3D RTL9310_I2C_MUX_NCHAN, +}; =20 static const struct of_device_id i2c_rtl9300_dt_ids[] =3D { { .compatible =3D "realtek,rtl9301-i2c", .data =3D (void *) &rtl9300_i2c_= drv_data }, { .compatible =3D "realtek,rtl9302b-i2c", .data =3D (void *) &rtl9300_i2c= _drv_data }, { .compatible =3D "realtek,rtl9302c-i2c", .data =3D (void *) &rtl9300_i2c= _drv_data }, { .compatible =3D "realtek,rtl9303-i2c", .data =3D (void *) &rtl9300_i2c_= drv_data }, + { .compatible =3D "realtek,rtl9310-i2c", .data =3D (void *) &rtl9310_i2c_= drv_data }, + { .compatible =3D "realtek,rtl9311-i2c", .data =3D (void *) &rtl9310_i2c_= drv_data }, + { .compatible =3D "realtek,rtl9312-i2c", .data =3D (void *) &rtl9310_i2c_= drv_data }, + { .compatible =3D "realtek,rtl9313-i2c", .data =3D (void *) &rtl9310_i2c_= drv_data }, {} }; MODULE_DEVICE_TABLE(of, i2c_rtl9300_dt_ids); --=20 2.48.1