forked from mirrors/linux
		
	spi: core: Add devm_spi_register_master()
Help simplify the cleanup code for SPI master drivers by providing a managed master registration function, ensuring that the master is automatically unregistered whenever the device is unbound. Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
		
							parent
							
								
									272b98c645
								
							
						
					
					
						commit
						666d5b4c74
					
				
					 3 changed files with 40 additions and 0 deletions
				
			
		| 
						 | 
					@ -302,3 +302,6 @@ PHY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SLAVE DMA ENGINE
 | 
					SLAVE DMA ENGINE
 | 
				
			||||||
  devm_acpi_dma_controller_register()
 | 
					  devm_acpi_dma_controller_register()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SPI
 | 
				
			||||||
 | 
					  devm_spi_register_master()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1245,6 +1245,41 @@ int spi_register_master(struct spi_master *master)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(spi_register_master);
 | 
					EXPORT_SYMBOL_GPL(spi_register_master);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void devm_spi_unregister(struct device *dev, void *res)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						spi_unregister_master(*(struct spi_master **)res);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * dev_spi_register_master - register managed SPI master controller
 | 
				
			||||||
 | 
					 * @dev:    device managing SPI master
 | 
				
			||||||
 | 
					 * @master: initialized master, originally from spi_alloc_master()
 | 
				
			||||||
 | 
					 * Context: can sleep
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Register a SPI device as with spi_register_master() which will
 | 
				
			||||||
 | 
					 * automatically be unregister
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int devm_spi_register_master(struct device *dev, struct spi_master *master)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct spi_master **ptr;
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr = devres_alloc(devm_spi_unregister, sizeof(*ptr), GFP_KERNEL);
 | 
				
			||||||
 | 
						if (!ptr)
 | 
				
			||||||
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = spi_register_master(master);
 | 
				
			||||||
 | 
						if (ret != 0) {
 | 
				
			||||||
 | 
							*ptr = master;
 | 
				
			||||||
 | 
							devres_add(dev, ptr);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							devres_free(ptr);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL_GPL(devm_spi_register_master);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __unregister(struct device *dev, void *null)
 | 
					static int __unregister(struct device *dev, void *null)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	spi_unregister_device(to_spi_device(dev));
 | 
						spi_unregister_device(to_spi_device(dev));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -434,6 +434,8 @@ extern struct spi_master *
 | 
				
			||||||
spi_alloc_master(struct device *host, unsigned size);
 | 
					spi_alloc_master(struct device *host, unsigned size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int spi_register_master(struct spi_master *master);
 | 
					extern int spi_register_master(struct spi_master *master);
 | 
				
			||||||
 | 
					extern int devm_spi_register_master(struct device *dev,
 | 
				
			||||||
 | 
									    struct spi_master *master);
 | 
				
			||||||
extern void spi_unregister_master(struct spi_master *master);
 | 
					extern void spi_unregister_master(struct spi_master *master);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct spi_master *spi_busnum_to_master(u16 busnum);
 | 
					extern struct spi_master *spi_busnum_to_master(u16 busnum);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue