From nobody Thu Apr 9 18:00:40 2026 Received: from smtpbgbr2.qq.com (smtpbgbr2.qq.com [54.207.22.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 846A82DCF74; Sat, 7 Mar 2026 03:07:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.207.22.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772852859; cv=none; b=lvLGeHJVEru61Vy54REJIZzlAH1GluMhdqqxNZyAKuAc68LsPcmUev+ewC1y54YKrY0gVmIydhasjD5xVKSc16cwg2qVyxtd52Ck5/j2a4RzLI69mO9b9e5IcsN9F7GJhH/i54beOiz2+z0Tvhzvcj+7+EH1icwvTuD7tDWc4JQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772852859; c=relaxed/simple; bh=Btv+xxaazrgJIrhMAwjFt227LeIEShqqnHUkEQG35JE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IHqpEP1aqJEI23XjR95/9cVaxS94wC0c3Lv5uLRj8WjYySO5gIAeVhBSv8p55tXQ5fCRN7jVuLUN5cqWB2XbVQSa9PyhQ83Hoo/rQus5nEnH+sAAJJP5q1aYKevrSAxDP/V4zC80z2ootoyUQwQze2hvgywvCZEmqnICfZr8dhc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=vimux.org; spf=none smtp.mailfrom=vimux.org; arc=none smtp.client-ip=54.207.22.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=vimux.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=vimux.org X-QQ-mid: zesmtpgz7t1772852834t40a2b5cc X-QQ-Originating-IP: UMyb9GNdQ0f6DaA6fR0ZHjVNR5GoMiEotkK8wzqWW4c= Received: from localhost.localdomain ( [219.147.0.78]) by bizesmtp.qq.com (ESMTP) with id ; Sat, 07 Mar 2026 11:07:12 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 5195212610033008869 EX-QQ-RecipientCnt: 8 From: Jialu Xu To: xujialu@vimux.org Cc: brgl@kernel.org, kees@kernel.org, krzk@kernel.org, linusw@kernel.org, linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v4 1/3] nfc: s3fwrn5: convert to gpio descriptors Date: Sat, 7 Mar 2026 11:06:22 +0800 Message-ID: <94FF47746A92BD6B+20260307030623.3495092-2-xujialu@vimux.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <7131965EF4C8E8BD+20260307030255.3490715-1-xujialu@vimux.org> References: <7131965EF4C8E8BD+20260307030255.3490715-1-xujialu@vimux.org> 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 X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpgz:vimux.org:qybglogicsvrsz:qybglogicsvrsz3b-0 X-QQ-XMAILINFO: NCeavPrAbUfiQzCPUo7aupmflA5IUw+U/7bEF1ItYkSDhwkSq8GopAQw h6vdF058+QKP/XOkZk9ix8SNLLWMnNZjgOrmrDRk09H2+AwcTiXKEKVGSqSaxtTQdG8FMBf Z4Gl5gNj1JWVd19K+yoC2Uvtn1SEypCAG2L1QlegBjpRJ9Vvx6QpTMcdieMj07ubIj7CO7L jk7eVAEy6elhVzcKhsrC1LkRBIchCzeUOT75vxst9/Du1rDky+sQs25ZH+KuaO1qjh6REV2 aKMdWiXC8oOxDZ8AdydUtJW7bCppHFRQaHUMLkhvBxpuddpARFBYAXyN/Emq1N0IPPZmtrf 5sjMz2Qice3Q6z6Vm+0THiIBuySTHEQV9OA1+1AUsAih9UXos4lhvFQijDsajwsx8AViEOJ kRNorHOUncFFk/+QqwOHFsUYfoNFk8phQeNnTXwC+T2aElwylogzqcSDhOCoPJ/sHnw5yqU kr706MebxUuUFOBgfgt+GsiH4/EFlW7FNk1jvoM6+rUPe2rUa9H2W+Et8Y1COrC7QjPwVFW 8E57eO52UZ2Q3kvLsBQ8BOHZ5TcH8UxWJjsLO0KGavi8DQQdv22UDgxhlRKTXBb0sakTo68 CUDNqMRWgrHxu21EPVpU+rz0Xej/xkilH5Pj6d+VZp6cYrruHkisE6AlE71IyXQZyQOzjud SEGT8CWyxOkPgS3DaTo/EMWPPbCGJP64nDmaqIlV1+bXw12szFcm3TABSxFf+2iEUSd+u8M zoNTSp/U0VwLxiSbQpe4Y3/Qd23bj1XUezkuuyC5jVS6liA3pSDqgScg0Qf5qgmI0Sl0fVP VhLo/QynRwsfWdwxOfmSXerkGZ26ma/RheFCW42a4Ca5GdkROSDBV6O586ixy/NPvYG9okX pZYKR/A+8bb+8O6dCn4fG2oWj401qMnJ9bVW7sDZzt96Od8OMVbhmlB9gEAwXkIhZxEKYpe 0iE2InHbjZunh8BsJrGqvfn4+FwEi4xvPZcS5hygfXlQjZnqbAhsohLD/I5xHJY/rCEI= X-QQ-XMRINFO: Nq+8W0+stu50tPAe92KXseR0ZZmBTk3gLg== X-QQ-RECHKSPAM: 0 Content-Type: text/plain; charset="utf-8" Replace the legacy of_get_named_gpio() / gpio_request_one() / gpio_set_value() API with the descriptor-based devm_gpiod_get() / gpiod_set_value() API from , removing the dependency on . This removes the s3fwrn5_i2c_parse_dt() and s3fwrn82_uart_parse_dt() functions since devm_gpiod_get() handles both DT lookup and resource management. The gpio_en and gpio_fw_wake fields in struct phy_common are changed from int to struct gpio_desc *. Add rename quirks in gpiolib-of.c for the deprecated "s3fwrn5,en-gpios" and "s3fwrn5,fw-gpios" properties to maintain backward compatibility with old device trees. Signed-off-by: Jialu Xu Reviewed-by: Linus Walleij --- drivers/gpio/gpiolib-of.c | 4 +++ drivers/nfc/s3fwrn5/i2c.c | 54 +++++--------------------------- drivers/nfc/s3fwrn5/phy_common.c | 11 +++---- drivers/nfc/s3fwrn5/phy_common.h | 5 +-- drivers/nfc/s3fwrn5/uart.c | 43 ++++++------------------- 5 files changed, 29 insertions(+), 88 deletions(-) diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index ef1ac68b94b78..3bdd9af674474 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c @@ -542,6 +542,10 @@ static struct gpio_desc *of_find_gpio_rename(struct de= vice_node *np, { "reset", "reset-n-io", "marvell,nfc-uart" }, { "reset", "reset-n-io", "mrvl,nfc-uart" }, #endif +#if IS_ENABLED(CONFIG_NFC_S3FWRN5_I2C) + { "en", "s3fwrn5,en-gpios", "samsung,s3fwrn5-i2c" }, + { "wake", "s3fwrn5,fw-gpios", "samsung,s3fwrn5-i2c" }, +#endif #if IS_ENABLED(CONFIG_PCI_LANTIQ) /* MIPS Lantiq PCI */ { "reset", "gpio-reset", "lantiq,pci-xway" }, diff --git a/drivers/nfc/s3fwrn5/i2c.c b/drivers/nfc/s3fwrn5/i2c.c index 110d086cfe5ba..91b8d1445efd4 100644 --- a/drivers/nfc/s3fwrn5/i2c.c +++ b/drivers/nfc/s3fwrn5/i2c.c @@ -8,10 +8,8 @@ =20 #include #include -#include +#include #include -#include -#include #include =20 #include @@ -146,37 +144,6 @@ static irqreturn_t s3fwrn5_i2c_irq_thread_fn(int irq, = void *phy_id) return IRQ_HANDLED; } =20 -static int s3fwrn5_i2c_parse_dt(struct i2c_client *client) -{ - struct s3fwrn5_i2c_phy *phy =3D i2c_get_clientdata(client); - struct device_node *np =3D client->dev.of_node; - - if (!np) - return -ENODEV; - - phy->common.gpio_en =3D of_get_named_gpio(np, "en-gpios", 0); - if (!gpio_is_valid(phy->common.gpio_en)) { - /* Support also deprecated property */ - phy->common.gpio_en =3D of_get_named_gpio(np, - "s3fwrn5,en-gpios", - 0); - if (!gpio_is_valid(phy->common.gpio_en)) - return -ENODEV; - } - - phy->common.gpio_fw_wake =3D of_get_named_gpio(np, "wake-gpios", 0); - if (!gpio_is_valid(phy->common.gpio_fw_wake)) { - /* Support also deprecated property */ - phy->common.gpio_fw_wake =3D of_get_named_gpio(np, - "s3fwrn5,fw-gpios", - 0); - if (!gpio_is_valid(phy->common.gpio_fw_wake)) - return -ENODEV; - } - - return 0; -} - static int s3fwrn5_i2c_probe(struct i2c_client *client) { struct s3fwrn5_i2c_phy *phy; @@ -193,20 +160,13 @@ static int s3fwrn5_i2c_probe(struct i2c_client *clien= t) phy->i2c_dev =3D client; i2c_set_clientdata(client, phy); =20 - ret =3D s3fwrn5_i2c_parse_dt(client); - if (ret < 0) - return ret; - - ret =3D devm_gpio_request_one(&phy->i2c_dev->dev, phy->common.gpio_en, - GPIOF_OUT_INIT_HIGH, "s3fwrn5_en"); - if (ret < 0) - return ret; + phy->common.gpio_en =3D devm_gpiod_get(&client->dev, "en", GPIOD_OUT_HIGH= ); + if (IS_ERR(phy->common.gpio_en)) + return PTR_ERR(phy->common.gpio_en); =20 - ret =3D devm_gpio_request_one(&phy->i2c_dev->dev, - phy->common.gpio_fw_wake, - GPIOF_OUT_INIT_LOW, "s3fwrn5_fw_wake"); - if (ret < 0) - return ret; + phy->common.gpio_fw_wake =3D devm_gpiod_get(&client->dev, "wake", GPIOD_O= UT_LOW); + if (IS_ERR(phy->common.gpio_fw_wake)) + return PTR_ERR(phy->common.gpio_fw_wake); =20 /* * S3FWRN5 depends on a clock input ("XI" pin) to function properly. diff --git a/drivers/nfc/s3fwrn5/phy_common.c b/drivers/nfc/s3fwrn5/phy_com= mon.c index deb2c039f0fd6..39a60e34136c5 100644 --- a/drivers/nfc/s3fwrn5/phy_common.c +++ b/drivers/nfc/s3fwrn5/phy_common.c @@ -8,7 +8,6 @@ * Bongsu Jeon */ =20 -#include #include #include =20 @@ -19,7 +18,7 @@ void s3fwrn5_phy_set_wake(void *phy_id, bool wake) struct phy_common *phy =3D phy_id; =20 mutex_lock(&phy->mutex); - gpio_set_value(phy->gpio_fw_wake, wake); + gpiod_set_value(phy->gpio_fw_wake, wake); if (wake) msleep(S3FWRN5_EN_WAIT_TIME); mutex_unlock(&phy->mutex); @@ -33,14 +32,14 @@ bool s3fwrn5_phy_power_ctrl(struct phy_common *phy, enu= m s3fwrn5_mode mode) =20 phy->mode =3D mode; =20 - gpio_set_value(phy->gpio_en, 1); - gpio_set_value(phy->gpio_fw_wake, 0); + gpiod_set_value(phy->gpio_en, 1); + gpiod_set_value(phy->gpio_fw_wake, 0); if (mode =3D=3D S3FWRN5_MODE_FW) - gpio_set_value(phy->gpio_fw_wake, 1); + gpiod_set_value(phy->gpio_fw_wake, 1); =20 if (mode !=3D S3FWRN5_MODE_COLD) { msleep(S3FWRN5_EN_WAIT_TIME); - gpio_set_value(phy->gpio_en, 0); + gpiod_set_value(phy->gpio_en, 0); msleep(S3FWRN5_EN_WAIT_TIME); } =20 diff --git a/drivers/nfc/s3fwrn5/phy_common.h b/drivers/nfc/s3fwrn5/phy_com= mon.h index 9cef25436bf90..871bec53dd0a9 100644 --- a/drivers/nfc/s3fwrn5/phy_common.h +++ b/drivers/nfc/s3fwrn5/phy_common.h @@ -12,6 +12,7 @@ #define __NFC_S3FWRN5_PHY_COMMON_H =20 #include +#include #include =20 #include "s3fwrn5.h" @@ -21,8 +22,8 @@ struct phy_common { struct nci_dev *ndev; =20 - int gpio_en; - int gpio_fw_wake; + struct gpio_desc *gpio_en; + struct gpio_desc *gpio_fw_wake; =20 struct mutex mutex; =20 diff --git a/drivers/nfc/s3fwrn5/uart.c b/drivers/nfc/s3fwrn5/uart.c index 9c09c10c2a464..ccfcee06ee774 100644 --- a/drivers/nfc/s3fwrn5/uart.c +++ b/drivers/nfc/s3fwrn5/uart.c @@ -10,13 +10,12 @@ =20 #include #include +#include #include #include #include -#include #include -#include -#include +#include =20 #include "phy_common.h" =20 @@ -88,25 +87,6 @@ static const struct of_device_id s3fwrn82_uart_of_match[= ] =3D { }; MODULE_DEVICE_TABLE(of, s3fwrn82_uart_of_match); =20 -static int s3fwrn82_uart_parse_dt(struct serdev_device *serdev) -{ - struct s3fwrn82_uart_phy *phy =3D serdev_device_get_drvdata(serdev); - struct device_node *np =3D serdev->dev.of_node; - - if (!np) - return -ENODEV; - - phy->common.gpio_en =3D of_get_named_gpio(np, "en-gpios", 0); - if (!gpio_is_valid(phy->common.gpio_en)) - return -ENODEV; - - phy->common.gpio_fw_wake =3D of_get_named_gpio(np, "wake-gpios", 0); - if (!gpio_is_valid(phy->common.gpio_fw_wake)) - return -ENODEV; - - return 0; -} - static int s3fwrn82_uart_probe(struct serdev_device *serdev) { struct s3fwrn82_uart_phy *phy; @@ -140,20 +120,17 @@ static int s3fwrn82_uart_probe(struct serdev_device *= serdev) =20 serdev_device_set_flow_control(serdev, false); =20 - ret =3D s3fwrn82_uart_parse_dt(serdev); - if (ret < 0) - goto err_serdev; - - ret =3D devm_gpio_request_one(&phy->ser_dev->dev, phy->common.gpio_en, - GPIOF_OUT_INIT_HIGH, "s3fwrn82_en"); - if (ret < 0) + phy->common.gpio_en =3D devm_gpiod_get(&serdev->dev, "en", GPIOD_OUT_HIGH= ); + if (IS_ERR(phy->common.gpio_en)) { + ret =3D PTR_ERR(phy->common.gpio_en); goto err_serdev; + } =20 - ret =3D devm_gpio_request_one(&phy->ser_dev->dev, - phy->common.gpio_fw_wake, - GPIOF_OUT_INIT_LOW, "s3fwrn82_fw_wake"); - if (ret < 0) + phy->common.gpio_fw_wake =3D devm_gpiod_get(&serdev->dev, "wake", GPIOD_O= UT_LOW); + if (IS_ERR(phy->common.gpio_fw_wake)) { + ret =3D PTR_ERR(phy->common.gpio_fw_wake); goto err_serdev; + } =20 ret =3D s3fwrn5_probe(&phy->common.ndev, phy, &phy->ser_dev->dev, &uart_phy_ops); --=20 2.47.3