public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ricoh_mmc: Use suspend/resume_noirq
@ 2008-11-27  1:43 Philip Langdale
  2008-11-28 22:18 ` Frans Pop
  2008-11-30 22:49 ` Pierre Ossman
  0 siblings, 2 replies; 3+ messages in thread
From: Philip Langdale @ 2008-11-27  1:43 UTC (permalink / raw)
  To: linux kernel, sdhci-devel, Pierre Ossman; +Cc: Matthew Garrett, Frans Pop

If ricoh_mmc suspends before sdhci_pci, it will pull the card
out from under the controller, which could leave the system in
a very confused state.

Using suspend/resume_noirq ensures that sdhci_pci suspends first
and resumes second.

Signed-off-by: Philip Langdale <philipl@overt.org>
---

  ricoh_mmc.c |   20 ++++++++++++++++----
  1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/drivers/mmc/host/ricoh_mmc.c b/drivers/mmc/host/ricoh_mmc.c
index be9e7b3..34064d2 100644
--- a/drivers/mmc/host/ricoh_mmc.c
+++ b/drivers/mmc/host/ricoh_mmc.c
@@ -196,10 +196,14 @@ static void __devexit ricoh_mmc_remove(struct pci_dev *pdev)
  	pci_set_drvdata(pdev, NULL);
  }

-static int ricoh_mmc_suspend(struct pci_dev *pdev, pm_message_t state)
+static int ricoh_mmc_suspend_noirq(struct device *dev)
  {
+	struct pci_dev *pdev = NULL;
  	struct pci_dev *fw_dev = NULL;

+	pdev = to_pci_dev(dev);
+	BUG_ON(pdev == NULL);
+
  	fw_dev = pci_get_drvdata(pdev);
  	BUG_ON(fw_dev == NULL);

@@ -210,10 +214,14 @@ static int ricoh_mmc_suspend(struct pci_dev *pdev, pm_message_t state)
  	return 0;
  }

-static int ricoh_mmc_resume(struct pci_dev *pdev)
+static int ricoh_mmc_resume_noirq(struct device *dev)
  {
+	struct pci_dev *pdev = NULL;
  	struct pci_dev *fw_dev = NULL;

+	pdev = to_pci_dev(dev);
+	BUG_ON(pdev == NULL);
+
  	fw_dev = pci_get_drvdata(pdev);
  	BUG_ON(fw_dev == NULL);

@@ -224,13 +232,17 @@ static int ricoh_mmc_resume(struct pci_dev *pdev)
  	return 0;
  }

+static struct pm_ext_ops ricoh_mmc_pm_ext_opts = {
+	.suspend_noirq =	ricoh_mmc_suspend_noirq,
+	.resume_noirq =		ricoh_mmc_resume_noirq,
+};
+
  static struct pci_driver ricoh_mmc_driver = {
  	.name = 	DRIVER_NAME,
  	.id_table =	pci_ids,
  	.probe = 	ricoh_mmc_probe,
  	.remove =	__devexit_p(ricoh_mmc_remove),
-	.suspend =	ricoh_mmc_suspend,
-	.resume =	ricoh_mmc_resume,
+	.pm =		&ricoh_mmc_pm_ext_opts,
  };

  /*****************************************************************************\

I based this change on top of my previous fix for the new chip but it will apply
successfully to the original tree. There's still merit in considering the quirk
idea but this is the simplest fix and it works (for my machine, at least :-)

--phil

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-11-30 22:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-27  1:43 [PATCH] ricoh_mmc: Use suspend/resume_noirq Philip Langdale
2008-11-28 22:18 ` Frans Pop
2008-11-30 22:49 ` Pierre Ossman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox