Skip to content

Commit b3e3e3e

Browse files
author
Fox Snowpatch
committed
1 parent 182544a commit b3e3e3e

5 files changed

Lines changed: 89 additions & 29 deletions

File tree

include/sound/soc-dapm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,7 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm, struct snd_s
635635
void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w);
636636
int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card);
637637
void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card);
638+
int snd_soc_dapm_ignore_suspend_widgets(struct snd_soc_card *card);
638639

639640
int snd_soc_dapm_update_dai(struct snd_pcm_substream *substream,
640641
struct snd_pcm_hw_params *params, struct snd_soc_dai *dai);

include/sound/soc.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,10 +1058,14 @@ struct snd_soc_card {
10581058
int num_dapm_widgets;
10591059
const struct snd_soc_dapm_route *dapm_routes;
10601060
int num_dapm_routes;
1061+
const char **ignore_suspend_widgets;
1062+
int num_ignore_suspend_widgets;
10611063
const struct snd_soc_dapm_widget *of_dapm_widgets;
10621064
int num_of_dapm_widgets;
10631065
const struct snd_soc_dapm_route *of_dapm_routes;
10641066
int num_of_dapm_routes;
1067+
const char **of_ignore_suspend_widgets;
1068+
int num_of_ignore_suspend_widgets;
10651069

10661070
/* lists of probed devices belonging to this card */
10671071
struct list_head component_dev_list;
@@ -1353,6 +1357,7 @@ void snd_soc_of_parse_audio_prefix(struct snd_soc_card *card,
13531357
int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
13541358
const char *propname);
13551359
int snd_soc_of_parse_aux_devs(struct snd_soc_card *card, const char *propname);
1360+
int snd_soc_of_parse_ignore_suspend_widgets(struct snd_soc_card *card, const char *propname);
13561361

13571362
unsigned int snd_soc_daifmt_clock_provider_flipped(unsigned int dai_fmt);
13581363
unsigned int snd_soc_daifmt_clock_provider_from_bitmap(unsigned int bit_frame);

sound/soc/fsl/imx-rpmsg.c

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ static int imx_rpmsg_late_probe(struct snd_soc_card *card)
4040
int ret;
4141

4242
if (data->lpa) {
43-
struct snd_soc_component *codec_comp;
4443
struct device_node *codec_np;
4544
struct device_driver *codec_drv;
4645
struct device *codec_dev = NULL;
@@ -60,22 +59,6 @@ static int imx_rpmsg_late_probe(struct snd_soc_card *card)
6059
}
6160
}
6261
if (codec_dev) {
63-
codec_comp = snd_soc_lookup_component_nolocked(codec_dev, NULL);
64-
if (codec_comp) {
65-
int i, num_widgets;
66-
const char *widgets;
67-
struct snd_soc_dapm_context *dapm;
68-
69-
num_widgets = of_property_count_strings(data->card.dev->of_node,
70-
"ignore-suspend-widgets");
71-
for (i = 0; i < num_widgets; i++) {
72-
of_property_read_string_index(data->card.dev->of_node,
73-
"ignore-suspend-widgets",
74-
i, &widgets);
75-
dapm = snd_soc_component_to_dapm(codec_comp);
76-
snd_soc_dapm_ignore_suspend(dapm, widgets);
77-
}
78-
}
7962
codec_drv = codec_dev->driver;
8063
if (codec_drv->pm) {
8164
memcpy(&lpa_pm, codec_drv->pm, sizeof(lpa_pm));
@@ -226,6 +209,15 @@ static int imx_rpmsg_probe(struct platform_device *pdev)
226209
}
227210
}
228211

212+
if (data->lpa && of_property_present(np, "ignore-suspend-widgets")) {
213+
ret = snd_soc_of_parse_ignore_suspend_widgets(&data->card,
214+
"ignore-suspend-widgets");
215+
if (ret) {
216+
dev_err(&pdev->dev, "failed to parse ignore-suspend-widgets: %d\n", ret);
217+
return ret;
218+
}
219+
}
220+
229221
platform_set_drvdata(pdev, &data->card);
230222
snd_soc_card_set_drvdata(&data->card, data);
231223
ret = devm_snd_soc_register_card(&pdev->dev, &data->card);

sound/soc/soc-core.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2292,6 +2292,10 @@ static int snd_soc_bind_card(struct snd_soc_card *card)
22922292
if (ret < 0)
22932293
goto probe_end;
22942294

2295+
ret = snd_soc_dapm_ignore_suspend_widgets(card);
2296+
if (ret < 0)
2297+
goto probe_end;
2298+
22952299
snd_soc_dapm_new_widgets(card);
22962300
snd_soc_card_fixup_controls(card);
22972301

@@ -3303,6 +3307,45 @@ int snd_soc_of_parse_aux_devs(struct snd_soc_card *card, const char *propname)
33033307
}
33043308
EXPORT_SYMBOL_GPL(snd_soc_of_parse_aux_devs);
33053309

3310+
int snd_soc_of_parse_ignore_suspend_widgets(struct snd_soc_card *card,
3311+
const char *propname)
3312+
{
3313+
struct device_node *np = card->dev->of_node;
3314+
int num_widgets;
3315+
const char **widgets;
3316+
int i;
3317+
3318+
num_widgets = of_property_count_strings(np, propname);
3319+
if (num_widgets < 0) {
3320+
dev_err(card->dev,
3321+
"ASoC: Property '%s' does not exist\n", propname);
3322+
return -EINVAL;
3323+
}
3324+
3325+
widgets = devm_kcalloc(card->dev, num_widgets, sizeof(char *), GFP_KERNEL);
3326+
if (!widgets)
3327+
return -ENOMEM;
3328+
3329+
for (i = 0; i < num_widgets; i++) {
3330+
const char *name;
3331+
int ret = of_property_read_string_index(np, propname, i, &name);
3332+
3333+
if (ret) {
3334+
dev_err(card->dev,
3335+
"ASoC: Property '%s' could not be read: %d\n",
3336+
propname, ret);
3337+
return -EINVAL;
3338+
}
3339+
widgets[i] = name;
3340+
}
3341+
3342+
card->num_of_ignore_suspend_widgets = num_widgets;
3343+
card->of_ignore_suspend_widgets = widgets;
3344+
3345+
return 0;
3346+
}
3347+
EXPORT_SYMBOL_GPL(snd_soc_of_parse_ignore_suspend_widgets);
3348+
33063349
unsigned int snd_soc_daifmt_clock_provider_flipped(unsigned int dai_fmt)
33073350
{
33083351
unsigned int inv_dai_fmt = dai_fmt & ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK;

sound/soc/soc-dapm.c

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2897,20 +2897,9 @@ static struct snd_soc_dapm_widget *dapm_find_widget(
28972897
{
28982898
struct snd_soc_dapm_widget *w;
28992899
struct snd_soc_dapm_widget *fallback = NULL;
2900-
char prefixed_pin[80];
2901-
const char *pin_name;
2902-
const char *prefix = dapm_prefix(dapm);
2903-
2904-
if (prefix) {
2905-
snprintf(prefixed_pin, sizeof(prefixed_pin), "%s %s",
2906-
prefix, pin);
2907-
pin_name = prefixed_pin;
2908-
} else {
2909-
pin_name = pin;
2910-
}
29112900

29122901
for_each_card_widgets(dapm->card, w) {
2913-
if (!strcmp(w->name, pin_name)) {
2902+
if (!snd_soc_dapm_widget_name_cmp(w, pin)) {
29142903
if (w->dapm == dapm)
29152904
return w;
29162905
else
@@ -4595,6 +4584,36 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
45954584
}
45964585
}
45974586

4587+
int snd_soc_dapm_ignore_suspend_widgets(struct snd_soc_card *card)
4588+
{
4589+
struct snd_soc_dapm_widget *w;
4590+
int i;
4591+
4592+
for (i = 0; i < card->num_ignore_suspend_widgets; i++) {
4593+
w = dapm_find_widget(snd_soc_card_to_dapm(card),
4594+
card->ignore_suspend_widgets[i], true);
4595+
if (!w) {
4596+
dev_err(card->dev, "ASoC: DAPM unknown ignore suspend widget %s\n",
4597+
card->ignore_suspend_widgets[i]);
4598+
return -EINVAL;
4599+
}
4600+
w->ignore_suspend = 1;
4601+
}
4602+
4603+
for (i = 0; i < card->num_of_ignore_suspend_widgets; i++) {
4604+
w = dapm_find_widget(snd_soc_card_to_dapm(card),
4605+
card->of_ignore_suspend_widgets[i], true);
4606+
if (!w) {
4607+
dev_err(card->dev, "ASoC: DAPM unknown ignore suspend widget %s\n",
4608+
card->of_ignore_suspend_widgets[i]);
4609+
return -EINVAL;
4610+
}
4611+
w->ignore_suspend = 1;
4612+
}
4613+
4614+
return 0;
4615+
}
4616+
45984617
static void dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream, int event)
45994618
{
46004619
struct snd_soc_dai *dai;

0 commit comments

Comments
 (0)