diff options
| -rw-r--r-- | drivers/mfd/syscon.c | 9 | 
1 files changed, 8 insertions, 1 deletions
| diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c index 226915ca3c93..362824a7e350 100644 --- a/drivers/mfd/syscon.c +++ b/drivers/mfd/syscon.c @@ -47,6 +47,7 @@ static struct syscon *of_syscon_register(struct device_node *np, bool check_res)  	struct regmap_config syscon_config = syscon_regmap_config;  	struct resource res;  	struct reset_control *reset; +	resource_size_t res_size;  	WARN_ON(!mutex_is_locked(&syscon_list_lock)); @@ -96,6 +97,12 @@ static struct syscon *of_syscon_register(struct device_node *np, bool check_res)  		}  	} +	res_size = resource_size(&res); +	if (res_size < reg_io_width) { +		ret = -EFAULT; +		goto err_regmap; +	} +  	syscon_config.name = kasprintf(GFP_KERNEL, "%pOFn@%pa", np, &res.start);  	if (!syscon_config.name) {  		ret = -ENOMEM; @@ -103,7 +110,7 @@ static struct syscon *of_syscon_register(struct device_node *np, bool check_res)  	}  	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; +	syscon_config.max_register = res_size - reg_io_width;  	if (!syscon_config.max_register)  		syscon_config.max_register_is_0 = true; | 
