mtd: sf: Make sure we don't register the same device twice
spi_flash_mtd_register() can be called several times and each time it
will register the same mtd_info instance like if it was a new one.
The MTD ID allocation gets crazy when that happens, so let's track the
status of the sf_mtd_info object to avoid that.
Fixes: 9fe6d8716e ("mtd, spi: Add MTD layer driver")
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
Tested-by: Heiko Schocher <hs@denx.de>
Reviewed-by: Jagan Teki <jagan@openedev.com>
			
			
This commit is contained in:
		
							parent
							
								
									a02820fca9
								
							
						
					
					
						commit
						492151b209
					
				|  | @ -10,6 +10,7 @@ | ||||||
| #include <spi_flash.h> | #include <spi_flash.h> | ||||||
| 
 | 
 | ||||||
| static struct mtd_info sf_mtd_info; | static struct mtd_info sf_mtd_info; | ||||||
|  | static bool sf_mtd_registered; | ||||||
| static char sf_mtd_name[8]; | static char sf_mtd_name[8]; | ||||||
| 
 | 
 | ||||||
| static int spi_flash_mtd_erase(struct mtd_info *mtd, struct erase_info *instr) | static int spi_flash_mtd_erase(struct mtd_info *mtd, struct erase_info *instr) | ||||||
|  | @ -73,6 +74,12 @@ static int spi_flash_mtd_number(void) | ||||||
| 
 | 
 | ||||||
| int spi_flash_mtd_register(struct spi_flash *flash) | int spi_flash_mtd_register(struct spi_flash *flash) | ||||||
| { | { | ||||||
|  | 	int ret; | ||||||
|  | 
 | ||||||
|  | 	if (sf_mtd_registered) | ||||||
|  | 		del_mtd_device(&sf_mtd_info); | ||||||
|  | 
 | ||||||
|  | 	sf_mtd_registered = false; | ||||||
| 	memset(&sf_mtd_info, 0, sizeof(sf_mtd_info)); | 	memset(&sf_mtd_info, 0, sizeof(sf_mtd_info)); | ||||||
| 	sprintf(sf_mtd_name, "nor%d", spi_flash_mtd_number()); | 	sprintf(sf_mtd_name, "nor%d", spi_flash_mtd_number()); | ||||||
| 
 | 
 | ||||||
|  | @ -94,7 +101,11 @@ int spi_flash_mtd_register(struct spi_flash *flash) | ||||||
| 	sf_mtd_info.numeraseregions = 0; | 	sf_mtd_info.numeraseregions = 0; | ||||||
| 	sf_mtd_info.erasesize = flash->sector_size; | 	sf_mtd_info.erasesize = flash->sector_size; | ||||||
| 
 | 
 | ||||||
| 	return add_mtd_device(&sf_mtd_info); | 	ret = add_mtd_device(&sf_mtd_info); | ||||||
|  | 	if (!ret) | ||||||
|  | 		sf_mtd_registered = true; | ||||||
|  | 
 | ||||||
|  | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void spi_flash_mtd_unregister(void) | void spi_flash_mtd_unregister(void) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue