diff options
Diffstat (limited to 'drivers/bus/imx-weim.c')
| -rw-r--r-- | drivers/bus/imx-weim.c | 27 | 
1 files changed, 17 insertions, 10 deletions
diff --git a/drivers/bus/imx-weim.c b/drivers/bus/imx-weim.c index 2a6b4f676458..52a5d0447390 100644 --- a/drivers/bus/imx-weim.c +++ b/drivers/bus/imx-weim.c @@ -10,6 +10,7 @@  #include <linux/module.h>  #include <linux/clk.h>  #include <linux/io.h> +#include <linux/of_address.h>  #include <linux/of_device.h>  #include <linux/mfd/syscon.h>  #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> @@ -86,8 +87,8 @@ MODULE_DEVICE_TABLE(of, weim_id_table);  static int imx_weim_gpr_setup(struct platform_device *pdev)  {  	struct device_node *np = pdev->dev.of_node; -	struct property *prop; -	const __be32 *p; +	struct of_range_parser parser; +	struct of_range range;  	struct regmap *gpr;  	u32 gprvals[4] = {  		05,	/* CS0(128M) CS1(0M)  CS2(0M)  CS3(0M)  */ @@ -106,13 +107,13 @@ static int imx_weim_gpr_setup(struct platform_device *pdev)  		return 0;  	} -	of_property_for_each_u32(np, "ranges", prop, p, val) { -		if (i % 4 == 0) { -			cs = val; -		} else if (i % 4 == 3 && val) { -			val = (val / SZ_32M) | 1; -			gprval |= val << cs * 3; -		} +	if (of_range_parser_init(&parser, np)) +		goto err; + +	for_each_of_range(&parser, &range) { +		cs = range.bus_addr >> 32; +		val = (range.size / SZ_32M) | 1; +		gprval |= val << cs * 3;  		i++;  	} @@ -204,8 +205,8 @@ static int weim_parse_dt(struct platform_device *pdev)  	const struct of_device_id *of_id = of_match_device(weim_id_table,  							   &pdev->dev);  	const struct imx_weim_devtype *devtype = of_id->data; +	int ret = 0, have_child = 0;  	struct device_node *child; -	int ret, have_child = 0;  	struct weim_priv *priv;  	void __iomem *base;  	u32 reg; @@ -329,6 +330,12 @@ static int of_weim_notify(struct notifier_block *nb, unsigned long action,  				 "Failed to setup timing for '%pOF'\n", rd->dn);  		if (!of_node_check_flag(rd->dn, OF_POPULATED)) { +			/* +			 * Clear the flag before adding the device so that +			 * fw_devlink doesn't skip adding consumers to this +			 * device. +			 */ +			rd->dn->fwnode.flags &= ~FWNODE_FLAG_NOT_DEVICE;  			if (!of_platform_device_create(rd->dn, NULL, &pdev->dev)) {  				dev_err(&pdev->dev,  					"Failed to create child device '%pOF'\n",  |