diff options
author | Sergio Paracuellos <sergio.paracuellos@gmail.com> | 2019-03-29 06:52:43 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-03-29 17:22:54 +0100 |
commit | e933158d984bd5c851a3f3f9d8a5efba45800acf (patch) | |
tree | f060b598f863a6fe782e1218b30e88a11684c4f4 /drivers/staging/mt7621-pci-phy | |
parent | 200ff80dc7ed88f51002ead015c94185f53c2a53 (diff) | |
download | lwn-e933158d984bd5c851a3f3f9d8a5efba45800acf.tar.gz lwn-e933158d984bd5c851a3f3f9d8a5efba45800acf.zip |
staging: mt7621-pci-phy: change driver to don't use child nodes
Device tree has been simplified to don't use child nodes and use
the #phy-cells property instead. Change the driver accordly implementing
custom 'xlate' function to return the correct phy for each port.
Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
Reviewed-by: NeilBrown <neil@brown.name>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/mt7621-pci-phy')
-rw-r--r-- | drivers/staging/mt7621-pci-phy/pci-mt7621-phy.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/drivers/staging/mt7621-pci-phy/pci-mt7621-phy.c b/drivers/staging/mt7621-pci-phy/pci-mt7621-phy.c index 98c06308143c..118302c122ee 100644 --- a/drivers/staging/mt7621-pci-phy/pci-mt7621-phy.c +++ b/drivers/staging/mt7621-pci-phy/pci-mt7621-phy.c @@ -78,6 +78,8 @@ #define RG_PE1_FRC_MSTCKDIV BIT(5) +#define MAX_PHYS 2 + /** * struct mt7621_pci_phy_instance - Mt7621 Pcie PHY device * @phy: pointer to the kernel PHY device @@ -289,6 +291,20 @@ static const struct phy_ops mt7621_pci_phy_ops = { .owner = THIS_MODULE, }; +static struct phy *mt7621_pcie_phy_of_xlate(struct device *dev, + struct of_phandle_args *args) +{ + struct mt7621_pci_phy *mt7621_phy = dev_get_drvdata(dev); + + if (args->args_count == 0) + return mt7621_phy->phys[0]->phy; + + if (WARN_ON(args->args[0] >= MAX_PHYS)) + return ERR_PTR(-ENODEV); + + return mt7621_phy->phys[args->args[0]]->phy; +} + static int mt7621_pci_phy_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -304,7 +320,7 @@ static int mt7621_pci_phy_probe(struct platform_device *pdev) if (!phy) return -ENOMEM; - phy->nphys = of_get_child_count(np); + phy->nphys = MAX_PHYS; phy->phys = devm_kcalloc(dev, phy->nphys, sizeof(*phy->phys), GFP_KERNEL); if (!phy->phys) @@ -325,8 +341,7 @@ static int mt7621_pci_phy_probe(struct platform_device *pdev) return PTR_ERR(port_base); } - port = 0; - for_each_child_of_node(np, child_np) { + for (port = 0; port < MAX_PHYS; port++) { struct mt7621_pci_phy_instance *instance; struct phy *pphy; @@ -338,7 +353,7 @@ static int mt7621_pci_phy_probe(struct platform_device *pdev) phy->phys[port] = instance; - pphy = devm_phy_create(dev, child_np, &mt7621_pci_phy_ops); + pphy = devm_phy_create(dev, dev->of_node, &mt7621_pci_phy_ops); if (IS_ERR(phy)) { dev_err(dev, "failed to create phy\n"); ret = PTR_ERR(phy); @@ -349,10 +364,9 @@ static int mt7621_pci_phy_probe(struct platform_device *pdev) instance->phy = pphy; instance->index = port; phy_set_drvdata(pphy, instance); - port++; } - provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); + provider = devm_of_phy_provider_register(dev, mt7621_pcie_phy_of_xlate); return PTR_ERR_OR_ZERO(provider); |