Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/bridge: samsung-dsim: use while loop in samsung_dsim_transfer_start

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>

+21 -30
+21 -30
drivers/gpu/drm/bridge/samsung-dsim.c
··· 1236 1236 { 1237 1237 unsigned long flags; 1238 1238 struct samsung_dsim_transfer *xfer; 1239 - bool start = false; 1240 1239 1241 - again: 1242 1240 spin_lock_irqsave(&dsi->transfer_lock, flags); 1243 1241 1244 - if (list_empty(&dsi->transfer_list)) { 1242 + while (!list_empty(&dsi->transfer_list)) { 1243 + xfer = list_first_entry(&dsi->transfer_list, 1244 + struct samsung_dsim_transfer, list); 1245 + 1245 1246 spin_unlock_irqrestore(&dsi->transfer_lock, flags); 1246 - return; 1247 + 1248 + if (xfer->packet.payload_length && 1249 + xfer->tx_done == xfer->packet.payload_length) 1250 + /* waiting for RX */ 1251 + return; 1252 + 1253 + samsung_dsim_send_to_fifo(dsi, xfer); 1254 + 1255 + if (xfer->packet.payload_length || xfer->rx_len) 1256 + return; 1257 + 1258 + xfer->result = 0; 1259 + complete(&xfer->completed); 1260 + 1261 + spin_lock_irqsave(&dsi->transfer_lock, flags); 1262 + 1263 + list_del_init(&xfer->list); 1247 1264 } 1248 1265 1249 - xfer = list_first_entry(&dsi->transfer_list, 1250 - struct samsung_dsim_transfer, list); 1251 - 1252 1266 spin_unlock_irqrestore(&dsi->transfer_lock, flags); 1253 - 1254 - if (xfer->packet.payload_length && 1255 - xfer->tx_done == xfer->packet.payload_length) 1256 - /* waiting for RX */ 1257 - return; 1258 - 1259 - samsung_dsim_send_to_fifo(dsi, xfer); 1260 - 1261 - if (xfer->packet.payload_length || xfer->rx_len) 1262 - return; 1263 - 1264 - xfer->result = 0; 1265 - complete(&xfer->completed); 1266 - 1267 - spin_lock_irqsave(&dsi->transfer_lock, flags); 1268 - 1269 - list_del_init(&xfer->list); 1270 - start = !list_empty(&dsi->transfer_list); 1271 - 1272 - spin_unlock_irqrestore(&dsi->transfer_lock, flags); 1273 - 1274 - if (start) 1275 - goto again; 1276 1267 } 1277 1268 1278 1269 static bool samsung_dsim_transfer_finish(struct samsung_dsim *dsi)