From: Mark Brown Date: Tue, 27 May 2014 19:55:36 +0000 (+0100) Subject: Merge remote-tracking branches 'asoc/topic/mc13783', 'asoc/topic/multicodec', 'asoc... X-Git-Tag: next-20140530~63^2~2 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=49d5824d23a80ff396554c3676722d097816912b;p=karo-tx-linux.git Merge remote-tracking branches 'asoc/topic/mc13783', 'asoc/topic/multicodec', 'asoc/topic/nuc900', 'asoc/topic/omap', 'asoc/topic/pxa' and 'asoc/topic/rcar' into asoc-next --- 49d5824d23a80ff396554c3676722d097816912b diff --cc sound/soc/omap/ams-delta.c index 669f84d9b76e,56a5219c0a00,56a5219c0a00,56a5219c0a00,b0f8dbc1f635,56a5219c0a00,56a5219c0a00..bb243c663e6b --- a/sound/soc/omap/ams-delta.c +++ b/sound/soc/omap/ams-delta.c @@@@@@@@ -518,8 -520,29 -520,29 -520,29 -518,10 -520,29 -520,29 +518,8 @@@@@@@@ static int ams_delta_cx20442_init(struc return 0; } --- -- /* Add board specific DAPM widgets and routes */ --- -- ret = snd_soc_dapm_new_controls(dapm, ams_delta_dapm_widgets, --- -- ARRAY_SIZE(ams_delta_dapm_widgets)); --- -- if (ret) { --- -- dev_warn(card->dev, --- -- "Failed to register DAPM controls, " --- -- "will continue without any.\n"); --- -- return 0; --- -- } --- -- --- -- ret = snd_soc_dapm_add_routes(dapm, ams_delta_audio_map, --- -- ARRAY_SIZE(ams_delta_audio_map)); --- -- if (ret) { --- -- dev_warn(card->dev, --- -- "Failed to set up DAPM routes, " --- -- "will continue with codec default map.\n"); --- -- return 0; --- -- } --- -- /* Set up initial pin constellation */ snd_soc_dapm_disable_pin(dapm, "Mouthpiece"); ------ snd_soc_dapm_enable_pin(dapm, "Earpiece"); ------ snd_soc_dapm_enable_pin(dapm, "Microphone"); snd_soc_dapm_disable_pin(dapm, "Speaker"); snd_soc_dapm_disable_pin(dapm, "AGCIN"); snd_soc_dapm_disable_pin(dapm, "AGCOUT"); diff --cc sound/soc/soc-core.c index a53698266d57,051c006281f5,54a1d91f1d96,051c006281f5,448a60748523,051c006281f5,051c006281f5..6e460529fc89 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@@@@@@@ -1003,23 -995,6 -1010,24 -995,6 -995,6 -995,6 -995,6 +1003,23 @@@@@@@@ static void soc_remove_codec(struct snd module_put(codec->dev->driver->owner); } + ++++static void soc_remove_codec_dai(struct snd_soc_dai *codec_dai, int order) + ++++{ + ++++ int err; + ++++ + ++++ if (codec_dai && codec_dai->probed && + ++++ codec_dai->driver->remove_order == order) { + ++++ if (codec_dai->driver->remove) { + ++++ err = codec_dai->driver->remove(codec_dai); + ++++ if (err < 0) + ++++ dev_err(codec_dai->dev, + ++++ "ASoC: failed to remove %s: %d\n", + ++++ codec_dai->name, err); + ++++ } + ++++ codec_dai->probed = 0; - list_del(&codec_dai->card_list); + ++++ } + ++++} + ++++ static void soc_remove_link_dais(struct snd_soc_card *card, int num, int order) { struct snd_soc_pcm_runtime *rtd = &card->rtd[num]; @@@@@@@@ -1386,66 -1366,6 -1426,67 -1366,6 -1368,6 -1366,6 -1366,6 +1424,66 @@@@@@@@ static int soc_probe_link_components(st return 0; } + ++++static int soc_probe_codec_dai(struct snd_soc_card *card, + ++++ struct snd_soc_dai *codec_dai, + ++++ int order) + ++++{ + ++++ int ret; + ++++ + ++++ if (!codec_dai->probed && codec_dai->driver->probe_order == order) { + ++++ if (codec_dai->driver->probe) { + ++++ ret = codec_dai->driver->probe(codec_dai); + ++++ if (ret < 0) { + ++++ dev_err(codec_dai->dev, + ++++ "ASoC: failed to probe CODEC DAI %s: %d\n", + ++++ codec_dai->name, ret); + ++++ return ret; + ++++ } + ++++ } + ++++ + ++++ /* mark codec_dai as probed and add to card dai list */ + ++++ codec_dai->probed = 1; - list_add(&codec_dai->card_list, &card->dai_dev_list); + ++++ } + ++++ + ++++ return 0; + ++++} + ++++ + ++++static int soc_link_dai_widgets(struct snd_soc_card *card, + ++++ struct snd_soc_dai_link *dai_link, + ++++ struct snd_soc_dai *cpu_dai, + ++++ struct snd_soc_dai *codec_dai) + ++++{ + ++++ struct snd_soc_dapm_widget *play_w, *capture_w; + ++++ int ret; + ++++ + ++++ /* link the DAI widgets */ + ++++ play_w = codec_dai->playback_widget; + ++++ capture_w = cpu_dai->capture_widget; + ++++ if (play_w && capture_w) { + ++++ ret = snd_soc_dapm_new_pcm(card, dai_link->params, + ++++ capture_w, play_w); + ++++ if (ret != 0) { + ++++ dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n", + ++++ play_w->name, capture_w->name, ret); + ++++ return ret; + ++++ } + ++++ } + ++++ + ++++ play_w = cpu_dai->playback_widget; + ++++ capture_w = codec_dai->capture_widget; + ++++ if (play_w && capture_w) { + ++++ ret = snd_soc_dapm_new_pcm(card, dai_link->params, + ++++ capture_w, play_w); + ++++ if (ret != 0) { + ++++ dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n", + ++++ play_w->name, capture_w->name, ret); + ++++ return ret; + ++++ } + ++++ } + ++++ + ++++ return 0; + ++++} + ++++ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order) { struct snd_soc_dai_link *dai_link = &card->dai_link[num]; @@@@@@@@ -1591,44 -1539,21 -1634,26 -1539,21 -1541,38 -1539,21 -1539,21 +1629,44 @@@@@@@@ static void soc_unregister_ac97_codec(s codec->ac97_registered = 0; } } + ++++ + ++++static void soc_unregister_ac97_dai_link(struct snd_soc_pcm_runtime *rtd) + ++++{ + ++++ soc_unregister_ac97_codec(rtd->codec); + ++++} #endif --- --static int soc_check_aux_dev(struct snd_soc_card *card, int num) - struct snd_soc_codec *soc_find_matching_codec(struct snd_soc_card *card, int num) ++++++static struct snd_soc_codec *soc_find_matching_codec(struct snd_soc_card *card, ++++++ int num) { struct snd_soc_aux_dev *aux_dev = &card->aux_dev[num]; struct snd_soc_codec *codec; --- -- /* find CODEC from registered CODECs*/ +++ ++ /* find CODEC from registered CODECs */ list_for_each_entry(codec, &codec_list, list) { --- -- if (!strcmp(codec->name, aux_dev->codec_name)) --- -- return 0; +++ ++ if (aux_dev->codec_of_node && +++ ++ (codec->dev->of_node != aux_dev->codec_of_node)) +++ ++ continue; +++ ++ if (aux_dev->codec_name && strcmp(codec->name, aux_dev->codec_name)) +++ ++ continue; +++ ++ return codec; } --- -- dev_err(card->dev, "ASoC: %s not registered\n", aux_dev->codec_name); +++ ++ return NULL; +++ ++} + +++ ++static int soc_check_aux_dev(struct snd_soc_card *card, int num) +++ ++{ +++ ++ struct snd_soc_aux_dev *aux_dev = &card->aux_dev[num]; +++ ++ const char *codecname = aux_dev->codec_name; +++ ++ struct snd_soc_codec *codec = soc_find_matching_codec(card, num); + + ++ +++ ++ if (codec) +++ ++ return 0; +++ ++ if (aux_dev->codec_of_node) +++ ++ codecname = of_node_full_name(aux_dev->codec_of_node); +++ ++ +++ ++ dev_err(card->dev, "ASoC: %s not registered\n", codecname); return -EPROBE_DEFER; } @@@@@@@@ -2546,22 -2667,14 -2767,14 -2667,14 -2683,14 -2667,14 -2667,14 +2584,22 @@@@@@@@ static int snd_soc_read_signed(struct s int ret; unsigned int val; ------ val = (snd_soc_read(codec, reg) >> shift) & mask; ++++++ ret = snd_soc_component_read(component, reg, &val); ++++++ if (ret < 0) ++++++ return ret; + + - - -- if (!sign_bit) - - -- return val; ++++++ val = (val >> shift) & mask; + + ++ - - if (!sign_bit) - - return val; ++++++ if (!sign_bit) { ++++++ *signed_val = val; ++++++ return 0; ++++++ } /* non-negative number */ ------ if (!(val & BIT(sign_bit))) ------ return val; ++++++ if (!(val & BIT(sign_bit))) { ++++++ *signed_val = val; ++++++ return 0; ++++++ } ret = val; diff --cc sound/soc/soc-pcm.c index 903d737c352f,2cedf09f6d96,88230ea330d8,2cedf09f6d96,2cedf09f6d96,2cedf09f6d96,2cedf09f6d96..54d18f22a33e --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@@@@@@@ -1018,21 -1012,21 -1012,12 -1012,21 -1012,21 -1012,21 -1012,21 +1018,12 @@@@@@@@ static struct snd_soc_pcm_runtime *dpcm } static inline struct snd_soc_dapm_widget * -- ---- rtd_get_cpu_widget(struct snd_soc_pcm_runtime *rtd, int stream) - ----{ - ---- if (stream == SNDRV_PCM_STREAM_PLAYBACK) - ---- return rtd->cpu_dai->playback_widget; - ---- else - ---- return rtd->cpu_dai->capture_widget; - ----} - ---- - ----static inline struct snd_soc_dapm_widget * - ---- rtd_get_codec_widget(struct snd_soc_pcm_runtime *rtd, int stream) ++ ++++ dai_get_widget(struct snd_soc_dai *dai, int stream) { if (stream == SNDRV_PCM_STREAM_PLAYBACK) - return rtd->cpu_dai->playback_widget; - ---- return rtd->codec_dai->playback_widget; ++ ++++ return dai->playback_widget; else - return rtd->cpu_dai->capture_widget; - } - - static inline struct snd_soc_dapm_widget * - rtd_get_codec_widget(struct snd_soc_pcm_runtime *rtd, int stream) - { - if (stream == SNDRV_PCM_STREAM_PLAYBACK) - return rtd->codec_dai->playback_widget; - else -- ---- return rtd->codec_dai->capture_widget; ++ ++++ return dai->capture_widget; } static int widget_in_list(struct snd_soc_dapm_widget_list *list,