@@ -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;
}
@@ -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)