Lines Matching +full:ulpi +full:- +full:0

1 // SPDX-License-Identifier: GPL-2.0-only
3 * tusb1210.c - TUSB1210 USB ULPI PHY driver
12 #include <linux/ulpi/driver.h>
13 #include <linux/ulpi/regs.h>
20 #define TI_VENDOR_ID 0x0451
21 #define TI_DEVICE_TUSB1210 0x1507
22 #define TI_DEVICE_TUSB1211 0x1508
24 #define TUSB1211_POWER_CONTROL 0x3d
25 #define TUSB1211_POWER_CONTROL_SET 0x3e
26 #define TUSB1211_POWER_CONTROL_CLEAR 0x3f
27 #define TUSB1211_POWER_CONTROL_SW_CONTROL BIT(0)
31 #define TUSB1210_VENDOR_SPECIFIC2 0x80
32 #define TUSB1210_VENDOR_SPECIFIC2_IHSTX_MASK GENMASK(3, 0)
36 #define TUSB1211_VENDOR_SPECIFIC3 0x85
37 #define TUSB1211_VENDOR_SPECIFIC3_SET 0x86
38 #define TUSB1211_VENDOR_SPECIFIC3_CLEAR 0x87
77 struct device *dev = tusb->dev; in tusb1210_ulpi_write()
82 dev_err(dev, "error %d writing val 0x%02x to reg 0x%02x\n", ret, val, reg); in tusb1210_ulpi_write()
89 struct device *dev = tusb->dev; in tusb1210_ulpi_read()
93 if (ret >= 0) { in tusb1210_ulpi_read()
95 ret = 0; in tusb1210_ulpi_read()
97 dev_err(dev, "error %d reading reg 0x%02x\n", ret, reg); in tusb1210_ulpi_read()
107 gpiod_set_value_cansleep(tusb->gpio_reset, 1); in tusb1210_power_on()
108 gpiod_set_value_cansleep(tusb->gpio_cs, 1); in tusb1210_power_on()
113 tusb1210_ulpi_write(tusb, TUSB1210_VENDOR_SPECIFIC2, tusb->vendor_specific2); in tusb1210_power_on()
115 return 0; in tusb1210_power_on()
122 gpiod_set_value_cansleep(tusb->gpio_reset, 0); in tusb1210_power_off()
123 gpiod_set_value_cansleep(tusb->gpio_cs, 0); in tusb1210_power_off()
125 return 0; in tusb1210_power_off()
135 if (ret < 0) in tusb1210_set_mode()
156 return 0; in tusb1210_set_mode()
159 tusb->otg_ctrl = reg; in tusb1210_set_mode()
177 gpiod_set_value_cansleep(tusb->gpio_reset, 0); in tusb1210_reset()
179 gpiod_set_value_cansleep(tusb->gpio_reset, 1); in tusb1210_reset()
185 dev_dbg(tusb->dev, "charger type: %d\n", type); in tusb1210_chg_det_set_type()
186 tusb->chg_type = type; in tusb1210_chg_det_set_type()
187 tusb->chg_det_retries = 0; in tusb1210_chg_det_set_type()
188 power_supply_changed(tusb->psy); in tusb1210_chg_det_set_type()
196 dev_dbg(tusb->dev, "chg_det new state %s in %d ms\n", in tusb1210_chg_det_set_state()
199 tusb->chg_det_state = new_state; in tusb1210_chg_det_set_state()
200 mod_delayed_work(system_long_wq, &tusb->chg_det_work, in tusb1210_chg_det_set_state()
207 if (tusb->chg_det_retries < TUSB1210_CHG_DET_MAX_RETRIES) { in tusb1210_chg_det_handle_ulpi_error()
208 tusb->chg_det_retries++; in tusb1210_chg_det_handle_ulpi_error()
218 * Boards using a TUSB121x for charger-detection have 3 power_supply class devs:
220 * tusb1211-charger-detect(1) -> charger -> fuel-gauge
223 * the charger psy needs to be read. Since the tusb1211-charger-detect psy is
224 * the start of the supplier -> supplied-to chain, power_supply_am_i_supplied()
233 "bq24190-charger",
243 for (i = 0; i < ARRAY_SIZE(tusb1210_chargers) && !charger; i++) in tusb1210_get_online()
250 if (ret == 0) in tusb1210_get_online()
265 dev_dbg(tusb->dev, "chg_det state %s vbus_present %d\n", in tusb1210_chg_det_work()
266 tusb1210_chg_det_states[tusb->chg_det_state], vbus_present); in tusb1210_chg_det_work()
268 switch (tusb->chg_det_state) { in tusb1210_chg_det_work()
270 tusb->chg_type = POWER_SUPPLY_USB_TYPE_UNKNOWN; in tusb1210_chg_det_work()
271 tusb->chg_det_retries = 0; in tusb1210_chg_det_work()
273 ret = pm_runtime_resume_and_get(tusb->dev->parent); in tusb1210_chg_det_work()
274 if (ret < 0) { in tusb1210_chg_det_work()
275 dev_err(tusb->dev, "error %d runtime-resuming\n", ret); in tusb1210_chg_det_work()
277 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_CONNECTED, 0); in tusb1210_chg_det_work()
280 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_START_DET, 0); in tusb1210_chg_det_work()
288 mutex_lock(&tusb->phy->mutex); in tusb1210_chg_det_work()
291 mutex_unlock(&tusb->phy->mutex); in tusb1210_chg_det_work()
301 mutex_lock(&tusb->phy->mutex); in tusb1210_chg_det_work()
303 mutex_unlock(&tusb->phy->mutex); in tusb1210_chg_det_work()
314 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_FINISH_DET, 0); in tusb1210_chg_det_work()
317 mutex_lock(&tusb->phy->mutex); in tusb1210_chg_det_work()
319 /* Set SW_CONTROL to stop the charger-det FSM */ in tusb1210_chg_det_work()
323 /* Clear DP_VSRC_EN which may have been enabled by the charger-det FSM */ in tusb1210_chg_det_work()
327 /* Clear CHGD_IDP_SRC_EN (may have been enabled by the charger-det FSM) */ in tusb1210_chg_det_work()
337 /* Restore phy-parameters and OTG_CTRL register */ in tusb1210_chg_det_work()
338 tusb1210_ulpi_write(tusb, ULPI_OTG_CTRL, tusb->otg_ctrl); in tusb1210_chg_det_work()
340 tusb->vendor_specific2); in tusb1210_chg_det_work()
342 mutex_unlock(&tusb->phy->mutex); in tusb1210_chg_det_work()
344 pm_runtime_put(tusb->dev->parent); in tusb1210_chg_det_work()
345 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_CONNECTED, 0); in tusb1210_chg_det_work()
349 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_DISCONNECTING, 0); in tusb1210_chg_det_work()
363 * after a Vbus-session end. Reset it to work around this. in tusb1210_chg_det_work()
367 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_DISCONNECTED, 0); in tusb1210_chg_det_work()
371 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_CONNECTING, 0); in tusb1210_chg_det_work()
382 if (psy != tusb->psy && psy->desc->type == POWER_SUPPLY_TYPE_USB) in tusb1210_psy_notifier()
383 queue_delayed_work(system_long_wq, &tusb->chg_det_work, 0); in tusb1210_psy_notifier()
396 val->intval = tusb1210_get_online(tusb); in tusb1210_psy_get_prop()
399 val->intval = tusb->chg_type; in tusb1210_psy_get_prop()
402 if (tusb->chg_type == POWER_SUPPLY_USB_TYPE_DCP) in tusb1210_psy_get_prop()
403 val->intval = 2000000; in tusb1210_psy_get_prop()
405 val->intval = 500000; in tusb1210_psy_get_prop()
408 return -EINVAL; in tusb1210_psy_get_prop()
411 return 0; in tusb1210_psy_get_prop()
421 .name = "tusb1211-charger-detect",
431 /* Setup charger detection if requested, on errors continue without chg-det */
435 struct device *dev = tusb->dev; in tusb1210_probe_charger_detect()
436 struct ulpi *ulpi = to_ulpi_dev(dev); in tusb1210_probe_charger_detect() local
439 if (!device_property_read_bool(dev->parent, "linux,phy_charger_detect")) in tusb1210_probe_charger_detect()
442 if (ulpi->id.product != TI_DEVICE_TUSB1211) { in tusb1210_probe_charger_detect()
447 ret = tusb1210_ulpi_read(tusb, ULPI_OTG_CTRL, &tusb->otg_ctrl); in tusb1210_probe_charger_detect()
451 tusb->psy = power_supply_register(dev, &tusb1210_psy_desc, &psy_cfg); in tusb1210_probe_charger_detect()
452 if (IS_ERR(tusb->psy)) in tusb1210_probe_charger_detect()
459 tusb->chg_det_state = TUSB1210_CHG_DET_DISCONNECTED; in tusb1210_probe_charger_detect()
460 INIT_DELAYED_WORK(&tusb->chg_det_work, tusb1210_chg_det_work); in tusb1210_probe_charger_detect()
461 queue_delayed_work(system_long_wq, &tusb->chg_det_work, 2 * HZ); in tusb1210_probe_charger_detect()
463 tusb->psy_nb.notifier_call = tusb1210_psy_notifier; in tusb1210_probe_charger_detect()
464 power_supply_reg_notifier(&tusb->psy_nb); in tusb1210_probe_charger_detect()
470 if (!IS_ERR_OR_NULL(tusb->psy)) { in tusb1210_remove_charger_detect()
471 power_supply_unreg_notifier(&tusb->psy_nb); in tusb1210_remove_charger_detect()
472 cancel_delayed_work_sync(&tusb->chg_det_work); in tusb1210_remove_charger_detect()
473 power_supply_unregister(tusb->psy); in tusb1210_remove_charger_detect()
488 static int tusb1210_probe(struct ulpi *ulpi) in tusb1210_probe() argument
490 struct device *dev = &ulpi->dev; in tusb1210_probe()
497 return -ENOMEM; in tusb1210_probe()
499 tusb->dev = dev; in tusb1210_probe()
501 tusb->gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in tusb1210_probe()
502 if (IS_ERR(tusb->gpio_reset)) in tusb1210_probe()
503 return PTR_ERR(tusb->gpio_reset); in tusb1210_probe()
505 gpiod_set_value_cansleep(tusb->gpio_reset, 1); in tusb1210_probe()
507 tusb->gpio_cs = devm_gpiod_get_optional(dev, "cs", GPIOD_OUT_LOW); in tusb1210_probe()
508 if (IS_ERR(tusb->gpio_cs)) in tusb1210_probe()
509 return PTR_ERR(tusb->gpio_cs); in tusb1210_probe()
511 gpiod_set_value_cansleep(tusb->gpio_cs, 1); in tusb1210_probe()
538 tusb->vendor_specific2 = reg; in tusb1210_probe()
542 tusb->phy = ulpi_phy_create(ulpi, &phy_ops); in tusb1210_probe()
543 if (IS_ERR(tusb->phy)) { in tusb1210_probe()
544 ret = PTR_ERR(tusb->phy); in tusb1210_probe()
548 phy_set_drvdata(tusb->phy, tusb); in tusb1210_probe()
549 ulpi_set_drvdata(ulpi, tusb); in tusb1210_probe()
550 return 0; in tusb1210_probe()
557 static void tusb1210_remove(struct ulpi *ulpi) in tusb1210_remove() argument
559 struct tusb1210 *tusb = ulpi_get_drvdata(ulpi); in tusb1210_remove()
561 ulpi_phy_destroy(ulpi, tusb->phy); in tusb1210_remove()
570 MODULE_DEVICE_TABLE(ulpi, tusb1210_ulpi_id);
586 MODULE_DESCRIPTION("TUSB1210 ULPI PHY driver");