• Home
  • Raw
  • Download

Lines Matching +full:brcmstb +full:- +full:reset

1 // SPDX-License-Identifier: GPL-2.0-only
3 * phy-brcm-usb.c - Broadcom USB Phy Driver
5 * Copyright (C) 2015-2017 Broadcom
17 #include <linux/soc/brcmstb/brcmstb.h>
18 #include <dt-bindings/phy/phy.h>
22 #include "phy-brcm-usb-init.h"
47 { USB_CTLR_MODE_TYPEC_PD, "typec-pd" }
91 priv->pm_active = true; in brcm_pm_notifier()
96 priv->pm_active = false; in brcm_pm_notifier()
115 container_of(phy, struct brcm_usb_phy_data, phys[phy->id]); in brcm_usb_phy_init()
117 if (priv->pm_active) in brcm_usb_phy_init()
124 mutex_lock(&priv->mutex); in brcm_usb_phy_init()
125 if (priv->init_count++ == 0) { in brcm_usb_phy_init()
126 clk_prepare_enable(priv->usb_20_clk); in brcm_usb_phy_init()
127 clk_prepare_enable(priv->usb_30_clk); in brcm_usb_phy_init()
128 clk_prepare_enable(priv->suspend_clk); in brcm_usb_phy_init()
129 brcm_usb_init_common(&priv->ini); in brcm_usb_phy_init()
131 mutex_unlock(&priv->mutex); in brcm_usb_phy_init()
132 if (phy->id == BRCM_USB_PHY_2_0) in brcm_usb_phy_init()
133 brcm_usb_init_eohci(&priv->ini); in brcm_usb_phy_init()
134 else if (phy->id == BRCM_USB_PHY_3_0) in brcm_usb_phy_init()
135 brcm_usb_init_xhci(&priv->ini); in brcm_usb_phy_init()
136 phy->inited = true; in brcm_usb_phy_init()
137 dev_dbg(&gphy->dev, "INIT, id: %d, total: %d\n", phy->id, in brcm_usb_phy_init()
138 priv->init_count); in brcm_usb_phy_init()
147 container_of(phy, struct brcm_usb_phy_data, phys[phy->id]); in brcm_usb_phy_exit()
149 if (priv->pm_active) in brcm_usb_phy_exit()
152 dev_dbg(&gphy->dev, "EXIT\n"); in brcm_usb_phy_exit()
153 if (phy->id == BRCM_USB_PHY_2_0) in brcm_usb_phy_exit()
154 brcm_usb_uninit_eohci(&priv->ini); in brcm_usb_phy_exit()
155 if (phy->id == BRCM_USB_PHY_3_0) in brcm_usb_phy_exit()
156 brcm_usb_uninit_xhci(&priv->ini); in brcm_usb_phy_exit()
158 /* If both xhci and eohci are gone, reset everything else */ in brcm_usb_phy_exit()
159 mutex_lock(&priv->mutex); in brcm_usb_phy_exit()
160 if (--priv->init_count == 0) { in brcm_usb_phy_exit()
161 brcm_usb_uninit_common(&priv->ini); in brcm_usb_phy_exit()
162 clk_disable_unprepare(priv->usb_20_clk); in brcm_usb_phy_exit()
163 clk_disable_unprepare(priv->usb_30_clk); in brcm_usb_phy_exit()
164 clk_disable_unprepare(priv->suspend_clk); in brcm_usb_phy_exit()
166 mutex_unlock(&priv->mutex); in brcm_usb_phy_exit()
167 phy->inited = false; in brcm_usb_phy_exit()
186 switch (args->args[0]) { in brcm_usb_phy_xlate()
189 if (data->phys[BRCM_USB_PHY_2_0].phy) in brcm_usb_phy_xlate()
190 return data->phys[BRCM_USB_PHY_2_0].phy; in brcm_usb_phy_xlate()
195 if (data->phys[BRCM_USB_PHY_3_0].phy) in brcm_usb_phy_xlate()
196 return data->phys[BRCM_USB_PHY_3_0].phy; in brcm_usb_phy_xlate()
200 return ERR_PTR(-ENODEV); in brcm_usb_phy_xlate()
215 return -EINVAL; in name_to_value()
235 priv->ini.mode)); in dr_mode_show()
251 brcm_usb_set_dual_select(&priv->ini, value); in dual_select_store()
266 value = brcm_usb_get_dual_select(&priv->ini); in dual_select_show()
291 -1,
303 -1,
313 -1,
319 .compatible = "brcm,bcm7216-usb-phy",
323 .compatible = "brcm,bcm7211-usb-phy",
327 .compatible = "brcm,brcmstb-usb-phy",
354 dev_dbg(&pdev->dev, in brcm_usb_get_regs()
359 dev_err(&pdev->dev, "can't get %s base addr\n", in brcm_usb_get_regs()
364 ini->regs[regs] = devm_ioremap_resource(&pdev->dev, res); in brcm_usb_get_regs()
365 if (IS_ERR(ini->regs[regs])) { in brcm_usb_get_regs()
366 dev_err(&pdev->dev, "can't map %s register space\n", in brcm_usb_get_regs()
377 struct device *dev = &pdev->dev; in brcm_usb_phy_dvr_init()
381 priv->usb_20_clk = of_clk_get_by_name(dn, "sw_usb"); in brcm_usb_phy_dvr_init()
382 if (IS_ERR(priv->usb_20_clk)) { in brcm_usb_phy_dvr_init()
383 if (PTR_ERR(priv->usb_20_clk) == -EPROBE_DEFER) in brcm_usb_phy_dvr_init()
384 return -EPROBE_DEFER; in brcm_usb_phy_dvr_init()
386 priv->usb_20_clk = NULL; in brcm_usb_phy_dvr_init()
388 err = clk_prepare_enable(priv->usb_20_clk); in brcm_usb_phy_dvr_init()
392 if (priv->has_eohci) { in brcm_usb_phy_dvr_init()
398 priv->phys[BRCM_USB_PHY_2_0].phy = gphy; in brcm_usb_phy_dvr_init()
399 priv->phys[BRCM_USB_PHY_2_0].id = BRCM_USB_PHY_2_0; in brcm_usb_phy_dvr_init()
400 phy_set_drvdata(gphy, &priv->phys[BRCM_USB_PHY_2_0]); in brcm_usb_phy_dvr_init()
403 if (priv->has_xhci) { in brcm_usb_phy_dvr_init()
409 priv->phys[BRCM_USB_PHY_3_0].phy = gphy; in brcm_usb_phy_dvr_init()
410 priv->phys[BRCM_USB_PHY_3_0].id = BRCM_USB_PHY_3_0; in brcm_usb_phy_dvr_init()
411 phy_set_drvdata(gphy, &priv->phys[BRCM_USB_PHY_3_0]); in brcm_usb_phy_dvr_init()
413 priv->usb_30_clk = of_clk_get_by_name(dn, "sw_usb3"); in brcm_usb_phy_dvr_init()
414 if (IS_ERR(priv->usb_30_clk)) { in brcm_usb_phy_dvr_init()
415 if (PTR_ERR(priv->usb_30_clk) == -EPROBE_DEFER) in brcm_usb_phy_dvr_init()
416 return -EPROBE_DEFER; in brcm_usb_phy_dvr_init()
419 priv->usb_30_clk = NULL; in brcm_usb_phy_dvr_init()
421 err = clk_prepare_enable(priv->usb_30_clk); in brcm_usb_phy_dvr_init()
426 priv->suspend_clk = clk_get(dev, "usb0_freerun"); in brcm_usb_phy_dvr_init()
427 if (IS_ERR(priv->suspend_clk)) { in brcm_usb_phy_dvr_init()
428 if (PTR_ERR(priv->suspend_clk) == -EPROBE_DEFER) in brcm_usb_phy_dvr_init()
429 return -EPROBE_DEFER; in brcm_usb_phy_dvr_init()
431 priv->suspend_clk = NULL; in brcm_usb_phy_dvr_init()
434 priv->wake_irq = platform_get_irq_byname(pdev, "wake"); in brcm_usb_phy_dvr_init()
435 if (priv->wake_irq < 0) in brcm_usb_phy_dvr_init()
436 priv->wake_irq = platform_get_irq_byname(pdev, "wakeup"); in brcm_usb_phy_dvr_init()
437 if (priv->wake_irq >= 0) { in brcm_usb_phy_dvr_init()
438 err = devm_request_irq(dev, priv->wake_irq, in brcm_usb_phy_dvr_init()
454 struct device *dev = &pdev->dev; in brcm_usb_phy_probe()
457 struct device_node *dn = pdev->dev.of_node; in brcm_usb_phy_probe()
468 return -ENOMEM; in brcm_usb_phy_probe()
471 priv->ini.family_id = brcmstb_get_family_id(); in brcm_usb_phy_probe()
472 priv->ini.product_id = brcmstb_get_product_id(); in brcm_usb_phy_probe()
474 match = of_match_node(brcm_usb_dt_ids, dev->of_node); in brcm_usb_phy_probe()
475 info = match->data; in brcm_usb_phy_probe()
476 dvr_init = info->init_func; in brcm_usb_phy_probe()
477 (*dvr_init)(&priv->ini); in brcm_usb_phy_probe()
480 priv->ini.family_name); in brcm_usb_phy_probe()
482 of_property_read_u32(dn, "brcm,ipp", &priv->ini.ipp); in brcm_usb_phy_probe()
483 of_property_read_u32(dn, "brcm,ioc", &priv->ini.ioc); in brcm_usb_phy_probe()
485 priv->ini.mode = USB_CTLR_MODE_HOST; in brcm_usb_phy_probe()
490 mode, &priv->ini.mode); in brcm_usb_phy_probe()
492 if (of_property_read_bool(dn, "brcm,has-xhci")) in brcm_usb_phy_probe()
493 priv->has_xhci = true; in brcm_usb_phy_probe()
494 if (of_property_read_bool(dn, "brcm,has-eohci")) in brcm_usb_phy_probe()
495 priv->has_eohci = true; in brcm_usb_phy_probe()
498 if (info->required_regs[x] >= BRCM_REGS_MAX) in brcm_usb_phy_probe()
501 err = brcm_usb_get_regs(pdev, info->required_regs[x], in brcm_usb_phy_probe()
502 &priv->ini, false); in brcm_usb_phy_probe()
504 return -EINVAL; in brcm_usb_phy_probe()
506 if (info->optional_reg) { in brcm_usb_phy_probe()
507 err = brcm_usb_get_regs(pdev, info->optional_reg, in brcm_usb_phy_probe()
508 &priv->ini, true); in brcm_usb_phy_probe()
510 return -EINVAL; in brcm_usb_phy_probe()
517 priv->pm_notifier.notifier_call = brcm_pm_notifier; in brcm_usb_phy_probe()
518 register_pm_notifier(&priv->pm_notifier); in brcm_usb_phy_probe()
520 mutex_init(&priv->mutex); in brcm_usb_phy_probe()
523 brcm_usb_init_ipp(&priv->ini); in brcm_usb_phy_probe()
529 if (priv->ini.mode != USB_CTLR_MODE_DRD) in brcm_usb_phy_probe()
531 err = sysfs_create_group(&dev->kobj, &brcm_usb_phy_group); in brcm_usb_phy_probe()
536 rmap = syscon_regmap_lookup_by_phandle(dev->of_node, in brcm_usb_phy_probe()
537 "syscon-piarbctl"); in brcm_usb_phy_probe()
539 rmap = syscon_regmap_lookup_by_phandle(dev->of_node, in brcm_usb_phy_probe()
540 "brcm,syscon-piarbctl"); in brcm_usb_phy_probe()
542 priv->ini.syscon_piarbctl = rmap; in brcm_usb_phy_probe()
545 if (priv->has_xhci) in brcm_usb_phy_probe()
546 brcm_usb_uninit_xhci(&priv->ini); in brcm_usb_phy_probe()
547 if (priv->has_eohci) in brcm_usb_phy_probe()
548 brcm_usb_uninit_eohci(&priv->ini); in brcm_usb_phy_probe()
549 brcm_usb_uninit_common(&priv->ini); in brcm_usb_phy_probe()
550 clk_disable_unprepare(priv->usb_20_clk); in brcm_usb_phy_probe()
551 clk_disable_unprepare(priv->usb_30_clk); in brcm_usb_phy_probe()
560 struct brcm_usb_phy_data *priv = dev_get_drvdata(&pdev->dev); in brcm_usb_phy_remove()
562 sysfs_remove_group(&pdev->dev.kobj, &brcm_usb_phy_group); in brcm_usb_phy_remove()
563 unregister_pm_notifier(&priv->pm_notifier); in brcm_usb_phy_remove()
573 if (priv->init_count) { in brcm_usb_phy_suspend()
575 priv->ini.wake_enabled = device_may_wakeup(dev); in brcm_usb_phy_suspend()
576 if (priv->phys[BRCM_USB_PHY_3_0].inited) in brcm_usb_phy_suspend()
577 brcm_usb_uninit_xhci(&priv->ini); in brcm_usb_phy_suspend()
578 if (priv->phys[BRCM_USB_PHY_2_0].inited) in brcm_usb_phy_suspend()
579 brcm_usb_uninit_eohci(&priv->ini); in brcm_usb_phy_suspend()
580 brcm_usb_uninit_common(&priv->ini); in brcm_usb_phy_suspend()
584 * to work for both older XHCI->3.0-clks, EOHCI->2.0-clks in brcm_usb_phy_suspend()
585 * and newer XHCI->2.0-clks/3.0-clks. in brcm_usb_phy_suspend()
588 if (!priv->ini.suspend_with_clocks) { in brcm_usb_phy_suspend()
589 if (priv->phys[BRCM_USB_PHY_3_0].inited) in brcm_usb_phy_suspend()
590 clk_disable_unprepare(priv->usb_30_clk); in brcm_usb_phy_suspend()
591 if (priv->phys[BRCM_USB_PHY_2_0].inited || in brcm_usb_phy_suspend()
592 !priv->has_eohci) in brcm_usb_phy_suspend()
593 clk_disable_unprepare(priv->usb_20_clk); in brcm_usb_phy_suspend()
595 if (priv->wake_irq >= 0) in brcm_usb_phy_suspend()
596 enable_irq_wake(priv->wake_irq); in brcm_usb_phy_suspend()
605 clk_prepare_enable(priv->usb_20_clk); in brcm_usb_phy_resume()
606 clk_prepare_enable(priv->usb_30_clk); in brcm_usb_phy_resume()
607 brcm_usb_init_ipp(&priv->ini); in brcm_usb_phy_resume()
613 if (priv->init_count) { in brcm_usb_phy_resume()
615 if (priv->wake_irq >= 0) in brcm_usb_phy_resume()
616 disable_irq_wake(priv->wake_irq); in brcm_usb_phy_resume()
617 brcm_usb_init_common(&priv->ini); in brcm_usb_phy_resume()
618 if (priv->phys[BRCM_USB_PHY_2_0].inited) { in brcm_usb_phy_resume()
619 brcm_usb_init_eohci(&priv->ini); in brcm_usb_phy_resume()
620 } else if (priv->has_eohci) { in brcm_usb_phy_resume()
621 brcm_usb_uninit_eohci(&priv->ini); in brcm_usb_phy_resume()
622 clk_disable_unprepare(priv->usb_20_clk); in brcm_usb_phy_resume()
624 if (priv->phys[BRCM_USB_PHY_3_0].inited) { in brcm_usb_phy_resume()
625 brcm_usb_init_xhci(&priv->ini); in brcm_usb_phy_resume()
626 } else if (priv->has_xhci) { in brcm_usb_phy_resume()
627 brcm_usb_uninit_xhci(&priv->ini); in brcm_usb_phy_resume()
628 clk_disable_unprepare(priv->usb_30_clk); in brcm_usb_phy_resume()
629 if (!priv->has_eohci) in brcm_usb_phy_resume()
630 clk_disable_unprepare(priv->usb_20_clk); in brcm_usb_phy_resume()
633 if (priv->has_xhci) in brcm_usb_phy_resume()
634 brcm_usb_uninit_xhci(&priv->ini); in brcm_usb_phy_resume()
635 if (priv->has_eohci) in brcm_usb_phy_resume()
636 brcm_usb_uninit_eohci(&priv->ini); in brcm_usb_phy_resume()
637 brcm_usb_uninit_common(&priv->ini); in brcm_usb_phy_resume()
638 clk_disable_unprepare(priv->usb_20_clk); in brcm_usb_phy_resume()
639 clk_disable_unprepare(priv->usb_30_clk); in brcm_usb_phy_resume()
641 priv->ini.wake_enabled = false; in brcm_usb_phy_resume()
656 .name = "brcmstb-usb-phy",
664 MODULE_ALIAS("platform:brcmstb-usb-phy");