Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0655fe9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull USB fixes from Greg KH:
 "Here are some USB fixes and new device ids for 4.1-rc4.

  All are pretty minor, and have been in linux-next successfully"

* tag 'usb-4.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
  usb-storage: Add NO_WP_DETECT quirk for Lacie 059f:0651 devices
  Added another USB product ID for ELAN touchscreen quirks.
  xhci: gracefully handle xhci_irq dead device
  xhci: Solve full event ring by increasing TRBS_PER_SEGMENT to 256
  xhci: fix isoc endpoint dequeue from advancing too far on transaction error
  usb: chipidea: debug: avoid out of bound read
  USB: visor: Match I330 phone more precisely
  USB: pl2303: Remove support for Samsung I330
  USB: cp210x: add ID for KCF Technologies PRN device
  usb: gadget: remove incorrect __init/__exit annotations
  usb: phy: isp1301: work around tps65010 dependency
  usb: gadget: serial: fix re-ordering of tx data
  usb: gadget: hid: Fix static variable usage
  usb: gadget: configfs: Fix interfaces array NULL-termination
  usb: gadget: xilinx: fix devm_ioremap_resource() check
  usb: dwc3: dwc3-omap: correct the register macros
parents dd8edd7e 56919260
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -88,9 +88,13 @@ static ssize_t ci_port_test_write(struct file *file, const char __user *ubuf,
	char buf[32];
	char buf[32];
	int ret;
	int ret;


	if (copy_from_user(buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
	count = min_t(size_t, sizeof(buf) - 1, count);
	if (copy_from_user(buf, ubuf, count))
		return -EFAULT;
		return -EFAULT;


	/* sscanf requires a zero terminated string */
	buf[count] = '\0';

	if (sscanf(buf, "%u", &mode) != 1)
	if (sscanf(buf, "%u", &mode) != 1)
		return -EINVAL;
		return -EINVAL;


+3 −0
Original line number Original line Diff line number Diff line
@@ -106,6 +106,9 @@ static const struct usb_device_id usb_quirk_list[] = {
	{ USB_DEVICE(0x04f3, 0x010c), .driver_info =
	{ USB_DEVICE(0x04f3, 0x010c), .driver_info =
			USB_QUIRK_DEVICE_QUALIFIER },
			USB_QUIRK_DEVICE_QUALIFIER },


	{ USB_DEVICE(0x04f3, 0x0125), .driver_info =
			USB_QUIRK_DEVICE_QUALIFIER },

	{ USB_DEVICE(0x04f3, 0x016f), .driver_info =
	{ USB_DEVICE(0x04f3, 0x016f), .driver_info =
			USB_QUIRK_DEVICE_QUALIFIER },
			USB_QUIRK_DEVICE_QUALIFIER },


+47 −47
Original line number Original line Diff line number Diff line
@@ -65,8 +65,8 @@
#define USBOTGSS_IRQENABLE_SET_MISC		0x003c
#define USBOTGSS_IRQENABLE_SET_MISC		0x003c
#define USBOTGSS_IRQENABLE_CLR_MISC		0x0040
#define USBOTGSS_IRQENABLE_CLR_MISC		0x0040
#define USBOTGSS_IRQMISC_OFFSET			0x03fc
#define USBOTGSS_IRQMISC_OFFSET			0x03fc
#define USBOTGSS_UTMI_OTG_CTRL			0x0080
#define USBOTGSS_UTMI_OTG_STATUS		0x0080
#define USBOTGSS_UTMI_OTG_STATUS		0x0084
#define USBOTGSS_UTMI_OTG_CTRL			0x0084
#define USBOTGSS_UTMI_OTG_OFFSET		0x0480
#define USBOTGSS_UTMI_OTG_OFFSET		0x0480
#define USBOTGSS_TXFIFO_DEPTH			0x0508
#define USBOTGSS_TXFIFO_DEPTH			0x0508
#define USBOTGSS_RXFIFO_DEPTH			0x050c
#define USBOTGSS_RXFIFO_DEPTH			0x050c
@@ -98,20 +98,20 @@
#define USBOTGSS_IRQMISC_DISCHRGVBUS_FALL		(1 << 3)
#define USBOTGSS_IRQMISC_DISCHRGVBUS_FALL		(1 << 3)
#define USBOTGSS_IRQMISC_IDPULLUP_FALL		(1 << 0)
#define USBOTGSS_IRQMISC_IDPULLUP_FALL		(1 << 0)


/* UTMI_OTG_CTRL REGISTER */
#define USBOTGSS_UTMI_OTG_CTRL_DRVVBUS		(1 << 5)
#define USBOTGSS_UTMI_OTG_CTRL_CHRGVBUS		(1 << 4)
#define USBOTGSS_UTMI_OTG_CTRL_DISCHRGVBUS	(1 << 3)
#define USBOTGSS_UTMI_OTG_CTRL_IDPULLUP		(1 << 0)

/* UTMI_OTG_STATUS REGISTER */
/* UTMI_OTG_STATUS REGISTER */
#define USBOTGSS_UTMI_OTG_STATUS_SW_MODE	(1 << 31)
#define USBOTGSS_UTMI_OTG_STATUS_DRVVBUS	(1 << 5)
#define USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT	(1 << 9)
#define USBOTGSS_UTMI_OTG_STATUS_CHRGVBUS	(1 << 4)
#define USBOTGSS_UTMI_OTG_STATUS_TXBITSTUFFENABLE (1 << 8)
#define USBOTGSS_UTMI_OTG_STATUS_DISCHRGVBUS	(1 << 3)
#define USBOTGSS_UTMI_OTG_STATUS_IDDIG		(1 << 4)
#define USBOTGSS_UTMI_OTG_STATUS_IDPULLUP	(1 << 0)
#define USBOTGSS_UTMI_OTG_STATUS_SESSEND	(1 << 3)

#define USBOTGSS_UTMI_OTG_STATUS_SESSVALID	(1 << 2)
/* UTMI_OTG_CTRL REGISTER */
#define USBOTGSS_UTMI_OTG_STATUS_VBUSVALID	(1 << 1)
#define USBOTGSS_UTMI_OTG_CTRL_SW_MODE		(1 << 31)
#define USBOTGSS_UTMI_OTG_CTRL_POWERPRESENT	(1 << 9)
#define USBOTGSS_UTMI_OTG_CTRL_TXBITSTUFFENABLE (1 << 8)
#define USBOTGSS_UTMI_OTG_CTRL_IDDIG		(1 << 4)
#define USBOTGSS_UTMI_OTG_CTRL_SESSEND		(1 << 3)
#define USBOTGSS_UTMI_OTG_CTRL_SESSVALID	(1 << 2)
#define USBOTGSS_UTMI_OTG_CTRL_VBUSVALID	(1 << 1)


struct dwc3_omap {
struct dwc3_omap {
	struct device		*dev;
	struct device		*dev;
@@ -119,7 +119,7 @@ struct dwc3_omap {
	int			irq;
	int			irq;
	void __iomem		*base;
	void __iomem		*base;


	u32			utmi_otg_status;
	u32			utmi_otg_ctrl;
	u32			utmi_otg_offset;
	u32			utmi_otg_offset;
	u32			irqmisc_offset;
	u32			irqmisc_offset;
	u32			irq_eoi_offset;
	u32			irq_eoi_offset;
@@ -153,15 +153,15 @@ static inline void dwc3_omap_writel(void __iomem *base, u32 offset, u32 value)
	writel(value, base + offset);
	writel(value, base + offset);
}
}


static u32 dwc3_omap_read_utmi_status(struct dwc3_omap *omap)
static u32 dwc3_omap_read_utmi_ctrl(struct dwc3_omap *omap)
{
{
	return dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_STATUS +
	return dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_CTRL +
							omap->utmi_otg_offset);
							omap->utmi_otg_offset);
}
}


static void dwc3_omap_write_utmi_status(struct dwc3_omap *omap, u32 value)
static void dwc3_omap_write_utmi_ctrl(struct dwc3_omap *omap, u32 value)
{
{
	dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_STATUS +
	dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_CTRL +
					omap->utmi_otg_offset, value);
					omap->utmi_otg_offset, value);


}
}
@@ -235,25 +235,25 @@ static void dwc3_omap_set_mailbox(struct dwc3_omap *omap,
			}
			}
		}
		}


		val = dwc3_omap_read_utmi_status(omap);
		val = dwc3_omap_read_utmi_ctrl(omap);
		val &= ~(USBOTGSS_UTMI_OTG_STATUS_IDDIG
		val &= ~(USBOTGSS_UTMI_OTG_CTRL_IDDIG
				| USBOTGSS_UTMI_OTG_STATUS_VBUSVALID
				| USBOTGSS_UTMI_OTG_CTRL_VBUSVALID
				| USBOTGSS_UTMI_OTG_STATUS_SESSEND);
				| USBOTGSS_UTMI_OTG_CTRL_SESSEND);
		val |= USBOTGSS_UTMI_OTG_STATUS_SESSVALID
		val |= USBOTGSS_UTMI_OTG_CTRL_SESSVALID
				| USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT;
				| USBOTGSS_UTMI_OTG_CTRL_POWERPRESENT;
		dwc3_omap_write_utmi_status(omap, val);
		dwc3_omap_write_utmi_ctrl(omap, val);
		break;
		break;


	case OMAP_DWC3_VBUS_VALID:
	case OMAP_DWC3_VBUS_VALID:
		dev_dbg(omap->dev, "VBUS Connect\n");
		dev_dbg(omap->dev, "VBUS Connect\n");


		val = dwc3_omap_read_utmi_status(omap);
		val = dwc3_omap_read_utmi_ctrl(omap);
		val &= ~USBOTGSS_UTMI_OTG_STATUS_SESSEND;
		val &= ~USBOTGSS_UTMI_OTG_CTRL_SESSEND;
		val |= USBOTGSS_UTMI_OTG_STATUS_IDDIG
		val |= USBOTGSS_UTMI_OTG_CTRL_IDDIG
				| USBOTGSS_UTMI_OTG_STATUS_VBUSVALID
				| USBOTGSS_UTMI_OTG_CTRL_VBUSVALID
				| USBOTGSS_UTMI_OTG_STATUS_SESSVALID
				| USBOTGSS_UTMI_OTG_CTRL_SESSVALID
				| USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT;
				| USBOTGSS_UTMI_OTG_CTRL_POWERPRESENT;
		dwc3_omap_write_utmi_status(omap, val);
		dwc3_omap_write_utmi_ctrl(omap, val);
		break;
		break;


	case OMAP_DWC3_ID_FLOAT:
	case OMAP_DWC3_ID_FLOAT:
@@ -263,13 +263,13 @@ static void dwc3_omap_set_mailbox(struct dwc3_omap *omap,
	case OMAP_DWC3_VBUS_OFF:
	case OMAP_DWC3_VBUS_OFF:
		dev_dbg(omap->dev, "VBUS Disconnect\n");
		dev_dbg(omap->dev, "VBUS Disconnect\n");


		val = dwc3_omap_read_utmi_status(omap);
		val = dwc3_omap_read_utmi_ctrl(omap);
		val &= ~(USBOTGSS_UTMI_OTG_STATUS_SESSVALID
		val &= ~(USBOTGSS_UTMI_OTG_CTRL_SESSVALID
				| USBOTGSS_UTMI_OTG_STATUS_VBUSVALID
				| USBOTGSS_UTMI_OTG_CTRL_VBUSVALID
				| USBOTGSS_UTMI_OTG_STATUS_POWERPRESENT);
				| USBOTGSS_UTMI_OTG_CTRL_POWERPRESENT);
		val |= USBOTGSS_UTMI_OTG_STATUS_SESSEND
		val |= USBOTGSS_UTMI_OTG_CTRL_SESSEND
				| USBOTGSS_UTMI_OTG_STATUS_IDDIG;
				| USBOTGSS_UTMI_OTG_CTRL_IDDIG;
		dwc3_omap_write_utmi_status(omap, val);
		dwc3_omap_write_utmi_ctrl(omap, val);
		break;
		break;


	default:
	default:
@@ -422,22 +422,22 @@ static void dwc3_omap_set_utmi_mode(struct dwc3_omap *omap)
	struct device_node	*node = omap->dev->of_node;
	struct device_node	*node = omap->dev->of_node;
	int			utmi_mode = 0;
	int			utmi_mode = 0;


	reg = dwc3_omap_read_utmi_status(omap);
	reg = dwc3_omap_read_utmi_ctrl(omap);


	of_property_read_u32(node, "utmi-mode", &utmi_mode);
	of_property_read_u32(node, "utmi-mode", &utmi_mode);


	switch (utmi_mode) {
	switch (utmi_mode) {
	case DWC3_OMAP_UTMI_MODE_SW:
	case DWC3_OMAP_UTMI_MODE_SW:
		reg |= USBOTGSS_UTMI_OTG_STATUS_SW_MODE;
		reg |= USBOTGSS_UTMI_OTG_CTRL_SW_MODE;
		break;
		break;
	case DWC3_OMAP_UTMI_MODE_HW:
	case DWC3_OMAP_UTMI_MODE_HW:
		reg &= ~USBOTGSS_UTMI_OTG_STATUS_SW_MODE;
		reg &= ~USBOTGSS_UTMI_OTG_CTRL_SW_MODE;
		break;
		break;
	default:
	default:
		dev_dbg(omap->dev, "UNKNOWN utmi mode %d\n", utmi_mode);
		dev_dbg(omap->dev, "UNKNOWN utmi mode %d\n", utmi_mode);
	}
	}


	dwc3_omap_write_utmi_status(omap, reg);
	dwc3_omap_write_utmi_ctrl(omap, reg);
}
}


static int dwc3_omap_extcon_register(struct dwc3_omap *omap)
static int dwc3_omap_extcon_register(struct dwc3_omap *omap)
@@ -614,7 +614,7 @@ static int dwc3_omap_suspend(struct device *dev)
{
{
	struct dwc3_omap	*omap = dev_get_drvdata(dev);
	struct dwc3_omap	*omap = dev_get_drvdata(dev);


	omap->utmi_otg_status = dwc3_omap_read_utmi_status(omap);
	omap->utmi_otg_ctrl = dwc3_omap_read_utmi_ctrl(omap);
	dwc3_omap_disable_irqs(omap);
	dwc3_omap_disable_irqs(omap);


	return 0;
	return 0;
@@ -624,7 +624,7 @@ static int dwc3_omap_resume(struct device *dev)
{
{
	struct dwc3_omap	*omap = dev_get_drvdata(dev);
	struct dwc3_omap	*omap = dev_get_drvdata(dev);


	dwc3_omap_write_utmi_status(omap, omap->utmi_otg_status);
	dwc3_omap_write_utmi_ctrl(omap, omap->utmi_otg_ctrl);
	dwc3_omap_enable_irqs(omap);
	dwc3_omap_enable_irqs(omap);


	pm_runtime_disable(dev);
	pm_runtime_disable(dev);
+1 −0
Original line number Original line Diff line number Diff line
@@ -1295,6 +1295,7 @@ static void purge_configs_funcs(struct gadget_info *gi)
			}
			}
		}
		}
		c->next_interface_id = 0;
		c->next_interface_id = 0;
		memset(c->interface, 0, sizeof(c->interface));
		c->superspeed = 0;
		c->superspeed = 0;
		c->highspeed = 0;
		c->highspeed = 0;
		c->fullspeed = 0;
		c->fullspeed = 0;
+14 −2
Original line number Original line Diff line number Diff line
@@ -437,12 +437,20 @@ static int hidg_setup(struct usb_function *f,
		  | USB_REQ_GET_DESCRIPTOR):
		  | USB_REQ_GET_DESCRIPTOR):
		switch (value >> 8) {
		switch (value >> 8) {
		case HID_DT_HID:
		case HID_DT_HID:
		{
			struct hid_descriptor hidg_desc_copy = hidg_desc;

			VDBG(cdev, "USB_REQ_GET_DESCRIPTOR: HID\n");
			VDBG(cdev, "USB_REQ_GET_DESCRIPTOR: HID\n");
			hidg_desc_copy.desc[0].bDescriptorType = HID_DT_REPORT;
			hidg_desc_copy.desc[0].wDescriptorLength =
				cpu_to_le16(hidg->report_desc_length);

			length = min_t(unsigned short, length,
			length = min_t(unsigned short, length,
						   hidg_desc.bLength);
						   hidg_desc_copy.bLength);
			memcpy(req->buf, &hidg_desc, length);
			memcpy(req->buf, &hidg_desc_copy, length);
			goto respond;
			goto respond;
			break;
			break;
		}
		case HID_DT_REPORT:
		case HID_DT_REPORT:
			VDBG(cdev, "USB_REQ_GET_DESCRIPTOR: REPORT\n");
			VDBG(cdev, "USB_REQ_GET_DESCRIPTOR: REPORT\n");
			length = min_t(unsigned short, length,
			length = min_t(unsigned short, length,
@@ -632,6 +640,10 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f)
	hidg_fs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
	hidg_fs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
	hidg_hs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
	hidg_hs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
	hidg_fs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
	hidg_fs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
	/*
	 * We can use hidg_desc struct here but we should not relay
	 * that its content won't change after returning from this function.
	 */
	hidg_desc.desc[0].bDescriptorType = HID_DT_REPORT;
	hidg_desc.desc[0].bDescriptorType = HID_DT_REPORT;
	hidg_desc.desc[0].wDescriptorLength =
	hidg_desc.desc[0].wDescriptorLength =
		cpu_to_le16(hidg->report_desc_length);
		cpu_to_le16(hidg->report_desc_length);
Loading