Răsfoiți Sursa

Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6:
  serial: drivers/serial/pmac_zilog.c: add missing unlock
  serial: 8250_pnp - add Fujitsu Wacom device
  tty: Fix regressions in the char driver conversion
Linus Torvalds 15 ani în urmă
părinte
comite
87156d692a

+ 7 - 2
drivers/char/isicom.c

@@ -879,8 +879,8 @@ static int isicom_open(struct tty_struct *tty, struct file *filp)
 	if (tport == NULL)
 	if (tport == NULL)
 		return -ENODEV;
 		return -ENODEV;
 	port = container_of(tport, struct isi_port, port);
 	port = container_of(tport, struct isi_port, port);
-	card = &isi_card[BOARD(tty->index)];
 
 
+	tty->driver_data = port;
 	return tty_port_open(tport, tty, filp);
 	return tty_port_open(tport, tty, filp);
 }
 }
 
 
@@ -936,7 +936,12 @@ static void isicom_shutdown(struct tty_port *port)
 static void isicom_close(struct tty_struct *tty, struct file *filp)
 static void isicom_close(struct tty_struct *tty, struct file *filp)
 {
 {
 	struct isi_port *ip = tty->driver_data;
 	struct isi_port *ip = tty->driver_data;
-	struct tty_port *port = &ip->port;
+	struct tty_port *port;
+
+	if (ip == NULL)
+		return;
+
+	port = &ip->port;
 	if (isicom_paranoia_check(ip, tty->name, "isicom_close"))
 	if (isicom_paranoia_check(ip, tty->name, "isicom_close"))
 		return;
 		return;
 	tty_port_close(port, tty, filp);
 	tty_port_close(port, tty, filp);

+ 2 - 0
drivers/char/istallion.c

@@ -827,6 +827,8 @@ static int stli_open(struct tty_struct *tty, struct file *filp)
 		return -ENODEV;
 		return -ENODEV;
 	if (portp->devnr < 1)
 	if (portp->devnr < 1)
 		return -ENODEV;
 		return -ENODEV;
+
+	tty->driver_data = portp;
 	return tty_port_open(&portp->port, tty, filp);
 	return tty_port_open(&portp->port, tty, filp);
 }
 }
 
 

+ 2 - 1
drivers/char/mxser.c

@@ -1011,6 +1011,7 @@ static int mxser_open(struct tty_struct *tty, struct file *filp)
 	if (!info->ioaddr)
 	if (!info->ioaddr)
 		return -ENODEV;
 		return -ENODEV;
 
 
+	tty->driver_data = info;
 	return tty_port_open(&info->port, tty, filp);
 	return tty_port_open(&info->port, tty, filp);
 }
 }
 
 
@@ -1074,7 +1075,7 @@ static void mxser_close(struct tty_struct *tty, struct file *filp)
 	struct mxser_port *info = tty->driver_data;
 	struct mxser_port *info = tty->driver_data;
 	struct tty_port *port = &info->port;
 	struct tty_port *port = &info->port;
 
 
-	if (tty->index == MXSER_PORTS)
+	if (tty->index == MXSER_PORTS || info == NULL)
 		return;
 		return;
 	if (tty_port_close_start(port, tty, filp) == 0)
 	if (tty_port_close_start(port, tty, filp) == 0)
 		return;
 		return;

+ 1 - 0
drivers/char/riscom8.c

@@ -909,6 +909,7 @@ static int rc_open(struct tty_struct *tty, struct file *filp)
 	if (error)
 	if (error)
 		return error;
 		return error;
 
 
+	tty->driver_data = port;
 	return tty_port_open(&port->port, tty, filp);
 	return tty_port_open(&port->port, tty, filp);
 }
 }
 
 

+ 4 - 3
drivers/char/stallion.c

@@ -724,7 +724,6 @@ static int stl_open(struct tty_struct *tty, struct file *filp)
 {
 {
 	struct stlport	*portp;
 	struct stlport	*portp;
 	struct stlbrd	*brdp;
 	struct stlbrd	*brdp;
-	struct tty_port *port;
 	unsigned int	minordev, brdnr, panelnr;
 	unsigned int	minordev, brdnr, panelnr;
 	int		portnr;
 	int		portnr;
 
 
@@ -754,7 +753,8 @@ static int stl_open(struct tty_struct *tty, struct file *filp)
 	portp = brdp->panels[panelnr]->ports[portnr];
 	portp = brdp->panels[panelnr]->ports[portnr];
 	if (portp == NULL)
 	if (portp == NULL)
 		return -ENODEV;
 		return -ENODEV;
-	port = &portp->port;
+
+	tty->driver_data = portp;
 	return tty_port_open(&portp->port, tty, filp);
 	return tty_port_open(&portp->port, tty, filp);
 
 
 }
 }
@@ -841,7 +841,8 @@ static void stl_close(struct tty_struct *tty, struct file *filp)
 	pr_debug("stl_close(tty=%p,filp=%p)\n", tty, filp);
 	pr_debug("stl_close(tty=%p,filp=%p)\n", tty, filp);
 
 
 	portp = tty->driver_data;
 	portp = tty->driver_data;
-	BUG_ON(portp == NULL);
+	if(portp == NULL)
+		return;
 	tty_port_close(&portp->port, tty, filp);
 	tty_port_close(&portp->port, tty, filp);
 }
 }
 
 

+ 2 - 0
drivers/serial/8250_pnp.c

@@ -348,6 +348,8 @@ static const struct pnp_device_id pnp_dev_table[] = {
 	{	"FUJ02E6",		0	},
 	{	"FUJ02E6",		0	},
 	/* Fujitsu Wacom 2FGT Tablet PC device */
 	/* Fujitsu Wacom 2FGT Tablet PC device */
 	{	"FUJ02E7",		0	},
 	{	"FUJ02E7",		0	},
+	/* Fujitsu Wacom 1FGT Tablet PC device */
+	{	"FUJ02E9",		0	},
 	/*
 	/*
 	 * LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6 in
 	 * LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6 in
 	 * disguise)
 	 * disguise)

+ 3 - 1
drivers/serial/pmac_zilog.c

@@ -752,8 +752,10 @@ static void pmz_break_ctl(struct uart_port *port, int break_state)
 		uap->curregs[R5] = new_reg;
 		uap->curregs[R5] = new_reg;
 
 
 		/* NOTE: Not subject to 'transmitter active' rule. */
 		/* NOTE: Not subject to 'transmitter active' rule. */
-		if (ZS_IS_ASLEEP(uap))
+		if (ZS_IS_ASLEEP(uap)) {
+			spin_unlock_irqrestore(&port->lock, flags);
 			return;
 			return;
+		}
 		write_zsreg(uap, R5, uap->curregs[R5]);
 		write_zsreg(uap, R5, uap->curregs[R5]);
 	}
 	}