From nobody Fri Oct 3 01:09:31 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 CBAB230B534 for ; Tue, 9 Sep 2025 09:16:05 +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=1757409369; cv=none; b=fklwPTc421TlXdwTU1kdGvpwRIGI+XqD9MbBDNY33XJL5n4Nhj4h15E0F2an2aAGxiWMmu8sgI6H5PfiGmUb3xzA8kCaTvrwMKo9t4WFaECGA7XBbngFV5ybYExRM62hMD0d5/C7EwE0DAEWZ5Mgl1HRhcGItph/z06n8HpeYdQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757409369; c=relaxed/simple; bh=YHCDclMZWYBHiDakJuHyUUOzgFbXdibwObNF9cKGOLE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ttK/gQ5YjMfbywiD3XSFP5eui4tWh027NF+m0FPlbf+8g0/g5eYZvzDaNI3R908Ht4srfNTfiTy8MJYRJLFBKgNU44daMjzF1+JTImnV+NWQrp0snsktu8VVNsgoFCLPEC7YZLPavrQvlKFgRIrZR+Wo2GLf4eh7Qtn4HHzvh4Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl; spf=none smtp.mailfrom=bgdev.pl; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b=GMuSDjPd; arc=none smtp.client-ip=209.85.221.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b="GMuSDjPd" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-3e5190bca95so1861011f8f.0 for ; Tue, 09 Sep 2025 02:16:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1757409364; x=1758014164; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=0VwQnMFFQUbJBhEJZKQm6c3MliGwPjiIRbJeY0+XPvc=; b=GMuSDjPd+RcpepgIm4hszzrxYZizrDPODw7QME5bzWjRi/p9n1mhrqybne48g70qh+ wWUonCaLd9ekTmqReWDu1ThdGccL030CJ63x/nfOJw+oT+tJQgrTi/p15IdhLY0hxFbm YNFy6DcE8tBBM2r3c5LqGpY3aH832n7Y/ps0B27jmTChKjIwF8Wdlrvk9LI7owdZWIRM HZfxoR0HW2ICdgDvSxOaCG8J6gwPCbQ/idaI5OimwoC2cU5X/Cuy9YHZ5LSNKScJqfyD P9kdMBLTFpBdZLAF8D8eoztL12eTQR2QtjyuD0InsjrJRsRGf7pj7i4D7+dwOTmKoqnL AIVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757409364; x=1758014164; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0VwQnMFFQUbJBhEJZKQm6c3MliGwPjiIRbJeY0+XPvc=; b=dijAOXeTFLQDsuNzg+/O06CHFW1G5xct3e80KHVdoiEei6W+WmECIDkaqtGLmBfRq1 gczox57iTR1VYCaWSyRGbUn6karMIRJwffOfF6fCG/kVJ2W8Wu7BIx1dvdw7IXKVc1hm BPjFemX4b1k6xsLMMTzCicu2hoU7MR2t9tOg/cvbzBQXkYZcwE4zlYfna+lmQK1fKqAy gjr299DDvxHwzKWBD9X3tyStlGxPNYWYH46yuBFcHsMJ7jWia4QPfVoel8kyYlzv9hSw 8wmCqWXTxgD4QPrSWj0PXG1ijIyfsZNTuaGDVbR7y8tLWIbAR2At3EnGsDgU34GkVb5E Fmlg== X-Forwarded-Encrypted: i=1; AJvYcCVDMLzBEFfBh1fE+UzAA1xzFQOdPN6/P5t198UAkc2Tks1+Wsv1g7wqahnE0wuvS1FGOcnSwDi41aM4Lno=@vger.kernel.org X-Gm-Message-State: AOJu0YzN0WeO6Rz9OZk0S++7QvFOKG3CfsgJAsQLtzt3JtbdDcSFGhMz rDKFTzi8QiDpTdlqO+tlFTIi4M/voqxMQXZwbjyDYQTR3wduhPW4l/UfhohjAFSpkHw= X-Gm-Gg: ASbGncusa2+oM5q0SAudO6r4Ok1FOu7izLzWUbHE2xsT6E/Nx+b5Ym+edlajh9NdJ6x /150o68nHSFu67LtW/NoJnL0p20BiB26W7a7T9O8gyLWQ3PfwQgsRZnaMxXZpXDvD93GaDJFi1M VU5dc3u/fOzxUZ69WnKb6Zx5NGrO1NslbnPqGYlbrJ1qR5tlboclEiMv3M+QsxOvNSuTVZWKvL7 k0OdX3upDqEibWQeono0J3SwcoB2O2uUOGksODRmaDt3WJ1UwNzCGyAtnOMrWXemC5j9doVWVQ7 mz7QY2xeB686wTBV/BBxcPhOPEiEk1Itu5sx39CLH8t1r5D3Xaa6Z4Lvzqb/PNPZDKrPHLbFw73 NCQeRUrTOaOlMosnhJQ== X-Google-Smtp-Source: AGHT+IGSoxbk5sH0hMOySaw2VZsrge4cwThUG4Xe74T/OfiVTIcnZT3WjcEd/0+Yql9jfkf8sxO4lQ== X-Received: by 2002:a05:6000:2c02:b0:3e7:4835:8eab with SMTP id ffacd0b85a97d-3e7483594c6mr5567609f8f.6.1757409364085; Tue, 09 Sep 2025 02:16:04 -0700 (PDT) Received: from [127.0.1.1] ([2a01:cb1d:dc:7e00:c1ee:7be9:3ebb:6cc0]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7521c9caasm1900039f8f.19.2025.09.09.02.16.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Sep 2025 02:16:02 -0700 (PDT) From: Bartosz Golaszewski Date: Tue, 09 Sep 2025 11:15:38 +0200 Subject: [PATCH 11/15] gpio: sifive: use new generic GPIO chip API Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250909-gpio-mmio-gpio-conv-part4-v1-11-9f723dc3524a@linaro.org> References: <20250909-gpio-mmio-gpio-conv-part4-v1-0-9f723dc3524a@linaro.org> In-Reply-To: <20250909-gpio-mmio-gpio-conv-part4-v1-0-9f723dc3524a@linaro.org> To: Linus Walleij , Bartosz Golaszewski , Keguang Zhang , Alban Bedel , Doug Berger , Florian Fainelli , Broadcom internal kernel review list , Matthias Brugger , AngeloGioacchino Del Regno , Paul Walmsley , Samuel Holland , Yixun Lan , Andy Shevchenko Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mips@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6420; i=bartosz.golaszewski@linaro.org; h=from:subject:message-id; bh=/rxFAj2OADgDUL6LIIa7xxiLekFYD7JnAKzsE5ctpDE=; b=owEBbQKS/ZANAwAKARGnLqAUcddyAcsmYgBov/A6EyJpcO128tCwjMCd1RkR25TZMB81unx5s eXDdbnNcyuJAjMEAAEKAB0WIQQWnetsC8PEYBPSx58Rpy6gFHHXcgUCaL/wOgAKCRARpy6gFHHX cgGED/9FeSGkmGNg2EwnlMYXHTeuncfNpcU+URNlNHzV5moJDeqP5Jcdq2gkGu4eZWS4s/RSYS+ uzqOnYP4B/+yZWqNCJV6koa4fyCCMPUSnl8vNFE0+sn7b0TQwQEjFotjBrmcuFefH043O0+OgVH 5O4/TrWmKig8t9Q91Fd891R2HPyfnf/VHC0uokZBlyP+MNveQUnXtyWXSJzH/VCr2rXM9KhKS1/ 8BLs5SCXZHRd3wHL8ARw+0y4hR4dDvAzBLhHG0bdGOhqAGlN+UGUQ5AAgL6itzzMSnu8fmun8m8 SVroKjYq1jSMIpPWw83EIXGo15EK1Ct998onKm5hm0CQ7Cl6QhNtglDmZfLBuYWUQPu58AE7AT6 agpeRAQESZNCyNy+QkyHlvbSL4XLwI6w2OWbWfSXkpnw9SHXOOAiw+fTp3sDaATrBHaA8xpEdUu O/l/wlMR/MDlNGtdzm1K21bnIon9aUwX3UkOeoKqEJVknuwWqppp0+2XM5RVcGwOb5MISLvMcWx uM3DMZ2cx/rVKPrz5Ikl/DA2+cpR3VjxNI6jQ047QI4fabGO+AGuJiHm8PMHgbXO98+9Ql/KGCC 9oXUgUeXq3i0nrkvQthDI7BdNsf+od/Dhx2KKNpxAOVBqjsqFPFdsIY3pcUBKn8hisdX5u/sztw adjL6kx7DcdyUQw== X-Developer-Key: i=bartosz.golaszewski@linaro.org; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 From: Bartosz Golaszewski Convert the driver to using the new generic GPIO chip interfaces from linux/gpio/generic.h. Signed-off-by: Bartosz Golaszewski --- drivers/gpio/gpio-sifive.c | 73 ++++++++++++++++++++++++------------------= ---- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/drivers/gpio/gpio-sifive.c b/drivers/gpio/gpio-sifive.c index 98ef975c44d9a6c9238605cfd1d5820fd70a66ca..07ee5c0b4f8023978c76873f251= 19d5dc21d996c 100644 --- a/drivers/gpio/gpio-sifive.c +++ b/drivers/gpio/gpio-sifive.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -32,7 +33,7 @@ =20 struct sifive_gpio { void __iomem *base; - struct gpio_chip gc; + struct gpio_generic_chip gen_gc; struct regmap *regs; unsigned long irq_state; unsigned int trigger[SIFIVE_GPIO_MAX]; @@ -41,10 +42,10 @@ struct sifive_gpio { =20 static void sifive_gpio_set_ie(struct sifive_gpio *chip, unsigned int offs= et) { - unsigned long flags; unsigned int trigger; =20 - raw_spin_lock_irqsave(&chip->gc.bgpio_lock, flags); + guard(gpio_generic_lock_irqsave)(&chip->gen_gc); + trigger =3D (chip->irq_state & BIT(offset)) ? chip->trigger[offset] : 0; regmap_update_bits(chip->regs, SIFIVE_GPIO_RISE_IE, BIT(offset), (trigger & IRQ_TYPE_EDGE_RISING) ? BIT(offset) : 0); @@ -54,7 +55,6 @@ static void sifive_gpio_set_ie(struct sifive_gpio *chip, = unsigned int offset) (trigger & IRQ_TYPE_LEVEL_HIGH) ? BIT(offset) : 0); regmap_update_bits(chip->regs, SIFIVE_GPIO_LOW_IE, BIT(offset), (trigger & IRQ_TYPE_LEVEL_LOW) ? BIT(offset) : 0); - raw_spin_unlock_irqrestore(&chip->gc.bgpio_lock, flags); } =20 static int sifive_gpio_irq_set_type(struct irq_data *d, unsigned int trigg= er) @@ -72,13 +72,12 @@ static int sifive_gpio_irq_set_type(struct irq_data *d,= unsigned int trigger) } =20 static void sifive_gpio_irq_enable(struct irq_data *d) -{ + { struct gpio_chip *gc =3D irq_data_get_irq_chip_data(d); struct sifive_gpio *chip =3D gpiochip_get_data(gc); irq_hw_number_t hwirq =3D irqd_to_hwirq(d); int offset =3D hwirq % SIFIVE_GPIO_MAX; u32 bit =3D BIT(offset); - unsigned long flags; =20 gpiochip_enable_irq(gc, hwirq); irq_chip_enable_parent(d); @@ -86,13 +85,13 @@ static void sifive_gpio_irq_enable(struct irq_data *d) /* Switch to input */ gc->direction_input(gc, offset); =20 - raw_spin_lock_irqsave(&gc->bgpio_lock, flags); - /* Clear any sticky pending interrupts */ - regmap_write(chip->regs, SIFIVE_GPIO_RISE_IP, bit); - regmap_write(chip->regs, SIFIVE_GPIO_FALL_IP, bit); - regmap_write(chip->regs, SIFIVE_GPIO_HIGH_IP, bit); - regmap_write(chip->regs, SIFIVE_GPIO_LOW_IP, bit); - raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags); + scoped_guard(gpio_generic_lock_irqsave, &chip->gen_gc) { + /* Clear any sticky pending interrupts */ + regmap_write(chip->regs, SIFIVE_GPIO_RISE_IP, bit); + regmap_write(chip->regs, SIFIVE_GPIO_FALL_IP, bit); + regmap_write(chip->regs, SIFIVE_GPIO_HIGH_IP, bit); + regmap_write(chip->regs, SIFIVE_GPIO_LOW_IP, bit); + } =20 /* Enable interrupts */ assign_bit(offset, &chip->irq_state, 1); @@ -118,15 +117,14 @@ static void sifive_gpio_irq_eoi(struct irq_data *d) struct sifive_gpio *chip =3D gpiochip_get_data(gc); int offset =3D irqd_to_hwirq(d) % SIFIVE_GPIO_MAX; u32 bit =3D BIT(offset); - unsigned long flags; =20 - raw_spin_lock_irqsave(&gc->bgpio_lock, flags); - /* Clear all pending interrupts */ - regmap_write(chip->regs, SIFIVE_GPIO_RISE_IP, bit); - regmap_write(chip->regs, SIFIVE_GPIO_FALL_IP, bit); - regmap_write(chip->regs, SIFIVE_GPIO_HIGH_IP, bit); - regmap_write(chip->regs, SIFIVE_GPIO_LOW_IP, bit); - raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags); + scoped_guard(gpio_generic_lock_irqsave, &chip->gen_gc) { + /* Clear all pending interrupts */ + regmap_write(chip->regs, SIFIVE_GPIO_RISE_IP, bit); + regmap_write(chip->regs, SIFIVE_GPIO_FALL_IP, bit); + regmap_write(chip->regs, SIFIVE_GPIO_HIGH_IP, bit); + regmap_write(chip->regs, SIFIVE_GPIO_LOW_IP, bit); + } =20 irq_chip_eoi_parent(d); } @@ -179,6 +177,7 @@ static const struct regmap_config sifive_gpio_regmap_co= nfig =3D { =20 static int sifive_gpio_probe(struct platform_device *pdev) { + struct gpio_generic_chip_config config; struct device *dev =3D &pdev->dev; struct irq_domain *parent; struct gpio_irq_chip *girq; @@ -217,13 +216,17 @@ static int sifive_gpio_probe(struct platform_device *= pdev) */ parent =3D irq_get_irq_data(chip->irq_number[0])->domain; =20 - ret =3D bgpio_init(&chip->gc, dev, 4, - chip->base + SIFIVE_GPIO_INPUT_VAL, - chip->base + SIFIVE_GPIO_OUTPUT_VAL, - NULL, - chip->base + SIFIVE_GPIO_OUTPUT_EN, - chip->base + SIFIVE_GPIO_INPUT_EN, - BGPIOF_READ_OUTPUT_REG_SET); + config =3D (typeof(config)){ + .dev =3D dev, + .sz =3D 4, + .dat =3D chip->base + SIFIVE_GPIO_INPUT_VAL, + .set =3D chip->base + SIFIVE_GPIO_OUTPUT_VAL, + .dirout =3D chip->base + SIFIVE_GPIO_OUTPUT_EN, + .dirin =3D chip->base + SIFIVE_GPIO_INPUT_EN, + .flags =3D BGPIOF_READ_OUTPUT_REG_SET, + }; + + ret =3D gpio_generic_chip_init(&chip->gen_gc, &config); if (ret) { dev_err(dev, "unable to init generic GPIO\n"); return ret; @@ -236,12 +239,12 @@ static int sifive_gpio_probe(struct platform_device *= pdev) regmap_write(chip->regs, SIFIVE_GPIO_LOW_IE, 0); chip->irq_state =3D 0; =20 - chip->gc.base =3D -1; - chip->gc.ngpio =3D ngpio; - chip->gc.label =3D dev_name(dev); - chip->gc.parent =3D dev; - chip->gc.owner =3D THIS_MODULE; - girq =3D &chip->gc.irq; + chip->gen_gc.gc.base =3D -1; + chip->gen_gc.gc.ngpio =3D ngpio; + chip->gen_gc.gc.label =3D dev_name(dev); + chip->gen_gc.gc.parent =3D dev; + chip->gen_gc.gc.owner =3D THIS_MODULE; + girq =3D &chip->gen_gc.gc.irq; gpio_irq_chip_set_chip(girq, &sifive_gpio_irqchip); girq->fwnode =3D dev_fwnode(dev); girq->parent_domain =3D parent; @@ -249,7 +252,7 @@ static int sifive_gpio_probe(struct platform_device *pd= ev) girq->handler =3D handle_bad_irq; girq->default_type =3D IRQ_TYPE_NONE; =20 - return gpiochip_add_data(&chip->gc, chip); + return gpiochip_add_data(&chip->gen_gc.gc, chip); } =20 static const struct of_device_id sifive_gpio_match[] =3D { --=20 2.48.1