diff options
Diffstat (limited to 'drivers/mfd/syscon.c')
| -rw-r--r-- | drivers/mfd/syscon.c | 19 | 
1 files changed, 13 insertions, 6 deletions
| diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c index b7aabeefab07..2f2225e845ef 100644 --- a/drivers/mfd/syscon.c +++ b/drivers/mfd/syscon.c @@ -36,7 +36,7 @@ struct syscon {  	struct list_head list;  }; -static struct regmap_config syscon_regmap_config = { +static const struct regmap_config syscon_regmap_config = {  	.reg_bits = 32,  	.val_bits = 32,  	.reg_stride = 4, @@ -50,6 +50,7 @@ static struct syscon *of_syscon_register(struct device_node *np)  	u32 reg_io_width;  	int ret;  	struct regmap_config syscon_config = syscon_regmap_config; +	struct resource res;  	if (!of_device_is_compatible(np, "syscon"))  		return ERR_PTR(-EINVAL); @@ -58,7 +59,12 @@ static struct syscon *of_syscon_register(struct device_node *np)  	if (!syscon)  		return ERR_PTR(-ENOMEM); -	base = of_iomap(np, 0); +	if (of_address_to_resource(np, 0, &res)) { +		ret = -ENOMEM; +		goto err_map; +	} + +	base = ioremap(res.start, resource_size(&res));  	if (!base) {  		ret = -ENOMEM;  		goto err_map; @@ -81,6 +87,7 @@ static struct syscon *of_syscon_register(struct device_node *np)  	syscon_config.reg_stride = reg_io_width;  	syscon_config.val_bits = reg_io_width * 8; +	syscon_config.max_register = resource_size(&res) - reg_io_width;  	regmap = regmap_init_mmio(NULL, base, &syscon_config);  	if (IS_ERR(regmap)) { @@ -192,6 +199,7 @@ static int syscon_probe(struct platform_device *pdev)  	struct device *dev = &pdev->dev;  	struct syscon_platform_data *pdata = dev_get_platdata(dev);  	struct syscon *syscon; +	struct regmap_config syscon_config = syscon_regmap_config;  	struct resource *res;  	void __iomem *base; @@ -207,11 +215,10 @@ static int syscon_probe(struct platform_device *pdev)  	if (!base)  		return -ENOMEM; -	syscon_regmap_config.max_register = res->end - res->start - 3; +	syscon_config.max_register = res->end - res->start - 3;  	if (pdata) -		syscon_regmap_config.name = pdata->label; -	syscon->regmap = devm_regmap_init_mmio(dev, base, -					&syscon_regmap_config); +		syscon_config.name = pdata->label; +	syscon->regmap = devm_regmap_init_mmio(dev, base, &syscon_config);  	if (IS_ERR(syscon->regmap)) {  		dev_err(dev, "regmap init failed\n");  		return PTR_ERR(syscon->regmap); | 
