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: [V2,4/5] usb: serial: f81534: add H/W disable port support From: "Ji-Ze Hong \(Peter Hong\)" Message-Id: <1515032961-29131-4-git-send-email-hpeter+linux_kernel@gmail.com> Date: Thu, 4 Jan 2018 10:29:20 +0800 To: johan@kernel.org Cc: gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, peter_hong@fintek.com.tw, "Ji-Ze Hong \(Peter Hong\)" List-ID: VGhlIEY4MTUzMi81MzQgY2FuIGJlIGRpc2FibGUgcG9ydCBieSBtYW51ZmFjdHVyZXIgd2l0aApm b2xsb3dpbmcgSC9XIGRlc2lnbi4KICAgIDE6IENvbm5lY3QgRENEL0RTUi9DVFMvUkkgcGluIHRv IGdyb3VuZC4KICAgIDI6IENvbm5lY3QgUlggcGluIHRvIGdyb3VuZC4KCkluIGRyaXZlciwgd2Un bGwgaW1wbGVtZW50cyBzb21lIGRldGVjdCBtZXRob2QgbGlrZXMgZm9sbG93aW5nOgogICAgMTog UmVhZCBNU1IuCiAgICAyOiBUdXJuIE1DUiBMT09QIGJpdCBvbiwgb2ZmIGFuZCByZWFkIExTUiBh ZnRlciBkZWxheSB3aXRoIDYwbXMuCiAgICAgICBJdCdsbCBjb250YWluIEJSRUFLIHN0YXR1cyBp biBMU1IuCgpTaWduZWQtb2ZmLWJ5OiBKaS1aZSBIb25nIChQZXRlciBIb25nKSA8aHBldGVyK2xp bnV4X2tlcm5lbEBnbWFpbC5jb20+Ci0tLQpWMjoKCTE6IGY4MTUzNF9jaGVja19wb3J0X2h3X2Rp c2FibGVkKCkgY2hhbmdlIHJldHVybiB0eXBlIGZyb20gaW50IHRvIGJvb2wuCgkyOiBBZGQgaGVs cCBmdW5jdGlvbiBmODE1MzRfc2V0X3BoeV9wb3J0X3JlZ2lzdGVyKCkgLwoJICAgZjgxNTM0X2dl dF9waHlfcG9ydF9yZWdpc3RlcigpIGZvciBmODE1MzRfY2hlY2tfcG9ydF9od19kaXNhYmxlZCgp CgkgICB0byByZWFkIHJlZ2lzdGVyIHdpdGhvdXQgcG9ydC4KCTM6IFJlLXdyaXRlIGY4MTUzNF9j YWxjX251bV9wb3J0cygpICYgZjgxNTM0X2F0dGFjaCgpIHRvIHJlZHVjZSB0aGUKCSAgIGY4MTUz NF9jaGVja19wb3J0X2h3X2Rpc2FibGVkKCkgcmVwZWF0ZWRseSBjYWxsZWQuCgogZHJpdmVycy91 c2Ivc2VyaWFsL2Y4MTUzNC5jIHwgMTYwICsrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0t LS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgOTkgaW5zZXJ0aW9ucygrKSwgNjEgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Y4MTUzNC5jIGIvZHJpdmVy cy91c2Ivc2VyaWFsL2Y4MTUzNC5jCmluZGV4IDdmMTc1ZjM5YTE3MS4uYTQ2NjYxNzEyMzlhIDEw MDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZjgxNTM0LmMKKysrIGIvZHJpdmVycy91c2Iv c2VyaWFsL2Y4MTUzNC5jCkBAIC0zMDcsNiArMzA3LDIwIEBAIHN0YXRpYyBpbnQgZjgxNTM0X3Nl dF9tYXNrX3JlZ2lzdGVyKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIHUxNiByZWcsCiAJcmV0 dXJuIGY4MTUzNF9zZXRfcmVnaXN0ZXIoc2VyaWFsLCByZWcsIHRtcCk7CiB9CiAKK3N0YXRpYyBp bnQgZjgxNTM0X3NldF9waHlfcG9ydF9yZWdpc3RlcihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFs LCBpbnQgcGh5LAorCQkJCQl1MTYgcmVnLCB1OCBkYXRhKQoreworCXJldHVybiBmODE1MzRfc2V0 X3JlZ2lzdGVyKHNlcmlhbCwgcmVnICsgRjgxNTM0X1VBUlRfT0ZGU0VUICogcGh5LAorCQkJCQlk YXRhKTsKK30KKworc3RhdGljIGludCBmODE1MzRfZ2V0X3BoeV9wb3J0X3JlZ2lzdGVyKHN0cnVj dCB1c2Jfc2VyaWFsICpzZXJpYWwsIGludCBwaHksCisJCQkJCXUxNiByZWcsIHU4ICpkYXRhKQor eworCXJldHVybiBmODE1MzRfZ2V0X3JlZ2lzdGVyKHNlcmlhbCwgcmVnICsgRjgxNTM0X1VBUlRf T0ZGU0VUICogcGh5LAorCQkJCQlkYXRhKTsKK30KKwogc3RhdGljIGludCBmODE1MzRfc2V0X3Bv cnRfcmVnaXN0ZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgdTE2IHJlZywKIAkJCQkJ dTggZGF0YSkKIHsKQEAgLTczMCw2ICs3NDQsNzAgQEAgc3RhdGljIGludCBmODE1MzRfZmluZF9j b25maWdfaWR4KHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIHU4ICppbmRleCkKIH0KIAogLyoK KyAqIFRoZSBGODE1MzIvNTM0IHdpbGwgbm90IHJlcG9ydCBzZXJpYWwgcG9ydCB0byBVU0Igc2Vy aWFsIHN1YnN5c3RlbSB3aGVuCisgKiBIL1cgRENEL0RTUi9DVFMvUkkvUlggcGluIGNvbm5lY3Rl ZCB0byBncm91bmQuCisgKgorICogVG8gZGV0ZWN0IFJYIHBpbiBzdGF0dXMsIHdlJ2xsIGVuYWJs ZSBNQ1IgaW50ZXJhbCBsb29wYmFjaywgZGlzYWJsZSBpdCBhbmQKKyAqIGRlbGF5ZWQgZm9yIDYw bXMuIEl0IGNvbm5lY3RlZCB0byBncm91bmQgSWYgTFNSIHJlZ2lzdGVyIHJlcG9ydCBVQVJUX0xT Ul9CSS4KKyAqLworc3RhdGljIGJvb2wgZjgxNTM0X2NoZWNrX3BvcnRfaHdfZGlzYWJsZWQoc3Ry dWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgaW50IHBoeSkKK3sKKwlpbnQgc3RhdHVzOworCXU4IG9s ZF9tY3I7CisJdTggbXNyOworCXU4IGxzcjsKKwl1OCBtc3JfbWFzazsKKworCW1zcl9tYXNrID0g VUFSVF9NU1JfRENEIHwgVUFSVF9NU1JfUkkgfCBVQVJUX01TUl9EU1IgfCBVQVJUX01TUl9DVFM7 CisKKwlzdGF0dXMgPSBmODE1MzRfZ2V0X3BoeV9wb3J0X3JlZ2lzdGVyKHNlcmlhbCwgcGh5LAor CQkJCUY4MTUzNF9NT0RFTV9TVEFUVVNfUkVHLCAmbXNyKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1 cm4gZmFsc2U7CisKKwlpZiAoKG1zciAmIG1zcl9tYXNrKSAhPSBtc3JfbWFzaykKKwkJcmV0dXJu IGZhbHNlOworCisJc3RhdHVzID0gZjgxNTM0X3NldF9waHlfcG9ydF9yZWdpc3RlcihzZXJpYWws IHBoeSwKKwkJCQlGODE1MzRfRklGT19DT05UUk9MX1JFRywgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8g fAorCQkJCVVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKTsKKwlpZiAo c3RhdHVzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzdGF0dXMgPSBmODE1MzRfZ2V0X3BoeV9wb3J0 X3JlZ2lzdGVyKHNlcmlhbCwgcGh5LAorCQkJCUY4MTUzNF9NT0RFTV9DT05UUk9MX1JFRywgJm9s ZF9tY3IpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBmYWxzZTsKKworCXN0YXR1cyA9IGY4MTUz NF9zZXRfcGh5X3BvcnRfcmVnaXN0ZXIoc2VyaWFsLCBwaHksCisJCQkJRjgxNTM0X01PREVNX0NP TlRST0xfUkVHLCBVQVJUX01DUl9MT09QKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gZmFsc2U7 CisKKwlzdGF0dXMgPSBmODE1MzRfc2V0X3BoeV9wb3J0X3JlZ2lzdGVyKHNlcmlhbCwgcGh5LAor CQkJCUY4MTUzNF9NT0RFTV9DT05UUk9MX1JFRywgMHgwKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1 cm4gZmFsc2U7CisKKwltc2xlZXAoNjApOworCisJc3RhdHVzID0gZjgxNTM0X2dldF9waHlfcG9y dF9yZWdpc3RlcihzZXJpYWwsIHBoeSwKKwkJCQlGODE1MzRfTElORV9TVEFUVVNfUkVHLCAmbHNy KTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzdGF0dXMgPSBmODE1MzRfc2V0 X3BoeV9wb3J0X3JlZ2lzdGVyKHNlcmlhbCwgcGh5LAorCQkJCUY4MTUzNF9NT0RFTV9DT05UUk9M X1JFRywgb2xkX21jcik7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKChs c3IgJiBVQVJUX0xTUl9CSSkgPT0gVUFSVF9MU1JfQkkpCisJCXJldHVybiB0cnVlOworCisJcmV0 dXJuIGZhbHNlOworfQorCisvKgogICogV2UgaGFkIDIgZ2VuZXJhdGlvbiBvZiBGODE1MzIvNTM0 IElDLiBBbGwgaGFzIGFuIGludGVybmFsIHN0b3JhZ2UuCiAgKgogICogMXN0IGlzIHB1cmUgVVNC LXRvLVRUTCBSUzIzMiBJQyBhbmQgZGVzaWduZWQgZm9yIDQgcG9ydHMgb25seSwgbm8gYW55CkBA IC03NTAsMTEgKzgyOCwxMCBAQCBzdGF0aWMgaW50IGY4MTUzNF9maW5kX2NvbmZpZ19pZHgoc3Ry dWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgdTggKmluZGV4KQogc3RhdGljIGludCBmODE1MzRfY2Fs Y19udW1fcG9ydHMoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwKIAkJCQkJc3RydWN0IHVzYl9z ZXJpYWxfZW5kcG9pbnRzICplcGRzKQogeworCXN0cnVjdCBmODE1MzRfc2VyaWFsX3ByaXZhdGUg KnNlcmlhbF9wcml2OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzZXJpYWwtPmludGVyZmFjZS0+ ZGV2OwogCWludCBzaXplX2J1bGtfaW4gPSB1c2JfZW5kcG9pbnRfbWF4cChlcGRzLT5idWxrX2lu WzBdKTsKIAlpbnQgc2l6ZV9idWxrX291dCA9IHVzYl9lbmRwb2ludF9tYXhwKGVwZHMtPmJ1bGtf b3V0WzBdKTsKLQl1OCBzZXR0aW5nW0Y4MTUzNF9DVVNUT01fREFUQV9TSVpFXTsKLQl1OCBzZXR0 aW5nX2lkeDsKIAl1OCBudW1fcG9ydCA9IDA7CiAJaW50IHN0YXR1czsKIAlzaXplX3QgaTsKQEAg LTc2NSw4ICs4NDIsMTUgQEAgc3RhdGljIGludCBmODE1MzRfY2FsY19udW1fcG9ydHMoc3RydWN0 IHVzYl9zZXJpYWwgKnNlcmlhbCwKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJc2VyaWFsX3By aXYgPSBkZXZtX2t6YWxsb2MoJnNlcmlhbC0+aW50ZXJmYWNlLT5kZXYsCisJCQkJCXNpemVvZigq c2VyaWFsX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlcmlhbF9wcml2KQorCQlyZXR1cm4g LUVOT01FTTsKKworCXVzYl9zZXRfc2VyaWFsX2RhdGEoc2VyaWFsLCBzZXJpYWxfcHJpdik7CisK IAkvKiBDaGVjayBoYWQgY3VzdG9tIHNldHRpbmcgKi8KLQlzdGF0dXMgPSBmODE1MzRfZmluZF9j b25maWdfaWR4KHNlcmlhbCwgJnNldHRpbmdfaWR4KTsKKwlzdGF0dXMgPSBmODE1MzRfZmluZF9j b25maWdfaWR4KHNlcmlhbCwgJnNlcmlhbF9wcml2LT5zZXR0aW5nX2lkeCk7CiAJaWYgKHN0YXR1 cykgewogCQlkZXZfZXJyKCZzZXJpYWwtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGZpbmQgaWR4IGZh aWxlZDogJWRcbiIsCiAJCQkJX19mdW5jX18sIHN0YXR1cyk7CkBAIC03NzcsMTEgKzg2MSwxMiBA QCBzdGF0aWMgaW50IGY4MTUzNF9jYWxjX251bV9wb3J0cyhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2Vy aWFsLAogCSAqIFdlJ2xsIHJlYWQgY3VzdG9tIGRhdGEgb25seSB3aGVuIGRhdGEgYXZhaWxhYmxl LCBvdGhlcndpc2Ugd2UnbGwKIAkgKiByZWFkIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC4KIAkgKi8K LQlpZiAoc2V0dGluZ19pZHggIT0gRjgxNTM0X0NVU1RPTV9OT19DVVNUT01fREFUQSkgeworCWlm IChzZXJpYWxfcHJpdi0+c2V0dGluZ19pZHggIT0gRjgxNTM0X0NVU1RPTV9OT19DVVNUT01fREFU QSkgewogCQlzdGF0dXMgPSBmODE1MzRfcmVhZF9mbGFzaChzZXJpYWwsCiAJCQkJCQlGODE1MzRf Q1VTVE9NX0FERFJFU1NfU1RBUlQgKwogCQkJCQkJRjgxNTM0X0NPTkZfT0ZGU0VULAotCQkJCQkJ c2l6ZW9mKHNldHRpbmcpLCBzZXR0aW5nKTsKKwkJCQkJCXNpemVvZihzZXJpYWxfcHJpdi0+Y29u Zl9kYXRhKSwKKwkJCQkJCXNlcmlhbF9wcml2LT5jb25mX2RhdGEpOwogCQlpZiAoc3RhdHVzKSB7 CiAJCQlkZXZfZXJyKCZzZXJpYWwtPmludGVyZmFjZS0+ZGV2LAogCQkJCQkiJXM6IGdldCBjdXN0 b20gZGF0YSBmYWlsZWQ6ICVkXG4iLApAQCAtNzkxLDEzICs4NzYsMTMgQEAgc3RhdGljIGludCBm ODE1MzRfY2FsY19udW1fcG9ydHMoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwKIAogCQlkZXZf ZGJnKCZzZXJpYWwtPmludGVyZmFjZS0+ZGV2LAogCQkJCSIlczogcmVhZCBjb25maWcgZnJvbSBi bG9jazogJWRcbiIsIF9fZnVuY19fLAotCQkJCXNldHRpbmdfaWR4KTsKKwkJCQlzZXJpYWxfcHJp di0+c2V0dGluZ19pZHgpOwogCX0gZWxzZSB7CiAJCS8qIFJlYWQgZGVmYXVsdCBib2FyZCBzZXR0 aW5nICovCiAJCXN0YXR1cyA9IGY4MTUzNF9yZWFkX2ZsYXNoKHNlcmlhbCwKLQkJCQlGODE1MzRf REVGX0NPTkZfQUREUkVTU19TVEFSVCwgRjgxNTM0X05VTV9QT1JULAotCQkJCXNldHRpbmcpOwot CisJCQkJRjgxNTM0X0RFRl9DT05GX0FERFJFU1NfU1RBUlQsCisJCQkJc2l6ZW9mKHNlcmlhbF9w cml2LT5jb25mX2RhdGEpLAorCQkJCXNlcmlhbF9wcml2LT5jb25mX2RhdGEpOwogCQlpZiAoc3Rh dHVzKSB7CiAJCQlkZXZfZXJyKCZzZXJpYWwtPmludGVyZmFjZS0+ZGV2LAogCQkJCQkiJXM6IHJl YWQgZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sCkBAIC04MTEsNyArODk2LDEwIEBAIHN0YXRpYyBp bnQgZjgxNTM0X2NhbGNfbnVtX3BvcnRzKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsCiAKIAkv KiBOZXcgc3R5bGUsIGZpbmQgYWxsIHBvc3NpYmxlIHBvcnRzICovCiAJZm9yIChpID0gMDsgaSA8 IEY4MTUzNF9OVU1fUE9SVDsgKytpKSB7Ci0JCWlmIChzZXR0aW5nW2ldICYgRjgxNTM0X1BPUlRf VU5BVkFJTEFCTEUpCisJCWlmIChmODE1MzRfY2hlY2tfcG9ydF9od19kaXNhYmxlZChzZXJpYWws IGkpKQorCQkJc2VyaWFsX3ByaXYtPmNvbmZfZGF0YVtpXSB8PSBGODE1MzRfUE9SVF9VTkFWQUlM QUJMRTsKKworCQlpZiAoc2VyaWFsX3ByaXYtPmNvbmZfZGF0YVtpXSAmIEY4MTUzNF9QT1JUX1VO QVZBSUxBQkxFKQogCQkJY29udGludWU7CiAKIAkJKytudW1fcG9ydDsKQEAgLTEyMjgsNjEgKzEz MTYsMTEgQEAgc3RhdGljIGludCBmODE1MzRfYXR0YWNoKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJp YWwpCiB7CiAJc3RydWN0IGY4MTUzNF9zZXJpYWxfcHJpdmF0ZSAqc2VyaWFsX3ByaXY7CiAJaW50 IGluZGV4ID0gMDsKLQlpbnQgc3RhdHVzOwogCWludCBpOwogCi0Jc2VyaWFsX3ByaXYgPSBkZXZt X2t6YWxsb2MoJnNlcmlhbC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCXNpemVvZigqc2VyaWFsX3By aXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNlcmlhbF9wcml2KQotCQlyZXR1cm4gLUVOT01FTTsK LQotCXVzYl9zZXRfc2VyaWFsX2RhdGEoc2VyaWFsLCBzZXJpYWxfcHJpdik7Ci0KKwlzZXJpYWxf cHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKTsKIAltdXRleF9pbml0KCZzZXJpYWxf cHJpdi0+dXJiX211dGV4KTsKIAotCS8qIENoZWNrIGhhZCBjdXN0b20gc2V0dGluZyAqLwotCXN0 YXR1cyA9IGY4MTUzNF9maW5kX2NvbmZpZ19pZHgoc2VyaWFsLCAmc2VyaWFsX3ByaXYtPnNldHRp bmdfaWR4KTsKLQlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoJnNlcmlhbC0+aW50ZXJmYWNlLT5k ZXYsICIlczogZmluZCBpZHggZmFpbGVkOiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsK LQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKgotCSAqIFdlJ2xsIHJlYWQgY3VzdG9tIGRhdGEg b25seSB3aGVuIGRhdGEgYXZhaWxhYmxlLCBvdGhlcndpc2Ugd2UnbGwKLQkgKiByZWFkIGRlZmF1 bHQgdmFsdWUgaW5zdGVhZC4KLQkgKi8KLQlpZiAoc2VyaWFsX3ByaXYtPnNldHRpbmdfaWR4ID09 IEY4MTUzNF9DVVNUT01fTk9fQ1VTVE9NX0RBVEEpIHsKLQkJLyoKLQkJICogVGhlIGRlZmF1bHQg Y29uZmlndXJhdGlvbiBsYXlvdXQ6Ci0JCSAqCWJ5dGUgMC8xLzIvMzogdWFydCBzZXR0aW5nCi0J CSAqLwotCQlzdGF0dXMgPSBmODE1MzRfcmVhZF9mbGFzaChzZXJpYWwsCi0JCQkJCUY4MTUzNF9E RUZfQ09ORl9BRERSRVNTX1NUQVJULAotCQkJCQlGODE1MzRfREVGX0NPTkZfU0laRSwKLQkJCQkJ c2VyaWFsX3ByaXYtPmNvbmZfZGF0YSk7Ci0JCWlmIChzdGF0dXMpIHsKLQkJCWRldl9lcnIoJnNl cmlhbC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSIlczogcmVhZCByZXNlcnZlIGRhdGEgZmFpbGVk OiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9 Ci0JfSBlbHNlIHsKLQkJLyogT25seSByZWFkIDggYnl0ZXMgZm9yIG1vZGUgJiBHUElPICovCi0J CXN0YXR1cyA9IGY4MTUzNF9yZWFkX2ZsYXNoKHNlcmlhbCwKLQkJCQkJCUY4MTUzNF9DVVNUT01f QUREUkVTU19TVEFSVCArCi0JCQkJCQlGODE1MzRfQ09ORl9PRkZTRVQsCi0JCQkJCQlzaXplb2Yo c2VyaWFsX3ByaXYtPmNvbmZfZGF0YSksCi0JCQkJCQlzZXJpYWxfcHJpdi0+Y29uZl9kYXRhKTsK LQkJaWYgKHN0YXR1cykgewotCQkJZGV2X2Vycigmc2VyaWFsLT5pbnRlcmZhY2UtPmRldiwKLQkJ CQkJIiVzOiBpZHg6ICVkIGdldCBkYXRhIGZhaWxlZDogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBz ZXJpYWxfcHJpdi0+c2V0dGluZ19pZHgsCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVz OwotCQl9Ci0JfQotCiAJLyogQXNzaWduIHBoeS10by1sb2dpYyBtYXBwaW5nICovCiAJZm9yIChp ID0gMDsgaSA8IEY4MTUzNF9OVU1fUE9SVDsgKytpKSB7CiAJCWlmIChzZXJpYWxfcHJpdi0+Y29u Zl9kYXRhW2ldICYgRjgxNTM0X1BPUlRfVU5BVkFJTEFCTEUpCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752143AbeADC3g (ORCPT + 1 other); Wed, 3 Jan 2018 21:29:36 -0500 Received: from mail-pl0-f66.google.com ([209.85.160.66]:33986 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752071AbeADC3d (ORCPT ); Wed, 3 Jan 2018 21:29:33 -0500 X-Google-Smtp-Source: ACJfBoskZK7fboh8IBGKpJgycy2UBBk0vZxpUmOLtpQ+z4fV4vHe05FiN63CVz+h71KRNxOLjyElog== From: "Ji-Ze Hong (Peter Hong)" X-Google-Original-From: "Ji-Ze Hong (Peter Hong)" To: johan@kernel.org Cc: gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, peter_hong@fintek.com.tw, "Ji-Ze Hong (Peter Hong)" Subject: [PATCH V2 4/5] usb: serial: f81534: add H/W disable port support Date: Thu, 4 Jan 2018 10:29:20 +0800 Message-Id: <1515032961-29131-4-git-send-email-hpeter+linux_kernel@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515032961-29131-1-git-send-email-hpeter+linux_kernel@gmail.com> References: <1515032961-29131-1-git-send-email-hpeter+linux_kernel@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: The F81532/534 can be disable port by manufacturer with following H/W design. 1: Connect DCD/DSR/CTS/RI pin to ground. 2: Connect RX pin to ground. In driver, we'll implements some detect method likes following: 1: Read MSR. 2: Turn MCR LOOP bit on, off and read LSR after delay with 60ms. It'll contain BREAK status in LSR. Signed-off-by: Ji-Ze Hong (Peter Hong) --- V2: 1: f81534_check_port_hw_disabled() change return type from int to bool. 2: Add help function f81534_set_phy_port_register() / f81534_get_phy_port_register() for f81534_check_port_hw_disabled() to read register without port. 3: Re-write f81534_calc_num_ports() & f81534_attach() to reduce the f81534_check_port_hw_disabled() repeatedly called. drivers/usb/serial/f81534.c | 160 +++++++++++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 61 deletions(-) diff --git a/drivers/usb/serial/f81534.c b/drivers/usb/serial/f81534.c index 7f175f39a171..a4666171239a 100644 --- a/drivers/usb/serial/f81534.c +++ b/drivers/usb/serial/f81534.c @@ -307,6 +307,20 @@ static int f81534_set_mask_register(struct usb_serial *serial, u16 reg, return f81534_set_register(serial, reg, tmp); } +static int f81534_set_phy_port_register(struct usb_serial *serial, int phy, + u16 reg, u8 data) +{ + return f81534_set_register(serial, reg + F81534_UART_OFFSET * phy, + data); +} + +static int f81534_get_phy_port_register(struct usb_serial *serial, int phy, + u16 reg, u8 *data) +{ + return f81534_get_register(serial, reg + F81534_UART_OFFSET * phy, + data); +} + static int f81534_set_port_register(struct usb_serial_port *port, u16 reg, u8 data) { @@ -730,6 +744,70 @@ static int f81534_find_config_idx(struct usb_serial *serial, u8 *index) } /* + * The F81532/534 will not report serial port to USB serial subsystem when + * H/W DCD/DSR/CTS/RI/RX pin connected to ground. + * + * To detect RX pin status, we'll enable MCR interal loopback, disable it and + * delayed for 60ms. It connected to ground If LSR register report UART_LSR_BI. + */ +static bool f81534_check_port_hw_disabled(struct usb_serial *serial, int phy) +{ + int status; + u8 old_mcr; + u8 msr; + u8 lsr; + u8 msr_mask; + + msr_mask = UART_MSR_DCD | UART_MSR_RI | UART_MSR_DSR | UART_MSR_CTS; + + status = f81534_get_phy_port_register(serial, phy, + F81534_MODEM_STATUS_REG, &msr); + if (status) + return false; + + if ((msr & msr_mask) != msr_mask) + return false; + + status = f81534_set_phy_port_register(serial, phy, + F81534_FIFO_CONTROL_REG, UART_FCR_ENABLE_FIFO | + UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); + if (status) + return false; + + status = f81534_get_phy_port_register(serial, phy, + F81534_MODEM_CONTROL_REG, &old_mcr); + if (status) + return false; + + status = f81534_set_phy_port_register(serial, phy, + F81534_MODEM_CONTROL_REG, UART_MCR_LOOP); + if (status) + return false; + + status = f81534_set_phy_port_register(serial, phy, + F81534_MODEM_CONTROL_REG, 0x0); + if (status) + return false; + + msleep(60); + + status = f81534_get_phy_port_register(serial, phy, + F81534_LINE_STATUS_REG, &lsr); + if (status) + return false; + + status = f81534_set_phy_port_register(serial, phy, + F81534_MODEM_CONTROL_REG, old_mcr); + if (status) + return false; + + if ((lsr & UART_LSR_BI) == UART_LSR_BI) + return true; + + return false; +} + +/* * We had 2 generation of F81532/534 IC. All has an internal storage. * * 1st is pure USB-to-TTL RS232 IC and designed for 4 ports only, no any @@ -750,11 +828,10 @@ static int f81534_find_config_idx(struct usb_serial *serial, u8 *index) static int f81534_calc_num_ports(struct usb_serial *serial, struct usb_serial_endpoints *epds) { + struct f81534_serial_private *serial_priv; struct device *dev = &serial->interface->dev; int size_bulk_in = usb_endpoint_maxp(epds->bulk_in[0]); int size_bulk_out = usb_endpoint_maxp(epds->bulk_out[0]); - u8 setting[F81534_CUSTOM_DATA_SIZE]; - u8 setting_idx; u8 num_port = 0; int status; size_t i; @@ -765,8 +842,15 @@ static int f81534_calc_num_ports(struct usb_serial *serial, return -ENODEV; } + serial_priv = devm_kzalloc(&serial->interface->dev, + sizeof(*serial_priv), GFP_KERNEL); + if (!serial_priv) + return -ENOMEM; + + usb_set_serial_data(serial, serial_priv); + /* Check had custom setting */ - status = f81534_find_config_idx(serial, &setting_idx); + status = f81534_find_config_idx(serial, &serial_priv->setting_idx); if (status) { dev_err(&serial->interface->dev, "%s: find idx failed: %d\n", __func__, status); @@ -777,11 +861,12 @@ static int f81534_calc_num_ports(struct usb_serial *serial, * We'll read custom data only when data available, otherwise we'll * read default value instead. */ - if (setting_idx != F81534_CUSTOM_NO_CUSTOM_DATA) { + if (serial_priv->setting_idx != F81534_CUSTOM_NO_CUSTOM_DATA) { status = f81534_read_flash(serial, F81534_CUSTOM_ADDRESS_START + F81534_CONF_OFFSET, - sizeof(setting), setting); + sizeof(serial_priv->conf_data), + serial_priv->conf_data); if (status) { dev_err(&serial->interface->dev, "%s: get custom data failed: %d\n", @@ -791,13 +876,13 @@ static int f81534_calc_num_ports(struct usb_serial *serial, dev_dbg(&serial->interface->dev, "%s: read config from block: %d\n", __func__, - setting_idx); + serial_priv->setting_idx); } else { /* Read default board setting */ status = f81534_read_flash(serial, - F81534_DEF_CONF_ADDRESS_START, F81534_NUM_PORT, - setting); - + F81534_DEF_CONF_ADDRESS_START, + sizeof(serial_priv->conf_data), + serial_priv->conf_data); if (status) { dev_err(&serial->interface->dev, "%s: read failed: %d\n", __func__, @@ -811,7 +896,10 @@ static int f81534_calc_num_ports(struct usb_serial *serial, /* New style, find all possible ports */ for (i = 0; i < F81534_NUM_PORT; ++i) { - if (setting[i] & F81534_PORT_UNAVAILABLE) + if (f81534_check_port_hw_disabled(serial, i)) + serial_priv->conf_data[i] |= F81534_PORT_UNAVAILABLE; + + if (serial_priv->conf_data[i] & F81534_PORT_UNAVAILABLE) continue; ++num_port; @@ -1228,61 +1316,11 @@ static int f81534_attach(struct usb_serial *serial) { struct f81534_serial_private *serial_priv; int index = 0; - int status; int i; - serial_priv = devm_kzalloc(&serial->interface->dev, - sizeof(*serial_priv), GFP_KERNEL); - if (!serial_priv) - return -ENOMEM; - - usb_set_serial_data(serial, serial_priv); - + serial_priv = usb_get_serial_data(serial); mutex_init(&serial_priv->urb_mutex); - /* Check had custom setting */ - status = f81534_find_config_idx(serial, &serial_priv->setting_idx); - if (status) { - dev_err(&serial->interface->dev, "%s: find idx failed: %d\n", - __func__, status); - return status; - } - - /* - * We'll read custom data only when data available, otherwise we'll - * read default value instead. - */ - if (serial_priv->setting_idx == F81534_CUSTOM_NO_CUSTOM_DATA) { - /* - * The default configuration layout: - * byte 0/1/2/3: uart setting - */ - status = f81534_read_flash(serial, - F81534_DEF_CONF_ADDRESS_START, - F81534_DEF_CONF_SIZE, - serial_priv->conf_data); - if (status) { - dev_err(&serial->interface->dev, - "%s: read reserve data failed: %d\n", - __func__, status); - return status; - } - } else { - /* Only read 8 bytes for mode & GPIO */ - status = f81534_read_flash(serial, - F81534_CUSTOM_ADDRESS_START + - F81534_CONF_OFFSET, - sizeof(serial_priv->conf_data), - serial_priv->conf_data); - if (status) { - dev_err(&serial->interface->dev, - "%s: idx: %d get data failed: %d\n", - __func__, serial_priv->setting_idx, - status); - return status; - } - } - /* Assign phy-to-logic mapping */ for (i = 0; i < F81534_NUM_PORT; ++i) { if (serial_priv->conf_data[i] & F81534_PORT_UNAVAILABLE) -- 2.7.4