aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging/comedi/drivers/usbdux.c
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-07-25 16:07:39 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-07-26 15:10:00 -0700
commit81e8013484ae0790c7819aa9e08b265807eb6905 (patch)
tree5c243e272659476d54e278579015074cef34c60b /drivers/staging/comedi/drivers/usbdux.c
parent96ca37047e774c48cbf5ccf4e6d18e8cf5898dcd (diff)
staging: comedi: usbdux: fix usbdux_pwm_start()
Add the missing down/up of the semaphore to prevent other commands from being issued to the usb device while the pwn is being stopped. Rename the local variable used for the private data pointer to the comedi "norm". Use memset() to initialize the urb transfer buffer. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/comedi/drivers/usbdux.c')
-rw-r--r--drivers/staging/comedi/drivers/usbdux.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c
index 14c26e559cb..0337da1f36f 100644
--- a/drivers/staging/comedi/drivers/usbdux.c
+++ b/drivers/staging/comedi/drivers/usbdux.c
@@ -1544,34 +1544,34 @@ static int usbdux_pwm_period(struct comedi_device *dev,
return 0;
}
-/* is called from insn so there's no need to do all the sanity checks */
static int usbdux_pwm_start(struct comedi_device *dev,
struct comedi_subdevice *s)
{
- int ret, i;
- struct usbdux_private *this_usbduxsub = dev->private;
+ struct usbdux_private *devpriv = dev->private;
+ int ret = 0;
- if (this_usbduxsub->pwm_cmd_running) {
- /* already running */
- return 0;
- }
+ down(&devpriv->sem);
+
+ if (devpriv->pwm_cmd_running)
+ goto pwm_start_exit;
- this_usbduxsub->dux_commands[1] = ((int8_t) this_usbduxsub->pwn_delay);
+ devpriv->dux_commands[1] = devpriv->pwn_delay;
ret = send_dux_commands(dev, SENDPWMON);
if (ret < 0)
- return ret;
+ goto pwm_start_exit;
/* initialise the buffer */
- for (i = 0; i < this_usbduxsub->size_pwm_buf; i++)
- ((char *)(this_usbduxsub->urb_pwm->transfer_buffer))[i] = 0;
+ memset(devpriv->urb_pwm->transfer_buffer, 0, devpriv->size_pwm_buf);
- this_usbduxsub->pwm_cmd_running = 1;
+ devpriv->pwm_cmd_running = 1;
ret = usbduxsub_submit_pwm_urbs(dev);
- if (ret < 0) {
- this_usbduxsub->pwm_cmd_running = 0;
- return ret;
- }
- return 0;
+ if (ret < 0)
+ devpriv->pwm_cmd_running = 0;
+
+pwm_start_exit:
+ up(&devpriv->sem);
+
+ return ret;
}
/* generates the bit pattern for PWM with the optional sign bit */