From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v4,2/2] usb/gadget: Add driver for Aspeed SoC virtual hub From: Felipe Balbi Message-Id: <87po4da9mj.fsf@linux.intel.com> Date: Fri, 09 Mar 2018 11:20:04 +0200 To: Benjamin Herrenschmidt , linux-usb@vger.kernel.org Cc: Greg KH , Joel Stanley , Andrew Jeffery List-ID: QmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPiB3cml0ZXM6 Cgo+IFRoZSBBc3BlZWQgQk1DIFNvQ3Mgc3VwcG9ydCBhICJ2aXJ0dWFsIGh1YiIgZnVuY3Rpb24u IEl0IHByb3ZpZGVzIHNvbWUKPiBIVyBzdXBwb3J0IGZvciBhIHRvcC1sZXZlbCBVU0IyIGh1YiBi ZWhpbmQgd2hpY2ggc2l0IDUgZ2FkZ2V0ICJwb3J0cyIuCj4KPiBUaGlzIGRyaXZlciBhZGRzIHN1 cHBvcnQgZm9yIHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHksIGVtdWxhdGluZyB0aGUKPiBodWIgc3Rh bmRhcmQgcmVxdWVzdHMgYW5kIGV4cG9zaW5nIDUgVURDIGdhZGdldCBkcml2ZXJzIGNvcnJlc3Bv bmRpbmcKPiB0byB0aGUgcG9ydHMuCj4KPiBUaGUgaHViIGl0c2VsZiBoYXMgSFcgcHJvdmlkZWQg ZGVkaWNhdGVkIEVQMCBhbmQgRVAxICh0aGUgbGF0dGVyIGZvcgo+IGh1YiBpbnRlcnJ1cHRzKS4g SXQgYWxzbyBoYXMgZGVkaWNhdGVkIEVQMHMgZm9yIGVhY2ggZnVuY3Rpb24uIEZvcgo+IG90aGVy IGVuZHBvaW50cywgdGhlcmUncyBhIHBvb2wgb2YgMTUgImdlbmVyaWMiIGVuZHBvaW50cyB0aGF0 IGFyZQo+IHNoYXJlZCBhbW9uZyB0aGUgcG9ydHMuCj4KPiBUaGUgZHJpdmVyIHJlbGllcyBvbiBt eSBwcmV2aW91cyBwYXRjaCBhZGRpbmcgYSAiZGlzcG9zZSIgRVAgb3AgdG8KPiBoYW5kbGUgRVAg YWxsb2NhdGlvbiBiZXR3ZWVuIHBvcnRzLiBFUHMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBzaGFy ZWQKPiBwb29sIGluIHRoZSBVREMgIm1hdGNoX2VwIiBjYWxsYmFjayBhbmQgYXNzaWduZWQgdG8g dGhlIFVEQyBpbnN0YW5jZQo+IChhZGRlZCB0byB0aGUgZ2FkZ2V0IGVwX2xpc3QpLgo+Cj4gV2hl biB0aGUgY29tcG9zaXRlIGRyaXZlciBnZXRzIHVuYm91bmQsIHRoZSBuZXcgaG9vayB3aWxsIGFs bG93IHRoZSBVREMKPiB0byBjbGVhbiB0aGluZ3MgdXAgYW5kIHJldHVybiB0aG9zZSBFUHMgdG8g dGhlIHNoYXJlZCBwb29sLgo+Cj4gU2lnbmVkLW9mZi1ieTogQmVuamFtaW4gSGVycmVuc2NobWlk dCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgo+IC0tLQo+IHY0LiAtIEZpeCBtaXNzaW5nIHVu bG9jayBhc3Rfdmh1Yl91ZGNfd2FrZXVwKCkgZXJyb3IgcGF0aAo+ICAgICAtIE1ha2UgImlycSIg c2lnbmVkIHRvIGRlYWwgd2l0aCBlcnJvciBmcm9tIHBsYXRmb3JtX2dldF9pcnEKPiAgICAgLSBG aXggTWFrZWZpbGUgZm9yIG1vZHVsZSBidWlsZHMKPiAgICAgLSBGaXggYSBtaXNzaW5nIGVuZGlh biBjb252ZXJzaW9uCj4KPiB2My4gLSBSZWJhc2VkCj4gICAgIC0gQWRkIGNsayBzdHVmZgo+Cj4g djIuIC0gQ29zbWV0aWMgZml4ZXMKPiAgICAgLSBQcm9wZXJseSAiYWxsb2NhdGUiIGRldmljZSBh ZGRyZXNzZXMgaW5zdGVhZCBvZiB1c2luZyBhIG5ldmVyCj4gICAgICAgcmVzZXQgY291bnRlcgo+ ICAgICAtIE1vdmUgLmR0c2kgdXBkYXRlcyB0byBhIGRpZmZlcmVudCBwYXRjaAo+Cj4gZm9vCj4K PiBnb28KPiAtLS0KPiAgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnICAgICAgICAgICAg ICB8ICAgMiArCj4gIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUgICAgICAgICAgICAg fCAgIDEgKwo+ICBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWcgIHwg ICA2ICsKPiAgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9NYWtlZmlsZSB8ICAg MyArCj4gIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvY29yZS5jICAgfCA0Mjkg KysrKysrKysrKysrKysKPiAgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9kZXYu YyAgICB8IDU4MCArKysrKysrKysrKysrKysrKysrCj4gIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMv YXNwZWVkLXZodWIvZXAwLmMgICAgfCA0NzQgKysrKysrKysrKysrKysrKwo+ICBkcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vwbi5jICAgIHwgODQwICsrKysrKysrKysrKysrKysr KysrKysrKysrKysKPiAgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9odWIuYyAg ICB8IDgyMiArKysrKysrKysrKysrKysrKysrKysrKysrKysKPiAgZHJpdmVycy91c2IvZ2FkZ2V0 L3VkYy9hc3BlZWQtdmh1Yi92aHViLmggICB8IDQ5NiArKysrKysrKysrKysrKysrCj4gIDEwIGZp bGVzIGNoYW5nZWQsIDM2NTMgaW5zZXJ0aW9ucygrKQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnCj4gIGNyZWF0ZSBtb2RlIDEw MDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL01ha2VmaWxlCj4gIGNyZWF0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUuYwo+ ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9k ZXYuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQt dmh1Yi9lcDAuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9h c3BlZWQtdmh1Yi9lcG4uYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0 L3VkYy9hc3BlZWQtdmh1Yi9odWIuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2Iv Z2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi92aHViLmgKPgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcKPiBp bmRleCAxZTk1NjcwOTFkODYuLjE0Y2YzMWEyNzAzYSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL0tjb25maWcKPiArKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25m aWcKPiBAQCAtNDM5LDYgKzQzOSw4IEBAIGNvbmZpZyBVU0JfR0FER0VUX1hJTElOWAo+ICAJICBk eW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAidWRjLXhpbGlueCIgYW5kIGZvcmNlIGFs bAo+ICAJICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KPiAg Cj4gK3NvdXJjZSAiZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnIgo+ ICsKPiAgIwo+ICAjIExBU1QgLS0gZHVtbXkvZW11bGF0ZWQgY29udHJvbGxlcgo+ICAjCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9n YWRnZXQvdWRjL01ha2VmaWxlCj4gaW5kZXggY2U4NjViMTI5ZmQ2Li44OTdmNjQ4ZjNjZjEgMTAw NjQ0Cj4gLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZQo+ICsrKyBiL2RyaXZl cnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUKPiBAQCAtMzksNCArMzksNSBAQCBvYmotJChDT05G SUdfVVNCX01WX1UzRCkJKz0gbXZfdTNkX2NvcmUubwo+ICBvYmotJChDT05GSUdfVVNCX0dSX1VE QykJKz0gZ3JfdWRjLm8KPiAgb2JqLSQoQ09ORklHX1VTQl9HQURHRVRfWElMSU5YKQkrPSB1ZGMt eGlsaW54Lm8KPiAgb2JqLSQoQ09ORklHX1VTQl9TTlBfVURDX1BMQVQpICs9IHNucHNfdWRjX3Bs YXQubwo+ICtvYmotJChDT05GSUdfVVNCX0FTUEVFRF9WSFVCKQkrPSBhc3BlZWQtdmh1Yi8KPiAg b2JqLSQoQ09ORklHX1VTQl9CRENfVURDKQkrPSBiZGMvCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv dXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC91 ZGMvYXNwZWVkLXZodWIvS2NvbmZpZwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAw MDAwMDAwMDAwLi5jYjAyMmM4ODU0MjUKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy91 c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnCj4gQEAgLTAsMCArMSw2IEBACj4gK2Nv bmZpZyBVU0JfQVNQRUVEX1ZIVUIKPiArCXRyaXN0YXRlICJBc3BlZWQgdkh1YiBVREMgZHJpdmVy Igo+ICsJZGVwZW5kcyBvbiBBUkNIX0FTUEVFRCB8fCBDT01QSUxFX1RFU1QKPiArCWhlbHAKPiAr CSAgVVNCIHBlcmlwaGVyYWwgY29udHJvbGxlciBmb3IgdGhlIEFzcGVlZCBBU1QyNTAwIGZhbWls eQo+ICsJICBTb0NzIHN1cHBvcnRpbmcgdGhlICJ2SHViIiBmdW5jdGlvbmFsaXR5IGFuZCBVU0Iy LjAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9NYWtl ZmlsZSBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvTWFrZWZpbGUKPiBuZXcg ZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uNDI1NjI2NmMwYThhCj4gLS0t IC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvTWFr ZWZpbGUKPiBAQCAtMCwwICsxLDMgQEAKPiArb2JqLSQoQ09ORklHX1VTQl9BU1BFRURfVkhVQikJ Kz0gYXNwZWVkLXZodWIubwo+ICthc3BlZWQtdmh1Yi15CTo9IGNvcmUubyBlcDAubyBlcG4ubyBk ZXYubyBodWIubwo+ICsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3Bl ZWQtdmh1Yi9jb3JlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUu Ywo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi4zMWVkMmI2ZTI0 MWIKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQt dmh1Yi9jb3JlLmMKPiBAQCAtMCwwICsxLDQyOSBAQAoKbWlzc2luZyBTUERYIGxpY2Vuc2UgaWRl bnRpZmllciAoYWxsIGZpbGVzKQoKPiArc3RhdGljIGJvb2wgZm9yY2VfdXNiMSA9IGZhbHNlOwo+ ICtzdGF0aWMgYm9vbCBub19kbWFfZGVzYyA9IGZhbHNlOwo+ICsKPiArbW9kdWxlX3BhcmFtX25h bWVkKGZvcmNlX3VzYjEsIGZvcmNlX3VzYjEsIGJvb2wsIDA2NDQpOwo+ICtNT0RVTEVfUEFSTV9E RVNDKGZvcmNlX3VzYjEsICJTZXQgdG8gdHJ1ZSB0byBmb3JjZSB0byBVU0IxIHNwZWVkIik7Cj4g K21vZHVsZV9wYXJhbV9uYW1lZChub19kbWFfZGVzYywgbm9fZG1hX2Rlc2MsIGJvb2wsIDA2NDQp Owo+ICtNT0RVTEVfUEFSTV9ERVNDKG5vX2RtYV9kZXNjLCAiU2V0IHRvIHRydWUgdG8gZGlzYWJs ZSB1c2Ugb2YgRE1BIGRlc2NyaXB0b3JzIik7Cgptb2R1bGUgcGFyYW1ldGVycz8gU29ycnksIGJ1 dCBuby4KCj4gK3ZvaWQgYXN0X3ZodWJfZG9uZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBzdHJ1 Y3QgYXN0X3ZodWJfcmVxICpyZXEsCj4gKwkJICAgaW50IHN0YXR1cykKPiArewo+ICsJYm9vbCBp bnRlcm5hbCA9IHJlcS0+aW50ZXJuYWw7Cj4gKwo+ICsJRVBWREJHKGVwLCAiY29tcGxldGluZyBy ZXF1ZXN0IEAlcCwgc3RhdHVzICVkXG4iLCByZXEsIHN0YXR1cyk7Cj4gKwo+ICsJbGlzdF9kZWxf aW5pdCgmcmVxLT5xdWV1ZSk7Cj4gKwo+ICsJaWYgKHJlcS0+cmVxLnN0YXR1cyA9PSAtRUlOUFJP R1JFU1MpCj4gKwkJcmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOwo+ICsKPiArCWlmIChyZXEtPnJl cS5kbWEpIHsKPiArCQlpZiAoIVdBUk5fT04oIWVwLT5kZXYpKQo+ICsJCQl1c2JfZ2FkZ2V0X3Vu bWFwX3JlcXVlc3QoJmVwLT5kZXYtPmdhZGdldCwKPiArCQkJCQkJICZyZXEtPnJlcSwgZXAtPmVw bi5pc19pbik7Cj4gKwkJcmVxLT5yZXEuZG1hID0gMDsKPiArCX0KPiArCj4gKwkvKgo+ICsJICog SWYgdGhpcyBpc24ndCBhbiBpbnRlcm5hbCBFUDAgcmVxdWVzdCwgY2FsbCB0aGUgY29yZQo+ICsJ ICogdG8gY2FsbCB0aGUgZ2FkZ2V0IGNvbXBsZXRpb24uCj4gKwkgKi8KPiArCWlmICghaW50ZXJu YWwpIHsKPiArCQlzcGluX3VubG9jaygmZXAtPnZodWItPmxvY2spOwo+ICsJCXVzYl9nYWRnZXRf Z2l2ZWJhY2tfcmVxdWVzdCgmZXAtPmVwLCAmcmVxLT5yZXEpOwo+ICsJCXNwaW5fbG9jaygmZXAt PnZodWItPmxvY2spOwo+ICsJfQo+ICt9Cj4gKwo+ICt2b2lkIGFzdF92aHViX251a2Uoc3RydWN0 IGFzdF92aHViX2VwICplcCwgaW50IHN0YXR1cykKPiArewo+ICsJc3RydWN0IGFzdF92aHViX3Jl cSAqcmVxOwo+ICsKPiArCUVQREJHKGVwLCAiTnVraW5nXG4iKTsKPiArCj4gKwkvKiB0ZXJtaW5h dGUgYW55IHJlcXVlc3QgaW4gdGhlIHF1ZXVlICovCj4gKwlpZiAobGlzdF9lbXB0eSgmZXAtPnF1 ZXVlKSkKPiArCQlyZXR1cm47Cgp1bm5lY2Vzc2FyeSB0ZXN0LgoKPiArCj4gKwkvKiBCZXdhcmUs IGxvY2sgd2lsbCBiZSBkcm9wcGVkICYgcmVxLWFjcXVpcmVkIGJ5IGRvbmUoKSAqLwo+ICsJd2hp bGUgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7Cj4gKwkJcmVxID0gbGlzdF9maXJzdF9lbnRy eSgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CgpsaXN0X2Zvcl9lYWNo X2VudHJ5X3NhZmUoKSA/PwoKPiArCQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEsIHN0YXR1cyk7Cj4g Kwl9Cj4gK30KPiArCj4gK3N0cnVjdCB1c2JfcmVxdWVzdCAqYXN0X3ZodWJfYWxsb2NfcmVxdWVz dChzdHJ1Y3QgdXNiX2VwICp1X2VwLAo+ICsJCQkJCSAgIGdmcF90IGdmcF9mbGFncykKPiArewo+ ICsJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxOwo+ICsKPiArCXJlcSA9IGt6YWxsb2Moc2l6ZW9m KCpyZXEpLCBnZnBfZmxhZ3MpOwo+ICsJaWYgKCFyZXEpCj4gKwkJcmV0dXJuIE5VTEw7CgpEb24n dCB5b3Ugd2FubmEga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgZW5kcG9pbnQgdGhhdCBvd25zICR0 aGlzCnJlcXVlc3Q/Cgo+ICsJSU5JVF9MSVNUX0hFQUQoJnJlcS0+cXVldWUpOwoKdW5uZWNlc3Nh cnkgbGlzdCBpbml0aWFsaXphdGlvbgoKPiArCXJldHVybiAmcmVxLT5yZXE7Cj4gK30KPiArCj4g K3ZvaWQgYXN0X3ZodWJfZnJlZV9yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKnVfZXAsIHN0cnVjdCB1 c2JfcmVxdWVzdCAqdV9yZXEpCj4gK3sKPiArCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSA9IHRv X2FzdF9yZXEodV9yZXEpOwo+ICsKPiArCWtmcmVlKHJlcSk7Cj4gK30KPiArCj4gK3N0YXRpYyBp cnFyZXR1cm5fdCBhc3Rfdmh1Yl9pcnEgKGludCBpcnEsIHZvaWQgKmRhdGEpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBeCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB1bm5lY2Vzc2FyeSBzcGFjZQoKPiArewo+ICsJc3RydWN0IGFzdF92aHViICp2aHViID0gZGF0 YTsKPiArCWlycXJldHVybl90IGlyZXQgPSBJUlFfTk9ORTsKPiArCXUzMiBpc3RhdDsKPiArCj4g KwkvKiBTdGFsZSBpbnRlcnJ1cHQgd2hpbGUgdGVhcmluZyBkb3duICovCj4gKwlpZiAoIXZodWIt PmVwMF9idWZzKQo+ICsJCXJldHVybiBJUlFfTk9ORTsKPiArCj4gKwlzcGluX2xvY2soJnZodWIt PmxvY2spOwoKdGhpcyBpcyB5b3VyIGhhcmRpcnEgaGFuZGxlciByaWdodD8gRG8geW91IHJlYWxs eSBuZWVkIHRoaXMgbG9jayBoZXJlPwoKPiArCj4gKwkvKiBSZWFkIGFuZCBBQ0sgaW50ZXJydXB0 cyAqLwo+ICsJaXN0YXQgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfSVNSKTsKPiArCWlm ICghaXN0YXQpCj4gKwkJZ290byBiYWlsOwo+ICsJd3JpdGVsKGlzdGF0LCB2aHViLT5yZWdzICsg QVNUX1ZIVUJfSVNSKTsKPiArCWlyZXQgPSBJUlFfSEFORExFRDsKPiArCj4gKwlVRENWREJHKHZo dWIsICJpcnEgc3RhdHVzPSUwOHgsIGVwX2Fja3M9JTA4eCBlcF9uYWNrcz0lMDh4XG4iLAo+ICsJ ICAgICAgIGlzdGF0LAo+ICsJICAgICAgIHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9B Q0tfSVNSKSwKPiArCSAgICAgICByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfTkFDS19J U1IpKTsKPiArCj4gKwkvKiBIYW5kbGUgZ2VuZXJpYyBFUHMgZmlyc3QgKi8KPiArCWlmIChpc3Rh dCAmIFZIVUJfSVJRX0VQX1BPT0xfQUNLX1NUQUxMKSB7Cj4gKwkJdTMyIGksIGVwX2Fja3MgPSBy ZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUik7Cj4gKwkJd3JpdGVsKGVwX2Fj a3MsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKTsKPiArCj4gKwkJLyogQ2hlY2sg aWYgd2UgaGF2ZSBhIHVzZWZ1bCBmZnMgb24gYXJtIC4uLiAqLwo+ICsJCWZvciAoaSA9IDA7IGVw X2Fja3MgJiYgaSA8IEFTVF9WSFVCX05VTV9HRU5fRVBzOyBpKyspIHsKPiArCQkJdTMyIG1hc2sg PSAxIDw8IGk7Cj4gKwkJCWlmIChlcF9hY2tzICYgbWFzaykgewo+ICsJCQkJYXN0X3ZodWJfZXBu X2Fja19pcnEoJnZodWItPmVwbnNbaV0pOwo+ICsJCQkJZXBfYWNrcyAmPSB+bWFzazsKPiArCQkJ fQo+ICsJCX0KPiArCX0KPiArCj4gKwkvKiBIYW5kbGUgZGV2aWNlIGludGVycnVwdHMgKi8KPiAr CWlmIChpc3RhdCAmIChWSFVCX0lSUV9ERVZJQ0UxIHwKPiArCQkgICAgIFZIVUJfSVJRX0RFVklD RTIgfAo+ICsJCSAgICAgVkhVQl9JUlFfREVWSUNFMyB8Cj4gKwkJICAgICBWSFVCX0lSUV9ERVZJ Q0U0IHwKPiArCQkgICAgIFZIVUJfSVJRX0RFVklDRTUpKSB7Cj4gKwkJaWYgKGlzdGF0ICYgVkhV Ql9JUlFfREVWSUNFMSkKPiArCQkJYXN0X3ZodWJfZGV2X2lycSgmdmh1Yi0+cG9ydHNbMF0uZGV2 KTsKPiArCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0UyKQo+ICsJCQlhc3Rfdmh1Yl9kZXZf aXJxKCZ2aHViLT5wb3J0c1sxXS5kZXYpOwo+ICsJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0RFVklD RTMpCj4gKwkJCWFzdF92aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzJdLmRldik7Cj4gKwkJaWYg KGlzdGF0ICYgVkhVQl9JUlFfREVWSUNFNCkKPiArCQkJYXN0X3ZodWJfZGV2X2lycSgmdmh1Yi0+ cG9ydHNbM10uZGV2KTsKPiArCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0U1KQo+ICsJCQlh c3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1s0XS5kZXYpOwo+ICsJfQo+ICsKPiArCS8qIEhh bmRsZSB0b3AtbGV2ZWwgdkh1YiBFUDAgaW50ZXJydXB0cyAqLwo+ICsJaWYgKGlzdGF0ICYgKFZI VUJfSVJRX0hVQl9FUDBfT1VUX0FDS19TVEFMTCB8Cj4gKwkJICAgICBWSFVCX0lSUV9IVUJfRVAw X0lOX0FDS19TVEFMTCB8Cj4gKwkJICAgICBWSFVCX0lSUV9IVUJfRVAwX1NFVFVQKSkgewo+ICsJ CWlmIChpc3RhdCAmIFZIVUJfSVJRX0hVQl9FUDBfSU5fQUNLX1NUQUxMKQo+ICsJCQlhc3Rfdmh1 Yl9lcDBfaGFuZGxlX2Fjaygmdmh1Yi0+ZXAwLCB0cnVlKTsKPiArCQlpZiAoaXN0YXQgJiBWSFVC X0lSUV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwpCj4gKwkJCWFzdF92aHViX2VwMF9oYW5kbGVfYWNr KCZ2aHViLT5lcDAsIGZhbHNlKTsKPiArCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9IVUJfRVAwX1NF VFVQKQo+ICsJCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX3NldHVwKCZ2aHViLT5lcDApOwo+ICsJfQo+ ICsKPiArCS8qIFZhcmlvdXMgdG9wIGxldmVsIGJ1cyBldmVudHMgKi8KPiArCWlmIChpc3RhdCAm IChWSFVCX0lSUV9CVVNfUkVTVU1FIHwKPiArCQkgICAgIFZIVUJfSVJRX0JVU19TVVNQRU5EIHwK PiArCQkgICAgIFZIVUJfSVJRX0JVU19SRVNFVCkpIHsKPiArCQlpZiAoaXN0YXQgJiBWSFVCX0lS UV9CVVNfUkVTVU1FKQo+ICsJCQlhc3Rfdmh1Yl9odWJfcmVzdW1lKHZodWIpOwo+ICsJCWlmIChp c3RhdCAmIFZIVUJfSVJRX0JVU19TVVNQRU5EKQo+ICsJCQlhc3Rfdmh1Yl9odWJfc3VzcGVuZCh2 aHViKTsKPiArCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9CVVNfUkVTRVQpCj4gKwkJCWFzdF92aHVi X2h1Yl9yZXNldCh2aHViKTsKPiArCX0KPiArCj4gKyBiYWlsOgo+ICsJc3Bpbl91bmxvY2soJnZo dWItPmxvY2spOwo+ICsJcmV0dXJuIGlyZXQ7Cj4gK30KPiArCj4gK3ZvaWQgYXN0X3ZodWJfaW5p dF9odyhzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpCj4gK3sKPiArCXUzMiBjdHJsOwo+ICsKPiArCVVE Q0RCRyh2aHViLCIoUmUpU3RhcnRpbmcgSFcgLi4uXG4iKTsKPiArCj4gKwkvKiBFbmFibGUgUEhZ ICovCj4gKwljdHJsID0gVkhVQl9DVFJMX1BIWV9DTEsgfAo+ICsJCVZIVUJfQ1RSTF9QSFlfUkVT RVRfRElTOwo+ICsKPiArI2lmIDAgLyoKPiArICAgICAgICogVGhpcyBjYXVzZXMgcmVnaXN0ZXJz IHRvIGJlY29tZSBpbmFjY2Vzc2libGUgZHVyaW5nCj4gKyAgICAgICAqIHN1c3BlbmQuIE5lZWQg dG8gZmlndXJlIG91dCBob3cgdG8gYnJpbmcgdGhlIGNvbnRyb2xsZXIKPiArICAgICAgICogYmFj ayBpbnRvIGxpZmUgdG8gaXNzdWUgYSB3YWtldXAuCj4gKyAgICAgICAqLwo+ICsJY3RybCB8PSBW SFVCX0NUUkxfQ0xLX1NUT1BfU1VTUEVORDsKPiArI2VuZGlmCgpubyBjb21tZW50ZWQgY29kZS4K Cj4gKwkvKgo+ICsJICogU2V0IHNvbWUgSVNPICYgc3BsaXQgY29udHJvbCBiaXRzIGFjY29yZGlu ZyB0byBBc3BlZWQKPiArCSAqIHJlY29tbWVuZGF0aW9uCj4gKwkgKgo+ICsJICogVkhVQl9DVFJM X0lTT19SU1BfQ1RSTDogV2hlbiBzZXQgdGVsbHMgdGhlIEhXIHRvIHJlc3BvbmQKPiArCSAqIHdp dGggMCBieXRlcyBkYXRhIHBhY2tldCB0byBJU08gSU4gZW5kcG9pbnRzIHdoZW4gbm8gZGF0YQo+ ICsJICogaXMgYXZhaWxhYmxlLgo+ICsJICoKPiArCSAqIFZIVUJfQ1RSTF9TUExJVF9JTjogVGhp cyBtYWtlcyBhIFNPRiBjb21wbGV0ZSBhIHNwbGl0IElOCj4gKwkgKiB0cmFuc2FjdGlvbi4KPiAr CSAqLwo+ICsJY3RybCB8PSBWSFVCX0NUUkxfSVNPX1JTUF9DVFJMIHwgVkhVQl9DVFJMX1NQTElU X0lOOwo+ICsJd3JpdGVsKGN0cmwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DVFJMKTsKPiArCXVk ZWxheSgxKTsKPiArCj4gKwkvKiBTZXQgZGVzY3JpcHRvciByaW5nIHNpemUgKi8KPiArI2lmIEFT VF9WSFVCX0RFU0NTX0NPVU5UID09IDI1Ngo+ICsJY3RybCB8PSBWSFVCX0NUUkxfTE9OR19ERVND Owo+ICsJd3JpdGVsKGN0cmwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DVFJMKTsKPiArI2VsaWYg QVNUX1ZIVUJfREVTQ1NfQ09VTlQgIT0gMzIKPiArCSNlcnJvciBJbnZhbGlkIEFTVF9WSFVCX0RF U0NTX0NPVU5UCj4gKyNlbmRpZgoKZmluZCBhIGJldHRlciB3YXkgZm9yIHRoaXMuIE5vIGlmZGVm cwoKPiArCj4gKwkvKiBSZXNldCBhbGwgZGV2aWNlcyAqLwo+ICsJd3JpdGVsKDB4MzNmLCB2aHVi LT5yZWdzICsgQVNUX1ZIVUJfU1dfUkVTVCk7CgpubyBtYWdpYyBjb25zdGFudHMuLi4KCj4gKwl1 ZGVsYXkoMSk7Cj4gKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX1NXX1JFU1QpOwo+ ICsKPiArCS8qIERpc2FibGUgYW5kIGNsZWFudXAgRVAgQUNLL05BQ0sgaW50ZXJydXB0cyAqLwo+ ICsJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVSKTsKPiArCXdyaXRl bCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfTkFDS19JRVIpOwo+ICsJd3JpdGVsKDB4ZmZm ZmZmZmYsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKTsKPiArCXdyaXRlbCgweGZm ZmZmZmZmLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfTkFDS19JU1IpOwoKLi4uIG9mIGFueSBr aW5kCgo+ICsJLyogRGVmYXVsdCBzZXR0aW5ncyBmb3IgRVAwLCBlbmFibGUgSFcgaHViIEVQMSAq Lwo+ICsJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDBfQ1RSTCk7Cj4gKwl3cml0 ZWwoVkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dHTEUgfAo+ICsJICAgICAgIFZIVUJfRVAxX0NUUkxf RU5BQkxFLAo+ICsJICAgICAgIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDFfQ1RSTCk7Cj4gKwl3 cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9TVFNfQ0hHKTsKPiArCj4gKwkvKiBD b25maWd1cmUgRVAwIERNQSBidWZmZXIgKi8KPiArCXdyaXRlbCh2aHViLT5lcDAuYnVmX2RtYSwg dmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9EQVRBKTsKPiArCj4gKwkvKiBDbGVhciBhZGRyZXNz ICovCj4gKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NPTkYpOwo+ICsKPiArCS8q IFB1bGx1cCBodWIgKGFjdGl2YXRlIG9uIGhvc3QpICovCj4gKwlpZiAodmh1Yi0+Zm9yY2VfdXNi MSkKPiArCQljdHJsIHw9IFZIVUJfQ1RSTF9GVUxMX1NQRUVEX09OTFk7Cj4gKwljdHJsIHw9IFZI VUJfQ1RSTF9VUFNUUkVBTV9DT05ORUNUOwo+ICsJd3JpdGVsKGN0cmwsIHZodWItPnJlZ3MgKyBB U1RfVkhVQl9DVFJMKTsKPiArCj4gKwkvKiBFbmFibGUgc29tZSBpbnRlcnJ1cHRzICovCj4gKwl3 cml0ZWwoVkhVQl9JUlFfSFVCX0VQMF9JTl9BQ0tfU1RBTEwgfAo+ICsJICAgICAgIFZIVUJfSVJR X0hVQl9FUDBfT1VUX0FDS19TVEFMTCB8Cj4gKwkgICAgICAgVkhVQl9JUlFfSFVCX0VQMF9TRVRV UCB8Cj4gKwkgICAgICAgVkhVQl9JUlFfRVBfUE9PTF9BQ0tfU1RBTEwgfAo+ICsJICAgICAgIFZI VUJfSVJRX0JVU19SRVNVTUUgfAo+ICsJICAgICAgIFZIVUJfSVJRX0JVU19TVVNQRU5EIHwKPiAr CSAgICAgICBWSFVCX0lSUV9CVVNfUkVTRVQsCj4gKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9W SFVCX0lFUik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgYXN0X3ZodWJfcmVtb3ZlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiArCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IHBs YXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCWlu dCBpOwo+ICsKPiArCWlmICghdmh1YiB8fCAhdmh1Yi0+cmVncykKPiArCQlyZXR1cm4gMDsKPiAr Cj4gKwkvKiBSZW1vdmUgZGV2aWNlcyAqLwo+ICsJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05V TV9QT1JUUzsgaSsrKQo+ICsJCWFzdF92aHViX2RlbF9kZXYoJnZodWItPnBvcnRzW2ldLmRldik7 Cj4gKwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKPiArCj4gKwkv KiBNYXNrICYgYWNrIGFsbCBpbnRlcnJ1cHRzICAqLwo+ICsJd3JpdGVsKDAsIHZodWItPnJlZ3Mg KyBBU1RfVkhVQl9JRVIpOwo+ICsJd3JpdGVsKFZIVUJfSVJRX0FDS19BTEwsIHZodWItPnJlZ3Mg KyBBU1RfVkhVQl9JU1IpOwo+ICsKPiArCS8qIFB1bGwgZGV2aWNlLCBsZWF2ZSBQSFkgZW5hYmxl ZCAqLwo+ICsJd3JpdGVsKFZIVUJfQ1RSTF9QSFlfQ0xLIHwKPiArCSAgICAgICBWSFVCX0NUUkxf UEhZX1JFU0VUX0RJUywKPiArCSAgICAgICB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7Cj4g Kwo+ICsJaWYgKHZodWItPmNsaykKPiArCQljbGtfZGlzYWJsZV91bnByZXBhcmUodmh1Yi0+Y2xr KTsKPiArCj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7Cj4g Kwo+ICsJaWYgKHZodWItPmVwMF9idWZzKQo+ICsJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5k ZXYsCj4gKwkJCQkgIEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUICoKPiArCQkJCSAgKEFTVF9WSFVC X05VTV9QT1JUUyArIDEpLAo+ICsJCQkJICB2aHViLT5lcDBfYnVmcywKPiArCQkJCSAgdmh1Yi0+ ZXAwX2J1ZnNfZG1hKTsKPiArCXZodWItPmVwMF9idWZzID0gTlVMTDsKPiArCj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiArc3RhdGljIGludCBhc3Rfdmh1Yl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWI7Cj4gKwlzdHJ1Y3Qg cmVzb3VyY2UgKnJlczsKPiArCWludCBpLCByYyA9IDA7Cj4gKwo+ICsJdmh1YiA9IGRldm1fa3ph bGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnZodWIpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghdmh1 YikKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlzcGluX2xvY2tfaW5pdCgmdmh1Yi0+bG9j ayk7Cj4gKwl2aHViLT5wZGV2ID0gcGRldjsKPiArCXZodWItPmZvcmNlX3VzYjEgPSBmb3JjZV91 c2IxOwo+ICsJdmh1Yi0+bm9fZG1hX2Rlc2MgPSBub19kbWFfZGVzYzsKPiArCj4gKwlyZXMgPSBw bGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwo+ICsJdmh1Yi0+ cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwo+ICsJaWYgKElT X0VSUih2aHViLT5yZWdzKSkgewo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBt YXAgcmVzb3VyY2VzXG4iKTsKPiArCQlyZXR1cm4gUFRSX0VSUih2aHViLT5yZWdzKTsKPiArCX0K PiArCVVEQ0RCRyh2aHViLCAidkh1YkAlcFIgbWFwcGVkIEAlcFxuIiwgcmVzLCB2aHViLT5yZWdz KTsKPiArCj4gKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB2aHViKTsKPiArCj4gKwl2aHVi LT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7Cj4gKyAgICAgICAgaWYgKElT X0VSUih2aHViLT5jbGspKSB7Cj4gKyAgICAgICAgICAgICAgICByYyA9IFBUUl9FUlIodmh1Yi0+ Y2xrKTsKPiArICAgICAgICAgICAgICAgIGdvdG8gZXJyOwo+ICsgICAgICAgIH0KPiArCXJjID0g Y2xrX3ByZXBhcmVfZW5hYmxlKHZodWItPmNsayk7Cj4gKwlpZiAocmMpIHsKPiArCQlkZXZfZXJy KCZwZGV2LT5kZXYsICJFcnJvciBjb3VsZG4ndCBlbmFibGUgY2xvY2sgKCVkKVxuIiwgcmMpOwo+ ICsJCWdvdG8gZXJyOwo+ICsgICAgICAgIH0KPiArCj4gKwkvKiBNYXNrICYgYWNrIGFsbCBpbnRl cnJ1cHRzIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBoYW5kbGVyICovCj4gKwl3cml0ZWwoMCwgdmh1 Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7Cj4gKwl3cml0ZWwoVkhVQl9JUlFfQUNLX0FMTCwgdmh1 Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7Cj4gKwo+ICsJLyogRmluZCBpbnRlcnJ1cHQgYW5kIGlu c3RhbGwgaGFuZGxlciAqLwo+ICsJdmh1Yi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAw KTsKPiArCWlmICh2aHViLT5pcnEgPCAwKSB7Cj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFp bGVkIHRvIGdldCBpbnRlcnJ1cHRcbiIpOwo+ICsJCXJjID0gdmh1Yi0+aXJxOwo+ICsJCWdvdG8g ZXJyOwo+ICsJfQo+ICsJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHZodWItPmly cSwgYXN0X3ZodWJfaXJxLCAwLAo+ICsJCQkgICAgICBLQlVJTERfTU9ETkFNRSwgdmh1Yik7Cgp3 ZSB1c3VhbGx5IHJlbHkgb24gdGhlIGRldmljZSBuYW1lLCBidXQgb2theS4K