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

Aisheng Dong aisheng.dong at nxp.com
Thu Nov 19 10:30:51 EST 2020


> From: Sudip Mukherjee <sudipm.mukherjee at 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:
> > 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

> 
> 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


More information about the linux-arm-kernel mailing list