Hi,

 Below some patch for intel_mid_i2s driver that removes the unnecessary checks 
on driver data flags (that was more debug code) and the corresponding 
mutex_locks so user can call read/write functions in atomic context.

Best regards,
Louis


>From da463c4ee7b253f092109dd89eabf0bb0bd108ff Mon Sep 17 00:00:00 2001
From: Louis LE GALL <[email protected]>
Date: Tue, 26 Oct 2010 17:26:48 +0200
Subject: [PATCH] Remove unnecessary mutex in intel_mid_i2s
 Signed-off-by: Louis LE GALL <[email protected]>

---
 sound/pci/intel_mid_i2s/intel_mid_i2s.c |   48 +-----------------------------
 1 files changed, 2 insertions(+), 46 deletions(-)

diff --git a/sound/pci/intel_mid_i2s/intel_mid_i2s.c 
b/sound/pci/intel_mid_i2s/intel_mid_i2s.c
index 572abde..121faf6 100644
--- a/sound/pci/intel_mid_i2s/intel_mid_i2s.c
+++ b/sound/pci/intel_mid_i2s/intel_mid_i2s.c
@@ -385,33 +385,19 @@ int intel_mid_i2s_rd_req(struct intel_mid_i2s_hdl 
*drv_data, u32 *destination, s
        WARN(!drv_data, "Driver data=NULL\n");
        if (!drv_data)
                return -EFAULT;
-       mutex_lock(&drv_data->mutex);
        if (!rxchan) {
                dev_WARN(&(drv_data->pdev->dev), "rd_req FAILED no rxchan\n");
-               mutex_unlock(&drv_data->mutex);
                return -EINVAL;
        }
        if (!len) {
                dev_WARN(&drv_data->pdev->dev, "rd req invalid len=0");
-               mutex_unlock(&drv_data->mutex);
                return -EINVAL;
        }
-       if (!test_bit(I2S_PORT_OPENED, &drv_data->flags)) {
-               dev_WARN(&drv_data->pdev->dev, "RD reject I2S_PORT NOT_OPENED");
-               mutex_unlock(&drv_data->mutex);
-               return -EPERM;
-       }
-       if (test_bit(I2S_PORT_CLOSING, &drv_data->flags)) {
-               dev_WARN(&drv_data->pdev->dev, "RD reject I2S_PORT CLOSING");
-               mutex_unlock(&drv_data->mutex);
-               return -EPIPE;
-       }
 
        dev_dbg(&drv_data->pdev->dev, "I2S_READ() dst=%p, len=%d, drv_data=%p", 
destination, len, drv_data);
        dst = dma_map_single(NULL, destination, len, DMA_FROM_DEVICE);
        if (!dst) {
                dev_WARN(&drv_data->pdev->dev, "can't map DMA address %p", 
destination);
-               mutex_unlock(&drv_data->mutex);
                return -ENOMEM;
        }
 
@@ -432,14 +418,12 @@ int intel_mid_i2s_rd_req(struct intel_mid_i2s_hdl 
*drv_data, u32 *destination, s
                        flag);          /* Flag */
        if (!rxdesc) {
                dev_WARN(&drv_data->pdev->dev, "can not prep dma memcpy");
-               mutex_unlock(&drv_data->mutex);
                return -EFAULT;
        }
        /* Only 1 READ at a time allowed. do it at end to avoid clear&wakeup*/
        if (test_and_set_bit(I2S_PORT_READ_BUSY, &drv_data->flags)) {
                dma_unmap_single(NULL, dst, len, DMA_FROM_DEVICE);
                dev_WARN(&drv_data->pdev->dev, "RD reject I2S_PORT READ_BUSY");
-               mutex_unlock(&drv_data->mutex);
                return -EBUSY;
        }
        dev_dbg(&(drv_data->pdev->dev), "RD dma tx submit\n");
@@ -447,7 +431,6 @@ int intel_mid_i2s_rd_req(struct intel_mid_i2s_hdl 
*drv_data, u32 *destination, s
        drv_data->read_param = param;
        rxdesc->callback_param = drv_data;
        rxdesc->tx_submit(rxdesc);
-       mutex_unlock(&drv_data->mutex);
        return 0;
 }
 EXPORT_SYMBOL_GPL(intel_mid_i2s_rd_req);
@@ -472,34 +455,20 @@ int intel_mid_i2s_wr_req(struct intel_mid_i2s_hdl 
*drv_data, u32 *source, size_t
        WARN(!drv_data, "Driver data=NULL\n");
        if (!drv_data)
                return -EFAULT;
-       mutex_lock(&drv_data->mutex);
        if (!txchan) {
                dev_WARN(&(drv_data->pdev->dev), "wr_req but no txchan\n");
-               mutex_unlock(&drv_data->mutex);
                return -EINVAL;
        }
        if (!len) {
                dev_WARN(&drv_data->pdev->dev, "invalid len 0");
-               mutex_unlock(&drv_data->mutex);
                return -EINVAL;
        }
-       if (!test_bit(I2S_PORT_OPENED, &drv_data->flags)) {
-               dev_WARN(&drv_data->pdev->dev, "WR reject I2S_PORT NOT_OPENED");
-               mutex_unlock(&drv_data->mutex);
-               return -EPERM;
-       }
-       if (test_bit(I2S_PORT_CLOSING, &drv_data->flags)) {
-               dev_WARN(&drv_data->pdev->dev, "WR reject I2S_PORT CLOSING");
-               mutex_unlock(&drv_data->mutex);
-               return -EPIPE;
-       }
 
        dev_dbg(&drv_data->pdev->dev, "I2S_WRITE() src=%p, len=%d, 
drv_data=%p", source, len, drv_data);
 
        src = dma_map_single(NULL, source, len, DMA_TO_DEVICE);
        if (!src) {
                dev_WARN(&drv_data->pdev->dev, "can't map DMA address %p", 
source);
-               mutex_unlock(&drv_data->mutex);
                return -EFAULT;
        }
        drv_data->write_src = src;
@@ -520,7 +489,6 @@ int intel_mid_i2s_wr_req(struct intel_mid_i2s_hdl 
*drv_data, u32 *source, size_t
                dev_WARN(&(drv_data->pdev->dev),
                        "wr_req dma memcpy FAILED(src=%08x,len=%d,txchan=%p)\n",
                        src, len, txchan);
-               mutex_unlock(&drv_data->mutex);
                return -1;
        }
        dev_dbg(&(drv_data->pdev->dev), "WR dma tx summit\n");
@@ -528,7 +496,6 @@ int intel_mid_i2s_wr_req(struct intel_mid_i2s_hdl 
*drv_data, u32 *source, size_t
        if (test_and_set_bit(I2S_PORT_WRITE_BUSY, &drv_data->flags)) {
                dma_unmap_single(NULL, src, len, DMA_TO_DEVICE);
                dev_WARN(&drv_data->pdev->dev, "WR reject I2S_PORT WRITE_BUSY");
-               mutex_unlock(&drv_data->mutex);
                return -EBUSY;
        }
        txdesc->callback = i2s_write_done;
@@ -536,7 +503,6 @@ int intel_mid_i2s_wr_req(struct intel_mid_i2s_hdl 
*drv_data, u32 *source, size_t
        txdesc->callback_param = drv_data;
        txdesc->tx_submit(txdesc);
        dev_dbg(&(drv_data->pdev->dev), "wr dma req programmed\n");
-       mutex_unlock(&drv_data->mutex);
        return 0;
 }
 EXPORT_SYMBOL_GPL(intel_mid_i2s_wr_req);
@@ -721,7 +687,6 @@ static void i2s_read_done(void *arg)
        WARN(!drv_data, "Driver data=NULL\n");
        if (!drv_data)
                return;
-       mutex_lock(&drv_data->mutex);
        if (!test_bit(I2S_PORT_READ_BUSY, &drv_data->flags))
                dev_WARN(&drv_data->pdev->dev, "spurious read dma complete");
 
@@ -738,12 +703,8 @@ static void i2s_read_done(void *arg)
         */
        clear_bit(I2S_PORT_READ_BUSY, &drv_data->flags);
        wake_up(&drv_data->wq_chan_closing);
-       if (test_bit(I2S_PORT_CLOSING, &drv_data->flags)) {
-               dev_dbg(&drv_data->pdev->dev, "read done waking up close");
-               mutex_unlock(&drv_data->mutex);
+       if (test_bit(I2S_PORT_CLOSING, &drv_data->flags))
                return;
-       }
-       mutex_unlock(&drv_data->mutex);
        if (drv_data->read_callback != NULL)
                status = drv_data->read_callback(param_complete);
        else
@@ -768,7 +729,6 @@ static void i2s_write_done(void *arg)
        WARN(!drv_data, "Driver data=NULL\n");
        if (!drv_data)
                return;
-       mutex_lock(&drv_data->mutex);
        if (!test_bit(I2S_PORT_WRITE_BUSY, &drv_data->flags))
                dev_warn(&drv_data->pdev->dev, "spurious write dma complete");
        dma_unmap_single(NULL, drv_data->read_dst,
@@ -784,12 +744,8 @@ static void i2s_write_done(void *arg)
         */
        clear_bit(I2S_PORT_WRITE_BUSY, &drv_data->flags);
        wake_up(&drv_data->wq_chan_closing);
-       if (test_bit(I2S_PORT_CLOSING, &drv_data->flags)) {
-               mutex_unlock(&drv_data->mutex);
-               dev_dbg(&drv_data->pdev->dev, "write done waking up close");
+       if (test_bit(I2S_PORT_CLOSING, &drv_data->flags))
                return;
-       }
-       mutex_unlock(&drv_data->mutex);
        if (drv_data->write_callback != NULL)
                status = drv_data->write_callback(param_complete);
        else
-- 
1.7.2.3

---------------------------------------------------------------------
Intel Corporation SAS (French simplified joint stock company)
Registered headquarters: "Les Montalets"- 2, rue de Paris, 
92196 Meudon Cedex, France
Registration Number:  302 456 199 R.C.S. NANTERRE
Capital: 4,572,000 Euros

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.

Attachment: 0001-Remove-unnecessary-mutex-in-intel_mid_i2s.patch
Description: 0001-Remove-unnecessary-mutex-in-intel_mid_i2s.patch

_______________________________________________
Meego-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to