diff options
Diffstat (limited to 'drivers/tty/serdev/serdev-ttyport.c')
-rw-r--r-- | drivers/tty/serdev/serdev-ttyport.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/tty/serdev/serdev-ttyport.c b/drivers/tty/serdev/serdev-ttyport.c index 487c88f6aa0e..d0a021c93986 100644 --- a/drivers/tty/serdev/serdev-ttyport.c +++ b/drivers/tty/serdev/serdev-ttyport.c | |||
@@ -102,9 +102,6 @@ static int ttyport_open(struct serdev_controller *ctrl) | |||
102 | return PTR_ERR(tty); | 102 | return PTR_ERR(tty); |
103 | serport->tty = tty; | 103 | serport->tty = tty; |
104 | 104 | ||
105 | serport->port->client_ops = &client_ops; | ||
106 | serport->port->client_data = ctrl; | ||
107 | |||
108 | if (tty->ops->open) | 105 | if (tty->ops->open) |
109 | tty->ops->open(serport->tty, NULL); | 106 | tty->ops->open(serport->tty, NULL); |
110 | else | 107 | else |
@@ -215,6 +212,7 @@ struct device *serdev_tty_port_register(struct tty_port *port, | |||
215 | struct device *parent, | 212 | struct device *parent, |
216 | struct tty_driver *drv, int idx) | 213 | struct tty_driver *drv, int idx) |
217 | { | 214 | { |
215 | const struct tty_port_client_operations *old_ops; | ||
218 | struct serdev_controller *ctrl; | 216 | struct serdev_controller *ctrl; |
219 | struct serport *serport; | 217 | struct serport *serport; |
220 | int ret; | 218 | int ret; |
@@ -233,28 +231,37 @@ struct device *serdev_tty_port_register(struct tty_port *port, | |||
233 | 231 | ||
234 | ctrl->ops = &ctrl_ops; | 232 | ctrl->ops = &ctrl_ops; |
235 | 233 | ||
234 | old_ops = port->client_ops; | ||
235 | port->client_ops = &client_ops; | ||
236 | port->client_data = ctrl; | ||
237 | |||
236 | ret = serdev_controller_add(ctrl); | 238 | ret = serdev_controller_add(ctrl); |
237 | if (ret) | 239 | if (ret) |
238 | goto err_controller_put; | 240 | goto err_reset_data; |
239 | 241 | ||
240 | dev_info(&ctrl->dev, "tty port %s%d registered\n", drv->name, idx); | 242 | dev_info(&ctrl->dev, "tty port %s%d registered\n", drv->name, idx); |
241 | return &ctrl->dev; | 243 | return &ctrl->dev; |
242 | 244 | ||
243 | err_controller_put: | 245 | err_reset_data: |
246 | port->client_data = NULL; | ||
247 | port->client_ops = old_ops; | ||
244 | serdev_controller_put(ctrl); | 248 | serdev_controller_put(ctrl); |
249 | |||
245 | return ERR_PTR(ret); | 250 | return ERR_PTR(ret); |
246 | } | 251 | } |
247 | 252 | ||
248 | void serdev_tty_port_unregister(struct tty_port *port) | 253 | int serdev_tty_port_unregister(struct tty_port *port) |
249 | { | 254 | { |
250 | struct serdev_controller *ctrl = port->client_data; | 255 | struct serdev_controller *ctrl = port->client_data; |
251 | struct serport *serport = serdev_controller_get_drvdata(ctrl); | 256 | struct serport *serport = serdev_controller_get_drvdata(ctrl); |
252 | 257 | ||
253 | if (!serport) | 258 | if (!serport) |
254 | return; | 259 | return -ENODEV; |
255 | 260 | ||
256 | serdev_controller_remove(ctrl); | 261 | serdev_controller_remove(ctrl); |
257 | port->client_ops = NULL; | 262 | port->client_ops = NULL; |
258 | port->client_data = NULL; | 263 | port->client_data = NULL; |
259 | serdev_controller_put(ctrl); | 264 | serdev_controller_put(ctrl); |
265 | |||
266 | return 0; | ||
260 | } | 267 | } |