reset: add devm_reset_controller_register API
Add a device managed API for reset_controller_register(). This helps in reducing code in .remove callbacks and sometimes dropping .remove callbacks entirely. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Acked-by: Laxman Dewangan <ldewangan@nvidia.com> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>hifive-unleashed-5.1
parent
1a695a905c
commit
8d5b5d5ce5
|
@ -352,6 +352,10 @@ REGULATOR
|
||||||
devm_regulator_put()
|
devm_regulator_put()
|
||||||
devm_regulator_register()
|
devm_regulator_register()
|
||||||
|
|
||||||
|
RESET
|
||||||
|
devm_reset_control_get()
|
||||||
|
devm_reset_controller_register()
|
||||||
|
|
||||||
SLAVE DMA ENGINE
|
SLAVE DMA ENGINE
|
||||||
devm_acpi_dma_controller_register()
|
devm_acpi_dma_controller_register()
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,43 @@ void reset_controller_unregister(struct reset_controller_dev *rcdev)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(reset_controller_unregister);
|
EXPORT_SYMBOL_GPL(reset_controller_unregister);
|
||||||
|
|
||||||
|
static void devm_reset_controller_release(struct device *dev, void *res)
|
||||||
|
{
|
||||||
|
reset_controller_unregister(*(struct reset_controller_dev **)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* devm_reset_controller_register - resource managed reset_controller_register()
|
||||||
|
* @dev: device that is registering this reset controller
|
||||||
|
* @rcdev: a pointer to the initialized reset controller device
|
||||||
|
*
|
||||||
|
* Managed reset_controller_register(). For reset controllers registered by
|
||||||
|
* this function, reset_controller_unregister() is automatically called on
|
||||||
|
* driver detach. See reset_controller_register() for more information.
|
||||||
|
*/
|
||||||
|
int devm_reset_controller_register(struct device *dev,
|
||||||
|
struct reset_controller_dev *rcdev)
|
||||||
|
{
|
||||||
|
struct reset_controller_dev **rcdevp;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
rcdevp = devres_alloc(devm_reset_controller_release, sizeof(*rcdevp),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!rcdevp)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ret = reset_controller_register(rcdev);
|
||||||
|
if (!ret) {
|
||||||
|
*rcdevp = rcdev;
|
||||||
|
devres_add(dev, rcdevp);
|
||||||
|
} else {
|
||||||
|
devres_free(rcdevp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(devm_reset_controller_register);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* reset_control_reset - reset the controlled device
|
* reset_control_reset - reset the controlled device
|
||||||
* @rstc: reset controller
|
* @rstc: reset controller
|
||||||
|
|
|
@ -53,4 +53,8 @@ struct reset_controller_dev {
|
||||||
int reset_controller_register(struct reset_controller_dev *rcdev);
|
int reset_controller_register(struct reset_controller_dev *rcdev);
|
||||||
void reset_controller_unregister(struct reset_controller_dev *rcdev);
|
void reset_controller_unregister(struct reset_controller_dev *rcdev);
|
||||||
|
|
||||||
|
struct device;
|
||||||
|
int devm_reset_controller_register(struct device *dev,
|
||||||
|
struct reset_controller_dev *rcdev);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue