]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/usb/renesas_usbhs/common.c
usb: gadget: renesas_usbhs: add mod_host support
[mirror_ubuntu-artful-kernel.git] / drivers / usb / renesas_usbhs / common.c
index 1161d78e16652b24efde37acabe417a1211ef8d4..c3aef40fa9e581ba49ccc4f170fef45b541b96b3 100644 (file)
@@ -181,6 +181,13 @@ void usbhs_usbreq_set_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req)
  */
 void usbhs_bus_send_sof_enable(struct usbhs_priv *priv)
 {
+       u16 status = usbhs_read(priv, DVSTCTR) & (USBRST | UACT);
+
+       if (status != USBRST) {
+               struct device *dev = usbhs_priv_to_dev(priv);
+               dev_err(dev, "usbhs should be reset\n");
+       }
+
        usbhs_bset(priv, DVSTCTR, (USBRST | UACT), UACT);
 }
 
@@ -219,6 +226,48 @@ static void usbhsc_bus_init(struct usbhs_priv *priv)
        usbhs_vbus_ctrl(priv, 0);
 }
 
+/*
+ *             device configuration
+ */
+int usbhs_set_device_speed(struct usbhs_priv *priv, int devnum,
+                          u16 upphub, u16 hubport, u16 speed)
+{
+       struct device *dev = usbhs_priv_to_dev(priv);
+       u16 usbspd = 0;
+       u32 reg = DEVADD0 + (2 * devnum);
+
+       if (devnum > 10) {
+               dev_err(dev, "cannot set speed to unknown device %d\n", devnum);
+               return -EIO;
+       }
+
+       if (upphub > 0xA) {
+               dev_err(dev, "unsupported hub number %d\n", upphub);
+               return -EIO;
+       }
+
+       switch (speed) {
+       case USB_SPEED_LOW:
+               usbspd = USBSPD_SPEED_LOW;
+               break;
+       case USB_SPEED_FULL:
+               usbspd = USBSPD_SPEED_FULL;
+               break;
+       case USB_SPEED_HIGH:
+               usbspd = USBSPD_SPEED_HIGH;
+               break;
+       default:
+               dev_err(dev, "unsupported speed %d\n", speed);
+               return -EIO;
+       }
+
+       usbhs_write(priv, reg,  UPPHUB(upphub)  |
+                               HUBPORT(hubport)|
+                               USBSPD(usbspd));
+
+       return 0;
+}
+
 /*
  *             local functions
  */