-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
serial: rewrite pxa2xx-uart to use 8250_core
pxa2xx-uart was a separate uart platform driver. It was declaring the same device names and numbers as 8250 driver. As a result, it was impossible to use 8250 driver on PXA SoCs. Upon closer examination pxa2xx-uart turned out to be a clone of 8250_core driver. Workaround for Erratum #19 according to Marvel(R) PXA270M Processor Specification Update (April 19, 2010) is dropped. 8250_core reads from FIFO immediately after checking DR bit in LSR. The patch leaves the original SERIAL_PXA driver around. The original driver is just marked DEPRECATED in Kconfig and C source. When the original driver is considered safe to remove, no changes to SERIAL_8250 will be necessary. Compiling SERIAL_8250_CONSOLE and SERIAL_PXA_CONSOLE even without SERIAL_8250_PXA breaks console for SERIAL_PXA. For this reasons, the new and the original drivers are made mutually exclusive. Signed-off-by: Sergei Ianovich <ynvich@gmail.com> CC: Heikki Krogerus <heikki.krogerus@linux.intel.com> CC: James Cameron <quozl@laptop.org> CC: Robert Jarzmik <robert.jarzmik@free.fr> CC: Russell King <linux@arm.linux.org.uk> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> [rebased on v4.8] Tested-by: Robert Jarzmik <robert.jarzmik@free.fr> Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
- Loading branch information
Sergey Yanovich
authored and
Greg Kroah-Hartman
committed
Oct 27, 2016
1 parent
07d9a38
commit ab28f51
Showing
6 changed files
with
207 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,177 @@ | ||
/* | ||
* drivers/tty/serial/8250/8250_pxa.c -- driver for PXA on-board UARTS | ||
* Copyright: (C) 2013 Sergei Ianovich <ynvich@gmail.com> | ||
* | ||
* replaces drivers/serial/pxa.c by Nicolas Pitre | ||
* Created: Feb 20, 2003 | ||
* Copyright: (C) 2003 Monta Vista Software, Inc. | ||
* | ||
* Based on drivers/serial/8250.c by Russell King. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
*/ | ||
|
||
#include <linux/device.h> | ||
#include <linux/init.h> | ||
#include <linux/io.h> | ||
#include <linux/module.h> | ||
#include <linux/serial_8250.h> | ||
#include <linux/serial_core.h> | ||
#include <linux/serial_reg.h> | ||
#include <linux/of.h> | ||
#include <linux/of_irq.h> | ||
#include <linux/of_platform.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/slab.h> | ||
#include <linux/clk.h> | ||
#include <linux/pm_runtime.h> | ||
|
||
#include "8250.h" | ||
|
||
struct pxa8250_data { | ||
int line; | ||
struct clk *clk; | ||
}; | ||
|
||
#ifdef CONFIG_PM | ||
static int serial_pxa_suspend(struct device *dev) | ||
{ | ||
struct pxa8250_data *data = dev_get_drvdata(dev); | ||
|
||
serial8250_suspend_port(data->line); | ||
|
||
return 0; | ||
} | ||
|
||
static int serial_pxa_resume(struct device *dev) | ||
{ | ||
struct pxa8250_data *data = dev_get_drvdata(dev); | ||
|
||
serial8250_resume_port(data->line); | ||
|
||
return 0; | ||
} | ||
#endif | ||
|
||
static const struct dev_pm_ops serial_pxa_pm_ops = { | ||
SET_SYSTEM_SLEEP_PM_OPS(serial_pxa_suspend, serial_pxa_resume) | ||
}; | ||
|
||
static const struct of_device_id serial_pxa_dt_ids[] = { | ||
{ .compatible = "mrvl,pxa-uart", }, | ||
{ .compatible = "mrvl,mmp-uart", }, | ||
{} | ||
}; | ||
MODULE_DEVICE_TABLE(of, serial_pxa_dt_ids); | ||
|
||
/* Uart divisor latch write */ | ||
static void serial_pxa_dl_write(struct uart_8250_port *up, int value) | ||
{ | ||
unsigned int dll; | ||
|
||
serial_out(up, UART_DLL, value & 0xff); | ||
/* | ||
* work around Erratum #74 according to Marvel(R) PXA270M Processor | ||
* Specification Update (April 19, 2010) | ||
*/ | ||
dll = serial_in(up, UART_DLL); | ||
WARN_ON(dll != (value & 0xff)); | ||
|
||
serial_out(up, UART_DLM, value >> 8 & 0xff); | ||
} | ||
|
||
|
||
static void serial_pxa_pm(struct uart_port *port, unsigned int state, | ||
unsigned int oldstate) | ||
{ | ||
struct pxa8250_data *data = port->private_data; | ||
|
||
if (!state) | ||
clk_prepare_enable(data->clk); | ||
else | ||
clk_disable_unprepare(data->clk); | ||
} | ||
|
||
static int serial_pxa_probe(struct platform_device *pdev) | ||
{ | ||
struct uart_8250_port uart = {}; | ||
struct pxa8250_data *data; | ||
struct resource *mmres, *irqres; | ||
int ret; | ||
|
||
mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
irqres = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
if (!mmres || !irqres) | ||
return -ENODEV; | ||
|
||
data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); | ||
if (!data) | ||
return -ENOMEM; | ||
|
||
data->clk = devm_clk_get(&pdev->dev, NULL); | ||
if (IS_ERR(data->clk)) | ||
return PTR_ERR(data->clk); | ||
|
||
ret = clk_prepare(data->clk); | ||
if (ret) | ||
return ret; | ||
|
||
uart.port.type = PORT_XSCALE; | ||
uart.port.iotype = UPIO_MEM32; | ||
uart.port.mapbase = mmres->start; | ||
uart.port.regshift = 2; | ||
uart.port.irq = irqres->start; | ||
uart.port.fifosize = 64; | ||
uart.port.flags = UPF_IOREMAP | UPF_SKIP_TEST; | ||
uart.port.dev = &pdev->dev; | ||
uart.port.uartclk = clk_get_rate(data->clk); | ||
uart.port.pm = serial_pxa_pm; | ||
uart.port.private_data = data; | ||
uart.dl_write = serial_pxa_dl_write; | ||
|
||
ret = serial8250_register_8250_port(&uart); | ||
if (ret < 0) | ||
goto err_clk; | ||
|
||
data->line = ret; | ||
|
||
platform_set_drvdata(pdev, data); | ||
|
||
return 0; | ||
|
||
err_clk: | ||
clk_unprepare(data->clk); | ||
return ret; | ||
} | ||
|
||
static int serial_pxa_remove(struct platform_device *pdev) | ||
{ | ||
struct pxa8250_data *data = platform_get_drvdata(pdev); | ||
|
||
serial8250_unregister_port(data->line); | ||
|
||
clk_unprepare(data->clk); | ||
|
||
return 0; | ||
} | ||
|
||
static struct platform_driver serial_pxa_driver = { | ||
.probe = serial_pxa_probe, | ||
.remove = serial_pxa_remove, | ||
|
||
.driver = { | ||
.name = "pxa2xx-uart", | ||
.pm = &serial_pxa_pm_ops, | ||
.of_match_table = serial_pxa_dt_ids, | ||
}, | ||
}; | ||
|
||
module_platform_driver(serial_pxa_driver); | ||
|
||
MODULE_AUTHOR("Sergei Ianovich"); | ||
MODULE_LICENSE("GPL"); | ||
MODULE_ALIAS("platform:pxa2xx-uart"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters