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 04629C433EF for ; Wed, 23 Feb 2022 18:03:43 +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-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:References:Cc:To:From: Subject:MIME-Version: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=5rxzG5XC5xthb6IwDd2ftibxijcbGcZuw1KR3R/y9yE=; b=DDErwkaQTHcdht Q38kUsgp1Iqd3bDUB62BS8dFNznstMLTm3pptkCvpmFodzb96uAzJ3xRAo4QnAhxY6IBNhblvVK4e XVUCRc2OH8lyNKtfyF+ZWxawZCcg3dAljN8GRjKTWcIS6LHqhZP3dmiluxjblEoNiicKaC9p/8w5o Y7wCqamfF/BpD+qkX7Bpfhr1VEJA3OFhffmo0tyiM/PSZGPQrjNSIrdWfauS2Vkbdjz49Prie6Fr3 HAd/Qn/dDvmxqNDZDCMJvzRXu5ezke22hcqKAtgwJl/xD2NOUC3Oouf5kdBN+vTfs4763HhcAVVZN gN95UEf9wkM5i5Ki5zxw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nMvzF-00FdzS-O7; Wed, 23 Feb 2022 18:03:37 +0000 Received: from mail-ed1-x52a.google.com ([2a00:1450:4864:20::52a]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nMvyK-00Fdbr-I4; Wed, 23 Feb 2022 18:02:43 +0000 Received: by mail-ed1-x52a.google.com with SMTP id m3so39511750eda.10; Wed, 23 Feb 2022 10:02:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:date:mime-version:user-agent:subject:content-language :from:to:cc:references:in-reply-to:content-transfer-encoding; bh=Ztn66s8SUIz5OHyMtEBe1Xe+BpLfxyrPhcK5hTUQv6A=; b=hg3zswjDrjGpnWRRCkwm+iKFJOGhfqIICQNAM7LiCQplqqGqf69Fy8D2AaOAcU5tO8 uTpay3YgvFx510i+PZH8iXyC2wXBTJWoWrtfJzWw5embztMJC33dcUhVOszvkthmnqGT jM/lJg+oVDEmEFtl6JBULpGVT4te3cjE/EIeUADjdmeGcH7Y2o11hLQj8h8mSCwSjI4q iJBWwvMqazcHoPF7d5vlXCZKU6yKFYpVVC3sg5Q/Nnjkvx3b7WPXcv8jFs6MeUMzkHei iGkg+3z3i4rBocabG8xTnAVG2yiiPuMwL9tfB/q124PH6yWhvMkW/s0bdKnPtc2IV7dz tZpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:from:to:cc:references:in-reply-to :content-transfer-encoding; bh=Ztn66s8SUIz5OHyMtEBe1Xe+BpLfxyrPhcK5hTUQv6A=; b=zGPN12DKjFVPJCXWGZ3oAiJRhszu1RRn1CXoH8KI8IG6rYQ7tdklQ0hEjJVoQhpkGo xPFlnHCOr6iTiIh1fsOlkoju0KW2FlFP0Uh4rCi91628LOasw+0YkFP/+7YSzDxr2NIG jBPJMYy8i+PoWFOCdOGlA88aTpfXJM41HR6jC5J8kgXVgAOMAywEytZGwS6AiQZNcDVi vHhzEsWvx8es6r7O9RQMJb2SBNZKOfJ0p3AgclD2pr2VZSiFTH6IdZVcu+3b5bFhxRuF /R51jhHs3NI68etzf2pu3BBqLyeib1mnILiJndv0AuLDDxpyVwSzUm1/udqjzy2Fcv1W BZPg== X-Gm-Message-State: AOAM530MU2SM/QG/JakZxGwMUcPzRxHOvFwt7wWxFZo9K0t+6Kg7yJEw Umc9lGiwC4GWIWO11COFHLg= X-Google-Smtp-Source: ABdhPJywe7V/TXkcqp4ZQnIGXHP/hDqDd0Eiux4ih48yeoNfn6sOYfUhv6ReSlNnnAdgxD7Z2yaRTg== X-Received: by 2002:a05:6402:cac:b0:410:a920:4e90 with SMTP id cn12-20020a0564020cac00b00410a9204e90mr626157edb.60.1645639358677; Wed, 23 Feb 2022 10:02:38 -0800 (PST) Received: from ?IPV6:2003:ea:8f4d:2b00:d12c:c0a:f603:b44d? (p200300ea8f4d2b00d12c0c0af603b44d.dip0.t-ipconnect.de. [2003:ea:8f4d:2b00:d12c:c0a:f603:b44d]) by smtp.googlemail.com with ESMTPSA id qq1sm137210ejb.200.2022.02.23.10.02.37 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 23 Feb 2022 10:02:38 -0800 (PST) Message-ID: <944317db-b659-cb36-addf-c33623a4ff60@gmail.com> Date: Wed, 23 Feb 2022 19:01:25 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.6.1 Subject: [PATCH v3 4/5] auxdisplay: add support for Titanmec TM1628 7 segment display controller Content-Language: en-US From: Heiner Kallweit To: Rob Herring , Krzysztof Kozlowski , =?UTF-8?Q?Andreas_F=c3=a4rber?= , Miguel Ojeda Cc: "linux-spi@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "open list:ARM/Amlogic Meson..." , Jerome Brunet , Martin Blumenstingl , Kevin Hilman , Neil Armstrong , Geert Uytterhoeven References: <4eb7b036-a9b9-3bd2-4e84-f56ba4b1a740@gmail.com> In-Reply-To: <4eb7b036-a9b9-3bd2-4e84-f56ba4b1a740@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220223_100240_675437_40C77C21 X-CRM114-Status: GOOD ( 31.05 ) 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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-amlogic" Errors-To: linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org VGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIHRoZSBUaXRhbm1lYyBUTTE2MjggNyBzZWdtZW50 IGRpc3BsYXkKY29udHJvbGxlci4gSXQncyBiYXNlZCBvbiBwcmV2aW91cyBSRkMgd29yayBmcm9t IEFuZHJlYXMgRsOkcmJlci4KVGhlIFJGQyB2ZXJzaW9uIHBsYWNlZCB0aGUgZHJpdmVyIGluIHRo ZSBMRUQgc3Vic3lzdGVtLCBidXQgdGhpcyB3YXMKTkFLJ2VkIGJ5IHRoZSBMRUQgbWFpbnRhaW5l ci4gVGhlcmVmb3JlIEkgbW92ZWQgdGhlIGRyaXZlciB0bwovZHJpdmVycy9hdXhkaXNwbGF5IHdo YXQgc2VlbXMgbW9zdCByZWFzb25hYmxlIHRvIG1lLgoKRnVydGhlciBjaGFuZ2VzIHRvIHRoZSBS RkMgdmVyc2lvbjoKLSBEcml2ZXIgY2FuIGJlIGJ1aWx0IGFsc28gdy9vIExFRCBjbGFzcyBzdXBw b3J0LCBmb3IgZGlzcGxheXMgdGhhdAogIGRvbid0IGhhdmUgYW55IHN5bWJvbHMgdG8gYmUgZXhw b3NlZCBhcyBMRUQncy4KLSBTaW1wbGlmaWVkIHRoZSBjb2RlIGFuZCByZXdyb3RlIGEgbG90IG9m IGl0LgotIERyaXZlciBpcyBub3cga2luZCBvZiBhIE1WUCwgYnV0IGZ1bmN0aW9uYWxpdHkgc2hv dWxkIGJlIHN1ZmZpY2llbnQKICBmb3IgbW9zdCB1c2UgY2FzZXMuCi0gVXNlIHRoZSBleGlzdGlu ZyA3IHNlZ21lbnQgc3VwcG9ydCBpbiB1YXBpL2xpbnV4L21hcF90b183c2VnbWVudC5oCiAgYXMg c3VnZ2VzdGVkIGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbi4KCk5vdGU6IFRoZXJlJ3MgYSBudW1iZXIg b2YgY2hpcHMgZnJvbSBvdGhlciBtYW51ZmFjdHVyZXJzIHRoYXQgYXJlCiAgICAgIGFsbW9zdCBp ZGVudGljYWwsIGUuZy4gRkQ2MjgsIFNNMTYyOC4gT25seSBkaWZmZXJlbmNlIEkgc2F3IHNvCiAg ICAgIGZhciBpcyB0aGF0IHRoZXkgcGFydGlhbGx5IHN1cHBvcnQgb3RoZXIgZGlzcGxheSBtb2Rl cy4KICAgICAgVE0xNjI4OiA2eDEyLCA3eDExCiAgICAgIFNNMTYyOEM6IDR4MTMsIDV4MTIsIDZ4 MTEsIDd4MTAKICAgICAgRm9yIHR5cGljYWwgZGlzcGxheXMgb24gZGV2aWNlcyB1c2luZyB0aGVz ZSBjaGlwcyB0aGlzCiAgICAgIGRpZmZlcmVuY2Ugc2hvdWxkbid0IG1hdHRlci4KClN1Y2Nlc3Nm dWxseSB0ZXN0ZWQgb24gYSBUWDMgTWluaSBUViBib3ggdGhhdCBoYXMgYW4gU00xNjI4QyBhbmQg YQpkaXNwbGF5IHdpdGggNCBkaWdpdHMgYW5kIDcgc3ltYm9scy4KCkNvLURldmVsb3BlZC1ieTog QW5kcmVhcyBGw6RyYmVyIDxhZmFlcmJlckBzdXNlLmRlPgpTaWduZWQtb2ZmLWJ5OiBBbmRyZWFz IEbDpHJiZXIgPGFmYWVyYmVyQHN1c2UuZGU+CkNvLURldmVsb3BlZC1ieTogSGVpbmVyIEthbGx3 ZWl0IDxoa2FsbHdlaXQxQGdtYWlsLmNvbT4KU2lnbmVkLW9mZi1ieTogSGVpbmVyIEthbGx3ZWl0 IDxoa2FsbHdlaXQxQGdtYWlsLmNvbT4KLS0tCnYzOgotIHVzZSBDby1EZXZlbG9wZWQtYnkKLS0t CiBkcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZyAgfCAgMTAgKwogZHJpdmVycy9hdXhkaXNwbGF5 L01ha2VmaWxlIHwgICAxICsKIGRyaXZlcnMvYXV4ZGlzcGxheS90bTE2MjguYyB8IDM3NiArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgMzg3IGlu c2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2F1eGRpc3BsYXkvdG0xNjI4 LmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZyBiL2RyaXZlcnMvYXV4 ZGlzcGxheS9LY29uZmlnCmluZGV4IDY0MDEyY2RhNC4uMjVlZjJlNDUyIDEwMDY0NAotLS0gYS9k cml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZworKysgYi9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZp ZwpAQCAtMjAzLDYgKzIwMywxNiBAQCBjb25maWcgQVJNX0NIQVJMQ0QKIAkgIGxpbmUgYW5kIHRo ZSBMaW51eCB2ZXJzaW9uIG9uIHRoZSBzZWNvbmQgbGluZSwgYnV0IHRoYXQncwogCSAgc3RpbGwg dXNlZnVsLgogCitjb25maWcgVE0xNjI4CisJdHJpc3RhdGUgIlRNMTYyOCBkcml2ZXIgZm9yIExF RCA3LzExIHNlZ21lbnQgZGlzcGxheXMiCisJZGVwZW5kcyBvbiBTUEkKKwlkZXBlbmRzIG9uIE9G IHx8IENPTVBJTEVfVEVTVAorCWhlbHAKKwkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBU aXRhbiBNaWNybyBFbGVjdHJvbmljcyBUTTE2MjgKKwkgIExFRCBjb250cm9sbGVyLgorCSAgSXQn cyBhIDMtd2lyZSBTUEkgZGV2aWNlIGNvbnRyb2xsaW5nIGEgdHdvLWRpbWVuc2lvbmFsIGdyaWQg b2YKKwkgIExFRHMuIERpbW1pbmcgaXMgYXBwbGllZCB0byBhbGwgb3V0cHV0cyB0aHJvdWdoIGFu IGludGVybmFsIFBXTS4KKwogbWVudWNvbmZpZyBQQVJQT1JUX1BBTkVMCiAJdHJpc3RhdGUgIlBh cmFsbGVsIHBvcnQgTENEL0tleXBhZCBQYW5lbCBzdXBwb3J0IgogCWRlcGVuZHMgb24gUEFSUE9S VApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdXhkaXNwbGF5L01ha2VmaWxlIGIvZHJpdmVycy9hdXhk aXNwbGF5L01ha2VmaWxlCmluZGV4IDY5NjhlZDRkMy4uNzcyOGUxN2UxIDEwMDY0NAotLS0gYS9k cml2ZXJzL2F1eGRpc3BsYXkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hdXhkaXNwbGF5L01ha2Vm aWxlCkBAIC0xNCwzICsxNCw0IEBAIG9iai0kKENPTkZJR19IVDE2SzMzKQkJKz0gaHQxNmszMy5v CiBvYmotJChDT05GSUdfUEFSUE9SVF9QQU5FTCkJKz0gcGFuZWwubwogb2JqLSQoQ09ORklHX0xD RDJTKQkJKz0gbGNkMnMubwogb2JqLSQoQ09ORklHX0xJTkVESVNQKQkJKz0gbGluZS1kaXNwbGF5 Lm8KK29iai0kKENPTkZJR19UTTE2MjgpCQkrPSB0bTE2MjgubwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9hdXhkaXNwbGF5L3RtMTYyOC5jIGIvZHJpdmVycy9hdXhkaXNwbGF5L3RtMTYyOC5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMC4uYjgwMmI1YzMwCi0tLSAvZGV2L251bGwK KysrIGIvZHJpdmVycy9hdXhkaXNwbGF5L3RtMTYyOC5jCkBAIC0wLDAgKzEsMzc2IEBACisvLyBT UERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlcgorLyoKKyAqIFRpdGFuIE1p Y3JvIEVsZWN0cm9uaWNzIFRNMTYyOCBMRUQgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAo YykgMjAxOSBBbmRyZWFzIEbDpHJiZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4K KyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNs dWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9wZXJ0eS5oPgorI2luY2x1 ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L21hcF90b183c2VnbWVu dC5oPgorCisjZGVmaW5lIFRNMTYyOF9DTURfRElTUExBWV9NT0RFCQkoMCA8PCA2KQorI2RlZmlu ZSBUTTE2MjhfRElTUExBWV9NT0RFXzZfMTIJMHgwMgorI2RlZmluZSBUTTE2MjhfRElTUExBWV9N T0RFXzdfMTEJMHgwMworCisjZGVmaW5lIFRNMTYyOF9DTURfREFUQQkJCSgxIDw8IDYpCisjZGVm aW5lIFRNMTYyOF9EQVRBX1RFU1RfTU9ERQkJQklUKDMpCisjZGVmaW5lIFRNMTYyOF9EQVRBX0ZJ WEVEX0FERFIJCUJJVCgyKQorI2RlZmluZSBUTTE2MjhfREFUQV9XUklURV9EQVRBCQkweDAwCisj ZGVmaW5lIFRNMTYyOF9EQVRBX1JFQURfREFUQQkJMHgwMgorCisjZGVmaW5lIFRNMTYyOF9DTURf RElTUExBWV9DVFJMCQkoMiA8PCA2KQorI2RlZmluZSBUTTE2MjhfRElTUExBWV9DVFJMX0RJU1BM QVlfT04JQklUKDMpCisKKyNkZWZpbmUgVE0xNjI4X0NNRF9TRVRfQUREUkVTUwkJKDMgPDwgNikK KworI2RlZmluZSBUTTE2MjhfQlJJR0hUTkVTU19NQVgJCTcKKworLyogUGh5c2ljYWwgbGltaXRz LCBkZXBlbmRpbmcgb24gdGhlIG1vZGUgdGhlIGNoaXAgbWF5IHN1cHBvcnQgbGVzcyAqLworI2Rl ZmluZSBNQVhfR1JJRF9TSVpFCQkJNworI2RlZmluZSBNQVhfU0VHTUVOVF9OVU0JCQkxNgorCitz dHJ1Y3QgdG0xNjI4X2xlZCB7CisJc3RydWN0IGxlZF9jbGFzc2RldglsZWRkZXY7CisJc3RydWN0 IHRtMTYyOAkJKmN0cmw7CisJdTMyCQkJZ3JpZDsKKwl1MzIJCQlzZWc7Cit9OworCitzdHJ1Y3Qg dG0xNjI4IHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKKwlfX2xlMTYJCQkJZGF0YVtNQVhf R1JJRF9TSVpFXTsKKwlzdHJ1Y3QgbXV0ZXgJCQlkaXNwX2xvY2s7CisJY2hhcgkJCQl0ZXh0W01B WF9HUklEX1NJWkUgKyAxXTsKKwl1OAkJCQlzZWdtZW50X21hcHBpbmdbN107CisJdTgJCQkJZ3Jp ZFtNQVhfR1JJRF9TSVpFXTsKKwlpbnQJCQkJZ3JpZF9zaXplOworCXN0cnVjdCB0bTE2MjhfbGVk CQlsZWRzW107Cit9OworCisvKiBDb21tYW5kIDE6IERpc3BsYXkgTW9kZSBTZXR0aW5nICovCitz dGF0aWMgaW50IHRtMTYyOF9zZXRfZGlzcGxheV9tb2RlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGks IHU4IGdyaWRfbW9kZSkKK3sKKwl1OCBjbWQgPSBUTTE2MjhfQ01EX0RJU1BMQVlfTU9ERSB8IGdy aWRfbW9kZTsKKworCXJldHVybiBzcGlfd3JpdGUoc3BpLCAmY21kLCAxKTsKK30KKworLyogQ29t bWFuZCAzOiBBZGRyZXNzIFNldHRpbmcgKi8KK3N0YXRpYyBpbnQgdG0xNjI4X3NldF9hZGRyZXNz KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IG9mZnNldCkKK3sKKwl1OCBjbWQgPSBUTTE2Mjhf Q01EX1NFVF9BRERSRVNTIHwgKG9mZnNldCAqIHNpemVvZihfX2xlMTYpKTsKKworCXJldHVybiBz cGlfd3JpdGUoc3BpLCAmY21kLCAxKTsKK30KKworLyogQ29tbWFuZCAyOiBEYXRhIFNldHRpbmcg Ki8KK3N0YXRpYyBpbnQgdG0xNjI4X3dyaXRlX2RhdGEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwg dW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1 Y3QgdG0xNjI4ICpzID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJdTggY21kID0gVE0xNjI4X0NN RF9EQVRBIHwgVE0xNjI4X0RBVEFfV1JJVEVfREFUQTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhm ZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSAmY21kLAorCQkJLmxlbiA9IDEsCisJCX0sCisJ CXsKKwkJCS50eF9idWYgPSAoX19mb3JjZSB2b2lkICopKHMtPmRhdGEgKyBvZmZzZXQpLAorCQkJ LmxlbiA9IGxlbiAqIHNpemVvZihfX2xlMTYpLAorCQl9LAorCX07CisKKwlpZiAob2Zmc2V0ICsg bGVuID4gTUFYX0dSSURfU0laRSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIkludmFsaWQgZGF0 YSBhZGRyZXNzIG9mZnNldCAldSBsZW4gJXVcbiIsCisJCQlvZmZzZXQsIGxlbik7CisJCXJldHVy biAtRUlOVkFMOworCX0KKworCXRtMTYyOF9zZXRfYWRkcmVzcyhzcGksIG9mZnNldCk7CisKKwly ZXR1cm4gc3BpX3N5bmNfdHJhbnNmZXIoc3BpLCB4ZmVycywgQVJSQVlfU0laRSh4ZmVycykpOwor fQorCisvKiBDb21tYW5kIDQ6IERpc3BsYXkgQ29udHJvbCAqLworc3RhdGljIGludCB0bTE2Mjhf c2V0X2Rpc3BsYXlfY3RybChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBib29sIG9uKQoreworCXU4 IGNtZCA9IFRNMTYyOF9DTURfRElTUExBWV9DVFJMIHwgVE0xNjI4X0JSSUdIVE5FU1NfTUFYOwor CisJaWYgKG9uKQorCQljbWQgfD0gVE0xNjI4X0RJU1BMQVlfQ1RSTF9ESVNQTEFZX09OOworCisJ cmV0dXJuIHNwaV93cml0ZShzcGksICZjbWQsIDEpOworfQorCitzdGF0aWMgaW50IHRtMTYyOF9z aG93X3RleHQoc3RydWN0IHRtMTYyOCAqcykKK3sKKwlzdGF0aWMgU0VHN19DT05WRVJTSU9OX01B UChtYXBfc2VnNywgTUFQX0FTQ0lJN1NFR19BTFBIQU5VTSk7CisJaW50IGksIHJldDsKKworCWlu dCBtc2dfbGVuID0gc3RybGVuKHMtPnRleHQpOworCisJbXV0ZXhfbG9jaygmcy0+ZGlzcF9sb2Nr KTsKKworCWZvciAoaSA9IDA7IGkgPCBzLT5ncmlkX3NpemU7IGkrKykgeworCQlpbnQgcG9zID0g cy0+Z3JpZFtpXSAtIDE7CisKKwkJaWYgKGkgPCBtc2dfbGVuKSB7CisJCQlpbnQgY2hhcjdfcmF3 ID0gbWFwX3RvX3NlZzcoJm1hcF9zZWc3LCBzLT50ZXh0W2ldKTsKKwkJCWludCBqLCBjaGFyNzsK KworCQkJZm9yIChqID0gMCwgY2hhcjcgPSAwOyBqIDwgNzsgaisrKSB7CisJCQkJaWYgKGNoYXI3 X3JhdyAmIEJJVChqKSkKKwkJCQkJY2hhcjcgfD0gQklUKHMtPnNlZ21lbnRfbWFwcGluZ1tqXSAt IDEpOworCQkJfQorCisJCQlzLT5kYXRhW3Bvc10gPSBjcHVfdG9fbGUxNihjaGFyNyk7CisJCX0g ZWxzZSB7CisJCQlzLT5kYXRhW3Bvc10gPSAwOworCQl9CisJfQorCisJcmV0ID0gdG0xNjI4X3dy aXRlX2RhdGEocy0+c3BpLCAwLCBzLT5ncmlkX3NpemUpOworCisJbXV0ZXhfdW5sb2NrKCZzLT5k aXNwX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0bTE2MjhfbGVkX3Nl dF9icmlnaHRuZXNzKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJCSAgICAgZW51 bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCXN0cnVjdCB0bTE2MjhfbGVkICpsZWQg PSBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCB0bTE2MjhfbGVkLCBsZWRkZXYpOworCXN0 cnVjdCB0bTE2MjggKnMgPSBsZWQtPmN0cmw7CisJaW50IG9mZnNldCwgcmV0OworCV9fbGUxNiBi aXQ7CisKKwlvZmZzZXQgPSBsZWQtPmdyaWQgLSAxOworCWJpdCA9IGNwdV90b19sZTE2KEJJVChs ZWQtPnNlZyAtIDEpKTsKKworCW11dGV4X2xvY2soJnMtPmRpc3BfbG9jayk7CisKKwlpZiAoYnJp Z2h0bmVzcyA9PSBMRURfT0ZGKQorCQlzLT5kYXRhW29mZnNldF0gJj0gfmJpdDsKKwllbHNlCisJ CXMtPmRhdGFbb2Zmc2V0XSB8PSBiaXQ7CisKKwlyZXQgPSB0bTE2Mjhfd3JpdGVfZGF0YShzLT5z cGksIG9mZnNldCwgMSk7CisKKwltdXRleF91bmxvY2soJnMtPmRpc3BfbG9jayk7CisKKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyB0bTE2MjhfbGVkX2dldF9i cmlnaHRuZXNzKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQoreworCXN0cnVjdCB0bTE2 MjhfbGVkICpsZWQgPSBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCB0bTE2MjhfbGVkLCBs ZWRkZXYpOworCXN0cnVjdCB0bTE2MjggKnMgPSBsZWQtPmN0cmw7CisJaW50IG9mZnNldDsKKwlf X2xlMTYgYml0OworCWJvb2wgb247CisKKwlvZmZzZXQgPSBsZWQtPmdyaWQgLSAxOworCWJpdCA9 IGNwdV90b19sZTE2KEJJVChsZWQtPnNlZyAtIDEpKTsKKworCW11dGV4X2xvY2soJnMtPmRpc3Bf bG9jayk7CisJb24gPSBzLT5kYXRhW29mZnNldF0gJiBiaXQ7CisJbXV0ZXhfdW5sb2NrKCZzLT5k aXNwX2xvY2spOworCisJcmV0dXJuIG9uID8gTEVEX09OIDogTEVEX09GRjsKK30KKworc3RhdGlj IGludCB0bTE2MjhfcmVnaXN0ZXJfbGVkKHN0cnVjdCB0bTE2MjggKnMsIHN0cnVjdCBmd25vZGVf aGFuZGxlICpub2RlLAorCQkJICAgICAgIHUzMiBncmlkLCB1MzIgc2VnLCBzdHJ1Y3QgdG0xNjI4 X2xlZCAqbGVkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzLT5zcGktPmRldjsKKwlzdHJ1 Y3QgbGVkX2luaXRfZGF0YSBpbml0X2RhdGEgPSB7IC5md25vZGUgPSBub2RlIH07CisKKwlsZWQt PmN0cmwgPSBzOworCWxlZC0+Z3JpZCA9IGdyaWQ7CisJbGVkLT5zZWcgID0gc2VnOworCWxlZC0+ bGVkZGV2Lm1heF9icmlnaHRuZXNzID0gTEVEX09OOworCWxlZC0+bGVkZGV2LmJyaWdodG5lc3Nf c2V0X2Jsb2NraW5nID0gdG0xNjI4X2xlZF9zZXRfYnJpZ2h0bmVzczsKKwlsZWQtPmxlZGRldi5i cmlnaHRuZXNzX2dldCA9IHRtMTYyOF9sZWRfZ2V0X2JyaWdodG5lc3M7CisKKwlyZXR1cm4gZGV2 bV9sZWRfY2xhc3NkZXZfcmVnaXN0ZXJfZXh0KGRldiwgJmxlZC0+bGVkZGV2LCAmaW5pdF9kYXRh KTsKK30KKworc3RhdGljIHNzaXplX3QgZGlzcGxheV90ZXh0X3Nob3coc3RydWN0IGRldmljZSAq ZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQorewor CXN0cnVjdCB0bTE2MjggKnMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBzeXNm c19lbWl0KGJ1ZiwgIiVzXG4iLCBzLT50ZXh0KTsKK30KKworc3RhdGljIHNzaXplX3QgZGlzcGxh eV90ZXh0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUg KmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qg dG0xNjI4ICpzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCwgaTsKKworCWlmIChj b3VudCA+IHMtPmdyaWRfc2l6ZSArIDEpIC8qIGNvbnNpZGVyIHRyYWlsaW5nIG5ld2xpbmUgKi8K KwkJcmV0dXJuIC1FMkJJRzsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudCAmJiBpc3ByaW50KGJ1 ZltpXSk7IGkrKykKKwkJcy0+dGV4dFtpXSA9IGJ1ZltpXTsKKworCXMtPnRleHRbaV0gPSAnXDAn OworCisJcmV0ID0gdG0xNjI4X3Nob3dfdGV4dChzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJu IHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IERFVklDRV9BVFRSX1JX KGRpc3BsYXlfdGV4dCk7CisKK3N0YXRpYyBpbnQgdG0xNjI4X3NwaV9wcm9iZShzdHJ1Y3Qgc3Bp X2RldmljZSAqc3BpKQoreworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpjaGlsZDsKKwl1bnNpZ25l ZCBpbnQgbnVtX2xlZHM7CisJc3RydWN0IHRtMTYyOCAqczsKKwlpbnQgcmV0LCBpOworCisJbnVt X2xlZHMgPSBkZXZpY2VfZ2V0X2NoaWxkX25vZGVfY291bnQoJnNwaS0+ZGV2KTsKKworCXMgPSBk ZXZtX2t6YWxsb2MoJnNwaS0+ZGV2LCBzdHJ1Y3Rfc2l6ZShzLCBsZWRzLCBudW1fbGVkcyksIEdG UF9LRVJORUwpOworCWlmICghcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzLT5zcGkgPSBzcGk7 CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgcyk7CisKKwltdXRleF9pbml0KCZzLT5kaXNwX2xvY2sp OworCisJbXNsZWVwKDIwMCk7IC8qIGFjY29yZGluZyB0byBUTTE2MjggZGF0YXNoZWV0ICovCisK KwkvKiBjbGVhciBzY3JlZW4gKi8KKwlyZXQgPSB0bTE2Mjhfd3JpdGVfZGF0YShzcGksIDAsIE1B WF9HUklEX1NJWkUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJLyogQXNzdW1lIHRoYXQg c3Vic2VxdWVudCBTUEkgdHJhbnNmZXJzIHdpbGwgYmUgb2sgaWYgZmlyc3Qgd2FzIG9rICovCisK KwkvKiBGb3Igbm93IHdlIHN1cHBvcnQgNngxMiBtb2RlIG9ubHkuIFRoaXMgc2hvdWxkIGJlIHN1 ZmZpY2llbnQgZm9yIG1vc3QgdXNlIGNhc2VzICovCisJdG0xNjI4X3NldF9kaXNwbGF5X21vZGUo c3BpLCBUTTE2MjhfRElTUExBWV9NT0RFXzZfMTIpOworCisJdG0xNjI4X3NldF9kaXNwbGF5X2N0 cmwoc3BpLCB0cnVlKTsKKworCWlmICghSVNfUkVBQ0hBQkxFKENPTkZJR19MRURTX0NMQVNTKSkK KwkJZ290byBub19sZWRzOworCisJbnVtX2xlZHMgPSAwOworCisJZGV2aWNlX2Zvcl9lYWNoX2No aWxkX25vZGUoJnNwaS0+ZGV2LCBjaGlsZCkgeworCQl1MzIgcmVnWzJdOworCisJCXJldCA9IGZ3 bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjaGlsZCwgInJlZyIsIHJlZywgMik7CisJCWlm IChyZXQpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUmVhZGluZyAlcyByZWcgcHJvcGVydHkg ZmFpbGVkICglZClcbiIsCisJCQkJZndub2RlX2dldF9uYW1lKGNoaWxkKSwgcmV0KTsKKwkJCWNv bnRpbnVlOworCQl9CisKKwkJaWYgKHJlZ1swXSA9PSAwIHx8IHJlZ1swXSA+IE1BWF9HUklEX1NJ WkUpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiSW52YWxpZCBncmlkICV1IGF0ICVzXG4iLAor CQkJCXJlZ1swXSwgZndub2RlX2dldF9uYW1lKGNoaWxkKSk7CisJCQljb250aW51ZTsKKwkJfQor CisJCWlmIChyZWdbMV0gPT0gMCB8fCByZWdbMV0gPiBNQVhfU0VHTUVOVF9OVU0pIHsKKwkJCWRl dl9lcnIoJnNwaS0+ZGV2LCAiSW52YWxpZCBzZWdtZW50ICV1IGF0ICVzXG4iLAorCQkJCXJlZ1sx XSwgZndub2RlX2dldF9uYW1lKGNoaWxkKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldCA9 IHRtMTYyOF9yZWdpc3Rlcl9sZWQocywgY2hpbGQsIHJlZ1swXSwgcmVnWzFdLCBzLT5sZWRzICsg bnVtX2xlZHMpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCB0 byByZWdpc3RlciBMRUQgJXMgKCVkKVxuIiwKKwkJCQlmd25vZGVfZ2V0X25hbWUoY2hpbGQpLCBy ZXQpOworCQkJY29udGludWU7CisJCX0KKwkJbnVtX2xlZHMrKzsKKwl9CisKK25vX2xlZHM6CisJ cmV0ID0gZGV2aWNlX3Byb3BlcnR5X2NvdW50X3U4KCZzcGktPmRldiwgImdyaWQiKTsKKwlpZiAo cmV0IDwgMSB8fCByZXQgPiBNQVhfR1JJRF9TSVpFKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAi SW52YWxpZCBkaXNwbGF5IGxlbmd0aCAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsK Kwl9CisKKwlzLT5ncmlkX3NpemUgPSByZXQ7CisKKwlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVh ZF91OF9hcnJheSgmc3BpLT5kZXYsICJncmlkIiwgcy0+Z3JpZCwgcy0+Z3JpZF9zaXplKTsKKwlp ZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBzLT5ncmlkX3Np emU7IGkrKykgeworCQlpZiAocy0+Z3JpZFtpXSA8IDEgfHwgcy0+Z3JpZFtpXSA+IHMtPmdyaWRf c2l6ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGRldmljZV9wcm9wZXJ0eV9y ZWFkX3U4X2FycmF5KCZzcGktPmRldiwgInNlZ21lbnQtbWFwcGluZyIsIHMtPnNlZ21lbnRfbWFw cGluZywgNyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBp IDwgNzsgaSsrKSB7CisJCWlmIChzLT5zZWdtZW50X21hcHBpbmdbaV0gPCAxIHx8IHMtPnNlZ21l bnRfbWFwcGluZ1tpXSA+IE1BWF9TRUdNRU5UX05VTSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0K KworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl9kaXNwbGF5 X3RleHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkZXZfaW5mbygmc3BpLT5kZXYs ICJDb25maWd1cmVkIGRpc3BsYXkgd2l0aCAldSBkaWdpdHMgYW5kICV1IHN5bWJvbHNcbiIsCisJ CSBzLT5ncmlkX3NpemUsIG51bV9sZWRzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCB0bTE2Mjhfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWRldmljZV9y ZW1vdmVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl9kaXNwbGF5X3RleHQpOworCXRtMTYyOF9z ZXRfZGlzcGxheV9jdHJsKHNwaSwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCB0bTE2Mjhfc3Bp X3NodXRkb3duKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdG0xNjI4X3NldF9kaXNwbGF5 X2N0cmwoc3BpLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lk IHRtMTYyOF9zcGlfb2ZfbWF0Y2hlc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAidGl0YW5tZWMs dG0xNjI4IiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdG0xNjI4X3NwaV9v Zl9tYXRjaGVzKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIHRtMTYyOF9z cGlfaWRfdGFibGVbXSA9IHsKKwl7ICJ0bTE2MjgiIH0sCisJe30sCit9OworTU9EVUxFX0RFVklD RV9UQUJMRShzcGksIHRtMTYyOF9zcGlfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHNwaV9k cml2ZXIgdG0xNjI4X3NwaV9kcml2ZXIgPSB7CisJLnByb2JlID0gdG0xNjI4X3NwaV9wcm9iZSwK KwkucmVtb3ZlID0gdG0xNjI4X3NwaV9yZW1vdmUsCisJLnNodXRkb3duID0gdG0xNjI4X3NwaV9z aHV0ZG93biwKKwkuaWRfdGFibGUgPSB0bTE2Mjhfc3BpX2lkX3RhYmxlLAorCisJLmRyaXZlciA9 IHsKKwkJLm5hbWUgPSAidG0xNjI4IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gdG0xNjI4X3NwaV9v Zl9tYXRjaGVzLAorCX0sCit9OworbW9kdWxlX3NwaV9kcml2ZXIodG0xNjI4X3NwaV9kcml2ZXIp OworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRNMTYyOCBMRUQgY29udHJvbGxlciBkcml2ZXIiKTsK K01PRFVMRV9BVVRIT1IoIkFuZHJlYXMgRsOkcmJlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIp OwotLSAKMi4zNS4xCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmxpbnV4LWFtbG9naWMgbWFpbGluZyBsaXN0CmxpbnV4LWFtbG9naWNAbGlzdHMuaW5m cmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xp bnV4LWFtbG9naWMK 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6FE0FC43217 for ; Wed, 23 Feb 2022 18:02:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243628AbiBWSDJ (ORCPT ); Wed, 23 Feb 2022 13:03:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32860 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236327AbiBWSDJ (ORCPT ); Wed, 23 Feb 2022 13:03:09 -0500 Received: from mail-ed1-x529.google.com (mail-ed1-x529.google.com [IPv6:2a00:1450:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 31C8535856; Wed, 23 Feb 2022 10:02:40 -0800 (PST) Received: by mail-ed1-x529.google.com with SMTP id x5so45385460edd.11; Wed, 23 Feb 2022 10:02:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:date:mime-version:user-agent:subject:content-language :from:to:cc:references:in-reply-to:content-transfer-encoding; bh=Ztn66s8SUIz5OHyMtEBe1Xe+BpLfxyrPhcK5hTUQv6A=; b=hg3zswjDrjGpnWRRCkwm+iKFJOGhfqIICQNAM7LiCQplqqGqf69Fy8D2AaOAcU5tO8 uTpay3YgvFx510i+PZH8iXyC2wXBTJWoWrtfJzWw5embztMJC33dcUhVOszvkthmnqGT jM/lJg+oVDEmEFtl6JBULpGVT4te3cjE/EIeUADjdmeGcH7Y2o11hLQj8h8mSCwSjI4q iJBWwvMqazcHoPF7d5vlXCZKU6yKFYpVVC3sg5Q/Nnjkvx3b7WPXcv8jFs6MeUMzkHei iGkg+3z3i4rBocabG8xTnAVG2yiiPuMwL9tfB/q124PH6yWhvMkW/s0bdKnPtc2IV7dz tZpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:from:to:cc:references:in-reply-to :content-transfer-encoding; bh=Ztn66s8SUIz5OHyMtEBe1Xe+BpLfxyrPhcK5hTUQv6A=; b=Fy2feVaTgKXkMrjQJjjzvV/2Fx23fnRkpVP+MzOUkq2QofSNVYf6WyphL3VYvFlMMv is1zVGt+B7azU3ePJK9ePCE26f4bQYxhgsig3zeOTvGzZVegdbQMt/anfeG6ar3WRkge OkL6rZCtIKqgELeqHURjlvBtyyEebXoa/2x852QPJ0T6duMcK+gOdVbgH2SPMGj0UMMR U/HxnRIDK7qDSpd/F3IPSwkbaT1b7G0y5dkC/yDF1meoWDvjpCjf3/CIE7IbaHBQI5s8 FBp4MUmSH3bHGsAhM6Eg/sgn7ywcSqbcm+ntsHu4EIH1oOrrC/54RyjyqtfWJH6DYT7A bB5g== X-Gm-Message-State: AOAM5304ISYmLv4RrgAM8TfsbqynPU55iBj1PBF531BeXUFCYgmWIXZ7 qkkIw9eufDr7NpTRb+gAdyk= X-Google-Smtp-Source: ABdhPJywe7V/TXkcqp4ZQnIGXHP/hDqDd0Eiux4ih48yeoNfn6sOYfUhv6ReSlNnnAdgxD7Z2yaRTg== X-Received: by 2002:a05:6402:cac:b0:410:a920:4e90 with SMTP id cn12-20020a0564020cac00b00410a9204e90mr626157edb.60.1645639358677; Wed, 23 Feb 2022 10:02:38 -0800 (PST) Received: from ?IPV6:2003:ea:8f4d:2b00:d12c:c0a:f603:b44d? (p200300ea8f4d2b00d12c0c0af603b44d.dip0.t-ipconnect.de. [2003:ea:8f4d:2b00:d12c:c0a:f603:b44d]) by smtp.googlemail.com with ESMTPSA id qq1sm137210ejb.200.2022.02.23.10.02.37 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 23 Feb 2022 10:02:38 -0800 (PST) Message-ID: <944317db-b659-cb36-addf-c33623a4ff60@gmail.com> Date: Wed, 23 Feb 2022 19:01:25 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.6.1 Subject: [PATCH v3 4/5] auxdisplay: add support for Titanmec TM1628 7 segment display controller Content-Language: en-US From: Heiner Kallweit To: Rob Herring , Krzysztof Kozlowski , =?UTF-8?Q?Andreas_F=c3=a4rber?= , Miguel Ojeda Cc: "linux-spi@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "open list:ARM/Amlogic Meson..." , Jerome Brunet , Martin Blumenstingl , Kevin Hilman , Neil Armstrong , Geert Uytterhoeven References: <4eb7b036-a9b9-3bd2-4e84-f56ba4b1a740@gmail.com> In-Reply-To: <4eb7b036-a9b9-3bd2-4e84-f56ba4b1a740@gmail.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-spi@vger.kernel.org This patch adds support for the Titanmec TM1628 7 segment display controller. It's based on previous RFC work from Andreas Färber. The RFC version placed the driver in the LED subsystem, but this was NAK'ed by the LED maintainer. Therefore I moved the driver to /drivers/auxdisplay what seems most reasonable to me. Further changes to the RFC version: - Driver can be built also w/o LED class support, for displays that don't have any symbols to be exposed as LED's. - Simplified the code and rewrote a lot of it. - Driver is now kind of a MVP, but functionality should be sufficient for most use cases. - Use the existing 7 segment support in uapi/linux/map_to_7segment.h as suggested by Geert Uytterhoeven. Note: There's a number of chips from other manufacturers that are almost identical, e.g. FD628, SM1628. Only difference I saw so far is that they partially support other display modes. TM1628: 6x12, 7x11 SM1628C: 4x13, 5x12, 6x11, 7x10 For typical displays on devices using these chips this difference shouldn't matter. Successfully tested on a TX3 Mini TV box that has an SM1628C and a display with 4 digits and 7 symbols. Co-Developed-by: Andreas Färber Signed-off-by: Andreas Färber Co-Developed-by: Heiner Kallweit Signed-off-by: Heiner Kallweit --- v3: - use Co-Developed-by --- drivers/auxdisplay/Kconfig | 10 + drivers/auxdisplay/Makefile | 1 + drivers/auxdisplay/tm1628.c | 376 ++++++++++++++++++++++++++++++++++++ 3 files changed, 387 insertions(+) create mode 100644 drivers/auxdisplay/tm1628.c diff --git a/drivers/auxdisplay/Kconfig b/drivers/auxdisplay/Kconfig index 64012cda4..25ef2e452 100644 --- a/drivers/auxdisplay/Kconfig +++ b/drivers/auxdisplay/Kconfig @@ -203,6 +203,16 @@ config ARM_CHARLCD line and the Linux version on the second line, but that's still useful. +config TM1628 + tristate "TM1628 driver for LED 7/11 segment displays" + depends on SPI + depends on OF || COMPILE_TEST + help + Say Y to enable support for Titan Micro Electronics TM1628 + LED controller. + It's a 3-wire SPI device controlling a two-dimensional grid of + LEDs. Dimming is applied to all outputs through an internal PWM. + menuconfig PARPORT_PANEL tristate "Parallel port LCD/Keypad Panel support" depends on PARPORT diff --git a/drivers/auxdisplay/Makefile b/drivers/auxdisplay/Makefile index 6968ed4d3..7728e17e1 100644 --- a/drivers/auxdisplay/Makefile +++ b/drivers/auxdisplay/Makefile @@ -14,3 +14,4 @@ obj-$(CONFIG_HT16K33) += ht16k33.o obj-$(CONFIG_PARPORT_PANEL) += panel.o obj-$(CONFIG_LCD2S) += lcd2s.o obj-$(CONFIG_LINEDISP) += line-display.o +obj-$(CONFIG_TM1628) += tm1628.o diff --git a/drivers/auxdisplay/tm1628.c b/drivers/auxdisplay/tm1628.c new file mode 100644 index 000000000..b802b5c30 --- /dev/null +++ b/drivers/auxdisplay/tm1628.c @@ -0,0 +1,376 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Titan Micro Electronics TM1628 LED controller + * + * Copyright (c) 2019 Andreas Färber + */ + +#include +#include +#include +#include +#include +#include +#include + +#define TM1628_CMD_DISPLAY_MODE (0 << 6) +#define TM1628_DISPLAY_MODE_6_12 0x02 +#define TM1628_DISPLAY_MODE_7_11 0x03 + +#define TM1628_CMD_DATA (1 << 6) +#define TM1628_DATA_TEST_MODE BIT(3) +#define TM1628_DATA_FIXED_ADDR BIT(2) +#define TM1628_DATA_WRITE_DATA 0x00 +#define TM1628_DATA_READ_DATA 0x02 + +#define TM1628_CMD_DISPLAY_CTRL (2 << 6) +#define TM1628_DISPLAY_CTRL_DISPLAY_ON BIT(3) + +#define TM1628_CMD_SET_ADDRESS (3 << 6) + +#define TM1628_BRIGHTNESS_MAX 7 + +/* Physical limits, depending on the mode the chip may support less */ +#define MAX_GRID_SIZE 7 +#define MAX_SEGMENT_NUM 16 + +struct tm1628_led { + struct led_classdev leddev; + struct tm1628 *ctrl; + u32 grid; + u32 seg; +}; + +struct tm1628 { + struct spi_device *spi; + __le16 data[MAX_GRID_SIZE]; + struct mutex disp_lock; + char text[MAX_GRID_SIZE + 1]; + u8 segment_mapping[7]; + u8 grid[MAX_GRID_SIZE]; + int grid_size; + struct tm1628_led leds[]; +}; + +/* Command 1: Display Mode Setting */ +static int tm1628_set_display_mode(struct spi_device *spi, u8 grid_mode) +{ + u8 cmd = TM1628_CMD_DISPLAY_MODE | grid_mode; + + return spi_write(spi, &cmd, 1); +} + +/* Command 3: Address Setting */ +static int tm1628_set_address(struct spi_device *spi, u8 offset) +{ + u8 cmd = TM1628_CMD_SET_ADDRESS | (offset * sizeof(__le16)); + + return spi_write(spi, &cmd, 1); +} + +/* Command 2: Data Setting */ +static int tm1628_write_data(struct spi_device *spi, unsigned int offset, + unsigned int len) +{ + struct tm1628 *s = spi_get_drvdata(spi); + u8 cmd = TM1628_CMD_DATA | TM1628_DATA_WRITE_DATA; + struct spi_transfer xfers[] = { + { + .tx_buf = &cmd, + .len = 1, + }, + { + .tx_buf = (__force void *)(s->data + offset), + .len = len * sizeof(__le16), + }, + }; + + if (offset + len > MAX_GRID_SIZE) { + dev_err(&spi->dev, "Invalid data address offset %u len %u\n", + offset, len); + return -EINVAL; + } + + tm1628_set_address(spi, offset); + + return spi_sync_transfer(spi, xfers, ARRAY_SIZE(xfers)); +} + +/* Command 4: Display Control */ +static int tm1628_set_display_ctrl(struct spi_device *spi, bool on) +{ + u8 cmd = TM1628_CMD_DISPLAY_CTRL | TM1628_BRIGHTNESS_MAX; + + if (on) + cmd |= TM1628_DISPLAY_CTRL_DISPLAY_ON; + + return spi_write(spi, &cmd, 1); +} + +static int tm1628_show_text(struct tm1628 *s) +{ + static SEG7_CONVERSION_MAP(map_seg7, MAP_ASCII7SEG_ALPHANUM); + int i, ret; + + int msg_len = strlen(s->text); + + mutex_lock(&s->disp_lock); + + for (i = 0; i < s->grid_size; i++) { + int pos = s->grid[i] - 1; + + if (i < msg_len) { + int char7_raw = map_to_seg7(&map_seg7, s->text[i]); + int j, char7; + + for (j = 0, char7 = 0; j < 7; j++) { + if (char7_raw & BIT(j)) + char7 |= BIT(s->segment_mapping[j] - 1); + } + + s->data[pos] = cpu_to_le16(char7); + } else { + s->data[pos] = 0; + } + } + + ret = tm1628_write_data(s->spi, 0, s->grid_size); + + mutex_unlock(&s->disp_lock); + + return ret; +} + +static int tm1628_led_set_brightness(struct led_classdev *led_cdev, + enum led_brightness brightness) +{ + struct tm1628_led *led = container_of(led_cdev, struct tm1628_led, leddev); + struct tm1628 *s = led->ctrl; + int offset, ret; + __le16 bit; + + offset = led->grid - 1; + bit = cpu_to_le16(BIT(led->seg - 1)); + + mutex_lock(&s->disp_lock); + + if (brightness == LED_OFF) + s->data[offset] &= ~bit; + else + s->data[offset] |= bit; + + ret = tm1628_write_data(s->spi, offset, 1); + + mutex_unlock(&s->disp_lock); + + return ret; +} + +static enum led_brightness tm1628_led_get_brightness(struct led_classdev *led_cdev) +{ + struct tm1628_led *led = container_of(led_cdev, struct tm1628_led, leddev); + struct tm1628 *s = led->ctrl; + int offset; + __le16 bit; + bool on; + + offset = led->grid - 1; + bit = cpu_to_le16(BIT(led->seg - 1)); + + mutex_lock(&s->disp_lock); + on = s->data[offset] & bit; + mutex_unlock(&s->disp_lock); + + return on ? LED_ON : LED_OFF; +} + +static int tm1628_register_led(struct tm1628 *s, struct fwnode_handle *node, + u32 grid, u32 seg, struct tm1628_led *led) +{ + struct device *dev = &s->spi->dev; + struct led_init_data init_data = { .fwnode = node }; + + led->ctrl = s; + led->grid = grid; + led->seg = seg; + led->leddev.max_brightness = LED_ON; + led->leddev.brightness_set_blocking = tm1628_led_set_brightness; + led->leddev.brightness_get = tm1628_led_get_brightness; + + return devm_led_classdev_register_ext(dev, &led->leddev, &init_data); +} + +static ssize_t display_text_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct tm1628 *s = dev_get_drvdata(dev); + + return sysfs_emit(buf, "%s\n", s->text); +} + +static ssize_t display_text_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct tm1628 *s = dev_get_drvdata(dev); + int ret, i; + + if (count > s->grid_size + 1) /* consider trailing newline */ + return -E2BIG; + + for (i = 0; i < count && isprint(buf[i]); i++) + s->text[i] = buf[i]; + + s->text[i] = '\0'; + + ret = tm1628_show_text(s); + if (ret < 0) + return ret; + + return count; +} + +static const DEVICE_ATTR_RW(display_text); + +static int tm1628_spi_probe(struct spi_device *spi) +{ + struct fwnode_handle *child; + unsigned int num_leds; + struct tm1628 *s; + int ret, i; + + num_leds = device_get_child_node_count(&spi->dev); + + s = devm_kzalloc(&spi->dev, struct_size(s, leds, num_leds), GFP_KERNEL); + if (!s) + return -ENOMEM; + + s->spi = spi; + spi_set_drvdata(spi, s); + + mutex_init(&s->disp_lock); + + msleep(200); /* according to TM1628 datasheet */ + + /* clear screen */ + ret = tm1628_write_data(spi, 0, MAX_GRID_SIZE); + if (ret) + return ret; + /* Assume that subsequent SPI transfers will be ok if first was ok */ + + /* For now we support 6x12 mode only. This should be sufficient for most use cases */ + tm1628_set_display_mode(spi, TM1628_DISPLAY_MODE_6_12); + + tm1628_set_display_ctrl(spi, true); + + if (!IS_REACHABLE(CONFIG_LEDS_CLASS)) + goto no_leds; + + num_leds = 0; + + device_for_each_child_node(&spi->dev, child) { + u32 reg[2]; + + ret = fwnode_property_read_u32_array(child, "reg", reg, 2); + if (ret) { + dev_err(&spi->dev, "Reading %s reg property failed (%d)\n", + fwnode_get_name(child), ret); + continue; + } + + if (reg[0] == 0 || reg[0] > MAX_GRID_SIZE) { + dev_err(&spi->dev, "Invalid grid %u at %s\n", + reg[0], fwnode_get_name(child)); + continue; + } + + if (reg[1] == 0 || reg[1] > MAX_SEGMENT_NUM) { + dev_err(&spi->dev, "Invalid segment %u at %s\n", + reg[1], fwnode_get_name(child)); + continue; + } + + ret = tm1628_register_led(s, child, reg[0], reg[1], s->leds + num_leds); + if (ret) { + dev_err(&spi->dev, "Failed to register LED %s (%d)\n", + fwnode_get_name(child), ret); + continue; + } + num_leds++; + } + +no_leds: + ret = device_property_count_u8(&spi->dev, "grid"); + if (ret < 1 || ret > MAX_GRID_SIZE) { + dev_err(&spi->dev, "Invalid display length (%d)\n", ret); + return -EINVAL; + } + + s->grid_size = ret; + + ret = device_property_read_u8_array(&spi->dev, "grid", s->grid, s->grid_size); + if (ret < 0) + return ret; + + for (i = 0; i < s->grid_size; i++) { + if (s->grid[i] < 1 || s->grid[i] > s->grid_size) + return -EINVAL; + } + + ret = device_property_read_u8_array(&spi->dev, "segment-mapping", s->segment_mapping, 7); + if (ret < 0) + return ret; + + for (i = 0; i < 7; i++) { + if (s->segment_mapping[i] < 1 || s->segment_mapping[i] > MAX_SEGMENT_NUM) + return -EINVAL; + } + + ret = device_create_file(&spi->dev, &dev_attr_display_text); + if (ret) + return ret; + + dev_info(&spi->dev, "Configured display with %u digits and %u symbols\n", + s->grid_size, num_leds); + + return 0; +} + +static void tm1628_spi_remove(struct spi_device *spi) +{ + device_remove_file(&spi->dev, &dev_attr_display_text); + tm1628_set_display_ctrl(spi, false); +} + +static void tm1628_spi_shutdown(struct spi_device *spi) +{ + tm1628_set_display_ctrl(spi, false); +} + +static const struct of_device_id tm1628_spi_of_matches[] = { + { .compatible = "titanmec,tm1628" }, + {} +}; +MODULE_DEVICE_TABLE(of, tm1628_spi_of_matches); + +static const struct spi_device_id tm1628_spi_id_table[] = { + { "tm1628" }, + {}, +}; +MODULE_DEVICE_TABLE(spi, tm1628_spi_id_table); + +static struct spi_driver tm1628_spi_driver = { + .probe = tm1628_spi_probe, + .remove = tm1628_spi_remove, + .shutdown = tm1628_spi_shutdown, + .id_table = tm1628_spi_id_table, + + .driver = { + .name = "tm1628", + .of_match_table = tm1628_spi_of_matches, + }, +}; +module_spi_driver(tm1628_spi_driver); + +MODULE_DESCRIPTION("TM1628 LED controller driver"); +MODULE_AUTHOR("Andreas Färber"); +MODULE_LICENSE("GPL"); -- 2.35.1 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 BC164C433F5 for ; Wed, 23 Feb 2022 18:04:44 +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-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:References:Cc:To:From: Subject:MIME-Version: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=uPLxbven/8r6QjJXUEgi7n5qFJAxYEoJU5gkyHiVw0M=; b=QfkF2TS1XM8gjO ELzp8xAUfFHGV6E1mmGbfNcQBlb0reloymv5SyyqnTuEewWGSE4724m7VXLNe4AzBIB3tr0gGjnKi YeweWCeHeHbuXcHoRXg+4EfqvOEGaWnhzCY2ON9dpNin7rUw9DiXRnJaDXGO4PCnnX1bcyhb97qNt +dObWCfUXDlNQMrxInKMAGGZiQQFyfhk3autGin3Be92+UE8upmybvZNR2V8USaswB3MHtjgZxq6X mb63V/+37jWGME64LQkjBgES30mGy9O2Llc4Wa2KirBceFoLo9IArvnFQIJLfvBY4+q+90iOVcU5Z 2iWTtSYpHtmnzBLueTfg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nMvz1-00Fdry-NT; Wed, 23 Feb 2022 18:03:23 +0000 Received: from mail-ed1-x52a.google.com ([2a00:1450:4864:20::52a]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nMvyK-00Fdbr-I4; Wed, 23 Feb 2022 18:02:43 +0000 Received: by mail-ed1-x52a.google.com with SMTP id m3so39511750eda.10; Wed, 23 Feb 2022 10:02:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:date:mime-version:user-agent:subject:content-language :from:to:cc:references:in-reply-to:content-transfer-encoding; bh=Ztn66s8SUIz5OHyMtEBe1Xe+BpLfxyrPhcK5hTUQv6A=; b=hg3zswjDrjGpnWRRCkwm+iKFJOGhfqIICQNAM7LiCQplqqGqf69Fy8D2AaOAcU5tO8 uTpay3YgvFx510i+PZH8iXyC2wXBTJWoWrtfJzWw5embztMJC33dcUhVOszvkthmnqGT jM/lJg+oVDEmEFtl6JBULpGVT4te3cjE/EIeUADjdmeGcH7Y2o11hLQj8h8mSCwSjI4q iJBWwvMqazcHoPF7d5vlXCZKU6yKFYpVVC3sg5Q/Nnjkvx3b7WPXcv8jFs6MeUMzkHei iGkg+3z3i4rBocabG8xTnAVG2yiiPuMwL9tfB/q124PH6yWhvMkW/s0bdKnPtc2IV7dz tZpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:from:to:cc:references:in-reply-to :content-transfer-encoding; bh=Ztn66s8SUIz5OHyMtEBe1Xe+BpLfxyrPhcK5hTUQv6A=; b=zGPN12DKjFVPJCXWGZ3oAiJRhszu1RRn1CXoH8KI8IG6rYQ7tdklQ0hEjJVoQhpkGo xPFlnHCOr6iTiIh1fsOlkoju0KW2FlFP0Uh4rCi91628LOasw+0YkFP/+7YSzDxr2NIG jBPJMYy8i+PoWFOCdOGlA88aTpfXJM41HR6jC5J8kgXVgAOMAywEytZGwS6AiQZNcDVi vHhzEsWvx8es6r7O9RQMJb2SBNZKOfJ0p3AgclD2pr2VZSiFTH6IdZVcu+3b5bFhxRuF /R51jhHs3NI68etzf2pu3BBqLyeib1mnILiJndv0AuLDDxpyVwSzUm1/udqjzy2Fcv1W BZPg== X-Gm-Message-State: AOAM530MU2SM/QG/JakZxGwMUcPzRxHOvFwt7wWxFZo9K0t+6Kg7yJEw Umc9lGiwC4GWIWO11COFHLg= X-Google-Smtp-Source: ABdhPJywe7V/TXkcqp4ZQnIGXHP/hDqDd0Eiux4ih48yeoNfn6sOYfUhv6ReSlNnnAdgxD7Z2yaRTg== X-Received: by 2002:a05:6402:cac:b0:410:a920:4e90 with SMTP id cn12-20020a0564020cac00b00410a9204e90mr626157edb.60.1645639358677; Wed, 23 Feb 2022 10:02:38 -0800 (PST) Received: from ?IPV6:2003:ea:8f4d:2b00:d12c:c0a:f603:b44d? (p200300ea8f4d2b00d12c0c0af603b44d.dip0.t-ipconnect.de. [2003:ea:8f4d:2b00:d12c:c0a:f603:b44d]) by smtp.googlemail.com with ESMTPSA id qq1sm137210ejb.200.2022.02.23.10.02.37 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 23 Feb 2022 10:02:38 -0800 (PST) Message-ID: <944317db-b659-cb36-addf-c33623a4ff60@gmail.com> Date: Wed, 23 Feb 2022 19:01:25 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.6.1 Subject: [PATCH v3 4/5] auxdisplay: add support for Titanmec TM1628 7 segment display controller Content-Language: en-US From: Heiner Kallweit To: Rob Herring , Krzysztof Kozlowski , =?UTF-8?Q?Andreas_F=c3=a4rber?= , Miguel Ojeda Cc: "linux-spi@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "open list:ARM/Amlogic Meson..." , Jerome Brunet , Martin Blumenstingl , Kevin Hilman , Neil Armstrong , Geert Uytterhoeven References: <4eb7b036-a9b9-3bd2-4e84-f56ba4b1a740@gmail.com> In-Reply-To: <4eb7b036-a9b9-3bd2-4e84-f56ba4b1a740@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220223_100240_675437_40C77C21 X-CRM114-Status: GOOD ( 31.05 ) 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: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org VGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIHRoZSBUaXRhbm1lYyBUTTE2MjggNyBzZWdtZW50 IGRpc3BsYXkKY29udHJvbGxlci4gSXQncyBiYXNlZCBvbiBwcmV2aW91cyBSRkMgd29yayBmcm9t IEFuZHJlYXMgRsOkcmJlci4KVGhlIFJGQyB2ZXJzaW9uIHBsYWNlZCB0aGUgZHJpdmVyIGluIHRo ZSBMRUQgc3Vic3lzdGVtLCBidXQgdGhpcyB3YXMKTkFLJ2VkIGJ5IHRoZSBMRUQgbWFpbnRhaW5l ci4gVGhlcmVmb3JlIEkgbW92ZWQgdGhlIGRyaXZlciB0bwovZHJpdmVycy9hdXhkaXNwbGF5IHdo YXQgc2VlbXMgbW9zdCByZWFzb25hYmxlIHRvIG1lLgoKRnVydGhlciBjaGFuZ2VzIHRvIHRoZSBS RkMgdmVyc2lvbjoKLSBEcml2ZXIgY2FuIGJlIGJ1aWx0IGFsc28gdy9vIExFRCBjbGFzcyBzdXBw b3J0LCBmb3IgZGlzcGxheXMgdGhhdAogIGRvbid0IGhhdmUgYW55IHN5bWJvbHMgdG8gYmUgZXhw b3NlZCBhcyBMRUQncy4KLSBTaW1wbGlmaWVkIHRoZSBjb2RlIGFuZCByZXdyb3RlIGEgbG90IG9m IGl0LgotIERyaXZlciBpcyBub3cga2luZCBvZiBhIE1WUCwgYnV0IGZ1bmN0aW9uYWxpdHkgc2hv dWxkIGJlIHN1ZmZpY2llbnQKICBmb3IgbW9zdCB1c2UgY2FzZXMuCi0gVXNlIHRoZSBleGlzdGlu ZyA3IHNlZ21lbnQgc3VwcG9ydCBpbiB1YXBpL2xpbnV4L21hcF90b183c2VnbWVudC5oCiAgYXMg c3VnZ2VzdGVkIGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbi4KCk5vdGU6IFRoZXJlJ3MgYSBudW1iZXIg b2YgY2hpcHMgZnJvbSBvdGhlciBtYW51ZmFjdHVyZXJzIHRoYXQgYXJlCiAgICAgIGFsbW9zdCBp ZGVudGljYWwsIGUuZy4gRkQ2MjgsIFNNMTYyOC4gT25seSBkaWZmZXJlbmNlIEkgc2F3IHNvCiAg ICAgIGZhciBpcyB0aGF0IHRoZXkgcGFydGlhbGx5IHN1cHBvcnQgb3RoZXIgZGlzcGxheSBtb2Rl cy4KICAgICAgVE0xNjI4OiA2eDEyLCA3eDExCiAgICAgIFNNMTYyOEM6IDR4MTMsIDV4MTIsIDZ4 MTEsIDd4MTAKICAgICAgRm9yIHR5cGljYWwgZGlzcGxheXMgb24gZGV2aWNlcyB1c2luZyB0aGVz ZSBjaGlwcyB0aGlzCiAgICAgIGRpZmZlcmVuY2Ugc2hvdWxkbid0IG1hdHRlci4KClN1Y2Nlc3Nm dWxseSB0ZXN0ZWQgb24gYSBUWDMgTWluaSBUViBib3ggdGhhdCBoYXMgYW4gU00xNjI4QyBhbmQg YQpkaXNwbGF5IHdpdGggNCBkaWdpdHMgYW5kIDcgc3ltYm9scy4KCkNvLURldmVsb3BlZC1ieTog QW5kcmVhcyBGw6RyYmVyIDxhZmFlcmJlckBzdXNlLmRlPgpTaWduZWQtb2ZmLWJ5OiBBbmRyZWFz IEbDpHJiZXIgPGFmYWVyYmVyQHN1c2UuZGU+CkNvLURldmVsb3BlZC1ieTogSGVpbmVyIEthbGx3 ZWl0IDxoa2FsbHdlaXQxQGdtYWlsLmNvbT4KU2lnbmVkLW9mZi1ieTogSGVpbmVyIEthbGx3ZWl0 IDxoa2FsbHdlaXQxQGdtYWlsLmNvbT4KLS0tCnYzOgotIHVzZSBDby1EZXZlbG9wZWQtYnkKLS0t CiBkcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZyAgfCAgMTAgKwogZHJpdmVycy9hdXhkaXNwbGF5 L01ha2VmaWxlIHwgICAxICsKIGRyaXZlcnMvYXV4ZGlzcGxheS90bTE2MjguYyB8IDM3NiArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgMzg3IGlu c2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2F1eGRpc3BsYXkvdG0xNjI4 LmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZyBiL2RyaXZlcnMvYXV4 ZGlzcGxheS9LY29uZmlnCmluZGV4IDY0MDEyY2RhNC4uMjVlZjJlNDUyIDEwMDY0NAotLS0gYS9k cml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZworKysgYi9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZp ZwpAQCAtMjAzLDYgKzIwMywxNiBAQCBjb25maWcgQVJNX0NIQVJMQ0QKIAkgIGxpbmUgYW5kIHRo ZSBMaW51eCB2ZXJzaW9uIG9uIHRoZSBzZWNvbmQgbGluZSwgYnV0IHRoYXQncwogCSAgc3RpbGwg dXNlZnVsLgogCitjb25maWcgVE0xNjI4CisJdHJpc3RhdGUgIlRNMTYyOCBkcml2ZXIgZm9yIExF RCA3LzExIHNlZ21lbnQgZGlzcGxheXMiCisJZGVwZW5kcyBvbiBTUEkKKwlkZXBlbmRzIG9uIE9G IHx8IENPTVBJTEVfVEVTVAorCWhlbHAKKwkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBU aXRhbiBNaWNybyBFbGVjdHJvbmljcyBUTTE2MjgKKwkgIExFRCBjb250cm9sbGVyLgorCSAgSXQn cyBhIDMtd2lyZSBTUEkgZGV2aWNlIGNvbnRyb2xsaW5nIGEgdHdvLWRpbWVuc2lvbmFsIGdyaWQg b2YKKwkgIExFRHMuIERpbW1pbmcgaXMgYXBwbGllZCB0byBhbGwgb3V0cHV0cyB0aHJvdWdoIGFu IGludGVybmFsIFBXTS4KKwogbWVudWNvbmZpZyBQQVJQT1JUX1BBTkVMCiAJdHJpc3RhdGUgIlBh cmFsbGVsIHBvcnQgTENEL0tleXBhZCBQYW5lbCBzdXBwb3J0IgogCWRlcGVuZHMgb24gUEFSUE9S VApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdXhkaXNwbGF5L01ha2VmaWxlIGIvZHJpdmVycy9hdXhk aXNwbGF5L01ha2VmaWxlCmluZGV4IDY5NjhlZDRkMy4uNzcyOGUxN2UxIDEwMDY0NAotLS0gYS9k cml2ZXJzL2F1eGRpc3BsYXkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hdXhkaXNwbGF5L01ha2Vm aWxlCkBAIC0xNCwzICsxNCw0IEBAIG9iai0kKENPTkZJR19IVDE2SzMzKQkJKz0gaHQxNmszMy5v CiBvYmotJChDT05GSUdfUEFSUE9SVF9QQU5FTCkJKz0gcGFuZWwubwogb2JqLSQoQ09ORklHX0xD RDJTKQkJKz0gbGNkMnMubwogb2JqLSQoQ09ORklHX0xJTkVESVNQKQkJKz0gbGluZS1kaXNwbGF5 Lm8KK29iai0kKENPTkZJR19UTTE2MjgpCQkrPSB0bTE2MjgubwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9hdXhkaXNwbGF5L3RtMTYyOC5jIGIvZHJpdmVycy9hdXhkaXNwbGF5L3RtMTYyOC5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMC4uYjgwMmI1YzMwCi0tLSAvZGV2L251bGwK KysrIGIvZHJpdmVycy9hdXhkaXNwbGF5L3RtMTYyOC5jCkBAIC0wLDAgKzEsMzc2IEBACisvLyBT UERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlcgorLyoKKyAqIFRpdGFuIE1p Y3JvIEVsZWN0cm9uaWNzIFRNMTYyOCBMRUQgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAo YykgMjAxOSBBbmRyZWFzIEbDpHJiZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4K KyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNs dWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9wZXJ0eS5oPgorI2luY2x1 ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L21hcF90b183c2VnbWVu dC5oPgorCisjZGVmaW5lIFRNMTYyOF9DTURfRElTUExBWV9NT0RFCQkoMCA8PCA2KQorI2RlZmlu ZSBUTTE2MjhfRElTUExBWV9NT0RFXzZfMTIJMHgwMgorI2RlZmluZSBUTTE2MjhfRElTUExBWV9N T0RFXzdfMTEJMHgwMworCisjZGVmaW5lIFRNMTYyOF9DTURfREFUQQkJCSgxIDw8IDYpCisjZGVm aW5lIFRNMTYyOF9EQVRBX1RFU1RfTU9ERQkJQklUKDMpCisjZGVmaW5lIFRNMTYyOF9EQVRBX0ZJ WEVEX0FERFIJCUJJVCgyKQorI2RlZmluZSBUTTE2MjhfREFUQV9XUklURV9EQVRBCQkweDAwCisj ZGVmaW5lIFRNMTYyOF9EQVRBX1JFQURfREFUQQkJMHgwMgorCisjZGVmaW5lIFRNMTYyOF9DTURf RElTUExBWV9DVFJMCQkoMiA8PCA2KQorI2RlZmluZSBUTTE2MjhfRElTUExBWV9DVFJMX0RJU1BM QVlfT04JQklUKDMpCisKKyNkZWZpbmUgVE0xNjI4X0NNRF9TRVRfQUREUkVTUwkJKDMgPDwgNikK KworI2RlZmluZSBUTTE2MjhfQlJJR0hUTkVTU19NQVgJCTcKKworLyogUGh5c2ljYWwgbGltaXRz LCBkZXBlbmRpbmcgb24gdGhlIG1vZGUgdGhlIGNoaXAgbWF5IHN1cHBvcnQgbGVzcyAqLworI2Rl ZmluZSBNQVhfR1JJRF9TSVpFCQkJNworI2RlZmluZSBNQVhfU0VHTUVOVF9OVU0JCQkxNgorCitz dHJ1Y3QgdG0xNjI4X2xlZCB7CisJc3RydWN0IGxlZF9jbGFzc2RldglsZWRkZXY7CisJc3RydWN0 IHRtMTYyOAkJKmN0cmw7CisJdTMyCQkJZ3JpZDsKKwl1MzIJCQlzZWc7Cit9OworCitzdHJ1Y3Qg dG0xNjI4IHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKKwlfX2xlMTYJCQkJZGF0YVtNQVhf R1JJRF9TSVpFXTsKKwlzdHJ1Y3QgbXV0ZXgJCQlkaXNwX2xvY2s7CisJY2hhcgkJCQl0ZXh0W01B WF9HUklEX1NJWkUgKyAxXTsKKwl1OAkJCQlzZWdtZW50X21hcHBpbmdbN107CisJdTgJCQkJZ3Jp ZFtNQVhfR1JJRF9TSVpFXTsKKwlpbnQJCQkJZ3JpZF9zaXplOworCXN0cnVjdCB0bTE2MjhfbGVk CQlsZWRzW107Cit9OworCisvKiBDb21tYW5kIDE6IERpc3BsYXkgTW9kZSBTZXR0aW5nICovCitz dGF0aWMgaW50IHRtMTYyOF9zZXRfZGlzcGxheV9tb2RlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGks IHU4IGdyaWRfbW9kZSkKK3sKKwl1OCBjbWQgPSBUTTE2MjhfQ01EX0RJU1BMQVlfTU9ERSB8IGdy aWRfbW9kZTsKKworCXJldHVybiBzcGlfd3JpdGUoc3BpLCAmY21kLCAxKTsKK30KKworLyogQ29t bWFuZCAzOiBBZGRyZXNzIFNldHRpbmcgKi8KK3N0YXRpYyBpbnQgdG0xNjI4X3NldF9hZGRyZXNz KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IG9mZnNldCkKK3sKKwl1OCBjbWQgPSBUTTE2Mjhf Q01EX1NFVF9BRERSRVNTIHwgKG9mZnNldCAqIHNpemVvZihfX2xlMTYpKTsKKworCXJldHVybiBz cGlfd3JpdGUoc3BpLCAmY21kLCAxKTsKK30KKworLyogQ29tbWFuZCAyOiBEYXRhIFNldHRpbmcg Ki8KK3N0YXRpYyBpbnQgdG0xNjI4X3dyaXRlX2RhdGEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwg dW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1 Y3QgdG0xNjI4ICpzID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJdTggY21kID0gVE0xNjI4X0NN RF9EQVRBIHwgVE0xNjI4X0RBVEFfV1JJVEVfREFUQTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhm ZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSAmY21kLAorCQkJLmxlbiA9IDEsCisJCX0sCisJ CXsKKwkJCS50eF9idWYgPSAoX19mb3JjZSB2b2lkICopKHMtPmRhdGEgKyBvZmZzZXQpLAorCQkJ LmxlbiA9IGxlbiAqIHNpemVvZihfX2xlMTYpLAorCQl9LAorCX07CisKKwlpZiAob2Zmc2V0ICsg bGVuID4gTUFYX0dSSURfU0laRSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIkludmFsaWQgZGF0 YSBhZGRyZXNzIG9mZnNldCAldSBsZW4gJXVcbiIsCisJCQlvZmZzZXQsIGxlbik7CisJCXJldHVy biAtRUlOVkFMOworCX0KKworCXRtMTYyOF9zZXRfYWRkcmVzcyhzcGksIG9mZnNldCk7CisKKwly ZXR1cm4gc3BpX3N5bmNfdHJhbnNmZXIoc3BpLCB4ZmVycywgQVJSQVlfU0laRSh4ZmVycykpOwor fQorCisvKiBDb21tYW5kIDQ6IERpc3BsYXkgQ29udHJvbCAqLworc3RhdGljIGludCB0bTE2Mjhf c2V0X2Rpc3BsYXlfY3RybChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBib29sIG9uKQoreworCXU4 IGNtZCA9IFRNMTYyOF9DTURfRElTUExBWV9DVFJMIHwgVE0xNjI4X0JSSUdIVE5FU1NfTUFYOwor CisJaWYgKG9uKQorCQljbWQgfD0gVE0xNjI4X0RJU1BMQVlfQ1RSTF9ESVNQTEFZX09OOworCisJ cmV0dXJuIHNwaV93cml0ZShzcGksICZjbWQsIDEpOworfQorCitzdGF0aWMgaW50IHRtMTYyOF9z aG93X3RleHQoc3RydWN0IHRtMTYyOCAqcykKK3sKKwlzdGF0aWMgU0VHN19DT05WRVJTSU9OX01B UChtYXBfc2VnNywgTUFQX0FTQ0lJN1NFR19BTFBIQU5VTSk7CisJaW50IGksIHJldDsKKworCWlu dCBtc2dfbGVuID0gc3RybGVuKHMtPnRleHQpOworCisJbXV0ZXhfbG9jaygmcy0+ZGlzcF9sb2Nr KTsKKworCWZvciAoaSA9IDA7IGkgPCBzLT5ncmlkX3NpemU7IGkrKykgeworCQlpbnQgcG9zID0g cy0+Z3JpZFtpXSAtIDE7CisKKwkJaWYgKGkgPCBtc2dfbGVuKSB7CisJCQlpbnQgY2hhcjdfcmF3 ID0gbWFwX3RvX3NlZzcoJm1hcF9zZWc3LCBzLT50ZXh0W2ldKTsKKwkJCWludCBqLCBjaGFyNzsK KworCQkJZm9yIChqID0gMCwgY2hhcjcgPSAwOyBqIDwgNzsgaisrKSB7CisJCQkJaWYgKGNoYXI3 X3JhdyAmIEJJVChqKSkKKwkJCQkJY2hhcjcgfD0gQklUKHMtPnNlZ21lbnRfbWFwcGluZ1tqXSAt IDEpOworCQkJfQorCisJCQlzLT5kYXRhW3Bvc10gPSBjcHVfdG9fbGUxNihjaGFyNyk7CisJCX0g ZWxzZSB7CisJCQlzLT5kYXRhW3Bvc10gPSAwOworCQl9CisJfQorCisJcmV0ID0gdG0xNjI4X3dy aXRlX2RhdGEocy0+c3BpLCAwLCBzLT5ncmlkX3NpemUpOworCisJbXV0ZXhfdW5sb2NrKCZzLT5k aXNwX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0bTE2MjhfbGVkX3Nl dF9icmlnaHRuZXNzKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJCSAgICAgZW51 bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCXN0cnVjdCB0bTE2MjhfbGVkICpsZWQg PSBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCB0bTE2MjhfbGVkLCBsZWRkZXYpOworCXN0 cnVjdCB0bTE2MjggKnMgPSBsZWQtPmN0cmw7CisJaW50IG9mZnNldCwgcmV0OworCV9fbGUxNiBi aXQ7CisKKwlvZmZzZXQgPSBsZWQtPmdyaWQgLSAxOworCWJpdCA9IGNwdV90b19sZTE2KEJJVChs ZWQtPnNlZyAtIDEpKTsKKworCW11dGV4X2xvY2soJnMtPmRpc3BfbG9jayk7CisKKwlpZiAoYnJp Z2h0bmVzcyA9PSBMRURfT0ZGKQorCQlzLT5kYXRhW29mZnNldF0gJj0gfmJpdDsKKwllbHNlCisJ CXMtPmRhdGFbb2Zmc2V0XSB8PSBiaXQ7CisKKwlyZXQgPSB0bTE2Mjhfd3JpdGVfZGF0YShzLT5z cGksIG9mZnNldCwgMSk7CisKKwltdXRleF91bmxvY2soJnMtPmRpc3BfbG9jayk7CisKKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyB0bTE2MjhfbGVkX2dldF9i cmlnaHRuZXNzKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQoreworCXN0cnVjdCB0bTE2 MjhfbGVkICpsZWQgPSBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCB0bTE2MjhfbGVkLCBs ZWRkZXYpOworCXN0cnVjdCB0bTE2MjggKnMgPSBsZWQtPmN0cmw7CisJaW50IG9mZnNldDsKKwlf X2xlMTYgYml0OworCWJvb2wgb247CisKKwlvZmZzZXQgPSBsZWQtPmdyaWQgLSAxOworCWJpdCA9 IGNwdV90b19sZTE2KEJJVChsZWQtPnNlZyAtIDEpKTsKKworCW11dGV4X2xvY2soJnMtPmRpc3Bf bG9jayk7CisJb24gPSBzLT5kYXRhW29mZnNldF0gJiBiaXQ7CisJbXV0ZXhfdW5sb2NrKCZzLT5k aXNwX2xvY2spOworCisJcmV0dXJuIG9uID8gTEVEX09OIDogTEVEX09GRjsKK30KKworc3RhdGlj IGludCB0bTE2MjhfcmVnaXN0ZXJfbGVkKHN0cnVjdCB0bTE2MjggKnMsIHN0cnVjdCBmd25vZGVf aGFuZGxlICpub2RlLAorCQkJICAgICAgIHUzMiBncmlkLCB1MzIgc2VnLCBzdHJ1Y3QgdG0xNjI4 X2xlZCAqbGVkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzLT5zcGktPmRldjsKKwlzdHJ1 Y3QgbGVkX2luaXRfZGF0YSBpbml0X2RhdGEgPSB7IC5md25vZGUgPSBub2RlIH07CisKKwlsZWQt PmN0cmwgPSBzOworCWxlZC0+Z3JpZCA9IGdyaWQ7CisJbGVkLT5zZWcgID0gc2VnOworCWxlZC0+ bGVkZGV2Lm1heF9icmlnaHRuZXNzID0gTEVEX09OOworCWxlZC0+bGVkZGV2LmJyaWdodG5lc3Nf c2V0X2Jsb2NraW5nID0gdG0xNjI4X2xlZF9zZXRfYnJpZ2h0bmVzczsKKwlsZWQtPmxlZGRldi5i cmlnaHRuZXNzX2dldCA9IHRtMTYyOF9sZWRfZ2V0X2JyaWdodG5lc3M7CisKKwlyZXR1cm4gZGV2 bV9sZWRfY2xhc3NkZXZfcmVnaXN0ZXJfZXh0KGRldiwgJmxlZC0+bGVkZGV2LCAmaW5pdF9kYXRh KTsKK30KKworc3RhdGljIHNzaXplX3QgZGlzcGxheV90ZXh0X3Nob3coc3RydWN0IGRldmljZSAq ZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQorewor CXN0cnVjdCB0bTE2MjggKnMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBzeXNm c19lbWl0KGJ1ZiwgIiVzXG4iLCBzLT50ZXh0KTsKK30KKworc3RhdGljIHNzaXplX3QgZGlzcGxh eV90ZXh0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUg KmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qg dG0xNjI4ICpzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCwgaTsKKworCWlmIChj b3VudCA+IHMtPmdyaWRfc2l6ZSArIDEpIC8qIGNvbnNpZGVyIHRyYWlsaW5nIG5ld2xpbmUgKi8K KwkJcmV0dXJuIC1FMkJJRzsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudCAmJiBpc3ByaW50KGJ1 ZltpXSk7IGkrKykKKwkJcy0+dGV4dFtpXSA9IGJ1ZltpXTsKKworCXMtPnRleHRbaV0gPSAnXDAn OworCisJcmV0ID0gdG0xNjI4X3Nob3dfdGV4dChzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJu IHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IERFVklDRV9BVFRSX1JX KGRpc3BsYXlfdGV4dCk7CisKK3N0YXRpYyBpbnQgdG0xNjI4X3NwaV9wcm9iZShzdHJ1Y3Qgc3Bp X2RldmljZSAqc3BpKQoreworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpjaGlsZDsKKwl1bnNpZ25l ZCBpbnQgbnVtX2xlZHM7CisJc3RydWN0IHRtMTYyOCAqczsKKwlpbnQgcmV0LCBpOworCisJbnVt X2xlZHMgPSBkZXZpY2VfZ2V0X2NoaWxkX25vZGVfY291bnQoJnNwaS0+ZGV2KTsKKworCXMgPSBk ZXZtX2t6YWxsb2MoJnNwaS0+ZGV2LCBzdHJ1Y3Rfc2l6ZShzLCBsZWRzLCBudW1fbGVkcyksIEdG UF9LRVJORUwpOworCWlmICghcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzLT5zcGkgPSBzcGk7 CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgcyk7CisKKwltdXRleF9pbml0KCZzLT5kaXNwX2xvY2sp OworCisJbXNsZWVwKDIwMCk7IC8qIGFjY29yZGluZyB0byBUTTE2MjggZGF0YXNoZWV0ICovCisK KwkvKiBjbGVhciBzY3JlZW4gKi8KKwlyZXQgPSB0bTE2Mjhfd3JpdGVfZGF0YShzcGksIDAsIE1B WF9HUklEX1NJWkUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJLyogQXNzdW1lIHRoYXQg c3Vic2VxdWVudCBTUEkgdHJhbnNmZXJzIHdpbGwgYmUgb2sgaWYgZmlyc3Qgd2FzIG9rICovCisK KwkvKiBGb3Igbm93IHdlIHN1cHBvcnQgNngxMiBtb2RlIG9ubHkuIFRoaXMgc2hvdWxkIGJlIHN1 ZmZpY2llbnQgZm9yIG1vc3QgdXNlIGNhc2VzICovCisJdG0xNjI4X3NldF9kaXNwbGF5X21vZGUo c3BpLCBUTTE2MjhfRElTUExBWV9NT0RFXzZfMTIpOworCisJdG0xNjI4X3NldF9kaXNwbGF5X2N0 cmwoc3BpLCB0cnVlKTsKKworCWlmICghSVNfUkVBQ0hBQkxFKENPTkZJR19MRURTX0NMQVNTKSkK KwkJZ290byBub19sZWRzOworCisJbnVtX2xlZHMgPSAwOworCisJZGV2aWNlX2Zvcl9lYWNoX2No aWxkX25vZGUoJnNwaS0+ZGV2LCBjaGlsZCkgeworCQl1MzIgcmVnWzJdOworCisJCXJldCA9IGZ3 bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjaGlsZCwgInJlZyIsIHJlZywgMik7CisJCWlm IChyZXQpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUmVhZGluZyAlcyByZWcgcHJvcGVydHkg ZmFpbGVkICglZClcbiIsCisJCQkJZndub2RlX2dldF9uYW1lKGNoaWxkKSwgcmV0KTsKKwkJCWNv bnRpbnVlOworCQl9CisKKwkJaWYgKHJlZ1swXSA9PSAwIHx8IHJlZ1swXSA+IE1BWF9HUklEX1NJ WkUpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiSW52YWxpZCBncmlkICV1IGF0ICVzXG4iLAor CQkJCXJlZ1swXSwgZndub2RlX2dldF9uYW1lKGNoaWxkKSk7CisJCQljb250aW51ZTsKKwkJfQor CisJCWlmIChyZWdbMV0gPT0gMCB8fCByZWdbMV0gPiBNQVhfU0VHTUVOVF9OVU0pIHsKKwkJCWRl dl9lcnIoJnNwaS0+ZGV2LCAiSW52YWxpZCBzZWdtZW50ICV1IGF0ICVzXG4iLAorCQkJCXJlZ1sx XSwgZndub2RlX2dldF9uYW1lKGNoaWxkKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldCA9 IHRtMTYyOF9yZWdpc3Rlcl9sZWQocywgY2hpbGQsIHJlZ1swXSwgcmVnWzFdLCBzLT5sZWRzICsg bnVtX2xlZHMpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCB0 byByZWdpc3RlciBMRUQgJXMgKCVkKVxuIiwKKwkJCQlmd25vZGVfZ2V0X25hbWUoY2hpbGQpLCBy ZXQpOworCQkJY29udGludWU7CisJCX0KKwkJbnVtX2xlZHMrKzsKKwl9CisKK25vX2xlZHM6CisJ cmV0ID0gZGV2aWNlX3Byb3BlcnR5X2NvdW50X3U4KCZzcGktPmRldiwgImdyaWQiKTsKKwlpZiAo cmV0IDwgMSB8fCByZXQgPiBNQVhfR1JJRF9TSVpFKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAi SW52YWxpZCBkaXNwbGF5IGxlbmd0aCAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsK Kwl9CisKKwlzLT5ncmlkX3NpemUgPSByZXQ7CisKKwlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVh ZF91OF9hcnJheSgmc3BpLT5kZXYsICJncmlkIiwgcy0+Z3JpZCwgcy0+Z3JpZF9zaXplKTsKKwlp ZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBzLT5ncmlkX3Np emU7IGkrKykgeworCQlpZiAocy0+Z3JpZFtpXSA8IDEgfHwgcy0+Z3JpZFtpXSA+IHMtPmdyaWRf c2l6ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGRldmljZV9wcm9wZXJ0eV9y ZWFkX3U4X2FycmF5KCZzcGktPmRldiwgInNlZ21lbnQtbWFwcGluZyIsIHMtPnNlZ21lbnRfbWFw cGluZywgNyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBp IDwgNzsgaSsrKSB7CisJCWlmIChzLT5zZWdtZW50X21hcHBpbmdbaV0gPCAxIHx8IHMtPnNlZ21l bnRfbWFwcGluZ1tpXSA+IE1BWF9TRUdNRU5UX05VTSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0K KworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl9kaXNwbGF5 X3RleHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkZXZfaW5mbygmc3BpLT5kZXYs ICJDb25maWd1cmVkIGRpc3BsYXkgd2l0aCAldSBkaWdpdHMgYW5kICV1IHN5bWJvbHNcbiIsCisJ CSBzLT5ncmlkX3NpemUsIG51bV9sZWRzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCB0bTE2Mjhfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWRldmljZV9y ZW1vdmVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl9kaXNwbGF5X3RleHQpOworCXRtMTYyOF9z ZXRfZGlzcGxheV9jdHJsKHNwaSwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCB0bTE2Mjhfc3Bp X3NodXRkb3duKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdG0xNjI4X3NldF9kaXNwbGF5 X2N0cmwoc3BpLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lk IHRtMTYyOF9zcGlfb2ZfbWF0Y2hlc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAidGl0YW5tZWMs dG0xNjI4IiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdG0xNjI4X3NwaV9v Zl9tYXRjaGVzKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIHRtMTYyOF9z cGlfaWRfdGFibGVbXSA9IHsKKwl7ICJ0bTE2MjgiIH0sCisJe30sCit9OworTU9EVUxFX0RFVklD RV9UQUJMRShzcGksIHRtMTYyOF9zcGlfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHNwaV9k cml2ZXIgdG0xNjI4X3NwaV9kcml2ZXIgPSB7CisJLnByb2JlID0gdG0xNjI4X3NwaV9wcm9iZSwK KwkucmVtb3ZlID0gdG0xNjI4X3NwaV9yZW1vdmUsCisJLnNodXRkb3duID0gdG0xNjI4X3NwaV9z aHV0ZG93biwKKwkuaWRfdGFibGUgPSB0bTE2Mjhfc3BpX2lkX3RhYmxlLAorCisJLmRyaXZlciA9 IHsKKwkJLm5hbWUgPSAidG0xNjI4IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gdG0xNjI4X3NwaV9v Zl9tYXRjaGVzLAorCX0sCit9OworbW9kdWxlX3NwaV9kcml2ZXIodG0xNjI4X3NwaV9kcml2ZXIp OworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRNMTYyOCBMRUQgY29udHJvbGxlciBkcml2ZXIiKTsK K01PRFVMRV9BVVRIT1IoIkFuZHJlYXMgRsOkcmJlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIp OwotLSAKMi4zNS4xCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LWFybS1rZXJuZWwK