return scu->irq > 0 ? ipc_wait_for_interrupt(scu) : busy_loop(scu);
 }
 
+static struct intel_scu_ipc_dev *intel_scu_ipc_get(struct intel_scu_ipc_dev *scu)
+{
+       u8 status;
+
+       if (!scu)
+               scu = ipcdev;
+       if (!scu)
+               return ERR_PTR(-ENODEV);
+
+       status = ipc_read_status(scu);
+       if (status & IPC_STATUS_BUSY) {
+               dev_dbg(&scu->dev, "device is busy\n");
+               return ERR_PTR(-EBUSY);
+       }
+
+       return scu;
+}
+
 /* Read/Write power control(PMIC in Langwell, MSIC in PenWell) registers */
 static int pwr_reg_rdwr(struct intel_scu_ipc_dev *scu, u16 *addr, u8 *data,
                        u32 count, u32 op, u32 id)
        memset(cbuf, 0, sizeof(cbuf));
 
        mutex_lock(&ipclock);
-       if (!scu)
-               scu = ipcdev;
-       if (!scu) {
+       scu = intel_scu_ipc_get(scu);
+       if (IS_ERR(scu)) {
                mutex_unlock(&ipclock);
-               return -ENODEV;
+               return PTR_ERR(scu);
        }
 
        for (nc = 0; nc < count; nc++, offset += 2) {
        int err;
 
        mutex_lock(&ipclock);
-       if (!scu)
-               scu = ipcdev;
-       if (!scu) {
+       scu = intel_scu_ipc_get(scu);
+       if (IS_ERR(scu)) {
                mutex_unlock(&ipclock);
-               return -ENODEV;
+               return PTR_ERR(scu);
        }
+
        cmdval = sub << 12 | cmd;
        ipc_command(scu, cmdval);
        err = intel_scu_ipc_check_status(scu);
                return -EINVAL;
 
        mutex_lock(&ipclock);
-       if (!scu)
-               scu = ipcdev;
-       if (!scu) {
+       scu = intel_scu_ipc_get(scu);
+       if (IS_ERR(scu)) {
                mutex_unlock(&ipclock);
-               return -ENODEV;
+               return PTR_ERR(scu);
        }
 
        memcpy(inbuf, in, inlen);