From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754412AbcIIL1P (ORCPT ); Fri, 9 Sep 2016 07:27:15 -0400 Received: from mail-sn1nam01on0065.outbound.protection.outlook.com ([104.47.32.65]:29218 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754326AbcIIL1K (ORCPT ); Fri, 9 Sep 2016 07:27:10 -0400 X-Greylist: delayed 1151 seconds by postgrey-1.27 at vger.kernel.org; Fri, 09 Sep 2016 07:27:10 EDT Authentication-Results: spf=pass (sender IP is 149.199.60.100) smtp.mailfrom=xilinx.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=bestguesspass action=none header.from=xilinx.com; From: Nava kishore Manne To: , , , , , , , , , CC: Nava kishore Manne Subject: [PATCH 1/2] serial: xuartps: Adds RXBS register support for zynqmp Date: Fri, 9 Sep 2016 16:23:21 +0530 Message-ID: <1473418402-34855-1-git-send-email-navam@xilinx.com> X-Mailer: git-send-email 2.1.2 X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.0.0.1202-22564.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.100;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(438002)(189002)(199003)(81166006)(19580405001)(33646002)(52956003)(5660300001)(48376002)(19580395003)(7846002)(356003)(305945005)(47776003)(36756003)(626004)(50466002)(92566002)(189998001)(46386002)(5003940100001)(90966002)(50226002)(4001430100002)(50986999)(2906002)(2201001)(86362001)(5001770100001)(63266004)(106466001)(8936002)(8676002)(87936001)(229853001)(36386004)(45336002)(4326007)(107886002)(586003)(42186005)(103686003)(81156014)(107986001)(921003)(1121003)(83996005)(5001870100001)(2101003);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR02MB1691;H:xsj-pvapsmtpgw02;FPR:;SPF:Pass;PTR:unknown-60-100.xilinx.com,xapps1.xilinx.com;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CY1NAM02FT003;1:jWESgZiOXptUCarKTrWvLMdlinumqBfWf72pkKd/zidV7WGTpVKV4OgPsdXyWa368BoHniQCRh6BYAQa+11/+kRuIW2Y/i8skN4R/bz9sphsa0w0Q+Ra0/5L26qBv5INy1PyKdBty4sY2EwLfvVN9oDixkDo3c9gw9VyL+j4rqnhuam6XIFnYdSVwj5wbp5Wyp5ctN25+nFrxESP8dIjETXIs+03j/VECHBtPql2ljVtrV90FJRSZJZ+2reuuSkTBu5g9QEwb5CAWlvACDVjCRaswKE0MQUQxxpjBjuVbdAWXWjbdse1udMf3GUReQEIthwM6Nlzl8f9vpj4QJrpbmvxE7vMhlXDjxNzRXi9BeHWjhpGPD9Xf/l5yTggIX4v2+SLpNzQ73azzrzS8uzKe+0K4zFR18LuOo2WK9kr/4gLXjJ9nketz+4aqy/myODdMA3DHT8wXAJjs8t/DuHtbcToVxjn7/mrKGivObcS59bPhCTIzqSiHMX0/aytlfhbAv6Z3h0bsuQgWvPwDG/H7EPDYxIQTZNdXod87GM1lD/cMsJTnyqlx/8DY3H9PoQgcK5qA87vPihIW7YE1LD9iRlkZI3lAsQz/VB+Xk3kGlPyVN62koM6lvigbCd4eKRt MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 7b84b8fa-8955-4454-a2d0-08d3d89f9166 X-Microsoft-Exchange-Diagnostics: 1;CY1PR02MB1691;2:pVWaCM9qzBVnYCLKJxXwVB3sZgwFxxW174ScQ4vSz9ylJHHYrKfku83QEzej9Vwy/2URUSCcnrDKSckObD7oAGe+S4UINxKpD4HohIhvTP2hzmYsl9ddh/0NyExsGiTjbj5hCU5YeK0stwW1uSpqCqqaWx3fCI+PqIK1HcM0wKVHrBLkbi4dHwzVHQcBuDsV;3:KUWFGzigmcUIWhnbJcr2prHlNDAYsJz3xpjxZLf866ypyZBioVc4te4t0doauwQ+OpUNRdw9I58037oTb0w88y7OdA9zQfh8XaIGruCFGU/296mh1uu5Z4KOJAJXT36euFpA4EWeYXMqizBraLhS2HRPhNj/ov0BpgbZWFVk4i4ecQEpEIqlR/08EKTeQtj8q5D7oD9Kbfo3JsCfWPb7DR4nyVWKkNEJNlZChfGoi0RRmG/LrEstgOX83Dn7x5ArvY69/qzgFakVU5Z5kz4Qcg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(8251501002);SRVR:CY1PR02MB1691; X-Microsoft-Exchange-Diagnostics: 1;CY1PR02MB1691;25:PHAEvZ8NJMUwICnQcsKYZMsnniGA3CMimqJL1k/sxDYdnpaeZt35A42vis8j5+CrYqcxB6v8hB4twdoHBYL7nqdM+Cs0h4yd0fAyUME6XyULq+1kKVZv++kPywWnv3chtUWmFZYF7mwmjul1Usjn/26Q+6TVg3oa0QP0Uxnj+atlQYhQA9hubUdXZXWyXU6j+9E18SuEqN5iPjmVpJyK7+pGVEEO5+b8soBAgZuyWVxxR+XG8cC1l0LomvdXEjKbFsTcMJ96Vz+9LQmDMTXthuYhYcCJh0IRQ0wvFY1158pCl1ndfQ4+EaBuR0XX2x9jCLxQYFQNTCNCjEAmXkC9AMR97BrTtzMYJp5wYiLWGcYK3U1zTam7FygaeSQfSXCmEGmy/fr9yO506l4S3eBkmWwHL1KE4SHR28+PTzCwM2ds9yY7yu0rGiqOPRDzEGd9friBmeiLotzpm8QNW0cTvQmj8/i/b2OKCEGA9A5JcHMFg2xqpukoQarPW3w0486EkiUXBMY/TeVh/4LvS6VttfwQNeRJ0xoFacvao5ssM8b6mGXGrcN3q9N6vQhfQ5t3bCrw2KYLBlwgToWHd96CCb1mHLtxDS+n9ypQdsC6CHE67k21DcSPdBvxAczvYNa5qykVuCS/0aKfoJKA3zvnjYG6fQYtUCrqeL6bGcU2ezjm6kfl1j9O/1oOeOs7OS8lbnnj04LK0CNt5k9nslDVqTbfOHTWP4Ju/ccyr8OoUef83HfT5YY81oF1hwbyNm4NgbOjaxEmkN7J+Sfmdnsn7Rf1Ro3zEiG907FoRhZa6OoSFq34D/TFIGNY6NRvp/8a X-Microsoft-Exchange-Diagnostics: 1;CY1PR02MB1691;31:n4e5h01EFZE9Uq2sk+JrquNCTGWP9X1HXn6uO20qZbkGVQ+yeuJBW3iBJKNlXg99MBHY0M1mEleoLzWDpokz561QpTDjL3nfAkG8+ByKxKv2uHxMYwd2WI65Zyl9BELlPRsNsVxZeHD47sdo1UtohLiQJdYeJu6VTM1SXO+xqtJjLfG09ZaA2bjNClY1LvS4Qkelo47xZKzFPql0WWyQrSGHv+6w+HXSgyZf4GXUV2w=;20:wky0J/XYLPdYtRnkB3Xyk72C0f7QtiA+aM78No9SxWYiQUibnPS4+qaFHB+aPEXUfDd4x1lpAmzfJfBFpunAyuVcNykKbWra9j3TZ3Yl8UrzDIdo79epYvRHpKKfrWE9TTEMQKqGvr/3dSyBVjuH8MD1fJ1Kk8ZGcatlaUEQrIenScuXnEWdtl5eKe+7SV2MoHOaSM3lGTcWphBLi7Nii41yqYqwk7vye+pWm+J2dLBwCgqXsSe5SVvmnJ1V3AO4DccGXjwRUYIUI8BLw3+x12OYi+yhxN5IjUKcbBJ8sq1LeYs0/8NSQQRLljPWcxWnO97/rTO8ZaS4yCE1wvpS6JE5JwGd56FXqa+9VR69Cz/JkXTOQDqqgYsXsPsweWqJfwFyX0KSXELz/7E8lJJ6a3kbPqLvabgc8AzkG/YUsDU4YpdPa8mxslKB0tmCLA6qVAyqvGR+j7KGRg+7IukPKY32KchmPNIuikGIM+1HKtxcWRFC/PQvWDAHpdxV/R+z X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(13015025)(13017025)(13023025)(13018025)(13024025)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:CY1PR02MB1691;BCL:0;PCL:0;RULEID:;SRVR:CY1PR02MB1691; X-Microsoft-Exchange-Diagnostics: 1;CY1PR02MB1691;4:ORgNfa24rgwBILZ5wYS/jdU1HZFgMp2U1r2UUbuUl2gxDyiqf0Y0BFXqAEVsDPgXq+G+4ANG8pSX5+Wmsjm1lJpuwM9z56GSRXc9k4RLCi3F2kASLiwkWlLjqP15CvbUmoeIeJxK83GmUFbL7qUmB1xsR0AKT/bAepW8gnTMNjui/2J7gHETSoRFSMHmip91ydTrAgROLWgEuCGbYP4eBIrR8Tn9f5vPUtvv7uIIJf4XD4YmjzzrQGlRLBIkGj56wro8MI2sMMhcKIsA/GtYhjflOMt37YQQXZ36wo8vumBL2vSjCeMeHeHFBL3rrjW1MbNceRO/GnmTIIZP+VSSH7d7XUBDXZOMuBVQD97V2HYGd1wkeDnd6HsgPiszoqovNd9JAWnpY5sgrKV/n+lh4D78ts4X+bPSI+azyV0Av1ojOuheGbsMpmyux4wsgOS1lWzpmE1DmrS7LdGei66or2C7LFqW7QQWyETl/80QM49qk2SsFu2Sg+9KdpSSvc2K5zPzqtNd6vzcNZ95q6bQpYpQ6rkquWxQSKV87zv+Y5Y= X-Forefront-PRVS: 00603B7EEF X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR02MB1691;23:zTxkHyK25RZzAYOcsAMvM6noyZssA7zhjJ9X8o1aQ?= =?us-ascii?Q?oZ4ou9nBVo88+Kd6HValm+9VMjpJWduXHPskMfy3WChL7lN7T/5WlEVB4vDM?= =?us-ascii?Q?7vYaiL87Bw+X4VuwvI0D8AALzM7L9V/ET4Ytx4QQ5F24x0zbVpT+r+AhTybJ?= =?us-ascii?Q?nxb49ySuscieR3ByjOQlisZ+SNlM2yQF6G34ercHM1/P+JR0YtTBmC+B6691?= =?us-ascii?Q?JjCjOVNDGzbbo+1C4YkZnKIOL0u2a6Fk2pbNXCuMC10yrqW0WMYAmNp8Zfvm?= =?us-ascii?Q?WEuexuh4qsqVdIss5az4b4KJ7/UVp9AQGEE7ux/pBwzYqKKpdjXQ+yQ+7A3/?= =?us-ascii?Q?Y7/rkiDFjgeOZ4hKQmA2+/aEGeT0E5N8JaAIJ2vncCz1cbp0cmDK+vMeXeJ3?= =?us-ascii?Q?+T+AyrzpOIf+IC6XwVQx0dUqLD9tavbKsH7lyLeQCIwqlguoCaFzCScXmBar?= =?us-ascii?Q?HqFGHxbxUEWtlLKE+uKuJB/1/MYHKOSEWsnA1mrKEgYhdWO1QiLPKm0ghLA0?= =?us-ascii?Q?AEyV5aRItGuafv22FugWbWGBzKsr9cJlOxlcXrqfw5HjUNAi0nyLqcl4r19B?= =?us-ascii?Q?pYuz7VbdwlEjZNxM+y1L1W6aAeJ1oZlLAAF5cLOdELt56ibakWRfm+eLSbKp?= =?us-ascii?Q?ZGnDWRfTyrqXO/PfBTXMUYdmgupfpKNEqN4H59gh1cfKNU2thgZcyKGWxPE4?= =?us-ascii?Q?0z68r8j11uwz1vYOgeiKjvlR/KY3vkgdsHuy47nQR1+lOkFty2ekiCmWcoQa?= =?us-ascii?Q?2PSx6WWIjgtCj82XLlfJQpxweUIE9LtrQBU/0qvPjsO/nHaWKa/5g1PSqAX/?= =?us-ascii?Q?h9HyWND26wdih76iH32Gxjsq/VfL5MUCQMtuZ4IhKZBUPAkNeQEKYsqu4kkV?= =?us-ascii?Q?qyWI2pCKaMNhgwmfircfD+cZNJlLm6tzzGav6PMTdHdqs+IS7eDVOSLFi+Zn?= =?us-ascii?Q?rRrfPGN2b1bdjzcAihq1FObNsVfV0BExWvrk1CYaa7MqXSO9WAJ+0deSIhwg?= =?us-ascii?Q?faNQlV4Eo06kSeZW35U4NM+ygJErUVtGXOJkaqnI7c35VIT8dNBedXl5aSOS?= =?us-ascii?Q?ChtYKG1OnlgW/KsQAqBtJrjkF555lHfOImwbvsqku2mapP4asRpsoEBkf2gh?= =?us-ascii?Q?M/REhz4Re8ODW3p7yq+DYBkDZOePpF1IrWylBmikSL0JsnMI4WWKNX7DQm3f?= =?us-ascii?Q?bvBIZXb5hmwUmE81GGvkYKoA+uvEYDnwZkicQJWD9sY2JyRRBAs+ZCjCDXcq?= =?us-ascii?Q?JplHheOgc02Gsi+UL8=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR02MB1691;6:ZLWHtAc+aN98pdiRQ3BQbsRjfe225QMQhi0V7B8Kv5Ey5EKwmVwuUoX16Qr3CmtfOCR+pfSibtBRw5+fqnbthgoaNgMxZ3bSN9Kq0ohh0ETia4R9f1U/gOIfq60QPPKBViAkR95OT2PaKKLmHa8ald2kZizojPKctVi5pPh19EI/PeyWz6H8OqDE28yQRjXIGDF8UeF7aY5tFQ1hQ0Z7g5tM3LXWO/ooilSilqDAIYi3faLl1Qn2a+J4st7+Jl1n/m0jGH0ZvwYP3u3zmPKhTDQQxwNx+Nwq7dcyTYLJoXX2aFVL7swrmShYP8ulzGY8yar/wN9exVZL3wZ04WExoQ==;5:fGWmA0wnelDdeQr/hp/pYvXiiuaKqjAT4UW71ZlpNEb/AlFTlbgfGqpOVnQsjFjQdPTwVNtwQmQ0ktvVF1E8rDyv2xgTsaJINhYM/52FyQoSHcu0CvWT/mtI2Q+ng7+vwYJJiteAaEs7PYxiTemJKg==;24:TtUMX6e9+z+ZqO52Svkz+HRY3Jy7ve5qlvvl0Lz2DtARsCQr05bfzbBg4Y3WlyAoptsV4j+mP96Qlcc2Q4Th7YvSoVxdlQX7oyzX+ukr2Hs=;7:kHslyS4KyxZfYzLwj8vTARFCK3AeyCkzHUM5sS+P9p+2hJExXOT/H05YaLv4u4uLWv9JTZo1TvN0F2uaR4PwSbI48jbTFtgC6DoUiQy48M/Al+bSJmpsPJaxxLqR4O7wNdibgwPe2KdfsHXtM5XnWenUUlI0tME313EOs17LgU5X4qygPe79xFpogum58tq+OFfGXAq8JULZhk4pPFQvxymKf4PnSL/AfSJV4Ml6cNbiuocIkLBmGpkBxSfzTqnZ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2016 10:53:43.4256 (UTC) X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.100];Helo=[xsj-pvapsmtpgw02] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR02MB1691 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds RXBS register access support for zynqmp. To avoid the corner error conditions it will consider only RXBS[2:0] bits while checking the error conditions (Parity,Framing and BRAK). Signed-off-by: Nava kishore Manne --- drivers/tty/serial/xilinx_uartps.c | 101 +++++++++++++++++++++++++++++-------- 1 file changed, 81 insertions(+), 20 deletions(-) diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c index 9ca1a4d..efd7f73 100644 --- a/drivers/tty/serial/xilinx_uartps.c +++ b/drivers/tty/serial/xilinx_uartps.c @@ -57,7 +57,7 @@ MODULE_PARM_DESC(rx_timeout, "Rx timeout, 1-255"); #define CDNS_UART_IMR 0x10 /* Interrupt Mask */ #define CDNS_UART_ISR 0x14 /* Interrupt Status */ #define CDNS_UART_BAUDGEN 0x18 /* Baud Rate Generator */ -#define CDNS_UART_RXTOUT 0x1C /* RX Timeout */ +#define CDNS_UART_RXTOUT 0x1C /* RX Timeout */ #define CDNS_UART_RXWM 0x20 /* RX FIFO Trigger Level */ #define CDNS_UART_MODEMCR 0x24 /* Modem Control */ #define CDNS_UART_MODEMSR 0x28 /* Modem Status */ @@ -68,6 +68,7 @@ MODULE_PARM_DESC(rx_timeout, "Rx timeout, 1-255"); #define CDNS_UART_IRRX_PWIDTH 0x3C /* IR Min Received Pulse Width */ #define CDNS_UART_IRTX_PWIDTH 0x40 /* IR Transmitted pulse Width */ #define CDNS_UART_TXWM 0x44 /* TX FIFO Trigger Level */ +#define CDNS_UART_RXBS 0x48 /* RX FIFO byte status register */ /* Control Register Bit Definitions */ #define CDNS_UART_CR_STOPBRK 0x00000100 /* Stop TX break */ @@ -79,6 +80,9 @@ MODULE_PARM_DESC(rx_timeout, "Rx timeout, 1-255"); #define CDNS_UART_CR_TXRST 0x00000002 /* TX logic reset */ #define CDNS_UART_CR_RXRST 0x00000001 /* RX logic reset */ #define CDNS_UART_CR_RST_TO 0x00000040 /* Restart Timeout Counter */ +#define CDNS_UART_RXBS_PARITY 0x00000001 /* Parity error status */ +#define CDNS_UART_RXBS_FRAMING 0x00000002 /* Framing error status */ +#define CDNS_UART_RXBS_BRK 0x00000004 /* Overrun error status */ /* * Mode Register: @@ -131,8 +135,9 @@ MODULE_PARM_DESC(rx_timeout, "Rx timeout, 1-255"); CDNS_UART_IXR_TOUT) /* Goes in read_status_mask for break detection as the HW doesn't do it*/ -#define CDNS_UART_IXR_BRK 0x80000000 +#define CDNS_UART_IXR_BRK 0x00002000 +#define CDNS_UART_RXBS_SUPPORT BIT(1) /* * Modem Control register: * The read/write Modem Control register controls the interface with the modem @@ -172,18 +177,29 @@ struct cdns_uart { struct clk *pclk; unsigned int baud; struct notifier_block clk_rate_change_nb; + u32 quirks; +}; +struct cdns_platform_data { + u32 quirks; }; #define to_cdns_uart(_nb) container_of(_nb, struct cdns_uart, \ clk_rate_change_nb); static void cdns_uart_handle_rx(struct uart_port *port, unsigned int isrstatus) { + struct cdns_uart *cdns_uart = port->private_data; + bool is_rxbs_support; + unsigned int rxbs_status; + unsigned int status_mask; + + is_rxbs_support = cdns_uart->quirks & CDNS_UART_RXBS_SUPPORT; + /* * There is no hardware break detection, so we interpret framing * error with all-zeros data as a break sequence. Most of the time, * there's another non-zero byte at the end of the sequence. */ - if (isrstatus & CDNS_UART_IXR_FRAMING) { + if (!is_rxbs_support && (isrstatus & CDNS_UART_IXR_FRAMING)) { while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_RXEMPTY)) { if (!readl(port->membase + CDNS_UART_FIFO)) { @@ -200,6 +216,8 @@ static void cdns_uart_handle_rx(struct uart_port *port, unsigned int isrstatus) isrstatus &= port->read_status_mask; isrstatus &= ~port->ignore_status_mask; + status_mask = port->read_status_mask; + status_mask &= ~port->ignore_status_mask; if (!(isrstatus & (CDNS_UART_IXR_TOUT | CDNS_UART_IXR_RXTRIG))) return; @@ -208,6 +226,9 @@ static void cdns_uart_handle_rx(struct uart_port *port, unsigned int isrstatus) u32 data; char status = TTY_NORMAL; + if (is_rxbs_support) + rxbs_status = readl(port->membase + CDNS_UART_RXBS); + data = readl(port->membase + CDNS_UART_FIFO); /* Non-NULL byte after BREAK is garbage (99%) */ @@ -217,21 +238,41 @@ static void cdns_uart_handle_rx(struct uart_port *port, unsigned int isrstatus) if (uart_handle_break(port)) continue; } + if (is_rxbs_support && (rxbs_status & CDNS_UART_RXBS_BRK)) { + port->icount.brk++; + status = TTY_BREAK; + if (uart_handle_break(port)) + continue; + } if (uart_handle_sysrq_char(port, data)) continue; port->icount.rx++; - if (isrstatus & CDNS_UART_IXR_PARITY) { - port->icount.parity++; - status = TTY_PARITY; - } else if (isrstatus & CDNS_UART_IXR_FRAMING) { - port->icount.frame++; - status = TTY_FRAME; - } else if (isrstatus & CDNS_UART_IXR_OVERRUN) { - port->icount.overrun++; + if (is_rxbs_support) { + if ((rxbs_status & CDNS_UART_RXBS_PARITY) + && (status_mask & CDNS_UART_IXR_PARITY)) { + port->icount.parity++; + status = TTY_PARITY; + } + if ((rxbs_status & CDNS_UART_RXBS_FRAMING) + && (status_mask & CDNS_UART_IXR_PARITY)) { + port->icount.frame++; + status = TTY_FRAME; + } + } else { + if (isrstatus & CDNS_UART_IXR_PARITY) { + port->icount.parity++; + status = TTY_PARITY; + } + if (isrstatus & CDNS_UART_IXR_FRAMING) { + port->icount.frame++; + status = TTY_FRAME; + } } + if (isrstatus & CDNS_UART_IXR_OVERRUN) + port->icount.overrun++; uart_insert_char(port, isrstatus, CDNS_UART_IXR_OVERRUN, data, status); @@ -736,10 +777,14 @@ static void cdns_uart_set_termios(struct uart_port *port, */ static int cdns_uart_startup(struct uart_port *port) { + struct cdns_uart *cdns_uart = port->private_data; + bool is_brk_support; int ret; unsigned long flags; unsigned int status = 0; + is_brk_support = cdns_uart->quirks & CDNS_UART_RXBS_SUPPORT; + spin_lock_irqsave(&port->lock, flags); /* Disable the TX and RX */ @@ -794,7 +839,11 @@ static int cdns_uart_startup(struct uart_port *port) } /* Set the Interrupt Registers with desired interrupts */ - writel(CDNS_UART_RX_IRQS, port->membase + CDNS_UART_IER); + if (is_brk_support) + writel(CDNS_UART_RX_IRQS | CDNS_UART_IXR_BRK, + port->membase + CDNS_UART_IER); + else + writel(CDNS_UART_RX_IRQS, port->membase + CDNS_UART_IER); return 0; } @@ -1328,6 +1377,18 @@ static int cdns_uart_resume(struct device *device) static SIMPLE_DEV_PM_OPS(cdns_uart_dev_pm_ops, cdns_uart_suspend, cdns_uart_resume); +static const struct cdns_platform_data zynqmp_uart_def = { + .quirks = CDNS_UART_RXBS_SUPPORT, }; + +/* Match table for of_platform binding */ +static const struct of_device_id cdns_uart_of_match[] = { + { .compatible = "xlnx,xuartps", }, + { .compatible = "cdns,uart-r1p8", }, + { .compatible = "cdns,uart-r1p12", .data = &zynqmp_uart_def }, + {} +}; +MODULE_DEVICE_TABLE(of, cdns_uart_of_match); + /** * cdns_uart_probe - Platform driver probe * @pdev: Pointer to the platform device structure @@ -1340,12 +1401,20 @@ static int cdns_uart_probe(struct platform_device *pdev) struct uart_port *port; struct resource *res; struct cdns_uart *cdns_uart_data; + const struct of_device_id *match; cdns_uart_data = devm_kzalloc(&pdev->dev, sizeof(*cdns_uart_data), GFP_KERNEL); if (!cdns_uart_data) return -ENOMEM; + match = of_match_node(cdns_uart_of_match, pdev->dev.of_node); + if (match && match->data) { + const struct cdns_platform_data *data = match->data; + + cdns_uart_data->quirks = data->quirks; + } + cdns_uart_data->pclk = devm_clk_get(&pdev->dev, "pclk"); if (IS_ERR(cdns_uart_data->pclk)) { cdns_uart_data->pclk = devm_clk_get(&pdev->dev, "aper_clk"); @@ -1471,14 +1540,6 @@ static int cdns_uart_remove(struct platform_device *pdev) return rc; } -/* Match table for of_platform binding */ -static const struct of_device_id cdns_uart_of_match[] = { - { .compatible = "xlnx,xuartps", }, - { .compatible = "cdns,uart-r1p8", }, - {} -}; -MODULE_DEVICE_TABLE(of, cdns_uart_of_match); - static struct platform_driver cdns_uart_platform_driver = { .probe = cdns_uart_probe, .remove = cdns_uart_remove, -- 2.1.2