Thread (7 messages) 7 messages, 3 authors, 2020-11-30

RE: [PATCH 1/1] clk: imx: scu: remove the calling of device_is_bound

From: Aisheng Dong <aisheng.dong@nxp.com>
Date: 2020-11-19 15:30:55
Also in: linux-clk

From: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
Sent: Thursday, November 19, 2020 9:08 PM

Hi Dong,

On Thu, Nov 19, 2020 at 07:43:02PM +0800, Dong Aisheng wrote:
quoted
The device_is_bound() is unvisable to drivers when built as modules.
It's also not aimed to be used by drivers according to Greg K.H.
Let's remove it from clk-scu driver and find another way to do proper
driver loading sequence.
Greg was asking to use device_link for this issue. Have you tried something like
the following: (untested as I dont have the hardware).
It can't work as expected because it requires supplier devices (scu pd) to be probed first.
and if scu pd was probed first, then there're already no issues.

Regards
Aisheng
quoted hunk ↗ jump to hunk
diff --git a/drivers/clk/imx/clk-imx8qxp.c b/drivers/clk/imx/clk-imx8qxp.c index
5b3d4ede7c7c..9ae6c768ea05 100644
--- a/drivers/clk/imx/clk-imx8qxp.c
+++ b/drivers/clk/imx/clk-imx8qxp.c
@@ -25,7 +25,7 @@ static int imx8qxp_clk_probe(struct platform_device
*pdev)
 	u32 clk_cells;
 	int ret, i;

-	ret = imx_clk_scu_init(ccm_node);
+	ret = imx_clk_scu_init(ccm_node, pdev);
 	if (ret)
 		return ret;
diff --git a/drivers/clk/imx/clk-scu.c b/drivers/clk/imx/clk-scu.c index
d10f60e48ece..e834bfadc2a6 100644
--- a/drivers/clk/imx/clk-scu.c
+++ b/drivers/clk/imx/clk-scu.c
@@ -151,8 +151,9 @@ static inline struct clk_scu *to_clk_scu(struct clk_hw
*hw)
 	return container_of(hw, struct clk_scu, hw);  }

-int imx_clk_scu_init(struct device_node *np)
+int imx_clk_scu_init(struct device_node *np, struct platform_device
+*pdev)
 {
+	struct device *dev = &pdev->dev;
 	struct platform_device *pd_dev;
 	u32 clk_cells;
 	int ret, i;
@@ -173,12 +174,12 @@ int imx_clk_scu_init(struct device_node *np)
 		 */
 		pd_np = of_find_compatible_node(NULL, NULL, "fsl,scu-pd");
 		pd_dev = of_find_device_by_node(pd_np);
-		if (!pd_dev || !device_is_bound(&pd_dev->dev)) {
+		if (!pd_dev || !device_link_add(dev, &pd_dev->dev,
+						DL_FLAG_AUTOREMOVE_CONSUMER)) {
 			of_node_put(pd_np);
 			return -EPROBE_DEFER;
 		}
 	}
-
 	return platform_driver_register(&imx_clk_scu_driver);
 }
diff --git a/drivers/clk/imx/clk-scu.h b/drivers/clk/imx/clk-scu.h index
e8352164923e..14e2baf14757 100644
--- a/drivers/clk/imx/clk-scu.h
+++ b/drivers/clk/imx/clk-scu.h
@@ -13,7 +13,7 @@
 extern struct list_head imx_scu_clks[];  extern const struct dev_pm_ops
imx_clk_lpcg_scu_pm_ops;

-int imx_clk_scu_init(struct device_node *np);
+int imx_clk_scu_init(struct device_node *np, struct platform_device
+*pdev);
 struct clk_hw *imx_scu_of_clk_src_get(struct of_phandle_args *clkspec,
 				      void *data);
 struct clk_hw *imx_clk_scu_alloc_dev(const char *name,

--
Regards
Sudip
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help