serial: core: Document and assert lock requirements for irq helpers
[firefly-linux-kernel-4.4.55.git] / drivers / tty / serial / serial_core.c
index bdc543caf069a6f4a4d1dfa18f7309d44f15e02b..f764de32b658a6615131ff581d994cc0bf3d8772 100644 (file)
@@ -2743,17 +2743,24 @@ EXPORT_SYMBOL(uart_match_port);
  *     uart_handle_dcd_change - handle a change of carrier detect state
  *     @uport: uart_port structure for the open port
  *     @status: new carrier detect status, nonzero if active
+ *
+ *     Caller must hold uport->lock
  */
 void uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
 {
        struct tty_port *port = &uport->state->port;
        struct tty_struct *tty = port->tty;
-       struct tty_ldisc *ld = tty ? tty_ldisc_ref(tty) : NULL;
+       struct tty_ldisc *ld;
+
+       lockdep_assert_held_once(&uport->lock);
 
-       if (ld) {
-               if (ld->ops->dcd_change)
-                       ld->ops->dcd_change(tty, status);
-               tty_ldisc_deref(ld);
+       if (tty) {
+               ld = tty_ldisc_ref(tty);
+               if (ld) {
+                       if (ld->ops->dcd_change)
+                               ld->ops->dcd_change(tty, status);
+                       tty_ldisc_deref(ld);
+               }
        }
 
        uport->icount.dcd++;
@@ -2771,12 +2778,16 @@ EXPORT_SYMBOL_GPL(uart_handle_dcd_change);
  *     uart_handle_cts_change - handle a change of clear-to-send state
  *     @uport: uart_port structure for the open port
  *     @status: new clear to send status, nonzero if active
+ *
+ *     Caller must hold uport->lock
  */
 void uart_handle_cts_change(struct uart_port *uport, unsigned int status)
 {
        struct tty_port *port = &uport->state->port;
        struct tty_struct *tty = port->tty;
 
+       lockdep_assert_held_once(&uport->lock);
+
        uport->icount.cts++;
 
        if (tty_port_cts_enabled(port)) {