]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/bridge: samsung-dsim: use while loop in samsung_dsim_transfer_start
authorPhilipp Zabel <p.zabel@pengutronix.de>
Tue, 27 May 2025 14:21:47 +0000 (16:21 +0200)
committerPhilipp Zabel <p.zabel@pengutronix.de>
Fri, 27 Jun 2025 11:05:56 +0000 (13:05 +0200)
Turn the open-coded goto-again construct into a while loop, to make
samsung_dsim_transfer_start() a bit shorter and easier to read.

Hold the spinlock when looping back around and avoid the duplicated
list_empty() check.

Reviewed-by: Alexander Stein <alexander.stein@ew.tq-group.com>
Reviewed-by: Frieder Schrempf <frieder.schrempf@kontron.de>
Link: https://lore.kernel.org/r/20250527-samsung-dsim-v1-1-5be520d84fbb@pengutronix.de
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
drivers/gpu/drm/bridge/samsung-dsim.c

index f2f666b27d2d5ec016d7a7f47c87fcdf1377d41a..2acf5d86174b8f699f2a2acb4d0db8c85fefc564 100644 (file)
@@ -1236,43 +1236,34 @@ static void samsung_dsim_transfer_start(struct samsung_dsim *dsi)
 {
        unsigned long flags;
        struct samsung_dsim_transfer *xfer;
-       bool start = false;
 
-again:
        spin_lock_irqsave(&dsi->transfer_lock, flags);
 
-       if (list_empty(&dsi->transfer_list)) {
-               spin_unlock_irqrestore(&dsi->transfer_lock, flags);
-               return;
-       }
+       while (!list_empty(&dsi->transfer_list)) {
+               xfer = list_first_entry(&dsi->transfer_list,
+                                       struct samsung_dsim_transfer, list);
 
-       xfer = list_first_entry(&dsi->transfer_list,
-                               struct samsung_dsim_transfer, list);
-
-       spin_unlock_irqrestore(&dsi->transfer_lock, flags);
+               spin_unlock_irqrestore(&dsi->transfer_lock, flags);
 
-       if (xfer->packet.payload_length &&
-           xfer->tx_done == xfer->packet.payload_length)
-               /* waiting for RX */
-               return;
+               if (xfer->packet.payload_length &&
+                   xfer->tx_done == xfer->packet.payload_length)
+                       /* waiting for RX */
+                       return;
 
-       samsung_dsim_send_to_fifo(dsi, xfer);
+               samsung_dsim_send_to_fifo(dsi, xfer);
 
-       if (xfer->packet.payload_length || xfer->rx_len)
-               return;
+               if (xfer->packet.payload_length || xfer->rx_len)
+                       return;
 
-       xfer->result = 0;
-       complete(&xfer->completed);
+               xfer->result = 0;
+               complete(&xfer->completed);
 
-       spin_lock_irqsave(&dsi->transfer_lock, flags);
+               spin_lock_irqsave(&dsi->transfer_lock, flags);
 
-       list_del_init(&xfer->list);
-       start = !list_empty(&dsi->transfer_list);
+               list_del_init(&xfer->list);
+       }
 
        spin_unlock_irqrestore(&dsi->transfer_lock, flags);
-
-       if (start)
-               goto again;
 }
 
 static bool samsung_dsim_transfer_finish(struct samsung_dsim *dsi)