phy: core: Let node ptr of PHY point to PHY and not of PHY provider

In case of multi-phy PHY providers, each PHY should be modeled as a sub
node of the PHY provider. Then each PHY will have a different node pointer
(node pointer of sub node) than that of PHY provider. Added this provision
in the PHY core.
Also fixed all drivers to use the updated API.
Signed-off-by: default avatarKishon Vijay Abraham I <kishon@ti.com>
Acked-by: default avatarLee Jones <lee.jones@linaro.org>
parent 2a4c3701
...@@ -53,10 +53,12 @@ unregister the PHY. ...@@ -53,10 +53,12 @@ unregister the PHY.
The PHY driver should create the PHY in order for other peripheral controllers The PHY driver should create the PHY in order for other peripheral controllers
to make use of it. The PHY framework provides 2 APIs to create the PHY. to make use of it. The PHY framework provides 2 APIs to create the PHY.
struct phy *phy_create(struct device *dev, const struct phy_ops *ops, struct phy *phy_create(struct device *dev, struct device_node *node,
struct phy_init_data *init_data); const struct phy_ops *ops,
struct phy *devm_phy_create(struct device *dev, const struct phy_ops *ops, struct phy_init_data *init_data);
struct phy_init_data *init_data); struct phy *devm_phy_create(struct device *dev, struct device_node *node,
const struct phy_ops *ops,
struct phy_init_data *init_data);
The PHY drivers can use one of the above 2 APIs to create the PHY by passing The PHY drivers can use one of the above 2 APIs to create the PHY by passing
the device pointer, phy ops and init_data. the device pointer, phy ops and init_data.
......
...@@ -117,7 +117,7 @@ static int bcm_kona_usb2_probe(struct platform_device *pdev) ...@@ -117,7 +117,7 @@ static int bcm_kona_usb2_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, phy); platform_set_drvdata(pdev, phy);
gphy = devm_phy_create(dev, &ops, NULL); gphy = devm_phy_create(dev, NULL, &ops, NULL);
if (IS_ERR(gphy)) if (IS_ERR(gphy))
return PTR_ERR(gphy); return PTR_ERR(gphy);
......
...@@ -239,7 +239,7 @@ static int phy_berlin_sata_probe(struct platform_device *pdev) ...@@ -239,7 +239,7 @@ static int phy_berlin_sata_probe(struct platform_device *pdev)
if (!phy_desc) if (!phy_desc)
return -ENOMEM; return -ENOMEM;
phy = devm_phy_create(dev, &phy_berlin_sata_ops, NULL); phy = devm_phy_create(dev, NULL, &phy_berlin_sata_ops, NULL);
if (IS_ERR(phy)) { if (IS_ERR(phy)) {
dev_err(dev, "failed to create PHY %d\n", phy_id); dev_err(dev, "failed to create PHY %d\n", phy_id);
return PTR_ERR(phy); return PTR_ERR(phy);
......
...@@ -415,13 +415,20 @@ struct phy *of_phy_simple_xlate(struct device *dev, struct of_phandle_args ...@@ -415,13 +415,20 @@ struct phy *of_phy_simple_xlate(struct device *dev, struct of_phandle_args
struct phy *phy; struct phy *phy;
struct class_dev_iter iter; struct class_dev_iter iter;
struct device_node *node = dev->of_node; struct device_node *node = dev->of_node;
struct device_node *child;
class_dev_iter_init(&iter, phy_class, NULL, NULL); class_dev_iter_init(&iter, phy_class, NULL, NULL);
while ((dev = class_dev_iter_next(&iter))) { while ((dev = class_dev_iter_next(&iter))) {
phy = to_phy(dev); phy = to_phy(dev);
if (node != phy->dev.of_node) if (node != phy->dev.of_node) {
for_each_child_of_node(node, child) {
if (child == phy->dev.of_node)
goto phy_found;
}
continue; continue;
}
phy_found:
class_dev_iter_exit(&iter); class_dev_iter_exit(&iter);
return phy; return phy;
} }
...@@ -579,13 +586,15 @@ EXPORT_SYMBOL_GPL(devm_of_phy_get); ...@@ -579,13 +586,15 @@ EXPORT_SYMBOL_GPL(devm_of_phy_get);
/** /**
* phy_create() - create a new phy * phy_create() - create a new phy
* @dev: device that is creating the new phy * @dev: device that is creating the new phy
* @node: device node of the phy
* @ops: function pointers for performing phy operations * @ops: function pointers for performing phy operations
* @init_data: contains the list of PHY consumers or NULL * @init_data: contains the list of PHY consumers or NULL
* *
* Called to create a phy using phy framework. * Called to create a phy using phy framework.
*/ */
struct phy *phy_create(struct device *dev, const struct phy_ops *ops, struct phy *phy_create(struct device *dev, struct device_node *node,
struct phy_init_data *init_data) const struct phy_ops *ops,
struct phy_init_data *init_data)
{ {
int ret; int ret;
int id; int id;
...@@ -620,7 +629,7 @@ struct phy *phy_create(struct device *dev, const struct phy_ops *ops, ...@@ -620,7 +629,7 @@ struct phy *phy_create(struct device *dev, const struct phy_ops *ops,
phy->dev.class = phy_class; phy->dev.class = phy_class;
phy->dev.parent = dev; phy->dev.parent = dev;
phy->dev.of_node = dev->of_node; phy->dev.of_node = node ?: dev->of_node;
phy->id = id; phy->id = id;
phy->ops = ops; phy->ops = ops;
phy->init_data = init_data; phy->init_data = init_data;
...@@ -656,6 +665,7 @@ EXPORT_SYMBOL_GPL(phy_create); ...@@ -656,6 +665,7 @@ EXPORT_SYMBOL_GPL(phy_create);
/** /**
* devm_phy_create() - create a new phy * devm_phy_create() - create a new phy
* @dev: device that is creating the new phy * @dev: device that is creating the new phy
* @node: device node of the phy
* @ops: function pointers for performing phy operations * @ops: function pointers for performing phy operations
* @init_data: contains the list of PHY consumers or NULL * @init_data: contains the list of PHY consumers or NULL
* *
...@@ -664,8 +674,9 @@ EXPORT_SYMBOL_GPL(phy_create); ...@@ -664,8 +674,9 @@ EXPORT_SYMBOL_GPL(phy_create);
* On driver detach, release function is invoked on the devres data, * On driver detach, release function is invoked on the devres data,
* then, devres data is freed. * then, devres data is freed.
*/ */
struct phy *devm_phy_create(struct device *dev, const struct phy_ops *ops, struct phy *devm_phy_create(struct device *dev, struct device_node *node,
struct phy_init_data *init_data) const struct phy_ops *ops,
struct phy_init_data *init_data)
{ {
struct phy **ptr, *phy; struct phy **ptr, *phy;
...@@ -673,7 +684,7 @@ struct phy *devm_phy_create(struct device *dev, const struct phy_ops *ops, ...@@ -673,7 +684,7 @@ struct phy *devm_phy_create(struct device *dev, const struct phy_ops *ops,
if (!ptr) if (!ptr)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
phy = phy_create(dev, ops, init_data); phy = phy_create(dev, node, ops, init_data);
if (!IS_ERR(phy)) { if (!IS_ERR(phy)) {
*ptr = phy; *ptr = phy;
devres_add(dev, ptr); devres_add(dev, ptr);
......
...@@ -77,7 +77,7 @@ static int exynos_dp_video_phy_probe(struct platform_device *pdev) ...@@ -77,7 +77,7 @@ static int exynos_dp_video_phy_probe(struct platform_device *pdev)
if (IS_ERR(state->regs)) if (IS_ERR(state->regs))
return PTR_ERR(state->regs); return PTR_ERR(state->regs);
phy = devm_phy_create(dev, &exynos_dp_video_phy_ops, NULL); phy = devm_phy_create(dev, NULL, &exynos_dp_video_phy_ops, NULL);
if (IS_ERR(phy)) { if (IS_ERR(phy)) {
dev_err(dev, "failed to create Display Port PHY\n"); dev_err(dev, "failed to create Display Port PHY\n");
return PTR_ERR(phy); return PTR_ERR(phy);
......
...@@ -136,7 +136,7 @@ static int exynos_mipi_video_phy_probe(struct platform_device *pdev) ...@@ -136,7 +136,7 @@ static int exynos_mipi_video_phy_probe(struct platform_device *pdev)
spin_lock_init(&state->slock); spin_lock_init(&state->slock);
for (i = 0; i < EXYNOS_MIPI_PHYS_NUM; i++) { for (i = 0; i < EXYNOS_MIPI_PHYS_NUM; i++) {
struct phy *phy = devm_phy_create(dev, struct phy *phy = devm_phy_create(dev, NULL,
&exynos_mipi_video_phy_ops, NULL); &exynos_mipi_video_phy_ops, NULL);
if (IS_ERR(phy)) { if (IS_ERR(phy)) {
dev_err(dev, "failed to create PHY %d\n", i); dev_err(dev, "failed to create PHY %d\n", i);
......
...@@ -635,7 +635,8 @@ static int exynos5_usbdrd_phy_probe(struct platform_device *pdev) ...@@ -635,7 +635,8 @@ static int exynos5_usbdrd_phy_probe(struct platform_device *pdev)
dev_vdbg(dev, "Creating usbdrd_phy phy\n"); dev_vdbg(dev, "Creating usbdrd_phy phy\n");
for (i = 0; i < EXYNOS5_DRDPHYS_NUM; i++) { for (i = 0; i < EXYNOS5_DRDPHYS_NUM; i++) {
struct phy *phy = devm_phy_create(dev, &exynos5_usbdrd_phy_ops, struct phy *phy = devm_phy_create(dev, NULL,
&exynos5_usbdrd_phy_ops,
NULL); NULL);
if (IS_ERR(phy)) { if (IS_ERR(phy)) {
dev_err(dev, "Failed to create usbdrd_phy phy\n"); dev_err(dev, "Failed to create usbdrd_phy phy\n");
......
...@@ -210,7 +210,7 @@ static int exynos_sata_phy_probe(struct platform_device *pdev) ...@@ -210,7 +210,7 @@ static int exynos_sata_phy_probe(struct platform_device *pdev)
return ret; return ret;
} }
sata_phy->phy = devm_phy_create(dev, &exynos_sata_phy_ops, NULL); sata_phy->phy = devm_phy_create(dev, NULL, &exynos_sata_phy_ops, NULL);
if (IS_ERR(sata_phy->phy)) { if (IS_ERR(sata_phy->phy)) {
clk_disable_unprepare(sata_phy->phyclk); clk_disable_unprepare(sata_phy->phyclk);
dev_err(dev, "failed to create PHY\n"); dev_err(dev, "failed to create PHY\n");
......
...@@ -156,7 +156,7 @@ static int hix5hd2_sata_phy_probe(struct platform_device *pdev) ...@@ -156,7 +156,7 @@ static int hix5hd2_sata_phy_probe(struct platform_device *pdev)
if (IS_ERR(priv->peri_ctrl)) if (IS_ERR(priv->peri_ctrl))
priv->peri_ctrl = NULL; priv->peri_ctrl = NULL;
phy = devm_phy_create(dev, &hix5hd2_sata_phy_ops, NULL); phy = devm_phy_create(dev, NULL, &hix5hd2_sata_phy_ops, NULL);
if (IS_ERR(phy)) { if (IS_ERR(phy)) {
dev_err(dev, "failed to create PHY\n"); dev_err(dev, "failed to create PHY\n");
return PTR_ERR(phy); return PTR_ERR(phy);
......
...@@ -99,7 +99,7 @@ static int phy_mvebu_sata_probe(struct platform_device *pdev) ...@@ -99,7 +99,7 @@ static int phy_mvebu_sata_probe(struct platform_device *pdev)
if (IS_ERR(priv->clk)) if (IS_ERR(priv->clk))
return PTR_ERR(priv->clk); return PTR_ERR(priv->clk);
phy = devm_phy_create(&pdev->dev, &phy_mvebu_sata_ops, NULL); phy = devm_phy_create(&pdev->dev, NULL, &phy_mvebu_sata_ops, NULL);
if (IS_ERR(phy)) if (IS_ERR(phy))
return PTR_ERR(phy); return PTR_ERR(phy);
......
...@@ -263,7 +263,7 @@ static int omap_usb2_probe(struct platform_device *pdev) ...@@ -263,7 +263,7 @@ static int omap_usb2_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, phy); platform_set_drvdata(pdev, phy);
generic_phy = devm_phy_create(phy->dev, &ops, NULL); generic_phy = devm_phy_create(phy->dev, NULL, &ops, NULL);
if (IS_ERR(generic_phy)) if (IS_ERR(generic_phy))
return PTR_ERR(generic_phy); return PTR_ERR(generic_phy);
......
...@@ -228,7 +228,8 @@ static int qcom_apq8064_sata_phy_probe(struct platform_device *pdev) ...@@ -228,7 +228,8 @@ static int qcom_apq8064_sata_phy_probe(struct platform_device *pdev)
if (IS_ERR(phy->mmio)) if (IS_ERR(phy->mmio))
return PTR_ERR(phy->mmio); return PTR_ERR(phy->mmio);
generic_phy = devm_phy_create(dev, &qcom_apq8064_sata_phy_ops, NULL); generic_phy = devm_phy_create(dev, NULL, &qcom_apq8064_sata_phy_ops,
NULL);
if (IS_ERR(generic_phy)) { if (IS_ERR(generic_phy)) {
dev_err(dev, "%s: failed to create phy\n", __func__); dev_err(dev, "%s: failed to create phy\n", __func__);
return PTR_ERR(generic_phy); return PTR_ERR(generic_phy);
......
...@@ -196,7 +196,8 @@ static int samsung_usb2_phy_probe(struct platform_device *pdev) ...@@ -196,7 +196,8 @@ static int samsung_usb2_phy_probe(struct platform_device *pdev)
struct samsung_usb2_phy_instance *p = &drv->instances[i]; struct samsung_usb2_phy_instance *p = &drv->instances[i];
dev_dbg(dev, "Creating phy \"%s\"\n", label); dev_dbg(dev, "Creating phy \"%s\"\n", label);
p->phy = devm_phy_create(dev, &samsung_usb2_phy_ops, NULL); p->phy = devm_phy_create(dev, NULL, &samsung_usb2_phy_ops,
NULL);
if (IS_ERR(p->phy)) { if (IS_ERR(p->phy)) {
dev_err(drv->dev, "Failed to create usb2_phy \"%s\"\n", dev_err(drv->dev, "Failed to create usb2_phy \"%s\"\n",
label); label);
......
...@@ -295,7 +295,7 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev) ...@@ -295,7 +295,7 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
return PTR_ERR(phy->pmu); return PTR_ERR(phy->pmu);
} }
phy->phy = devm_phy_create(dev, &sun4i_usb_phy_ops, NULL); phy->phy = devm_phy_create(dev, NULL, &sun4i_usb_phy_ops, NULL);
if (IS_ERR(phy->phy)) { if (IS_ERR(phy->phy)) {
dev_err(dev, "failed to create PHY %d\n", i); dev_err(dev, "failed to create PHY %d\n", i);
return PTR_ERR(phy->phy); return PTR_ERR(phy->phy);
......
...@@ -400,7 +400,7 @@ static int ti_pipe3_probe(struct platform_device *pdev) ...@@ -400,7 +400,7 @@ static int ti_pipe3_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, phy); platform_set_drvdata(pdev, phy);
pm_runtime_enable(phy->dev); pm_runtime_enable(phy->dev);
generic_phy = devm_phy_create(phy->dev, &ops, NULL); generic_phy = devm_phy_create(phy->dev, NULL, &ops, NULL);
if (IS_ERR(generic_phy)) if (IS_ERR(generic_phy))
return PTR_ERR(generic_phy); return PTR_ERR(generic_phy);
......
...@@ -695,7 +695,7 @@ static int twl4030_usb_probe(struct platform_device *pdev) ...@@ -695,7 +695,7 @@ static int twl4030_usb_probe(struct platform_device *pdev)
otg->set_host = twl4030_set_host; otg->set_host = twl4030_set_host;
otg->set_peripheral = twl4030_set_peripheral; otg->set_peripheral = twl4030_set_peripheral;
phy = devm_phy_create(twl->dev, &ops, init_data); phy = devm_phy_create(twl->dev, NULL, &ops, init_data);
if (IS_ERR(phy)) { if (IS_ERR(phy)) {
dev_dbg(&pdev->dev, "Failed to create PHY\n"); dev_dbg(&pdev->dev, "Failed to create PHY\n");
return PTR_ERR(phy); return PTR_ERR(phy);
......
...@@ -1707,7 +1707,7 @@ static int xgene_phy_probe(struct platform_device *pdev) ...@@ -1707,7 +1707,7 @@ static int xgene_phy_probe(struct platform_device *pdev)
ctx->dev = &pdev->dev; ctx->dev = &pdev->dev;
platform_set_drvdata(pdev, ctx); platform_set_drvdata(pdev, ctx);
ctx->phy = devm_phy_create(ctx->dev, &xgene_phy_ops, NULL); ctx->phy = devm_phy_create(ctx->dev, NULL, &xgene_phy_ops, NULL);
if (IS_ERR(ctx->phy)) { if (IS_ERR(ctx->phy)) {
dev_dbg(&pdev->dev, "Failed to create PHY\n"); dev_dbg(&pdev->dev, "Failed to create PHY\n");
rc = PTR_ERR(ctx->phy); rc = PTR_ERR(ctx->phy);
......
...@@ -158,9 +158,10 @@ void devm_phy_put(struct device *dev, struct phy *phy); ...@@ -158,9 +158,10 @@ void devm_phy_put(struct device *dev, struct phy *phy);
struct phy *of_phy_get(struct device_node *np, const char *con_id); struct phy *of_phy_get(struct device_node *np, const char *con_id);
struct phy *of_phy_simple_xlate(struct device *dev, struct phy *of_phy_simple_xlate(struct device *dev,
struct of_phandle_args *args); struct of_phandle_args *args);
struct phy *phy_create(struct device *dev, const struct phy_ops *ops, struct phy *phy_create(struct device *dev, struct device_node *node,
struct phy_init_data *init_data); const struct phy_ops *ops,
struct phy *devm_phy_create(struct device *dev, struct phy_init_data *init_data);
struct phy *devm_phy_create(struct device *dev, struct device_node *node,
const struct phy_ops *ops, struct phy_init_data *init_data); const struct phy_ops *ops, struct phy_init_data *init_data);
void phy_destroy(struct phy *phy); void phy_destroy(struct phy *phy);
void devm_phy_destroy(struct device *dev, struct phy *phy); void devm_phy_destroy(struct device *dev, struct phy *phy);
...@@ -299,13 +300,17 @@ static inline struct phy *of_phy_simple_xlate(struct device *dev, ...@@ -299,13 +300,17 @@ static inline struct phy *of_phy_simple_xlate(struct device *dev,
} }
static inline struct phy *phy_create(struct device *dev, static inline struct phy *phy_create(struct device *dev,
const struct phy_ops *ops, struct phy_init_data *init_data) struct device_node *node,
const struct phy_ops *ops,
struct phy_init_data *init_data)
{ {
return ERR_PTR(-ENOSYS); return ERR_PTR(-ENOSYS);
} }
static inline struct phy *devm_phy_create(struct device *dev, static inline struct phy *devm_phy_create(struct device *dev,
const struct phy_ops *ops, struct phy_init_data *init_data) struct device_node *node,
const struct phy_ops *ops,
struct phy_init_data *init_data)
{ {
return ERR_PTR(-ENOSYS); return ERR_PTR(-ENOSYS);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment