Lines Matching +full:in +full:- +full:line

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{linux.intel,addtoit}.com)
27 return -ENODEV; in not_configged_open()
40 return -EIO; in not_configged_read()
47 return -EIO; in not_configged_write()
54 return -EIO; in not_configged_console_write()
62 return -ENODEV; in not_configged_window_size()
88 if (chan->opened) in open_one_chan()
91 if (chan->ops->open == NULL) in open_one_chan()
93 else fd = (*chan->ops->open)(chan->input, chan->output, chan->primary, in open_one_chan()
94 chan->data, &chan->dev); in open_one_chan()
100 (*chan->ops->close)(fd, chan->data); in open_one_chan()
104 chan->fd = fd; in open_one_chan()
106 chan->opened = 1; in open_one_chan()
119 if (chan->primary) in open_chan()
127 if (chan && chan->primary && chan->ops->winch) in chan_enable_winch()
128 register_winch(chan->fd, port); in chan_enable_winch()
133 struct line *line = container_of(work, struct line, task.work); in line_timer_cb() local
135 if (!line->throttled) in line_timer_cb()
136 chan_interrupt(line, line->read_irq); in line_timer_cb()
139 int enable_chan(struct line *line) in enable_chan() argument
145 INIT_DELAYED_WORK(&line->task, line_timer_cb); in enable_chan()
147 list_for_each(ele, &line->chan_list) { in enable_chan()
151 if (chan->primary) in enable_chan()
157 if (chan->enabled) in enable_chan()
159 err = line_setup_irq(chan->fd, chan->input, chan->output, line, in enable_chan()
164 chan->enabled = 1; in enable_chan()
170 close_chan(line); in enable_chan()
174 /* Items are added in IRQ context, when free_irq can't be called, and
175 * removed in process context, when it can.
177 * be permanently disabled. This is discovered in IRQ context, but
197 if (chan->input && chan->enabled) in free_irqs()
198 um_free_irq(chan->line->read_irq, chan); in free_irqs()
199 if (chan->output && chan->enabled) in free_irqs()
200 um_free_irq(chan->line->write_irq, chan); in free_irqs()
201 chan->enabled = 0; in free_irqs()
209 if (!chan->opened) in close_one_chan()
214 list_add(&chan->free_list, &irqs_to_free); in close_one_chan()
217 if (chan->input && chan->enabled) in close_one_chan()
218 um_free_irq(chan->line->read_irq, chan); in close_one_chan()
219 if (chan->output && chan->enabled) in close_one_chan()
220 um_free_irq(chan->line->write_irq, chan); in close_one_chan()
221 chan->enabled = 0; in close_one_chan()
223 if (chan->ops->close != NULL) in close_one_chan()
224 (*chan->ops->close)(chan->fd, chan->data); in close_one_chan()
226 chan->opened = 0; in close_one_chan()
227 chan->fd = -1; in close_one_chan()
230 void close_chan(struct line *line) in close_chan() argument
234 /* Close in reverse order as open in case more than one of them in close_chan()
239 list_for_each_entry_reverse(chan, &line->chan_list, list) { in close_chan()
246 if (chan && chan->enabled) in deactivate_chan()
247 deactivate_fd(chan->fd, irq); in deactivate_chan()
254 if (len == 0 || !chan || !chan->ops->write) in write_chan()
257 n = chan->ops->write(chan->fd, buf, len, chan->data); in write_chan()
258 if (chan->primary) { in write_chan()
268 if (!chan || !chan->ops->console_write) in console_write_chan()
271 n = chan->ops->console_write(chan->fd, buf, len); in console_write_chan()
272 if (chan->primary) in console_write_chan()
277 int console_open_chan(struct line *line, struct console *co) in console_open_chan() argument
281 err = open_chan(&line->chan_list); in console_open_chan()
285 printk(KERN_INFO "Console initialized on /dev/%s%d\n", co->name, in console_open_chan()
286 co->index); in console_open_chan()
290 int chan_window_size(struct line *line, unsigned short *rows_out, in chan_window_size() argument
295 chan = line->chan_in; in chan_window_size()
296 if (chan && chan->primary) { in chan_window_size()
297 if (chan->ops->window_size == NULL) in chan_window_size()
299 return chan->ops->window_size(chan->fd, chan->data, in chan_window_size()
302 chan = line->chan_out; in chan_window_size()
303 if (chan && chan->primary) { in chan_window_size()
304 if (chan->ops->window_size == NULL) in chan_window_size()
306 return chan->ops->window_size(chan->fd, chan->data, in chan_window_size()
314 list_del(&chan->list); in free_one_chan()
318 if (chan->ops->free != NULL) in free_one_chan()
319 (*chan->ops->free)(chan->data); in free_one_chan()
321 if (chan->primary && chan->output) in free_one_chan()
322 ignore_sigio_fd(chan->fd); in free_one_chan()
347 CONFIG_CHUNK(str, size, n, chan->ops->type, 0); in one_chan_config_string()
349 if (chan->dev == NULL) { in one_chan_config_string()
355 CONFIG_CHUNK(str, size, n, chan->dev, 0); in one_chan_config_string()
360 static int chan_pair_config_string(struct chan *in, struct chan *out, in chan_pair_config_string() argument
365 n = one_chan_config_string(in, str, size, error_out); in chan_pair_config_string()
367 size -= n; in chan_pair_config_string()
369 if (in == out) { in chan_pair_config_string()
377 size -= n; in chan_pair_config_string()
383 int chan_config_string(struct line *line, char *str, int size, in chan_config_string() argument
386 struct chan *in = line->chan_in, *out = line->chan_out; in chan_config_string() local
388 if (in && !in->primary) in chan_config_string()
389 in = NULL; in chan_config_string()
390 if (out && !out->primary) in chan_config_string()
393 return chan_pair_config_string(in, out, str, size, error_out); in chan_config_string()
437 static struct chan *parse_chan(struct line *line, char *str, int device, in parse_chan() argument
450 if (!strncmp(str, entry->key, strlen(entry->key))) { in parse_chan()
451 ops = entry->ops; in parse_chan()
452 str += strlen(entry->key); in parse_chan()
461 data = (*ops->init)(str, device, opts); in parse_chan()
472 *chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list), in parse_chan()
474 LIST_HEAD_INIT(chan->free_list), in parse_chan()
475 .line = line, in parse_chan()
481 .fd = -1, in parse_chan()
487 int parse_chan_pair(char *str, struct line *line, int device, in parse_chan_pair() argument
490 struct list_head *chans = &line->chan_list; in parse_chan_pair()
492 char *in, *out; in parse_chan_pair() local
495 line->chan_in = line->chan_out = NULL; in parse_chan_pair()
505 in = str; in parse_chan_pair()
508 new = parse_chan(line, in, device, opts, error_out); in parse_chan_pair()
510 return -1; in parse_chan_pair()
512 new->input = 1; in parse_chan_pair()
513 list_add(&new->list, chans); in parse_chan_pair()
514 line->chan_in = new; in parse_chan_pair()
516 new = parse_chan(line, out, device, opts, error_out); in parse_chan_pair()
518 return -1; in parse_chan_pair()
520 list_add(&new->list, chans); in parse_chan_pair()
521 new->output = 1; in parse_chan_pair()
522 line->chan_out = new; in parse_chan_pair()
525 new = parse_chan(line, str, device, opts, error_out); in parse_chan_pair()
527 return -1; in parse_chan_pair()
529 list_add(&new->list, chans); in parse_chan_pair()
530 new->input = 1; in parse_chan_pair()
531 new->output = 1; in parse_chan_pair()
532 line->chan_in = line->chan_out = new; in parse_chan_pair()
537 void chan_interrupt(struct line *line, int irq) in chan_interrupt() argument
539 struct tty_port *port = &line->port; in chan_interrupt()
540 struct chan *chan = line->chan_in; in chan_interrupt()
544 if (!chan || !chan->ops->read) in chan_interrupt()
549 schedule_delayed_work(&line->task, 1); in chan_interrupt()
552 err = chan->ops->read(chan->fd, &c, chan->data); in chan_interrupt()
557 if (err == -EIO) { in chan_interrupt()
558 if (chan->primary) { in chan_interrupt()
559 tty_port_tty_hangup(&line->port, false); in chan_interrupt()
560 if (line->chan_out != chan) in chan_interrupt()
561 close_one_chan(line->chan_out, 1); in chan_interrupt()
564 if (chan->primary) in chan_interrupt()