mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
phy: for 4.4 -rc
*) Add missing of_node_put in a bunch of PHY drivers *) Add get_device in devm_of_phy_get_by_index() *) Fix randconfig build error in sun9i usb driver -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJWZYroAAoJEA5ceFyATYLZuPAP/ieqqVUQ90OwZBTR9EfcUFMq vjTFBTA8pPKDuwPLbwr7M8k2t4MLAcUSYFd7uZoSfWaXTy93jCzqFJOI9FhyWgwL PLJQaUJvp4hQnD2pYDHZa4jeJuVzKo5M+koNxOrGVhGFsjQaCDKErrqrfgYaCocN nsJsKfTctRIdTUjmO1xFjNTILfXJSJ7dZWyKrF96DtVHer/GeLvoS4R5d53H9Z2j j/RIqQI8aKEHvDqcY4tXL6I9PscJc4tDs+RfZq4ThLX0mMhPofYHJ+ZkLX0/irVQ nWHIAOTLTF/9sGSRrB0FkIPMBS4QeIDZIruysVbgjEKFxi7Qnw7evZ2JJjNTwilq ESCDKI5uIy1gVXhqKPxVT37vsl5/Kma2qgax7U1TWwTNCA8IbKCqgv279WHvko71 UT0NnDNRU6deOQYwgEiqNyIv3gEJxevX0xPH9ULWNWvWGSZc2EZjj2khmxXnVHxa 0RdEi2ISG0gMbhYgnQsAIlp8GHEf7i5p8jvC9CIk/1eCmGGf1MB01b+Le6KQv6w8 4tgS8gXeEWNQUo49BnAJoTtlNNO+oXgyvUqL9eFnslT6Euw1q3DlBmP1421MjCgu uAJKd3pJYSRPwtgvAC7MXmRRuzQvFA7bVaZ/Gq5SLscr62kmA56bCE151pSUJwLS XRWbrT9VE2iSD57QS2Wr =DiV0 -----END PGP SIGNATURE----- Merge tag 'phy-for-4.4-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/kishon/linux-phy into usb-linus Kishon writes: phy: for 4.4 -rc *) Add missing of_node_put in a bunch of PHY drivers *) Add get_device in devm_of_phy_get_by_index() *) Fix randconfig build error in sun9i usb driver
This commit is contained in:
commit
fabb1c333e
9 changed files with 101 additions and 43 deletions
|
@ -233,6 +233,7 @@ config PHY_SUN9I_USB
|
|||
tristate "Allwinner sun9i SoC USB PHY driver"
|
||||
depends on ARCH_SUNXI && HAS_IOMEM && OF
|
||||
depends on RESET_CONTROLLER
|
||||
depends on USB_COMMON
|
||||
select GENERIC_PHY
|
||||
help
|
||||
Enable this to support the transceiver that is part of Allwinner
|
||||
|
|
|
@ -128,6 +128,7 @@ static int cygnus_pcie_phy_probe(struct platform_device *pdev)
|
|||
struct phy_provider *provider;
|
||||
struct resource *res;
|
||||
unsigned cnt = 0;
|
||||
int ret;
|
||||
|
||||
if (of_get_child_count(node) == 0) {
|
||||
dev_err(dev, "PHY no child node\n");
|
||||
|
@ -154,24 +155,28 @@ static int cygnus_pcie_phy_probe(struct platform_device *pdev)
|
|||
if (of_property_read_u32(child, "reg", &id)) {
|
||||
dev_err(dev, "missing reg property for %s\n",
|
||||
child->name);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
if (id >= MAX_NUM_PHYS) {
|
||||
dev_err(dev, "invalid PHY id: %u\n", id);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
if (core->phys[id].phy) {
|
||||
dev_err(dev, "duplicated PHY id: %u\n", id);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
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);
|
||||
ret = PTR_ERR(p->phy);
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
p->core = core;
|
||||
|
@ -191,6 +196,9 @@ static int cygnus_pcie_phy_probe(struct platform_device *pdev)
|
|||
dev_dbg(dev, "registered %u PCIe PHY(s)\n", cnt);
|
||||
|
||||
return 0;
|
||||
put_child:
|
||||
of_node_put(child);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct of_device_id cygnus_pcie_phy_match_table[] = {
|
||||
|
|
|
@ -195,7 +195,7 @@ static int phy_berlin_sata_probe(struct platform_device *pdev)
|
|||
struct phy_provider *phy_provider;
|
||||
struct phy_berlin_priv *priv;
|
||||
struct resource *res;
|
||||
int i = 0;
|
||||
int ret, i = 0;
|
||||
u32 phy_id;
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
|
@ -237,22 +237,27 @@ static int phy_berlin_sata_probe(struct platform_device *pdev)
|
|||
if (of_property_read_u32(child, "reg", &phy_id)) {
|
||||
dev_err(dev, "missing reg property in node %s\n",
|
||||
child->name);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
if (phy_id >= ARRAY_SIZE(phy_berlin_power_down_bits)) {
|
||||
dev_err(dev, "invalid reg in node %s\n", child->name);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
phy_desc = devm_kzalloc(dev, sizeof(*phy_desc), GFP_KERNEL);
|
||||
if (!phy_desc)
|
||||
return -ENOMEM;
|
||||
if (!phy_desc) {
|
||||
ret = -ENOMEM;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
phy = devm_phy_create(dev, NULL, &phy_berlin_sata_ops);
|
||||
if (IS_ERR(phy)) {
|
||||
dev_err(dev, "failed to create PHY %d\n", phy_id);
|
||||
return PTR_ERR(phy);
|
||||
ret = PTR_ERR(phy);
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
phy_desc->phy = phy;
|
||||
|
@ -269,6 +274,9 @@ static int phy_berlin_sata_probe(struct platform_device *pdev)
|
|||
phy_provider =
|
||||
devm_of_phy_provider_register(dev, phy_berlin_sata_phy_xlate);
|
||||
return PTR_ERR_OR_ZERO(phy_provider);
|
||||
put_child:
|
||||
of_node_put(child);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct of_device_id phy_berlin_sata_of_match[] = {
|
||||
|
|
|
@ -140,7 +140,7 @@ static int brcm_sata_phy_probe(struct platform_device *pdev)
|
|||
struct brcm_sata_phy *priv;
|
||||
struct resource *res;
|
||||
struct phy_provider *provider;
|
||||
int count = 0;
|
||||
int ret, count = 0;
|
||||
|
||||
if (of_get_child_count(dn) == 0)
|
||||
return -ENODEV;
|
||||
|
@ -163,16 +163,19 @@ static int brcm_sata_phy_probe(struct platform_device *pdev)
|
|||
if (of_property_read_u32(child, "reg", &id)) {
|
||||
dev_err(dev, "missing reg property in node %s\n",
|
||||
child->name);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
if (id >= MAX_PORTS) {
|
||||
dev_err(dev, "invalid reg: %u\n", id);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto put_child;
|
||||
}
|
||||
if (priv->phys[id].phy) {
|
||||
dev_err(dev, "already registered port %u\n", id);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
port = &priv->phys[id];
|
||||
|
@ -182,7 +185,8 @@ static int brcm_sata_phy_probe(struct platform_device *pdev)
|
|||
port->ssc_en = of_property_read_bool(child, "brcm,enable-ssc");
|
||||
if (IS_ERR(port->phy)) {
|
||||
dev_err(dev, "failed to create PHY\n");
|
||||
return PTR_ERR(port->phy);
|
||||
ret = PTR_ERR(port->phy);
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
phy_set_drvdata(port->phy, port);
|
||||
|
@ -198,6 +202,9 @@ static int brcm_sata_phy_probe(struct platform_device *pdev)
|
|||
dev_info(dev, "registered %d port(s)\n", count);
|
||||
|
||||
return 0;
|
||||
put_child:
|
||||
of_node_put(child);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct platform_driver brcm_sata_phy_driver = {
|
||||
|
|
|
@ -636,8 +636,9 @@ EXPORT_SYMBOL_GPL(devm_of_phy_get);
|
|||
* @np: node containing the phy
|
||||
* @index: index of the phy
|
||||
*
|
||||
* Gets the phy using _of_phy_get(), and associates a device with it using
|
||||
* devres. On driver detach, release function is invoked on the devres data,
|
||||
* Gets the phy using _of_phy_get(), then gets a refcount to it,
|
||||
* and associates a device with it using devres. On driver detach,
|
||||
* release function is invoked on the devres data,
|
||||
* then, devres data is freed.
|
||||
*
|
||||
*/
|
||||
|
@ -651,13 +652,21 @@ struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
|
|||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
phy = _of_phy_get(np, index);
|
||||
if (!IS_ERR(phy)) {
|
||||
*ptr = phy;
|
||||
devres_add(dev, ptr);
|
||||
} else {
|
||||
if (IS_ERR(phy)) {
|
||||
devres_free(ptr);
|
||||
return phy;
|
||||
}
|
||||
|
||||
if (!try_module_get(phy->ops->owner)) {
|
||||
devres_free(ptr);
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
|
||||
get_device(&phy->dev);
|
||||
|
||||
*ptr = phy;
|
||||
devres_add(dev, ptr);
|
||||
|
||||
return phy;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_of_phy_get_by_index);
|
||||
|
|
|
@ -1226,15 +1226,18 @@ static int miphy28lp_probe(struct platform_device *pdev)
|
|||
|
||||
miphy_phy = devm_kzalloc(&pdev->dev, sizeof(*miphy_phy),
|
||||
GFP_KERNEL);
|
||||
if (!miphy_phy)
|
||||
return -ENOMEM;
|
||||
if (!miphy_phy) {
|
||||
ret = -ENOMEM;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
miphy_dev->phys[port] = miphy_phy;
|
||||
|
||||
phy = devm_phy_create(&pdev->dev, child, &miphy28lp_ops);
|
||||
if (IS_ERR(phy)) {
|
||||
dev_err(&pdev->dev, "failed to create PHY\n");
|
||||
return PTR_ERR(phy);
|
||||
ret = PTR_ERR(phy);
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
miphy_dev->phys[port]->phy = phy;
|
||||
|
@ -1242,11 +1245,11 @@ static int miphy28lp_probe(struct platform_device *pdev)
|
|||
|
||||
ret = miphy28lp_of_probe(child, miphy_phy);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto put_child;
|
||||
|
||||
ret = miphy28lp_probe_resets(child, miphy_dev->phys[port]);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto put_child;
|
||||
|
||||
phy_set_drvdata(phy, miphy_dev->phys[port]);
|
||||
port++;
|
||||
|
@ -1255,6 +1258,9 @@ static int miphy28lp_probe(struct platform_device *pdev)
|
|||
|
||||
provider = devm_of_phy_provider_register(&pdev->dev, miphy28lp_xlate);
|
||||
return PTR_ERR_OR_ZERO(provider);
|
||||
put_child:
|
||||
of_node_put(child);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct of_device_id miphy28lp_of_match[] = {
|
||||
|
|
|
@ -566,22 +566,25 @@ static int miphy365x_probe(struct platform_device *pdev)
|
|||
|
||||
miphy_phy = devm_kzalloc(&pdev->dev, sizeof(*miphy_phy),
|
||||
GFP_KERNEL);
|
||||
if (!miphy_phy)
|
||||
return -ENOMEM;
|
||||
if (!miphy_phy) {
|
||||
ret = -ENOMEM;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
miphy_dev->phys[port] = miphy_phy;
|
||||
|
||||
phy = devm_phy_create(&pdev->dev, child, &miphy365x_ops);
|
||||
if (IS_ERR(phy)) {
|
||||
dev_err(&pdev->dev, "failed to create PHY\n");
|
||||
return PTR_ERR(phy);
|
||||
ret = PTR_ERR(phy);
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
miphy_dev->phys[port]->phy = phy;
|
||||
|
||||
ret = miphy365x_of_probe(child, miphy_phy);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto put_child;
|
||||
|
||||
phy_set_drvdata(phy, miphy_dev->phys[port]);
|
||||
|
||||
|
@ -591,12 +594,15 @@ static int miphy365x_probe(struct platform_device *pdev)
|
|||
&miphy_phy->ctrlreg);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "No sysconfig offset found\n");
|
||||
return ret;
|
||||
goto put_child;
|
||||
}
|
||||
}
|
||||
|
||||
provider = devm_of_phy_provider_register(&pdev->dev, miphy365x_xlate);
|
||||
return PTR_ERR_OR_ZERO(provider);
|
||||
put_child:
|
||||
of_node_put(child);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct of_device_id miphy365x_of_match[] = {
|
||||
|
|
|
@ -415,7 +415,7 @@ static int mt65xx_u3phy_probe(struct platform_device *pdev)
|
|||
struct resource *sif_res;
|
||||
struct mt65xx_u3phy *u3phy;
|
||||
struct resource res;
|
||||
int port;
|
||||
int port, retval;
|
||||
|
||||
u3phy = devm_kzalloc(dev, sizeof(*u3phy), GFP_KERNEL);
|
||||
if (!u3phy)
|
||||
|
@ -447,31 +447,34 @@ static int mt65xx_u3phy_probe(struct platform_device *pdev)
|
|||
for_each_child_of_node(np, child_np) {
|
||||
struct mt65xx_phy_instance *instance;
|
||||
struct phy *phy;
|
||||
int retval;
|
||||
|
||||
instance = devm_kzalloc(dev, sizeof(*instance), GFP_KERNEL);
|
||||
if (!instance)
|
||||
return -ENOMEM;
|
||||
if (!instance) {
|
||||
retval = -ENOMEM;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
u3phy->phys[port] = instance;
|
||||
|
||||
phy = devm_phy_create(dev, child_np, &mt65xx_u3phy_ops);
|
||||
if (IS_ERR(phy)) {
|
||||
dev_err(dev, "failed to create phy\n");
|
||||
return PTR_ERR(phy);
|
||||
retval = PTR_ERR(phy);
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
retval = of_address_to_resource(child_np, 0, &res);
|
||||
if (retval) {
|
||||
dev_err(dev, "failed to get address resource(id-%d)\n",
|
||||
port);
|
||||
return retval;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
instance->port_base = devm_ioremap_resource(&phy->dev, &res);
|
||||
if (IS_ERR(instance->port_base)) {
|
||||
dev_err(dev, "failed to remap phy regs\n");
|
||||
return PTR_ERR(instance->port_base);
|
||||
retval = PTR_ERR(instance->port_base);
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
instance->phy = phy;
|
||||
|
@ -483,6 +486,9 @@ static int mt65xx_u3phy_probe(struct platform_device *pdev)
|
|||
provider = devm_of_phy_provider_register(dev, mt65xx_phy_xlate);
|
||||
|
||||
return PTR_ERR_OR_ZERO(provider);
|
||||
put_child:
|
||||
of_node_put(child_np);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static const struct of_device_id mt65xx_u3phy_id_table[] = {
|
||||
|
|
|
@ -108,13 +108,16 @@ static int rockchip_usb_phy_probe(struct platform_device *pdev)
|
|||
|
||||
for_each_available_child_of_node(dev->of_node, child) {
|
||||
rk_phy = devm_kzalloc(dev, sizeof(*rk_phy), GFP_KERNEL);
|
||||
if (!rk_phy)
|
||||
return -ENOMEM;
|
||||
if (!rk_phy) {
|
||||
err = -ENOMEM;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
if (of_property_read_u32(child, "reg", ®_offset)) {
|
||||
dev_err(dev, "missing reg property in node %s\n",
|
||||
child->name);
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
rk_phy->reg_offset = reg_offset;
|
||||
|
@ -127,18 +130,22 @@ static int rockchip_usb_phy_probe(struct platform_device *pdev)
|
|||
rk_phy->phy = devm_phy_create(dev, child, &ops);
|
||||
if (IS_ERR(rk_phy->phy)) {
|
||||
dev_err(dev, "failed to create PHY\n");
|
||||
return PTR_ERR(rk_phy->phy);
|
||||
err = PTR_ERR(rk_phy->phy);
|
||||
goto put_child;
|
||||
}
|
||||
phy_set_drvdata(rk_phy->phy, rk_phy);
|
||||
|
||||
/* only power up usb phy when it use, so disable it when init*/
|
||||
err = rockchip_usb_phy_power(rk_phy, 1);
|
||||
if (err)
|
||||
return err;
|
||||
goto put_child;
|
||||
}
|
||||
|
||||
phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
|
||||
return PTR_ERR_OR_ZERO(phy_provider);
|
||||
put_child:
|
||||
of_node_put(child);
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct of_device_id rockchip_usb_phy_dt_ids[] = {
|
||||
|
|
Loading…
Reference in a new issue