|
@@ -350,20 +350,6 @@ disable_fifo:
|
|
|
mcspi->fifo_depth = 0;
|
|
|
}
|
|
|
|
|
|
-static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
|
|
|
-{
|
|
|
- struct spi_master *spi_cntrl = mcspi->master;
|
|
|
- struct omap2_mcspi_regs *ctx = &mcspi->ctx;
|
|
|
- struct omap2_mcspi_cs *cs;
|
|
|
-
|
|
|
- /* McSPI: context restore */
|
|
|
- mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL, ctx->modulctrl);
|
|
|
- mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE, ctx->wakeupenable);
|
|
|
-
|
|
|
- list_for_each_entry(cs, &ctx->cs, node)
|
|
|
- writel_relaxed(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
|
|
|
-}
|
|
|
-
|
|
|
static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit)
|
|
|
{
|
|
|
unsigned long timeout;
|
|
@@ -1297,14 +1283,39 @@ static int omap2_mcspi_master_setup(struct omap2_mcspi *mcspi)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * When SPI wake up from off-mode, CS is in activate state. If it was in
|
|
|
+ * inactive state when driver was suspend, then force it to inactive state at
|
|
|
+ * wake up.
|
|
|
+ */
|
|
|
static int omap_mcspi_runtime_resume(struct device *dev)
|
|
|
{
|
|
|
- struct omap2_mcspi *mcspi;
|
|
|
- struct spi_master *master;
|
|
|
+ struct spi_master *master = dev_get_drvdata(dev);
|
|
|
+ struct omap2_mcspi *mcspi = spi_master_get_devdata(master);
|
|
|
+ struct omap2_mcspi_regs *ctx = &mcspi->ctx;
|
|
|
+ struct omap2_mcspi_cs *cs;
|
|
|
|
|
|
- master = dev_get_drvdata(dev);
|
|
|
- mcspi = spi_master_get_devdata(master);
|
|
|
- omap2_mcspi_restore_ctx(mcspi);
|
|
|
+ /* McSPI: context restore */
|
|
|
+ mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, ctx->modulctrl);
|
|
|
+ mcspi_write_reg(master, OMAP2_MCSPI_WAKEUPENABLE, ctx->wakeupenable);
|
|
|
+
|
|
|
+ list_for_each_entry(cs, &ctx->cs, node) {
|
|
|
+ /*
|
|
|
+ * We need to toggle CS state for OMAP take this
|
|
|
+ * change in account.
|
|
|
+ */
|
|
|
+ if ((cs->chconf0 & OMAP2_MCSPI_CHCONF_FORCE) == 0) {
|
|
|
+ cs->chconf0 |= OMAP2_MCSPI_CHCONF_FORCE;
|
|
|
+ writel_relaxed(cs->chconf0,
|
|
|
+ cs->base + OMAP2_MCSPI_CHCONF0);
|
|
|
+ cs->chconf0 &= ~OMAP2_MCSPI_CHCONF_FORCE;
|
|
|
+ writel_relaxed(cs->chconf0,
|
|
|
+ cs->base + OMAP2_MCSPI_CHCONF0);
|
|
|
+ } else {
|
|
|
+ writel_relaxed(cs->chconf0,
|
|
|
+ cs->base + OMAP2_MCSPI_CHCONF0);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1447,34 +1458,8 @@ static int omap2_mcspi_remove(struct platform_device *pdev)
|
|
|
MODULE_ALIAS("platform:omap2_mcspi");
|
|
|
|
|
|
#ifdef CONFIG_SUSPEND
|
|
|
-/*
|
|
|
- * When SPI wake up from off-mode, CS is in activate state. If it was in
|
|
|
- * unactive state when driver was suspend, then force it to unactive state at
|
|
|
- * wake up.
|
|
|
- */
|
|
|
static int omap2_mcspi_resume(struct device *dev)
|
|
|
{
|
|
|
- struct spi_master *master = dev_get_drvdata(dev);
|
|
|
- struct omap2_mcspi *mcspi = spi_master_get_devdata(master);
|
|
|
- struct omap2_mcspi_regs *ctx = &mcspi->ctx;
|
|
|
- struct omap2_mcspi_cs *cs;
|
|
|
-
|
|
|
- pm_runtime_get_sync(mcspi->dev);
|
|
|
- list_for_each_entry(cs, &ctx->cs, node) {
|
|
|
- if ((cs->chconf0 & OMAP2_MCSPI_CHCONF_FORCE) == 0) {
|
|
|
- /*
|
|
|
- * We need to toggle CS state for OMAP take this
|
|
|
- * change in account.
|
|
|
- */
|
|
|
- cs->chconf0 |= OMAP2_MCSPI_CHCONF_FORCE;
|
|
|
- writel_relaxed(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
|
|
|
- cs->chconf0 &= ~OMAP2_MCSPI_CHCONF_FORCE;
|
|
|
- writel_relaxed(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
|
|
|
- }
|
|
|
- }
|
|
|
- pm_runtime_mark_last_busy(mcspi->dev);
|
|
|
- pm_runtime_put_autosuspend(mcspi->dev);
|
|
|
-
|
|
|
return pinctrl_pm_select_default_state(dev);
|
|
|
}
|
|
|
|