forked from Minki/linux
Add ioctls to enable and disable local controls on an instrument
These ioctls provide support for the USBTMC-USB488 control requests for REN_CONTROL, GO_TO_LOCAL and LOCAL_LOCKOUT Signed-off-by: Dave Penkler <dpenkler@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
29779d89fd
commit
379d3d33c8
@ -474,6 +474,61 @@ static int usbtmc488_ioctl_read_stb(struct usbtmc_device_data *data,
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int usbtmc488_ioctl_simple(struct usbtmc_device_data *data,
|
||||
void __user *arg, unsigned int cmd)
|
||||
{
|
||||
struct device *dev = &data->intf->dev;
|
||||
__u8 val;
|
||||
u8 *buffer;
|
||||
u16 wValue;
|
||||
int rv;
|
||||
|
||||
if (!(data->usb488_caps & USBTMC488_CAPABILITY_SIMPLE))
|
||||
return -EINVAL;
|
||||
|
||||
buffer = kmalloc(8, GFP_KERNEL);
|
||||
if (!buffer)
|
||||
return -ENOMEM;
|
||||
|
||||
if (cmd == USBTMC488_REQUEST_REN_CONTROL) {
|
||||
rv = copy_from_user(&val, arg, sizeof(val));
|
||||
if (rv) {
|
||||
rv = -EFAULT;
|
||||
goto exit;
|
||||
}
|
||||
wValue = val ? 1 : 0;
|
||||
} else {
|
||||
wValue = 0;
|
||||
}
|
||||
|
||||
rv = usb_control_msg(data->usb_dev,
|
||||
usb_rcvctrlpipe(data->usb_dev, 0),
|
||||
cmd,
|
||||
USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
||||
wValue,
|
||||
data->ifnum,
|
||||
buffer, 0x01, USBTMC_TIMEOUT);
|
||||
if (rv < 0) {
|
||||
dev_err(dev, "simple usb_control_msg failed %d\n", rv);
|
||||
goto exit;
|
||||
} else if (rv != 1) {
|
||||
dev_warn(dev, "simple usb_control_msg returned %d\n", rv);
|
||||
rv = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (buffer[0] != USBTMC_STATUS_SUCCESS) {
|
||||
dev_err(dev, "simple control status returned %x\n", buffer[0]);
|
||||
rv = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
rv = 0;
|
||||
|
||||
exit:
|
||||
kfree(buffer);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sends a REQUEST_DEV_DEP_MSG_IN message on the Bulk-IN endpoint.
|
||||
* @transfer_size: number of bytes to request from the device.
|
||||
@ -1183,6 +1238,21 @@ static long usbtmc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
case USBTMC488_IOCTL_READ_STB:
|
||||
retval = usbtmc488_ioctl_read_stb(data, (void __user *)arg);
|
||||
break;
|
||||
|
||||
case USBTMC488_IOCTL_REN_CONTROL:
|
||||
retval = usbtmc488_ioctl_simple(data, (void __user *)arg,
|
||||
USBTMC488_REQUEST_REN_CONTROL);
|
||||
break;
|
||||
|
||||
case USBTMC488_IOCTL_GOTO_LOCAL:
|
||||
retval = usbtmc488_ioctl_simple(data, (void __user *)arg,
|
||||
USBTMC488_REQUEST_GOTO_LOCAL);
|
||||
break;
|
||||
|
||||
case USBTMC488_IOCTL_LOCAL_LOCKOUT:
|
||||
retval = usbtmc488_ioctl_simple(data, (void __user *)arg,
|
||||
USBTMC488_REQUEST_LOCAL_LOCKOUT);
|
||||
break;
|
||||
}
|
||||
|
||||
skip_io_on_zombie:
|
||||
|
@ -33,6 +33,9 @@
|
||||
#define USBTMC_REQUEST_GET_CAPABILITIES 7
|
||||
#define USBTMC_REQUEST_INDICATOR_PULSE 64
|
||||
#define USBTMC488_REQUEST_READ_STATUS_BYTE 128
|
||||
#define USBTMC488_REQUEST_REN_CONTROL 160
|
||||
#define USBTMC488_REQUEST_GOTO_LOCAL 161
|
||||
#define USBTMC488_REQUEST_LOCAL_LOCKOUT 162
|
||||
|
||||
/* Request values for USBTMC driver's ioctl entry point */
|
||||
#define USBTMC_IOC_NR 91
|
||||
@ -44,6 +47,9 @@
|
||||
#define USBTMC_IOCTL_CLEAR_IN_HALT _IO(USBTMC_IOC_NR, 7)
|
||||
#define USBTMC488_IOCTL_GET_CAPS _IOR(USBTMC_IOC_NR, 17, unsigned char)
|
||||
#define USBTMC488_IOCTL_READ_STB _IOR(USBTMC_IOC_NR, 18, unsigned char)
|
||||
#define USBTMC488_IOCTL_REN_CONTROL _IOW(USBTMC_IOC_NR, 19, unsigned char)
|
||||
#define USBTMC488_IOCTL_GOTO_LOCAL _IO(USBTMC_IOC_NR, 20)
|
||||
#define USBTMC488_IOCTL_LOCAL_LOCKOUT _IO(USBTMC_IOC_NR, 21)
|
||||
|
||||
/* Driver encoded usb488 capabilities */
|
||||
#define USBTMC488_CAPABILITY_TRIGGER 1
|
||||
|
Loading…
Reference in New Issue
Block a user