mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 00:53:34 +02:00
spi: add devm_spi_new_ancillary_device()
Merge series from Antoniu Miclaus <antoniu.miclaus@analog.com>: Add a devres-managed version of spi_new_ancillary_device() that automatically unregisters the ancillary SPI device when the parent device is removed.
This commit is contained in:
commit
463279e588
|
|
@ -2747,6 +2747,46 @@ struct spi_device *spi_new_ancillary_device(struct spi_device *spi,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(spi_new_ancillary_device);
|
||||
|
||||
static void devm_spi_unregister_device(void *spi)
|
||||
{
|
||||
spi_unregister_device(spi);
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_spi_new_ancillary_device() - Register managed ancillary SPI device
|
||||
* @spi: Pointer to the main SPI device registering the ancillary device
|
||||
* @chip_select: Chip Select of the ancillary device
|
||||
*
|
||||
* Register an ancillary SPI device; for example some chips have a chip-select
|
||||
* for normal device usage and another one for setup/firmware upload.
|
||||
*
|
||||
* This is the managed version of spi_new_ancillary_device(). The ancillary
|
||||
* device will be unregistered automatically when the parent SPI device is
|
||||
* unregistered.
|
||||
*
|
||||
* This may only be called from main SPI device's probe routine.
|
||||
*
|
||||
* Return: Pointer to new ancillary device on success; ERR_PTR on failure
|
||||
*/
|
||||
struct spi_device *devm_spi_new_ancillary_device(struct spi_device *spi,
|
||||
u8 chip_select)
|
||||
{
|
||||
struct spi_device *ancillary;
|
||||
int ret;
|
||||
|
||||
ancillary = spi_new_ancillary_device(spi, chip_select);
|
||||
if (IS_ERR(ancillary))
|
||||
return ancillary;
|
||||
|
||||
ret = devm_add_action_or_reset(&spi->dev, devm_spi_unregister_device,
|
||||
ancillary);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
return ancillary;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_spi_new_ancillary_device);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
struct acpi_spi_lookup {
|
||||
struct spi_controller *ctlr;
|
||||
|
|
|
|||
|
|
@ -387,6 +387,7 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)
|
|||
}
|
||||
|
||||
extern struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 chip_select);
|
||||
extern struct spi_device *devm_spi_new_ancillary_device(struct spi_device *spi, u8 chip_select);
|
||||
|
||||
/* Use a define to avoid include chaining to get THIS_MODULE */
|
||||
#define spi_register_driver(driver) \
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user