Input: xilinx_ps2 - use guard notation when acquiring spinlock
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 5 Sep 2024 04:17:29 +0000 (21:17 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 4 Oct 2024 08:04:15 +0000 (01:04 -0700)
Using guard notation makes the code more compact and error handling
more robust by ensuring that locks are released in all code paths
when control leaves critical section.

Link: https://lore.kernel.org/r/20240905041732.2034348-25-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/serio/xilinx_ps2.c

index 1543267..0316760 100644 (file)
@@ -155,22 +155,17 @@ static irqreturn_t xps2_interrupt(int irq, void *dev_id)
 static int sxps2_write(struct serio *pserio, unsigned char c)
 {
        struct xps2data *drvdata = pserio->port_data;
-       unsigned long flags;
        u32 sr;
-       int status = -1;
 
-       spin_lock_irqsave(&drvdata->lock, flags);
+       guard(spinlock_irqsave)(&drvdata->lock);
 
        /* If the PS/2 transmitter is empty send a byte of data */
        sr = in_be32(drvdata->base_address + XPS2_STATUS_OFFSET);
-       if (!(sr & XPS2_STATUS_TX_FULL)) {
-               out_be32(drvdata->base_address + XPS2_TX_DATA_OFFSET, c);
-               status = 0;
-       }
+       if (sr & XPS2_STATUS_TX_FULL)
+               return -EAGAIN;
 
-       spin_unlock_irqrestore(&drvdata->lock, flags);
-
-       return status;
+       out_be32(drvdata->base_address + XPS2_TX_DATA_OFFSET, c);
+       return 0;
 }
 
 /**