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;
		}
	}
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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);
}