diff options
author | Johan Hovold <johan@kernel.org> | 2015-02-17 23:04:46 -0500 |
---|---|---|
committer | Johan Hovold <johan@kernel.org> | 2015-02-26 11:13:05 -0500 |
commit | d6f7f41274b548435ab5de1041a492fc4a714196 (patch) | |
tree | 5a64c8960be3e56e111e9f2499e413fefb41a4ca /drivers/usb/serial | |
parent | 2deb96b5d4bb20a33bfaf80e30f38f3433653054 (diff) |
USB: serial: clean up bus probe error handling
Clean up bus probe error handling by separating success and error paths.
Signed-off-by: Johan Hovold <johan@kernel.org>
Diffstat (limited to 'drivers/usb/serial')
-rw-r--r-- | drivers/usb/serial/bus.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c index b53a28692226..8936a83c96cd 100644 --- a/drivers/usb/serial/bus.c +++ b/drivers/usb/serial/bus.c | |||
@@ -47,39 +47,42 @@ static int usb_serial_device_probe(struct device *dev) | |||
47 | int minor; | 47 | int minor; |
48 | 48 | ||
49 | port = to_usb_serial_port(dev); | 49 | port = to_usb_serial_port(dev); |
50 | if (!port) { | 50 | if (!port) |
51 | retval = -ENODEV; | 51 | return -ENODEV; |
52 | goto exit; | ||
53 | } | ||
54 | 52 | ||
55 | /* make sure suspend/resume doesn't race against port_probe */ | 53 | /* make sure suspend/resume doesn't race against port_probe */ |
56 | retval = usb_autopm_get_interface(port->serial->interface); | 54 | retval = usb_autopm_get_interface(port->serial->interface); |
57 | if (retval) | 55 | if (retval) |
58 | goto exit; | 56 | return retval; |
59 | 57 | ||
60 | driver = port->serial->type; | 58 | driver = port->serial->type; |
61 | if (driver->port_probe) { | 59 | if (driver->port_probe) { |
62 | retval = driver->port_probe(port); | 60 | retval = driver->port_probe(port); |
63 | if (retval) | 61 | if (retval) |
64 | goto exit_with_autopm; | 62 | goto err_autopm_put; |
65 | } | 63 | } |
66 | 64 | ||
67 | minor = port->minor; | 65 | minor = port->minor; |
68 | tty_dev = tty_register_device(usb_serial_tty_driver, minor, dev); | 66 | tty_dev = tty_register_device(usb_serial_tty_driver, minor, dev); |
69 | if (IS_ERR(tty_dev)) { | 67 | if (IS_ERR(tty_dev)) { |
70 | retval = PTR_ERR(tty_dev); | 68 | retval = PTR_ERR(tty_dev); |
71 | if (driver->port_remove) | 69 | goto err_port_remove; |
72 | driver->port_remove(port); | ||
73 | goto exit_with_autopm; | ||
74 | } | 70 | } |
75 | 71 | ||
72 | usb_autopm_put_interface(port->serial->interface); | ||
73 | |||
76 | dev_info(&port->serial->dev->dev, | 74 | dev_info(&port->serial->dev->dev, |
77 | "%s converter now attached to ttyUSB%d\n", | 75 | "%s converter now attached to ttyUSB%d\n", |
78 | driver->description, minor); | 76 | driver->description, minor); |
79 | 77 | ||
80 | exit_with_autopm: | 78 | return 0; |
79 | |||
80 | err_port_remove: | ||
81 | if (driver->port_remove) | ||
82 | driver->port_remove(port); | ||
83 | err_autopm_put: | ||
81 | usb_autopm_put_interface(port->serial->interface); | 84 | usb_autopm_put_interface(port->serial->interface); |
82 | exit: | 85 | |
83 | return retval; | 86 | return retval; |
84 | } | 87 | } |
85 | 88 | ||