void s5p_i2s_do_resume(struct snd_soc_dai *dai) { struct s3c_i2sv2_info *i2s = to_info(dai); if (!audio_pwr_stat) { s5p_i2s_set_pwr_enabled(dai, 1); s5p_i2s_set_clk_enabled(dai, 1); } else { s5p_i2s_set_clk_enabled(dai, 1); } if (audio_pwr_stat && audio_clk_stat) { if (audio_reg_saved) { writel(i2s->suspend_iismod, i2s->regs + S3C2412_IISMOD); writel(i2s->suspend_iiscon, i2s->regs + S3C2412_IISCON); writel(i2s->suspend_iispsr, i2s->regs + S3C2412_IISPSR); #ifdef CONFIG_SND_S5P_RP if (s5p_rp_is_running) { if (!(i2s->suspend_iisahb & (S5P_IISAHB_DMARLD | S5P_IISAHB_DMAEN))) { pr_debug("iis: Warning!! Keep auto-reload & DMA En 0x%x\n", i2s->suspend_iisahb); i2s->suspend_iisahb |= S5P_IISAHB_DMARLD | S5P_IISAHB_DMAEN; } } else { if ((i2s->suspend_iisahb & S5P_IISAHB_DMARLD)) { i2s->suspend_iisahb &= ~S5P_IISAHB_DMARLD; pr_debug("iis: Warning!! Disable auto-reload 0x%x\n", i2s->suspend_iisahb); } } #else if ((i2s->suspend_iisahb & S5P_IISAHB_DMARLD)) { i2s->suspend_iisahb &= ~S5P_IISAHB_DMARLD; pr_debug("iis: Warning!! Disable auto-reload 0x%x\n", i2s->suspend_iisahb); } #endif writel(i2s->suspend_iisahb, i2s->regs + S5P_IISAHB); /* Is this dai for I2Sv5? (I2S0) */ if (dai->id == 0) { writel(i2s->suspend_audss_clksrc, S5P_CLKSRC_AUDSS); writel(i2s->suspend_audss_clkdiv, S5P_CLKDIV_AUDSS); writel(i2s->suspend_audss_clkgate, S5P_CLKGATE_AUDSS); } pr_debug("iis: Resume and registers restored.\n"); audio_reg_saved = false; } } }
void s5p_i2s_do_resume(struct snd_soc_dai *dai) { struct s3c_i2sv2_info *i2s = to_info(dai); unsigned long flags; spin_lock_irqsave(&i2s_clk_lock, flags); if (audio_clk_gated) { /* Clk/Pwr is gated? */ s5p_i2s_set_clk_enabled(dai, 1); /* Enable Clk/Pwr */ writel(i2s->suspend_iiscon, i2s->regs + S3C2412_IISCON); writel(i2s->suspend_iismod, i2s->regs + S3C2412_IISMOD); writel(i2s->suspend_iispsr, i2s->regs + S3C2412_IISPSR); writel(i2s->suspend_iisahb, i2s->regs + S5P_IISAHB); /* Is this dai for I2Sv5? (I2S0) */ if (dai->id == 0) { writel(i2s->suspend_audss_clkdiv, S5P_CLKDIV_AUDSS); writel(i2s->suspend_audss_clksrc, S5P_CLKSRC_AUDSS); writel(i2s->suspend_audss_clkgate, S5P_CLKGATE_AUDSS); } /* Flush FIFO */ writel(S3C2412_IISFIC_RXFLUSH | S3C2412_IISFIC_TXFLUSH, i2s->regs + S3C2412_IISFIC); writel(S3C2412_IISFIC_TXFLUSH, i2s->regs + S5P_IISFICS); ndelay(250); writel(0x0, i2s->regs + S3C2412_IISFIC); writel(0x0, i2s->regs + S5P_IISFICS); pr_debug("Resume and registers restored.\n"); } spin_unlock_irqrestore(&i2s_clk_lock, flags); }
void s5p_i2s_do_suspend(struct snd_soc_dai *dai) { struct s3c_i2sv2_info *i2s = to_info(dai); unsigned long flags; spin_lock_irqsave(&i2s_clk_lock, flags); if (!audio_clk_gated) { /* Clk/Pwr is alive? */ i2s->suspend_iiscon = readl(i2s->regs + S3C2412_IISCON); i2s->suspend_iismod = readl(i2s->regs + S3C2412_IISMOD); i2s->suspend_iispsr = readl(i2s->regs + S3C2412_IISPSR); i2s->suspend_iisahb = readl(i2s->regs + S5P_IISAHB); /* Is this dai for I2Sv5? (I2S0) */ if (dai->id == 0) { i2s->suspend_audss_clkdiv = readl(S5P_CLKDIV_AUDSS); i2s->suspend_audss_clksrc = readl(S5P_CLKSRC_AUDSS); i2s->suspend_audss_clkgate = readl(S5P_CLKGATE_AUDSS); /* CLKMUX_ASS & MUX_I2S as XUSBXTI to reduce power */ writel(0x0, S5P_CLKSRC_AUDSS); } s5p_i2s_set_clk_enabled(dai, 0); /* Gating Clk/Pwr */ pr_debug("Registers stored and suspend.\n"); } spin_unlock_irqrestore(&i2s_clk_lock, flags); }
void s5p_i2s_do_suspend(struct snd_soc_dai *dai) { struct s3c_i2sv2_info *i2s = to_info(dai); #ifdef CONFIG_SND_S5P_RP if (s5p_rp_is_running) return; #endif if ((!audio_pwr_stat) && (!audio_clk_stat)) return; if (!audio_reg_saved) { i2s->suspend_iismod = readl(i2s->regs + S3C2412_IISMOD); i2s->suspend_iiscon = readl(i2s->regs + S3C2412_IISCON); i2s->suspend_iispsr = readl(i2s->regs + S3C2412_IISPSR); i2s->suspend_iisahb = readl(i2s->regs + S5P_IISAHB); /* Is this dai for I2Sv5? (I2S0) */ if (dai->id == 0) { i2s->suspend_audss_clksrc = readl(S5P_CLKSRC_AUDSS); i2s->suspend_audss_clkdiv = readl(S5P_CLKDIV_AUDSS); i2s->suspend_audss_clkgate = readl(S5P_CLKGATE_AUDSS); } audio_reg_saved = true; pr_debug("iis: Registers stored and suspend.\n"); } #ifdef CONFIG_SND_S5P_RP if (!s5p_rp_is_running) #endif s5p_i2s_set_clk_enabled(dai, 0); #ifdef CONFIG_SND_S5P_RP if (!s5p_rp_is_opened) #endif s5p_i2s_set_pwr_enabled(dai, 0); }