Lines Matching +full:dp +full:- +full:phy

1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Copyright (C) 2012 - 2013 Pali Rohár <pali@kernel.org>
50 struct usb_phy *phy; member
63 return usb_phy_io_read(isp->phy, reg); in isp1704_read()
68 return usb_phy_io_write(isp->phy, val, reg); in isp1704_write()
73 gpiod_set_value(isp->enable_gpio, on); in isp1704_charger_set_power()
103 /* Enable strong pull-up on DP (1.5K) and reset */ in isp1704_charger_type()
138 /* Clear the DP and DM pull-down bits */ in isp1704_charger_verify()
142 /* Enable strong pull-up on DP (1.5K) and reset */ in isp1704_charger_verify()
149 /* Disable strong pull-up on DP (1.5K) */ in isp1704_charger_verify()
157 /* Enable weak pull-up resistor on DP */ in isp1704_charger_verify()
161 /* Disable strong pull-up on DP (1.5K) */ in isp1704_charger_verify()
165 /* Enable weak pull-down resistor on DM */ in isp1704_charger_verify()
173 /* Disable weak pull-up resistor on DP */ in isp1704_charger_verify()
206 } while (!time_after(jiffies, timeout) && isp->online); in isp1704_charger_detect()
231 switch (isp->phy->last_event) { in isp1704_charger_work()
234 if (!isp->present) { in isp1704_charger_work()
235 isp->online = true; in isp1704_charger_work()
236 isp->present = 1; in isp1704_charger_work()
241 isp->psy_desc.type = POWER_SUPPLY_TYPE_USB_DCP; in isp1704_charger_work()
242 isp->current_max = 1800; in isp1704_charger_work()
244 isp->psy_desc.type = POWER_SUPPLY_TYPE_USB; in isp1704_charger_work()
245 isp->current_max = 500; in isp1704_charger_work()
249 if (isp->phy->otg->gadget) in isp1704_charger_work()
250 usb_gadget_connect(isp->phy->otg->gadget); in isp1704_charger_work()
253 if (isp->psy_desc.type != POWER_SUPPLY_TYPE_USB_DCP) { in isp1704_charger_work()
258 if (isp->current_max > 500) in isp1704_charger_work()
259 isp->current_max = 500; in isp1704_charger_work()
261 if (isp->current_max > 100) in isp1704_charger_work()
262 isp->psy_desc.type = POWER_SUPPLY_TYPE_USB_CDP; in isp1704_charger_work()
266 isp->online = false; in isp1704_charger_work()
267 isp->present = 0; in isp1704_charger_work()
268 isp->current_max = 0; in isp1704_charger_work()
269 isp->psy_desc.type = POWER_SUPPLY_TYPE_USB; in isp1704_charger_work()
279 if (isp->phy->otg->gadget) in isp1704_charger_work()
280 usb_gadget_disconnect(isp->phy->otg->gadget); in isp1704_charger_work()
288 power_supply_changed(isp->psy); in isp1704_charger_work()
299 schedule_work(&isp->work); in isp1704_notifier_call()
312 val->intval = isp->present; in isp1704_charger_get_property()
315 val->intval = isp->online; in isp1704_charger_get_property()
318 val->intval = isp->current_max; in isp1704_charger_get_property()
321 val->strval = isp->model; in isp1704_charger_get_property()
324 val->strval = "NXP"; in isp1704_charger_get_property()
327 return -EINVAL; in isp1704_charger_get_property()
357 return -ENODEV; in isp1704_test_ulpi()
363 return -ENODEV; in isp1704_test_ulpi()
370 sprintf(isp->model, "isp%x", product); in isp1704_test_ulpi()
375 dev_err(isp->dev, "product id %x not matching known ids", product); in isp1704_test_ulpi()
377 return -ENODEV; in isp1704_test_ulpi()
383 int ret = -ENODEV; in isp1704_charger_probe()
386 isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL); in isp1704_charger_probe()
388 return -ENOMEM; in isp1704_charger_probe()
390 isp->enable_gpio = devm_gpiod_get(&pdev->dev, "nxp,enable", in isp1704_charger_probe()
392 if (IS_ERR(isp->enable_gpio)) { in isp1704_charger_probe()
393 ret = PTR_ERR(isp->enable_gpio); in isp1704_charger_probe()
394 dev_err(&pdev->dev, "Could not get reset gpio: %d\n", ret); in isp1704_charger_probe()
398 if (pdev->dev.of_node) in isp1704_charger_probe()
399 isp->phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0); in isp1704_charger_probe()
401 isp->phy = devm_usb_get_phy(&pdev->dev, USB_PHY_TYPE_USB2); in isp1704_charger_probe()
403 if (IS_ERR(isp->phy)) { in isp1704_charger_probe()
404 ret = PTR_ERR(isp->phy); in isp1704_charger_probe()
405 dev_err(&pdev->dev, "usb_get_phy failed\n"); in isp1704_charger_probe()
409 isp->dev = &pdev->dev; in isp1704_charger_probe()
416 dev_err(&pdev->dev, "isp1704_test_ulpi failed\n"); in isp1704_charger_probe()
420 isp->psy_desc.name = "isp1704"; in isp1704_charger_probe()
421 isp->psy_desc.type = POWER_SUPPLY_TYPE_USB; in isp1704_charger_probe()
422 isp->psy_desc.properties = power_props; in isp1704_charger_probe()
423 isp->psy_desc.num_properties = ARRAY_SIZE(power_props); in isp1704_charger_probe()
424 isp->psy_desc.get_property = isp1704_charger_get_property; in isp1704_charger_probe()
428 isp->psy = power_supply_register(isp->dev, &isp->psy_desc, &psy_cfg); in isp1704_charger_probe()
429 if (IS_ERR(isp->psy)) { in isp1704_charger_probe()
430 ret = PTR_ERR(isp->psy); in isp1704_charger_probe()
431 dev_err(&pdev->dev, "power_supply_register failed\n"); in isp1704_charger_probe()
439 INIT_WORK(&isp->work, isp1704_charger_work); in isp1704_charger_probe()
441 isp->nb.notifier_call = isp1704_notifier_call; in isp1704_charger_probe()
443 ret = usb_register_notifier(isp->phy, &isp->nb); in isp1704_charger_probe()
445 dev_err(&pdev->dev, "usb_register_notifier failed\n"); in isp1704_charger_probe()
449 dev_info(isp->dev, "registered with product id %s\n", isp->model); in isp1704_charger_probe()
458 if (isp->phy->otg->gadget) in isp1704_charger_probe()
459 usb_gadget_disconnect(isp->phy->otg->gadget); in isp1704_charger_probe()
461 if (isp->phy->last_event == USB_EVENT_NONE) in isp1704_charger_probe()
465 if (isp->phy->last_event == USB_EVENT_VBUS && in isp1704_charger_probe()
466 !isp->phy->otg->default_a) in isp1704_charger_probe()
467 schedule_work(&isp->work); in isp1704_charger_probe()
471 power_supply_unregister(isp->psy); in isp1704_charger_probe()
475 dev_err(&pdev->dev, "failed to register isp1704 with error %d\n", ret); in isp1704_charger_probe()
484 usb_unregister_notifier(isp->phy, &isp->nb); in isp1704_charger_remove()
485 power_supply_unregister(isp->psy); in isp1704_charger_remove()