if (!secm_area)
                return -ENOMEM;
 
-       mutex_lock(&css->mutex);
        if (enable && !css->cm_enabled) {
                css->cub_addr1 = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
                css->cub_addr2 = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
                        free_page((unsigned long)css->cub_addr1);
                        free_page((unsigned long)css->cub_addr2);
                        free_page((unsigned long)secm_area);
-                       mutex_unlock(&css->mutex);
                        return -ENOMEM;
                }
        }
                free_page((unsigned long)css->cub_addr1);
                free_page((unsigned long)css->cub_addr2);
        }
-       mutex_unlock(&css->mutex);
        free_page((unsigned long)secm_area);
        return ret;
 }
 
                   char *buf)
 {
        struct channel_subsystem *css = to_css(dev);
+       int ret;
 
        if (!css)
                return 0;
-       return sprintf(buf, "%x\n", css->cm_enabled);
+       mutex_lock(&css->mutex);
+       ret = sprintf(buf, "%x\n", css->cm_enabled);
+       mutex_unlock(&css->mutex);
+       return ret;
 }
 
 static ssize_t
        struct channel_subsystem *css = to_css(dev);
        int ret;
 
+       mutex_lock(&css->mutex);
        switch (buf[0]) {
        case '0':
                ret = css->cm_enabled ? chsc_secm(css, 0) : 0;
        default:
                ret = -EINVAL;
        }
+       mutex_unlock(&css->mutex);
        return ret < 0 ? ret : count;
 }
 
                struct channel_subsystem *css;
 
                css = channel_subsystems[i];
+               mutex_lock(&css->mutex);
                if (css->cm_enabled)
                        if (chsc_secm(css, 0))
                                ret = NOTIFY_BAD;
+               mutex_unlock(&css->mutex);
        }
 
        return ret;