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,5/6] usb: serial: f81534: add H/W disable port support From: "Ji-Ze Hong \(Peter Hong\)" Message-Id: <1515653240-5420-5-git-send-email-hpeter+linux_kernel@gmail.com> Date: Thu, 11 Jan 2018 14:47:19 +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+Ci0tLQpWMzoKCTE6IFNlcGFyYXRlIG9sZCBwYXRjaCBpbnRv IHJlZmFjdGluZyBhbmQgSC9XIGRpc2FibGUgcGF0Y2hlcy4KClYyOgoJMTogZjgxNTM0X2NoZWNr X3BvcnRfaHdfZGlzYWJsZWQoKSBjaGFuZ2UgcmV0dXJuIHR5cGUgZnJvbSBpbnQgdG8gYm9vbC4K CTI6IEFkZCBoZWxwIGZ1bmN0aW9uIGY4MTUzNF9zZXRfcGh5X3BvcnRfcmVnaXN0ZXIoKSAvCgkg ICBmODE1MzRfZ2V0X3BoeV9wb3J0X3JlZ2lzdGVyKCkgZm9yIGY4MTUzNF9jaGVja19wb3J0X2h3 X2Rpc2FibGVkKCkKCSAgIHRvIHJlYWQgcmVnaXN0ZXIgd2l0aG91dCBwb3J0LgoJMzogUmUtd3Jp dGUgZjgxNTM0X2NhbGNfbnVtX3BvcnRzKCkgJiBmODE1MzRfYXR0YWNoKCkgdG8gcmVkdWNlIHRo ZQoJICAgZjgxNTM0X2NoZWNrX3BvcnRfaHdfZGlzYWJsZWQoKSByZXBlYXRlZGx5IGNhbGxlZC4K CiBkcml2ZXJzL3VzYi9zZXJpYWwvZjgxNTM0LmMgfCA4MSArKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCA4MSBpbnNlcnRpb25zKCsp CgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Y4MTUzNC5jIGIvZHJpdmVycy91c2Iv c2VyaWFsL2Y4MTUzNC5jCmluZGV4IGJjMGE0YmQ1ZGNlYy4uMDhlZjcyZWEyZWVjIDEwMDY0NAot LS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZjgxNTM0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFs L2Y4MTUzNC5jCkBAIC0zMDcsNiArMzA3LDIwIEBAIHN0YXRpYyBpbnQgZjgxNTM0X3NldF9tYXNr X3JlZ2lzdGVyKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIHUxNiByZWcsCiAJcmV0dXJuIGY4 MTUzNF9zZXRfcmVnaXN0ZXIoc2VyaWFsLCByZWcsIHRtcCk7CiB9CiAKK3N0YXRpYyBpbnQgZjgx NTM0X3NldF9waHlfcG9ydF9yZWdpc3RlcihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBpbnQg cGh5LAorCQkJCQl1MTYgcmVnLCB1OCBkYXRhKQoreworCXJldHVybiBmODE1MzRfc2V0X3JlZ2lz dGVyKHNlcmlhbCwgcmVnICsgRjgxNTM0X1VBUlRfT0ZGU0VUICogcGh5LAorCQkJCQlkYXRhKTsK K30KKworc3RhdGljIGludCBmODE1MzRfZ2V0X3BoeV9wb3J0X3JlZ2lzdGVyKHN0cnVjdCB1c2Jf c2VyaWFsICpzZXJpYWwsIGludCBwaHksCisJCQkJCXUxNiByZWcsIHU4ICpkYXRhKQoreworCXJl dHVybiBmODE1MzRfZ2V0X3JlZ2lzdGVyKHNlcmlhbCwgcmVnICsgRjgxNTM0X1VBUlRfT0ZGU0VU ICogcGh5LAorCQkJCQlkYXRhKTsKK30KKwogc3RhdGljIGludCBmODE1MzRfc2V0X3BvcnRfcmVn aXN0ZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgdTE2IHJlZywKIAkJCQkJdTggZGF0 YSkKIHsKQEAgLTczMyw2ICs3NDcsNzAgQEAgc3RhdGljIGludCBmODE1MzRfZmluZF9jb25maWdf aWR4KHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIHU4ICppbmRleCkKIH0KIAogLyoKKyAqIFRo ZSBGODE1MzIvNTM0IHdpbGwgbm90IHJlcG9ydCBzZXJpYWwgcG9ydCB0byBVU0Igc2VyaWFsIHN1 YnN5c3RlbSB3aGVuCisgKiBIL1cgRENEL0RTUi9DVFMvUkkvUlggcGluIGNvbm5lY3RlZCB0byBn cm91bmQuCisgKgorICogVG8gZGV0ZWN0IFJYIHBpbiBzdGF0dXMsIHdlJ2xsIGVuYWJsZSBNQ1Ig aW50ZXJhbCBsb29wYmFjaywgZGlzYWJsZSBpdCBhbmQKKyAqIGRlbGF5ZWQgZm9yIDYwbXMuIEl0 IGNvbm5lY3RlZCB0byBncm91bmQgSWYgTFNSIHJlZ2lzdGVyIHJlcG9ydCBVQVJUX0xTUl9CSS4K KyAqLworc3RhdGljIGJvb2wgZjgxNTM0X2NoZWNrX3BvcnRfaHdfZGlzYWJsZWQoc3RydWN0IHVz Yl9zZXJpYWwgKnNlcmlhbCwgaW50IHBoeSkKK3sKKwlpbnQgc3RhdHVzOworCXU4IG9sZF9tY3I7 CisJdTggbXNyOworCXU4IGxzcjsKKwl1OCBtc3JfbWFzazsKKworCW1zcl9tYXNrID0gVUFSVF9N U1JfRENEIHwgVUFSVF9NU1JfUkkgfCBVQVJUX01TUl9EU1IgfCBVQVJUX01TUl9DVFM7CisKKwlz dGF0dXMgPSBmODE1MzRfZ2V0X3BoeV9wb3J0X3JlZ2lzdGVyKHNlcmlhbCwgcGh5LAorCQkJCUY4 MTUzNF9NT0RFTV9TVEFUVVNfUkVHLCAmbXNyKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gZmFs c2U7CisKKwlpZiAoKG1zciAmIG1zcl9tYXNrKSAhPSBtc3JfbWFzaykKKwkJcmV0dXJuIGZhbHNl OworCisJc3RhdHVzID0gZjgxNTM0X3NldF9waHlfcG9ydF9yZWdpc3RlcihzZXJpYWwsIHBoeSwK KwkJCQlGODE1MzRfRklGT19DT05UUk9MX1JFRywgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfAorCQkJ CVVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKTsKKwlpZiAoc3RhdHVz KQorCQlyZXR1cm4gZmFsc2U7CisKKwlzdGF0dXMgPSBmODE1MzRfZ2V0X3BoeV9wb3J0X3JlZ2lz dGVyKHNlcmlhbCwgcGh5LAorCQkJCUY4MTUzNF9NT0RFTV9DT05UUk9MX1JFRywgJm9sZF9tY3Ip OworCWlmIChzdGF0dXMpCisJCXJldHVybiBmYWxzZTsKKworCXN0YXR1cyA9IGY4MTUzNF9zZXRf cGh5X3BvcnRfcmVnaXN0ZXIoc2VyaWFsLCBwaHksCisJCQkJRjgxNTM0X01PREVNX0NPTlRST0xf UkVHLCBVQVJUX01DUl9MT09QKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlz dGF0dXMgPSBmODE1MzRfc2V0X3BoeV9wb3J0X3JlZ2lzdGVyKHNlcmlhbCwgcGh5LAorCQkJCUY4 MTUzNF9NT0RFTV9DT05UUk9MX1JFRywgMHgwKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gZmFs c2U7CisKKwltc2xlZXAoNjApOworCisJc3RhdHVzID0gZjgxNTM0X2dldF9waHlfcG9ydF9yZWdp c3RlcihzZXJpYWwsIHBoeSwKKwkJCQlGODE1MzRfTElORV9TVEFUVVNfUkVHLCAmbHNyKTsKKwlp ZiAoc3RhdHVzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzdGF0dXMgPSBmODE1MzRfc2V0X3BoeV9w b3J0X3JlZ2lzdGVyKHNlcmlhbCwgcGh5LAorCQkJCUY4MTUzNF9NT0RFTV9DT05UUk9MX1JFRywg b2xkX21jcik7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKChsc3IgJiBV QVJUX0xTUl9CSSkgPT0gVUFSVF9MU1JfQkkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZh bHNlOworfQorCisvKgogICogV2UgaGFkIDIgZ2VuZXJhdGlvbiBvZiBGODE1MzIvNTM0IElDLiBB bGwgaGFzIGFuIGludGVybmFsIHN0b3JhZ2UuCiAgKgogICogMXN0IGlzIHB1cmUgVVNCLXRvLVRU TCBSUzIzMiBJQyBhbmQgZGVzaWduZWQgZm9yIDQgcG9ydHMgb25seSwgbm8gYW55CkBAIC04MjMs NiArOTAxLDkgQEAgc3RhdGljIGludCBmODE1MzRfY2FsY19udW1fcG9ydHMoc3RydWN0IHVzYl9z ZXJpYWwgKnNlcmlhbCwKIAogCS8qIE5ldyBzdHlsZSwgZmluZCBhbGwgcG9zc2libGUgcG9ydHMg Ki8KIAlmb3IgKGkgPSAwOyBpIDwgRjgxNTM0X05VTV9QT1JUOyArK2kpIHsKKwkJaWYgKGY4MTUz NF9jaGVja19wb3J0X2h3X2Rpc2FibGVkKHNlcmlhbCwgaSkpCisJCQlzZXJpYWxfcHJpdi0+Y29u Zl9kYXRhW2ldIHw9IEY4MTUzNF9QT1JUX1VOQVZBSUxBQkxFOworCiAJCWlmIChzZXJpYWxfcHJp di0+Y29uZl9kYXRhW2ldICYgRjgxNTM0X1BPUlRfVU5BVkFJTEFCTEUpCiAJCQljb250aW51ZTsK IAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932414AbeAKGsH (ORCPT + 1 other); Thu, 11 Jan 2018 01:48:07 -0500 Received: from mail-pf0-f193.google.com ([209.85.192.193]:40842 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932387AbeAKGra (ORCPT ); Thu, 11 Jan 2018 01:47:30 -0500 X-Google-Smtp-Source: ACJfBotGIfb5d8OKaOicSgrxKBFGyEJdI2I19yUBtN0V096Z5NBKfFIjLXzZHlr7xm9x4u85GKkvXQ== 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 5/6] usb: serial: f81534: add H/W disable port support Date: Thu, 11 Jan 2018 14:47:19 +0800 Message-Id: <1515653240-5420-5-git-send-email-hpeter+linux_kernel@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515653240-5420-1-git-send-email-hpeter+linux_kernel@gmail.com> References: <1515653240-5420-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) --- V3: 1: Separate old patch into refacting and H/W disable patches. 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 | 81 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/drivers/usb/serial/f81534.c b/drivers/usb/serial/f81534.c index bc0a4bd5dcec..08ef72ea2eec 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) { @@ -733,6 +747,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 @@ -823,6 +901,9 @@ 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 (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; -- 2.7.4