drm/cirrus: Fix NULL pointer dereference when registering the fbdev
[deliverable/linux.git] / drivers / tty / tty_port.c
CommitLineData
9e48565d
AC
1/*
2 * Tty port functions
3 */
4
5#include <linux/types.h>
6#include <linux/errno.h>
7#include <linux/tty.h>
8#include <linux/tty_driver.h>
9#include <linux/tty_flip.h>
3e61696b 10#include <linux/serial.h>
9e48565d
AC
11#include <linux/timer.h>
12#include <linux/string.h>
13#include <linux/slab.h>
14#include <linux/sched.h>
9e48565d
AC
15#include <linux/wait.h>
16#include <linux/bitops.h>
17#include <linux/delay.h>
18#include <linux/module.h>
19
20void tty_port_init(struct tty_port *port)
21{
22 memset(port, 0, sizeof(*port));
ecbbfd44 23 tty_buffer_init(port);
9e48565d 24 init_waitqueue_head(&port->open_wait);
bdc04e31 25 init_waitqueue_head(&port->delta_msr_wait);
9e48565d 26 mutex_init(&port->mutex);
44e4909e 27 mutex_init(&port->buf_mutex);
4a90f09b 28 spin_lock_init(&port->lock);
9e48565d
AC
29 port->close_delay = (50 * HZ) / 100;
30 port->closing_wait = (3000 * HZ) / 100;
568aafc6 31 kref_init(&port->kref);
9e48565d
AC
32}
33EXPORT_SYMBOL(tty_port_init);
34
2cb4ca02
JS
35/**
36 * tty_port_link_device - link tty and tty_port
37 * @port: tty_port of the device
38 * @driver: tty_driver for this device
39 * @index: index of the tty
40 *
41 * Provide the tty layer wit ha link from a tty (specified by @index) to a
42 * tty_port (@port). Use this only if neither tty_port_register_device nor
43 * tty_port_install is used in the driver. If used, this has to be called before
44 * tty_register_driver.
45 */
46void tty_port_link_device(struct tty_port *port,
47 struct tty_driver *driver, unsigned index)
48{
49 if (WARN_ON(index >= driver->num))
50 return;
51 driver->ports[index] = port;
52}
53EXPORT_SYMBOL_GPL(tty_port_link_device);
54
72a33bf5
JS
55/**
56 * tty_port_register_device - register tty device
57 * @port: tty_port of the device
58 * @driver: tty_driver for this device
59 * @index: index of the tty
60 * @device: parent if exists, otherwise NULL
61 *
62 * It is the same as tty_register_device except the provided @port is linked to
63 * a concrete tty specified by @index. Use this or tty_port_install (or both).
64 * Call tty_port_link_device as a last resort.
65 */
057eb856
JS
66struct device *tty_port_register_device(struct tty_port *port,
67 struct tty_driver *driver, unsigned index,
68 struct device *device)
69{
2cb4ca02 70 tty_port_link_device(port, driver, index);
057eb856
JS
71 return tty_register_device(driver, index, device);
72}
73EXPORT_SYMBOL_GPL(tty_port_register_device);
74
b1b79916
TH
75/**
76 * tty_port_register_device_attr - register tty device
77 * @port: tty_port of the device
78 * @driver: tty_driver for this device
79 * @index: index of the tty
80 * @device: parent if exists, otherwise NULL
81 * @drvdata: Driver data to be set to device.
82 * @attr_grp: Attribute group to be set on device.
83 *
84 * It is the same as tty_register_device_attr except the provided @port is
85 * linked to a concrete tty specified by @index. Use this or tty_port_install
86 * (or both). Call tty_port_link_device as a last resort.
87 */
88struct device *tty_port_register_device_attr(struct tty_port *port,
89 struct tty_driver *driver, unsigned index,
90 struct device *device, void *drvdata,
91 const struct attribute_group **attr_grp)
92{
93 tty_port_link_device(port, driver, index);
94 return tty_register_device_attr(driver, index, device, drvdata,
95 attr_grp);
96}
97EXPORT_SYMBOL_GPL(tty_port_register_device_attr);
98
9e48565d
AC
99int tty_port_alloc_xmit_buf(struct tty_port *port)
100{
101 /* We may sleep in get_zeroed_page() */
44e4909e 102 mutex_lock(&port->buf_mutex);
9e48565d
AC
103 if (port->xmit_buf == NULL)
104 port->xmit_buf = (unsigned char *)get_zeroed_page(GFP_KERNEL);
44e4909e 105 mutex_unlock(&port->buf_mutex);
9e48565d
AC
106 if (port->xmit_buf == NULL)
107 return -ENOMEM;
108 return 0;
109}
110EXPORT_SYMBOL(tty_port_alloc_xmit_buf);
111
112void tty_port_free_xmit_buf(struct tty_port *port)
113{
44e4909e 114 mutex_lock(&port->buf_mutex);
9e48565d
AC
115 if (port->xmit_buf != NULL) {
116 free_page((unsigned long)port->xmit_buf);
117 port->xmit_buf = NULL;
118 }
44e4909e 119 mutex_unlock(&port->buf_mutex);
9e48565d
AC
120}
121EXPORT_SYMBOL(tty_port_free_xmit_buf);
122
de274bfe
JS
123/**
124 * tty_port_destroy -- destroy inited port
125 * @port: tty port to be doestroyed
126 *
127 * When a port was initialized using tty_port_init, one has to destroy the
128 * port by this function. Either indirectly by using tty_port refcounting
129 * (tty_port_put) or directly if refcounting is not used.
130 */
131void tty_port_destroy(struct tty_port *port)
132{
e176058f 133 tty_buffer_cancel_work(port);
de274bfe
JS
134 tty_buffer_free_all(port);
135}
136EXPORT_SYMBOL(tty_port_destroy);
137
568aafc6
AC
138static void tty_port_destructor(struct kref *kref)
139{
140 struct tty_port *port = container_of(kref, struct tty_port, kref);
e3bfea23
PH
141
142 /* check if last port ref was dropped before tty release */
143 if (WARN_ON(port->itty))
144 return;
568aafc6
AC
145 if (port->xmit_buf)
146 free_page((unsigned long)port->xmit_buf);
de274bfe 147 tty_port_destroy(port);
81c79838 148 if (port->ops && port->ops->destruct)
568aafc6
AC
149 port->ops->destruct(port);
150 else
151 kfree(port);
152}
153
154void tty_port_put(struct tty_port *port)
155{
156 if (port)
157 kref_put(&port->kref, tty_port_destructor);
158}
159EXPORT_SYMBOL(tty_port_put);
9e48565d 160
4a90f09b
AC
161/**
162 * tty_port_tty_get - get a tty reference
163 * @port: tty port
164 *
165 * Return a refcount protected tty instance or NULL if the port is not
166 * associated with a tty (eg due to close or hangup)
167 */
168
169struct tty_struct *tty_port_tty_get(struct tty_port *port)
170{
171 unsigned long flags;
172 struct tty_struct *tty;
173
174 spin_lock_irqsave(&port->lock, flags);
175 tty = tty_kref_get(port->tty);
176 spin_unlock_irqrestore(&port->lock, flags);
177 return tty;
178}
179EXPORT_SYMBOL(tty_port_tty_get);
180
181/**
182 * tty_port_tty_set - set the tty of a port
183 * @port: tty port
184 * @tty: the tty
185 *
186 * Associate the port and tty pair. Manages any internal refcounts.
187 * Pass NULL to deassociate a port
188 */
189
190void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty)
191{
192 unsigned long flags;
193
194 spin_lock_irqsave(&port->lock, flags);
a211b1af 195 tty_kref_put(port->tty);
cb4bca35 196 port->tty = tty_kref_get(tty);
4a90f09b
AC
197 spin_unlock_irqrestore(&port->lock, flags);
198}
199EXPORT_SYMBOL(tty_port_tty_set);
31f35939 200
957dacae 201static void tty_port_shutdown(struct tty_port *port, struct tty_struct *tty)
7ca0ff9a 202{
64bc3979 203 mutex_lock(&port->mutex);
8bde9658
JH
204 if (port->console)
205 goto out;
206
d41861ca
PH
207 if (tty_port_initialized(port)) {
208 tty_port_set_initialized(port, 0);
957dacae
JH
209 /*
210 * Drop DTR/RTS if HUPCL is set. This causes any attached
211 * modem to hang up the line.
212 */
213 if (tty && C_HUPCL(tty))
214 tty_port_lower_dtr_rts(port);
215
8bde9658 216 if (port->ops->shutdown)
7ca0ff9a 217 port->ops->shutdown(port);
8bde9658
JH
218 }
219out:
64bc3979 220 mutex_unlock(&port->mutex);
7ca0ff9a
AC
221}
222
3e61696b
AC
223/**
224 * tty_port_hangup - hangup helper
225 * @port: tty port
226 *
227 * Perform port level tty hangup flag and count changes. Drop the tty
228 * reference.
9c9928bd
PH
229 *
230 * Caller holds tty lock.
3e61696b
AC
231 */
232
233void tty_port_hangup(struct tty_port *port)
234{
957dacae 235 struct tty_struct *tty;
3e61696b
AC
236 unsigned long flags;
237
238 spin_lock_irqsave(&port->lock, flags);
239 port->count = 0;
957dacae
JH
240 tty = port->tty;
241 if (tty)
242 set_bit(TTY_IO_ERROR, &tty->flags);
3e61696b
AC
243 port->tty = NULL;
244 spin_unlock_irqrestore(&port->lock, flags);
807c8d81 245 tty_port_set_active(port, 0);
957dacae
JH
246 tty_port_shutdown(port, tty);
247 tty_kref_put(tty);
3e61696b 248 wake_up_interruptible(&port->open_wait);
bdc04e31 249 wake_up_interruptible(&port->delta_msr_wait);
3e61696b
AC
250}
251EXPORT_SYMBOL(tty_port_hangup);
252
aa27a094
JS
253/**
254 * tty_port_tty_hangup - helper to hang up a tty
255 *
256 * @port: tty port
257 * @check_clocal: hang only ttys with CLOCAL unset?
258 */
259void tty_port_tty_hangup(struct tty_port *port, bool check_clocal)
260{
261 struct tty_struct *tty = tty_port_tty_get(port);
262
1d9e689c 263 if (tty && (!check_clocal || !C_CLOCAL(tty)))
aa27a094 264 tty_hangup(tty);
1d9e689c 265 tty_kref_put(tty);
aa27a094
JS
266}
267EXPORT_SYMBOL_GPL(tty_port_tty_hangup);
268
6aad04f2
JS
269/**
270 * tty_port_tty_wakeup - helper to wake up a tty
271 *
272 * @port: tty port
273 */
274void tty_port_tty_wakeup(struct tty_port *port)
275{
276 struct tty_struct *tty = tty_port_tty_get(port);
277
278 if (tty) {
279 tty_wakeup(tty);
280 tty_kref_put(tty);
281 }
282}
283EXPORT_SYMBOL_GPL(tty_port_tty_wakeup);
284
31f35939
AC
285/**
286 * tty_port_carrier_raised - carrier raised check
287 * @port: tty port
288 *
289 * Wrapper for the carrier detect logic. For the moment this is used
290 * to hide some internal details. This will eventually become entirely
291 * internal to the tty port.
292 */
293
294int tty_port_carrier_raised(struct tty_port *port)
295{
296 if (port->ops->carrier_raised == NULL)
297 return 1;
298 return port->ops->carrier_raised(port);
299}
300EXPORT_SYMBOL(tty_port_carrier_raised);
5d951fb4
AC
301
302/**
fcc8ac18 303 * tty_port_raise_dtr_rts - Raise DTR/RTS
5d951fb4
AC
304 * @port: tty port
305 *
306 * Wrapper for the DTR/RTS raise logic. For the moment this is used
307 * to hide some internal details. This will eventually become entirely
308 * internal to the tty port.
309 */
310
311void tty_port_raise_dtr_rts(struct tty_port *port)
312{
fcc8ac18
AC
313 if (port->ops->dtr_rts)
314 port->ops->dtr_rts(port, 1);
5d951fb4
AC
315}
316EXPORT_SYMBOL(tty_port_raise_dtr_rts);
36c621d8 317
fcc8ac18
AC
318/**
319 * tty_port_lower_dtr_rts - Lower DTR/RTS
320 * @port: tty port
321 *
322 * Wrapper for the DTR/RTS raise logic. For the moment this is used
323 * to hide some internal details. This will eventually become entirely
324 * internal to the tty port.
325 */
326
327void tty_port_lower_dtr_rts(struct tty_port *port)
328{
329 if (port->ops->dtr_rts)
330 port->ops->dtr_rts(port, 0);
331}
332EXPORT_SYMBOL(tty_port_lower_dtr_rts);
333
36c621d8
AC
334/**
335 * tty_port_block_til_ready - Waiting logic for tty open
336 * @port: the tty port being opened
337 * @tty: the tty device being bound
338 * @filp: the file pointer of the opener
339 *
340 * Implement the core POSIX/SuS tty behaviour when opening a tty device.
341 * Handles:
342 * - hangup (both before and during)
343 * - non blocking open
344 * - rts/dtr/dcd
345 * - signals
346 * - port flags and counts
347 *
348 * The passed tty_port must implement the carrier_raised method if it can
fcc8ac18 349 * do carrier detect and the dtr_rts method if it supports software
36c621d8
AC
350 * management of these lines. Note that the dtr/rts raise is done each
351 * iteration as a hangup may have previously dropped them while we wait.
c590f6b6
PH
352 *
353 * Caller holds tty lock.
354 *
355 * NB: May drop and reacquire tty lock when blocking, so tty and tty_port
356 * may have changed state (eg., may have been hung up).
36c621d8 357 */
d774a56d 358
36c621d8
AC
359int tty_port_block_til_ready(struct tty_port *port,
360 struct tty_struct *tty, struct file *filp)
361{
362 int do_clocal = 0, retval;
363 unsigned long flags;
6af9a43d 364 DEFINE_WAIT(wait);
36c621d8 365
36c621d8
AC
366 /* if non-blocking mode is set we can pass directly to open unless
367 the port has just hung up or is in another error state */
18900ca6 368 if (tty_io_error(tty)) {
807c8d81 369 tty_port_set_active(port, 1);
8627b96d
AC
370 return 0;
371 }
372 if (filp->f_flags & O_NONBLOCK) {
4175f3e3 373 /* Indicate we are open */
9db276f8 374 if (C_BAUD(tty))
4175f3e3 375 tty_port_raise_dtr_rts(port);
807c8d81 376 tty_port_set_active(port, 1);
36c621d8
AC
377 return 0;
378 }
379
380 if (C_CLOCAL(tty))
381 do_clocal = 1;
382
383 /* Block waiting until we can proceed. We may need to wait for the
384 carrier, but we must also wait for any close that is in progress
385 before the next open may complete */
386
387 retval = 0;
36c621d8
AC
388
389 /* The port lock protects the port counts */
390 spin_lock_irqsave(&port->lock, flags);
e359a4e3 391 port->count--;
36c621d8
AC
392 port->blocked_open++;
393 spin_unlock_irqrestore(&port->lock, flags);
394
395 while (1) {
396 /* Indicate we are open */
d41861ca 397 if (C_BAUD(tty) && tty_port_initialized(port))
7834909f 398 tty_port_raise_dtr_rts(port);
36c621d8 399
3e3b5c08 400 prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE);
d774a56d
AC
401 /* Check for a hangup or uninitialised port.
402 Return accordingly */
d41861ca 403 if (tty_hung_up_p(filp) || !tty_port_initialized(port)) {
36c621d8
AC
404 if (port->flags & ASYNC_HUP_NOTIFY)
405 retval = -EAGAIN;
406 else
407 retval = -ERESTARTSYS;
408 break;
409 }
0eee50af
JS
410 /*
411 * Probe the carrier. For devices with no carrier detect
412 * tty_port_carrier_raised will always return true.
413 * Never ask drivers if CLOCAL is set, this causes troubles
414 * on some hardware.
415 */
fef062cb 416 if (do_clocal || tty_port_carrier_raised(port))
36c621d8
AC
417 break;
418 if (signal_pending(current)) {
419 retval = -ERESTARTSYS;
420 break;
421 }
89c8d91e 422 tty_unlock(tty);
36c621d8 423 schedule();
89c8d91e 424 tty_lock(tty);
36c621d8 425 }
3e3b5c08 426 finish_wait(&port->open_wait, &wait);
36c621d8
AC
427
428 /* Update counts. A parallel hangup will have set count to zero and
429 we must not mess that up further */
430 spin_lock_irqsave(&port->lock, flags);
431 if (!tty_hung_up_p(filp))
432 port->count++;
433 port->blocked_open--;
36c621d8 434 spin_unlock_irqrestore(&port->lock, flags);
807c8d81
PH
435 if (retval == 0)
436 tty_port_set_active(port, 1);
ecc2e05e 437 return retval;
36c621d8
AC
438}
439EXPORT_SYMBOL(tty_port_block_til_ready);
440
b74414f5
JH
441static void tty_port_drain_delay(struct tty_port *port, struct tty_struct *tty)
442{
443 unsigned int bps = tty_get_baud_rate(tty);
444 long timeout;
445
446 if (bps > 1200) {
447 timeout = (HZ * 10 * port->drain_delay) / bps;
448 timeout = max_t(long, timeout, HZ / 10);
449 } else {
450 timeout = 2 * HZ;
451 }
452 schedule_timeout_interruptible(timeout);
453}
454
79c1faa4 455/* Caller holds tty lock. */
d774a56d
AC
456int tty_port_close_start(struct tty_port *port,
457 struct tty_struct *tty, struct file *filp)
a6614999
AC
458{
459 unsigned long flags;
460
633caba8 461 if (tty_hung_up_p(filp))
a6614999 462 return 0;
a6614999 463
633caba8 464 spin_lock_irqsave(&port->lock, flags);
d774a56d 465 if (tty->count == 1 && port->count != 1) {
339f36ba
PH
466 tty_warn(tty, "%s: tty->count = 1 port count = %d\n", __func__,
467 port->count);
a6614999
AC
468 port->count = 1;
469 }
470 if (--port->count < 0) {
339f36ba
PH
471 tty_warn(tty, "%s: bad port count (%d)\n", __func__,
472 port->count);
a6614999
AC
473 port->count = 0;
474 }
475
476 if (port->count) {
477 spin_unlock_irqrestore(&port->lock, flags);
478 return 0;
479 }
a6614999 480 spin_unlock_irqrestore(&port->lock, flags);
0b2588ca 481
ddc7b758
PH
482 tty->closing = 1;
483
d41861ca 484 if (tty_port_initialized(port)) {
0b2588ca
JH
485 /* Don't block on a stalled port, just pull the chain */
486 if (tty->flow_stopped)
487 tty_driver_flush_buffer(tty);
488 if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
79c1faa4 489 tty_wait_until_sent(tty, port->closing_wait);
0b2588ca
JH
490 if (port->drain_delay)
491 tty_port_drain_delay(port, tty);
492 }
e707c35c
AC
493 /* Flush the ldisc buffering */
494 tty_ldisc_flush(tty);
495
469d6d06 496 /* Report to caller this is the last port reference */
a6614999
AC
497 return 1;
498}
499EXPORT_SYMBOL(tty_port_close_start);
500
0733db91 501/* Caller holds tty lock */
a6614999
AC
502void tty_port_close_end(struct tty_port *port, struct tty_struct *tty)
503{
504 unsigned long flags;
505
3f40f5b2 506 tty_ldisc_flush(tty);
a6614999
AC
507 tty->closing = 0;
508
ddc7b758
PH
509 spin_lock_irqsave(&port->lock, flags);
510
a6614999
AC
511 if (port->blocked_open) {
512 spin_unlock_irqrestore(&port->lock, flags);
5823323e
PH
513 if (port->close_delay)
514 msleep_interruptible(jiffies_to_msecs(port->close_delay));
a6614999
AC
515 spin_lock_irqsave(&port->lock, flags);
516 wake_up_interruptible(&port->open_wait);
517 }
a6614999 518 spin_unlock_irqrestore(&port->lock, flags);
807c8d81 519 tty_port_set_active(port, 0);
a6614999
AC
520}
521EXPORT_SYMBOL(tty_port_close_end);
7ca0ff9a 522
0733db91
PH
523/**
524 * tty_port_close
525 *
526 * Caller holds tty lock
0733db91 527 */
7ca0ff9a
AC
528void tty_port_close(struct tty_port *port, struct tty_struct *tty,
529 struct file *filp)
530{
531 if (tty_port_close_start(port, tty, filp) == 0)
532 return;
957dacae 533 tty_port_shutdown(port, tty);
d74e8286 534 set_bit(TTY_IO_ERROR, &tty->flags);
7ca0ff9a
AC
535 tty_port_close_end(port, tty);
536 tty_port_tty_set(port, NULL);
537}
538EXPORT_SYMBOL(tty_port_close);
64bc3979 539
72a33bf5
JS
540/**
541 * tty_port_install - generic tty->ops->install handler
542 * @port: tty_port of the device
543 * @driver: tty_driver for this device
544 * @tty: tty to be installed
545 *
546 * It is the same as tty_standard_install except the provided @port is linked
547 * to a concrete tty specified by @tty. Use this or tty_port_register_device
548 * (or both). Call tty_port_link_device as a last resort.
549 */
695586ca
JS
550int tty_port_install(struct tty_port *port, struct tty_driver *driver,
551 struct tty_struct *tty)
552{
553 tty->port = port;
554 return tty_standard_install(driver, tty);
555}
556EXPORT_SYMBOL_GPL(tty_port_install);
557
addd4672
PH
558/**
559 * tty_port_open
560 *
561 * Caller holds tty lock.
562 *
563 * NB: may drop and reacquire tty lock (in tty_port_block_til_ready()) so
564 * tty and tty_port may have changed state (eg., may be hung up now)
565 */
64bc3979 566int tty_port_open(struct tty_port *port, struct tty_struct *tty,
d774a56d 567 struct file *filp)
64bc3979
AC
568{
569 spin_lock_irq(&port->lock);
e359a4e3 570 ++port->count;
64bc3979
AC
571 spin_unlock_irq(&port->lock);
572 tty_port_tty_set(port, tty);
573
574 /*
575 * Do the device-specific open only if the hardware isn't
576 * already initialized. Serialize open and shutdown using the
577 * port mutex.
578 */
579
580 mutex_lock(&port->mutex);
581
d41861ca 582 if (!tty_port_initialized(port)) {
a9a37ec3 583 clear_bit(TTY_IO_ERROR, &tty->flags);
64bc3979
AC
584 if (port->ops->activate) {
585 int retval = port->ops->activate(port, tty);
586 if (retval) {
d774a56d
AC
587 mutex_unlock(&port->mutex);
588 return retval;
589 }
590 }
d41861ca 591 tty_port_set_initialized(port, 1);
64bc3979
AC
592 }
593 mutex_unlock(&port->mutex);
594 return tty_port_block_til_ready(port, tty, filp);
595}
596
597EXPORT_SYMBOL(tty_port_open);
This page took 0.593397 seconds and 5 git commands to generate.