Staging: comedi: dyna_pci10xx: replace semaphore with mutex
PATCH 1/1 Staging: comedi: dyna_pci10xx: replace semaphore with mutex
- Replace all semaphores with mutex
- Check NULL value for devpriv during detach callback
Signed-off-by Prashant P. Shah <[email protected]>
--- drivers/staging/comedi/drivers/dyna_pci10xx.c | 24 +++++++++++------------- 1 files changed, 11 insertions(+), 13 deletions(-)
drivers/staging/comedi/drivers/dyna_pci10xx.c +11 -13
@@ -39,7 +39,7 @@#include "../comedidev.h" #include "comedi_pci.h" -#include <linux/semaphore.h> +#include <linux/mutex.h> #define PCI_VENDOR_ID_DYNALOG 0x10b5#define DRV_NAME "dyna_pci10xx"
@@ -126,7 +126,7 @@ static struct comedi_driver driver_dyna_pci10xx = {struct dyna_pci10xx_private {struct pci_dev *pci_dev;/* ptr to PCI device */ char valid;/* card is usable */ -struct semaphore sem; +struct mutex mutex;/* device base address registers */ unsigned long BADR0, BADR1, BADR2, BADR3, BADR4, BADR5;
@@ -152,7 +152,7 @@ static int dyna_pci10xx_insn_read_ai(struct comedi_device *dev, chan =CR_CHAN (insn->chanspec); range = thisboard->range_codes_ai[CR_RANGE ((insn->chanspec))]; -down (&devpriv->sem); +mutex_lock (&devpriv->mutex);/* convert n samples */ for (n =0 ; n < insn->n; n++) {/* trigger conversion */
@@ -176,7 +176,7 @@ conv_finish: d &=0x0FFF ; data[n] = d; } -up (&devpriv->sem); +mutex_unlock (&devpriv->mutex);/* return the number of samples read/written */ return n;
@@ -193,13 +193,13 @@ static int dyna_pci10xx_insn_write_ao(struct comedi_device *dev, chan =CR_CHAN (insn->chanspec); range = thisboard->range_codes_ai[CR_RANGE ((insn->chanspec))]; -down (&devpriv->sem); +mutex_lock (&devpriv->mutex);for (n =0 ; n < insn->n; n++) {/* trigger conversion and write data */ outw_p (data[n], devpriv->BADR2);smp_mb ();udelay (10 ); } -up (&devpriv->sem); +mutex_unlock (&devpriv->mutex);return n; }
@@ -213,11 +213,11 @@ static int dyna_pci10xx_di_insn_bits(struct comedi_device *dev,if (insn->n !=2 )return -EINVAL ; -down (&devpriv->sem); +mutex_lock (&devpriv->mutex);smp_mb (); d =inw_p (devpriv->BADR3);udelay (10 ); -up (&devpriv->sem); +mutex_unlock (&devpriv->mutex);/* on return the data[0] contains output and data[1] contains input */ data[1 ] = d;
@@ -238,15 +238,13 @@ static int dyna_pci10xx_do_insn_bits(struct comedi_device *dev,* in data[1], each channel cooresponding to a bit. * s->state contains the previous write data */ - +mutex_lock (&devpriv->mutex);if (data[0 ]) { -down (&devpriv->sem); s->state &= ~data[0 ]; s->state |= (data[0 ] & data[1 ]);smp_mb ();outw_p (s->state, devpriv->BADR3);udelay (10 ); -up (&devpriv->sem); }/*
@@ -255,7 +253,7 @@ static int dyna_pci10xx_do_insn_bits(struct comedi_device *dev,* output values if it was a purely digital output subdevice. */ data[1 ] = s->state; - +mutex_unlock (&devpriv->mutex);return 2 ; }
@@ -339,7 +337,7 @@ found:return -EIO ; } -sema_init (&devpriv->sem,1 ); +mutex_init (&devpriv->mutex); dev->board_ptr = &boardtypes[board_index]; devpriv->pci_dev = pcidev;
Signature · 1 line
1.7.1
drivers/staging/comedi/drivers/dyna_pci10xx.c found: · line 342
Quoted 4 lines · Prashant P. Shah
drivers/staging/comedi/drivers/dyna_pci10xx.c +1
-1-sema_init (&devpriv->sem,1 ); +mutex_init (&devpriv->mutex); dev->board_ptr = &boardtypes[board_index]; devpriv->pci_dev = pcidev;
You could call mutex_destroy() in your _detach routine as well. It's used for debugging mutexes:
static int dyna_pci10xx_detach(struct comedi_device *dev)
{
if (devpriv && devpriv->pci_dev) {
comedi_pci_disable(devpriv->pci_dev);
mutex_destroy(&devpriv->mutex);
}
return 0;
}Signature · 2 lines
-=( Ian Abbott @ MEV Ltd. E-mail: <[email protected]> )=- -=( Tel: +44 (0)161 477 1898 FAX: +44 (0)161 718 3587 )=-
Hi,
I am resending the patches again. Cleaned up the code a bit and removed unwanted delays.
Regards.