参照元

説明

引数

返り値

参考

実装

/**
 * snd_soc_register_codec - Register a codec with the ASoC core
 *
 * @dev: The parent device for this codec
 * @codec_drv: Codec driver
 * @dai_drv: The associated DAI driver
 * @num_dai: Number of DAIs
 */
int snd_soc_register_codec(struct device *dev,
                           const struct snd_soc_codec_driver *codec_drv,
                           struct snd_soc_dai_driver *dai_drv,
                           int num_dai)
{
        struct snd_soc_dapm_context *dapm;
        struct snd_soc_codec *codec;
        struct snd_soc_dai *dai;
        int ret, i;
        dev_dbg(dev, "codec register %s\n", dev_name(dev));
        codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
        if (codec == NULL)
                return -ENOMEM;

        codec->component.codec = codec;
        ret = snd_soc_component_initialize(&codec->component,
                        &codec_drv->component_driver, dev);
        if (ret)
                goto err_free;
        if (codec_drv->controls) {
                codec->component.controls = codec_drv->controls;
                codec->component.num_controls = codec_drv->num_controls;
        }
        if (codec_drv->dapm_widgets) {
                codec->component.dapm_widgets = codec_drv->dapm_widgets;
                codec->component.num_dapm_widgets = codec_drv->num_dapm_widgets;
        }
        if (codec_drv->dapm_routes) {
                codec->component.dapm_routes = codec_drv->dapm_routes;
                codec->component.num_dapm_routes = codec_drv->num_dapm_routes;
        }
        if (codec_drv->probe)
                codec->component.probe = snd_soc_codec_drv_probe;
        if (codec_drv->remove)
                codec->component.remove = snd_soc_codec_drv_remove;
        if (codec_drv->write)
                codec->component.write = snd_soc_codec_drv_write;
        if (codec_drv->read)
                codec->component.read = snd_soc_codec_drv_read;
        codec->component.ignore_pmdown_time = codec_drv->ignore_pmdown_time;
        dapm = snd_soc_codec_get_dapm(codec);
        dapm->idle_bias_off = codec_drv->idle_bias_off;
        dapm->suspend_bias_off = codec_drv->suspend_bias_off;
        if (codec_drv->seq_notifier)
                dapm->seq_notifier = codec_drv->seq_notifier;
        if (codec_drv->set_bias_level)
                dapm->set_bias_level = snd_soc_codec_set_bias_level;
        codec->dev = dev;
        codec->driver = codec_drv;
        codec->component.val_bytes = codec_drv->reg_word_size;

#ifdef CONFIG_DEBUG_FS
        codec->component.init_debugfs = soc_init_codec_debugfs;
        codec->component.debugfs_prefix = "codec";
#endif

        if (codec_drv->get_regmap)
                codec->component.regmap = codec_drv->get_regmap(dev);
        for (i = 0; i < num_dai; i++) {
                fixup_codec_formats(&dai_drv[i].playback);
                fixup_codec_formats(&dai_drv[i].capture);
        }
        ret = snd_soc_register_dais(&codec->component, dai_drv, num_dai, false);
        if (ret < 0) {
                dev_err(dev, "ASoC: Failed to register DAIs: %d\n", ret);
                goto err_cleanup;
        }
        list_for_each_entry(dai, &codec->component.dai_list, list)
                dai->codec = codec;
        mutex_lock(&client_mutex);
        snd_soc_component_add_unlocked(&codec->component);
        list_add(&codec->list, &codec_list);
        mutex_unlock(&client_mutex);
        dev_dbg(codec->dev, "ASoC: Registered codec '%s'\n",
                codec->component.name);
        return 0;

err_cleanup:
        snd_soc_component_cleanup(&codec->component);
err_free:
        kfree(codec);
        return ret;
}
EXPORT_SYMBOL_GPL(snd_soc_register_codec);

コメント


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-06-17 (土) 16:12:20