video: driver: use devm for resource management

use devm_add_action_or_reset() to register custom objects with devm.
This function wil invoke release callback during rmmod/remove sequence.

Change-Id: I87cf79741123bc3b1c624f8f44ba146deedaf32b
Signed-off-by: Govindaraj Rajagopal <quic_grajagop@quicinc.com>
This commit is contained in:
Govindaraj Rajagopal
2023-01-16 17:37:57 +05:30
parent 59a8ab6758
commit 6432572ed6

View File

@@ -48,53 +48,57 @@ static void __fatal_error(bool fatal)
WARN_ON(fatal); WARN_ON(fatal);
} }
static void devm_llcc_release(struct device *dev, void *res) static void devm_llcc_release(void *res)
{ {
d_vpr_h("%s()\n", __func__); d_vpr_h("%s()\n", __func__);
llcc_slice_putd(*(struct llcc_slice_desc **)res); llcc_slice_putd((struct llcc_slice_desc *)res);
} }
static struct llcc_slice_desc *devm_llcc_get(struct device *dev, u32 id) static struct llcc_slice_desc *devm_llcc_get(struct device *dev, u32 id)
{ {
struct llcc_slice_desc **ptr, *llcc; struct llcc_slice_desc *llcc = NULL;
int rc = 0;
ptr = devres_alloc(devm_llcc_release, sizeof(*ptr), GFP_KERNEL);
if (!ptr)
return ERR_PTR(-ENOMEM);
llcc = llcc_slice_getd(id); llcc = llcc_slice_getd(id);
if (!IS_ERR(llcc)) { if (!llcc)
*ptr = llcc; return NULL;
devres_add(dev, ptr);
} else { /**
devres_free(ptr); * register release callback with devm, so that when device goes
} * out of scope(during remove sequence), devm will take care of
* de-register part by invoking release callback.
*/
rc = devm_add_action_or_reset(dev, devm_llcc_release, (void *)llcc);
if (rc)
return NULL;
return llcc; return llcc;
} }
#ifdef CONFIG_MSM_MMRM #ifdef CONFIG_MSM_MMRM
static void devm_mmrm_release(struct device *dev, void *res) static void devm_mmrm_release(void *res)
{ {
d_vpr_h("%s()\n", __func__); d_vpr_h("%s()\n", __func__);
mmrm_client_deregister(*(struct mmrm_client **)res); mmrm_client_deregister((struct mmrm_client *)res);
} }
static struct mmrm_client *devm_mmrm_get(struct device *dev, struct mmrm_client_desc *desc) static struct mmrm_client *devm_mmrm_get(struct device *dev, struct mmrm_client_desc *desc)
{ {
struct mmrm_client **ptr, *mmrm; struct mmrm_client *mmrm = NULL;
int rc = 0;
ptr = devres_alloc(devm_mmrm_release, sizeof(*ptr), GFP_KERNEL);
if (!ptr)
return ERR_PTR(-ENOMEM);
mmrm = mmrm_client_register(desc); mmrm = mmrm_client_register(desc);
if (!IS_ERR(mmrm)) { if (!mmrm)
*ptr = mmrm; return NULL;
devres_add(dev, ptr);
} else { /**
devres_free(ptr); * register release callback with devm, so that when device goes
} * out of scope(during remove sequence), devm will take care of
* de-register part by invoking release callback.
*/
rc = devm_add_action_or_reset(dev, devm_mmrm_release, (void *)mmrm);
if (rc)
return NULL;
return mmrm; return mmrm;
} }