drivers/gpio/gpio-bt8xx.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-)
Switch to the new generic PCI power management framework and remove legacy
callbacks like .suspend() and .resume(). With the generic framework, the
standard PCI related work like:
- pci_save/restore_state()
- pci_enable/disable_device()
- pci_set_power_state()
is handled by the PCI core and this driver should implement only gpio-bt8xx
specific operations in its respective callback functions.
Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
---
drivers/gpio/gpio-bt8xx.c | 27 +++++++--------------------
1 file changed, 7 insertions(+), 20 deletions(-)
diff --git a/drivers/gpio/gpio-bt8xx.c b/drivers/gpio/gpio-bt8xx.c
index 05401da03ca3..e8d0c67bb618 100644
--- a/drivers/gpio/gpio-bt8xx.c
+++ b/drivers/gpio/gpio-bt8xx.c
@@ -224,9 +224,9 @@ static void bt8xxgpio_remove(struct pci_dev *pdev)
pci_disable_device(pdev);
}
-#ifdef CONFIG_PM
-static int bt8xxgpio_suspend(struct pci_dev *pdev, pm_message_t state)
+static int __maybe_unused bt8xxgpio_suspend(struct device *dev)
{
+ struct pci_dev *pdev = to_pci_dev(dev);
struct bt8xxgpio *bg = pci_get_drvdata(pdev);
scoped_guard(spinlock_irqsave, &bg->lock) {
@@ -238,23 +238,13 @@ static int bt8xxgpio_suspend(struct pci_dev *pdev, pm_message_t state)
bgwrite(0x0, BT848_GPIO_OUT_EN);
}
- pci_save_state(pdev);
- pci_disable_device(pdev);
- pci_set_power_state(pdev, pci_choose_state(pdev, state));
-
return 0;
}
-static int bt8xxgpio_resume(struct pci_dev *pdev)
+static int __maybe_unused bt8xxgpio_resume(struct device *dev)
{
+ struct pci_dev *pdev = to_pci_dev(dev);
struct bt8xxgpio *bg = pci_get_drvdata(pdev);
- int err;
-
- pci_set_power_state(pdev, PCI_D0);
- err = pci_enable_device(pdev);
- if (err)
- return err;
- pci_restore_state(pdev);
guard(spinlock_irqsave)(&bg->lock);
@@ -267,10 +257,8 @@ static int bt8xxgpio_resume(struct pci_dev *pdev)
return 0;
}
-#else
-#define bt8xxgpio_suspend NULL
-#define bt8xxgpio_resume NULL
-#endif /* CONFIG_PM */
+
+static SIMPLE_DEV_PM_OPS(bt8xxgpio_pm_ops, bt8xxgpio_suspend, bt8xxgpio_resume);
static const struct pci_device_id bt8xxgpio_pci_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848) },
@@ -286,8 +274,7 @@ static struct pci_driver bt8xxgpio_pci_driver = {
.id_table = bt8xxgpio_pci_tbl,
.probe = bt8xxgpio_probe,
.remove = bt8xxgpio_remove,
- .suspend = bt8xxgpio_suspend,
- .resume = bt8xxgpio_resume,
+ .driver.pm = &bt8xxgpio_pm_ops,
};
module_pci_driver(bt8xxgpio_pci_driver);
--
2.51.0
Hi Vaibhav,
kernel test robot noticed the following build errors:
[auto build test ERROR on brgl/gpio/for-next]
[also build test ERROR on linus/master v6.17 next-20251010]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Vaibhav-Gupta/driver-gpio-bt8xx-use-generic-PCI-PM/20251010-185625
base: https://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git gpio/for-next
patch link: https://lore.kernel.org/r/20251010105338.664564-1-vaibhavgupta40%40gmail.com
patch subject: [PATCH v1] driver: gpio-bt8xx: use generic PCI PM
config: loongarch-randconfig-002-20251011 (https://download.01.org/0day-ci/archive/20251011/202510110924.dUQeeRV6-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 12.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251011/202510110924.dUQeeRV6-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202510110924.dUQeeRV6-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/gpio/gpio-bt8xx.c: In function 'bt8xxgpio_suspend':
>> drivers/gpio/gpio-bt8xx.c:233:19: error: 'struct bt8xxgpio' has no member named 'saved_outen'
233 | bg->saved_outen = bgread(BT848_GPIO_OUT_EN);
| ^~
>> drivers/gpio/gpio-bt8xx.c:234:19: error: 'struct bt8xxgpio' has no member named 'saved_data'
234 | bg->saved_data = bgread(BT848_GPIO_DATA);
| ^~
drivers/gpio/gpio-bt8xx.c: In function 'bt8xxgpio_resume':
drivers/gpio/gpio-bt8xx.c:254:19: error: 'struct bt8xxgpio' has no member named 'saved_outen'
254 | bgwrite(bg->saved_outen, BT848_GPIO_OUT_EN);
| ^~
drivers/gpio/gpio-bt8xx.c:61:41: note: in definition of macro 'bgwrite'
61 | #define bgwrite(dat, adr) writel((dat), bg->mmio+(adr))
| ^~~
drivers/gpio/gpio-bt8xx.c:255:19: error: 'struct bt8xxgpio' has no member named 'saved_data'
255 | bgwrite(bg->saved_data & bg->saved_outen,
| ^~
drivers/gpio/gpio-bt8xx.c:61:41: note: in definition of macro 'bgwrite'
61 | #define bgwrite(dat, adr) writel((dat), bg->mmio+(adr))
| ^~~
drivers/gpio/gpio-bt8xx.c:255:36: error: 'struct bt8xxgpio' has no member named 'saved_outen'
255 | bgwrite(bg->saved_data & bg->saved_outen,
| ^~
drivers/gpio/gpio-bt8xx.c:61:41: note: in definition of macro 'bgwrite'
61 | #define bgwrite(dat, adr) writel((dat), bg->mmio+(adr))
| ^~~
vim +233 drivers/gpio/gpio-bt8xx.c
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 226
2213c7a2cb81b2 drivers/gpio/gpio-bt8xx.c Vaibhav Gupta 2025-10-10 227 static int __maybe_unused bt8xxgpio_suspend(struct device *dev)
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 228 {
2213c7a2cb81b2 drivers/gpio/gpio-bt8xx.c Vaibhav Gupta 2025-10-10 229 struct pci_dev *pdev = to_pci_dev(dev);
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 230 struct bt8xxgpio *bg = pci_get_drvdata(pdev);
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 231
b9a557d05a7dde drivers/gpio/gpio-bt8xx.c Bartosz Golaszewski 2025-03-10 232 scoped_guard(spinlock_irqsave, &bg->lock) {
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 @233 bg->saved_outen = bgread(BT848_GPIO_OUT_EN);
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 @234 bg->saved_data = bgread(BT848_GPIO_DATA);
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 235
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 236 bgwrite(0, BT848_INT_MASK);
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 237 bgwrite(~0x0, BT848_INT_STAT);
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 238 bgwrite(0x0, BT848_GPIO_OUT_EN);
b9a557d05a7dde drivers/gpio/gpio-bt8xx.c Bartosz Golaszewski 2025-03-10 239 }
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 240
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 241 return 0;
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 242 }
ff1d5c2f0268f4 drivers/gpio/bt8xxgpio.c Michael Buesch 2008-07-25 243
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
On Sat, 11 Oct 2025 09:43:54 +0800 kernel test robot <lkp@intel.com> wrote: > Hi Vaibhav, > > kernel test robot noticed the following build errors: > drivers/gpio/gpio-bt8xx.c: In function 'bt8xxgpio_suspend': > >> drivers/gpio/gpio-bt8xx.c:233:19: error: 'struct bt8xxgpio' has no member named 'saved_outen' > 233 | bg->saved_outen = bgread(BT848_GPIO_OUT_EN); > | ^~ It looks like the #ifdef CONFIG_PM must be removed from struct bt8xxgpio definition. -- Michael Büsch https://bues.ch/
On Sat, Oct 11, 2025 at 12:26:12PM +0200, Michael Büsch wrote: > On Sat, 11 Oct 2025 09:43:54 +0800 > kernel test robot <lkp@intel.com> wrote: > > > Hi Vaibhav, > > > > kernel test robot noticed the following build errors: > > > drivers/gpio/gpio-bt8xx.c: In function 'bt8xxgpio_suspend': > > >> drivers/gpio/gpio-bt8xx.c:233:19: error: 'struct bt8xxgpio' has no member named 'saved_outen' > > 233 | bg->saved_outen = bgread(BT848_GPIO_OUT_EN); > > | ^~ > > > It looks like the > #ifdef CONFIG_PM > must be removed from struct bt8xxgpio definition. > > -- > Michael Büsch > https://bues.ch/ Hello Michael, Ah yes, this macro somehow got overlooked by me. I will send a v2. Thanks for the review! Regards, Vaibhav
On Sat, Oct 11, 2025 at 1:32 PM Vaibhav Gupta <vaibhavgupta40@gmail.com> wrote: > > On Sat, Oct 11, 2025 at 12:26:12PM +0200, Michael Büsch wrote: > > On Sat, 11 Oct 2025 09:43:54 +0800 > > kernel test robot <lkp@intel.com> wrote: > > > > > Hi Vaibhav, > > > > > > kernel test robot noticed the following build errors: > > > > > drivers/gpio/gpio-bt8xx.c: In function 'bt8xxgpio_suspend': > > > >> drivers/gpio/gpio-bt8xx.c:233:19: error: 'struct bt8xxgpio' has no member named 'saved_outen' > > > 233 | bg->saved_outen = bgread(BT848_GPIO_OUT_EN); > > > | ^~ > > > > > > It looks like the > > #ifdef CONFIG_PM > > must be removed from struct bt8xxgpio definition. > > > > -- > > Michael Büsch > > https://bues.ch/ > > Hello Michael, > > Ah yes, this macro somehow got overlooked by me. I will send a v2. > Thanks for the review! > > Regards, > Vaibhav While at it: the subject should be: "gpio: bt8xx: ..." Bart
On Mon, Oct 13, 2025 at 11:41:43AM +0200, Bartosz Golaszewski wrote: > On Sat, Oct 11, 2025 at 1:32 PM Vaibhav Gupta <vaibhavgupta40@gmail.com> wrote: > > > > > > Hello Michael, > > > > Ah yes, this macro somehow got overlooked by me. I will send a v2. > > Thanks for the review! > > > > Regards, > > Vaibhav > > While at it: the subject should be: "gpio: bt8xx: ..." > > Bart Done in v4. Vaibhav
On Mon, Oct 13, 2025 at 1:03 PM Vaibhav Gupta <vaibhavgupta40@gmail.com> wrote: > > On Mon, Oct 13, 2025 at 11:41:43AM +0200, Bartosz Golaszewski wrote: > > On Sat, Oct 11, 2025 at 1:32 PM Vaibhav Gupta <vaibhavgupta40@gmail.com> wrote: > > > > > > > > > Hello Michael, > > > > > > Ah yes, this macro somehow got overlooked by me. I will send a v2. > > > Thanks for the review! > > > > > > Regards, > > > Vaibhav > > > > While at it: the subject should be: "gpio: bt8xx: ..." > > > > Bart > > Done in v4. > > Vaibhav No, it was not. Bartosz
On Mon, Oct 13, 2025 at 05:36:17PM +0200, Bartosz Golaszewski wrote: > On Mon, Oct 13, 2025 at 1:03 PM Vaibhav Gupta <vaibhavgupta40@gmail.com> wrote: > > > > > > > > While at it: the subject should be: "gpio: bt8xx: ..." > > > > > > Bart > > > > Done in v4. > > > > Vaibhav > > No, it was not. > > Bartosz Ah I see, I though you just wanted the transformation of "gpio-bt8xx:" to "gpio: bt8xx:". I've removed "driver:" as well in v5 from the header. Vaibhav
Switch to the new generic PCI power management framework and remove legacy
callbacks like .suspend() and .resume(). With the generic framework, the
standard PCI related work like:
- pci_save/restore_state()
- pci_enable/disable_device()
- pci_set_power_state()
is handled by the PCI core and this driver should implement only gpio-bt8xx
specific operations in its respective callback functions.
Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
---
drivers/gpio/gpio-bt8xx.c | 29 +++++++----------------------
1 file changed, 7 insertions(+), 22 deletions(-)
diff --git a/drivers/gpio/gpio-bt8xx.c b/drivers/gpio/gpio-bt8xx.c
index 05401da03ca3..70b49c385b43 100644
--- a/drivers/gpio/gpio-bt8xx.c
+++ b/drivers/gpio/gpio-bt8xx.c
@@ -52,10 +52,8 @@ struct bt8xxgpio {
struct pci_dev *pdev;
struct gpio_chip gpio;
-#ifdef CONFIG_PM
u32 saved_outen;
u32 saved_data;
-#endif
};
#define bgwrite(dat, adr) writel((dat), bg->mmio+(adr))
@@ -224,9 +222,9 @@ static void bt8xxgpio_remove(struct pci_dev *pdev)
pci_disable_device(pdev);
}
-#ifdef CONFIG_PM
-static int bt8xxgpio_suspend(struct pci_dev *pdev, pm_message_t state)
+static int __maybe_unused bt8xxgpio_suspend(struct device *dev)
{
+ struct pci_dev *pdev = to_pci_dev(dev);
struct bt8xxgpio *bg = pci_get_drvdata(pdev);
scoped_guard(spinlock_irqsave, &bg->lock) {
@@ -238,23 +236,13 @@ static int bt8xxgpio_suspend(struct pci_dev *pdev, pm_message_t state)
bgwrite(0x0, BT848_GPIO_OUT_EN);
}
- pci_save_state(pdev);
- pci_disable_device(pdev);
- pci_set_power_state(pdev, pci_choose_state(pdev, state));
-
return 0;
}
-static int bt8xxgpio_resume(struct pci_dev *pdev)
+static int __maybe_unused bt8xxgpio_resume(struct device *dev)
{
+ struct pci_dev *pdev = to_pci_dev(dev);
struct bt8xxgpio *bg = pci_get_drvdata(pdev);
- int err;
-
- pci_set_power_state(pdev, PCI_D0);
- err = pci_enable_device(pdev);
- if (err)
- return err;
- pci_restore_state(pdev);
guard(spinlock_irqsave)(&bg->lock);
@@ -267,10 +255,8 @@ static int bt8xxgpio_resume(struct pci_dev *pdev)
return 0;
}
-#else
-#define bt8xxgpio_suspend NULL
-#define bt8xxgpio_resume NULL
-#endif /* CONFIG_PM */
+
+static DEFINE_SIMPLE_DEV_PM_OPS(bt8xxgpio_pm_ops, bt8xxgpio_suspend, bt8xxgpio_resume);
static const struct pci_device_id bt8xxgpio_pci_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848) },
@@ -286,8 +272,7 @@ static struct pci_driver bt8xxgpio_pci_driver = {
.id_table = bt8xxgpio_pci_tbl,
.probe = bt8xxgpio_probe,
.remove = bt8xxgpio_remove,
- .suspend = bt8xxgpio_suspend,
- .resume = bt8xxgpio_resume,
+ .driver.pm = &bt8xxgpio_pm_ops,
};
module_pci_driver(bt8xxgpio_pci_driver);
--
2.51.0
On Mon, Oct 13, 2025 at 03:52:59PM +0000, Vaibhav Gupta wrote:
> Switch to the new generic PCI power management framework and remove legacy
> callbacks like .suspend() and .resume(). With the generic framework, the
> standard PCI related work like:
> - pci_save/restore_state()
> - pci_enable/disable_device()
> - pci_set_power_state()
> is handled by the PCI core and this driver should implement only gpio-bt8xx
> specific operations in its respective callback functions.
Tiny nits:
s/use generic PCI PM/use generic power management/ # subject; not PCI
s/new generic PCI power/generic power management/ # no longer "new" :)
> Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
> ---
> drivers/gpio/gpio-bt8xx.c | 29 +++++++----------------------
> 1 file changed, 7 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpio/gpio-bt8xx.c b/drivers/gpio/gpio-bt8xx.c
> index 05401da03ca3..70b49c385b43 100644
> --- a/drivers/gpio/gpio-bt8xx.c
> +++ b/drivers/gpio/gpio-bt8xx.c
> @@ -52,10 +52,8 @@ struct bt8xxgpio {
> struct pci_dev *pdev;
> struct gpio_chip gpio;
>
> -#ifdef CONFIG_PM
> u32 saved_outen;
> u32 saved_data;
> -#endif
> };
>
> #define bgwrite(dat, adr) writel((dat), bg->mmio+(adr))
> @@ -224,9 +222,9 @@ static void bt8xxgpio_remove(struct pci_dev *pdev)
> pci_disable_device(pdev);
> }
>
> -#ifdef CONFIG_PM
> -static int bt8xxgpio_suspend(struct pci_dev *pdev, pm_message_t state)
> +static int __maybe_unused bt8xxgpio_suspend(struct device *dev)
I think __maybe_unused is unnecessary because of this path:
DEFINE_SIMPLE_DEV_PM_OPS
_DEFINE_DEV_PM_OPS
SYSTEM_SLEEP_PM_OPS
pm_sleep_ptr
PTR_IF(IS_ENABLED(CONFIG_PM_SLEEP), (_ptr))
Detailed explanation here:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/util_macros.h?id=v6.17#n86
> {
> + struct pci_dev *pdev = to_pci_dev(dev);
> struct bt8xxgpio *bg = pci_get_drvdata(pdev);
>
> scoped_guard(spinlock_irqsave, &bg->lock) {
Unrelated to this patch, but it's not clear to me why bg->lock is
needed here (or maybe anywhere).
$ git grep -l "static int.*_suspend" drivers/gpio | wc -l
26
$ git grep -W "static int.*_suspend" drivers/gpio | grep lock | grep -v unlock | wc -l
It looks like only about 8 of the 26 gpio drivers that implement
.suspend() protect it with a lock. I would expect a lock to be needed
in all of them or none of them.
> @@ -238,23 +236,13 @@ static int bt8xxgpio_suspend(struct pci_dev *pdev, pm_message_t state)
> bgwrite(0x0, BT848_GPIO_OUT_EN);
> }
>
> - pci_save_state(pdev);
> - pci_disable_device(pdev);
> - pci_set_power_state(pdev, pci_choose_state(pdev, state));
> -
> return 0;
> }
>
> -static int bt8xxgpio_resume(struct pci_dev *pdev)
> +static int __maybe_unused bt8xxgpio_resume(struct device *dev)
> {
> + struct pci_dev *pdev = to_pci_dev(dev);
> struct bt8xxgpio *bg = pci_get_drvdata(pdev);
> - int err;
> -
> - pci_set_power_state(pdev, PCI_D0);
> - err = pci_enable_device(pdev);
> - if (err)
> - return err;
> - pci_restore_state(pdev);
>
> guard(spinlock_irqsave)(&bg->lock);
>
> @@ -267,10 +255,8 @@ static int bt8xxgpio_resume(struct pci_dev *pdev)
>
> return 0;
> }
> -#else
> -#define bt8xxgpio_suspend NULL
> -#define bt8xxgpio_resume NULL
> -#endif /* CONFIG_PM */
> +
> +static DEFINE_SIMPLE_DEV_PM_OPS(bt8xxgpio_pm_ops, bt8xxgpio_suspend, bt8xxgpio_resume);
>
> static const struct pci_device_id bt8xxgpio_pci_tbl[] = {
> { PCI_DEVICE(PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848) },
> @@ -286,8 +272,7 @@ static struct pci_driver bt8xxgpio_pci_driver = {
> .id_table = bt8xxgpio_pci_tbl,
> .probe = bt8xxgpio_probe,
> .remove = bt8xxgpio_remove,
> - .suspend = bt8xxgpio_suspend,
> - .resume = bt8xxgpio_resume,
> + .driver.pm = &bt8xxgpio_pm_ops,
> };
>
> module_pci_driver(bt8xxgpio_pci_driver);
> --
> 2.51.0
>
On Mon, Oct 13, 2025 at 12:43:19PM -0500, Bjorn Helgaas wrote:
> On Mon, Oct 13, 2025 at 03:52:59PM +0000, Vaibhav Gupta wrote:
> > Switch to the new generic PCI power management framework and remove legacy
> > callbacks like .suspend() and .resume(). With the generic framework, the
> > standard PCI related work like:
> > - pci_save/restore_state()
> > - pci_enable/disable_device()
> > - pci_set_power_state()
> > is handled by the PCI core and this driver should implement only gpio-bt8xx
> > specific operations in its respective callback functions.
>
> Tiny nits:
>
> s/use generic PCI PM/use generic power management/ # subject; not PCI
> s/new generic PCI power/generic power management/ # no longer "new" :)
>
> > Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
> > ---
> > drivers/gpio/gpio-bt8xx.c | 29 +++++++----------------------
> > 1 file changed, 7 insertions(+), 22 deletions(-)
> >
> > diff --git a/drivers/gpio/gpio-bt8xx.c b/drivers/gpio/gpio-bt8xx.c
> > index 05401da03ca3..70b49c385b43 100644
> > --- a/drivers/gpio/gpio-bt8xx.c
> > +++ b/drivers/gpio/gpio-bt8xx.c
> > @@ -52,10 +52,8 @@ struct bt8xxgpio {
> > struct pci_dev *pdev;
> > struct gpio_chip gpio;
> >
> > -#ifdef CONFIG_PM
> > u32 saved_outen;
> > u32 saved_data;
> > -#endif
> > };
> >
> > #define bgwrite(dat, adr) writel((dat), bg->mmio+(adr))
> > @@ -224,9 +222,9 @@ static void bt8xxgpio_remove(struct pci_dev *pdev)
> > pci_disable_device(pdev);
> > }
> >
> > -#ifdef CONFIG_PM
> > -static int bt8xxgpio_suspend(struct pci_dev *pdev, pm_message_t state)
> > +static int __maybe_unused bt8xxgpio_suspend(struct device *dev)
>
> I think __maybe_unused is unnecessary because of this path:
>
> DEFINE_SIMPLE_DEV_PM_OPS
> _DEFINE_DEV_PM_OPS
> SYSTEM_SLEEP_PM_OPS
> pm_sleep_ptr
> PTR_IF(IS_ENABLED(CONFIG_PM_SLEEP), (_ptr))
>
> Detailed explanation here:
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/util_macros.h?id=v6.17#n86
>
Fixed them in v6.
> > {
> > + struct pci_dev *pdev = to_pci_dev(dev);
> > struct bt8xxgpio *bg = pci_get_drvdata(pdev);
> >
> > scoped_guard(spinlock_irqsave, &bg->lock) {
>
> Unrelated to this patch, but it's not clear to me why bg->lock is
> needed here (or maybe anywhere).
>
> $ git grep -l "static int.*_suspend" drivers/gpio | wc -l
> 26
> $ git grep -W "static int.*_suspend" drivers/gpio | grep lock | grep -v unlock | wc -l
>
> It looks like only about 8 of the 26 gpio drivers that implement
> .suspend() protect it with a lock. I would expect a lock to be needed
> in all of them or none of them.
>
I can have a look at them.
regards,
Vaibhav
> > @@ -238,23 +236,13 @@ static int bt8xxgpio_suspend(struct pci_dev *pdev, pm_message_t state)
> > bgwrite(0x0, BT848_GPIO_OUT_EN);
> > }
> >
> > - pci_save_state(pdev);
> > - pci_disable_device(pdev);
> > - pci_set_power_state(pdev, pci_choose_state(pdev, state));
> > -
> > return 0;
> > }
> >
> > -static int bt8xxgpio_resume(struct pci_dev *pdev)
> > +static int __maybe_unused bt8xxgpio_resume(struct device *dev)
> > {
> > + struct pci_dev *pdev = to_pci_dev(dev);
> > struct bt8xxgpio *bg = pci_get_drvdata(pdev);
> > - int err;
> > -
> > - pci_set_power_state(pdev, PCI_D0);
> > - err = pci_enable_device(pdev);
> > - if (err)
> > - return err;
> > - pci_restore_state(pdev);
> >
> > guard(spinlock_irqsave)(&bg->lock);
> >
> > @@ -267,10 +255,8 @@ static int bt8xxgpio_resume(struct pci_dev *pdev)
> >
> > return 0;
> > }
> > -#else
> > -#define bt8xxgpio_suspend NULL
> > -#define bt8xxgpio_resume NULL
> > -#endif /* CONFIG_PM */
> > +
> > +static DEFINE_SIMPLE_DEV_PM_OPS(bt8xxgpio_pm_ops, bt8xxgpio_suspend, bt8xxgpio_resume);
> >
> > static const struct pci_device_id bt8xxgpio_pci_tbl[] = {
> > { PCI_DEVICE(PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848) },
> > @@ -286,8 +272,7 @@ static struct pci_driver bt8xxgpio_pci_driver = {
> > .id_table = bt8xxgpio_pci_tbl,
> > .probe = bt8xxgpio_probe,
> > .remove = bt8xxgpio_remove,
> > - .suspend = bt8xxgpio_suspend,
> > - .resume = bt8xxgpio_resume,
> > + .driver.pm = &bt8xxgpio_pm_ops,
> > };
> >
> > module_pci_driver(bt8xxgpio_pci_driver);
> > --
> > 2.51.0
> >
Switch to the generic PCI power management framework and remove legacy
callbacks like .suspend() and .resume(). With the generic framework, the
standard PCI related work like:
- pci_save/restore_state()
- pci_enable/disable_device()
- pci_set_power_state()
is handled by the PCI core and this driver should implement only gpio-bt8xx
specific operations in its respective callback functions.
Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
---
drivers/gpio/gpio-bt8xx.c | 30 ++++++++----------------------
1 file changed, 8 insertions(+), 22 deletions(-)
diff --git a/drivers/gpio/gpio-bt8xx.c b/drivers/gpio/gpio-bt8xx.c
index 05401da03ca3..324eeb77dbd5 100644
--- a/drivers/gpio/gpio-bt8xx.c
+++ b/drivers/gpio/gpio-bt8xx.c
@@ -52,10 +52,8 @@ struct bt8xxgpio {
struct pci_dev *pdev;
struct gpio_chip gpio;
-#ifdef CONFIG_PM
u32 saved_outen;
u32 saved_data;
-#endif
};
#define bgwrite(dat, adr) writel((dat), bg->mmio+(adr))
@@ -224,9 +222,10 @@ static void bt8xxgpio_remove(struct pci_dev *pdev)
pci_disable_device(pdev);
}
-#ifdef CONFIG_PM
-static int bt8xxgpio_suspend(struct pci_dev *pdev, pm_message_t state)
+
+static int bt8xxgpio_suspend(struct device *dev)
{
+ struct pci_dev *pdev = to_pci_dev(dev);
struct bt8xxgpio *bg = pci_get_drvdata(pdev);
scoped_guard(spinlock_irqsave, &bg->lock) {
@@ -238,23 +237,13 @@ static int bt8xxgpio_suspend(struct pci_dev *pdev, pm_message_t state)
bgwrite(0x0, BT848_GPIO_OUT_EN);
}
- pci_save_state(pdev);
- pci_disable_device(pdev);
- pci_set_power_state(pdev, pci_choose_state(pdev, state));
-
return 0;
}
-static int bt8xxgpio_resume(struct pci_dev *pdev)
+static int bt8xxgpio_resume(struct device *dev)
{
+ struct pci_dev *pdev = to_pci_dev(dev);
struct bt8xxgpio *bg = pci_get_drvdata(pdev);
- int err;
-
- pci_set_power_state(pdev, PCI_D0);
- err = pci_enable_device(pdev);
- if (err)
- return err;
- pci_restore_state(pdev);
guard(spinlock_irqsave)(&bg->lock);
@@ -267,10 +256,8 @@ static int bt8xxgpio_resume(struct pci_dev *pdev)
return 0;
}
-#else
-#define bt8xxgpio_suspend NULL
-#define bt8xxgpio_resume NULL
-#endif /* CONFIG_PM */
+
+static DEFINE_SIMPLE_DEV_PM_OPS(bt8xxgpio_pm_ops, bt8xxgpio_suspend, bt8xxgpio_resume);
static const struct pci_device_id bt8xxgpio_pci_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848) },
@@ -286,8 +273,7 @@ static struct pci_driver bt8xxgpio_pci_driver = {
.id_table = bt8xxgpio_pci_tbl,
.probe = bt8xxgpio_probe,
.remove = bt8xxgpio_remove,
- .suspend = bt8xxgpio_suspend,
- .resume = bt8xxgpio_resume,
+ .driver.pm = &bt8xxgpio_pm_ops,
};
module_pci_driver(bt8xxgpio_pci_driver);
--
2.51.0
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
On Thu, 16 Oct 2025 16:36:13 +0000, Vaibhav Gupta wrote:
> Switch to the generic PCI power management framework and remove legacy
> callbacks like .suspend() and .resume(). With the generic framework, the
> standard PCI related work like:
> - pci_save/restore_state()
> - pci_enable/disable_device()
> - pci_set_power_state()
> is handled by the PCI core and this driver should implement only gpio-bt8xx
> specific operations in its respective callback functions.
>
> [...]
Applied, thanks!
[1/1] gpio: bt8xx: use generic power management
https://git.kernel.org/brgl/linux/c/d5376026f9269601e239545e2ec4aea0cc62bf2a
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
On Thu, Oct 16, 2025 at 6:36 PM Vaibhav Gupta <vaibhavgupta40@gmail.com> wrote: > > Switch to the generic PCI power management framework and remove legacy > callbacks like .suspend() and .resume(). With the generic framework, the > standard PCI related work like: > - pci_save/restore_state() > - pci_enable/disable_device() > - pci_set_power_state() > is handled by the PCI core and this driver should implement only gpio-bt8xx > specific operations in its respective callback functions. > > Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com> > --- This says it's a v6 but I have no idea what changed since v1. Please provide a changelog for every version when submitting patches. Bjorn: does this look good to you? Bartosz
On Tue, Oct 21, 2025 at 10:48:48AM +0200, Bartosz Golaszewski wrote:
> On Thu, Oct 16, 2025 at 6:36 PM Vaibhav Gupta <vaibhavgupta40@gmail.com> wrote:
> >
> > Switch to the generic PCI power management framework and remove legacy
> > callbacks like .suspend() and .resume(). With the generic framework, the
> > standard PCI related work like:
> > - pci_save/restore_state()
> > - pci_enable/disable_device()
> > - pci_set_power_state()
> > is handled by the PCI core and this driver should implement only gpio-bt8xx
> > specific operations in its respective callback functions.
> >
> > Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
> > ---
>
> This says it's a v6 but I have no idea what changed since v1. Please
> provide a changelog for every version when submitting patches.
>
> Bjorn: does this look good to you?
Yes, it looks good to me.
Reviewed-by: Bjorn Helgaas <bhelgaas@google.com>
FWIW, here's the diff from v1 to v6. Mostly just iterating on
compile warning nits:
diff --git a/drivers/gpio/gpio-bt8xx.c b/drivers/gpio/gpio-bt8xx.c
index e8d0c67bb618..324eeb77dbd5 100644
--- a/drivers/gpio/gpio-bt8xx.c
+++ b/drivers/gpio/gpio-bt8xx.c
@@ -52,10 +52,8 @@ struct bt8xxgpio {
struct pci_dev *pdev;
struct gpio_chip gpio;
-#ifdef CONFIG_PM
u32 saved_outen;
u32 saved_data;
-#endif
};
#define bgwrite(dat, adr) writel((dat), bg->mmio+(adr))
@@ -224,7 +222,8 @@ static void bt8xxgpio_remove(struct pci_dev *pdev)
pci_disable_device(pdev);
}
-static int __maybe_unused bt8xxgpio_suspend(struct device *dev)
+
+static int bt8xxgpio_suspend(struct device *dev)
{
struct pci_dev *pdev = to_pci_dev(dev);
struct bt8xxgpio *bg = pci_get_drvdata(pdev);
@@ -241,7 +240,7 @@ static int __maybe_unused bt8xxgpio_suspend(struct device *dev)
return 0;
}
-static int __maybe_unused bt8xxgpio_resume(struct device *dev)
+static int bt8xxgpio_resume(struct device *dev)
{
struct pci_dev *pdev = to_pci_dev(dev);
struct bt8xxgpio *bg = pci_get_drvdata(pdev);
@@ -258,7 +257,7 @@ static int __maybe_unused bt8xxgpio_resume(struct device *dev)
return 0;
}
-static SIMPLE_DEV_PM_OPS(bt8xxgpio_pm_ops, bt8xxgpio_suspend, bt8xxgpio_resume);
+static DEFINE_SIMPLE_DEV_PM_OPS(bt8xxgpio_pm_ops, bt8xxgpio_suspend, bt8xxgpio_resume);
static const struct pci_device_id bt8xxgpio_pci_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848) },
> >
> > This says it's a v6 but I have no idea what changed since v1. Please
> > provide a changelog for every version when submitting patches.
> >
> > Bjorn: does this look good to you?
>
> Yes, it looks good to me.
>
> Reviewed-by: Bjorn Helgaas <bhelgaas@google.com>
>
> FWIW, here's the diff from v1 to v6. Mostly just iterating on
> compile warning nits:
>
> diff --git a/drivers/gpio/gpio-bt8xx.c b/drivers/gpio/gpio-bt8xx.c
> index e8d0c67bb618..324eeb77dbd5 100644
> --- a/drivers/gpio/gpio-bt8xx.c
> +++ b/drivers/gpio/gpio-bt8xx.c
> @@ -52,10 +52,8 @@ struct bt8xxgpio {
> struct pci_dev *pdev;
> struct gpio_chip gpio;
>
> -#ifdef CONFIG_PM
> u32 saved_outen;
> u32 saved_data;
> -#endif
> };
>
> #define bgwrite(dat, adr) writel((dat), bg->mmio+(adr))
> @@ -224,7 +222,8 @@ static void bt8xxgpio_remove(struct pci_dev *pdev)
> pci_disable_device(pdev);
> }
>
> -static int __maybe_unused bt8xxgpio_suspend(struct device *dev)
> +
> +static int bt8xxgpio_suspend(struct device *dev)
> {
> struct pci_dev *pdev = to_pci_dev(dev);
> struct bt8xxgpio *bg = pci_get_drvdata(pdev);
> @@ -241,7 +240,7 @@ static int __maybe_unused bt8xxgpio_suspend(struct device *dev)
> return 0;
> }
>
> -static int __maybe_unused bt8xxgpio_resume(struct device *dev)
> +static int bt8xxgpio_resume(struct device *dev)
> {
> struct pci_dev *pdev = to_pci_dev(dev);
> struct bt8xxgpio *bg = pci_get_drvdata(pdev);
> @@ -258,7 +257,7 @@ static int __maybe_unused bt8xxgpio_resume(struct device *dev)
> return 0;
> }
>
> -static SIMPLE_DEV_PM_OPS(bt8xxgpio_pm_ops, bt8xxgpio_suspend, bt8xxgpio_resume);
> +static DEFINE_SIMPLE_DEV_PM_OPS(bt8xxgpio_pm_ops, bt8xxgpio_suspend, bt8xxgpio_resume);
>
> static const struct pci_device_id bt8xxgpio_pci_tbl[] = {
> { PCI_DEVICE(PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848) },
Hello Bjorn!
Thanks for the review and mentioning the diff between v1 and v6.
Hey Randy!
Please let me know if the diff mentioned by Bjorn is enough or should I send a
new patch-mail describing the v1-v6 diff?
Best regards,
Vaibhav
On Thu, Oct 23, 2025 at 9:49 AM Vaibhav Gupta <vaibhavgupta40@gmail.com> wrote: > > Hello Bjorn! > Thanks for the review and mentioning the diff between v1 and v6. > > Hey Randy! > Please let me know if the diff mentioned by Bjorn is enough or should I send a > new patch-mail describing the v1-v6 diff? > Yes, it's enough, I could have looked it up myself but I shouldn't have to. Please, next time just list changes under each new iteration. Preferably just use b4, it helps with version management. Bart
On Thu, Oct 23, 2025 at 09:55:39AM +0200, Bartosz Golaszewski wrote: > On Thu, Oct 23, 2025 at 9:49 AM Vaibhav Gupta <vaibhavgupta40@gmail.com> wrote: > > > > Hello Bjorn! > > Thanks for the review and mentioning the diff between v1 and v6. > > > > Hey Randy! > > Please let me know if the diff mentioned by Bjorn is enough or should I send a > > new patch-mail describing the v1-v6 diff? > > > > Yes, it's enough, I could have looked it up myself but I shouldn't > have to. Please, next time just list changes under each new iteration. > Preferably just use b4, it helps with version management. > > Bart Noted. My patches will be more clear from next time. Thanks for the reviews and comments. - Vaibhav
© 2016 - 2026 Red Hat, Inc.