@@ -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
@@ -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