Commit 033d56f6 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'asoc/topic/dwc', 'asoc/topic/fallthrough',...

Merge remote-tracking branches 'asoc/topic/dwc', 'asoc/topic/fallthrough', 'asoc/topic/fsi', 'asoc/topic/fsl' and 'asoc/topic/graph' into asoc-next
...@@ -17,6 +17,7 @@ Below are same as Simple-Card. ...@@ -17,6 +17,7 @@ Below are same as Simple-Card.
- bitclock-master - bitclock-master
- bitclock-inversion - bitclock-inversion
- frame-inversion - frame-inversion
- mclk-fs
- dai-tdm-slot-num - dai-tdm-slot-num
- dai-tdm-slot-width - dai-tdm-slot-width
- clocks / system-clock-frequency - clocks / system-clock-frequency
......
...@@ -615,6 +615,7 @@ static int pm8916_wcd_analog_enable_adc(struct snd_soc_dapm_widget *w, ...@@ -615,6 +615,7 @@ static int pm8916_wcd_analog_enable_adc(struct snd_soc_dapm_widget *w,
case CDC_A_TX_2_EN: case CDC_A_TX_2_EN:
snd_soc_update_bits(codec, CDC_A_MICB_1_CTL, snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
MICB_1_CTL_CFILT_REF_SEL_MASK, 0); MICB_1_CTL_CFILT_REF_SEL_MASK, 0);
/* fall through */
case CDC_A_TX_3_EN: case CDC_A_TX_3_EN:
snd_soc_update_bits(codec, CDC_D_CDC_CONN_TX2_CTL, snd_soc_update_bits(codec, CDC_D_CDC_CONN_TX2_CTL,
CONN_TX2_SERIAL_TX2_MUX, CONN_TX2_SERIAL_TX2_MUX,
......
...@@ -454,6 +454,7 @@ static int tlv320aic23_set_dai_fmt(struct snd_soc_dai *codec_dai, ...@@ -454,6 +454,7 @@ static int tlv320aic23_set_dai_fmt(struct snd_soc_dai *codec_dai,
break; break;
case SND_SOC_DAIFMT_DSP_A: case SND_SOC_DAIFMT_DSP_A:
iface_reg |= TLV320AIC23_LRP_ON; iface_reg |= TLV320AIC23_LRP_ON;
/* fall through */
case SND_SOC_DAIFMT_DSP_B: case SND_SOC_DAIFMT_DSP_B:
iface_reg |= TLV320AIC23_FOR_DSP; iface_reg |= TLV320AIC23_FOR_DSP;
break; break;
......
...@@ -929,7 +929,7 @@ static int aic31xx_set_dai_fmt(struct snd_soc_dai *codec_dai, ...@@ -929,7 +929,7 @@ static int aic31xx_set_dai_fmt(struct snd_soc_dai *codec_dai,
case SND_SOC_DAIFMT_I2S: case SND_SOC_DAIFMT_I2S:
break; break;
case SND_SOC_DAIFMT_DSP_A: case SND_SOC_DAIFMT_DSP_A:
dsp_a_val = 0x1; dsp_a_val = 0x1; /* fall through */
case SND_SOC_DAIFMT_DSP_B: case SND_SOC_DAIFMT_DSP_B:
/* NOTE: BCLKINV bit value 1 equas NB and 0 equals IB */ /* NOTE: BCLKINV bit value 1 equas NB and 0 equals IB */
switch (fmt & SND_SOC_DAIFMT_INV_MASK) { switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
......
...@@ -274,6 +274,7 @@ static int tpa6130a2_probe(struct i2c_client *client, ...@@ -274,6 +274,7 @@ static int tpa6130a2_probe(struct i2c_client *client,
default: default:
dev_warn(dev, "Unknown TPA model (%d). Assuming 6130A2\n", dev_warn(dev, "Unknown TPA model (%d). Assuming 6130A2\n",
data->id); data->id);
/* fall through */
case TPA6130A2: case TPA6130A2:
regulator = "Vdd"; regulator = "Vdd";
break; break;
......
...@@ -971,7 +971,7 @@ static int wm8753_pcm_set_dai_fmt(struct snd_soc_codec *codec, ...@@ -971,7 +971,7 @@ static int wm8753_pcm_set_dai_fmt(struct snd_soc_codec *codec,
case SND_SOC_DAIFMT_CBS_CFS: case SND_SOC_DAIFMT_CBS_CFS:
break; break;
case SND_SOC_DAIFMT_CBM_CFM: case SND_SOC_DAIFMT_CBM_CFM:
ioctl |= 0x2; ioctl |= 0x2; /* fall through */
case SND_SOC_DAIFMT_CBM_CFS: case SND_SOC_DAIFMT_CBM_CFS:
voice |= 0x0040; voice |= 0x0040;
break; break;
...@@ -1096,7 +1096,7 @@ static int wm8753_i2s_set_dai_fmt(struct snd_soc_codec *codec, ...@@ -1096,7 +1096,7 @@ static int wm8753_i2s_set_dai_fmt(struct snd_soc_codec *codec,
case SND_SOC_DAIFMT_CBS_CFS: case SND_SOC_DAIFMT_CBS_CFS:
break; break;
case SND_SOC_DAIFMT_CBM_CFM: case SND_SOC_DAIFMT_CBM_CFM:
ioctl |= 0x1; ioctl |= 0x1; /* fall through */
case SND_SOC_DAIFMT_CBM_CFS: case SND_SOC_DAIFMT_CBM_CFS:
hifi |= 0x0040; hifi |= 0x0040;
break; break;
......
...@@ -1076,6 +1076,7 @@ static int wm8993_set_sysclk(struct snd_soc_dai *codec_dai, ...@@ -1076,6 +1076,7 @@ static int wm8993_set_sysclk(struct snd_soc_dai *codec_dai,
switch (clk_id) { switch (clk_id) {
case WM8993_SYSCLK_MCLK: case WM8993_SYSCLK_MCLK:
wm8993->mclk_rate = freq; wm8993->mclk_rate = freq;
/* fall through */
case WM8993_SYSCLK_FLL: case WM8993_SYSCLK_FLL:
wm8993->sysclk_source = clk_id; wm8993->sysclk_source = clk_id;
break; break;
...@@ -1123,6 +1124,7 @@ static int wm8993_set_dai_fmt(struct snd_soc_dai *dai, ...@@ -1123,6 +1124,7 @@ static int wm8993_set_dai_fmt(struct snd_soc_dai *dai,
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_DSP_B: case SND_SOC_DAIFMT_DSP_B:
aif1 |= WM8993_AIF_LRCLK_INV; aif1 |= WM8993_AIF_LRCLK_INV;
/* fall through */
case SND_SOC_DAIFMT_DSP_A: case SND_SOC_DAIFMT_DSP_A:
aif1 |= 0x18; aif1 |= 0x18;
break; break;
......
...@@ -860,6 +860,7 @@ static void vmid_reference(struct snd_soc_codec *codec) ...@@ -860,6 +860,7 @@ static void vmid_reference(struct snd_soc_codec *codec)
switch (wm8994->vmid_mode) { switch (wm8994->vmid_mode) {
default: default:
WARN_ON(NULL == "Invalid VMID mode"); WARN_ON(NULL == "Invalid VMID mode");
/* fall through */
case WM8994_VMID_NORMAL: case WM8994_VMID_NORMAL:
/* Startup bias, VMID ramp & buffer */ /* Startup bias, VMID ramp & buffer */
snd_soc_update_bits(codec, WM8994_ANTIPOP_2, snd_soc_update_bits(codec, WM8994_ANTIPOP_2,
...@@ -2654,6 +2655,7 @@ static int wm8994_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) ...@@ -2654,6 +2655,7 @@ static int wm8994_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
case SND_SOC_DAIFMT_DSP_B: case SND_SOC_DAIFMT_DSP_B:
aif1 |= WM8994_AIF1_LRCLK_INV; aif1 |= WM8994_AIF1_LRCLK_INV;
lrclk |= WM8958_AIF1_LRCLK_INV; lrclk |= WM8958_AIF1_LRCLK_INV;
/* fall through */
case SND_SOC_DAIFMT_DSP_A: case SND_SOC_DAIFMT_DSP_A:
aif1 |= 0x18; aif1 |= 0x18;
break; break;
......
...@@ -4,8 +4,8 @@ config SND_DESIGNWARE_I2S ...@@ -4,8 +4,8 @@ config SND_DESIGNWARE_I2S
select SND_SOC_GENERIC_DMAENGINE_PCM select SND_SOC_GENERIC_DMAENGINE_PCM
help help
Say Y or M if you want to add support for I2S driver for Say Y or M if you want to add support for I2S driver for
Synopsys desigwnware I2S device. The device supports upto Synopsys designware I2S device. The device supports up to
maximum of 8 channels each for play and record. a maximum of 8 channels each for play and record.
config SND_DESIGNWARE_PCM config SND_DESIGNWARE_PCM
bool "PCM PIO extension for I2S driver" bool "PCM PIO extension for I2S driver"
......
...@@ -166,7 +166,7 @@ static int fsl_asoc_card_hw_params(struct snd_pcm_substream *substream, ...@@ -166,7 +166,7 @@ static int fsl_asoc_card_hw_params(struct snd_pcm_substream *substream,
ret = snd_soc_dai_set_sysclk(rtd->cpu_dai, cpu_priv->sysclk_id[tx], ret = snd_soc_dai_set_sysclk(rtd->cpu_dai, cpu_priv->sysclk_id[tx],
cpu_priv->sysclk_freq[tx], cpu_priv->sysclk_freq[tx],
cpu_priv->sysclk_dir[tx]); cpu_priv->sysclk_dir[tx]);
if (ret) { if (ret && ret != -ENOTSUPP) {
dev_err(dev, "failed to set sysclk for cpu dai\n"); dev_err(dev, "failed to set sysclk for cpu dai\n");
return ret; return ret;
} }
...@@ -174,7 +174,7 @@ static int fsl_asoc_card_hw_params(struct snd_pcm_substream *substream, ...@@ -174,7 +174,7 @@ static int fsl_asoc_card_hw_params(struct snd_pcm_substream *substream,
if (cpu_priv->slot_width) { if (cpu_priv->slot_width) {
ret = snd_soc_dai_set_tdm_slot(rtd->cpu_dai, 0x3, 0x3, 2, ret = snd_soc_dai_set_tdm_slot(rtd->cpu_dai, 0x3, 0x3, 2,
cpu_priv->slot_width); cpu_priv->slot_width);
if (ret) { if (ret && ret != -ENOTSUPP) {
dev_err(dev, "failed to set TDM slot for cpu dai\n"); dev_err(dev, "failed to set TDM slot for cpu dai\n");
return ret; return ret;
} }
...@@ -270,7 +270,7 @@ static int fsl_asoc_card_set_bias_level(struct snd_soc_card *card, ...@@ -270,7 +270,7 @@ static int fsl_asoc_card_set_bias_level(struct snd_soc_card *card,
ret = snd_soc_dai_set_sysclk(codec_dai, codec_priv->fll_id, ret = snd_soc_dai_set_sysclk(codec_dai, codec_priv->fll_id,
pll_out, SND_SOC_CLOCK_IN); pll_out, SND_SOC_CLOCK_IN);
if (ret) { if (ret && ret != -ENOTSUPP) {
dev_err(dev, "failed to set SYSCLK: %d\n", ret); dev_err(dev, "failed to set SYSCLK: %d\n", ret);
return ret; return ret;
} }
...@@ -283,7 +283,7 @@ static int fsl_asoc_card_set_bias_level(struct snd_soc_card *card, ...@@ -283,7 +283,7 @@ static int fsl_asoc_card_set_bias_level(struct snd_soc_card *card,
ret = snd_soc_dai_set_sysclk(codec_dai, codec_priv->mclk_id, ret = snd_soc_dai_set_sysclk(codec_dai, codec_priv->mclk_id,
codec_priv->mclk_freq, codec_priv->mclk_freq,
SND_SOC_CLOCK_IN); SND_SOC_CLOCK_IN);
if (ret) { if (ret && ret != -ENOTSUPP) {
dev_err(dev, "failed to switch away from FLL: %d\n", ret); dev_err(dev, "failed to switch away from FLL: %d\n", ret);
return ret; return ret;
} }
...@@ -459,7 +459,7 @@ static int fsl_asoc_card_late_probe(struct snd_soc_card *card) ...@@ -459,7 +459,7 @@ static int fsl_asoc_card_late_probe(struct snd_soc_card *card)
ret = snd_soc_dai_set_sysclk(codec_dai, codec_priv->mclk_id, ret = snd_soc_dai_set_sysclk(codec_dai, codec_priv->mclk_id,
codec_priv->mclk_freq, SND_SOC_CLOCK_IN); codec_priv->mclk_freq, SND_SOC_CLOCK_IN);
if (ret) { if (ret && ret != -ENOTSUPP) {
dev_err(dev, "failed to set sysclk in %s\n", __func__); dev_err(dev, "failed to set sysclk in %s\n", __func__);
return ret; return ret;
} }
...@@ -639,6 +639,10 @@ static int fsl_asoc_card_probe(struct platform_device *pdev) ...@@ -639,6 +639,10 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
devm_kasprintf(&pdev->dev, GFP_KERNEL, devm_kasprintf(&pdev->dev, GFP_KERNEL,
"ac97-codec.%u", "ac97-codec.%u",
(unsigned int)idx); (unsigned int)idx);
if (!priv->dai_link[0].codec_name) {
ret = -ENOMEM;
goto asrc_fail;
}
} }
priv->dai_link[0].platform_of_node = cpu_np; priv->dai_link[0].platform_of_node = cpu_np;
......
...@@ -1110,7 +1110,7 @@ static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv, ...@@ -1110,7 +1110,7 @@ static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv,
struct clk *clk, u64 savesub, struct clk *clk, u64 savesub,
enum spdif_txrate index, bool round) enum spdif_txrate index, bool round)
{ {
const u32 rate[] = { 32000, 44100, 48000, 96000, 192000 }; static const u32 rate[] = { 32000, 44100, 48000, 96000, 192000 };
bool is_sysclk = clk_is_match(clk, spdif_priv->sysclk); bool is_sysclk = clk_is_match(clk, spdif_priv->sysclk);
u64 rate_ideal, rate_actual, sub; u64 rate_ideal, rate_actual, sub;
u32 sysclk_dfmin, sysclk_dfmax; u32 sysclk_dfmin, sysclk_dfmax;
...@@ -1169,7 +1169,7 @@ static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv, ...@@ -1169,7 +1169,7 @@ static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv,
static int fsl_spdif_probe_txclk(struct fsl_spdif_priv *spdif_priv, static int fsl_spdif_probe_txclk(struct fsl_spdif_priv *spdif_priv,
enum spdif_txrate index) enum spdif_txrate index)
{ {
const u32 rate[] = { 32000, 44100, 48000, 96000, 192000 }; static const u32 rate[] = { 32000, 44100, 48000, 96000, 192000 };
struct platform_device *pdev = spdif_priv->pdev; struct platform_device *pdev = spdif_priv->pdev;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
u64 savesub = 100000, ret; u64 savesub = 100000, ret;
......
...@@ -197,12 +197,13 @@ struct fsl_ssi_soc_data { ...@@ -197,12 +197,13 @@ struct fsl_ssi_soc_data {
* @use_dma: DMA is used or FIQ with stream filter * @use_dma: DMA is used or FIQ with stream filter
* @use_dual_fifo: DMA with support for both FIFOs used * @use_dual_fifo: DMA with support for both FIFOs used
* @fifo_deph: Depth of the SSI FIFOs * @fifo_deph: Depth of the SSI FIFOs
* @slot_width: width of each DAI slot
* @slots: number of slots
* @rxtx_reg_val: Specific register settings for receive/transmit configuration * @rxtx_reg_val: Specific register settings for receive/transmit configuration
* *
* @clk: SSI clock * @clk: SSI clock
* @baudclk: SSI baud clock for master mode * @baudclk: SSI baud clock for master mode
* @baudclk_streams: Active streams that are using baudclk * @baudclk_streams: Active streams that are using baudclk
* @bitclk_freq: bitclock frequency set by .set_dai_sysclk
* *
* @dma_params_tx: DMA transmit parameters * @dma_params_tx: DMA transmit parameters
* @dma_params_rx: DMA receive parameters * @dma_params_rx: DMA receive parameters
...@@ -233,12 +234,13 @@ struct fsl_ssi_private { ...@@ -233,12 +234,13 @@ struct fsl_ssi_private {
bool use_dual_fifo; bool use_dual_fifo;
bool has_ipg_clk_name; bool has_ipg_clk_name;
unsigned int fifo_depth; unsigned int fifo_depth;
unsigned int slot_width;
unsigned int slots;
struct fsl_ssi_rxtx_reg_val rxtx_reg_val; struct fsl_ssi_rxtx_reg_val rxtx_reg_val;
struct clk *clk; struct clk *clk;
struct clk *baudclk; struct clk *baudclk;
unsigned int baudclk_streams; unsigned int baudclk_streams;
unsigned int bitclk_freq;
/* regcache for volatile regs */ /* regcache for volatile regs */
u32 regcache_sfcsr; u32 regcache_sfcsr;
...@@ -700,8 +702,8 @@ static void fsl_ssi_shutdown(struct snd_pcm_substream *substream, ...@@ -700,8 +702,8 @@ static void fsl_ssi_shutdown(struct snd_pcm_substream *substream,
* Note: This function can be only called when using SSI as DAI master * Note: This function can be only called when using SSI as DAI master
* *
* Quick instruction for parameters: * Quick instruction for parameters:
* freq: Output BCLK frequency = samplerate * 32 (fixed) * channels * freq: Output BCLK frequency = samplerate * slots * slot_width
* dir: SND_SOC_CLOCK_OUT -> TxBCLK, SND_SOC_CLOCK_IN -> RxBCLK. * (In 2-channel I2S Master mode, slot_width is fixed 32)
*/ */
static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
struct snd_soc_dai *cpu_dai, struct snd_soc_dai *cpu_dai,
...@@ -712,15 +714,21 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, ...@@ -712,15 +714,21 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
int synchronous = ssi_private->cpu_dai_drv.symmetric_rates, ret; int synchronous = ssi_private->cpu_dai_drv.symmetric_rates, ret;
u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i; u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i;
unsigned long clkrate, baudrate, tmprate; unsigned long clkrate, baudrate, tmprate;
unsigned int slots = params_channels(hw_params);
unsigned int slot_width = 32;
u64 sub, savesub = 100000; u64 sub, savesub = 100000;
unsigned int freq; unsigned int freq;
bool baudclk_is_used; bool baudclk_is_used;
/* Prefer the explicitly set bitclock frequency */ /* Override slots and slot_width if being specifically set... */
if (ssi_private->bitclk_freq) if (ssi_private->slots)
freq = ssi_private->bitclk_freq; slots = ssi_private->slots;
else /* ...but keep 32 bits if slots is 2 -- I2S Master mode */
freq = params_channels(hw_params) * 32 * params_rate(hw_params); if (ssi_private->slot_width && slots != 2)
slot_width = ssi_private->slot_width;
/* Generate bit clock based on the slot number and slot width */
freq = slots * slot_width * params_rate(hw_params);
/* Don't apply it to any non-baudclk circumstance */ /* Don't apply it to any non-baudclk circumstance */
if (IS_ERR(ssi_private->baudclk)) if (IS_ERR(ssi_private->baudclk))
...@@ -805,16 +813,6 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, ...@@ -805,16 +813,6 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
return 0; return 0;
} }
static int fsl_ssi_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
int clk_id, unsigned int freq, int dir)
{
struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);
ssi_private->bitclk_freq = freq;
return 0;
}
/** /**
* fsl_ssi_hw_params - program the sample size * fsl_ssi_hw_params - program the sample size
* *
...@@ -1095,6 +1093,12 @@ static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask, ...@@ -1095,6 +1093,12 @@ static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask,
struct regmap *regs = ssi_private->regs; struct regmap *regs = ssi_private->regs;
u32 val; u32 val;
/* The word length should be 8, 10, 12, 16, 18, 20, 22 or 24 */
if (slot_width & 1 || slot_width < 8 || slot_width > 24) {
dev_err(cpu_dai->dev, "invalid slot width: %d\n", slot_width);
return -EINVAL;
}
/* The slot number should be >= 2 if using Network mode or I2S mode */ /* The slot number should be >= 2 if using Network mode or I2S mode */
regmap_read(regs, CCSR_SSI_SCR, &val); regmap_read(regs, CCSR_SSI_SCR, &val);
val &= CCSR_SSI_SCR_I2S_MODE_MASK | CCSR_SSI_SCR_NET; val &= CCSR_SSI_SCR_I2S_MODE_MASK | CCSR_SSI_SCR_NET;
...@@ -1121,6 +1125,9 @@ static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask, ...@@ -1121,6 +1125,9 @@ static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask,
regmap_update_bits(regs, CCSR_SSI_SCR, CCSR_SSI_SCR_SSIEN, val); regmap_update_bits(regs, CCSR_SSI_SCR, CCSR_SSI_SCR_SSIEN, val);
ssi_private->slot_width = slot_width;
ssi_private->slots = slots;
return 0; return 0;
} }
...@@ -1191,7 +1198,6 @@ static const struct snd_soc_dai_ops fsl_ssi_dai_ops = { ...@@ -1191,7 +1198,6 @@ static const struct snd_soc_dai_ops fsl_ssi_dai_ops = {
.hw_params = fsl_ssi_hw_params, .hw_params = fsl_ssi_hw_params,
.hw_free = fsl_ssi_hw_free, .hw_free = fsl_ssi_hw_free,
.set_fmt = fsl_ssi_set_dai_fmt, .set_fmt = fsl_ssi_set_dai_fmt,
.set_sysclk = fsl_ssi_set_dai_sysclk,
.set_tdm_slot = fsl_ssi_set_dai_tdm_slot, .set_tdm_slot = fsl_ssi_set_dai_tdm_slot,
.trigger = fsl_ssi_trigger, .trigger = fsl_ssi_trigger,
}; };
......
...@@ -29,7 +29,9 @@ struct graph_card_data { ...@@ -29,7 +29,9 @@ struct graph_card_data {
struct graph_dai_props { struct graph_dai_props {
struct asoc_simple_dai cpu_dai; struct asoc_simple_dai cpu_dai;
struct asoc_simple_dai codec_dai; struct asoc_simple_dai codec_dai;
unsigned int mclk_fs;
} *dai_props; } *dai_props;
unsigned int mclk_fs;
struct snd_soc_dai_link *dai_link; struct snd_soc_dai_link *dai_link;
struct gpio_desc *pa_gpio; struct gpio_desc *pa_gpio;
}; };
...@@ -95,9 +97,43 @@ static void asoc_graph_card_shutdown(struct snd_pcm_substream *substream) ...@@ -95,9 +97,43 @@ static void asoc_graph_card_shutdown(struct snd_pcm_substream *substream)
asoc_simple_card_clk_disable(&dai_props->codec_dai); asoc_simple_card_clk_disable(&dai_props->codec_dai);
} }
static int asoc_graph_card_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_dai *codec_dai = rtd->codec_dai;
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
struct graph_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
struct graph_dai_props *dai_props = graph_priv_to_props(priv, rtd->num);
unsigned int mclk, mclk_fs = 0;
int ret = 0;
if (priv->mclk_fs)
mclk_fs = priv->mclk_fs;
else if (dai_props->mclk_fs)
mclk_fs = dai_props->mclk_fs;
if (mclk_fs) {
mclk = params_rate(params) * mclk_fs;
ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk,
SND_SOC_CLOCK_IN);
if (ret && ret != -ENOTSUPP)
goto err;
ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk,
SND_SOC_CLOCK_OUT);
if (ret && ret != -ENOTSUPP)
goto err;
}
return 0;
err:
return ret;
}
static const struct snd_soc_ops asoc_graph_card_ops = { static const struct snd_soc_ops asoc_graph_card_ops = {
.startup = asoc_graph_card_startup, .startup = asoc_graph_card_startup,
.shutdown = asoc_graph_card_shutdown, .shutdown = asoc_graph_card_shutdown,
.hw_params = asoc_graph_card_hw_params,
}; };
static int asoc_graph_card_dai_init(struct snd_soc_pcm_runtime *rtd) static int asoc_graph_card_dai_init(struct snd_soc_pcm_runtime *rtd)
...@@ -146,10 +182,7 @@ static int asoc_graph_card_dai_link_of(struct device_node *cpu_port, ...@@ -146,10 +182,7 @@ static int asoc_graph_card_dai_link_of(struct device_node *cpu_port,
if (ret < 0) if (ret < 0)
goto dai_link_of_err; goto dai_link_of_err;
/* of_property_read_u32(rcpu_ep, "mclk-fs", &dai_props->mclk_fs);
* we need to consider "mclk-fs" around here
* see simple-card
*/
ret = asoc_simple_card_parse_graph_cpu(cpu_ep, dai_link); ret = asoc_simple_card_parse_graph_cpu(cpu_ep, dai_link);
if (ret < 0) if (ret < 0)
...@@ -217,10 +250,8 @@ static int asoc_graph_card_parse_of(struct graph_card_data *priv) ...@@ -217,10 +250,8 @@ static int asoc_graph_card_parse_of(struct graph_card_data *priv)
if (ret < 0) if (ret < 0)
return ret; return ret;
/* /* Factor to mclk, used in hw_params() */
* we need to consider "mclk-fs" around here of_property_read_u32(node, "mclk-fs", &priv->mclk_fs);
* see simple-card
*/
of_for_each_phandle(&it, rc, node, "dais", NULL, 0) { of_for_each_phandle(&it, rc, node, "dais", NULL, 0) {
ret = asoc_graph_card_dai_link_of(it.node, priv, idx++); ret = asoc_graph_card_dai_link_of(it.node, priv, idx++);
......
...@@ -1932,14 +1932,9 @@ static int fsi_probe(struct platform_device *pdev) ...@@ -1932,14 +1932,9 @@ static int fsi_probe(struct platform_device *pdev)
core = NULL; core = NULL;
if (np) { if (np) {
const struct of_device_id *of_id; core = of_device_get_match_data(&pdev->dev);
fsi_of_parse("fsia", np, &info.port_a, &pdev->dev);
of_id = of_match_device(fsi_of_match, &pdev->dev); fsi_of_parse("fsib", np, &info.port_b, &pdev->dev);
if (of_id) {
core = of_id->data;
fsi_of_parse("fsia", np, &info.port_a, &pdev->dev);
fsi_of_parse("fsib", np, &info.port_b, &pdev->dev);
}
} else { } else {
const struct platform_device_id *id_entry = pdev->id_entry; const struct platform_device_id *id_entry = pdev->id_entry;
if (id_entry) if (id_entry)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment