Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a1c14a4 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/dp: free submodule memory on probe failure"

parents 748e0d23 47ddbcdf
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -771,8 +771,10 @@ struct dp_audio *dp_audio_get(struct platform_device *pdev,
	dp_audio->off = dp_audio_off;

	rc = dp_audio_init_ext_disp(audio);
	if (rc)
	if (rc) {
		devm_kfree(&pdev->dev, audio);
		goto error;
	}

	catalog->init(catalog);

@@ -790,5 +792,5 @@ void dp_audio_put(struct dp_audio *dp_audio)

	audio = container_of(dp_audio, struct dp_audio_private, dp_audio);

	kzfree(audio);
	devm_kfree(&audio->pdev->dev, audio);
}
+2 −0
Original line number Diff line number Diff line
@@ -564,5 +564,7 @@ void dp_aux_put(struct dp_aux *dp_aux)

	aux = container_of(dp_aux, struct dp_aux_private, dp_aux);

	mutex_destroy(&aux->mutex);

	devm_kfree(aux->dev, aux);
}
+6 −2
Original line number Diff line number Diff line
@@ -463,7 +463,11 @@ struct dp_debug *dp_debug_get(struct device *dev, struct dp_panel *panel,
	dp_debug->hdisplay = 0;
	dp_debug->vrefresh = 0;

	dp_debug_init(dp_debug);
	rc = dp_debug_init(dp_debug);
	if (rc) {
		devm_kfree(dev, debug);
		goto error;
	}

	return dp_debug;
error:
@@ -495,5 +499,5 @@ void dp_debug_put(struct dp_debug *dp_debug)

	dp_debug_deinit(dp_debug);

	kzfree(debug);
	devm_kfree(debug->dev, debug);
}
+59 −25
Original line number Diff line number Diff line
@@ -749,6 +749,20 @@ static int dp_display_usbpd_attention_cb(struct device *dev)
	return rc;
}

static void dp_display_deinit_sub_modules(struct dp_display_private *dp)
{
	dp_audio_put(dp->audio);
	dp_ctrl_put(dp->ctrl);
	dp_link_put(dp->link);
	dp_panel_put(dp->panel);
	dp_aux_put(dp->aux);
	dp_power_put(dp->power);
	dp_catalog_put(dp->catalog);
	dp_parser_put(dp->parser);
	dp_usbpd_put(dp->usbpd);
	dp_debug_put(dp->debug);
}

static int dp_init_sub_modules(struct dp_display_private *dp)
{
	int rc = 0;
@@ -769,42 +783,48 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
	if (IS_ERR(dp->usbpd)) {
		rc = PTR_ERR(dp->usbpd);
		pr_err("failed to initialize usbpd, rc = %d\n", rc);
		goto err;
		dp->usbpd = NULL;
		goto error;
	}

	dp->parser = dp_parser_get(dp->pdev);
	if (IS_ERR(dp->parser)) {
		rc = PTR_ERR(dp->parser);
		pr_err("failed to initialize parser, rc = %d\n", rc);
		goto err;
		dp->parser = NULL;
		goto error_parser;
	}

	dp->catalog = dp_catalog_get(dev, &dp->parser->io);
	if (IS_ERR(dp->catalog)) {
		rc = PTR_ERR(dp->catalog);
		pr_err("failed to initialize catalog, rc = %d\n", rc);
		goto err;
		dp->catalog = NULL;
		goto error_catalog;
	}

	dp->power = dp_power_get(dp->parser);
	if (IS_ERR(dp->power)) {
		rc = PTR_ERR(dp->power);
		pr_err("failed to initialize power, rc = %d\n", rc);
		goto err;
		dp->power = NULL;
		goto error_power;
	}

	dp->aux = dp_aux_get(dev, &dp->catalog->aux, dp->parser->aux_cfg);
	if (IS_ERR(dp->aux)) {
		rc = PTR_ERR(dp->aux);
		pr_err("failed to initialize aux, rc = %d\n", rc);
		goto err;
		dp->aux = NULL;
		goto error_aux;
	}

	dp->link = dp_link_get(dev, dp->aux);
	if (IS_ERR(dp->link)) {
		rc = PTR_ERR(dp->link);
		pr_err("failed to initialize link, rc = %d\n", rc);
		goto err;
		dp->link = NULL;
		goto error_link;
	}

	panel_in.aux = dp->aux;
@@ -815,7 +835,8 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
	if (IS_ERR(dp->panel)) {
		rc = PTR_ERR(dp->panel);
		pr_err("failed to initialize panel, rc = %d\n", rc);
		goto err;
		dp->panel = NULL;
		goto error_panel;
	}

	ctrl_in.link = dp->link;
@@ -829,13 +850,16 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
	if (IS_ERR(dp->ctrl)) {
		rc = PTR_ERR(dp->ctrl);
		pr_err("failed to initialize ctrl, rc = %d\n", rc);
		goto err;
		dp->ctrl = NULL;
		goto error_ctrl;
	}

	dp->audio = dp_audio_get(dp->pdev, dp->panel, &dp->catalog->audio);
	if (IS_ERR(dp->audio)) {
		rc = PTR_ERR(dp->audio);
		pr_err("failed to initialize audio, rc = %d\n", rc);
		dp->audio = NULL;
		goto error_audio;
	}

	dp->debug = dp_debug_get(dev, dp->panel, dp->usbpd,
@@ -843,9 +867,30 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
	if (IS_ERR(dp->debug)) {
		rc = PTR_ERR(dp->debug);
		pr_err("failed to initialize debug, rc = %d\n", rc);
		goto err;
		dp->debug = NULL;
		goto error_debug;
	}
err:

	return rc;
error_debug:
	dp_audio_put(dp->audio);
error_audio:
	dp_ctrl_put(dp->ctrl);
error_ctrl:
	dp_panel_put(dp->panel);
error_panel:
	dp_link_put(dp->link);
error_link:
	dp_aux_put(dp->aux);
error_aux:
	dp_power_put(dp->power);
error_power:
	dp_catalog_put(dp->catalog);
error_catalog:
	dp_parser_put(dp->parser);
error_parser:
	dp_usbpd_put(dp->usbpd);
error:
	return rc;
}

@@ -1140,8 +1185,11 @@ static int dp_display_probe(struct platform_device *pdev)
	g_dp_display->get_test_bpp = dp_display_get_test_bpp;

	rc = component_add(&pdev->dev, &dp_display_comp_ops);
	if (rc)
	if (rc) {
		pr_err("component add failed, rc=%d\n", rc);
		dp_display_deinit_sub_modules(dp);
		devm_kfree(&pdev->dev, dp);
	}

	return rc;
}
@@ -1167,20 +1215,6 @@ int dp_display_get_num_of_displays(void)
	return 1;
}

static void dp_display_deinit_sub_modules(struct dp_display_private *dp)
{
	dp_audio_put(dp->audio);
	dp_ctrl_put(dp->ctrl);
	dp_link_put(dp->link);
	dp_panel_put(dp->panel);
	dp_aux_put(dp->aux);
	dp_power_put(dp->power);
	dp_catalog_put(dp->catalog);
	dp_parser_put(dp->parser);
	dp_usbpd_put(dp->usbpd);
	dp_debug_put(dp->debug);
}

static int dp_display_remove(struct platform_device *pdev)
{
	struct dp_display_private *dp;
+6 −2
Original line number Diff line number Diff line
@@ -612,8 +612,12 @@ struct dp_power *dp_power_get(struct dp_parser *parser)

void dp_power_put(struct dp_power *dp_power)
{
	struct dp_power_private *power = container_of(dp_power,
			struct dp_power_private, dp_power);
	struct dp_power_private *power = NULL;

	if (!dp_power)
		return;

	power = container_of(dp_power, struct dp_power_private, dp_power);

	devm_kfree(&power->pdev->dev, power);
}
Loading