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 C5263C64ED6 for ; Mon, 27 Feb 2023 20:52:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229775AbjB0Uw4 (ORCPT ); Mon, 27 Feb 2023 15:52:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33846 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229740AbjB0Uw4 (ORCPT ); Mon, 27 Feb 2023 15:52:56 -0500 Received: from smtprelay04.ispgateway.de (smtprelay04.ispgateway.de [80.67.18.16]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6958124C81 for ; Mon, 27 Feb 2023 12:52:47 -0800 (PST) Received: from [92.206.161.29] (helo=note-book.lan) by smtprelay04.ispgateway.de with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1pWkSL-0006TA-3S; Mon, 27 Feb 2023 21:50:45 +0100 From: =?UTF-8?q?Andr=C3=A9=20Apitzsch?= To: Nick Dyer , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Nicolas Ferre , Alexandre Belloni , Claudiu Beznea , Linus Walleij , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: ~postmarketos/upstreaming@lists.sr.ht, =?UTF-8?q?Andr=C3=A9=20Apitzsch?= Subject: [PATCH 2/2] Input: atmel_mxt_ts - support capacitive keys Date: Mon, 27 Feb 2023 21:50:35 +0100 Message-Id: <20230227205035.18551-2-git@apitzsch.eu> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230227205035.18551-1-git@apitzsch.eu> References: <20230227205035.18551-1-git@apitzsch.eu> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Df-Sender: YW5kcmVAYXBpdHpzY2guZXU= Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org Add support for touch keys found in some Atmel touch controller configurations. Signed-off-by: André Apitzsch --- drivers/input/touchscreen/atmel_mxt_ts.c | 85 ++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 996bf434e1cb..eb368dd1abf0 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -55,6 +55,7 @@ #define MXT_TOUCH_KEYARRAY_T15 15 #define MXT_TOUCH_PROXIMITY_T23 23 #define MXT_TOUCH_PROXKEY_T52 52 +#define MXT_TOUCH_PTC_KEYS_T97 97 #define MXT_PROCI_GRIPFACE_T20 20 #define MXT_PROCG_NOISE_T22 22 #define MXT_PROCI_ONETOUCH_T24 24 @@ -326,9 +327,13 @@ struct mxt_data { u16 T71_address; u8 T9_reportid_min; u8 T9_reportid_max; + u8 T15_reportid_min; + u8 T15_reportid_max; u16 T18_address; u8 T19_reportid; u16 T44_address; + u8 T97_reportid_min; + u8 T97_reportid_max; u8 T100_reportid_min; u8 T100_reportid_max; @@ -344,6 +349,9 @@ struct mxt_data { u32 *t19_keymap; unsigned int t19_num_keys; + u32 *t15_keymap; + unsigned int t15_num_keys; + enum mxt_suspend_mode suspend_mode; u32 wakeup_method; @@ -375,6 +383,7 @@ static bool mxt_object_readable(unsigned int type) case MXT_TOUCH_KEYARRAY_T15: case MXT_TOUCH_PROXIMITY_T23: case MXT_TOUCH_PROXKEY_T52: + case MXT_TOUCH_PTC_KEYS_T97: case MXT_TOUCH_MULTITOUCHSCREEN_T100: case MXT_PROCI_GRIPFACE_T20: case MXT_PROCG_NOISE_T22: @@ -891,6 +900,25 @@ static void mxt_proc_t9_message(struct mxt_data *data, u8 *message) data->update_input = true; } +static void mxt_proc_t15_messages(struct mxt_data *data, u8 *message) +{ + struct input_dev *input_dev = data->input_dev; + unsigned long keystates = get_unaligned_le32(&message[2]); + int key; + + for (key = 0; key < data->t15_num_keys; key++) { + input_report_key(input_dev, data->t15_keymap[key], + !!(keystates & BIT(key))); + } + + data->update_input = true; +} + +static void mxt_proc_t97_messages(struct mxt_data *data, u8 *message) +{ + mxt_proc_t15_messages(data, message); +} + static void mxt_proc_t100_message(struct mxt_data *data, u8 *message) { struct device *dev = &data->client->dev; @@ -1017,6 +1045,12 @@ static int mxt_proc_message(struct mxt_data *data, u8 *message) } else if (report_id >= data->T9_reportid_min && report_id <= data->T9_reportid_max) { mxt_proc_t9_message(data, message); + } else if (report_id >= data->T15_reportid_min && + report_id <= data->T15_reportid_max) { + mxt_proc_t15_messages(data, message); + } else if (report_id >= data->T97_reportid_min && + report_id <= data->T97_reportid_max) { + mxt_proc_t97_messages(data, message); } else if (report_id >= data->T100_reportid_min && report_id <= data->T100_reportid_max) { mxt_proc_t100_message(data, message); @@ -1689,9 +1723,13 @@ static void mxt_free_object_table(struct mxt_data *data) data->T71_address = 0; data->T9_reportid_min = 0; data->T9_reportid_max = 0; + data->T15_reportid_min = 0; + data->T15_reportid_max = 0; data->T18_address = 0; data->T19_reportid = 0; data->T44_address = 0; + data->T97_reportid_min = 0; + data->T97_reportid_max = 0; data->T100_reportid_min = 0; data->T100_reportid_max = 0; data->max_reportid = 0; @@ -1764,6 +1802,10 @@ static int mxt_parse_object_table(struct mxt_data *data, object->num_report_ids - 1; data->num_touchids = object->num_report_ids; break; + case MXT_TOUCH_KEYARRAY_T15: + data->T15_reportid_min = min_id; + data->T15_reportid_max = max_id; + break; case MXT_SPT_COMMSCONFIG_T18: data->T18_address = object->start_address; break; @@ -1773,6 +1815,10 @@ static int mxt_parse_object_table(struct mxt_data *data, case MXT_SPT_GPIOPWM_T19: data->T19_reportid = min_id; break; + case MXT_TOUCH_PTC_KEYS_T97: + data->T97_reportid_min = min_id; + data->T97_reportid_max = max_id; + break; case MXT_TOUCH_MULTITOUCHSCREEN_T100: data->multitouch = MXT_TOUCH_MULTITOUCHSCREEN_T100; data->T100_reportid_min = min_id; @@ -2050,6 +2096,7 @@ static int mxt_initialize_input_device(struct mxt_data *data) int error; unsigned int num_mt_slots; unsigned int mt_flags = 0; + int i; switch (data->multitouch) { case MXT_TOUCH_MULTI_T9: @@ -2095,6 +2142,10 @@ static int mxt_initialize_input_device(struct mxt_data *data) input_dev->open = mxt_input_open; input_dev->close = mxt_input_close; + input_dev->keycode = data->t15_keymap; + input_dev->keycodemax = data->t15_num_keys; + input_dev->keycodesize = sizeof(data->t15_keymap[0]); + input_set_capability(input_dev, EV_KEY, BTN_TOUCH); /* For single touch */ @@ -2162,6 +2213,12 @@ static int mxt_initialize_input_device(struct mxt_data *data) 0, 255, 0, 0); } + /* For T15 and T97 Key Array */ + if (data->T15_reportid_min || data->T97_reportid_min) { + for (i = 0; i < data->t15_num_keys; i++) + input_set_capability(input_dev, EV_KEY, data->t15_keymap[i]); + } + input_set_drvdata(input_dev, data); error = input_register_device(input_dev); @@ -3080,8 +3137,10 @@ static void mxt_input_close(struct input_dev *dev) static int mxt_parse_device_properties(struct mxt_data *data) { static const char keymap_property[] = "linux,gpio-keymap"; + static const char buttons_property[] = "linux,keycodes"; struct device *dev = &data->client->dev; u32 *keymap; + u32 *buttonmap; int n_keys; int error; @@ -3111,6 +3170,32 @@ static int mxt_parse_device_properties(struct mxt_data *data) data->t19_num_keys = n_keys; } + if (device_property_present(dev, buttons_property)) { + n_keys = device_property_count_u32(dev, buttons_property); + if (n_keys <= 0) { + error = n_keys < 0 ? n_keys : -EINVAL; + dev_err(dev, "invalid/malformed '%s' property: %d\n", + buttons_property, error); + return error; + } + + buttonmap = devm_kmalloc_array(dev, n_keys, sizeof(*buttonmap), + GFP_KERNEL); + if (!buttonmap) + return -ENOMEM; + + error = device_property_read_u32_array(dev, buttons_property, + buttonmap, n_keys); + if (error) { + dev_err(dev, "failed to parse '%s' property: %d\n", + buttons_property, error); + return error; + } + + data->t15_keymap = buttonmap; + data->t15_num_keys = n_keys; + } + return 0; } -- 2.39.2 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 B55D1C64ED8 for ; Mon, 27 Feb 2023 20:52:03 +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:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=NjznCvbWmQXO7a/6DGSzWaAOt4oa8Yg+C9h1kemKwtM=; b=FbtViR8TBYyRSo pebMXhsS48TQEqasDVGVX8IXAV2DH6rQCohNJgtqpc8WIR1j/v9FIymORQ1hitO9POEXLnhcS7U90 hvmDoK2v61zDrgpVEdYdmquJSs9lcK/LmpCo6g3Z/Fj+yej0wwQxcvhEQg6IlSgpe2vFfN8MgpXdH Plg4GFbKbat7TsBE+OFLTVSBkuDl8vgXPjBuDSFMcQ0WZJo9ZqXc83XTpbKCxT5tN+9T3JOnVL/Jn 1bflA20qiT+4ObxJtkY1W9IYY9Mgh0GMYOmEBpoa3YD/5qUxDBLOXowwDCiSksi1DlrmpEGPzhvDX 3Lpw9LpHXwoScSSehwbA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pWkSY-00BCjm-FM; Mon, 27 Feb 2023 20:50:58 +0000 Received: from smtprelay04.ispgateway.de ([80.67.31.27]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pWkSU-00BCib-H2 for linux-arm-kernel@lists.infradead.org; Mon, 27 Feb 2023 20:50:56 +0000 Received: from [92.206.161.29] (helo=note-book.lan) by smtprelay04.ispgateway.de with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1pWkSL-0006TA-3S; Mon, 27 Feb 2023 21:50:45 +0100 From: =?UTF-8?q?Andr=C3=A9=20Apitzsch?= To: Nick Dyer , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Nicolas Ferre , Alexandre Belloni , Claudiu Beznea , Linus Walleij , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: ~postmarketos/upstreaming@lists.sr.ht, =?UTF-8?q?Andr=C3=A9=20Apitzsch?= Subject: [PATCH 2/2] Input: atmel_mxt_ts - support capacitive keys Date: Mon, 27 Feb 2023 21:50:35 +0100 Message-Id: <20230227205035.18551-2-git@apitzsch.eu> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230227205035.18551-1-git@apitzsch.eu> References: <20230227205035.18551-1-git@apitzsch.eu> MIME-Version: 1.0 X-Df-Sender: YW5kcmVAYXBpdHpzY2guZXU= X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230227_125054_585126_E118CA74 X-CRM114-Status: GOOD ( 18.01 ) 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 QWRkIHN1cHBvcnQgZm9yIHRvdWNoIGtleXMgZm91bmQgaW4gc29tZSBBdG1lbCB0b3VjaCBjb250 cm9sbGVyCmNvbmZpZ3VyYXRpb25zLgoKU2lnbmVkLW9mZi1ieTogQW5kcsOpIEFwaXR6c2NoIDxn aXRAYXBpdHpzY2guZXU+Ci0tLQogZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF9teHRf dHMuYyB8IDg1ICsrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxlIGNoYW5nZWQsIDg1IGlu c2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2F0bWVs X214dF90cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF9teHRfdHMuYwppbmRl eCA5OTZiZjQzNGUxY2IuLmViMzY4ZGQxYWJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90 b3VjaHNjcmVlbi9hdG1lbF9teHRfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVu L2F0bWVsX214dF90cy5jCkBAIC01NSw2ICs1NSw3IEBACiAjZGVmaW5lIE1YVF9UT1VDSF9LRVlB UlJBWV9UMTUJCTE1CiAjZGVmaW5lIE1YVF9UT1VDSF9QUk9YSU1JVFlfVDIzCQkyMwogI2RlZmlu ZSBNWFRfVE9VQ0hfUFJPWEtFWV9UNTIJCTUyCisjZGVmaW5lIE1YVF9UT1VDSF9QVENfS0VZU19U OTcJCTk3CiAjZGVmaW5lIE1YVF9QUk9DSV9HUklQRkFDRV9UMjAJCTIwCiAjZGVmaW5lIE1YVF9Q Uk9DR19OT0lTRV9UMjIJCTIyCiAjZGVmaW5lIE1YVF9QUk9DSV9PTkVUT1VDSF9UMjQJCTI0CkBA IC0zMjYsOSArMzI3LDEzIEBAIHN0cnVjdCBteHRfZGF0YSB7CiAJdTE2IFQ3MV9hZGRyZXNzOwog CXU4IFQ5X3JlcG9ydGlkX21pbjsKIAl1OCBUOV9yZXBvcnRpZF9tYXg7CisJdTggVDE1X3JlcG9y dGlkX21pbjsKKwl1OCBUMTVfcmVwb3J0aWRfbWF4OwogCXUxNiBUMThfYWRkcmVzczsKIAl1OCBU MTlfcmVwb3J0aWQ7CiAJdTE2IFQ0NF9hZGRyZXNzOworCXU4IFQ5N19yZXBvcnRpZF9taW47CisJ dTggVDk3X3JlcG9ydGlkX21heDsKIAl1OCBUMTAwX3JlcG9ydGlkX21pbjsKIAl1OCBUMTAwX3Jl cG9ydGlkX21heDsKIApAQCAtMzQ0LDYgKzM0OSw5IEBAIHN0cnVjdCBteHRfZGF0YSB7CiAJdTMy ICp0MTlfa2V5bWFwOwogCXVuc2lnbmVkIGludCB0MTlfbnVtX2tleXM7CiAKKwl1MzIgKnQxNV9r ZXltYXA7CisJdW5zaWduZWQgaW50IHQxNV9udW1fa2V5czsKKwogCWVudW0gbXh0X3N1c3BlbmRf bW9kZSBzdXNwZW5kX21vZGU7CiAKIAl1MzIgd2FrZXVwX21ldGhvZDsKQEAgLTM3NSw2ICszODMs NyBAQCBzdGF0aWMgYm9vbCBteHRfb2JqZWN0X3JlYWRhYmxlKHVuc2lnbmVkIGludCB0eXBlKQog CWNhc2UgTVhUX1RPVUNIX0tFWUFSUkFZX1QxNToKIAljYXNlIE1YVF9UT1VDSF9QUk9YSU1JVFlf VDIzOgogCWNhc2UgTVhUX1RPVUNIX1BST1hLRVlfVDUyOgorCWNhc2UgTVhUX1RPVUNIX1BUQ19L RVlTX1Q5NzoKIAljYXNlIE1YVF9UT1VDSF9NVUxUSVRPVUNIU0NSRUVOX1QxMDA6CiAJY2FzZSBN WFRfUFJPQ0lfR1JJUEZBQ0VfVDIwOgogCWNhc2UgTVhUX1BST0NHX05PSVNFX1QyMjoKQEAgLTg5 MSw2ICs5MDAsMjUgQEAgc3RhdGljIHZvaWQgbXh0X3Byb2NfdDlfbWVzc2FnZShzdHJ1Y3QgbXh0 X2RhdGEgKmRhdGEsIHU4ICptZXNzYWdlKQogCWRhdGEtPnVwZGF0ZV9pbnB1dCA9IHRydWU7CiB9 CiAKK3N0YXRpYyB2b2lkIG14dF9wcm9jX3QxNV9tZXNzYWdlcyhzdHJ1Y3QgbXh0X2RhdGEgKmRh dGEsIHU4ICptZXNzYWdlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IGRhdGEt PmlucHV0X2RldjsKKwl1bnNpZ25lZCBsb25nIGtleXN0YXRlcyA9IGdldF91bmFsaWduZWRfbGUz MigmbWVzc2FnZVsyXSk7CisJaW50IGtleTsKKworCWZvciAoa2V5ID0gMDsga2V5IDwgZGF0YS0+ dDE1X251bV9rZXlzOyBrZXkrKykgeworCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2RldiwgZGF0 YS0+dDE1X2tleW1hcFtrZXldLAorCQkJISEoa2V5c3RhdGVzICYgQklUKGtleSkpKTsKKwl9CisK KwlkYXRhLT51cGRhdGVfaW5wdXQgPSB0cnVlOworfQorCitzdGF0aWMgdm9pZCBteHRfcHJvY190 OTdfbWVzc2FnZXMoc3RydWN0IG14dF9kYXRhICpkYXRhLCB1OCAqbWVzc2FnZSkKK3sKKwlteHRf cHJvY190MTVfbWVzc2FnZXMoZGF0YSwgbWVzc2FnZSk7Cit9CisKIHN0YXRpYyB2b2lkIG14dF9w cm9jX3QxMDBfbWVzc2FnZShzdHJ1Y3QgbXh0X2RhdGEgKmRhdGEsIHU4ICptZXNzYWdlKQogewog CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXRhLT5jbGllbnQtPmRldjsKQEAgLTEwMTcsNiArMTA0 NSwxMiBAQCBzdGF0aWMgaW50IG14dF9wcm9jX21lc3NhZ2Uoc3RydWN0IG14dF9kYXRhICpkYXRh LCB1OCAqbWVzc2FnZSkKIAl9IGVsc2UgaWYgKHJlcG9ydF9pZCA+PSBkYXRhLT5UOV9yZXBvcnRp ZF9taW4gJiYKIAkJICAgcmVwb3J0X2lkIDw9IGRhdGEtPlQ5X3JlcG9ydGlkX21heCkgewogCQlt eHRfcHJvY190OV9tZXNzYWdlKGRhdGEsIG1lc3NhZ2UpOworCX0gZWxzZSBpZiAocmVwb3J0X2lk ID49IGRhdGEtPlQxNV9yZXBvcnRpZF9taW4gJiYKKwkJICAgcmVwb3J0X2lkIDw9IGRhdGEtPlQx NV9yZXBvcnRpZF9tYXgpIHsKKwkJbXh0X3Byb2NfdDE1X21lc3NhZ2VzKGRhdGEsIG1lc3NhZ2Up OworCX0gZWxzZSBpZiAocmVwb3J0X2lkID49IGRhdGEtPlQ5N19yZXBvcnRpZF9taW4gJiYKKwkJ ICAgcmVwb3J0X2lkIDw9IGRhdGEtPlQ5N19yZXBvcnRpZF9tYXgpIHsKKwkJbXh0X3Byb2NfdDk3 X21lc3NhZ2VzKGRhdGEsIG1lc3NhZ2UpOwogCX0gZWxzZSBpZiAocmVwb3J0X2lkID49IGRhdGEt PlQxMDBfcmVwb3J0aWRfbWluICYmCiAJCSAgIHJlcG9ydF9pZCA8PSBkYXRhLT5UMTAwX3JlcG9y dGlkX21heCkgewogCQlteHRfcHJvY190MTAwX21lc3NhZ2UoZGF0YSwgbWVzc2FnZSk7CkBAIC0x Njg5LDkgKzE3MjMsMTMgQEAgc3RhdGljIHZvaWQgbXh0X2ZyZWVfb2JqZWN0X3RhYmxlKHN0cnVj dCBteHRfZGF0YSAqZGF0YSkKIAlkYXRhLT5UNzFfYWRkcmVzcyA9IDA7CiAJZGF0YS0+VDlfcmVw b3J0aWRfbWluID0gMDsKIAlkYXRhLT5UOV9yZXBvcnRpZF9tYXggPSAwOworCWRhdGEtPlQxNV9y ZXBvcnRpZF9taW4gPSAwOworCWRhdGEtPlQxNV9yZXBvcnRpZF9tYXggPSAwOwogCWRhdGEtPlQx OF9hZGRyZXNzID0gMDsKIAlkYXRhLT5UMTlfcmVwb3J0aWQgPSAwOwogCWRhdGEtPlQ0NF9hZGRy ZXNzID0gMDsKKwlkYXRhLT5UOTdfcmVwb3J0aWRfbWluID0gMDsKKwlkYXRhLT5UOTdfcmVwb3J0 aWRfbWF4ID0gMDsKIAlkYXRhLT5UMTAwX3JlcG9ydGlkX21pbiA9IDA7CiAJZGF0YS0+VDEwMF9y ZXBvcnRpZF9tYXggPSAwOwogCWRhdGEtPm1heF9yZXBvcnRpZCA9IDA7CkBAIC0xNzY0LDYgKzE4 MDIsMTAgQEAgc3RhdGljIGludCBteHRfcGFyc2Vfb2JqZWN0X3RhYmxlKHN0cnVjdCBteHRfZGF0 YSAqZGF0YSwKIAkJCQkJCW9iamVjdC0+bnVtX3JlcG9ydF9pZHMgLSAxOwogCQkJZGF0YS0+bnVt X3RvdWNoaWRzID0gb2JqZWN0LT5udW1fcmVwb3J0X2lkczsKIAkJCWJyZWFrOworCQljYXNlIE1Y VF9UT1VDSF9LRVlBUlJBWV9UMTU6CisJCQlkYXRhLT5UMTVfcmVwb3J0aWRfbWluID0gbWluX2lk OworCQkJZGF0YS0+VDE1X3JlcG9ydGlkX21heCA9IG1heF9pZDsKKwkJCWJyZWFrOwogCQljYXNl IE1YVF9TUFRfQ09NTVNDT05GSUdfVDE4OgogCQkJZGF0YS0+VDE4X2FkZHJlc3MgPSBvYmplY3Qt PnN0YXJ0X2FkZHJlc3M7CiAJCQlicmVhazsKQEAgLTE3NzMsNiArMTgxNSwxMCBAQCBzdGF0aWMg aW50IG14dF9wYXJzZV9vYmplY3RfdGFibGUoc3RydWN0IG14dF9kYXRhICpkYXRhLAogCQljYXNl IE1YVF9TUFRfR1BJT1BXTV9UMTk6CiAJCQlkYXRhLT5UMTlfcmVwb3J0aWQgPSBtaW5faWQ7CiAJ CQlicmVhazsKKwkJY2FzZSBNWFRfVE9VQ0hfUFRDX0tFWVNfVDk3OgorCQkJZGF0YS0+VDk3X3Jl cG9ydGlkX21pbiA9IG1pbl9pZDsKKwkJCWRhdGEtPlQ5N19yZXBvcnRpZF9tYXggPSBtYXhfaWQ7 CisJCQlicmVhazsKIAkJY2FzZSBNWFRfVE9VQ0hfTVVMVElUT1VDSFNDUkVFTl9UMTAwOgogCQkJ ZGF0YS0+bXVsdGl0b3VjaCA9IE1YVF9UT1VDSF9NVUxUSVRPVUNIU0NSRUVOX1QxMDA7CiAJCQlk YXRhLT5UMTAwX3JlcG9ydGlkX21pbiA9IG1pbl9pZDsKQEAgLTIwNTAsNiArMjA5Niw3IEBAIHN0 YXRpYyBpbnQgbXh0X2luaXRpYWxpemVfaW5wdXRfZGV2aWNlKHN0cnVjdCBteHRfZGF0YSAqZGF0 YSkKIAlpbnQgZXJyb3I7CiAJdW5zaWduZWQgaW50IG51bV9tdF9zbG90czsKIAl1bnNpZ25lZCBp bnQgbXRfZmxhZ3MgPSAwOworCWludCBpOwogCiAJc3dpdGNoIChkYXRhLT5tdWx0aXRvdWNoKSB7 CiAJY2FzZSBNWFRfVE9VQ0hfTVVMVElfVDk6CkBAIC0yMDk1LDYgKzIxNDIsMTAgQEAgc3RhdGlj IGludCBteHRfaW5pdGlhbGl6ZV9pbnB1dF9kZXZpY2Uoc3RydWN0IG14dF9kYXRhICpkYXRhKQog CWlucHV0X2Rldi0+b3BlbiA9IG14dF9pbnB1dF9vcGVuOwogCWlucHV0X2Rldi0+Y2xvc2UgPSBt eHRfaW5wdXRfY2xvc2U7CiAKKwlpbnB1dF9kZXYtPmtleWNvZGUgPSBkYXRhLT50MTVfa2V5bWFw OworCWlucHV0X2Rldi0+a2V5Y29kZW1heCA9IGRhdGEtPnQxNV9udW1fa2V5czsKKwlpbnB1dF9k ZXYtPmtleWNvZGVzaXplID0gc2l6ZW9mKGRhdGEtPnQxNV9rZXltYXBbMF0pOworCiAJaW5wdXRf c2V0X2NhcGFiaWxpdHkoaW5wdXRfZGV2LCBFVl9LRVksIEJUTl9UT1VDSCk7CiAKIAkvKiBGb3Ig c2luZ2xlIHRvdWNoICovCkBAIC0yMTYyLDYgKzIyMTMsMTIgQEAgc3RhdGljIGludCBteHRfaW5p dGlhbGl6ZV9pbnB1dF9kZXZpY2Uoc3RydWN0IG14dF9kYXRhICpkYXRhKQogCQkJCSAgICAgMCwg MjU1LCAwLCAwKTsKIAl9CiAKKwkvKiBGb3IgVDE1IGFuZCBUOTcgS2V5IEFycmF5ICovCisJaWYg KGRhdGEtPlQxNV9yZXBvcnRpZF9taW4gfHwgZGF0YS0+VDk3X3JlcG9ydGlkX21pbikgeworCQlm b3IgKGkgPSAwOyBpIDwgZGF0YS0+dDE1X251bV9rZXlzOyBpKyspCisJCQlpbnB1dF9zZXRfY2Fw YWJpbGl0eShpbnB1dF9kZXYsIEVWX0tFWSwgZGF0YS0+dDE1X2tleW1hcFtpXSk7CisJfQorCiAJ aW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBkYXRhKTsKIAogCWVycm9yID0gaW5wdXRfcmVn aXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CkBAIC0zMDgwLDggKzMxMzcsMTAgQEAgc3RhdGljIHZv aWQgbXh0X2lucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHN0YXRpYyBpbnQgbXh0 X3BhcnNlX2RldmljZV9wcm9wZXJ0aWVzKHN0cnVjdCBteHRfZGF0YSAqZGF0YSkKIHsKIAlzdGF0 aWMgY29uc3QgY2hhciBrZXltYXBfcHJvcGVydHlbXSA9ICJsaW51eCxncGlvLWtleW1hcCI7CisJ c3RhdGljIGNvbnN0IGNoYXIgYnV0dG9uc19wcm9wZXJ0eVtdID0gImxpbnV4LGtleWNvZGVzIjsK IAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+Y2xpZW50LT5kZXY7CiAJdTMyICprZXltYXA7 CisJdTMyICpidXR0b25tYXA7CiAJaW50IG5fa2V5czsKIAlpbnQgZXJyb3I7CiAKQEAgLTMxMTEs NiArMzE3MCwzMiBAQCBzdGF0aWMgaW50IG14dF9wYXJzZV9kZXZpY2VfcHJvcGVydGllcyhzdHJ1 Y3QgbXh0X2RhdGEgKmRhdGEpCiAJCWRhdGEtPnQxOV9udW1fa2V5cyA9IG5fa2V5czsKIAl9CiAK KwlpZiAoZGV2aWNlX3Byb3BlcnR5X3ByZXNlbnQoZGV2LCBidXR0b25zX3Byb3BlcnR5KSkgewor CQluX2tleXMgPSBkZXZpY2VfcHJvcGVydHlfY291bnRfdTMyKGRldiwgYnV0dG9uc19wcm9wZXJ0 eSk7CisJCWlmIChuX2tleXMgPD0gMCkgeworCQkJZXJyb3IgPSBuX2tleXMgPCAwID8gbl9rZXlz IDogLUVJTlZBTDsKKwkJCWRldl9lcnIoZGV2LCAiaW52YWxpZC9tYWxmb3JtZWQgJyVzJyBwcm9w ZXJ0eTogJWRcbiIsCisJCQkJYnV0dG9uc19wcm9wZXJ0eSwgZXJyb3IpOworCQkJcmV0dXJuIGVy cm9yOworCQl9CisKKwkJYnV0dG9ubWFwID0gZGV2bV9rbWFsbG9jX2FycmF5KGRldiwgbl9rZXlz LCBzaXplb2YoKmJ1dHRvbm1hcCksCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFi dXR0b25tYXApCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQllcnJvciA9IGRldmljZV9wcm9wZXJ0 eV9yZWFkX3UzMl9hcnJheShkZXYsIGJ1dHRvbnNfcHJvcGVydHksCisJCQkJCQkgICAgICAgYnV0 dG9ubWFwLCBuX2tleXMpOworCQlpZiAoZXJyb3IpIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVk IHRvIHBhcnNlICclcycgcHJvcGVydHk6ICVkXG4iLAorCQkJCWJ1dHRvbnNfcHJvcGVydHksIGVy cm9yKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCisJCWRhdGEtPnQxNV9rZXltYXAgPSBidXR0 b25tYXA7CisJCWRhdGEtPnQxNV9udW1fa2V5cyA9IG5fa2V5czsKKwl9CisKIAlyZXR1cm4gMDsK IH0KIAotLSAKMi4zOS4yCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBs aXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtYXJtLWtlcm5lbAo=