xref: /linux/drivers/gpu/drm/tilcdc/tilcdc_encoder.c (revision 4a57e0913e8c7fff407e97909f4ae48caa84d612)
1cb18dbb7SKory Maincent (TI.com) // SPDX-License-Identifier: GPL-2.0-only
2cb18dbb7SKory Maincent (TI.com) /*
3cb18dbb7SKory Maincent (TI.com)  * Copyright (C) 2015 Texas Instruments
4cb18dbb7SKory Maincent (TI.com)  * Author: Jyri Sarha <jsarha@ti.com>
5cb18dbb7SKory Maincent (TI.com)  */
6cb18dbb7SKory Maincent (TI.com) 
7cb18dbb7SKory Maincent (TI.com) #include <linux/of_graph.h>
8cb18dbb7SKory Maincent (TI.com) 
9cb18dbb7SKory Maincent (TI.com) #include <drm/drm_atomic_helper.h>
10cb18dbb7SKory Maincent (TI.com) #include <drm/drm_bridge.h>
11*400a84e1SKory Maincent (TI.com) #include <drm/drm_bridge_connector.h>
12cb18dbb7SKory Maincent (TI.com) #include <drm/drm_of.h>
13cb18dbb7SKory Maincent (TI.com) #include <drm/drm_simple_kms_helper.h>
14cb18dbb7SKory Maincent (TI.com) 
15cb18dbb7SKory Maincent (TI.com) #include "tilcdc_drv.h"
16cb18dbb7SKory Maincent (TI.com) #include "tilcdc_encoder.h"
17cb18dbb7SKory Maincent (TI.com) 
18cb18dbb7SKory Maincent (TI.com) static
19cb18dbb7SKory Maincent (TI.com) int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
20cb18dbb7SKory Maincent (TI.com) {
21968fefeeSKory Maincent (TI.com) 	struct tilcdc_drm_private *priv = ddev_to_tilcdc_priv(ddev);
22*400a84e1SKory Maincent (TI.com) 	struct drm_connector *connector;
23cb18dbb7SKory Maincent (TI.com) 	int ret;
24cb18dbb7SKory Maincent (TI.com) 
25323401c9SKory Maincent (TI.com) 	priv->encoder->base.possible_crtcs = BIT(0);
26cb18dbb7SKory Maincent (TI.com) 
27*400a84e1SKory Maincent (TI.com) 	ret = drm_bridge_attach(&priv->encoder->base, bridge, NULL,
28*400a84e1SKory Maincent (TI.com) 				DRM_BRIDGE_ATTACH_NO_CONNECTOR);
29cb18dbb7SKory Maincent (TI.com) 	if (ret)
30cb18dbb7SKory Maincent (TI.com) 		return ret;
31cb18dbb7SKory Maincent (TI.com) 
32*400a84e1SKory Maincent (TI.com) 	connector = drm_bridge_connector_init(ddev, &priv->encoder->base);
33*400a84e1SKory Maincent (TI.com) 	if (IS_ERR(connector)) {
34*400a84e1SKory Maincent (TI.com) 		drm_err(ddev, "bridge_connector create failed\n");
35*400a84e1SKory Maincent (TI.com) 		return PTR_ERR(connector);
36*400a84e1SKory Maincent (TI.com) 	}
37cb18dbb7SKory Maincent (TI.com) 
38*400a84e1SKory Maincent (TI.com) 	ret = drm_connector_attach_encoder(connector, &priv->encoder->base);
39*400a84e1SKory Maincent (TI.com) 	if (ret) {
40*400a84e1SKory Maincent (TI.com) 		drm_err(ddev, "attaching encoder to connector failed\n");
41*400a84e1SKory Maincent (TI.com) 		return ret;
42*400a84e1SKory Maincent (TI.com) 	}
43*400a84e1SKory Maincent (TI.com) 
44*400a84e1SKory Maincent (TI.com) 	priv->connector = connector;
45cb18dbb7SKory Maincent (TI.com) 	return 0;
46cb18dbb7SKory Maincent (TI.com) }
47cb18dbb7SKory Maincent (TI.com) 
48cb18dbb7SKory Maincent (TI.com) int tilcdc_encoder_create(struct drm_device *ddev)
49cb18dbb7SKory Maincent (TI.com) {
50968fefeeSKory Maincent (TI.com) 	struct tilcdc_drm_private *priv = ddev_to_tilcdc_priv(ddev);
51323401c9SKory Maincent (TI.com) 	struct tilcdc_encoder *encoder;
52cb18dbb7SKory Maincent (TI.com) 	struct drm_bridge *bridge;
53cb18dbb7SKory Maincent (TI.com) 
541b47ea9fSKory Maincent (TI.com) 	bridge = devm_drm_of_get_bridge(ddev->dev, ddev->dev->of_node, 0, 0);
551b47ea9fSKory Maincent (TI.com) 	if (PTR_ERR(bridge) == -ENODEV)
56cb18dbb7SKory Maincent (TI.com) 		return 0;
571b47ea9fSKory Maincent (TI.com) 	else if (IS_ERR(bridge))
581b47ea9fSKory Maincent (TI.com) 		return PTR_ERR(bridge);
59cb18dbb7SKory Maincent (TI.com) 
60323401c9SKory Maincent (TI.com) 	encoder = drmm_simple_encoder_alloc(ddev, struct tilcdc_encoder,
61323401c9SKory Maincent (TI.com) 					    base, DRM_MODE_ENCODER_NONE);
62323401c9SKory Maincent (TI.com) 	if (IS_ERR(encoder)) {
632c6f1b1fSKory Maincent (TI.com) 		drm_err(ddev, "drm_encoder_init() failed %pe\n", encoder);
64323401c9SKory Maincent (TI.com) 		return PTR_ERR(encoder);
65cb18dbb7SKory Maincent (TI.com) 	}
66323401c9SKory Maincent (TI.com) 	priv->encoder = encoder;
67cb18dbb7SKory Maincent (TI.com) 
68323401c9SKory Maincent (TI.com) 	return tilcdc_attach_bridge(ddev, bridge);
69cb18dbb7SKory Maincent (TI.com) }
70