mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 19:36:35 +08:00
esp/mcpwm: fix unpaired spin lock
N/A Signed-off-by: chao an <anchao@lixiang.com>
This commit is contained in:
@@ -427,6 +427,7 @@ static int esp_motor_setup(struct motor_lowerhalf_s *dev)
|
|||||||
if ((priv->state.state == MOTOR_STATE_FAULT) ||
|
if ((priv->state.state == MOTOR_STATE_FAULT) ||
|
||||||
(priv->state.state == MOTOR_STATE_CRITICAL))
|
(priv->state.state == MOTOR_STATE_CRITICAL))
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Motor is in fault state. Clear faults first\n");
|
mtrerr("Motor is in fault state. Clear faults first\n");
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
@@ -553,6 +554,7 @@ static int esp_motor_stop(struct motor_lowerhalf_s *dev)
|
|||||||
|
|
||||||
if (priv->state.state == MOTOR_STATE_IDLE)
|
if (priv->state.state == MOTOR_STATE_IDLE)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Motor already stopped\n");
|
mtrerr("Motor already stopped\n");
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
@@ -569,6 +571,7 @@ static int esp_motor_stop(struct motor_lowerhalf_s *dev)
|
|||||||
ret = esp_motor_set_duty_cycle(priv, 0.0);
|
ret = esp_motor_set_duty_cycle(priv, 0.0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Failed setting duty cycle to 0 on stop: %d\n", ret);
|
mtrerr("Failed setting duty cycle to 0 on stop: %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -622,6 +625,7 @@ static int esp_motor_start(struct motor_lowerhalf_s *dev)
|
|||||||
flags = spin_lock_irqsave(&g_mcpwm_common.mcpwm_spinlock);
|
flags = spin_lock_irqsave(&g_mcpwm_common.mcpwm_spinlock);
|
||||||
if (priv->state.state == MOTOR_STATE_RUN)
|
if (priv->state.state == MOTOR_STATE_RUN)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Motor already running\n");
|
mtrerr("Motor already running\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@@ -629,6 +633,7 @@ static int esp_motor_start(struct motor_lowerhalf_s *dev)
|
|||||||
if ((priv->state.state == MOTOR_STATE_CRITICAL) ||
|
if ((priv->state.state == MOTOR_STATE_CRITICAL) ||
|
||||||
(priv->state.state == MOTOR_STATE_FAULT))
|
(priv->state.state == MOTOR_STATE_FAULT))
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Motor is in fault state\n");
|
mtrerr("Motor is in fault state\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@@ -636,6 +641,7 @@ static int esp_motor_start(struct motor_lowerhalf_s *dev)
|
|||||||
ret = esp_motor_pwm_config(priv);
|
ret = esp_motor_pwm_config(priv);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Failed setting PWM configuration\n");
|
mtrerr("Failed setting PWM configuration\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -655,6 +661,7 @@ static int esp_motor_start(struct motor_lowerhalf_s *dev)
|
|||||||
ret = esp_motor_set_duty_cycle(priv, duty);
|
ret = esp_motor_set_duty_cycle(priv, duty);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Failed starting motor\n");
|
mtrerr("Failed starting motor\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -1022,6 +1029,7 @@ static int esp_motor_fault_configure(struct mcpwm_motor_lowerhalf_s *lower,
|
|||||||
flags = spin_lock_irqsave(&g_mcpwm_common.mcpwm_spinlock);
|
flags = spin_lock_irqsave(&g_mcpwm_common.mcpwm_spinlock);
|
||||||
if (!enable)
|
if (!enable)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mcpwm_ll_fault_enable_detection(hal->dev, lower->fault_id, false);
|
mcpwm_ll_fault_enable_detection(hal->dev, lower->fault_id, false);
|
||||||
mcpwm_ll_intr_enable(hal->dev,
|
mcpwm_ll_intr_enable(hal->dev,
|
||||||
MCPWM_LL_EVENT_FAULT_ENTER(lower->fault_id),
|
MCPWM_LL_EVENT_FAULT_ENTER(lower->fault_id),
|
||||||
|
|||||||
@@ -454,6 +454,7 @@ static int esp_motor_setup(struct motor_lowerhalf_s *dev)
|
|||||||
if ((priv->state.state == MOTOR_STATE_FAULT) ||
|
if ((priv->state.state == MOTOR_STATE_FAULT) ||
|
||||||
(priv->state.state == MOTOR_STATE_CRITICAL))
|
(priv->state.state == MOTOR_STATE_CRITICAL))
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Motor is in fault state. Clear faults first\n");
|
mtrerr("Motor is in fault state. Clear faults first\n");
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
@@ -579,6 +580,7 @@ static int esp_motor_stop(struct motor_lowerhalf_s *dev)
|
|||||||
flags = spin_lock_irqsave(&g_mcpwm_common.mcpwm_spinlock);
|
flags = spin_lock_irqsave(&g_mcpwm_common.mcpwm_spinlock);
|
||||||
if (priv->state.state == MOTOR_STATE_IDLE)
|
if (priv->state.state == MOTOR_STATE_IDLE)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Motor already stopped\n");
|
mtrerr("Motor already stopped\n");
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
@@ -595,6 +597,7 @@ static int esp_motor_stop(struct motor_lowerhalf_s *dev)
|
|||||||
ret = esp_motor_set_duty_cycle(priv, 0.0);
|
ret = esp_motor_set_duty_cycle(priv, 0.0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Failed setting duty cycle to 0 on stop: %d\n", ret);
|
mtrerr("Failed setting duty cycle to 0 on stop: %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -649,6 +652,7 @@ static int esp_motor_start(struct motor_lowerhalf_s *dev)
|
|||||||
flags = spin_lock_irqsave(&g_mcpwm_common.mcpwm_spinlock);
|
flags = spin_lock_irqsave(&g_mcpwm_common.mcpwm_spinlock);
|
||||||
if (priv->state.state == MOTOR_STATE_RUN)
|
if (priv->state.state == MOTOR_STATE_RUN)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Motor already running\n");
|
mtrerr("Motor already running\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@@ -656,6 +660,7 @@ static int esp_motor_start(struct motor_lowerhalf_s *dev)
|
|||||||
if ((priv->state.state == MOTOR_STATE_CRITICAL) ||
|
if ((priv->state.state == MOTOR_STATE_CRITICAL) ||
|
||||||
(priv->state.state == MOTOR_STATE_FAULT))
|
(priv->state.state == MOTOR_STATE_FAULT))
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Motor is in fault state\n");
|
mtrerr("Motor is in fault state\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@@ -663,6 +668,7 @@ static int esp_motor_start(struct motor_lowerhalf_s *dev)
|
|||||||
ret = esp_motor_pwm_config(priv);
|
ret = esp_motor_pwm_config(priv);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Failed setting PWM configuration\n");
|
mtrerr("Failed setting PWM configuration\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -682,6 +688,7 @@ static int esp_motor_start(struct motor_lowerhalf_s *dev)
|
|||||||
ret = esp_motor_set_duty_cycle(priv, duty);
|
ret = esp_motor_set_duty_cycle(priv, duty);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
mtrerr("Failed starting motor\n");
|
mtrerr("Failed starting motor\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -1056,6 +1063,7 @@ static int esp_motor_fault_configure(struct mcpwm_motor_lowerhalf_s *lower,
|
|||||||
mcpwm_ll_intr_enable(hal->dev,
|
mcpwm_ll_intr_enable(hal->dev,
|
||||||
MCPWM_LL_EVENT_FAULT_EXIT(lower->fault_id),
|
MCPWM_LL_EVENT_FAULT_EXIT(lower->fault_id),
|
||||||
false);
|
false);
|
||||||
|
spin_unlock_irqrestore(&g_mcpwm_common.mcpwm_spinlock, flags);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user