Message ID | 20200703081428.1011527-3-vaibhavgupta40@gmail.com |
---|---|
State | Superseded |
Delegated to: | David Miller |
Headers | show |
Series | drivers: ide: use generic power management | expand |
On Fri, Jul 03, 2020 at 01:44:26PM +0530, Vaibhav Gupta wrote: > While upgrading ide_pci_suspend() and ide_pci_resume(), all other source > files, using same callbacks, were also updated except > drivers/ide/triflex.c. This is because the driver does not want to power > off the device during suspend. A quirk was required for the same. > > This patch provides the fix. Another driver, > drivers/staging/media/atomisp/pci/atomisp_gmin_platform.c, makes use of > a quirk for similar goal. Hence a similar quirk has been applied for > triflex. > > Compile-tested only. > > Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com> > --- > drivers/ide/triflex.c | 45 +++++++++++-------------------------------- > 1 file changed, 11 insertions(+), 34 deletions(-) > > diff --git a/drivers/ide/triflex.c b/drivers/ide/triflex.c > index 1886bbfb9e5d..f707f11c296d 100644 > --- a/drivers/ide/triflex.c > +++ b/drivers/ide/triflex.c > @@ -100,48 +100,25 @@ static const struct pci_device_id triflex_pci_tbl[] = { > }; > MODULE_DEVICE_TABLE(pci, triflex_pci_tbl); > > -#ifdef CONFIG_PM > -static int triflex_ide_pci_suspend(struct pci_dev *dev, pm_message_t state) > -{ > - /* > - * We must not disable or powerdown the device. > - * APM bios refuses to suspend if IDE is not accessible. > - */ > - pci_save_state(dev); > - return 0; > -} > - > -static int triflex_ide_pci_resume(struct pci_dev *dev) > +/* > + * We must not disable or powerdown the device. > + * APM bios refuses to suspend if IDE is not accessible. > + */ > +static void triflex_pci_pm_cap_fixup(struct pci_dev *pdev) > { > - struct ide_host *host = pci_get_drvdata(dev); > - int rc; > - > - pci_set_power_state(dev, PCI_D0); > - > - rc = pci_enable_device(dev); > - if (rc) > - return rc; > - > - pci_restore_state(dev); > - pci_set_master(dev); > - > - if (host->init_chipset) > - host->init_chipset(dev); > - > - return 0; > + dev_info(&pdev->dev, "Disable triflex to be turned off by PCI CORE\n"); I would change this message to "Disabling PCI power management" to be more like existing messages: "PM disabled\n" "Disabling PCI power management to avoid bug\n" "Disabling PCI power management on camera ISP\n" > + pdev->pm_cap = 0; > } > -#else > -#define triflex_ide_pci_suspend NULL > -#define triflex_ide_pci_resume NULL > -#endif > +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_COMPAQ, > + PCI_DEVICE_ID_COMPAQ_TRIFLEX_IDE, > + triflex_pci_pm_cap_fixup); I don't think this needs to be a fixup. This could be done in the probe routine (triflex_init_one()). Doing it as a fixup means the PCI core will check every PCI device to see if it matches PCI_DEVICE_ID_COMPAQ_TRIFLEX_IDE, which is a little extra useless overhead and quirks are a little bit magic because it's not as obvious how they're called. But since triflex_init_one() is called only for the devices we care about, you can just do: static int triflex_init_one(struct pci_dev *dev, const struct pci_device_id *id) { dev->pm_cap = 0; dev_info(...); return ide_pci_init_one(dev, &triflex_device, NULL); } > static struct pci_driver triflex_pci_driver = { > .name = "TRIFLEX_IDE", > .id_table = triflex_pci_tbl, > .probe = triflex_init_one, > .remove = ide_pci_remove, > - .suspend = triflex_ide_pci_suspend, > - .resume = triflex_ide_pci_resume, > + .driver.pm = &ide_pci_pm_ops, > }; > > static int __init triflex_ide_init(void) > -- > 2.27.0 >
diff --git a/drivers/ide/triflex.c b/drivers/ide/triflex.c index 1886bbfb9e5d..f707f11c296d 100644 --- a/drivers/ide/triflex.c +++ b/drivers/ide/triflex.c @@ -100,48 +100,25 @@ static const struct pci_device_id triflex_pci_tbl[] = { }; MODULE_DEVICE_TABLE(pci, triflex_pci_tbl); -#ifdef CONFIG_PM -static int triflex_ide_pci_suspend(struct pci_dev *dev, pm_message_t state) -{ - /* - * We must not disable or powerdown the device. - * APM bios refuses to suspend if IDE is not accessible. - */ - pci_save_state(dev); - return 0; -} - -static int triflex_ide_pci_resume(struct pci_dev *dev) +/* + * We must not disable or powerdown the device. + * APM bios refuses to suspend if IDE is not accessible. + */ +static void triflex_pci_pm_cap_fixup(struct pci_dev *pdev) { - struct ide_host *host = pci_get_drvdata(dev); - int rc; - - pci_set_power_state(dev, PCI_D0); - - rc = pci_enable_device(dev); - if (rc) - return rc; - - pci_restore_state(dev); - pci_set_master(dev); - - if (host->init_chipset) - host->init_chipset(dev); - - return 0; + dev_info(&pdev->dev, "Disable triflex to be turned off by PCI CORE\n"); + pdev->pm_cap = 0; } -#else -#define triflex_ide_pci_suspend NULL -#define triflex_ide_pci_resume NULL -#endif +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_COMPAQ, + PCI_DEVICE_ID_COMPAQ_TRIFLEX_IDE, + triflex_pci_pm_cap_fixup); static struct pci_driver triflex_pci_driver = { .name = "TRIFLEX_IDE", .id_table = triflex_pci_tbl, .probe = triflex_init_one, .remove = ide_pci_remove, - .suspend = triflex_ide_pci_suspend, - .resume = triflex_ide_pci_resume, + .driver.pm = &ide_pci_pm_ops, }; static int __init triflex_ide_init(void)
While upgrading ide_pci_suspend() and ide_pci_resume(), all other source files, using same callbacks, were also updated except drivers/ide/triflex.c. This is because the driver does not want to power off the device during suspend. A quirk was required for the same. This patch provides the fix. Another driver, drivers/staging/media/atomisp/pci/atomisp_gmin_platform.c, makes use of a quirk for similar goal. Hence a similar quirk has been applied for triflex. Compile-tested only. Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com> --- drivers/ide/triflex.c | 45 +++++++++++-------------------------------- 1 file changed, 11 insertions(+), 34 deletions(-)