diff options
Diffstat (limited to 'arch/arm/mach-imx/src.c')
| -rw-r--r-- | arch/arm/mach-imx/src.c | 40 | 
1 files changed, 31 insertions, 9 deletions
| diff --git a/arch/arm/mach-imx/src.c b/arch/arm/mach-imx/src.c index 95fd1fbb0826..59a8e8cc4469 100644 --- a/arch/arm/mach-imx/src.c +++ b/arch/arm/mach-imx/src.c @@ -9,6 +9,7 @@  #include <linux/iopoll.h>  #include <linux/of.h>  #include <linux/of_address.h> +#include <linux/platform_device.h>  #include <linux/reset-controller.h>  #include <linux/smp.h>  #include <asm/smp_plat.h> @@ -81,11 +82,6 @@ static const struct reset_control_ops imx_src_ops = {  	.reset = imx_src_reset_module,  }; -static struct reset_controller_dev imx_reset_controller = { -	.ops = &imx_src_ops, -	.nr_resets = ARRAY_SIZE(sw_reset_bits), -}; -  static void imx_gpcv2_set_m_core_pgc(bool enable, u32 offset)  {  	writel_relaxed(enable, gpc_base + offset); @@ -177,10 +173,6 @@ void __init imx_src_init(void)  	src_base = of_iomap(np, 0);  	WARN_ON(!src_base); -	imx_reset_controller.of_node = np; -	if (IS_ENABLED(CONFIG_RESET_CONTROLLER)) -		reset_controller_register(&imx_reset_controller); -  	/*  	 * force warm reset sources to generate cold reset  	 * for a more reliable restart @@ -214,3 +206,33 @@ void __init imx7_src_init(void)  	if (!gpc_base)  		return;  } + +static const struct of_device_id imx_src_dt_ids[] = { +	{ .compatible = "fsl,imx51-src" }, +	{ /* sentinel */ } +}; + +static int imx_src_probe(struct platform_device *pdev) +{ +	struct reset_controller_dev *rcdev; + +	rcdev = devm_kzalloc(&pdev->dev, sizeof(*rcdev), GFP_KERNEL); +	if (!rcdev) +		return -ENOMEM; + +	rcdev->ops = &imx_src_ops; +	rcdev->dev = &pdev->dev; +	rcdev->of_node = pdev->dev.of_node; +	rcdev->nr_resets = ARRAY_SIZE(sw_reset_bits); + +	return devm_reset_controller_register(&pdev->dev, rcdev); +} + +static struct platform_driver imx_src_driver = { +	.driver = { +		.name = "imx-src", +		.of_match_table = imx_src_dt_ids, +	}, +	.probe = imx_src_probe, +}; +builtin_platform_driver(imx_src_driver); |