Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2230075/?format=api
{ "id": 2230075, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2230075/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-tegra/patch/20260429070603.2791011-1-sheetal@nvidia.com/", "project": { "id": 21, "url": "http://patchwork.ozlabs.org/api/1.1/projects/21/?format=api", "name": "Linux Tegra Development", "link_name": "linux-tegra", "list_id": "linux-tegra.vger.kernel.org", "list_email": "linux-tegra@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null }, "msgid": "<20260429070603.2791011-1-sheetal@nvidia.com>", "date": "2026-04-29T07:06:03", "name": "[v2] ASoC: tegra: Add per-stream Mixer Fade controls", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "88eab1f62be0bb08e76e0be8f488ddab4a628c75", "submitter": { "id": 87986, "url": "http://patchwork.ozlabs.org/api/1.1/people/87986/?format=api", "name": "Sheetal .", "email": "sheetal@nvidia.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-tegra/patch/20260429070603.2791011-1-sheetal@nvidia.com/mbox/", "series": [ { "id": 502006, "url": "http://patchwork.ozlabs.org/api/1.1/series/502006/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-tegra/list/?series=502006", "date": "2026-04-29T07:06:03", "name": "[v2] ASoC: tegra: Add per-stream Mixer Fade controls", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/502006/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2230075/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2230075/checks/", "tags": {}, "headers": { "Return-Path": "\n <linux-tegra+bounces-14051-incoming=patchwork.ozlabs.org@vger.kernel.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linux-tegra@vger.kernel.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256\n header.s=selector2 header.b=kIxAdjUJ;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=linux-tegra+bounces-14051-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)", "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com\n header.b=\"kIxAdjUJ\"", "smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=40.107.200.25", "smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=nvidia.com", "smtp.subspace.kernel.org;\n spf=fail smtp.mailfrom=nvidia.com" ], "Received": [ "from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g57jR2YRZz1xqf\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 29 Apr 2026 17:10:03 +1000 (AEST)", "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 8D666304D718\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 29 Apr 2026 07:08:44 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 0CDA63A3820;\n\tWed, 29 Apr 2026 07:08:44 +0000 (UTC)", "from CH5PR02CU005.outbound.protection.outlook.com\n (mail-northcentralusazon11012025.outbound.protection.outlook.com\n [40.107.200.25])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F1F33A3E94;\n\tWed, 29 Apr 2026 07:08:37 +0000 (UTC)", "from BL0PR02CA0008.namprd02.prod.outlook.com (2603:10b6:207:3c::21)\n by MN2PR12MB4206.namprd12.prod.outlook.com (2603:10b6:208:1d5::18) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9870.20; Wed, 29 Apr\n 2026 07:08:28 +0000", "from MN1PEPF0000ECD6.namprd02.prod.outlook.com\n (2603:10b6:207:3c:cafe::19) by BL0PR02CA0008.outlook.office365.com\n (2603:10b6:207:3c::21) with Microsoft SMTP Server (version=TLS1_3,\n cipher=TLS_AES_256_GCM_SHA384) id 15.20.9846.29 via Frontend Transport; Wed,\n 29 Apr 2026 07:08:28 +0000", "from mail.nvidia.com (216.228.117.161) by\n MN1PEPF0000ECD6.mail.protection.outlook.com (10.167.242.135) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.9846.18 via Frontend Transport; Wed, 29 Apr 2026 07:08:28 +0000", "from rnnvmail205.nvidia.com (10.129.68.10) by mail.nvidia.com\n (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 29 Apr\n 2026 00:08:12 -0700", "from rnnvmail202.nvidia.com (10.129.68.7) by rnnvmail205.nvidia.com\n (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 29 Apr\n 2026 00:08:11 -0700", "from build-sheetal-bionic-20251202.nvidia.com (10.127.8.14) by\n mail.nvidia.com (10.129.68.7) with Microsoft SMTP Server id 15.2.2562.20 via\n Frontend Transport; Wed, 29 Apr 2026 00:08:11 -0700" ], "ARC-Seal": [ "i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1777446522; cv=fail;\n b=Lwkje4sdJQ24JiBGu4LndmyoetIrXnhtMCL0OlEDYjxYhZx6LrO80pNVEybLrTkpJ/WuLw9QZZqJgP37rLihiZ68hfOJtKAJSGOtkA57EYcmxr9xcNpXcz+C/4Da0VZrXjg/hucly+0YbAkfEGSffqZ7pDKyKoZ7W3ywBJIwaZE=", "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=bji4gvdiE2pJ5OHWRogdmjbQ+WQU/ep8LWdSZaUMNYw2dV8GiACouKqu0ACdqmWpA3q4lBdgmIk89IhSec97Q5c+1qgrfNIDidG1nXX9aNk+sDbgRlzGm4iTgIVPxez0UCESAckjXuqiY4sAie1kdxHEximX9/GEONHVC0KQCufgG8C/1NucfflYbi6JMFQO9cxmCU3CZ15JwszZ87yJreD1qB0JfXW9thg1CYP8jfZ5CKvWRLo/HU+9UZwRm/QQODBXTazzjGouVG//Rm2UwNvcnm5SqAIChU1IF2lRUFNrEnzOYY6aS83VLpQX0MZAMtgpvIkYCpDokX+jlq2j2w==" ], "ARC-Message-Signature": [ "i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1777446522; c=relaxed/simple;\n\tbh=7AiPRadnNRLUnsdZAEPbLImlsMxubns5oejUKwr6s5g=;\n\th=From:To:CC:Subject:Date:Message-ID:MIME-Version:Content-Type;\n b=frx4DVHOoQzrsZpjvJIuOZtdrLXZrQA9gSj8K4AeqB+w76rdbxDzb9amq/AS5mOyEtgREwkRcM36BTRE3OC5JtTUVQYmuWL8Lun4A3pxAoaPhcc+mIdtYl0FI2e33TM8oSyOIFrkNQqhuR8l+INa/7XLIHXvghQ1D7YA7MDnfDg=", "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=HHLGhJUjmkk91bt2maFVbnNxKMbmcLuBihe9DX9myTk=;\n b=vb1LOml1Yt6d91xCbLfdK7go3tWJQfGgAb2c73hlWspBkpqBVOQ5BZpej8y8yB1T+abh2ZHSrM7u3HOBvIZhM9dtU4qLYXD51dqgZAu461Nm+q5igEXuXiXCIkf55/BlwD2VHJziA+09qCDbzisZPIx4nKvVVKDvzqPkcZyatw73/Nq92lPwOJXlgJfnLNxtm/0KShrb8cyh1si9YVpBnjIvfiS3IYnlBSFvJLYUjsizd1gJ6kYVc/kWIHGmtpzWZfnpP2Czhx6KFjGkNT/yecw5My9HfJElCbj1qoFQz23xlf6UMFwI87dvcnohurtiuRqBPqjPRsj0Zo4A311E9Q==" ], "ARC-Authentication-Results": [ "i=2; smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=nvidia.com;\n spf=fail smtp.mailfrom=nvidia.com;\n dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com\n header.b=kIxAdjUJ; arc=fail smtp.client-ip=40.107.200.25", "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 216.228.117.161) smtp.rcpttodomain=gmail.com smtp.mailfrom=nvidia.com;\n dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com;\n dkim=none (message not signed); arc=none (0)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=HHLGhJUjmkk91bt2maFVbnNxKMbmcLuBihe9DX9myTk=;\n b=kIxAdjUJxfPiRq0k5OjpTpzG3Kj242jDYzp0Hhsy/Oh40NuwkZvrNoR1ccxGPXG9uVywvmEWeZacLulQEf+sWbFOsgH8nF/0ZNs48Q3snVeLKytpNfhsnnXe1cS2Qhp/bXSxfGjFfkgGETHignoAuKtZm8lVFmz6V69gHlzpPTY91VnxKtUB7HZeDq0hptLwbjrrM6PGYEj0fGycJPzO4vn5MVsSrKNZ7KixWjhLwSXOMVbdR1hmrLBkbHcPN+LWiLnxxZyElO7TUDSe/ABDaVMQoTRwW/ibmxCRJtSAqdMfk1MZm+3Z1J7+DwJHD+ObLfWHid8+gKzlm21Ge6ZsqQ==", "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 216.228.117.161)\n smtp.mailfrom=nvidia.com; dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=nvidia.com;", "Received-SPF": "Pass (protection.outlook.com: domain of nvidia.com designates\n 216.228.117.161 as permitted sender) receiver=protection.outlook.com;\n client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C", "From": "Sheetal <sheetal@nvidia.com>", "To": "Liam Girdwood <lgirdwood@gmail.com>, Mark Brown <broonie@kernel.org>", "CC": "Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>, \"Thierry\n Reding\" <thierry.reding@kernel.org>, Jonathan Hunter <jonathanh@nvidia.com>,\n\tSameer Pujar <spujar@nvidia.com>, Mohan Kumar <mkumard@nvidia.com>, \"Kuninori\n Morimoto\" <kuninori.morimoto.gx@renesas.com>, <linux-sound@vger.kernel.org>,\n\t<linux-tegra@vger.kernel.org>, <linux-kernel@vger.kernel.org>, Sheetal\n\t<sheetal@nvidia.com>", "Subject": "[PATCH v2] ASoC: tegra: Add per-stream Mixer Fade controls", "Date": "Wed, 29 Apr 2026 07:06:03 +0000", "Message-ID": "<20260429070603.2791011-1-sheetal@nvidia.com>", "X-Mailer": "git-send-email 2.17.1", "Precedence": "bulk", "X-Mailing-List": "linux-tegra@vger.kernel.org", "List-Id": "<linux-tegra.vger.kernel.org>", "List-Subscribe": "<mailto:linux-tegra+subscribe@vger.kernel.org>", "List-Unsubscribe": "<mailto:linux-tegra+unsubscribe@vger.kernel.org>", "MIME-Version": "1.0", "Content-Type": "text/plain", "X-NV-OnPremToCloud": "ExternallySecured", "X-EOPAttributedMessage": "0", "X-MS-PublicTrafficType": "Email", "X-MS-TrafficTypeDiagnostic": "MN1PEPF0000ECD6:EE_|MN2PR12MB4206:EE_", "X-MS-Office365-Filtering-Correlation-Id": "7523ed52-9f93-4bbb-475b-08dea5be1d14", "X-MS-Exchange-SenderADCheck": "1", "X-MS-Exchange-AntiSpam-Relay": "0", "X-Microsoft-Antispam": "\n\tBCL:0;ARA:13230040|82310400026|1800799024|30052699003|36860700016|376014|18002099003|56012099003;", "X-Microsoft-Antispam-Message-Info": "\n\tdyw+rO9+gkZXf0ynNsONLHRlsiKkG0NcuKl+s2BwQa2pWlxn0bP2QPMcHir2jdC8D4ObDt6fpDxPS4oJU+MpbIrOn4l0sRZBMWm0q2EZ/9Ackz93VylYtYgF4ml4dfZqK/nMYd2B42gZQwVQNG9Zzir+g2IHCoksM6U/U5bENjQhZs/1r0isER48fr4mI322AMza7bUjqTRi+aLKPJtbHytP4BRFU+qzv7tynqrZ72xW3GsDLhwMgGX3bpcLAtR0Ph3sGH+SyDaFYkGGe6m03VAH0vzUgb7N74maAYOGr6voRLl5vqlvyxXva2ddQgT9baY52Tf4ab9PElYXrD9iCbJplC+EXg0QUuLveuF/0gWWX0WC0d0N1rFYOcpmv1eqykut8p4fI+sPEXukbemtPZJGVLefthj+GsATTRt1zj/qhCdNsGqGRXRgTy5L7PrGPY9JibGiKArY12uv3f/5QqUifbCL1JTlla4Z4Cz88fRMQROmbA/j10FUloDYppBJRuqWfLmwDp+6XbsFz3rzThPii9xB+pGvnhQe/79wiY2x7d60spitipB+sAiXuHwZFPz+SIXFn3NJjMdqR8BST6iyMdkDxJfttEwkMSzbaKaFOGzUSxgfp+jn9yclp4R/kUy6iSpAVtBy9+1WcpYEJWgmngO9ugJs/Pt5voxS34Xn7LAmlzyit16Uo6BfbtR0LpmG9zi9Z/vWbqfHVhAW4y4wat1cFjwTRjp/z3pRfy1/JImrSCMUZvQjJYvIgaVwC4m6BNi5c34XlzpMQypRkg==", "X-Forefront-Antispam-Report": "\n\tCIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(30052699003)(36860700016)(376014)(18002099003)(56012099003);DIR:OUT;SFP:1101;", "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1", "X-MS-Exchange-AntiSpam-MessageData-0": "\n\tQIYji629KRlKgL01mXGhgp7zCTuzvEwGYBvr/TQQganc6kxIIDXf9FZk7EoT4GFUEifngPyptuJfyaRH5C09bUtRsJBHMXHzHaMCJ7VD8NBBy4vuj9tZkL2C6kiTLbbnrc7jBL4CHahn91bod3GzBUjuroel2gSjza0XE6Wyki3V+BmRdcTZwLl29oITikYgq5oZdS6nMI9sb3TuWk4h8eKYZHdXI5nfRmKa+RvqWnGrikKAFdNQCeQfo02CPPtjnFfBsXmjRSNa1F7nj1BGlRCF5wKpdM8vM3fXDPaT5PcrgB8gV1ij8VQaPOCsm0pmLlvuqKzDlEdbF1uyenJrv/NKdFQs9bUs8Srq1rzy7OsyRR5QnDwPmu5wsQI6AXNXffd+qpI9H0TtOW3720f0uUaMiAM2ypSxz9smKsgmbAXdqzv24zLcOV2OiF2TZToS", "X-OriginatorOrg": "Nvidia.com", "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "29 Apr 2026 07:08:28.1418\n (UTC)", "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 7523ed52-9f93-4bbb-475b-08dea5be1d14", "X-MS-Exchange-CrossTenant-Id": "43083d15-7273-40c1-b7db-39efd9ccc17a", "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com]", "X-MS-Exchange-CrossTenant-AuthSource": "\n\tMN1PEPF0000ECD6.namprd02.prod.outlook.com", "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous", "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem", "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MN2PR12MB4206" }, "content": "Add per-stream fade controls for the Tegra mixer to allow\nindependently configuring target gain and fade duration for each of\nthe 10 input streams (RX1 through RX10).\n\nThe following controls are added per stream:\n \"RXn Fade Duration\" - fade duration in samples (N3 parameter)\n \"RXn Fade Gain\" - target gain level for fade\n\nA strobe control commits all pending fade configurations:\n \"Fade Enable\" - applies staged gain/duration for all pending\n streams and starts the fade\n\nA read-only status control reports per-stream fade state:\n \"Fade Status\" - per-stream state for all 10 RX inputs\n -1 = inactive, 0 = active, 1 = complete\n\nUsage example (fade 2 streams simultaneously):\n amixer -c <card> cset name=\"RX1 Fade Duration\" 1024\n amixer -c <card> cset name=\"RX1 Fade Gain\" 12000\n amixer -c <card> cset name=\"RX2 Fade Duration\" 2048\n amixer -c <card> cset name=\"RX2 Fade Gain\" 15000\n amixer -c <card> cset name=\"Fade Enable\" 1\n\nSigned-off-by: Sheetal <sheetal@nvidia.com>\n---\nChanges in v2:\n- Replaced packed triplet control with per-stream \"RXn Fade Duration\"\n and \"RXn Fade Gain\" controls, plus a \"Fade Enable\" strobe to commit\n all pending fades atomically (Mark)\n- Added duration == 0 validation to prevent divide-by-zero (Mark)\n- Fixed configure_gain using stale values by separating staging (put)\n from apply (strobe), so values are stored before hardware write (Mark)\n- Fixed BIT(31) * BIT(6) integer overflow on 32-bit systems by using\n BIT_ULL\n- Added pm_runtime_resume_and_get() error checking in put_fade_enable\n and get_fade_status\n- Split fade_enable into two passes: configure gain first, then enable\n sample count for all streams to start fading near-simultaneously\n- Added TEGRA210_MIXER_GAIN_MAX and TEGRA210_MIXER_FADE_DURATION_MAX\n macros to replace magic numbers in control definitions\n\n sound/soc/tegra/tegra210_mixer.c | 236 ++++++++++++++++++++++++++++++-\n sound/soc/tegra/tegra210_mixer.h | 20 ++-\n 2 files changed, 249 insertions(+), 7 deletions(-)", "diff": "diff --git a/sound/soc/tegra/tegra210_mixer.c b/sound/soc/tegra/tegra210_mixer.c\nindex ce44117a0b9c..f461303fba25 100644\n--- a/sound/soc/tegra/tegra210_mixer.c\n+++ b/sound/soc/tegra/tegra210_mixer.c\n@@ -151,10 +151,17 @@ static int tegra210_mixer_configure_gain(struct snd_soc_component *cmpnt,\n \tfor (i = 0; i < NUM_DURATION_PARMS; i++) {\n \t\tint val;\n \n-\t\tif (instant_gain)\n+\t\tif (instant_gain) {\n \t\t\tval = 1;\n-\t\telse\n-\t\t\tval = gain_params.duration[i];\n+\t\t} else {\n+\t\t\tif (i == DURATION_N3_ID)\n+\t\t\t\tval = mixer->duration[id];\n+\t\t\telse if (i == DURATION_INV_N3_ID)\n+\t\t\t\tval = (u32)(BIT_ULL(31 + TEGRA210_MIXER_PRESCALAR) /\n+\t\t\t\t\t mixer->duration[id]);\n+\t\t\telse\n+\t\t\t\tval = gain_params.duration[i];\n+\t\t}\n \n \t\terr = tegra210_mixer_write_ram(mixer,\n \t\t\t\t\t REG_DURATION_PARAM(reg, i),\n@@ -173,6 +180,175 @@ static int tegra210_mixer_configure_gain(struct snd_soc_component *cmpnt,\n \treturn err;\n }\n \n+static int tegra210_mixer_get_fade_duration(struct snd_kcontrol *kcontrol,\n+\t\t\t\t\t struct snd_ctl_elem_value *ucontrol)\n+{\n+\tstruct soc_mixer_control *mc =\n+\t\t(struct soc_mixer_control *)kcontrol->private_value;\n+\tstruct snd_soc_component *cmpnt = snd_kcontrol_chip(kcontrol);\n+\tstruct tegra210_mixer *mixer = snd_soc_component_get_drvdata(cmpnt);\n+\n+\tucontrol->value.integer.value[0] = mixer->duration[mc->reg];\n+\n+\treturn 0;\n+}\n+\n+static int tegra210_mixer_put_fade_duration(struct snd_kcontrol *kcontrol,\n+\t\t\t\t\t struct snd_ctl_elem_value *ucontrol)\n+{\n+\tstruct soc_mixer_control *mc =\n+\t\t(struct soc_mixer_control *)kcontrol->private_value;\n+\tstruct snd_soc_component *cmpnt = snd_kcontrol_chip(kcontrol);\n+\tstruct tegra210_mixer *mixer = snd_soc_component_get_drvdata(cmpnt);\n+\tunsigned int id = mc->reg;\n+\tu32 duration = ucontrol->value.integer.value[0];\n+\n+\tif (duration == 0)\n+\t\treturn -EINVAL;\n+\n+\tif (mixer->duration[id] == duration)\n+\t\treturn 0;\n+\n+\tmixer->duration[id] = duration;\n+\tmixer->fade_pending[id] = true;\n+\n+\treturn 1;\n+}\n+\n+static int tegra210_mixer_get_fade_gain(struct snd_kcontrol *kcontrol,\n+\t\t\t\t\tstruct snd_ctl_elem_value *ucontrol)\n+{\n+\tstruct soc_mixer_control *mc =\n+\t\t(struct soc_mixer_control *)kcontrol->private_value;\n+\tstruct snd_soc_component *cmpnt = snd_kcontrol_chip(kcontrol);\n+\tstruct tegra210_mixer *mixer = snd_soc_component_get_drvdata(cmpnt);\n+\n+\tucontrol->value.integer.value[0] = mixer->gain_value[mc->reg];\n+\n+\treturn 0;\n+}\n+\n+static int tegra210_mixer_put_fade_gain(struct snd_kcontrol *kcontrol,\n+\t\t\t\t\tstruct snd_ctl_elem_value *ucontrol)\n+{\n+\tstruct soc_mixer_control *mc =\n+\t\t(struct soc_mixer_control *)kcontrol->private_value;\n+\tstruct snd_soc_component *cmpnt = snd_kcontrol_chip(kcontrol);\n+\tstruct tegra210_mixer *mixer = snd_soc_component_get_drvdata(cmpnt);\n+\tunsigned int id = mc->reg;\n+\n+\tif (mixer->gain_value[id] == ucontrol->value.integer.value[0])\n+\t\treturn 0;\n+\n+\tmixer->gain_value[id] = ucontrol->value.integer.value[0];\n+\tmixer->fade_pending[id] = true;\n+\n+\treturn 1;\n+}\n+\n+static int tegra210_mixer_get_fade_enable(struct snd_kcontrol *kcontrol,\n+\t\t\t\t\t struct snd_ctl_elem_value *ucontrol)\n+{\n+\tucontrol->value.integer.value[0] = 0;\n+\n+\treturn 0;\n+}\n+\n+static int tegra210_mixer_put_fade_enable(struct snd_kcontrol *kcontrol,\n+\t\t\t\t\t struct snd_ctl_elem_value *ucontrol)\n+{\n+\tstruct snd_soc_component *cmpnt = snd_kcontrol_chip(kcontrol);\n+\tstruct tegra210_mixer *mixer = snd_soc_component_get_drvdata(cmpnt);\n+\tint id, err, changed = 0;\n+\n+\t/* Configure gain for all pending streams */\n+\tfor (id = 0; id < TEGRA210_MIXER_RX_MAX; id++) {\n+\t\tif (!mixer->fade_pending[id])\n+\t\t\tcontinue;\n+\n+\t\terr = tegra210_mixer_configure_gain(cmpnt, id, false);\n+\t\tif (err) {\n+\t\t\tdev_err(cmpnt->dev,\n+\t\t\t\t\"Failed to configure fade for RX%d\\n\", id + 1);\n+\t\t\treturn err;\n+\t\t}\n+\n+\t\tchanged = 1;\n+\t}\n+\n+\tif (!changed)\n+\t\treturn 0;\n+\n+\t/* Enable sample count for all pending streams */\n+\terr = pm_runtime_resume_and_get(cmpnt->dev);\n+\tif (err < 0)\n+\t\treturn err;\n+\n+\tfor (id = 0; id < TEGRA210_MIXER_RX_MAX; id++) {\n+\t\tif (!mixer->fade_pending[id])\n+\t\t\tcontinue;\n+\n+\t\tif (!mixer->in_fade[id]) {\n+\t\t\terr = regmap_update_bits(mixer->regmap,\n+\t\t\t\t\t\t MIXER_REG(TEGRA210_MIXER_RX1_CTRL, id),\n+\t\t\t\t\t\t TEGRA210_MIXER_SAMPLE_COUNT_ENABLE,\n+\t\t\t\t\t\t TEGRA210_MIXER_SAMPLE_COUNT_ENABLE);\n+\t\t\tif (err) {\n+\t\t\t\tdev_err(cmpnt->dev,\n+\t\t\t\t\t\"Failed to enable sample count for RX%d\\n\",\n+\t\t\t\t\tid + 1);\n+\t\t\t\tpm_runtime_put(cmpnt->dev);\n+\t\t\t\treturn err;\n+\t\t\t}\n+\t\t\tmixer->in_fade[id] = true;\n+\t\t}\n+\n+\t\tmixer->fade_pending[id] = false;\n+\t}\n+\n+\tpm_runtime_put(cmpnt->dev);\n+\n+\treturn 1;\n+}\n+\n+static int tegra210_mixer_get_fade_status(struct snd_kcontrol *kcontrol,\n+\t\t\t\t\t struct snd_ctl_elem_value *ucontrol)\n+{\n+\tstruct snd_soc_component *cmpnt = snd_kcontrol_chip(kcontrol);\n+\tstruct tegra210_mixer *mixer = snd_soc_component_get_drvdata(cmpnt);\n+\tu32 count;\n+\tint id, err;\n+\n+\terr = pm_runtime_resume_and_get(cmpnt->dev);\n+\tif (err < 0)\n+\t\treturn err;\n+\n+\tfor (id = 0; id < TEGRA210_MIXER_RX_MAX; id++) {\n+\t\tif (!mixer->in_fade[id]) {\n+\t\t\tucontrol->value.integer.value[id] = TEGRA210_MIXER_FADE_IDLE;\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tregmap_read(mixer->regmap,\n+\t\t\t MIXER_REG(TEGRA210_MIXER_RX1_SAMPLE_COUNT, id),\n+\t\t\t &count);\n+\n+\t\tif (count >= mixer->duration[id]) {\n+\t\t\tucontrol->value.integer.value[id] = TEGRA210_MIXER_FADE_COMPLETE;\n+\t\t\tregmap_update_bits(mixer->regmap,\n+\t\t\t\t\t MIXER_REG(TEGRA210_MIXER_RX1_CTRL, id),\n+\t\t\t\t\t TEGRA210_MIXER_SAMPLE_COUNT_ENABLE, 0);\n+\t\t\tmixer->in_fade[id] = false;\n+\t\t} else {\n+\t\t\tucontrol->value.integer.value[id] = TEGRA210_MIXER_FADE_ACTIVE;\n+\t\t}\n+\t}\n+\n+\tpm_runtime_put(cmpnt->dev);\n+\n+\treturn 0;\n+}\n+\n static int tegra210_mixer_get_gain(struct snd_kcontrol *kcontrol,\n \t\t\t\t struct snd_ctl_elem_value *ucontrol)\n {\n@@ -396,14 +572,37 @@ ADDER_CTRL_DECL(adder3, TEGRA210_MIXER_TX3_ADDER_CONFIG);\n ADDER_CTRL_DECL(adder4, TEGRA210_MIXER_TX4_ADDER_CONFIG);\n ADDER_CTRL_DECL(adder5, TEGRA210_MIXER_TX5_ADDER_CONFIG);\n \n+static int tegra210_mixer_fade_status_info(struct snd_kcontrol *kcontrol,\n+\t\t\t\t\t struct snd_ctl_elem_info *uinfo)\n+{\n+\tuinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;\n+\tuinfo->count = TEGRA210_MIXER_RX_MAX;\n+\tuinfo->value.integer.min = TEGRA210_MIXER_FADE_IDLE;\n+\tuinfo->value.integer.max = TEGRA210_MIXER_FADE_COMPLETE;\n+\n+\treturn 0;\n+}\n+\n+#define FADE_CTRL(id)\t\t\t\t\t\t\t\\\n+\tSOC_SINGLE_EXT(\"RX\" #id \" Fade Duration\", (id) - 1, 0,\t\t\\\n+\t\t TEGRA210_MIXER_FADE_DURATION_MAX, 0,\t\t\\\n+\t\t tegra210_mixer_get_fade_duration,\t\t\t\\\n+\t\t tegra210_mixer_put_fade_duration),\t\t\\\n+\tSOC_SINGLE_EXT(\"RX\" #id \" Fade Gain\", (id) - 1, 0,\t\t\\\n+\t\t TEGRA210_MIXER_GAIN_MAX, 0,\t\t\t\\\n+\t\t tegra210_mixer_get_fade_gain,\t\t\t\\\n+\t\t tegra210_mixer_put_fade_gain),\n+\n #define GAIN_CTRL(id)\t\\\n \tSOC_SINGLE_EXT(\"RX\" #id \" Gain Volume\",\t\t\t\\\n \t\t MIXER_GAIN_CFG_RAM_ADDR((id) - 1), 0,\t\\\n-\t\t 0x20000, 0, tegra210_mixer_get_gain,\t\\\n+\t\t TEGRA210_MIXER_GAIN_MAX, 0,\t\t\\\n+\t\t tegra210_mixer_get_gain,\t\t\t\\\n \t\t tegra210_mixer_put_gain),\t\t\\\n \tSOC_SINGLE_EXT(\"RX\" #id \" Instant Gain Volume\",\t\t\\\n \t\t MIXER_GAIN_CFG_RAM_ADDR((id) - 1), 0,\t\\\n-\t\t 0x20000, 0, tegra210_mixer_get_gain,\t\\\n+\t\t TEGRA210_MIXER_GAIN_MAX, 0,\t\t\\\n+\t\t tegra210_mixer_get_gain,\t\t\t\\\n \t\t tegra210_mixer_put_instant_gain),\n \n /* Volume controls for all MIXER inputs */\n@@ -418,6 +617,28 @@ static const struct snd_kcontrol_new tegra210_mixer_gain_ctls[] = {\n \tGAIN_CTRL(8)\n \tGAIN_CTRL(9)\n \tGAIN_CTRL(10)\n+\n+\tFADE_CTRL(1)\n+\tFADE_CTRL(2)\n+\tFADE_CTRL(3)\n+\tFADE_CTRL(4)\n+\tFADE_CTRL(5)\n+\tFADE_CTRL(6)\n+\tFADE_CTRL(7)\n+\tFADE_CTRL(8)\n+\tFADE_CTRL(9)\n+\tFADE_CTRL(10)\n+\tSOC_SINGLE_EXT(\"Fade Enable\", SND_SOC_NOPM, 0, 1, 0,\n+\t\t tegra210_mixer_get_fade_enable,\n+\t\t tegra210_mixer_put_fade_enable),\n+\t{\n+\t\t.iface = SNDRV_CTL_ELEM_IFACE_MIXER,\n+\t\t.name = \"Fade Status\",\n+\t\t.info = tegra210_mixer_fade_status_info,\n+\t\t.access = SNDRV_CTL_ELEM_ACCESS_READ |\n+\t\t\t SNDRV_CTL_ELEM_ACCESS_VOLATILE,\n+\t\t.get = tegra210_mixer_get_fade_status,\n+\t},\n };\n \n static const struct snd_soc_dapm_widget tegra210_mixer_widgets[] = {\n@@ -579,6 +800,7 @@ static bool tegra210_mixer_volatile_reg(struct device *dev,\n \tcase TEGRA210_MIXER_GAIN_CFG_RAM_DATA:\n \tcase TEGRA210_MIXER_PEAKM_RAM_CTRL:\n \tcase TEGRA210_MIXER_PEAKM_RAM_DATA:\n+\tcase TEGRA210_MIXER_RX1_SAMPLE_COUNT:\n \t\treturn true;\n \tdefault:\n \t\treturn false;\n@@ -632,8 +854,10 @@ static int tegra210_mixer_platform_probe(struct platform_device *pdev)\n \tdev_set_drvdata(dev, mixer);\n \n \t/* Use default gain value for all MIXER inputs */\n-\tfor (i = 0; i < TEGRA210_MIXER_RX_MAX; i++)\n+\tfor (i = 0; i < TEGRA210_MIXER_RX_MAX; i++) {\n \t\tmixer->gain_value[i] = gain_params.gain_value;\n+\t\tmixer->duration[i] = gain_params.duration[DURATION_N3_ID];\n+\t}\n \n \tregs = devm_platform_ioremap_resource(pdev, 0);\n \tif (IS_ERR(regs))\ndiff --git a/sound/soc/tegra/tegra210_mixer.h b/sound/soc/tegra/tegra210_mixer.h\nindex a330530fbc61..b7c896dec2e8 100644\n--- a/sound/soc/tegra/tegra210_mixer.h\n+++ b/sound/soc/tegra/tegra210_mixer.h\n@@ -9,6 +9,7 @@\n #ifndef __TEGRA210_MIXER_H__\n #define __TEGRA210_MIXER_H__\n \n+\n /* XBAR_RX related MIXER offsets */\n #define TEGRA210_MIXER_RX1_SOFT_RESET\t0x04\n #define TEGRA210_MIXER_RX1_STATUS\t0x10\n@@ -79,12 +80,26 @@\n #define TEGRA210_MIXER_RX_LIMIT\t\t(TEGRA210_MIXER_RX_MAX * TEGRA210_MIXER_REG_STRIDE)\n #define TEGRA210_MIXER_TX_MAX\t\t5\n #define TEGRA210_MIXER_TX_LIMIT\t\t(TEGRA210_MIXER_RX_LIMIT + (TEGRA210_MIXER_TX_MAX * TEGRA210_MIXER_REG_STRIDE))\n+#define TEGRA210_MIXER_SAMPLE_COUNT_SHIFT\t24\n+#define TEGRA210_MIXER_SAMPLE_COUNT_ENABLE\tBIT(TEGRA210_MIXER_SAMPLE_COUNT_SHIFT)\n \n #define REG_CFG_DONE_TRIGGER\t0xf\n #define VAL_CFG_DONE_TRIGGER\t0x1\n \n #define NUM_GAIN_POLY_COEFFS 9\n-#define NUM_DURATION_PARMS 4\n+#define TEGRA210_MIXER_GAIN_MAX\t\t\t0x20000\n+#define TEGRA210_MIXER_FADE_DURATION_MAX\t0x7fffffff\n+\n+#define TEGRA210_MIXER_PRESCALAR\t 6\n+#define TEGRA210_MIXER_FADE_IDLE\t (-1)\n+#define TEGRA210_MIXER_FADE_ACTIVE\t 0\n+#define TEGRA210_MIXER_FADE_COMPLETE\t1\n+\n+enum {\n+\tDURATION_N3_ID = 2,\n+\tDURATION_INV_N3_ID,\n+\tNUM_DURATION_PARMS,\n+};\n \n struct tegra210_mixer_gain_params {\n \tint poly_coeff[NUM_GAIN_POLY_COEFFS];\n@@ -94,6 +109,9 @@ struct tegra210_mixer_gain_params {\n \n struct tegra210_mixer {\n \tint gain_value[TEGRA210_MIXER_RX_MAX];\n+\tu32 duration[TEGRA210_MIXER_RX_MAX];\n+\tbool in_fade[TEGRA210_MIXER_RX_MAX];\n+\tbool fade_pending[TEGRA210_MIXER_RX_MAX];\n \tstruct regmap *regmap;\n };\n \n", "prefixes": [ "v2" ] }