]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/phy/tegra/xusb.c
phy: tegra: xusb: Parse dual-role mode property
[linux.git] / drivers / phy / tegra / xusb.c
index e3bc60cfe6a194fc3070db9e94c243f5850c0c53..57a2d08ef6daca315b20db625b9c0354367e1980 100644 (file)
@@ -546,13 +546,34 @@ static void tegra_xusb_port_unregister(struct tegra_xusb_port *port)
        device_unregister(&port->dev);
 }
 
+static const char *const modes[] = {
+       [USB_DR_MODE_UNKNOWN] = "",
+       [USB_DR_MODE_HOST] = "host",
+       [USB_DR_MODE_PERIPHERAL] = "peripheral",
+       [USB_DR_MODE_OTG] = "otg",
+};
+
 static int tegra_xusb_usb2_port_parse_dt(struct tegra_xusb_usb2_port *usb2)
 {
        struct tegra_xusb_port *port = &usb2->base;
        struct device_node *np = port->dev.of_node;
+       const char *mode;
 
        usb2->internal = of_property_read_bool(np, "nvidia,internal");
 
+       if (!of_property_read_string(np, "mode", &mode)) {
+               int err = match_string(modes, ARRAY_SIZE(modes), mode);
+               if (err < 0) {
+                       dev_err(&port->dev, "invalid value %s for \"mode\"\n",
+                               mode);
+                       usb2->mode = USB_DR_MODE_UNKNOWN;
+               } else {
+                       usb2->mode = err;
+               }
+       } else {
+               usb2->mode = USB_DR_MODE_HOST;
+       }
+
        usb2->supply = devm_regulator_get(&port->dev, "vbus");
        return PTR_ERR_OR_ZERO(usb2->supply);
 }