diff options
Diffstat (limited to 'drivers/tty/serdev/serdev-ttyport.c')
-rw-r--r-- | drivers/tty/serdev/serdev-ttyport.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/drivers/tty/serdev/serdev-ttyport.c b/drivers/tty/serdev/serdev-ttyport.c index 302018d67efa..ce7ad0acee7a 100644 --- a/drivers/tty/serdev/serdev-ttyport.c +++ b/drivers/tty/serdev/serdev-ttyport.c @@ -1,14 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2016-2017 Linaro Ltd., Rob Herring <robh@kernel.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include <linux/kernel.h> #include <linux/serdev.h> @@ -96,16 +88,21 @@ static int ttyport_open(struct serdev_controller *ctrl) struct serport *serport = serdev_controller_get_drvdata(ctrl); struct tty_struct *tty; struct ktermios ktermios; + int ret; tty = tty_init_dev(serport->tty_drv, serport->tty_idx); if (IS_ERR(tty)) return PTR_ERR(tty); serport->tty = tty; - if (tty->ops->open) - tty->ops->open(serport->tty, NULL); - else - tty_port_open(serport->port, tty, NULL); + if (!tty->ops->open || !tty->ops->close) { + ret = -ENODEV; + goto err_unlock; + } + + ret = tty->ops->open(serport->tty, NULL); + if (ret) + goto err_close; /* Bring the UART into a known 8 bits no parity hw fc state */ ktermios = tty->termios; @@ -122,6 +119,14 @@ static int ttyport_open(struct serdev_controller *ctrl) tty_unlock(serport->tty); return 0; + +err_close: + tty->ops->close(tty, NULL); +err_unlock: + tty_unlock(tty); + tty_release_struct(tty, serport->tty_idx); + + return ret; } static void ttyport_close(struct serdev_controller *ctrl) |