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);
|
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)
|
int mfd_clone_cell(const char *cell, const char **clones, size_t n_clones)
|
||||||
{
|
{
|
||||||
struct mfd_cell cell_entry;
|
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 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
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue