Commit d760557d authored by Johan Hovold's avatar Johan Hovold
Browse files

USB: serial: mos7720: clean up mcs7715 port setup



Clean up the mcs7715 port setup by using the new endpoint-remap
functionality provided by core. Instead of poking around in internal
port-structure fields, simply swap the endpoint descriptors of the two
ports in calc_num_ports before the port structures are even allocated.

Note that we still need to override the default interrupt completion
handler.

Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
parent 772b2c5d
Loading
Loading
Loading
Loading
+20 −32
Original line number Original line Diff line number Diff line
@@ -977,8 +977,20 @@ static int mos77xx_calc_num_ports(struct usb_serial *serial,
					struct usb_serial_endpoints *epds)
					struct usb_serial_endpoints *epds)
{
{
	u16 product = le16_to_cpu(serial->dev->descriptor.idProduct);
	u16 product = le16_to_cpu(serial->dev->descriptor.idProduct);
	if (product == MOSCHIP_DEVICE_ID_7715)

	if (product == MOSCHIP_DEVICE_ID_7715) {
		/*
		 * The 7715 uses the first bulk in/out endpoint pair for the
		 * parallel port, and the second for the serial port. We swap
		 * the endpoint descriptors here so that the the first and
		 * only registered port structure uses the serial-port
		 * endpoints.
		 */
		swap(epds->bulk_in[0], epds->bulk_in[1]);
		swap(epds->bulk_out[0], epds->bulk_out[1]);

		return 1;
		return 1;
	}


	return 2;
	return 2;
}
}
@@ -1904,46 +1916,22 @@ static int mos7720_startup(struct usb_serial *serial)
	product = le16_to_cpu(serial->dev->descriptor.idProduct);
	product = le16_to_cpu(serial->dev->descriptor.idProduct);
	dev = serial->dev;
	dev = serial->dev;


	/*
	/* setting configuration feature to one */
	 * The 7715 uses the first bulk in/out endpoint pair for the parallel
	usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
	 * port, and the second for the serial port.  Because the usbserial core
			(__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000);
	 * assumes both pairs are serial ports, we must engage in a bit of

	 * subterfuge and swap the pointers for ports 0 and 1 in order to make
	 * port 0 point to the serial port.  However, both moschip devices use a
	 * single interrupt-in endpoint for both ports (as mentioned a little
	 * further down), and this endpoint was assigned to port 0.  So after
	 * the swap, we must copy the interrupt endpoint elements from port 1
	 * (as newly assigned) to port 0, and null out port 1 pointers.
	 */
	if (product == MOSCHIP_DEVICE_ID_7715) {
	if (product == MOSCHIP_DEVICE_ID_7715) {
		struct usb_serial_port *tmp = serial->port[0];
		serial->port[0] = serial->port[1];
		serial->port[1] = tmp;
		serial->port[0]->interrupt_in_urb = tmp->interrupt_in_urb;
		serial->port[0]->interrupt_in_buffer = tmp->interrupt_in_buffer;
		serial->port[0]->interrupt_in_endpointAddress =
			tmp->interrupt_in_endpointAddress;
		serial->port[1]->interrupt_in_urb = NULL;
		serial->port[1]->interrupt_in_buffer = NULL;

		if (serial->port[0]->interrupt_in_urb) {
		struct urb *urb = serial->port[0]->interrupt_in_urb;
		struct urb *urb = serial->port[0]->interrupt_in_urb;


		if (urb)
			urb->complete = mos7715_interrupt_callback;
			urb->complete = mos7715_interrupt_callback;
		}
	}

	/* setting configuration feature to one */
	usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
			(__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000);


#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
	if (product == MOSCHIP_DEVICE_ID_7715) {
		ret_val = mos7715_parport_init(serial);
		ret_val = mos7715_parport_init(serial);
		if (ret_val < 0)
		if (ret_val < 0)
			return ret_val;
			return ret_val;
	}
#endif
#endif
	}
	/* start the interrupt urb */
	/* start the interrupt urb */
	ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL);
	ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL);
	if (ret_val) {
	if (ret_val) {