Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755280AbbHYI6w (ORCPT ); Tue, 25 Aug 2015 04:58:52 -0400 Received: from mail-db3on0098.outbound.protection.outlook.com ([157.55.234.98]:28547 "EHLO emea01-db3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755182AbbHYI6p (ORCPT ); Tue, 25 Aug 2015 04:58:45 -0400 Authentication-Results: spf=fail (sender IP is 212.179.42.66) smtp.mailfrom=ezchip.com; gmail.com; dkim=none (message not signed) header.d=none; From: Noam Camus To: , CC: , , , , , , Noam Camus Subject: [v5] serial: 8250_dw: Add support for big-endian MMIO accesses Date: Tue, 25 Aug 2015 11:57:09 +0300 Message-ID: <1440493029-28760-2-git-send-email-noamc@ezchip.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1440493029-28760-1-git-send-email-noamc@ezchip.com> References: <1437886478-29273-1-git-send-email-noamc@ezchip.com> <1440493029-28760-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-21768.005 X-TM-AS-Result: No--5.867900-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;DB3FFO11FD024;1:I1dhE/8XUahH8DaSi9o/gpLrkNgZZs5w9srf7ZluFIyyRK2ZzZ6r75Y83LbuW37ItjLb8NSKV5QOCZUNSnping5KBQaT8qGJvkI5O9jSKaIzd77WvrKklDPAqP4ur+1Z6nnw11jI2mJ39IvvavOmrddbzjpb1cZf+4gajMBfYu4SWeKz/txfdCjatHQq8qnvzuZOSa62AJ0QehAPv56LrvXOeMtN1q+3Y+BzSieSPcADZtEB6j69pOZFzcfpWENqvSr4ZXG0ONmP0uloJm1QeHTEzpEbmlGdZAReHCgV2om+7XGymtqNQCs7sqAmLe5KKWHdI5ArfJ9YcySpTaIv8WCRpOdxGsl0/7Zp1of0QkmnyH/Z209DTn/Rhz/iAt2f X-Forefront-Antispam-Report: CIP:212.179.42.66;CTRY:IL;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(339900001)(3050300001)(189002)(31014005)(199003)(87936001)(104016003)(5001830100001)(6806004)(5001770100001)(50226001)(19580405001)(86362001)(5001860100001)(2950100001)(85426001)(49486002)(77096005)(5007970100001)(92566002)(19580395003)(46102003)(77156002)(62966003)(229853001)(105606002)(47776003)(64706001)(50986999)(4001540100001)(50466002)(36756003)(106466001)(48376002)(33646002)(107886002)(5003940100001)(189998001)(5001970100001)(76176999)(4001430100001);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR02MB1040;H:ezex10.ezchip.com;FPR:;SPF:Fail;PTR:ezmail.ezchip.com;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;VI1PR02MB1040;2:pTl2ii91fDiq/2ePgOHJKWO9GRiFHqEmL/GFB1EtP68F6npsdknZpAsY7EodFr4cJ/o0QZNpZ9XGbM7eNE5d0MnTpOR0zUT3oxwdW67TDHqht0tBQ+d0xX3sXjWxc307gk3MeZPshWltGvG/Obd/XKSN5T/yPcWF3weiA0B4d1w=;3:dLfBmH2V8MgSFkCWmZ3Vq5Te4ArzgTBbJGdhUL1L6x76swnqo4prLhTSgJn76gg9480AZbcO/O0wHDgMrMWX1P71wf/vWf5q7HPab07PyKZYlYvAt086LcNXKcDrddFh/lVQ/eh+63c3ibwVpM7wnhrkNxnSI4AYEohfqdXfEihfQrZgeTH/Xl+fRI/twaiggsxCNU86QlAGV3/ykVKpaKaCoBFrwJ8bx2V7B822syA=;25:gd4oKkkFjT0QblcTUB4UxrrJDKW9r0dVyW6xKUcSwhDz/8q2G6lOy7gRPi4+Jty0LNqhRZBB53JaczoJnk1HhNVGQXB5OBfFb4oElwFFycUpH166XknLHr5KTrI/DbR/9u8q37E6u+P+3K0nPzLverRFGajNVqQdzpUpHkkJM3nYb19n3mmfetgDTTZaZA60pHsYQobYHPCl33vdQIG5mG60EiAEQsqG3Da2Ds9SPE2UgpXA5xpkwkxhVpjS7BgqVJiXYyBAXusNSJCTK0Yvtg==;20:rSr6/7EUbskUyLAkX1UUTOytabYM1c+pEFYy0asiAqhCp9Y/QDzjcNBhoaFp0BJXd7KnUAbAf1uK1DOz1fpRMr3dO82lFGxQIzswtl9XvjqjvpyvoAGyX7ZA7a1plDaHvaARGhEaC+rQLs3jnd7xhiqU7pGsthYbov220oS8z3k= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR02MB1040; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(8121501046)(5005006)(3002001);SRVR:VI1PR02MB1040;BCL:0;PCL:0;RULEID:;SRVR:VI1PR02MB1040; X-Microsoft-Exchange-Diagnostics: 1;VI1PR02MB1040;4:UXf1vCAhFJY1phHINi69hrgVQxu+vO7+HrIoecOyDWec3dNffUTX1t2GQQvj6M9KkXeuAAHgJDe4Tea793bn0iz2kEfPfHpDmMDa31zswInQcq0nYjMMjpJTOJZigTqeWiEuXYchDb7+nC4undv5qYH7HIvwqAVFbPLqldBMPnLUSzlzXjait4zKOVGfbuhTh2NtO8PVfx9viyc17fZSEiWTKui9SzpVat8vsG1yZpi5xIVm5MhJxKA1nwHnsLRbTbvNNWfMtuQ6VZ9OUomBK31aloIr5TArqN+fKcnzLN7dUmi66N3lsRpKjVYoSnlh X-Forefront-PRVS: 06793E740F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;VI1PR02MB1040;23:gNPR9CmWBRq3JDO62Q5aS2oIQAVTr884kd9rGmiHL?= =?us-ascii?Q?h78LvwQv3t4/3+K74ah2374kKiGIfqYhhIVyyBrKC9+t0RDPbhk6axoHefa4?= =?us-ascii?Q?CgKbb++P0QsmmYxmJ+57oDfXFOorirxD40+FzWjxefTlO/p2Iqptt3Jkkqfi?= =?us-ascii?Q?MnVMvxueJO6Ylz2bvFlrGnIaHO9gSnNI1QUG9y3vWOzad34Oiqhxn3+J0uPw?= =?us-ascii?Q?42/zNlIKcXkmy+aPszbOvtRCaNvhcUC/MsEA11rGRYnTCg2NmK9X/S4s53qs?= =?us-ascii?Q?/31ridyiw4UuR7VthQsEg0m7wKtucyx+3S6+JjEknr98fCglsQLPnoP+k0hj?= =?us-ascii?Q?G+Dq30InuS9OpIMcSNj9mTS1xT2f38BN6s5D6dUq7spjpXJE3X+Rn5P+1XPx?= =?us-ascii?Q?QcOW4xfII5lQTh9LInIaXLjHiGB62h/CWUDeuEPUHuQ33l7RNzjNO+1zEKAp?= =?us-ascii?Q?EbH27D+wUoEYfGhU2CPI+O2JFkqOzV9VvSv7w8mRSjmHDCax6gHvX6Gqo6Mk?= =?us-ascii?Q?VPb9Oi1QCWrw62tJD41QWkoiANTJiaQt105bHa564MqKnzdiOBKeA2A3aIKq?= =?us-ascii?Q?j0ff1aFNHbattJ3+EFkgR4nI2Oc3VmPxfEsvW6+3zPJ2m5prAS73R51jIVXH?= =?us-ascii?Q?4je4B+OBVANjUnm9ep5rB5BsVCcHmRcenaLgooGfcANPB8Hg3z6kRrnTXHN7?= =?us-ascii?Q?6+3ZMDIOwvN3nhY7P27zKFNBcKq82DTnCmSfDlwIF2F04c2PkbtFXGmSVJyH?= =?us-ascii?Q?kM+1shk2+xU6/yM5dg4VS7S9wfVukcAOwcNhzrbmbpAogqvrDlm9DDWmn0zG?= =?us-ascii?Q?wwLSya6LkdkCfSlkLh4zcHzRtzAlIjbWtOZyHmzBEWghKgKzthfXYj3ydNt4?= =?us-ascii?Q?NyjHMvNgTMPWhDReFPxSRV8uZOIkkczkKxTMFqfP5CSO7Igq/EcTLj/V4Qr2?= =?us-ascii?Q?80OOvK7W1UdvXsoX75rpMVzGwZqsbgBlnupSxfpjOk6AJe8JX3t3rOVP6q3C?= =?us-ascii?Q?6BCfuREmgI2LTYFW1z0n1hkyj3qeYD4VKKlNJ5+FkcPAFED9Z91w7vdh+RTe?= =?us-ascii?Q?qO4aOY5aIjGmH4g4fyCkN6KEDGVk6PAmgDq+EvhoMWhRdaXCdD5eceJ3O0PC?= =?us-ascii?Q?6fXqFCwtb3igJaeTZ7agcl0S8HO9oCWr0BmklAO10eBW7XxtCGgX3HTFK63a?= =?us-ascii?Q?Ke//gOCrjl/Zxs=3D?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR02MB1040;5:zxT6hE1/Wp57fd7wcOt2R2DPSoqgHPxp7xpM8wBwnmc6rPpZ/+clLK0GeAUsG7/6FTJbuEQCSk0ZgiSZ4hCSrjmjX7N93Ngkrhe2r1BDNTLuuze8vfSSNozLBgVOOXRN3ym8KQCSblbH1DX4ztMyFw==;24:3Xq9dBME4P2mpcR5H35dUPF8ZmC6aha4tyz1s83TF077I+VBZgvz2aG6jGgaBxGO46gLsiTSIOrqtDjJhD98Q6HPS1Jrg+4VTifaUrz06to=;20:900aRP+QtENktoiKloGwIbvqZNalw83ClZn3eydj5AvfGSpUa7SLyR1Y2WvKQCXYD1Jk4BjpJ9btpy1CG3UScA== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: ezchip.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Aug 2015 08:58:40.4193 (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: VI1PR02MB1040 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6041 Lines: 180 From: Noam Camus Add support for UPIO_MEM32BE in addition to UPIO_MEM32. dw8250_serial_out32() extra functionality that is not part of the 8250 core driver was moved to new function called dw8250_check_LCR(). For big endian we use 2 new accessors similar to little endian, called dw8250_serial_out32be() and dw8250_serial_in32be(). Both little and big endian accessors use dw8250_check_LCR() for their dw8250_serial_out32{,be}(). In addition I added another 2 accessors inside private_data field of uart_port. This second level accessors are set during probe in private_data field of uart_port. Now any direct call to readl/writel is replaced with those accessors which are endianness aware. Last issue: readl() for UCV and CPR will not work for port type UPIO_MEM32BE. Instead we use the serial_in32() accessor which is initialized properly according to endianness. Signed-off-by: Noam Camus --- drivers/tty/serial/8250/8250_dw.c | 72 ++++++++++++++++++++++++++++++++----- 1 files changed, 63 insertions(+), 9 deletions(-) diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index d48b506..62f766a 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c @@ -64,6 +64,9 @@ struct dw8250_data { struct clk *pclk; struct reset_control *rst; struct uart_8250_dma dma; + unsigned int (*serial_in)(const void __iomem *addr); + void (*serial_out)(unsigned int value, + void __iomem *addr); }; #define BYT_PRV_CLK 0x800 @@ -173,15 +176,13 @@ static void dw8250_serial_outq(struct uart_port *p, int offset, int value) } #endif /* CONFIG_64BIT */ -static void dw8250_serial_out32(struct uart_port *p, int offset, int value) +static void dw8250_check_LCR(struct uart_port *p, int offset, int value) { struct dw8250_data *d = p->private_data; if (offset == UART_MCR) d->last_mcr = value; - writel(value, p->membase + (offset << p->regshift)); - /* Make sure LCR write wasn't ignored */ if (offset == UART_LCR) { int tries = 1000; @@ -190,7 +191,8 @@ static void dw8250_serial_out32(struct uart_port *p, int offset, int value) if ((value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR)) return; dw8250_force_idle(p); - writel(value, p->membase + (UART_LCR << p->regshift)); + d->serial_out(value, + p->membase + (UART_LCR << p->regshift)); } /* * FIXME: this deadlocks if port->lock is already held @@ -199,6 +201,22 @@ static void dw8250_serial_out32(struct uart_port *p, int offset, int value) } } +static void _dw8250_serial_out32(unsigned int value, void __iomem *addr) +{ + writel(value, addr); +} + +static unsigned int _dw8250_serial_in32(const void __iomem *addr) +{ + return readl(addr); +} + +static void dw8250_serial_out32(struct uart_port *p, int offset, int value) +{ + writel(value, p->membase + (offset << p->regshift)); + dw8250_check_LCR(p, offset, value); +} + static unsigned int dw8250_serial_in32(struct uart_port *p, int offset) { unsigned int value = readl(p->membase + (offset << p->regshift)); @@ -206,6 +224,29 @@ static unsigned int dw8250_serial_in32(struct uart_port *p, int offset) return dw8250_modify_msr(p, offset, value); } +static void _dw8250_serial_out32be(unsigned int value, void __iomem *addr) +{ + iowrite32be(value, addr); +} + +static unsigned int _dw8250_serial_in32be(const void __iomem *addr) +{ + return ioread32be(addr); +} + +static void dw8250_serial_out32be(struct uart_port *p, int offset, int value) +{ + iowrite32be(value, p->membase + (offset << p->regshift)); + dw8250_check_LCR(p, offset, value); +} + +static unsigned int dw8250_serial_in32be(struct uart_port *p, int offset) +{ + unsigned int value = ioread32be(p->membase + (offset << p->regshift)); + + return dw8250_modify_msr(p, offset, value); +} + static int dw8250_handle_irq(struct uart_port *p) { struct dw8250_data *d = p->private_data; @@ -269,7 +310,8 @@ static bool dw8250_dma_filter(struct dma_chan *chan, void *param) static void dw8250_setup_port(struct uart_8250_port *up) { struct uart_port *p = &up->port; - u32 reg = readl(p->membase + DW_UART_UCV); + struct dw8250_data *d = p->private_data; + u32 reg = d->serial_in(p->membase + DW_UART_UCV); /* * If the Component Version Register returns zero, we know that @@ -281,7 +323,7 @@ static void dw8250_setup_port(struct uart_8250_port *up) dev_dbg_ratelimited(p->dev, "Designware UART version %c.%c%c\n", (reg >> 24) & 0xff, (reg >> 16) & 0xff, (reg >> 8) & 0xff); - reg = readl(p->membase + DW_UART_CPR); + reg = d->serial_in(p->membase + DW_UART_CPR); if (!reg) return; @@ -322,9 +364,19 @@ static int dw8250_probe_of(struct uart_port *p, case 1: break; case 4: - p->iotype = UPIO_MEM32; - p->serial_in = dw8250_serial_in32; - p->serial_out = dw8250_serial_out32; + p->iotype = of_device_is_big_endian(np) ? + UPIO_MEM32BE : UPIO_MEM32; + if (p->iotype == UPIO_MEM32) { + p->serial_in = dw8250_serial_in32; + p->serial_out = dw8250_serial_out32; + data->serial_in = _dw8250_serial_in32; + data->serial_out = _dw8250_serial_out32; + } else { + p->serial_in = dw8250_serial_in32be; + p->serial_out = dw8250_serial_out32be; + data->serial_in = _dw8250_serial_in32be; + data->serial_out = _dw8250_serial_out32be; + } break; default: dev_err(p->dev, "unsupported reg-io-width (%u)\n", val); @@ -504,6 +556,8 @@ static int dw8250_probe(struct platform_device *pdev) data->dma.rx_param = data; data->dma.tx_param = data; data->dma.fn = dw8250_dma_filter; + data->serial_in = _dw8250_serial_in32; + data->serial_out = _dw8250_serial_out32; uart.port.iotype = UPIO_MEM; uart.port.serial_in = dw8250_serial_in; -- 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/