i3c: master: svc: enable the interrupt in the enable ibi function
authorClark Wang <xiaoning.wang@nxp.com>
Mon, 27 Dec 2021 07:45:29 +0000 (15:45 +0800)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Wed, 5 Jan 2022 08:53:44 +0000 (09:53 +0100)
If enable interrupt in the svc_i3c_master_bus_init() but do not call
enable ibi in the device driver, it will cause a kernel dump in the
svc_i3c_master_handle_ibi() when a slave start occurs on the i3c bus,
because the data->ibi_pool is not initialized.
So only enable the interrupt in svc_i3c_master_enable_ibi() function.

Signed-off-by: Clark Wang <xiaoning.wang@nxp.com>
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/r/20211227074529.1660398-9-xiaoning.wang@nxp.com
drivers/i3c/master/svc-i3c-master.c

index 3bc81ef95334a4d6e1b1b94c53ac95da09348db8..7550dad64ecf80017afca70f63ad045b74f095c1 100644 (file)
@@ -569,8 +569,6 @@ static int svc_i3c_master_bus_init(struct i3c_master_controller *m)
        if (ret)
                goto rpm_out;
 
-       svc_i3c_master_enable_interrupts(master, SVC_I3C_MINT_SLVSTART);
-
 rpm_out:
        pm_runtime_mark_last_busy(master->dev);
        pm_runtime_put_autosuspend(master->dev);
@@ -1400,6 +1398,8 @@ static int svc_i3c_master_enable_ibi(struct i3c_dev_desc *dev)
                return ret;
        }
 
+       svc_i3c_master_enable_interrupts(master, SVC_I3C_MINT_SLVSTART);
+
        return i3c_master_enec_locked(m, dev->info.dyn_addr, I3C_CCC_EVENT_SIR);
 }
 
@@ -1409,6 +1409,8 @@ static int svc_i3c_master_disable_ibi(struct i3c_dev_desc *dev)
        struct svc_i3c_master *master = to_svc_i3c_master(m);
        int ret;
 
+       svc_i3c_master_disable_interrupts(master);
+
        ret = i3c_master_disec_locked(m, dev->info.dyn_addr, I3C_CCC_EVENT_SIR);
 
        pm_runtime_mark_last_busy(master->dev);