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);
|
mutex_unlock(&con_mutex);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mbox_controller_unregister);
|
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_received_data(struct mbox_chan *chan, void *data); /* atomic */
|
||||||
void mbox_chan_txdone(struct mbox_chan *chan, int r); /* 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 */
|
#endif /* __MAILBOX_CONTROLLER_H */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче