From nobody Fri Oct 3 01:09:32 2025 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.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 11EF6308F1D for ; Tue, 9 Sep 2025 09:15:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757409360; cv=none; b=tL+yOcC1Huts90iCjKZR9YDrshB347W8Lx6HZs86+V1qCuNAVM7d7sZVcoboA+JfziToI9wqjm/ivkMFHZ7Kg8Cm0LqGpLFMOaa3ch2s0sSm7MF2Sjil9mCHbHlmo/jQIMVqF98SRf60bWcDaG4H3odXW1/FkIe1jEMsxrNPCj0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757409360; c=relaxed/simple; bh=DHIwykEQPa3w881W4iGI+NVdGDSXAEuIFPzLyCbBCB0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YYCTQnCFZJBgR5bNB2nFd+8L1pakSFkyEc1D+/AWchmGslm/Sa64uJg7t7AbfZ3t/LEKF4lbZ2jwTQt7vi7oNRn5jlTm3NrE+I7zYMvAITFIK2HYlwZ7JjYRXCwuM0br+IWPOHbkXwZVa6w/PbR8+ZkytiM1KcKfnv/dP5lC6ng= 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=WAyENct7; arc=none smtp.client-ip=209.85.221.48 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="WAyENct7" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-3e7428c4cbdso1458118f8f.0 for ; Tue, 09 Sep 2025 02:15:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1757409356; x=1758014156; 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=+6XI455PiNr81zZH6BtcUTDH3erDPhGkBmwL0UjtiA8=; b=WAyENct7zsMeiHPwC0bSoB3JDvYJwSl5Ye/C3GgdrCLJ60EnE4UsVHYdTeyI0G+uiE VNAzFcEAu7wEYcf5J5If3/Kqef2apyIH0w8uNqM6nqkMMamUI+0W5RDEVeUSNmQli/+b epUITlXQgTFn8XU9nAyropT1jqQpqk0oSbIDkTLlKxyL6qTmssqILCADVAJYOHG6yH1q UTFfS3Em4X3JCx0+F20x5c7BGXHehtFHYRgepyDdO5W5BRrvk2rjO/Ph6MigQEwqDVzi u65MIvU/Z6Z9QVW88OO3NDH14xM98vA3C/MNQ3Z4vICHKRf0gqUcXFXrC/mLQ4J7QdOG vmmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757409356; x=1758014156; 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=+6XI455PiNr81zZH6BtcUTDH3erDPhGkBmwL0UjtiA8=; b=h75bAPgRsuuPYU+1zHYBNBEFfR/D2+ZxOZy/zi+wWF7bJB5wUMy21ZnZ/qv4ST/A9Y Pmw7X28A41s1N2VzSwiQmbUGdXfEDLthzH3xs/m3caTdfr+U6PY9rokMevqs+ANtBNQK Mq0sTpo6LAqd7A6M+ECzUUTUlVrj5diZt/vhibPSBnd6W9SQGwR8Ss5+5kC5hHy/MTbv ZrFyT3/T0f10ri9VR+GWZnBMAMtyRk+WPKJ/KYE/4Mp66zTg4YNGfjG8D7mLGon1Y57q Rd1h8Sbz4MG0ir0mryPRsy1b3SVliIR5xd8dSJJ3WR3LYaikOjZxD5osCmEJ9cA1pOWq imwQ== X-Forwarded-Encrypted: i=1; AJvYcCUe7qg90i/rRUqUAZNaf1WBCq/gWHN6N5DdUbGSoSKEMY6rAm4rNZB4YuHAWCbtmyWLVOnI+LyT15vXr+k=@vger.kernel.org X-Gm-Message-State: AOJu0YzMw8zf1qdPCKjyUuUSeMCoSUKmJkBZLPoviu1nNuzCAS+402Uk wD0RrBfLAzuiMrFGRfD6OSO2HfGcwfnmsjvejHMIdBSadvRPEpteQG5v3oqzDuMAz2U= X-Gm-Gg: ASbGncvuK2kmCDHN3F8wbrx02H0jerEf7cagKmQdB7mKGJ6PP3DU0rtMWzLfHBa0VXb P4avSiffqHtVbQQfHUnQr6dTCx3UGpSreXh9RUlu2A41EMiKXrTvJIIan5IPJ9i/Rk1h3nNYA3a IZzsKhRVFxHlJtAglcoMJaf8IvUMZ1wFYSwOR4c7xWMNPouxRG0Lm6TfIBKCxpkqIT0ComqUEYf NE5LlyBiEskHQLSRmAH38BMXdDpsqLtvsUEErs9wm47H7QdslLANZA7KnJrAWZSe+NF/6FEXm5G qLgvqqM+0OvxqKKbqaKLHHk4TrlqPzZkQz7cYOH4uIlKjO/yJ9vpLOUGsksvVR0ddhDajIWoVl2 IVrHAlPeCezP0VFL3Zw== X-Google-Smtp-Source: AGHT+IGhdNQDTQ/G062FzoKjkwVDoXK1StiDr7oBbkv9KofrVmt1JYjUhLT/5CSNVFCfr9+qyLMbkg== X-Received: by 2002:a05:6000:40dd:b0:3d8:8f86:7afc with SMTP id ffacd0b85a97d-3e62a10b2f3mr10508011f8f.21.1757409356188; Tue, 09 Sep 2025 02:15:56 -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.15.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Sep 2025 02:15:54 -0700 (PDT) From: Bartosz Golaszewski Date: Tue, 09 Sep 2025 11:15:34 +0200 Subject: [PATCH 07/15] gpio: brcmstb: 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-7-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=10410; i=bartosz.golaszewski@linaro.org; h=from:subject:message-id; bh=zh+dbaYfNDf7FOmStJJaYhI936mnW1RBjpO4BgoCwfY=; b=owEBbQKS/ZANAwAKARGnLqAUcddyAcsmYgBov/A4mNwDK6jTB0asDLFnuBHDFAYdY5VCwV9Zd 0KgU+qodwqJAjMEAAEKAB0WIQQWnetsC8PEYBPSx58Rpy6gFHHXcgUCaL/wOAAKCRARpy6gFHHX ciZGD/96sA5hvRG/EKxfHse55GCoj86m/FiF71CbJ3ZBRNaYYl/gIpIqfj/Jtyr6jzKJISpSdVP HEmDoVGMpsrsyBYTZV38rOLfkVWALRlNO0PHPiMCbSsbVjaUNjtn+9VSlrZeUgS/RQlA7BXOMOe gfldbXTsD1UcY6yMRw2PAQ3Ltbc3zhu0NXzhd35CEc3VY5TqlLt8dULxT8CbQMHWxqE2zFY0JGI zqMvOxJaMPE4MqBMiwO9aheYemrGCnO2W+t7fMsGJuu0mPtfJ/2j3IqibWCa4IIsEQty4dgpCf5 UELR3jidqIAfxoY0JgsrbWn9Gt+/Wcltifr84Fisu/WBbUdr9GndT1ztvVs57Ozrd3sNOkiYZkp 9HdjZHiqIlKxwErdmQWIAONG+oUhUCt0SiOT+M0zjqTjQKoAIT7pyOvxYutinQw4mG7T3wpsSPi 2zSwUKU9kMY4KDz1MNuRKsWkNK9UZOC0TQFYvVwyQMiB3ldpzrNZyIS2sTBddrsHiATe1wPzV1p L2bqgPjv9dy8m+ZdBn7br20wSoMbMXFzZZzfTf5//yI3B+Foo05RP2GMYwQ5Z2vGkNLNKPei6wf /CYk5x0j3nXr8fUtL5Kw8fa66GX22SL3cz6tos9jwLPMXjg0RyccXN07KGbUw3JMDeiGzo7hGVu 5jFwNdL/mMWh++g== 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-brcmstb.c | 112 ++++++++++++++++++++++++----------------= ---- 1 file changed, 60 insertions(+), 52 deletions(-) diff --git a/drivers/gpio/gpio-brcmstb.c b/drivers/gpio/gpio-brcmstb.c index e29a9589b3ccbd17d10f6671088dca3e76537927..d03ff4ed9ef4c9d75f3e8c9c6fc= b39bc577bcb79 100644 --- a/drivers/gpio/gpio-brcmstb.c +++ b/drivers/gpio/gpio-brcmstb.c @@ -3,6 +3,7 @@ =20 #include #include +#include #include #include #include @@ -37,7 +38,7 @@ enum gio_reg_index { struct brcmstb_gpio_bank { struct list_head node; int id; - struct gpio_chip gc; + struct gpio_generic_chip chip; struct brcmstb_gpio_priv *parent_priv; u32 width; u32 wake_active; @@ -72,19 +73,18 @@ __brcmstb_gpio_get_active_irqs(struct brcmstb_gpio_bank= *bank) { void __iomem *reg_base =3D bank->parent_priv->reg_base; =20 - return bank->gc.read_reg(reg_base + GIO_STAT(bank->id)) & - bank->gc.read_reg(reg_base + GIO_MASK(bank->id)); + return gpio_generic_read_reg(&bank->chip, reg_base + GIO_STAT(bank->id)) & + gpio_generic_read_reg(&bank->chip, reg_base + GIO_MASK(bank->id)); } =20 static unsigned long brcmstb_gpio_get_active_irqs(struct brcmstb_gpio_bank *bank) { unsigned long status; - unsigned long flags; =20 - raw_spin_lock_irqsave(&bank->gc.bgpio_lock, flags); + guard(gpio_generic_lock_irqsave)(&bank->chip); + status =3D __brcmstb_gpio_get_active_irqs(bank); - raw_spin_unlock_irqrestore(&bank->gc.bgpio_lock, flags); =20 return status; } @@ -92,26 +92,26 @@ brcmstb_gpio_get_active_irqs(struct brcmstb_gpio_bank *= bank) static int brcmstb_gpio_hwirq_to_offset(irq_hw_number_t hwirq, struct brcmstb_gpio_bank *bank) { - return hwirq - bank->gc.offset; + return hwirq - bank->chip.gc.offset; } =20 static void brcmstb_gpio_set_imask(struct brcmstb_gpio_bank *bank, unsigned int hwirq, bool enable) { - struct gpio_chip *gc =3D &bank->gc; struct brcmstb_gpio_priv *priv =3D bank->parent_priv; u32 mask =3D BIT(brcmstb_gpio_hwirq_to_offset(hwirq, bank)); u32 imask; - unsigned long flags; =20 - raw_spin_lock_irqsave(&gc->bgpio_lock, flags); - imask =3D gc->read_reg(priv->reg_base + GIO_MASK(bank->id)); + guard(gpio_generic_lock_irqsave)(&bank->chip); + + imask =3D gpio_generic_read_reg(&bank->chip, + priv->reg_base + GIO_MASK(bank->id)); if (enable) imask |=3D mask; else imask &=3D ~mask; - gc->write_reg(priv->reg_base + GIO_MASK(bank->id), imask); - raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags); + gpio_generic_write_reg(&bank->chip, + priv->reg_base + GIO_MASK(bank->id), imask); } =20 static int brcmstb_gpio_to_irq(struct gpio_chip *gc, unsigned offset) @@ -150,7 +150,8 @@ static void brcmstb_gpio_irq_ack(struct irq_data *d) struct brcmstb_gpio_priv *priv =3D bank->parent_priv; u32 mask =3D BIT(brcmstb_gpio_hwirq_to_offset(d->hwirq, bank)); =20 - gc->write_reg(priv->reg_base + GIO_STAT(bank->id), mask); + gpio_generic_write_reg(&bank->chip, + priv->reg_base + GIO_STAT(bank->id), mask); } =20 static int brcmstb_gpio_irq_set_type(struct irq_data *d, unsigned int type) @@ -162,7 +163,6 @@ static int brcmstb_gpio_irq_set_type(struct irq_data *d= , unsigned int type) u32 edge_insensitive, iedge_insensitive; u32 edge_config, iedge_config; u32 level, ilevel; - unsigned long flags; =20 switch (type) { case IRQ_TYPE_LEVEL_LOW: @@ -194,23 +194,25 @@ static int brcmstb_gpio_irq_set_type(struct irq_data = *d, unsigned int type) return -EINVAL; } =20 - raw_spin_lock_irqsave(&bank->gc.bgpio_lock, flags); + guard(gpio_generic_lock_irqsave)(&bank->chip); =20 - iedge_config =3D bank->gc.read_reg(priv->reg_base + - GIO_EC(bank->id)) & ~mask; - iedge_insensitive =3D bank->gc.read_reg(priv->reg_base + - GIO_EI(bank->id)) & ~mask; - ilevel =3D bank->gc.read_reg(priv->reg_base + - GIO_LEVEL(bank->id)) & ~mask; + iedge_config =3D gpio_generic_read_reg(&bank->chip, + priv->reg_base + GIO_EC(bank->id)) & ~mask; + iedge_insensitive =3D gpio_generic_read_reg(&bank->chip, + priv->reg_base + GIO_EI(bank->id)) & ~mask; + ilevel =3D gpio_generic_read_reg(&bank->chip, + priv->reg_base + GIO_LEVEL(bank->id)) & ~mask; =20 - bank->gc.write_reg(priv->reg_base + GIO_EC(bank->id), - iedge_config | edge_config); - bank->gc.write_reg(priv->reg_base + GIO_EI(bank->id), - iedge_insensitive | edge_insensitive); - bank->gc.write_reg(priv->reg_base + GIO_LEVEL(bank->id), - ilevel | level); + gpio_generic_write_reg(&bank->chip, + priv->reg_base + GIO_EC(bank->id), + iedge_config | edge_config); + gpio_generic_write_reg(&bank->chip, + priv->reg_base + GIO_EI(bank->id), + iedge_insensitive | edge_insensitive); + gpio_generic_write_reg(&bank->chip, + priv->reg_base + GIO_LEVEL(bank->id), + ilevel | level); =20 - raw_spin_unlock_irqrestore(&bank->gc.bgpio_lock, flags); return 0; } =20 @@ -263,7 +265,7 @@ static void brcmstb_gpio_irq_bank_handler(struct brcmst= b_gpio_bank *bank) { struct brcmstb_gpio_priv *priv =3D bank->parent_priv; struct irq_domain *domain =3D priv->irq_domain; - int hwbase =3D bank->gc.offset; + int hwbase =3D bank->chip.gc.offset; unsigned long status; =20 while ((status =3D brcmstb_gpio_get_active_irqs(bank))) { @@ -303,7 +305,7 @@ static struct brcmstb_gpio_bank *brcmstb_gpio_hwirq_to_= bank( =20 /* banks are in descending order */ list_for_each_entry_reverse(bank, &priv->bank_list, node) { - i +=3D bank->gc.ngpio; + i +=3D bank->chip.gc.ngpio; if (hwirq < i) return bank; } @@ -332,7 +334,7 @@ static int brcmstb_gpio_irq_map(struct irq_domain *d, u= nsigned int irq, =20 dev_dbg(&pdev->dev, "Mapping irq %d for gpio line %d (bank %d)\n", irq, (int)hwirq, bank->id); - ret =3D irq_set_chip_data(irq, &bank->gc); + ret =3D irq_set_chip_data(irq, &bank->chip.gc); if (ret < 0) return ret; irq_set_lockdep_class(irq, &brcmstb_gpio_irq_lock_class, @@ -394,7 +396,7 @@ static void brcmstb_gpio_remove(struct platform_device = *pdev) * more important to actually perform all of the steps. */ list_for_each_entry(bank, &priv->bank_list, node) - gpiochip_remove(&bank->gc); + gpiochip_remove(&bank->chip.gc); } =20 static int brcmstb_gpio_of_xlate(struct gpio_chip *gc, @@ -412,7 +414,7 @@ static int brcmstb_gpio_of_xlate(struct gpio_chip *gc, if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells)) return -EINVAL; =20 - offset =3D gpiospec->args[0] - bank->gc.offset; + offset =3D gpiospec->args[0] - bank->chip.gc.offset; if (offset >=3D gc->ngpio || offset < 0) return -EINVAL; =20 @@ -493,19 +495,17 @@ static int brcmstb_gpio_irq_setup(struct platform_dev= ice *pdev, static void brcmstb_gpio_bank_save(struct brcmstb_gpio_priv *priv, struct brcmstb_gpio_bank *bank) { - struct gpio_chip *gc =3D &bank->gc; unsigned int i; =20 for (i =3D 0; i < GIO_REG_STAT; i++) - bank->saved_regs[i] =3D gc->read_reg(priv->reg_base + - GIO_BANK_OFF(bank->id, i)); + bank->saved_regs[i] =3D gpio_generic_read_reg(&bank->chip, + priv->reg_base + GIO_BANK_OFF(bank->id, i)); } =20 static void brcmstb_gpio_quiesce(struct device *dev, bool save) { struct brcmstb_gpio_priv *priv =3D dev_get_drvdata(dev); struct brcmstb_gpio_bank *bank; - struct gpio_chip *gc; u32 imask; =20 /* disable non-wake interrupt */ @@ -513,8 +513,6 @@ static void brcmstb_gpio_quiesce(struct device *dev, bo= ol save) disable_irq(priv->parent_irq); =20 list_for_each_entry(bank, &priv->bank_list, node) { - gc =3D &bank->gc; - if (save) brcmstb_gpio_bank_save(priv, bank); =20 @@ -523,8 +521,9 @@ static void brcmstb_gpio_quiesce(struct device *dev, bo= ol save) imask =3D bank->wake_active; else imask =3D 0; - gc->write_reg(priv->reg_base + GIO_MASK(bank->id), - imask); + gpio_generic_write_reg(&bank->chip, + priv->reg_base + GIO_MASK(bank->id), + imask); } } =20 @@ -538,12 +537,12 @@ static void brcmstb_gpio_shutdown(struct platform_dev= ice *pdev) static void brcmstb_gpio_bank_restore(struct brcmstb_gpio_priv *priv, struct brcmstb_gpio_bank *bank) { - struct gpio_chip *gc =3D &bank->gc; unsigned int i; =20 for (i =3D 0; i < GIO_REG_STAT; i++) - gc->write_reg(priv->reg_base + GIO_BANK_OFF(bank->id, i), - bank->saved_regs[i]); + gpio_generic_write_reg(&bank->chip, + priv->reg_base + GIO_BANK_OFF(bank->id, i), + bank->saved_regs[i]); } =20 static int brcmstb_gpio_suspend(struct device *dev) @@ -585,6 +584,7 @@ static const struct dev_pm_ops brcmstb_gpio_pm_ops =3D { =20 static int brcmstb_gpio_probe(struct platform_device *pdev) { + struct gpio_generic_chip_config config; struct device *dev =3D &pdev->dev; struct device_node *np =3D dev->of_node; void __iomem *reg_base; @@ -665,17 +665,24 @@ static int brcmstb_gpio_probe(struct platform_device = *pdev) bank->width =3D bank_width; } =20 + gc =3D &bank->chip.gc; + /* * Regs are 4 bytes wide, have data reg, no set/clear regs, * and direction bits have 0 =3D output and 1 =3D input */ - gc =3D &bank->gc; - err =3D bgpio_init(gc, dev, 4, - reg_base + GIO_DATA(bank->id), - NULL, NULL, NULL, - reg_base + GIO_IODIR(bank->id), flags); + + config =3D (typeof(config)){ + .dev =3D dev, + .sz =3D 4, + .dat =3D reg_base + GIO_DATA(bank->id), + .dirin =3D reg_base + GIO_IODIR(bank->id), + .flags =3D flags, + }; + + err =3D gpio_generic_chip_init(&bank->chip, &config); if (err) { - dev_err(dev, "bgpio_init() failed\n"); + dev_err(dev, "failed to initialize generic GPIO chip\n"); goto fail; } =20 @@ -700,7 +707,8 @@ static int brcmstb_gpio_probe(struct platform_device *p= dev) * be retained from S5 cold boot */ need_wakeup_event |=3D !!__brcmstb_gpio_get_active_irqs(bank); - gc->write_reg(reg_base + GIO_MASK(bank->id), 0); + gpio_generic_write_reg(&bank->chip, + reg_base + GIO_MASK(bank->id), 0); =20 err =3D gpiochip_add_data(gc, bank); if (err) { --=20 2.48.1