aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2015-06-06 16:46:53 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2015-09-15 11:26:49 -0400
commit0fb2970b4b6bfc26817a731b8bc29a9bf9177c20 (patch)
tree433c6102e92c1099273f824ddd13d94a9ce5e92e
parent64291f7db5bd8150a74ad2036f1037e6a0428df2 (diff)
drm/armada: remove non-component support
Now that the transition of TDA998x to the component helpers is complete, remove the non-componentised support from the Armada DRM driver. All outputs are expected to use the component helpers from now on. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--drivers/gpu/drm/armada/Kconfig9
-rw-r--r--drivers/gpu/drm/armada/Makefile3
-rw-r--r--drivers/gpu/drm/armada/armada_crtc.c2
-rw-r--r--drivers/gpu/drm/armada/armada_crtc.h4
-rw-r--r--drivers/gpu/drm/armada/armada_drv.c125
-rw-r--r--drivers/gpu/drm/armada/armada_output.c142
-rw-r--r--drivers/gpu/drm/armada/armada_output.h33
-rw-r--r--drivers/gpu/drm/armada/armada_slave.c139
-rw-r--r--drivers/gpu/drm/armada/armada_slave.h26
9 files changed, 19 insertions, 464 deletions
diff --git a/drivers/gpu/drm/armada/Kconfig b/drivers/gpu/drm/armada/Kconfig
index 50ae88ad4d76..eb773e9af313 100644
--- a/drivers/gpu/drm/armada/Kconfig
+++ b/drivers/gpu/drm/armada/Kconfig
@@ -14,12 +14,3 @@ config DRM_ARMADA
14 This driver provides no built-in acceleration; acceleration is 14 This driver provides no built-in acceleration; acceleration is
15 performed by other IP found on the SoC. This driver provides 15 performed by other IP found on the SoC. This driver provides
16 kernel mode setting and buffer management to userspace. 16 kernel mode setting and buffer management to userspace.
17
18config DRM_ARMADA_TDA1998X
19 bool "Support TDA1998X HDMI output"
20 depends on DRM_ARMADA != n
21 depends on I2C && DRM_I2C_NXP_TDA998X = y
22 default y
23 help
24 Support the TDA1998x HDMI output device found on the Solid-Run
25 CuBox.
diff --git a/drivers/gpu/drm/armada/Makefile b/drivers/gpu/drm/armada/Makefile
index d6f43e06150a..ffd673615772 100644
--- a/drivers/gpu/drm/armada/Makefile
+++ b/drivers/gpu/drm/armada/Makefile
@@ -1,6 +1,5 @@
1armada-y := armada_crtc.o armada_drv.o armada_fb.o armada_fbdev.o \ 1armada-y := armada_crtc.o armada_drv.o armada_fb.o armada_fbdev.o \
2 armada_gem.o armada_output.o armada_overlay.o \ 2 armada_gem.o armada_overlay.o
3 armada_slave.o
4armada-y += armada_510.o 3armada-y += armada_510.o
5armada-$(CONFIG_DEBUG_FS) += armada_debugfs.o 4armada-$(CONFIG_DEBUG_FS) += armada_debugfs.o
6 5
diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c
index 01ffe9bffe38..c7374a3ec67a 100644
--- a/drivers/gpu/drm/armada/armada_crtc.c
+++ b/drivers/gpu/drm/armada/armada_crtc.c
@@ -1044,7 +1044,7 @@ static int armada_drm_crtc_create_properties(struct drm_device *dev)
1044 return 0; 1044 return 0;
1045} 1045}
1046 1046
1047int armada_drm_crtc_create(struct drm_device *drm, struct device *dev, 1047static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
1048 struct resource *res, int irq, const struct armada_variant *variant, 1048 struct resource *res, int irq, const struct armada_variant *variant,
1049 struct device_node *port) 1049 struct device_node *port)
1050{ 1050{
diff --git a/drivers/gpu/drm/armada/armada_crtc.h b/drivers/gpu/drm/armada/armada_crtc.h
index 98102a5a9af5..a13469f5d72b 100644
--- a/drivers/gpu/drm/armada/armada_crtc.h
+++ b/drivers/gpu/drm/armada/armada_crtc.h
@@ -75,10 +75,6 @@ struct armada_crtc {
75}; 75};
76#define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc) 76#define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc)
77 77
78struct device_node;
79int armada_drm_crtc_create(struct drm_device *, struct device *,
80 struct resource *, int, const struct armada_variant *,
81 struct device_node *);
82void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int); 78void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int);
83void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int); 79void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int);
84void armada_drm_crtc_disable_irq(struct armada_crtc *, u32); 80void armada_drm_crtc_disable_irq(struct armada_crtc *, u32);
diff --git a/drivers/gpu/drm/armada/armada_drv.c b/drivers/gpu/drm/armada/armada_drv.c
index 225034b74cda..b373cf9b2f65 100644
--- a/drivers/gpu/drm/armada/armada_drv.c
+++ b/drivers/gpu/drm/armada/armada_drv.c
@@ -18,47 +18,6 @@
18#include <drm/armada_drm.h> 18#include <drm/armada_drm.h>
19#include "armada_ioctlP.h" 19#include "armada_ioctlP.h"
20 20
21#ifdef CONFIG_DRM_ARMADA_TDA1998X
22#include <drm/i2c/tda998x.h>
23#include "armada_slave.h"
24
25static struct tda998x_encoder_params params = {
26 /* With 0x24, there is no translation between vp_out and int_vp
27 FB LCD out Pins VIP Int Vp
28 R:23:16 R:7:0 VPC7:0 7:0 7:0[R]
29 G:15:8 G:15:8 VPB7:0 23:16 23:16[G]
30 B:7:0 B:23:16 VPA7:0 15:8 15:8[B]
31 */
32 .swap_a = 2,
33 .swap_b = 3,
34 .swap_c = 4,
35 .swap_d = 5,
36 .swap_e = 0,
37 .swap_f = 1,
38 .audio_cfg = BIT(2),
39 .audio_frame[1] = 1,
40 .audio_format = AFMT_SPDIF,
41 .audio_sample_rate = 44100,
42};
43
44static const struct armada_drm_slave_config tda19988_config = {
45 .i2c_adapter_id = 0,
46 .crtcs = 1 << 0, /* Only LCD0 at the moment */
47 .polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT,
48 .interlace_allowed = true,
49 .info = {
50 .type = "tda998x",
51 .addr = 0x70,
52 .platform_data = &params,
53 },
54};
55#endif
56
57static bool is_componentized(struct device *dev)
58{
59 return dev->of_node || dev->platform_data;
60}
61
62static void armada_drm_unref_work(struct work_struct *work) 21static void armada_drm_unref_work(struct work_struct *work)
63{ 22{
64 struct armada_private *priv = 23 struct armada_private *priv =
@@ -91,16 +50,11 @@ void armada_drm_queue_unref_work(struct drm_device *dev,
91 50
92static int armada_drm_load(struct drm_device *dev, unsigned long flags) 51static int armada_drm_load(struct drm_device *dev, unsigned long flags)
93{ 52{
94 const struct platform_device_id *id;
95 const struct armada_variant *variant;
96 struct armada_private *priv; 53 struct armada_private *priv;
97 struct resource *res[ARRAY_SIZE(priv->dcrtc)];
98 struct resource *mem = NULL; 54 struct resource *mem = NULL;
99 int ret, n, i; 55 int ret, n;
100 56
101 memset(res, 0, sizeof(res)); 57 for (n = 0; ; n++) {
102
103 for (n = i = 0; ; n++) {
104 struct resource *r = platform_get_resource(dev->platformdev, 58 struct resource *r = platform_get_resource(dev->platformdev,
105 IORESOURCE_MEM, n); 59 IORESOURCE_MEM, n);
106 if (!r) 60 if (!r)
@@ -109,8 +63,6 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags)
109 /* Resources above 64K are graphics memory */ 63 /* Resources above 64K are graphics memory */
110 if (resource_size(r) > SZ_64K) 64 if (resource_size(r) > SZ_64K)
111 mem = r; 65 mem = r;
112 else if (i < ARRAY_SIZE(priv->dcrtc))
113 res[i++] = r;
114 else 66 else
115 return -EINVAL; 67 return -EINVAL;
116 } 68 }
@@ -131,13 +83,6 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags)
131 platform_set_drvdata(dev->platformdev, dev); 83 platform_set_drvdata(dev->platformdev, dev);
132 dev->dev_private = priv; 84 dev->dev_private = priv;
133 85
134 /* Get the implementation specific driver data. */
135 id = platform_get_device_id(dev->platformdev);
136 if (!id)
137 return -ENXIO;
138
139 variant = (const struct armada_variant *)id->driver_data;
140
141 INIT_WORK(&priv->fb_unref_work, armada_drm_unref_work); 86 INIT_WORK(&priv->fb_unref_work, armada_drm_unref_work);
142 INIT_KFIFO(priv->fb_unref); 87 INIT_KFIFO(priv->fb_unref);
143 88
@@ -157,34 +102,9 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags)
157 dev->mode_config.funcs = &armada_drm_mode_config_funcs; 102 dev->mode_config.funcs = &armada_drm_mode_config_funcs;
158 drm_mm_init(&priv->linear, mem->start, resource_size(mem)); 103 drm_mm_init(&priv->linear, mem->start, resource_size(mem));
159 104
160 /* Create all LCD controllers */ 105 ret = component_bind_all(dev->dev, dev);
161 for (n = 0; n < ARRAY_SIZE(priv->dcrtc); n++) { 106 if (ret)
162 int irq; 107 goto err_kms;
163
164 if (!res[n])
165 break;
166
167 irq = platform_get_irq(dev->platformdev, n);
168 if (irq < 0)
169 goto err_kms;
170
171 ret = armada_drm_crtc_create(dev, dev->dev, res[n], irq,
172 variant, NULL);
173 if (ret)
174 goto err_kms;
175 }
176
177 if (is_componentized(dev->dev)) {
178 ret = component_bind_all(dev->dev, dev);
179 if (ret)
180 goto err_kms;
181 } else {
182#ifdef CONFIG_DRM_ARMADA_TDA1998X
183 ret = armada_drm_connector_slave_create(dev, &tda19988_config);
184 if (ret)
185 goto err_kms;
186#endif
187 }
188 108
189 ret = drm_vblank_init(dev, dev->mode_config.num_crtc); 109 ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
190 if (ret) 110 if (ret)
@@ -202,8 +122,7 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags)
202 return 0; 122 return 0;
203 123
204 err_comp: 124 err_comp:
205 if (is_componentized(dev->dev)) 125 component_unbind_all(dev->dev, dev);
206 component_unbind_all(dev->dev, dev);
207 err_kms: 126 err_kms:
208 drm_mode_config_cleanup(dev); 127 drm_mode_config_cleanup(dev);
209 drm_mm_takedown(&priv->linear); 128 drm_mm_takedown(&priv->linear);
@@ -219,8 +138,7 @@ static int armada_drm_unload(struct drm_device *dev)
219 drm_kms_helper_poll_fini(dev); 138 drm_kms_helper_poll_fini(dev);
220 armada_fbdev_fini(dev); 139 armada_fbdev_fini(dev);
221 140
222 if (is_componentized(dev->dev)) 141 component_unbind_all(dev->dev, dev);
223 component_unbind_all(dev->dev, dev);
224 142
225 drm_mode_config_cleanup(dev); 143 drm_mode_config_cleanup(dev);
226 drm_mm_takedown(&priv->linear); 144 drm_mm_takedown(&priv->linear);
@@ -435,37 +353,28 @@ static const struct component_master_ops armada_master_ops = {
435 353
436static int armada_drm_probe(struct platform_device *pdev) 354static int armada_drm_probe(struct platform_device *pdev)
437{ 355{
438 if (is_componentized(&pdev->dev)) { 356 struct component_match *match = NULL;
439 struct component_match *match = NULL; 357 int ret;
440 int ret; 358
441 359 ret = armada_drm_find_components(&pdev->dev, &match);
442 ret = armada_drm_find_components(&pdev->dev, &match); 360 if (ret < 0)
443 if (ret < 0) 361 return ret;
444 return ret; 362
445 363 return component_master_add_with_match(&pdev->dev, &armada_master_ops,
446 return component_master_add_with_match(&pdev->dev, 364 match);
447 &armada_master_ops, match);
448 } else {
449 return drm_platform_init(&armada_drm_driver, pdev);
450 }
451} 365}
452 366
453static int armada_drm_remove(struct platform_device *pdev) 367static int armada_drm_remove(struct platform_device *pdev)
454{ 368{
455 if (is_componentized(&pdev->dev)) 369 component_master_del(&pdev->dev, &armada_master_ops);
456 component_master_del(&pdev->dev, &armada_master_ops);
457 else
458 drm_put_dev(platform_get_drvdata(pdev));
459 return 0; 370 return 0;
460} 371}
461 372
462static const struct platform_device_id armada_drm_platform_ids[] = { 373static const struct platform_device_id armada_drm_platform_ids[] = {
463 { 374 {
464 .name = "armada-drm", 375 .name = "armada-drm",
465 .driver_data = (unsigned long)&armada510_ops,
466 }, { 376 }, {
467 .name = "armada-510-drm", 377 .name = "armada-510-drm",
468 .driver_data = (unsigned long)&armada510_ops,
469 }, 378 },
470 { }, 379 { },
471}; 380};
diff --git a/drivers/gpu/drm/armada/armada_output.c b/drivers/gpu/drm/armada/armada_output.c
deleted file mode 100644
index 5a9823178291..000000000000
--- a/drivers/gpu/drm/armada/armada_output.c
+++ /dev/null
@@ -1,142 +0,0 @@
1/*
2 * Copyright (C) 2012 Russell King
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8#include <drm/drmP.h>
9#include <drm/drm_crtc_helper.h>
10#include <drm/drm_edid.h>
11#include <drm/drm_encoder_slave.h>
12#include "armada_output.h"
13#include "armada_drm.h"
14
15struct armada_connector {
16 struct drm_connector conn;
17 const struct armada_output_type *type;
18};
19
20#define drm_to_armada_conn(c) container_of(c, struct armada_connector, conn)
21
22struct drm_encoder *armada_drm_connector_encoder(struct drm_connector *conn)
23{
24 struct drm_encoder *enc = conn->encoder;
25
26 return enc ? enc : drm_encoder_find(conn->dev, conn->encoder_ids[0]);
27}
28
29static enum drm_connector_status armada_drm_connector_detect(
30 struct drm_connector *conn, bool force)
31{
32 struct armada_connector *dconn = drm_to_armada_conn(conn);
33 enum drm_connector_status status = connector_status_disconnected;
34
35 if (dconn->type->detect) {
36 status = dconn->type->detect(conn, force);
37 } else {
38 struct drm_encoder *enc = armada_drm_connector_encoder(conn);
39
40 if (enc)
41 status = encoder_helper_funcs(enc)->detect(enc, conn);
42 }
43
44 return status;
45}
46
47static void armada_drm_connector_destroy(struct drm_connector *conn)
48{
49 struct armada_connector *dconn = drm_to_armada_conn(conn);
50
51 drm_connector_unregister(conn);
52 drm_connector_cleanup(conn);
53 kfree(dconn);
54}
55
56static int armada_drm_connector_set_property(struct drm_connector *conn,
57 struct drm_property *property, uint64_t value)
58{
59 struct armada_connector *dconn = drm_to_armada_conn(conn);
60
61 if (!dconn->type->set_property)
62 return -EINVAL;
63
64 return dconn->type->set_property(conn, property, value);
65}
66
67static const struct drm_connector_funcs armada_drm_conn_funcs = {
68 .dpms = drm_helper_connector_dpms,
69 .fill_modes = drm_helper_probe_single_connector_modes,
70 .detect = armada_drm_connector_detect,
71 .destroy = armada_drm_connector_destroy,
72 .set_property = armada_drm_connector_set_property,
73};
74
75/* Shouldn't this be a generic helper function? */
76int armada_drm_slave_encoder_mode_valid(struct drm_connector *conn,
77 struct drm_display_mode *mode)
78{
79 struct drm_encoder *encoder = armada_drm_connector_encoder(conn);
80 int valid = MODE_BAD;
81
82 if (encoder) {
83 struct drm_encoder_slave *slave = to_encoder_slave(encoder);
84
85 valid = slave->slave_funcs->mode_valid(encoder, mode);
86 }
87 return valid;
88}
89
90int armada_drm_slave_encoder_set_property(struct drm_connector *conn,
91 struct drm_property *property, uint64_t value)
92{
93 struct drm_encoder *encoder = armada_drm_connector_encoder(conn);
94 int rc = -EINVAL;
95
96 if (encoder) {
97 struct drm_encoder_slave *slave = to_encoder_slave(encoder);
98
99 rc = slave->slave_funcs->set_property(encoder, conn, property,
100 value);
101 }
102 return rc;
103}
104
105int armada_output_create(struct drm_device *dev,
106 const struct armada_output_type *type, const void *data)
107{
108 struct armada_connector *dconn;
109 int ret;
110
111 dconn = kzalloc(sizeof(*dconn), GFP_KERNEL);
112 if (!dconn)
113 return -ENOMEM;
114
115 dconn->type = type;
116
117 ret = drm_connector_init(dev, &dconn->conn, &armada_drm_conn_funcs,
118 type->connector_type);
119 if (ret) {
120 DRM_ERROR("unable to init connector\n");
121 goto err_destroy_dconn;
122 }
123
124 ret = type->create(&dconn->conn, data);
125 if (ret)
126 goto err_conn;
127
128 ret = drm_connector_register(&dconn->conn);
129 if (ret)
130 goto err_sysfs;
131
132 return 0;
133
134 err_sysfs:
135 if (dconn->conn.encoder)
136 dconn->conn.encoder->funcs->destroy(dconn->conn.encoder);
137 err_conn:
138 drm_connector_cleanup(&dconn->conn);
139 err_destroy_dconn:
140 kfree(dconn);
141 return ret;
142}
diff --git a/drivers/gpu/drm/armada/armada_output.h b/drivers/gpu/drm/armada/armada_output.h
deleted file mode 100644
index f448785753e8..000000000000
--- a/drivers/gpu/drm/armada/armada_output.h
+++ /dev/null
@@ -1,33 +0,0 @@
1/*
2 * Copyright (C) 2012 Russell King
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8#ifndef ARMADA_CONNETOR_H
9#define ARMADA_CONNETOR_H
10
11#define encoder_helper_funcs(encoder) \
12 ((const struct drm_encoder_helper_funcs *)encoder->helper_private)
13
14struct armada_output_type {
15 int connector_type;
16 enum drm_connector_status (*detect)(struct drm_connector *, bool);
17 int (*create)(struct drm_connector *, const void *);
18 int (*set_property)(struct drm_connector *, struct drm_property *,
19 uint64_t);
20};
21
22struct drm_encoder *armada_drm_connector_encoder(struct drm_connector *conn);
23
24int armada_drm_slave_encoder_mode_valid(struct drm_connector *conn,
25 struct drm_display_mode *mode);
26
27int armada_drm_slave_encoder_set_property(struct drm_connector *conn,
28 struct drm_property *property, uint64_t value);
29
30int armada_output_create(struct drm_device *dev,
31 const struct armada_output_type *type, const void *data);
32
33#endif
diff --git a/drivers/gpu/drm/armada/armada_slave.c b/drivers/gpu/drm/armada/armada_slave.c
deleted file mode 100644
index 00d0facb42f3..000000000000
--- a/drivers/gpu/drm/armada/armada_slave.c
+++ /dev/null
@@ -1,139 +0,0 @@
1/*
2 * Copyright (C) 2012 Russell King
3 * Rewritten from the dovefb driver, and Armada510 manuals.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 */
9#include <drm/drmP.h>
10#include <drm/drm_crtc_helper.h>
11#include <drm/drm_edid.h>
12#include <drm/drm_encoder_slave.h>
13#include "armada_drm.h"
14#include "armada_output.h"
15#include "armada_slave.h"
16
17static int armada_drm_slave_get_modes(struct drm_connector *conn)
18{
19 struct drm_encoder *enc = armada_drm_connector_encoder(conn);
20 int count = 0;
21
22 if (enc) {
23 struct drm_encoder_slave *slave = to_encoder_slave(enc);
24
25 count = slave->slave_funcs->get_modes(enc, conn);
26 }
27
28 return count;
29}
30
31static void armada_drm_slave_destroy(struct drm_encoder *enc)
32{
33 struct drm_encoder_slave *slave = to_encoder_slave(enc);
34 struct i2c_client *client = drm_i2c_encoder_get_client(enc);
35
36 if (slave->slave_funcs)
37 slave->slave_funcs->destroy(enc);
38 if (client)
39 i2c_put_adapter(client->adapter);
40
41 drm_encoder_cleanup(&slave->base);
42 kfree(slave);
43}
44
45static const struct drm_encoder_funcs armada_drm_slave_encoder_funcs = {
46 .destroy = armada_drm_slave_destroy,
47};
48
49static const struct drm_connector_helper_funcs armada_drm_slave_helper_funcs = {
50 .get_modes = armada_drm_slave_get_modes,
51 .mode_valid = armada_drm_slave_encoder_mode_valid,
52 .best_encoder = armada_drm_connector_encoder,
53};
54
55static const struct drm_encoder_helper_funcs drm_slave_encoder_helpers = {
56 .dpms = drm_i2c_encoder_dpms,
57 .save = drm_i2c_encoder_save,
58 .restore = drm_i2c_encoder_restore,
59 .mode_fixup = drm_i2c_encoder_mode_fixup,
60 .prepare = drm_i2c_encoder_prepare,
61 .commit = drm_i2c_encoder_commit,
62 .mode_set = drm_i2c_encoder_mode_set,
63 .detect = drm_i2c_encoder_detect,
64};
65
66static int
67armada_drm_conn_slave_create(struct drm_connector *conn, const void *data)
68{
69 const struct armada_drm_slave_config *config = data;
70 struct drm_encoder_slave *slave;
71 struct i2c_adapter *adap;
72 int ret;
73
74 conn->interlace_allowed = config->interlace_allowed;
75 conn->doublescan_allowed = config->doublescan_allowed;
76 conn->polled = config->polled;
77
78 drm_connector_helper_add(conn, &armada_drm_slave_helper_funcs);
79
80 slave = kzalloc(sizeof(*slave), GFP_KERNEL);
81 if (!slave)
82 return -ENOMEM;
83
84 slave->base.possible_crtcs = config->crtcs;
85
86 adap = i2c_get_adapter(config->i2c_adapter_id);
87 if (!adap) {
88 kfree(slave);
89 return -EPROBE_DEFER;
90 }
91
92 ret = drm_encoder_init(conn->dev, &slave->base,
93 &armada_drm_slave_encoder_funcs,
94 DRM_MODE_ENCODER_TMDS);
95 if (ret) {
96 DRM_ERROR("unable to init encoder\n");
97 i2c_put_adapter(adap);
98 kfree(slave);
99 return ret;
100 }
101
102 ret = drm_i2c_encoder_init(conn->dev, slave, adap, &config->info);
103 i2c_put_adapter(adap);
104 if (ret) {
105 DRM_ERROR("unable to init encoder slave\n");
106 armada_drm_slave_destroy(&slave->base);
107 return ret;
108 }
109
110 drm_encoder_helper_add(&slave->base, &drm_slave_encoder_helpers);
111
112 ret = slave->slave_funcs->create_resources(&slave->base, conn);
113 if (ret) {
114 armada_drm_slave_destroy(&slave->base);
115 return ret;
116 }
117
118 ret = drm_mode_connector_attach_encoder(conn, &slave->base);
119 if (ret) {
120 armada_drm_slave_destroy(&slave->base);
121 return ret;
122 }
123
124 conn->encoder = &slave->base;
125
126 return ret;
127}
128
129static const struct armada_output_type armada_drm_conn_slave = {
130 .connector_type = DRM_MODE_CONNECTOR_HDMIA,
131 .create = armada_drm_conn_slave_create,
132 .set_property = armada_drm_slave_encoder_set_property,
133};
134
135int armada_drm_connector_slave_create(struct drm_device *dev,
136 const struct armada_drm_slave_config *config)
137{
138 return armada_output_create(dev, &armada_drm_conn_slave, config);
139}
diff --git a/drivers/gpu/drm/armada/armada_slave.h b/drivers/gpu/drm/armada/armada_slave.h
deleted file mode 100644
index bf2374c96fc1..000000000000
--- a/drivers/gpu/drm/armada/armada_slave.h
+++ /dev/null
@@ -1,26 +0,0 @@
1/*
2 * Copyright (C) 2012 Russell King
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8#ifndef ARMADA_SLAVE_H
9#define ARMADA_SLAVE_H
10
11#include <linux/i2c.h>
12#include <drm/drmP.h>
13
14struct armada_drm_slave_config {
15 int i2c_adapter_id;
16 uint32_t crtcs;
17 uint8_t polled;
18 bool interlace_allowed;
19 bool doublescan_allowed;
20 struct i2c_board_info info;
21};
22
23int armada_drm_connector_slave_create(struct drm_device *dev,
24 const struct armada_drm_slave_config *);
25
26#endif