diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-06-06 16:46:53 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-09-15 11:26:49 -0400 |
commit | 0fb2970b4b6bfc26817a731b8bc29a9bf9177c20 (patch) | |
tree | 433c6102e92c1099273f824ddd13d94a9ce5e92e | |
parent | 64291f7db5bd8150a74ad2036f1037e6a0428df2 (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/Kconfig | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/Makefile | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_crtc.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_crtc.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_drv.c | 125 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_output.c | 142 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_output.h | 33 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_slave.c | 139 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_slave.h | 26 |
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 | |||
18 | config 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 @@ | |||
1 | armada-y := armada_crtc.o armada_drv.o armada_fb.o armada_fbdev.o \ | 1 | armada-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 | ||
4 | armada-y += armada_510.o | 3 | armada-y += armada_510.o |
5 | armada-$(CONFIG_DEBUG_FS) += armada_debugfs.o | 4 | armada-$(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 | ||
1047 | int armada_drm_crtc_create(struct drm_device *drm, struct device *dev, | 1047 | static 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 | ||
78 | struct device_node; | ||
79 | int armada_drm_crtc_create(struct drm_device *, struct device *, | ||
80 | struct resource *, int, const struct armada_variant *, | ||
81 | struct device_node *); | ||
82 | void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int); | 78 | void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int); |
83 | void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int); | 79 | void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int); |
84 | void armada_drm_crtc_disable_irq(struct armada_crtc *, u32); | 80 | void 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 | |||
25 | static 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 | |||
44 | static 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 = ¶ms, | ||
53 | }, | ||
54 | }; | ||
55 | #endif | ||
56 | |||
57 | static bool is_componentized(struct device *dev) | ||
58 | { | ||
59 | return dev->of_node || dev->platform_data; | ||
60 | } | ||
61 | |||
62 | static void armada_drm_unref_work(struct work_struct *work) | 21 | static 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 | ||
92 | static int armada_drm_load(struct drm_device *dev, unsigned long flags) | 51 | static 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 | ||
436 | static int armada_drm_probe(struct platform_device *pdev) | 354 | static 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 | ||
453 | static int armada_drm_remove(struct platform_device *pdev) | 367 | static 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 | ||
462 | static const struct platform_device_id armada_drm_platform_ids[] = { | 373 | static 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 | |||
15 | struct 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 | |||
22 | struct 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 | |||
29 | static 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 | |||
47 | static 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 | |||
56 | static 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 | |||
67 | static 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? */ | ||
76 | int 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 | |||
90 | int 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 | |||
105 | int 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 | |||
14 | struct 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 | |||
22 | struct drm_encoder *armada_drm_connector_encoder(struct drm_connector *conn); | ||
23 | |||
24 | int armada_drm_slave_encoder_mode_valid(struct drm_connector *conn, | ||
25 | struct drm_display_mode *mode); | ||
26 | |||
27 | int armada_drm_slave_encoder_set_property(struct drm_connector *conn, | ||
28 | struct drm_property *property, uint64_t value); | ||
29 | |||
30 | int 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 | |||
17 | static 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 | |||
31 | static 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 | |||
45 | static const struct drm_encoder_funcs armada_drm_slave_encoder_funcs = { | ||
46 | .destroy = armada_drm_slave_destroy, | ||
47 | }; | ||
48 | |||
49 | static 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 | |||
55 | static 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 | |||
66 | static int | ||
67 | armada_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 | |||
129 | static 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 | |||
135 | int 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 | |||
14 | struct 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 | |||
23 | int armada_drm_connector_slave_create(struct drm_device *dev, | ||
24 | const struct armada_drm_slave_config *); | ||
25 | |||
26 | #endif | ||