Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752746AbbLLRTt (ORCPT ); Sat, 12 Dec 2015 12:19:49 -0500 Received: from mail-am1on0087.outbound.protection.outlook.com ([157.56.112.87]:40000 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751869AbbLLRTq (ORCPT ); Sat, 12 Dec 2015 12:19:46 -0500 Authentication-Results: spf=fail (sender IP is 212.179.42.66) smtp.mailfrom=ezchip.com; synopsys.com; dkim=none (message not signed) header.d=none;synopsys.com; dmarc=none action=none header.from=ezchip.com; From: Noam Camus To: CC: , , , , , , , , Noam Camus Subject: [PATCH v9 1/3] serial: 8250_dw: Avoid serial_outx code duplicate with new dw8250_check_lcr() Date: Sat, 12 Dec 2015 19:18:25 +0200 Message-ID: <1449940707-17633-2-git-send-email-noamc@ezchip.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1449940707-17633-1-git-send-email-noamc@ezchip.com> References: <1449940707-17633-1-git-send-email-noamc@ezchip.com> MIME-Version: 1.0 Content-Type: text/plain X-TM-AS-Product-Ver: SMEX-11.0.0.1191-8.000.1202-21998.001 X-TM-AS-Result: No--5.887800-8.000000-31 X-TM-AS-User-Approved-Sender: No X-TM-AS-User-Blocked-Sender: No X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;DB3FFO11FD016;1:yp/IuTaxoMfQ6n/jpRh9i/VxrIFoPQ/hbJQCRZUCwPa5ICHWFMZMzor44EmklGF2WzSXyCrK4nB6MVeBmkdg+2V9tYKMbUYhHxO3tqDweO35QM/wr6pzLGoSPApbhMBYyyUdVv/Uc/Uowypxpj2YcMFGg4mHieqmeCjqyg2vErkOubFuAlXsYUsMf2aT0vjEkPjwYlOYTWpzfkoHRSlpkHfkNsYu5GHOIPl28uO7bzRCWhqUAajTGOpFzxcnJfPeP3q/E1zd7G8jOqYWiAZYL99lLqEjX0kpw9q0Wb8o4bhwg0nFW4a5x8SjWA1SEsfg1TxHj0TgT7gvx8USqGBbgcfUrXx/M67nuDCNZFiHxpP75LP599Q040+/UjhBWe8B9SUP1MhedHF6S6Rs7l3YHmttmcbMfq9eLMn4Jyuo+/gOoFrgFGFMR4BA1giLFS74KlTMzdJ33MVMqxiISohQyA== X-Forefront-Antispam-Report: CIP:212.179.42.66;CTRY:IL;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(33646002)(36756003)(1096002)(104016004)(92566002)(1220700001)(6806005)(87936001)(50226001)(76176999)(586003)(49486002)(47776003)(2950100001)(19580405001)(5008740100001)(19580395003)(77096005)(4001430100002)(107886002)(5001970100001)(189998001)(50986999)(110136002)(48376002)(106466001)(86362001)(229853001)(2351001)(105606002)(575784001)(11100500001)(50466002)(5003940100001)(85426001);DIR:OUT;SFP:1101;SCL:1;SRVR:AMSPR02MB007;H:ezex10.ezchip.com;FPR:;SPF:Fail;PTR:ezmail.ezchip.com;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;AMSPR02MB007;2:Vhd/UUVNAeqt/AXDeDawCEjK3Zasv06nWMtAQHLebo88hFh355nCC3qvaGb3E7QaQFszJKz6KlHdwgrazpYl4gVPEq+bU5CrhJdiy7UQxeAHGWt+BCzlcBUa48fzL5UZtSpvTcRPLQyIewxBXtu5qQ==;3:fUxaIOETw9kFhSP/rc+x08a2yD2S2K+PdlGbw/US4zU1RIabQQj34FeTd31V1NfZQcWSZ4W1tj9wiMLBnr8b52mALKl7pNyIlIvfSpmI4FuoWSxcoXV6z/qPdQoeDfI9hjTfs6eN3Ns5jkcaBZJuA6tM1un+CStxHiXgX18T5JedRQuHQvMIODc4UrUfWu2AflOcUhtHB6cu5RYOcQzYx9NH5E9189u4l3OFlxZYpNU=;25:S3wkajBxwj6ZIH91BBdNNkPgCGoIuHfQX4cEtLm0XvFn9iv+i793JA6+7uBqNaKSOsxh5r0uK1EDHdrK48prFcvttjXEgHrJ+0nfZxX0FbgaPFzFn5fyv4Q49uQKKKAK5TacdjQUut4HWIG/3TbIELRIE97PbYRXpFQruOBiYh2bsYV2gdOpFGBJk6Hp/KRFDlTB9J1w2IWOeWKfDya31E5Qr5/gL/TA85ZcRBjjEq/1Rxf3PIZUO5gCANvmtnAsz+i29+HJsG1kk6a/+eocUQ==;20:+cPDayZmzL8l222y3BAkxSGkkYhLhx4RyulCMvGTERb+oIPqjuqtPpE+g2hlyReQtYrvjjZz0X2iSUTibjOWtgoeFN2KNQ8EVViIKFQrXLg9mrCzTldPSFMt14kTT/RESoHv8VeAU84H0trRqnpbB0+7obYre7FZeL3/Y+kMqIo= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AMSPR02MB007; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(121898900299872); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(8121501046)(5005006)(3002001)(10201501046);SRVR:AMSPR02MB007;BCL:0;PCL:0;RULEID:;SRVR:AMSPR02MB007; X-Microsoft-Exchange-Diagnostics: 1;AMSPR02MB007;4:+e3CSkXAzsr0o5ZYXXsLE/H73Nuo3h7psWMiw+Vquwhd8l4s2hs0ITWdJfvwrkrYiE3xE6Bi8bRulY/hNOid9L3F/p9VGmduSb6UDPYKkU7F6LbTwemajOgvbmtev/p1FekUyqU+jqUfYXu2gWjfGOOjdT+a0N6y57B5trLW4W6Ih4CbeHvhAWK7kC5sqgHNU1IIGM5Vxu1/y9zOlCAWuIVVy/rm3fHEID38a+ZKOmBEyJYRGGzmxLOmZkYk7FoH274SsZmk0aAO4ETb+mL5AGkS0SUAY0JtVLHsIp1DLRXSGxj7tNkItSalpis9lsnhjxbqBc5tCv7jw6uDCiqX4boWkvIJ5fASA8hMIDu9S7uq9Akna1t40QPAQTt7ezpzxrUo4ESRyIBQRUSJ8AyEnkoXC2t48hx81t1Dbgv3hCy5N32tk3Tp9dlwSjQ+MU9f X-Forefront-PRVS: 07880C4932 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AMSPR02MB007;23:1y0dLfzH9Nq4JN42u/6/LdKXuYhj+WoIUgy5PvcOGl?= =?us-ascii?Q?Wa9jxqt/EDKkSKvdiyQsmdfrkDWUt2wD0eO+lRQzFeALRDIBP3ZofsyEPFUm?= =?us-ascii?Q?3xv5zMVumW9bDsX1tF6YU8Wy9dljq8wZrhJSjD6xyfP0/7gGiHGldbJjl14c?= =?us-ascii?Q?oQocNbUfCCUO+3Rqtap3ySKRa9v1DIb2FVLt7Slhg52itRVAJW9LNBZbMgXx?= =?us-ascii?Q?punt+Ao2GpzwvfU2GeZh4tlxB96nSivXN4rMf+gYY0buFcW7O/t5Wv9nSC5r?= =?us-ascii?Q?yqM3FHzpUoLm0IHQ865MVpUc5dZQ4VpKwI4OY9lyB5y1YHWjuGu9nxhg8g39?= =?us-ascii?Q?UBNptwJNAScHRUQRbiw/jHt1WISwIRcmZEVVCpGFTLKd7Me7UBlzlzNvUPlM?= =?us-ascii?Q?4X3IhywdLmhgavQEfMWwZjra64HvcojJNRYRmI4vum4wGmG1NU1dRQGMasFu?= =?us-ascii?Q?5V8Y+dVD9e/06X/Ehv5Qfp5URvmZ88Fke3x271zMJIXlW5MePkjLKslZY6Z4?= =?us-ascii?Q?Yz7Ht0DD7TGCb8cH68EEObZU88T4Oc/rA2yplxRT8DD2kh8JR9IbD6nJ64qp?= =?us-ascii?Q?73wn9KQei6uN1M0OHQJ9rTcJz87ARWQFq3/HRQyl+o5SvDGoEl44vCEGRHnV?= =?us-ascii?Q?eOxrTmfn+JvSMp4Df8QK2M2m4MaLVXQnchLb43GnwxxLdx8896kCJ5snGDod?= =?us-ascii?Q?OMUCPqH2eACSShi7sjKBJGrYsX6aNsnxF9i8KExSqEcveNMRKKyYrVaW6uTL?= =?us-ascii?Q?Mye5Z/9afsBbmYWgO0rHjvFnQ9R/C48IXKbZxpGitORCGKv2tAjvCgTGyZXl?= =?us-ascii?Q?DP9vgAYgCUZ+tBrzxnlUQT0gRV68sXksChLCeGcCLArQm/+dSTKKBG5nZAVo?= =?us-ascii?Q?XH/iu4G4rZQfT3PhRkp0sbbIRZx2LQPCTiySQADvBmDeAaFOz4tvSOLvnxb6?= =?us-ascii?Q?LBvg7qUOwhFP8E9YImSIzgbhBNVGWL7QNe3O2gb1WYo26KAHE0BPqVgbaDVH?= =?us-ascii?Q?klv8+uLyCbiBAgS/N6/WgObV66Zgi4fhQW3fOX4D183mbwcVie9rqc1z7yJk?= =?us-ascii?Q?q6OdyvPvwjkoODll/+uu5qk/AW2AYKGdyhp5WdBOUjAVzugGlKOFfaT6qrO+?= =?us-ascii?Q?LoxnNsM8Y=3D?= X-Microsoft-Exchange-Diagnostics: 1;AMSPR02MB007;5:S60d6o4403K6oo8FHBoGiAWRQyi78EmSxRZCDxGilksHnYMIj+v6yY+688j5+39T4u0M4H33uJgEj2IpjFd/1vuA3GSlnhzwR7vOrfPrbOmOXcUT5+qZnuSa2SAJQ5UFSWehUAn98yekAdSnykzguQ==;24:Ju02vIxARjcbHgN0wi+WicoWBhkLff/IVfMfTP80luN2fDQdXbde1TwdB+LzX4BW03Kn1nLvdObbc67u8Z3eDGHtL+m3KwynLSa2HQFmkZI= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: ezchip.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2015 17:19:42.7391 (UTC) X-MS-Exchange-CrossTenant-Id: 0fc16e0a-3cd3-4092-8b2f-0a42cff122c3 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0fc16e0a-3cd3-4092-8b2f-0a42cff122c3;Ip=[212.179.42.66];Helo=[ezex10.ezchip.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AMSPR02MB007 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4903 Lines: 157 From: Noam Camus With the help of Heikki we take common code that makes sure LCR write wasn't ignored and put it in new function called dw8250_check_lcr(). This function serves 3 serial_out routines: dw8250_serial_out(), dw8250_serial_out32(), and dw8250_serial_outq(). This patch only brings better code reuse. Signed-off-by: Noam Camus Cc: Heikki Krogerus Cc: Andy Shevchenko --- drivers/tty/serial/8250/8250_dw.c | 91 +++++++++++++++++-------------------- 1 files changed, 42 insertions(+), 49 deletions(-) diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index a5d319e..ffe5e0c 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c @@ -95,25 +95,43 @@ static void dw8250_force_idle(struct uart_port *p) (void)p->serial_in(p, UART_RX); } -static void dw8250_serial_out(struct uart_port *p, int offset, int value) +static void dw8250_check_lcr(struct uart_port *p, int value) { - writeb(value, p->membase + (offset << p->regshift)); + void __iomem *offset = p->membase + (UART_LCR << p->regshift); + int tries = 1000; /* Make sure LCR write wasn't ignored */ - if (offset == UART_LCR) { - int tries = 1000; - while (tries--) { - unsigned int lcr = p->serial_in(p, UART_LCR); - if ((value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR)) - return; - dw8250_force_idle(p); - writeb(value, p->membase + (UART_LCR << p->regshift)); - } - /* - * FIXME: this deadlocks if port->lock is already held - * dev_err(p->dev, "Couldn't set LCR to %d\n", value); - */ + while (tries--) { + unsigned int lcr = p->serial_in(p, UART_LCR); + + if ((value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR)) + return; + + dw8250_force_idle(p); + +#ifdef CONFIG_64BIT + __raw_writeq(value & 0xff, offset); +#else + if (p->iotype == UPIO_MEM32) + writel(value, offset); + else + writeb(value, offset); +#endif } + /* + * FIXME: this deadlocks if port->lock is already held + * dev_err(p->dev, "Couldn't set LCR to %d\n", value); + */ +} + +static void dw8250_serial_out(struct uart_port *p, int offset, int value) +{ + struct dw8250_data *d = p->private_data; + + writeb(value, p->membase + (offset << p->regshift)); + + if (offset == UART_LCR && !d->uart_16550_compatible) + dw8250_check_lcr(p, value); } static unsigned int dw8250_serial_in(struct uart_port *p, int offset) @@ -135,49 +153,26 @@ static unsigned int dw8250_serial_inq(struct uart_port *p, int offset) static void dw8250_serial_outq(struct uart_port *p, int offset, int value) { + struct dw8250_data *d = p->private_data; + value &= 0xff; __raw_writeq(value, p->membase + (offset << p->regshift)); /* Read back to ensure register write ordering. */ __raw_readq(p->membase + (UART_LCR << p->regshift)); - /* Make sure LCR write wasn't ignored */ - if (offset == UART_LCR) { - int tries = 1000; - while (tries--) { - unsigned int lcr = p->serial_in(p, UART_LCR); - if ((value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR)) - return; - dw8250_force_idle(p); - __raw_writeq(value & 0xff, - p->membase + (UART_LCR << p->regshift)); - } - /* - * FIXME: this deadlocks if port->lock is already held - * dev_err(p->dev, "Couldn't set LCR to %d\n", value); - */ - } + if (offset == UART_LCR && !d->uart_16550_compatible) + dw8250_check_lcr(p, value); } #endif /* CONFIG_64BIT */ static void dw8250_serial_out32(struct uart_port *p, int offset, int value) { + struct dw8250_data *d = p->private_data; + writel(value, p->membase + (offset << p->regshift)); - /* Make sure LCR write wasn't ignored */ - if (offset == UART_LCR) { - int tries = 1000; - while (tries--) { - unsigned int lcr = p->serial_in(p, UART_LCR); - if ((value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR)) - return; - dw8250_force_idle(p); - writel(value, p->membase + (UART_LCR << p->regshift)); - } - /* - * FIXME: this deadlocks if port->lock is already held - * dev_err(p->dev, "Couldn't set LCR to %d\n", value); - */ - } + if (offset == UART_LCR && !d->uart_16550_compatible) + dw8250_check_lcr(p, value); } static unsigned int dw8250_serial_in32(struct uart_port *p, int offset) @@ -463,10 +458,8 @@ static int dw8250_probe(struct platform_device *pdev) dw8250_quirks(p, data); /* If the Busy Functionality is not implemented, don't handle it */ - if (data->uart_16550_compatible) { - p->serial_out = NULL; + if (data->uart_16550_compatible) p->handle_irq = NULL; - } if (!data->skip_autocfg) dw8250_setup_port(p); -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/