Lines Matching refs:chan
84 static int open_one_chan(struct chan *chan) in open_one_chan() argument
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()
113 struct chan *chan; in open_chan() local
117 chan = list_entry(ele, struct chan, list); in open_chan()
118 ret = open_one_chan(chan); in open_chan()
119 if (chan->primary) in open_chan()
125 void chan_enable_winch(struct chan *chan, struct tty_port *port) in chan_enable_winch() argument
127 if (chan && chan->primary && chan->ops->winch) in chan_enable_winch()
128 register_winch(chan->fd, port); in chan_enable_winch()
142 struct chan *chan; in enable_chan() local
148 chan = list_entry(ele, struct chan, list); in enable_chan()
149 err = open_one_chan(chan); 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()
160 chan); in enable_chan()
164 chan->enabled = 1; in enable_chan()
185 struct chan *chan; in free_irqs() local
195 chan = list_entry(ele, struct chan, free_list); in free_irqs()
197 if (chan->input && chan->enabled) in free_irqs()
198 um_free_irq(chan->line->driver->read_irq, chan); in free_irqs()
199 if (chan->output && chan->enabled) in free_irqs()
200 um_free_irq(chan->line->driver->write_irq, chan); in free_irqs()
201 chan->enabled = 0; in free_irqs()
205 static void close_one_chan(struct chan *chan, int delay_free_irq) in close_one_chan() argument
209 if (!chan->opened) in close_one_chan()
214 list_add(&chan->free_list, &irqs_to_free); in close_one_chan()
218 if (chan->input && chan->enabled) in close_one_chan()
219 um_free_irq(chan->line->driver->read_irq, chan); in close_one_chan()
220 if (chan->output && chan->enabled) in close_one_chan()
221 um_free_irq(chan->line->driver->write_irq, chan); in close_one_chan()
222 chan->enabled = 0; in close_one_chan()
224 if (chan->ops->close != NULL) in close_one_chan()
225 (*chan->ops->close)(chan->fd, chan->data); in close_one_chan()
227 chan->opened = 0; in close_one_chan()
228 chan->fd = -1; in close_one_chan()
233 struct chan *chan; in close_chan() local
240 list_for_each_entry_reverse(chan, &line->chan_list, list) { in close_chan()
241 close_one_chan(chan, 0); in close_chan()
245 void deactivate_chan(struct chan *chan, int irq) in deactivate_chan() argument
247 if (chan && chan->enabled) in deactivate_chan()
248 deactivate_fd(chan->fd, irq); in deactivate_chan()
251 void reactivate_chan(struct chan *chan, int irq) in reactivate_chan() argument
253 if (chan && chan->enabled) in reactivate_chan()
254 reactivate_fd(chan->fd, irq); in reactivate_chan()
257 int write_chan(struct chan *chan, const char *buf, int len, in write_chan() argument
262 if (len == 0 || !chan || !chan->ops->write) in write_chan()
265 n = chan->ops->write(chan->fd, buf, len, chan->data); in write_chan()
266 if (chan->primary) { in write_chan()
269 reactivate_fd(chan->fd, write_irq); in write_chan()
274 int console_write_chan(struct chan *chan, const char *buf, int len) in console_write_chan() argument
278 if (!chan || !chan->ops->console_write) in console_write_chan()
281 n = chan->ops->console_write(chan->fd, buf, len); in console_write_chan()
282 if (chan->primary) in console_write_chan()
303 struct chan *chan; in chan_window_size() local
305 chan = line->chan_in; in chan_window_size()
306 if (chan && chan->primary) { in chan_window_size()
307 if (chan->ops->window_size == NULL) in chan_window_size()
309 return chan->ops->window_size(chan->fd, chan->data, in chan_window_size()
312 chan = line->chan_out; in chan_window_size()
313 if (chan && chan->primary) { in chan_window_size()
314 if (chan->ops->window_size == NULL) in chan_window_size()
316 return chan->ops->window_size(chan->fd, chan->data, in chan_window_size()
322 static void free_one_chan(struct chan *chan) in free_one_chan() argument
324 list_del(&chan->list); in free_one_chan()
326 close_one_chan(chan, 0); in free_one_chan()
328 if (chan->ops->free != NULL) in free_one_chan()
329 (*chan->ops->free)(chan->data); in free_one_chan()
331 if (chan->primary && chan->output) in free_one_chan()
332 ignore_sigio_fd(chan->fd); in free_one_chan()
333 kfree(chan); in free_one_chan()
339 struct chan *chan; in free_chan() local
342 chan = list_entry(ele, struct chan, list); in free_chan()
343 free_one_chan(chan); in free_chan()
347 static int one_chan_config_string(struct chan *chan, char *str, int size, in one_chan_config_string() argument
352 if (chan == NULL) { in one_chan_config_string()
357 CONFIG_CHUNK(str, size, n, chan->ops->type, 0); in one_chan_config_string()
359 if (chan->dev == NULL) { in one_chan_config_string()
365 CONFIG_CHUNK(str, size, n, chan->dev, 0); in one_chan_config_string()
370 static int chan_pair_config_string(struct chan *in, struct chan *out, in chan_pair_config_string()
396 struct chan *in = line->chan_in, *out = line->chan_out; in chan_config_string()
447 static struct chan *parse_chan(struct line *line, char *str, int device, in parse_chan()
452 struct chan *chan; in parse_chan() local
477 chan = kmalloc(sizeof(*chan), GFP_ATOMIC); in parse_chan()
478 if (chan == NULL) { in parse_chan()
482 *chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list), in parse_chan()
484 LIST_HEAD_INIT(chan->free_list), in parse_chan()
494 return chan; in parse_chan()
501 struct chan *new; in parse_chan_pair()
550 struct chan *chan = line->chan_in; in chan_interrupt() local
554 if (!chan || !chan->ops->read) in chan_interrupt()
562 err = chan->ops->read(chan->fd, &c, chan->data); in chan_interrupt()
568 reactivate_fd(chan->fd, irq); in chan_interrupt()
570 if (chan->primary) { in chan_interrupt()
572 if (line->chan_out != chan) in chan_interrupt()
575 close_one_chan(chan, 1); in chan_interrupt()
576 if (chan->primary) in chan_interrupt()