]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
i3c: dw-i3c-master: convert spinlock usage to scoped guards
authorAdrian Ng Ho Yin <adrianhoyin.ng@altera.com>
Tue, 27 Jan 2026 02:05:06 +0000 (10:05 +0800)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Fri, 30 Jan 2026 23:05:22 +0000 (00:05 +0100)
Convert dw-i3c-master to use scoped spinlock guards in place of
open-coded spin_lock_irqsave()/spin_unlock_irqrestore() pairs to ensure
locks are always safely released on scope exit.

Signed-off-by: Adrian Ng Ho Yin <adrianhoyin.ng@altera.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/79020c006c15dda9d057946530f16cfb4650d450.1769479330.git.adrianhoyin.ng@altera.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/i3c/master/dw-i3c-master.c

index cfc15aaf8c7bb2ed2337180cb83e68d444b88209..d7df81c566672d191f728dad97b00977301723e0 100644 (file)
@@ -416,17 +416,14 @@ static void dw_i3c_master_start_xfer_locked(struct dw_i3c_master *master)
 static void dw_i3c_master_enqueue_xfer(struct dw_i3c_master *master,
                                       struct dw_i3c_xfer *xfer)
 {
-       unsigned long flags;
-
        init_completion(&xfer->comp);
-       spin_lock_irqsave(&master->xferqueue.lock, flags);
+       guard(spinlock_irqsave)(&master->xferqueue.lock);
        if (master->xferqueue.cur) {
                list_add_tail(&xfer->node, &master->xferqueue.list);
        } else {
                master->xferqueue.cur = xfer;
                dw_i3c_master_start_xfer_locked(master);
        }
-       spin_unlock_irqrestore(&master->xferqueue.lock, flags);
 }
 
 static void dw_i3c_master_dequeue_xfer_locked(struct dw_i3c_master *master,
@@ -451,11 +448,8 @@ static void dw_i3c_master_dequeue_xfer_locked(struct dw_i3c_master *master,
 static void dw_i3c_master_dequeue_xfer(struct dw_i3c_master *master,
                                       struct dw_i3c_xfer *xfer)
 {
-       unsigned long flags;
-
-       spin_lock_irqsave(&master->xferqueue.lock, flags);
+       guard(spinlock_irqsave)(&master->xferqueue.lock);
        dw_i3c_master_dequeue_xfer_locked(master, xfer);
-       spin_unlock_irqrestore(&master->xferqueue.lock, flags);
 }
 
 static void dw_i3c_master_end_xfer_locked(struct dw_i3c_master *master, u32 isr)
@@ -1195,15 +1189,13 @@ static int dw_i3c_master_request_ibi(struct i3c_dev_desc *dev,
        struct dw_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
        struct i3c_master_controller *m = i3c_dev_get_master(dev);
        struct dw_i3c_master *master = to_dw_i3c_master(m);
-       unsigned long flags;
 
        data->ibi_pool = i3c_generic_ibi_alloc_pool(dev, req);
        if (IS_ERR(data->ibi_pool))
                return PTR_ERR(data->ibi_pool);
 
-       spin_lock_irqsave(&master->devs_lock, flags);
+       guard(spinlock_irqsave)(&master->devs_lock);
        master->devs[data->index].ibi_dev = dev;
-       spin_unlock_irqrestore(&master->devs_lock, flags);
 
        return 0;
 }
@@ -1213,11 +1205,10 @@ static void dw_i3c_master_free_ibi(struct i3c_dev_desc *dev)
        struct dw_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
        struct i3c_master_controller *m = i3c_dev_get_master(dev);
        struct dw_i3c_master *master = to_dw_i3c_master(m);
-       unsigned long flags;
 
-       spin_lock_irqsave(&master->devs_lock, flags);
-       master->devs[data->index].ibi_dev = NULL;
-       spin_unlock_irqrestore(&master->devs_lock, flags);
+       scoped_guard(spinlock_irqsave, &master->devs_lock) {
+               master->devs[data->index].ibi_dev = NULL;
+       }
 
        i3c_generic_ibi_free_pool(data->ibi_pool);
        data->ibi_pool = NULL;
@@ -1244,13 +1235,12 @@ static void dw_i3c_master_set_sir_enabled(struct dw_i3c_master *master,
                                          struct i3c_dev_desc *dev,
                                          u8 idx, bool enable)
 {
-       unsigned long flags;
        u32 dat_entry, reg;
        bool global;
 
        dat_entry = DEV_ADDR_TABLE_LOC(master->datstartaddr, idx);
 
-       spin_lock_irqsave(&master->devs_lock, flags);
+       guard(spinlock_irqsave)(&master->devs_lock);
        reg = readl(master->regs + dat_entry);
        if (enable) {
                reg &= ~DEV_ADDR_TABLE_SIR_REJECT;
@@ -1275,9 +1265,6 @@ static void dw_i3c_master_set_sir_enabled(struct dw_i3c_master *master,
 
        if (global)
                dw_i3c_master_enable_sir_signal(master, enable);
-
-
-       spin_unlock_irqrestore(&master->devs_lock, flags);
 }
 
 static int dw_i3c_master_enable_hotjoin(struct i3c_master_controller *m)
@@ -1378,7 +1365,6 @@ static void dw_i3c_master_handle_ibi_sir(struct dw_i3c_master *master,
        struct dw_i3c_i2c_dev_data *data;
        struct i3c_ibi_slot *slot;
        struct i3c_dev_desc *dev;
-       unsigned long flags;
        u8 addr, len;
        int idx;
 
@@ -1396,7 +1382,7 @@ static void dw_i3c_master_handle_ibi_sir(struct dw_i3c_master *master,
         * a new platform op to validate it.
         */
 
-       spin_lock_irqsave(&master->devs_lock, flags);
+       guard(spinlock_irqsave)(&master->devs_lock);
        idx = dw_i3c_master_get_addr_pos(master, addr);
        if (idx < 0) {
                dev_dbg_ratelimited(&master->base.dev,
@@ -1432,14 +1418,10 @@ static void dw_i3c_master_handle_ibi_sir(struct dw_i3c_master *master,
        }
        i3c_master_queue_ibi(dev, slot);
 
-       spin_unlock_irqrestore(&master->devs_lock, flags);
-
        return;
 
 err_drain:
        dw_i3c_master_drain_ibi_queue(master, len);
-
-       spin_unlock_irqrestore(&master->devs_lock, flags);
 }
 
 /* "ibis": referring to In-Band Interrupts, and not