From patchwork Mon Feb 17 10:21:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cezary Rojewski X-Patchwork-Id: 13977449 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A525217640 for ; Mon, 17 Feb 2025 10:07:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786845; cv=none; b=NWnPZi92Fr/9cNi0lLB9ThRNLoMOWoLOsGvxuT9nIA8M1iqPBPNPDbUNmkhRw46QstkQLMfGDu+i8xsIGtjADQes4a5z350z4hAfDtFfi+wtnAEQ0N4MgGEUbw8dVMjorGwvLzaAPqF85uKS8mjV1oTAVxsAdspHLfUg9gBaB9s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786845; c=relaxed/simple; bh=qKrmFCBEgtqtvdzp713AgRbN8E46ev7KL/H1e3DRpTw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=mvn3r1J+qkAhCSf/j2ujAyLli5gUskRfvbHYEqBnuO+xfZDp5I/ULQRJliYNil3rAzhMOEkig4uJEKVanNIBc0gU2ZI4CPMt674YrD1HcvLpeRDXUUpzby0aCDYqmj62503Yr1ZjNMdBpD1eccmxu/Yum1uNH/I2Cr9dkRXIW0w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=lLNJ0Ewm; arc=none smtp.client-ip=192.198.163.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="lLNJ0Ewm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1739786844; x=1771322844; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=qKrmFCBEgtqtvdzp713AgRbN8E46ev7KL/H1e3DRpTw=; b=lLNJ0EwmjhHxbGZvN3eKArWiUxYHxNPuLJ1KAVqwW0Y95KMKmS20iL0y uG7Z1LI4NBJmXzm7SQkKCkv8wfMKKWowNazuYJKDbFh2Sfny2nvoIfENt 7jDBshvs6Q3bDoetZup4GeruXpZ+deApzj/9ibpu4whNVOq6I0iPKDGy8 0WwuLwBTXPKYTfCtwtv2rCDSV6U5axxVDYpVxCebS805VuCiqHmgQDOWs acfZEIv5D61yj6kiXyy1gZ2IHYnR8fIS9rSAz3pt0rIaKyekYWb0qYu3w HMYCXDsivperKbL3WCqvbpzAHSVqd8W6f84kETxyGPqvnnrZ07pY75uP2 g==; X-CSE-ConnectionGUID: w/l78jxHSo2GSZq+nNsG8w== X-CSE-MsgGUID: x4/ZxWMcSAiqC9KWYBNWxA== X-IronPort-AV: E=McAfee;i="6700,10204,11347"; a="65818284" X-IronPort-AV: E=Sophos;i="6.13,292,1732608000"; d="scan'208";a="65818284" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2025 02:07:23 -0800 X-CSE-ConnectionGUID: q6S+kMzZSN+Nyh/dFOCLHA== X-CSE-MsgGUID: gPGgLni1Qf2tdJ0fuC3Y7w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="118219049" Received: from crojewsk-ctrl.igk.intel.com ([10.237.149.254]) by fmviesa003.fm.intel.com with ESMTP; 17 Feb 2025 02:07:21 -0800 From: Cezary Rojewski To: broonie@kernel.org Cc: tiwai@suse.com, perex@perex.cz, amadeuszx.slawinski@linux.intel.com, linux-sound@vger.kernel.org, Cezary Rojewski Subject: [PATCH 01/10] ASoC: topology: Create kcontrols based on their type Date: Mon, 17 Feb 2025 11:21:06 +0100 Message-Id: <20250217102115.3539427-2-cezary.rojewski@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250217102115.3539427-1-cezary.rojewski@intel.com> References: <20250217102115.3539427-1-cezary.rojewski@intel.com> Precedence: bulk X-Mailing-List: linux-sound@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Fields ->ops.info and ->type of struct snd_soc_tplg_ctl_hdr denote info-operation type and control type respectively. These are two different pieces of information. The info type is represented by SND_SOC_TPLG_CTL_xxx and SND_SOC_TPLG_DAPM_CTL_xxx on UAPI side whereas for control type it is SND_SOC_TPLG_TYPE_xxx (mixer, bytes or enum). The type of the kcontrol to be created is currently guessed based on the value of the ->ops.info. Use the ->type instead to correct and simplify the code. With this change ops.info() can be customized by sound drivers utilizing the ASoC-topology just like ops.get() and ops.put() can be. Signed-off-by: Cezary Rojewski --- sound/soc/soc-topology.c | 54 +++++++++++----------------------------- 1 file changed, 14 insertions(+), 40 deletions(-) diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c index 9f4da061eff9..921521a84e29 100644 --- a/sound/soc/soc-topology.c +++ b/sound/soc/soc-topology.c @@ -220,15 +220,6 @@ static int get_widget_id(int tplg_type) return -EINVAL; } -static inline void soc_bind_err(struct soc_tplg *tplg, - struct snd_soc_tplg_ctl_hdr *hdr, int index) -{ - dev_err(tplg->dev, - "ASoC: invalid control type (g,p,i) %d:%d:%d index %d at 0x%lx\n", - hdr->ops.get, hdr->ops.put, hdr->ops.info, index, - soc_tplg_get_offset(tplg)); -} - static inline void soc_control_err(struct soc_tplg *tplg, struct snd_soc_tplg_ctl_hdr *hdr, const char *name) { @@ -992,35 +983,26 @@ static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg, return -EINVAL; } - switch (le32_to_cpu(control_hdr->ops.info)) { - case SND_SOC_TPLG_CTL_VOLSW: - case SND_SOC_TPLG_CTL_STROBE: - case SND_SOC_TPLG_CTL_VOLSW_SX: - case SND_SOC_TPLG_CTL_VOLSW_XR_SX: - case SND_SOC_TPLG_CTL_RANGE: - case SND_SOC_TPLG_DAPM_CTL_VOLSW: - case SND_SOC_TPLG_DAPM_CTL_PIN: + switch (le32_to_cpu(control_hdr->type)) { + case SND_SOC_TPLG_TYPE_MIXER: ret = soc_tplg_dmixer_create(tplg, le32_to_cpu(hdr->payload_size)); break; - case SND_SOC_TPLG_CTL_ENUM: - case SND_SOC_TPLG_CTL_ENUM_VALUE: - case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE: - case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: - case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: + case SND_SOC_TPLG_TYPE_ENUM: ret = soc_tplg_denum_create(tplg, le32_to_cpu(hdr->payload_size)); break; - case SND_SOC_TPLG_CTL_BYTES: + case SND_SOC_TPLG_TYPE_BYTES: ret = soc_tplg_dbytes_create(tplg, le32_to_cpu(hdr->payload_size)); break; default: - soc_bind_err(tplg, control_hdr, i); - return -EINVAL; + ret = -EINVAL; + break; } + if (ret < 0) { - dev_err(tplg->dev, "ASoC: invalid control\n"); + dev_err(tplg->dev, "ASoC: invalid control type: %d, index: %d at 0x%lx\n", + control_hdr->type, i, soc_tplg_get_offset(tplg)); return ret; } - } return 0; @@ -1184,13 +1166,9 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, for (i = 0; i < le32_to_cpu(w->num_kcontrols); i++) { control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; - switch (le32_to_cpu(control_hdr->ops.info)) { - case SND_SOC_TPLG_CTL_VOLSW: - case SND_SOC_TPLG_CTL_STROBE: - case SND_SOC_TPLG_CTL_VOLSW_SX: - case SND_SOC_TPLG_CTL_VOLSW_XR_SX: - case SND_SOC_TPLG_CTL_RANGE: - case SND_SOC_TPLG_DAPM_CTL_VOLSW: + + switch (le32_to_cpu(control_hdr->type)) { + case SND_SOC_TPLG_TYPE_MIXER: /* volume mixer */ kc[i].index = mixer_count; kcontrol_type[i] = SND_SOC_TPLG_TYPE_MIXER; @@ -1199,11 +1177,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, if (ret < 0) goto hdr_err; break; - case SND_SOC_TPLG_CTL_ENUM: - case SND_SOC_TPLG_CTL_ENUM_VALUE: - case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE: - case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: - case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: + case SND_SOC_TPLG_TYPE_ENUM: /* enumerated mixer */ kc[i].index = enum_count; kcontrol_type[i] = SND_SOC_TPLG_TYPE_ENUM; @@ -1212,7 +1186,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, if (ret < 0) goto hdr_err; break; - case SND_SOC_TPLG_CTL_BYTES: + case SND_SOC_TPLG_TYPE_BYTES: /* bytes control */ kc[i].index = bytes_count; kcontrol_type[i] = SND_SOC_TPLG_TYPE_BYTES; From patchwork Mon Feb 17 10:21:07 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cezary Rojewski X-Patchwork-Id: 13977450 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BA580216E1B for ; Mon, 17 Feb 2025 10:07:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786846; cv=none; b=TLUNIfNsSt6jAZ+t6c//a7RyVtVz3PTvPDR5pu4Tsxig3I81gQm03Hgr2Q5CjuoFDt8a6tNcZeiH57smMcoXEl+JlC4btS9DDqW0CY4UTXfurP0A36eXdxc/pLUxv41l1UsHJJKP8M0eGMZ/CfcGhsXJoGwtq/ZQBNVDFuY3CJI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786846; c=relaxed/simple; bh=Rqi4qyL2yKN31RE/eSo76dsJ5aumcqnHsfhCJBzsp4I=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Dlzl5RdYb9c9G/K0lDsTL+Uk4OOVY0y8+c2ueT6PFFvWwdP9N1eHmufBKroyfbkFldCYm+mpVd88Tc6ZYQc7L0ou60sbRoG49J47zmSDkkLjzBRcV6pdOQ8idzJ2YdLDBaq0RVU63AHIzGTYqB20Ux7+9iNlKoYNArQoE3qmvFs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=V6NYs+aD; arc=none smtp.client-ip=192.198.163.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="V6NYs+aD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1739786845; x=1771322845; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Rqi4qyL2yKN31RE/eSo76dsJ5aumcqnHsfhCJBzsp4I=; b=V6NYs+aDnZK6bEKDe+4t6lOCbie1YLMyxLrz89HdiGaD6bVohg7vSGjV WEH+LsdGz3Ye+HjqSXZ2u77vxF7X6UlymgY61CVRGG8Qid0ePDeWnFkG1 YEQRdKWJkx8oTERvp2NO1aiBS/wBdJJOaRTypdI6PCTvc3AuMF+sOaa9S zxUZvTyg3RY5kR8U82MJQkffP5rSfAqkbw8eScKtwRVR9MsK5YETW3BKw 21R4hK0+J/XFy9RTgF/Zudon97PB7PyEhKuGjnuU12sxfGmYUldGerWY6 B1iHI536ZKOxQuLUI+bTmfQAY4VhGgJWHI230/1We+1s2fz142uxF32O9 w==; X-CSE-ConnectionGUID: d4H3Xxd/SCSuWzqHhV6DPw== X-CSE-MsgGUID: 1VxLTJSiTv2XgrM08cd/Uw== X-IronPort-AV: E=McAfee;i="6700,10204,11347"; a="65818289" X-IronPort-AV: E=Sophos;i="6.13,292,1732608000"; d="scan'208";a="65818289" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2025 02:07:25 -0800 X-CSE-ConnectionGUID: VLK50K2RSC+bqS5N+w9xhA== X-CSE-MsgGUID: V92Wr2kARry3fh5VAlXNmg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="118219052" Received: from crojewsk-ctrl.igk.intel.com ([10.237.149.254]) by fmviesa003.fm.intel.com with ESMTP; 17 Feb 2025 02:07:23 -0800 From: Cezary Rojewski To: broonie@kernel.org Cc: tiwai@suse.com, perex@perex.cz, amadeuszx.slawinski@linux.intel.com, linux-sound@vger.kernel.org, Cezary Rojewski Subject: [PATCH 02/10] ASoC: topology: Save num_channels value for mixer controls Date: Mon, 17 Feb 2025 11:21:07 +0100 Message-Id: <20250217102115.3539427-3-cezary.rojewski@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250217102115.3539427-1-cezary.rojewski@intel.com> References: <20250217102115.3539427-1-cezary.rojewski@intel.com> Precedence: bulk X-Mailing-List: linux-sound@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To provide minimal support for multi-channel kcontrols i.e.: more than stereo configuration, store the number of channels specified within the SectionControlMixer. The field is part of the topology standard, currently skipped by the ASoC core. Signed-off-by: Cezary Rojewski --- include/sound/soc.h | 1 + sound/soc/soc-topology.c | 1 + 2 files changed, 2 insertions(+) diff --git a/include/sound/soc.h b/include/sound/soc.h index 16e4e488521c..8931c24d9bb9 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -1265,6 +1265,7 @@ struct soc_mixer_control { int min, max, platform_max; int reg, rreg; unsigned int shift, rshift; + u32 num_channels; unsigned int sign_bit; unsigned int invert:1; unsigned int autodisable:1; diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c index 921521a84e29..2b86cc3311f7 100644 --- a/sound/soc/soc-topology.c +++ b/sound/soc/soc-topology.c @@ -669,6 +669,7 @@ static int soc_tplg_control_dmixer_create(struct soc_tplg *tplg, struct snd_kcon sm->min = le32_to_cpu(mc->min); sm->invert = le32_to_cpu(mc->invert); sm->platform_max = le32_to_cpu(mc->platform_max); + sm->num_channels = le32_to_cpu(mc->num_channels); /* map io handlers */ err = soc_tplg_kcontrol_bind_io(&mc->hdr, kc, tplg); From patchwork Mon Feb 17 10:21:08 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cezary Rojewski X-Patchwork-Id: 13977451 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9BB4D216E3D for ; Mon, 17 Feb 2025 10:07:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786848; cv=none; b=UIel3ZTEY6yPlh4DFrf7nu+t/sfnKPNlGk23b+DG35Nh88Xh1gdJI6+PVYjWtZKbr6bt2JSv67Ziu/DIjpScL1ki0xKNpgo0aeT+sQ3KL6UiIqEWVgheLfy3o2oxPcYYwDRmjuEoNwyGylvn8rVTD2zgioGWjx6Pme39UtjXA94= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786848; c=relaxed/simple; bh=fBvEsiCMIUJtjp7bTeteXWv2BjRuhe53deQjU/fFi4k=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GJ70dqsSnuuEwzjqN9HB49f4lYZmd7P7gf2Mcpt+ncyAKw/rCIKLRd0kq3DYIqtPgX6JjfZPUtrcIBKyDbiX6QwxHyPsgUxf1mJK63EymeBn1f1jf/Pe6A/I8Q0rdrxdzlPSgvpl6uLZNjgd4cZ6gWpinRG/SaCMxDApmiQ8l60= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=dg5G/HUl; arc=none smtp.client-ip=192.198.163.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="dg5G/HUl" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1739786847; x=1771322847; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=fBvEsiCMIUJtjp7bTeteXWv2BjRuhe53deQjU/fFi4k=; b=dg5G/HUl7TbMq3zUykvuN79Abaqmif/uZ4mmVjPLRzjKbEJRWYSlqM/g 3UKuWPvbgtdtnJ/hIfRFNiGumTVBXFI/lNCDR6YU1QtaGYoChxe6DoHgl /PrRNsbM2UNfdGhfScijOS3s9/YJ3WyRveqS9VIJAPX2CjuDiW8NX+y3L KcKqaCrs6LWbGoEQb/CLfVh3Uj4R0CkfdOY8Bvbuw0BDDtNuwEPTA1ThY wOEZRmizj6LN+Y0od+EzmyYaMVTa4WPQhDuzpKpql2H1dplxXgfIagBZ0 uIijEMN5e6ICETAYhFdq1A4b1K/M5Ccs4SJfsvGqVAO9Efs9S0LPv+iMM w==; X-CSE-ConnectionGUID: DebyrY7sTaG8Dkhu4EF6mw== X-CSE-MsgGUID: x14TyU70TW+HETe5np5PRw== X-IronPort-AV: E=McAfee;i="6700,10204,11347"; a="65818297" X-IronPort-AV: E=Sophos;i="6.13,292,1732608000"; d="scan'208";a="65818297" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2025 02:07:26 -0800 X-CSE-ConnectionGUID: L97tmUHrTA+Zar/0vd8erA== X-CSE-MsgGUID: a6wB9xqzQb2MFR8rv/U8EA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="118219055" Received: from crojewsk-ctrl.igk.intel.com ([10.237.149.254]) by fmviesa003.fm.intel.com with ESMTP; 17 Feb 2025 02:07:25 -0800 From: Cezary Rojewski To: broonie@kernel.org Cc: tiwai@suse.com, perex@perex.cz, amadeuszx.slawinski@linux.intel.com, linux-sound@vger.kernel.org, Cezary Rojewski Subject: [PATCH 03/10] ASoC: Intel: avs: Make PEAKVOL configurable from topology Date: Mon, 17 Feb 2025 11:21:08 +0100 Message-Id: <20250217102115.3539427-4-cezary.rojewski@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250217102115.3539427-1-cezary.rojewski@intel.com> References: <20250217102115.3539427-1-cezary.rojewski@intel.com> Precedence: bulk X-Mailing-List: linux-sound@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 The driver exposes volume kcontrols if PEAKVOL/GAIN module is present in the streaming path. Currently there is no control over their default values including the effect that may accompany the volume change event. Add template for PEAKVOL/GAIN module which holds all the information needed to address the limitation. Signed-off-by: Cezary Rojewski --- include/uapi/sound/intel/avs/tokens.h | 4 ++++ sound/soc/intel/avs/path.c | 4 ++-- sound/soc/intel/avs/topology.c | 18 ++++++++++++++++++ sound/soc/intel/avs/topology.h | 5 +++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/uapi/sound/intel/avs/tokens.h b/include/uapi/sound/intel/avs/tokens.h index 06ff30537f47..c9f845b3c523 100644 --- a/include/uapi/sound/intel/avs/tokens.h +++ b/include/uapi/sound/intel/avs/tokens.h @@ -84,6 +84,10 @@ enum avs_tplg_token { AVS_TKN_MODCFG_WHM_DMA_TYPE_U32 = 437, AVS_TKN_MODCFG_WHM_DMABUFF_SIZE_U32 = 438, AVS_TKN_MODCFG_WHM_BLOB_AFMT_ID_U32 = 439, + AVS_TKN_MODCFG_PEAKVOL_VOLUME_U32 = 440, + AVS_TKN_MODCFG_PEAKVOL_CHANNEL_ID_U32 = 441, /* reserved */ + AVS_TKN_MODCFG_PEAKVOL_CURVE_TYPE_U32 = 442, + AVS_TKN_MODCFG_PEAKVOL_CURVE_DURATION_U32 = 443, /* struct avs_tplg_pplcfg */ AVS_TKN_PPLCFG_ID_U32 = 1401, diff --git a/sound/soc/intel/avs/path.c b/sound/soc/intel/avs/path.c index dfb85bd2b665..329838119015 100644 --- a/sound/soc/intel/avs/path.c +++ b/sound/soc/intel/avs/path.c @@ -350,8 +350,8 @@ static int avs_peakvol_create(struct avs_dev *adev, struct avs_path_module *mod) cfg->base.audio_fmt = *t->in_fmt; cfg->vols[0].target_volume = volume; cfg->vols[0].channel_id = AVS_ALL_CHANNELS_MASK; - cfg->vols[0].curve_type = AVS_AUDIO_CURVE_NONE; - cfg->vols[0].curve_duration = 0; + cfg->vols[0].curve_type = t->cfg_ext->peakvol.curve_type; + cfg->vols[0].curve_duration = t->cfg_ext->peakvol.curve_duration; ret = avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, t->core_id, t->domain, cfg, cfg_size, &mod->instance_id); diff --git a/sound/soc/intel/avs/topology.c b/sound/soc/intel/avs/topology.c index 471b00b9a149..45952fbe9694 100644 --- a/sound/soc/intel/avs/topology.c +++ b/sound/soc/intel/avs/topology.c @@ -857,6 +857,24 @@ static const struct avs_tplg_token_parser modcfg_ext_parsers[] = { .offset = offsetof(struct avs_tplg_modcfg_ext, whm.blob_fmt), .parse = avs_parse_audio_format_ptr, }, + { + .token = AVS_TKN_MODCFG_PEAKVOL_VOLUME_U32, + .type = SND_SOC_TPLG_TUPLE_TYPE_WORD, + .offset = offsetof(struct avs_tplg_modcfg_ext, peakvol.target_volume), + .parse = avs_parse_word_token, + }, + { + .token = AVS_TKN_MODCFG_PEAKVOL_CURVE_TYPE_U32, + .type = SND_SOC_TPLG_TUPLE_TYPE_WORD, + .offset = offsetof(struct avs_tplg_modcfg_ext, peakvol.curve_type), + .parse = avs_parse_word_token, + }, + { + .token = AVS_TKN_MODCFG_PEAKVOL_CURVE_DURATION_U32, + .type = SND_SOC_TPLG_TUPLE_TYPE_WORD, + .offset = offsetof(struct avs_tplg_modcfg_ext, peakvol.curve_duration), + .parse = avs_parse_word_token, + }, }; static const struct avs_tplg_token_parser pin_format_parsers[] = { diff --git a/sound/soc/intel/avs/topology.h b/sound/soc/intel/avs/topology.h index 23d5ccd19959..304880997717 100644 --- a/sound/soc/intel/avs/topology.h +++ b/sound/soc/intel/avs/topology.h @@ -113,6 +113,11 @@ struct avs_tplg_modcfg_ext { struct { struct avs_audio_format *out_fmt; } micsel; + struct { + u32 target_volume; + u32 curve_type; + u32 curve_duration; + } peakvol; }; }; From patchwork Mon Feb 17 10:21:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Cezary Rojewski X-Patchwork-Id: 13977452 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A2D62163BE for ; Mon, 17 Feb 2025 10:07:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786849; cv=none; b=PnFUcH/HuIMv77yyLWfgT0Gbo3H0r3AiTXclBkE51zNcwztc2gQEk0TUK6bzY2QxZmy0Q3qcs22lp4eusM5YsFV9uEiP4BigGEMGP0XnpfAJ4OdNPbQBEtNZz+4PZTd953qksWRoMNhGupC273NPBxESue/Vuk+Zknq8BdNDODc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786849; c=relaxed/simple; bh=VSFQ1+OqMh45NluE6eD9gJk608lQBlfkAs2964sulyU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=K1rhztknMabjL0RE3YHw1AFQbfQVbb0/CV/EX3HELyUpN2BcrhEc0PHbcRsjn1NVildy/2zUSJKLEFSyhLy4i4DagMNB13I2c8I6fT7oJRedVcaxnhOIPw9SXbXRS1yjyj9Qd1OS2tcMeq+1blpVN33DQ7L0EPc+C34IVNGGq8s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=el+VJeIr; arc=none smtp.client-ip=192.198.163.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="el+VJeIr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1739786848; x=1771322848; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=VSFQ1+OqMh45NluE6eD9gJk608lQBlfkAs2964sulyU=; b=el+VJeIrZ7vsVuuY7irCbFyaCnc9gBdDU+bRfErdv5Yq03QvRwUW4LZk FbWW4u8Vwc1BD3rLsYrwJ0C1Dj++QeFLNcdszWOml/FJOftga2U2D7CH4 QbBbLuUMoOoFjQVlNQ1I92+ZJ651XbnLFiqun/OcHybI2mQMhSQP1AqPP 1fNyk3IBLpom6RCtvP5ev7uwP3plmFpgYQVEhdd0nVgI2rcPwHkhHc8pH b7/T9VSbgjyHvHIUrPEsn8EtguirUhEZS6RvZAUVK4bi7/iWELeKgIyPR t8JLAOKOjoLDMNs5yAGHK6FWN0w23eVnDD5mgFTkcym7uVtzagascahuD Q==; X-CSE-ConnectionGUID: OULV8zxqSaGN/fuiWZnAlw== X-CSE-MsgGUID: qoDzyyEvR2iGoJ0+fN8rmA== X-IronPort-AV: E=McAfee;i="6700,10204,11347"; a="65818301" X-IronPort-AV: E=Sophos;i="6.13,292,1732608000"; d="scan'208";a="65818301" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2025 02:07:28 -0800 X-CSE-ConnectionGUID: S8KfAmeRRK+H/xtomHwdqA== X-CSE-MsgGUID: gKKQfMZKRQuoZVX01suA7w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="118219058" Received: from crojewsk-ctrl.igk.intel.com ([10.237.149.254]) by fmviesa003.fm.intel.com with ESMTP; 17 Feb 2025 02:07:26 -0800 From: Cezary Rojewski To: broonie@kernel.org Cc: tiwai@suse.com, perex@perex.cz, amadeuszx.slawinski@linux.intel.com, linux-sound@vger.kernel.org, Cezary Rojewski Subject: [PATCH 04/10] ASoC: Intel: avs: Add volume control for GAIN module Date: Mon, 17 Feb 2025 11:21:09 +0100 Message-Id: <20250217102115.3539427-5-cezary.rojewski@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250217102115.3539427-1-cezary.rojewski@intel.com> References: <20250217102115.3539427-1-cezary.rojewski@intel.com> Precedence: bulk X-Mailing-List: linux-sound@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Amadeusz Sławiński The AudioDSP firmware's GAIN module has same initialization payload as PEAKVOL and user volume setting can be applied up-front. Update existing code to account for PEAKVOL and GAIN both. Signed-off-by: Amadeusz Sławiński Signed-off-by: Cezary Rojewski --- sound/soc/intel/avs/control.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sound/soc/intel/avs/control.c b/sound/soc/intel/avs/control.c index dc7dc45e0a0a..a55723289600 100644 --- a/sound/soc/intel/avs/control.c +++ b/sound/soc/intel/avs/control.c @@ -31,8 +31,11 @@ static struct avs_path_module *avs_get_volume_module(struct avs_dev *adev, u32 i list_for_each_entry(path, &adev->path_list, node) { list_for_each_entry(ppl, &path->ppl_list, node) { list_for_each_entry(mod, &ppl->mod_list, node) { - if (guid_equal(&mod->template->cfg_ext->type, &AVS_PEAKVOL_MOD_UUID) - && mod->template->ctl_id == id) { + guid_t *type = &mod->template->cfg_ext->type; + + if ((guid_equal(type, &AVS_PEAKVOL_MOD_UUID) || + guid_equal(type, &AVS_GAIN_MOD_UUID)) && + mod->template->ctl_id == id) { spin_unlock(&adev->path_list_lock); return mod; } From patchwork Mon Feb 17 10:21:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cezary Rojewski X-Patchwork-Id: 13977453 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E4A252165E3 for ; Mon, 17 Feb 2025 10:07:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786851; cv=none; b=oVbnJA2FioggKRR95uPO4qIgGiBeDZsJQERPu4JrkXENDN910hW9PPmcrH0IU6KJfEtiXS5jcAy7n95e6hpwC94QX6MrcEh30ed6YDiobwKwNuShkTF1CnLS0Ej3Cx8ppVjI7uf8wKQrc4r+Xg8OwIN/DxsGbRx44HkG78Ny5yY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786851; c=relaxed/simple; bh=vTRXd0I/aQQjPyyC2HNjH68ASaCkmdRhYjovBkp8O8s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XQQuEyoztkMvOrgwQ+OQKuWJ/sf1f2NV5pN50bsrVnG1fLS0d51m69LsBUEj3BN9/bq0mdUAsFR+bwEbnzqSkGFKP88K26u9akvWfNh/SXDauYJOT70CFCsaRD7ZjmCEsCxj9gAnrB7LoKcGi9nINBPdNhQZ3IcPNeKBUXhFqds= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=iB4nBNz2; arc=none smtp.client-ip=192.198.163.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="iB4nBNz2" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1739786850; x=1771322850; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=vTRXd0I/aQQjPyyC2HNjH68ASaCkmdRhYjovBkp8O8s=; b=iB4nBNz2GpAyZ0P5rKJ95kiEyeDAMTKxx9+FHQrsxM6I3+a6YcbpVzgs wWwFdhVo/M8IKZXn2keuJJDhd26gzWroIlgePcWFJ2NFJQbstc3Kq+uO6 6mISUSfftPoMG5VpEc8maUBMxK4VuGgLffbqQRMI7BVSjo0hyNP+TlhjH ymcUCnvybkK3bnka8MOYrO6u0ergbZ7BdVmvssUoJdawezxE2b/bmnbhX G/fV7QDzx/VpJESjKtrh0U5pVwFCw7csiXpXJyLFIPkAHKJzhlyzsNbbi 2X+P6uGjp78NHFkCKax31e85hy7dJPP1R4BA3/y8GvEX74IuXXoFqfEqO g==; X-CSE-ConnectionGUID: PL392DRRTuWJArtoWZAM1g== X-CSE-MsgGUID: iHnAH+0mTRy/clQW+nlq2w== X-IronPort-AV: E=McAfee;i="6700,10204,11347"; a="65818309" X-IronPort-AV: E=Sophos;i="6.13,292,1732608000"; d="scan'208";a="65818309" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2025 02:07:30 -0800 X-CSE-ConnectionGUID: G24sFP+FT6ipufSo7vyW2g== X-CSE-MsgGUID: EI+icq1dTHCXi5r/HOrqFA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="118219061" Received: from crojewsk-ctrl.igk.intel.com ([10.237.149.254]) by fmviesa003.fm.intel.com with ESMTP; 17 Feb 2025 02:07:28 -0800 From: Cezary Rojewski To: broonie@kernel.org Cc: tiwai@suse.com, perex@perex.cz, amadeuszx.slawinski@linux.intel.com, linux-sound@vger.kernel.org, Cezary Rojewski Subject: [PATCH 05/10] ASoC: Intel: avs: Update VOLUME and add MUTE IPCs Date: Mon, 17 Feb 2025 11:21:10 +0100 Message-Id: <20250217102115.3539427-6-cezary.rojewski@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250217102115.3539427-1-cezary.rojewski@intel.com> References: <20250217102115.3539427-1-cezary.rojewski@intel.com> Precedence: bulk X-Mailing-List: linux-sound@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 For mute kcontrols to have an effect add IPCs for triggering the mute operation on the DSP side. On top of basic get/set, an aggregated variant of the latter is provided for both MUTE and, to already present VOLUME IPC. It allows for efficient transmission of multiple parameters at once. While at it, sort the functions - getters come before setters in the AudioDSP firmware interface as well as in the kcontrol one. Signed-off-by: Cezary Rojewski --- sound/soc/intel/avs/messages.c | 111 ++++++++++++++++++++++++++++++--- sound/soc/intel/avs/messages.h | 24 ++++++- 2 files changed, 126 insertions(+), 9 deletions(-) diff --git a/sound/soc/intel/avs/messages.c b/sound/soc/intel/avs/messages.c index 242a175381c2..a5ba27983091 100644 --- a/sound/soc/intel/avs/messages.c +++ b/sound/soc/intel/avs/messages.c @@ -677,13 +677,6 @@ int avs_ipc_copier_set_sink_format(struct avs_dev *adev, u16 module_id, (u8 *)&cpr_fmt, sizeof(cpr_fmt)); } -int avs_ipc_peakvol_set_volume(struct avs_dev *adev, u16 module_id, u8 instance_id, - struct avs_volume_cfg *vol) -{ - return avs_ipc_set_large_config(adev, module_id, instance_id, AVS_PEAKVOL_VOLUME, (u8 *)vol, - sizeof(*vol)); -} - int avs_ipc_peakvol_get_volume(struct avs_dev *adev, u16 module_id, u8 instance_id, struct avs_volume_cfg **vols, size_t *num_vols) { @@ -706,6 +699,110 @@ int avs_ipc_peakvol_get_volume(struct avs_dev *adev, u16 module_id, u8 instance_ return 0; } +int avs_ipc_peakvol_set_volume(struct avs_dev *adev, u16 module_id, u8 instance_id, + struct avs_volume_cfg *vol) +{ + return avs_ipc_set_large_config(adev, module_id, instance_id, AVS_PEAKVOL_VOLUME, + (u8 *)vol, sizeof(*vol)); +} + +int avs_ipc_peakvol_set_volumes(struct avs_dev *adev, u16 module_id, u8 instance_id, + struct avs_volume_cfg *vols, size_t num_vols) +{ + struct avs_tlv *tlv; + size_t offset; + size_t size; + u8 *payload; + int ret, i; + + size = num_vols * sizeof(*vols); + size += num_vols * sizeof(*tlv); + if (size > AVS_MAILBOX_SIZE) + return -EINVAL; + + payload = kzalloc(AVS_MAILBOX_SIZE, GFP_KERNEL); + if (!payload) + return -ENOMEM; + + for (offset = i = 0; i < num_vols; i++) { + tlv = (struct avs_tlv *)(payload + offset); + + tlv->type = AVS_PEAKVOL_VOLUME; + tlv->length = sizeof(*vols); + memcpy(tlv->value, &vols[i], tlv->length); + + offset += sizeof(*tlv) + tlv->length; + } + + ret = avs_ipc_set_large_config(adev, module_id, instance_id, AVS_VENDOR_CONFIG, payload, + size); + kfree(payload); + return ret; +} + +int avs_ipc_peakvol_get_mute(struct avs_dev *adev, u16 module_id, u8 instance_id, + struct avs_mute_cfg **mutes, size_t *num_mutes) +{ + size_t payload_size; + u8 *payload; + int ret; + + ret = avs_ipc_get_large_config(adev, module_id, instance_id, AVS_PEAKVOL_MUTE, NULL, 0, + &payload, &payload_size); + if (ret) + return ret; + + /* Non-zero payload expected for PEAKVOL_MUTE. */ + if (!payload_size) + return -EREMOTEIO; + + *mutes = (struct avs_mute_cfg *)payload; + *num_mutes = payload_size / sizeof(**mutes); + + return 0; +} + +int avs_ipc_peakvol_set_mute(struct avs_dev *adev, u16 module_id, u8 instance_id, + struct avs_mute_cfg *mute) +{ + return avs_ipc_set_large_config(adev, module_id, instance_id, AVS_PEAKVOL_MUTE, + (u8 *)mute, sizeof(*mute)); +} + +int avs_ipc_peakvol_set_mutes(struct avs_dev *adev, u16 module_id, u8 instance_id, + struct avs_mute_cfg *mutes, size_t num_mutes) +{ + struct avs_tlv *tlv; + size_t offset; + size_t size; + u8 *payload; + int ret, i; + + size = num_mutes * sizeof(*mutes); + size += num_mutes * sizeof(*tlv); + if (size > AVS_MAILBOX_SIZE) + return -EINVAL; + + payload = kzalloc(AVS_MAILBOX_SIZE, GFP_KERNEL); + if (!payload) + return -ENOMEM; + + for (offset = i = 0; i < num_mutes; i++) { + tlv = (struct avs_tlv *)(payload + offset); + + tlv->type = AVS_PEAKVOL_MUTE; + tlv->length = sizeof(*mutes); + memcpy(tlv->value, &mutes[i], tlv->length); + + offset += sizeof(*tlv) + tlv->length; + } + + ret = avs_ipc_set_large_config(adev, module_id, instance_id, AVS_VENDOR_CONFIG, payload, + size); + kfree(payload); + return ret; +} + #ifdef CONFIG_DEBUG_FS int avs_ipc_set_enable_logs(struct avs_dev *adev, u8 *log_info, size_t size) { diff --git a/sound/soc/intel/avs/messages.h b/sound/soc/intel/avs/messages.h index f44fcfc81de7..2f243802ccc2 100644 --- a/sound/soc/intel/avs/messages.h +++ b/sound/soc/intel/avs/messages.h @@ -814,6 +814,15 @@ struct avs_volume_cfg { } __packed; static_assert(sizeof(struct avs_volume_cfg) == 24); +struct avs_mute_cfg { + u32 channel_id; + u32 mute; + u32 curve_type; + u32 reserved; /* alignment */ + u64 curve_duration; +} __packed; +static_assert(sizeof(struct avs_mute_cfg) == 24); + struct avs_peakvol_cfg { struct avs_modcfg_base base; struct avs_volume_cfg vols[]; @@ -896,6 +905,8 @@ static_assert(sizeof(struct avs_whm_cfg) == 108); /* Module runtime parameters */ +#define AVS_VENDOR_CONFIG 0xFF + enum avs_copier_runtime_param { AVS_COPIER_SET_SINK_FORMAT = 2, }; @@ -914,6 +925,7 @@ int avs_ipc_copier_set_sink_format(struct avs_dev *adev, u16 module_id, enum avs_peakvol_runtime_param { AVS_PEAKVOL_VOLUME = 0, + AVS_PEAKVOL_MUTE = 3, }; enum avs_audio_curve_type { @@ -921,10 +933,18 @@ enum avs_audio_curve_type { AVS_AUDIO_CURVE_WINDOWS_FADE = 1, }; -int avs_ipc_peakvol_set_volume(struct avs_dev *adev, u16 module_id, u8 instance_id, - struct avs_volume_cfg *vol); int avs_ipc_peakvol_get_volume(struct avs_dev *adev, u16 module_id, u8 instance_id, struct avs_volume_cfg **vols, size_t *num_vols); +int avs_ipc_peakvol_set_volume(struct avs_dev *adev, u16 module_id, u8 instance_id, + struct avs_volume_cfg *vol); +int avs_ipc_peakvol_set_volumes(struct avs_dev *adev, u16 module_id, u8 instance_id, + struct avs_volume_cfg *vols, size_t num_vols); +int avs_ipc_peakvol_get_mute(struct avs_dev *adev, u16 module_id, u8 instance_id, + struct avs_mute_cfg **mutes, size_t *num_mutes); +int avs_ipc_peakvol_set_mute(struct avs_dev *adev, u16 module_id, u8 instance_id, + struct avs_mute_cfg *mute); +int avs_ipc_peakvol_set_mutes(struct avs_dev *adev, u16 module_id, u8 instance_id, + struct avs_mute_cfg *mutes, size_t num_mutes); #define AVS_PROBE_INST_ID 0 From patchwork Mon Feb 17 10:21:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cezary Rojewski X-Patchwork-Id: 13977454 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B19EC2163B9 for ; Mon, 17 Feb 2025 10:07:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786853; cv=none; b=NqTYhQdwVAhQ5oerUH1qgd1rMQkqM7tLtrGZ8v+jkMxXKybToQE+Ff96GdeaQ+c6uGzqHfS4Keht7LDehx2/3BV2hZ+HYSCrLUb40J+Z3o9ovlIe3whKpjFBIlRoqJi+hBprJ8idfuueMwkeAZjG/HEpLUzcVnzZLY3sEt1Euvc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786853; c=relaxed/simple; bh=j6KVArWe9ArZXGON50kyJRlTfNKPfGYa4ZRNgG9VFvk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=nc4oKYxKMBzxAM4K2ey8xddshLvXsMaQBQUCHkYF1xaV6N3TrTs/3i9FQAP9Of4ZE4XBo224HL7kx/QiOuvebJn2C1y8MCntg5Zl1Y9snNeGvSaim5e1JPG+JMqk/muyaFe5uAFkG0RB4gvmqVygzpgfuet9nEkdZ/VNZkEVXlY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=PQbjhMAV; arc=none smtp.client-ip=192.198.163.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="PQbjhMAV" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1739786852; x=1771322852; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=j6KVArWe9ArZXGON50kyJRlTfNKPfGYa4ZRNgG9VFvk=; b=PQbjhMAVKlz1V7qubcFdPBnqmfljy9rNK2Vu73CKfPjlLfTR6pS3aU3o YIQwLkoI8KC4CPW87AWrIKYGb/bRMKUWdwQWRvzGXRBQX8byGO0YO8NsI aYoGERO0m2+40gCsS89NegUb/Uklsm2lX7/qU58VB+pJN7hqH6ebsvQ0J a8bP3Xprts09wqHmAgOJZwyDDz8MX0f6jNdRSeeS4eU9rbLo0UsvjOUqG b6ocn3UIquzAr/h5ZiCuuHTsJ8aQBNt5+4BawCUy8XK4R3zR7c1xSI5mz 9W/0G9lxEOOOt2Tg8nz/Yn1U/S+AGAnDtefKYI972PQQgDwo43Wgdwv8z A==; X-CSE-ConnectionGUID: pBTMSDO+T9SR/5UXj2Xv7g== X-CSE-MsgGUID: q15ztGutTpWBsKQQ9Q0WAQ== X-IronPort-AV: E=McAfee;i="6700,10204,11347"; a="65818317" X-IronPort-AV: E=Sophos;i="6.13,292,1732608000"; d="scan'208";a="65818317" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2025 02:07:31 -0800 X-CSE-ConnectionGUID: MiDrHwxIRf+kDLiqCispFw== X-CSE-MsgGUID: RUZYnlLWQ1ypEQhAVDJi2w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="118219065" Received: from crojewsk-ctrl.igk.intel.com ([10.237.149.254]) by fmviesa003.fm.intel.com with ESMTP; 17 Feb 2025 02:07:30 -0800 From: Cezary Rojewski To: broonie@kernel.org Cc: tiwai@suse.com, perex@perex.cz, amadeuszx.slawinski@linux.intel.com, linux-sound@vger.kernel.org, Cezary Rojewski Subject: [PATCH 06/10] ASoC: Intel: avs: New volume control operations Date: Mon, 17 Feb 2025 11:21:11 +0100 Message-Id: <20250217102115.3539427-7-cezary.rojewski@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250217102115.3539427-1-cezary.rojewski@intel.com> References: <20250217102115.3539427-1-cezary.rojewski@intel.com> Precedence: bulk X-Mailing-List: linux-sound@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To provide multi-channel - more than 2 - capability to volume controls implement operations that honor the num_channels of a mixer control. As mc->num_channels can be 0 and is in fact the default behavior, the new functions decide between ALL_CHANNELS_MASK and individual channels based on the field value. To avoid hard-to-review delta when refactoring the code, first implement the new behavior with follow up changes cleaning things up. Signed-off-by: Cezary Rojewski --- sound/soc/intel/avs/control.c | 84 +++++++++++++++++++++++++++++++++++ sound/soc/intel/avs/control.h | 5 +++ sound/soc/intel/avs/path.c | 36 +++++++++++++++ sound/soc/intel/avs/path.h | 3 ++ 4 files changed, 128 insertions(+) diff --git a/sound/soc/intel/avs/control.c b/sound/soc/intel/avs/control.c index a55723289600..a1c7431cfe13 100644 --- a/sound/soc/intel/avs/control.c +++ b/sound/soc/intel/avs/control.c @@ -6,6 +6,7 @@ // Cezary Rojewski // +#include #include #include "avs.h" #include "control.h" @@ -114,3 +115,86 @@ int avs_control_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va return ret ? ret : changed; } + +int avs_control_volume_get2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) +{ + struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; + struct avs_control_data *ctl_data = mc->dobj.private; + struct avs_path_module *active_module; + struct avs_volume_cfg *dspvols; + struct avs_dev *adev; + size_t num_dspvols; + int ret, i; + + adev = avs_get_kcontrol_adev(kctl); + + /* Prevent access to modules while path is being constructed. */ + guard(mutex)(&adev->path_mutex); + + active_module = avs_get_volume_module(adev, ctl_data->id); + if (active_module) { + ret = avs_ipc_peakvol_get_volume(adev, active_module->module_id, + active_module->instance_id, &dspvols, + &num_dspvols); + if (ret) + return AVS_IPC_RET(ret); + + /* Do not copy more than the control can store. */ + num_dspvols = min_t(u32, num_dspvols, SND_SOC_TPLG_MAX_CHAN); + for (i = 0; i < num_dspvols; i++) + ctl_data->values[i] = dspvols[i].target_volume; + kfree(dspvols); + } + + memcpy(uctl->value.integer.value, ctl_data->values, sizeof(ctl_data->values)); + return 0; +} + +int avs_control_volume_put2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) +{ + struct avs_path_module *active_module; + struct avs_control_data *ctl_data; + struct soc_mixer_control *mc; + struct avs_dev *adev; + long *input; + int ret, i; + + mc = (struct soc_mixer_control *)kctl->private_value; + ctl_data = mc->dobj.private; + adev = avs_get_kcontrol_adev(kctl); + input = uctl->value.integer.value; + i = 0; + + /* mc->num_channels can be 0. */ + do { + if (input[i] < mc->min || input[i] > mc->max) + return -EINVAL; + } while (++i < mc->num_channels); + + if (!memcmp(ctl_data->values, input, sizeof(ctl_data->values))) + return 0; + + /* Prevent access to modules while path is being constructed. */ + guard(mutex)(&adev->path_mutex); + + active_module = avs_get_volume_module(adev, ctl_data->id); + if (active_module) { + ret = avs_peakvol_set_volume(adev, active_module, mc, input); + if (ret) + return ret; + } + + memcpy(ctl_data->values, input, sizeof(ctl_data->values)); + return 1; +} + +int avs_control_volume_info(struct snd_kcontrol *kctl, struct snd_ctl_elem_info *uinfo) +{ + struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; + + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->count = max_t(u32, 1, mc->num_channels); + uinfo->value.integer.min = 0; + uinfo->value.integer.max = mc->max; + return 0; +} diff --git a/sound/soc/intel/avs/control.h b/sound/soc/intel/avs/control.h index d9fac3569e8d..e16fa79962de 100644 --- a/sound/soc/intel/avs/control.h +++ b/sound/soc/intel/avs/control.h @@ -10,14 +10,19 @@ #define __SOUND_SOC_INTEL_AVS_CTRL_H #include +#include struct avs_control_data { u32 id; long volume; + long values[SND_SOC_TPLG_MAX_CHAN]; }; int avs_control_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol); int avs_control_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol); +int avs_control_volume_get2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); +int avs_control_volume_put2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); +int avs_control_volume_info(struct snd_kcontrol *kctl, struct snd_ctl_elem_info *uinfo); #endif diff --git a/sound/soc/intel/avs/path.c b/sound/soc/intel/avs/path.c index 329838119015..a72ebde7d011 100644 --- a/sound/soc/intel/avs/path.c +++ b/sound/soc/intel/avs/path.c @@ -323,6 +323,42 @@ static struct avs_control_data *avs_get_module_control(struct avs_path_module *m return NULL; } +int avs_peakvol_set_volume(struct avs_dev *adev, struct avs_path_module *mod, + struct soc_mixer_control *mc, long *input) +{ + struct avs_volume_cfg vols[SND_SOC_TPLG_MAX_CHAN] = {{0}}; + struct avs_control_data *ctl_data; + struct avs_tplg_module *t; + int ret, i; + + ctl_data = mc->dobj.private; + t = mod->template; + if (!input) + input = ctl_data->values; + + if (mc->num_channels) { + for (i = 0; i < mc->num_channels; i++) { + vols[i].channel_id = i; + vols[i].target_volume = input[i]; + vols[i].curve_type = t->cfg_ext->peakvol.curve_type; + vols[i].curve_duration = t->cfg_ext->peakvol.curve_duration; + } + + ret = avs_ipc_peakvol_set_volumes(adev, mod->module_id, mod->instance_id, vols, + mc->num_channels); + return AVS_IPC_RET(ret); + } + + /* Target all channels if no individual selected. */ + vols[0].channel_id = AVS_ALL_CHANNELS_MASK; + vols[0].target_volume = input[0]; + vols[0].curve_type = t->cfg_ext->peakvol.curve_type; + vols[0].curve_duration = t->cfg_ext->peakvol.curve_duration; + + ret = avs_ipc_peakvol_set_volume(adev, mod->module_id, mod->instance_id, &vols[0]); + return AVS_IPC_RET(ret); +} + static int avs_peakvol_create(struct avs_dev *adev, struct avs_path_module *mod) { struct avs_tplg_module *t = mod->template; diff --git a/sound/soc/intel/avs/path.h b/sound/soc/intel/avs/path.h index bfd253c9fa95..e9317b64de86 100644 --- a/sound/soc/intel/avs/path.h +++ b/sound/soc/intel/avs/path.h @@ -69,4 +69,7 @@ int avs_path_reset(struct avs_path *path); int avs_path_pause(struct avs_path *path); int avs_path_run(struct avs_path *path, int trigger); +int avs_peakvol_set_volume(struct avs_dev *adev, struct avs_path_module *mod, + struct soc_mixer_control *mc, long *input); + #endif From patchwork Mon Feb 17 10:21:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cezary Rojewski X-Patchwork-Id: 13977455 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 823B4216E21 for ; Mon, 17 Feb 2025 10:07:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786855; cv=none; b=l3BOrdhHnFIckakahmKlMChQv6GTuLm/5akGa45IaALx6fyyCRW8pUSji74urtqzLz8OsXnIOKZLSwqCGG1IxDkfyBIXwUDv5ErwNKpSXuVap57LcJNaIRZ0tvDUbltmdBInah4xiTQrI6YF4/AcR0IzipIqxPx+9I+JZrlxP8s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786855; c=relaxed/simple; bh=ynfYRjehEAQWqs6EHQUbCOYCodhFGabTR/VA+wlxm0g=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Emqqfma1/HGidPO5SU5cWg+/vD0Zf3azHz34yEWj4EceJybjjNKwnaT20VOlTqO2usRYSg+W71yNFlDCfMUID77Woz4DfifDAvccG+SB/7X1f2X4EHkCG69nDTKwwQ85vR0P5KAeKGYwMWfV31UpbeApg3lFOOBm3DpBgDTPQoo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Gmf7XYrm; arc=none smtp.client-ip=192.198.163.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Gmf7XYrm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1739786853; x=1771322853; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ynfYRjehEAQWqs6EHQUbCOYCodhFGabTR/VA+wlxm0g=; b=Gmf7XYrm0YvMQ9A5SHMgkOpmuiQcMtie8IPtC+ySrKfXwnH9GtKkblfm B0qM4W7BLmUiKjW6PQhjrmub5MEPpXKsvy2RNM1M/8zFBoU5HMy/FhQ1W 9DyFfgZxMCCJI9QqO3THxZeglNJ9QihqgQvPewzvGOP9LhM/Z0qm0P8mw Y6YpyhiOf8TELfX148xE5uh7h5Z7buvQMvqsGRo4XjfL7dYlCfBBg5OdW ro5fviOsO56ttB0sRrp/LsB8Y6X0y42aSEI7j/2LAwhZ5Xyx/0nlvGHBM k3UKipAziZVpTbW3zQskq5pulNUPGwM7BZCBELVTOeku7Rx942/wmKTi2 w==; X-CSE-ConnectionGUID: cKyPgOrQTmOEQXA9FLOx3Q== X-CSE-MsgGUID: HvXxXxfKRNiImDMcLkJFtg== X-IronPort-AV: E=McAfee;i="6700,10204,11347"; a="65818321" X-IronPort-AV: E=Sophos;i="6.13,292,1732608000"; d="scan'208";a="65818321" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2025 02:07:33 -0800 X-CSE-ConnectionGUID: l9fBaogdSnaEVSZ8Q4hPkg== X-CSE-MsgGUID: 5z4fdK9XQlS8QCrZtF+3LA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="118219068" Received: from crojewsk-ctrl.igk.intel.com ([10.237.149.254]) by fmviesa003.fm.intel.com with ESMTP; 17 Feb 2025 02:07:32 -0800 From: Cezary Rojewski To: broonie@kernel.org Cc: tiwai@suse.com, perex@perex.cz, amadeuszx.slawinski@linux.intel.com, linux-sound@vger.kernel.org, Cezary Rojewski Subject: [PATCH 07/10] ASoC: Intel: avs: Move to the new control operations Date: Mon, 17 Feb 2025 11:21:12 +0100 Message-Id: <20250217102115.3539427-8-cezary.rojewski@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250217102115.3539427-1-cezary.rojewski@intel.com> References: <20250217102115.3539427-1-cezary.rojewski@intel.com> Precedence: bulk X-Mailing-List: linux-sound@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Allow for multi-channel volume controls to be utilized by an application by moving over to the new implementation. Drop all unused code in the process. Signed-off-by: Cezary Rojewski --- sound/soc/intel/avs/control.c | 72 +--------------------------------- sound/soc/intel/avs/control.h | 8 +--- sound/soc/intel/avs/path.c | 2 +- sound/soc/intel/avs/topology.c | 1 + 4 files changed, 6 insertions(+), 77 deletions(-) diff --git a/sound/soc/intel/avs/control.c b/sound/soc/intel/avs/control.c index a1c7431cfe13..64283aa35281 100644 --- a/sound/soc/intel/avs/control.c +++ b/sound/soc/intel/avs/control.c @@ -48,75 +48,7 @@ static struct avs_path_module *avs_get_volume_module(struct avs_dev *adev, u32 i return NULL; } -int avs_control_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct avs_control_data *ctl_data = (struct avs_control_data *)mc->dobj.private; - struct avs_dev *adev = avs_get_kcontrol_adev(kcontrol); - struct avs_volume_cfg *dspvols = NULL; - struct avs_path_module *active_module; - size_t num_dspvols; - int ret = 0; - - /* prevent access to modules while path is being constructed */ - mutex_lock(&adev->path_mutex); - - active_module = avs_get_volume_module(adev, ctl_data->id); - if (active_module) { - ret = avs_ipc_peakvol_get_volume(adev, active_module->module_id, - active_module->instance_id, &dspvols, - &num_dspvols); - if (!ret) - ucontrol->value.integer.value[0] = dspvols[0].target_volume; - - ret = AVS_IPC_RET(ret); - kfree(dspvols); - } else { - ucontrol->value.integer.value[0] = ctl_data->volume; - } - - mutex_unlock(&adev->path_mutex); - return ret; -} - -int avs_control_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct avs_control_data *ctl_data = (struct avs_control_data *)mc->dobj.private; - struct avs_dev *adev = avs_get_kcontrol_adev(kcontrol); - long *volume = &ctl_data->volume; - struct avs_path_module *active_module; - struct avs_volume_cfg dspvol = {0}; - long ctlvol = ucontrol->value.integer.value[0]; - int ret = 0, changed = 0; - - if (ctlvol < 0 || ctlvol > mc->max) - return -EINVAL; - - /* prevent access to modules while path is being constructed */ - mutex_lock(&adev->path_mutex); - - if (*volume != ctlvol) { - *volume = ctlvol; - changed = 1; - } - - active_module = avs_get_volume_module(adev, ctl_data->id); - if (active_module) { - dspvol.channel_id = AVS_ALL_CHANNELS_MASK; - dspvol.target_volume = *volume; - - ret = avs_ipc_peakvol_set_volume(adev, active_module->module_id, - active_module->instance_id, &dspvol); - ret = AVS_IPC_RET(ret); - } - - mutex_unlock(&adev->path_mutex); - - return ret ? ret : changed; -} - -int avs_control_volume_get2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) +int avs_control_volume_get(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) { struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; struct avs_control_data *ctl_data = mc->dobj.private; @@ -150,7 +82,7 @@ int avs_control_volume_get2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value return 0; } -int avs_control_volume_put2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) +int avs_control_volume_put(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) { struct avs_path_module *active_module; struct avs_control_data *ctl_data; diff --git a/sound/soc/intel/avs/control.h b/sound/soc/intel/avs/control.h index e16fa79962de..66f3fe064e1d 100644 --- a/sound/soc/intel/avs/control.h +++ b/sound/soc/intel/avs/control.h @@ -14,15 +14,11 @@ struct avs_control_data { u32 id; - - long volume; long values[SND_SOC_TPLG_MAX_CHAN]; }; -int avs_control_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol); -int avs_control_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol); -int avs_control_volume_get2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); -int avs_control_volume_put2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); +int avs_control_volume_get(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); +int avs_control_volume_put(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); int avs_control_volume_info(struct snd_kcontrol *kctl, struct snd_ctl_elem_info *uinfo); #endif diff --git a/sound/soc/intel/avs/path.c b/sound/soc/intel/avs/path.c index a72ebde7d011..56a2916eec5e 100644 --- a/sound/soc/intel/avs/path.c +++ b/sound/soc/intel/avs/path.c @@ -370,7 +370,7 @@ static int avs_peakvol_create(struct avs_dev *adev, struct avs_path_module *mod) ctl_data = avs_get_module_control(mod); if (ctl_data) - volume = ctl_data->volume; + volume = ctl_data->values[0]; /* As 2+ channels controls are unsupported, have a single block for all channels. */ cfg_size = struct_size(cfg, vols, 1); diff --git a/sound/soc/intel/avs/topology.c b/sound/soc/intel/avs/topology.c index 45952fbe9694..ee70e3d0e889 100644 --- a/sound/soc/intel/avs/topology.c +++ b/sound/soc/intel/avs/topology.c @@ -1912,6 +1912,7 @@ static const struct snd_soc_tplg_kcontrol_ops avs_control_ops[] = { .id = AVS_CONTROL_OPS_VOLUME, .get = avs_control_volume_get, .put = avs_control_volume_put, + .info = avs_control_volume_info, }, }; From patchwork Mon Feb 17 10:21:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Cezary Rojewski X-Patchwork-Id: 13977456 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC2112163B9 for ; Mon, 17 Feb 2025 10:07:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786857; cv=none; b=pBvIgGFccXqLp6dvlXOeDwVat+jdncILpPYHTnibiHtABzG1qBXHtvf0xGAhkinpvLPDYRFsQi4NJ+m1OM1jMIJpxfVvC4lUM0cC3QJRoIhx+/mtyQkt1xSD3pCU/NS8qYne0Tp0R9zi+2Q6uTBkgPvEbfQ50i4dbafYXhbUOP4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786857; c=relaxed/simple; bh=jlg2VFrjTOIQNhKDMA+9woDrgRXEws1M/4sOJdVLY+c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=E1VEf/nH4OckVs3lGnPScmTnuLsFeQH7h+ZeWkm0y2PdK3/8z7ggkcNpaGsz1zmZ5sWacMgyofdQauq6R8IWd6Y4mCQ4xcAwPC+9kzZb16s1818FT4ZqmmrpP1x633vCcIx1mcD4IbisaT/B0/2Z9aIJbMFpsRxpUXsHA7neDg4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=CLKZqJhI; arc=none smtp.client-ip=192.198.163.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="CLKZqJhI" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1739786856; x=1771322856; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=jlg2VFrjTOIQNhKDMA+9woDrgRXEws1M/4sOJdVLY+c=; b=CLKZqJhI9HMnUHXLkWl0bAUfXuZ/4oD6k1oGFYknDbvTEl9aU9Kkovuz DvP2bfX7Zjs/74W3skVW1hLzhDFPTzUvEg8cXyqXhRMUJ52zWFZ17JDj3 70o49Qht32Njhn3zXT7rikizhP0pKNAVBlc5my2G5P6RzCpxbre2knYKx jC3JQT/lDpisr2in8qnoDukJ4K4Z0qH5wRJYc1FRfRlZjOnIoS5NlM+8K IpLX4GvXwHAhqKlzxBbWvP9XGRIw1vlM0HaG2LxsxjTToeTZ1CrtChlfy +nf7uwuezV/vzWdMaMIp8c7MCZ42/b0fQ4Ci8IDDDAf3u/ZxHYu+e3Jbp A==; X-CSE-ConnectionGUID: xotQCRLrQ7eBomvloMvNhQ== X-CSE-MsgGUID: yXLt3EeHQeuwbzCPKh9+Vw== X-IronPort-AV: E=McAfee;i="6700,10204,11347"; a="65818328" X-IronPort-AV: E=Sophos;i="6.13,292,1732608000"; d="scan'208";a="65818328" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2025 02:07:35 -0800 X-CSE-ConnectionGUID: CEth/ytDSNK2Yks7jlHiwA== X-CSE-MsgGUID: eMgHk17HQ12qfi+6nEpTIg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="118219071" Received: from crojewsk-ctrl.igk.intel.com ([10.237.149.254]) by fmviesa003.fm.intel.com with ESMTP; 17 Feb 2025 02:07:33 -0800 From: Cezary Rojewski To: broonie@kernel.org Cc: tiwai@suse.com, perex@perex.cz, amadeuszx.slawinski@linux.intel.com, linux-sound@vger.kernel.org, Cezary Rojewski Subject: [PATCH 08/10] ASoC: Intel: avs: Add support for mute for PEAKVOL and GAIN Date: Mon, 17 Feb 2025 11:21:13 +0100 Message-Id: <20250217102115.3539427-9-cezary.rojewski@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250217102115.3539427-1-cezary.rojewski@intel.com> References: <20250217102115.3539427-1-cezary.rojewski@intel.com> Precedence: bulk X-Mailing-List: linux-sound@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Amadeusz Sławiński With recent updates to AudioDSP firmware, mute functionality has been added to PEAKVOL and GAIN modules. The operation occurs over IPC similarly to how volume is configured. Wire it up to kcontrol infrastructure present in the avs-driver. Signed-off-by: Amadeusz Sławiński Signed-off-by: Cezary Rojewski --- sound/soc/intel/avs/control.c | 83 ++++++++++++++++++++++++++++++++++ sound/soc/intel/avs/control.h | 3 ++ sound/soc/intel/avs/path.c | 36 +++++++++++++++ sound/soc/intel/avs/path.h | 2 + sound/soc/intel/avs/topology.c | 11 ++++- 5 files changed, 134 insertions(+), 1 deletion(-) diff --git a/sound/soc/intel/avs/control.c b/sound/soc/intel/avs/control.c index 64283aa35281..2e01dc75a15a 100644 --- a/sound/soc/intel/avs/control.c +++ b/sound/soc/intel/avs/control.c @@ -130,3 +130,86 @@ int avs_control_volume_info(struct snd_kcontrol *kctl, struct snd_ctl_elem_info uinfo->value.integer.max = mc->max; return 0; } + +int avs_control_mute_get(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) +{ + struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; + struct avs_control_data *ctl_data = mc->dobj.private; + struct avs_path_module *active_module; + struct avs_mute_cfg *dspmutes; + struct avs_dev *adev; + size_t num_dspmutes; + int ret, i; + + adev = avs_get_kcontrol_adev(kctl); + + /* Prevent access to modules while path is being constructed. */ + guard(mutex)(&adev->path_mutex); + + active_module = avs_get_volume_module(adev, ctl_data->id); + if (active_module) { + ret = avs_ipc_peakvol_get_mute(adev, active_module->module_id, + active_module->instance_id, &dspmutes, + &num_dspmutes); + if (ret) + return AVS_IPC_RET(ret); + + /* Do not copy more than the control can store. */ + num_dspmutes = min_t(u32, num_dspmutes, SND_SOC_TPLG_MAX_CHAN); + for (i = 0; i < num_dspmutes; i++) + ctl_data->values[i] = !dspmutes[i].mute; + kfree(dspmutes); + } + + memcpy(uctl->value.integer.value, ctl_data->values, sizeof(ctl_data->values)); + return 0; +} + +int avs_control_mute_put(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) +{ + struct avs_path_module *active_module; + struct avs_control_data *ctl_data; + struct soc_mixer_control *mc; + struct avs_dev *adev; + long *input; + int ret, i; + + mc = (struct soc_mixer_control *)kctl->private_value; + ctl_data = mc->dobj.private; + adev = avs_get_kcontrol_adev(kctl); + input = uctl->value.integer.value; + i = 0; + + /* mc->num_channels can be 0. */ + do { + if (input[i] < mc->min || input[i] > mc->max) + return -EINVAL; + } while (++i < mc->num_channels); + + if (!memcmp(ctl_data->values, input, sizeof(ctl_data->values))) + return 0; + + /* Prevent access to modules while path is being constructed. */ + guard(mutex)(&adev->path_mutex); + + active_module = avs_get_volume_module(adev, ctl_data->id); + if (active_module) { + ret = avs_peakvol_set_mute(adev, active_module, mc, input); + if (ret) + return ret; + } + + memcpy(ctl_data->values, input, sizeof(ctl_data->values)); + return 1; +} + +int avs_control_mute_info(struct snd_kcontrol *kctl, struct snd_ctl_elem_info *uinfo) +{ + struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; + + uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; + uinfo->count = max_t(u32, 1, mc->num_channels); + uinfo->value.integer.min = 0; + uinfo->value.integer.max = mc->max; + return 0; +} diff --git a/sound/soc/intel/avs/control.h b/sound/soc/intel/avs/control.h index 66f3fe064e1d..08b2919e4629 100644 --- a/sound/soc/intel/avs/control.h +++ b/sound/soc/intel/avs/control.h @@ -20,5 +20,8 @@ struct avs_control_data { int avs_control_volume_get(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); int avs_control_volume_put(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); int avs_control_volume_info(struct snd_kcontrol *kctl, struct snd_ctl_elem_info *uinfo); +int avs_control_mute_get(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); +int avs_control_mute_put(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); +int avs_control_mute_info(struct snd_kcontrol *kctl, struct snd_ctl_elem_info *uinfo); #endif diff --git a/sound/soc/intel/avs/path.c b/sound/soc/intel/avs/path.c index 56a2916eec5e..403510494e77 100644 --- a/sound/soc/intel/avs/path.c +++ b/sound/soc/intel/avs/path.c @@ -359,6 +359,42 @@ int avs_peakvol_set_volume(struct avs_dev *adev, struct avs_path_module *mod, return AVS_IPC_RET(ret); } +int avs_peakvol_set_mute(struct avs_dev *adev, struct avs_path_module *mod, + struct soc_mixer_control *mc, long *input) +{ + struct avs_mute_cfg mutes[SND_SOC_TPLG_MAX_CHAN] = {{0}}; + struct avs_control_data *ctl_data; + struct avs_tplg_module *t; + int ret, i; + + ctl_data = mc->dobj.private; + t = mod->template; + if (!input) + input = ctl_data->values; + + if (mc->num_channels) { + for (i = 0; i < mc->num_channels; i++) { + mutes[i].channel_id = i; + mutes[i].mute = !input[i]; + mutes[i].curve_type = t->cfg_ext->peakvol.curve_type; + mutes[i].curve_duration = t->cfg_ext->peakvol.curve_duration; + } + + ret = avs_ipc_peakvol_set_mutes(adev, mod->module_id, mod->instance_id, mutes, + mc->num_channels); + return AVS_IPC_RET(ret); + } + + /* Target all channels if no individual selected. */ + mutes[0].channel_id = AVS_ALL_CHANNELS_MASK; + mutes[0].mute = !input[0]; + mutes[0].curve_type = t->cfg_ext->peakvol.curve_type; + mutes[0].curve_duration = t->cfg_ext->peakvol.curve_duration; + + ret = avs_ipc_peakvol_set_mute(adev, mod->module_id, mod->instance_id, &mutes[0]); + return AVS_IPC_RET(ret); +} + static int avs_peakvol_create(struct avs_dev *adev, struct avs_path_module *mod) { struct avs_tplg_module *t = mod->template; diff --git a/sound/soc/intel/avs/path.h b/sound/soc/intel/avs/path.h index e9317b64de86..7ed7e94e0a56 100644 --- a/sound/soc/intel/avs/path.h +++ b/sound/soc/intel/avs/path.h @@ -71,5 +71,7 @@ int avs_path_run(struct avs_path *path, int trigger); int avs_peakvol_set_volume(struct avs_dev *adev, struct avs_path_module *mod, struct soc_mixer_control *mc, long *input); +int avs_peakvol_set_mute(struct avs_dev *adev, struct avs_path_module *mod, + struct soc_mixer_control *mc, long *input); #endif diff --git a/sound/soc/intel/avs/topology.c b/sound/soc/intel/avs/topology.c index ee70e3d0e889..9ef1adb077f4 100644 --- a/sound/soc/intel/avs/topology.c +++ b/sound/soc/intel/avs/topology.c @@ -1905,7 +1905,10 @@ static int avs_manifest(struct snd_soc_component *comp, int index, return 0; } -#define AVS_CONTROL_OPS_VOLUME 257 +enum { + AVS_CONTROL_OPS_VOLUME = 257, + AVS_CONTROL_OPS_MUTE, +}; static const struct snd_soc_tplg_kcontrol_ops avs_control_ops[] = { { @@ -1914,6 +1917,12 @@ static const struct snd_soc_tplg_kcontrol_ops avs_control_ops[] = { .put = avs_control_volume_put, .info = avs_control_volume_info, }, + { + .id = AVS_CONTROL_OPS_MUTE, + .get = avs_control_mute_get, + .put = avs_control_mute_put, + .info = avs_control_mute_info, + }, }; static const struct avs_tplg_token_parser control_parsers[] = { From patchwork Mon Feb 17 10:21:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cezary Rojewski X-Patchwork-Id: 13977457 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A8D4216E21 for ; Mon, 17 Feb 2025 10:07:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786858; cv=none; b=U6Bh1vaxF05Da+g923ezi8eVBnV+vkDFTfGvwBMldi9SgDXaLgarXEeaDoGk7JeRJ60mcW4Z8T2v5djEo1AJyeLmFLcJbb547eJXaYU5/5EF2PEOj3Cn2Q6RJAIac1p6ynga2wKoNjENXYWafsRbXoBMTZ7QnJ8pOJQZ5XJ/V3s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786858; c=relaxed/simple; bh=KdM2CjudHfmca369zxucwqa0Nt7V9OY/skgNF2PekZU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=L8QpDrxID4w/5G/nOtydyYJeERJ2Mjc8Onfj8RaUT+iGWyBgpbfI4uvbiVt5/DkBXxUAH7LTG3bBpDDuk0oNId9em59J/m8NIsj2Hl0xaN17fshtQI/icUFBQzOCgvbd3Jg4mVzVG47ATAg+ZP2fOFB3HH18exXbByxkqdMNcgM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=EpYtlGdp; arc=none smtp.client-ip=192.198.163.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="EpYtlGdp" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1739786857; x=1771322857; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=KdM2CjudHfmca369zxucwqa0Nt7V9OY/skgNF2PekZU=; b=EpYtlGdpdPrXAvuFjr4uT4Kq/FjkfSZ07Wmef7JK9L7OsBJ+830va6og oKLHVAFNsDXkgUGSSg+ocIjbR3KdktVcCJaAhiTOd0WxMNvyt+H9f4kPN pNUjcXEDFkm/hfYXsnJsS9bzeXmUwAtwzUS1nDZz5Vt0JNxNf0f7qD6I5 UT1/qtC9yZddm8tL7rvdatT0UDgNobCso04y1ZGE6ZtjPGjkoR2LLyoba Q7ZFKLT+t5qXBk6oLaChFU/Hntu4dqCvlgCvJFGLrceSSFS1q1q/5kdmv /jXN8HorVnW7TJT84zDmtlzuoZayUSDHELNSIupIUsZF5twOwYANWJQa9 g==; X-CSE-ConnectionGUID: S11FyjcpScmrJ1lL8VMluA== X-CSE-MsgGUID: focuatIITrutlj+rYhXJ7g== X-IronPort-AV: E=McAfee;i="6700,10204,11347"; a="65818337" X-IronPort-AV: E=Sophos;i="6.13,292,1732608000"; d="scan'208";a="65818337" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2025 02:07:37 -0800 X-CSE-ConnectionGUID: AdSZehEZSE2JkfmKjXmeOQ== X-CSE-MsgGUID: IoM7+6KFSDe58dmM3By0BA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="118219075" Received: from crojewsk-ctrl.igk.intel.com ([10.237.149.254]) by fmviesa003.fm.intel.com with ESMTP; 17 Feb 2025 02:07:35 -0800 From: Cezary Rojewski To: broonie@kernel.org Cc: tiwai@suse.com, perex@perex.cz, amadeuszx.slawinski@linux.intel.com, linux-sound@vger.kernel.org, Cezary Rojewski Subject: [PATCH 09/10] ASoC: Intel: avs: Honor the invert flag for mixer controls Date: Mon, 17 Feb 2025 11:21:14 +0100 Message-Id: <20250217102115.3539427-10-cezary.rojewski@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250217102115.3539427-1-cezary.rojewski@intel.com> References: <20250217102115.3539427-1-cezary.rojewski@intel.com> Precedence: bulk X-Mailing-List: linux-sound@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Values for the mute flag represented on the AudioDSP side are inverted. Check mixer control description and initialize default values accordingly. Signed-off-by: Cezary Rojewski --- sound/soc/intel/avs/topology.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/sound/soc/intel/avs/topology.c b/sound/soc/intel/avs/topology.c index 9ef1adb077f4..3c222c352701 100644 --- a/sound/soc/intel/avs/topology.c +++ b/sound/soc/intel/avs/topology.c @@ -1943,18 +1943,20 @@ avs_control_load(struct snd_soc_component *comp, int index, struct snd_kcontrol_ struct avs_control_data *ctl_data; struct soc_mixer_control *mc; size_t block_size; - int ret; + int ret, i; switch (le32_to_cpu(hdr->type)) { case SND_SOC_TPLG_TYPE_MIXER: - tmc = container_of(hdr, typeof(*tmc), hdr); - tuples = tmc->priv.array; - block_size = le32_to_cpu(tmc->priv.size); break; default: return -EINVAL; } + mc = (struct soc_mixer_control *)ctmpl->private_value; + tmc = container_of(hdr, typeof(*tmc), hdr); + tuples = tmc->priv.array; + block_size = le32_to_cpu(tmc->priv.size); + ctl_data = devm_kzalloc(comp->card->dev, sizeof(*ctl_data), GFP_KERNEL); if (!ctl_data) return -ENOMEM; @@ -1965,8 +1967,13 @@ avs_control_load(struct snd_soc_component *comp, int index, struct snd_kcontrol_ if (ret) return ret; - mc = (struct soc_mixer_control *)ctmpl->private_value; mc->dobj.private = ctl_data; + if (tmc->invert) { + ctl_data->values[0] = mc->max; + for (i = 1; i < mc->num_channels; i++) + ctl_data->values[i] = mc->max; + } + return 0; } From patchwork Mon Feb 17 10:21:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cezary Rojewski X-Patchwork-Id: 13977458 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A8B382165E3 for ; Mon, 17 Feb 2025 10:07:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786860; cv=none; b=PIifVfQ9N8rq7si4mhMYqimYy8t7QgZxF4zEKwWvwCfGjNevODKlIo5e/DQ6bqOiSw4zyfqLWXjOuHkcLo4H5bjC4hfsMvuK3HzlR/zhJzpoq9e+VZv/z0naUCsxVx7gOWKlrDtcBwNYoVFJr5XJiD1mnOkG6bpsM0J9fNcs6fA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739786860; c=relaxed/simple; bh=Z9wYJSdPhi3GkG4catQnHY9r2j1Sf1qWKaNVh/ObkTQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=sJ24uHni7ZgfUJBcoHLAU7P72tZVUp0k2/FHYdm3Vfph83HWCvIZQEl5K6Qb4FEFR9Rj/q9r6lVrKBcQ+g4vj6HwUA7EMdo7O1K8hawpdPmiNR6uwW+/tyAXjEuoli355upZ81ohebpXm5JIaSfa0YsbNFw/1+0oNgueJNaKum8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Ry4Cv1PT; arc=none smtp.client-ip=192.198.163.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Ry4Cv1PT" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1739786859; x=1771322859; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Z9wYJSdPhi3GkG4catQnHY9r2j1Sf1qWKaNVh/ObkTQ=; b=Ry4Cv1PTHE960qpnshIYCKAvYCyO8rooX4ZMxCqeMKjcMuDHmM6UWgNE zDebwBE5u9GEYkk1d3mNFNOt9kr0HPbuGDz7V1vVkKRNPWqRsSuo5mBUI dW5ZURzDWzV5jGZZbwPA0EF9S3rC9wezUMbVzWQ/Eadux4GXYMYurZe7i gdFTq2IHm/i+d5tOy0RXlmkKIUhAm5S/N/KGH1bGU2EfK7nsV8OX1lZbf uAWQRFstx0k0hkNo7kiufJhg0s/MEjTjcIsZAR9vj3TksvpyyiyZmICKj TinF/Wdik+eZK2NIe91Yj9uOhcdNCHWgPxsIPZyqv1CzFhGJaW42yYr0S Q==; X-CSE-ConnectionGUID: 4qptTQZRT72HFFQGpu6cAA== X-CSE-MsgGUID: L1qs54TSTIy3sGIX/B0E7w== X-IronPort-AV: E=McAfee;i="6700,10204,11347"; a="65818342" X-IronPort-AV: E=Sophos;i="6.13,292,1732608000"; d="scan'208";a="65818342" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2025 02:07:38 -0800 X-CSE-ConnectionGUID: 7EhWxeYySDq7xwi+i2jZQg== X-CSE-MsgGUID: 3r7NH+CnQMazvWn+TL96Dw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="118219080" Received: from crojewsk-ctrl.igk.intel.com ([10.237.149.254]) by fmviesa003.fm.intel.com with ESMTP; 17 Feb 2025 02:07:37 -0800 From: Cezary Rojewski To: broonie@kernel.org Cc: tiwai@suse.com, perex@perex.cz, amadeuszx.slawinski@linux.intel.com, linux-sound@vger.kernel.org, Cezary Rojewski Subject: [PATCH 10/10] ASoC: Intel: avs: Support multi-channel PEAKVOL instantiation Date: Mon, 17 Feb 2025 11:21:15 +0100 Message-Id: <20250217102115.3539427-11-cezary.rojewski@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250217102115.3539427-1-cezary.rojewski@intel.com> References: <20250217102115.3539427-1-cezary.rojewski@intel.com> Precedence: bulk X-Mailing-List: linux-sound@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 The PEAKVOL module initialization procedure allows for specifying default configuration for all individual channels. To reflect that in the code, first update avs_get_module_control() to allow for selecting Volume or Mute control based on needs and then apply the settings with newly added avs_peakvol_set_volume() and avs_peakvol_set_mute(). Signed-off-by: Cezary Rojewski --- sound/soc/intel/avs/path.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/sound/soc/intel/avs/path.c b/sound/soc/intel/avs/path.c index 403510494e77..ef0c1d125d66 100644 --- a/sound/soc/intel/avs/path.c +++ b/sound/soc/intel/avs/path.c @@ -300,7 +300,8 @@ static int avs_whm_create(struct avs_dev *adev, struct avs_path_module *mod) return ret; } -static struct avs_control_data *avs_get_module_control(struct avs_path_module *mod) +static struct soc_mixer_control *avs_get_module_control(struct avs_path_module *mod, + const char *name) { struct avs_tplg_module *t = mod->template; struct avs_tplg_path_template *path_tmpl; @@ -316,8 +317,8 @@ static struct avs_control_data *avs_get_module_control(struct avs_path_module *m mc = (struct soc_mixer_control *)w->kcontrols[i]->private_value; ctl_data = (struct avs_control_data *)mc->dobj.private; - if (ctl_data->id == t->ctl_id) - return ctl_data; + if (ctl_data->id == t->ctl_id && strstr(w->kcontrols[i]->id.name, name)) + return mc; } return NULL; @@ -398,17 +399,11 @@ int avs_peakvol_set_mute(struct avs_dev *adev, struct avs_path_module *mod, static int avs_peakvol_create(struct avs_dev *adev, struct avs_path_module *mod) { struct avs_tplg_module *t = mod->template; - struct avs_control_data *ctl_data; + struct soc_mixer_control *mc; struct avs_peakvol_cfg *cfg; - int volume = S32_MAX; size_t cfg_size; int ret; - ctl_data = avs_get_module_control(mod); - if (ctl_data) - volume = ctl_data->values[0]; - - /* As 2+ channels controls are unsupported, have a single block for all channels. */ cfg_size = struct_size(cfg, vols, 1); if (cfg_size > AVS_MAILBOX_SIZE) return -EINVAL; @@ -420,15 +415,28 @@ static int avs_peakvol_create(struct avs_dev *adev, struct avs_path_module *mod) cfg->base.obs = t->cfg_base->obs; cfg->base.is_pages = t->cfg_base->is_pages; cfg->base.audio_fmt = *t->in_fmt; - cfg->vols[0].target_volume = volume; cfg->vols[0].channel_id = AVS_ALL_CHANNELS_MASK; + cfg->vols[0].target_volume = S32_MAX; cfg->vols[0].curve_type = t->cfg_ext->peakvol.curve_type; cfg->vols[0].curve_duration = t->cfg_ext->peakvol.curve_duration; ret = avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, t->core_id, t->domain, cfg, cfg_size, &mod->instance_id); + if (ret) + return ret; - return ret; + /* Now configure both VOLUME and MUTE parameters. */ + mc = avs_get_module_control(mod, "Volume"); + if (mc) { + ret = avs_peakvol_set_volume(adev, mod, mc, NULL); + if (ret) + return ret; + } + + mc = avs_get_module_control(mod, "Switch"); + if (mc) + return avs_peakvol_set_mute(adev, mod, mc, NULL); + return 0; } static int avs_updown_mix_create(struct avs_dev *adev, struct avs_path_module *mod)