Commit bb9986ef authored by Vaibhav Agarwal's avatar Vaibhav Agarwal Committed by Greg Kroah-Hartman

greybus: audio: Reorganize sequence in GB audio bundle & codec driver

Modify sequence of register_module & unregister_module in bundle
driver. This would affect the uevent generated for above user
space. Accordingly, we need to modify snd_soc_xxx sequence in
register_module() in codec driver.
Signed-off-by: default avatarVaibhav Agarwal <vaibhav.agarwal@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 852859ab
...@@ -963,27 +963,27 @@ int gbaudio_register_module(struct gbaudio_module_info *module) ...@@ -963,27 +963,27 @@ int gbaudio_register_module(struct gbaudio_module_info *module)
/* card already instantiated, create widgets here only */ /* card already instantiated, create widgets here only */
if (codec->card->instantiated) { if (codec->card->instantiated) {
ret = snd_soc_dapm_new_widgets(&codec->dapm); snd_soc_dapm_link_component_dai_widgets(codec->card,
if (!ret) &codec->dapm);
snd_soc_dapm_link_component_dai_widgets(codec->card,
&codec->dapm);
}
#ifdef CONFIG_SND_JACK #ifdef CONFIG_SND_JACK
/* register jack devices for this module from codec->jack_list */ /* register jack devices for this module from codec->jack_list */
list_for_each_entry(jack, &codec->jack_list, list) { list_for_each_entry(jack, &codec->jack_list, list) {
if ((jack == &module->headset_jack) if ((jack == &module->headset_jack)
|| (jack == &module->button_jack)) || (jack == &module->button_jack))
snd_device_register(codec->card->snd_card, jack->jack); snd_device_register(codec->card->snd_card,
} jack->jack);
}
#endif #endif
}
list_add(&module->list, &gbcodec->module_list); list_add(&module->list, &gbcodec->module_list);
if (codec->card->instantiated)
ret = snd_soc_dapm_new_widgets(&codec->dapm);
dev_dbg(codec->dev, "Registered %s module\n", module->name); dev_dbg(codec->dev, "Registered %s module\n", module->name);
mutex_unlock(&gbcodec->lock); mutex_unlock(&gbcodec->lock);
up_write(&card->controls_rwsem); up_write(&card->controls_rwsem);
return 0; return ret;
} }
EXPORT_SYMBOL(gbaudio_register_module); EXPORT_SYMBOL(gbaudio_register_module);
...@@ -1060,11 +1060,10 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module) ...@@ -1060,11 +1060,10 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module)
dev_dbg(codec->dev, "Unregister %s module\n", module->name); dev_dbg(codec->dev, "Unregister %s module\n", module->name);
/* complete widget processing, if ongoing */
snd_soc_dapm_sync(&codec->dapm);
down_write(&card->controls_rwsem); down_write(&card->controls_rwsem);
mutex_lock(&gbcodec->lock); mutex_lock(&gbcodec->lock);
gbaudio_codec_cleanup(module);
list_del(&module->list);
dev_dbg(codec->dev, "Process Unregister %s module\n", module->name); dev_dbg(codec->dev, "Process Unregister %s module\n", module->name);
#ifdef CONFIG_SND_JACK #ifdef CONFIG_SND_JACK
...@@ -1078,8 +1077,6 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module) ...@@ -1078,8 +1077,6 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module)
} }
#endif #endif
gbaudio_codec_cleanup(module);
if (module->dapm_routes) { if (module->dapm_routes) {
dev_dbg(codec->dev, "Removing %d routes\n", dev_dbg(codec->dev, "Removing %d routes\n",
module->num_dapm_routes); module->num_dapm_routes);
...@@ -1099,7 +1096,6 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module) ...@@ -1099,7 +1096,6 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module)
module->num_dapm_widgets); module->num_dapm_widgets);
} }
list_del(&module->list);
dev_dbg(codec->dev, "Unregistered %s module\n", module->name); dev_dbg(codec->dev, "Unregistered %s module\n", module->name);
mutex_unlock(&gbcodec->lock); mutex_unlock(&gbcodec->lock);
......
...@@ -308,18 +308,22 @@ static int gb_audio_probe(struct gb_bundle *bundle, ...@@ -308,18 +308,22 @@ static int gb_audio_probe(struct gb_bundle *bundle,
} }
gbmodule->topology = topology; gbmodule->topology = topology;
/* register module with gbcodec */
ret = gbaudio_register_module(gbmodule);
if (ret)
goto release_topology;
/* Initialize data connections */ /* Initialize data connections */
list_for_each_entry(dai, &gbmodule->data_list, list) { list_for_each_entry(dai, &gbmodule->data_list, list) {
ret = gb_connection_enable(dai->connection); ret = gb_connection_enable(dai->connection);
if (ret) if (ret) {
dev_err(dev,
"%d:Error while enabling %d:data connection\n",
ret, dai->data_cport);
goto disable_data_connection; goto disable_data_connection;
}
} }
/* register module with gbcodec */
ret = gbaudio_register_module(gbmodule);
if (ret)
goto disable_data_connection;
/* inform above layer for uevent */ /* inform above layer for uevent */
dev_dbg(dev, "Inform set_event:%d to above layer\n", 1); dev_dbg(dev, "Inform set_event:%d to above layer\n", 1);
/* prepare for the audio manager */ /* prepare for the audio manager */
...@@ -339,9 +343,6 @@ static int gb_audio_probe(struct gb_bundle *bundle, ...@@ -339,9 +343,6 @@ static int gb_audio_probe(struct gb_bundle *bundle,
disable_data_connection: disable_data_connection:
list_for_each_entry_safe(dai, _dai, &gbmodule->data_list, list) list_for_each_entry_safe(dai, _dai, &gbmodule->data_list, list)
gb_connection_disable(dai->connection); gb_connection_disable(dai->connection);
gbaudio_unregister_module(gbmodule);
release_topology:
gbaudio_tplg_release(gbmodule); gbaudio_tplg_release(gbmodule);
gbmodule->topology = NULL; gbmodule->topology = NULL;
...@@ -371,11 +372,11 @@ static void gb_audio_disconnect(struct gb_bundle *bundle) ...@@ -371,11 +372,11 @@ static void gb_audio_disconnect(struct gb_bundle *bundle)
struct gbaudio_module_info *gbmodule = greybus_get_drvdata(bundle); struct gbaudio_module_info *gbmodule = greybus_get_drvdata(bundle);
struct gbaudio_data_connection *dai, *_dai; struct gbaudio_data_connection *dai, *_dai;
gbaudio_unregister_module(gbmodule);
/* inform uevent to above layers */ /* inform uevent to above layers */
gb_audio_manager_remove(gbmodule->manager_id); gb_audio_manager_remove(gbmodule->manager_id);
gbaudio_unregister_module(gbmodule);
gbaudio_tplg_release(gbmodule); gbaudio_tplg_release(gbmodule);
gbmodule->topology = NULL; gbmodule->topology = NULL;
kfree(gbmodule->topology); kfree(gbmodule->topology);
......
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