Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 64fe1891 authored by Kishon Vijay Abraham I's avatar Kishon Vijay Abraham I Committed by Greg Kroah-Hartman
Browse files

phy: let phy_provider_register be the last step in registering PHY



Registering phy_provider before creating the PHY can result in PHY
callbacks being invoked which will lead to aborts. In order to avoid this
invoke phy_provider_register after phy_create and phy_set_drvdata.

Reported-by: default avatarFelipe Balbi <balbi@ti.com>
Signed-off-by: default avatarKishon Vijay Abraham I <kishon@ti.com>
Acked-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b51fbf9f
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -76,10 +76,6 @@ 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_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
	if (IS_ERR(phy_provider))
		return PTR_ERR(phy_provider);

	phy = devm_phy_create(dev, &exynos_dp_video_phy_ops, NULL);
	phy = devm_phy_create(dev, &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");
@@ -87,6 +83,10 @@ static int exynos_dp_video_phy_probe(struct platform_device *pdev)
	}
	}
	phy_set_drvdata(phy, state);
	phy_set_drvdata(phy, state);


	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
	if (IS_ERR(phy_provider))
		return PTR_ERR(phy_provider);

	return 0;
	return 0;
}
}


+5 −5
Original line number Original line Diff line number Diff line
@@ -134,11 +134,6 @@ static int exynos_mipi_video_phy_probe(struct platform_device *pdev)
	dev_set_drvdata(dev, state);
	dev_set_drvdata(dev, state);
	spin_lock_init(&state->slock);
	spin_lock_init(&state->slock);


	phy_provider = devm_of_phy_provider_register(dev,
					exynos_mipi_video_phy_xlate);
	if (IS_ERR(phy_provider))
		return PTR_ERR(phy_provider);

	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,
					&exynos_mipi_video_phy_ops, NULL);
					&exynos_mipi_video_phy_ops, NULL);
@@ -152,6 +147,11 @@ static int exynos_mipi_video_phy_probe(struct platform_device *pdev)
		phy_set_drvdata(phy, &state->phys[i]);
		phy_set_drvdata(phy, &state->phys[i]);
	}
	}


	phy_provider = devm_of_phy_provider_register(dev,
					exynos_mipi_video_phy_xlate);
	if (IS_ERR(phy_provider))
		return PTR_ERR(phy_provider);

	return 0;
	return 0;
}
}


+5 −5
Original line number Original line Diff line number Diff line
@@ -99,17 +99,17 @@ 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_provider = devm_of_phy_provider_register(&pdev->dev,
						     of_phy_simple_xlate);
	if (IS_ERR(phy_provider))
		return PTR_ERR(phy_provider);

	phy = devm_phy_create(&pdev->dev, &phy_mvebu_sata_ops, NULL);
	phy = devm_phy_create(&pdev->dev, &phy_mvebu_sata_ops, NULL);
	if (IS_ERR(phy))
	if (IS_ERR(phy))
		return PTR_ERR(phy);
		return PTR_ERR(phy);


	phy_set_drvdata(phy, priv);
	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. */
	/* The boot loader may of left it on. Turn it off. */
	phy_mvebu_sata_power_off(phy);
	phy_mvebu_sata_power_off(phy);


+5 −5
Original line number Original line Diff line number Diff line
@@ -177,11 +177,6 @@ static int omap_usb2_probe(struct platform_device *pdev)
	phy->phy.otg		= otg;
	phy->phy.otg		= otg;
	phy->phy.type		= USB_PHY_TYPE_USB2;
	phy->phy.type		= USB_PHY_TYPE_USB2;


	phy_provider = devm_of_phy_provider_register(phy->dev,
			of_phy_simple_xlate);
	if (IS_ERR(phy_provider))
		return PTR_ERR(phy_provider);

	control_node = of_parse_phandle(node, "ctrl-module", 0);
	control_node = of_parse_phandle(node, "ctrl-module", 0);
	if (!control_node) {
	if (!control_node) {
		dev_err(&pdev->dev, "Failed to get control device phandle\n");
		dev_err(&pdev->dev, "Failed to get control device phandle\n");
@@ -214,6 +209,11 @@ static int omap_usb2_probe(struct platform_device *pdev)


	phy_set_drvdata(generic_phy, 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);

	phy->wkupclk = devm_clk_get(phy->dev, "usb_phy_cm_clk32k");
	phy->wkupclk = devm_clk_get(phy->dev, "usb_phy_cm_clk32k");
	if (IS_ERR(phy->wkupclk)) {
	if (IS_ERR(phy->wkupclk)) {
		dev_err(&pdev->dev, "unable to get usb_phy_cm_clk32k\n");
		dev_err(&pdev->dev, "unable to get usb_phy_cm_clk32k\n");
+5 −5
Original line number Original line Diff line number Diff line
@@ -695,11 +695,6 @@ 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_provider = devm_of_phy_provider_register(twl->dev,
		of_phy_simple_xlate);
	if (IS_ERR(phy_provider))
		return PTR_ERR(phy_provider);

	phy = devm_phy_create(twl->dev, &ops, init_data);
	phy = devm_phy_create(twl->dev, &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");
@@ -708,6 +703,11 @@ static int twl4030_usb_probe(struct platform_device *pdev)


	phy_set_drvdata(phy, twl);
	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 */
	/* init spinlock for workqueue */
	spin_lock_init(&twl->lock);
	spin_lock_init(&twl->lock);