Re: commit "radeonfb: Fix resume from D3Cold on some platforms"breaks resume from RAM on PowerBook

From: Gaudenz Steinlin
Date: Tue Mar 10 2009 - 11:01:43 EST


Hi Rafael

On Tue, Mar 10, 2009 at 10:32:58AM +0100, Rafael J. Wysocki wrote:
>
> Gaudenz, I'd also like to know if the appended patch (on top of vanilla Linus'
> tree) makes any different. Unfortunately, I haven't had the time to test it
> myself yet.

No, this patch does not make any difference.

Gaudenz

>
> Thanks,
> Rafael
>
> ---
> drivers/pci/pci-driver.c | 42 ++++++++++++++++++++++++++++++------------
> 1 file changed, 30 insertions(+), 12 deletions(-)
>
> Index: linux-2.6/drivers/pci/pci-driver.c
> ===================================================================
> --- linux-2.6.orig/drivers/pci/pci-driver.c
> +++ linux-2.6/drivers/pci/pci-driver.c
> @@ -556,7 +556,7 @@ static int pci_pm_suspend_noirq(struct d
> static int pci_pm_resume_noirq(struct device *dev)
> {
> struct pci_dev *pci_dev = to_pci_dev(dev);
> - struct device_driver *drv = dev->driver;
> + struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
> int error = 0;
>
> pci_pm_default_resume_noirq(pci_dev);
> @@ -564,8 +564,13 @@ static int pci_pm_resume_noirq(struct de
> if (pci_has_legacy_pm_support(pci_dev))
> return pci_legacy_resume_early(dev);
>
> - if (drv && drv->pm && drv->pm->resume_noirq)
> - error = drv->pm->resume_noirq(dev);
> + if (pm) {
> + if (pm->resume_noirq)
> + error = pm->resume_noirq(dev);
> + } else {
> + if (pci_is_bridge(pci_dev))
> + pci_pm_reenable_device(pci_dev);
> + }
>
> return error;
> }
> @@ -592,7 +597,8 @@ static int pci_pm_resume(struct device *
> if (pm->resume)
> error = pm->resume(dev);
> } else {
> - pci_pm_reenable_device(pci_dev);
> + if (!pci_is_bridge(pci_dev))
> + pci_pm_reenable_device(pci_dev);
> }
>
> return 0;
> @@ -662,7 +668,7 @@ static int pci_pm_freeze_noirq(struct de
> static int pci_pm_thaw_noirq(struct device *dev)
> {
> struct pci_dev *pci_dev = to_pci_dev(dev);
> - struct device_driver *drv = dev->driver;
> + struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
> int error = 0;
>
> if (pci_has_legacy_pm_support(pci_dev))
> @@ -670,8 +676,13 @@ static int pci_pm_thaw_noirq(struct devi
>
> pci_update_current_state(pci_dev, PCI_D0);
>
> - if (drv && drv->pm && drv->pm->thaw_noirq)
> - error = drv->pm->thaw_noirq(dev);
> + if (pm) {
> + if (pm->thaw_noirq)
> + error = pm->thaw_noirq(dev);
> + } else {
> + if (pci_is_bridge(pci_dev))
> + pci_pm_reenable_device(pci_dev);
> + }
>
> return error;
> }
> @@ -689,7 +700,8 @@ static int pci_pm_thaw(struct device *de
> if (pm->thaw)
> error = pm->thaw(dev);
> } else {
> - pci_pm_reenable_device(pci_dev);
> + if (!pci_is_bridge(pci_dev))
> + pci_pm_reenable_device(pci_dev);
> }
>
> return error;
> @@ -744,7 +756,7 @@ static int pci_pm_poweroff_noirq(struct
> static int pci_pm_restore_noirq(struct device *dev)
> {
> struct pci_dev *pci_dev = to_pci_dev(dev);
> - struct device_driver *drv = dev->driver;
> + struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
> int error = 0;
>
> pci_pm_default_resume_noirq(pci_dev);
> @@ -752,8 +764,13 @@ static int pci_pm_restore_noirq(struct d
> if (pci_has_legacy_pm_support(pci_dev))
> return pci_legacy_resume_early(dev);
>
> - if (drv && drv->pm && drv->pm->restore_noirq)
> - error = drv->pm->restore_noirq(dev);
> + if (pm) {
> + if (pm->restore_noirq)
> + error = pm->restore_noirq(dev);
> + } else {
> + if (pci_is_bridge(pci_dev))
> + pci_pm_reenable_device(pci_dev);
> + }
>
> return error;
> }
> @@ -780,7 +797,8 @@ static int pci_pm_restore(struct device
> if (pm->restore)
> error = pm->restore(dev);
> } else {
> - pci_pm_reenable_device(pci_dev);
> + if (!pci_is_bridge(pci_dev))
> + pci_pm_reenable_device(pci_dev);
> }
>
> return error;

--
Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better.
~ Samuel Beckett ~
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/