|
@@ -8,6 +8,7 @@
|
|
|
*/
|
|
|
|
|
|
#include <linux/extcon.h>
|
|
|
+#include <linux/of_graph.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
|
|
|
#include "debug.h"
|
|
@@ -439,17 +440,38 @@ static int dwc3_drd_notifier(struct notifier_block *nb,
|
|
|
return NOTIFY_DONE;
|
|
|
}
|
|
|
|
|
|
+struct extcon_dev *dwc3_get_extcon(struct dwc3 *dwc)
|
|
|
+{
|
|
|
+ struct device *dev = dwc->dev;
|
|
|
+ struct device_node *np_phy, *np_conn;
|
|
|
+ struct extcon_dev *edev;
|
|
|
+
|
|
|
+ if (of_property_read_bool(dev->of_node, "extcon"))
|
|
|
+ return extcon_get_edev_by_phandle(dwc->dev, 0);
|
|
|
+
|
|
|
+ np_phy = of_parse_phandle(dev->of_node, "phys", 0);
|
|
|
+ np_conn = of_graph_get_remote_node(np_phy, -1, -1);
|
|
|
+
|
|
|
+ if (np_conn)
|
|
|
+ edev = extcon_find_edev_by_node(np_conn);
|
|
|
+ else
|
|
|
+ edev = NULL;
|
|
|
+
|
|
|
+ of_node_put(np_conn);
|
|
|
+ of_node_put(np_phy);
|
|
|
+
|
|
|
+ return edev;
|
|
|
+}
|
|
|
+
|
|
|
int dwc3_drd_init(struct dwc3 *dwc)
|
|
|
{
|
|
|
int ret, irq;
|
|
|
|
|
|
- if (dwc->dev->of_node &&
|
|
|
- of_property_read_bool(dwc->dev->of_node, "extcon")) {
|
|
|
- dwc->edev = extcon_get_edev_by_phandle(dwc->dev, 0);
|
|
|
-
|
|
|
- if (IS_ERR(dwc->edev))
|
|
|
- return PTR_ERR(dwc->edev);
|
|
|
+ dwc->edev = dwc3_get_extcon(dwc);
|
|
|
+ if (IS_ERR(dwc->edev))
|
|
|
+ return PTR_ERR(dwc->edev);
|
|
|
|
|
|
+ if (dwc->edev) {
|
|
|
dwc->edev_nb.notifier_call = dwc3_drd_notifier;
|
|
|
ret = extcon_register_notifier(dwc->edev, EXTCON_USB_HOST,
|
|
|
&dwc->edev_nb);
|