diff options
Diffstat (limited to 'drivers/usb/serial/kl5kusb105.c')
| -rw-r--r-- | drivers/usb/serial/kl5kusb105.c | 68 | 
1 files changed, 24 insertions, 44 deletions
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index 3f6d7376c02..1f4517864cd 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c @@ -60,8 +60,8 @@  /*   * Function prototypes   */ -static int  klsi_105_startup(struct usb_serial *serial); -static void klsi_105_release(struct usb_serial *serial); +static int klsi_105_port_probe(struct usb_serial_port *port); +static int klsi_105_port_remove(struct usb_serial_port *port);  static int  klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port);  static void klsi_105_close(struct usb_serial_port *port);  static void klsi_105_set_termios(struct tty_struct *tty, @@ -99,8 +99,8 @@ static struct usb_serial_driver kl5kusb105d_device = {  	/*.break_ctl =		klsi_105_break_ctl,*/  	.tiocmget =		klsi_105_tiocmget,  	.tiocmset =		klsi_105_tiocmset, -	.attach =		klsi_105_startup, -	.release =		klsi_105_release, +	.port_probe =		klsi_105_port_probe, +	.port_remove =		klsi_105_port_remove,  	.throttle =		usb_serial_generic_throttle,  	.unthrottle =		usb_serial_generic_unthrottle,  	.process_read_urb =	klsi_105_process_read_urb, @@ -223,60 +223,40 @@ static int klsi_105_get_line_state(struct usb_serial_port *port,   * Driver's tty interface functions   */ -static int klsi_105_startup(struct usb_serial *serial) +static int klsi_105_port_probe(struct usb_serial_port *port)  {  	struct klsi_105_private *priv; -	int i; -	/* check if we support the product id (see keyspan.c) -	 * FIXME -	 */ +	priv = kmalloc(sizeof(*priv), GFP_KERNEL); +	if (!priv) +		return -ENOMEM; -	/* allocate the private data structure */ -	for (i = 0; i < serial->num_ports; i++) { -		priv = kmalloc(sizeof(struct klsi_105_private), -						   GFP_KERNEL); -		if (!priv) { -			dev_dbg(&serial->interface->dev, -				"%s - kmalloc for klsi_105_private failed.\n", -				__func__); -			i--; -			goto err_cleanup; -		} -		/* set initial values for control structures */ -		priv->cfg.pktlen    = 5; -		priv->cfg.baudrate  = kl5kusb105a_sio_b9600; -		priv->cfg.databits  = kl5kusb105a_dtb_8; -		priv->cfg.unknown1  = 0; -		priv->cfg.unknown2  = 1; +	/* set initial values for control structures */ +	priv->cfg.pktlen    = 5; +	priv->cfg.baudrate  = kl5kusb105a_sio_b9600; +	priv->cfg.databits  = kl5kusb105a_dtb_8; +	priv->cfg.unknown1  = 0; +	priv->cfg.unknown2  = 1; -		priv->line_state    = 0; +	priv->line_state    = 0; -		usb_set_serial_port_data(serial->port[i], priv); +	spin_lock_init(&priv->lock); -		spin_lock_init(&priv->lock); +	/* priv->termios is left uninitialized until port opening */ -		/* priv->termios is left uninitialized until port opening */ -		init_waitqueue_head(&serial->port[i]->write_wait); -	} +	usb_set_serial_port_data(port, priv);  	return 0; - -err_cleanup: -	for (; i >= 0; i--) { -		priv = usb_get_serial_port_data(serial->port[i]); -		kfree(priv); -		usb_set_serial_port_data(serial->port[i], NULL); -	} -	return -ENOMEM;  } -static void klsi_105_release(struct usb_serial *serial) +static int klsi_105_port_remove(struct usb_serial_port *port)  { -	int i; +	struct klsi_105_private *priv; + +	priv = usb_get_serial_port_data(port); +	kfree(priv); -	for (i = 0; i < serial->num_ports; ++i) -		kfree(usb_get_serial_port_data(serial->port[i])); +	return 0;  }  static int  klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port)  |