diff mbox

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

Message ID 4CDA74D6.1040107@free-electrons.com (mailing list archive)
State Awaiting Upstream
Headers show

Commit Message

Gregory CLEMENT Nov. 10, 2010, 10:32 a.m. UTC
None
diff mbox

Patch

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 709c836..1094aef 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -106,6 +106,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 +119,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 +129,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 +141,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 b4d7710..e98c630 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -307,6 +307,11 @@  struct spi_master {
   	/* called on release() to free memory provided by spi_master */
  	void			(*cleanup)(struct spi_device *spi);
+
+	/* called on suspend() and resume() if spi_master has to do
+	 * some actions */
+	void (*suspend)(struct spi_device *spi);
+	void (*resume)(struct spi_device *spi);
  };
   static inline void *spi_master_get_devdata(struct spi_master *master)
-- 
1.7.0.4