1
0
Fork 0

Merge branch 'asoc-5.2' into asoc-linus

alistair/sunxi64-5.4-dsi
Mark Brown 2019-07-06 12:25:24 +01:00
commit 0dceaf7c79
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
16 changed files with 91 additions and 29 deletions

View File

@ -240,10 +240,8 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
} }
/* For DSP_*, LRCLK's polarity must be inverted */ /* For DSP_*, LRCLK's polarity must be inverted */
if (fmt & SND_SOC_DAIFMT_DSP_A) { if (fmt & SND_SOC_DAIFMT_DSP_A)
change_bit(ffs(AD193X_DAC_LEFT_HIGH) - 1, dac_fmt ^= AD193X_DAC_LEFT_HIGH;
(unsigned long *)&dac_fmt);
}
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & frm master */ case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & frm master */

View File

@ -538,6 +538,29 @@ static struct hdac_hdmi_port *hdac_hdmi_get_port_from_cvt(
return NULL; return NULL;
} }
/*
* Go through all converters and ensure connection is set to
* the correct pin as set via kcontrols.
*/
static void hdac_hdmi_verify_connect_sel_all_pins(struct hdac_device *hdev)
{
struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev);
struct hdac_hdmi_port *port;
struct hdac_hdmi_cvt *cvt;
int cvt_idx = 0;
list_for_each_entry(cvt, &hdmi->cvt_list, head) {
port = hdac_hdmi_get_port_from_cvt(hdev, hdmi, cvt);
if (port && port->pin) {
snd_hdac_codec_write(hdev, port->pin->nid, 0,
AC_VERB_SET_CONNECT_SEL, cvt_idx);
dev_dbg(&hdev->dev, "%s: %s set connect %d -> %d\n",
__func__, cvt->name, port->pin->nid, cvt_idx);
}
++cvt_idx;
}
}
/* /*
* This tries to get a valid pin and set the HW constraints based on the * This tries to get a valid pin and set the HW constraints based on the
* ELD. Even if a valid pin is not found return success so that device open * ELD. Even if a valid pin is not found return success so that device open
@ -798,6 +821,14 @@ static int hdac_hdmi_cvt_output_widget_event(struct snd_soc_dapm_widget *w,
AC_VERB_SET_CHANNEL_STREAMID, pcm->stream_tag); AC_VERB_SET_CHANNEL_STREAMID, pcm->stream_tag);
snd_hdac_codec_write(hdev, cvt->nid, 0, snd_hdac_codec_write(hdev, cvt->nid, 0,
AC_VERB_SET_STREAM_FORMAT, pcm->format); AC_VERB_SET_STREAM_FORMAT, pcm->format);
/*
* The connection indices are shared by all converters and
* may interfere with each other. Ensure correct
* routing for all converters at stream start.
*/
hdac_hdmi_verify_connect_sel_all_pins(hdev);
break; break;
case SND_SOC_DAPM_POST_PMD: case SND_SOC_DAPM_POST_PMD:

View File

@ -1880,6 +1880,10 @@ static void nau8825_init_regs(struct nau8825 *nau8825)
NAU8825_JACK_EJECT_DEBOUNCE_MASK, NAU8825_JACK_EJECT_DEBOUNCE_MASK,
nau8825->jack_eject_debounce << NAU8825_JACK_EJECT_DEBOUNCE_SFT); nau8825->jack_eject_debounce << NAU8825_JACK_EJECT_DEBOUNCE_SFT);
/* Pull up IRQ pin */
regmap_update_bits(regmap, NAU8825_REG_INTERRUPT_MASK,
NAU8825_IRQ_PIN_PULLUP | NAU8825_IRQ_PIN_PULL_EN,
NAU8825_IRQ_PIN_PULLUP | NAU8825_IRQ_PIN_PULL_EN);
/* Mask unneeded IRQs: 1 - disable, 0 - enable */ /* Mask unneeded IRQs: 1 - disable, 0 - enable */
regmap_update_bits(regmap, NAU8825_REG_INTERRUPT_MASK, 0x7ff, 0x7ff); regmap_update_bits(regmap, NAU8825_REG_INTERRUPT_MASK, 0x7ff, 0x7ff);

View File

@ -168,6 +168,8 @@
#define NAU8825_JACK_POLARITY (1 << 1) /* 0 - active low, 1 - active high */ #define NAU8825_JACK_POLARITY (1 << 1) /* 0 - active low, 1 - active high */
/* INTERRUPT_MASK (0xf) */ /* INTERRUPT_MASK (0xf) */
#define NAU8825_IRQ_PIN_PULLUP (1 << 14)
#define NAU8825_IRQ_PIN_PULL_EN (1 << 13)
#define NAU8825_IRQ_OUTPUT_EN (1 << 11) #define NAU8825_IRQ_OUTPUT_EN (1 << 11)
#define NAU8825_IRQ_HEADSET_COMPLETE_EN (1 << 10) #define NAU8825_IRQ_HEADSET_COMPLETE_EN (1 << 10)
#define NAU8825_IRQ_RMS_EN (1 << 8) #define NAU8825_IRQ_RMS_EN (1 << 8)

View File

@ -435,9 +435,6 @@ static int graph_for_each_link(struct asoc_simple_priv *priv,
codec_ep = of_graph_get_remote_endpoint(cpu_ep); codec_ep = of_graph_get_remote_endpoint(cpu_ep);
codec_port = of_get_parent(codec_ep); codec_port = of_get_parent(codec_ep);
of_node_put(codec_ep);
of_node_put(codec_port);
/* get convert-xxx property */ /* get convert-xxx property */
memset(&adata, 0, sizeof(adata)); memset(&adata, 0, sizeof(adata));
graph_parse_convert(dev, codec_ep, &adata); graph_parse_convert(dev, codec_ep, &adata);
@ -457,6 +454,9 @@ static int graph_for_each_link(struct asoc_simple_priv *priv,
else else
ret = func_noml(priv, cpu_ep, codec_ep, li); ret = func_noml(priv, cpu_ep, codec_ep, li);
of_node_put(codec_ep);
of_node_put(codec_port);
if (ret < 0) if (ret < 0)
return ret; return ret;

View File

@ -494,7 +494,7 @@ static int sof_audio_probe(struct platform_device *pdev)
int dmic_num, hdmi_num; int dmic_num, hdmi_num;
int ret, ssp_amp, ssp_codec; int ret, ssp_amp, ssp_codec;
ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_ATOMIC); ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
if (!ctx) if (!ctx)
return -ENOMEM; return -ENOMEM;

View File

@ -184,6 +184,25 @@ void skl_update_d0i3c(struct device *dev, bool enable)
snd_hdac_chip_readb(bus, VS_D0I3C)); snd_hdac_chip_readb(bus, VS_D0I3C));
} }
/**
* skl_dum_set - set DUM bit in EM2 register
* @bus: HD-audio core bus
*
* Addresses incorrect position reporting for capture streams.
* Used on device power up.
*/
static void skl_dum_set(struct hdac_bus *bus)
{
/* For the DUM bit to be set, CRST needs to be out of reset state */
if (!(snd_hdac_chip_readb(bus, GCTL) & AZX_GCTL_RESET)) {
skl_enable_miscbdcge(bus->dev, false);
snd_hdac_bus_exit_link_reset(bus);
skl_enable_miscbdcge(bus->dev, true);
}
snd_hdac_chip_updatel(bus, VS_EM2, AZX_VS_EM2_DUM, AZX_VS_EM2_DUM);
}
/* called from IRQ */ /* called from IRQ */
static void skl_stream_update(struct hdac_bus *bus, struct hdac_stream *hstr) static void skl_stream_update(struct hdac_bus *bus, struct hdac_stream *hstr)
{ {
@ -291,6 +310,7 @@ static int _skl_resume(struct hdac_bus *bus)
struct skl *skl = bus_to_skl(bus); struct skl *skl = bus_to_skl(bus);
skl_init_pci(skl); skl_init_pci(skl);
skl_dum_set(bus);
skl_init_chip(bus, true); skl_init_chip(bus, true);
return skl_resume_dsp(skl); return skl_resume_dsp(skl);
@ -948,6 +968,7 @@ static int skl_first_init(struct hdac_bus *bus)
/* initialize chip */ /* initialize chip */
skl_init_pci(skl); skl_init_pci(skl);
skl_dum_set(bus);
return skl_init_chip(bus, true); return skl_init_chip(bus, true);
} }

View File

@ -37,6 +37,7 @@
#define DMA_TRANSMITION_START 2 #define DMA_TRANSMITION_START 2
#define DMA_TRANSMITION_STOP 3 #define DMA_TRANSMITION_STOP 3
#define AZX_VS_EM2_DUM BIT(23)
#define AZX_REG_VS_EM2_L1SEN BIT(13) #define AZX_REG_VS_EM2_L1SEN BIT(13)
struct skl_dsp_resource { struct skl_dsp_resource {

View File

@ -40,7 +40,7 @@ struct axg_tdm_iface {
static inline bool axg_tdm_lrclk_invert(unsigned int fmt) static inline bool axg_tdm_lrclk_invert(unsigned int fmt)
{ {
return (fmt & SND_SOC_DAIFMT_I2S) ^ return ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S) ^
!!(fmt & (SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_NB_IF)); !!(fmt & (SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_NB_IF));
} }

View File

@ -121,7 +121,6 @@ static int axg_tdmin_prepare(struct regmap *map,
break; break;
case SND_SOC_DAIFMT_LEFT_J: case SND_SOC_DAIFMT_LEFT_J:
case SND_SOC_DAIFMT_RIGHT_J:
case SND_SOC_DAIFMT_DSP_B: case SND_SOC_DAIFMT_DSP_B:
break; break;

View File

@ -137,7 +137,6 @@ static int axg_tdmout_prepare(struct regmap *map,
break; break;
case SND_SOC_DAIFMT_LEFT_J: case SND_SOC_DAIFMT_LEFT_J:
case SND_SOC_DAIFMT_RIGHT_J:
case SND_SOC_DAIFMT_DSP_B: case SND_SOC_DAIFMT_DSP_B:
skew += 1; skew += 1;
break; break;

View File

@ -97,6 +97,7 @@ int qcom_snd_parse_of(struct snd_soc_card *card)
goto err; goto err;
} }
link->nonatomic = 1;
link->dpcm_playback = 1; link->dpcm_playback = 1;
link->dpcm_capture = 1; link->dpcm_capture = 1;
link->stream_name = link->name; link->stream_name = link->name;

View File

@ -158,9 +158,10 @@ static void soc_init_component_debugfs(struct snd_soc_component *component)
component->card->debugfs_card_root); component->card->debugfs_card_root);
} }
if (!component->debugfs_root) { if (IS_ERR(component->debugfs_root)) {
dev_warn(component->dev, dev_warn(component->dev,
"ASoC: Failed to create component debugfs directory\n"); "ASoC: Failed to create component debugfs directory: %ld\n",
PTR_ERR(component->debugfs_root));
return; return;
} }
@ -212,18 +213,21 @@ static void soc_init_card_debugfs(struct snd_soc_card *card)
card->debugfs_card_root = debugfs_create_dir(card->name, card->debugfs_card_root = debugfs_create_dir(card->name,
snd_soc_debugfs_root); snd_soc_debugfs_root);
if (!card->debugfs_card_root) { if (IS_ERR(card->debugfs_card_root)) {
dev_warn(card->dev, dev_warn(card->dev,
"ASoC: Failed to create card debugfs directory\n"); "ASoC: Failed to create card debugfs directory: %ld\n",
PTR_ERR(card->debugfs_card_root));
card->debugfs_card_root = NULL;
return; return;
} }
card->debugfs_pop_time = debugfs_create_u32("dapm_pop_time", 0644, card->debugfs_pop_time = debugfs_create_u32("dapm_pop_time", 0644,
card->debugfs_card_root, card->debugfs_card_root,
&card->pop_time); &card->pop_time);
if (!card->debugfs_pop_time) if (IS_ERR(card->debugfs_pop_time))
dev_warn(card->dev, dev_warn(card->dev,
"ASoC: Failed to create pop time debugfs file\n"); "ASoC: Failed to create pop time debugfs file: %ld\n",
PTR_ERR(card->debugfs_pop_time));
} }
static void soc_cleanup_card_debugfs(struct snd_soc_card *card) static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
@ -2837,14 +2841,12 @@ static void snd_soc_unbind_card(struct snd_soc_card *card, bool unregister)
snd_soc_dapm_shutdown(card); snd_soc_dapm_shutdown(card);
snd_soc_flush_all_delayed_work(card); snd_soc_flush_all_delayed_work(card);
mutex_lock(&client_mutex);
/* remove all components used by DAI links on this card */ /* remove all components used by DAI links on this card */
for_each_comp_order(order) { for_each_comp_order(order) {
for_each_card_rtds(card, rtd) { for_each_card_rtds(card, rtd) {
soc_remove_link_components(card, rtd, order); soc_remove_link_components(card, rtd, order);
} }
} }
mutex_unlock(&client_mutex);
soc_cleanup_card_resources(card); soc_cleanup_card_resources(card);
if (!unregister) if (!unregister)
@ -2863,7 +2865,9 @@ static void snd_soc_unbind_card(struct snd_soc_card *card, bool unregister)
*/ */
int snd_soc_unregister_card(struct snd_soc_card *card) int snd_soc_unregister_card(struct snd_soc_card *card)
{ {
mutex_lock(&client_mutex);
snd_soc_unbind_card(card, true); snd_soc_unbind_card(card, true);
mutex_unlock(&client_mutex);
dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name); dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name);
return 0; return 0;

View File

@ -2155,23 +2155,25 @@ void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm,
{ {
struct dentry *d; struct dentry *d;
if (!parent) if (!parent || IS_ERR(parent))
return; return;
dapm->debugfs_dapm = debugfs_create_dir("dapm", parent); dapm->debugfs_dapm = debugfs_create_dir("dapm", parent);
if (!dapm->debugfs_dapm) { if (IS_ERR(dapm->debugfs_dapm)) {
dev_warn(dapm->dev, dev_warn(dapm->dev,
"ASoC: Failed to create DAPM debugfs directory\n"); "ASoC: Failed to create DAPM debugfs directory %ld\n",
PTR_ERR(dapm->debugfs_dapm));
return; return;
} }
d = debugfs_create_file("bias_level", 0444, d = debugfs_create_file("bias_level", 0444,
dapm->debugfs_dapm, dapm, dapm->debugfs_dapm, dapm,
&dapm_bias_fops); &dapm_bias_fops);
if (!d) if (IS_ERR(d))
dev_warn(dapm->dev, dev_warn(dapm->dev,
"ASoC: Failed to create bias level debugfs file\n"); "ASoC: Failed to create bias level debugfs file: %ld\n",
PTR_ERR(d));
} }
static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w) static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w)
@ -2185,10 +2187,10 @@ static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w)
d = debugfs_create_file(w->name, 0444, d = debugfs_create_file(w->name, 0444,
dapm->debugfs_dapm, w, dapm->debugfs_dapm, w,
&dapm_widget_power_fops); &dapm_widget_power_fops);
if (!d) if (IS_ERR(d))
dev_warn(w->dapm->dev, dev_warn(w->dapm->dev,
"ASoC: Failed to create %s debugfs file\n", "ASoC: Failed to create %s debugfs file: %ld\n",
w->name); w->name, PTR_ERR(d));
} }
static void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm) static void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm)

View File

@ -2234,7 +2234,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
ret = edma_pcm_platform_register(&pdev->dev); ret = edma_pcm_platform_register(&pdev->dev);
break; break;
case PCM_SDMA: case PCM_SDMA:
ret = sdma_pcm_platform_register(&pdev->dev, NULL, NULL); ret = sdma_pcm_platform_register(&pdev->dev, "tx", "rx");
break; break;
default: default:
dev_err(&pdev->dev, "No DMA controller found (%d)\n", ret); dev_err(&pdev->dev, "No DMA controller found (%d)\n", ret);

View File

@ -1424,7 +1424,7 @@ static int asoc_mcbsp_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
return sdma_pcm_platform_register(&pdev->dev, NULL, NULL); return sdma_pcm_platform_register(&pdev->dev, "tx", "rx");
} }
static int asoc_mcbsp_remove(struct platform_device *pdev) static int asoc_mcbsp_remove(struct platform_device *pdev)