.shutdown = cp210x_shutdown,
};
+/* Control request types */
+#define REQTYPE_CTL_TO_DEVICE USB_TYPE_VENDOR
+#define REQTYPE_CTL_TO_HOST (USB_DIR_IN|REQTYPE_CTL_TO_DEVICE)
+
/* Config request types */
-#define REQTYPE_HOST_TO_DEVICE 0x41
-#define REQTYPE_DEVICE_TO_HOST 0xc1
+#define REQTYPE_HOST_TO_DEVICE (USB_TYPE_VENDOR|USB_RECIP_INTERFACE)
+#define REQTYPE_DEVICE_TO_HOST (USB_DIR_IN|REQTYPE_HOST_TO_DEVICE)
/* Config SET requests. To GET, add 1 to the request number */
#define CP2101_UART 0x00 /* Enable / Disable */
return make_usb_string(kbuf, klen, str, slen);
}
-/* cp210x_has_setmfg
- * Returns 1 if the CP210X part includes firmware that allows setting the
- * USB MFG descriptor, else 0. As of this writing, no CP210X firmware allows
- * this. SiLabs has suggested this may change in future firmware versions or
- * parts.
- */
-static inline int cp210x_has_setmfg(void)
-{
- return 0;
-}
-
/*
* cp210x_ctlmsg
* A generic usb control message interface.
tbuf = kmalloc(size, GFP_KERNEL);
if (!tbuf)
return -ENOMEM;
- if (requestype & 0x80) {
+ if (requestype & USB_DIR_IN) {
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request,
requestype, value, index, tbuf, size, 300);
if (ret > 0 && size)
/* Instructing the CP210X to reset seems to work more reliably than
* calling usb_reset_device().
*/
- cp210x_ctlmsg(port, 0xff, 0x40, 0x0008, 0x00, NULL, 0);
+ cp210x_ctlmsg(port, 0xff, REQTYPE_CTL_TO_DEVICE,
+ 0x0008, 0x00, NULL, 0);
return 0;
}
_partnum = CP210x_PART_CP2101;
else if (addr == 0x01) {
/* Must query part to determine part number */
- if (cp210x_ctlmsg(port, 0xff, 0xc0, 0x370b, 0x00,
- &_partnum, 1) != 1)
+ if (cp210x_ctlmsg(port, 0xff, REQTYPE_CTL_TO_HOST,
+ 0x370b, 0x00, &_partnum, 1) != 1)
_partnum = CP210x_PART_UNKNOWN;
}
}
static inline int cp210x_setu16(struct usb_serial_port *port, int cmd,
unsigned int value)
{
- return cp210x_ctlmsg(port, 0xff, 0x40, 0x3700 | (cmd & 0xff),
- value, NULL, 0);
+ return cp210x_ctlmsg(port, 0xff, REQTYPE_CTL_TO_DEVICE,
+ 0x3700 | (cmd & 0xff), value, NULL, 0);
}
/*
static int cp210x_setstr(struct usb_serial_port *port, int cmd, char *usbstr)
{
unsigned len = usbstr[0];
- int ret = cp210x_ctlmsg(port, 0xff, 0x40, 0x3700 | (cmd & 0xff), 0,
- usbstr, len);
+ int ret = cp210x_ctlmsg(port, 0xff, REQTYPE_CTL_TO_DEVICE,
+ 0x3700 | (cmd & 0xff), 0, usbstr, len);
dbg("%s - cmd 0x%02x len %d ret %d", __FUNCTION__, cmd, len, ret);
return ret;
}
{
dbg("%s - port %d, gpio = 0x%.2x", __FUNCTION__, port->number, gpio);
- return cp210x_ctlmsg(port, 0xff, 0x40, 0x37e1,
- ((uint16_t)gpio << 8) | GPIO_MASK, NULL, 0);
+ return cp210x_ctlmsg(port, 0xff, REQTYPE_CTL_TO_DEVICE,
+ 0x37e1, ((uint16_t)gpio << 8) | GPIO_MASK, NULL, 0);
}
/* Set select gpio bits */
dbg("%s - port %d, gpiob = 0x%.4x", __FUNCTION__, port->number, gpio);
- /* FIXME: how about REQTYPE_HOST_TO_DEVICE instead of 0x40? */
- return cp210x_ctlmsg(port, 0xff, 0x40, 0x37e1, gpio, NULL, 0);
+ return cp210x_ctlmsg(port, 0xff, REQTYPE_CTL_TO_DEVICE,
+ 0x37e1, gpio, NULL, 0);
}
static int cp210x_gpioget(struct usb_serial_port *port, u8 *gpio)
dbg("%s - port %d", __FUNCTION__, port->number);
- /* FIXME: how about REQTYPE_DEVICE_TO_HOST instead of 0xc0? */
- ret = cp210x_ctlmsg(port, 0xff, 0xc0, 0x00c2, 0, gpio, 1);
+ ret = cp210x_ctlmsg(port, 0xff, REQTYPE_CTL_TO_HOST,
+ 0x00c2, 0, gpio, 1);
dbg("%s - gpio = 0x%.2x (%d)", __FUNCTION__, *gpio, ret);
lconfig.suspend.lowPower = 0;
lconfig.reset.lowPower = 0;
- ret = cp210x_ctlmsg(port, 0xff, 0x40, 0x370c, 0, &lconfig,
- sizeof(struct cp210x_port_config));
+ ret = cp210x_ctlmsg(port, 0xff, REQTYPE_CTL_TO_DEVICE, 0x370c,
+ 0, &lconfig, sizeof(struct cp210x_port_config));
if (ret == sizeof(struct cp210x_port_config))
return 0;
else if (ret >= 0)
dbg("%s", __FUNCTION__);
- ret = cp210x_ctlmsg(port, 0xff, 0xc0, 0x370c, 0, config,
- sizeof(struct cp210x_port_config));
+ ret = cp210x_ctlmsg(port, 0xff, REQTYPE_CTL_TO_HOST,
+ 0x370c, 0, config, sizeof(struct cp210x_port_config));
if (ret == sizeof(struct cp210x_port_config)) {
/* Words from cp210x are MSB */
config->reset.mode = be16_to_cpu(config->reset.mode);
}
break;
- case CP210x_IOCTL_SETMFG:
- if (cp210x_has_setmfg()) {
- char usbstr[USBSTRLEN(CP210x_MAX_MFG_STRLEN)];
- size_t len = cp210x_usbstr_from_user(usbstr, arg,
- sizeof(usbstr));
- if (len && cp210x_setstr(port, 0x00, usbstr) == len)
- return 0;
- }
- return -EFAULT;
- break;
-
case CP210x_IOCTL_SETPRODUCT:
{
char usbstr[USBSTRLEN(CP210x_MAX_PRODUCT_STRLEN)];