diff --git a/drivers/power/supply/qcom/fg-core.h b/drivers/power/supply/qcom/fg-core.h
index ae0474a8c3e3f0499065dc443fc38a21b09421ff..355e52cd523d2a35a889c639df4218588636afbc 100644
--- a/drivers/power/supply/qcom/fg-core.h
+++ b/drivers/power/supply/qcom/fg-core.h
@@ -442,8 +442,7 @@ struct fg_chip {
 	struct delayed_work	ttf_work;
 	struct delayed_work	sram_dump_work;
 #ifdef CONFIG_FG_DC_BATT_ID
-	u32    dc_batt_id;
-	u32    id_range_pct;
+	bool			fake_dc_battery;
 #endif
 };
 
diff --git a/drivers/power/supply/qcom/qpnp-fg-gen3.c b/drivers/power/supply/qcom/qpnp-fg-gen3.c
index b8389aa648ba8e422b305288001ecb088c0d6bbe..cc72d527752a86d0d054174a7fe288aa6b8ed584 100644
--- a/drivers/power/supply/qcom/qpnp-fg-gen3.c
+++ b/drivers/power/supply/qcom/qpnp-fg-gen3.c
@@ -923,23 +923,6 @@ static int fg_get_batt_profile(struct fg_chip *chip)
 		return -ENXIO;
 	}
 
-#ifdef CONFIG_FG_DC_BATT_ID
-	rc = of_property_read_u32(batt_node, "goog,dc-batt-id",
-				  &chip->dc_batt_id);
-	if (rc < 0) {
-		dev_info(chip->dev, "dc_batt_id is missing.\n");
-		chip->dc_batt_id = 0;
-	}
-	chip->dc_batt_id *= 1000;
-
-	rc = of_property_read_u32(batt_node, "qcom,batt-id-range-pct",
-				  &chip->id_range_pct);
-	if (rc < 0) {
-		dev_info(chip->dev, "id_range_pct is missing.\n");
-		chip->id_range_pct = 5;  /* default: 5% */
-	}
-#endif
-
 	profile_node = of_batterydata_get_best_profile(batt_node,
 				(chip->batt_id_ohms + 500) / 1000, NULL);
 	if (IS_ERR(profile_node))
@@ -1150,12 +1133,39 @@ static void fg_notify_charger_fake_battery(struct fg_chip *chip)
 
 static int is_dc_batt_id(struct fg_chip *chip)
 {
-	u32 delta, limit;
+	struct device_node *node = chip->dev->of_node;
+	struct device_node *batt_node;
+	int rc;
+	u32 dc_batt_id, id_range_pct, delta, limit;
 
-	delta = abs(chip->batt_id_ohms - chip->dc_batt_id);
-	limit = (chip->dc_batt_id * chip->id_range_pct) / 100;
+	batt_node = of_find_node_by_name(node, "qcom,battery-data");
+	if (!batt_node) {
+		pr_err("Batterydata not available\n");
+		return false;
+	}
+
+	rc = of_property_read_u32(batt_node, "goog,dc-batt-id", &dc_batt_id);
+	if (rc < 0) {
+		dev_info(chip->dev, "dc_batt_id is missing.\n");
+		return false;
+	}
+	dc_batt_id *= 1000;
 
-	return (delta < limit);
+	rc = of_property_read_u32(batt_node, "qcom,batt-id-range-pct",
+				  &id_range_pct);
+	if (rc < 0 || id_range_pct > 50) {
+		dev_info(chip->dev, "id_range_pct is missing or invalid.\n");
+		id_range_pct = 5;  /* default: 5% */
+	}
+
+	if (chip->batt_id_ohms > dc_batt_id)
+		delta = chip->batt_id_ohms - dc_batt_id;
+	else
+		delta = dc_batt_id - chip->batt_id_ohms;
+	limit = (dc_batt_id * id_range_pct) / 100;
+
+	chip->fake_dc_battery = (delta < limit);
+	return chip->fake_dc_battery;
 }
 #endif
 
@@ -3497,6 +3507,10 @@ static int fg_psy_get_property(struct power_supply *psy,
 		pval->intval = chip->cl.learned_cc_uah;
 		break;
 	case POWER_SUPPLY_PROP_CHARGE_COUNTER:
+		if (chip->fake_dc_battery) {
+			pval->intval = 1000000;
+			break;
+		}
 		rc = fg_get_charge_counter(chip, &pval->intval);
 		break;
 	case POWER_SUPPLY_PROP_TIME_TO_FULL_AVG: