From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1762050AbcIOJbr (ORCPT ); Thu, 15 Sep 2016 05:31:47 -0400 Received: from mail-co1nam03on0053.outbound.protection.outlook.com ([104.47.40.53]:51557 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753427AbcIOJbn (ORCPT ); Thu, 15 Sep 2016 05:31:43 -0400 Authentication-Results: spf=pass (sender IP is 149.199.60.83) 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 v2 1/3] serial: xuartps: Adds RXBS register support for zynqmp Date: Thu, 15 Sep 2016 14:45:29 +0530 Message-ID: <1473930931-1034-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-22578.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.83;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(438002)(199003)(189002)(50226002)(103686003)(50986999)(106466001)(4001430100002)(90966002)(229853001)(5660300001)(586003)(63266004)(2201001)(107886002)(8676002)(81166006)(86362001)(81156014)(36386004)(45336002)(42186005)(11100500001)(4326007)(305945005)(626004)(8936002)(46386002)(19580395003)(5001770100001)(33646002)(48376002)(19580405001)(189998001)(50466002)(2906002)(52956003)(356003)(4001450100002)(87936001)(36756003)(5003940100001)(47776003)(7846002)(92566002)(107986001)(921003)(1121003)(2101003)(83996005);DIR:OUT;SFP:1101;SCL:1;SRVR:DM5PR02MB2891;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;PTR:unknown-60-83.xilinx.com;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2NAM02FT009;1:6b57pCgecheLhF65/JmNhYQ9vTDkHLmvgEriLh/JFqE/8Vpl64YIQEukPwffTdWivd2T5ORCcHcjdFsCQEGVXRvWq6wPfU+tbQCyuhhCgxBkwOdZ8xY/BaW5/1aoO8+f632OSQXD/oYsK8RO/44vfkFLyVDHVmzxX//Yu6ONvdCDmjLa0f87F4SUeprfslmhNhWZWorFDquEUubXwBa0/E5wPmEJuYyWam5jF0Pvq0yiUdBO7Tc4KzDRf+EsF85yMlllcoUlLGjvmhF/LOUYcJw2NeF2EVZ8e4nCsTmOWZ8aMy/IjGO8uvb1BLopSBSLn3+redE/7Emk/pL4oKGAudcJmHVT0opG1W6WkQVDzliLk8/+wdXLLXQh9PEzfZVGA+qAVCm9HdF4jj46eAEgzgRAIuyxkdtV6ISBHMX5xixh6YyBSocL3qjyFWK7/bSWxb81Hy6JXoem+d8BZ0Gon0tL7p64uLxHMMwVm0xPsRb6wvM/agA4dH8Nz7VCJok2DK0UJ1RC895SEzLMytji/uJjy9wWMMIYtg6gMqkjQtqPWXfi3rpxfAvtUK/kW/n7nxTtfHCcr7gMai/i4IXhbYaCc493g0fHU4pwJklG7T7AI0/D96pK2QmaWhAJOzaG MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 28e870e5-0558-4ee3-b83c-08d3dd48ddb5 X-Microsoft-Exchange-Diagnostics: 1;DM5PR02MB2891;2:4wjtEsvT9cpLRAfh7LiO2ARinbPNQa5MeAXbWWirX6zqP39nIuIyG33DcsQrFWk5T6D6i/dk8OK45mJrwv7eNTTtjmI2f7JhuCf1FOVblHBJVjhCos4U+Ymw2e8mmFTtBE8jcBv8+7BNJwV4EF8jVFDi1WTjWilPNtZK8nRfsqjmsBgqa9V0XctQzuAAJJrs;3:SKclCO7e5gAh8XlzZBUAtJTN1mtWpVyHaKdBktufsXmLWPoGfJ37G8RGEcJ6QSrKSDrThfjwkPr1We4ziqrhFgoujxemWCrIynvCu7d2KudqGCT+W660lMz43DBX+QrWQgCQLr8sQja1b5atAoNVjGxPeOd1qcd5aNa7B9fxDB6UStbGF1V+oeDbQjGrTcPp8quzVwdUwrEM3YkHOGDULCNmtLSRrx77cn8XJQ0ouhOiQ0aCjJgx/s4Bwic43YaZMsLSFOoTTFuYEm0X3MmIPQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(8251501002);SRVR:DM5PR02MB2891; X-Microsoft-Exchange-Diagnostics: 1;DM5PR02MB2891;25:vCEbenp6xCATW46bUOwyr6IWmqcwZPJJ8Oy1xj0ZQ04CWLFfA255cj6QXujyzd0WB38PygR7TMUFP0YtWYYSOvH3LlG0/21PwI+Hp10qe5QWt1Ej3fSPAnnOIOki433whbLih76TLWZEOLqoIeX5Ugj7mNb2ndGxV8o1Gh52Xm+Vw4YBoamQBr6D8XDSWRK3dI1MsF7pqO97gYSPikCTUVbaJ9oQ2aj6ajisva6d0zEjd53to0dWhu+qk5Rt19XAexzF44t1GXvWX7l8XHIUhjhYi9rzFtwfMoOne2fcgBT9sJY32XdX+TUrfspLSD0l59Y52zpqOxRTsB3Boc1oOQLJMrC9F6pQVFSIoW+rETSOZqV/4MWnGIhKoxRGAofwAFsLxD4Rlr44jfFhk/C9NMjYcz23Lu+eNDXaKbV+2/a0wR4D5qHxWZAjNSh/fz+97zIet8vaUc5CebqL1nhuoqig/b4dzMO0Ew+4S2WUga2rZthkKglPMjqSgQK7NyVhcTwBxRctwuG1X92p/8+YaqGld5CMVZdf6xRoccY2zf5r7wO9YplyzaOoHWT6NXThY03jG2zZU7+HsSxsz4gyr1CovaIOJRbpCDLBcHJ5gXazX39XYa/sWaAhSBZSnPmRNnokpOsmPsjYsOETXQ8WmfX9LP1NB1DKHQRqrJICJpS0yvggMn7kLP7/kS3W8D0ea7+3gmNWqVdmt9LWGZH7JrdLGiZp/g9RdkHwEPLxbDmI70FWwy/m/8z4Vhg8mEo0vef6uxoTtgc4pIQL/Lu/G7LBr8zuOgCfjEiLK/bjJLM= X-Microsoft-Exchange-Diagnostics: 1;DM5PR02MB2891;31:3YaEWWOpnaiaTwjmoeT/6N8eUqHjyUt93lkiH+UfiYfjMcefioOiB52OFnFsTmUMsSt4h/RCqU+enrvN7En27Ak8aLZ3yeeRlA2PMfAvskOij03wCVkBD8VqumqnOevTh6vf+LaJZ/OuJDiVs2vCrzsVnZzRrGGMxS6Rx5QeUP59mVKv8dSqjAmJgD6oclc9lwYL1qnxvqQYhvwIHyFm/MW9f7cjBiUqrcYa5gey8O0=;20:fFT0bhfV3oyewRlI1jMPLWNPbEzyvVVCijrWXH9Qcb+7kMiUShtnfAX+ryECcnecpmLmPiBsYkhYjEm4+SQnvMGzIIs9263G3XC3AyiTLqmA2Kii4kkmyvQZ/RXcAnfZumorCA/YCdd8KRQO/I1Rrh8j8kdHqvvbsB/2ZY+YPKn1I+Gvw6wBRl8YaOZxaNVDwo8QENoUl0VLf2fGFYiRBrogGRtcNRjFoH/Xop5MfS4kodi6L+/kYYLuLgzOfJBFYS+rb1hfqn1Jk5e2xAdNgyFnvbdqT1CSJR/NMkD/UMoHK846FCv/Z4n2Cvw7w9IW3Gtb34eJ5HyPDBv8RmBa1be+6NaROuZQkdRXs9XkIqwsvg8cuAk01rTTgG3fBweEXMTZQgXv+N85XHxS7fqhTdSzEItFoDWnh93sptnw/Sza5Oo8WmY+uxH4ebqRlLBIXqk9mrQkrxeNRT85AHUbX1wwD1wnZPwtZKZ9drPcP/o+2pMM99/pIE1//a/0xut4 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)(13024025)(13018025)(8121501046)(5005006)(10201501046)(3002001)(6055026);SRVR:DM5PR02MB2891;BCL:0;PCL:0;RULEID:;SRVR:DM5PR02MB2891; X-Microsoft-Exchange-Diagnostics: 1;DM5PR02MB2891;4:kqEo3Xl7fxJAwnJ2EubyFFQ3DYxOCGNwXKJCNWk9cBoixYoDgzf/HYWtkpRtgdtPfQtvTn1WnUUVA6Ivcppv1XDS3c2lmypFgwayUmwBGEGBbSCnZ6G/C4RP/+5gZI8XYheR98B3j7MIQdITEbQ/Mw1DJPX+Qct6lEbMkg7DSC+WAWSLvHISTD3KAkWhwY+AgQ6Vt3Nx4L67dbbsRCPIrGzhpHUutlID+Xzjc1cvZfT2V1tyDi/uYIg+YGJCoawjofpO32omnAdaWGVorWnmboJRQkqgNGtrbHwfw7WiMxnxgrmdkvWEP466r8NwcIrmFhcTU6oTNAGYuiL4RuyMpEYcOo0F9gCSlc4v9dFfcc5KurcnbWE11f8HkMLsoyW+H6sXr9JUCS3OFKFhJRx8cUrYXn2GLhDPz97NKGlwTBMLKBrV+d8ucIo1Rw58/T1/cixkMZuhMk34bWCbWoiSEze4B3FlOf01gj5SK36hMzJl4bHyLaVWaq4T7aX5J77LkY73YWtsOkeoXkBdT957dGfQzR04cBBUDchqmL0O4mA= X-Forefront-PRVS: 0066D63CE6 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM5PR02MB2891;23:yLT6olx7qBzydd9jA9yfc5LnJBjFBx5jZ4xrz10kV?= =?us-ascii?Q?pZkeY5N/05/H7HIp1klRq27uSKGojPfsdWzvgBElpIb1M5N0FSFTP5I49GP3?= =?us-ascii?Q?uZWlU+uJZOJYeCm7mmqB7IaNQU3AHLBoLG8BzazwqH6dipHdZNRqsLQhdlub?= =?us-ascii?Q?11L+a6ovNrRXR3fDQqDPip8dC4+m4H3fKwnbOrdrdJqUdZi0ivd8C7Zil0Vd?= =?us-ascii?Q?jGwN945vXBCbrzKJh0XpwvGEBke+QIne7nZKpJdHjfRn/bu9yPoR+jWQt+lP?= =?us-ascii?Q?UJsbOZOnrBSKWdoleyB8oihwA5nDMY9nPV8abSzY7u+QIsbbbY7Zlqhz/IEd?= =?us-ascii?Q?4uzdvS1Pug4SCvHScvI/i/vusTsViidi6VDLL6G19pVSng42RPfVS86BIpyi?= =?us-ascii?Q?v/a14wtrRYkRU3QsgttzBz/lolXIY0qgr7BWwTW6b74OCOXz6iMYDeQz2aPt?= =?us-ascii?Q?wOnpU6gZqcmxhHhaKSQtFNFzvjxkaJQOj6mt67L8vLNfQ2fhHFLAoacUWVej?= =?us-ascii?Q?xdaBrlVPX69uTG0Bm45EzV7GUtatoY1ntJhxj+2StZyc5D8Ak0gJfbfS4sHW?= =?us-ascii?Q?WQTgLTiwo2UsqWqMtm5mby/PihtSSE2LF+swOePt7Q6ErwPx4zZqtF4Xcqy3?= =?us-ascii?Q?n7EOPOhFpCKy5Gftf4kwwh2pGSJFD+iYLZTCZMiePdFrwFjhkJSU0dQ+12Ug?= =?us-ascii?Q?VqKi5ZytIApSLuWnrHmfu3m8amv/nO8/Tm6DvCguZDC4I0CWWGSTHMsOzYe/?= =?us-ascii?Q?YQJkXazZMxxgHQhBX6vWTFgb6S9tGgwQop9H26R/36PzqPQZnKHKjjAjs/Q6?= =?us-ascii?Q?ajx4/fpuNo7zDJ/fwRPVYQNmcZfTL9Uv99cv26djT3yRfRv0YGZJnWYo4mG3?= =?us-ascii?Q?iBVUzCJofIOQjIe37V4HF5GUClzUvj9WfWkM16G8+BoT4iejJX5+5F1NLqCe?= =?us-ascii?Q?k1uNTdQDqNSxC3fkcmTKwNjZtXIlFoDi37kfnuPSlXMW1MxjAVfJH1zY+5I5?= =?us-ascii?Q?Q+UFFt3tLvWmOXiAP+5C6PFOr7891WkEuLdWH8NdIlGC/HO894Bpm63p1S5B?= =?us-ascii?Q?hcI+xWzqW5e7lZlB6u9MCG0YylukMuXlfSXvDJ2wEta9zPOaytlayV1y0FQN?= =?us-ascii?Q?ofmnxiAeLdX79DS57QlV0tiCJekW12r/0/K887RT2Mpt5AwyDBrB/9ezoDH2?= =?us-ascii?Q?ZmUeMx29Hyk7CJvQTPLAw2ynZJ2qkkU1E7z75lxcl4X/Cwx/87fFr+7mEMH8?= =?us-ascii?Q?sBcFXFwMbiQbdZtfzpnb+pKvB6VctYFbxcj8jKdasBlWRb1/AbnLwY6Cm2OL?= =?us-ascii?B?QT09?= X-Microsoft-Exchange-Diagnostics: 1;DM5PR02MB2891;6:aqTTtDhLYMoXhoJO8Sss7v9Eo5DfG0UTEE2EiTAUdJ7dHUsdrLy35IvnPrqsym/uPJP5uxHIVjV4VjPRhnd3dJJjvQ98Rnzczz2A4u0a5B0ghNwZPUs1Nd1Mfg+4cseV4I6ahkRNQU8pa3uL+y+DawX02vkscj6TcbuycY8MWlhCqx+w/2+RatMrkDayYzEyBM6AtigxFr2Qq7R4Pzn1+mCjzEAAYQPn8GOM60GfgRegYVX47GyOhi4cSA2kigUbbzpg1Q6yxErneW4uFAew04VGhZAGB2+vjdY7lAPZ8G0vzY7XOpYo1tnKldCcKwrrQ+cgW2Btftm4PPmw00cYjQ==;5:tUMI1C+HZMRBXmCoJt8v0cMkrBc6UM5FGj7254MPGHLOIaLwxhM7OYQLEeBxT8+IRTgTD+wEDxfXmX56BHqOT075dXNBq0sizJEA2oXBzAuWJa6tbs8LK7aa70TuwMQs8q6FW/AZ+oso3z9Y37Z5hA==;24:BS6TcbEwk6D0cMQeNK+TN/z2toJkojaUlcpB/hMjGd7wtZRg6oYXOrEzHK5oDv1fj7Vbji/9egZLcLYnL8SDLlwmZJ1ffXWx6pNPBElDyI0=;7:GTa7k3uzCiIXz9rrzEFQwKl2CcspWlbQ8jKWKbb1dCduJgcd3TuQ9J/23KqAq7iRUox69LiVV0EDOVWQE6QI/CkRKdaZCrOLtvndQZJHpsfr2As8HOIvxFJks7Hd4KqP7Z/M8etyk71+wz1fEjgiToejbjWMNG8phmohCIu56CW1TGGuYkU11fMDmU334gdaBr+C0M+RrwtHJJX59dFJ6GkCNp1aAjGz3jHO7vUIz1pWiKjdCNF1mguzE8V8maEd SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Sep 2016 09:15:41.3460 (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.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR02MB2891 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 --- Changes for v2: -Initialize 'rxbs_status = 0' 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..527526e 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 = 0; + 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