void i3c_master_queue_ibi(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot)
 {
        atomic_inc(&dev->ibi->pending_ibis);
-       queue_work(dev->common.master->wq, &slot->work);
+       queue_work(dev->ibi->wq, &slot->work);
 }
 EXPORT_SYMBOL_GPL(i3c_master_queue_ibi);
 
        if (!ibi)
                return -ENOMEM;
 
+       ibi->wq = alloc_ordered_workqueue(dev_name(i3cdev_to_dev(dev->dev)), WQ_MEM_RECLAIM);
+       if (!ibi->wq) {
+               kfree(ibi);
+               return -ENOMEM;
+       }
+
        atomic_set(&ibi->pending_ibis, 0);
        init_completion(&ibi->all_ibis_handled);
        ibi->handler = req->handler;
                WARN_ON(i3c_dev_disable_ibi_locked(dev));
 
        master->ops->free_ibi(dev);
+
+       if (dev->ibi->wq) {
+               destroy_workqueue(dev->ibi->wq);
+               dev->ibi->wq = NULL;
+       }
+
        kfree(dev->ibi);
        dev->ibi = NULL;
 }
 
  *                  rejected by the master
  * @num_slots: number of IBI slots reserved for this device
  * @enabled: reflect the IBI status
+ * @wq: workqueue used to execute IBI handlers.
  * @handler: IBI handler specified at i3c_device_request_ibi() call time. This
  *          handler will be called from the controller workqueue, and as such
  *          is allowed to sleep (though it is recommended to process the IBI
        unsigned int max_payload_len;
        unsigned int num_slots;
        unsigned int enabled;
+       struct workqueue_struct *wq;
        void (*handler)(struct i3c_device *dev,
                        const struct i3c_ibi_payload *payload);
 };
  * @boardinfo.i2c: list of I2C boardinfo objects
  * @boardinfo: board-level information attached to devices connected on the bus
  * @bus: I3C bus exposed by this master
- * @wq: workqueue used to execute IBI handlers. Can also be used by master
+ * @wq: workqueue which can be used by master
  *     drivers if they need to postpone operations that need to take place
  *     in a thread context. Typical examples are Hot Join processing which
  *     requires taking the bus lock in maintenance, which in turn, can only