Lines Matching +full:sun50i +full:- +full:h6 +full:- +full:usb +full:- +full:phy
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Allwinner sun4i USB phy driver
5 * Copyright (C) 2014-2015 Hans de Goede <hdegoede@redhat.com>
18 #include <linux/extcon-provider.h>
29 #include <linux/phy/phy.h>
30 #include <linux/phy/phy-sun4i-usb.h>
36 #include <linux/usb/of.h>
60 /* sunxi has the phy id/vbus pins not connected, so we use the force bits */
72 /* Private Control Bits for Each PHY */
131 struct phy *phy; member
156 #define to_sun4i_usb_phy_data(phy) \ argument
157 container_of((phy), struct sun4i_usb_phy_data, phys[(phy)->index])
159 static void sun4i_usb_phy0_update_iscr(struct phy *_phy, u32 clr, u32 set) in sun4i_usb_phy0_update_iscr()
161 struct sun4i_usb_phy *phy = phy_get_drvdata(_phy); in sun4i_usb_phy0_update_iscr() local
162 struct sun4i_usb_phy_data *data = to_sun4i_usb_phy_data(phy); in sun4i_usb_phy0_update_iscr()
165 iscr = readl(data->base + REG_ISCR); in sun4i_usb_phy0_update_iscr()
168 writel(iscr, data->base + REG_ISCR); in sun4i_usb_phy0_update_iscr()
171 static void sun4i_usb_phy0_set_id_detect(struct phy *phy, u32 val) in sun4i_usb_phy0_set_id_detect() argument
178 sun4i_usb_phy0_update_iscr(phy, ISCR_FORCE_ID_MASK, val); in sun4i_usb_phy0_set_id_detect()
181 static void sun4i_usb_phy0_set_vbus_detect(struct phy *phy, u32 val) in sun4i_usb_phy0_set_vbus_detect() argument
188 sun4i_usb_phy0_update_iscr(phy, ISCR_FORCE_VBUS_MASK, val); in sun4i_usb_phy0_set_vbus_detect()
191 static void sun4i_usb_phy_write(struct sun4i_usb_phy *phy, u32 addr, u32 data, in sun4i_usb_phy_write() argument
194 struct sun4i_usb_phy_data *phy_data = to_sun4i_usb_phy_data(phy); in sun4i_usb_phy_write()
195 u32 temp, usbc_bit = BIT(phy->index * 2); in sun4i_usb_phy_write()
196 void __iomem *phyctl = phy_data->base + phy_data->cfg->phyctl_offset; in sun4i_usb_phy_write()
200 spin_lock_irqsave(&phy_data->reg_lock, flags); in sun4i_usb_phy_write()
202 if (phy_data->cfg->phyctl_offset == REG_PHYCTL_A33) { in sun4i_usb_phy_write()
238 spin_unlock_irqrestore(&phy_data->reg_lock, flags); in sun4i_usb_phy_write()
241 static void sun4i_usb_phy_passby(struct sun4i_usb_phy *phy, int enable) in sun4i_usb_phy_passby() argument
243 struct sun4i_usb_phy_data *phy_data = to_sun4i_usb_phy_data(phy); in sun4i_usb_phy_passby()
246 if (!phy->pmu) in sun4i_usb_phy_passby()
253 if (phy_data->cfg->type == sun8i_a83t_phy && phy->index == 2) in sun4i_usb_phy_passby()
257 reg_value = readl(phy->pmu); in sun4i_usb_phy_passby()
264 writel(reg_value, phy->pmu); in sun4i_usb_phy_passby()
267 static int sun4i_usb_phy_init(struct phy *_phy) in sun4i_usb_phy_init()
269 struct sun4i_usb_phy *phy = phy_get_drvdata(_phy); in sun4i_usb_phy_init() local
270 struct sun4i_usb_phy_data *data = to_sun4i_usb_phy_data(phy); in sun4i_usb_phy_init()
274 ret = clk_prepare_enable(phy->clk); in sun4i_usb_phy_init()
278 ret = clk_prepare_enable(phy->clk2); in sun4i_usb_phy_init()
280 clk_disable_unprepare(phy->clk); in sun4i_usb_phy_init()
284 ret = reset_control_deassert(phy->reset); in sun4i_usb_phy_init()
286 clk_disable_unprepare(phy->clk2); in sun4i_usb_phy_init()
287 clk_disable_unprepare(phy->clk); in sun4i_usb_phy_init()
291 if (data->cfg->type == sun8i_a83t_phy || in sun4i_usb_phy_init()
292 data->cfg->type == sun50i_h6_phy) { in sun4i_usb_phy_init()
293 if (phy->index == 0) { in sun4i_usb_phy_init()
294 val = readl(data->base + data->cfg->phyctl_offset); in sun4i_usb_phy_init()
297 writel(val, data->base + data->cfg->phyctl_offset); in sun4i_usb_phy_init()
300 if (phy->pmu && data->cfg->enable_pmu_unk1) { in sun4i_usb_phy_init()
301 val = readl(phy->pmu + REG_PMU_UNK1); in sun4i_usb_phy_init()
302 writel(val & ~2, phy->pmu + REG_PMU_UNK1); in sun4i_usb_phy_init()
305 /* Enable USB 45 Ohm resistor calibration */ in sun4i_usb_phy_init()
306 if (phy->index == 0) in sun4i_usb_phy_init()
307 sun4i_usb_phy_write(phy, PHY_RES45_CAL_EN, 0x01, 1); in sun4i_usb_phy_init()
309 /* Adjust PHY's magnitude and rate */ in sun4i_usb_phy_init()
310 sun4i_usb_phy_write(phy, PHY_TX_AMPLITUDE_TUNE, 0x14, 5); in sun4i_usb_phy_init()
313 sun4i_usb_phy_write(phy, PHY_DISCON_TH_SEL, in sun4i_usb_phy_init()
314 data->cfg->disc_thresh, 2); in sun4i_usb_phy_init()
317 sun4i_usb_phy_passby(phy, 1); in sun4i_usb_phy_init()
319 if (phy->index == 0) { in sun4i_usb_phy_init()
320 data->phy0_init = true; in sun4i_usb_phy_init()
322 /* Enable pull-ups */ in sun4i_usb_phy_init()
327 data->id_det = -1; in sun4i_usb_phy_init()
328 data->vbus_det = -1; in sun4i_usb_phy_init()
329 queue_delayed_work(system_wq, &data->detect, 0); in sun4i_usb_phy_init()
335 static int sun4i_usb_phy_exit(struct phy *_phy) in sun4i_usb_phy_exit()
337 struct sun4i_usb_phy *phy = phy_get_drvdata(_phy); in sun4i_usb_phy_exit() local
338 struct sun4i_usb_phy_data *data = to_sun4i_usb_phy_data(phy); in sun4i_usb_phy_exit()
340 if (phy->index == 0) { in sun4i_usb_phy_exit()
341 if (data->cfg->type == sun8i_a83t_phy || in sun4i_usb_phy_exit()
342 data->cfg->type == sun50i_h6_phy) { in sun4i_usb_phy_exit()
343 void __iomem *phyctl = data->base + in sun4i_usb_phy_exit()
344 data->cfg->phyctl_offset; in sun4i_usb_phy_exit()
349 /* Disable pull-ups */ in sun4i_usb_phy_exit()
352 data->phy0_init = false; in sun4i_usb_phy_exit()
355 sun4i_usb_phy_passby(phy, 0); in sun4i_usb_phy_exit()
356 reset_control_assert(phy->reset); in sun4i_usb_phy_exit()
357 clk_disable_unprepare(phy->clk2); in sun4i_usb_phy_exit()
358 clk_disable_unprepare(phy->clk); in sun4i_usb_phy_exit()
365 switch (data->dr_mode) { in sun4i_usb_phy0_get_id_det()
367 if (data->id_det_gpio) in sun4i_usb_phy0_get_id_det()
368 return gpiod_get_value_cansleep(data->id_det_gpio); in sun4i_usb_phy0_get_id_det()
381 if (data->vbus_det_gpio) in sun4i_usb_phy0_get_vbus_det()
382 return gpiod_get_value_cansleep(data->vbus_det_gpio); in sun4i_usb_phy0_get_vbus_det()
384 if (data->vbus_power_supply) { in sun4i_usb_phy0_get_vbus_det()
388 r = power_supply_get_property(data->vbus_power_supply, in sun4i_usb_phy0_get_vbus_det()
400 return data->vbus_det_gpio || data->vbus_power_supply; in sun4i_usb_phy0_have_vbus_det()
405 if ((data->id_det_gpio && data->id_det_irq <= 0) || in sun4i_usb_phy0_poll()
406 (data->vbus_det_gpio && data->vbus_det_irq <= 0)) in sun4i_usb_phy0_poll()
413 * when using the pmic for vbus-det _and_ we're driving vbus. in sun4i_usb_phy0_poll()
415 if ((data->cfg->type == sun6i_a31_phy || in sun4i_usb_phy0_poll()
416 data->cfg->type == sun8i_a33_phy) && in sun4i_usb_phy0_poll()
417 data->vbus_power_supply && data->phys[0].regulator_on) in sun4i_usb_phy0_poll()
423 static int sun4i_usb_phy_power_on(struct phy *_phy) in sun4i_usb_phy_power_on()
425 struct sun4i_usb_phy *phy = phy_get_drvdata(_phy); in sun4i_usb_phy_power_on() local
426 struct sun4i_usb_phy_data *data = to_sun4i_usb_phy_data(phy); in sun4i_usb_phy_power_on()
429 if (!phy->vbus || phy->regulator_on) in sun4i_usb_phy_power_on()
433 if (phy->index == 0 && sun4i_usb_phy0_have_vbus_det(data) && in sun4i_usb_phy_power_on()
434 data->vbus_det) { in sun4i_usb_phy_power_on()
435 dev_warn(&_phy->dev, "External vbus detected, not enabling our own vbus\n"); in sun4i_usb_phy_power_on()
439 ret = regulator_enable(phy->vbus); in sun4i_usb_phy_power_on()
443 phy->regulator_on = true; in sun4i_usb_phy_power_on()
446 if (phy->index == 0 && sun4i_usb_phy0_poll(data)) in sun4i_usb_phy_power_on()
447 mod_delayed_work(system_wq, &data->detect, DEBOUNCE_TIME); in sun4i_usb_phy_power_on()
452 static int sun4i_usb_phy_power_off(struct phy *_phy) in sun4i_usb_phy_power_off()
454 struct sun4i_usb_phy *phy = phy_get_drvdata(_phy); in sun4i_usb_phy_power_off() local
455 struct sun4i_usb_phy_data *data = to_sun4i_usb_phy_data(phy); in sun4i_usb_phy_power_off()
457 if (!phy->vbus || !phy->regulator_on) in sun4i_usb_phy_power_off()
460 regulator_disable(phy->vbus); in sun4i_usb_phy_power_off()
461 phy->regulator_on = false; in sun4i_usb_phy_power_off()
467 if (phy->index == 0 && !sun4i_usb_phy0_poll(data)) in sun4i_usb_phy_power_off()
468 mod_delayed_work(system_wq, &data->detect, POLL_TIME); in sun4i_usb_phy_power_off()
473 static int sun4i_usb_phy_set_mode(struct phy *_phy, in sun4i_usb_phy_set_mode()
476 struct sun4i_usb_phy *phy = phy_get_drvdata(_phy); in sun4i_usb_phy_set_mode() local
477 struct sun4i_usb_phy_data *data = to_sun4i_usb_phy_data(phy); in sun4i_usb_phy_set_mode()
480 if (phy->index != 0) { in sun4i_usb_phy_set_mode()
483 return -EINVAL; in sun4i_usb_phy_set_mode()
497 return -EINVAL; in sun4i_usb_phy_set_mode()
500 if (new_mode != data->dr_mode) { in sun4i_usb_phy_set_mode()
501 dev_info(&_phy->dev, "Changing dr_mode to %d\n", new_mode); in sun4i_usb_phy_set_mode()
502 data->dr_mode = new_mode; in sun4i_usb_phy_set_mode()
505 data->id_det = -1; /* Force reprocessing of id */ in sun4i_usb_phy_set_mode()
506 data->force_session_end = true; in sun4i_usb_phy_set_mode()
507 queue_delayed_work(system_wq, &data->detect, 0); in sun4i_usb_phy_set_mode()
512 void sun4i_usb_phy_set_squelch_detect(struct phy *_phy, bool enabled) in sun4i_usb_phy_set_squelch_detect()
514 struct sun4i_usb_phy *phy = phy_get_drvdata(_phy); in sun4i_usb_phy_set_squelch_detect() local
516 sun4i_usb_phy_write(phy, PHY_SQUELCH_DETECT, enabled ? 0 : 2, 2); in sun4i_usb_phy_set_squelch_detect()
533 regval = readl(data->base + REG_PHY_OTGCTL); in sun4i_usb_phy0_reroute()
541 writel(regval, data->base + REG_PHY_OTGCTL); in sun4i_usb_phy0_reroute()
548 struct phy *phy0 = data->phys[0].phy; in sun4i_usb_phy0_id_vbus_det_scan()
549 struct sun4i_usb_phy *phy; in sun4i_usb_phy0_id_vbus_det_scan() local
556 phy = phy_get_drvdata(phy0); in sun4i_usb_phy0_id_vbus_det_scan()
560 mutex_lock(&phy0->mutex); in sun4i_usb_phy0_id_vbus_det_scan()
562 if (!data->phy0_init) { in sun4i_usb_phy0_id_vbus_det_scan()
563 mutex_unlock(&phy0->mutex); in sun4i_usb_phy0_id_vbus_det_scan()
567 force_session_end = data->force_session_end; in sun4i_usb_phy0_id_vbus_det_scan()
568 data->force_session_end = false; in sun4i_usb_phy0_id_vbus_det_scan()
570 if (id_det != data->id_det) { in sun4i_usb_phy0_id_vbus_det_scan()
571 /* id-change, force session end if we've no vbus detection */ in sun4i_usb_phy0_id_vbus_det_scan()
572 if (data->dr_mode == USB_DR_MODE_OTG && in sun4i_usb_phy0_id_vbus_det_scan()
583 data->id_det = id_det; in sun4i_usb_phy0_id_vbus_det_scan()
587 if (vbus_det != data->vbus_det) { in sun4i_usb_phy0_id_vbus_det_scan()
589 data->vbus_det = vbus_det; in sun4i_usb_phy0_id_vbus_det_scan()
593 mutex_unlock(&phy0->mutex); in sun4i_usb_phy0_id_vbus_det_scan()
596 extcon_set_state_sync(data->extcon, EXTCON_USB_HOST, in sun4i_usb_phy0_id_vbus_det_scan()
600 mutex_lock(&phy0->mutex); in sun4i_usb_phy0_id_vbus_det_scan()
604 mutex_unlock(&phy0->mutex); in sun4i_usb_phy0_id_vbus_det_scan()
608 sun4i_usb_phy_passby(phy, !id_det); in sun4i_usb_phy0_id_vbus_det_scan()
610 /* Re-route PHY0 if necessary */ in sun4i_usb_phy0_id_vbus_det_scan()
611 if (data->cfg->phy0_dual_route) in sun4i_usb_phy0_id_vbus_det_scan()
616 extcon_set_state_sync(data->extcon, EXTCON_USB, vbus_det); in sun4i_usb_phy0_id_vbus_det_scan()
619 queue_delayed_work(system_wq, &data->detect, POLL_TIME); in sun4i_usb_phy0_id_vbus_det_scan()
627 mod_delayed_work(system_wq, &data->detect, DEBOUNCE_TIME); in sun4i_usb_phy0_id_vbus_det_irq()
640 if (val == PSY_EVENT_PROP_CHANGED && psy == data->vbus_power_supply) in sun4i_usb_phy0_vbus_notify()
641 mod_delayed_work(system_wq, &data->detect, DEBOUNCE_TIME); in sun4i_usb_phy0_vbus_notify()
646 static struct phy *sun4i_usb_phy_xlate(struct device *dev, in sun4i_usb_phy_xlate()
651 if (args->args[0] >= data->cfg->num_phys) in sun4i_usb_phy_xlate()
652 return ERR_PTR(-ENODEV); in sun4i_usb_phy_xlate()
654 if (data->cfg->missing_phys & BIT(args->args[0])) in sun4i_usb_phy_xlate()
655 return ERR_PTR(-ENODEV); in sun4i_usb_phy_xlate()
657 return data->phys[args->args[0]].phy; in sun4i_usb_phy_xlate()
662 struct device *dev = &pdev->dev; in sun4i_usb_phy_remove()
665 if (data->vbus_power_nb_registered) in sun4i_usb_phy_remove()
666 power_supply_unreg_notifier(&data->vbus_power_nb); in sun4i_usb_phy_remove()
667 if (data->id_det_irq > 0) in sun4i_usb_phy_remove()
668 devm_free_irq(dev, data->id_det_irq, data); in sun4i_usb_phy_remove()
669 if (data->vbus_det_irq > 0) in sun4i_usb_phy_remove()
670 devm_free_irq(dev, data->vbus_det_irq, data); in sun4i_usb_phy_remove()
672 cancel_delayed_work_sync(&data->detect); in sun4i_usb_phy_remove()
686 struct device *dev = &pdev->dev; in sun4i_usb_phy_probe()
687 struct device_node *np = dev->of_node; in sun4i_usb_phy_probe()
694 return -ENOMEM; in sun4i_usb_phy_probe()
696 spin_lock_init(&data->reg_lock); in sun4i_usb_phy_probe()
697 INIT_DELAYED_WORK(&data->detect, sun4i_usb_phy0_id_vbus_det_scan); in sun4i_usb_phy_probe()
699 data->cfg = of_device_get_match_data(dev); in sun4i_usb_phy_probe()
700 if (!data->cfg) in sun4i_usb_phy_probe()
701 return -EINVAL; in sun4i_usb_phy_probe()
704 data->base = devm_ioremap_resource(dev, res); in sun4i_usb_phy_probe()
705 if (IS_ERR(data->base)) in sun4i_usb_phy_probe()
706 return PTR_ERR(data->base); in sun4i_usb_phy_probe()
708 data->id_det_gpio = devm_gpiod_get_optional(dev, "usb0_id_det", in sun4i_usb_phy_probe()
710 if (IS_ERR(data->id_det_gpio)) { in sun4i_usb_phy_probe()
712 return PTR_ERR(data->id_det_gpio); in sun4i_usb_phy_probe()
715 data->vbus_det_gpio = devm_gpiod_get_optional(dev, "usb0_vbus_det", in sun4i_usb_phy_probe()
717 if (IS_ERR(data->vbus_det_gpio)) { in sun4i_usb_phy_probe()
719 return PTR_ERR(data->vbus_det_gpio); in sun4i_usb_phy_probe()
722 if (of_find_property(np, "usb0_vbus_power-supply", NULL)) { in sun4i_usb_phy_probe()
723 data->vbus_power_supply = devm_power_supply_get_by_phandle(dev, in sun4i_usb_phy_probe()
724 "usb0_vbus_power-supply"); in sun4i_usb_phy_probe()
725 if (IS_ERR(data->vbus_power_supply)) { in sun4i_usb_phy_probe()
727 return PTR_ERR(data->vbus_power_supply); in sun4i_usb_phy_probe()
730 if (!data->vbus_power_supply) in sun4i_usb_phy_probe()
731 return -EPROBE_DEFER; in sun4i_usb_phy_probe()
734 data->dr_mode = of_usb_get_dr_mode_by_phy(np, 0); in sun4i_usb_phy_probe()
736 data->extcon = devm_extcon_dev_allocate(dev, sun4i_usb_phy0_cable); in sun4i_usb_phy_probe()
737 if (IS_ERR(data->extcon)) { in sun4i_usb_phy_probe()
739 return PTR_ERR(data->extcon); in sun4i_usb_phy_probe()
742 ret = devm_extcon_dev_register(dev, data->extcon); in sun4i_usb_phy_probe()
748 for (i = 0; i < data->cfg->num_phys; i++) { in sun4i_usb_phy_probe()
749 struct sun4i_usb_phy *phy = data->phys + i; in sun4i_usb_phy_probe() local
752 if (data->cfg->missing_phys & BIT(i)) in sun4i_usb_phy_probe()
755 snprintf(name, sizeof(name), "usb%d_vbus", i); in sun4i_usb_phy_probe()
756 phy->vbus = devm_regulator_get_optional(dev, name); in sun4i_usb_phy_probe()
757 if (IS_ERR(phy->vbus)) { in sun4i_usb_phy_probe()
758 if (PTR_ERR(phy->vbus) == -EPROBE_DEFER) { in sun4i_usb_phy_probe()
762 return -EPROBE_DEFER; in sun4i_usb_phy_probe()
765 phy->vbus = NULL; in sun4i_usb_phy_probe()
768 if (data->cfg->dedicated_clocks) in sun4i_usb_phy_probe()
769 snprintf(name, sizeof(name), "usb%d_phy", i); in sun4i_usb_phy_probe()
773 phy->clk = devm_clk_get(dev, name); in sun4i_usb_phy_probe()
774 if (IS_ERR(phy->clk)) { in sun4i_usb_phy_probe()
776 return PTR_ERR(phy->clk); in sun4i_usb_phy_probe()
779 /* The first PHY is always tied to OTG, and never HSIC */ in sun4i_usb_phy_probe()
780 if (data->cfg->hsic_index && i == data->cfg->hsic_index) { in sun4i_usb_phy_probe()
782 snprintf(name, sizeof(name), "usb%d_hsic_12M", i); in sun4i_usb_phy_probe()
783 phy->clk2 = devm_clk_get(dev, name); in sun4i_usb_phy_probe()
784 if (IS_ERR(phy->clk2)) { in sun4i_usb_phy_probe()
786 return PTR_ERR(phy->clk2); in sun4i_usb_phy_probe()
790 snprintf(name, sizeof(name), "usb%d_reset", i); in sun4i_usb_phy_probe()
791 phy->reset = devm_reset_control_get(dev, name); in sun4i_usb_phy_probe()
792 if (IS_ERR(phy->reset)) { in sun4i_usb_phy_probe()
794 return PTR_ERR(phy->reset); in sun4i_usb_phy_probe()
797 if (i || data->cfg->phy0_dual_route) { /* No pmu for musb */ in sun4i_usb_phy_probe()
801 phy->pmu = devm_ioremap_resource(dev, res); in sun4i_usb_phy_probe()
802 if (IS_ERR(phy->pmu)) in sun4i_usb_phy_probe()
803 return PTR_ERR(phy->pmu); in sun4i_usb_phy_probe()
806 phy->phy = devm_phy_create(dev, NULL, &sun4i_usb_phy_ops); in sun4i_usb_phy_probe()
807 if (IS_ERR(phy->phy)) { in sun4i_usb_phy_probe()
808 dev_err(dev, "failed to create PHY %d\n", i); in sun4i_usb_phy_probe()
809 return PTR_ERR(phy->phy); in sun4i_usb_phy_probe()
812 phy->index = i; in sun4i_usb_phy_probe()
813 phy_set_drvdata(phy->phy, &data->phys[i]); in sun4i_usb_phy_probe()
816 data->id_det_irq = gpiod_to_irq(data->id_det_gpio); in sun4i_usb_phy_probe()
817 if (data->id_det_irq > 0) { in sun4i_usb_phy_probe()
818 ret = devm_request_irq(dev, data->id_det_irq, in sun4i_usb_phy_probe()
821 "usb0-id-det", data); in sun4i_usb_phy_probe()
823 dev_err(dev, "Err requesting id-det-irq: %d\n", ret); in sun4i_usb_phy_probe()
828 data->vbus_det_irq = gpiod_to_irq(data->vbus_det_gpio); in sun4i_usb_phy_probe()
829 if (data->vbus_det_irq > 0) { in sun4i_usb_phy_probe()
830 ret = devm_request_irq(dev, data->vbus_det_irq, in sun4i_usb_phy_probe()
833 "usb0-vbus-det", data); in sun4i_usb_phy_probe()
835 dev_err(dev, "Err requesting vbus-det-irq: %d\n", ret); in sun4i_usb_phy_probe()
836 data->vbus_det_irq = -1; in sun4i_usb_phy_probe()
842 if (data->vbus_power_supply) { in sun4i_usb_phy_probe()
843 data->vbus_power_nb.notifier_call = sun4i_usb_phy0_vbus_notify; in sun4i_usb_phy_probe()
844 data->vbus_power_nb.priority = 0; in sun4i_usb_phy_probe()
845 ret = power_supply_reg_notifier(&data->vbus_power_nb); in sun4i_usb_phy_probe()
850 data->vbus_power_nb_registered = true; in sun4i_usb_phy_probe()
978 { .compatible = "allwinner,sun4i-a10-usb-phy", .data = &sun4i_a10_cfg },
979 { .compatible = "allwinner,sun5i-a13-usb-phy", .data = &sun5i_a13_cfg },
980 { .compatible = "allwinner,sun6i-a31-usb-phy", .data = &sun6i_a31_cfg },
981 { .compatible = "allwinner,sun7i-a20-usb-phy", .data = &sun7i_a20_cfg },
982 { .compatible = "allwinner,sun8i-a23-usb-phy", .data = &sun8i_a23_cfg },
983 { .compatible = "allwinner,sun8i-a33-usb-phy", .data = &sun8i_a33_cfg },
984 { .compatible = "allwinner,sun8i-a83t-usb-phy", .data = &sun8i_a83t_cfg },
985 { .compatible = "allwinner,sun8i-h3-usb-phy", .data = &sun8i_h3_cfg },
986 { .compatible = "allwinner,sun8i-r40-usb-phy", .data = &sun8i_r40_cfg },
987 { .compatible = "allwinner,sun8i-v3s-usb-phy", .data = &sun8i_v3s_cfg },
988 { .compatible = "allwinner,sun50i-a64-usb-phy",
990 { .compatible = "allwinner,sun50i-h6-usb-phy", .data = &sun50i_h6_cfg },
1000 .name = "sun4i-usb-phy",
1005 MODULE_DESCRIPTION("Allwinner sun4i USB phy driver");