On 11/9/2011 4:09 PM, Linus WALLEIJ wrote: > From: Chris Blair <chris.bl...@stericsson.com> > > Adds support for configuring the spi bus to use autosuspend for > runtime power management. This can reduce the latency in starting an > spi transfer by not suspending the device immediately following > completion of a transfer. If another transfer then takes place before > the autosuspend timeout, the call to resume the device can return > immediately rather than needing to risk sleeping in order to resume > the device. > > Signed-off-by: Chris Blair <chris.bl...@stericsson.com> > Signed-off-by: Linus Walleij <linus.wall...@linaro.org> > --- > drivers/spi/spi-pl022.c | 20 ++++++++++++++++++-- > include/linux/amba/pl022.h | 4 ++++ > 2 files changed, 22 insertions(+), 2 deletions(-) > > diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c > index 2e3522d..d3d6521 100644 > --- a/drivers/spi/spi-pl022.c > +++ b/drivers/spi/spi-pl022.c > @@ -1515,7 +1515,13 @@ static void pump_messages(struct work_struct *work) > /* nothing more to do - disable spi/ssp and power off */ > writew((readw(SSP_CR1(pl022->virtbase)) & > (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase)); > - pm_runtime_put(&pl022->adev->dev); > + > + if (pl022->master_info->autosuspend_delay > 0) { > + pm_runtime_mark_last_busy(&pl022->adev->dev); > + pm_runtime_put_autosuspend(&pl022->adev->dev); > + } else { > + pm_runtime_put(&pl022->adev->dev); > + } > } > pl022->busy = false; > spin_unlock_irqrestore(&pl022->queue_lock, flags); > @@ -2245,7 +2251,17 @@ pl022_probe(struct amba_device *adev, const struct > amba_id *id) > dev_dbg(dev, "probe succeeded\n"); > > /* let runtime pm put suspend */ > - pm_runtime_put(dev); > + if (platform_info->autosuspend_delay > 0) { > + dev_info(&adev->dev, > + "will use autosuspend for runtime pm, delay %dms\n", > + platform_info->autosuspend_delay); > + pm_runtime_set_autosuspend_delay(dev, > + platform_info->autosuspend_delay); > + pm_runtime_use_autosuspend(dev); > + pm_runtime_put_autosuspend(dev); > + } else { > + pm_runtime_put(dev); > + } > return 0; > > err_spi_register: > diff --git a/include/linux/amba/pl022.h b/include/linux/amba/pl022.h > index 4ce98f5..572f637 100644 > --- a/include/linux/amba/pl022.h > +++ b/include/linux/amba/pl022.h > @@ -238,6 +238,9 @@ struct dma_chan; > * @enable_dma: if true enables DMA driven transfers. > * @dma_rx_param: parameter to locate an RX DMA channel. > * @dma_tx_param: parameter to locate a TX DMA channel. > + * @autosuspend_delay: delay in ms following transfer completion before the > + * runtime power management system suspends the device. A setting of 0 > + * indicates no delay and the device will be suspended immediately. > */ > struct pl022_ssp_controller { > u16 bus_id; > @@ -246,6 +249,7 @@ struct pl022_ssp_controller { > bool (*dma_filter)(struct dma_chan *chan, void *filter_param); > void *dma_rx_param; > void *dma_tx_param; > + int autosuspend_delay; > }; > > /**
Reviewed-by: Viresh Kumar <viresh.ku...@st.com> -- viresh ------------------------------------------------------------------------------ RSA(R) Conference 2012 Save $700 by Nov 18 Register now http://p.sf.net/sfu/rsa-sfdev2dev1 _______________________________________________ spi-devel-general mailing list spi-devel-general@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/spi-devel-general