summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVamsi Krishna Samavedam <vskrishn@codeaurora.org>2017-01-31 17:21:23 -0800
committerVamsi Krishna Samavedam <vskrishn@codeaurora.org>2017-02-01 21:36:04 -0800
commit4a4acb8a9e4701a45460f562c8de445cbea9e508 (patch)
tree768c3180d414bca34e823794b307e69f12c2849d
parente8869713e5633fffa6a5c844bafaa60345a297fe (diff)
USB: dwc3-msm: Add sysfs entry to manually set speed
In some cases it is useful to manually force the controller to run at certain speeds (USB 2.0 or USB 3.0 speeds). For example, EUD (Emebedded USB Debug) can only work when controller is operating in USB 2.0 speeds. User can force USB 2.0 if EUD is required. Change-Id: Id022f372014a9218537bd1b5477d4555aff4578c Signed-off-by: Vamsi Krishna Samavedam <vskrishn@codeaurora.org>
-rw-r--r--drivers/usb/dwc3/dwc3-msm.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c
index e3848b885b95..211e1945962c 100644
--- a/drivers/usb/dwc3/dwc3-msm.c
+++ b/drivers/usb/dwc3/dwc3-msm.c
@@ -2754,6 +2754,39 @@ static ssize_t mode_store(struct device *dev, struct device_attribute *attr,
}
static DEVICE_ATTR_RW(mode);
+
+static ssize_t speed_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ struct dwc3_msm *mdwc = dev_get_drvdata(dev);
+ struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3);
+
+ return snprintf(buf, PAGE_SIZE, "%s",
+ usb_speed_string(dwc->max_hw_supp_speed));
+}
+
+static ssize_t speed_store(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct dwc3_msm *mdwc = dev_get_drvdata(dev);
+ struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3);
+ enum usb_device_speed req_speed = USB_SPEED_UNKNOWN;
+
+ if (sysfs_streq(buf, "high"))
+ req_speed = USB_SPEED_HIGH;
+ else if (sysfs_streq(buf, "super"))
+ req_speed = USB_SPEED_SUPER;
+
+ if (req_speed != USB_SPEED_UNKNOWN &&
+ req_speed != dwc->max_hw_supp_speed) {
+ dwc->maximum_speed = dwc->max_hw_supp_speed = req_speed;
+ schedule_work(&mdwc->restart_usb_work);
+ }
+
+ return count;
+}
+static DEVICE_ATTR_RW(speed);
+
static void msm_dwc3_perf_vote_work(struct work_struct *w);
static int dwc3_msm_probe(struct platform_device *pdev)
@@ -3097,6 +3130,7 @@ static int dwc3_msm_probe(struct platform_device *pdev)
}
device_create_file(&pdev->dev, &dev_attr_mode);
+ device_create_file(&pdev->dev, &dev_attr_speed);
host_mode = usb_get_dr_mode(&mdwc->dwc3->dev) == USB_DR_MODE_HOST;
if (!dwc->is_drd && host_mode) {