if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request)
                mcbsp->pdata->ops->request(id);
 
-       for (i = 0; i < mcbsp->num_clks; i++)
-               clk_enable(mcbsp->clks[i]);
-
        spin_lock(&mcbsp->lock);
        if (!mcbsp->free) {
                dev_err(mcbsp->dev, "McBSP%d is currently in use\n",
        mcbsp->free = 0;
        spin_unlock(&mcbsp->lock);
 
+       for (i = 0; i < mcbsp->num_clks; i++)
+               clk_enable(mcbsp->clks[i]);
+
        /*
         * Enable wakup behavior, smart idle and all wakeups
         * REVISIT: some wakeups may be unnecessary
        if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
                mcbsp->pdata->ops->free(id);
 
-       for (i = mcbsp->num_clks - 1; i >= 0; i--)
-               clk_disable(mcbsp->clks[i]);
-
        spin_lock(&mcbsp->lock);
        if (mcbsp->free) {
                dev_err(mcbsp->dev, "McBSP%d was not reserved\n",
                spin_unlock(&mcbsp->lock);
                return;
        }
+       spin_unlock(&mcbsp->lock);
 
+       for (i = mcbsp->num_clks - 1; i >= 0; i--)
+               clk_disable(mcbsp->clks[i]);
+
+       spin_lock(&mcbsp->lock);
        mcbsp->free = 1;
        spin_unlock(&mcbsp->lock);