Skip to content

Commit d4a0055

Browse files
dlechbroonie
authored andcommitted
spi: add devm_spi_optimize_message() helper
This adds a new helper function devm_spi_optimize_message() that automatically registers spi_unoptimize_message() to be called when the device is removed. Signed-off-by: David Lechner <[email protected]> Link: https://patch.msgid.link/20240621-devm_spi_optimize_message-v1-2-3f9dcba6e95e@baylibre.com Signed-off-by: Mark Brown <[email protected]>
1 parent 9b894d6 commit d4a0055

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

Documentation/driver-api/driver-model/devres.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,7 @@ SLAVE DMA ENGINE
464464
SPI
465465
devm_spi_alloc_master()
466466
devm_spi_alloc_slave()
467+
devm_spi_optimize_message()
467468
devm_spi_register_controller()
468469
devm_spi_register_host()
469470
devm_spi_register_target()

drivers/spi/spi.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4378,6 +4378,33 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message)
43784378
return ctlr->transfer(spi, message);
43794379
}
43804380

4381+
static void devm_spi_unoptimize_message(void *msg)
4382+
{
4383+
spi_unoptimize_message(msg);
4384+
}
4385+
4386+
/**
4387+
* devm_spi_optimize_message - managed version of spi_optimize_message()
4388+
* @dev: the device that manages @msg (usually @spi->dev)
4389+
* @spi: the device that will be used for the message
4390+
* @msg: the message to optimize
4391+
* Return: zero on success, else a negative error code
4392+
*
4393+
* spi_unoptimize_message() will automatically be called when the device is
4394+
* removed.
4395+
*/
4396+
int devm_spi_optimize_message(struct device *dev, struct spi_device *spi,
4397+
struct spi_message *msg)
4398+
{
4399+
int ret;
4400+
4401+
ret = spi_optimize_message(spi, msg);
4402+
if (ret)
4403+
return ret;
4404+
4405+
return devm_add_action_or_reset(dev, devm_spi_unoptimize_message, msg);
4406+
}
4407+
43814408
/**
43824409
* spi_async - asynchronous SPI transfer
43834410
* @spi: device with which data will be exchanged

include/linux/spi/spi.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,6 +1268,8 @@ static inline void spi_message_free(struct spi_message *m)
12681268

12691269
extern int spi_optimize_message(struct spi_device *spi, struct spi_message *msg);
12701270
extern void spi_unoptimize_message(struct spi_message *msg);
1271+
extern int devm_spi_optimize_message(struct device *dev, struct spi_device *spi,
1272+
struct spi_message *msg);
12711273

12721274
extern int spi_setup(struct spi_device *spi);
12731275
extern int spi_async(struct spi_device *spi, struct spi_message *message);

0 commit comments

Comments
 (0)