sound fixes for 4.13-rc4
Now we hit the usual ASoC-fix-flood in the middle of release. Most of changes are trivial and device-specific, while one significant change is the fix for unbalanced of_graph_*() refcounts. This involved with the change in the graph API itself that had been a bit messy. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEECxfAB4MH3rD5mfB6bDGAVD0pKaQFAlmESFAOHHRpd2FpQHN1 c2UuZGUACgkQbDGAVD0pKaQ6ow/6A2PhAU8+WfUR0d/EWwJ5Gd+iEnp79jEIvPmX 1tqBFRhft7yVUxK7TDQ0HSQCktDKbmHszUxOga8EU9j6BjNyrvUdr3OY7X8kSCbP kpVQ9R/sHd/0iRDA8Cn+PazO6io3PpqKAvlrMf5p9uSZ+Ic6+MCQAUb5dHgqjOQq kLGIgyOxoziKpMkb7SuLGbxFTJiioe0HFyMSPTHHC5jB4B0pyBhMaIUXlKypnOdk IHt68GuhNG+k20jAqlfRV/HCKPTgMvlZAcU+KNB1KqUpcjTy53Myi1yQ4A/ngfgj rbEObaluJF1G+3texjMRatpzsBwNOitrdtK5yqTncXyrbOR4YUSFxdM0FF7jcvzn tnHpZTCNOAvosQ3K8AuFy4j+kypYEB3MycPMGOFk+BwslFgBME6vBzKyxzGann7y d+2imj7NC/uPor5qpAqw01xpsg57QKOGCzPWO3r/rZg7u20ejiJjVFhRH6hKnS7W NfTpug8O1aedvzOSChYid7ujFrHZhscwDLvqn1qKce5za68cHSNpTDxG0RkwRwAD fBzHTi3yEQKt74Mfb2K7MaY9g9W/oFpNIQBnNyrTYWh8AyumjUoBpq34MiJl5iMm ZV64z7r79ANkE31qNKG8EXLDR8LEymGj2JfMdDuBiVyXkjjEulCzY5KIA5rxQJfG X+4GZmg= =k+0o -----END PGP SIGNATURE----- Merge tag 'sound-4.13-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Now we hit the usual ASoC-fix-flood in the middle of release. Most of the changes are trivial and device-specific, while one significant change is the fix for unbalanced of_graph_*() refcounts. This involved a change in the graph API itself that had been a bit messy" * tag 'sound-4.13-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda - Fix speaker output from VAIO VPCL14M1R device property: Fix usecount for of_graph_get_port_parent() ASoC: rt5665: fix wrong register for bclk ratio control ASoC: Intel: Use MCLK instead of BLCK as the sysclock for RT5514 codec on kabylake platform ASoC: Intel: Enabling ASRC for RT5663 codec on kabylake platform ASoC: codecs: msm8916-analog: fix DIG_CLK_CTL_RXD3_CLK_EN define ASoC: Intel: Skylake: Fix missing sentinels in sst_acpi_mach ASoC: sh: hac: add missing "int ret" ASoC: samsung: odroid: Fix EPLL frequency values ASoC: sgtl5000: Use snd_soc_kcontrol_codec() ASoC: rt5665: fix GPIO6 pin function define ASoC: ux500: Restore platform DAI assignments ASoC: fix pcm-creation regression ASoC: do not close shared backend dailink ASoC: pxa: SND_PXA2XX_SOC should depend on HAS_DMA ASoC: Intel: Skylake: Fix default dma_buffer_size ASoC: rt5663: Update the HW default values based on the shipping version ASoC: imx-ssi: add check on platform_get_irq return value
This commit is contained in:
commit
a64c40e79f
|
@ -708,6 +708,15 @@ struct device_node *of_graph_get_port_parent(struct device_node *node)
|
|||
{
|
||||
unsigned int depth;
|
||||
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Preserve usecount for passed in node as of_get_next_parent()
|
||||
* will do of_node_put() on it.
|
||||
*/
|
||||
of_node_get(node);
|
||||
|
||||
/* Walk 3 levels up only if there is 'ports' node. */
|
||||
for (depth = 3; depth && node; depth--) {
|
||||
node = of_get_next_parent(node);
|
||||
|
@ -728,12 +737,16 @@ EXPORT_SYMBOL(of_graph_get_port_parent);
|
|||
struct device_node *of_graph_get_remote_port_parent(
|
||||
const struct device_node *node)
|
||||
{
|
||||
struct device_node *np;
|
||||
struct device_node *np, *pp;
|
||||
|
||||
/* Get remote endpoint node. */
|
||||
np = of_graph_get_remote_endpoint(node);
|
||||
|
||||
return of_graph_get_port_parent(np);
|
||||
pp = of_graph_get_port_parent(np);
|
||||
|
||||
of_node_put(np);
|
||||
|
||||
return pp;
|
||||
}
|
||||
EXPORT_SYMBOL(of_graph_get_remote_port_parent);
|
||||
|
||||
|
|
|
@ -795,10 +795,6 @@ struct snd_soc_component_driver {
|
|||
int (*suspend)(struct snd_soc_component *);
|
||||
int (*resume)(struct snd_soc_component *);
|
||||
|
||||
/* pcm creation and destruction */
|
||||
int (*pcm_new)(struct snd_soc_pcm_runtime *);
|
||||
void (*pcm_free)(struct snd_pcm *);
|
||||
|
||||
/* DT */
|
||||
int (*of_xlate_dai_name)(struct snd_soc_component *component,
|
||||
struct of_phandle_args *args,
|
||||
|
@ -874,8 +870,6 @@ struct snd_soc_component {
|
|||
void (*remove)(struct snd_soc_component *);
|
||||
int (*suspend)(struct snd_soc_component *);
|
||||
int (*resume)(struct snd_soc_component *);
|
||||
int (*pcm_new)(struct snd_soc_pcm_runtime *);
|
||||
void (*pcm_free)(struct snd_pcm *);
|
||||
|
||||
/* machine specific init */
|
||||
int (*init)(struct snd_soc_component *component);
|
||||
|
|
|
@ -2296,6 +2296,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
|
||||
SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
|
||||
SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
|
||||
SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
|
||||
SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
|
||||
SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#define CDC_D_CDC_DIG_CLK_CTL (0xf04A)
|
||||
#define DIG_CLK_CTL_RXD1_CLK_EN BIT(0)
|
||||
#define DIG_CLK_CTL_RXD2_CLK_EN BIT(1)
|
||||
#define DIG_CLK_CTL_RXD3_CLK_EN BIT(3)
|
||||
#define DIG_CLK_CTL_RXD3_CLK_EN BIT(2)
|
||||
#define DIG_CLK_CTL_TXD_CLK_EN BIT(4)
|
||||
#define DIG_CLK_CTL_NCP_CLK_EN_MASK BIT(6)
|
||||
#define DIG_CLK_CTL_NCP_CLK_EN BIT(6)
|
||||
|
|
|
@ -466,7 +466,7 @@ static const struct reg_default rt5663_reg[] = {
|
|||
{ 0x0006, 0x1000 },
|
||||
{ 0x000a, 0x0000 },
|
||||
{ 0x0010, 0x000f },
|
||||
{ 0x0015, 0x42c1 },
|
||||
{ 0x0015, 0x42f1 },
|
||||
{ 0x0016, 0x0000 },
|
||||
{ 0x0018, 0x000b },
|
||||
{ 0x0019, 0xafaf },
|
||||
|
@ -509,7 +509,7 @@ static const struct reg_default rt5663_reg[] = {
|
|||
{ 0x008a, 0x0000 },
|
||||
{ 0x008b, 0x0000 },
|
||||
{ 0x008c, 0x0003 },
|
||||
{ 0x008e, 0x0004 },
|
||||
{ 0x008e, 0x0008 },
|
||||
{ 0x008f, 0x1000 },
|
||||
{ 0x0090, 0x0646 },
|
||||
{ 0x0091, 0x0e3e },
|
||||
|
@ -520,7 +520,7 @@ static const struct reg_default rt5663_reg[] = {
|
|||
{ 0x0098, 0x0000 },
|
||||
{ 0x009a, 0x0000 },
|
||||
{ 0x009f, 0x0000 },
|
||||
{ 0x00ae, 0x2000 },
|
||||
{ 0x00ae, 0x6000 },
|
||||
{ 0x00af, 0x0000 },
|
||||
{ 0x00b6, 0x0000 },
|
||||
{ 0x00b7, 0x0000 },
|
||||
|
@ -538,7 +538,7 @@ static const struct reg_default rt5663_reg[] = {
|
|||
{ 0x00d9, 0x08f9 },
|
||||
{ 0x00db, 0x0008 },
|
||||
{ 0x00dc, 0x00c0 },
|
||||
{ 0x00dd, 0x6724 },
|
||||
{ 0x00dd, 0x6729 },
|
||||
{ 0x00de, 0x3131 },
|
||||
{ 0x00df, 0x0008 },
|
||||
{ 0x00e0, 0x4000 },
|
||||
|
@ -578,7 +578,7 @@ static const struct reg_default rt5663_reg[] = {
|
|||
{ 0x0116, 0x0000 },
|
||||
{ 0x0117, 0x0f00 },
|
||||
{ 0x0118, 0x0006 },
|
||||
{ 0x0125, 0x2224 },
|
||||
{ 0x0125, 0x2424 },
|
||||
{ 0x0126, 0x5550 },
|
||||
{ 0x0127, 0x0400 },
|
||||
{ 0x0128, 0x7711 },
|
||||
|
@ -596,8 +596,8 @@ static const struct reg_default rt5663_reg[] = {
|
|||
{ 0x0145, 0x0002 },
|
||||
{ 0x0146, 0x0000 },
|
||||
{ 0x0160, 0x0e80 },
|
||||
{ 0x0161, 0x0020 },
|
||||
{ 0x0162, 0x0080 },
|
||||
{ 0x0161, 0x0080 },
|
||||
{ 0x0162, 0x0200 },
|
||||
{ 0x0163, 0x0800 },
|
||||
{ 0x0164, 0x0000 },
|
||||
{ 0x0165, 0x0000 },
|
||||
|
@ -676,8 +676,8 @@ static const struct reg_default rt5663_reg[] = {
|
|||
{ 0x0251, 0x0000 },
|
||||
{ 0x0252, 0x028a },
|
||||
{ 0x02fa, 0x0000 },
|
||||
{ 0x02fb, 0x0000 },
|
||||
{ 0x02fc, 0x0000 },
|
||||
{ 0x02fb, 0x00a4 },
|
||||
{ 0x02fc, 0x0300 },
|
||||
{ 0x0300, 0x0000 },
|
||||
{ 0x03d0, 0x0000 },
|
||||
{ 0x03d1, 0x0000 },
|
||||
|
|
|
@ -4368,12 +4368,12 @@ static int rt5665_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
|
|||
switch (dai->id) {
|
||||
case RT5665_AIF2_1:
|
||||
case RT5665_AIF2_2:
|
||||
snd_soc_update_bits(codec, RT5665_ADDA_CLK_1,
|
||||
snd_soc_update_bits(codec, RT5665_ADDA_CLK_2,
|
||||
RT5665_I2S_BCLK_MS2_MASK,
|
||||
RT5665_I2S_BCLK_MS2_64);
|
||||
break;
|
||||
case RT5665_AIF3:
|
||||
snd_soc_update_bits(codec, RT5665_ADDA_CLK_1,
|
||||
snd_soc_update_bits(codec, RT5665_ADDA_CLK_2,
|
||||
RT5665_I2S_BCLK_MS3_MASK,
|
||||
RT5665_I2S_BCLK_MS3_64);
|
||||
break;
|
||||
|
|
|
@ -1692,8 +1692,8 @@
|
|||
#define RT5665_GP6_PIN_MASK (0x3 << 5)
|
||||
#define RT5665_GP6_PIN_SFT 5
|
||||
#define RT5665_GP6_PIN_GPIO6 (0x0 << 5)
|
||||
#define RT5665_GP6_PIN_BCLK3 (0x0 << 5)
|
||||
#define RT5665_GP6_PIN_PDM_SCL (0x1 << 5)
|
||||
#define RT5665_GP6_PIN_BCLK3 (0x1 << 5)
|
||||
#define RT5665_GP6_PIN_PDM_SCL (0x2 << 5)
|
||||
#define RT5665_GP7_PIN_MASK (0x3 << 3)
|
||||
#define RT5665_GP7_PIN_SFT 3
|
||||
#define RT5665_GP7_PIN_GPIO7 (0x0 << 3)
|
||||
|
|
|
@ -409,7 +409,7 @@ static int dac_put_volsw(struct snd_kcontrol *kcontrol,
|
|||
static int avc_get_threshold(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
|
||||
int db, i;
|
||||
u16 reg = snd_soc_read(codec, SGTL5000_DAP_AVC_THRESHOLD);
|
||||
|
||||
|
@ -442,7 +442,7 @@ static int avc_get_threshold(struct snd_kcontrol *kcontrol,
|
|||
static int avc_put_threshold(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
|
||||
int db;
|
||||
u16 reg;
|
||||
|
||||
|
|
|
@ -527,6 +527,10 @@ static int imx_ssi_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
ssi->irq = platform_get_irq(pdev, 0);
|
||||
if (ssi->irq < 0) {
|
||||
dev_err(&pdev->dev, "Failed to get IRQ: %d\n", ssi->irq);
|
||||
return ssi->irq;
|
||||
}
|
||||
|
||||
ssi->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(ssi->clk)) {
|
||||
|
|
|
@ -224,9 +224,11 @@ static int asoc_graph_card_parse_of(struct graph_card_data *priv)
|
|||
|
||||
of_for_each_phandle(&it, rc, node, "dais", NULL, 0) {
|
||||
ret = asoc_graph_card_dai_link_of(it.node, priv, idx++);
|
||||
of_node_put(it.node);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
of_node_put(it.node);
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return asoc_simple_card_parse_card_name(card, NULL);
|
||||
|
@ -239,10 +241,8 @@ static int asoc_graph_get_dais_count(struct device *dev)
|
|||
int count = 0;
|
||||
int rc;
|
||||
|
||||
of_for_each_phandle(&it, rc, node, "dais", NULL, 0) {
|
||||
of_for_each_phandle(&it, rc, node, "dais", NULL, 0)
|
||||
count++;
|
||||
of_node_put(it.node);
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
|
|
@ -215,7 +215,6 @@ static int asoc_graph_card_parse_of(struct graph_card_data *priv)
|
|||
codec_ep = of_graph_get_remote_endpoint(cpu_ep);
|
||||
rcpu_ep = of_graph_get_remote_endpoint(codec_ep);
|
||||
|
||||
of_node_put(cpu_port);
|
||||
of_node_put(cpu_ep);
|
||||
of_node_put(codec_ep);
|
||||
of_node_put(rcpu_ep);
|
||||
|
@ -232,8 +231,10 @@ static int asoc_graph_card_parse_of(struct graph_card_data *priv)
|
|||
|
||||
ret = asoc_simple_card_parse_daifmt(dev, cpu_ep, codec_ep,
|
||||
NULL, &daifmt);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
of_node_put(cpu_port);
|
||||
goto parse_of_err;
|
||||
}
|
||||
}
|
||||
|
||||
dai_idx = 0;
|
||||
|
@ -250,7 +251,6 @@ static int asoc_graph_card_parse_of(struct graph_card_data *priv)
|
|||
codec_ep = of_graph_get_remote_endpoint(cpu_ep);
|
||||
codec_port = of_graph_get_port_parent(codec_ep);
|
||||
|
||||
of_node_put(cpu_port);
|
||||
of_node_put(cpu_ep);
|
||||
of_node_put(codec_ep);
|
||||
of_node_put(codec_port);
|
||||
|
@ -266,13 +266,17 @@ static int asoc_graph_card_parse_of(struct graph_card_data *priv)
|
|||
|
||||
/* Back-End (= Codec) */
|
||||
ret = asoc_graph_card_dai_link_of(codec_ep, priv, daifmt, dai_idx++, 0);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
of_node_put(cpu_port);
|
||||
goto parse_of_err;
|
||||
}
|
||||
} else {
|
||||
/* Front-End (= CPU) */
|
||||
ret = asoc_graph_card_dai_link_of(cpu_ep, priv, daifmt, dai_idx++, 1);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
of_node_put(cpu_port);
|
||||
goto parse_of_err;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -306,7 +310,6 @@ static int asoc_graph_get_dais_count(struct device *dev)
|
|||
codec_ep = of_graph_get_remote_endpoint(cpu_ep);
|
||||
codec_port = of_graph_get_port_parent(codec_ep);
|
||||
|
||||
of_node_put(cpu_port);
|
||||
of_node_put(cpu_ep);
|
||||
of_node_put(codec_ep);
|
||||
of_node_put(codec_port);
|
||||
|
|
|
@ -263,6 +263,9 @@ static int asoc_simple_card_get_dai_id(struct device_node *ep)
|
|||
id = i;
|
||||
i++;
|
||||
}
|
||||
|
||||
of_node_put(node);
|
||||
|
||||
if (id < 0)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -282,11 +285,6 @@ int asoc_simple_card_parse_graph_dai(struct device_node *ep,
|
|||
if (!dai_name)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* of_graph_get_port_parent() will call
|
||||
* of_node_put(). So, call of_node_get() here
|
||||
*/
|
||||
of_node_get(ep);
|
||||
node = of_graph_get_port_parent(ep);
|
||||
|
||||
/* Get dai->name */
|
||||
|
|
|
@ -319,7 +319,9 @@ static int kabylake_rt5663_hw_params(struct snd_pcm_substream *substream,
|
|||
int ret;
|
||||
|
||||
/* use ASRC for internal clocks, as PLL rate isn't multiple of BCLK */
|
||||
rt5663_sel_asrc_clk_src(codec_dai->codec, RT5663_DA_STEREO_FILTER, 1);
|
||||
rt5663_sel_asrc_clk_src(codec_dai->codec,
|
||||
RT5663_DA_STEREO_FILTER | RT5663_AD_STEREO_FILTER,
|
||||
RT5663_CLK_SEL_I2S1_ASRC);
|
||||
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai,
|
||||
RT5663_SCLK_S_MCLK, 24576000, SND_SOC_CLOCK_IN);
|
||||
|
@ -349,19 +351,10 @@ static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream,
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = snd_soc_dai_set_pll(codec_dai, 0,
|
||||
RT5514_PLL1_S_BCLK, RT5514_AIF1_BCLK_FREQ,
|
||||
RT5514_AIF1_SYSCLK_FREQ);
|
||||
if (ret < 0) {
|
||||
dev_err(rtd->dev, "set bclk err: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai,
|
||||
RT5514_SCLK_S_PLL1, RT5514_AIF1_SYSCLK_FREQ,
|
||||
SND_SOC_CLOCK_IN);
|
||||
RT5514_SCLK_S_MCLK, 24576000, SND_SOC_CLOCK_IN);
|
||||
if (ret < 0) {
|
||||
dev_err(rtd->dev, "set sclk err: %d\n", ret);
|
||||
dev_err(rtd->dev, "set sysclk err: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -540,6 +540,14 @@ static void skl_setup_cpr_gateway_cfg(struct skl_sst *ctx,
|
|||
cpr_mconfig->gtw_cfg.dma_buffer_size =
|
||||
mconfig->dma_buffer_size * dma_io_buf;
|
||||
|
||||
/* fallback to 2ms default value */
|
||||
if (!cpr_mconfig->gtw_cfg.dma_buffer_size) {
|
||||
if (mconfig->hw_conn_type == SKL_CONN_SOURCE)
|
||||
cpr_mconfig->gtw_cfg.dma_buffer_size = 2 * mconfig->obs;
|
||||
else
|
||||
cpr_mconfig->gtw_cfg.dma_buffer_size = 2 * mconfig->ibs;
|
||||
}
|
||||
|
||||
cpr_mconfig->cpr_feature_mask = 0;
|
||||
cpr_mconfig->gtw_cfg.config_length = 0;
|
||||
|
||||
|
|
|
@ -941,6 +941,7 @@ static struct sst_acpi_mach sst_bxtp_devdata[] = {
|
|||
.machine_quirk = sst_acpi_codec_list,
|
||||
.quirk_data = &bxt_codecs,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static struct sst_acpi_mach sst_kbl_devdata[] = {
|
||||
|
@ -991,6 +992,7 @@ static struct sst_acpi_mach sst_glk_devdata[] = {
|
|||
.drv_name = "glk_alc298s_i2s",
|
||||
.fw_filename = "intel/dsp_fw_glk.bin",
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
/* PCI IDs */
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
config SND_PXA2XX_SOC
|
||||
tristate "SoC Audio for the Intel PXA2xx chip"
|
||||
depends on ARCH_PXA || COMPILE_TEST
|
||||
depends on HAS_DMA
|
||||
select SND_PXA2XX_LIB
|
||||
help
|
||||
Say Y or M if you want to add support for codecs attached to
|
||||
|
|
|
@ -42,17 +42,17 @@ static int odroid_card_hw_params(struct snd_pcm_substream *substream,
|
|||
switch (params_rate(params)) {
|
||||
case 32000:
|
||||
case 64000:
|
||||
pll_freq = 131072000U;
|
||||
pll_freq = 131072006U;
|
||||
break;
|
||||
case 44100:
|
||||
case 88200:
|
||||
case 176400:
|
||||
pll_freq = 180633600U;
|
||||
pll_freq = 180633609U;
|
||||
break;
|
||||
case 48000:
|
||||
case 96000:
|
||||
case 192000:
|
||||
pll_freq = 196608000U;
|
||||
pll_freq = 196608001U;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
|
|
@ -315,6 +315,8 @@ static const struct snd_soc_component_driver sh4_hac_component = {
|
|||
|
||||
static int hac_soc_platform_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = snd_soc_set_ac97_ops(&hac_ac97_ops);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
|
|
@ -3171,8 +3171,6 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
|
|||
component->remove = component->driver->remove;
|
||||
component->suspend = component->driver->suspend;
|
||||
component->resume = component->driver->resume;
|
||||
component->pcm_new = component->driver->pcm_new;
|
||||
component->pcm_free = component->driver->pcm_free;
|
||||
|
||||
dapm = &component->dapm;
|
||||
dapm->dev = dev;
|
||||
|
@ -3360,25 +3358,6 @@ static void snd_soc_platform_drv_remove(struct snd_soc_component *component)
|
|||
platform->driver->remove(platform);
|
||||
}
|
||||
|
||||
static int snd_soc_platform_drv_pcm_new(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_platform *platform = rtd->platform;
|
||||
|
||||
if (platform->driver->pcm_new)
|
||||
return platform->driver->pcm_new(rtd);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void snd_soc_platform_drv_pcm_free(struct snd_pcm *pcm)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = pcm->private_data;
|
||||
struct snd_soc_platform *platform = rtd->platform;
|
||||
|
||||
if (platform->driver->pcm_free)
|
||||
platform->driver->pcm_free(pcm);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_add_platform - Add a platform to the ASoC core
|
||||
* @dev: The parent device for the platform
|
||||
|
@ -3402,10 +3381,6 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
|
|||
platform->component.probe = snd_soc_platform_drv_probe;
|
||||
if (platform_drv->remove)
|
||||
platform->component.remove = snd_soc_platform_drv_remove;
|
||||
if (platform_drv->pcm_new)
|
||||
platform->component.pcm_new = snd_soc_platform_drv_pcm_new;
|
||||
if (platform_drv->pcm_free)
|
||||
platform->component.pcm_free = snd_soc_platform_drv_pcm_free;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
platform->component.debugfs_prefix = "platform";
|
||||
|
@ -4113,6 +4088,8 @@ int snd_soc_get_dai_id(struct device_node *ep)
|
|||
}
|
||||
mutex_unlock(&client_mutex);
|
||||
|
||||
of_node_put(node);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_get_dai_id);
|
||||
|
|
|
@ -181,6 +181,10 @@ int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir,
|
|||
dev_dbg(be->dev, "ASoC: BE %s event %d dir %d\n",
|
||||
be->dai_link->name, event, dir);
|
||||
|
||||
if ((event == SND_SOC_DAPM_STREAM_STOP) &&
|
||||
(be->dpcm[dir].users >= 1))
|
||||
continue;
|
||||
|
||||
snd_soc_dapm_stream_event(be, dir, event);
|
||||
}
|
||||
|
||||
|
@ -2628,25 +2632,12 @@ static int dpcm_fe_dai_close(struct snd_pcm_substream *fe_substream)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void soc_pcm_free(struct snd_pcm *pcm)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = pcm->private_data;
|
||||
struct snd_soc_component *component;
|
||||
|
||||
list_for_each_entry(component, &rtd->card->component_dev_list,
|
||||
card_list) {
|
||||
if (component->pcm_free)
|
||||
component->pcm_free(pcm);
|
||||
}
|
||||
}
|
||||
|
||||
/* create a new pcm */
|
||||
int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
|
||||
{
|
||||
struct snd_soc_platform *platform = rtd->platform;
|
||||
struct snd_soc_dai *codec_dai;
|
||||
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||
struct snd_soc_component *component;
|
||||
struct snd_pcm *pcm;
|
||||
char new_name[64];
|
||||
int ret = 0, playback = 0, capture = 0;
|
||||
|
@ -2756,18 +2747,17 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
|
|||
if (capture)
|
||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops);
|
||||
|
||||
list_for_each_entry(component, &rtd->card->component_dev_list, card_list) {
|
||||
if (component->pcm_new) {
|
||||
ret = component->pcm_new(rtd);
|
||||
if (ret < 0) {
|
||||
dev_err(component->dev,
|
||||
"ASoC: pcm constructor failed: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
if (platform->driver->pcm_new) {
|
||||
ret = platform->driver->pcm_new(rtd);
|
||||
if (ret < 0) {
|
||||
dev_err(platform->dev,
|
||||
"ASoC: pcm constructor failed: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
pcm->private_free = soc_pcm_free;
|
||||
|
||||
pcm->private_free = platform->driver->pcm_free;
|
||||
out:
|
||||
dev_info(rtd->card->dev, "%s <-> %s mapping ok\n",
|
||||
(rtd->num_codecs > 1) ? "multicodec" : rtd->codec_dai->name,
|
||||
|
|
|
@ -33,6 +33,7 @@ static struct snd_soc_dai_link mop500_dai_links[] = {
|
|||
.stream_name = "ab8500_0",
|
||||
.cpu_dai_name = "ux500-msp-i2s.1",
|
||||
.codec_dai_name = "ab8500-codec-dai.0",
|
||||
.platform_name = "ux500-msp-i2s.1",
|
||||
.codec_name = "ab8500-codec.0",
|
||||
.init = mop500_ab8500_machine_init,
|
||||
.ops = mop500_ab8500_ops,
|
||||
|
@ -42,6 +43,7 @@ static struct snd_soc_dai_link mop500_dai_links[] = {
|
|||
.stream_name = "ab8500_1",
|
||||
.cpu_dai_name = "ux500-msp-i2s.3",
|
||||
.codec_dai_name = "ab8500-codec-dai.1",
|
||||
.platform_name = "ux500-msp-i2s.3",
|
||||
.codec_name = "ab8500-codec.0",
|
||||
.init = NULL,
|
||||
.ops = mop500_ab8500_ops,
|
||||
|
@ -85,6 +87,8 @@ static int mop500_of_probe(struct platform_device *pdev,
|
|||
for (i = 0; i < 2; i++) {
|
||||
mop500_dai_links[i].cpu_of_node = msp_np[i];
|
||||
mop500_dai_links[i].cpu_dai_name = NULL;
|
||||
mop500_dai_links[i].platform_of_node = msp_np[i];
|
||||
mop500_dai_links[i].platform_name = NULL;
|
||||
mop500_dai_links[i].codec_of_node = codec_np;
|
||||
mop500_dai_links[i].codec_name = NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue