mfd: pmic: Fix memory leak in debug probe

Free the debug device allocated before an
unsuccessful exit, both in pmic8058 and
pmic8901.

CRs-fixed: 308192
Signed-off-by: Jay Chokshi <jchokshi@codeaurora.org>
diff --git a/drivers/mfd/pmic8058.c b/drivers/mfd/pmic8058.c
index ff22339..7f433db 100644
--- a/drivers/mfd/pmic8058.c
+++ b/drivers/mfd/pmic8058.c
@@ -1205,6 +1205,7 @@
 	struct pm8058_dbg_device *dbgdev;
 	struct dentry *dent;
 	struct dentry *temp;
+	int rc;
 
 	if (chip == NULL) {
 		pr_err("%s: no parent data passed in.\n", __func__);
@@ -1217,8 +1218,6 @@
 		return -ENOMEM;
 	}
 
-	mutex_init(&dbgdev->dbg_mutex);
-
 	dbgdev->pm_chip = chip;
 	dbgdev->addr = -1;
 
@@ -1226,7 +1225,8 @@
 	if (dent == NULL || IS_ERR(dent)) {
 		pr_err("%s: ERR debugfs_create_dir: dent=0x%X\n",
 					__func__, (unsigned)dent);
-		return -ENOMEM;
+		rc = PTR_ERR(dent);
+		goto dir_error;
 	}
 
 	temp = debugfs_create_file("addr", S_IRUSR | S_IWUSR, dent,
@@ -1234,6 +1234,7 @@
 	if (temp == NULL || IS_ERR(temp)) {
 		pr_err("%s: ERR debugfs_create_file: dent=0x%X\n",
 					__func__, (unsigned)temp);
+		rc = PTR_ERR(temp);
 		goto debug_error;
 	}
 
@@ -1242,9 +1243,12 @@
 	if (temp == NULL || IS_ERR(temp)) {
 		pr_err("%s: ERR debugfs_create_file: dent=0x%X\n",
 					__func__, (unsigned)temp);
+		rc = PTR_ERR(temp);
 		goto debug_error;
 	}
 
+	mutex_init(&dbgdev->dbg_mutex);
+
 	dbgdev->dent = dent;
 
 	pmic_dbg_device = dbgdev;
@@ -1253,13 +1257,17 @@
 
 debug_error:
 	debugfs_remove_recursive(dent);
-	return -ENOMEM;
+dir_error:
+	kfree(dbgdev);
+
+	return rc;
 }
 
 static int __devexit pmic8058_dbg_remove(void)
 {
 	if (pmic_dbg_device) {
 		debugfs_remove_recursive(pmic_dbg_device->dent);
+		mutex_destroy(&pmic_dbg_device->dbg_mutex);
 		kfree(pmic_dbg_device);
 	}
 	return 0;
diff --git a/drivers/mfd/pmic8901.c b/drivers/mfd/pmic8901.c
index da46656..390de33 100644
--- a/drivers/mfd/pmic8901.c
+++ b/drivers/mfd/pmic8901.c
@@ -679,6 +679,7 @@
 	struct pm8901_dbg_device *dbgdev;
 	struct dentry *dent;
 	struct dentry *temp;
+	int rc;
 
 	if (chip == NULL) {
 		pr_err("%s: no parent data passed in.\n", __func__);
@@ -691,8 +692,6 @@
 		return -ENOMEM;
 	}
 
-	mutex_init(&dbgdev->dbg_mutex);
-
 	dbgdev->pm_chip = chip;
 	dbgdev->addr = -1;
 
@@ -700,7 +699,8 @@
 	if (dent == NULL || IS_ERR(dent)) {
 		pr_err("%s: ERR debugfs_create_dir: dent=0x%X\n",
 					__func__, (unsigned)dent);
-		return -ENOMEM;
+		rc = PTR_ERR(dent);
+		goto dir_error;
 	}
 
 	temp = debugfs_create_file("addr", S_IRUSR | S_IWUSR, dent,
@@ -708,6 +708,7 @@
 	if (temp == NULL || IS_ERR(temp)) {
 		pr_err("%s: ERR debugfs_create_file: dent=0x%X\n",
 					__func__, (unsigned)temp);
+		rc = PTR_ERR(temp);
 		goto debug_error;
 	}
 
@@ -716,9 +717,12 @@
 	if (temp == NULL || IS_ERR(temp)) {
 		pr_err("%s: ERR debugfs_create_file: dent=0x%X\n",
 					__func__, (unsigned)temp);
+		rc = PTR_ERR(temp);
 		goto debug_error;
 	}
 
+	mutex_init(&dbgdev->dbg_mutex);
+
 	dbgdev->dent = dent;
 
 	pmic_dbg_device = dbgdev;
@@ -727,13 +731,17 @@
 
 debug_error:
 	debugfs_remove_recursive(dent);
-	return -ENOMEM;
+dir_error:
+	kfree(dbgdev);
+
+	return rc;
 }
 
 static int __devexit pmic8901_dbg_remove(void)
 {
 	if (pmic_dbg_device) {
 		debugfs_remove_recursive(pmic_dbg_device->dent);
+		mutex_destroy(&pmic_dbg_device->dbg_mutex);
 		kfree(pmic_dbg_device);
 	}
 	return 0;