From patchwork Mon Dec 11 10:52:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Ughreja, Rakesh A" X-Patchwork-Id: 10104753 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BF44F602D8 for ; Mon, 11 Dec 2017 10:51:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CB32A2948E for ; Mon, 11 Dec 2017 10:51:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BFDC12953E; Mon, 11 Dec 2017 10:51:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7E4ED2948E for ; Mon, 11 Dec 2017 10:51:03 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id E5C77267652; Mon, 11 Dec 2017 11:50:34 +0100 (CET) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id E8E70267652; Mon, 11 Dec 2017 11:50:33 +0100 (CET) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by alsa0.perex.cz (Postfix) with ESMTP id 3B37B267556 for ; Mon, 11 Dec 2017 11:48:50 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Dec 2017 02:48:49 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.45,391,1508828400"; d="scan'208";a="11344604" Received: from raughrej-desk.iind.intel.com ([10.223.84.131]) by orsmga003.jf.intel.com with ESMTP; 11 Dec 2017 02:48:47 -0800 From: Rakesh Ughreja To: alsa-devel@alsa-project.org, broonie@kernel.org, tiwai@suse.de, liam.r.girdwood@linux.intel.com Date: Mon, 11 Dec 2017 16:22:59 +0530 Message-Id: <1512989583-10877-8-git-send-email-rakesh.a.ughreja@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1512989583-10877-1-git-send-email-rakesh.a.ughreja@intel.com> References: <1512989583-10877-1-git-send-email-rakesh.a.ughreja@intel.com> Cc: vinod.koul@intel.com, patches.audio@intel.com, Rakesh Ughreja , pierre-louis.bossart@linux.intel.com Subject: [alsa-devel] [RFC v2 07/11] ALSA: hda: add new API snd_hda_asoc_codec_new for ASoC codec drivers X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP Add API snd_hda_asoc_codec_new, to be called by generic ASoC codec driver to create the hda_codec instance. Signed-off-by: Rakesh Ughreja --- sound/pci/hda/hda_codec.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++ sound/pci/hda/hda_codec.h | 2 + 2 files changed, 102 insertions(+) diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 085fd9e..215b04d 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -965,6 +965,106 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, } EXPORT_SYMBOL_GPL(snd_hda_codec_new); +/* + * FIXME: + * This function is very simillar to snd_hda_codec_new, but requires + * some special change for ASoC based codec drivers. + * Both functions can be combined into one. + */ +int snd_hda_asoc_codec_new(struct hda_bus *bus, struct snd_card *card, + unsigned int codec_addr, struct hda_codec **codecp) +{ + struct hda_codec *codec = NULL; + hda_nid_t fg; + int err; + static struct snd_device_ops dev_ops = { + .dev_register = snd_hda_codec_dev_register, + .dev_disconnect = snd_hda_codec_dev_disconnect, + .dev_free = snd_hda_codec_dev_free, + }; + struct snd_device *snd_dev; + + if (snd_BUG_ON(!codecp)) + return -EINVAL; + if (snd_BUG_ON(!bus)) + return -EINVAL; + if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS)) + return -EINVAL; + + codec = *codecp; + + codec->core.exec_verb = codec_exec_verb; + codec->bus = bus; + codec->card = card; + codec->addr = codec_addr; + mutex_init(&codec->spdif_mutex); + mutex_init(&codec->control_mutex); + snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); + snd_array_init(&codec->nids, sizeof(struct hda_nid_item), 32); + snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16); + snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16); + snd_array_init(&codec->cvt_setups, sizeof(struct hda_cvt_setup), 8); + snd_array_init(&codec->spdif_out, sizeof(struct hda_spdif_out), 16); + snd_array_init(&codec->jacktbl, sizeof(struct hda_jack_tbl), 16); + snd_array_init(&codec->verbs, sizeof(struct hda_verb *), 8); + INIT_LIST_HEAD(&codec->conn_list); + INIT_LIST_HEAD(&codec->pcm_list_head); + + INIT_DELAYED_WORK(&codec->jackpoll_work, hda_jackpoll_work); + codec->depop_delay = -1; + codec->fixup_id = HDA_FIXUP_ID_NOT_SET; + +#ifdef CONFIG_PM + codec->power_jiffies = jiffies; +#endif + + if (codec->bus->modelname) { + codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL); + if (!codec->modelname) { + err = -ENOMEM; + goto error; + } + } + + fg = codec->core.afg ? codec->core.afg : codec->core.mfg; + err = read_widget_caps(codec, fg); + if (err < 0) + goto error; + + err = read_pin_defaults(codec); + if (err < 0) + goto error; + + /* power-up all before initialization */ + hda_set_power_state(codec, AC_PWRST_D0); + + snd_hda_codec_proc_new(codec); + + snd_hda_create_hwdep(codec); + + err = snd_device_new(card, SNDRV_DEV_CODEC, codec, &dev_ops); + if (err < 0) + goto error; + + list_for_each_entry(snd_dev, &card->devices, list) { + if (snd_dev->type == SNDRV_DEV_CODEC) { + void *device_data = snd_dev->device_data; + + err = snd_device_register(card, device_data); + if (err < 0) + dev_err(bus->core.dev, + "device_register_all failed err = %d\n", err); + } + } + + return 0; + +error: + put_device(hda_codec_dev(codec)); + return err; +} +EXPORT_SYMBOL_GPL(snd_hda_asoc_codec_new); + /** * snd_hda_codec_update_widgets - Refresh widget caps and pin defaults * @codec: the HDA codec diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index d3099db..d863092 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -307,6 +307,8 @@ struct hda_codec { */ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, unsigned int codec_addr, struct hda_codec **codecp); +int snd_hda_asoc_codec_new(struct hda_bus *bus, struct snd_card *card, + unsigned int codec_addr, struct hda_codec **codecp); int snd_hda_codec_configure(struct hda_codec *codec); int snd_hda_codec_update_widgets(struct hda_codec *codec);