power: twl4030_charger: find associated phy by more reliable means.
[firefly-linux-kernel-4.4.55.git] / drivers / power / twl4030_charger.c
index 02a522cb775377177760b06f5bc40bed6506b5bf..022b8910e443510fdf1320891af7566e1db24b6f 100644 (file)
@@ -638,10 +638,15 @@ static int __init twl4030_bci_probe(struct platform_device *pdev)
 
        INIT_WORK(&bci->work, twl4030_bci_usb_work);
 
-       bci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
-       if (!IS_ERR_OR_NULL(bci->transceiver)) {
-               bci->usb_nb.notifier_call = twl4030_bci_usb_ncb;
-               usb_register_notifier(bci->transceiver, &bci->usb_nb);
+       bci->usb_nb.notifier_call = twl4030_bci_usb_ncb;
+       if (bci->dev->of_node) {
+               struct device_node *phynode;
+
+               phynode = of_find_compatible_node(bci->dev->of_node->parent,
+                                                 NULL, "ti,twl4030-usb");
+               if (phynode)
+                       bci->transceiver = devm_usb_get_phy_by_node(
+                               bci->dev, phynode, &bci->usb_nb);
        }
 
        /* Enable interrupts now. */
@@ -671,10 +676,6 @@ static int __init twl4030_bci_probe(struct platform_device *pdev)
        return 0;
 
 fail_unmask_interrupts:
-       if (!IS_ERR_OR_NULL(bci->transceiver)) {
-               usb_unregister_notifier(bci->transceiver, &bci->usb_nb);
-               usb_put_phy(bci->transceiver);
-       }
        free_irq(bci->irq_bci, bci);
 fail_bci_irq:
        free_irq(bci->irq_chg, bci);
@@ -703,10 +704,6 @@ static int __exit twl4030_bci_remove(struct platform_device *pdev)
        twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, 0xff,
                         TWL4030_INTERRUPTS_BCIIMR2A);
 
-       if (!IS_ERR_OR_NULL(bci->transceiver)) {
-               usb_unregister_notifier(bci->transceiver, &bci->usb_nb);
-               usb_put_phy(bci->transceiver);
-       }
        free_irq(bci->irq_bci, bci);
        free_irq(bci->irq_chg, bci);
        power_supply_unregister(bci->usb);