From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peta Blaha Subject: [PATCH] input/joystick: add driver fortius 1942 Date: Mon, 16 Mar 2009 23:20:09 +0100 Message-ID: <739e73230903161520j154edf4eq9fb308d4a67b001c@mail.gmail.com> References: <739e73230903161446k1c8326dfwa817f14afb3749ee@mail.gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=001636c5a2a5738d29046543dabc Return-path: Received: from mail-fx0-f176.google.com ([209.85.220.176]:55011 "EHLO mail-fx0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756531AbZCPWUN (ORCPT ); Mon, 16 Mar 2009 18:20:13 -0400 In-Reply-To: <739e73230903161446k1c8326dfwa817f14afb3749ee@mail.gmail.com> Sender: linux-input-owner@vger.kernel.org List-Id: linux-input@vger.kernel.org To: linux-input@vger.kernel.org, linux-usb@vger.kernel.org --001636c5a2a5738d29046543dabc Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Driver for Fortius 1942 device. Signed-off-by: Petr Blaha --- Hi, i wrote driver for Fortius 1942 by re-ingeneering original driver for win.This is a bicycle from Tacx company, they have their own virtual reality sw. There is not linux support from this company. http://www.tacxvr.com/en/products/tacx-virtual-reality This driver handle bike as normal joystick, it is connected thru USB, this driver isn't for initializating, it is too complex for me. here is more info http://code.google.com/p/fortius/ I would like to merge my work into kernel, is it ok? Petr --001636c5a2a5738d29046543dabc Content-Type: application/octet-stream; name=fortius_1942 Content-Disposition: attachment; filename=fortius_1942 Content-Transfer-Encoding: base64 X-Attachment-Id: f_fsdpees80 LS0tIC4vbGludXgtMi42L2RyaXZlcnMvaW5wdXQvam95c3RpY2svZm9ydGl1c18xOTQyLmMub3Jp ZwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgLi9saW51eC0yLjYvZHJp dmVycy9pbnB1dC9qb3lzdGljay9mb3J0aXVzXzE5NDIuYwkyMDA5LTAzLTE2IDE4OjE0OjUzLjAw MDAwMDAwMCArMDEwMApAQCAtMCwwICsxLDM0OCBAQAorLypUaGlzIGRyaXZlciBpcyB1bmRlciBH UEwgdmVyc2lvbiAyIG9yIGFueSBsYXRlci5ObyB3YXJyYW50eS4gCitMb29rIGF0IGh0dHA6Ly93 d3cuZ251Lm9yZy9saWNlbnNlcy8gKi8KKworCisvKgorSW5mbyBmb3IgZnV0dXJlIGRldmVsb3Bl cnMKK0hlYXJ0IFNlbnNvciB1c2UgYml0IDEyIGFuZCAxNChiZWdpbm5pbmcgMCksIG1heWJlIDEz IGFsc28uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgv c2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQu aD4KKyNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+ CisKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuMC4yIgorI2RlZmluZSBEUklWRVJfREVT QyAgICAiVVNCIFRhY3ggRm9ydGl1cyAxOTQyIGRyaXZlciIKKyNkZWZpbmUgRFJJVkVSX0xJQ0VO U0UgIkdQTCIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAgIlBldHIgQmxhaGEgPGJsYWhhcGV0YUBn bWFpbC5jb20+IgorCisKKy8qRG9uJ3QgcHV0IGhlcmUgbGVzc2VyIHZhbHVlcyovCisjZGVmaW5l IEJJVF9JTl9ERVZJQ0VfMTk0Mgk2NCAvL3JlYWQKKyNkZWZpbmUJQklUX09VVF9ERVZJQ0VfMTk0 MgkxMiAvL3dyaXRlCisKKyNkZWZpbmUgQlVMS19JTl9JTlRFUkZBQ0VfMTk0Mgk4MiAvL3JlYWQK KyNkZWZpbmUgQlVMS19PVVRfSU5URVJGQUNFXzE5NDIJMDIgLy93cml0ZQorCisKKyNkZWZpbmUg QlJBS0VfUE9TIDIKKworCisvKjExIHN0YXRlcyBvZiBicmFrZSxpbiBiZWdpbm5pbmcgYWN0aXZl IGJyYWtlIGhlbHBzLCBsYXRlciBhZGQgZGlmZmljdWx0eSB0byBjeWNsaW5nLiAweDAwIDB4MDAg aXMgbmV1dHJhbCovCisjZGVmaW5lIEFSUkFZSU5UIHsgezB4NGQsMHhmM30sIHsweGE3LDB4Zjl9 LCB7MHgwMCwweDAwfSwgezB4NTksMHgwNn0sIHsweGIzLDB4MGN9LCB7MHgwYywweDEzfSwgezB4 NjYsMHgxOX0sIHsweGJmLDB4MWZ9LCB7MHgxOCwweDI2fSwgezB4NzIsMHgyY30sIHsweGNiLDB4 MzJ9IH0KKworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBU SU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKERSSVZFUl9MSUNFTlNFKTsKKworCXVu c2lnbmVkIGxvbmcgZGlmZmVyZW5jZT0wOworCS8qdGltZSBtZWFzdXJlKi8KKwlzdHJ1Y3QgdGlt ZXZhbAl0aW1lLHRpbWVfYmVmb3JlOworCS8qZ3Vlc3NlZCBmYXN0ZXN0IHNwZWVkIGEgbWFuIGNh biBwb3NzaWJseSByaWRlLWluY2l0YXRpbmcgZnVsbCB0aHJvdHRsZSovCisJdW5zaWduZWQgaW50 IGZhc3Rlc3Rfd2hlZWxfcm90YXRlPSAxMDAwOworCS8qYWN0dWFsIHN0YXRlIG9mIHBhdGggcmVh Y2hlZCBpbiBvbmUgY3ljbGUqLworCXVuc2lnbmVkIGludCByaWRlID0gMCwgb2xkX3JpZGU9MDsK Kworc3RydWN0IHVzYl90Zm9yIHsKKwljaGFyIG5hbWVbMTI4XTsKKwljaGFyIHBoeXNbNjRdOyAK KwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OyAK KworCXN0cnVjdCB1cmIgKmlycTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWRtYV9hZGRyX3Qg aWRhdGFfZG1hOworCisJc3RydWN0IHVyYiAqb3V0OworCXVuc2lnbmVkIGNoYXIgKmRhdGFfZGV2 aWNlOworCWRtYV9hZGRyX3Qgb2RhdGFfZG1hOworCS8qYnJha2UgcG9zaXRpb24qLworCXVuc2ln bmVkIGludCBicmFrZV9wb3M7Cit9OworCitzdGF0aWMgdm9pZCB0Zm9yX2Rpc2Nvbm5lY3Qoc3Ry dWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl90Zm9yICp0Zm9yID0gdXNi X2dldF9pbnRmZGF0YShpbnRmKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJ aWYgKHRmb3IpIHsKKwkJLyp1cmIqLworCQl1c2Jfa2lsbF91cmIodGZvci0+b3V0KTsKKwkJdXNi X2tpbGxfdXJiKHRmb3ItPmlycSk7CisJCS8qZGV2aWNlKi8KKwkJaW5wdXRfdW5yZWdpc3Rlcl9k ZXZpY2UodGZvci0+aW5wdXQpOworCQkvKnVyYiovCisJCXVzYl9mcmVlX3VyYih0Zm9yLT5vdXQp OworCQl1c2JfZnJlZV91cmIodGZvci0+aXJxKTsKKwkJLypidWZmZXIgZnJlZSovCisJCXVzYl9i dWZmZXJfZnJlZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAxMCwgdGZvci0+ZGF0YV9kZXZp Y2UsIHRmb3ItPm9kYXRhX2RtYSk7CisJCXVzYl9idWZmZXJfZnJlZShpbnRlcmZhY2VfdG9fdXNi ZGV2KGludGYpLCAxMCwgdGZvci0+ZGF0YSwgdGZvci0+aWRhdGFfZG1hKTsKKwkJLypmcmVlIG1l bW9yeSovCisJCWtmcmVlKHRmb3IpOworCX0KK30KKworc3RhdGljIGludCB1c2JfdGZvcl9vcGVu KHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX3Rmb3IgKnRmb3IgPSBpbnB1 dF9nZXRfZHJ2ZGF0YShkZXYpOworCXRmb3ItPmlycS0+ZGV2ID0gdGZvci0+dXNiZGV2OworCXVz Yl9zdWJtaXRfdXJiKHRmb3ItPmlycSwgR0ZQX0tFUk5FTCk7CisJdGZvci0+b3V0LT5kZXYgPSB0 Zm9yLT51c2JkZXY7CisJdXNiX3N1Ym1pdF91cmIodGZvci0+b3V0LCBHRlBfS0VSTkVMKTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2JfdGZvcl9jbG9zZShzdHJ1Y3QgaW5wdXRf ZGV2ICpkZXYpCit7CisJc3RydWN0IHVzYl90Zm9yICp0Zm9yID0gaW5wdXRfZ2V0X2RydmRhdGEo ZGV2KTsKKwl1c2Jfa2lsbF91cmIodGZvci0+aXJxKTsKKwl1c2Jfa2lsbF91cmIodGZvci0+b3V0 KTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHRmb3JfaWRzW10gPSB7CisJeyBV U0JfREVWSUNFKDB4MzU2MSwgMHgxOTQyKSwgLmRyaXZlcl9pbmZvID0gMCB9LAorCXsgfQorfTsK Kworc3RhdGljIHZvaWQgdXNiX3Rmb3Jfb3V0KHN0cnVjdCB1cmIgKnVyYikKK3sJc3RydWN0IHVz Yl90Zm9yICp0Zm9yID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGludCBicmFrZV9iaXRzWzEx XVsyXSA9IEFSUkFZSU5UOworCWludCByZXR2YWw7CisJdGZvci0+YnJha2VfcG9zID1CUkFLRV9Q T1M7CisJLypVUkIgdG8gZGV2aWNlKi8KKwkvKmNvbnN0YW50Ki8KKwl0Zm9yLT5kYXRhX2Rldmlj ZVswXSA9CTB4MDE7IAorCS8qY29uc3RhbnQqLworCXRmb3ItPmRhdGFfZGV2aWNlWzFdID0JMHgw ODsgCisJLypjb25zdGFudCovCisJdGZvci0+ZGF0YV9kZXZpY2VbMl0gPQkweDAxOyAKKwkvKmNv bnN0YW50Ki8KKwl0Zm9yLT5kYXRhX2RldmljZVszXSA9CTB4MDA7IAorCS8qYnJha2VfYml0cyov CisJdGZvci0+ZGF0YV9kZXZpY2VbNF0gPQlicmFrZV9iaXRzW3Rmb3ItPmJyYWtlX3Bvc11bMF07 CisJLypicmFrZV9iaXRzKi8KKwl0Zm9yLT5kYXRhX2RldmljZVs1XSA9CWJyYWtlX2JpdHNbdGZv ci0+YnJha2VfcG9zXVsxXTsKKwkvKjB4MDEgaXMgdHVybix3aGVuIGZyYW1lIHNlbnNvciBtZWV0 cyBwZWRhbCBtYWduZXQsCisJIGkgZG9uJ3Qgc2VlIHJlYXNvbiBmb3IgaW1wbGVtZW50YXRpb24g Ki8KKwl0Zm9yLT5kYXRhX2RldmljZVs2XSA9CTB4MDA7CisJLypjb25zdGFudCovCisJdGZvci0+ ZGF0YV9kZXZpY2VbN10gPQkweDAwOworCS8qY29uc3RhbnQqLworCXRmb3ItPmRhdGFfZGV2aWNl WzhdID0JMHgwMjsKKwkvKmNvbnN0YW50Ki8KKwl0Zm9yLT5kYXRhX2RldmljZVs5XSA9CTB4NTI7 CisJLypjb25zdGFudCovCisJdGZvci0+ZGF0YV9kZXZpY2VbMTBdID0JMHgxMDsKKwkvKmNvbnN0 YW50Ki8KKwl0Zm9yLT5kYXRhX2RldmljZVsxMV0gPQkweDA0OworCisKKwlzd2l0Y2ggKHVyYi0+ c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVD T05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyogdGhpcyB1 cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBk b3duIHdpdGggc3RhdHVzOiAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJCWJyZWFrOwor CWRlZmF1bHQ6CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwg X19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwl9CisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJi LCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0dmFsKQorCQllcnIoIiVzIC0gdXNiX3N1Ym1pdF91cmIg ZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKKwkJICAgIF9fZnVuY19fLCByZXR2YWwpOworfQorCitz dGF0aWMgdm9pZCB1c2JfdGZvcl9pcnEoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB1c2Jf dGZvciAqdGZvciA9IHVyYi0+Y29udGV4dDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gdGZvci0+ ZGF0YTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSB0Zm9yLT5pbnB1dDsKKwlpbnQgc3RhdHVz OworCWludCBnYXNvbGluYTsKKwkKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJCWNhc2UgMDoK KwkJCS8qIHN1Y2Nlc3MgKi8KKwkJCWJyZWFrOworCQljYXNlIC1FQ09OTlJFU0VUOgorCQljYXNl IC1FTk9FTlQ6CisJCWNhc2UgLUVTSFVURE9XTjoKKwkJCS8qIMKxdGhpcyB1cmIgaXMgdGVybWlu YXRlZCwgY2xlYW4gdXAgKi8KKwkJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0 YXR1czogJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQkJcmV0dXJuOworCQlkZWZhdWx0 OgorCQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX2Z1bmNf XywgdXJiLT5zdGF0dXMpOworCQkJZ290byByZXN1Ym1pdDsKKwl9CisJCQorCQkvKkdldCBhY3R1 YWwgdGltZSovCisJCWRvX2dldHRpbWVvZmRheSgmdGltZSk7CisJCS8qUmlkZSBjb3VudGVyIGlu IHZlbG9jaXBlZCBpcyBzbWFsbCxhdm9pZCBtaXN0YWtlIGhlcmUqLworCQlpZigoZGF0YVsyOF0q MjU1K2RhdGFbMjldKTxyaWRlKSByaWRlID0wOworCQkvKklmIHdlIGdldCBuZXcgZGF0YSwgc2V0 IG5ldyB2YWx1ZXMgb2YgcmlkZSBjb3VudGVyIGFuZCB0aW1lIGNvdW50ZXIqLworCQlpZigoZGF0 YVsyOF0qMjU1K2RhdGFbMjldKT5yaWRlKSB7CisJCQlvbGRfcmlkZSA9IHJpZGU7CisJCQlyaWRl ID0gKGRhdGFbMjhdKjI1NStkYXRhWzI5XSk7CisJCQlkaWZmZXJlbmNlPSgodGltZS50dl91c2Vj LXRpbWVfYmVmb3JlLnR2X3VzZWMpKyh0aW1lLnR2X3NlYy10aW1lX2JlZm9yZS50dl9zZWMpKjEw MDAwMDApOworCQkJZG9fZ2V0dGltZW9mZGF5KCZ0aW1lX2JlZm9yZSk7IAorCQkJaWYoZGlmZmVy ZW5jZT09MCkKKwkJCQlkYmcoIlNvbWV0aGluZyBpcyBub3QgZ29vZCBcbiIpOworCQkJfQorCS8q UHJldmVudCBkaXZpc2lvbiBieSAwKi8KKwlpZihkaWZmZXJlbmNlIT0wKQorCQkvKiJzcGVlZD1w YXRoL3RpbWUiLGNoYW5nZSBjb25zdGFudCAxMDAwCisJCSAgIHRvIG5hdHVyYWxpemUgaXQgZm9y IHlvdXIgc3BlZWQqLworCQlnYXNvbGluYT0ocmlkZS1vbGRfcmlkZSkvKGRpZmZlcmVuY2UvMTAw MCk7CisJZWxzZSBnYXNvbGluYSA9MDsJCisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19HQVMs Z2Fzb2xpbmEpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsICAgZGF0YVsxM10g JiAweDAxKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0JBQ0sgICwgIGRhdGFbMTNdICYg MHgwMik7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9GT1JXQVJELCAgICAgIGRhdGFbMTNd ICYgMHgwNCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCAgZGF0YVsxM10gJiAw eDA4KTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1dIRUVMLCgoKGRhdGFbMThdKygoZGF0 YVsxOV0gJiAweDBmKSoyMjUpKS0oNjg5KzE3MCkpKi0xKSk7CisKKwkvKiBldmVudCB0ZXJtaW5h dGlvbiAqLworCWlucHV0X3N5bmMoZGV2KTsgCisKK3Jlc3VibWl0OgorCXN0YXR1cyA9IHVzYl9z dWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHN0YXR1cykKKwkJZXJyKCJjYW4ndCBy ZXN1Ym1pdCBpbnRyLCAlcy0lcy9pbnB1dDAsIHN0YXR1cyAlZCIsCisJCQl0Zm9yLT51c2JkZXYt PmJ1cy0+YnVzX25hbWUsIHRmb3ItPnVzYmRldi0+ZGV2cGF0aCwgc3RhdHVzKTsKKworfQorCitz dGF0aWMgaW50IHRmb3JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0 cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50 ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiX3Rmb3IgKnRmb3I7CisJc3RydWN0 IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXVuc2lnbmVkIGludCBlcnIgPSAtRU5PTUVNOworCQor CisJdGZvciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfdGZvciksIEdGUF9LRVJORUwpOwor CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCF0Zm9yIHx8ICFp bnB1dF9kZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsMTsKKwl9CisJLyppbml0 aWxpemF0aW9uIG9mIHRpbWUgY291bnRlciovCQorCWRvX2dldHRpbWVvZmRheSgmdGltZSk7CisJ dGltZV9iZWZvcmUudHZfdXNlYz10aW1lLnR2X3VzZWM7CisJdGltZV9iZWZvcmUudHZfc2VjPXRp bWUudHZfc2VjOworCisJdGZvci0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBCSVRfSU5f REVWSUNFXzE5NDIsIEdGUF9LRVJORUwsICZ0Zm9yLT5pZGF0YV9kbWEpOworCWlmICghdGZvci0+ ZGF0YSkgeworCQllcnI9IC1FTk9NRU07CisJCWdvdG8gZmFpbDE7CisJfQorCisJdGZvci0+ZGF0 YV9kZXZpY2UgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgQklUX09VVF9ERVZJQ0VfMTk0MixHRlBf S0VSTkVMLCAmdGZvci0+b2RhdGFfZG1hKTsKKwlpZiAoIXRmb3ItPmRhdGFfZGV2aWNlKSB7CisJ CWVycj0gLUVOT01FTTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwl0Zm9yLT5pcnEgPSB1c2JfYWxs b2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghdGZvci0+aXJxKSB7CisJCWVyciA9IC1FTk9N RU07CisJCWdvdG8gZmFpbDI7CisJfQorCisJdGZvci0+b3V0ID0gdXNiX2FsbG9jX3VyYigwLCBH RlBfS0VSTkVMKTsKKwlpZiAoIXRmb3ItPmlycSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3Rv IGZhaWwzOworCX0KKworCXRmb3ItPnVzYmRldiA9IGRldjsKKwl0Zm9yLT5pbnB1dCA9IGlucHV0 X2RldjsKKworCXVzYl9tYWtlX3BhdGgoZGV2LCB0Zm9yLT5waHlzLCBzaXplb2YodGZvci0+cGh5 cykpOworCXN0cmxjYXQodGZvci0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YodGZvci0+cGh5cykp OworCisJaW5wdXRfZGV2LT5uYW1lID0gIlRhY3ggRm9ydGl1cyAxOTQyIjsKKwlpbnB1dF9kZXYt PnBoeXMgPSB0Zm9yLT5waHlzOworCXVzYl90b19pbnB1dF9pZChkZXYsICZpbnB1dF9kZXYtPmlk KTsgCisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmludGYtPmRldjsKKwlpbnB1dF9zZXRfZHJ2 ZGF0YShpbnB1dF9kZXYsIHRmb3IpOworCWlucHV0X2Rldi0+b3BlbiA9IHVzYl90Zm9yX29wZW47 CisJaW5wdXRfZGV2LT5jbG9zZSA9IHVzYl90Zm9yX2Nsb3NlOworCWlucHV0X2Rldi0+ZXZiaXRb MF0gPSBCSVRfTUFTSyhFVl9BQlMpIHwgQklUX01BU0soRVZfS0VZKTsvLyB8IEJJVF9NQVNLKEVW X01TQykgfCBCSVRfTUFTSyhFVl9GRl9TVEFUVVMpOworCS8qaGFuZGxlYmFyKi8KKwlpbnB1dF9z ZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsQUJTX1dIRUVMLC0xNzAsMTcwLDAsMjApOworCS8qcGx5 biovCisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LEFCU19HQVMsMCw0MCwyLDApOwor CS8qYnV0dG9ucyovCisJc2V0X2JpdChCVE5fTEVGVCwgICAgaW5wdXRfZGV2LT5rZXliaXQpOwor ICAgIAlzZXRfYml0KEJUTl9SSUdIVCwgIGlucHV0X2Rldi0+a2V5Yml0KTsKKwlzZXRfYml0KEJU Tl9GT1JXQVJELCBpbnB1dF9kZXYtPmtleWJpdCk7CisgICAgCXNldF9iaXQoQlROX0JBQ0ssICBp bnB1dF9kZXYtPmtleWJpdCk7CisKKwl1c2JfZmlsbF9idWxrX3VyYih0Zm9yLT5pcnEsIGRldiwg dXNiX3JjdmJ1bGtwaXBlKGRldiwgQlVMS19JTl9JTlRFUkZBQ0VfMTk0MiksdGZvci0+ZGF0YSxC SVRfSU5fREVWSUNFXzE5NDIsdXNiX3Rmb3JfaXJxLCB0Zm9yKTsKKwl0Zm9yLT5pcnEtPnRyYW5z ZmVyX2RtYSA9IHRmb3ItPmlkYXRhX2RtYTsKKwl0Zm9yLT5pcnEtPnRyYW5zZmVyX2ZsYWdzIHw9 IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCisJLyoKKwkqIHVyYiBzZW5kcyBkYXRhIHRvIG1h Y2hpbmUKKwkqLworCisJdXNiX2ZpbGxfYnVsa191cmIodGZvci0+b3V0LCBkZXYsCisJCQkJdXNi X3NuZGJ1bGtwaXBlKGRldiwgQlVMS19PVVRfSU5URVJGQUNFXzE5NDIpLAorCQkJCXRmb3ItPmRh dGFfZGV2aWNlLCBCSVRfT1VUX0RFVklDRV8xOTQyLCB1c2JfdGZvcl9vdXQsIHRmb3IpOworCXRm b3ItPm91dC0+dHJhbnNmZXJfZG1hID0gdGZvci0+b2RhdGFfZG1hOworCXRmb3ItPm91dC0+dHJh bnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKworCWVyciA9IGlucHV0 X3JlZ2lzdGVyX2RldmljZSh0Zm9yLT5pbnB1dCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWwy OworCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCB0Zm9yKTsKKwkKKworCXJldHVybiAwOworCisg ZmFpbDM6CXVzYl9idWZmZXJfZnJlZShkZXYsIEJJVF9PVVRfREVWSUNFXzE5NDIsIHRmb3ItPmRh dGFfZGV2aWNlLCB0Zm9yLT5vZGF0YV9kbWEpOworIGZhaWwyOgl1c2JfYnVmZmVyX2ZyZWUoZGV2 LCBCSVRfSU5fREVWSUNFXzE5NDIsIHRmb3ItPmRhdGEsIHRmb3ItPmlkYXRhX2RtYSk7CisgZmFp bDE6IGlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUodGZvcik7CisJcmV0dXJu IGVycjsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHRmb3JfZHJpdmVyID0geworCS5u YW1lID0JCSJ0Zm9yIiwKKwkucHJvYmUgPQl0Zm9yX3Byb2JlLAorCS5kaXNjb25uZWN0ID0JdGZv cl9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CXRmb3JfaWRzLAorfTsKKworc3RhdGljIGludCBf X2luaXQgdGZvcl9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKwlyZXR2YWwgPSB1c2JfcmVn aXN0ZXIoJnRmb3JfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKwlwcmludGso S0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX1ZFUlNJT04gIjoiIERSSVZFUl9E RVNDICJcbiIpOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhp dCB0Zm9yX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmdGZvcl9kcml2ZXIpOworfQor Cittb2R1bGVfaW5pdCh0Zm9yX2luaXQpOworbW9kdWxlX2V4aXQodGZvcl9leGl0KTsK --001636c5a2a5738d29046543dabc--