mfd: pm8xxx: pwm: Fix memory leak in probe function

CRs-fixed: 313701
Change-Id: I7e7634976650044dfe684ccca3ce123a8fe66ff6
Signed-off-by: Jay Chokshi <jchokshi@codeaurora.org>
diff --git a/drivers/mfd/pm8xxx-pwm.c b/drivers/mfd/pm8xxx-pwm.c
index fa4b130..5b4f7e3 100644
--- a/drivers/mfd/pm8xxx-pwm.c
+++ b/drivers/mfd/pm8xxx-pwm.c
@@ -1230,6 +1230,7 @@
 	struct dentry		   *temp;
 	struct pm8xxx_pwm_user	  *puser;
 	int			     i;
+	int rc = 0;
 
 	if (dev == NULL) {
 		pr_err("no parent data passed in.\n");
@@ -1246,8 +1247,8 @@
 				sizeof(struct pm8xxx_pwm_user), GFP_KERNEL);
 	if (dbgdev->user == NULL) {
 		pr_err("kcalloc() failed.\n");
-		kfree(dbgdev);
-		return -ENOMEM;
+		rc = -ENOMEM;
+		goto user_error;
 	}
 
 	mutex_init(&dbgdev->dbg_mutex);
@@ -1257,7 +1258,8 @@
 	dent = debugfs_create_dir("pm8xxx-pwm-dbg", NULL);
 	if (dent == NULL || IS_ERR(dent)) {
 		pr_err("ERR debugfs_create_dir: dent=%p\n", dent);
-		return -ENOMEM;
+		rc = -ENOMEM;
+		goto dir_error;
 	}
 
 	dbgdev->dent = dent;
@@ -1269,6 +1271,7 @@
 		dent = debugfs_create_dir(pwm_ch, dbgdev->dent);
 		if (dent == NULL || IS_ERR(dent)) {
 			pr_err("ERR: pwm=%d: dir: dent=%p\n", i, dent);
+			rc = -ENOMEM;
 			goto debug_error;
 		}
 
@@ -1279,6 +1282,7 @@
 				dent, puser, &dbg_pwm_period_fops);
 		if (temp == NULL || IS_ERR(temp)) {
 			pr_err("ERR: pwm=%d: period: dent=%p\n", i, dent);
+			rc = -ENOMEM;
 			goto debug_error;
 		}
 
@@ -1286,6 +1290,7 @@
 				dent, puser, &dbg_pwm_duty_cycle_fops);
 		if (temp == NULL || IS_ERR(temp)) {
 			pr_err("ERR: pwm=%d: duty-cycle: dent=%p\n", i, dent);
+			rc = -ENOMEM;
 			goto debug_error;
 		}
 
@@ -1293,6 +1298,7 @@
 				dent, puser, &dbg_pwm_enable_fops);
 		if (temp == NULL || IS_ERR(temp)) {
 			pr_err("ERR: pwm=%d: enable: dent=%p\n", i, dent);
+			rc = -ENOMEM;
 			goto debug_error;
 		}
 	}
@@ -1303,7 +1309,11 @@
 
 debug_error:
 	debugfs_remove_recursive(dbgdev->dent);
-	return -ENOMEM;
+dir_error:
+	kfree(dbgdev->user);
+user_error:
+	kfree(dbgdev);
+	return rc;
 }
 
 static int __devexit pm8xxx_pwm_dbg_remove(void)