@@ -1713,6 +1713,32 @@ musb_vbus_show(struct device *dev, struct device_attribute *attr, char *buf)
}
static DEVICE_ATTR(vbus, 0644, musb_vbus_show, musb_vbus_store);
+static ssize_t
+musb_session_store(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t n)
+{
+ struct musb *musb = dev_to_musb(dev);
+ unsigned short session;
+ u8 devctl;
+
+ if (sscanf(buf, "%hu", &session) != 1
+ || ((session != 1) && (session != 0))) {
+ dev_err(dev, "value must be 1 on 0\n");
+ return -EINVAL;
+ }
+
+ devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
+ if (session)
+ devctl |= MUSB_DEVCTL_SESSION;
+ else
+ devctl &= ~MUSB_DEVCTL_SESSION;
+
+ musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
+
+ return n;
+}
+static DEVICE_ATTR(session, 0644, NULL, musb_session_store);
+
#ifdef CONFIG_USB_GADGET_MUSB_HDRC
/* Gadget drivers can't know that a host is connected so they might want
@@ -1813,6 +1839,7 @@ static void musb_free(struct musb *musb)
*/
#ifdef CONFIG_SYSFS
+ device_remove_file(musb->controller, &dev_attr_session);
device_remove_file(musb->controller, &dev_attr_mode);
device_remove_file(musb->controller, &dev_attr_vbus);
#ifdef CONFIG_USB_MUSB_OTG
@@ -2047,6 +2074,7 @@ bad_config:
}
#ifdef CONFIG_SYSFS
+ status = device_create_file(dev, &dev_attr_session);
status = device_create_file(dev, &dev_attr_mode);
status = device_create_file(dev, &dev_attr_vbus);
#ifdef CONFIG_USB_GADGET_MUSB_HDRC
@@ -2061,6 +2089,7 @@ bad_config:
fail2:
#ifdef CONFIG_SYSFS
+ device_remove_file(musb->controller, &dev_attr_session);
device_remove_file(musb->controller, &dev_attr_mode);
device_remove_file(musb->controller, &dev_attr_vbus);
#ifdef CONFIG_USB_MUSB_OTG