You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'tty-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull tty/serial driver updates from Greg KH: "Here's the big tty/serial driver update for 3.13-rc1. There's some more minor n_tty work here, but nothing like previous kernel releases. Also some new driver ids, driver updates for new hardware, and other small things. All of this has been in linux-next for a while with no issues" * tag 'tty-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (84 commits) serial: omap: fix missing comma serial: sh-sci: Enable the driver on all ARM platforms serial: mfd: Staticize local symbols serial: omap: fix a few checkpatch warnings serial: omap: improve RS-485 performance mrst_max3110: fix unbalanced IRQ issue during resume serial: omap: Add support for optional wake-up serial: sirf: remove duplicate defines tty: xuartps: Fix build error when COMMON_CLK is not set tty: xuartps: Fix build error due to missing forward declaration tty: xuartps: Fix "may be used uninitialized" build warning serial: 8250_pci: add Pericom PCIe Serial board Support (12d8:7952/4/8) - Chip PI7C9X7952/4/8 tty: xuartps: Update copyright information tty: xuartps: Implement suspend/resume callbacks tty: xuartps: Dynamically adjust to input frequency changes tty: xuartps: Updating set_baud_rate() tty: xuartps: Force enable the UART in xuartps_console_write tty: xuartps: support 64 byte FIFO size tty: xuartps: Add polled mode support for xuartps tty: xuartps: Implement BREAK detection, add SYSRQ support ...
This commit is contained in:
@@ -264,10 +264,6 @@ hardware.
|
||||
Locking: none.
|
||||
Interrupts: caller dependent.
|
||||
|
||||
set_wake(port,state)
|
||||
Enable/disable power management wakeup on serial activity. Not
|
||||
currently implemented.
|
||||
|
||||
type(port)
|
||||
Return a pointer to a string constant describing the specified
|
||||
port, or return NULL, in which case the string 'unknown' is
|
||||
|
||||
+15
-13
@@ -11,27 +11,29 @@ regardless of whatever else it is doing, unless it is completely locked up.
|
||||
You need to say "yes" to 'Magic SysRq key (CONFIG_MAGIC_SYSRQ)' when
|
||||
configuring the kernel. When running a kernel with SysRq compiled in,
|
||||
/proc/sys/kernel/sysrq controls the functions allowed to be invoked via
|
||||
the SysRq key. By default the file contains 1 which means that every
|
||||
possible SysRq request is allowed (in older versions SysRq was disabled
|
||||
by default, and you were required to specifically enable it at run-time
|
||||
but this is not the case any more). Here is the list of possible values
|
||||
in /proc/sys/kernel/sysrq:
|
||||
the SysRq key. The default value in this file is set by the
|
||||
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE config symbol, which itself defaults
|
||||
to 1. Here is the list of possible values in /proc/sys/kernel/sysrq:
|
||||
0 - disable sysrq completely
|
||||
1 - enable all functions of sysrq
|
||||
>1 - bitmask of allowed sysrq functions (see below for detailed function
|
||||
description):
|
||||
2 - enable control of console logging level
|
||||
4 - enable control of keyboard (SAK, unraw)
|
||||
8 - enable debugging dumps of processes etc.
|
||||
16 - enable sync command
|
||||
32 - enable remount read-only
|
||||
64 - enable signalling of processes (term, kill, oom-kill)
|
||||
128 - allow reboot/poweroff
|
||||
256 - allow nicing of all RT tasks
|
||||
2 = 0x2 - enable control of console logging level
|
||||
4 = 0x4 - enable control of keyboard (SAK, unraw)
|
||||
8 = 0x8 - enable debugging dumps of processes etc.
|
||||
16 = 0x10 - enable sync command
|
||||
32 = 0x20 - enable remount read-only
|
||||
64 = 0x40 - enable signalling of processes (term, kill, oom-kill)
|
||||
128 = 0x80 - allow reboot/poweroff
|
||||
256 = 0x100 - allow nicing of all RT tasks
|
||||
|
||||
You can set the value in the file by the following command:
|
||||
echo "number" >/proc/sys/kernel/sysrq
|
||||
|
||||
The number may be written here either as decimal or as hexadecimal
|
||||
with the 0x prefix. CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE must always be
|
||||
written in hexadecimal.
|
||||
|
||||
Note that the value of /proc/sys/kernel/sysrq influences only the invocation
|
||||
via a keyboard. Invocation of any operation via /proc/sysrq-trigger is always
|
||||
allowed (by a user with admin privileges).
|
||||
|
||||
@@ -349,7 +349,7 @@ bfin_jc_early_write(struct console *co, const char *buf, unsigned int count)
|
||||
bfin_jc_straight_buffer_write(buf, count);
|
||||
}
|
||||
|
||||
static struct __initdata console bfin_jc_early_console = {
|
||||
static struct console bfin_jc_early_console __initdata = {
|
||||
.name = "early_BFJC",
|
||||
.write = bfin_jc_early_write,
|
||||
.flags = CON_ANYTIME | CON_PRINTBUFFER,
|
||||
|
||||
@@ -86,6 +86,21 @@ static int hvc_dcc_get_chars(uint32_t vt, char *buf, int count)
|
||||
return i;
|
||||
}
|
||||
|
||||
static bool hvc_dcc_check(void)
|
||||
{
|
||||
unsigned long time = jiffies + (HZ / 10);
|
||||
|
||||
/* Write a test character to check if it is handled */
|
||||
__dcc_putchar('\n');
|
||||
|
||||
while (time_is_after_jiffies(time)) {
|
||||
if (!(__dcc_getstatus() & DCC_STATUS_TX))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static const struct hv_ops hvc_dcc_get_put_ops = {
|
||||
.get_chars = hvc_dcc_get_chars,
|
||||
.put_chars = hvc_dcc_put_chars,
|
||||
@@ -93,6 +108,9 @@ static const struct hv_ops hvc_dcc_get_put_ops = {
|
||||
|
||||
static int __init hvc_dcc_console_init(void)
|
||||
{
|
||||
if (!hvc_dcc_check())
|
||||
return -ENODEV;
|
||||
|
||||
hvc_instantiate(0, 0, &hvc_dcc_get_put_ops);
|
||||
return 0;
|
||||
}
|
||||
@@ -100,6 +118,9 @@ console_initcall(hvc_dcc_console_init);
|
||||
|
||||
static int __init hvc_dcc_init(void)
|
||||
{
|
||||
if (!hvc_dcc_check())
|
||||
return -ENODEV;
|
||||
|
||||
hvc_alloc(0, 0, &hvc_dcc_get_put_ops, 128);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#include <asm/prom.h>
|
||||
#include <asm/hvsi.h>
|
||||
#include <asm/udbg.h>
|
||||
#include <asm/machdep.h>
|
||||
|
||||
#include "hvc_console.h"
|
||||
|
||||
@@ -457,7 +458,9 @@ void __init hvc_vio_init_early(void)
|
||||
if (hvterm_priv0.proto == HV_PROTOCOL_HVSI)
|
||||
goto out;
|
||||
#endif
|
||||
add_preferred_console("hvc", 0, NULL);
|
||||
/* Check whether the user has requested a different console. */
|
||||
if (!strstr(cmd_line, "console="))
|
||||
add_preferred_console("hvc", 0, NULL);
|
||||
hvc_instantiate(0, 0, ops);
|
||||
out:
|
||||
of_node_put(stdout_node);
|
||||
|
||||
+3
-10
@@ -767,7 +767,7 @@ static size_t __process_echoes(struct tty_struct *tty)
|
||||
* of echo overrun before the next commit), then discard enough
|
||||
* data at the tail to prevent a subsequent overrun */
|
||||
while (ldata->echo_commit - tail >= ECHO_DISCARD_WATERMARK) {
|
||||
if (echo_buf(ldata, tail == ECHO_OP_START)) {
|
||||
if (echo_buf(ldata, tail) == ECHO_OP_START) {
|
||||
if (echo_buf(ldata, tail) == ECHO_OP_ERASE_TAB)
|
||||
tail += 3;
|
||||
else
|
||||
@@ -1752,20 +1752,14 @@ int is_ignored(int sig)
|
||||
static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
|
||||
{
|
||||
struct n_tty_data *ldata = tty->disc_data;
|
||||
int canon_change = 1;
|
||||
|
||||
if (old)
|
||||
canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON;
|
||||
if (canon_change) {
|
||||
if (!old || (old->c_lflag ^ tty->termios.c_lflag) & ICANON) {
|
||||
bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
|
||||
ldata->line_start = ldata->canon_head = ldata->read_tail;
|
||||
ldata->erasing = 0;
|
||||
ldata->lnext = 0;
|
||||
}
|
||||
|
||||
if (canon_change && !L_ICANON(tty) && read_cnt(ldata))
|
||||
wake_up_interruptible(&tty->read_wait);
|
||||
|
||||
ldata->icanon = (L_ICANON(tty) != 0);
|
||||
|
||||
if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) ||
|
||||
@@ -1820,9 +1814,8 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
|
||||
* Fix tty hang when I_IXON(tty) is cleared, but the tty
|
||||
* been stopped by STOP_CHAR(tty) before it.
|
||||
*/
|
||||
if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped) {
|
||||
if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped)
|
||||
start_tty(tty);
|
||||
}
|
||||
|
||||
/* The termios change make the tty ready for I/O */
|
||||
wake_up_interruptible(&tty->write_wait);
|
||||
|
||||
@@ -959,7 +959,7 @@ static int receive_flow_control(struct nozomi *dc)
|
||||
dev_err(&dc->pdev->dev,
|
||||
"ERROR: flow control received for non-existing port\n");
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
DBG1("0x%04X->0x%04X", *((u16 *)&dc->port[port].ctrl_dl),
|
||||
*((u16 *)&ctrl_dl));
|
||||
@@ -1025,7 +1025,7 @@ static enum ctrl_port_type port2ctrl(enum port_type port,
|
||||
dev_err(&dc->pdev->dev,
|
||||
"ERROR: send flow control " \
|
||||
"received for non-existing port\n");
|
||||
};
|
||||
}
|
||||
return CTRL_ERROR;
|
||||
}
|
||||
|
||||
@@ -1805,7 +1805,7 @@ static int ntty_ioctl(struct tty_struct *tty,
|
||||
default:
|
||||
DBG1("ERR: 0x%08X, %d", cmd, cmd);
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
@@ -2322,7 +2322,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) {
|
||||
fcr = uart_config[port->type].fcr;
|
||||
if (baud < 2400 || fifo_bug) {
|
||||
if ((baud < 2400 && !up->dma) || fifo_bug) {
|
||||
fcr &= ~UART_FCR_TRIGGER_MASK;
|
||||
fcr |= UART_FCR_TRIGGER_1;
|
||||
}
|
||||
|
||||
@@ -56,11 +56,11 @@
|
||||
|
||||
|
||||
struct dw8250_data {
|
||||
int last_lcr;
|
||||
int last_mcr;
|
||||
int line;
|
||||
struct clk *clk;
|
||||
u8 usr_reg;
|
||||
u8 usr_reg;
|
||||
int last_mcr;
|
||||
int line;
|
||||
struct clk *clk;
|
||||
struct uart_8250_dma dma;
|
||||
};
|
||||
|
||||
static inline int dw8250_modify_msr(struct uart_port *p, int offset, int value)
|
||||
@@ -76,17 +76,33 @@ static inline int dw8250_modify_msr(struct uart_port *p, int offset, int value)
|
||||
return value;
|
||||
}
|
||||
|
||||
static void dw8250_force_idle(struct uart_port *p)
|
||||
{
|
||||
serial8250_clear_and_reinit_fifos(container_of
|
||||
(p, struct uart_8250_port, port));
|
||||
(void)p->serial_in(p, UART_RX);
|
||||
}
|
||||
|
||||
static void dw8250_serial_out(struct uart_port *p, int offset, int value)
|
||||
{
|
||||
struct dw8250_data *d = p->private_data;
|
||||
|
||||
if (offset == UART_LCR)
|
||||
d->last_lcr = value;
|
||||
|
||||
if (offset == UART_MCR)
|
||||
d->last_mcr = value;
|
||||
|
||||
writeb(value, p->membase + (offset << p->regshift));
|
||||
|
||||
/* Make sure LCR write wasn't ignored */
|
||||
if (offset == UART_LCR) {
|
||||
int tries = 1000;
|
||||
while (tries--) {
|
||||
if (value == p->serial_in(p, UART_LCR))
|
||||
return;
|
||||
dw8250_force_idle(p);
|
||||
writeb(value, p->membase + (UART_LCR << p->regshift));
|
||||
}
|
||||
dev_err(p->dev, "Couldn't set LCR to %d\n", value);
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int dw8250_serial_in(struct uart_port *p, int offset)
|
||||
@@ -107,13 +123,22 @@ static void dw8250_serial_out32(struct uart_port *p, int offset, int value)
|
||||
{
|
||||
struct dw8250_data *d = p->private_data;
|
||||
|
||||
if (offset == UART_LCR)
|
||||
d->last_lcr = value;
|
||||
|
||||
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;
|
||||
while (tries--) {
|
||||
if (value == p->serial_in(p, UART_LCR))
|
||||
return;
|
||||
dw8250_force_idle(p);
|
||||
writel(value, p->membase + (UART_LCR << p->regshift));
|
||||
}
|
||||
dev_err(p->dev, "Couldn't set LCR to %d\n", value);
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int dw8250_serial_in32(struct uart_port *p, int offset)
|
||||
@@ -131,9 +156,8 @@ static int dw8250_handle_irq(struct uart_port *p)
|
||||
if (serial8250_handle_irq(p, iir)) {
|
||||
return 1;
|
||||
} else if ((iir & UART_IIR_BUSY) == UART_IIR_BUSY) {
|
||||
/* Clear the USR and write the LCR again. */
|
||||
/* Clear the USR */
|
||||
(void)p->serial_in(p, d->usr_reg);
|
||||
p->serial_out(p, UART_LCR, d->last_lcr);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -153,6 +177,14 @@ dw8250_do_pm(struct uart_port *port, unsigned int state, unsigned int old)
|
||||
pm_runtime_put_sync_suspend(port->dev);
|
||||
}
|
||||
|
||||
static bool dw8250_dma_filter(struct dma_chan *chan, void *param)
|
||||
{
|
||||
struct dw8250_data *data = param;
|
||||
|
||||
return chan->chan_id == data->dma.tx_chan_id ||
|
||||
chan->chan_id == data->dma.rx_chan_id;
|
||||
}
|
||||
|
||||
static void dw8250_setup_port(struct uart_8250_port *up)
|
||||
{
|
||||
struct uart_port *p = &up->port;
|
||||
@@ -241,7 +273,8 @@ static int dw8250_probe_of(struct uart_port *p,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static int dw8250_probe_acpi(struct uart_8250_port *up)
|
||||
static int dw8250_probe_acpi(struct uart_8250_port *up,
|
||||
struct dw8250_data *data)
|
||||
{
|
||||
const struct acpi_device_id *id;
|
||||
struct uart_port *p = &up->port;
|
||||
@@ -260,9 +293,7 @@ static int dw8250_probe_acpi(struct uart_8250_port *up)
|
||||
if (!p->uartclk)
|
||||
p->uartclk = (unsigned int)id->driver_data;
|
||||
|
||||
up->dma = devm_kzalloc(p->dev, sizeof(*up->dma), GFP_KERNEL);
|
||||
if (!up->dma)
|
||||
return -ENOMEM;
|
||||
up->dma = &data->dma;
|
||||
|
||||
up->dma->rxconf.src_maxburst = p->fifosize / 4;
|
||||
up->dma->txconf.dst_maxburst = p->fifosize / 4;
|
||||
@@ -270,7 +301,8 @@ static int dw8250_probe_acpi(struct uart_8250_port *up)
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static inline int dw8250_probe_acpi(struct uart_8250_port *up)
|
||||
static inline int dw8250_probe_acpi(struct uart_8250_port *up,
|
||||
struct dw8250_data *data)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -314,6 +346,12 @@ static int dw8250_probe(struct platform_device *pdev)
|
||||
uart.port.uartclk = clk_get_rate(data->clk);
|
||||
}
|
||||
|
||||
data->dma.rx_chan_id = -1;
|
||||
data->dma.tx_chan_id = -1;
|
||||
data->dma.rx_param = data;
|
||||
data->dma.tx_param = data;
|
||||
data->dma.fn = dw8250_dma_filter;
|
||||
|
||||
uart.port.iotype = UPIO_MEM;
|
||||
uart.port.serial_in = dw8250_serial_in;
|
||||
uart.port.serial_out = dw8250_serial_out;
|
||||
@@ -324,7 +362,7 @@ static int dw8250_probe(struct platform_device *pdev)
|
||||
if (err)
|
||||
return err;
|
||||
} else if (ACPI_HANDLE(&pdev->dev)) {
|
||||
err = dw8250_probe_acpi(&uart);
|
||||
err = dw8250_probe_acpi(&uart, data);
|
||||
if (err)
|
||||
return err;
|
||||
} else {
|
||||
|
||||
@@ -122,7 +122,7 @@ static int serial8250_em_probe(struct platform_device *pdev)
|
||||
up.port.dev = &pdev->dev;
|
||||
up.port.private_data = priv;
|
||||
|
||||
clk_enable(priv->sclk);
|
||||
clk_prepare_enable(priv->sclk);
|
||||
up.port.uartclk = clk_get_rate(priv->sclk);
|
||||
|
||||
up.port.iotype = UPIO_MEM32;
|
||||
@@ -134,7 +134,7 @@ static int serial8250_em_probe(struct platform_device *pdev)
|
||||
ret = serial8250_register_8250_port(&up);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "unable to register 8250 port\n");
|
||||
clk_disable(priv->sclk);
|
||||
clk_disable_unprepare(priv->sclk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ static int serial8250_em_remove(struct platform_device *pdev)
|
||||
struct serial8250_em_priv *priv = platform_get_drvdata(pdev);
|
||||
|
||||
serial8250_unregister_port(priv->line);
|
||||
clk_disable(priv->sclk);
|
||||
clk_disable_unprepare(priv->sclk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License.
|
||||
*/
|
||||
#undef DEBUG
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
@@ -27,8 +28,6 @@
|
||||
|
||||
#include "8250.h"
|
||||
|
||||
#undef SERIAL_DEBUG_PCI
|
||||
|
||||
/*
|
||||
* init function returns:
|
||||
* > 0 - number of ports
|
||||
@@ -63,7 +62,7 @@ static int pci_default_setup(struct serial_private*,
|
||||
|
||||
static void moan_device(const char *str, struct pci_dev *dev)
|
||||
{
|
||||
printk(KERN_WARNING
|
||||
dev_err(&dev->dev,
|
||||
"%s: %s\n"
|
||||
"Please send the output of lspci -vv, this\n"
|
||||
"message (0x%04x,0x%04x,0x%04x,0x%04x), the\n"
|
||||
@@ -233,7 +232,7 @@ static int pci_inteli960ni_init(struct pci_dev *dev)
|
||||
/* is firmware started? */
|
||||
pci_read_config_dword(dev, 0x44, (void *)&oldval);
|
||||
if (oldval == 0x00001000L) { /* RESET value */
|
||||
printk(KERN_DEBUG "Local i960 firmware missing");
|
||||
dev_dbg(&dev->dev, "Local i960 firmware missing\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
return 0;
|
||||
@@ -827,7 +826,7 @@ static int pci_netmos_9900_numports(struct pci_dev *dev)
|
||||
if (sub_serports > 0) {
|
||||
return sub_serports;
|
||||
} else {
|
||||
printk(KERN_NOTICE "NetMos/Mostech serial driver ignoring port on ambiguous config.\n");
|
||||
dev_err(&dev->dev, "NetMos/Mostech serial driver ignoring port on ambiguous config.\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -931,7 +930,7 @@ static int pci_ite887x_init(struct pci_dev *dev)
|
||||
}
|
||||
|
||||
if (!inta_addr[i]) {
|
||||
printk(KERN_ERR "ite887x: could not find iobase\n");
|
||||
dev_err(&dev->dev, "ite887x: could not find iobase\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -1024,9 +1023,9 @@ static int pci_oxsemi_tornado_init(struct pci_dev *dev)
|
||||
/* Tornado device */
|
||||
if (deviceID == 0x07000200) {
|
||||
number_uarts = ioread8(p + 4);
|
||||
printk(KERN_DEBUG
|
||||
dev_dbg(&dev->dev,
|
||||
"%d ports detected on Oxford PCI Express device\n",
|
||||
number_uarts);
|
||||
number_uarts);
|
||||
}
|
||||
pci_iounmap(dev, p);
|
||||
return number_uarts;
|
||||
@@ -1308,6 +1307,29 @@ static int pci_default_setup(struct serial_private *priv,
|
||||
return setup_port(priv, port, bar, offset, board->reg_shift);
|
||||
}
|
||||
|
||||
static int pci_pericom_setup(struct serial_private *priv,
|
||||
const struct pciserial_board *board,
|
||||
struct uart_8250_port *port, int idx)
|
||||
{
|
||||
unsigned int bar, offset = board->first_offset, maxnr;
|
||||
|
||||
bar = FL_GET_BASE(board->flags);
|
||||
if (board->flags & FL_BASE_BARS)
|
||||
bar += idx;
|
||||
else
|
||||
offset += idx * board->uart_offset;
|
||||
|
||||
maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) >>
|
||||
(board->reg_shift + 3);
|
||||
|
||||
if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr)
|
||||
return 1;
|
||||
|
||||
port->port.uartclk = 14745600;
|
||||
|
||||
return setup_port(priv, port, bar, offset, board->reg_shift);
|
||||
}
|
||||
|
||||
static int
|
||||
ce4100_serial_setup(struct serial_private *priv,
|
||||
const struct pciserial_board *board,
|
||||
@@ -1324,6 +1346,120 @@ ce4100_serial_setup(struct serial_private *priv,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_BYT_UART1 0x0f0a
|
||||
#define PCI_DEVICE_ID_INTEL_BYT_UART2 0x0f0c
|
||||
|
||||
#define BYT_PRV_CLK 0x800
|
||||
#define BYT_PRV_CLK_EN (1 << 0)
|
||||
#define BYT_PRV_CLK_M_VAL_SHIFT 1
|
||||
#define BYT_PRV_CLK_N_VAL_SHIFT 16
|
||||
#define BYT_PRV_CLK_UPDATE (1 << 31)
|
||||
|
||||
#define BYT_GENERAL_REG 0x808
|
||||
#define BYT_GENERAL_DIS_RTS_N_OVERRIDE (1 << 3)
|
||||
|
||||
#define BYT_TX_OVF_INT 0x820
|
||||
#define BYT_TX_OVF_INT_MASK (1 << 1)
|
||||
|
||||
static void
|
||||
byt_set_termios(struct uart_port *p, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
{
|
||||
unsigned int baud = tty_termios_baud_rate(termios);
|
||||
unsigned int m = 6912;
|
||||
unsigned int n = 15625;
|
||||
u32 reg;
|
||||
|
||||
/* For baud rates 1M, 2M, 3M and 4M the dividers must be adjusted. */
|
||||
if (baud == 1000000 || baud == 2000000 || baud == 4000000) {
|
||||
m = 64;
|
||||
n = 100;
|
||||
|
||||
p->uartclk = 64000000;
|
||||
} else if (baud == 3000000) {
|
||||
m = 48;
|
||||
n = 100;
|
||||
|
||||
p->uartclk = 48000000;
|
||||
} else {
|
||||
p->uartclk = 44236800;
|
||||
}
|
||||
|
||||
/* Reset the clock */
|
||||
reg = (m << BYT_PRV_CLK_M_VAL_SHIFT) | (n << BYT_PRV_CLK_N_VAL_SHIFT);
|
||||
writel(reg, p->membase + BYT_PRV_CLK);
|
||||
reg |= BYT_PRV_CLK_EN | BYT_PRV_CLK_UPDATE;
|
||||
writel(reg, p->membase + BYT_PRV_CLK);
|
||||
|
||||
/*
|
||||
* If auto-handshake mechanism is not enabled,
|
||||
* disable rts_n override
|
||||
*/
|
||||
reg = readl(p->membase + BYT_GENERAL_REG);
|
||||
reg &= ~BYT_GENERAL_DIS_RTS_N_OVERRIDE;
|
||||
if (termios->c_cflag & CRTSCTS)
|
||||
reg |= BYT_GENERAL_DIS_RTS_N_OVERRIDE;
|
||||
writel(reg, p->membase + BYT_GENERAL_REG);
|
||||
|
||||
serial8250_do_set_termios(p, termios, old);
|
||||
}
|
||||
|
||||
static bool byt_dma_filter(struct dma_chan *chan, void *param)
|
||||
{
|
||||
return chan->chan_id == *(int *)param;
|
||||
}
|
||||
|
||||
static int
|
||||
byt_serial_setup(struct serial_private *priv,
|
||||
const struct pciserial_board *board,
|
||||
struct uart_8250_port *port, int idx)
|
||||
{
|
||||
struct uart_8250_dma *dma;
|
||||
int ret;
|
||||
|
||||
dma = devm_kzalloc(port->port.dev, sizeof(*dma), GFP_KERNEL);
|
||||
if (!dma)
|
||||
return -ENOMEM;
|
||||
|
||||
switch (priv->dev->device) {
|
||||
case PCI_DEVICE_ID_INTEL_BYT_UART1:
|
||||
dma->rx_chan_id = 3;
|
||||
dma->tx_chan_id = 2;
|
||||
break;
|
||||
case PCI_DEVICE_ID_INTEL_BYT_UART2:
|
||||
dma->rx_chan_id = 5;
|
||||
dma->tx_chan_id = 4;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dma->rxconf.slave_id = dma->rx_chan_id;
|
||||
dma->rxconf.src_maxburst = 16;
|
||||
|
||||
dma->txconf.slave_id = dma->tx_chan_id;
|
||||
dma->txconf.dst_maxburst = 16;
|
||||
|
||||
dma->fn = byt_dma_filter;
|
||||
dma->rx_param = &dma->rx_chan_id;
|
||||
dma->tx_param = &dma->tx_chan_id;
|
||||
|
||||
ret = pci_default_setup(priv, board, port, idx);
|
||||
port->port.iotype = UPIO_MEM;
|
||||
port->port.type = PORT_16550A;
|
||||
port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
|
||||
port->port.set_termios = byt_set_termios;
|
||||
port->port.fifosize = 64;
|
||||
port->tx_loadsz = 64;
|
||||
port->dma = dma;
|
||||
port->capabilities = UART_CAP_FIFO | UART_CAP_AFE;
|
||||
|
||||
/* Disable Tx counter interrupts */
|
||||
writel(BYT_TX_OVF_INT_MASK, port->port.membase + BYT_TX_OVF_INT);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
pci_omegapci_setup(struct serial_private *priv,
|
||||
const struct pciserial_board *board,
|
||||
@@ -1344,17 +1480,80 @@ pci_brcm_trumanage_setup(struct serial_private *priv,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pci_fintek_setup(struct serial_private *priv,
|
||||
const struct pciserial_board *board,
|
||||
struct uart_8250_port *port, int idx)
|
||||
{
|
||||
struct pci_dev *pdev = priv->dev;
|
||||
unsigned long base;
|
||||
unsigned long iobase;
|
||||
unsigned long ciobase = 0;
|
||||
u8 config_base;
|
||||
|
||||
/*
|
||||
* We are supposed to be able to read these from the PCI config space,
|
||||
* but the values there don't seem to match what we need to use, so
|
||||
* just use these hard-coded values for now, as they are correct.
|
||||
*/
|
||||
switch (idx) {
|
||||
case 0: iobase = 0xe000; config_base = 0x40; break;
|
||||
case 1: iobase = 0xe008; config_base = 0x48; break;
|
||||
case 2: iobase = 0xe010; config_base = 0x50; break;
|
||||
case 3: iobase = 0xe018; config_base = 0x58; break;
|
||||
case 4: iobase = 0xe020; config_base = 0x60; break;
|
||||
case 5: iobase = 0xe028; config_base = 0x68; break;
|
||||
case 6: iobase = 0xe030; config_base = 0x70; break;
|
||||
case 7: iobase = 0xe038; config_base = 0x78; break;
|
||||
case 8: iobase = 0xe040; config_base = 0x80; break;
|
||||
case 9: iobase = 0xe048; config_base = 0x88; break;
|
||||
case 10: iobase = 0xe050; config_base = 0x90; break;
|
||||
case 11: iobase = 0xe058; config_base = 0x98; break;
|
||||
default:
|
||||
/* Unknown number of ports, get out of here */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (idx < 4) {
|
||||
base = pci_resource_start(priv->dev, 3);
|
||||
ciobase = (int)(base + (0x8 * idx));
|
||||
}
|
||||
|
||||
dev_dbg(&pdev->dev, "%s: idx=%d iobase=0x%lx ciobase=0x%lx config_base=0x%2x\n",
|
||||
__func__, idx, iobase, ciobase, config_base);
|
||||
|
||||
/* Enable UART I/O port */
|
||||
pci_write_config_byte(pdev, config_base + 0x00, 0x01);
|
||||
|
||||
/* Select 128-byte FIFO and 8x FIFO threshold */
|
||||
pci_write_config_byte(pdev, config_base + 0x01, 0x33);
|
||||
|
||||
/* LSB UART */
|
||||
pci_write_config_byte(pdev, config_base + 0x04, (u8)(iobase & 0xff));
|
||||
|
||||
/* MSB UART */
|
||||
pci_write_config_byte(pdev, config_base + 0x05, (u8)((iobase & 0xff00) >> 8));
|
||||
|
||||
/* irq number, this usually fails, but the spec says to do it anyway. */
|
||||
pci_write_config_byte(pdev, config_base + 0x06, pdev->irq);
|
||||
|
||||
port->port.iotype = UPIO_PORT;
|
||||
port->port.iobase = iobase;
|
||||
port->port.mapbase = 0;
|
||||
port->port.membase = NULL;
|
||||
port->port.regshift = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int skip_tx_en_setup(struct serial_private *priv,
|
||||
const struct pciserial_board *board,
|
||||
struct uart_8250_port *port, int idx)
|
||||
{
|
||||
port->port.flags |= UPF_NO_TXEN_TEST;
|
||||
printk(KERN_DEBUG "serial8250: skipping TxEn test for device "
|
||||
"[%04x:%04x] subsystem [%04x:%04x]\n",
|
||||
priv->dev->vendor,
|
||||
priv->dev->device,
|
||||
priv->dev->subsystem_vendor,
|
||||
priv->dev->subsystem_device);
|
||||
dev_dbg(&priv->dev->dev,
|
||||
"serial8250: skipping TxEn test for device [%04x:%04x] subsystem [%04x:%04x]\n",
|
||||
priv->dev->vendor, priv->dev->device,
|
||||
priv->dev->subsystem_vendor, priv->dev->subsystem_device);
|
||||
|
||||
return pci_default_setup(priv, board, port, idx);
|
||||
}
|
||||
@@ -1662,6 +1861,20 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = kt_serial_setup,
|
||||
},
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_INTEL,
|
||||
.device = PCI_DEVICE_ID_INTEL_BYT_UART1,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = byt_serial_setup,
|
||||
},
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_INTEL,
|
||||
.device = PCI_DEVICE_ID_INTEL_BYT_UART2,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = byt_serial_setup,
|
||||
},
|
||||
/*
|
||||
* ITE
|
||||
*/
|
||||
@@ -1825,6 +2038,31 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
|
||||
.setup = pci_default_setup,
|
||||
.exit = pci_plx9050_exit,
|
||||
},
|
||||
/*
|
||||
* Pericom
|
||||
*/
|
||||
{
|
||||
.vendor = 0x12d8,
|
||||
.device = 0x7952,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_pericom_setup,
|
||||
},
|
||||
{
|
||||
.vendor = 0x12d8,
|
||||
.device = 0x7954,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_pericom_setup,
|
||||
},
|
||||
{
|
||||
.vendor = 0x12d8,
|
||||
.device = 0x7958,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_pericom_setup,
|
||||
},
|
||||
|
||||
/*
|
||||
* PLX
|
||||
*/
|
||||
@@ -2255,6 +2493,27 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_brcm_trumanage_setup,
|
||||
},
|
||||
{
|
||||
.vendor = 0x1c29,
|
||||
.device = 0x1104,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_fintek_setup,
|
||||
},
|
||||
{
|
||||
.vendor = 0x1c29,
|
||||
.device = 0x1108,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_fintek_setup,
|
||||
},
|
||||
{
|
||||
.vendor = 0x1c29,
|
||||
.device = 0x1112,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_fintek_setup,
|
||||
},
|
||||
|
||||
/*
|
||||
* Default "match everything" terminator entry
|
||||
@@ -2449,9 +2708,13 @@ enum pci_board_num_t {
|
||||
pbn_ADDIDATA_PCIe_4_3906250,
|
||||
pbn_ADDIDATA_PCIe_8_3906250,
|
||||
pbn_ce4100_1_115200,
|
||||
pbn_byt,
|
||||
pbn_omegapci,
|
||||
pbn_NETMOS9900_2s_115200,
|
||||
pbn_brcm_trumanage,
|
||||
pbn_fintek_4,
|
||||
pbn_fintek_8,
|
||||
pbn_fintek_12,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -3185,6 +3448,13 @@ static struct pciserial_board pci_boards[] = {
|
||||
.base_baud = 921600,
|
||||
.reg_shift = 2,
|
||||
},
|
||||
[pbn_byt] = {
|
||||
.flags = FL_BASE0,
|
||||
.num_ports = 1,
|
||||
.base_baud = 2764800,
|
||||
.uart_offset = 0x80,
|
||||
.reg_shift = 2,
|
||||
},
|
||||
[pbn_omegapci] = {
|
||||
.flags = FL_BASE0,
|
||||
.num_ports = 8,
|
||||
@@ -3202,6 +3472,24 @@ static struct pciserial_board pci_boards[] = {
|
||||
.reg_shift = 2,
|
||||
.base_baud = 115200,
|
||||
},
|
||||
[pbn_fintek_4] = {
|
||||
.num_ports = 4,
|
||||
.uart_offset = 8,
|
||||
.base_baud = 115200,
|
||||
.first_offset = 0x40,
|
||||
},
|
||||
[pbn_fintek_8] = {
|
||||
.num_ports = 8,
|
||||
.uart_offset = 8,
|
||||
.base_baud = 115200,
|
||||
.first_offset = 0x40,
|
||||
},
|
||||
[pbn_fintek_12] = {
|
||||
.num_ports = 12,
|
||||
.uart_offset = 8,
|
||||
.base_baud = 115200,
|
||||
.first_offset = 0x40,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct pci_device_id blacklist[] = {
|
||||
@@ -3362,14 +3650,15 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
|
||||
if (quirk->setup(priv, board, &uart, i))
|
||||
break;
|
||||
|
||||
#ifdef SERIAL_DEBUG_PCI
|
||||
printk(KERN_DEBUG "Setup PCI port: port %lx, irq %d, type %d\n",
|
||||
uart.port.iobase, uart.port.irq, uart.port.iotype);
|
||||
#endif
|
||||
dev_dbg(&dev->dev, "Setup PCI port: port %lx, irq %d, type %d\n",
|
||||
uart.port.iobase, uart.port.irq, uart.port.iotype);
|
||||
|
||||
priv->line[i] = serial8250_register_8250_port(&uart);
|
||||
if (priv->line[i] < 0) {
|
||||
printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), priv->line[i]);
|
||||
dev_err(&dev->dev,
|
||||
"Couldn't register serial port %lx, irq %d, type %d, error %d\n",
|
||||
uart.port.iobase, uart.port.irq,
|
||||
uart.port.iotype, priv->line[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3462,7 +3751,7 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
|
||||
}
|
||||
|
||||
if (ent->driver_data >= ARRAY_SIZE(pci_boards)) {
|
||||
printk(KERN_ERR "pci_init_one: invalid driver_data: %ld\n",
|
||||
dev_err(&dev->dev, "invalid driver_data: %ld\n",
|
||||
ent->driver_data);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -3520,8 +3809,6 @@ static void pciserial_remove_one(struct pci_dev *dev)
|
||||
{
|
||||
struct serial_private *priv = pci_get_drvdata(dev);
|
||||
|
||||
pci_set_drvdata(dev, NULL);
|
||||
|
||||
pciserial_remove_ports(priv);
|
||||
|
||||
pci_disable_device(dev);
|
||||
@@ -3555,7 +3842,7 @@ static int pciserial_resume_one(struct pci_dev *dev)
|
||||
err = pci_enable_device(dev);
|
||||
/* FIXME: We cannot simply error out here */
|
||||
if (err)
|
||||
printk(KERN_ERR "pciserial: Unable to re-enable ports, trying to continue.\n");
|
||||
dev_err(&dev->dev, "Unable to re-enable ports, trying to continue.\n");
|
||||
pciserial_resume_ports(priv);
|
||||
}
|
||||
return 0;
|
||||
@@ -4848,6 +5135,15 @@ static struct pci_device_id serial_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CE4100_UART,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
||||
pbn_ce4100_1_115200 },
|
||||
/* Intel BayTrail */
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT_UART1,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
PCI_CLASS_COMMUNICATION_SERIAL << 8, 0xff0000,
|
||||
pbn_byt },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT_UART2,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
PCI_CLASS_COMMUNICATION_SERIAL << 8, 0xff0000,
|
||||
pbn_byt },
|
||||
|
||||
/*
|
||||
* Cronyx Omega PCI
|
||||
@@ -4918,6 +5214,11 @@ static struct pci_device_id serial_pci_tbl[] = {
|
||||
0,
|
||||
0, pbn_exar_XR17V358 },
|
||||
|
||||
/* Fintek PCI serial cards */
|
||||
{ PCI_DEVICE(0x1c29, 0x1104), .driver_data = pbn_fintek_4 },
|
||||
{ PCI_DEVICE(0x1c29, 0x1108), .driver_data = pbn_fintek_8 },
|
||||
{ PCI_DEVICE(0x1c29, 0x1112), .driver_data = pbn_fintek_12 },
|
||||
|
||||
/*
|
||||
* These entries match devices with class COMMUNICATION_SERIAL,
|
||||
* COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
|
||||
|
||||
@@ -709,7 +709,7 @@ config SERIAL_IP22_ZILOG_CONSOLE
|
||||
|
||||
config SERIAL_SH_SCI
|
||||
tristate "SuperH SCI(F) serial port support"
|
||||
depends on HAVE_CLK && (SUPERH || ARCH_SHMOBILE)
|
||||
depends on HAVE_CLK && (SUPERH || ARM || COMPILE_TEST)
|
||||
select SERIAL_CORE
|
||||
|
||||
config SERIAL_SH_SCI_NR_UARTS
|
||||
@@ -1512,6 +1512,7 @@ config SERIAL_FSL_LPUART_CONSOLE
|
||||
config SERIAL_ST_ASC
|
||||
tristate "ST ASC serial port support"
|
||||
select SERIAL_CORE
|
||||
depends on ARM || COMPILE_TEST
|
||||
help
|
||||
This driver is for the on-chip Asychronous Serial Controller on
|
||||
STMicroelectronics STi SoCs.
|
||||
|
||||
@@ -728,7 +728,6 @@ static int pl010_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
amba_set_drvdata(dev, uap);
|
||||
ret = uart_add_one_port(&amba_reg, &uap->port);
|
||||
if (ret) {
|
||||
amba_set_drvdata(dev, NULL);
|
||||
amba_ports[i] = NULL;
|
||||
clk_put(uap->clk);
|
||||
unmap:
|
||||
@@ -745,8 +744,6 @@ static int pl010_remove(struct amba_device *dev)
|
||||
struct uart_amba_port *uap = amba_get_drvdata(dev);
|
||||
int i;
|
||||
|
||||
amba_set_drvdata(dev, NULL);
|
||||
|
||||
uart_remove_one_port(&amba_reg, &uap->port);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(amba_ports); i++)
|
||||
|
||||
@@ -2147,7 +2147,6 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
amba_set_drvdata(dev, uap);
|
||||
ret = uart_add_one_port(&amba_reg, &uap->port);
|
||||
if (ret) {
|
||||
amba_set_drvdata(dev, NULL);
|
||||
amba_ports[i] = NULL;
|
||||
pl011_dma_remove(uap);
|
||||
}
|
||||
@@ -2160,8 +2159,6 @@ static int pl011_remove(struct amba_device *dev)
|
||||
struct uart_amba_port *uap = amba_get_drvdata(dev);
|
||||
int i;
|
||||
|
||||
amba_set_drvdata(dev, NULL);
|
||||
|
||||
uart_remove_one_port(&amba_reg, &uap->port);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(amba_ports); i++)
|
||||
|
||||
@@ -533,7 +533,7 @@ arc_uart_init_one(struct platform_device *pdev, int dev_id)
|
||||
unsigned long *plat_data;
|
||||
struct arc_uart_port *uart = &arc_uart_ports[dev_id];
|
||||
|
||||
plat_data = (unsigned long *)dev_get_platdata(&pdev->dev);
|
||||
plat_data = dev_get_platdata(&pdev->dev);
|
||||
if (!plat_data)
|
||||
return -ENODEV;
|
||||
|
||||
|
||||
@@ -99,6 +99,7 @@ static void atmel_stop_rx(struct uart_port *port);
|
||||
#define UART_PUT_RTOR(port,v) __raw_writel(v, (port)->membase + ATMEL_US_RTOR)
|
||||
#define UART_PUT_TTGR(port, v) __raw_writel(v, (port)->membase + ATMEL_US_TTGR)
|
||||
#define UART_GET_IP_NAME(port) __raw_readl((port)->membase + ATMEL_US_NAME)
|
||||
#define UART_GET_IP_VERSION(port) __raw_readl((port)->membase + ATMEL_US_VERSION)
|
||||
|
||||
/* PDC registers */
|
||||
#define UART_PUT_PTCR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_PTCR)
|
||||
@@ -1503,6 +1504,7 @@ static void atmel_get_ip_name(struct uart_port *port)
|
||||
{
|
||||
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
|
||||
int name = UART_GET_IP_NAME(port);
|
||||
u32 version;
|
||||
int usart, uart;
|
||||
/* usart and uart ascii */
|
||||
usart = 0x55534152;
|
||||
@@ -1517,7 +1519,22 @@ static void atmel_get_ip_name(struct uart_port *port)
|
||||
dev_dbg(port->dev, "This is uart\n");
|
||||
atmel_port->is_usart = false;
|
||||
} else {
|
||||
dev_err(port->dev, "Not supported ip name, set to uart\n");
|
||||
/* fallback for older SoCs: use version field */
|
||||
version = UART_GET_IP_VERSION(port);
|
||||
switch (version) {
|
||||
case 0x302:
|
||||
case 0x10213:
|
||||
dev_dbg(port->dev, "This version is usart\n");
|
||||
atmel_port->is_usart = true;
|
||||
break;
|
||||
case 0x203:
|
||||
case 0x10202:
|
||||
dev_dbg(port->dev, "This version is uart\n");
|
||||
atmel_port->is_usart = false;
|
||||
break;
|
||||
default:
|
||||
dev_err(port->dev, "Not supported ip name nor version, set to uart\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -766,9 +766,8 @@ static int sport_uart_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = peripheral_request_list(
|
||||
(unsigned short *)dev_get_platdata(&pdev->dev),
|
||||
DRV_NAME);
|
||||
ret = peripheral_request_list(dev_get_platdata(&pdev->dev),
|
||||
DRV_NAME);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"Fail to request SPORT peripherals\n");
|
||||
@@ -844,8 +843,7 @@ static int sport_uart_probe(struct platform_device *pdev)
|
||||
out_error_unmap:
|
||||
iounmap(sport->port.membase);
|
||||
out_error_free_peripherals:
|
||||
peripheral_free_list(
|
||||
(unsigned short *)dev_get_platdata(&pdev->dev));
|
||||
peripheral_free_list(dev_get_platdata(&pdev->dev));
|
||||
out_error_free_mem:
|
||||
kfree(sport);
|
||||
bfin_sport_uart_ports[pdev->id] = NULL;
|
||||
@@ -864,8 +862,7 @@ static int sport_uart_remove(struct platform_device *pdev)
|
||||
if (sport) {
|
||||
uart_remove_one_port(&sport_uart_reg, &sport->port);
|
||||
iounmap(sport->port.membase);
|
||||
peripheral_free_list(
|
||||
(unsigned short *)dev_get_platdata(&pdev->dev));
|
||||
peripheral_free_list(dev_get_platdata(&pdev->dev));
|
||||
kfree(sport);
|
||||
bfin_sport_uart_ports[pdev->id] = NULL;
|
||||
}
|
||||
|
||||
@@ -680,7 +680,7 @@ static int bfin_serial_startup(struct uart_port *port)
|
||||
default:
|
||||
uart_dma_ch_rx = uart_dma_ch_tx = 0;
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
if (uart_dma_ch_rx &&
|
||||
request_dma(uart_dma_ch_rx, "BFIN_UART_RX") < 0) {
|
||||
@@ -726,7 +726,7 @@ static int bfin_serial_startup(struct uart_port *port)
|
||||
#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
|
||||
if (uart->cts_pin >= 0) {
|
||||
if (request_irq(uart->status_irq, bfin_serial_mctrl_cts_int,
|
||||
IRQF_DISABLED, "BFIN_UART_MODEM_STATUS", uart)) {
|
||||
0, "BFIN_UART_MODEM_STATUS", uart)) {
|
||||
uart->cts_pin = -1;
|
||||
dev_info(port->dev, "Unable to attach BlackFin UART Modem Status interrupt.\n");
|
||||
}
|
||||
@@ -765,7 +765,7 @@ static void bfin_serial_shutdown(struct uart_port *port)
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
}
|
||||
#endif
|
||||
free_irq(uart->rx_irq, uart);
|
||||
free_irq(uart->tx_irq, uart);
|
||||
@@ -1240,7 +1240,7 @@ static int bfin_serial_probe(struct platform_device *pdev)
|
||||
*/
|
||||
#endif
|
||||
ret = peripheral_request_list(
|
||||
(unsigned short *)dev_get_platdata(&pdev->dev),
|
||||
dev_get_platdata(&pdev->dev),
|
||||
DRIVER_NAME);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
@@ -1358,8 +1358,7 @@ static int bfin_serial_probe(struct platform_device *pdev)
|
||||
out_error_unmap:
|
||||
iounmap(uart->port.membase);
|
||||
out_error_free_peripherals:
|
||||
peripheral_free_list(
|
||||
(unsigned short *)dev_get_platdata(&pdev->dev));
|
||||
peripheral_free_list(dev_get_platdata(&pdev->dev));
|
||||
out_error_free_mem:
|
||||
kfree(uart);
|
||||
bfin_serial_ports[pdev->id] = NULL;
|
||||
@@ -1377,8 +1376,7 @@ static int bfin_serial_remove(struct platform_device *pdev)
|
||||
if (uart) {
|
||||
uart_remove_one_port(&bfin_serial_reg, &uart->port);
|
||||
iounmap(uart->port.membase);
|
||||
peripheral_free_list(
|
||||
(unsigned short *)dev_get_platdata(&pdev->dev));
|
||||
peripheral_free_list(dev_get_platdata(&pdev->dev));
|
||||
kfree(uart);
|
||||
bfin_serial_ports[pdev->id] = NULL;
|
||||
}
|
||||
@@ -1432,8 +1430,8 @@ static int bfin_earlyprintk_probe(struct platform_device *pdev)
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
ret = peripheral_request_list(
|
||||
(unsigned short *)dev_get_platdata(&pdev->dev), DRIVER_NAME);
|
||||
ret = peripheral_request_list(dev_get_platdata(&pdev->dev),
|
||||
DRIVER_NAME);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"fail to request bfin serial peripherals\n");
|
||||
@@ -1463,8 +1461,7 @@ static int bfin_earlyprintk_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
out_error_free_peripherals:
|
||||
peripheral_free_list(
|
||||
(unsigned short *)dev_get_platdata(&pdev->dev));
|
||||
peripheral_free_list(dev_get_platdata(&pdev->dev));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -459,7 +459,6 @@ static int uart_clps711x_probe(struct platform_device *pdev)
|
||||
ret = uart_register_driver(&s->uart);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Registering UART driver failed\n");
|
||||
devm_clk_put(&pdev->dev, s->uart_clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -487,7 +486,6 @@ static int uart_clps711x_remove(struct platform_device *pdev)
|
||||
for (i = 0; i < UART_CLPS711X_NR; i++)
|
||||
uart_remove_one_port(&s->uart, &s->port[i]);
|
||||
|
||||
devm_clk_put(&pdev->dev, s->uart_clk);
|
||||
uart_unregister_driver(&s->uart);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1008,7 +1008,7 @@ static int ifx_spi_spi_probe(struct spi_device *spi)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pl_data = (struct ifx_modem_platform_data *)dev_get_platdata(&spi->dev);
|
||||
pl_data = dev_get_platdata(&spi->dev);
|
||||
if (!pl_data) {
|
||||
dev_err(&spi->dev, "missing platform data!");
|
||||
return -ENODEV;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user