Lines Matching +full:usb +full:- +full:grf

1 // SPDX-License-Identifier: GPL-2.0+
11 #include <generic-phy.h>
15 #include <reset-uclass.h>
27 POWER_SUPPLY_TYPE_USB_FLOATING, /* DCP without shorting D+/D- */
45 * struct rockchip_chg_det_reg: usb charger detect registers
59 * struct rockchip_usb2phy_port_cfg: usb phy port configuration.
60 * @bypass_otgsuspendm: otg-suspendm bypass control register.
61 * 0: iddig; 1: grf.
120 * struct rockchip_usb2phy_cfg: usb phy configuration.
121 * @reg: the address offset of grf for usb-phy config.
141 * @grf: General Register Files register base.
143 * @vbus_supply: vbus supply for usb host.
147 void __iomem *grf; member
158 tmp = en ? reg->enable : reg->disable; in property_enable()
159 mask = GENMASK(reg->bitend, reg->bitstart); in property_enable()
160 val = (tmp << reg->bitstart) | (mask << U2PHY_BIT_WRITEABLE_SHIFT); in property_enable()
162 writel(val, base + reg->offset); in property_enable()
171 u32 mask = GENMASK(reg->bitend, reg->bitstart); in property_enabled()
173 orig = readl(base + reg->offset); in property_enabled()
175 tmp = (orig & mask) >> reg->bitstart; in property_enabled()
177 return tmp == reg->enable; in property_enabled()
206 ret = uclass_get_device_by_name(UCLASS_PHY, "usb2-phy", &udev); in rockchip_chg_get_type()
207 if (ret == -ENODEV) { in rockchip_chg_get_type()
216 port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG]; in rockchip_chg_get_type()
218 /* Check USB-Vbus status first */ in rockchip_chg_get_type()
219 if (!property_enabled(rphy->grf, &port_cfg->utmi_bvalid)) { in rockchip_chg_get_type()
224 reset_assert(rphy->reset); in rockchip_chg_get_type()
227 property_enable(rphy->grf, &rphy->phy_cfg->chg_det.chg_en, true); in rockchip_chg_get_type()
228 property_enable(rphy->grf, &rphy->phy_cfg->chg_det.chg_rst, false); in rockchip_chg_get_type()
233 chg_valid = property_enabled(rphy->grf, in rockchip_chg_get_type()
234 &rphy->phy_cfg->chg_det.chg_valid); in rockchip_chg_get_type()
236 property_enabled(rphy->grf, in rockchip_chg_get_type()
237 &rphy->phy_cfg->chg_det.phy_connect); in rockchip_chg_get_type()
248 reset_deassert(rphy->reset); in rockchip_chg_get_type()
250 property_enable(rphy->grf, &rphy->phy_cfg->chg_det.chg_rst, true); in rockchip_chg_get_type()
251 property_enable(rphy->grf, &rphy->phy_cfg->chg_det.chg_en, false); in rockchip_chg_get_type()
268 struct udevice *parent = phy->dev->parent; in rockchip_usb2phy_check_vbus()
271 void __iomem *base = rphy->grf; in rockchip_usb2phy_check_vbus()
275 if (phy->id == USB2PHY_PORT_HOST) { in rockchip_usb2phy_check_vbus()
276 vbus = rphy->vbus_supply[USB2PHY_PORT_HOST]; in rockchip_usb2phy_check_vbus()
277 } else if (phy->id == USB2PHY_PORT_OTG) { in rockchip_usb2phy_check_vbus()
278 port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG]; in rockchip_usb2phy_check_vbus()
279 if (port_cfg->utmi_iddig.offset) { in rockchip_usb2phy_check_vbus()
280 iddig = property_enabled(base, &port_cfg->utmi_iddig); in rockchip_usb2phy_check_vbus()
282 vbus = rphy->vbus_supply[USB2PHY_PORT_OTG]; in rockchip_usb2phy_check_vbus()
291 struct udevice *parent = phy->dev->parent; in rockchip_usb2phy_init()
295 if (phy->id == USB2PHY_PORT_OTG) { in rockchip_usb2phy_init()
296 port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG]; in rockchip_usb2phy_init()
297 } else if (phy->id == USB2PHY_PORT_HOST) { in rockchip_usb2phy_init()
298 port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_HOST]; in rockchip_usb2phy_init()
300 dev_err(phy->dev, "phy id %lu not support", phy->id); in rockchip_usb2phy_init()
301 return -EINVAL; in rockchip_usb2phy_init()
304 property_enable(rphy->grf, &port_cfg->phy_sus, false); in rockchip_usb2phy_init()
314 struct udevice *parent = phy->dev->parent; in rockchip_usb2phy_exit()
318 if (phy->id == USB2PHY_PORT_OTG) { in rockchip_usb2phy_exit()
319 port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG]; in rockchip_usb2phy_exit()
320 } else if (phy->id == USB2PHY_PORT_HOST) { in rockchip_usb2phy_exit()
321 port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_HOST]; in rockchip_usb2phy_exit()
323 dev_err(phy->dev, "phy id %lu not support", phy->id); in rockchip_usb2phy_exit()
324 return -EINVAL; in rockchip_usb2phy_exit()
327 property_enable(rphy->grf, &port_cfg->phy_sus, true); in rockchip_usb2phy_exit()
369 const char *dev_name = phy->dev->name; in rockchip_usb2phy_of_xlate()
370 struct udevice *parent = phy->dev->parent; in rockchip_usb2phy_of_xlate()
373 if (!strcasecmp(dev_name, "host-port")) { in rockchip_usb2phy_of_xlate()
374 phy->id = USB2PHY_PORT_HOST; in rockchip_usb2phy_of_xlate()
375 device_get_supply_regulator(phy->dev, "phy-supply", in rockchip_usb2phy_of_xlate()
376 &rphy->vbus_supply[USB2PHY_PORT_HOST]); in rockchip_usb2phy_of_xlate()
377 } else if (!strcasecmp(dev_name, "otg-port")) { in rockchip_usb2phy_of_xlate()
378 phy->id = USB2PHY_PORT_OTG; in rockchip_usb2phy_of_xlate()
379 device_get_supply_regulator(phy->dev, "phy-supply", in rockchip_usb2phy_of_xlate()
380 &rphy->vbus_supply[USB2PHY_PORT_OTG]); in rockchip_usb2phy_of_xlate()
383 return -EINVAL; in rockchip_usb2phy_of_xlate()
398 debug("%s: %s subnode not found", __func__, dev->name); in rockchip_usb2phy_bind()
399 return -ENXIO; in rockchip_usb2phy_bind()
423 rphy->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); in rockchip_usb2phy_probe()
426 if (reset_get_by_name(dev, "u2phy", rphy->reset)) { in rockchip_usb2phy_probe()
427 pr_err("can't get phy power reset for %s", dev->name); in rockchip_usb2phy_probe()
428 return -EINVAL; in rockchip_usb2phy_probe()
431 if (rphy->grf <= 0) { in rockchip_usb2phy_probe()
432 dev_err(dev, "get syscon grf failed\n"); in rockchip_usb2phy_probe()
433 return -EINVAL; in rockchip_usb2phy_probe()
438 return -EINVAL; in rockchip_usb2phy_probe()
445 return -EINVAL; in rockchip_usb2phy_probe()
452 rphy->phy_cfg = &phy_cfgs[index]; in rockchip_usb2phy_probe()
457 if (!rphy->phy_cfg) { in rockchip_usb2phy_probe()
458 dev_err(dev, "no phy-config can be matched\n"); in rockchip_usb2phy_probe()
459 return -EINVAL; in rockchip_usb2phy_probe()
462 if (rphy->phy_cfg->phy_tuning) in rockchip_usb2phy_probe()
463 rphy->phy_cfg->phy_tuning(rphy); in rockchip_usb2phy_probe()
556 { .compatible = "rockchip,rv1126-usb2phy", .data = (ulong)&rv1126_phy_cfgs },