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: Kishon Vijay Abraham I <kishon@ti.com> Acked-by: Lee Jones <lee.jones@linaro.org>
This commit is contained in:
Родитель
2a4c37016c
Коммит
f0ed817638
|
@ -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)
|
||||||
|
|
||||||
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)
|
||||||
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
|
||||||
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);
|
||||||
/**
|
/**
|
||||||
* 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,
|
||||||
|
|
||||||
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);
|
||||||
/**
|
/**
|
||||||
* 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);
|
||||||
* 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,
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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);
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче