diff mbox

[1/2] spi: Add hook on suspend/resume for spi master

Message ID AANLkTik8F_Cy3q=E+oDCym=eGTuajbavPqtoLMfxoJWi@mail.gmail.com (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Gregory CLEMENT Aug. 11, 2010, 2:43 p.m. UTC
None
diff mbox

Patch

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 1bb1b88..fe8140e 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -17,7 +17,6 @@ 
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-
 #include <linux/kernel.h>
 #include <linux/device.h>
 #include <linux/init.h>
@@ -106,6 +105,11 @@  static int spi_suspend(struct device *dev,
pm_message_t message)
 {
 	int			value = 0;
 	struct spi_driver	*drv = to_spi_driver(dev->driver);
+	struct spi_device *spi_dev = to_spi_device(dev);
+	struct spi_master *master = NULL;
+
+	if (spi_dev)
+		master = spi_dev->master;

 	/* suspend will stop irqs and dma; no more i/o */
 	if (drv) {
@@ -114,6 +118,9 @@  static int spi_suspend(struct device *dev,
pm_message_t message)
 		else
 			dev_dbg(dev, "... can't suspend\n");
 	}
+	if (master && master->suspend )
+		master->suspend(spi_dev);
+
 	return value;
 }

@@ -121,7 +128,11 @@  static int spi_resume(struct device *dev)
 {
 	int			value = 0;
 	struct spi_driver	*drv = to_spi_driver(dev->driver);
+	struct spi_device *spi_dev = to_spi_device(dev);
+	struct spi_master *master = NULL;

+	if (spi_dev)
+		master = spi_dev->master;
 	/* resume may restart the i/o queue */
 	if (drv) {
 		if (drv->resume)
@@ -129,6 +140,8 @@  static int spi_resume(struct device *dev)
 		else
 			dev_dbg(dev, "... can't resume\n");
 	}
+	if (master && master->resume )
+		master->resume(spi_dev);
 	return value;
 }

diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index af56071..2483a1d 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -293,7 +293,9 @@  struct spi_master {
 						struct spi_message *mesg);

 	/* called on release() to free memory provided by spi_master */
-	void			(*cleanup)(struct spi_device *spi);
+        void			(*cleanup)(struct spi_device *spi);
+     void (*suspend)(struct spi_device *spi);
+     void (*resume)(struct spi_device *spi);
 };

 static inline void *spi_master_get_devdata(struct spi_master *master)