From nobody Sun Feb 8 12:20:24 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012057.outbound.protection.outlook.com [40.93.195.57]) (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 97245342151; Sat, 10 Jan 2026 06:45:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.57 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768027529; cv=fail; b=UvNutE9JZq0CviKlsaMLDnr8QlUQsXjnkSKN3xjT/zjx2slVKH5QK4Y6Tc7bvFvbvxiIP6NpnBxakk9OLsOT4MAJw05VMBnU0HB30G1uCdSELY1+zyRwNvYO+WwbbJTQew1FiANRKqiHd/XfhOjRF1hCAHVRarkddIoDpHXgvi8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768027529; c=relaxed/simple; bh=/rR+wCUTaWOhZwhVzZviN5tRbdhvKoaCFT2pnW2xhtg=; h=From:To:CC:Subject:Date:Message-ID:MIME-Version:Content-Type; b=mXJW1qWNH8PITa6IDVzwCykiw68v4RTv/wcVqyxegis1/tDeSTDl6/QvOCIVMzX/YQrLVRJJbRW06NfdqyZ3MHvENORyAF1vD3+QEaMZtoSV31arPHHs8pbcbHHDYI77b7/ecfam2p2nLlNfX6Ybfrkxki1XyPdTClmXP0qWb8I= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=kBm7mnpK; arc=fail smtp.client-ip=40.93.195.57 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="kBm7mnpK" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=khgXi7kJsj1HQDFCBlmP6PiZpL/M8e3CPTCLSFlBuQ+X7YOz7gcK4oOWswAo7+EUHchosiFIN38PER3KG3ihbLBHFY5R6FbDB3oJ+qRZsujDNORydmi+fRhW5hRFr5vwECUjAvj7IHnhSqbniZyxsw8foOAFuM6SBoLZNDEJ67zhvDzP6netC2GaWtHTJG3B3sCz8gLbdV+0peWG4sGSkJRcVNJHhPBU2gngCYaQyQ64aL598NhNhlfKs0b5rTfhoP5ZbZCZXnVskksWzHrh13EeAOQfUatTknr7t0phExlskiAuykbSpHOCG/xqk1inDzpswQwoXB1mXnrh0lbAAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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; bh=BYPzNQsjXOwoBNBajPotZ2uIUQJirximAAPAwwWtQd4=; b=eK1puZbFD6cyrSBGUSYn6fTcs2mmBGc4ykDNdOXiwLeN89Qi7htpN8rB/lICL+2SLZg025iUkYaeR0dvGvRNhuC6TBDu26OsJIwGOzjzNdZxm4sB2mlaAp1TDSWZGZFyKaDPegg58NZWUaM5dFstsrumgdtunlK7amqdFJKDQyoLs4yWDPAe2WJWsQDA8UTnj+YheHkCJuYRbGa7Z0o3vpYe9a6+yC6F3lCqyqbqbuPIhgmvBYmfhiQWf0cY4Cvz5ND2qRp7J2HEQpBw8pUe3ht65vypcLmx/RA5a8y5aF3KwWKt9LnyguT3oKdFK7HTDLpkXmTRCR+f7M2MwcL6dg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=BYPzNQsjXOwoBNBajPotZ2uIUQJirximAAPAwwWtQd4=; b=kBm7mnpKVCGCIHzXgvZj4gWDOmALVvZSqfK7CZvksGRSMclZ75kPBNN8IW96lQiwAGghpNbWaEYYRJYdCbpKlVCvg6JOK5JW/P9NzQ/xuHFAYQ5W12Q9NMPk0Ain97Z9YZuZgn+EdWbWws+TMnvfpFQJM6ls7rruheBh6VdHRKk= Received: from CH0P221CA0036.NAMP221.PROD.OUTLOOK.COM (2603:10b6:610:11d::14) by DM6PR12MB4219.namprd12.prod.outlook.com (2603:10b6:5:217::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9499.2; Sat, 10 Jan 2026 06:45:22 +0000 Received: from CH2PEPF0000009D.namprd02.prod.outlook.com (2603:10b6:610:11d:cafe::8e) by CH0P221CA0036.outlook.office365.com (2603:10b6:610:11d::14) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9499.6 via Frontend Transport; Sat, 10 Jan 2026 06:45:18 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by CH2PEPF0000009D.mail.protection.outlook.com (10.167.244.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.1 via Frontend Transport; Sat, 10 Jan 2026 06:45:22 +0000 Received: from vijendar-linux.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Sat, 10 Jan 2026 00:45:18 -0600 From: Vijendar Mukunda To: CC: , , , , , , , , , , Vijendar Mukunda Subject: [PATCH] ASoC: amd: acp: soc-acpi: add is_device_rt712_vb() helper Date: Sat, 10 Jan 2026 12:14:14 +0530 Message-ID: <20260110064505.1485927-1-Vijendar.Mukunda@amd.com> X-Mailer: git-send-email 2.45.2 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH2PEPF0000009D:EE_|DM6PR12MB4219:EE_ X-MS-Office365-Filtering-Correlation-Id: 427cbe84-c823-4f5e-feab-08de5013d40a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|36860700013|1800799024|82310400026; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ERJBh1b0Dt8h9q7uxdRYUeOv0BkQ4sTIn7I5aDIqyOsQL1+oWZDvH0TktJ/c?= =?us-ascii?Q?gfgNgBIUbR3w54Hzb7Q0rJcahVOSxwTd5nofnnHvd2Pdgy0eU/yik+YwLW/F?= =?us-ascii?Q?19AO1+gBEgDDjLv13ZY8c9qv/UtgekKMbdiSBdXYZ0XEiqZh0LGLw3MGrkqd?= =?us-ascii?Q?bgvTx2a2ijlCW/uVJp75Y1VgmItBKLWkcE312DNgNxYlT3AJ7NQTtG+gmFzH?= =?us-ascii?Q?JZk2ze+5EDOCT1Xv9JUXSpRLjKB9FvIeUGQjCGFzJP3qbx9+YncmqAc5GlAS?= =?us-ascii?Q?wNCsp6YYXY4BdK44ERDTkeAqBFQS3o14XS1go5Ie1LqSxmycHVvtRw0iwKa5?= =?us-ascii?Q?qWioDFnW5gPtZcPKI7mlgPtmVJ87X7vAbVdbm+79lwGNqvRBToRUOqY1WI0Q?= =?us-ascii?Q?6N8May+fQzduFx2avXv17SfO7KkRdLarXbpTBMdrXQlo64u84f9NE9s/YZZK?= =?us-ascii?Q?65tzSeyPCxTvD7cbqXL7sejF3I6EjLV4S0Gomos4wlhtW4gWdQMSHfHhEiGd?= =?us-ascii?Q?51GqAJL+Q3EM9uvBDHlgf6Cg2fFx6YYKt1uIZD7k0n1V1OnBB61KAJ5cZVK6?= =?us-ascii?Q?NFoiQaCZmo72YxLClPH4sr7GGTgGbBbp0+9/baE/2gSJTRj/1IXFiBkVjca8?= =?us-ascii?Q?CKFbwPeD2PDuVXi4vczuD7ZBx/TZMLzBp8CjXxU0K6N6prKCQ25eplqhDDE5?= =?us-ascii?Q?6YFNkdjsWVShJOajohGtp7bbn4wBOneYEAsEudIekecEfcEYsu2fT6VP76aT?= =?us-ascii?Q?U1q6PeJFAuA9zoJrC0vZpSKNIoTgMLMRaCAQuxKfGQ580NDMhBY78/DfNKiq?= =?us-ascii?Q?bjp7Aq5LNDzzc00JjCTLwgnAWhXdU/GSD37+jX1X4OnKivXagrEA6PMmfgwd?= =?us-ascii?Q?dBfn/WcVUHLS5HHUYFRqwJpfF2N4zuGUecOIPhI9LPxdqBQ3nRBgXBpVLSzF?= =?us-ascii?Q?lA4lyvfjn0c9orHjoU8nHa+EO53EXlxu4DwKO5i085RO4jq3H/AKr5A3C2Gs?= =?us-ascii?Q?aqMGSyDBMLeRFSpG6bjBazla5OWaOA2XP8ejvmvenzEmHTw7jsgqJ3mN7bzG?= =?us-ascii?Q?ET4Kg0RwXKTryhnJEaYCjmudLreieuxg2eukNv/V29Lrkk3I/dkiDqB143ql?= =?us-ascii?Q?ZDi1REDaxik5NhFhjOojtPtyilpZxaCtd4ireSb+Kt/VsJ5DyS50nu0UKEql?= =?us-ascii?Q?jNiiOVhICZddK11J0jVS4V7yP6PedsbOZvjG8uKmYnOloG7aQTqW9LuHIGx/?= =?us-ascii?Q?Lg9bWy7fXhcIVpeq3fitZjucrL0ktgT2YFNSVqRpDRcZ78Hn/1spk30z1uLi?= =?us-ascii?Q?Mpqagpb5Lr5bHqhdIDVGwQdVWa+PP8N9+pkuSJnSZMK7IDcNcIWq6sauAvxB?= =?us-ascii?Q?CCu6cUOreNeM1VB09y8t7bVr/NE60xkbL0VL0hllUqHkThCVsxZk1nya/sDx?= =?us-ascii?Q?uoz57lw2rqH1ZUyfcvztz5MBUHL4N6jZsMGaLT9YwxaktSiJs7E/srkRDmGR?= =?us-ascii?Q?snCIFRiN8LUhkbSkBDRMfgy3n43AnVZ159ePdxzwCLmA8N24wYBN9iklpyhH?= =?us-ascii?Q?Ze2TAI3FeBN/tVmW5J0=3D?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(36860700013)(1800799024)(82310400026);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jan 2026 06:45:22.4747 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 427cbe84-c823-4f5e-feab-08de5013d40a X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH2PEPF0000009D.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4219 Content-Type: text/plain; charset="utf-8" Add a filter to skip the RT172 VB configuration if a SmartMic Function is not found in the SDCA descriptors. If the ACPI information is incorrect this can only be quirked further with DMI information. Signed-off-by: Vijendar Mukunda Reviewed-by: Mario Limonciello (AMD) --- sound/soc/amd/acp/Kconfig | 6 +++ sound/soc/amd/acp/Makefile | 2 + sound/soc/amd/acp/amd-acp70-acpi-match.c | 50 ++++++++++++++++++++ sound/soc/amd/acp/soc-acpi-amd-sdca-quirks.c | 42 ++++++++++++++++ sound/soc/amd/acp/soc-acpi-amd-sdca-quirks.h | 14 ++++++ 5 files changed, 114 insertions(+) create mode 100644 sound/soc/amd/acp/soc-acpi-amd-sdca-quirks.c create mode 100644 sound/soc/amd/acp/soc-acpi-amd-sdca-quirks.h diff --git a/sound/soc/amd/acp/Kconfig b/sound/soc/amd/acp/Kconfig index c2a60bc80ee6..ed2fa055f7f6 100644 --- a/sound/soc/amd/acp/Kconfig +++ b/sound/soc/amd/acp/Kconfig @@ -15,8 +15,14 @@ config SND_SOC_AMD_ACP_COMMON =20 config SND_SOC_ACPI_AMD_MATCH tristate + select SND_SOC_ACPI_AMD_SDCA_QUIRKS select SND_SOC_ACPI if ACPI =20 +config SND_SOC_ACPI_AMD_SDCA_QUIRKS + tristate + depends on ACPI + depends on SND_SOC_SDCA + if SND_SOC_AMD_ACP_COMMON =20 config SND_SOC_AMD_ACP_PDM diff --git a/sound/soc/amd/acp/Makefile b/sound/soc/amd/acp/Makefile index 08220b9a3802..81d23aded348 100644 --- a/sound/soc/amd/acp/Makefile +++ b/sound/soc/amd/acp/Makefile @@ -27,6 +27,7 @@ snd-soc-acpi-amd-match-y :=3D amd-acp63-acpi-match.o amd-= acp70-acpi-match.o snd-acp-sdw-mach-y :=3D acp-sdw-mach-common.o snd-acp-sdw-sof-mach-y +=3D acp-sdw-sof-mach.o snd-acp-sdw-legacy-mach-y +=3D acp-sdw-legacy-mach.o +snd-soc-acpi-amd-sdca-quirks-y +=3D soc-acpi-amd-sdca-quirks.o =20 obj-$(CONFIG_SND_SOC_AMD_ACP_PCM) +=3D snd-acp-pcm.o obj-$(CONFIG_SND_SOC_AMD_ACP_I2S) +=3D snd-acp-i2s.o @@ -40,6 +41,7 @@ obj-$(CONFIG_SND_AMD_ASOC_REMBRANDT) +=3D snd-acp-rembran= dt.o obj-$(CONFIG_SND_AMD_ASOC_ACP63) +=3D snd-acp63.o obj-$(CONFIG_SND_AMD_ASOC_ACP70) +=3D snd-acp70.o =20 +obj-$(CONFIG_SND_SOC_ACPI_AMD_SDCA_QUIRKS) +=3D snd-soc-acpi-amd-sdca-quir= ks.o obj-$(CONFIG_SND_AMD_SOUNDWIRE_ACPI) +=3D snd-amd-sdw-acpi.o obj-$(CONFIG_SND_SOC_AMD_MACH_COMMON) +=3D snd-acp-mach.o obj-$(CONFIG_SND_SOC_AMD_LEGACY_MACH) +=3D snd-acp-legacy-mach.o diff --git a/sound/soc/amd/acp/amd-acp70-acpi-match.c b/sound/soc/amd/acp/a= md-acp70-acpi-match.c index 871b4f054a84..fa39f18578ca 100644 --- a/sound/soc/amd/acp/amd-acp70-acpi-match.c +++ b/sound/soc/amd/acp/amd-acp70-acpi-match.c @@ -7,6 +7,7 @@ */ =20 #include +#include "soc-acpi-amd-sdca-quirks.h" #include "../mach-config.h" =20 static const struct snd_soc_acpi_endpoint single_endpoint =3D { @@ -44,6 +45,39 @@ static const struct snd_soc_acpi_endpoint spk_3_endpoint= =3D { .group_id =3D 1 }; =20 +static const struct snd_soc_acpi_endpoint jack_amp_g1_dmic_endpoints[] =3D= { + /* Jack Endpoint */ + { + .num =3D 0, + .aggregated =3D 0, + .group_position =3D 0, + .group_id =3D 0, + }, + /* Amp Endpoint, work as spk_l_endpoint */ + { + .num =3D 1, + .aggregated =3D 1, + .group_position =3D 0, + .group_id =3D 1, + }, + /* DMIC Endpoint */ + { + .num =3D 2, + .aggregated =3D 0, + .group_position =3D 0, + .group_id =3D 0, + }, +}; + +static const struct snd_soc_acpi_adr_device rt712_vb_1_group1_adr[] =3D { + { + .adr =3D 0x000130025D071201ull, + .num_endpoints =3D ARRAY_SIZE(jack_amp_g1_dmic_endpoints), + .endpoints =3D jack_amp_g1_dmic_endpoints, + .name_prefix =3D "rt712" + } +}; + static const struct snd_soc_acpi_adr_device rt711_rt1316_group_adr[] =3D { { .adr =3D 0x000030025D071101ull, @@ -254,6 +288,15 @@ static const struct snd_soc_acpi_link_adr acp70_cs35l5= 6x4_l1[] =3D { {} }; =20 +static const struct snd_soc_acpi_link_adr acp70_alc712_vb_l1[] =3D { + { + .mask =3D BIT(1), + .num_adr =3D ARRAY_SIZE(rt712_vb_1_group1_adr), + .adr_d =3D rt712_vb_1_group1_adr, + }, + {} +}; + static const struct snd_soc_acpi_link_adr acp70_rt722_only[] =3D { { .mask =3D BIT(0), @@ -308,6 +351,12 @@ struct snd_soc_acpi_mach snd_soc_acpi_amd_acp70_sdw_ma= chines[] =3D { .links =3D acp70_cs35l56x4_l1, .drv_name =3D "amd_sdw", }, + { + .link_mask =3D BIT(1), + .links =3D acp70_alc712_vb_l1, + .machine_check =3D snd_soc_acpi_amd_sdca_is_device_rt712_vb, + .drv_name =3D "amd_sdw", + }, {}, }; EXPORT_SYMBOL(snd_soc_acpi_amd_acp70_sdw_machines); @@ -327,3 +376,4 @@ EXPORT_SYMBOL(snd_soc_acpi_amd_acp70_sof_sdw_machines); MODULE_DESCRIPTION("AMD ACP7.0 & ACP7.1 tables and support for ACPI enumer= ation"); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Vijendar.Mukunda@amd.com"); +MODULE_IMPORT_NS("SND_SOC_ACPI_AMD_SDCA_QUIRKS"); diff --git a/sound/soc/amd/acp/soc-acpi-amd-sdca-quirks.c b/sound/soc/amd/a= cp/soc-acpi-amd-sdca-quirks.c new file mode 100644 index 000000000000..63bf9e3c0ae1 --- /dev/null +++ b/sound/soc/amd/acp/soc-acpi-amd-sdca-quirks.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * soc-acpi-amd-sdca-quirks.c - tables and support for SDCA quirks + * + * Copyright(c) 2025 Advanced Micro Devices, Inc. All rights reserved. + * + */ + +#include +#include +#include +#include "soc-acpi-amd-sdca-quirks.h" + +/* + * Pretend machine quirk. The argument type is not the traditional + * 'struct snd_soc_acpi_mach' pointer but instead the sdw_amd_ctx + * which contains the peripheral information required for the + * SoundWire/SDCA filter on the SMART_MIC setup and interface + * revision. When the return value is false, the entry in the + * 'snd_soc_acpi_mach' table needs to be skipped. + */ +bool snd_soc_acpi_amd_sdca_is_device_rt712_vb(void *arg) +{ + struct sdw_amd_ctx *ctx =3D arg; + int i; + + if (!ctx) + return false; + + for (i =3D 0; i < ctx->peripherals->num_peripherals; i++) { + if (sdca_device_quirk_match(ctx->peripherals->array[i], + SDCA_QUIRKS_RT712_VB)) + return true; + } + + return false; +} +EXPORT_SYMBOL_NS(snd_soc_acpi_amd_sdca_is_device_rt712_vb, "SND_SOC_ACPI_A= MD_SDCA_QUIRKS"); + +MODULE_DESCRIPTION("ASoC ACPI AMD SDCA quirks"); +MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS("SND_SOC_SDCA"); diff --git a/sound/soc/amd/acp/soc-acpi-amd-sdca-quirks.h b/sound/soc/amd/a= cp/soc-acpi-amd-sdca-quirks.h new file mode 100644 index 000000000000..7e345a236da1 --- /dev/null +++ b/sound/soc/amd/acp/soc-acpi-amd-sdca-quirks.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * soc-acpi-amd-sdca-quirks.h - tables and support for SDCA quirks + * + * Copyright(c) 2025 Advanced Micro Devices, Inc. All rights reserved. + * + */ + +#ifndef _SND_SOC_ACPI_AMD_SDCA_QUIRKS +#define _SND_SOC_ACPI_AMD_SDCA_QUIRKS + +bool snd_soc_acpi_amd_sdca_is_device_rt712_vb(void *arg); + +#endif --=20 2.45.2