forked from mirrors/linux
		
	regmap: verify if register is writeable before writing operations
regmap provides a couple of ways to validate the register range used. a) maxim allowed register, b) writable/readable register tables, c) callback function that can be provided by the driver to validate a register. regmap framework should verify if registers are writeable before every write operation. However this doesn't seems to happen in every situation. The method `_regmap_raw_write_impl` is only using the `writeable_reg` callback to verify if register is writeable, ignoring the other two. This can lead to undefined behaviour since this allows to write to registers that could be declared un-writeable by using any other option. Change `_regmap_raw_write_impl` to use the `regmap_writeable` method to verify if registers are writable before the write operation. Signed-off-by: Nandor Han <nandor.han@vaisala.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
		
							parent
							
								
									cc6a8d69ba
								
							
						
					
					
						commit
						8b9f9d4dc5
					
				
					 1 changed files with 4 additions and 5 deletions
				
			
		|  | @ -1493,11 +1493,10 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg, | |||
| 	WARN_ON(!map->bus); | ||||
| 
 | ||||
| 	/* Check for unwritable registers before we start */ | ||||
| 	if (map->writeable_reg) | ||||
| 		for (i = 0; i < val_len / map->format.val_bytes; i++) | ||||
| 			if (!map->writeable_reg(map->dev, | ||||
| 					       reg + regmap_get_offset(map, i))) | ||||
| 				return -EINVAL; | ||||
| 	for (i = 0; i < val_len / map->format.val_bytes; i++) | ||||
| 		if (!regmap_writeable(map, | ||||
| 				     reg + regmap_get_offset(map, i))) | ||||
| 			return -EINVAL; | ||||
| 
 | ||||
| 	if (!map->cache_bypass && map->format.parse_val) { | ||||
| 		unsigned int ival; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Han Nandor
						Han Nandor