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: [V3,1/6] usb: serial: f81534: add high baud rate support From: "Ji-Ze Hong \(Peter Hong\)" Message-Id: <1515653240-5420-1-git-send-email-hpeter+linux_kernel@gmail.com> Date: Thu, 11 Jan 2018 14:47:15 +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: VGhlIEY4MTUzMi81MzQgaGFkIDQgY2xvY2tzb3VyY2UgMS44NDYvMTguNDYvMTQuNzcvMjRNSHog YW5kIGJhdWQgcmF0ZXMKY2FuIGJlIHVwIHRvIDEuNU1iaXRzIHdpdGggMjRNSHouCgpUaGlzIGRl dmljZSBtYXkgZ2VuZXJhdGUgZGF0YSBvdmVycnVuIHdoZW4gYmF1ZCByYXRlIHNldHRpbmcgdG8g OTIxNjAwYnBzCm9yIGhpZ2hlciB3aXRoIG9sZCBVQVJUIHRyaWdnZXIgbGV2ZWwgc2V0dGluZyAo OHgxND0xMTIpIHdpdGggZnVsbApsb2FkaW5nLiBXZSdsbCBjaGFuZ2UgdHJpZ2dlciBsZXZlbCBm cm9tIDh4MTQ9MTEyIHRvIDh4OD02NCB0byBhdm9pZCBkYXRhCm92ZXJydW4uCgpBbHNvIHRoZSBy ZWFkL3dyaXRlIG9mIEVQMCB3aWxsIGJlIGFmZmVjdGVkIGJ5IHRoaXMgcGF0Y2guIFRoZSB3b3Jz dCBjYXNlCm9mIHJlc3BvbmRpbmcgdGltZSBpcyAyMHMgd2hlbiBhbGwgc2VyaWFsIHBvcnQgYXJl IGZ1bGwgbG9hZGluZyBhbmQgdHJ5aW5nCnRvIGFjY2VzcyBFUDAsIHNvIHdlIGNoYW5nZSBFUDAg dGltZW91dCBmcm9tIDEwIHRvIDIwcy4KCkY4MTUzMi81MzQgQ2xvY2sgcmVnaXN0ZXIgKG9mZnNl dCArMDhoKQoKQml0MDoJVUFSVCBFbmFibGUgKGFsd2F5cyBvbikKQml0Mi0xOglDbG9jayBzb3Vy Y2Ugc2VsZWN0b3IKCQkJMDA6IDEuODQ2TUh6LgoJCQkwMTogMTguNDZNSHouCgkJCTEwOiAyNE1I ei4KCQkJMTE6IDE0Ljc3TUh6LgoKU2lnbmVkLW9mZi1ieTogSmktWmUgSG9uZyAoUGV0ZXIgSG9u ZykgPGhwZXRlcitsaW51eF9rZXJuZWxAZ21haWwuY29tPgotLS0KVjM6CgkxOiBTZXBhcmF0ZSBV QVJUIEVuYWJsZSBiaXQgZnJvbSBjbG9jayBzb3VyY2VzIGFuZCBhY3RpdmUgaXQgaW4KCSAgIHBv cnRfcHJvYmUoKSB3aXRoIHBvcnRfcHJpdi0+c2hhZG93X2Nsay4KCTI6IEFkZCBzYW5pdHkgY2hl Y2sgZm9yIGNsb2Nrc291cmNlIGlkeCBpbiBzZXRfcG9ydF9jb25maWcoKS4KCTM6IGNoYW5nZSBj YWxjX2JhdWRfZGl2aXNvcigpIHBhcmFtZXRlciBmcm9tIEY4MTUzNF9NQVhfQkFVRFJBVEUKCSAg IHRvIHByaXYtPmJhdWRfYmFzZS4KCnYyOgoJMTogQWRkIGNvbW1pdCBtZXNzYWdlIGZvciBGODE1 MzRfVVNCX1RJTUVPVVQgZnJvbSAxMDAwIHRvIDIwMDAgYW5kCgkgICB0cmlnZ2VyIGxldmVsIGZy b20gVUFSVF9GQ1JfUl9UUklHXzExIHRvIFVBUlRfRkNSX1RSSUdHRVJfOC4KCTI6IFNlcGFyYXRl IFVBUlQgRW5hYmxlIGJpdCBmcm9tIGNsb2NrIHNvdXJjZXMuCgkzOiBBZGQgaGVscCBmdW5jdGlv biAiZjgxNTM0X2ZpbmRfY2xrKCkiIHRvIGNhbGN1bGF0ZSBiYXVkIHJhdGUgYW5kCgkgICBjbG9j ayBzb3VyY2UKCTQ6IEFkZCBzaGFkb3cgY2xvY2sgcmVnaXN0ZXIgZm9yIGZ1dHVyZSB1c2UuIAoK IGRyaXZlcnMvdXNiL3NlcmlhbC9mODE1MzQuYyB8IDkzICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKystLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDc3IGluc2VydGlvbnMoKyks IDE2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mODE1MzQu YyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mODE1MzQuYwppbmRleCBlNDU3M2I0Yzg5MzUuLjE1NjNk M2YzNDM4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Y4MTUzNC5jCisrKyBiL2Ry aXZlcnMvdXNiL3NlcmlhbC9mODE1MzQuYwpAQCAtNDEsNiArNDEsNyBAQAogI2RlZmluZSBGODE1 MzRfTU9ERU1fQ09OVFJPTF9SRUcJKDB4MDQgKyBGODE1MzRfVUFSVF9CQVNFX0FERFJFU1MpCiAj ZGVmaW5lIEY4MTUzNF9MSU5FX1NUQVRVU19SRUcJCSgweDA1ICsgRjgxNTM0X1VBUlRfQkFTRV9B RERSRVNTKQogI2RlZmluZSBGODE1MzRfTU9ERU1fU1RBVFVTX1JFRwkJKDB4MDYgKyBGODE1MzRf VUFSVF9CQVNFX0FERFJFU1MpCisjZGVmaW5lIEY4MTUzNF9DTE9DS19SRUcJCSgweDA4ICsgRjgx NTM0X1VBUlRfQkFTRV9BRERSRVNTKQogI2RlZmluZSBGODE1MzRfQ09ORklHMV9SRUcJCSgweDA5 ICsgRjgxNTM0X1VBUlRfQkFTRV9BRERSRVNTKQogCiAjZGVmaW5lIEY4MTUzNF9ERUZfQ09ORl9B RERSRVNTX1NUQVJUCTB4MzAwMApAQCAtNTcsNyArNTgsNyBAQAogCiAvKiBEZWZhdWx0IFVSQiB0 aW1lb3V0IGZvciBVU0Igb3BlcmF0aW9ucyAqLwogI2RlZmluZSBGODE1MzRfVVNCX01BWF9SRVRS WQkJMTAKLSNkZWZpbmUgRjgxNTM0X1VTQl9USU1FT1VUCQkxMDAwCisjZGVmaW5lIEY4MTUzNF9V U0JfVElNRU9VVAkJMjAwMAogI2RlZmluZSBGODE1MzRfU0VUX0dFVF9SRUdJU1RFUgkJMHhBMAog CiAjZGVmaW5lIEY4MTUzNF9OVU1fUE9SVAkJCTQKQEAgLTk2LDcgKzk3LDYgQEAKICNkZWZpbmUg RjgxNTM0X0NNRF9SRUFECQkJMHgwMwogCiAjZGVmaW5lIEY4MTUzNF9ERUZBVUxUX0JBVURfUkFU RQk5NjAwCi0jZGVmaW5lIEY4MTUzNF9NQVhfQkFVRFJBVEUJCTExNTIwMAogCiAjZGVmaW5lIEY4 MTUzNF9QT1JUX0NPTkZfRElTQUJMRV9QT1JUCUJJVCgzKQogI2RlZmluZSBGODE1MzRfUE9SVF9D T05GX05PVF9FWElTVF9QT1JUCUJJVCg3KQpAQCAtMTA2LDYgKzEwNiwyNCBAQAogI2RlZmluZSBG ODE1MzRfMVhfUlhUUklHR0VSCQkweGMzCiAjZGVmaW5lIEY4MTUzNF84WF9SWFRSSUdHRVIJCTB4 Y2YKIAorLyoKKyAqIEY4MTUzMi81MzQgQ2xvY2sgcmVnaXN0ZXJzIChvZmZzZXQgKzA4aCkKKyAq CisgKiBCaXQwOglVQVJUIEVuYWJsZSAoYWx3YXlzIG9uKQorICogQml0Mi0xOglDbG9jayBzb3Vy Y2Ugc2VsZWN0b3IKKyAqCQkJMDA6IDEuODQ2TUh6LgorICoJCQkwMTogMTguNDZNSHouCisgKgkJ CTEwOiAyNE1Iei4KKyAqCQkJMTE6IDE0Ljc3TUh6LgorICovCisKKyNkZWZpbmUgRjgxNTM0X1VB UlRfRU4JCQlCSVQoMCkKKyNkZWZpbmUgRjgxNTM0X0NMS18xXzg0Nl9NSFoJCTAKKyNkZWZpbmUg RjgxNTM0X0NMS18xOF80Nl9NSFoJCUJJVCgxKQorI2RlZmluZSBGODE1MzRfQ0xLXzI0X01IWgkJ QklUKDIpCisjZGVmaW5lIEY4MTUzNF9DTEtfMTRfNzdfTUhaCQlHRU5NQVNLKDIsIDEpCisjZGVm aW5lIEY4MTUzNF9DTEtfTUFTSwkJCUdFTk1BU0soMiwgMSkKKwogc3RhdGljIGNvbnN0IHN0cnVj dCB1c2JfZGV2aWNlX2lkIGY4MTUzNF9pZF90YWJsZVtdID0gewogCXsgVVNCX0RFVklDRShGSU5U RUtfVkVORE9SX0lEXzEsIEZJTlRFS19ERVZJQ0VfSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZJTlRF S19WRU5ET1JfSURfMiwgRklOVEVLX0RFVklDRV9JRCkgfSwKQEAgLTEyOSwxMiArMTQ3LDE4IEBA IHN0cnVjdCBmODE1MzRfcG9ydF9wcml2YXRlIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpw b3J0OwogCXVuc2lnbmVkIGxvbmcgdHhfZW1wdHk7CiAJc3BpbmxvY2tfdCBtc3JfbG9jazsKKwl1 MzIgYmF1ZF9iYXNlOwogCXU4IHNoYWRvd19tY3I7CiAJdTggc2hhZG93X2xjcjsKIAl1OCBzaGFk b3dfbXNyOworCXU4IHNoYWRvd19jbGs7CiAJdTggcGh5X251bTsKIH07CiAKK3N0YXRpYyB1MzIg Y29uc3QgYmF1ZHJhdGVfdGFibGVbXSA9IHsgMTE1MjAwLCA5MjE2MDAsIDExNTIwMDAsIDE1MDAw MDAgfTsKK3N0YXRpYyB1OCBjb25zdCBjbG9ja190YWJsZVtdID0geyBGODE1MzRfQ0xLXzFfODQ2 X01IWiwgRjgxNTM0X0NMS18xNF83N19NSFosCisJCQkJRjgxNTM0X0NMS18xOF80Nl9NSFosIEY4 MTUzNF9DTEtfMjRfTUhaIH07CisKIHN0YXRpYyBpbnQgZjgxNTM0X2xvZ2ljX3RvX3BoeV9wb3J0 KHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsCiAJCQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQg KnBvcnQpCiB7CkBAIC00NjAsMTMgKzQ4NCw1MiBAQCBzdGF0aWMgdTMyIGY4MTUzNF9jYWxjX2Jh dWRfZGl2aXNvcih1MzIgYmF1ZHJhdGUsIHUzMiBjbG9ja3JhdGUpCiAJcmV0dXJuIERJVl9ST1VO RF9DTE9TRVNUKGNsb2NrcmF0ZSwgYmF1ZHJhdGUpOwogfQogCi1zdGF0aWMgaW50IGY4MTUzNF9z ZXRfcG9ydF9jb25maWcoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgdTMyIGJhdWRyYXRl LAotCQkJCQl1OCBsY3IpCitzdGF0aWMgaW50IGY4MTUzNF9maW5kX2Nsayh1MzIgYmF1ZHJhdGUp Cit7CisJaW50IGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShiYXVkcmF0 ZV90YWJsZSk7ICsraWR4KSB7CisJCWlmIChiYXVkcmF0ZSA8PSBiYXVkcmF0ZV90YWJsZVtpZHhd ICYmCisJCQkJYmF1ZHJhdGVfdGFibGVbaWR4XSAlIGJhdWRyYXRlID09IDApCisJCQlyZXR1cm4g aWR4OworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGY4MTUzNF9zZXRf cG9ydF9jb25maWcoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJc3RydWN0IHR0eV9z dHJ1Y3QgKnR0eSwgdTMyIGJhdWRyYXRlLCB1MzIgb2xkX2JhdWRyYXRlLCB1OCBsY3IpCiB7CiAJ c3RydWN0IGY4MTUzNF9wb3J0X3ByaXZhdGUgKnBvcnRfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3Bv cnRfZGF0YShwb3J0KTsKIAl1MzIgZGl2aXNvcjsKIAlpbnQgc3RhdHVzOworCWludCBpOworCWlu dCBpZHg7CiAJdTggdmFsdWU7CisJdTMyIGJhdWRfbGlzdFtdID0ge2JhdWRyYXRlLCBvbGRfYmF1 ZHJhdGUsIEY4MTUzNF9ERUZBVUxUX0JBVURfUkFURX07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJS QVlfU0laRShiYXVkX2xpc3QpOyArK2kpIHsKKwkJaWR4ID0gZjgxNTM0X2ZpbmRfY2xrKGJhdWRf bGlzdFtpXSk7CisJCWlmIChpZHggPj0gMCkgeworCQkJYmF1ZHJhdGUgPSBiYXVkX2xpc3RbaV07 CisJCQl0dHlfZW5jb2RlX2JhdWRfcmF0ZSh0dHksIGJhdWRyYXRlLCBiYXVkcmF0ZSk7CisJCQli cmVhazsKKwkJfQorCX0KKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBv cnRfcHJpdi0+YmF1ZF9iYXNlID0gYmF1ZHJhdGVfdGFibGVbaWR4XTsKKwlwb3J0X3ByaXYtPnNo YWRvd19jbGsgJj0gfkY4MTUzNF9DTEtfTUFTSzsKKwlwb3J0X3ByaXYtPnNoYWRvd19jbGsgfD0g Y2xvY2tfdGFibGVbaWR4XTsKKworCXN0YXR1cyA9IGY4MTUzNF9zZXRfcG9ydF9yZWdpc3Rlcihw b3J0LCBGODE1MzRfQ0xPQ0tfUkVHLAorCQkJcG9ydF9wcml2LT5zaGFkb3dfY2xrKTsKKwlpZiAo c3RhdHVzKSB7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIkNMT0NLX1JFRyBzZXR0aW5nIGZhaWxl ZFxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQogCiAJaWYgKGJhdWRyYXRlIDw9IDEyMDApCiAJ CXZhbHVlID0gRjgxNTM0XzFYX1JYVFJJR0dFUjsJLyogMTI4IEZJRk8gJiBUTDogMXggKi8KQEAg LTQ4Miw3ICs1NDUsNyBAQCBzdGF0aWMgaW50IGY4MTUzNF9zZXRfcG9ydF9jb25maWcoc3RydWN0 IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgdTMyIGJhdWRyYXRlLAogCWlmIChiYXVkcmF0ZSA8PSAx MjAwKQogCQl2YWx1ZSA9IFVBUlRfRkNSX1RSSUdHRVJfMSB8IFVBUlRfRkNSX0VOQUJMRV9GSUZP OyAvKiBUTDogMSAqLwogCWVsc2UKLQkJdmFsdWUgPSBVQVJUX0ZDUl9SX1RSSUdfMTEgfCBVQVJU X0ZDUl9FTkFCTEVfRklGTzsgLyogVEw6IDE0ICovCisJCXZhbHVlID0gVUFSVF9GQ1JfVFJJR0dF Ul84IHwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk87IC8qIFRMOiA4ICovCiAKIAlzdGF0dXMgPSBmODE1 MzRfc2V0X3BvcnRfcmVnaXN0ZXIocG9ydCwgRjgxNTM0X0ZJRk9fQ09OVFJPTF9SRUcsCiAJCQkJ CQl2YWx1ZSk7CkBAIC00OTEsNyArNTU0LDcgQEAgc3RhdGljIGludCBmODE1MzRfc2V0X3BvcnRf Y29uZmlnKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHUzMiBiYXVkcmF0ZSwKIAkJcmV0 dXJuIHN0YXR1czsKIAl9CiAKLQlkaXZpc29yID0gZjgxNTM0X2NhbGNfYmF1ZF9kaXZpc29yKGJh dWRyYXRlLCBGODE1MzRfTUFYX0JBVURSQVRFKTsKKwlkaXZpc29yID0gZjgxNTM0X2NhbGNfYmF1 ZF9kaXZpc29yKGJhdWRyYXRlLCBwb3J0X3ByaXYtPmJhdWRfYmFzZSk7CiAKIAltdXRleF9sb2Nr KCZwb3J0X3ByaXYtPmxjcl9tdXRleCk7CiAKQEAgLTc0MSw2ICs4MDQsNyBAQCBzdGF0aWMgdm9p ZCBmODE1MzRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAl1OCBuZXdfbGNy ID0gMDsKIAlpbnQgc3RhdHVzOwogCXUzMiBiYXVkOworCXUzMiBvbGRfYmF1ZDsKIAogCWlmIChD X0JBVUQodHR5KSA9PSBCMCkKIAkJZjgxNTM0X3VwZGF0ZV9tY3RybChwb3J0LCAwLCBUSU9DTV9E VFIgfCBUSU9DTV9SVFMpOwpAQCAtNzgwLDE4ICs4NDQsMTQgQEAgc3RhdGljIHZvaWQgZjgxNTM0 X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJaWYgKCFiYXVkKQogCQlyZXR1 cm47CiAKLQlpZiAoYmF1ZCA+IEY4MTUzNF9NQVhfQkFVRFJBVEUpIHsKLQkJaWYgKG9sZF90ZXJt aW9zKQotCQkJYmF1ZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZShvbGRfdGVybWlvcyk7Ci0JCWVs c2UKLQkJCWJhdWQgPSBGODE1MzRfREVGQVVMVF9CQVVEX1JBVEU7Ci0KLQkJdHR5X2VuY29kZV9i YXVkX3JhdGUodHR5LCBiYXVkLCBiYXVkKTsKLQl9CisJaWYgKG9sZF90ZXJtaW9zKQorCQlvbGRf YmF1ZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZShvbGRfdGVybWlvcyk7CisJZWxzZQorCQlvbGRf YmF1ZCA9IEY4MTUzNF9ERUZBVUxUX0JBVURfUkFURTsKIAogCWRldl9kYmcoJnBvcnQtPmRldiwg IiVzOiBiYXVkOiAlZFxuIiwgX19mdW5jX18sIGJhdWQpOwogCi0Jc3RhdHVzID0gZjgxNTM0X3Nl dF9wb3J0X2NvbmZpZyhwb3J0LCBiYXVkLCBuZXdfbGNyKTsKKwlzdGF0dXMgPSBmODE1MzRfc2V0 X3BvcnRfY29uZmlnKHBvcnQsIHR0eSwgYmF1ZCwgb2xkX2JhdWQsIG5ld19sY3IpOwogCWlmIChz dGF0dXMgPCAwKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzOiBzZXQgcG9ydCBjb25maWcg ZmFpbGVkOiAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKQEAgLTk0Nyw3ICsxMDA3LDcg QEAgc3RhdGljIGludCBmODE1MzRfZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB1c2Jfc2VyaWFsX3Bv cnQgKnBvcnQsCiAJdG1wLnR5cGUgPSBQT1JUXzE2NTUwQTsKIAl0bXAucG9ydCA9IHBvcnQtPnBv cnRfbnVtYmVyOwogCXRtcC5saW5lID0gcG9ydC0+bWlub3I7Ci0JdG1wLmJhdWRfYmFzZSA9IEY4 MTUzNF9NQVhfQkFVRFJBVEU7CisJdG1wLmJhdWRfYmFzZSA9IHBvcnRfcHJpdi0+YmF1ZF9iYXNl OwogCiAJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkK IAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xMjIxLDYgKzEyODEsNyBAQCBzdGF0aWMgaW50IGY4MTUz NF9wb3J0X3Byb2JlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiAJaWYgKCFwb3J0X3By aXYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcG9ydF9wcml2LT5zaGFkb3dfY2xrID0gRjgxNTM0 X1VBUlRfRU47CiAJc3Bpbl9sb2NrX2luaXQoJnBvcnRfcHJpdi0+bXNyX2xvY2spOwogCW11dGV4 X2luaXQoJnBvcnRfcHJpdi0+bWNyX211dGV4KTsKIAltdXRleF9pbml0KCZwb3J0X3ByaXYtPmxj cl9tdXRleCk7Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932425AbeAKGr2 (ORCPT + 1 other); Thu, 11 Jan 2018 01:47:28 -0500 Received: from mail-pf0-f193.google.com ([209.85.192.193]:35669 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932292AbeAKGrW (ORCPT ); Thu, 11 Jan 2018 01:47:22 -0500 X-Google-Smtp-Source: ACJfBot6LDp+BKEG2bygaw3cd3RM1UzSLbnr7RU5BkqoQkr9aB1YjTQJNgqjRJAu8GGOWqR9+bXnsQ== 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 V3 1/6] usb: serial: f81534: add high baud rate support Date: Thu, 11 Jan 2018 14:47:15 +0800 Message-Id: <1515653240-5420-1-git-send-email-hpeter+linux_kernel@gmail.com> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: The F81532/534 had 4 clocksource 1.846/18.46/14.77/24MHz and baud rates can be up to 1.5Mbits with 24MHz. This device may generate data overrun when baud rate setting to 921600bps or higher with old UART trigger level setting (8x14=112) with full loading. We'll change trigger level from 8x14=112 to 8x8=64 to avoid data overrun. Also the read/write of EP0 will be affected by this patch. The worst case of responding time is 20s when all serial port are full loading and trying to access EP0, so we change EP0 timeout from 10 to 20s. F81532/534 Clock register (offset +08h) Bit0: UART Enable (always on) Bit2-1: Clock source selector 00: 1.846MHz. 01: 18.46MHz. 10: 24MHz. 11: 14.77MHz. Signed-off-by: Ji-Ze Hong (Peter Hong) --- V3: 1: Separate UART Enable bit from clock sources and active it in port_probe() with port_priv->shadow_clk. 2: Add sanity check for clocksource idx in set_port_config(). 3: change calc_baud_divisor() parameter from F81534_MAX_BAUDRATE to priv->baud_base. v2: 1: Add commit message for F81534_USB_TIMEOUT from 1000 to 2000 and trigger level from UART_FCR_R_TRIG_11 to UART_FCR_TRIGGER_8. 2: Separate UART Enable bit from clock sources. 3: Add help function "f81534_find_clk()" to calculate baud rate and clock source 4: Add shadow clock register for future use. drivers/usb/serial/f81534.c | 93 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 77 insertions(+), 16 deletions(-) diff --git a/drivers/usb/serial/f81534.c b/drivers/usb/serial/f81534.c index e4573b4c8935..1563d3f34381 100644 --- a/drivers/usb/serial/f81534.c +++ b/drivers/usb/serial/f81534.c @@ -41,6 +41,7 @@ #define F81534_MODEM_CONTROL_REG (0x04 + F81534_UART_BASE_ADDRESS) #define F81534_LINE_STATUS_REG (0x05 + F81534_UART_BASE_ADDRESS) #define F81534_MODEM_STATUS_REG (0x06 + F81534_UART_BASE_ADDRESS) +#define F81534_CLOCK_REG (0x08 + F81534_UART_BASE_ADDRESS) #define F81534_CONFIG1_REG (0x09 + F81534_UART_BASE_ADDRESS) #define F81534_DEF_CONF_ADDRESS_START 0x3000 @@ -57,7 +58,7 @@ /* Default URB timeout for USB operations */ #define F81534_USB_MAX_RETRY 10 -#define F81534_USB_TIMEOUT 1000 +#define F81534_USB_TIMEOUT 2000 #define F81534_SET_GET_REGISTER 0xA0 #define F81534_NUM_PORT 4 @@ -96,7 +97,6 @@ #define F81534_CMD_READ 0x03 #define F81534_DEFAULT_BAUD_RATE 9600 -#define F81534_MAX_BAUDRATE 115200 #define F81534_PORT_CONF_DISABLE_PORT BIT(3) #define F81534_PORT_CONF_NOT_EXIST_PORT BIT(7) @@ -106,6 +106,24 @@ #define F81534_1X_RXTRIGGER 0xc3 #define F81534_8X_RXTRIGGER 0xcf +/* + * F81532/534 Clock registers (offset +08h) + * + * Bit0: UART Enable (always on) + * Bit2-1: Clock source selector + * 00: 1.846MHz. + * 01: 18.46MHz. + * 10: 24MHz. + * 11: 14.77MHz. + */ + +#define F81534_UART_EN BIT(0) +#define F81534_CLK_1_846_MHZ 0 +#define F81534_CLK_18_46_MHZ BIT(1) +#define F81534_CLK_24_MHZ BIT(2) +#define F81534_CLK_14_77_MHZ GENMASK(2, 1) +#define F81534_CLK_MASK GENMASK(2, 1) + static const struct usb_device_id f81534_id_table[] = { { USB_DEVICE(FINTEK_VENDOR_ID_1, FINTEK_DEVICE_ID) }, { USB_DEVICE(FINTEK_VENDOR_ID_2, FINTEK_DEVICE_ID) }, @@ -129,12 +147,18 @@ struct f81534_port_private { struct usb_serial_port *port; unsigned long tx_empty; spinlock_t msr_lock; + u32 baud_base; u8 shadow_mcr; u8 shadow_lcr; u8 shadow_msr; + u8 shadow_clk; u8 phy_num; }; +static u32 const baudrate_table[] = { 115200, 921600, 1152000, 1500000 }; +static u8 const clock_table[] = { F81534_CLK_1_846_MHZ, F81534_CLK_14_77_MHZ, + F81534_CLK_18_46_MHZ, F81534_CLK_24_MHZ }; + static int f81534_logic_to_phy_port(struct usb_serial *serial, struct usb_serial_port *port) { @@ -460,13 +484,52 @@ static u32 f81534_calc_baud_divisor(u32 baudrate, u32 clockrate) return DIV_ROUND_CLOSEST(clockrate, baudrate); } -static int f81534_set_port_config(struct usb_serial_port *port, u32 baudrate, - u8 lcr) +static int f81534_find_clk(u32 baudrate) +{ + int idx; + + for (idx = 0; idx < ARRAY_SIZE(baudrate_table); ++idx) { + if (baudrate <= baudrate_table[idx] && + baudrate_table[idx] % baudrate == 0) + return idx; + } + + return -EINVAL; +} + +static int f81534_set_port_config(struct usb_serial_port *port, + struct tty_struct *tty, u32 baudrate, u32 old_baudrate, u8 lcr) { struct f81534_port_private *port_priv = usb_get_serial_port_data(port); u32 divisor; int status; + int i; + int idx; u8 value; + u32 baud_list[] = {baudrate, old_baudrate, F81534_DEFAULT_BAUD_RATE}; + + for (i = 0; i < ARRAY_SIZE(baud_list); ++i) { + idx = f81534_find_clk(baud_list[i]); + if (idx >= 0) { + baudrate = baud_list[i]; + tty_encode_baud_rate(tty, baudrate, baudrate); + break; + } + } + + if (idx < 0) + return -EINVAL; + + port_priv->baud_base = baudrate_table[idx]; + port_priv->shadow_clk &= ~F81534_CLK_MASK; + port_priv->shadow_clk |= clock_table[idx]; + + status = f81534_set_port_register(port, F81534_CLOCK_REG, + port_priv->shadow_clk); + if (status) { + dev_err(&port->dev, "CLOCK_REG setting failed\n"); + return status; + } if (baudrate <= 1200) value = F81534_1X_RXTRIGGER; /* 128 FIFO & TL: 1x */ @@ -482,7 +545,7 @@ static int f81534_set_port_config(struct usb_serial_port *port, u32 baudrate, if (baudrate <= 1200) value = UART_FCR_TRIGGER_1 | UART_FCR_ENABLE_FIFO; /* TL: 1 */ else - value = UART_FCR_R_TRIG_11 | UART_FCR_ENABLE_FIFO; /* TL: 14 */ + value = UART_FCR_TRIGGER_8 | UART_FCR_ENABLE_FIFO; /* TL: 8 */ status = f81534_set_port_register(port, F81534_FIFO_CONTROL_REG, value); @@ -491,7 +554,7 @@ static int f81534_set_port_config(struct usb_serial_port *port, u32 baudrate, return status; } - divisor = f81534_calc_baud_divisor(baudrate, F81534_MAX_BAUDRATE); + divisor = f81534_calc_baud_divisor(baudrate, port_priv->baud_base); mutex_lock(&port_priv->lcr_mutex); @@ -741,6 +804,7 @@ static void f81534_set_termios(struct tty_struct *tty, u8 new_lcr = 0; int status; u32 baud; + u32 old_baud; if (C_BAUD(tty) == B0) f81534_update_mctrl(port, 0, TIOCM_DTR | TIOCM_RTS); @@ -780,18 +844,14 @@ static void f81534_set_termios(struct tty_struct *tty, if (!baud) return; - if (baud > F81534_MAX_BAUDRATE) { - if (old_termios) - baud = tty_termios_baud_rate(old_termios); - else - baud = F81534_DEFAULT_BAUD_RATE; - - tty_encode_baud_rate(tty, baud, baud); - } + if (old_termios) + old_baud = tty_termios_baud_rate(old_termios); + else + old_baud = F81534_DEFAULT_BAUD_RATE; dev_dbg(&port->dev, "%s: baud: %d\n", __func__, baud); - status = f81534_set_port_config(port, baud, new_lcr); + status = f81534_set_port_config(port, tty, baud, old_baud, new_lcr); if (status < 0) { dev_err(&port->dev, "%s: set port config failed: %d\n", __func__, status); @@ -947,7 +1007,7 @@ static int f81534_get_serial_info(struct usb_serial_port *port, tmp.type = PORT_16550A; tmp.port = port->port_number; tmp.line = port->minor; - tmp.baud_base = F81534_MAX_BAUDRATE; + tmp.baud_base = port_priv->baud_base; if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) return -EFAULT; @@ -1221,6 +1281,7 @@ static int f81534_port_probe(struct usb_serial_port *port) if (!port_priv) return -ENOMEM; + port_priv->shadow_clk = F81534_UART_EN; spin_lock_init(&port_priv->msr_lock); mutex_init(&port_priv->mcr_mutex); mutex_init(&port_priv->lcr_mutex); -- 2.7.4