static int mv_hsic_phy_probe(struct platform_device *pdev) { struct phy_provider *phy_provider; struct mv_hsic_phy *mv_phy; struct resource *r; mv_phy = devm_kzalloc(&pdev->dev, sizeof(*mv_phy), GFP_KERNEL); if (!mv_phy) return -ENOMEM; mv_phy->pdev = pdev; mv_phy->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(mv_phy->clk)) { dev_err(&pdev->dev, "failed to get clock.\n"); return PTR_ERR(mv_phy->clk); } r = platform_get_resource(pdev, IORESOURCE_MEM, 0); mv_phy->base = devm_ioremap_resource(&pdev->dev, r); if (IS_ERR(mv_phy->base)) return PTR_ERR(mv_phy->base); mv_phy->phy = devm_phy_create(&pdev->dev, pdev->dev.of_node, &hsic_ops); if (IS_ERR(mv_phy->phy)) return PTR_ERR(mv_phy->phy); phy_set_drvdata(mv_phy->phy, mv_phy); phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int armada375_usb_phy_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct phy *phy; struct phy_provider *phy_provider; void __iomem *usb_cluster_base; struct resource *res; struct armada375_cluster_phy *cluster_phy; cluster_phy = devm_kzalloc(dev, sizeof(*cluster_phy), GFP_KERNEL); if (!cluster_phy) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); usb_cluster_base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(usb_cluster_base)) return PTR_ERR(usb_cluster_base); phy = devm_phy_create(dev, NULL, &armada375_usb_phy_ops); if (IS_ERR(phy)) { dev_err(dev, "failed to create PHY\n"); return PTR_ERR(phy); } cluster_phy->phy = phy; cluster_phy->reg = usb_cluster_base; dev_set_drvdata(dev, cluster_phy); phy_provider = devm_of_phy_provider_register(&pdev->dev, armada375_usb_phy_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int hix5hd2_sata_phy_probe(struct platform_device *pdev) { struct phy_provider *phy_provider; struct device *dev = &pdev->dev; struct resource *res; struct phy *phy; struct hix5hd2_priv *priv; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) return -EINVAL; priv->base = devm_ioremap(dev, res->start, resource_size(res)); if (!priv->base) return -ENOMEM; priv->peri_ctrl = syscon_regmap_lookup_by_phandle(dev->of_node, "hisilicon,peripheral-syscon"); if (IS_ERR(priv->peri_ctrl)) priv->peri_ctrl = NULL; phy = devm_phy_create(dev, NULL, &hix5hd2_sata_phy_ops); if (IS_ERR(phy)) { dev_err(dev, "failed to create PHY\n"); return PTR_ERR(phy); } phy_set_drvdata(phy, priv); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int bcm_kona_usb2_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct bcm_kona_usb *phy; struct resource *res; struct phy *gphy; struct phy_provider *phy_provider; phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); if (!phy) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); phy->regs = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(phy->regs)) return PTR_ERR(phy->regs); platform_set_drvdata(pdev, phy); gphy = devm_phy_create(dev, NULL, &ops, NULL); if (IS_ERR(gphy)) return PTR_ERR(gphy); /* The Kona PHY supports an 8-bit wide UTMI interface */ phy_set_bus_width(gphy, 8); phy_set_drvdata(gphy, phy); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int phy_mvebu_sata_probe(struct platform_device *pdev) { struct phy_provider *phy_provider; struct resource *res; struct priv *priv; struct phy *phy; priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); priv->base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(priv->base)) return PTR_ERR(priv->base); priv->clk = devm_clk_get(&pdev->dev, "sata"); if (IS_ERR(priv->clk)) return PTR_ERR(priv->clk); phy = devm_phy_create(&pdev->dev, &phy_mvebu_sata_ops, NULL); if (IS_ERR(phy)) return PTR_ERR(phy); phy_set_drvdata(phy, priv); phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); if (IS_ERR(phy_provider)) return PTR_ERR(phy_provider); /* The boot loader may of left it on. Turn it off. */ phy_mvebu_sata_power_off(phy); return 0; }
static int lpc18xx_usb_otg_phy_probe(struct platform_device *pdev) { struct phy_provider *phy_provider; struct lpc18xx_usb_otg_phy *lpc; lpc = devm_kzalloc(&pdev->dev, sizeof(*lpc), GFP_KERNEL); if (!lpc) return -ENOMEM; lpc->reg = syscon_node_to_regmap(pdev->dev.of_node->parent); if (IS_ERR(lpc->reg)) { dev_err(&pdev->dev, "failed to get syscon\n"); return PTR_ERR(lpc->reg); } lpc->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(lpc->clk)) { dev_err(&pdev->dev, "failed to get clock\n"); return PTR_ERR(lpc->clk); } lpc->phy = devm_phy_create(&pdev->dev, NULL, &lpc18xx_usb_otg_phy_ops); if (IS_ERR(lpc->phy)) { dev_err(&pdev->dev, "failed to create PHY\n"); return PTR_ERR(lpc->phy); } phy_set_drvdata(lpc->phy, lpc); phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int exynos_dp_video_phy_probe(struct platform_device *pdev) { struct exynos_dp_video_phy *state; struct device *dev = &pdev->dev; const struct of_device_id *match; struct phy_provider *phy_provider; struct phy *phy; state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL); if (!state) return -ENOMEM; state->regs = syscon_regmap_lookup_by_phandle(dev->of_node, "samsung,pmu-syscon"); if (IS_ERR(state->regs)) { dev_err(dev, "Failed to lookup PMU regmap\n"); return PTR_ERR(state->regs); } match = of_match_node(exynos_dp_video_phy_of_match, dev->of_node); state->drvdata = match->data; phy = devm_phy_create(dev, NULL, &exynos_dp_video_phy_ops); if (IS_ERR(phy)) { dev_err(dev, "failed to create Display Port PHY\n"); return PTR_ERR(phy); } phy_set_drvdata(phy, state); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int spear1340_miphy_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct spear1340_miphy_priv *priv; struct phy_provider *phy_provider; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; priv->misc = syscon_regmap_lookup_by_phandle(dev->of_node, "misc"); if (IS_ERR(priv->misc)) { dev_err(dev, "failed to find misc regmap\n"); return PTR_ERR(priv->misc); } priv->phy = devm_phy_create(dev, NULL, &spear1340_miphy_ops); if (IS_ERR(priv->phy)) { dev_err(dev, "failed to create SATA PCIe PHY\n"); return PTR_ERR(priv->phy); } dev_set_drvdata(dev, priv); phy_set_drvdata(priv->phy, priv); phy_provider = devm_of_phy_provider_register(dev, spear1340_miphy_xlate); if (IS_ERR(phy_provider)) { dev_err(dev, "failed to register phy provider\n"); return PTR_ERR(phy_provider); } return 0; }
static int rockchip_dp_phy_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; struct phy_provider *phy_provider; struct rockchip_dp_phy *dp; struct phy *phy; int ret; if (!np) return -ENODEV; if (!dev->parent || !dev->parent->of_node) return -ENODEV; dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); if (IS_ERR(dp)) return -ENOMEM; dp->dev = dev; dp->phy_24m = devm_clk_get(dev, "24m"); if (IS_ERR(dp->phy_24m)) { dev_err(dev, "cannot get clock 24m\n"); return PTR_ERR(dp->phy_24m); } ret = clk_set_rate(dp->phy_24m, 24000000); if (ret < 0) { dev_err(dp->dev, "cannot set clock phy_24m %d\n", ret); return ret; } dp->grf = syscon_node_to_regmap(dev->parent->of_node); if (IS_ERR(dp->grf)) { dev_err(dev, "rk3288-dp needs the General Register Files syscon\n"); return PTR_ERR(dp->grf); } ret = regmap_write(dp->grf, GRF_SOC_CON12, GRF_EDP_REF_CLK_SEL_INTER | GRF_EDP_REF_CLK_SEL_INTER_HIWORD_MASK); if (ret != 0) { dev_err(dp->dev, "Could not config GRF edp ref clk: %d\n", ret); return ret; } phy = devm_phy_create(dev, np, &rockchip_dp_phy_ops); if (IS_ERR(phy)) { dev_err(dev, "failed to create phy\n"); return PTR_ERR(phy); } phy_set_drvdata(phy, dp); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int qcom_ipq806x_sata_phy_probe(struct platform_device *pdev) { struct qcom_ipq806x_sata_phy *phy; struct device *dev = &pdev->dev; struct resource *res; struct phy_provider *phy_provider; struct phy *generic_phy; int ret; phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); if (!phy) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); phy->mmio = devm_ioremap_resource(dev, res); if (IS_ERR(phy->mmio)) return PTR_ERR(phy->mmio); generic_phy = devm_phy_create(dev, NULL, &qcom_ipq806x_sata_phy_ops, NULL); if (IS_ERR(generic_phy)) { dev_err(dev, "%s: failed to create phy\n", __func__); return PTR_ERR(generic_phy); } phy->dev = dev; phy_set_drvdata(generic_phy, phy); platform_set_drvdata(pdev, phy); phy->cfg_clk = devm_clk_get(dev, "cfg"); if (IS_ERR(phy->cfg_clk)) { dev_err(dev, "Failed to get sata cfg clock\n"); return PTR_ERR(phy->cfg_clk); } ret = clk_prepare_enable(phy->cfg_clk); if (ret) return ret; phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); if (IS_ERR(phy_provider)) { clk_disable_unprepare(phy->cfg_clk); dev_err(dev, "%s: failed to register phy\n", __func__); return PTR_ERR(phy_provider); } return 0; }
static int uniphier_pciephy_probe(struct platform_device *pdev) { struct uniphier_pciephy_priv *priv; struct phy_provider *phy_provider; struct device *dev = &pdev->dev; struct regmap *regmap; struct resource *res; struct phy *phy; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; priv->data = of_device_get_match_data(dev); if (WARN_ON(!priv->data)) return -EINVAL; priv->dev = dev; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); priv->base = devm_ioremap_resource(dev, res); if (IS_ERR(priv->base)) return PTR_ERR(priv->base); priv->clk = devm_clk_get(dev, NULL); if (IS_ERR(priv->clk)) return PTR_ERR(priv->clk); priv->rst = devm_reset_control_get_shared(dev, NULL); if (IS_ERR(priv->rst)) return PTR_ERR(priv->rst); phy = devm_phy_create(dev, dev->of_node, &uniphier_pciephy_ops); if (IS_ERR(phy)) return PTR_ERR(phy); regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "socionext,syscon"); if (!IS_ERR(regmap) && priv->data->has_syscon) regmap_update_bits(regmap, SG_USBPCIESEL, SG_USBPCIESEL_PCIE, SG_USBPCIESEL_PCIE); phy_set_drvdata(phy, priv); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int exynos_mipi_video_phy_probe(struct platform_device *pdev) { struct exynos_mipi_video_phy *state; struct device *dev = &pdev->dev; struct phy_provider *phy_provider; unsigned int i; state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL); if (!state) return -ENOMEM; state->regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "syscon"); if (IS_ERR(state->regmap)) { struct resource *res; dev_info(dev, "regmap lookup failed: %ld\n", PTR_ERR(state->regmap)); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); state->regs = devm_ioremap_resource(dev, res); if (IS_ERR(state->regs)) return PTR_ERR(state->regs); } dev_set_drvdata(dev, state); spin_lock_init(&state->slock); for (i = 0; i < EXYNOS_MIPI_PHYS_NUM; i++) { struct phy *phy = devm_phy_create(dev, NULL, &exynos_mipi_video_phy_ops); if (IS_ERR(phy)) { dev_err(dev, "failed to create PHY %d\n", i); return PTR_ERR(phy); } state->phys[i].phy = phy; state->phys[i].index = i; phy_set_drvdata(phy, &state->phys[i]); } phy_provider = devm_of_phy_provider_register(dev, exynos_mipi_video_phy_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int exynos_pcie_phy_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct exynos_pcie_phy *exynos_phy; struct phy *generic_phy; struct phy_provider *phy_provider; struct resource *res; const struct exynos_pcie_phy_data *drv_data; drv_data = of_device_get_match_data(dev); if (!drv_data) return -ENODEV; exynos_phy = devm_kzalloc(dev, sizeof(*exynos_phy), GFP_KERNEL); if (!exynos_phy) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); exynos_phy->phy_base = devm_ioremap_resource(dev, res); if (IS_ERR(exynos_phy->phy_base)) return PTR_ERR(exynos_phy->phy_base); res = platform_get_resource(pdev, IORESOURCE_MEM, 1); exynos_phy->blk_base = devm_ioremap_resource(dev, res); if (IS_ERR(exynos_phy->blk_base)) return PTR_ERR(exynos_phy->blk_base); exynos_phy->drv_data = drv_data; generic_phy = devm_phy_create(dev, dev->of_node, drv_data->ops); if (IS_ERR(generic_phy)) { dev_err(dev, "failed to create PHY\n"); return PTR_ERR(generic_phy); } phy_set_drvdata(generic_phy, exynos_phy); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int tangox_sata_phy_probe(struct platform_device *pdev) { struct device_node *node = pdev->dev.of_node; struct tangox_sata_phy *phy; struct resource *res; struct phy *genphy; struct phy_provider *phy_prov; phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL); if (!phy) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) return -EINVAL; phy->base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(phy->base)) return PTR_ERR(phy->base); phy->clk_sel = of_property_read_bool(node, "sigma,internal-clock"); of_property_read_u32(node, "clock-frequency", &phy->clk_ref); of_property_read_u32(node, "sigma,tx-erc", &phy->tx_erc); of_property_read_u32(node, "sigma,tx-ssc", &phy->tx_ssc); of_property_read_u32_array(node, "sigma,rx-ssc", phy->rx_ssc, 2); genphy = devm_phy_create(&pdev->dev, NULL, &tangox_sata_phy_ops); if (IS_ERR(genphy)) return PTR_ERR(genphy); phy_set_drvdata(genphy, phy); phy_prov = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_prov); }
static int phy_berlin_usb_probe(struct platform_device *pdev) { const struct of_device_id *match = of_match_device(phy_berlin_usb_of_match, &pdev->dev); struct phy_berlin_usb_priv *priv; struct resource *res; struct phy *phy; struct phy_provider *phy_provider; priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); priv->base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(priv->base)) return PTR_ERR(priv->base); priv->rst_ctrl = devm_reset_control_get(&pdev->dev, NULL); if (IS_ERR(priv->rst_ctrl)) return PTR_ERR(priv->rst_ctrl); priv->pll_divider = *((u32 *)match->data); phy = devm_phy_create(&pdev->dev, NULL, &phy_berlin_usb_ops); if (IS_ERR(phy)) { dev_err(&pdev->dev, "failed to create PHY\n"); return PTR_ERR(phy); } platform_set_drvdata(pdev, priv); phy_set_drvdata(phy, priv); phy_provider = devm_of_phy_provider_register(&pdev->dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
struct phy *ufs_qcom_phy_generic_probe(struct platform_device *pdev, struct ufs_qcom_phy *common_cfg, const struct phy_ops *ufs_qcom_phy_gen_ops, struct ufs_qcom_phy_specific_ops *phy_spec_ops) { int err; struct device *dev = &pdev->dev; struct phy *generic_phy = NULL; struct phy_provider *phy_provider; err = ufs_qcom_phy_base_init(pdev, common_cfg); if (err) { dev_err(dev, "%s: phy base init failed %d\n", __func__, err); goto out; } phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); if (IS_ERR(phy_provider)) { err = PTR_ERR(phy_provider); dev_err(dev, "%s: failed to register phy %d\n", __func__, err); goto out; } generic_phy = devm_phy_create(dev, NULL, ufs_qcom_phy_gen_ops); if (IS_ERR(generic_phy)) { err = PTR_ERR(generic_phy); dev_err(dev, "%s: failed to create phy %d\n", __func__, err); generic_phy = NULL; goto out; } common_cfg->phy_spec_ops = phy_spec_ops; common_cfg->dev = dev; out: return generic_phy; }
static int omap_usb2_probe(struct platform_device *pdev) { struct omap_usb *phy; struct phy *generic_phy; struct resource *res; struct phy_provider *phy_provider; struct usb_otg *otg; struct device_node *node = pdev->dev.of_node; struct device_node *control_node; struct platform_device *control_pdev; const struct of_device_id *of_id; struct usb_phy_data *phy_data; of_id = of_match_device(omap_usb2_id_table, &pdev->dev); if (!of_id) return -EINVAL; phy_data = (struct usb_phy_data *)of_id->data; phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL); if (!phy) return -ENOMEM; otg = devm_kzalloc(&pdev->dev, sizeof(*otg), GFP_KERNEL); if (!otg) return -ENOMEM; phy->dev = &pdev->dev; phy->phy.dev = phy->dev; phy->phy.label = phy_data->label; phy->phy.otg = otg; phy->phy.type = USB_PHY_TYPE_USB2; phy->mask = phy_data->mask; phy->power_on = phy_data->power_on; phy->power_off = phy_data->power_off; if (phy_data->flags & OMAP_USB2_CALIBRATE_FALSE_DISCONNECT) { res = platform_get_resource(pdev, IORESOURCE_MEM, 0); phy->phy_base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(phy->phy_base)) return PTR_ERR(phy->phy_base); phy->flags |= OMAP_USB2_CALIBRATE_FALSE_DISCONNECT; } phy->syscon_phy_power = syscon_regmap_lookup_by_phandle(node, "syscon-phy-power"); if (IS_ERR(phy->syscon_phy_power)) { dev_dbg(&pdev->dev, "can't get syscon-phy-power, using control device\n"); phy->syscon_phy_power = NULL; control_node = of_parse_phandle(node, "ctrl-module", 0); if (!control_node) { dev_err(&pdev->dev, "Failed to get control device phandle\n"); return -EINVAL; } control_pdev = of_find_device_by_node(control_node); if (!control_pdev) { dev_err(&pdev->dev, "Failed to get control device\n"); return -EINVAL; } phy->control_dev = &control_pdev->dev; } else { if (of_property_read_u32_index(node, "syscon-phy-power", 1, &phy->power_reg)) { dev_err(&pdev->dev, "couldn't get power reg. offset\n"); return -EINVAL; } } phy->wkupclk = devm_clk_get(phy->dev, "wkupclk"); if (IS_ERR(phy->wkupclk)) { if (PTR_ERR(phy->wkupclk) == -EPROBE_DEFER) return -EPROBE_DEFER; dev_warn(&pdev->dev, "unable to get wkupclk %ld, trying old name\n", PTR_ERR(phy->wkupclk)); phy->wkupclk = devm_clk_get(phy->dev, "usb_phy_cm_clk32k"); if (IS_ERR(phy->wkupclk)) { if (PTR_ERR(phy->wkupclk) != -EPROBE_DEFER) dev_err(&pdev->dev, "unable to get usb_phy_cm_clk32k\n"); return PTR_ERR(phy->wkupclk); } else { dev_warn(&pdev->dev, "found usb_phy_cm_clk32k, please fix DTS\n"); } } phy->optclk = devm_clk_get(phy->dev, "refclk"); if (IS_ERR(phy->optclk)) { if (PTR_ERR(phy->optclk) == -EPROBE_DEFER) return -EPROBE_DEFER; dev_dbg(&pdev->dev, "unable to get refclk, trying old name\n"); phy->optclk = devm_clk_get(phy->dev, "usb_otg_ss_refclk960m"); if (IS_ERR(phy->optclk)) { if (PTR_ERR(phy->optclk) != -EPROBE_DEFER) { dev_dbg(&pdev->dev, "unable to get usb_otg_ss_refclk960m\n"); } } else { dev_warn(&pdev->dev, "found usb_otg_ss_refclk960m, please fix DTS\n"); } } otg->set_host = omap_usb_set_host; otg->set_peripheral = omap_usb_set_peripheral; if (phy_data->flags & OMAP_USB2_HAS_SET_VBUS) otg->set_vbus = omap_usb_set_vbus; if (phy_data->flags & OMAP_USB2_HAS_START_SRP) otg->start_srp = omap_usb_start_srp; otg->usb_phy = &phy->phy; platform_set_drvdata(pdev, phy); pm_runtime_enable(phy->dev); generic_phy = devm_phy_create(phy->dev, NULL, &ops); if (IS_ERR(generic_phy)) { pm_runtime_disable(phy->dev); return PTR_ERR(generic_phy); } phy_set_drvdata(generic_phy, phy); omap_usb_power_off(generic_phy); phy_provider = devm_of_phy_provider_register(phy->dev, of_phy_simple_xlate); if (IS_ERR(phy_provider)) { pm_runtime_disable(phy->dev); return PTR_ERR(phy_provider); } usb_add_phy_dev(&phy->phy); return 0; }
static int phy_mdm6600_probe(struct platform_device *pdev) { struct phy_mdm6600 *ddata; int error; ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); if (!ddata) return -ENOMEM; INIT_DELAYED_WORK(&ddata->bootup_work, phy_mdm6600_deferred_power_on); INIT_DELAYED_WORK(&ddata->status_work, phy_mdm6600_status); INIT_DELAYED_WORK(&ddata->modem_wake_work, phy_mdm6600_modem_wake); init_completion(&ddata->ack); ddata->dev = &pdev->dev; platform_set_drvdata(pdev, ddata); error = phy_mdm6600_init_lines(ddata); if (error) return error; phy_mdm6600_init_irq(ddata); ddata->generic_phy = devm_phy_create(ddata->dev, NULL, &gpio_usb_ops); if (IS_ERR(ddata->generic_phy)) { error = PTR_ERR(ddata->generic_phy); goto cleanup; } phy_set_drvdata(ddata->generic_phy, ddata); ddata->phy_provider = devm_of_phy_provider_register(ddata->dev, of_phy_simple_xlate); if (IS_ERR(ddata->phy_provider)) { error = PTR_ERR(ddata->phy_provider); goto cleanup; } schedule_delayed_work(&ddata->bootup_work, 0); /* * See phy_mdm6600_device_power_on(). We should be able * to remove this eventually when ohci-platform can deal * with -EPROBE_DEFER. */ msleep(PHY_MDM6600_PHY_DELAY_MS + 500); /* * Enable PM runtime only after PHY has been powered up properly. * It is currently only needed after USB suspends mdm6600 and n_gsm * needs to access the device. We don't want to do this earlier as * gpio mode0 pin doubles as mdm6600 wake-up gpio. */ pm_runtime_use_autosuspend(ddata->dev); pm_runtime_set_autosuspend_delay(ddata->dev, MDM6600_MODEM_IDLE_DELAY_MS); pm_runtime_enable(ddata->dev); error = pm_runtime_get_sync(ddata->dev); if (error < 0) { dev_warn(ddata->dev, "failed to wake modem: %i\n", error); pm_runtime_put_noidle(ddata->dev); } pm_runtime_mark_last_busy(ddata->dev); pm_runtime_put_autosuspend(ddata->dev); return 0; cleanup: phy_mdm6600_device_power_off(ddata); return error; }
static int twl4030_usb_probe(struct platform_device *pdev) { struct twl4030_usb_data *pdata = dev_get_platdata(&pdev->dev); struct twl4030_usb *twl; struct phy *phy; int status, err; struct usb_otg *otg; struct device_node *np = pdev->dev.of_node; struct phy_provider *phy_provider; struct phy_init_data *init_data = NULL; twl = devm_kzalloc(&pdev->dev, sizeof(*twl), GFP_KERNEL); if (!twl) return -ENOMEM; if (np) of_property_read_u32(np, "usb_mode", (enum twl4030_usb_mode *)&twl->usb_mode); else if (pdata) { twl->usb_mode = pdata->usb_mode; init_data = pdata->init_data; } else { dev_err(&pdev->dev, "twl4030 initialized without pdata\n"); return -EINVAL; } otg = devm_kzalloc(&pdev->dev, sizeof(*otg), GFP_KERNEL); if (!otg) return -ENOMEM; twl->dev = &pdev->dev; twl->irq = platform_get_irq(pdev, 0); twl->vbus_supplied = false; twl->asleep = 1; twl->linkstat = OMAP_MUSB_UNKNOWN; twl->phy.dev = twl->dev; twl->phy.label = "twl4030"; twl->phy.otg = otg; twl->phy.type = USB_PHY_TYPE_USB2; otg->phy = &twl->phy; otg->set_host = twl4030_set_host; otg->set_peripheral = twl4030_set_peripheral; phy = devm_phy_create(twl->dev, NULL, &ops, init_data); if (IS_ERR(phy)) { dev_dbg(&pdev->dev, "Failed to create PHY\n"); return PTR_ERR(phy); } phy_set_drvdata(phy, twl); phy_provider = devm_of_phy_provider_register(twl->dev, of_phy_simple_xlate); if (IS_ERR(phy_provider)) return PTR_ERR(phy_provider); /* init spinlock for workqueue */ spin_lock_init(&twl->lock); INIT_DELAYED_WORK(&twl->id_workaround_work, twl4030_id_workaround_work); err = twl4030_usb_ldo_init(twl); if (err) { dev_err(&pdev->dev, "ldo init failed\n"); return err; } usb_add_phy_dev(&twl->phy); platform_set_drvdata(pdev, twl); if (device_create_file(&pdev->dev, &dev_attr_vbus)) dev_warn(&pdev->dev, "could not create sysfs file\n"); ATOMIC_INIT_NOTIFIER_HEAD(&twl->phy.notifier); /* Our job is to use irqs and status from the power module * to keep the transceiver disabled when nothing's connected. * * FIXME we actually shouldn't start enabling it until the * USB controller drivers have said they're ready, by calling * set_host() and/or set_peripheral() ... OTG_capable boards * need both handles, otherwise just one suffices. */ twl->irq_enabled = true; status = devm_request_threaded_irq(twl->dev, twl->irq, NULL, twl4030_usb_irq, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING | IRQF_ONESHOT, "twl4030_usb", twl); if (status < 0) { dev_dbg(&pdev->dev, "can't get IRQ %d, err %d\n", twl->irq, status); return status; } dev_info(&pdev->dev, "Initialized TWL4030 USB module\n"); return 0; }
static int da8xx_usb_phy_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *node = dev->of_node; struct da8xx_usb_phy *d_phy; d_phy = devm_kzalloc(dev, sizeof(*d_phy), GFP_KERNEL); if (!d_phy) return -ENOMEM; if (node) d_phy->regmap = syscon_regmap_lookup_by_compatible( "ti,da830-cfgchip"); else d_phy->regmap = syscon_regmap_lookup_by_pdevname("syscon.0"); if (IS_ERR(d_phy->regmap)) { dev_err(dev, "Failed to get syscon\n"); return PTR_ERR(d_phy->regmap); } d_phy->usb11_clk = devm_clk_get(dev, "usb11_phy"); if (IS_ERR(d_phy->usb11_clk)) { dev_err(dev, "Failed to get usb11_phy clock\n"); return PTR_ERR(d_phy->usb11_clk); } d_phy->usb20_clk = devm_clk_get(dev, "usb20_phy"); if (IS_ERR(d_phy->usb20_clk)) { dev_err(dev, "Failed to get usb20_phy clock\n"); return PTR_ERR(d_phy->usb20_clk); } d_phy->usb11_phy = devm_phy_create(dev, node, &da8xx_usb11_phy_ops); if (IS_ERR(d_phy->usb11_phy)) { dev_err(dev, "Failed to create usb11 phy\n"); return PTR_ERR(d_phy->usb11_phy); } d_phy->usb20_phy = devm_phy_create(dev, node, &da8xx_usb20_phy_ops); if (IS_ERR(d_phy->usb20_phy)) { dev_err(dev, "Failed to create usb20 phy\n"); return PTR_ERR(d_phy->usb20_phy); } platform_set_drvdata(pdev, d_phy); phy_set_drvdata(d_phy->usb11_phy, d_phy); phy_set_drvdata(d_phy->usb20_phy, d_phy); if (node) { d_phy->phy_provider = devm_of_phy_provider_register(dev, da8xx_usb_phy_of_xlate); if (IS_ERR(d_phy->phy_provider)) { dev_err(dev, "Failed to create phy provider\n"); return PTR_ERR(d_phy->phy_provider); } } else { int ret; ret = phy_create_lookup(d_phy->usb11_phy, "usb-phy", "ohci.0"); if (ret) dev_warn(dev, "Failed to create usb11 phy lookup\n"); ret = phy_create_lookup(d_phy->usb20_phy, "usb-phy", "musb-da8xx"); if (ret) dev_warn(dev, "Failed to create usb20 phy lookup\n"); } return 0; }
static int mtk_hdmi_phy_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct mtk_hdmi_phy *hdmi_phy; struct resource *mem; struct clk *ref_clk; const char *ref_clk_name; struct clk_init_data clk_init = { .ops = &mtk_hdmi_pll_ops, .num_parents = 1, .parent_names = (const char * const *)&ref_clk_name, .flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_GATE, }; struct phy *phy; struct phy_provider *phy_provider; int ret; hdmi_phy = devm_kzalloc(dev, sizeof(*hdmi_phy), GFP_KERNEL); if (!hdmi_phy) return -ENOMEM; mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); hdmi_phy->regs = devm_ioremap_resource(dev, mem); if (IS_ERR(hdmi_phy->regs)) { ret = PTR_ERR(hdmi_phy->regs); dev_err(dev, "Failed to get memory resource: %d\n", ret); return ret; } ref_clk = devm_clk_get(dev, "pll_ref"); if (IS_ERR(ref_clk)) { ret = PTR_ERR(ref_clk); dev_err(&pdev->dev, "Failed to get PLL reference clock: %d\n", ret); return ret; } ref_clk_name = __clk_get_name(ref_clk); ret = of_property_read_string(dev->of_node, "clock-output-names", &clk_init.name); if (ret < 0) { dev_err(dev, "Failed to read clock-output-names: %d\n", ret); return ret; } hdmi_phy->pll_hw.init = &clk_init; hdmi_phy->pll = devm_clk_register(dev, &hdmi_phy->pll_hw); if (IS_ERR(hdmi_phy->pll)) { ret = PTR_ERR(hdmi_phy->pll); dev_err(dev, "Failed to register PLL: %d\n", ret); return ret; } ret = of_property_read_u32(dev->of_node, "mediatek,ibias", &hdmi_phy->ibias); if (ret < 0) { dev_err(&pdev->dev, "Failed to get ibias: %d\n", ret); return ret; } ret = of_property_read_u32(dev->of_node, "mediatek,ibias_up", &hdmi_phy->ibias_up); if (ret < 0) { dev_err(&pdev->dev, "Failed to get ibias up: %d\n", ret); return ret; } dev_info(dev, "Using default TX DRV impedance: 4.2k/36\n"); hdmi_phy->drv_imp_clk = 0x30; hdmi_phy->drv_imp_d2 = 0x30; hdmi_phy->drv_imp_d1 = 0x30; hdmi_phy->drv_imp_d0 = 0x30; phy = devm_phy_create(dev, NULL, &mtk_hdmi_phy_ops); if (IS_ERR(phy)) { dev_err(dev, "Failed to create HDMI PHY\n"); return PTR_ERR(phy); } phy_set_drvdata(phy, hdmi_phy); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); if (IS_ERR(phy_provider)) return PTR_ERR(phy_provider); hdmi_phy->dev = dev; return of_clk_add_provider(dev->of_node, of_clk_src_simple_get, hdmi_phy->pll); } static int mtk_hdmi_phy_remove(struct platform_device *pdev) { return 0; } static const struct of_device_id mtk_hdmi_phy_match[] = { { .compatible = "mediatek,mt8173-hdmi-phy", }, {}, };
static int omap_usb2_probe(struct platform_device *pdev) { struct omap_usb *phy; struct phy *generic_phy; struct resource *res; struct phy_provider *phy_provider; struct usb_otg *otg; struct device_node *node = pdev->dev.of_node; struct device_node *control_node; struct platform_device *control_pdev; const struct of_device_id *of_id; struct usb_phy_data *phy_data; of_id = of_match_device(of_match_ptr(omap_usb2_id_table), &pdev->dev); if (!of_id) return -EINVAL; phy_data = (struct usb_phy_data *)of_id->data; phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL); if (!phy) { dev_err(&pdev->dev, "unable to allocate memory for USB2 PHY\n"); return -ENOMEM; } otg = devm_kzalloc(&pdev->dev, sizeof(*otg), GFP_KERNEL); if (!otg) { dev_err(&pdev->dev, "unable to allocate memory for USB OTG\n"); return -ENOMEM; } phy->dev = &pdev->dev; phy->phy.dev = phy->dev; phy->phy.label = phy_data->label; phy->phy.otg = otg; phy->phy.type = USB_PHY_TYPE_USB2; if (phy_data->flags & OMAP_USB2_CALIBRATE_FALSE_DISCONNECT) { res = platform_get_resource(pdev, IORESOURCE_MEM, 0); phy->phy_base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(phy->phy_base)) return PTR_ERR(phy->phy_base); phy->flags |= OMAP_USB2_CALIBRATE_FALSE_DISCONNECT; } control_node = of_parse_phandle(node, "ctrl-module", 0); if (!control_node) { dev_err(&pdev->dev, "Failed to get control device phandle\n"); return -EINVAL; } control_pdev = of_find_device_by_node(control_node); if (!control_pdev) { dev_err(&pdev->dev, "Failed to get control device\n"); return -EINVAL; } phy->control_dev = &control_pdev->dev; omap_control_phy_power(phy->control_dev, 0); otg->set_host = omap_usb_set_host; otg->set_peripheral = omap_usb_set_peripheral; if (phy_data->flags & OMAP_USB2_HAS_SET_VBUS) otg->set_vbus = omap_usb_set_vbus; if (phy_data->flags & OMAP_USB2_HAS_START_SRP) otg->start_srp = omap_usb_start_srp; otg->phy = &phy->phy; platform_set_drvdata(pdev, phy); generic_phy = devm_phy_create(phy->dev, &ops, NULL); if (IS_ERR(generic_phy)) return PTR_ERR(generic_phy); phy_set_drvdata(generic_phy, phy); pm_runtime_enable(phy->dev); phy_provider = devm_of_phy_provider_register(phy->dev, of_phy_simple_xlate); if (IS_ERR(phy_provider)) { pm_runtime_disable(phy->dev); return PTR_ERR(phy_provider); } phy->wkupclk = devm_clk_get(phy->dev, "wkupclk"); if (IS_ERR(phy->wkupclk)) { dev_warn(&pdev->dev, "unable to get wkupclk, trying old name\n"); phy->wkupclk = devm_clk_get(phy->dev, "usb_phy_cm_clk32k"); if (IS_ERR(phy->wkupclk)) { dev_err(&pdev->dev, "unable to get usb_phy_cm_clk32k\n"); return PTR_ERR(phy->wkupclk); } else { dev_warn(&pdev->dev, "found usb_phy_cm_clk32k, please fix DTS\n"); } } clk_prepare(phy->wkupclk); phy->optclk = devm_clk_get(phy->dev, "refclk"); if (IS_ERR(phy->optclk)) { dev_dbg(&pdev->dev, "unable to get refclk, trying old name\n"); phy->optclk = devm_clk_get(phy->dev, "usb_otg_ss_refclk960m"); if (IS_ERR(phy->optclk)) { dev_dbg(&pdev->dev, "unable to get usb_otg_ss_refclk960m\n"); } else { dev_warn(&pdev->dev, "found usb_otg_ss_refclk960m, please fix DTS\n"); } } else { clk_prepare(phy->optclk); } usb_add_phy_dev(&phy->phy); return 0; }
static int ti_pipe3_probe(struct platform_device *pdev) { struct ti_pipe3 *phy; struct phy *generic_phy; struct phy_provider *phy_provider; struct resource *res; struct device_node *node = pdev->dev.of_node; struct device_node *control_node; struct platform_device *control_pdev; const struct of_device_id *match; struct clk *clk; phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL); if (!phy) { dev_err(&pdev->dev, "unable to alloc mem for TI PIPE3 PHY\n"); return -ENOMEM; } phy->dev = &pdev->dev; if (!of_device_is_compatible(node, "ti,phy-pipe3-pcie")) { match = of_match_device(of_match_ptr(ti_pipe3_id_table), &pdev->dev); if (!match) return -EINVAL; phy->dpll_map = (struct pipe3_dpll_map *)match->data; if (!phy->dpll_map) { dev_err(&pdev->dev, "no DPLL data\n"); return -EINVAL; } res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pll_ctrl"); phy->pll_ctrl_base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(phy->pll_ctrl_base)) return PTR_ERR(phy->pll_ctrl_base); phy->sys_clk = devm_clk_get(phy->dev, "sysclk"); if (IS_ERR(phy->sys_clk)) { dev_err(&pdev->dev, "unable to get sysclk\n"); return -EINVAL; } } phy->refclk = devm_clk_get(phy->dev, "refclk"); if (IS_ERR(phy->refclk)) { dev_err(&pdev->dev, "unable to get refclk\n"); /* older DTBs have missing refclk in SATA PHY * so don't bail out in case of SATA PHY. */ if (!of_device_is_compatible(node, "ti,phy-pipe3-sata")) return PTR_ERR(phy->refclk); } if (!of_device_is_compatible(node, "ti,phy-pipe3-sata")) { phy->wkupclk = devm_clk_get(phy->dev, "wkupclk"); if (IS_ERR(phy->wkupclk)) { dev_err(&pdev->dev, "unable to get wkupclk\n"); return PTR_ERR(phy->wkupclk); } } else { phy->wkupclk = ERR_PTR(-ENODEV); phy->dpll_reset_syscon = syscon_regmap_lookup_by_phandle(node, "syscon-pllreset"); if (IS_ERR(phy->dpll_reset_syscon)) { dev_info(&pdev->dev, "can't get syscon-pllreset, sata dpll won't idle\n"); phy->dpll_reset_syscon = NULL; } else { if (of_property_read_u32_index(node, "syscon-pllreset", 1, &phy->dpll_reset_reg)) { dev_err(&pdev->dev, "couldn't get pllreset reg. offset\n"); return -EINVAL; } } } if (of_device_is_compatible(node, "ti,phy-pipe3-pcie")) { clk = devm_clk_get(phy->dev, "dpll_ref"); if (IS_ERR(clk)) { dev_err(&pdev->dev, "unable to get dpll ref clk\n"); return PTR_ERR(clk); } clk_set_rate(clk, 1500000000); clk = devm_clk_get(phy->dev, "dpll_ref_m2"); if (IS_ERR(clk)) { dev_err(&pdev->dev, "unable to get dpll ref m2 clk\n"); return PTR_ERR(clk); } clk_set_rate(clk, 100000000); clk = devm_clk_get(phy->dev, "phy-div"); if (IS_ERR(clk)) { dev_err(&pdev->dev, "unable to get phy-div clk\n"); return PTR_ERR(clk); } clk_set_rate(clk, 100000000); phy->div_clk = devm_clk_get(phy->dev, "div-clk"); if (IS_ERR(phy->div_clk)) { dev_err(&pdev->dev, "unable to get div-clk\n"); return PTR_ERR(phy->div_clk); } } else { phy->div_clk = ERR_PTR(-ENODEV); } control_node = of_parse_phandle(node, "ctrl-module", 0); if (!control_node) { dev_err(&pdev->dev, "Failed to get control device phandle\n"); return -EINVAL; } control_pdev = of_find_device_by_node(control_node); if (!control_pdev) { dev_err(&pdev->dev, "Failed to get control device\n"); return -EINVAL; } phy->control_dev = &control_pdev->dev; omap_control_phy_power(phy->control_dev, 0); platform_set_drvdata(pdev, phy); pm_runtime_enable(phy->dev); /* * Prevent auto-disable of refclk for SATA PHY due to Errata i783 */ if (of_device_is_compatible(node, "ti,phy-pipe3-sata")) { if (!IS_ERR(phy->refclk)) { clk_prepare_enable(phy->refclk); phy->sata_refclk_enabled = true; } } generic_phy = devm_phy_create(phy->dev, &ops, NULL); if (IS_ERR(generic_phy)) return PTR_ERR(generic_phy); phy_set_drvdata(generic_phy, phy); phy_provider = devm_of_phy_provider_register(phy->dev, of_phy_simple_xlate); if (IS_ERR(phy_provider)) return PTR_ERR(phy_provider); return 0; }
p = &core->phys[id]; p->phy = devm_phy_create(dev, child, &cygnus_pcie_phy_ops); if (IS_ERR(p->phy)) { dev_err(dev, "failed to create PHY\n"); return PTR_ERR(p->phy); } p->core = core; p->id = id; phy_set_drvdata(p->phy, p); cnt++; } dev_set_drvdata(dev, core); provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); if (IS_ERR(provider)) { dev_err(dev, "failed to register PHY provider\n"); return PTR_ERR(provider); } dev_dbg(dev, "registered %u PCIe PHY(s)\n", cnt); return 0; } static const struct of_device_id cygnus_pcie_phy_match_table[] = { { .compatible = "brcm,cygnus-pcie-phy" }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, cygnus_pcie_phy_match_table);
static int exynos_sata_phy_probe(struct platform_device *pdev) { struct exynos_sata_phy *sata_phy; struct device *dev = &pdev->dev; struct resource *res; struct phy_provider *phy_provider; struct device_node *node; int ret = 0; sata_phy = devm_kzalloc(dev, sizeof(*sata_phy), GFP_KERNEL); if (!sata_phy) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); sata_phy->regs = devm_ioremap_resource(dev, res); if (IS_ERR(sata_phy->regs)) return PTR_ERR(sata_phy->regs); sata_phy->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node, "samsung,syscon-phandle"); if (IS_ERR(sata_phy->pmureg)) { dev_err(dev, "syscon regmap lookup failed.\n"); return PTR_ERR(sata_phy->pmureg); } node = of_parse_phandle(dev->of_node, "samsung,exynos-sataphy-i2c-phandle", 0); if (!node) return -EINVAL; sata_phy->client = of_find_i2c_device_by_node(node); if (!sata_phy->client) return -EPROBE_DEFER; dev_set_drvdata(dev, sata_phy); sata_phy->phyclk = devm_clk_get(dev, "sata_phyctrl"); if (IS_ERR(sata_phy->phyclk)) { dev_err(dev, "failed to get clk for PHY\n"); return PTR_ERR(sata_phy->phyclk); } ret = clk_prepare_enable(sata_phy->phyclk); if (ret < 0) { dev_err(dev, "failed to enable source clk\n"); return ret; } sata_phy->phy = devm_phy_create(dev, NULL, &exynos_sata_phy_ops, NULL); if (IS_ERR(sata_phy->phy)) { clk_disable_unprepare(sata_phy->phyclk); dev_err(dev, "failed to create PHY\n"); return PTR_ERR(sata_phy->phy); } phy_set_drvdata(sata_phy->phy, sata_phy); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); if (IS_ERR(phy_provider)) { clk_disable_unprepare(sata_phy->phyclk); return PTR_ERR(phy_provider); } return 0; }
static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct rcar_gen3_chan *channel; struct phy_provider *provider; struct resource *res; int irq; if (!dev->of_node) { dev_err(dev, "This driver needs device tree\n"); return -EINVAL; } channel = devm_kzalloc(dev, sizeof(*channel), GFP_KERNEL); if (!channel) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); channel->base = devm_ioremap_resource(dev, res); if (IS_ERR(channel->base)) return PTR_ERR(channel->base); /* call request_irq for OTG */ irq = platform_get_irq(pdev, 0); if (irq >= 0) { int ret; irq = devm_request_irq(dev, irq, rcar_gen3_phy_usb2_irq, IRQF_SHARED, dev_name(dev), channel); if (irq < 0) dev_err(dev, "No irq handler (%d)\n", irq); channel->has_otg = true; channel->extcon = devm_extcon_dev_allocate(dev, rcar_gen3_phy_cable); if (IS_ERR(channel->extcon)) return PTR_ERR(channel->extcon); ret = devm_extcon_dev_register(dev, channel->extcon); if (ret < 0) { dev_err(dev, "Failed to register extcon\n"); return ret; } } /* devm_phy_create() will call pm_runtime_enable(dev); */ channel->phy = devm_phy_create(dev, NULL, &rcar_gen3_phy_usb2_ops); if (IS_ERR(channel->phy)) { dev_err(dev, "Failed to create USB2 PHY\n"); return PTR_ERR(channel->phy); } channel->vbus = devm_regulator_get_optional(dev, "vbus"); if (IS_ERR(channel->vbus)) { if (PTR_ERR(channel->vbus) == -EPROBE_DEFER) return PTR_ERR(channel->vbus); channel->vbus = NULL; } phy_set_drvdata(channel->phy, channel); provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); if (IS_ERR(provider)) dev_err(dev, "Failed to register PHY provider\n"); return PTR_ERR_OR_ZERO(provider); }
static int stm32_usbphyc_probe(struct platform_device *pdev) { struct stm32_usbphyc *usbphyc; struct device *dev = &pdev->dev; struct device_node *child, *np = dev->of_node; struct resource *res; struct phy_provider *phy_provider; u32 version; int ret, port = 0; usbphyc = devm_kzalloc(dev, sizeof(*usbphyc), GFP_KERNEL); if (!usbphyc) return -ENOMEM; usbphyc->dev = dev; dev_set_drvdata(dev, usbphyc); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); usbphyc->base = devm_ioremap_resource(dev, res); if (IS_ERR(usbphyc->base)) return PTR_ERR(usbphyc->base); usbphyc->clk = devm_clk_get(dev, 0); if (IS_ERR(usbphyc->clk)) { ret = PTR_ERR(usbphyc->clk); dev_err(dev, "clk get failed: %d\n", ret); return ret; } ret = clk_prepare_enable(usbphyc->clk); if (ret) { dev_err(dev, "clk enable failed: %d\n", ret); return ret; } usbphyc->rst = devm_reset_control_get(dev, 0); if (!IS_ERR(usbphyc->rst)) { reset_control_assert(usbphyc->rst); udelay(2); reset_control_deassert(usbphyc->rst); } usbphyc->switch_setup = -EINVAL; usbphyc->nphys = of_get_child_count(np); usbphyc->phys = devm_kcalloc(dev, usbphyc->nphys, sizeof(*usbphyc->phys), GFP_KERNEL); if (!usbphyc->phys) { ret = -ENOMEM; goto clk_disable; } for_each_child_of_node(np, child) { struct stm32_usbphyc_phy *usbphyc_phy; struct phy *phy; u32 index; int i; phy = devm_phy_create(dev, child, &stm32_usbphyc_phy_ops); if (IS_ERR(phy)) { ret = PTR_ERR(phy); if (ret != -EPROBE_DEFER) dev_err(dev, "failed to create phy%d: %d\n", port, ret); goto put_child; } usbphyc_phy = devm_kzalloc(dev, sizeof(*usbphyc_phy), GFP_KERNEL); if (!usbphyc_phy) { ret = -ENOMEM; goto put_child; } for (i = 0; i < NUM_SUPPLIES; i++) usbphyc_phy->supplies[i].supply = supplies_names[i]; ret = devm_regulator_bulk_get(&phy->dev, NUM_SUPPLIES, usbphyc_phy->supplies); if (ret) { if (ret != -EPROBE_DEFER) dev_err(&phy->dev, "failed to get regulators: %d\n", ret); goto put_child; } ret = of_property_read_u32(child, "reg", &index); if (ret || index > usbphyc->nphys) { dev_err(&phy->dev, "invalid reg property: %d\n", ret); goto put_child; } usbphyc->phys[port] = usbphyc_phy; phy_set_bus_width(phy, 8); phy_set_drvdata(phy, usbphyc_phy); usbphyc->phys[port]->phy = phy; usbphyc->phys[port]->usbphyc = usbphyc; usbphyc->phys[port]->index = index; usbphyc->phys[port]->active = false; port++; } phy_provider = devm_of_phy_provider_register(dev, stm32_usbphyc_of_xlate); if (IS_ERR(phy_provider)) { ret = PTR_ERR(phy_provider); dev_err(dev, "failed to register phy provider: %d\n", ret); goto clk_disable; } version = readl_relaxed(usbphyc->base + STM32_USBPHYC_VERSION); dev_info(dev, "registered rev:%lu.%lu\n", FIELD_GET(MAJREV, version), FIELD_GET(MINREV, version)); return 0; put_child: of_node_put(child); clk_disable: clk_disable_unprepare(usbphyc->clk); return ret; }
static int stih407_usb2_picophy_probe(struct platform_device *pdev) { struct stih407_usb2_picophy *phy_dev; struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; struct phy_provider *phy_provider; struct phy *phy; struct resource *res; phy_dev = devm_kzalloc(dev, sizeof(*phy_dev), GFP_KERNEL); if (!phy_dev) return -ENOMEM; phy_dev->dev = dev; dev_set_drvdata(dev, phy_dev); phy_dev->rstc = devm_reset_control_get(dev, "global"); if (IS_ERR(phy_dev->rstc)) { dev_err(dev, "failed to ctrl picoPHY reset\n"); return PTR_ERR(phy_dev->rstc); } phy_dev->rstport = devm_reset_control_get(dev, "port"); if (IS_ERR(phy_dev->rstport)) { dev_err(dev, "failed to ctrl picoPHY reset\n"); return PTR_ERR(phy_dev->rstport); } /* Reset port by default: only deassert it in phy init */ reset_control_assert(phy_dev->rstport); phy_dev->regmap = syscon_regmap_lookup_by_phandle(np, "st,syscfg"); if (IS_ERR(phy_dev->regmap)) { dev_err(dev, "No syscfg phandle specified\n"); return PTR_ERR(phy_dev->regmap); } res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ctrl"); if (!res) { dev_err(dev, "No ctrl reg found\n"); return -ENXIO; } phy_dev->ctrl = res->start; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "param"); if (!res) { dev_err(dev, "No param reg found\n"); return -ENXIO; } phy_dev->param = res->start; phy = devm_phy_create(dev, NULL, &stih407_usb2_picophy_data, NULL); if (IS_ERR(phy)) { dev_err(dev, "failed to create Display Port PHY\n"); return PTR_ERR(phy); } phy_dev->phy = phy; phy_set_drvdata(phy, phy_dev); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); if (IS_ERR(phy_provider)) return PTR_ERR(phy_provider); dev_info(dev, "STiH407 USB Generic picoPHY driver probed!"); return 0; }
static int ti_pipe3_probe(struct platform_device *pdev) { struct ti_pipe3 *phy; struct phy *generic_phy; struct phy_provider *phy_provider; struct resource *res; struct device_node *node = pdev->dev.of_node; struct device_node *control_node; struct platform_device *control_pdev; const struct of_device_id *match; struct clk *clk; phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL); if (!phy) return -ENOMEM; phy->dev = &pdev->dev; spin_lock_init(&phy->lock); if (!of_device_is_compatible(node, "ti,phy-pipe3-pcie")) { match = of_match_device(of_match_ptr(ti_pipe3_id_table), &pdev->dev); if (!match) return -EINVAL; phy->dpll_map = (struct pipe3_dpll_map *)match->data; if (!phy->dpll_map) { dev_err(&pdev->dev, "no DPLL data\n"); return -EINVAL; } res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pll_ctrl"); phy->pll_ctrl_base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(phy->pll_ctrl_base)) return PTR_ERR(phy->pll_ctrl_base); phy->sys_clk = devm_clk_get(phy->dev, "sysclk"); if (IS_ERR(phy->sys_clk)) { dev_err(&pdev->dev, "unable to get sysclk\n"); return -EINVAL; } } phy->refclk = devm_clk_get(phy->dev, "refclk"); if (IS_ERR(phy->refclk)) { dev_err(&pdev->dev, "unable to get refclk\n"); /* older DTBs have missing refclk in SATA PHY * so don't bail out in case of SATA PHY. */ if (!of_device_is_compatible(node, "ti,phy-pipe3-sata")) return PTR_ERR(phy->refclk); } if (!of_device_is_compatible(node, "ti,phy-pipe3-sata")) { phy->wkupclk = devm_clk_get(phy->dev, "wkupclk"); if (IS_ERR(phy->wkupclk)) { dev_err(&pdev->dev, "unable to get wkupclk\n"); return PTR_ERR(phy->wkupclk); } } else { phy->wkupclk = ERR_PTR(-ENODEV); } if (of_device_is_compatible(node, "ti,phy-pipe3-pcie")) { clk = devm_clk_get(phy->dev, "dpll_ref"); if (IS_ERR(clk)) { dev_err(&pdev->dev, "unable to get dpll ref clk\n"); return PTR_ERR(clk); } clk_set_rate(clk, 1500000000); clk = devm_clk_get(phy->dev, "dpll_ref_m2"); if (IS_ERR(clk)) { dev_err(&pdev->dev, "unable to get dpll ref m2 clk\n"); return PTR_ERR(clk); } clk_set_rate(clk, 100000000); clk = devm_clk_get(phy->dev, "phy-div"); if (IS_ERR(clk)) { dev_err(&pdev->dev, "unable to get phy-div clk\n"); return PTR_ERR(clk); } clk_set_rate(clk, 100000000); phy->div_clk = devm_clk_get(phy->dev, "div-clk"); if (IS_ERR(phy->div_clk)) { dev_err(&pdev->dev, "unable to get div-clk\n"); return PTR_ERR(phy->div_clk); } } else { phy->div_clk = ERR_PTR(-ENODEV); } control_node = of_parse_phandle(node, "ctrl-module", 0); if (!control_node) { dev_err(&pdev->dev, "Failed to get control device phandle\n"); return -EINVAL; } control_pdev = of_find_device_by_node(control_node); if (!control_pdev) { dev_err(&pdev->dev, "Failed to get control device\n"); return -EINVAL; } phy->control_dev = &control_pdev->dev; omap_control_phy_power(phy->control_dev, 0); platform_set_drvdata(pdev, phy); pm_runtime_enable(phy->dev); generic_phy = devm_phy_create(phy->dev, NULL, &ops); if (IS_ERR(generic_phy)) return PTR_ERR(generic_phy); phy_set_drvdata(generic_phy, phy); phy_provider = devm_of_phy_provider_register(phy->dev, of_phy_simple_xlate); if (IS_ERR(phy_provider)) return PTR_ERR(phy_provider); pm_runtime_get(&pdev->dev); return 0; }
static int qcom_usb_hs_phy_probe(struct ulpi *ulpi) { struct qcom_usb_hs_phy *uphy; struct phy_provider *p; struct clk *clk; struct regulator *reg; struct reset_control *reset; int size; int ret; uphy = devm_kzalloc(&ulpi->dev, sizeof(*uphy), GFP_KERNEL); if (!uphy) return -ENOMEM; ulpi_set_drvdata(ulpi, uphy); uphy->ulpi = ulpi; size = of_property_count_u8_elems(ulpi->dev.of_node, "qcom,init-seq"); if (size < 0) size = 0; uphy->init_seq = devm_kmalloc_array(&ulpi->dev, (size / 2) + 1, sizeof(*uphy->init_seq), GFP_KERNEL); if (!uphy->init_seq) return -ENOMEM; ret = of_property_read_u8_array(ulpi->dev.of_node, "qcom,init-seq", (u8 *)uphy->init_seq, size); if (ret && size) return ret; /* NUL terminate */ uphy->init_seq[size / 2].addr = uphy->init_seq[size / 2].val = 0; uphy->ref_clk = clk = devm_clk_get(&ulpi->dev, "ref"); if (IS_ERR(clk)) return PTR_ERR(clk); uphy->sleep_clk = clk = devm_clk_get(&ulpi->dev, "sleep"); if (IS_ERR(clk)) return PTR_ERR(clk); uphy->v1p8 = reg = devm_regulator_get(&ulpi->dev, "v1p8"); if (IS_ERR(reg)) return PTR_ERR(reg); uphy->v3p3 = reg = devm_regulator_get(&ulpi->dev, "v3p3"); if (IS_ERR(reg)) return PTR_ERR(reg); uphy->reset = reset = devm_reset_control_get(&ulpi->dev, "por"); if (IS_ERR(reset)) { if (PTR_ERR(reset) == -EPROBE_DEFER) return PTR_ERR(reset); uphy->reset = NULL; } uphy->phy = devm_phy_create(&ulpi->dev, ulpi->dev.of_node, &qcom_usb_hs_phy_ops); if (IS_ERR(uphy->phy)) return PTR_ERR(uphy->phy); uphy->vbus_edev = extcon_get_edev_by_phandle(&ulpi->dev, 0); if (IS_ERR(uphy->vbus_edev)) { if (PTR_ERR(uphy->vbus_edev) != -ENODEV) return PTR_ERR(uphy->vbus_edev); uphy->vbus_edev = NULL; } uphy->vbus_notify.notifier_call = qcom_usb_hs_phy_vbus_notifier; phy_set_drvdata(uphy->phy, uphy); p = devm_of_phy_provider_register(&ulpi->dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(p); }