mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08:00
mfd: Add resource managed APIs for mfd_add_devices
Add resource managed API devm_mfd_add_devices() for the mfd_add_devices(). This helps in reducing code in error path as it is not required to call mfd_remove_devices() explicitly to remove all child-devices. In some cases, it also helps not to implement .remove() callback which get called during driver unbind. Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Signed-off-by: Lee Jones <lee.jones@linaro.org>
This commit is contained in:
parent
bd425113a1
commit
a8f447be80
@ -334,6 +334,44 @@ void mfd_remove_devices(struct device *parent)
|
||||
}
|
||||
EXPORT_SYMBOL(mfd_remove_devices);
|
||||
|
||||
static void devm_mfd_dev_release(struct device *dev, void *res)
|
||||
{
|
||||
mfd_remove_devices(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_mfd_add_devices - Resource managed version of mfd_add_devices()
|
||||
*
|
||||
* Returns 0 on success or an appropriate negative error number on failure.
|
||||
* All child-devices of the MFD will automatically be removed when it gets
|
||||
* unbinded.
|
||||
*/
|
||||
int devm_mfd_add_devices(struct device *dev, int id,
|
||||
const struct mfd_cell *cells, int n_devs,
|
||||
struct resource *mem_base,
|
||||
int irq_base, struct irq_domain *domain)
|
||||
{
|
||||
struct device **ptr;
|
||||
int ret;
|
||||
|
||||
ptr = devres_alloc(devm_mfd_dev_release, sizeof(*ptr), GFP_KERNEL);
|
||||
if (!ptr)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = mfd_add_devices(dev, id, cells, n_devs, mem_base,
|
||||
irq_base, domain);
|
||||
if (ret < 0) {
|
||||
devres_free(ptr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
*ptr = dev;
|
||||
devres_add(dev, ptr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(devm_mfd_add_devices);
|
||||
|
||||
int mfd_clone_cell(const char *cell, const char **clones, size_t n_clones)
|
||||
{
|
||||
struct mfd_cell cell_entry;
|
||||
|
@ -131,4 +131,8 @@ static inline int mfd_add_hotplug_devices(struct device *parent,
|
||||
|
||||
extern void mfd_remove_devices(struct device *parent);
|
||||
|
||||
extern int devm_mfd_add_devices(struct device *dev, int id,
|
||||
const struct mfd_cell *cells, int n_devs,
|
||||
struct resource *mem_base,
|
||||
int irq_base, struct irq_domain *irq_domain);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user