Explorar o código

Merge "video: driver: handle core init failure cases"

qctecmdr %!s(int64=4) %!d(string=hai) anos
pai
achega
eea79fdade
Modificáronse 1 ficheiros con 44 adicións e 3 borrados
  1. 44 3
      driver/vidc/src/venus_hfi.c

+ 44 - 3
driver/vidc/src/venus_hfi.c

@@ -368,6 +368,12 @@ static int __acquire_regulator(struct msm_vidc_core *core,
 	int rc = 0;
 
 	if (rinfo->has_hw_power_collapse) {
+		if (!rinfo->regulator) {
+			d_vpr_e("%s: invalid regulator\n", __func__);
+			rc = -EINVAL;
+			goto exit;
+		}
+
 		if (regulator_get_mode(rinfo->regulator) ==
 				REGULATOR_MODE_NORMAL) {
 			d_vpr_h("Skip acquire regulator %s\n", rinfo->name);
@@ -409,6 +415,11 @@ static int __hand_off_regulator(struct msm_vidc_core *core,
 	int rc = 0;
 
 	if (rinfo->has_hw_power_collapse) {
+		if (!rinfo->regulator) {
+			d_vpr_e("%s: invalid regulator\n", __func__);
+			return -EINVAL;
+		}
+
 		rc = regulator_set_mode(rinfo->regulator,
 				REGULATOR_MODE_FAST);
 		if (rc) {
@@ -479,6 +490,11 @@ static int __vote_bandwidth(struct bus_info *bus,
 {
 	int rc = 0;
 
+	if (!bus->path) {
+		d_vpr_e("%s: invalid bus\n", __func__);
+		return -EINVAL;
+	}
+
 	d_vpr_p("Voting bus %s to ab %llu kBps\n", bus->name, bw_kbps);
 	rc = icc_set_bw(bus->path, bw_kbps, 0);
 	if (rc)
@@ -1451,6 +1467,8 @@ void __disable_unprepare_clks(struct msm_vidc_core *core)
 	}
 
 	venus_hfi_for_each_clock_reverse(core, cl) {
+		if (!cl->clk)
+			continue;
 		d_vpr_h("Clock: %s disable and unprepare\n",
 				cl->name);
 
@@ -1508,6 +1526,11 @@ static int __prepare_enable_clks(struct msm_vidc_core *core)
 	}
 
 	venus_hfi_for_each_clock(core, cl) {
+		if (!cl->clk) {
+			d_vpr_e("%s: invalid clock\n", __func__);
+			rc = -EINVAL;
+			goto fail_clk_enable;
+		}
 		/*
 		 * For the clocks we control, set the rate prior to preparing
 		 * them.  Since we don't really have a load at this point, scale
@@ -1537,6 +1560,8 @@ static int __prepare_enable_clks(struct msm_vidc_core *core)
 
 fail_clk_enable:
 	venus_hfi_for_each_clock_reverse_continue(core, cl, c) {
+		if (!cl->clk)
+			continue;
 		d_vpr_e("Clock: %s disable and unprepare\n",
 			cl->name);
 		clk_disable_unprepare(cl->clk);
@@ -1557,6 +1582,8 @@ static void __deinit_bus(struct msm_vidc_core *core)
 	core->power.bw_llcc = 0;
 
 	venus_hfi_for_each_bus_reverse(core, bus) {
+		if (!bus->path)
+			continue;
 		icc_put(bus->path);
 		bus->path = NULL;
 	}
@@ -1770,6 +1797,11 @@ static int __disable_regulator(struct regulator_info *rinfo,
 {
 	int rc = 0;
 
+	if (!rinfo->regulator) {
+		d_vpr_e("%s: invalid regulator\n", __func__);
+		return -EINVAL;
+	}
+
 	d_vpr_h("Disabling regulator %s\n", rinfo->name);
 
 	/*
@@ -1832,6 +1864,12 @@ static int __enable_regulators(struct msm_vidc_core *core)
 	d_vpr_h("Enabling regulators\n");
 
 	venus_hfi_for_each_regulator(core, rinfo) {
+		if (!rinfo->regulator) {
+			d_vpr_e("%s: invalid regulator\n", __func__);
+			rc = -EINVAL;
+			goto err_reg_enable_failed;
+		}
+
 		rc = regulator_enable(rinfo->regulator);
 		if (rc) {
 			d_vpr_e("Failed to enable %s: %d\n",
@@ -1851,8 +1889,11 @@ static int __enable_regulators(struct msm_vidc_core *core)
 	return 0;
 
 err_reg_enable_failed:
-	venus_hfi_for_each_regulator_reverse_continue(core, rinfo, c)
+	venus_hfi_for_each_regulator_reverse_continue(core, rinfo, c) {
+		if (!rinfo->regulator)
+			continue;
 		__disable_regulator(rinfo, core);
+	}
 
 	return rc;
 }
@@ -2783,7 +2824,7 @@ int venus_hfi_core_init(struct msm_vidc_core *core)
 
 	rc = __load_fw(core);
 	if (rc)
-		return rc;
+		goto error;
 
 	rc = __interface_queues_init(core);
 	if (rc)
@@ -2819,7 +2860,7 @@ int venus_hfi_core_init(struct msm_vidc_core *core)
 	return 0;
 
 error:
-	d_vpr_h("%s(): failed\n", __func__);
+	d_vpr_e("%s(): failed\n", __func__);
 	return rc;
 }