From: Iliyan Malchev Date: Fri, 5 Nov 2010 20:41:17 +0000 (-0700) Subject: Merge branch 'linux-tegra-2.6.36' into android-tegra-2.6.36 X-Git-Tag: firefly_0821_release~9833^2~121 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=e143639c53cd1274f8f5f4f461b01d3c6e21ba20;p=firefly-linux-kernel-4.4.55.git Merge branch 'linux-tegra-2.6.36' into android-tegra-2.6.36 Conflicts: arch/arm/mach-tegra/tegra_i2s_audio.c arch/arm/mach-tegra/tegra_spdif_audio.c Signed-off-by: Iliyan Malchev --- e143639c53cd1274f8f5f4f461b01d3c6e21ba20 diff --cc arch/arm/mach-tegra/tegra_i2s_audio.c index 9ac5cba7cd8c,d62bf2342591..f8a67f1e2043 --- a/arch/arm/mach-tegra/tegra_i2s_audio.c +++ b/arch/arm/mach-tegra/tegra_i2s_audio.c @@@ -91,8 -92,7 +93,9 @@@ struct audio_stream struct tegra_dma_req dma_req; struct pm_qos_request_list pm_qos; + struct work_struct allow_suspend_work; + struct wake_lock wake_lock; + char wake_lock_name[100]; }; struct i2s_pio_stats { @@@ -221,17 -221,24 +224,26 @@@ static inline struct audio_driver_stat static inline void prevent_suspend(struct audio_stream *as) { pr_debug("%s\n", __func__); + cancel_work_sync(&as->allow_suspend_work); + wake_lock(&as->wake_lock); pm_qos_update_request(&as->pm_qos, 0); } - static inline void allow_suspend(struct audio_stream *as) + static void allow_suspend_worker(struct work_struct *w) { + struct audio_stream *as = container_of(w, + struct audio_stream, allow_suspend_work); + pr_debug("%s\n", __func__); pm_qos_update_request(&as->pm_qos, PM_QOS_DEFAULT_VALUE); + wake_unlock(&as->wake_lock); } + static inline void allow_suspend(struct audio_stream *as) + { + schedule_work(&as->allow_suspend_work); + } + #define I2S_I2S_FIFO_TX_BUSY I2S_I2S_STATUS_FIFO1_BSY #define I2S_I2S_FIFO_TX_QS I2S_I2S_STATUS_QS_FIFO1 #define I2S_I2S_FIFO_TX_ERR I2S_I2S_STATUS_FIFO1_ERR diff --cc arch/arm/mach-tegra/tegra_spdif_audio.c index bd99440a0188,1c22e4537876..fd96f2abf5eb --- a/arch/arm/mach-tegra/tegra_spdif_audio.c +++ b/arch/arm/mach-tegra/tegra_spdif_audio.c @@@ -44,9 -44,9 +44,10 @@@ #include #include #include +#include #include #include + #include #include #include @@@ -89,8 -89,7 +90,9 @@@ struct audio_stream struct tegra_dma_req dma_req; struct pm_qos_request_list pm_qos; + struct work_struct allow_suspend_work; + struct wake_lock wake_lock; + char wake_lock_name[100]; }; struct spdif_pio_stats { @@@ -165,17 -164,24 +167,26 @@@ static inline struct audio_driver_stat static inline void prevent_suspend(struct audio_stream *as) { pr_debug("%s\n", __func__); + cancel_work_sync(&as->allow_suspend_work); + wake_lock(&as->wake_lock); pm_qos_update_request(&as->pm_qos, 0); } - static inline void allow_suspend(struct audio_stream *as) + static void allow_suspend_worker(struct work_struct *w) { + struct audio_stream *as = container_of(w, + struct audio_stream, allow_suspend_work); + pr_debug("%s\n", __func__); pm_qos_update_request(&as->pm_qos, PM_QOS_DEFAULT_VALUE); + wake_unlock(&as->wake_lock); } + static inline void allow_suspend(struct audio_stream *as) + { + schedule_work(&as->allow_suspend_work); + } + #define I2S_I2S_FIFO_TX_BUSY I2S_I2S_STATUS_FIFO1_BSY #define I2S_I2S_FIFO_TX_QS I2S_I2S_STATUS_QS_FIFO1 #define I2S_I2S_FIFO_TX_ERR I2S_I2S_STATUS_FIFO1_ERR @@@ -1344,12 -1348,9 +1355,13 @@@ static int tegra_spdif_probe(struct pla if (rc < 0) return rc; + INIT_WORK(&state->out.allow_suspend_work, allow_suspend_worker); pm_qos_add_request(&state->out.pm_qos, PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE); + snprintf(state->out.wake_lock_name, sizeof(state->out.wake_lock_name), + "tegra-audio-spdif"); + wake_lock_init(&state->out.wake_lock, WAKE_LOCK_SUSPEND, + state->out.wake_lock_name); if (request_irq(state->irq, spdif_interrupt, IRQF_DISABLED, state->pdev->name, state) < 0) {