Merge "platform-drivers: msm: sps: Support IRQ wakeup in SPS driver" into msm-3.0
diff --git a/arch/arm/mach-msm/include/mach/sps.h b/arch/arm/mach-msm/include/mach/sps.h
index f6cba0d..1514497 100644
--- a/arch/arm/mach-msm/include/mach/sps.h
+++ b/arch/arm/mach-msm/include/mach/sps.h
@@ -65,6 +65,8 @@
 #define SPS_BAM_OPT_IRQ_DISABLED    (1UL << 1)
 /* BAM peripheral is a BAM-DMA */
 #define SPS_BAM_OPT_BAMDMA          (1UL << 2)
+/* BAM IRQ is registered for apps wakeup */
+#define SPS_BAM_OPT_IRQ_WAKEUP      (1UL << 3)
 
 /* BAM device management flags */
 
diff --git a/drivers/platform/msm/sps/sps_bam.c b/drivers/platform/msm/sps/sps_bam.c
index ac6dc4f..edd789e 100644
--- a/drivers/platform/msm/sps/sps_bam.c
+++ b/drivers/platform/msm/sps/sps_bam.c
@@ -217,6 +217,18 @@
 		/* Enable the BAM interrupt */
 		irq_mask = BAM_IRQ_ALL;
 		dev->state |= BAM_STATE_IRQ;
+
+		/* Register BAM IRQ for apps wakeup */
+		if (dev->props.options & SPS_BAM_OPT_IRQ_WAKEUP) {
+			result = enable_irq_wake(dev->props.irq);
+
+			if (result) {
+				SPS_ERR("Failed to enable wakeup irq "
+					"BAM 0x%x IRQ %d",
+					BAM_ID(dev), dev->props.irq);
+				return SPS_ERROR;
+			}
+		}
 	}
 
 	/* Is global BAM control managed by the local processor? */