Example #1
0
static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
					 int clk_id, unsigned int freq,
					 int dir)
{
	struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
	struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs;
	int err = 0;

	switch (clk_id) {
	case OMAP_MCBSP_SYSCLK_CLK:
		regs->srgr2	|= CLKSM;
		break;
	case OMAP_MCBSP_SYSCLK_CLKS_FCLK:
	case OMAP_MCBSP_SYSCLK_CLKS_EXT:
		err = omap_mcbsp_dai_set_clks_src(mcbsp_data, clk_id);
		mcbsp_data->clk_id = clk_id;
		break;

	case OMAP_MCBSP_SYSCLK_CLKX_EXT:
		regs->srgr2	|= CLKSM;
	case OMAP_MCBSP_SYSCLK_CLKR_EXT:
		regs->pcr0	|= SCLKME;
		break;
	default:
		err = -ENODEV;
	}

	return err;
}
Example #2
0
int omap_mcbsp_dai_suspend(struct snd_soc_dai *cpu_dai)
{
	struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);

	if (cpu_dai->active) {
		omap_mcbsp_dai_set_clks_src(mcbsp_data, OMAP_MCBSP_SYSCLK_CLKS_FCLK);
		omap_mcbsp_disable_fclk(mcbsp_data->bus_id);
	}

	return 0;
}
Example #3
0
static int omap_mcbsp_dai_trigger(struct snd_pcm_substream *substream, int cmd,
				  struct snd_soc_dai *dai)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
	struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
	int err = 0, play = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);

	switch (cmd) {
	case SNDRV_PCM_TRIGGER_RESUME:
		omap_mcbsp_config(mcbsp_data->bus_id, &mcbsp_data->regs);
		/* fall through */
	case SNDRV_PCM_TRIGGER_START:
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
		if (cpu_dai->active)
			omap_mcbsp_dai_set_clks_src(mcbsp_data,
					mcbsp_data->clk_id);
		omap_mcbsp_start(mcbsp_data->bus_id, play, !play);
		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
			mcbsp_data->tx_active = 1;
		else
			mcbsp_data->rx_active = 1;
		break;
	case SNDRV_PCM_TRIGGER_STOP:
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
	case SNDRV_PCM_TRIGGER_SUSPEND:
		if (cpu_dai->active)
			omap_mcbsp_dai_set_clks_src(mcbsp_data,
				OMAP_MCBSP_SYSCLK_CLKS_FCLK);
		omap_mcbsp_stop(mcbsp_data->bus_id, play, !play);
		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
			mcbsp_data->tx_active = 0;
		else
			mcbsp_data->rx_active = 0;
		break;
	default:
		err = -EINVAL;
	}

	return err;
}
Example #4
0
int omap_mcbsp_dai_resume(struct snd_soc_dai *cpu_dai)
{
	struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);

	if (cpu_dai->active) {
		omap_mcbsp_enable_fclk(mcbsp_data->bus_id);
		omap_mcbsp_config(mcbsp_data->bus_id, &mcbsp_data->regs);
		omap_mcbsp_dai_set_clks_src(mcbsp_data, mcbsp_data->clk_id);
	}

	return 0;
}
int omap_mcbsp_dai_resume(struct snd_soc_dai *cpu_dai)
{
    

        struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);

        if (cpu_dai->active) {
               
                printk("mcbsp_dai_resume() %d\n", mcbsp_data->bus_id);
                omap_mcbsp_enable_fclk(mcbsp_data->bus_id);
                omap_mcbsp_config(mcbsp_data->bus_id, &mcbsp_data->regs);
                omap_mcbsp_dai_set_clks_src(mcbsp_data, OMAP_MCBSP_SYSCLK_CLKS_FCLK);
        }

        return 0;
}
// suspend
int omap_mcbsp_dai_suspend(struct snd_soc_dai *cpu_dai)
{
   

        struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);

        if (cpu_dai->active) {
                
                printk(KERN_ERR "mcbsp_dai_suspend() %d\n", mcbsp_data->bus_id);
                omap_mcbsp_dai_set_clks_src(mcbsp_data,
                                OMAP_MCBSP_SYSCLK_CLKS_FCLK);
                omap_mcbsp_disable_fclk(mcbsp_data->bus_id);
        }


        return 0;
}
Example #7
0
static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
					 int clk_id, unsigned int freq,
					 int dir)
{
	struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai);
	struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs;
	int err = 0;

	mcbsp_data->in_freq = freq;

	switch (clk_id) {
	case OMAP_MCBSP_SYSCLK_CLK:
		regs->srgr2	|= CLKSM;
		break;
	case OMAP_MCBSP_SYSCLK_CLKS_FCLK:
		if (cpu_is_omap44xx()) {
			regs->srgr2     |= CLKSM;
			break;
		}
	case OMAP_MCBSP_SYSCLK_CLKS_EXT:
		err = omap_mcbsp_dai_set_clks_src(mcbsp_data, clk_id);
		mcbsp_data->clk_id = clk_id;
		break;

	case OMAP_MCBSP_SYSCLK_CLKX_EXT:
		regs->srgr2	|= CLKSM;
	case OMAP_MCBSP_SYSCLK_CLKR_EXT:
		regs->pcr0	|= SCLKME;
		break;

	case OMAP_MCBSP_CLKR_SRC_CLKR:
	case OMAP_MCBSP_CLKR_SRC_CLKX:
	case OMAP_MCBSP_FSR_SRC_FSR:
	case OMAP_MCBSP_FSR_SRC_FSX:
		err = omap_mcbsp_dai_set_rcvr_src(mcbsp_data, clk_id);
		break;
	default:
		err = -ENODEV;
	}

	return err;
}