static int ssusb_extcon_register(struct otg_switch_mtk *otg_sx) { struct ssusb_mtk *ssusb = container_of(otg_sx, struct ssusb_mtk, otg_switch); struct extcon_dev *edev = otg_sx->edev; int ret; /* extcon is optional */ if (!edev) return 0; otg_sx->vbus_nb.notifier_call = ssusb_vbus_notifier; ret = devm_extcon_register_notifier(ssusb->dev, edev, EXTCON_USB, &otg_sx->vbus_nb); if (ret < 0) dev_err(ssusb->dev, "failed to register notifier for USB\n"); otg_sx->id_nb.notifier_call = ssusb_id_notifier; ret = devm_extcon_register_notifier(ssusb->dev, edev, EXTCON_USB_HOST, &otg_sx->id_nb); if (ret < 0) dev_err(ssusb->dev, "failed to register notifier for USB-HOST\n"); dev_dbg(ssusb->dev, "EXTCON_USB: %d, EXTCON_USB_HOST: %d\n", extcon_get_state(edev, EXTCON_USB), extcon_get_state(edev, EXTCON_USB_HOST)); /* default as host, switch to device mode if needed */ if (extcon_get_state(edev, EXTCON_USB_HOST) == false) ssusb_set_mailbox(otg_sx, MTU3_ID_FLOAT); if (extcon_get_state(edev, EXTCON_USB) == true) ssusb_set_mailbox(otg_sx, MTU3_VBUS_VALID); return 0; }
static int dwc3_omap_extcon_register(struct dwc3_omap *omap) { int ret; struct device_node *node = omap->dev->of_node; struct extcon_dev *edev; if (of_property_read_bool(node, "extcon")) { edev = extcon_get_edev_by_phandle(omap->dev, 0); if (IS_ERR(edev)) { dev_vdbg(omap->dev, "couldn't get extcon device\n"); return -EPROBE_DEFER; } omap->vbus_nb.notifier_call = dwc3_omap_vbus_notifier; ret = devm_extcon_register_notifier(omap->dev, edev, EXTCON_USB, &omap->vbus_nb); if (ret < 0) dev_vdbg(omap->dev, "failed to register notifier for USB\n"); omap->id_nb.notifier_call = dwc3_omap_id_notifier; ret = devm_extcon_register_notifier(omap->dev, edev, EXTCON_USB_HOST, &omap->id_nb); if (ret < 0) dev_vdbg(omap->dev, "failed to register notifier for USB-HOST\n"); if (extcon_get_state(edev, EXTCON_USB) == true) dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID); if (extcon_get_state(edev, EXTCON_USB_HOST) == true) dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND); omap->edev = edev; } return 0; }
static int qcom_usb_hs_phy_power_on(struct phy *phy) { struct qcom_usb_hs_phy *uphy = phy_get_drvdata(phy); struct ulpi *ulpi = uphy->ulpi; const struct ulpi_seq *seq; int ret, state; ret = clk_prepare_enable(uphy->ref_clk); if (ret) return ret; ret = clk_prepare_enable(uphy->sleep_clk); if (ret) goto err_sleep; ret = regulator_set_load(uphy->v1p8, 50000); if (ret < 0) goto err_1p8; ret = regulator_enable(uphy->v1p8); if (ret) goto err_1p8; ret = regulator_set_voltage_triplet(uphy->v3p3, 3050000, 3300000, 3300000); if (ret) goto err_3p3; ret = regulator_set_load(uphy->v3p3, 50000); if (ret < 0) goto err_3p3; ret = regulator_enable(uphy->v3p3); if (ret) goto err_3p3; for (seq = uphy->init_seq; seq->addr; seq++) { ret = ulpi_write(ulpi, ULPI_EXT_VENDOR_SPECIFIC + seq->addr, seq->val); if (ret) goto err_ulpi; } if (uphy->reset) { ret = reset_control_reset(uphy->reset); if (ret) goto err_ulpi; } if (uphy->vbus_edev) { state = extcon_get_state(uphy->vbus_edev, EXTCON_USB); /* setup initial state */ qcom_usb_hs_phy_vbus_notifier(&uphy->vbus_notify, state, uphy->vbus_edev); ret = devm_extcon_register_notifier(&ulpi->dev, uphy->vbus_edev, EXTCON_USB, &uphy->vbus_notify); if (ret) goto err_ulpi; } return 0; err_ulpi: regulator_disable(uphy->v3p3); err_3p3: regulator_disable(uphy->v1p8); err_1p8: clk_disable_unprepare(uphy->sleep_clk); err_sleep: clk_disable_unprepare(uphy->ref_clk); return ret; }