The only user of cpdma_control_set (i.e. cpsw_ndo_open) doesn't check the return code, so it doesn't matter, which error triggers. So the checks that are independant of the fields protected by ctlr->lock can be moved out of the critical section. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> --- drivers/net/ethernet/ti/davinci_cpdma.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c index 73638f7a55d4..5ffa04a306c6 100644 --- a/drivers/net/ethernet/ti/davinci_cpdma.c +++ b/drivers/net/ethernet/ti/davinci_cpdma.c @@ -877,23 +877,21 @@ int cpdma_control_set(struct cpdma_ctlr *ctlr, int control, int value) int ret; u32 val; - spin_lock_irqsave(&ctlr->lock, flags); - - ret = -ENOTSUPP; if (!ctlr->params.has_ext_regs) - goto unlock_ret; + return -ENOTSUPP; - ret = -EINVAL; - if (ctlr->state != CPDMA_STATE_ACTIVE) - goto unlock_ret; - - ret = -ENOENT; if (control < 0 || control >= ARRAY_SIZE(controls)) - goto unlock_ret; + return -ENOENT; - ret = -EPERM; if ((info->access & ACCESS_WO) != ACCESS_WO) + return -EPERM; + + spin_lock_irqsave(&ctlr->lock, flags); + + if (ctlr->state != CPDMA_STATE_ACTIVE) { + ret = -EINVAL; goto unlock_ret; + } val = dma_reg_read(ctlr, info->reg); val &= ~(info->mask << info->shift); -- 2.8.1 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html