return !!val;
 }
 
+static int pcc_mbox_error_check_and_clear(struct pcc_chan_info *pchan)
+{
+       u64 val;
+       int ret;
+
+       ret = pcc_chan_reg_read(&pchan->error, &val);
+       if (ret)
+               return ret;
+
+       val &= pchan->error.status_mask;
+       if (val) {
+               val &= ~pchan->error.status_mask;
+               pcc_chan_reg_write(&pchan->error, val);
+               return -EIO;
+       }
+
+       return 0;
+}
+
 static void check_and_ack(struct pcc_chan_info *pchan, struct mbox_chan *chan)
 {
        struct acpi_pcct_ext_pcc_shared_memory pcc_hdr;
 {
        struct pcc_chan_info *pchan;
        struct mbox_chan *chan = p;
-       u64 val;
-       int ret;
 
        pchan = chan->con_priv;
 
        if (!pcc_mbox_cmd_complete_check(pchan))
                return IRQ_NONE;
 
-       ret = pcc_chan_reg_read(&pchan->error, &val);
-       if (ret)
+       if (pcc_mbox_error_check_and_clear(pchan))
                return IRQ_NONE;
-       val &= pchan->error.status_mask;
-       if (val) {
-               val &= ~pchan->error.status_mask;
-               pcc_chan_reg_write(&pchan->error, val);
-               return IRQ_NONE;
-       }
 
        /*
         * Clear this flag after updating interrupt ack register and just