Эх сурвалжийг харах

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 <[email protected]>
Govindaraj Rajagopal 2 жил өмнө
parent
commit
6432572ed6

+ 30 - 26
driver/vidc/src/resources.c

@@ -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;
-
-	ptr = devres_alloc(devm_llcc_release, sizeof(*ptr), GFP_KERNEL);
-	if (!ptr)
-		return ERR_PTR(-ENOMEM);
+	struct llcc_slice_desc *llcc = NULL;
+	int rc = 0;
 
 
 	llcc = llcc_slice_getd(id);
 	llcc = llcc_slice_getd(id);
-	if (!IS_ERR(llcc)) {
-		*ptr = llcc;
-		devres_add(dev, ptr);
-	} else {
-		devres_free(ptr);
-	}
+	if (!llcc)
+		return NULL;
+
+	/**
+	 * 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;
-
-	ptr = devres_alloc(devm_mmrm_release, sizeof(*ptr), GFP_KERNEL);
-	if (!ptr)
-		return ERR_PTR(-ENOMEM);
+	struct mmrm_client *mmrm = NULL;
+	int rc = 0;
 
 
 	mmrm = mmrm_client_register(desc);
 	mmrm = mmrm_client_register(desc);
-	if (!IS_ERR(mmrm)) {
-		*ptr = mmrm;
-		devres_add(dev, ptr);
-	} else {
-		devres_free(ptr);
-	}
+	if (!mmrm)
+		return NULL;
+
+	/**
+	 * 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;
 }
 }