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.6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull TTY changes from Greg Kroah-Hartman: "As we skipped the merge window for 3.6-rc1 for the tty tree, everything is now settled down and working properly, so we are ready for 3.7-rc1. Here's the patchset, it's big, but the large changes are removing a firmware file and adding a staging tty driver (it depended on the tty core changes, so it's going through this tree instead of the staging tree.) All of these patches have been in the linux-next tree for a while. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>" Fix up more-or-less trivial conflicts in - drivers/char/pcmcia/synclink_cs.c: tty NULL dereference fix vs tty_port_cts_enabled() helper function - drivers/staging/{Kconfig,Makefile}: add-add conflict (dgrp driver added close to other staging drivers) - drivers/staging/ipack/devices/ipoctal.c: "split ipoctal_channel from iopctal" vs "TTY: use tty_port_register_device" * tag 'tty-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (235 commits) tty/serial: Add kgdb_nmi driver tty/serial/amba-pl011: Quiesce interrupts in poll_get_char tty/serial/amba-pl011: Implement poll_init callback tty/serial/core: Introduce poll_init callback kdb: Turn KGDB_KDB=n stubs into static inlines kdb: Implement disable_nmi command kernel/debug: Mask KGDB NMI upon entry serial: pl011: handle corruption at high clock speeds serial: sccnxp: Make 'default' choice in switch last serial: sccnxp: Remove mask termios caps for SW flow control serial: sccnxp: Report actual baudrate back to core serial: samsung: Add poll_get_char & poll_put_char Powerpc 8xx CPM_UART setting MAXIDL register proportionaly to baud rate Powerpc 8xx CPM_UART maxidl should not depend on fifo size Powerpc 8xx CPM_UART too many interrupts Powerpc 8xx CPM_UART desynchronisation serial: set correct baud_base for EXSYS EX-41092 Dual 16950 serial: omap: fix the reciever line error case 8250: blacklist Winbond CIR port 8250_pnp: do pnp probe before legacy probe ...
This commit is contained in:
@@ -17,3 +17,12 @@ Description:
|
||||
device, like 'tty1'.
|
||||
The file supports poll() to detect virtual
|
||||
console switches.
|
||||
|
||||
What: /sys/class/tty/ttyS0/uartclk
|
||||
Date: Sep 2012
|
||||
Contact: Tomas Hlavacek <tmshlvck@gmail.com>
|
||||
Description:
|
||||
Shows the current uartclk value associated with the
|
||||
UART port in serial_core, that is bound to TTY like ttyS0.
|
||||
uartclk = 16 * baud_base
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
* NXP LPC32xx SoC High Speed UART
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "nxp,lpc3220-hsuart"
|
||||
- reg: Should contain registers location and length
|
||||
- interrupts: Should contain interrupt
|
||||
|
||||
Example:
|
||||
|
||||
uart1: serial@40014000 {
|
||||
compatible = "nxp,lpc3220-hsuart";
|
||||
reg = <0x40014000 0x1000>;
|
||||
interrupts = <26 0>;
|
||||
};
|
||||
@@ -25,6 +25,8 @@ Optional properties:
|
||||
accesses to the UART (e.g. TI davinci).
|
||||
- used-by-rtas : set to indicate that the port is in use by the OpenFirmware
|
||||
RTAS and should not be registered.
|
||||
- no-loopback-test: set to indicate that the port does not implements loopback
|
||||
test mode
|
||||
|
||||
Example:
|
||||
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
- this file.
|
||||
README.cycladesZ
|
||||
- info on Cyclades-Z firmware loading.
|
||||
computone.txt
|
||||
- info on Computone Intelliport II/Plus Multiport Serial Driver.
|
||||
digiepca.txt
|
||||
- info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards.
|
||||
hayes-esp.txt
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -223,6 +223,7 @@ srmcons_init(void)
|
||||
driver->subtype = SYSTEM_TYPE_SYSCONS;
|
||||
driver->init_termios = tty_std_termios;
|
||||
tty_set_operations(driver, &srmcons_ops);
|
||||
tty_port_link_device(&srmcons_singleton.port, driver, 0);
|
||||
err = tty_register_driver(driver);
|
||||
if (err) {
|
||||
put_tty_driver(driver);
|
||||
|
||||
@@ -81,8 +81,9 @@ static struct omap_uart_port_info omap_serial_default_info[] __initdata = {
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)
|
||||
static void omap_uart_enable_wakeup(struct device *dev, bool enable)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct omap_device *od = to_omap_device(pdev);
|
||||
|
||||
if (!od)
|
||||
@@ -99,15 +100,17 @@ static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)
|
||||
* in Smartidle Mode When Configured for DMA Operations.
|
||||
* WA: configure uart in force idle mode.
|
||||
*/
|
||||
static void omap_uart_set_noidle(struct platform_device *pdev)
|
||||
static void omap_uart_set_noidle(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct omap_device *od = to_omap_device(pdev);
|
||||
|
||||
omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_NO);
|
||||
}
|
||||
|
||||
static void omap_uart_set_smartidle(struct platform_device *pdev)
|
||||
static void omap_uart_set_smartidle(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct omap_device *od = to_omap_device(pdev);
|
||||
u8 idlemode;
|
||||
|
||||
@@ -120,10 +123,10 @@ static void omap_uart_set_smartidle(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
#else
|
||||
static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)
|
||||
static void omap_uart_enable_wakeup(struct device *dev, bool enable)
|
||||
{}
|
||||
static void omap_uart_set_noidle(struct platform_device *pdev) {}
|
||||
static void omap_uart_set_smartidle(struct platform_device *pdev) {}
|
||||
static void omap_uart_set_noidle(struct device *dev) {}
|
||||
static void omap_uart_set_smartidle(struct device *dev) {}
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
@@ -304,6 +307,9 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
|
||||
omap_up.dma_rx_timeout = info->dma_rx_timeout;
|
||||
omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
|
||||
omap_up.autosuspend_timeout = info->autosuspend_timeout;
|
||||
omap_up.DTR_gpio = info->DTR_gpio;
|
||||
omap_up.DTR_inverted = info->DTR_inverted;
|
||||
omap_up.DTR_present = info->DTR_present;
|
||||
|
||||
pdata = &omap_up;
|
||||
pdata_size = sizeof(struct omap_uart_port_info);
|
||||
|
||||
@@ -524,33 +524,12 @@ static struct stedma40_chan_cfg uart2_dma_cfg_tx = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#define PRCC_K_SOFTRST_SET 0x18
|
||||
#define PRCC_K_SOFTRST_CLEAR 0x1C
|
||||
static void ux500_uart0_reset(void)
|
||||
{
|
||||
void __iomem *prcc_rst_set, *prcc_rst_clr;
|
||||
|
||||
prcc_rst_set = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
|
||||
PRCC_K_SOFTRST_SET);
|
||||
prcc_rst_clr = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
|
||||
PRCC_K_SOFTRST_CLEAR);
|
||||
|
||||
/* Activate soft reset PRCC_K_SOFTRST_CLEAR */
|
||||
writel((readl(prcc_rst_clr) | 0x1), prcc_rst_clr);
|
||||
udelay(1);
|
||||
|
||||
/* Release soft reset PRCC_K_SOFTRST_SET */
|
||||
writel((readl(prcc_rst_set) | 0x1), prcc_rst_set);
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
static struct amba_pl011_data uart0_plat = {
|
||||
#ifdef CONFIG_STE_DMA40
|
||||
.dma_filter = stedma40_filter,
|
||||
.dma_rx_param = &uart0_dma_cfg_rx,
|
||||
.dma_tx_param = &uart0_dma_cfg_tx,
|
||||
#endif
|
||||
.reset = ux500_uart0_reset,
|
||||
};
|
||||
|
||||
static struct amba_pl011_data uart1_plat = {
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#define __OMAP_SERIAL_H__
|
||||
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/pm_qos.h>
|
||||
|
||||
#include <plat/mux.h>
|
||||
@@ -42,10 +42,10 @@
|
||||
#define OMAP_UART_WER_MOD_WKUP 0X7F
|
||||
|
||||
/* Enable XON/XOFF flow control on output */
|
||||
#define OMAP_UART_SW_TX 0x04
|
||||
#define OMAP_UART_SW_TX 0x8
|
||||
|
||||
/* Enable XON/XOFF flow control on input */
|
||||
#define OMAP_UART_SW_RX 0x04
|
||||
#define OMAP_UART_SW_RX 0x2
|
||||
|
||||
#define OMAP_UART_SYSC_RESET 0X07
|
||||
#define OMAP_UART_TCR_TRIG 0X0F
|
||||
@@ -69,11 +69,14 @@ struct omap_uart_port_info {
|
||||
unsigned int dma_rx_timeout;
|
||||
unsigned int autosuspend_timeout;
|
||||
unsigned int dma_rx_poll_rate;
|
||||
int DTR_gpio;
|
||||
int DTR_inverted;
|
||||
int DTR_present;
|
||||
|
||||
int (*get_context_loss_count)(struct device *);
|
||||
void (*set_forceidle)(struct platform_device *);
|
||||
void (*set_noidle)(struct platform_device *);
|
||||
void (*enable_wakeup)(struct platform_device *, bool);
|
||||
void (*set_forceidle)(struct device *);
|
||||
void (*set_noidle)(struct device *);
|
||||
void (*enable_wakeup)(struct device *, bool);
|
||||
};
|
||||
|
||||
struct uart_omap_dma {
|
||||
@@ -102,39 +105,4 @@ struct uart_omap_dma {
|
||||
unsigned int rx_timeout;
|
||||
};
|
||||
|
||||
struct uart_omap_port {
|
||||
struct uart_port port;
|
||||
struct uart_omap_dma uart_dma;
|
||||
struct platform_device *pdev;
|
||||
|
||||
unsigned char ier;
|
||||
unsigned char lcr;
|
||||
unsigned char mcr;
|
||||
unsigned char fcr;
|
||||
unsigned char efr;
|
||||
unsigned char dll;
|
||||
unsigned char dlh;
|
||||
unsigned char mdr1;
|
||||
unsigned char scr;
|
||||
|
||||
int use_dma;
|
||||
/*
|
||||
* Some bits in registers are cleared on a read, so they must
|
||||
* be saved whenever the register is read but the bits will not
|
||||
* be immediately processed.
|
||||
*/
|
||||
unsigned int lsr_break_flag;
|
||||
unsigned char msr_saved_flags;
|
||||
char name[20];
|
||||
unsigned long port_activity;
|
||||
u32 context_loss_cnt;
|
||||
u32 errata;
|
||||
u8 wakeups_enabled;
|
||||
|
||||
struct pm_qos_request pm_qos_request;
|
||||
u32 latency;
|
||||
u32 calc_latency;
|
||||
struct work_struct qos_work;
|
||||
};
|
||||
|
||||
#endif /* __OMAP_SERIAL_H__ */
|
||||
|
||||
@@ -338,7 +338,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
|
||||
{
|
||||
/* Handle turning off CRTSCTS */
|
||||
if ((old_termios->c_cflag & CRTSCTS) &&
|
||||
!(tty->termios->c_cflag & CRTSCTS)) {
|
||||
!(tty->termios.c_cflag & CRTSCTS)) {
|
||||
tty->hw_stopped = 0;
|
||||
}
|
||||
}
|
||||
@@ -545,6 +545,7 @@ static int __init simrs_init(void)
|
||||
/* the port is imaginary */
|
||||
printk(KERN_INFO "ttyS0 at 0x03f8 (irq = %d) is a 16550\n", state->irq);
|
||||
|
||||
tty_port_link_device(&state->port, hp_simserial_driver, 0);
|
||||
retval = tty_register_driver(hp_simserial_driver);
|
||||
if (retval) {
|
||||
printk(KERN_ERR "Couldn't register simserial driver\n");
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <asm/natfeat.h>
|
||||
|
||||
static int stderr_id;
|
||||
static struct tty_port nfcon_tty_port;
|
||||
static struct tty_driver *nfcon_tty_driver;
|
||||
|
||||
static void nfputs(const char *str, unsigned int count)
|
||||
@@ -119,6 +120,8 @@ static int __init nfcon_init(void)
|
||||
{
|
||||
int res;
|
||||
|
||||
tty_port_init(&nfcon_tty_port);
|
||||
|
||||
stderr_id = nf_get_id("NF_STDERR");
|
||||
if (!stderr_id)
|
||||
return -ENODEV;
|
||||
@@ -135,6 +138,7 @@ static int __init nfcon_init(void)
|
||||
nfcon_tty_driver->flags = TTY_DRIVER_REAL_RAW;
|
||||
|
||||
tty_set_operations(nfcon_tty_driver, &nfcon_tty_ops);
|
||||
tty_port_link_device(&nfcon_tty_port, nfcon_tty_driver, 0);
|
||||
res = tty_register_driver(nfcon_tty_driver);
|
||||
if (res) {
|
||||
pr_err("failed to register nfcon tty driver\n");
|
||||
|
||||
@@ -47,40 +47,40 @@ static int __devinit octeon_serial_probe(struct platform_device *pdev)
|
||||
{
|
||||
int irq, res;
|
||||
struct resource *res_mem;
|
||||
struct uart_port port;
|
||||
struct uart_8250_port up;
|
||||
|
||||
/* All adaptors have an irq. */
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
memset(&port, 0, sizeof(port));
|
||||
memset(&up, 0, sizeof(up));
|
||||
|
||||
port.flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE;
|
||||
port.type = PORT_OCTEON;
|
||||
port.iotype = UPIO_MEM;
|
||||
port.regshift = 3;
|
||||
port.dev = &pdev->dev;
|
||||
up.port.flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE;
|
||||
up.port.type = PORT_OCTEON;
|
||||
up.port.iotype = UPIO_MEM;
|
||||
up.port.regshift = 3;
|
||||
up.port.dev = &pdev->dev;
|
||||
|
||||
if (octeon_is_simulation())
|
||||
/* Make simulator output fast*/
|
||||
port.uartclk = 115200 * 16;
|
||||
up.port.uartclk = 115200 * 16;
|
||||
else
|
||||
port.uartclk = octeon_get_io_clock_rate();
|
||||
up.port.uartclk = octeon_get_io_clock_rate();
|
||||
|
||||
port.serial_in = octeon_serial_in;
|
||||
port.serial_out = octeon_serial_out;
|
||||
port.irq = irq;
|
||||
up.port.serial_in = octeon_serial_in;
|
||||
up.port.serial_out = octeon_serial_out;
|
||||
up.port.irq = irq;
|
||||
|
||||
res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (res_mem == NULL) {
|
||||
dev_err(&pdev->dev, "found no memory resource\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
port.mapbase = res_mem->start;
|
||||
port.membase = ioremap(res_mem->start, resource_size(res_mem));
|
||||
up.port.mapbase = res_mem->start;
|
||||
up.port.membase = ioremap(res_mem->start, resource_size(res_mem));
|
||||
|
||||
res = serial8250_register_port(&port);
|
||||
res = serial8250_register_8250_port(&up);
|
||||
|
||||
return res >= 0 ? 0 : res;
|
||||
}
|
||||
|
||||
@@ -133,6 +133,38 @@ static struct platform_device sc26xx_pdev = {
|
||||
}
|
||||
};
|
||||
|
||||
#warning "Please try migrate to use new driver SCCNXP and report the status" \
|
||||
"in the linux-serial mailing list."
|
||||
|
||||
/* The code bellow is a replacement of SC26XX to SCCNXP */
|
||||
#if 0
|
||||
#include <linux/platform_data/sccnxp.h>
|
||||
|
||||
static struct sccnxp_pdata sccnxp_data = {
|
||||
.reg_shift = 2,
|
||||
.frequency = 3686400,
|
||||
.mctrl_cfg[0] = MCTRL_SIG(DTR_OP, LINE_OP7) |
|
||||
MCTRL_SIG(RTS_OP, LINE_OP3) |
|
||||
MCTRL_SIG(DSR_IP, LINE_IP5) |
|
||||
MCTRL_SIG(DCD_IP, LINE_IP6),
|
||||
.mctrl_cfg[1] = MCTRL_SIG(DTR_OP, LINE_OP2) |
|
||||
MCTRL_SIG(RTS_OP, LINE_OP1) |
|
||||
MCTRL_SIG(DSR_IP, LINE_IP0) |
|
||||
MCTRL_SIG(CTS_IP, LINE_IP1) |
|
||||
MCTRL_SIG(DCD_IP, LINE_IP2) |
|
||||
MCTRL_SIG(RNG_IP, LINE_IP3),
|
||||
};
|
||||
|
||||
static struct platform_device sc2681_pdev = {
|
||||
.name = "sc2681",
|
||||
.resource = sc2xxx_rsrc,
|
||||
.num_resources = ARRAY_SIZE(sc2xxx_rsrc),
|
||||
.dev = {
|
||||
.platform_data = &sccnxp_data,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
static u32 a20r_ack_hwint(void)
|
||||
{
|
||||
u32 status = read_c0_status();
|
||||
|
||||
@@ -202,6 +202,7 @@ static int __init pdc_console_tty_driver_init(void)
|
||||
pdc_console_tty_driver->flags = TTY_DRIVER_REAL_RAW |
|
||||
TTY_DRIVER_RESET_TERMIOS;
|
||||
tty_set_operations(pdc_console_tty_driver, &pdc_console_tty_ops);
|
||||
tty_port_link_device(&tty_port, pdc_console_tty_driver, 0);
|
||||
|
||||
err = tty_register_driver(pdc_console_tty_driver);
|
||||
if (err) {
|
||||
|
||||
@@ -409,7 +409,8 @@ int setup_one_line(struct line *lines, int n, char *init,
|
||||
line->valid = 1;
|
||||
err = parse_chan_pair(new, line, n, opts, error_out);
|
||||
if (!err) {
|
||||
struct device *d = tty_register_device(driver, n, NULL);
|
||||
struct device *d = tty_port_register_device(&line->port,
|
||||
driver, n, NULL);
|
||||
if (IS_ERR(d)) {
|
||||
*error_out = "Failed to register device";
|
||||
err = PTR_ERR(d);
|
||||
|
||||
@@ -223,6 +223,7 @@ int __init rs_init(void)
|
||||
serial_driver->flags = TTY_DRIVER_REAL_RAW;
|
||||
|
||||
tty_set_operations(serial_driver, &serial_ops);
|
||||
tty_port_link_device(&serial_port, serial_driver, 0);
|
||||
|
||||
if (tty_register_driver(serial_driver))
|
||||
panic("Couldn't register serial driver\n");
|
||||
|
||||
@@ -58,7 +58,7 @@ static int ath_wakeup_ar3k(struct tty_struct *tty)
|
||||
return status;
|
||||
|
||||
/* Disable Automatic RTSCTS */
|
||||
memcpy(&ktermios, tty->termios, sizeof(ktermios));
|
||||
ktermios = tty->termios;
|
||||
ktermios.c_cflag &= ~CRTSCTS;
|
||||
tty_set_termios(tty, &ktermios);
|
||||
|
||||
|
||||
@@ -430,7 +430,7 @@ static ssize_t mwave_write(struct file *file, const char __user *buf,
|
||||
|
||||
static int register_serial_portandirq(unsigned int port, int irq)
|
||||
{
|
||||
struct uart_port uart;
|
||||
struct uart_8250_port uart;
|
||||
|
||||
switch ( port ) {
|
||||
case 0x3f8:
|
||||
@@ -462,14 +462,14 @@ static int register_serial_portandirq(unsigned int port, int irq)
|
||||
} /* switch */
|
||||
/* irq is okay */
|
||||
|
||||
memset(&uart, 0, sizeof(struct uart_port));
|
||||
memset(&uart, 0, sizeof(uart));
|
||||
|
||||
uart.uartclk = 1843200;
|
||||
uart.iobase = port;
|
||||
uart.irq = irq;
|
||||
uart.iotype = UPIO_PORT;
|
||||
uart.flags = UPF_SHARE_IRQ;
|
||||
return serial8250_register_port(&uart);
|
||||
uart.port.uartclk = 1843200;
|
||||
uart.port.iobase = port;
|
||||
uart.port.irq = irq;
|
||||
uart.port.iotype = UPIO_PORT;
|
||||
uart.port.flags = UPF_SHARE_IRQ;
|
||||
return serial8250_register_8250_port(&uart);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1058,7 +1058,7 @@ static void cts_change(MGSLPC_INFO *info, struct tty_struct *tty)
|
||||
wake_up_interruptible(&info->status_event_wait_q);
|
||||
wake_up_interruptible(&info->event_wait_q);
|
||||
|
||||
if (tty && (info->port.flags & ASYNC_CTS_FLOW)) {
|
||||
if (tty && tty_port_cts_enabled(&info->port)) {
|
||||
if (tty->hw_stopped) {
|
||||
if (info->serial_signals & SerialSignal_CTS) {
|
||||
if (debug_level >= DEBUG_LEVEL_ISR)
|
||||
@@ -1350,7 +1350,7 @@ static void shutdown(MGSLPC_INFO * info, struct tty_struct *tty)
|
||||
/* TODO:disable interrupts instead of reset to preserve signal states */
|
||||
reset_device(info);
|
||||
|
||||
if (!tty || tty->termios->c_cflag & HUPCL) {
|
||||
if (!tty || tty->termios.c_cflag & HUPCL) {
|
||||
info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
|
||||
set_signals(info);
|
||||
}
|
||||
@@ -1391,7 +1391,7 @@ static void mgslpc_program_hw(MGSLPC_INFO *info, struct tty_struct *tty)
|
||||
port_irq_enable(info, (unsigned char) PVR_DSR | PVR_RI);
|
||||
get_signals(info);
|
||||
|
||||
if (info->netcount || (tty && (tty->termios->c_cflag & CREAD)))
|
||||
if (info->netcount || (tty && (tty->termios.c_cflag & CREAD)))
|
||||
rx_start(info);
|
||||
|
||||
spin_unlock_irqrestore(&info->lock,flags);
|
||||
@@ -1404,14 +1404,14 @@ static void mgslpc_change_params(MGSLPC_INFO *info, struct tty_struct *tty)
|
||||
unsigned cflag;
|
||||
int bits_per_char;
|
||||
|
||||
if (!tty || !tty->termios)
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
if (debug_level >= DEBUG_LEVEL_INFO)
|
||||
printk("%s(%d):mgslpc_change_params(%s)\n",
|
||||
__FILE__,__LINE__, info->device_name );
|
||||
|
||||
cflag = tty->termios->c_cflag;
|
||||
cflag = tty->termios.c_cflag;
|
||||
|
||||
/* if B0 rate (hangup) specified then negate DTR and RTS */
|
||||
/* otherwise assert DTR and RTS */
|
||||
@@ -1734,7 +1734,7 @@ static void mgslpc_throttle(struct tty_struct * tty)
|
||||
if (I_IXOFF(tty))
|
||||
mgslpc_send_xchar(tty, STOP_CHAR(tty));
|
||||
|
||||
if (tty->termios->c_cflag & CRTSCTS) {
|
||||
if (tty->termios.c_cflag & CRTSCTS) {
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
info->serial_signals &= ~SerialSignal_RTS;
|
||||
set_signals(info);
|
||||
@@ -1763,7 +1763,7 @@ static void mgslpc_unthrottle(struct tty_struct * tty)
|
||||
mgslpc_send_xchar(tty, START_CHAR(tty));
|
||||
}
|
||||
|
||||
if (tty->termios->c_cflag & CRTSCTS) {
|
||||
if (tty->termios.c_cflag & CRTSCTS) {
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
info->serial_signals |= SerialSignal_RTS;
|
||||
set_signals(info);
|
||||
@@ -2299,8 +2299,8 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
|
||||
tty->driver->name );
|
||||
|
||||
/* just return if nothing has changed */
|
||||
if ((tty->termios->c_cflag == old_termios->c_cflag)
|
||||
&& (RELEVANT_IFLAG(tty->termios->c_iflag)
|
||||
if ((tty->termios.c_cflag == old_termios->c_cflag)
|
||||
&& (RELEVANT_IFLAG(tty->termios.c_iflag)
|
||||
== RELEVANT_IFLAG(old_termios->c_iflag)))
|
||||
return;
|
||||
|
||||
@@ -2308,7 +2308,7 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
|
||||
|
||||
/* Handle transition to B0 status */
|
||||
if (old_termios->c_cflag & CBAUD &&
|
||||
!(tty->termios->c_cflag & CBAUD)) {
|
||||
!(tty->termios.c_cflag & CBAUD)) {
|
||||
info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
set_signals(info);
|
||||
@@ -2317,9 +2317,9 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
|
||||
|
||||
/* Handle transition away from B0 status */
|
||||
if (!(old_termios->c_cflag & CBAUD) &&
|
||||
tty->termios->c_cflag & CBAUD) {
|
||||
tty->termios.c_cflag & CBAUD) {
|
||||
info->serial_signals |= SerialSignal_DTR;
|
||||
if (!(tty->termios->c_cflag & CRTSCTS) ||
|
||||
if (!(tty->termios.c_cflag & CRTSCTS) ||
|
||||
!test_bit(TTY_THROTTLED, &tty->flags)) {
|
||||
info->serial_signals |= SerialSignal_RTS;
|
||||
}
|
||||
@@ -2330,7 +2330,7 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
|
||||
|
||||
/* Handle turning off CRTSCTS */
|
||||
if (old_termios->c_cflag & CRTSCTS &&
|
||||
!(tty->termios->c_cflag & CRTSCTS)) {
|
||||
!(tty->termios.c_cflag & CRTSCTS)) {
|
||||
tty->hw_stopped = 0;
|
||||
tx_release(tty);
|
||||
}
|
||||
@@ -2737,6 +2737,8 @@ static void mgslpc_add_device(MGSLPC_INFO *info)
|
||||
#if SYNCLINK_GENERIC_HDLC
|
||||
hdlcdev_init(info);
|
||||
#endif
|
||||
tty_port_register_device(&info->port, serial_driver, info->line,
|
||||
&info->p_dev->dev);
|
||||
}
|
||||
|
||||
static void mgslpc_remove_device(MGSLPC_INFO *remove_info)
|
||||
@@ -2750,6 +2752,7 @@ static void mgslpc_remove_device(MGSLPC_INFO *remove_info)
|
||||
last->next_device = info->next_device;
|
||||
else
|
||||
mgslpc_device_list = info->next_device;
|
||||
tty_unregister_device(serial_driver, info->line);
|
||||
#if SYNCLINK_GENERIC_HDLC
|
||||
hdlcdev_exit(info);
|
||||
#endif
|
||||
@@ -2804,77 +2807,63 @@ static const struct tty_operations mgslpc_ops = {
|
||||
.proc_fops = &mgslpc_proc_fops,
|
||||
};
|
||||
|
||||
static void synclink_cs_cleanup(void)
|
||||
static int __init synclink_cs_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
while(mgslpc_device_list)
|
||||
mgslpc_remove_device(mgslpc_device_list);
|
||||
|
||||
if (serial_driver) {
|
||||
if ((rc = tty_unregister_driver(serial_driver)))
|
||||
printk("%s(%d) failed to unregister tty driver err=%d\n",
|
||||
__FILE__,__LINE__,rc);
|
||||
put_tty_driver(serial_driver);
|
||||
if (break_on_load) {
|
||||
mgslpc_get_text_ptr();
|
||||
BREAKPOINT();
|
||||
}
|
||||
|
||||
pcmcia_unregister_driver(&mgslpc_driver);
|
||||
}
|
||||
serial_driver = tty_alloc_driver(MAX_DEVICE_COUNT,
|
||||
TTY_DRIVER_REAL_RAW |
|
||||
TTY_DRIVER_DYNAMIC_DEV);
|
||||
if (IS_ERR(serial_driver)) {
|
||||
rc = PTR_ERR(serial_driver);
|
||||
goto err;
|
||||
}
|
||||
|
||||
static int __init synclink_cs_init(void)
|
||||
{
|
||||
int rc;
|
||||
/* Initialize the tty_driver structure */
|
||||
serial_driver->driver_name = "synclink_cs";
|
||||
serial_driver->name = "ttySLP";
|
||||
serial_driver->major = ttymajor;
|
||||
serial_driver->minor_start = 64;
|
||||
serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
|
||||
serial_driver->subtype = SERIAL_TYPE_NORMAL;
|
||||
serial_driver->init_termios = tty_std_termios;
|
||||
serial_driver->init_termios.c_cflag =
|
||||
B9600 | CS8 | CREAD | HUPCL | CLOCAL;
|
||||
tty_set_operations(serial_driver, &mgslpc_ops);
|
||||
|
||||
if (break_on_load) {
|
||||
mgslpc_get_text_ptr();
|
||||
BREAKPOINT();
|
||||
}
|
||||
rc = tty_register_driver(serial_driver);
|
||||
if (rc < 0) {
|
||||
printk(KERN_ERR "%s(%d):Couldn't register serial driver\n",
|
||||
__FILE__, __LINE__);
|
||||
goto err_put_tty;
|
||||
}
|
||||
|
||||
if ((rc = pcmcia_register_driver(&mgslpc_driver)) < 0)
|
||||
return rc;
|
||||
rc = pcmcia_register_driver(&mgslpc_driver);
|
||||
if (rc < 0)
|
||||
goto err_unreg_tty;
|
||||
|
||||
serial_driver = alloc_tty_driver(MAX_DEVICE_COUNT);
|
||||
if (!serial_driver) {
|
||||
rc = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
printk(KERN_INFO "%s %s, tty major#%d\n", driver_name, driver_version,
|
||||
serial_driver->major);
|
||||
|
||||
/* Initialize the tty_driver structure */
|
||||
|
||||
serial_driver->driver_name = "synclink_cs";
|
||||
serial_driver->name = "ttySLP";
|
||||
serial_driver->major = ttymajor;
|
||||
serial_driver->minor_start = 64;
|
||||
serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
|
||||
serial_driver->subtype = SERIAL_TYPE_NORMAL;
|
||||
serial_driver->init_termios = tty_std_termios;
|
||||
serial_driver->init_termios.c_cflag =
|
||||
B9600 | CS8 | CREAD | HUPCL | CLOCAL;
|
||||
serial_driver->flags = TTY_DRIVER_REAL_RAW;
|
||||
tty_set_operations(serial_driver, &mgslpc_ops);
|
||||
|
||||
if ((rc = tty_register_driver(serial_driver)) < 0) {
|
||||
printk("%s(%d):Couldn't register serial driver\n",
|
||||
__FILE__,__LINE__);
|
||||
put_tty_driver(serial_driver);
|
||||
serial_driver = NULL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
printk("%s %s, tty major#%d\n",
|
||||
driver_name, driver_version,
|
||||
serial_driver->major);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
synclink_cs_cleanup();
|
||||
return rc;
|
||||
return 0;
|
||||
err_unreg_tty:
|
||||
tty_unregister_driver(serial_driver);
|
||||
err_put_tty:
|
||||
put_tty_driver(serial_driver);
|
||||
err:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void __exit synclink_cs_exit(void)
|
||||
{
|
||||
synclink_cs_cleanup();
|
||||
pcmcia_unregister_driver(&mgslpc_driver);
|
||||
tty_unregister_driver(serial_driver);
|
||||
put_tty_driver(serial_driver);
|
||||
}
|
||||
|
||||
module_init(synclink_cs_init);
|
||||
|
||||
+13
-20
@@ -67,7 +67,7 @@ static int tpk_printk(const unsigned char *buf, int count)
|
||||
tmp[tpk_curr + 1] = '\0';
|
||||
printk(KERN_INFO "%s%s", tpk_tag, tmp);
|
||||
tpk_curr = 0;
|
||||
if (buf[i + 1] == '\n')
|
||||
if ((i + 1) < count && buf[i + 1] == '\n')
|
||||
i++;
|
||||
break;
|
||||
case '\n':
|
||||
@@ -178,11 +178,17 @@ static struct tty_driver *ttyprintk_driver;
|
||||
static int __init ttyprintk_init(void)
|
||||
{
|
||||
int ret = -ENOMEM;
|
||||
void *rp;
|
||||
|
||||
ttyprintk_driver = alloc_tty_driver(1);
|
||||
if (!ttyprintk_driver)
|
||||
return ret;
|
||||
tty_port_init(&tpk_port.port);
|
||||
tpk_port.port.ops = &null_ops;
|
||||
mutex_init(&tpk_port.port_write_mutex);
|
||||
|
||||
ttyprintk_driver = tty_alloc_driver(1,
|
||||
TTY_DRIVER_RESET_TERMIOS |
|
||||
TTY_DRIVER_REAL_RAW |
|
||||
TTY_DRIVER_UNNUMBERED_NODE);
|
||||
if (IS_ERR(ttyprintk_driver))
|
||||
return PTR_ERR(ttyprintk_driver);
|
||||
|
||||
ttyprintk_driver->driver_name = "ttyprintk";
|
||||
ttyprintk_driver->name = "ttyprintk";
|
||||
@@ -191,9 +197,8 @@ static int __init ttyprintk_init(void)
|
||||
ttyprintk_driver->type = TTY_DRIVER_TYPE_CONSOLE;
|
||||
ttyprintk_driver->init_termios = tty_std_termios;
|
||||
ttyprintk_driver->init_termios.c_oflag = OPOST | OCRNL | ONOCR | ONLRET;
|
||||
ttyprintk_driver->flags = TTY_DRIVER_RESET_TERMIOS |
|
||||
TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
|
||||
tty_set_operations(ttyprintk_driver, &ttyprintk_ops);
|
||||
tty_port_link_device(&tpk_port.port, ttyprintk_driver, 0);
|
||||
|
||||
ret = tty_register_driver(ttyprintk_driver);
|
||||
if (ret < 0) {
|
||||
@@ -201,22 +206,10 @@ static int __init ttyprintk_init(void)
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* create our unnumbered device */
|
||||
rp = device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 3), NULL,
|
||||
ttyprintk_driver->name);
|
||||
if (IS_ERR(rp)) {
|
||||
printk(KERN_ERR "Couldn't create ttyprintk device\n");
|
||||
ret = PTR_ERR(rp);
|
||||
goto error;
|
||||
}
|
||||
|
||||
tty_port_init(&tpk_port.port);
|
||||
tpk_port.port.ops = &null_ops;
|
||||
mutex_init(&tpk_port.port_write_mutex);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
tty_unregister_driver(ttyprintk_driver);
|
||||
put_tty_driver(ttyprintk_driver);
|
||||
ttyprintk_driver = NULL;
|
||||
return ret;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user