From 06f794e8cb227249e03893e4b4923ff58556eb60 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Thu, 4 Mar 2021 14:49:23 +0000 Subject: [PATCH] ASoC: dwc: Support set_bclk_ratio Signed-off-by: Phil Elwell --- sound/soc/dwc/dwc-i2s.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) --- a/sound/soc/dwc/dwc-i2s.c +++ b/sound/soc/dwc/dwc-i2s.c @@ -351,11 +351,46 @@ static int dw_i2s_set_fmt(struct snd_soc return ret; } +static int dw_i2s_set_bclk_ratio(struct snd_soc_dai *cpu_dai, + unsigned int ratio) +{ + struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); + struct i2s_clk_config_data *config = &dev->config; + + dev_err(dev->dev, "%s(%d)\n", __func__, ratio); + switch (ratio) { + case 32: + config->data_width = 16; + dev->ccr = 0x00; + dev->xfer_resolution = 0x02; + break; + + case 48: + config->data_width = 24; + dev->ccr = 0x08; + dev->xfer_resolution = 0x04; + break; + + case 64: + config->data_width = 32; + dev->ccr = 0x10; + dev->xfer_resolution = 0x05; + break; + default: + return -EINVAL; + } + + i2s_write_reg(dev->i2s_base, CCR, dev->ccr); + + return 0; +} + static const struct snd_soc_dai_ops dw_i2s_dai_ops = { .hw_params = dw_i2s_hw_params, .prepare = dw_i2s_prepare, .trigger = dw_i2s_trigger, .set_fmt = dw_i2s_set_fmt, + .set_bclk_ratio = dw_i2s_set_bclk_ratio, }; #ifdef CONFIG_PM