From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 07FA7E77188 for ; Tue, 14 Jan 2025 08:18:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:In-Reply-To:From:References:Cc:To: Subject:Date:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=VIQTLaWmVjDgYWGclsBHYnA3iuQrOhapLI3aG+oIhZA=; b=qonsDfm61hinu3e4FS0o+/80v9 CS/s9wgyqQ8GBSGjHChr6nXNOQR8NzFbU0c/Gj2f922VH8mHaszbQb0iFif7WbKl/10FM/JrykIc1 i50tBN47JvD29omC2wjyL8wEymNt1Y/Bbu+ne5rLRqF6JgZnaBNpzELF7jM1+Ndkj+3PhB9/+f1Us u1zFj7D9lztWcWek5AwFqKM6ox1H2IRDO3RfBIXha8Zk2fpCpMTMF3ivGR+zfhf+XOTdnKQQzgPBk 4GYxujjH7BcExeS6c+AcXWru4dLK9BfEwNmJlrSL//MFsDdQMdFqPDTgGYTHcfgLDiKu96ZuESLv1 v2i3syTQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tXc7z-00000007nRY-1WwE; Tue, 14 Jan 2025 08:18:23 +0000 Received: from mail-sg2apc01on2072a.outbound.protection.outlook.com ([2a01:111:f403:200f::72a] helo=APC01-SG2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tXc6j-00000007nN5-2z6x; Tue, 14 Jan 2025 08:17:07 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Jeg9ywvzS6J/57AC09n4JmsglcPTPxwGbQLOkLIBP+vE56y2WT57ZR3Q+xjrf87wQAbtRy3COuppyhwjYBx+/f3BlUZaZvwZ6qTpM231npeLaynRBd+iKRHKHNUa+enrWVJaGDPf5fewCCOcCdEzuhrxX41qnadiQp5kpOoydyMRMDZ219NJe4L9C0TYH2zDESGoxD6o4TA9SDRJA3iAtMT2Vbmm0N3dLuMToV9sdDvU3DyIWQTdOsU/VtvRLSfDHqicdGCiLze/ynQgLmgbGZwKzNJDiHFGsdV+rbxKlZstHqVuqLiaV6iu7guQgpWeyf4bSCMcb4l0IChrpw7aSw== 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=9fhS7QfUhH4AoZ36WNXl8ExkV4odwP47CWmn43y0d4E=; b=fayEQ0YHmLSr5dETVOmU94OJZTtbd1Nvs4nXN8WTcV16eBmqZSZv2NRHTEJ+kSCHUOmVPobLzPvhoatArCykK7X5Ao6T5Eh2JAslqFdH2vkf0nUfIas3k29fbwLXOIv9TVyv1YtmHNk14HTE01pTXIKUogLqLwNNTW2E9Fd57YIKw1QCFR4aimgORNKhjuKouL5CNLuaQOIG31GzSYnAk9WMc/dnKOWcQeHXi9ecWh8eMG5kwiPfUhXbp3CxAj+7D7rWMyDF8uVrxvMBhVkCDebfWSOeO2EvC+wnytovfCRgt6dFigaEaJ0ARTpCj1cofgTSuCr+j6kAWKg2qrFgvA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amlogic.com; dmarc=pass action=none header.from=amlogic.com; dkim=pass header.d=amlogic.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amlogic.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9fhS7QfUhH4AoZ36WNXl8ExkV4odwP47CWmn43y0d4E=; b=OzYaxzV2ARWFxDKtYoRt2s+GHW3AqKTgNqCqXcI41MkMM6UmCSUyr9lRckFFNTmyrsIJC5nQ9uFvg1PMWjQZXCPSYtXpK065meNogfy2PW7MjwyWY9qiy5CLknI+crCrngCTAJTVhV8mWXF6y/afkTEplkMT/0GXr6CR3uWgsR3y65bFdHU7pmQFL+53MuIABQwZpHercH8lOqkP3C6pR6Qb3hqqnGpirirNC1P8AYa783TaVvo1uo1AoIUc2lj8GwL3iXGRktkcobCn379brlVoOmtz3qarZPXnwwt+iGo+a3Ev32ZXAHKISFo2jFcIc5Jfp4/Y8pSML4IaoWEkSQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amlogic.com; Received: from SEYPR03MB7118.apcprd03.prod.outlook.com (2603:1096:101:d3::12) by TYZPR03MB7845.apcprd03.prod.outlook.com (2603:1096:400:44e::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8335.17; Tue, 14 Jan 2025 08:16:45 +0000 Received: from SEYPR03MB7118.apcprd03.prod.outlook.com ([fe80::b748:89c0:9b9c:64d3]) by SEYPR03MB7118.apcprd03.prod.outlook.com ([fe80::b748:89c0:9b9c:64d3%7]) with mapi id 15.20.8335.017; Tue, 14 Jan 2025 08:16:43 +0000 Message-ID: Date: Tue, 14 Jan 2025 16:16:39 +0800 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 2/3] ASoC: meson: s4:support for the on-chip audio To: Jerome Brunet , jiebing chen via B4 Relay Cc: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jaroslav Kysela , Takashi Iwai , Neil Armstrong , Kevin Hilman , Martin Blumenstingl , linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-amlogic@lists.infradead.org References: <20250113-audio_drvier-v1-0-8c14770f38a0@amlogic.com> <20250113-audio_drvier-v1-2-8c14770f38a0@amlogic.com> <1jwmey9451.fsf@starbuckisacylon.baylibre.com> From: Jiebing Chen In-Reply-To: <1jwmey9451.fsf@starbuckisacylon.baylibre.com> X-ClientProxiedBy: SI1PR02CA0011.apcprd02.prod.outlook.com (2603:1096:4:1f7::19) To SEYPR03MB7118.apcprd03.prod.outlook.com (2603:1096:101:d3::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR03MB7118:EE_|TYZPR03MB7845:EE_ X-MS-Office365-Filtering-Correlation-Id: 8f009f64-0577-4810-009a-08dd3473c7cd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016; X-Microsoft-Antispam-Message-Info: =?utf-8?B?QWhIM2d5SlB6SDQrbHprVW9qVWNWTTFSMEltOW0rMlE1WER0STRLZ2tsVWlV?= =?utf-8?B?YmVLRkRSaXdUKzZydlptTHYvUVB5OTQ3bGYvcG1pbmZaSi8xdWNJc20vbXBz?= =?utf-8?B?VVdqTlk3clRvVWxYQWNlODRnZzFFckdUbjMyTUlsZGR6eG05TjBpUUd2dDJz?= =?utf-8?B?YXRFaU55VENvVjJBbWpkSUVuWjFINEUzODhwUXlBaUNKUGhSNzgzWnpXT2JS?= =?utf-8?B?MW5DcU1LTHhYSDBBcngxZGVIMzBaUkIyWHBnLzhBMndyMG1GbVl0VG9XekVv?= =?utf-8?B?TFZQN3AyZDVJb0UxSXd4dzYyTHN2a1dYdDl5a0h2TlhUQ0tEaTBSMGx5UTdN?= =?utf-8?B?a1p1WU0rK2NLTmU3R3ZGMW41enlvU1ovanlaWlA1MVVUc3BENW1GdUh6dkQv?= =?utf-8?B?emRlM0pqTFJaMDh6dkJEWjRzSmxJcHVtNHBpa01TV2FCUk53cThZZnJDczN6?= =?utf-8?B?WVBvc00yelJpY2VMTFpQU1FYaFIwZmVDbkJsY3RHb0Q4Y0pCVWY3NXJNeUpW?= =?utf-8?B?VmtPMmRFeG1YVnQrWW8vYVBuN1Q2K21HV3RFK1RZcXdLK292bzJQaG9jQnNG?= =?utf-8?B?SGw2WkhyYXFIeEplaUF6Qm5ZNm9Eb0lJZ205cU5oU1grQlRFN2M5cXV1ZE1r?= =?utf-8?B?Sk92S2xob0VWR3RrVHc3MkxMK3hvVGdsWmNqMWhEYm9SWkFQVTJqeGdteTNm?= =?utf-8?B?KzIyTkIySk5VMnluWXRaVG4vOU9BUTBSTmorUStuMThCb09GVCtkdVZPUnpV?= =?utf-8?B?TktDb3d4V0t0QjRzc1dWVnovQUNlSFNEdFZOVzViSit3VDJteE9lTnRJaS9I?= =?utf-8?B?U25IbzVuanRqKzZ2T0ZBdWl0MHFvMXh3dk5hUWoxRi8xYm5ndEh3TnFkeE5I?= =?utf-8?B?b0xiUnEwdGVoZndpdlVuNDRyRGJVN0tVa1gvNnhKMFZrTUVGdFA3R2RiK2JU?= =?utf-8?B?SWlETTZqSzlObHFQd1pyWFVSUW1qV1FKRmtkeGhiakhCQXpCV29KVkl3TXFU?= =?utf-8?B?aXZQdzF4ZVpyM2x4YURwV2UrUjlSdXQrT0I2K3dPWHJSV0ZCc2hNOFV2RUxK?= =?utf-8?B?WDZwL25lNmQ2RTR4Q1crQUZXMVNEYjY0QXN2SzFWUHdBTDRsb3g2RE1RNHFK?= =?utf-8?B?Um53d2p1L282OWxsYU5VWmNwM3NPOHJ1V0YzclhIaG5wWWMrdk1sRHVRWHF4?= =?utf-8?B?VDlxUi9KZnZmQkh4eHgwME5vR3FPL1VmbUU4QXlJSXplSlJpNGJXQXQrUlgz?= =?utf-8?B?enhDVUFjdGRuUE9JV0NudmY1Z1Q4MTBQb2cxVlJ3Z2JZUmo4ODk1LzIzNXVS?= =?utf-8?B?TFhxeUxvS3Z0MDZnWldhZHJsb0VabEVFcEhtZTR6UjBNaVhLRWdzc2IvLzlJ?= =?utf-8?B?ZWVEeVovdEhTeE1TaTJiZ2RSQjgyd0NPKy9qaGpFR1JNLzh2ZEFwZm5pUC9K?= =?utf-8?B?MUowZFp2a25kVEV2Y3ZiNkd2VWZyOHpGWXJBUmpiVVF4eHZkMm9CbU42MGxK?= =?utf-8?B?NUJSMEswemc1RVg0TGh5bmJLbEw5Z2lRUU1BNk9yUzE3eUlNdUdzTWVpUVZS?= =?utf-8?B?dlBML0o2djVkYlZtYk9QVTYrS1ZYUnJXUFZZeXRBS2RHeVdIWENGUmlzTzRv?= =?utf-8?B?K2E4Q1U4VUNzQTRBL08zcGlqVE5mbkJKSlhuREw2WjM1MFc3QjlUTERMdU9D?= =?utf-8?B?T1ZvT3krQ08vMFFVNkpielRrUVZkTk1DU0FSRVk2S3ZQMTYzRGJtekR6UFZV?= =?utf-8?B?dTl4d2xqNUc2bzhtcUFZQURLa2R6dkVDZDQvVm43WGM3T3NWbENDTmRFK2tJ?= =?utf-8?B?MFdsd1g4eDVxVTUvZkpsR2tNcEpqeXpXNjBDSEQwK0dpd0VydmtpdUVqWE1U?= =?utf-8?Q?tP1qu5j9JmF8X?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SEYPR03MB7118.apcprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(366016);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NkdXNGY0SGJ3Vk9KZHFoUFY0cEZjcEtScUlqa2szbk83MDMyQmFudUZ5b21h?= =?utf-8?B?U3FtanlkdjBpOU5iOWVFQmdRTlYrNCtGZ2dpcjI0Rm1qMDh4cWFlM2JIQm9o?= =?utf-8?B?TzdaWml5eXVtTnk1WklzM0VlclZWN2hTYkFOMEptZnRKSWx2VjRFK3phZ3A5?= =?utf-8?B?NmdOVnBPNHNTU0lHa1hKeVRVeTNKcHZ2bHhGdnZka2RweWhSQWxzdVRoRi95?= =?utf-8?B?czFhcm9neVpYbTFTbHN4SkYzbHpPZ0k3NXBHZzlvNTl5QWtlNDZ1S1V2K050?= =?utf-8?B?cjkxeVFqLzhjZnMzM1VHbUZuV3dHVXFoNVpGTFdmM0RCbFIxNFpEZ25OaU44?= =?utf-8?B?Sm5YQ2RTS2RMU21HdWU1SzZPQWdBamJYaE9DOUNLcEhwL2k2YklyZkJ1NDNE?= =?utf-8?B?cDFEaU04ZnNJL2s1UEM2blF6SGJtbW4xT3RzYTlHRUxQUk1PaklOeHVwYUZ3?= =?utf-8?B?Ky9tTzJveXBvbGsybHNUaklEdloyWnpzZTdvdzM2WGhKWHNSVGRncEE1enR1?= =?utf-8?B?Z2llSlpMeEV1V2g1MFhEcmI0eXdGQnA4Ymp2R0VwbzJGZGVJSGN0MjZ1K2Nn?= =?utf-8?B?c29WNjExeTM4cmhRSDc3cDRTU0NHY29ka3BzajVUVTh1bnh0WjNuaW14TDQ3?= =?utf-8?B?UEpxZlpweHVlRjdIWERpTCtreVdZY05pQXZlbTZZUDBXVndLV2FKb2pOUjlO?= =?utf-8?B?U1lWY3V4SFJadjlacThDaHl1TmFGRjVsWXFvUmVYY21nMlBJUGlNZUpQR05m?= =?utf-8?B?U2x0bXBZaFFlQ2FnQkl0dUorSTBUV0VTTThXUGZpY0RJNGQ2aWZxL1B6emty?= =?utf-8?B?bEplNFo3V1JyK2VxekNrUktZa095aWJkMHMwd0ZINjRZamNQdVdvU0gycG5w?= =?utf-8?B?VWJXRkV0VVJaWUY1aW00cVAyMFZMalNTOUhRTm5JWTZuMDFMQVA3UDBpUWJp?= =?utf-8?B?dUxWS0hBQ2VhbFdxZi84amQvOENMaDl3RHZQT0FkQnhCTGJDaUplY0szYU9h?= =?utf-8?B?LytWK0dCUzJEM3k3YzlsTDIycm8vemxHRlRUZVVnL1VXU05iMGEzVE4wRGhL?= =?utf-8?B?THFNMG9NNWhweGw2U0ZoYmovRE5aTDdlN01HbWhMOTVXQzFoM3NEY3UvUzVK?= =?utf-8?B?TnFWdDB0eGMrOTJwNFd0WE9lL0t3ZnNxbk9yMFBkeitMTitQZXY0NCtUVGZD?= =?utf-8?B?bzZGdHZReGN5dHV6NHB6d2pabGc4SDY1ODRGc1lBT1B2ZllyYU5sUGNsRlN3?= =?utf-8?B?TFAwUnpIeVFBU3pVaXZhOERHejNvY1VLSjBGWVZnMEcwODB4c2JBZTNSUjZk?= =?utf-8?B?RCtUZSszRXhXNlB0Z1NpK0JDU3JsZEJkVXViNXBNWURUQTFjSW4rODBENnNp?= =?utf-8?B?NEIxdXZFMCttaS9sdTg5VEJlNThqVzBOV1VDYzhmc2ZnMjIrU0FmNmlUcVVE?= =?utf-8?B?N3VtelBFL0dUdE1lSEhSSjRBMGtwc1BnTFJEeXVvYjBjVk5aNDBtc3NFbTA5?= =?utf-8?B?TnVlbk16U3NPdDVCeSsrY21ZK05QRGlBUmFNd1RMdEZ3clFMamY5c1hsc1o0?= =?utf-8?B?OE4yakJOREdvUTRGUUFIcVhXQWo3UXZIdTNFRXZPWjFaVW9XRzB2a2dnR014?= =?utf-8?B?OGFSUXV1NEY5aG1tYVVTRHJPVW9CZDNheFAxa2g2STFYSzBxRkNPVXNiUi82?= =?utf-8?B?TDNNRTd3SGFaOUF3c2dZWnA3cFdOaEUyWUpzRVVWYWFnNDZ6cEVtWXMvTDQ5?= =?utf-8?B?OElBWmd1a0tXUTRTUUlxcmYvSUdyMDlXVHNOTFBDenNkL1UrbjFTU1FaeHFH?= =?utf-8?B?b1VXbi9ndTdCaWJzcUtWbnZxWUtyd1hCdTB2RDdzRUpPRDF5NWozVkt1bDA3?= =?utf-8?B?allMSHd1c2JKeE5ISUNab2k2SXJPR2pIOEV0WkZLR0F2RERuSXNjajI4clpv?= =?utf-8?B?YVVaMFZOVmlsQitmM2lvbFZCNUN4V1pMOWp3NjFqRnkzVFVXNFRjOWFpWmNQ?= =?utf-8?B?Y2IrMjVwcjRSMjI4cDNTNVp1VmNpZ2s5RGRCcW9qVlYrU0FGM1FJMDVkbXFx?= =?utf-8?B?V1Fwcnh2ajF6U0pZMlZVcmExOVBSRnlwRWdEQkdZZDZXZnZZZ1NaRXRqdjYr?= =?utf-8?B?cWpjUWxXQUJ3WlQyMFZsQmVWUlpBdW5NWnJtRnlKc3JtL1o0Z0p5TXpBUWlt?= =?utf-8?B?NFE9PQ==?= X-OriginatorOrg: amlogic.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8f009f64-0577-4810-009a-08dd3473c7cd X-MS-Exchange-CrossTenant-AuthSource: SEYPR03MB7118.apcprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Jan 2025 08:16:43.6525 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0df2add9-25ca-4b3a-acb4-c99ddf0b1114 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: UtkoJU2t1pckwlg5vHE2chlYgRjnND0SwJvYtudpdkQ8B7d4DIVsMdiyP+tMbKwoYri5ZN8yvCNX04w8QZQ9n8OTaBvGl2MKVIiIatz73Do= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR03MB7845 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250114_001706_104042_E6A38E52 X-CRM114-Status: GOOD ( 18.02 ) X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-amlogic" Errors-To: linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org CuWcqCAyMDI1LzEvMTMgMjI6MzEsIEplcm9tZSBCcnVuZXQg5YaZ6YGTOgo+IFsgRVhURVJOQUwg RU1BSUwgXQo+Cj4gT24gTW9uIDEzIEphbiAyMDI1IGF0IDE0OjM1LCBqaWViaW5nIGNoZW4gdmlh IEI0IFJlbGF5IDxkZXZudWxsK2ppZWJpbmcuY2hlbi5hbWxvZ2ljLmNvbUBrZXJuZWwub3JnPiB3 cm90ZToKPgo+PiBGcm9tOiBqaWViaW5nIGNoZW4gPGppZWJpbmcuY2hlbkBhbWxvZ2ljLmNvbT4K Pj4KPj4gQWRkIGF1ZGlvIHN1cHBvcnQgZm9yIEFtbG9naWMgUzQuVGhlIGF1ZGlvIG91dHB1dCBw YWQKPj4gY2FuIGJlIGZyZWVseWNvbWJpbmVkIHdpdGggdGhlIG91dHB1dCBsYW5lLGFuZCB0aGUg dG9jb2RlYwo+PiBjb250cm9sIGxvZ2ljIGhhcyBiZWVuIG9wdGltaXplZC4KPiBUaGUgcGF0Y2gg aXMgYSBtaXh0dXJlIG9mIGRpZmZlcmVudCBIVyBtb2R1bGVzLgo+Cj4gRWFjaCBwYXRjaCBzaG91 bGQgaGF2ZSBvbmUgY2xlYXIgcHVycG9zZSBhbmQsIGFzIHN1Y2gsIGRlYWwgd2l0aCBhCj4gc2lu Z2xlIEhXIG1vZHVsZQo+Cj4+IFNpZ25lZC1vZmYtYnk6IGppZWJpbmcgY2hlbiA8amllYmluZy5j aGVuQGFtbG9naWMuY29tPgo+PiAtLS0KPj4gICBzb3VuZC9zb2MvbWVzb24vS2NvbmZpZyAgICAg ICAgICAgICAgfCAgMTYgKysKPj4gICBzb3VuZC9zb2MvbWVzb24vTWFrZWZpbGUgICAgICAgICAg ICAgfCAgIDYgKwo+PiAgIHNvdW5kL3NvYy9tZXNvbi9zNC1wYWQtb3V0LWNvbnRyb2wuYyB8IDM3 MiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICAgc291bmQvc29jL21lc29u L3M0LXRvY29kZWMtY29udHJvbC5jIHwgMzc2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCj4+ICAgc291bmQvc29jL21lc29uL3Q5MDE1LmMgICAgICAgICAgICAgIHwgICA1ICst Cj4+ICAgNSBmaWxlcyBjaGFuZ2VkLCA3NzEgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkK Pj4KPj4gZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tZXNvbi9LY29uZmlnIGIvc291bmQvc29jL21l c29uL0tjb25maWcKPj4gaW5kZXggNjQ1OGQ1ZGM0OTAyZjY2NTIxMWJiOWU0YWU3ZDI3NGU0YmZm MmZkYy4uZDAxZTI4NDY0MmZkOTg3Y2Y0YmRmODhlNWJmNWY3YzlhMjQxYWY1OSAxMDA2NDQKPj4g LS0tIGEvc291bmQvc29jL21lc29uL0tjb25maWcKPj4gKysrIGIvc291bmQvc29jL21lc29uL0tj b25maWcKPj4gQEAgLTY5LDYgKzY5LDggQEAgY29uZmlnIFNORF9NRVNPTl9BWEdfU09VTkRfQ0FS RAo+PiAgICAgICAgaW1wbHkgU05EX01FU09OX0FYR19TUERJRklOCj4+ICAgICAgICBpbXBseSBT TkRfTUVTT05fQVhHX1BETQo+PiAgICAgICAgaW1wbHkgU05EX01FU09OX0cxMkFfVE9BQ09ERUMK Pj4gKyAgICAgaW1wbHkgU05EX1NPQ19NRVNPTl9QQURfT1VUCj4+ICsgICAgIGltcGx5IFNORF9T T0NfTUVTT05fVE9DT0RFQ19DT05UUk9MCj4+ICAgICAgICBpbXBseSBTTkRfTUVTT05fRzEyQV9U T0hETUlUWCBpZiBEUk1fTUVTT05fRFdfSERNSQo+PiAgICAgICAgaGVscAo+PiAgICAgICAgICBT ZWxlY3QgWSBvciBNIHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgQVhHIFNvQyBzb3VuZCBjYXJkCj4+ IEBAIC0xMzUsNCArMTM3LDE4IEBAIGNvbmZpZyBTTkRfU09DX01FU09OX1Q5MDE1Cj4+ICAgICAg ICBoZWxwCj4+ICAgICAgICAgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQg Zm9yIHRoZSBpbnRlcm5hbCBEQUMgZm91bmQKPj4gICAgICAgICAgb24gR1hMLCBHMTIgYW5kIFNN MSBTb0MgZmFtaWx5Lgo+PiArCj4+ICtjb25maWcgU05EX1NPQ19NRVNPTl9QQURfT1VUCj4+ICsg ICAgIHRyaXN0YXRlICJBbWxvZ2ljIFBBRCBPVVQiCj4+ICsgICAgIHNlbGVjdCBSRUdNQVBfTU1J Two+PiArICAgICBoZWxwCj4+ICsgICAgICAgU2F5IFkgb3IgTSBpZiB5b3Ugd2FudCB0byBhZGQg c3VwcG9ydCBmb3IgdGhlIFM0IEF1ZGlvIE91dHB1dCBmcm9tCj4+ICsgICAgICAgdGhlIGRhdGEg UGFkLgo+PiArCj4+ICtjb25maWcgU05EX1NPQ19NRVNPTl9UT0NPREVDX0NPTlRST0wKPj4gKyAg ICAgdHJpc3RhdGUgIkFtbG9naWMgVE9DT0RFQyBDT05UUk9MIgo+PiArICAgICBzZWxlY3QgUkVH TUFQX01NSU8KPj4gKyAgICAgaGVscAo+PiArICAgICAgU2F5IFkgb3IgTSBpZiB5b3Ugd2FudCB0 byBhZGQgc3VwcG9ydCBmb3IgdGhlIGludGVybmFsIERBQyBjb250cm9sCj4+ICsgICAgICBvbiBT TTEgU29DIGZhbWlseS4KPj4gICBlbmRtZW51Cj4+IGRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbWVz b24vTWFrZWZpbGUgYi9zb3VuZC9zb2MvbWVzb24vTWFrZWZpbGUKPj4gaW5kZXggMjQwNzhlNDM5 NmIwMmQ1NDVkOGJhNGJjYjE2MzI5NzkwMDEzNTRlMy4uYWZiZWZjYjEzMTM2NzBmOWIxMzY1ZTg4 YjhlYjFhMGJhZGQ3ZGMxZSAxMDA2NDQKPj4gLS0tIGEvc291bmQvc29jL21lc29uL01ha2VmaWxl Cj4+ICsrKyBiL3NvdW5kL3NvYy9tZXNvbi9NYWtlZmlsZQo+PiBAQCAtMjQsOCArMjQsMTEgQEAg c25kLXNvYy1tZXNvbi1jb2RlYy1nbHVlLXkgOj0gbWVzb24tY29kZWMtZ2x1ZS5vCj4+ICAgc25k LXNvYy1tZXNvbi1neC1zb3VuZC1jYXJkLXkgOj0gZ3gtY2FyZC5vCj4+ICAgc25kLXNvYy1tZXNv bi1nMTJhLXRvYWNvZGVjLXkgOj0gZzEyYS10b2Fjb2RlYy5vCj4+ICAgc25kLXNvYy1tZXNvbi1n MTJhLXRvaGRtaXR4LXkgOj0gZzEyYS10b2hkbWl0eC5vCj4+ICtzbmQtc29jLW1lc29uLXM0LXBh ZG91dC1vYmpzIDo9IHM0LXBhZC1vdXQtY29udHJvbC5vCj4+ICtzbmQtc29jLW1lc29uLXM0LXRv Y29kZWMtY29udHJvbC1vYmpzIDo9IHM0LXRvY29kZWMtY29udHJvbC5vCj4+ICAgc25kLXNvYy1t ZXNvbi10OTAxNS15IDo9IHQ5MDE1Lm8KPj4KPj4gKwo+PiAgIG9iai0kKENPTkZJR19TTkRfTUVT T05fQUlVKSArPSBzbmQtc29jLW1lc29uLWFpdS5vCj4+ICAgb2JqLSQoQ09ORklHX1NORF9NRVNP Tl9BWEdfRklGTykgKz0gc25kLXNvYy1tZXNvbi1heGctZmlmby5vCj4+ICAgb2JqLSQoQ09ORklH X1NORF9NRVNPTl9BWEdfRlJERFIpICs9IHNuZC1zb2MtbWVzb24tYXhnLWZyZGRyLm8KPj4gQEAg LTQzLDQgKzQ2LDcgQEAgb2JqLSQoQ09ORklHX1NORF9NRVNPTl9DT0RFQ19HTFVFKSArPSBzbmQt c29jLW1lc29uLWNvZGVjLWdsdWUubwo+PiAgIG9iai0kKENPTkZJR19TTkRfTUVTT05fR1hfU09V TkRfQ0FSRCkgKz0gc25kLXNvYy1tZXNvbi1neC1zb3VuZC1jYXJkLm8KPj4gICBvYmotJChDT05G SUdfU05EX01FU09OX0cxMkFfVE9BQ09ERUMpICs9IHNuZC1zb2MtbWVzb24tZzEyYS10b2Fjb2Rl Yy5vCj4+ICAgb2JqLSQoQ09ORklHX1NORF9NRVNPTl9HMTJBX1RPSERNSVRYKSArPSBzbmQtc29j LW1lc29uLWcxMmEtdG9oZG1pdHgubwo+PiArb2JqLSQoQ09ORklHX1NORF9TT0NfTUVTT05fUEFE X09VVCkgKz0gc25kLXNvYy1tZXNvbi1zNC1wYWRvdXQubwo+PiArb2JqLSQoQ09ORklHX1NORF9T T0NfTUVTT05fVE9DT0RFQ19DT05UUk9MKSArPSBzbmQtc29jLW1lc29uLXM0LXRvY29kZWMtY29u dHJvbC5vCj4+ICAgb2JqLSQoQ09ORklHX1NORF9TT0NfTUVTT05fVDkwMTUpICs9IHNuZC1zb2Mt bWVzb24tdDkwMTUubwo+PiArCj4+IGRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbWVzb24vczQtcGFk LW91dC1jb250cm9sLmMgYi9zb3VuZC9zb2MvbWVzb24vczQtcGFkLW91dC1jb250cm9sLmMKPj4g bmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMC4uYTg2ZGNmOGE1OTk1OTI2ZjBkZGY4ZDI5MTFmNDIwMDZkYWVkMGZlYgo+ PiAtLS0gL2Rldi9udWxsCj4+ICsrKyBiL3NvdW5kL3NvYy9tZXNvbi9zNC1wYWQtb3V0LWNvbnRy b2wuYwo+PiBAQCAtMCwwICsxLDM3MiBAQAo+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IChHUEwtMi4wLW9ubHkgT1IgTUlUKQo+PiArLyoKPj4gKyAqIENvcHlyaWdodCAoQykgMjAyNCBB bWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQKPj4gKyAqLwo+PiArCj4+ICsjaW5jbHVk ZSA8bGludXgvbW9kdWxlLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KPj4g KyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KPj4gKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KPj4g KyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFpLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+ PiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+PiArI2luY2x1ZGU8bGludXgva3N0cnRveC5o Pgo+PiArCj4+ICsjaW5jbHVkZSAiYXhnLXRkbS5oIgo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IHJlZ21hcF9jb25maWcgdGRtb3V0X3BhZF9yZWdtYXBfY2ZnID0gewo+PiArICAgICAucmVn X2JpdHMgICAgICAgPSAzMiwKPj4gKyAgICAgLnZhbF9iaXRzICAgICAgID0gMzIsCj4+ICsgICAg IC5yZWdfc3RyaWRlICAgICA9IDQsCj4+ICsgICAgIC5tYXhfcmVnaXN0ZXIgICA9IDB4MjgsCj4+ ICt9Owo+PiArCj4+ICsjZGVmaW5lIFRETV9JRkFDRSAwCj4+ICsjZGVmaW5lIFRETV9BX1BBRCAw Cj4+ICsjZGVmaW5lIFRETV9CX1BBRCAxCj4+ICsjZGVmaW5lIFRETV9DX1BBRCAyCj4+ICsKPj4g KyNkZWZpbmUgRUVfQVVESU9fREFUX1BBRF9DVFJMNiAweDAKPj4gKyNkZWZpbmUgRUVfQVVESU9f REFUX1BBRF9DVFJMNyAweDQKPj4gKyNkZWZpbmUgRUVfQVVESU9fREFUX1BBRF9DVFJMOCAweDgK Pj4gKyNkZWZpbmUgRUVfQVVESU9fREFUX1BBRF9DVFJMOSAweGMKPj4gKyNkZWZpbmUgRUVfQVVE SU9fREFUX1BBRF9DVFJMQSAweDEwCj4+ICsjZGVmaW5lIEVFX0FVRElPX0RBVF9QQURfQ1RSTEIg MHgxNAo+PiArI2RlZmluZSBFRV9BVURJT19EQVRfUEFEX0NUUkxDIDB4MWMKPj4gKyNkZWZpbmUg RUVfQVVESU9fREFUX1BBRF9DVFJMRCAweDIwCj4+ICsjZGVmaW5lIEVFX0FVRElPX0RBVF9QQURf Q1RSTEUgMHgyNAo+PiArI2RlZmluZSBFRV9BVURJT19EQVRfUEFEX0NUUkxGIDB4MjgKPj4gKwo+ PiArI2RlZmluZSBSRUdfT0ZGU0VUIDQKPj4gKwo+PiArc3RhdGljIGNvbnN0IGNoYXIgKiBjb25z dCBzNF90ZG1vdXRfc2VsX3RleHRzW10gPSB7Cj4+ICsgICAgICJURE1fRDAiLCAiVERNX0QxIiwg IlRETV9EMiIsICJURE1fRDMiLCAiVERNX0Q0IiwgIlRETV9ENSIsICJURE1fRDYiLCAiVERNX0Q3 IiwKPj4gKyAgICAgIlRETV9EOCIsICJURE1fRDkiLCAiVERNX0QxMCIsICJURE1fRDExIiwgIlRE TV9EMTIiLCAiVERNX0QxMyIsICJURE1fRDE0IiwgIlRETV9EMTUiLAo+PiArICAgICAiVERNX0Qx NiIsICJURE1fRDE3IiwgIlRETV9EMTgiLCAiVERNX0QxOSIsICJURE1fRDIwIiwgIlRETV9EMjEi LCAiVERNX0QyMiIsICJURE1fRDIzIiwKPj4gKyAgICAgIlRETV9EMjQiLCAiVERNX0QyNSIsICJU RE1fRDI2IiwgIlRETV9EMjciLCAiVERNX0QyOCIsICJURE1fRDI5IiwgIlRETV9EMzAiLCAiVERN X0QzMSIKPj4gK307Cj4gVGhpcyB0aGluZyBkb2VzIG5vdCBiZWxvbmcgaW4gQVNvQy4gVGhpcyBp cyBjbGVhcmx5IHlldCBhbm90aGVyIGxheWVyIG9mCj4gcGluY3RybC4gUGxlYXNlIGRlYWwgd2l0 aCBpdCB0aGVyZS4KClRoYW5rcyBmb3IgeW91ciBzdWdnZXN0aW9uLCBhZGQgYXVkaW8gcGluY3Ry bCBkcml2ZXIgdG8gY29udHJvbCB0aGUgd2hpY2ggdGRtX2R4IHBpbiBjYW4gbWFwIHRoZSB3aGlj aCB0ZG0gbGFuZV94CmZvciBleGFtcGxlCgl0ZG1fZDZfcGluIHsKCQltdXggewoJCQlncm91cHMg PSAidGRtX2Q2IjsKCQkJZnVuY3Rpb24gPSAidGRtb3V0Yl9sYW5lMCI7CgkJfTsKCX0KdGRtX2Q2 IHBpbiBtYXAgdGhlIHRkbW91dGIgbGFuZSAwLCByaWdodCA/Cgo+PiArCj4+ICtzdGF0aWMgY29u c3Qgc3RydWN0IHNvY19lbnVtIHRkbW91dF9zZWxfZW51bSA9Cj4+ICsgICAgIFNPQ19FTlVNX1NJ TkdMRShTTkRfU09DX05PUE0sIDAsIEFSUkFZX1NJWkUoczRfdGRtb3V0X3NlbF90ZXh0cyksCj4+ ICsgICAgICAgICAgICAgICAgICAgICBzNF90ZG1vdXRfc2VsX3RleHRzKTsKPj4gKwo+PiArc3Rh dGljIHN0cnVjdCBzbmRfc29jX2RhaSAqdGRtX2dldF9haGVhZF9iZShzdHJ1Y3Qgc25kX3NvY19k YXBtX3dpZGdldCAqdykKPj4gK3sKPj4gKyAgICAgc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpw Owo+PiArICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmJlOwo+PiArCj4+ICsgICAgIHNuZF9zb2Nf ZGFwbV93aWRnZXRfZm9yX2VhY2hfc291cmNlX3BhdGgodywgcCkgewo+PiArICAgICAgICAgICAg IGlmIChwLT5zb3VyY2UtPmlkID09IHNuZF9zb2NfZGFwbV9kYWlfaW4pCj4+ICsgICAgICAgICAg ICAgICAgICAgICByZXR1cm4gKHN0cnVjdCBzbmRfc29jX2RhaSAqKXAtPnNvdXJjZS0+cHJpdjsK Pj4gKyAgICAgICAgICAgICBiZSA9IHRkbV9nZXRfYWhlYWRfYmUocC0+c291cmNlKTsKPj4gKyAg ICAgICAgICAgICBpZiAoYmUgJiYgYmUtPmlkID09IFRETV9JRkFDRSkKPj4gKyAgICAgICAgICAg ICAgICAgICAgIHJldHVybiBiZTsKPj4gKyAgICAgfQo+PiArICAgICByZXR1cm4gTlVMTDsKPj4g K30KPj4gKwo+PiArI2RlZmluZSBTTkRfU09DX0RBUE1fREVNVVhfRSh3bmFtZSwgd3JlZywgd3No aWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMsIFwKPj4gKyAgICAgd2V2ZW50LCB3ZmxhZ3MpIFwKPj4g Kygoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQpIHsgXAo+PiArICAgICAuaWQgPSBzbmRfc29j X2RhcG1fZGVtdXgsIC5uYW1lID0gd25hbWUsIFwKPj4gKyAgICAgU05EX1NPQ19EQVBNX0lOSVRf UkVHX1ZBTCh3cmVnLCB3c2hpZnQsIHdpbnZlcnQpLCBcCj4+ICsgICAgIC5rY29udHJvbF9uZXdz ID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDEsIFwKPj4gKyAgICAgLmV2ZW50ID0gd2V2 ZW50LCAuZXZlbnRfZmxhZ3MgPSB3ZmxhZ3N9KQo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IHNuZF9rY29udHJvbF9uZXcgdGRtb3V0X3NlbF9kZW11eFtdID0gewo+PiArICAgICBTT0NfREFQ TV9FTlVNKCJURE1PVVRBIFNFTCIsIHRkbW91dF9zZWxfZW51bSksCj4+ICsgICAgIFNPQ19EQVBN X0VOVU0oIlRETU9VVEIgU0VMIiwgdGRtb3V0X3NlbF9lbnVtKSwKPj4gKyAgICAgU09DX0RBUE1f RU5VTSgiVERNT1VUQyBTRUwiLCB0ZG1vdXRfc2VsX2VudW0pLAo+PiArfTsKPj4gKwo+PiArc3Rh dGljIHVuc2lnbmVkIGludCBhbWxfc2ltcGxlX3N0cnRvdWxsKGNvbnN0IGNoYXIgKmNwKQo+PiAr ewo+PiArICAgICB1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKPj4gKyAgICAgdW5zaWduZWQgaW50 IHZhbHVlID0gMDsKPj4gKyAgICAgdW5zaWduZWQgaW50IGxlbiA9ICBzdHJsZW4oY3ApOwo+PiAr Cj4+ICsgICAgIHdoaWxlIChsZW4gIT0gMCkgewo+PiArICAgICAgICAgICAgIGxlbi0tOwo+PiAr ICAgICAgICAgICAgIHZhbHVlID0gaXNkaWdpdCgqY3ApOwo+PiArICAgICAgICAgICAgIGlmICh2 YWx1ZSkgewo+PiArICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAqY3AgLSAnMCc7Cj4+ICsg ICAgICAgICAgICAgfSBlbHNlIHsKPj4gKyAgICAgICAgICAgICAgICAgICAgIGNwKys7Cj4+ICsg ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKPj4gKyAgICAgICAgICAgICB9Cj4+ICsgICAg ICAgICAgICAgY3ArKzsKPj4gKyAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKiAxMCArIHZh bHVlOwo+PiArICAgICB9Cj4+ICsgICAgIHJldHVybiByZXN1bHQ7Cj4+ICt9Cj4+ICsKPj4gK3N0 YXRpYyBpbnQgdGRtX291dF9wYWRfc2V0KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQo+ PiArewo+PiArICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmJlOwo+PiArICAgICBzdHJ1Y3QgYXhn X3RkbV9zdHJlYW0gKnN0cmVhbTsKPj4gKyAgICAgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpj b21wb25lbnQgPSBzbmRfc29jX2RhcG1fdG9fY29tcG9uZW50KHctPmRhcG0pOwo+PiArICAgICB1 bnNpZ25lZCBpbnQgdGRtX2lkID0gVERNX0FfUEFEOwo+PiArICAgICBjb25zdCBjaGFyICpkYWlf d2lkZ2V0X25hbWU7Cj4+ICsgICAgIHN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcDsKPj4gKyAg ICAgdW5zaWduZWQgaW50IGxhbmVfbnVtID0gMDsKPj4gKyAgICAgdW5zaWduZWQgbG9uZyBwaW4g PSAwOwo+PiArICAgICB1bnNpZ25lZCBpbnQgcmVnLCBtYXNrLCB2YWwgPSAwOwo+PiArICAgICBp bnQgbGFuZV9jbnQ7Cj4+ICsKPj4gKyAgICAgYmUgPSB0ZG1fZ2V0X2FoZWFkX2JlKHcpOwo+PiAr ICAgICBpZiAoIWJlKSB7Cj4+ICsgICAgICAgICAgICAgZGV2X2Vycihjb21wb25lbnQtPmRldiwg IiVzIG5vdCBmaW5kIHRoZSBiZVxuIiwgX19mdW5jX18pOwo+PiArICAgICAgICAgICAgIHJldHVy biAtRUlOVkFMOwo+PiArICAgICB9Cj4+ICsgICAgIHN0cmVhbSA9IHNuZF9zb2NfZGFpX2RtYV9k YXRhX2dldF9wbGF5YmFjayhiZSk7Cj4+ICsgICAgIGlmICghc3RyZWFtKSB7Cj4+ICsgICAgICAg ICAgICAgZGV2X2Vycihjb21wb25lbnQtPmRldiwgIiVzIG5vdCBmaW5kIHRoZSBzdHJlYW1cbiIs IF9fZnVuY19fKTsKPj4gKyAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPj4gKyAgICAgfQo+ PiArICAgICBsYW5lX2NudCA9IChzdHJlYW0tPmNoYW5uZWxzIC0gMSkgLyBzdHJlYW0tPmlmYWNl LT5zbG90cyArIDE7Cj4+ICsgICAgIC8qd2UgbGlrZSB0byB1c2UgZGFpIGlkLCBidXQgaXQgaXMg Zml4ZWQgdmFsKi8KPj4gKyAgICAgZGFpX3dpZGdldF9uYW1lID0gYmUtPnN0cmVhbVtTTkRSVl9Q Q01fU1RSRUFNX1BMQVlCQUNLXS53aWRnZXQtPm5hbWU7Cj4+ICsgICAgIGlmIChzdHJzdHIoZGFp X3dpZGdldF9uYW1lLCAiVERNX0EiKSkKPj4gKyAgICAgICAgICAgICB0ZG1faWQgPSBURE1fQV9Q QUQ7Cj4+ICsgICAgIGVsc2UgaWYgKHN0cnN0cihkYWlfd2lkZ2V0X25hbWUsICJURE1fQiIpKQo+ PiArICAgICAgICAgICAgIHRkbV9pZCA9IFRETV9CX1BBRDsKPj4gKyAgICAgZWxzZSBpZiAoc3Ry c3RyKGRhaV93aWRnZXRfbmFtZSwgIlRETV9DIikpCj4+ICsgICAgICAgICAgICAgdGRtX2lkID0g VERNX0NfUEFEOwo+PiArICAgICBlbHNlCj4+ICsgICAgICAgICAgICAgZGV2X2Vycihjb21wb25l bnQtPmRldiwgIiVzIG5vdCBmaW5kIHRoZSBiZSBkYWkgd2lkZ2V0XG4iLCBfX2Z1bmNfXyk7Cj4+ ICsgICAgIGRldl9kYmcoY29tcG9uZW50LT5kZXYsICJ0ZG1faWQ6JWQsIGNoYW5uZWw6JWQsIHNs b3Q6JWRcbiIsCj4+ICsgICAgICAgICAgICAgdGRtX2lkLCBzdHJlYW0tPmNoYW5uZWxzLCBzdHJl YW0tPmlmYWNlLT5zbG90cyk7Cj4+ICsgICAgIHNuZF9zb2NfZGFwbV93aWRnZXRfZm9yX2VhY2hf c2lua19wYXRoKHcsIHApIHsKPj4gKyAgICAgICAgICAgICBpZiAocC0+c2luay0+aWQgPT0gc25k X3NvY19kYXBtX291dHB1dCkgewo+PiArICAgICAgICAgICAgICAgICAgICAgaWYgKHAtPmNvbm5l Y3QpIHsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluID0gYW1sX3NpbXBsZV9z dHJ0b3VsbChwLT5uYW1lKTsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0g KHBpbiAvIDQpICogUkVHX09GRlNFVDsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg LypjYWxjdWxhdGUgbWFzayBwb3MgKi8KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bWFzayA9IDB4MWYgPDwgKChwaW4gJSA0KSAqIDgpOwo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB2YWwgPSB0ZG1faWQgKiA4ICsgbGFuZV9udW07Cj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNuZF9zb2NfY29tcG9uZW50X3VwZGF0ZV9iaXRzKGNvbXBvbmVudCwgcmVn LCBtYXNrLCB2YWwpOwo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfc29jX2Nv bXBvbmVudF91cGRhdGVfYml0cyhjb21wb25lbnQsIEVFX0FVRElPX0RBVF9QQURfQ1RSTEYsCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDB4MSA8PCBwaW4sIDAgPDwgcGluKTsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgbGFuZV9udW0rKzsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVf bnVtID4gbGFuZV9jbnQgLSAxKQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGJyZWFrOwo+PiArICAgICAgICAgICAgICAgICAgICAgfQo+PiArICAgICAgICAgICAgIH0K Pj4gKyAgICAgfQo+PiArICAgICByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCB0 ZG1vdXRfc2VsX3BhZF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqY29udHJvbCwK Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50KQo+PiArewo+PiArICAg ICBpbnQgcmV0ID0gMDsKPj4gKyAgICAgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25l bnQgPSBzbmRfc29jX2RhcG1fdG9fY29tcG9uZW50KHctPmRhcG0pOwo+PiArCj4+ICsgICAgIHN3 aXRjaCAoZXZlbnQpIHsKPj4gKyAgICAgY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKPj4gKyAg ICAgICAgICAgICB0ZG1fb3V0X3BhZF9zZXQodyk7Cj4+ICsgICAgICAgICAgICAgYnJlYWs7Cj4+ ICsKPj4gKyAgICAgY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKPj4gKyAgICAgICAgICAgICBi cmVhazsKPj4gKwo+PiArICAgICBkZWZhdWx0Ogo+PiArICAgICAgICAgICAgIGRldl9lcnIoY29t cG9uZW50LT5kZXYsICJVbmV4cGVjdGVkIGV2ZW50ICVkXG4iLCBldmVudCk7Cj4+ICsgICAgICAg ICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+ICsgICAgIH0KPj4gKwo+PiArICAgICByZXR1cm4gcmV0 Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQg czRfdGRtb3V0X3BhZF9kYXBtX3dpZGdldHNbXSA9IHsKPj4gKyAgICAgU05EX1NPQ19EQVBNX0RF TVVYX0UoIlRETUFfT1VUIFNFTCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgJnRkbW91dF9zZWxfZGVtdXhbVERNX0FfUEFEXSwgdGRtb3V0X3NlbF9w YWRfZXZlbnQsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAoU05EX1NPQ19EQVBNX1BSRV9Q TVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCkpLAo+PiArICAgICBTTkRfU09DX0RBUE1fREVNVVhf RSgiVERNQl9PVVQgU0VMIiwgU05EX1NPQ19OT1BNLCAwLCAwLAo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAmdGRtb3V0X3NlbF9kZW11eFtURE1fQl9QQURdLCB0ZG1vdXRfc2VsX3BhZF9l dmVudCwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIChTTkRfU09DX0RBUE1fUFJFX1BNVSB8 IFNORF9TT0NfREFQTV9QUkVfUE1EKSksCj4+ICsgICAgIFNORF9TT0NfREFQTV9ERU1VWF9FKCJU RE1DX09VVCBTRUwiLCBTTkRfU09DX05PUE0sIDAsIDAsCj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICZ0ZG1vdXRfc2VsX2RlbXV4W1RETV9DX1BBRF0sIHRkbW91dF9zZWxfcGFkX2V2ZW50 LAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgKFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05E X1NPQ19EQVBNX1BSRV9QTUQpKSwKPj4gKyAgICAgU05EX1NPQ19EQVBNX09VVFBVVCgiVERNX0Qw IiksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRQVVQoIlRETV9EMSIpLAo+PiArICAgICBTTkRf U09DX0RBUE1fT1VUUFVUKCJURE1fRDIiKSwKPj4gKyAgICAgU05EX1NPQ19EQVBNX09VVFBVVCgi VERNX0QzIiksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRQVVQoIlRETV9ENCIpLAo+PiArICAg ICBTTkRfU09DX0RBUE1fT1VUUFVUKCJURE1fRDUiKSwKPj4gKyAgICAgU05EX1NPQ19EQVBNX09V VFBVVCgiVERNX0Q2IiksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRQVVQoIlRETV9ENyIpLAo+ PiArICAgICBTTkRfU09DX0RBUE1fT1VUUFVUKCJURE1fRDgiKSwKPj4gKyAgICAgU05EX1NPQ19E QVBNX09VVFBVVCgiVERNX0Q5IiksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRQVVQoIlRETV9E MTAiKSwKPj4gKyAgICAgU05EX1NPQ19EQVBNX09VVFBVVCgiVERNX0QxMSIpLAo+PiArICAgICBT TkRfU09DX0RBUE1fT1VUUFVUKCJURE1fRDEyIiksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRQ VVQoIlRETV9EMTMiKSwKPj4gKyAgICAgU05EX1NPQ19EQVBNX09VVFBVVCgiVERNX0QxNCIpLAo+ PiArICAgICBTTkRfU09DX0RBUE1fT1VUUFVUKCJURE1fRDE1IiksCj4+ICsgICAgIFNORF9TT0Nf REFQTV9PVVRQVVQoIlRETV9EMTYiKSwKPj4gKyAgICAgU05EX1NPQ19EQVBNX09VVFBVVCgiVERN X0QxNyIpLAo+PiArICAgICBTTkRfU09DX0RBUE1fT1VUUFVUKCJURE1fRDE4IiksCj4+ICsgICAg IFNORF9TT0NfREFQTV9PVVRQVVQoIlRETV9EMTkiKSwKPj4gKyAgICAgU05EX1NPQ19EQVBNX09V VFBVVCgiVERNX0QyMCIpLAo+PiArICAgICBTTkRfU09DX0RBUE1fT1VUUFVUKCJURE1fRDIxIiks Cj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRQVVQoIlRETV9EMjIiKSwKPj4gKyAgICAgU05EX1NP Q19EQVBNX09VVFBVVCgiVERNX0QyMyIpLAo+PiArICAgICBTTkRfU09DX0RBUE1fT1VUUFVUKCJU RE1fRDI0IiksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRQVVQoIlRETV9EMjUiKSwKPj4gKyAg ICAgU05EX1NPQ19EQVBNX09VVFBVVCgiVERNX0QyNiIpLAo+PiArICAgICBTTkRfU09DX0RBUE1f T1VUUFVUKCJURE1fRDI3IiksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRQVVQoIlRETV9EMjgi KSwKPj4gKyAgICAgU05EX1NPQ19EQVBNX09VVFBVVCgiVERNX0QyOSIpLAo+PiArICAgICBTTkRf U09DX0RBUE1fT1VUUFVUKCJURE1fRDMwIiksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRQVVQo IlRETV9EMzEiKSwKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19k YXBtX3JvdXRlIHM0X3RkbW91dF9wYWRfZGFwbV9yb3V0ZXNbXSA9IHsKPj4gKyAgICAgeyAiVERN X0QwIiwgIlRETV9EMCIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMSIsICJU RE1fRDEiLCAiVERNQV9PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDIiLCAiVERNX0QyIiwg IlRETUFfT1VUIFNFTCIgfSwKPj4gKyAgICAgeyAiVERNX0QzIiwgIlRETV9EMyIsICJURE1BX09V VCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9ENCIsICJURE1fRDQiLCAiVERNQV9PVVQgU0VMIiB9 LAo+PiArICAgICB7ICJURE1fRDUiLCAiVERNX0Q1IiwgIlRETUFfT1VUIFNFTCIgfSwKPj4gKyAg ICAgeyAiVERNX0Q2IiwgIlRETV9ENiIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRE TV9ENyIsICJURE1fRDciLCAiVERNQV9PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDgiLCAi VERNX0Q4IiwgIlRETUFfT1VUIFNFTCIgfSwKPj4gKyAgICAgeyAiVERNX0Q5IiwgIlRETV9EOSIs ICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMTAiLCAiVERNX0QxMCIsICJURE1B X09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMTEiLCAiVERNX0QxMSIsICJURE1BX09VVCBT RUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMTIiLCAiVERNX0QxMiIsICJURE1BX09VVCBTRUwiIH0s Cj4+ICsgICAgIHsgIlRETV9EMTMiLCAiVERNX0QxMyIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsg ICAgIHsgIlRETV9EMTQiLCAiVERNX0QxNCIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsg IlRETV9EMTUiLCAiVERNX0QxNSIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9E MTYiLCAiVERNX0QxNiIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMTciLCAi VERNX0QxNyIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMTgiLCAiVERNX0Qx OCIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMTkiLCAiVERNX0QxOSIsICJU RE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjAiLCAiVERNX0QyMCIsICJURE1BX09V VCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjEiLCAiVERNX0QyMSIsICJURE1BX09VVCBTRUwi IH0sCj4+ICsgICAgIHsgIlRETV9EMjIiLCAiVERNX0QyMiIsICJURE1BX09VVCBTRUwiIH0sCj4+ ICsgICAgIHsgIlRETV9EMjMiLCAiVERNX0QyMyIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAg IHsgIlRETV9EMjQiLCAiVERNX0QyNCIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRE TV9EMjUiLCAiVERNX0QyNSIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjYi LCAiVERNX0QyNiIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjciLCAiVERN X0QyNyIsICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjgiLCAiVERNX0QyOCIs ICJURE1BX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjkiLCAiVERNX0QyOSIsICJURE1B X09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMzAiLCAiVERNX0QzMCIsICJURE1BX09VVCBT RUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMzEiLCAiVERNX0QzMSIsICJURE1BX09VVCBTRUwiIH0s Cj4+ICsgICAgIHsgIlRETV9EMCIsICJURE1fRDAiLCAiVERNQl9PVVQgU0VMIiB9LAo+PiArICAg ICB7ICJURE1fRDEiLCAiVERNX0QxIiwgIlRETUJfT1VUIFNFTCIgfSwKPj4gKyAgICAgeyAiVERN X0QyIiwgIlRETV9EMiIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMyIsICJU RE1fRDMiLCAiVERNQl9PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDQiLCAiVERNX0Q0Iiwg IlRETUJfT1VUIFNFTCIgfSwKPj4gKyAgICAgeyAiVERNX0Q1IiwgIlRETV9ENSIsICJURE1CX09V VCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9ENiIsICJURE1fRDYiLCAiVERNQl9PVVQgU0VMIiB9 LAo+PiArICAgICB7ICJURE1fRDciLCAiVERNX0Q3IiwgIlRETUJfT1VUIFNFTCIgfSwKPj4gKyAg ICAgeyAiVERNX0Q4IiwgIlRETV9EOCIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRE TV9EOSIsICJURE1fRDkiLCAiVERNQl9PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDEwIiwg IlRETV9EMTAiLCAiVERNQl9PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDExIiwgIlRETV9E MTEiLCAiVERNQl9PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDEyIiwgIlRETV9EMTIiLCAi VERNQl9PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDEzIiwgIlRETV9EMTMiLCAiVERNQl9P VVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDE0IiwgIlRETV9EMTQiLCAiVERNQl9PVVQgU0VM IiB9LAo+PiArICAgICB7ICJURE1fRDE1IiwgIlRETV9EMTUiLCAiVERNQl9PVVQgU0VMIiB9LAo+ PiArCj4+ICsgICAgIHsgIlRETV9EMTYiLCAiVERNX0QxNiIsICJURE1CX09VVCBTRUwiIH0sCj4+ ICsgICAgIHsgIlRETV9EMTciLCAiVERNX0QxNyIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAg IHsgIlRETV9EMTgiLCAiVERNX0QxOCIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRE TV9EMTkiLCAiVERNX0QxOSIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjAi LCAiVERNX0QyMCIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjEiLCAiVERN X0QyMSIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjIiLCAiVERNX0QyMiIs ICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjMiLCAiVERNX0QyMyIsICJURE1C X09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjQiLCAiVERNX0QyNCIsICJURE1CX09VVCBT RUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMjUiLCAiVERNX0QyNSIsICJURE1CX09VVCBTRUwiIH0s Cj4+ICsgICAgIHsgIlRETV9EMjYiLCAiVERNX0QyNiIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsg ICAgIHsgIlRETV9EMjciLCAiVERNX0QyNyIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsg IlRETV9EMjgiLCAiVERNX0QyOCIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9E MjkiLCAiVERNX0QyOSIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMzAiLCAi VERNX0QzMCIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMzEiLCAiVERNX0Qz MSIsICJURE1CX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9EMCIsICJURE1fRDAiLCAiVERN Q19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDEiLCAiVERNX0QxIiwgIlRETUNfT1VUIFNF TCIgfSwKPj4gKyAgICAgeyAiVERNX0QyIiwgIlRETV9EMiIsICJURE1DX09VVCBTRUwiIH0sCj4+ ICsgICAgIHsgIlRETV9EMyIsICJURE1fRDMiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7 ICJURE1fRDQiLCAiVERNX0Q0IiwgIlRETUNfT1VUIFNFTCIgfSwKPj4gKyAgICAgeyAiVERNX0Q1 IiwgIlRETV9ENSIsICJURE1DX09VVCBTRUwiIH0sCj4+ICsgICAgIHsgIlRETV9ENiIsICJURE1f RDYiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDciLCAiVERNX0Q3IiwgIlRE TUNfT1VUIFNFTCIgfSwKPj4gKyAgICAgeyAiVERNX0Q4IiwgIlRETV9EOCIsICJURE1DX09VVCBT RUwiIH0sCj4+ICsgICAgIHsgIlRETV9EOSIsICJURE1fRDkiLCAiVERNQ19PVVQgU0VMIiB9LAo+ PiArICAgICB7ICJURE1fRDEwIiwgIlRETV9EMTAiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAg ICB7ICJURE1fRDExIiwgIlRETV9EMTEiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJU RE1fRDEyIiwgIlRETV9EMTIiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDEz IiwgIlRETV9EMTMiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDE0IiwgIlRE TV9EMTQiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDE1IiwgIlRETV9EMTUi LCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDE2IiwgIlRETV9EMTYiLCAiVERN Q19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDE3IiwgIlRETV9EMTciLCAiVERNQ19PVVQg U0VMIiB9LAo+PiArICAgICB7ICJURE1fRDE4IiwgIlRETV9EMTgiLCAiVERNQ19PVVQgU0VMIiB9 LAo+PiArICAgICB7ICJURE1fRDE5IiwgIlRETV9EMTkiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiAr ICAgICB7ICJURE1fRDIwIiwgIlRETV9EMjAiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7 ICJURE1fRDIxIiwgIlRETV9EMjEiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1f RDIyIiwgIlRETV9EMjIiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDIzIiwg IlRETV9EMjMiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDI0IiwgIlRETV9E MjQiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDI1IiwgIlRETV9EMjUiLCAi VERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDI2IiwgIlRETV9EMjYiLCAiVERNQ19P VVQgU0VMIiB9LAo+PiArICAgICB7ICJURE1fRDI3IiwgIlRETV9EMjciLCAiVERNQ19PVVQgU0VM IiB9LAo+PiArICAgICB7ICJURE1fRDI4IiwgIlRETV9EMjgiLCAiVERNQ19PVVQgU0VMIiB9LAo+ PiArICAgICB7ICJURE1fRDI5IiwgIlRETV9EMjkiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAg ICB7ICJURE1fRDMwIiwgIlRETV9EMzAiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArICAgICB7ICJU RE1fRDMxIiwgIlRETV9EMzEiLCAiVERNQ19PVVQgU0VMIiB9LAo+PiArfTsKPj4gKwo+PiArc3Rh dGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgczRfdGRtb3V0X3BhZF9j b21wb25lbnRfZHJ2ID0gewo+PiArICAgICAuZGFwbV93aWRnZXRzICAgICAgICAgICA9IHM0X3Rk bW91dF9wYWRfZGFwbV93aWRnZXRzLAo+PiArICAgICAubnVtX2RhcG1fd2lkZ2V0cyAgICAgICA9 IEFSUkFZX1NJWkUoczRfdGRtb3V0X3BhZF9kYXBtX3dpZGdldHMpLAo+PiArICAgICAuZGFwbV9y b3V0ZXMgICAgICAgICAgICA9IHM0X3RkbW91dF9wYWRfZGFwbV9yb3V0ZXMsCj4+ICsgICAgIC5u dW1fZGFwbV9yb3V0ZXMgICAgICAgID0gQVJSQVlfU0laRShzNF90ZG1vdXRfcGFkX2RhcG1fcm91 dGVzKSwKPj4gKwo+PiArfTsKPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2Vf aWQgczRfdGRtb3V0X3BhZF9vZl9tYXRjaFtdID0gewo+PiArICAgICB7Cj4+ICsgICAgICAgICAg ICAgLmNvbXBhdGlibGUgPSAiYW1sb2dpYyxzNC10ZG1vdXQtcGFkIiwKPj4gKyAgICAgfSwge30K Pj4gK307Cj4+ICsKPj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHM0X3RkbW91dF9wYWRfb2Zf bWF0Y2gpOwo+PiArCj4+ICtzdGF0aWMgaW50IHRkbV9wYWRfb3V0X3Byb2JlKHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYpCj4+ICt7Cj4+ICsgICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9ICZw ZGV2LT5kZXY7Cj4+ICsgICAgIHN0cnVjdCByZWdtYXAgKm1hcDsKPj4gKyAgICAgdm9pZCBfX2lv bWVtICpyZWdzOwo+PiArCj4+ICsgICAgIHJlZ3MgPSBkZXZtX3BsYXRmb3JtX2lvcmVtYXBfcmVz b3VyY2UocGRldiwgMCk7Cj4+ICsgICAgIGlmIChJU19FUlIocmVncykpCj4+ICsgICAgICAgICAg ICAgcmV0dXJuIFBUUl9FUlIocmVncyk7Cj4+ICsKPj4gKyAgICAgbWFwID0gZGV2bV9yZWdtYXBf aW5pdF9tbWlvKGRldiwgcmVncywgJnRkbW91dF9wYWRfcmVnbWFwX2NmZyk7Cj4+ICsgICAgIGlm IChJU19FUlIobWFwKSkKPj4gKyAgICAgICAgICAgICByZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYs IFBUUl9FUlIobWFwKSwgImZhaWxlZCB0byBpbml0IHJlZ21hcFxuIik7Cj4+ICsKPj4gKyAgICAg cmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoZGV2LCAmczRfdGRtb3V0X3Bh ZF9jb21wb25lbnRfZHJ2LAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBOVUxMLCAwKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9k cml2ZXIgdGRtb3V0X3BhZF9wZHJ2ID0gewo+PiArICAgICAucHJvYmUgPSB0ZG1fcGFkX291dF9w cm9iZSwKPj4gKyAgICAgLmRyaXZlciA9IHsKPj4gKyAgICAgICAgICAgICAubmFtZSA9ICJzNC1w YWQtb3V0IiwKPj4gKyAgICAgICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSBzNF90ZG1vdXRfcGFk X29mX21hdGNoLAo+PiArICAgICB9LAo+PiArfTsKPj4gKwo+PiArbW9kdWxlX3BsYXRmb3JtX2Ry aXZlcih0ZG1vdXRfcGFkX3BkcnYpOwo+PiArCj4+ICtNT0RVTEVfREVTQ1JJUFRJT04oIkFtbG9n aWMgVERNIFBBRCBEUklWRVIiKTsKPj4gK01PRFVMRV9BVVRIT1IoImppZWJpbmcuY2hlbkBhbWxv Z2ljLmNvbSIpOwo+PiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+PiBkaWZmIC0tZ2l0IGEvc291 bmQvc29jL21lc29uL3M0LXRvY29kZWMtY29udHJvbC5jIGIvc291bmQvc29jL21lc29uL3M0LXRv Y29kZWMtY29udHJvbC5jCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmU1ZDgyNGZhZTBlYmE1NDVkMzhkYzM2 ZTI1NjZlN2NlZTU5MGU3ZjUKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9zb3VuZC9zb2MvbWVz b24vczQtdG9jb2RlYy1jb250cm9sLmMKPiBUaGVyZSBpcyBhbHJlYWR5IGEgdG8tYWNvZGVjIGRy aXZlciBhIG5vdCByZWFzb24gaGFzIGJlZW4gcHJvdmlkZWQgYXMgdG8gd2h5IGEKPiBjb21wbGV0 bHkgbmV3IGRyaXZlciBpcyByZXF1aXJlZC4KPgo+IFBsZWFzZSBoYXZlIGxvb2sgYXQgdGhlIGV4 aXN0aW5nIGRyaXZlciBhbmQgZG8gdHJ5IHRvIHVzZSBpdC4KPiBJZiB5b3UgbmVlZCB0byBkbyB0 aGluZ3Mgc28gZGlmZmVyZW50bHksIGNsZWFyIGp1c3RpZmljYXRpb24gYXJlIG5lY2Vzc2FyeS4K CmZvciBnMTJhLXRvYWNvZGVjLmMsIHdlIGZpbmQgdGhlIHRvY29kZWMgY2xvY2sgc291cmNlIGNh bid0IGdldCAKdGhlwqBjbG9jayBpZCBmcm9tIHRoZSB0ZG0gQmUgZGV2aWNlLAoKYW5kIHNldCBp dCBieSB0aGUga2NvbnRyb2wgZnJvbSB1c2VyLMKgIEZvciBkaWZmZXJlbnQgc29jIGNoaXBzLCBU aGUgCmtjb250cm9sIHZhbHVlIG1heWJlIGRpZmZlcmVudCwgVGhlIGtjb250cm9sIGNvbmZpZ3Vy YXRpb24gZG9lc24ndCBsb29rIAp2ZXJ5IGZyaWVuZGx5IGZvciB1c2VyCgpzbyB3ZSB1c2UgZGFw bSByb3V0ZSBwYXRoIHRvIG1hbmFnZSBpdCwgCmZlKGZkZHIpLT5iZSh0ZG0pLT4odG9jb2RlYykt Pihjb2RlYykswqAgYW5kIHVzZSB0aGUgYXV4LWRldnMgdG8gCnJlZ2lzdGVyLMKgIGFuZCBzb3Vu ZCBjYXJkIG9ubHkgaW5jbHVkZSB0aGUKCnNvdW5kLWRhaSA9IDwmdGRtaWZfYT4KCmNvZGVjLTAg ewogwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNvdW5kLWRhaSA9IDwmYWNvZGVjPjsK IMKgfTsKCmFuZCBub3QgaW5jbHVkZQoKY29kZWMtMSB7CiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgc291bmQtZGFpID0gPCZ0b2Fjb2RlYz47CiDCoH07Cgp3aGVuIHRkbSB3b3JrLCBv bmx5IGNvbm5lY3QgdGhlIHRvY29kZWMgcGF0aAoKIMKgIlRETV9BIFBsYXliYWNrIiAtPiJUT0FD T0RFQyBURE1BIi0+IlRPQUNPREVDIElOUFVUIFNSQyIKCml0ZXJhdGUgaXQgZmluZCB0aGUgYmUg ZGV2aWNlICxhbmQgZ2V0IHRoZSBzdHJ1Y3QgYXhnX3RkbV9zdHJlYW0sIHNvIHdlIApjYW4gZ2V0 IHRoZSB0ZG0gY2xvY2sgaWQKClRha2UgaW50byBhY2NvdW50IGJlaGF2aW9yYWwgZGlmZmVyZW5j ZXMsIHdlIGFkZCBuZXcgdG9jb2RlYyBkcml2ZXIgZm9yIHM0Cgo+PiBAQCAtMCwwICsxLDM3NiBA QAo+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IChHUEwtMi4wLW9ubHkgT1IgTUlUKQo+ PiArLyoKPj4gKyAqIENvcHlyaWdodCAoQykgMjAyMyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMg cmVzZXJ2ZWQKPj4gKyAqLwo+PiArCj4+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4+ICsj aW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAu aD4KPj4gKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KPj4gKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFp Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2tlcm5l bC5oPgo+PiArI2luY2x1ZGU8bGludXgva3N0cnRveC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2Ns ay1wcm92aWRlci5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+Cj4+ICsjaW5jbHVkZSAi YXhnLXRkbS5oIgo+PiArCj4+ICsjZGVmaW5lIFRPQUNPREVDX0NUUkwwICAgICAgICAgICAgICAg ICAgICAgICAweDAKPj4gKwo+PiArI2RlZmluZSBDVFJMMF9FTkFCTEVfU0hJRlQgICAgICAgICAg IDMxCj4+ICsjZGVmaW5lIENUUkwwX0JDTEtfRU5BQkxFX1NISUZUICAgICAgICAgICAgICAzMAo+ PiArI2RlZmluZSBDVFJMMF9NQ0xLX0VOQUJMRV9TSElGVCAgICAgICAgICAgICAgMjkKPj4gKyNk ZWZpbmUgQ1RSTDBfQkxLX0NBUF9JTlZfU0hJRlQgICAgICAgICAgICAgIDkKPj4gKwo+PiArI2Rl ZmluZSBURE1fSUZBQ0UgMAo+PiArI2RlZmluZSBURE1fQV9QQUQgMAo+PiArI2RlZmluZSBURE1f Ql9QQUQgMQo+PiArI2RlZmluZSBURE1fQ19QQUQgMgo+PiArCj4+ICtzdHJ1Y3QgdG9hY29kZWMg ewo+PiArICAgICBzdHJ1Y3QgcmVnbWFwX2ZpZWxkICpmaWVsZF9kYXRfc2VsOwo+PiArICAgICBz dHJ1Y3QgcmVnbWFwX2ZpZWxkICpmaWVsZF9scmNsa19zZWw7Cj4+ICsgICAgIHN0cnVjdCByZWdt YXBfZmllbGQgKmZpZWxkX2JjbGtfc2VsOwo+PiArICAgICBzdHJ1Y3QgcmVnbWFwX2ZpZWxkICpm aWVsZF9tY2xrX3NlbDsKPj4gK307Cj4+ICsKPj4gK3N0cnVjdCB0b2Fjb2RlY19tYXRjaF9kYXRh IHsKPj4gKyAgICAgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciAqY29tcG9u ZW50X2RydjsKPj4gKyAgICAgY29uc3Qgc3RydWN0IHJlZ19maWVsZCBmaWVsZF9kYXRfc2VsOwo+ PiArICAgICBjb25zdCBzdHJ1Y3QgcmVnX2ZpZWxkIGZpZWxkX2xyY2xrX3NlbDsKPj4gKyAgICAg Y29uc3Qgc3RydWN0IHJlZ19maWVsZCBmaWVsZF9iY2xrX3NlbDsKPj4gKyAgICAgY29uc3Qgc3Ry dWN0IHJlZ19maWVsZCBmaWVsZF9tY2xrX3NlbDsKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB0b2NvZGVjX3JlZ21hcF9jZmcgPSB7Cj4+ICsgICAgIC5y ZWdfYml0cyAgICAgICA9IDMyLAo+PiArICAgICAudmFsX2JpdHMgICAgICAgPSAzMiwKPj4gKyAg ICAgLnJlZ19zdHJpZGUgICAgID0gNCwKPj4gKyAgICAgLm1heF9yZWdpc3RlciAgID0gMHgxLAo+ PiArfTsKPj4gKwo+PiArI2RlZmluZSBTNF9MQU5FX09GRlNFVCA4Cj4+ICsKPj4gK3N0YXRpYyBj b25zdCBjaGFyICogY29uc3QgczRfdG9jb2RlY19sYW5lX3NlbF90ZXh0c1tdID0gewo+PiArICAg ICAiTGFuZTAiLCAiTGFuZTEiLCAiTGFuZTIiLCAiTGFuZTMiLCAiTGFuZTQiLCAiTGFuZTUiLCAi TGFuZTYiLCAiTGFuZTciCj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19l bnVtIHM0X3RvY29kZWNfbGFuZV9zZWxfZW51bSA9Cj4+ICsgICAgIFNPQ19FTlVNX1NJTkdMRShT TkRfU09DX05PUE0sIDAsIEFSUkFZX1NJWkUoczRfdG9jb2RlY19sYW5lX3NlbF90ZXh0cyksCj4+ ICsgICAgICAgICAgICAgICAgICAgICBzNF90b2NvZGVjX2xhbmVfc2VsX3RleHRzKTsKPj4gKwo+ PiArc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHM0X3RvY29kZWNfbGFuZV9z ZWwgPQo+PiArICAgICBTT0NfREFQTV9FTlVNKCJUT0NPREVDIExBTkUgU0VMIiwgczRfdG9jb2Rl Y19sYW5lX3NlbF9lbnVtKTsKPj4gKwo+PiArc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzNF90 b2NvZGVjX3NyY19zZWxfdGV4dHNbXSA9IHsKPj4gKyAgICAgIlRETUEiLCAiVERNQiIsICJURE1D Igo+PiArfTsKPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzNF90b2NvZGVj X3NyY19zZWxfZW51bSA9Cj4+ICsgICAgIFNPQ19FTlVNX1NJTkdMRShTTkRfU09DX05PUE0sIDAs IEFSUkFZX1NJWkUoczRfdG9jb2RlY19zcmNfc2VsX3RleHRzKSwKPj4gKyAgICAgICAgICAgICAg ICAgICAgIHM0X3RvY29kZWNfc3JjX3NlbF90ZXh0cyk7Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBz dHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzNF90b2NvZGVjX3NyY19zZWwgPQo+PiArICAgICBTT0Nf REFQTV9FTlVNKCJUT0NPREVDIFNFTCIsIHM0X3RvY29kZWNfc3JjX3NlbF9lbnVtKTsKPj4gKwo+ PiArc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHM0X3RvYWNvZGVjX291dF9l bmFibGUgPQo+PiArICAgICBTT0NfREFQTV9TSU5HTEVfQVVUT0RJU0FCTEUoIlN3aXRjaCIsIFRP QUNPREVDX0NUUkwwLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RSTDBf RU5BQkxFX1NISUZULCAxLCAwKTsKPj4gKwo+PiArc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaSAq dG9jb2RlY190ZG1fZ2V0X2FoZWFkX2JlKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQo+ PiArewo+PiArICAgICBzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnA7Cj4+ICsgICAgIHN0cnVj dCBzbmRfc29jX2RhaSAqYmU7Cj4+ICsKPj4gKyAgICAgc25kX3NvY19kYXBtX3dpZGdldF9mb3Jf ZWFjaF9zb3VyY2VfcGF0aCh3LCBwKSB7Cj4+ICsgICAgICAgICAgICAgaWYgKCFwLT5jb25uZWN0 KQo+PiArICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4+ICsgICAgICAgICAgICAgaWYg KHAtPnNvdXJjZS0+aWQgPT0gc25kX3NvY19kYXBtX2RhaV9pbikKPj4gKyAgICAgICAgICAgICAg ICAgICAgIHJldHVybiAoc3RydWN0IHNuZF9zb2NfZGFpICopcC0+c291cmNlLT5wcml2Owo+PiAr ICAgICAgICAgICAgIGJlID0gdG9jb2RlY190ZG1fZ2V0X2FoZWFkX2JlKHAtPnNvdXJjZSk7Cj4+ ICsgICAgICAgICAgICAgaWYgKGJlICYmIGJlLT5pZCA9PSBURE1fSUZBQ0UpCj4+ICsgICAgICAg ICAgICAgICAgICAgICByZXR1cm4gYmU7Cj4+ICsgICAgIH0KPj4gKyAgICAgcmV0dXJuIE5VTEw7 Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB1bnNpZ25lZCBpbnQgYW1sX3NpbXBsZV9zdHJ0b3VsbChj b25zdCBjaGFyICpjcCkKPj4gK3sKPj4gKyAgICAgdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7Cj4+ ICsgICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IDA7Cj4+ICsgICAgIHVuc2lnbmVkIGludCBsZW4g PSBzdHJsZW4oY3ApOwo+PiArCj4+ICsgICAgIHdoaWxlIChsZW4gIT0gMCkgewo+PiArICAgICAg ICAgICAgIGxlbi0tOwo+PiArICAgICAgICAgICAgIHZhbHVlID0gaXNkaWdpdCgqY3ApOwo+PiAr ICAgICAgICAgICAgIGlmICh2YWx1ZSkgewo+PiArICAgICAgICAgICAgICAgICAgICAgdmFsdWUg PSAqY3AgLSAnMCc7Cj4+ICsgICAgICAgICAgICAgfSBlbHNlIHsKPj4gKyAgICAgICAgICAgICAg ICAgICAgIGNwKys7Cj4+ICsgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKPj4gKyAgICAg ICAgICAgICB9Cj4+ICsgICAgICAgICAgICAgY3ArKzsKPj4gKyAgICAgICAgICAgICByZXN1bHQg PSByZXN1bHQgKiAxMCArIHZhbHVlOwo+PiArICAgICB9Cj4+ICsgICAgIHJldHVybiByZXN1bHQ7 Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgYW1sX2dldF9jbGtfaWQoY29uc3QgY2hhciAqbmFt ZSkKPj4gK3sKPj4gKyAgICAgaW50IGNsa19pZCA9IDA7Cj4+ICsKPj4gKyAgICAgaWYgKHN0cnN0 cihuYW1lLCAibXN0X2EiKSkKPj4gKyAgICAgICAgICAgICBjbGtfaWQgPSAwOwo+PiArICAgICBl bHNlIGlmIChzdHJzdHIobmFtZSwgIm1zdF9iIikpCj4+ICsgICAgICAgICAgICAgY2xrX2lkID0g MTsKPj4gKyAgICAgZWxzZSBpZiAoc3Ryc3RyKG5hbWUsICJtc3RfYyIpKQo+PiArICAgICAgICAg ICAgIGNsa19pZCA9IDI7Cj4+ICsgICAgIGVsc2UgaWYgKHN0cnN0cihuYW1lLCAibXN0X2QiKSkK Pj4gKyAgICAgICAgICAgICBjbGtfaWQgPSAzOwo+PiArICAgICBlbHNlIGlmIChzdHJzdHIobmFt ZSwgIm1zdF9lIikpCj4+ICsgICAgICAgICAgICAgY2xrX2lkID0gNDsKPj4gKyAgICAgZWxzZSBp ZiAoc3Ryc3RyKG5hbWUsICJtc3RfZiIpKQo+PiArICAgICAgICAgICAgIGNsa19pZCA9IDU7Cj4+ ICsKPj4gKyAgICAgcmV0dXJuIGNsa19pZDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBhbWxf dG9jb2RlY19zZWxfc2V0KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQo+PiArewo+PiAr ICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmJlOwo+PiArICAgICBzdHJ1Y3QgYXhnX3RkbV9zdHJl YW0gKnN0cmVhbTsKPj4gKyAgICAgc3RydWN0IGF4Z190ZG1faWZhY2UgKmlmYWNlOwo+PiArICAg ICBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCA9IHNuZF9zb2NfZGFwbV90b19j b21wb25lbnQody0+ZGFwbSk7Cj4+ICsgICAgIHN0cnVjdCB0b2Fjb2RlYyAqcHJpdiA9IHNuZF9z b2NfY29tcG9uZW50X2dldF9kcnZkYXRhKGNvbXBvbmVudCk7Cj4+ICsgICAgIHVuc2lnbmVkIGlu dCB0ZG1faWQgPSBURE1fQV9QQUQ7Cj4+ICsgICAgIGNvbnN0IGNoYXIgKmRhaV93aWRnZXRfbmFt ZTsKPj4gKyAgICAgc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwOwo+PiArICAgICB1bnNpZ25l ZCBpbnQgbGFuZSA9IDA7Cj4+ICsgICAgIHVuc2lnbmVkIGludCB2YWwgPSAwOwo+PiArICAgICBz dHJ1Y3QgY2xrICpzY2xrLCAqbWNsazsKPj4gKyAgICAgY2hhciAqY2xrX25hbWU7Cj4+ICsgICAg IGludCBtY2xrX2lkLCBzY2xrX2lkOwo+PiArCj4+ICsgICAgIGJlID0gdG9jb2RlY190ZG1fZ2V0 X2FoZWFkX2JlKHcpOwo+PiArICAgICBpZiAoIWJlKSB7Cj4+ICsgICAgICAgICAgICAgZGV2X2Vy cihjb21wb25lbnQtPmRldiwgIiVzIG5vdCBmaW5kIHRoZSBiZVxuIiwgX19mdW5jX18pOwo+PiAr ICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+PiArICAgICB9Cj4+ICsgICAgIHN0cmVhbSA9 IHNuZF9zb2NfZGFpX2RtYV9kYXRhX2dldF9wbGF5YmFjayhiZSk7Cj4+ICsgICAgIGlmICghc3Ry ZWFtKSB7Cj4+ICsgICAgICAgICAgICAgZGV2X2Vycihjb21wb25lbnQtPmRldiwgIiVzIG5vdCBm aW5kIHRoZSBzdHJlYW1cbiIsIF9fZnVuY19fKTsKPj4gKyAgICAgICAgICAgICByZXR1cm4gLUVJ TlZBTDsKPj4gKyAgICAgfQo+PiArICAgICAvKndlIGxpa2UgdG8gdXNlIGRhaSBpZCwgYnV0IGl0 IGlzIGZpeGVkIHZhbCovCj4+ICsgICAgIGRhaV93aWRnZXRfbmFtZSA9IGJlLT5zdHJlYW1bU05E UlZfUENNX1NUUkVBTV9QTEFZQkFDS10ud2lkZ2V0LT5uYW1lOwo+PiArICAgICBpZiAoc3Ryc3Ry KGRhaV93aWRnZXRfbmFtZSwgIlRETV9BIikpCj4+ICsgICAgICAgICAgICAgdGRtX2lkID0gVERN X0FfUEFEOwo+PiArICAgICBlbHNlIGlmIChzdHJzdHIoZGFpX3dpZGdldF9uYW1lLCAiVERNX0Ii KSkKPj4gKyAgICAgICAgICAgICB0ZG1faWQgPSBURE1fQl9QQUQ7Cj4+ICsgICAgIGVsc2UgaWYg KHN0cnN0cihkYWlfd2lkZ2V0X25hbWUsICJURE1fQyIpKQo+PiArICAgICAgICAgICAgIHRkbV9p ZCA9IFRETV9DX1BBRDsKPj4gKyAgICAgc25kX3NvY19kYXBtX3dpZGdldF9mb3JfZWFjaF9zb3Vy Y2VfcGF0aCh3LCBwKSB7Cj4+ICsgICAgICAgICAgICAgaWYgKHAtPmNvbm5lY3QgJiYgcC0+bmFt ZSkgewo+PiArICAgICAgICAgICAgICAgICAgICAgbGFuZSA9IGFtbF9zaW1wbGVfc3RydG91bGwo cC0+bmFtZSk7Cj4+ICsgICAgICAgICAgICAgICAgICAgICB2YWwgPSBsYW5lICsgdGRtX2lkICog UzRfTEFORV9PRkZTRVQ7Cj4+ICsgICAgICAgICAgICAgICAgICAgICByZWdtYXBfZmllbGRfd3Jp dGUocHJpdi0+ZmllbGRfZGF0X3NlbCwgdmFsKTsKPj4gKyAgICAgICAgICAgICB9Cj4+ICsgICAg IH0KPj4gKyAgICAgaWZhY2UgPSBzdHJlYW0tPmlmYWNlOwo+PiArICAgICBtY2xrID0gaWZhY2Ut Pm1jbGs7Cj4+ICsgICAgIHNjbGsgPSBpZmFjZS0+c2NsazsKPj4gKyAgICAgbWNsa19pZCA9IGFt bF9nZXRfY2xrX2lkKF9fY2xrX2dldF9uYW1lKG1jbGspKTsKPj4gKyAgICAgc2Nsa19pZCA9IGFt bF9nZXRfY2xrX2lkKF9fY2xrX2dldF9uYW1lKHNjbGspKTsKPj4gKyAgICAgcmVnbWFwX2ZpZWxk X3dyaXRlKHByaXYtPmZpZWxkX21jbGtfc2VsLCBtY2xrX2lkKTsKPj4gKyAgICAgcmVnbWFwX2Zp ZWxkX3dyaXRlKHByaXYtPmZpZWxkX2JjbGtfc2VsLCBzY2xrX2lkKTsKPj4gKyAgICAgcmVnbWFw X2ZpZWxkX3dyaXRlKHByaXYtPmZpZWxkX2xyY2xrX3NlbCwgc2Nsa19pZCk7Cj4+ICsKPj4gKyAg ICAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdG9jb2RlY19zZWxfZXZlbnQo c3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmNvbnRyb2wsCj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgIGludCBldmVudCkKPj4gK3sKPj4gKyAgICAgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50 ICpjb21wb25lbnQgPSBzbmRfc29jX2RhcG1fdG9fY29tcG9uZW50KHctPmRhcG0pOwo+PiArICAg ICBpbnQgcmV0ID0gMDsKPj4gKwo+PiArICAgICBzd2l0Y2ggKGV2ZW50KSB7Cj4+ICsgICAgIGNh c2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Cj4+ICsgICAgICAgICAgICAgcmV0ID0gYW1sX3RvY29k ZWNfc2VsX3NldCh3KTsKPj4gKyAgICAgICAgICAgICBicmVhazsKPj4gKwo+PiArICAgICBjYXNl IFNORF9TT0NfREFQTV9QUkVfUE1EOgo+PiArICAgICAgICAgICAgIGJyZWFrOwo+PiArCj4+ICsg ICAgIGRlZmF1bHQ6Cj4+ICsgICAgICAgICAgICAgZGV2X2Vycihjb21wb25lbnQtPmRldiwgIlVu ZXhwZWN0ZWQgZXZlbnQgJWRcbiIsIGV2ZW50KTsKPj4gKyAgICAgICAgICAgICByZXR1cm4gLUVJ TlZBTDsKPj4gKyAgICAgfQo+PiArCj4+ICsgICAgIHJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4g K3N0YXRpYyBpbnQgdG9jb2RlY19jbGtfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0 ICp3LAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAq Y29udHJvbCwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCkKPj4gK3sK Pj4gKyAgICAgaW50IHJldCA9IDA7Cj4+ICsgICAgIHVuc2lnbmVkIGludCBtYXNrID0gMCwgdmFs ID0gMDsKPj4gKyAgICAgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQgPSBzbmRf c29jX2RhcG1fdG9fY29tcG9uZW50KHctPmRhcG0pOwo+PiArCj4+ICsgICAgIHNuZF9zb2NfY29t cG9uZW50X3VwZGF0ZV9iaXRzKGNvbXBvbmVudCwgVE9BQ09ERUNfQ1RSTDAsCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgQ1RSTDBfQkxLX0NBUF9JTlZfU0hJRlQs IDEgPDwgQ1RSTDBfQkxLX0NBUF9JTlZfU0hJRlQpOwo+PiArICAgICBzd2l0Y2ggKGV2ZW50KSB7 Cj4+ICsgICAgIGNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Cj4+ICsgICAgICAgICAgICAgbWFz ayA9IDEgPDwgQ1RSTDBfTUNMS19FTkFCTEVfU0hJRlQgfCAxIDw8IENUUkwwX0JDTEtfRU5BQkxF X1NISUZUOwo+PiArICAgICAgICAgICAgIHZhbCA9IDEgPDwgQ1RSTDBfTUNMS19FTkFCTEVfU0hJ RlQgfCAxIDw8IENUUkwwX0JDTEtfRU5BQkxFX1NISUZUOwo+PiArICAgICAgICAgICAgIHNuZF9z b2NfY29tcG9uZW50X3VwZGF0ZV9iaXRzKGNvbXBvbmVudCwgVE9BQ09ERUNfQ1RSTDAsIG1hc2ss IHZhbCk7Cj4+ICsgICAgICAgICAgICAgYnJlYWs7Cj4+ICsgICAgIGNhc2UgU05EX1NPQ19EQVBN X1BSRV9QTUQ6Cj4+ICsgICAgICAgICAgICAgbWFzayA9IDEgPDwgQ1RSTDBfTUNMS19FTkFCTEVf U0hJRlQgfCAxIDw8IENUUkwwX0JDTEtfRU5BQkxFX1NISUZUOwo+PiArICAgICAgICAgICAgIHZh bCA9IDAgPDwgQ1RSTDBfTUNMS19FTkFCTEVfU0hJRlQgfCAwIDw8IENUUkwwX0JDTEtfRU5BQkxF X1NISUZUOwo+PiArICAgICAgICAgICAgIHNuZF9zb2NfY29tcG9uZW50X3VwZGF0ZV9iaXRzKGNv bXBvbmVudCwgVE9BQ09ERUNfQ1RSTDAsIG1hc2ssIHZhbCk7Cj4+ICsgICAgICAgICAgICAgYnJl YWs7Cj4+ICsgICAgIGRlZmF1bHQ6Cj4+ICsgICAgICAgICAgICAgZGV2X2Vycihjb21wb25lbnQt PmRldiwgIlVuZXhwZWN0ZWQgZXZlbnQgJWRcbiIsIGV2ZW50KTsKPj4gKyAgICAgICAgICAgICBy ZXR1cm4gLUVJTlZBTDsKPj4gKyAgICAgfQo+PiArCj4+ICsgICAgIHJldHVybiByZXQ7Cj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBzNF90b2Fj b2RlY193aWRnZXRzW10gPSB7Cj4+ICsgICAgIFNORF9TT0NfREFQTV9NVVhfRSgiTGFuZSBTUkMi LCBTTkRfU09DX05PUE0sIDAsIDAsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAmczRfdG9j b2RlY19sYW5lX3NlbCwgdG9jb2RlY19zZWxfZXZlbnQsCj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAoU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCkpLAo+PiAr ICAgICBTTkRfU09DX0RBUE1fTVVYKCJJTlBVVCBTUkMiLCBTTkRfU09DX05PUE0sIDAsIDAsICZz NF90b2NvZGVjX3NyY19zZWwpLAo+PiArICAgICBTTkRfU09DX0RBUE1fU1dJVENIX0UoIk9VVCBF TiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZz NF90b2Fjb2RlY19vdXRfZW5hYmxlLCB0b2NvZGVjX2Nsa19lbmFibGUsCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9Q UkVfUE1EKSksCj4+ICsgICAgIFNORF9TT0NfREFQTV9BSUZfSU4oIlRETUEiLCBOVUxMLCAwLCBT TkRfU09DX05PUE0sIDAsIDApLAo+PiArICAgICBTTkRfU09DX0RBUE1fQUlGX0lOKCJURE1CIiwg TlVMTCwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKPj4gKyAgICAgU05EX1NPQ19EQVBNX0FJRl9J TigiVERNQyIsIE5VTEwsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCj4+ICsgICAgIFNORF9TT0Nf REFQTV9PVVRfRFJWKCJMYW5lMCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCj4+ICsg ICAgIFNORF9TT0NfREFQTV9PVVRfRFJWKCJMYW5lMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVM TCwgMCksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRfRFJWKCJMYW5lMiIsIFNORF9TT0NfTk9Q TSwgMCwgMCwgTlVMTCwgMCksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRfRFJWKCJMYW5lMyIs IFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRf RFJWKCJMYW5lNCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCj4+ICsgICAgIFNORF9T T0NfREFQTV9PVVRfRFJWKCJMYW5lNSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCj4+ ICsgICAgIFNORF9TT0NfREFQTV9PVVRfRFJWKCJMYW5lNiIsIFNORF9TT0NfTk9QTSwgMCwgMCwg TlVMTCwgMCksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRfRFJWKCJMYW5lNyIsIFNORF9TT0Nf Tk9QTSwgMCwgMCwgTlVMTCwgMCksCj4+ICsgICAgIFNORF9TT0NfREFQTV9PVVRQVVQoIlRETV9U T19BQ09ERUMiKSwKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19k YXBtX3JvdXRlIHM0X3RvY29kZWNfZGFwbV9yb3V0ZXNbXSA9IHsKPj4gKyAgICAgeyAiSU5QVVQg U1JDIiwgIlRETUEiLCAiVERNQSJ9LAo+PiArICAgICB7ICJJTlBVVCBTUkMiLCAiVERNQiIsICJU RE1CIn0sCj4+ICsgICAgIHsgIklOUFVUIFNSQyIsICJURE1DIiwgIlRETUMifSwKPj4gKyAgICAg eyAiTGFuZTAiLCBOVUxMLCAiSU5QVVQgU1JDIiB9LAo+PiArICAgICB7ICJMYW5lMSIsIE5VTEws ICJJTlBVVCBTUkMifSwKPj4gKyAgICAgeyAiTGFuZTIiLCBOVUxMLCAiSU5QVVQgU1JDIn0sCj4+ ICsgICAgIHsgIkxhbmUzIiwgTlVMTCwgIklOUFVUIFNSQyJ9LAo+PiArICAgICB7ICJMYW5lNCIs IE5VTEwsICJJTlBVVCBTUkMifSwKPj4gKyAgICAgeyAiTGFuZTUiLCBOVUxMLCAiSU5QVVQgU1JD In0sCj4+ICsgICAgIHsgIkxhbmU2IiwgTlVMTCwgIklOUFVUIFNSQyJ9LAo+PiArICAgICB7ICJM YW5lNyIsIE5VTEwsICJJTlBVVCBTUkMifSwKPj4gKyAgICAgeyAiTGFuZSBTUkMiLCAiTGFuZTAi LCAiTGFuZTAifSwKPj4gKyAgICAgeyAiTGFuZSBTUkMiLCAiTGFuZTEiLCAiTGFuZTEifSwKPj4g KyAgICAgeyAiTGFuZSBTUkMiLCAiTGFuZTIiLCAiTGFuZTIifSwKPj4gKyAgICAgeyAiTGFuZSBT UkMiLCAiTGFuZTMiLCAiTGFuZTMifSwKPj4gKyAgICAgeyAiTGFuZSBTUkMiLCAiTGFuZTQiLCAi TGFuZTQifSwKPj4gKyAgICAgeyAiTGFuZSBTUkMiLCAiTGFuZTUiLCAiTGFuZTUifSwKPj4gKyAg ICAgeyAiTGFuZSBTUkMiLCAiTGFuZTYiLCAiTGFuZTYifSwKPj4gKyAgICAgeyAiTGFuZSBTUkMi LCAiTGFuZTciLCAiTGFuZTcifSwKPj4gKyAgICAgeyAiT1VUIEVOIiwgIlN3aXRjaCIsICJMYW5l IFNSQyJ9LAo+PiArICAgICB7ICJURE1fVE9fQUNPREVDIiwgTlVMTCwgIk9VVCBFTiJ9LAo+PiAr Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2Ry aXZlciBzNF90b2NvZGVjX2NvbXBvbmVudF9kcnYgPSB7Cj4+ICsgICAgIC5kYXBtX3dpZGdldHMg ICAgICAgICAgID0gczRfdG9hY29kZWNfd2lkZ2V0cywKPj4gKyAgICAgLm51bV9kYXBtX3dpZGdl dHMgICAgICAgPSBBUlJBWV9TSVpFKHM0X3RvYWNvZGVjX3dpZGdldHMpLAo+PiArICAgICAuZGFw bV9yb3V0ZXMgICAgICAgICAgICA9IHM0X3RvY29kZWNfZGFwbV9yb3V0ZXMsCj4+ICsgICAgIC5u dW1fZGFwbV9yb3V0ZXMgICAgICAgID0gQVJSQVlfU0laRShzNF90b2NvZGVjX2RhcG1fcm91dGVz KSwKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9hY29kZWNfbWF0Y2hfZGF0 YSBzNF90b2Fjb2RlY19tYXRjaF9kYXRhID0gewo+PiArICAgICAuY29tcG9uZW50X2RydiAgPSAm czRfdG9jb2RlY19jb21wb25lbnRfZHJ2LAo+PiArICAgICAuZmllbGRfZGF0X3NlbCAgPSBSRUdf RklFTEQoVE9BQ09ERUNfQ1RSTDAsIDE2LCAyMCksCj4+ICsgICAgIC5maWVsZF9scmNsa19zZWwg PSBSRUdfRklFTEQoVE9BQ09ERUNfQ1RSTDAsIDEyLCAxNCksCj4+ICsgICAgIC5maWVsZF9iY2xr X3NlbCA9IFJFR19GSUVMRChUT0FDT0RFQ19DVFJMMCwgNCwgNiksCj4+ICsgICAgIC5maWVsZF9t Y2xrX3NlbCA9IFJFR19GSUVMRChUT0FDT0RFQ19DVFJMMCwgMCwgMiksCj4+ICt9Owo+PiArCj4+ ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzNF90b2NvZGVjX29mX21hdGNoW10g PSB7Cj4+ICsgICAgIHsKPj4gKyAgICAgICAgICAgICAuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLHM0 LXRvY29kZWMiLAo+PiArICAgICAgICAgICAgIC5kYXRhID0gJnM0X3RvYWNvZGVjX21hdGNoX2Rh dGEsCj4+ICsgICAgIH0sIHt9Cj4+ICt9Owo+PiArCj4+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9m LCBzNF90b2NvZGVjX29mX21hdGNoKTsKPj4gKwo+PiArc3RhdGljIGludCB0b2NvZGVjX3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4+ICt7Cj4+ICsgICAgIGNvbnN0IHN0cnVj dCB0b2Fjb2RlY19tYXRjaF9kYXRhICpkYXRhOwo+PiArICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYg PSAmcGRldi0+ZGV2Owo+PiArICAgICBzdHJ1Y3QgdG9hY29kZWMgKnByaXY7Cj4+ICsgICAgIHZv aWQgX19pb21lbSAqcmVnczsKPj4gKyAgICAgc3RydWN0IHJlZ21hcCAqbWFwOwo+PiArICAgICBp bnQgcmV0Owo+PiArCj4+ICsgICAgIGRhdGEgPSBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTsK Pj4gKyAgICAgaWYgKCFkYXRhKQo+PiArICAgICAgICAgICAgIHJldHVybiBkZXZfZXJyX3Byb2Jl KGRldiwgLUVOT0RFViwgImZhaWxlZCB0byBtYXRjaCBkZXZpY2VcbiIpOwo+PiArICAgICBwcml2 ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7Cj4+ICsgICAg IGlmICghcHJpdikKPj4gKyAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArICAg ICBwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKPj4gKwo+PiArICAgICByZXQgPSBk ZXZpY2VfcmVzZXQoZGV2KTsKPj4gKyAgICAgaWYgKHJldCkKPj4gKyAgICAgICAgICAgICByZXR1 cm4gcmV0Owo+PiArCj4+ICsgICAgIHJlZ3MgPSBkZXZtX3BsYXRmb3JtX2lvcmVtYXBfcmVzb3Vy Y2UocGRldiwgMCk7Cj4+ICsgICAgIGlmIChJU19FUlIocmVncykpCj4+ICsgICAgICAgICAgICAg cmV0dXJuIFBUUl9FUlIocmVncyk7Cj4+ICsKPj4gKyAgICAgbWFwID0gZGV2bV9yZWdtYXBfaW5p dF9tbWlvKGRldiwgcmVncywgJnRvY29kZWNfcmVnbWFwX2NmZyk7Cj4+ICsgICAgIGlmIChJU19F UlIobWFwKSkKPj4gKyAgICAgICAgICAgICByZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9F UlIobWFwKSwgImZhaWxlZCB0byBpbml0IHJlZ21hcFxuIik7Cj4+ICsKPj4gKyAgICAgcHJpdi0+ ZmllbGRfZGF0X3NlbCA9IGRldm1fcmVnbWFwX2ZpZWxkX2FsbG9jKGRldiwgbWFwLCBkYXRhLT5m aWVsZF9kYXRfc2VsKTsKPj4gKyAgICAgaWYgKElTX0VSUihwcml2LT5maWVsZF9kYXRfc2VsKSkK Pj4gKyAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihwcml2LT5maWVsZF9kYXRfc2VsKTsKPj4g Kwo+PiArICAgICBwcml2LT5maWVsZF9scmNsa19zZWwgPSBkZXZtX3JlZ21hcF9maWVsZF9hbGxv YyhkZXYsIG1hcCwgZGF0YS0+ZmllbGRfbHJjbGtfc2VsKTsKPj4gKyAgICAgaWYgKElTX0VSUihw cml2LT5maWVsZF9scmNsa19zZWwpKQo+PiArICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKHBy aXYtPmZpZWxkX2xyY2xrX3NlbCk7Cj4+ICsKPj4gKyAgICAgcHJpdi0+ZmllbGRfYmNsa19zZWwg PSBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhkZXYsIG1hcCwgZGF0YS0+ZmllbGRfYmNsa19zZWwp Owo+PiArICAgICBpZiAoSVNfRVJSKHByaXYtPmZpZWxkX2JjbGtfc2VsKSkKPj4gKyAgICAgICAg ICAgICByZXR1cm4gUFRSX0VSUihwcml2LT5maWVsZF9iY2xrX3NlbCk7Cj4+ICsKPj4gKyAgICAg cHJpdi0+ZmllbGRfbWNsa19zZWwgPSBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhkZXYsIG1hcCwg ZGF0YS0+ZmllbGRfbWNsa19zZWwpOwo+PiArICAgICBpZiAoSVNfRVJSKHByaXYtPmZpZWxkX21j bGtfc2VsKSkKPj4gKyAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihwcml2LT5maWVsZF9tY2xr X3NlbCk7Cj4+ICsKPj4gKyAgICAgcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jb21wb25l bnQoZGV2LAo+PiArICAgICAgICAgICAgICAgICAgICAgZGF0YS0+Y29tcG9uZW50X2RydiwgTlVM TCwgMCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRvY29k ZWNfcGRydiA9IHsKPj4gKyAgICAgLnByb2JlID0gdG9jb2RlY19wcm9iZSwKPj4gKyAgICAgLmRy aXZlciA9IHsKPj4gKyAgICAgICAgICAgICAubmFtZSA9ICJzNC10b2NvZGVjIiwKPj4gKyAgICAg ICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSBzNF90b2NvZGVjX29mX21hdGNoLAo+PiArICAgICB9 LAo+PiArfTsKPj4gKwo+PiArbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0b2NvZGVjX3BkcnYpOwo+ PiArCj4+ICtNT0RVTEVfREVTQ1JJUFRJT04oIkFtbG9naWMgdG8gY29kZWMgZHJpdmVyIik7Cj4+ ICtNT0RVTEVfQVVUSE9SKCJqaWViaW5nLmNoZW5AYW1sb2dpYy5jb20iKTsKPj4gK01PRFVMRV9M SUNFTlNFKCJHUEwiKTsKPj4gZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tZXNvbi90OTAxNS5jIGIv c291bmQvc29jL21lc29uL3Q5MDE1LmMKPj4gaW5kZXggNTcxZjY1Nzg4YzU5MjA1MGFiZGNhMjY0 ZjU2NTZkNGQxYTlkOTlmNi4uMmRiMWNkMThjZjJjZWE1MDdmM2Q3MjgyMDU0ZTAzZDk1MzU4NjY0 OCAxMDA2NDQKPj4gLS0tIGEvc291bmQvc29jL21lc29uL3Q5MDE1LmMKPj4gKysrIGIvc291bmQv c29jL21lc29uL3Q5MDE1LmMKPj4gQEAgLTg5LDEwICs4OSw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc25k X3NvY19kYWlfZHJpdmVyIHQ5MDE1X2RhaSA9IHsKPj4gICAgICAgICAgICAgICAgLmNoYW5uZWxz X21pbiA9IDEsCj4+ICAgICAgICAgICAgICAgIC5jaGFubmVsc19tYXggPSAyLAo+PiAgICAgICAg ICAgICAgICAucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwLAo+PiAtICAgICAgICAg ICAgIC5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzggfAo+PiAtICAgICAgICAgICAgICAg ICAgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKPj4gLSAgICAgICAgICAgICAgICAg ICAgICAgICBTTkRSVl9QQ01fRk1UQklUX1MyMF9MRSB8Cj4+IC0gICAgICAgICAgICAgICAgICAg ICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAo+PiArICAgICAgICAgICAgIC5mb3JtYXRz ID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAo+ IEFnYWluLCBtaXhlZCB1cCBjaGFuZ2VzIHdpdGggemVybyBqdXN0aWZpY2F0aW9uLgo+Cj4gVGhp cyBkcm9wcyBTOCBhbmQgUzE2IGZvcm1hdCBzdXBwb3J0IGZvciB0aGUgZXhpc3RpbmcgU29DcyAo c3VjaCBhcyBHWEwpCj4gd2hpY2ggaXMga25vd24gdG8gd29yayBhbmQgYWRkIFMzMiBzdXBwb3J0 IG9uIGFuIEhXIGRvY3VtZW50ZWQgYXMgMjRiaXRzCj4gb25seS4gQ2FuIHlvdSBleHBsYWluID8K Pgo+PiAgICAgICAgfSwKPj4gICAgICAgIC5vcHMgPSAmdDkwMTVfZGFpX29wcywKPj4gICB9Owo+ IC0tCj4gSmVyb21lCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpsaW51eC1hbWxvZ2ljIG1haWxpbmcgbGlzdApsaW51eC1hbWxvZ2ljQGxpc3RzLmluZnJh ZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1hbWxvZ2ljCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 84FDBC02183 for ; Tue, 14 Jan 2025 08:18:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:MIME-Version: Content-Transfer-Encoding:Content-Type:In-Reply-To:From:References:Cc:To: Subject:Date:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=9fhS7QfUhH4AoZ36WNXl8ExkV4odwP47CWmn43y0d4E=; b=gu1AEzlRVUEWso5hI6lP/UdAux 0ZWaHtyfqV2YDUq5/7RSTmqizSTTGjGgXJYOGf17Pjh6tsPsiwgbsCdrT95wgMmjpKtpaR2z1N5lh 5qa3rVBP136GODYCxrSw1qvgyga2IVqLGU+DrvW2l9vzzF1cNBXjNh7SaTC97rX5NjVStW/conoR0 AsNvViLTprXm0kHaL7Std5KTSwM+KLOxlbA9g6gGVTJykYb6uG17dblsP+gAODvBLsNiDcuatpJRN wlj4Xogc/zlKq1Guv7xLRZkZHorsOBKpJeNKngOwF4z8l/EKqXApss8vDu6IY51s+0FNjLddAC1Bs 681myLsQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tXc7y-00000007nRH-3Y5d; Tue, 14 Jan 2025 08:18:22 +0000 Received: from mail-sg2apc01on2072a.outbound.protection.outlook.com ([2a01:111:f403:200f::72a] helo=APC01-SG2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tXc6j-00000007nN5-2z6x; Tue, 14 Jan 2025 08:17:07 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Jeg9ywvzS6J/57AC09n4JmsglcPTPxwGbQLOkLIBP+vE56y2WT57ZR3Q+xjrf87wQAbtRy3COuppyhwjYBx+/f3BlUZaZvwZ6qTpM231npeLaynRBd+iKRHKHNUa+enrWVJaGDPf5fewCCOcCdEzuhrxX41qnadiQp5kpOoydyMRMDZ219NJe4L9C0TYH2zDESGoxD6o4TA9SDRJA3iAtMT2Vbmm0N3dLuMToV9sdDvU3DyIWQTdOsU/VtvRLSfDHqicdGCiLze/ynQgLmgbGZwKzNJDiHFGsdV+rbxKlZstHqVuqLiaV6iu7guQgpWeyf4bSCMcb4l0IChrpw7aSw== 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=9fhS7QfUhH4AoZ36WNXl8ExkV4odwP47CWmn43y0d4E=; b=fayEQ0YHmLSr5dETVOmU94OJZTtbd1Nvs4nXN8WTcV16eBmqZSZv2NRHTEJ+kSCHUOmVPobLzPvhoatArCykK7X5Ao6T5Eh2JAslqFdH2vkf0nUfIas3k29fbwLXOIv9TVyv1YtmHNk14HTE01pTXIKUogLqLwNNTW2E9Fd57YIKw1QCFR4aimgORNKhjuKouL5CNLuaQOIG31GzSYnAk9WMc/dnKOWcQeHXi9ecWh8eMG5kwiPfUhXbp3CxAj+7D7rWMyDF8uVrxvMBhVkCDebfWSOeO2EvC+wnytovfCRgt6dFigaEaJ0ARTpCj1cofgTSuCr+j6kAWKg2qrFgvA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amlogic.com; dmarc=pass action=none header.from=amlogic.com; dkim=pass header.d=amlogic.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amlogic.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9fhS7QfUhH4AoZ36WNXl8ExkV4odwP47CWmn43y0d4E=; b=OzYaxzV2ARWFxDKtYoRt2s+GHW3AqKTgNqCqXcI41MkMM6UmCSUyr9lRckFFNTmyrsIJC5nQ9uFvg1PMWjQZXCPSYtXpK065meNogfy2PW7MjwyWY9qiy5CLknI+crCrngCTAJTVhV8mWXF6y/afkTEplkMT/0GXr6CR3uWgsR3y65bFdHU7pmQFL+53MuIABQwZpHercH8lOqkP3C6pR6Qb3hqqnGpirirNC1P8AYa783TaVvo1uo1AoIUc2lj8GwL3iXGRktkcobCn379brlVoOmtz3qarZPXnwwt+iGo+a3Ev32ZXAHKISFo2jFcIc5Jfp4/Y8pSML4IaoWEkSQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amlogic.com; Received: from SEYPR03MB7118.apcprd03.prod.outlook.com (2603:1096:101:d3::12) by TYZPR03MB7845.apcprd03.prod.outlook.com (2603:1096:400:44e::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8335.17; Tue, 14 Jan 2025 08:16:45 +0000 Received: from SEYPR03MB7118.apcprd03.prod.outlook.com ([fe80::b748:89c0:9b9c:64d3]) by SEYPR03MB7118.apcprd03.prod.outlook.com ([fe80::b748:89c0:9b9c:64d3%7]) with mapi id 15.20.8335.017; Tue, 14 Jan 2025 08:16:43 +0000 Message-ID: Date: Tue, 14 Jan 2025 16:16:39 +0800 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 2/3] ASoC: meson: s4:support for the on-chip audio To: Jerome Brunet , jiebing chen via B4 Relay Cc: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jaroslav Kysela , Takashi Iwai , Neil Armstrong , Kevin Hilman , Martin Blumenstingl , linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-amlogic@lists.infradead.org References: <20250113-audio_drvier-v1-0-8c14770f38a0@amlogic.com> <20250113-audio_drvier-v1-2-8c14770f38a0@amlogic.com> <1jwmey9451.fsf@starbuckisacylon.baylibre.com> From: Jiebing Chen In-Reply-To: <1jwmey9451.fsf@starbuckisacylon.baylibre.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-ClientProxiedBy: SI1PR02CA0011.apcprd02.prod.outlook.com (2603:1096:4:1f7::19) To SEYPR03MB7118.apcprd03.prod.outlook.com (2603:1096:101:d3::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR03MB7118:EE_|TYZPR03MB7845:EE_ X-MS-Office365-Filtering-Correlation-Id: 8f009f64-0577-4810-009a-08dd3473c7cd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016; X-Microsoft-Antispam-Message-Info: =?utf-8?B?QWhIM2d5SlB6SDQrbHprVW9qVWNWTTFSMEltOW0rMlE1WER0STRLZ2tsVWlV?= =?utf-8?B?YmVLRkRSaXdUKzZydlptTHYvUVB5OTQ3bGYvcG1pbmZaSi8xdWNJc20vbXBz?= =?utf-8?B?VVdqTlk3clRvVWxYQWNlODRnZzFFckdUbjMyTUlsZGR6eG05TjBpUUd2dDJz?= =?utf-8?B?YXRFaU55VENvVjJBbWpkSUVuWjFINEUzODhwUXlBaUNKUGhSNzgzWnpXT2JS?= =?utf-8?B?MW5DcU1LTHhYSDBBcngxZGVIMzBaUkIyWHBnLzhBMndyMG1GbVl0VG9XekVv?= =?utf-8?B?TFZQN3AyZDVJb0UxSXd4dzYyTHN2a1dYdDl5a0h2TlhUQ0tEaTBSMGx5UTdN?= =?utf-8?B?a1p1WU0rK2NLTmU3R3ZGMW41enlvU1ovanlaWlA1MVVUc3BENW1GdUh6dkQv?= =?utf-8?B?emRlM0pqTFJaMDh6dkJEWjRzSmxJcHVtNHBpa01TV2FCUk53cThZZnJDczN6?= =?utf-8?B?WVBvc00yelJpY2VMTFpQU1FYaFIwZmVDbkJsY3RHb0Q4Y0pCVWY3NXJNeUpW?= =?utf-8?B?VmtPMmRFeG1YVnQrWW8vYVBuN1Q2K21HV3RFK1RZcXdLK292bzJQaG9jQnNG?= =?utf-8?B?SGw2WkhyYXFIeEplaUF6Qm5ZNm9Eb0lJZ205cU5oU1grQlRFN2M5cXV1ZE1r?= =?utf-8?B?Sk92S2xob0VWR3RrVHc3MkxMK3hvVGdsWmNqMWhEYm9SWkFQVTJqeGdteTNm?= =?utf-8?B?KzIyTkIySk5VMnluWXRaVG4vOU9BUTBSTmorUStuMThCb09GVCtkdVZPUnpV?= =?utf-8?B?TktDb3d4V0t0QjRzc1dWVnovQUNlSFNEdFZOVzViSit3VDJteE9lTnRJaS9I?= =?utf-8?B?U25IbzVuanRqKzZ2T0ZBdWl0MHFvMXh3dk5hUWoxRi8xYm5ndEh3TnFkeE5I?= =?utf-8?B?b0xiUnEwdGVoZndpdlVuNDRyRGJVN0tVa1gvNnhKMFZrTUVGdFA3R2RiK2JU?= =?utf-8?B?SWlETTZqSzlObHFQd1pyWFVSUW1qV1FKRmtkeGhiakhCQXpCV29KVkl3TXFU?= =?utf-8?B?aXZQdzF4ZVpyM2x4YURwV2UrUjlSdXQrT0I2K3dPWHJSV0ZCc2hNOFV2RUxK?= =?utf-8?B?WDZwL25lNmQ2RTR4Q1crQUZXMVNEYjY0QXN2SzFWUHdBTDRsb3g2RE1RNHFK?= =?utf-8?B?Um53d2p1L282OWxsYU5VWmNwM3NPOHJ1V0YzclhIaG5wWWMrdk1sRHVRWHF4?= =?utf-8?B?VDlxUi9KZnZmQkh4eHgwME5vR3FPL1VmbUU4QXlJSXplSlJpNGJXQXQrUlgz?= =?utf-8?B?enhDVUFjdGRuUE9JV0NudmY1Z1Q4MTBQb2cxVlJ3Z2JZUmo4ODk1LzIzNXVS?= =?utf-8?B?TFhxeUxvS3Z0MDZnWldhZHJsb0VabEVFcEhtZTR6UjBNaVhLRWdzc2IvLzlJ?= =?utf-8?B?ZWVEeVovdEhTeE1TaTJiZ2RSQjgyd0NPKy9qaGpFR1JNLzh2ZEFwZm5pUC9K?= =?utf-8?B?MUowZFp2a25kVEV2Y3ZiNkd2VWZyOHpGWXJBUmpiVVF4eHZkMm9CbU42MGxK?= =?utf-8?B?NUJSMEswemc1RVg0TGh5bmJLbEw5Z2lRUU1BNk9yUzE3eUlNdUdzTWVpUVZS?= =?utf-8?B?dlBML0o2djVkYlZtYk9QVTYrS1ZYUnJXUFZZeXRBS2RHeVdIWENGUmlzTzRv?= =?utf-8?B?K2E4Q1U4VUNzQTRBL08zcGlqVE5mbkJKSlhuREw2WjM1MFc3QjlUTERMdU9D?= =?utf-8?B?T1ZvT3krQ08vMFFVNkpielRrUVZkTk1DU0FSRVk2S3ZQMTYzRGJtekR6UFZV?= =?utf-8?B?dTl4d2xqNUc2bzhtcUFZQURLa2R6dkVDZDQvVm43WGM3T3NWbENDTmRFK2tJ?= =?utf-8?B?MFdsd1g4eDVxVTUvZkpsR2tNcEpqeXpXNjBDSEQwK0dpd0VydmtpdUVqWE1U?= =?utf-8?Q?tP1qu5j9JmF8X?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SEYPR03MB7118.apcprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(366016);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NkdXNGY0SGJ3Vk9KZHFoUFY0cEZjcEtScUlqa2szbk83MDMyQmFudUZ5b21h?= =?utf-8?B?U3FtanlkdjBpOU5iOWVFQmdRTlYrNCtGZ2dpcjI0Rm1qMDh4cWFlM2JIQm9o?= =?utf-8?B?TzdaWml5eXVtTnk1WklzM0VlclZWN2hTYkFOMEptZnRKSWx2VjRFK3phZ3A5?= =?utf-8?B?NmdOVnBPNHNTU0lHa1hKeVRVeTNKcHZ2bHhGdnZka2RweWhSQWxzdVRoRi95?= =?utf-8?B?czFhcm9neVpYbTFTbHN4SkYzbHpPZ0k3NXBHZzlvNTl5QWtlNDZ1S1V2K050?= =?utf-8?B?cjkxeVFqLzhjZnMzM1VHbUZuV3dHVXFoNVpGTFdmM0RCbFIxNFpEZ25OaU44?= =?utf-8?B?Sm5YQ2RTS2RMU21HdWU1SzZPQWdBamJYaE9DOUNLcEhwL2k2YklyZkJ1NDNE?= =?utf-8?B?cDFEaU04ZnNJL2s1UEM2blF6SGJtbW4xT3RzYTlHRUxQUk1PaklOeHVwYUZ3?= =?utf-8?B?Ky9tTzJveXBvbGsybHNUaklEdloyWnpzZTdvdzM2WGhKWHNSVGRncEE1enR1?= =?utf-8?B?Z2llSlpMeEV1V2g1MFhEcmI0eXdGQnA4Ymp2R0VwbzJGZGVJSGN0MjZ1K2Nn?= =?utf-8?B?c29WNjExeTM4cmhRSDc3cDRTU0NHY29ka3BzajVUVTh1bnh0WjNuaW14TDQ3?= =?utf-8?B?UEpxZlpweHVlRjdIWERpTCtreVdZY05pQXZlbTZZUDBXVndLV2FKb2pOUjlO?= =?utf-8?B?U1lWY3V4SFJadjlacThDaHl1TmFGRjVsWXFvUmVYY21nMlBJUGlNZUpQR05m?= =?utf-8?B?U2x0bXBZaFFlQ2FnQkl0dUorSTBUV0VTTThXUGZpY0RJNGQ2aWZxL1B6emty?= =?utf-8?B?bEplNFo3V1JyK2VxekNrUktZa095aWJkMHMwd0ZINjRZamNQdVdvU0gycG5w?= =?utf-8?B?VWJXRkV0VVJaWUY1aW00cVAyMFZMalNTOUhRTm5JWTZuMDFMQVA3UDBpUWJp?= =?utf-8?B?dUxWS0hBQ2VhbFdxZi84amQvOENMaDl3RHZQT0FkQnhCTGJDaUplY0szYU9h?= =?utf-8?B?LytWK0dCUzJEM3k3YzlsTDIycm8vemxHRlRUZVVnL1VXU05iMGEzVE4wRGhL?= =?utf-8?B?THFNMG9NNWhweGw2U0ZoYmovRE5aTDdlN01HbWhMOTVXQzFoM3NEY3UvUzVK?= =?utf-8?B?TnFWdDB0eGMrOTJwNFd0WE9lL0t3ZnNxbk9yMFBkeitMTitQZXY0NCtUVGZD?= =?utf-8?B?bzZGdHZReGN5dHV6NHB6d2pabGc4SDY1ODRGc1lBT1B2ZllyYU5sUGNsRlN3?= =?utf-8?B?TFAwUnpIeVFBU3pVaXZhOERHejNvY1VLSjBGWVZnMEcwODB4c2JBZTNSUjZk?= =?utf-8?B?RCtUZSszRXhXNlB0Z1NpK0JDU3JsZEJkVXViNXBNWURUQTFjSW4rODBENnNp?= =?utf-8?B?NEIxdXZFMCttaS9sdTg5VEJlNThqVzBOV1VDYzhmc2ZnMjIrU0FmNmlUcVVE?= =?utf-8?B?N3VtelBFL0dUdE1lSEhSSjRBMGtwc1BnTFJEeXVvYjBjVk5aNDBtc3NFbTA5?= =?utf-8?B?TnVlbk16U3NPdDVCeSsrY21ZK05QRGlBUmFNd1RMdEZ3clFMamY5c1hsc1o0?= =?utf-8?B?OE4yakJOREdvUTRGUUFIcVhXQWo3UXZIdTNFRXZPWjFaVW9XRzB2a2dnR014?= =?utf-8?B?OGFSUXV1NEY5aG1tYVVTRHJPVW9CZDNheFAxa2g2STFYSzBxRkNPVXNiUi82?= =?utf-8?B?TDNNRTd3SGFaOUF3c2dZWnA3cFdOaEUyWUpzRVVWYWFnNDZ6cEVtWXMvTDQ5?= =?utf-8?B?OElBWmd1a0tXUTRTUUlxcmYvSUdyMDlXVHNOTFBDenNkL1UrbjFTU1FaeHFH?= =?utf-8?B?b1VXbi9ndTdCaWJzcUtWbnZxWUtyd1hCdTB2RDdzRUpPRDF5NWozVkt1bDA3?= =?utf-8?B?allMSHd1c2JKeE5ISUNab2k2SXJPR2pIOEV0WkZLR0F2RERuSXNjajI4clpv?= =?utf-8?B?YVVaMFZOVmlsQitmM2lvbFZCNUN4V1pMOWp3NjFqRnkzVFVXNFRjOWFpWmNQ?= =?utf-8?B?Y2IrMjVwcjRSMjI4cDNTNVp1VmNpZ2s5RGRCcW9qVlYrU0FGM1FJMDVkbXFx?= =?utf-8?B?V1Fwcnh2ajF6U0pZMlZVcmExOVBSRnlwRWdEQkdZZDZXZnZZZ1NaRXRqdjYr?= =?utf-8?B?cWpjUWxXQUJ3WlQyMFZsQmVWUlpBdW5NWnJtRnlKc3JtL1o0Z0p5TXpBUWlt?= =?utf-8?B?NFE9PQ==?= X-OriginatorOrg: amlogic.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8f009f64-0577-4810-009a-08dd3473c7cd X-MS-Exchange-CrossTenant-AuthSource: SEYPR03MB7118.apcprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Jan 2025 08:16:43.6525 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0df2add9-25ca-4b3a-acb4-c99ddf0b1114 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: UtkoJU2t1pckwlg5vHE2chlYgRjnND0SwJvYtudpdkQ8B7d4DIVsMdiyP+tMbKwoYri5ZN8yvCNX04w8QZQ9n8OTaBvGl2MKVIiIatz73Do= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR03MB7845 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250114_001706_104042_E6A38E52 X-CRM114-Status: GOOD ( 18.02 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org 在 2025/1/13 22:31, Jerome Brunet 写道: > [ EXTERNAL EMAIL ] > > On Mon 13 Jan 2025 at 14:35, jiebing chen via B4 Relay wrote: > >> From: jiebing chen >> >> Add audio support for Amlogic S4.The audio output pad >> can be freelycombined with the output lane,and the tocodec >> control logic has been optimized. > The patch is a mixture of different HW modules. > > Each patch should have one clear purpose and, as such, deal with a > single HW module > >> Signed-off-by: jiebing chen >> --- >> sound/soc/meson/Kconfig | 16 ++ >> sound/soc/meson/Makefile | 6 + >> sound/soc/meson/s4-pad-out-control.c | 372 ++++++++++++++++++++++++++++++++++ >> sound/soc/meson/s4-tocodec-control.c | 376 +++++++++++++++++++++++++++++++++++ >> sound/soc/meson/t9015.c | 5 +- >> 5 files changed, 771 insertions(+), 4 deletions(-) >> >> diff --git a/sound/soc/meson/Kconfig b/sound/soc/meson/Kconfig >> index 6458d5dc4902f665211bb9e4ae7d274e4bff2fdc..d01e284642fd987cf4bdf88e5bf5f7c9a241af59 100644 >> --- a/sound/soc/meson/Kconfig >> +++ b/sound/soc/meson/Kconfig >> @@ -69,6 +69,8 @@ config SND_MESON_AXG_SOUND_CARD >> imply SND_MESON_AXG_SPDIFIN >> imply SND_MESON_AXG_PDM >> imply SND_MESON_G12A_TOACODEC >> + imply SND_SOC_MESON_PAD_OUT >> + imply SND_SOC_MESON_TOCODEC_CONTROL >> imply SND_MESON_G12A_TOHDMITX if DRM_MESON_DW_HDMI >> help >> Select Y or M to add support for the AXG SoC sound card >> @@ -135,4 +137,18 @@ config SND_SOC_MESON_T9015 >> help >> Say Y or M if you want to add support for the internal DAC found >> on GXL, G12 and SM1 SoC family. >> + >> +config SND_SOC_MESON_PAD_OUT >> + tristate "Amlogic PAD OUT" >> + select REGMAP_MMIO >> + help >> + Say Y or M if you want to add support for the S4 Audio Output from >> + the data Pad. >> + >> +config SND_SOC_MESON_TOCODEC_CONTROL >> + tristate "Amlogic TOCODEC CONTROL" >> + select REGMAP_MMIO >> + help >> + Say Y or M if you want to add support for the internal DAC control >> + on SM1 SoC family. >> endmenu >> diff --git a/sound/soc/meson/Makefile b/sound/soc/meson/Makefile >> index 24078e4396b02d545d8ba4bcb1632979001354e3..afbefcb1313670f9b1365e88b8eb1a0badd7dc1e 100644 >> --- a/sound/soc/meson/Makefile >> +++ b/sound/soc/meson/Makefile >> @@ -24,8 +24,11 @@ snd-soc-meson-codec-glue-y := meson-codec-glue.o >> snd-soc-meson-gx-sound-card-y := gx-card.o >> snd-soc-meson-g12a-toacodec-y := g12a-toacodec.o >> snd-soc-meson-g12a-tohdmitx-y := g12a-tohdmitx.o >> +snd-soc-meson-s4-padout-objs := s4-pad-out-control.o >> +snd-soc-meson-s4-tocodec-control-objs := s4-tocodec-control.o >> snd-soc-meson-t9015-y := t9015.o >> >> + >> obj-$(CONFIG_SND_MESON_AIU) += snd-soc-meson-aiu.o >> obj-$(CONFIG_SND_MESON_AXG_FIFO) += snd-soc-meson-axg-fifo.o >> obj-$(CONFIG_SND_MESON_AXG_FRDDR) += snd-soc-meson-axg-frddr.o >> @@ -43,4 +46,7 @@ obj-$(CONFIG_SND_MESON_CODEC_GLUE) += snd-soc-meson-codec-glue.o >> obj-$(CONFIG_SND_MESON_GX_SOUND_CARD) += snd-soc-meson-gx-sound-card.o >> obj-$(CONFIG_SND_MESON_G12A_TOACODEC) += snd-soc-meson-g12a-toacodec.o >> obj-$(CONFIG_SND_MESON_G12A_TOHDMITX) += snd-soc-meson-g12a-tohdmitx.o >> +obj-$(CONFIG_SND_SOC_MESON_PAD_OUT) += snd-soc-meson-s4-padout.o >> +obj-$(CONFIG_SND_SOC_MESON_TOCODEC_CONTROL) += snd-soc-meson-s4-tocodec-control.o >> obj-$(CONFIG_SND_SOC_MESON_T9015) += snd-soc-meson-t9015.o >> + >> diff --git a/sound/soc/meson/s4-pad-out-control.c b/sound/soc/meson/s4-pad-out-control.c >> new file mode 100644 >> index 0000000000000000000000000000000000000000..a86dcf8a5995926f0ddf8d2911f42006daed0feb >> --- /dev/null >> +++ b/sound/soc/meson/s4-pad-out-control.c >> @@ -0,0 +1,372 @@ >> +// SPDX-License-Identifier: (GPL-2.0-only OR MIT) >> +/* >> + * Copyright (C) 2024 Amlogic, Inc. All rights reserved >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +#include "axg-tdm.h" >> + >> +static const struct regmap_config tdmout_pad_regmap_cfg = { >> + .reg_bits = 32, >> + .val_bits = 32, >> + .reg_stride = 4, >> + .max_register = 0x28, >> +}; >> + >> +#define TDM_IFACE 0 >> +#define TDM_A_PAD 0 >> +#define TDM_B_PAD 1 >> +#define TDM_C_PAD 2 >> + >> +#define EE_AUDIO_DAT_PAD_CTRL6 0x0 >> +#define EE_AUDIO_DAT_PAD_CTRL7 0x4 >> +#define EE_AUDIO_DAT_PAD_CTRL8 0x8 >> +#define EE_AUDIO_DAT_PAD_CTRL9 0xc >> +#define EE_AUDIO_DAT_PAD_CTRLA 0x10 >> +#define EE_AUDIO_DAT_PAD_CTRLB 0x14 >> +#define EE_AUDIO_DAT_PAD_CTRLC 0x1c >> +#define EE_AUDIO_DAT_PAD_CTRLD 0x20 >> +#define EE_AUDIO_DAT_PAD_CTRLE 0x24 >> +#define EE_AUDIO_DAT_PAD_CTRLF 0x28 >> + >> +#define REG_OFFSET 4 >> + >> +static const char * const s4_tdmout_sel_texts[] = { >> + "TDM_D0", "TDM_D1", "TDM_D2", "TDM_D3", "TDM_D4", "TDM_D5", "TDM_D6", "TDM_D7", >> + "TDM_D8", "TDM_D9", "TDM_D10", "TDM_D11", "TDM_D12", "TDM_D13", "TDM_D14", "TDM_D15", >> + "TDM_D16", "TDM_D17", "TDM_D18", "TDM_D19", "TDM_D20", "TDM_D21", "TDM_D22", "TDM_D23", >> + "TDM_D24", "TDM_D25", "TDM_D26", "TDM_D27", "TDM_D28", "TDM_D29", "TDM_D30", "TDM_D31" >> +}; > This thing does not belong in ASoC. This is clearly yet another layer of > pinctrl. Please deal with it there. Thanks for your suggestion, add audio pinctrl driver to control the which tdm_dx pin can map the which tdm lane_x for example tdm_d6_pin { mux { groups = "tdm_d6"; function = "tdmoutb_lane0"; }; } tdm_d6 pin map the tdmoutb lane 0, right ? >> + >> +static const struct soc_enum tdmout_sel_enum = >> + SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(s4_tdmout_sel_texts), >> + s4_tdmout_sel_texts); >> + >> +static struct snd_soc_dai *tdm_get_ahead_be(struct snd_soc_dapm_widget *w) >> +{ >> + struct snd_soc_dapm_path *p; >> + struct snd_soc_dai *be; >> + >> + snd_soc_dapm_widget_for_each_source_path(w, p) { >> + if (p->source->id == snd_soc_dapm_dai_in) >> + return (struct snd_soc_dai *)p->source->priv; >> + be = tdm_get_ahead_be(p->source); >> + if (be && be->id == TDM_IFACE) >> + return be; >> + } >> + return NULL; >> +} >> + >> +#define SND_SOC_DAPM_DEMUX_E(wname, wreg, wshift, winvert, wcontrols, \ >> + wevent, wflags) \ >> +((struct snd_soc_dapm_widget) { \ >> + .id = snd_soc_dapm_demux, .name = wname, \ >> + SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \ >> + .kcontrol_news = wcontrols, .num_kcontrols = 1, \ >> + .event = wevent, .event_flags = wflags}) >> + >> +static const struct snd_kcontrol_new tdmout_sel_demux[] = { >> + SOC_DAPM_ENUM("TDMOUTA SEL", tdmout_sel_enum), >> + SOC_DAPM_ENUM("TDMOUTB SEL", tdmout_sel_enum), >> + SOC_DAPM_ENUM("TDMOUTC SEL", tdmout_sel_enum), >> +}; >> + >> +static unsigned int aml_simple_strtoull(const char *cp) >> +{ >> + unsigned int result = 0; >> + unsigned int value = 0; >> + unsigned int len = strlen(cp); >> + >> + while (len != 0) { >> + len--; >> + value = isdigit(*cp); >> + if (value) { >> + value = *cp - '0'; >> + } else { >> + cp++; >> + continue; >> + } >> + cp++; >> + result = result * 10 + value; >> + } >> + return result; >> +} >> + >> +static int tdm_out_pad_set(struct snd_soc_dapm_widget *w) >> +{ >> + struct snd_soc_dai *be; >> + struct axg_tdm_stream *stream; >> + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); >> + unsigned int tdm_id = TDM_A_PAD; >> + const char *dai_widget_name; >> + struct snd_soc_dapm_path *p; >> + unsigned int lane_num = 0; >> + unsigned long pin = 0; >> + unsigned int reg, mask, val = 0; >> + int lane_cnt; >> + >> + be = tdm_get_ahead_be(w); >> + if (!be) { >> + dev_err(component->dev, "%s not find the be\n", __func__); >> + return -EINVAL; >> + } >> + stream = snd_soc_dai_dma_data_get_playback(be); >> + if (!stream) { >> + dev_err(component->dev, "%s not find the stream\n", __func__); >> + return -EINVAL; >> + } >> + lane_cnt = (stream->channels - 1) / stream->iface->slots + 1; >> + /*we like to use dai id, but it is fixed val*/ >> + dai_widget_name = be->stream[SNDRV_PCM_STREAM_PLAYBACK].widget->name; >> + if (strstr(dai_widget_name, "TDM_A")) >> + tdm_id = TDM_A_PAD; >> + else if (strstr(dai_widget_name, "TDM_B")) >> + tdm_id = TDM_B_PAD; >> + else if (strstr(dai_widget_name, "TDM_C")) >> + tdm_id = TDM_C_PAD; >> + else >> + dev_err(component->dev, "%s not find the be dai widget\n", __func__); >> + dev_dbg(component->dev, "tdm_id:%d, channel:%d, slot:%d\n", >> + tdm_id, stream->channels, stream->iface->slots); >> + snd_soc_dapm_widget_for_each_sink_path(w, p) { >> + if (p->sink->id == snd_soc_dapm_output) { >> + if (p->connect) { >> + pin = aml_simple_strtoull(p->name); >> + reg = (pin / 4) * REG_OFFSET; >> + /*calculate mask pos */ >> + mask = 0x1f << ((pin % 4) * 8); >> + val = tdm_id * 8 + lane_num; >> + snd_soc_component_update_bits(component, reg, mask, val); >> + snd_soc_component_update_bits(component, EE_AUDIO_DAT_PAD_CTRLF, >> + 0x1 << pin, 0 << pin); >> + lane_num++; >> + if (lane_num > lane_cnt - 1) >> + break; >> + } >> + } >> + } >> + return 0; >> +} >> + >> +static int tdmout_sel_pad_event(struct snd_soc_dapm_widget *w, >> + struct snd_kcontrol *control, >> + int event) >> +{ >> + int ret = 0; >> + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); >> + >> + switch (event) { >> + case SND_SOC_DAPM_PRE_PMU: >> + tdm_out_pad_set(w); >> + break; >> + >> + case SND_SOC_DAPM_PRE_PMD: >> + break; >> + >> + default: >> + dev_err(component->dev, "Unexpected event %d\n", event); >> + return -EINVAL; >> + } >> + >> + return ret; >> +} >> + >> +static const struct snd_soc_dapm_widget s4_tdmout_pad_dapm_widgets[] = { >> + SND_SOC_DAPM_DEMUX_E("TDMA_OUT SEL", SND_SOC_NOPM, 0, 0, >> + &tdmout_sel_demux[TDM_A_PAD], tdmout_sel_pad_event, >> + (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD)), >> + SND_SOC_DAPM_DEMUX_E("TDMB_OUT SEL", SND_SOC_NOPM, 0, 0, >> + &tdmout_sel_demux[TDM_B_PAD], tdmout_sel_pad_event, >> + (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD)), >> + SND_SOC_DAPM_DEMUX_E("TDMC_OUT SEL", SND_SOC_NOPM, 0, 0, >> + &tdmout_sel_demux[TDM_C_PAD], tdmout_sel_pad_event, >> + (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD)), >> + SND_SOC_DAPM_OUTPUT("TDM_D0"), >> + SND_SOC_DAPM_OUTPUT("TDM_D1"), >> + SND_SOC_DAPM_OUTPUT("TDM_D2"), >> + SND_SOC_DAPM_OUTPUT("TDM_D3"), >> + SND_SOC_DAPM_OUTPUT("TDM_D4"), >> + SND_SOC_DAPM_OUTPUT("TDM_D5"), >> + SND_SOC_DAPM_OUTPUT("TDM_D6"), >> + SND_SOC_DAPM_OUTPUT("TDM_D7"), >> + SND_SOC_DAPM_OUTPUT("TDM_D8"), >> + SND_SOC_DAPM_OUTPUT("TDM_D9"), >> + SND_SOC_DAPM_OUTPUT("TDM_D10"), >> + SND_SOC_DAPM_OUTPUT("TDM_D11"), >> + SND_SOC_DAPM_OUTPUT("TDM_D12"), >> + SND_SOC_DAPM_OUTPUT("TDM_D13"), >> + SND_SOC_DAPM_OUTPUT("TDM_D14"), >> + SND_SOC_DAPM_OUTPUT("TDM_D15"), >> + SND_SOC_DAPM_OUTPUT("TDM_D16"), >> + SND_SOC_DAPM_OUTPUT("TDM_D17"), >> + SND_SOC_DAPM_OUTPUT("TDM_D18"), >> + SND_SOC_DAPM_OUTPUT("TDM_D19"), >> + SND_SOC_DAPM_OUTPUT("TDM_D20"), >> + SND_SOC_DAPM_OUTPUT("TDM_D21"), >> + SND_SOC_DAPM_OUTPUT("TDM_D22"), >> + SND_SOC_DAPM_OUTPUT("TDM_D23"), >> + SND_SOC_DAPM_OUTPUT("TDM_D24"), >> + SND_SOC_DAPM_OUTPUT("TDM_D25"), >> + SND_SOC_DAPM_OUTPUT("TDM_D26"), >> + SND_SOC_DAPM_OUTPUT("TDM_D27"), >> + SND_SOC_DAPM_OUTPUT("TDM_D28"), >> + SND_SOC_DAPM_OUTPUT("TDM_D29"), >> + SND_SOC_DAPM_OUTPUT("TDM_D30"), >> + SND_SOC_DAPM_OUTPUT("TDM_D31"), >> +}; >> + >> +static const struct snd_soc_dapm_route s4_tdmout_pad_dapm_routes[] = { >> + { "TDM_D0", "TDM_D0", "TDMA_OUT SEL" }, >> + { "TDM_D1", "TDM_D1", "TDMA_OUT SEL" }, >> + { "TDM_D2", "TDM_D2", "TDMA_OUT SEL" }, >> + { "TDM_D3", "TDM_D3", "TDMA_OUT SEL" }, >> + { "TDM_D4", "TDM_D4", "TDMA_OUT SEL" }, >> + { "TDM_D5", "TDM_D5", "TDMA_OUT SEL" }, >> + { "TDM_D6", "TDM_D6", "TDMA_OUT SEL" }, >> + { "TDM_D7", "TDM_D7", "TDMA_OUT SEL" }, >> + { "TDM_D8", "TDM_D8", "TDMA_OUT SEL" }, >> + { "TDM_D9", "TDM_D9", "TDMA_OUT SEL" }, >> + { "TDM_D10", "TDM_D10", "TDMA_OUT SEL" }, >> + { "TDM_D11", "TDM_D11", "TDMA_OUT SEL" }, >> + { "TDM_D12", "TDM_D12", "TDMA_OUT SEL" }, >> + { "TDM_D13", "TDM_D13", "TDMA_OUT SEL" }, >> + { "TDM_D14", "TDM_D14", "TDMA_OUT SEL" }, >> + { "TDM_D15", "TDM_D15", "TDMA_OUT SEL" }, >> + { "TDM_D16", "TDM_D16", "TDMA_OUT SEL" }, >> + { "TDM_D17", "TDM_D17", "TDMA_OUT SEL" }, >> + { "TDM_D18", "TDM_D18", "TDMA_OUT SEL" }, >> + { "TDM_D19", "TDM_D19", "TDMA_OUT SEL" }, >> + { "TDM_D20", "TDM_D20", "TDMA_OUT SEL" }, >> + { "TDM_D21", "TDM_D21", "TDMA_OUT SEL" }, >> + { "TDM_D22", "TDM_D22", "TDMA_OUT SEL" }, >> + { "TDM_D23", "TDM_D23", "TDMA_OUT SEL" }, >> + { "TDM_D24", "TDM_D24", "TDMA_OUT SEL" }, >> + { "TDM_D25", "TDM_D25", "TDMA_OUT SEL" }, >> + { "TDM_D26", "TDM_D26", "TDMA_OUT SEL" }, >> + { "TDM_D27", "TDM_D27", "TDMA_OUT SEL" }, >> + { "TDM_D28", "TDM_D28", "TDMA_OUT SEL" }, >> + { "TDM_D29", "TDM_D29", "TDMA_OUT SEL" }, >> + { "TDM_D30", "TDM_D30", "TDMA_OUT SEL" }, >> + { "TDM_D31", "TDM_D31", "TDMA_OUT SEL" }, >> + { "TDM_D0", "TDM_D0", "TDMB_OUT SEL" }, >> + { "TDM_D1", "TDM_D1", "TDMB_OUT SEL" }, >> + { "TDM_D2", "TDM_D2", "TDMB_OUT SEL" }, >> + { "TDM_D3", "TDM_D3", "TDMB_OUT SEL" }, >> + { "TDM_D4", "TDM_D4", "TDMB_OUT SEL" }, >> + { "TDM_D5", "TDM_D5", "TDMB_OUT SEL" }, >> + { "TDM_D6", "TDM_D6", "TDMB_OUT SEL" }, >> + { "TDM_D7", "TDM_D7", "TDMB_OUT SEL" }, >> + { "TDM_D8", "TDM_D8", "TDMB_OUT SEL" }, >> + { "TDM_D9", "TDM_D9", "TDMB_OUT SEL" }, >> + { "TDM_D10", "TDM_D10", "TDMB_OUT SEL" }, >> + { "TDM_D11", "TDM_D11", "TDMB_OUT SEL" }, >> + { "TDM_D12", "TDM_D12", "TDMB_OUT SEL" }, >> + { "TDM_D13", "TDM_D13", "TDMB_OUT SEL" }, >> + { "TDM_D14", "TDM_D14", "TDMB_OUT SEL" }, >> + { "TDM_D15", "TDM_D15", "TDMB_OUT SEL" }, >> + >> + { "TDM_D16", "TDM_D16", "TDMB_OUT SEL" }, >> + { "TDM_D17", "TDM_D17", "TDMB_OUT SEL" }, >> + { "TDM_D18", "TDM_D18", "TDMB_OUT SEL" }, >> + { "TDM_D19", "TDM_D19", "TDMB_OUT SEL" }, >> + { "TDM_D20", "TDM_D20", "TDMB_OUT SEL" }, >> + { "TDM_D21", "TDM_D21", "TDMB_OUT SEL" }, >> + { "TDM_D22", "TDM_D22", "TDMB_OUT SEL" }, >> + { "TDM_D23", "TDM_D23", "TDMB_OUT SEL" }, >> + { "TDM_D24", "TDM_D24", "TDMB_OUT SEL" }, >> + { "TDM_D25", "TDM_D25", "TDMB_OUT SEL" }, >> + { "TDM_D26", "TDM_D26", "TDMB_OUT SEL" }, >> + { "TDM_D27", "TDM_D27", "TDMB_OUT SEL" }, >> + { "TDM_D28", "TDM_D28", "TDMB_OUT SEL" }, >> + { "TDM_D29", "TDM_D29", "TDMB_OUT SEL" }, >> + { "TDM_D30", "TDM_D30", "TDMB_OUT SEL" }, >> + { "TDM_D31", "TDM_D31", "TDMB_OUT SEL" }, >> + { "TDM_D0", "TDM_D0", "TDMC_OUT SEL" }, >> + { "TDM_D1", "TDM_D1", "TDMC_OUT SEL" }, >> + { "TDM_D2", "TDM_D2", "TDMC_OUT SEL" }, >> + { "TDM_D3", "TDM_D3", "TDMC_OUT SEL" }, >> + { "TDM_D4", "TDM_D4", "TDMC_OUT SEL" }, >> + { "TDM_D5", "TDM_D5", "TDMC_OUT SEL" }, >> + { "TDM_D6", "TDM_D6", "TDMC_OUT SEL" }, >> + { "TDM_D7", "TDM_D7", "TDMC_OUT SEL" }, >> + { "TDM_D8", "TDM_D8", "TDMC_OUT SEL" }, >> + { "TDM_D9", "TDM_D9", "TDMC_OUT SEL" }, >> + { "TDM_D10", "TDM_D10", "TDMC_OUT SEL" }, >> + { "TDM_D11", "TDM_D11", "TDMC_OUT SEL" }, >> + { "TDM_D12", "TDM_D12", "TDMC_OUT SEL" }, >> + { "TDM_D13", "TDM_D13", "TDMC_OUT SEL" }, >> + { "TDM_D14", "TDM_D14", "TDMC_OUT SEL" }, >> + { "TDM_D15", "TDM_D15", "TDMC_OUT SEL" }, >> + { "TDM_D16", "TDM_D16", "TDMC_OUT SEL" }, >> + { "TDM_D17", "TDM_D17", "TDMC_OUT SEL" }, >> + { "TDM_D18", "TDM_D18", "TDMC_OUT SEL" }, >> + { "TDM_D19", "TDM_D19", "TDMC_OUT SEL" }, >> + { "TDM_D20", "TDM_D20", "TDMC_OUT SEL" }, >> + { "TDM_D21", "TDM_D21", "TDMC_OUT SEL" }, >> + { "TDM_D22", "TDM_D22", "TDMC_OUT SEL" }, >> + { "TDM_D23", "TDM_D23", "TDMC_OUT SEL" }, >> + { "TDM_D24", "TDM_D24", "TDMC_OUT SEL" }, >> + { "TDM_D25", "TDM_D25", "TDMC_OUT SEL" }, >> + { "TDM_D26", "TDM_D26", "TDMC_OUT SEL" }, >> + { "TDM_D27", "TDM_D27", "TDMC_OUT SEL" }, >> + { "TDM_D28", "TDM_D28", "TDMC_OUT SEL" }, >> + { "TDM_D29", "TDM_D29", "TDMC_OUT SEL" }, >> + { "TDM_D30", "TDM_D30", "TDMC_OUT SEL" }, >> + { "TDM_D31", "TDM_D31", "TDMC_OUT SEL" }, >> +}; >> + >> +static const struct snd_soc_component_driver s4_tdmout_pad_component_drv = { >> + .dapm_widgets = s4_tdmout_pad_dapm_widgets, >> + .num_dapm_widgets = ARRAY_SIZE(s4_tdmout_pad_dapm_widgets), >> + .dapm_routes = s4_tdmout_pad_dapm_routes, >> + .num_dapm_routes = ARRAY_SIZE(s4_tdmout_pad_dapm_routes), >> + >> +}; >> + >> +static const struct of_device_id s4_tdmout_pad_of_match[] = { >> + { >> + .compatible = "amlogic,s4-tdmout-pad", >> + }, {} >> +}; >> + >> +MODULE_DEVICE_TABLE(of, s4_tdmout_pad_of_match); >> + >> +static int tdm_pad_out_probe(struct platform_device *pdev) >> +{ >> + struct device *dev = &pdev->dev; >> + struct regmap *map; >> + void __iomem *regs; >> + >> + regs = devm_platform_ioremap_resource(pdev, 0); >> + if (IS_ERR(regs)) >> + return PTR_ERR(regs); >> + >> + map = devm_regmap_init_mmio(dev, regs, &tdmout_pad_regmap_cfg); >> + if (IS_ERR(map)) >> + return dev_err_probe(dev, PTR_ERR(map), "failed to init regmap\n"); >> + >> + return devm_snd_soc_register_component(dev, &s4_tdmout_pad_component_drv, >> + NULL, 0); >> +} >> + >> +static struct platform_driver tdmout_pad_pdrv = { >> + .probe = tdm_pad_out_probe, >> + .driver = { >> + .name = "s4-pad-out", >> + .of_match_table = s4_tdmout_pad_of_match, >> + }, >> +}; >> + >> +module_platform_driver(tdmout_pad_pdrv); >> + >> +MODULE_DESCRIPTION("Amlogic TDM PAD DRIVER"); >> +MODULE_AUTHOR("jiebing.chen@amlogic.com"); >> +MODULE_LICENSE("GPL"); >> diff --git a/sound/soc/meson/s4-tocodec-control.c b/sound/soc/meson/s4-tocodec-control.c >> new file mode 100644 >> index 0000000000000000000000000000000000000000..e5d824fae0eba545d38dc36e2566e7cee590e7f5 >> --- /dev/null >> +++ b/sound/soc/meson/s4-tocodec-control.c > There is already a to-acodec driver a not reason has been provided as to why a > completly new driver is required. > > Please have look at the existing driver and do try to use it. > If you need to do things so differently, clear justification are necessary. for g12a-toacodec.c, we find the tocodec clock source can't get the clock id from the tdm Be device, and set it by the kcontrol from user,  For different soc chips, The kcontrol value maybe different, The kcontrol configuration doesn't look very friendly for user so we use dapm route path to manage it, fe(fddr)->be(tdm)->(tocodec)->(codec),  and use the aux-devs to register,  and sound card only include the sound-dai = <&tdmif_a> codec-0 {                 sound-dai = <&acodec>;  }; and not include codec-1 {                 sound-dai = <&toacodec>;  }; when tdm work, only connect the tocodec path  "TDM_A Playback" ->"TOACODEC TDMA"->"TOACODEC INPUT SRC" iterate it find the be device ,and get the struct axg_tdm_stream, so we can get the tdm clock id Take into account behavioral differences, we add new tocodec driver for s4 >> @@ -0,0 +1,376 @@ >> +// SPDX-License-Identifier: (GPL-2.0-only OR MIT) >> +/* >> + * Copyright (C) 2023 Amlogic, Inc. All rights reserved >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include "axg-tdm.h" >> + >> +#define TOACODEC_CTRL0 0x0 >> + >> +#define CTRL0_ENABLE_SHIFT 31 >> +#define CTRL0_BCLK_ENABLE_SHIFT 30 >> +#define CTRL0_MCLK_ENABLE_SHIFT 29 >> +#define CTRL0_BLK_CAP_INV_SHIFT 9 >> + >> +#define TDM_IFACE 0 >> +#define TDM_A_PAD 0 >> +#define TDM_B_PAD 1 >> +#define TDM_C_PAD 2 >> + >> +struct toacodec { >> + struct regmap_field *field_dat_sel; >> + struct regmap_field *field_lrclk_sel; >> + struct regmap_field *field_bclk_sel; >> + struct regmap_field *field_mclk_sel; >> +}; >> + >> +struct toacodec_match_data { >> + const struct snd_soc_component_driver *component_drv; >> + const struct reg_field field_dat_sel; >> + const struct reg_field field_lrclk_sel; >> + const struct reg_field field_bclk_sel; >> + const struct reg_field field_mclk_sel; >> +}; >> + >> +static const struct regmap_config tocodec_regmap_cfg = { >> + .reg_bits = 32, >> + .val_bits = 32, >> + .reg_stride = 4, >> + .max_register = 0x1, >> +}; >> + >> +#define S4_LANE_OFFSET 8 >> + >> +static const char * const s4_tocodec_lane_sel_texts[] = { >> + "Lane0", "Lane1", "Lane2", "Lane3", "Lane4", "Lane5", "Lane6", "Lane7" >> +}; >> + >> +static const struct soc_enum s4_tocodec_lane_sel_enum = >> + SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(s4_tocodec_lane_sel_texts), >> + s4_tocodec_lane_sel_texts); >> + >> +static const struct snd_kcontrol_new s4_tocodec_lane_sel = >> + SOC_DAPM_ENUM("TOCODEC LANE SEL", s4_tocodec_lane_sel_enum); >> + >> +static const char * const s4_tocodec_src_sel_texts[] = { >> + "TDMA", "TDMB", "TDMC" >> +}; >> + >> +static const struct soc_enum s4_tocodec_src_sel_enum = >> + SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(s4_tocodec_src_sel_texts), >> + s4_tocodec_src_sel_texts); >> + >> +static const struct snd_kcontrol_new s4_tocodec_src_sel = >> + SOC_DAPM_ENUM("TOCODEC SEL", s4_tocodec_src_sel_enum); >> + >> +static const struct snd_kcontrol_new s4_toacodec_out_enable = >> + SOC_DAPM_SINGLE_AUTODISABLE("Switch", TOACODEC_CTRL0, >> + CTRL0_ENABLE_SHIFT, 1, 0); >> + >> +static struct snd_soc_dai *tocodec_tdm_get_ahead_be(struct snd_soc_dapm_widget *w) >> +{ >> + struct snd_soc_dapm_path *p; >> + struct snd_soc_dai *be; >> + >> + snd_soc_dapm_widget_for_each_source_path(w, p) { >> + if (!p->connect) >> + continue; >> + if (p->source->id == snd_soc_dapm_dai_in) >> + return (struct snd_soc_dai *)p->source->priv; >> + be = tocodec_tdm_get_ahead_be(p->source); >> + if (be && be->id == TDM_IFACE) >> + return be; >> + } >> + return NULL; >> +} >> + >> +static unsigned int aml_simple_strtoull(const char *cp) >> +{ >> + unsigned int result = 0; >> + unsigned int value = 0; >> + unsigned int len = strlen(cp); >> + >> + while (len != 0) { >> + len--; >> + value = isdigit(*cp); >> + if (value) { >> + value = *cp - '0'; >> + } else { >> + cp++; >> + continue; >> + } >> + cp++; >> + result = result * 10 + value; >> + } >> + return result; >> +} >> + >> +static int aml_get_clk_id(const char *name) >> +{ >> + int clk_id = 0; >> + >> + if (strstr(name, "mst_a")) >> + clk_id = 0; >> + else if (strstr(name, "mst_b")) >> + clk_id = 1; >> + else if (strstr(name, "mst_c")) >> + clk_id = 2; >> + else if (strstr(name, "mst_d")) >> + clk_id = 3; >> + else if (strstr(name, "mst_e")) >> + clk_id = 4; >> + else if (strstr(name, "mst_f")) >> + clk_id = 5; >> + >> + return clk_id; >> +} >> + >> +static int aml_tocodec_sel_set(struct snd_soc_dapm_widget *w) >> +{ >> + struct snd_soc_dai *be; >> + struct axg_tdm_stream *stream; >> + struct axg_tdm_iface *iface; >> + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); >> + struct toacodec *priv = snd_soc_component_get_drvdata(component); >> + unsigned int tdm_id = TDM_A_PAD; >> + const char *dai_widget_name; >> + struct snd_soc_dapm_path *p; >> + unsigned int lane = 0; >> + unsigned int val = 0; >> + struct clk *sclk, *mclk; >> + char *clk_name; >> + int mclk_id, sclk_id; >> + >> + be = tocodec_tdm_get_ahead_be(w); >> + if (!be) { >> + dev_err(component->dev, "%s not find the be\n", __func__); >> + return -EINVAL; >> + } >> + stream = snd_soc_dai_dma_data_get_playback(be); >> + if (!stream) { >> + dev_err(component->dev, "%s not find the stream\n", __func__); >> + return -EINVAL; >> + } >> + /*we like to use dai id, but it is fixed val*/ >> + dai_widget_name = be->stream[SNDRV_PCM_STREAM_PLAYBACK].widget->name; >> + if (strstr(dai_widget_name, "TDM_A")) >> + tdm_id = TDM_A_PAD; >> + else if (strstr(dai_widget_name, "TDM_B")) >> + tdm_id = TDM_B_PAD; >> + else if (strstr(dai_widget_name, "TDM_C")) >> + tdm_id = TDM_C_PAD; >> + snd_soc_dapm_widget_for_each_source_path(w, p) { >> + if (p->connect && p->name) { >> + lane = aml_simple_strtoull(p->name); >> + val = lane + tdm_id * S4_LANE_OFFSET; >> + regmap_field_write(priv->field_dat_sel, val); >> + } >> + } >> + iface = stream->iface; >> + mclk = iface->mclk; >> + sclk = iface->sclk; >> + mclk_id = aml_get_clk_id(__clk_get_name(mclk)); >> + sclk_id = aml_get_clk_id(__clk_get_name(sclk)); >> + regmap_field_write(priv->field_mclk_sel, mclk_id); >> + regmap_field_write(priv->field_bclk_sel, sclk_id); >> + regmap_field_write(priv->field_lrclk_sel, sclk_id); >> + >> + return 0; >> +} >> + >> +static int tocodec_sel_event(struct snd_soc_dapm_widget *w, >> + struct snd_kcontrol *control, >> + int event) >> +{ >> + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); >> + int ret = 0; >> + >> + switch (event) { >> + case SND_SOC_DAPM_PRE_PMU: >> + ret = aml_tocodec_sel_set(w); >> + break; >> + >> + case SND_SOC_DAPM_PRE_PMD: >> + break; >> + >> + default: >> + dev_err(component->dev, "Unexpected event %d\n", event); >> + return -EINVAL; >> + } >> + >> + return ret; >> +} >> + >> +static int tocodec_clk_enable(struct snd_soc_dapm_widget *w, >> + struct snd_kcontrol *control, >> + int event) >> +{ >> + int ret = 0; >> + unsigned int mask = 0, val = 0; >> + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); >> + >> + snd_soc_component_update_bits(component, TOACODEC_CTRL0, >> + 1 << CTRL0_BLK_CAP_INV_SHIFT, 1 << CTRL0_BLK_CAP_INV_SHIFT); >> + switch (event) { >> + case SND_SOC_DAPM_PRE_PMU: >> + mask = 1 << CTRL0_MCLK_ENABLE_SHIFT | 1 << CTRL0_BCLK_ENABLE_SHIFT; >> + val = 1 << CTRL0_MCLK_ENABLE_SHIFT | 1 << CTRL0_BCLK_ENABLE_SHIFT; >> + snd_soc_component_update_bits(component, TOACODEC_CTRL0, mask, val); >> + break; >> + case SND_SOC_DAPM_PRE_PMD: >> + mask = 1 << CTRL0_MCLK_ENABLE_SHIFT | 1 << CTRL0_BCLK_ENABLE_SHIFT; >> + val = 0 << CTRL0_MCLK_ENABLE_SHIFT | 0 << CTRL0_BCLK_ENABLE_SHIFT; >> + snd_soc_component_update_bits(component, TOACODEC_CTRL0, mask, val); >> + break; >> + default: >> + dev_err(component->dev, "Unexpected event %d\n", event); >> + return -EINVAL; >> + } >> + >> + return ret; >> +} >> + >> +static const struct snd_soc_dapm_widget s4_toacodec_widgets[] = { >> + SND_SOC_DAPM_MUX_E("Lane SRC", SND_SOC_NOPM, 0, 0, >> + &s4_tocodec_lane_sel, tocodec_sel_event, >> + (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD)), >> + SND_SOC_DAPM_MUX("INPUT SRC", SND_SOC_NOPM, 0, 0, &s4_tocodec_src_sel), >> + SND_SOC_DAPM_SWITCH_E("OUT EN", SND_SOC_NOPM, 0, 0, >> + &s4_toacodec_out_enable, tocodec_clk_enable, >> + (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD)), >> + SND_SOC_DAPM_AIF_IN("TDMA", NULL, 0, SND_SOC_NOPM, 0, 0), >> + SND_SOC_DAPM_AIF_IN("TDMB", NULL, 0, SND_SOC_NOPM, 0, 0), >> + SND_SOC_DAPM_AIF_IN("TDMC", NULL, 0, SND_SOC_NOPM, 0, 0), >> + SND_SOC_DAPM_OUT_DRV("Lane0", SND_SOC_NOPM, 0, 0, NULL, 0), >> + SND_SOC_DAPM_OUT_DRV("Lane1", SND_SOC_NOPM, 0, 0, NULL, 0), >> + SND_SOC_DAPM_OUT_DRV("Lane2", SND_SOC_NOPM, 0, 0, NULL, 0), >> + SND_SOC_DAPM_OUT_DRV("Lane3", SND_SOC_NOPM, 0, 0, NULL, 0), >> + SND_SOC_DAPM_OUT_DRV("Lane4", SND_SOC_NOPM, 0, 0, NULL, 0), >> + SND_SOC_DAPM_OUT_DRV("Lane5", SND_SOC_NOPM, 0, 0, NULL, 0), >> + SND_SOC_DAPM_OUT_DRV("Lane6", SND_SOC_NOPM, 0, 0, NULL, 0), >> + SND_SOC_DAPM_OUT_DRV("Lane7", SND_SOC_NOPM, 0, 0, NULL, 0), >> + SND_SOC_DAPM_OUTPUT("TDM_TO_ACODEC"), >> +}; >> + >> +static const struct snd_soc_dapm_route s4_tocodec_dapm_routes[] = { >> + { "INPUT SRC", "TDMA", "TDMA"}, >> + { "INPUT SRC", "TDMB", "TDMB"}, >> + { "INPUT SRC", "TDMC", "TDMC"}, >> + { "Lane0", NULL, "INPUT SRC" }, >> + { "Lane1", NULL, "INPUT SRC"}, >> + { "Lane2", NULL, "INPUT SRC"}, >> + { "Lane3", NULL, "INPUT SRC"}, >> + { "Lane4", NULL, "INPUT SRC"}, >> + { "Lane5", NULL, "INPUT SRC"}, >> + { "Lane6", NULL, "INPUT SRC"}, >> + { "Lane7", NULL, "INPUT SRC"}, >> + { "Lane SRC", "Lane0", "Lane0"}, >> + { "Lane SRC", "Lane1", "Lane1"}, >> + { "Lane SRC", "Lane2", "Lane2"}, >> + { "Lane SRC", "Lane3", "Lane3"}, >> + { "Lane SRC", "Lane4", "Lane4"}, >> + { "Lane SRC", "Lane5", "Lane5"}, >> + { "Lane SRC", "Lane6", "Lane6"}, >> + { "Lane SRC", "Lane7", "Lane7"}, >> + { "OUT EN", "Switch", "Lane SRC"}, >> + { "TDM_TO_ACODEC", NULL, "OUT EN"}, >> + >> +}; >> + >> +static const struct snd_soc_component_driver s4_tocodec_component_drv = { >> + .dapm_widgets = s4_toacodec_widgets, >> + .num_dapm_widgets = ARRAY_SIZE(s4_toacodec_widgets), >> + .dapm_routes = s4_tocodec_dapm_routes, >> + .num_dapm_routes = ARRAY_SIZE(s4_tocodec_dapm_routes), >> +}; >> + >> +static const struct toacodec_match_data s4_toacodec_match_data = { >> + .component_drv = &s4_tocodec_component_drv, >> + .field_dat_sel = REG_FIELD(TOACODEC_CTRL0, 16, 20), >> + .field_lrclk_sel = REG_FIELD(TOACODEC_CTRL0, 12, 14), >> + .field_bclk_sel = REG_FIELD(TOACODEC_CTRL0, 4, 6), >> + .field_mclk_sel = REG_FIELD(TOACODEC_CTRL0, 0, 2), >> +}; >> + >> +static const struct of_device_id s4_tocodec_of_match[] = { >> + { >> + .compatible = "amlogic,s4-tocodec", >> + .data = &s4_toacodec_match_data, >> + }, {} >> +}; >> + >> +MODULE_DEVICE_TABLE(of, s4_tocodec_of_match); >> + >> +static int tocodec_probe(struct platform_device *pdev) >> +{ >> + const struct toacodec_match_data *data; >> + struct device *dev = &pdev->dev; >> + struct toacodec *priv; >> + void __iomem *regs; >> + struct regmap *map; >> + int ret; >> + >> + data = device_get_match_data(dev); >> + if (!data) >> + return dev_err_probe(dev, -ENODEV, "failed to match device\n"); >> + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); >> + if (!priv) >> + return -ENOMEM; >> + >> + platform_set_drvdata(pdev, priv); >> + >> + ret = device_reset(dev); >> + if (ret) >> + return ret; >> + >> + regs = devm_platform_ioremap_resource(pdev, 0); >> + if (IS_ERR(regs)) >> + return PTR_ERR(regs); >> + >> + map = devm_regmap_init_mmio(dev, regs, &tocodec_regmap_cfg); >> + if (IS_ERR(map)) >> + return dev_err_probe(dev, PTR_ERR(map), "failed to init regmap\n"); >> + >> + priv->field_dat_sel = devm_regmap_field_alloc(dev, map, data->field_dat_sel); >> + if (IS_ERR(priv->field_dat_sel)) >> + return PTR_ERR(priv->field_dat_sel); >> + >> + priv->field_lrclk_sel = devm_regmap_field_alloc(dev, map, data->field_lrclk_sel); >> + if (IS_ERR(priv->field_lrclk_sel)) >> + return PTR_ERR(priv->field_lrclk_sel); >> + >> + priv->field_bclk_sel = devm_regmap_field_alloc(dev, map, data->field_bclk_sel); >> + if (IS_ERR(priv->field_bclk_sel)) >> + return PTR_ERR(priv->field_bclk_sel); >> + >> + priv->field_mclk_sel = devm_regmap_field_alloc(dev, map, data->field_mclk_sel); >> + if (IS_ERR(priv->field_mclk_sel)) >> + return PTR_ERR(priv->field_mclk_sel); >> + >> + return devm_snd_soc_register_component(dev, >> + data->component_drv, NULL, 0); >> +} >> + >> +static struct platform_driver tocodec_pdrv = { >> + .probe = tocodec_probe, >> + .driver = { >> + .name = "s4-tocodec", >> + .of_match_table = s4_tocodec_of_match, >> + }, >> +}; >> + >> +module_platform_driver(tocodec_pdrv); >> + >> +MODULE_DESCRIPTION("Amlogic to codec driver"); >> +MODULE_AUTHOR("jiebing.chen@amlogic.com"); >> +MODULE_LICENSE("GPL"); >> diff --git a/sound/soc/meson/t9015.c b/sound/soc/meson/t9015.c >> index 571f65788c592050abdca264f5656d4d1a9d99f6..2db1cd18cf2cea507f3d7282054e03d953586648 100644 >> --- a/sound/soc/meson/t9015.c >> +++ b/sound/soc/meson/t9015.c >> @@ -89,10 +89,7 @@ static struct snd_soc_dai_driver t9015_dai = { >> .channels_min = 1, >> .channels_max = 2, >> .rates = SNDRV_PCM_RATE_8000_96000, >> - .formats = (SNDRV_PCM_FMTBIT_S8 | >> - SNDRV_PCM_FMTBIT_S16_LE | >> - SNDRV_PCM_FMTBIT_S20_LE | >> - SNDRV_PCM_FMTBIT_S24_LE), >> + .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE), > Again, mixed up changes with zero justification. > > This drops S8 and S16 format support for the existing SoCs (such as GXL) > which is known to work and add S32 support on an HW documented as 24bits > only. Can you explain ? > >> }, >> .ops = &t9015_dai_ops, >> }; > -- > Jerome