u32 regval;
        int err;
 
-       mutex_lock(&mlxreg_lc->lock);
-
        err = regmap_read(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_pwr, ®val);
        if (err)
                goto regmap_read_fail;
        err = regmap_write(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_pwr, regval);
 
 regmap_read_fail:
-       mutex_unlock(&mlxreg_lc->lock);
        return err;
 }
 
         * line card which is already has been enabled. Disabling does not affect the disabled line
         * card.
         */
-       mutex_lock(&mlxreg_lc->lock);
-
        err = regmap_read(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_ena, ®val);
        if (err)
                goto regmap_read_fail;
        err = regmap_write(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_ena, regval);
 
 regmap_read_fail:
-       mutex_unlock(&mlxreg_lc->lock);
        return err;
 }
 
 
 static void
 mlxreg_lc_state_update(struct mlxreg_lc *mlxreg_lc, enum mlxreg_lc_state state, u8 action)
+{
+       if (action)
+               mlxreg_lc->state |= state;
+       else
+               mlxreg_lc->state &= ~state;
+}
+
+static void
+mlxreg_lc_state_update_locked(struct mlxreg_lc *mlxreg_lc, enum mlxreg_lc_state state, u8 action)
 {
        mutex_lock(&mlxreg_lc->lock);
 
        dev_info(mlxreg_lc->dev, "linecard#%d state %d event kind %d action %d\n",
                 mlxreg_lc->data->slot, mlxreg_lc->state, kind, action);
 
-       if (!(mlxreg_lc->state & MLXREG_LC_INITIALIZED))
+       mutex_lock(&mlxreg_lc->lock);
+       if (!(mlxreg_lc->state & MLXREG_LC_INITIALIZED)) {
+               mutex_unlock(&mlxreg_lc->lock);
                return 0;
+       }
 
        switch (kind) {
        case MLXREG_HOTPLUG_LC_SYNCED:
                if (!(mlxreg_lc->state & MLXREG_LC_POWERED) && action) {
                        err = mlxreg_lc_power_on_off(mlxreg_lc, 1);
                        if (err)
-                               return err;
+                               goto mlxreg_lc_power_on_off_fail;
                }
                /* In case line card is configured - enable it. */
                if (mlxreg_lc->state & MLXREG_LC_CONFIGURED && action)
                                /* In case line card is configured - enable it. */
                                if (mlxreg_lc->state & MLXREG_LC_CONFIGURED)
                                        err = mlxreg_lc_enable_disable(mlxreg_lc, 1);
+                               mutex_unlock(&mlxreg_lc->lock);
                                return err;
                        }
                        err = mlxreg_lc_create_static_devices(mlxreg_lc, mlxreg_lc->main_devs,
                                                              mlxreg_lc->main_devs_num);
                        if (err)
-                               return err;
+                               goto mlxreg_lc_create_static_devices_fail;
 
                        /* In case line card is already in ready state - enable it. */
                        if (mlxreg_lc->state & MLXREG_LC_CONFIGURED)
                break;
        }
 
+mlxreg_lc_power_on_off_fail:
+mlxreg_lc_create_static_devices_fail:
+       mutex_unlock(&mlxreg_lc->lock);
+
        return err;
 }
 
                if (err)
                        goto mlxreg_lc_create_static_devices_failed;
 
-               mlxreg_lc_state_update(mlxreg_lc, MLXREG_LC_POWERED, 1);
+               mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_POWERED, 1);
        }
 
        /* Verify if line card is synchronized. */
        /* Power on line card if necessary. */
        if (regval & mlxreg_lc->data->mask) {
                mlxreg_lc->state |= MLXREG_LC_SYNCED;
-               mlxreg_lc_state_update(mlxreg_lc, MLXREG_LC_SYNCED, 1);
+               mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_SYNCED, 1);
                if (mlxreg_lc->state & ~MLXREG_LC_POWERED) {
                        err = mlxreg_lc_power_on_off(mlxreg_lc, 1);
                        if (err)
                }
        }
 
-       mlxreg_lc_state_update(mlxreg_lc, MLXREG_LC_INITIALIZED, 1);
+       mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_INITIALIZED, 1);
 
        return 0;
 
        struct mlxreg_core_data *data = dev_get_platdata(&pdev->dev);
        struct mlxreg_lc *mlxreg_lc = platform_get_drvdata(pdev);
 
+       mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_INITIALIZED, 0);
+
        /*
         * Probing and removing are invoked by hotplug events raised upon line card insertion and
         * removing. If probing procedure fails all data is cleared. However, hotplug event still