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 #include #include @@ -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)