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,1/5] usb: serial: f81534: add high baud rate support From: "Ji-Ze Hong \(Peter Hong\)" Message-Id: <1515032961-29131-1-git-send-email-hpeter+linux_kernel@gmail.com> Date: Thu, 4 Jan 2018 10:29:17 +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 ZykgPGhwZXRlcitsaW51eF9rZXJuZWxAZ21haWwuY29tPgotLS0KdjI6CgkxOiBBZGQgY29tbWl0 IG1lc3NhZ2UgZm9yIEY4MTUzNF9VU0JfVElNRU9VVCBmcm9tIDEwMDAgdG8gMjAwMCBhbmQKCSAg IHRyaWdnZXIgbGV2ZWwgZnJvbSBVQVJUX0ZDUl9SX1RSSUdfMTEgdG8gVUFSVF9GQ1JfVFJJR0dF Ul84LgoJMjogU2VwYXJhdGUgVUFSVCBFbmFibGUgYml0IGZyb20gY2xvY2sgc291cmNlcy4KCTM6 IEFkZCBoZWxwIGZ1bmN0aW9uICJmODE1MzRfZmluZF9jbGsoKSIgdG8gY2FsY3VsYXRlIGJhdWQg cmF0ZSBhbmQKCSAgIGNsb2NrIHNvdXJjZQoJNDogQWRkIHNoYWRvdyBjbG9jayByZWdpc3RlciBm b3IgZnV0dXJlIHVzZS4gCgogZHJpdmVycy91c2Ivc2VyaWFsL2Y4MTUzNC5jIHwgODcgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwg NzEgaW5zZXJ0aW9ucygrKSwgMTYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91 c2Ivc2VyaWFsL2Y4MTUzNC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Y4MTUzNC5jCmluZGV4IGU0 NTczYjRjODkzNS4uNzU4ZWYwNDI0MTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwv ZjgxNTM0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Y4MTUzNC5jCkBAIC00MSw2ICs0MSw3 IEBACiAjZGVmaW5lIEY4MTUzNF9NT0RFTV9DT05UUk9MX1JFRwkoMHgwNCArIEY4MTUzNF9VQVJU X0JBU0VfQUREUkVTUykKICNkZWZpbmUgRjgxNTM0X0xJTkVfU1RBVFVTX1JFRwkJKDB4MDUgKyBG ODE1MzRfVUFSVF9CQVNFX0FERFJFU1MpCiAjZGVmaW5lIEY4MTUzNF9NT0RFTV9TVEFUVVNfUkVH CQkoMHgwNiArIEY4MTUzNF9VQVJUX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgRjgxNTM0X0NMT0NL X1JFRwkJKDB4MDggKyBGODE1MzRfVUFSVF9CQVNFX0FERFJFU1MpCiAjZGVmaW5lIEY4MTUzNF9D T05GSUcxX1JFRwkJKDB4MDkgKyBGODE1MzRfVUFSVF9CQVNFX0FERFJFU1MpCiAKICNkZWZpbmUg RjgxNTM0X0RFRl9DT05GX0FERFJFU1NfU1RBUlQJMHgzMDAwCkBAIC01Nyw3ICs1OCw3IEBACiAK IC8qIERlZmF1bHQgVVJCIHRpbWVvdXQgZm9yIFVTQiBvcGVyYXRpb25zICovCiAjZGVmaW5lIEY4 MTUzNF9VU0JfTUFYX1JFVFJZCQkxMAotI2RlZmluZSBGODE1MzRfVVNCX1RJTUVPVVQJCTEwMDAK KyNkZWZpbmUgRjgxNTM0X1VTQl9USU1FT1VUCQkyMDAwCiAjZGVmaW5lIEY4MTUzNF9TRVRfR0VU X1JFR0lTVEVSCQkweEEwCiAKICNkZWZpbmUgRjgxNTM0X05VTV9QT1JUCQkJNApAQCAtOTYsNyAr OTcsNiBAQAogI2RlZmluZSBGODE1MzRfQ01EX1JFQUQJCQkweDAzCiAKICNkZWZpbmUgRjgxNTM0 X0RFRkFVTFRfQkFVRF9SQVRFCTk2MDAKLSNkZWZpbmUgRjgxNTM0X01BWF9CQVVEUkFURQkJMTE1 MjAwCiAKICNkZWZpbmUgRjgxNTM0X1BPUlRfQ09ORl9ESVNBQkxFX1BPUlQJQklUKDMpCiAjZGVm aW5lIEY4MTUzNF9QT1JUX0NPTkZfTk9UX0VYSVNUX1BPUlQJQklUKDcpCkBAIC0xMDYsNiArMTA2 LDIzIEBACiAjZGVmaW5lIEY4MTUzNF8xWF9SWFRSSUdHRVIJCTB4YzMKICNkZWZpbmUgRjgxNTM0 XzhYX1JYVFJJR0dFUgkJMHhjZgogCisvKgorICogRjgxNTMyLzUzNCBDbG9jayByZWdpc3RlcnMg KG9mZnNldCArMDhoKQorICoKKyAqIEJpdDA6CVVBUlQgRW5hYmxlIChhbHdheXMgb24pCisgKiBC aXQyLTE6CUNsb2NrIHNvdXJjZSBzZWxlY3RvcgorICoJCQkwMDogMS44NDZNSHouCisgKgkJCTAx OiAxOC40Nk1Iei4KKyAqCQkJMTA6IDI0TUh6LgorICoJCQkxMTogMTQuNzdNSHouCisgKi8KKwor I2RlZmluZSBGODE1MzRfVUFSVF9FTgkJCUJJVCgwKQorI2RlZmluZSBGODE1MzRfQ0xLXzFfODQ2 X01IWgkJRjgxNTM0X1VBUlRfRU4KKyNkZWZpbmUgRjgxNTM0X0NMS18xOF80Nl9NSFoJCShGODE1 MzRfVUFSVF9FTiB8IEJJVCgxKSkKKyNkZWZpbmUgRjgxNTM0X0NMS18yNF9NSFoJCShGODE1MzRf VUFSVF9FTiB8IEJJVCgyKSkKKyNkZWZpbmUgRjgxNTM0X0NMS18xNF83N19NSFoJCShGODE1MzRf VUFSVF9FTiB8IEJJVCgxKSB8IEJJVCgyKSkKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2 aWNlX2lkIGY4MTUzNF9pZF90YWJsZVtdID0gewogCXsgVVNCX0RFVklDRShGSU5URUtfVkVORE9S X0lEXzEsIEZJTlRFS19ERVZJQ0VfSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZJTlRFS19WRU5ET1Jf SURfMiwgRklOVEVLX0RFVklDRV9JRCkgfSwKQEAgLTEyOSwxMiArMTQ2LDE4IEBAIHN0cnVjdCBm ODE1MzRfcG9ydF9wcml2YXRlIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCXVu c2lnbmVkIGxvbmcgdHhfZW1wdHk7CiAJc3BpbmxvY2tfdCBtc3JfbG9jazsKKwl1MzIgYmF1ZF9i YXNlOwogCXU4IHNoYWRvd19tY3I7CiAJdTggc2hhZG93X2xjcjsKIAl1OCBzaGFkb3dfbXNyOwor CXU4IHNoYWRvd19jbGs7CiAJdTggcGh5X251bTsKIH07CiAKK3N0YXRpYyB1MzIgY29uc3QgYmF1 ZHJhdGVfdGFibGVbXSA9IHsxMTUyMDAsIDkyMTYwMCwgMTE1MjAwMCwgMTUwMDAwMH07CitzdGF0 aWMgdTggY29uc3QgY2xvY2tfdGFibGVbXSA9IHtGODE1MzRfQ0xLXzFfODQ2X01IWiwgRjgxNTM0 X0NMS18xNF83N19NSFosCisJCQkJRjgxNTM0X0NMS18xOF80Nl9NSFosIEY4MTUzNF9DTEtfMjRf TUhafTsKKwogc3RhdGljIGludCBmODE1MzRfbG9naWNfdG9fcGh5X3BvcnQoc3RydWN0IHVzYl9z ZXJpYWwgKnNlcmlhbCwKIAkJCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKQEAg LTQ2MCwxMyArNDgzLDQ4IEBAIHN0YXRpYyB1MzIgZjgxNTM0X2NhbGNfYmF1ZF9kaXZpc29yKHUz MiBiYXVkcmF0ZSwgdTMyIGNsb2NrcmF0ZSkKIAlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QoY2xv Y2tyYXRlLCBiYXVkcmF0ZSk7CiB9CiAKLXN0YXRpYyBpbnQgZjgxNTM0X3NldF9wb3J0X2NvbmZp ZyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCB1MzIgYmF1ZHJhdGUsCi0JCQkJCXU4IGxj cikKK3N0YXRpYyBpbnQgZjgxNTM0X2ZpbmRfY2xrKHUzMiBiYXVkcmF0ZSkKK3sKKwlpbnQgaWR4 OworCisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKGJhdWRyYXRlX3RhYmxlKTsgKytp ZHgpIHsKKwkJaWYgKGJhdWRyYXRlIDw9IGJhdWRyYXRlX3RhYmxlW2lkeF0gJiYKKwkJCQliYXVk cmF0ZV90YWJsZVtpZHhdICUgYmF1ZHJhdGUgPT0gMCkKKwkJCXJldHVybiBpZHg7CisJfQorCisJ cmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZjgxNTM0X3NldF9wb3J0X2NvbmZpZyhz dHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1 MzIgYmF1ZHJhdGUsIHUzMiBvbGRfYmF1ZHJhdGUsIHU4IGxjcikKIHsKIAlzdHJ1Y3QgZjgxNTM0 X3BvcnRfcHJpdmF0ZSAqcG9ydF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQp OwogCXUzMiBkaXZpc29yOwogCWludCBzdGF0dXM7CisJaW50IGk7CisJaW50IGlkeDsKIAl1OCB2 YWx1ZTsKKwl1MzIgYmF1ZF9saXN0W10gPSB7YmF1ZHJhdGUsIG9sZF9iYXVkcmF0ZSwgRjgxNTM0 X0RFRkFVTFRfQkFVRF9SQVRFfTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJhdWRf bGlzdCk7ICsraSkgeworCQlpZHggPSBmODE1MzRfZmluZF9jbGsoYmF1ZF9saXN0W2ldKTsKKwkJ aWYgKGlkeCA+PSAwKSB7CisJCQliYXVkcmF0ZSA9IGJhdWRfbGlzdFtpXTsKKwkJCXR0eV9lbmNv ZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZHJhdGUsIGJhdWRyYXRlKTsKKwkJCWJyZWFrOworCQl9CisJ fQorCisJcG9ydF9wcml2LT5iYXVkX2Jhc2UgPSBiYXVkcmF0ZV90YWJsZVtpZHhdOworCXBvcnRf cHJpdi0+c2hhZG93X2NsayA9IGNsb2NrX3RhYmxlW2lkeF07CisKKwlzdGF0dXMgPSBmODE1MzRf c2V0X3BvcnRfcmVnaXN0ZXIocG9ydCwgRjgxNTM0X0NMT0NLX1JFRywKKwkJCXBvcnRfcHJpdi0+ c2hhZG93X2Nsayk7CisJaWYgKHN0YXR1cykgeworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJDTE9D S19SRUcgc2V0dGluZyBmYWlsZWRcbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KIAogCWlmIChi YXVkcmF0ZSA8PSAxMjAwKQogCQl2YWx1ZSA9IEY4MTUzNF8xWF9SWFRSSUdHRVI7CS8qIDEyOCBG SUZPICYgVEw6IDF4ICovCkBAIC00ODIsNyArNTQwLDcgQEAgc3RhdGljIGludCBmODE1MzRfc2V0 X3BvcnRfY29uZmlnKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHUzMiBiYXVkcmF0ZSwK IAlpZiAoYmF1ZHJhdGUgPD0gMTIwMCkKIAkJdmFsdWUgPSBVQVJUX0ZDUl9UUklHR0VSXzEgfCBV QVJUX0ZDUl9FTkFCTEVfRklGTzsgLyogVEw6IDEgKi8KIAllbHNlCi0JCXZhbHVlID0gVUFSVF9G Q1JfUl9UUklHXzExIHwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk87IC8qIFRMOiAxNCAqLworCQl2YWx1 ZSA9IFVBUlRfRkNSX1RSSUdHRVJfOCB8IFVBUlRfRkNSX0VOQUJMRV9GSUZPOyAvKiBUTDogOCAq LwogCiAJc3RhdHVzID0gZjgxNTM0X3NldF9wb3J0X3JlZ2lzdGVyKHBvcnQsIEY4MTUzNF9GSUZP X0NPTlRST0xfUkVHLAogCQkJCQkJdmFsdWUpOwpAQCAtNDkxLDcgKzU0OSw3IEBAIHN0YXRpYyBp bnQgZjgxNTM0X3NldF9wb3J0X2NvbmZpZyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCB1 MzIgYmF1ZHJhdGUsCiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0JZGl2aXNvciA9IGY4MTUzNF9j YWxjX2JhdWRfZGl2aXNvcihiYXVkcmF0ZSwgRjgxNTM0X01BWF9CQVVEUkFURSk7CisJZGl2aXNv ciA9IGY4MTUzNF9jYWxjX2JhdWRfZGl2aXNvcihiYXVkcmF0ZSwgYmF1ZHJhdGVfdGFibGVbaWR4 XSk7CiAKIAltdXRleF9sb2NrKCZwb3J0X3ByaXYtPmxjcl9tdXRleCk7CiAKQEAgLTc0MSw2ICs3 OTksNyBAQCBzdGF0aWMgdm9pZCBmODE1MzRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3Qg KnR0eSwKIAl1OCBuZXdfbGNyID0gMDsKIAlpbnQgc3RhdHVzOwogCXUzMiBiYXVkOworCXUzMiBv bGRfYmF1ZDsKIAogCWlmIChDX0JBVUQodHR5KSA9PSBCMCkKIAkJZjgxNTM0X3VwZGF0ZV9tY3Ry bChwb3J0LCAwLCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOwpAQCAtNzgwLDE4ICs4MzksMTQgQEAg c3RhdGljIHZvaWQgZjgxNTM0X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJ aWYgKCFiYXVkKQogCQlyZXR1cm47CiAKLQlpZiAoYmF1ZCA+IEY4MTUzNF9NQVhfQkFVRFJBVEUp IHsKLQkJaWYgKG9sZF90ZXJtaW9zKQotCQkJYmF1ZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZShv bGRfdGVybWlvcyk7Ci0JCWVsc2UKLQkJCWJhdWQgPSBGODE1MzRfREVGQVVMVF9CQVVEX1JBVEU7 Ci0KLQkJdHR5X2VuY29kZV9iYXVkX3JhdGUodHR5LCBiYXVkLCBiYXVkKTsKLQl9CisJaWYgKG9s ZF90ZXJtaW9zKQorCQlvbGRfYmF1ZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZShvbGRfdGVybWlv cyk7CisJZWxzZQorCQlvbGRfYmF1ZCA9IEY4MTUzNF9ERUZBVUxUX0JBVURfUkFURTsKIAogCWRl dl9kYmcoJnBvcnQtPmRldiwgIiVzOiBiYXVkOiAlZFxuIiwgX19mdW5jX18sIGJhdWQpOwogCi0J c3RhdHVzID0gZjgxNTM0X3NldF9wb3J0X2NvbmZpZyhwb3J0LCBiYXVkLCBuZXdfbGNyKTsKKwlz dGF0dXMgPSBmODE1MzRfc2V0X3BvcnRfY29uZmlnKHBvcnQsIHR0eSwgYmF1ZCwgb2xkX2JhdWQs IG5ld19sY3IpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVz OiBzZXQgcG9ydCBjb25maWcgZmFpbGVkOiAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgc3RhdHVzKTsK QEAgLTk0Nyw3ICsxMDAyLDcgQEAgc3RhdGljIGludCBmODE1MzRfZ2V0X3NlcmlhbF9pbmZvKHN0 cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJdG1wLnR5cGUgPSBQT1JUXzE2NTUwQTsKIAl0 bXAucG9ydCA9IHBvcnQtPnBvcnRfbnVtYmVyOwogCXRtcC5saW5lID0gcG9ydC0+bWlub3I7Ci0J dG1wLmJhdWRfYmFzZSA9IEY4MTUzNF9NQVhfQkFVRFJBVEU7CisJdG1wLmJhdWRfYmFzZSA9IHBv cnRfcHJpdi0+YmF1ZF9iYXNlOwogCiAJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBz aXplb2YoKnJldGluZm8pKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752087AbeADC33 (ORCPT + 1 other); Wed, 3 Jan 2018 21:29:29 -0500 Received: from mail-pl0-f68.google.com ([209.85.160.68]:33761 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751946AbeADC31 (ORCPT ); Wed, 3 Jan 2018 21:29:27 -0500 X-Google-Smtp-Source: ACJfBosycP0oY2cctiAYSxB2FJCT/fs1NsdhI4rQaohQcDdk6BSF2ALKMcmA6UEzT2yE0o/GrEpeSg== 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 1/5] usb: serial: f81534: add high baud rate support Date: Thu, 4 Jan 2018 10:29:17 +0800 Message-Id: <1515032961-29131-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) --- 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 | 87 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 16 deletions(-) diff --git a/drivers/usb/serial/f81534.c b/drivers/usb/serial/f81534.c index e4573b4c8935..758ef0424164 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,23 @@ #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 F81534_UART_EN +#define F81534_CLK_18_46_MHZ (F81534_UART_EN | BIT(1)) +#define F81534_CLK_24_MHZ (F81534_UART_EN | BIT(2)) +#define F81534_CLK_14_77_MHZ (F81534_UART_EN | BIT(1) | BIT(2)) + 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 +146,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 +483,48 @@ 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; + } + } + + port_priv->baud_base = baudrate_table[idx]; + 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 +540,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 +549,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, baudrate_table[idx]); mutex_lock(&port_priv->lcr_mutex); @@ -741,6 +799,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 +839,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 +1002,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; -- 2.7.4