Merge branch 'android-tegra-2.6.36' into android-tegra-moto-2.6.36
authorColin Cross <ccross@android.com>
Tue, 22 Mar 2011 18:43:45 +0000 (11:43 -0700)
committerColin Cross <ccross@android.com>
Tue, 22 Mar 2011 18:43:45 +0000 (11:43 -0700)
Conflicts:
drivers/serial/tegra_hsuart.c

Change-Id: I535bef9c6645e5ec86f374a8f4d1fb3569274e53

1  2 
drivers/serial/tegra_hsuart.c

index 37fe89a8a94ccc9ad7e1a3543c46ce83921c3bf4,b3b8eeaf8cf6aa8a87846f222c6d6c4caf634183..61d38bfcaa597d69b8ad6a1ccd342f22e5a1189f
@@@ -309,24 -288,36 +298,41 @@@ static void tegra_rx_dma_complete_req(s
        if (req->status == -TEGRA_DMA_REQ_ERROR_ABORTED)
                return;
  
-       spin_unlock(&u->lock);
        tty_flip_buffer_push(u->state->port.tty);
-       spin_lock(&u->lock);
 +
 +      if (t->rx_done_cb)
 +              t->rx_done_cb(u);
  }
  
+ static void tegra_rx_dma_complete_callback(struct tegra_dma_req *req)
+ {
+       struct tegra_uart_port *t = req->dev;
+       unsigned long flags;
+       /*
+        * should never get called, dma should be dequeued during threshold
+        * callback
+        */
+       dev_warn(t->uport.dev, "possible rx overflow\n");
+       spin_lock_irqsave(&t->uport.lock, flags);
+       tegra_rx_dma_complete_req(t, req);
+       spin_unlock_irqrestore(&t->uport.lock, flags);
+ }
  /* Lock already taken */
  static void do_handle_rx_dma(struct tegra_uart_port *t)
  {
        struct uart_port *u = &t->uport;
        if (t->rts_active)
                set_rts(t, false);
-       tegra_dma_dequeue(t->rx_dma);
+       if (!tegra_dma_dequeue_req(t->rx_dma, &t->rx_dma_req))
+               tegra_rx_dma_complete_req(t, &t->rx_dma_req);
        tty_flip_buffer_push(u->state->port.tty);
 +      if (t->rx_done_cb)
 +              t->rx_done_cb(u);
        /* enqueue the request again */
        tegra_start_dma_rx(t);
        if (t->rts_active)
@@@ -606,12 -606,14 +623,16 @@@ static void tegra_stop_rx(struct uart_p
                t->ier_shadow = ier;
                uart_writeb(t, ier, UART_IER);
                t->rx_in_progress = 0;
-       }
-       if (t->use_rx_dma && t->rx_dma) {
-               tegra_dma_dequeue(t->rx_dma);
+               if (t->use_rx_dma && t->rx_dma) {
+                       if (!tegra_dma_dequeue_req(t->rx_dma, &t->rx_dma_req))
+                               tegra_rx_dma_complete_req(t, &t->rx_dma_req);
+               } else {
+                       do_handle_rx_pio(t);
+               }
                tty_flip_buffer_push(u->state->port.tty);
 +              if (t->rx_done_cb)
 +                      t->rx_done_cb(u);
        }
  
        return;