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; }
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; }
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; }
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; }
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; }