diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_encoder.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_encoder.c | 99 |
1 files changed, 36 insertions, 63 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c index 7445fb1491ae..7d9b32a0eb43 100644 --- a/drivers/gpu/drm/omapdrm/omap_encoder.c +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c | |||
@@ -17,16 +17,14 @@ | |||
17 | * this program. If not, see <http://www.gnu.org/licenses/>. | 17 | * this program. If not, see <http://www.gnu.org/licenses/>. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include <linux/list.h> | ||
21 | |||
22 | #include <drm/drm_crtc.h> | ||
23 | #include <drm/drm_crtc_helper.h> | ||
20 | #include <drm/drm_edid.h> | 24 | #include <drm/drm_edid.h> |
21 | 25 | ||
22 | #include "omap_drv.h" | 26 | #include "omap_drv.h" |
23 | 27 | ||
24 | #include "drm_crtc.h" | ||
25 | #include "drm_crtc_helper.h" | ||
26 | |||
27 | #include <linux/list.h> | ||
28 | |||
29 | |||
30 | /* | 28 | /* |
31 | * encoder funcs | 29 | * encoder funcs |
32 | */ | 30 | */ |
@@ -54,8 +52,6 @@ static void omap_encoder_destroy(struct drm_encoder *encoder) | |||
54 | { | 52 | { |
55 | struct omap_encoder *omap_encoder = to_omap_encoder(encoder); | 53 | struct omap_encoder *omap_encoder = to_omap_encoder(encoder); |
56 | 54 | ||
57 | omap_encoder_set_enabled(encoder, false); | ||
58 | |||
59 | drm_encoder_cleanup(encoder); | 55 | drm_encoder_cleanup(encoder); |
60 | kfree(omap_encoder); | 56 | kfree(omap_encoder); |
61 | } | 57 | } |
@@ -64,29 +60,6 @@ static const struct drm_encoder_funcs omap_encoder_funcs = { | |||
64 | .destroy = omap_encoder_destroy, | 60 | .destroy = omap_encoder_destroy, |
65 | }; | 61 | }; |
66 | 62 | ||
67 | /* | ||
68 | * The CRTC drm_crtc_helper_set_mode() doesn't really give us the right | ||
69 | * order.. the easiest way to work around this for now is to make all | ||
70 | * the encoder-helper's no-op's and have the omap_crtc code take care | ||
71 | * of the sequencing and call us in the right points. | ||
72 | * | ||
73 | * Eventually to handle connecting CRTCs to different encoders properly, | ||
74 | * either the CRTC helpers need to change or we need to replace | ||
75 | * drm_crtc_helper_set_mode(), but lets wait until atomic-modeset for | ||
76 | * that. | ||
77 | */ | ||
78 | |||
79 | static void omap_encoder_dpms(struct drm_encoder *encoder, int mode) | ||
80 | { | ||
81 | } | ||
82 | |||
83 | static bool omap_encoder_mode_fixup(struct drm_encoder *encoder, | ||
84 | const struct drm_display_mode *mode, | ||
85 | struct drm_display_mode *adjusted_mode) | ||
86 | { | ||
87 | return true; | ||
88 | } | ||
89 | |||
90 | static void omap_encoder_mode_set(struct drm_encoder *encoder, | 63 | static void omap_encoder_mode_set(struct drm_encoder *encoder, |
91 | struct drm_display_mode *mode, | 64 | struct drm_display_mode *mode, |
92 | struct drm_display_mode *adjusted_mode) | 65 | struct drm_display_mode *adjusted_mode) |
@@ -118,44 +91,18 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder, | |||
118 | } | 91 | } |
119 | } | 92 | } |
120 | 93 | ||
121 | static void omap_encoder_prepare(struct drm_encoder *encoder) | 94 | static void omap_encoder_disable(struct drm_encoder *encoder) |
122 | { | ||
123 | } | ||
124 | |||
125 | static void omap_encoder_commit(struct drm_encoder *encoder) | ||
126 | { | ||
127 | } | ||
128 | |||
129 | static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = { | ||
130 | .dpms = omap_encoder_dpms, | ||
131 | .mode_fixup = omap_encoder_mode_fixup, | ||
132 | .mode_set = omap_encoder_mode_set, | ||
133 | .prepare = omap_encoder_prepare, | ||
134 | .commit = omap_encoder_commit, | ||
135 | }; | ||
136 | |||
137 | /* | ||
138 | * Instead of relying on the helpers for modeset, the omap_crtc code | ||
139 | * calls these functions in the proper sequence. | ||
140 | */ | ||
141 | |||
142 | int omap_encoder_set_enabled(struct drm_encoder *encoder, bool enabled) | ||
143 | { | 95 | { |
144 | struct omap_encoder *omap_encoder = to_omap_encoder(encoder); | 96 | struct omap_encoder *omap_encoder = to_omap_encoder(encoder); |
145 | struct omap_dss_device *dssdev = omap_encoder->dssdev; | 97 | struct omap_dss_device *dssdev = omap_encoder->dssdev; |
146 | struct omap_dss_driver *dssdrv = dssdev->driver; | 98 | struct omap_dss_driver *dssdrv = dssdev->driver; |
147 | 99 | ||
148 | if (enabled) { | 100 | dssdrv->disable(dssdev); |
149 | return dssdrv->enable(dssdev); | ||
150 | } else { | ||
151 | dssdrv->disable(dssdev); | ||
152 | return 0; | ||
153 | } | ||
154 | } | 101 | } |
155 | 102 | ||
156 | int omap_encoder_update(struct drm_encoder *encoder, | 103 | static int omap_encoder_update(struct drm_encoder *encoder, |
157 | struct omap_overlay_manager *mgr, | 104 | enum omap_channel channel, |
158 | struct omap_video_timings *timings) | 105 | struct omap_video_timings *timings) |
159 | { | 106 | { |
160 | struct drm_device *dev = encoder->dev; | 107 | struct drm_device *dev = encoder->dev; |
161 | struct omap_encoder *omap_encoder = to_omap_encoder(encoder); | 108 | struct omap_encoder *omap_encoder = to_omap_encoder(encoder); |
@@ -163,7 +110,7 @@ int omap_encoder_update(struct drm_encoder *encoder, | |||
163 | struct omap_dss_driver *dssdrv = dssdev->driver; | 110 | struct omap_dss_driver *dssdrv = dssdev->driver; |
164 | int ret; | 111 | int ret; |
165 | 112 | ||
166 | dssdev->src->manager = mgr; | 113 | dssdev->src->manager = omap_dss_get_overlay_manager(channel); |
167 | 114 | ||
168 | if (dssdrv->check_timings) { | 115 | if (dssdrv->check_timings) { |
169 | ret = dssdrv->check_timings(dssdev, timings); | 116 | ret = dssdrv->check_timings(dssdev, timings); |
@@ -189,6 +136,32 @@ int omap_encoder_update(struct drm_encoder *encoder, | |||
189 | return 0; | 136 | return 0; |
190 | } | 137 | } |
191 | 138 | ||
139 | static void omap_encoder_enable(struct drm_encoder *encoder) | ||
140 | { | ||
141 | struct omap_encoder *omap_encoder = to_omap_encoder(encoder); | ||
142 | struct omap_dss_device *dssdev = omap_encoder->dssdev; | ||
143 | struct omap_dss_driver *dssdrv = dssdev->driver; | ||
144 | |||
145 | omap_encoder_update(encoder, omap_crtc_channel(encoder->crtc), | ||
146 | omap_crtc_timings(encoder->crtc)); | ||
147 | |||
148 | dssdrv->enable(dssdev); | ||
149 | } | ||
150 | |||
151 | static int omap_encoder_atomic_check(struct drm_encoder *encoder, | ||
152 | struct drm_crtc_state *crtc_state, | ||
153 | struct drm_connector_state *conn_state) | ||
154 | { | ||
155 | return 0; | ||
156 | } | ||
157 | |||
158 | static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = { | ||
159 | .mode_set = omap_encoder_mode_set, | ||
160 | .disable = omap_encoder_disable, | ||
161 | .enable = omap_encoder_enable, | ||
162 | .atomic_check = omap_encoder_atomic_check, | ||
163 | }; | ||
164 | |||
192 | /* initialize encoder */ | 165 | /* initialize encoder */ |
193 | struct drm_encoder *omap_encoder_init(struct drm_device *dev, | 166 | struct drm_encoder *omap_encoder_init(struct drm_device *dev, |
194 | struct omap_dss_device *dssdev) | 167 | struct omap_dss_device *dssdev) |