Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753556AbbHUKfg (ORCPT ); Fri, 21 Aug 2015 06:35:36 -0400 Received: from mail-db3on0067.outbound.protection.outlook.com ([157.55.234.67]:35360 "EHLO emea01-db3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753435AbbHUKfc (ORCPT ); Fri, 21 Aug 2015 06:35:32 -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: [v4 1/2] serial: 8250_dw: Add support for big-endian MMIO accesses Date: Fri, 21 Aug 2015 13:33:42 +0300 Message-ID: <1440153223-25712-2-git-send-email-noamc@ezchip.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1440153223-25712-1-git-send-email-noamc@ezchip.com> References: <1437886478-29273-1-git-send-email-noamc@ezchip.com> <1440153223-25712-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-21760.006 X-TM-AS-Result: No--4.059700-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;DB3FFO11FD039;1:3XRSdtPGTeM7YMaUEETKsrEqrza8W9LMdca3AI6SbKrGK0iMo4C4ij5lplJzXQmEJvHxk82tzAs7mC5MFBM5D7g5hVJoXC1Yukfna83Vcj9bxl2mg5MNdiISogF2HJt9t02ovX9PPD6hF+b/30q9gtaMPWIpykdmrXHyRYb5VRgCEJeoREnPTJ8htlml6C4isYSbGUMCK4DuU7Yl7MWAM2nwg+qjmEM8ObEvmVMfGEUb9416KP99EWQHEmOrRdT2tibOOhzUkhn7NHhsOKECd9Vd/v3vdqn9OqspBQzl14BW03syQ4+O5wEj6+RE0UcdIy1W/xsJSQkHnIX5c2YSttWsXK6N4bAStiATegS1RqebiBfAVmdDjmEVnqyIIRY9 X-Forefront-Antispam-Report: CIP:212.179.42.66;CTRY:IL;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(339900001)(3050300001)(199003)(189002)(50466002)(2950100001)(48376002)(92566002)(76176999)(46102003)(5003940100001)(229853001)(189998001)(77156002)(36756003)(6806004)(62966003)(19580405001)(19580395003)(4001540100001)(33646002)(86362001)(5001770100001)(5007970100001)(5001830100001)(85426001)(5001860100001)(50986999)(5001920100001)(77096005)(5001970100001)(104016003)(107886002)(87936001)(64706001)(106466001)(47776003)(50226001)(105606002)(49486002)(4001430100001);DIR:OUT;SFP:1101;SCL:1;SRVR:DB3PR02MB185;H:ezex10.ezchip.com;FPR:;SPF:Fail;PTR:ezmail.ezchip.com;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;DB3PR02MB185;2:+Wf9+poANXBYMcxSLO3Ze+DzlsYTnmw1DWe1ihnkuWsbqJvp5hnZphPV/Zz4BVdzkB/F0EKj3i9oq4m2NRwqJBu01ZvHZgmK+5hujkyxgjpdE0kvORDV76VsU6XUxkTBrmz9W3aCSNWcQxXIjKZ+kFUTg/QTq5yAP+yFGJq87IM=;3:EjnUY+gtURePJQko0eBHfbgyvp9RRhBsEQYdH1853g6gVVBeGwEHhsyKJoPyymCtFtKrfyj1ZTTczcjN+07zL3mwEi8XZ3+GqYET6Xxd9SYEPtrDm4/Q3jnUGdmxWG4hRPsXQYe2hFzUvoFgqcq0EkqjR2L+/EcKR8I4f4rMPj8ydrjx/hr5sQrJ5XOwNsOxEThiA9Br1gh2Ir8y/TWyFv4yaaRx37naau5sFPBxhto=;25:/EPpoNHcHD3rltiCSopMUEmaMGoK3BR3LVe8BDXy6U1gS0+gIr2MzkxdX9gqXD4VU6vjokSbOJmLC6bjxGAylVxfhR2f7mQrgPFGWtiPcltICW+J13/2iJvQxZFkTqHXQBFtQk6gzKqP85RGT0K7tfg1PG4P2q2CwNniRqOegRNnD3mGsuzf1mCYpnn3YjwYZgAZ8FueKRQkUCHlo+4uUUZ+6ylN2C9+eh7yzJtbURI1QL5gJsgbGM3ksS8SXu70KJFbv/PeDdBZinqbILxKFw==;20:GNw2bF8Ev6zVFM35x8G7qkjC1kQVRh6UEAaikw63quW6wh6Hg7lSoQImh+/hwK4wW4pPpV6DsUa5qjwI2dZq+ZR2jEHyGxMSiQlITb40UQk1mEg8m3iom2Ddo9abdvtwcKH8bWQVk08QKu+9xZobykC9cotoRVehyFjzHiyfQmI= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DB3PR02MB185; 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:DB3PR02MB185;BCL:0;PCL:0;RULEID:;SRVR:DB3PR02MB185; X-Microsoft-Exchange-Diagnostics: 1;DB3PR02MB185;4:I7lfgdUWaRDxUBSI3ky5oieE9T5pWOte7qXT0e2j/lFxpofSSAP/vhLDxtItXWv+mU7StN5CnYSgNrpbd4yCP0xCMKR+Xkt/iI0L7L/UAp2zW3riXA5a9V7QvVUPQXXJgNN6fgjkbjrnZvtK8AQpv6r8nFnm5DTDf47HNzGK28F9B+KNri/fKWLNFo5fRnQrhLhgZoTg7d6BYqt/dE9I3kRStJBCF21tBmcJXZVPgnZHSzSPIQYnjoSW/3Q7xHkCMPNltmst9HBeUt07zKkbDWU8qN8NVGAy3ur4caV9nrA9ErREUjqsEFuB18RCS29d X-Forefront-PRVS: 067553F396 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB3PR02MB185;23:jE9Zkkhtmt1mU8JBoAydeuBzBQd46uvjOCOhLi/rMh?= =?us-ascii?Q?2MGd+dGfwCvgUAleXbcNFqLKtBLZpH0tLmA2FO91SMpKA7ucBHTCINhLmSwn?= =?us-ascii?Q?APAr8b+iHWFU1rsreqLm5/MrK/z88/AS+XOmWE7v1kO7CC4x45zWGIxMNnDx?= =?us-ascii?Q?MNOOUbk4C8R7v6a0Z2B7F5+JhSUQueII466S46OAuL0c80pmXrvQgc/dkz/i?= =?us-ascii?Q?T9p4Bcmw7hkzIdVJSsqrHsVLNfyEf4VX8mzFEEY9U75veGObHapT/s9UAFmW?= =?us-ascii?Q?m2i8KRCkcsDp1RAjGGGzqVXzjhrzmLNx/hoA0tejPxqDDNpCX1cIH8/vR0WT?= =?us-ascii?Q?WbvzkMgJ0iOhryITafdhIYoBaDvZCzhaQFnJuMOtbaGox7kliK0KXi6x4mhs?= =?us-ascii?Q?mrHrtIScblAn/QFoorhDTPb76l34Je+Kn0zv/fmf6PAc6EJ0Curar71STzMa?= =?us-ascii?Q?FXU6Zw9cGm04yRbU3KPBQHkP0cgcnYAbpQHzy8eZHufoDC7kUibW81JHQWW+?= =?us-ascii?Q?/tVROTFDPEjg0FY+93VNz5rMIKfAb4sfuOQTT++bF+XQkGG9ggpqlraX6fkP?= =?us-ascii?Q?1H6XEBCSrUEJc2cU3E1VmJX4u4I1wUQIjIhWfoQUxqqwjubQOOzsrCThdoGr?= =?us-ascii?Q?HBAeSLI/tRsuEVGbrMn4537DElfLydCryTZdNzVxQ3b5gX4m5ROdxsddzig8?= =?us-ascii?Q?KB4Gu2PAvAI0oc05eOMQcRvxCxImc3DcdEEdbZ1no8VWa3gpdknCtP8osacs?= =?us-ascii?Q?Txyi+Xa2yNxwDBFYD7/ulwqtYHe5VOy9Jn40s4pYcmwORc6g+ub1ZDRZ9uXW?= =?us-ascii?Q?HwTfDQj9JQGVgrhZv+0dvUiKQsRIF7qdTRKWacVq3LrDJtdHV0/xtB+6ftvo?= =?us-ascii?Q?AbkAldydvUSdEuejsdSgydQgrRFOQBAcdAu7jo1tu0V+t5k6CAHqmqzx0jEU?= =?us-ascii?Q?WjUve0yyQf0dLihKKgZ7w2uM4nUzE0j1luEu1f7dhuQr2GQcoxja6k6HXNaX?= =?us-ascii?Q?BDfGZyJM66My72QRrm4acYw0Za4L38R/1+mYDz4RfP3Tu87C2JbUjWCmAsiO?= =?us-ascii?Q?kHr/O3Tr4G+OugKrs1MQHq6F2Rt2cPzN6Txt8eekP0NgD+LSiHHL8qgJeGs6?= =?us-ascii?Q?y5sGSHEXNY/CG1+sTJ6hwHPL7idfyn3cCLXdKULJmct3wiYhEDTX2nesnqNW?= =?us-ascii?Q?60sseqwpWOvfoAE6tNYqf2mT/cHLTcJJBh?= X-Microsoft-Exchange-Diagnostics: 1;DB3PR02MB185;5:05QJ9YfnOu68rrMQP2iCrBwe4I+5QSlj3t+sgaUQOLpzguDMuqmAb4OT1Lmom5g3ZVelab1bJBZJnwfPrVTduQY+MpOt7oQ9iwPTdcAdtrqnw1Vdk+qlvef96E+TUN8tyRd103FbpB2QyDaHBGOqYg==;24:SiiOBqWxkz8OJF+cbn8/BqxSbvtTs0FWLk9gdzYdkKMzFLz9ysExiS9fbX8WSMMICJcM9h5j9ZRMWnTTZFJuxj0D9Lu8g+3pRm3a/dIvNKs=;20:IijfsaLkvia0NjdvnG11Y+kDhF6Y0kAw4XNWCmGLs9ysrAiAB0xMqbzqVn+9gHzi195DjVF+ofko7Dg8e0UBSg== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: ezchip.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Aug 2015 10:35:27.5762 (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: DB3PR02MB185 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5149 Lines: 156 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 saved during probe in private_data field of uart_port. Now any direct call for readl/writel is replaced with those accessors which are aware of endianness. Signed-off-by: Noam Camus --- drivers/tty/serial/8250/8250_dw.c | 67 +++++++++++++++++++++++++++++++++---- 1 files changed, 60 insertions(+), 7 deletions(-) diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index d48b506..f479433 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; @@ -322,9 +363,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 +555,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/