diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/displays/encoder-opa362.c')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/displays/encoder-opa362.c | 40 | 
1 files changed, 16 insertions, 24 deletions
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c index d523c67a3ae3..afee1b8b457a 100644 --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c @@ -36,7 +36,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,  		struct omap_dss_device *dst)  {  	struct panel_drv_data *ddata = to_panel_data(dssdev); -	struct omap_dss_device *in = ddata->in; +	struct omap_dss_device *in;  	int r;  	dev_dbg(dssdev->dev, "connect\n"); @@ -44,13 +44,22 @@ static int opa362_connect(struct omap_dss_device *dssdev,  	if (omapdss_device_is_connected(dssdev))  		return -EBUSY; +	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node); +	if (IS_ERR(in)) { +		dev_err(dssdev->dev, "failed to find video source\n"); +		return PTR_ERR(in); +	} +  	r = in->ops.atv->connect(in, dssdev); -	if (r) +	if (r) { +		omap_dss_put_device(in);  		return r; +	}  	dst->src = dssdev;  	dssdev->dst = dst; +	ddata->in = in;  	return 0;  } @@ -74,6 +83,9 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,  	dssdev->dst = NULL;  	in->ops.atv->disconnect(in, &ddata->dssdev); + +	omap_dss_put_device(in); +	ddata->in = NULL;  }  static int opa362_enable(struct omap_dss_device *dssdev) @@ -171,19 +183,13 @@ static const struct omapdss_atv_ops opa362_atv_ops = {  static int opa362_probe(struct platform_device *pdev)  { -	struct device_node *node = pdev->dev.of_node;  	struct panel_drv_data *ddata; -	struct omap_dss_device *dssdev, *in; +	struct omap_dss_device *dssdev;  	struct gpio_desc *gpio;  	int r;  	dev_dbg(&pdev->dev, "probe\n"); -	if (node == NULL) { -		dev_err(&pdev->dev, "Unable to find device tree\n"); -		return -EINVAL; -	} -  	ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);  	if (!ddata)  		return -ENOMEM; @@ -196,14 +202,6 @@ static int opa362_probe(struct platform_device *pdev)  	ddata->enable_gpio = gpio; -	in = omapdss_of_find_source_for_first_ep(node); -	if (IS_ERR(in)) { -		dev_err(&pdev->dev, "failed to find video source\n"); -		return PTR_ERR(in); -	} - -	ddata->in = in; -  	dssdev = &ddata->dssdev;  	dssdev->ops.atv = &opa362_atv_ops;  	dssdev->dev = &pdev->dev; @@ -214,20 +212,16 @@ static int opa362_probe(struct platform_device *pdev)  	r = omapdss_register_output(dssdev);  	if (r) {  		dev_err(&pdev->dev, "Failed to register output\n"); -		goto err_reg; +		return r;  	}  	return 0; -err_reg: -	omap_dss_put_device(ddata->in); -	return r;  }  static int __exit opa362_remove(struct platform_device *pdev)  {  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);  	struct omap_dss_device *dssdev = &ddata->dssdev; -	struct omap_dss_device *in = ddata->in;  	omapdss_unregister_output(&ddata->dssdev); @@ -239,8 +233,6 @@ static int __exit opa362_remove(struct platform_device *pdev)  	if (omapdss_device_is_connected(dssdev))  		opa362_disconnect(dssdev, dssdev->dst); -	omap_dss_put_device(in); -  	return 0;  }  |