mutex_lock(&dsp->pwr_lock);
 
-       if (!dsp->wmfw_file_name || !dsp->running)
+       if (!dsp->wmfw_file_name || !dsp->booted)
                ret = 0;
        else
                ret = simple_read_from_buffer(user_buf, count, ppos,
 
        mutex_lock(&dsp->pwr_lock);
 
-       if (!dsp->bin_file_name || !dsp->running)
+       if (!dsp->bin_file_name || !dsp->booted)
                ret = 0;
        else
                ret = simple_read_from_buffer(user_buf, count, ppos,
        if (!root)
                goto err;
 
+       if (!debugfs_create_bool("booted", S_IRUGO, root, &dsp->booted))
+               goto err;
+
        if (!debugfs_create_bool("running", S_IRUGO, root, &dsp->running))
                goto err;
 
 
        mutex_lock(&dsp[e->shift_l].pwr_lock);
 
-       if (dsp[e->shift_l].running || dsp[e->shift_l].compr)
+       if (dsp[e->shift_l].booted || dsp[e->shift_l].compr)
                ret = -EBUSY;
        else
                dsp[e->shift_l].fw = ucontrol->value.enumerated.item[0];
        memcpy(ctl->cache, p, ctl->len);
 
        ctl->set = 1;
-       if (ctl->enabled)
+       if (ctl->enabled && ctl->dsp->booted)
                ret = wm_coeff_write_control(ctl, p, ctl->len);
 
        mutex_unlock(&ctl->dsp->pwr_lock);
                ret = -EFAULT;
        } else {
                ctl->set = 1;
-               if (ctl->enabled)
+               if (ctl->enabled && ctl->dsp->booted)
                        ret = wm_coeff_write_control(ctl, ctl->cache, size);
        }
 
        mutex_lock(&ctl->dsp->pwr_lock);
 
        if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) {
-               if (ctl->enabled)
+               if (ctl->enabled && ctl->dsp->booted)
                        ret = wm_coeff_read_control(ctl, p, ctl->len);
                else
                        ret = -EPERM;
        } else {
-               if (!ctl->flags && ctl->enabled)
+               if (!ctl->flags && ctl->enabled && ctl->dsp->booted)
                        ret = wm_coeff_read_control(ctl, ctl->cache, ctl->len);
 
                memcpy(p, ctl->cache, ctl->len);
        mutex_lock(&ctl->dsp->pwr_lock);
 
        if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) {
-               if (ctl->enabled)
+               if (ctl->enabled && ctl->dsp->booted)
                        ret = wm_coeff_read_control(ctl, ctl->cache, size);
                else
                        ret = -EPERM;
        } else {
-               if (!ctl->flags && ctl->enabled)
+               if (!ctl->flags && ctl->enabled && ctl->dsp->booted)
                        ret = wm_coeff_read_control(ctl, ctl->cache, size);
        }
 
                if (ret != 0)
                        goto err_ena;
 
+               dsp->booted = true;
+
                /* Start the core running */
                regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30,
                                   ADSP1_CORE_ENA | ADSP1_START,
                                   ADSP1_CORE_ENA | ADSP1_START);
+
+               dsp->running = true;
                break;
 
        case SND_SOC_DAPM_PRE_PMD:
+               dsp->running = false;
+               dsp->booted = false;
+
                /* Halt the core */
                regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30,
                                   ADSP1_CORE_ENA | ADSP1_START, 0);
        if (ret != 0)
                goto err_ena;
 
-       dsp->running = true;
+       dsp->booted = true;
 
        mutex_unlock(&dsp->pwr_lock);
 
        case SND_SOC_DAPM_POST_PMU:
                flush_work(&dsp->boot_work);
 
-               if (!dsp->running)
+               if (!dsp->booted)
                        return -EIO;
 
                ret = regmap_update_bits(dsp->regmap,
                if (ret != 0)
                        goto err;
 
+               dsp->running = true;
+
                mutex_lock(&dsp->pwr_lock);
 
                if (wm_adsp_fw[dsp->fw].num_caps != 0)
 
                dsp->fw_id = 0;
                dsp->fw_id_version = 0;
+
                dsp->running = false;
+               dsp->booted = false;
 
                regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
                                   ADSP2_CORE_ENA | ADSP2_START, 0);