mailbox: Add device-managed registration functions
Add device-managed equivalents of the mbox_controller_register() and mbox_controller_unregister() functions that can be used to have the devres infrastructure automatically unregister mailbox controllers on driver probe failure or driver removal. This can help remove a lot of boiler plate code from drivers. Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> Reviewed-by: Sudeep Holla <sudeep.holla@arm.com> Signed-off-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
This commit is contained in:
Родитель
e2affdbef2
Коммит
e898d9cdd3
|
@ -515,3 +515,73 @@ void mbox_controller_unregister(struct mbox_controller *mbox)
|
|||
mutex_unlock(&con_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mbox_controller_unregister);
|
||||
|
||||
static void __devm_mbox_controller_unregister(struct device *dev, void *res)
|
||||
{
|
||||
struct mbox_controller **mbox = res;
|
||||
|
||||
mbox_controller_unregister(*mbox);
|
||||
}
|
||||
|
||||
static int devm_mbox_controller_match(struct device *dev, void *res, void *data)
|
||||
{
|
||||
struct mbox_controller **mbox = res;
|
||||
|
||||
if (WARN_ON(!mbox || !*mbox))
|
||||
return 0;
|
||||
|
||||
return *mbox == data;
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_mbox_controller_register() - managed mbox_controller_register()
|
||||
* @dev: device owning the mailbox controller being registered
|
||||
* @mbox: mailbox controller being registered
|
||||
*
|
||||
* This function adds a device-managed resource that will make sure that the
|
||||
* mailbox controller, which is registered using mbox_controller_register()
|
||||
* as part of this function, will be unregistered along with the rest of
|
||||
* device-managed resources upon driver probe failure or driver removal.
|
||||
*
|
||||
* Returns 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int devm_mbox_controller_register(struct device *dev,
|
||||
struct mbox_controller *mbox)
|
||||
{
|
||||
struct mbox_controller **ptr;
|
||||
int err;
|
||||
|
||||
ptr = devres_alloc(__devm_mbox_controller_unregister, sizeof(*ptr),
|
||||
GFP_KERNEL);
|
||||
if (!ptr)
|
||||
return -ENOMEM;
|
||||
|
||||
err = mbox_controller_register(mbox);
|
||||
if (err < 0) {
|
||||
devres_free(ptr);
|
||||
return err;
|
||||
}
|
||||
|
||||
devres_add(dev, ptr);
|
||||
*ptr = mbox;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_mbox_controller_register);
|
||||
|
||||
/**
|
||||
* devm_mbox_controller_unregister() - managed mbox_controller_unregister()
|
||||
* @dev: device owning the mailbox controller being unregistered
|
||||
* @mbox: mailbox controller being unregistered
|
||||
*
|
||||
* This function unregisters the mailbox controller and removes the device-
|
||||
* managed resource that was set up to automatically unregister the mailbox
|
||||
* controller on driver probe failure or driver removal. It's typically not
|
||||
* necessary to call this function.
|
||||
*/
|
||||
void devm_mbox_controller_unregister(struct device *dev, struct mbox_controller *mbox)
|
||||
{
|
||||
WARN_ON(devres_release(dev, __devm_mbox_controller_unregister,
|
||||
devm_mbox_controller_match, mbox));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_mbox_controller_unregister);
|
||||
|
|
|
@ -131,4 +131,9 @@ void mbox_controller_unregister(struct mbox_controller *mbox); /* can sleep */
|
|||
void mbox_chan_received_data(struct mbox_chan *chan, void *data); /* atomic */
|
||||
void mbox_chan_txdone(struct mbox_chan *chan, int r); /* atomic */
|
||||
|
||||
int devm_mbox_controller_register(struct device *dev,
|
||||
struct mbox_controller *mbox);
|
||||
void devm_mbox_controller_unregister(struct device *dev,
|
||||
struct mbox_controller *mbox);
|
||||
|
||||
#endif /* __MAILBOX_CONTROLLER_H */
|
||||
|
|
Загрузка…
Ссылка в новой задаче