diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2018-05-31 16:14:43 -0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2018-09-03 09:13:29 -0400 |
commit | 47a3ee27934a7a774be4aa1733c662f33e1ae656 (patch) | |
tree | 285cb957ea78eee57aabea31458e4cdbcb640bcf /drivers/gpu/drm/omapdrm | |
parent | 7805d1e5098c1a90e5feb153809b16ba890b03e4 (diff) |
drm/omap: Pass both output and display omap_dss_device to connector init
The drm_connector implementation requires access to the omap_dss_device
corresponding to the display, which is passed to its initialization
function and stored internally. Refactoring of the timings operations
will require access to the output omap_dss_device. To prepare for that,
pass it to the connector initialization function and store it internally
as well.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_connector.c | 30 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_connector.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_drv.c | 3 |
3 files changed, 21 insertions, 16 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c index 5091991363d6..92fea0085a9c 100644 --- a/drivers/gpu/drm/omapdrm/omap_connector.c +++ b/drivers/gpu/drm/omapdrm/omap_connector.c | |||
@@ -29,7 +29,8 @@ | |||
29 | 29 | ||
30 | struct omap_connector { | 30 | struct omap_connector { |
31 | struct drm_connector base; | 31 | struct drm_connector base; |
32 | struct omap_dss_device *dssdev; | 32 | struct omap_dss_device *output; |
33 | struct omap_dss_device *display; | ||
33 | struct omap_dss_device *hpd; | 34 | struct omap_dss_device *hpd; |
34 | bool hdmi_mode; | 35 | bool hdmi_mode; |
35 | }; | 36 | }; |
@@ -104,7 +105,7 @@ omap_connector_find_device(struct drm_connector *connector, | |||
104 | struct omap_connector *omap_connector = to_omap_connector(connector); | 105 | struct omap_connector *omap_connector = to_omap_connector(connector); |
105 | struct omap_dss_device *dssdev; | 106 | struct omap_dss_device *dssdev; |
106 | 107 | ||
107 | for (dssdev = omap_connector->dssdev; dssdev; dssdev = dssdev->src) { | 108 | for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) { |
108 | if (dssdev->ops_flags & op) | 109 | if (dssdev->ops_flags & op) |
109 | return dssdev; | 110 | return dssdev; |
110 | } | 111 | } |
@@ -129,7 +130,7 @@ static enum drm_connector_status omap_connector_detect( | |||
129 | 130 | ||
130 | omap_connector_hpd_notify(connector, dssdev->src, status); | 131 | omap_connector_hpd_notify(connector, dssdev->src, status); |
131 | } else { | 132 | } else { |
132 | switch (omap_connector->dssdev->type) { | 133 | switch (omap_connector->display->type) { |
133 | case OMAP_DISPLAY_TYPE_DPI: | 134 | case OMAP_DISPLAY_TYPE_DPI: |
134 | case OMAP_DISPLAY_TYPE_DBI: | 135 | case OMAP_DISPLAY_TYPE_DBI: |
135 | case OMAP_DISPLAY_TYPE_SDI: | 136 | case OMAP_DISPLAY_TYPE_SDI: |
@@ -142,7 +143,7 @@ static enum drm_connector_status omap_connector_detect( | |||
142 | } | 143 | } |
143 | } | 144 | } |
144 | 145 | ||
145 | VERB("%s: %d (force=%d)", omap_connector->dssdev->name, status, force); | 146 | VERB("%s: %d (force=%d)", omap_connector->display->name, status, force); |
146 | 147 | ||
147 | return status; | 148 | return status; |
148 | } | 149 | } |
@@ -151,7 +152,7 @@ static void omap_connector_destroy(struct drm_connector *connector) | |||
151 | { | 152 | { |
152 | struct omap_connector *omap_connector = to_omap_connector(connector); | 153 | struct omap_connector *omap_connector = to_omap_connector(connector); |
153 | 154 | ||
154 | DBG("%s", omap_connector->dssdev->name); | 155 | DBG("%s", omap_connector->display->name); |
155 | 156 | ||
156 | if (omap_connector->hpd) { | 157 | if (omap_connector->hpd) { |
157 | struct omap_dss_device *hpd = omap_connector->hpd; | 158 | struct omap_dss_device *hpd = omap_connector->hpd; |
@@ -165,7 +166,8 @@ static void omap_connector_destroy(struct drm_connector *connector) | |||
165 | drm_connector_cleanup(connector); | 166 | drm_connector_cleanup(connector); |
166 | kfree(omap_connector); | 167 | kfree(omap_connector); |
167 | 168 | ||
168 | omapdss_device_put(omap_connector->dssdev); | 169 | omapdss_device_put(omap_connector->output); |
170 | omapdss_device_put(omap_connector->display); | ||
169 | } | 171 | } |
170 | 172 | ||
171 | #define MAX_EDID 512 | 173 | #define MAX_EDID 512 |
@@ -212,7 +214,7 @@ static int omap_connector_get_modes(struct drm_connector *connector) | |||
212 | struct drm_display_mode *mode; | 214 | struct drm_display_mode *mode; |
213 | struct videomode vm = {0}; | 215 | struct videomode vm = {0}; |
214 | 216 | ||
215 | DBG("%s", omap_connector->dssdev->name); | 217 | DBG("%s", omap_connector->display->name); |
216 | 218 | ||
217 | /* | 219 | /* |
218 | * If display exposes EDID, then we parse that in the normal way to | 220 | * If display exposes EDID, then we parse that in the normal way to |
@@ -229,7 +231,7 @@ static int omap_connector_get_modes(struct drm_connector *connector) | |||
229 | if (!mode) | 231 | if (!mode) |
230 | return 0; | 232 | return 0; |
231 | 233 | ||
232 | dssdev = omap_connector->dssdev; | 234 | dssdev = omap_connector->display; |
233 | dssdev->ops->get_timings(dssdev, &vm); | 235 | dssdev->ops->get_timings(dssdev, &vm); |
234 | 236 | ||
235 | drm_display_mode_from_videomode(&vm, mode); | 237 | drm_display_mode_from_videomode(&vm, mode); |
@@ -250,7 +252,7 @@ static int omap_connector_mode_valid(struct drm_connector *connector, | |||
250 | struct drm_display_mode *mode) | 252 | struct drm_display_mode *mode) |
251 | { | 253 | { |
252 | struct omap_connector *omap_connector = to_omap_connector(connector); | 254 | struct omap_connector *omap_connector = to_omap_connector(connector); |
253 | struct omap_dss_device *dssdev = omap_connector->dssdev; | 255 | struct omap_dss_device *dssdev = omap_connector->display; |
254 | struct videomode vm = {0}; | 256 | struct videomode vm = {0}; |
255 | struct drm_device *dev = connector->dev; | 257 | struct drm_device *dev = connector->dev; |
256 | struct drm_display_mode *new_mode; | 258 | struct drm_display_mode *new_mode; |
@@ -325,19 +327,21 @@ static const struct drm_connector_helper_funcs omap_connector_helper_funcs = { | |||
325 | 327 | ||
326 | /* initialize connector */ | 328 | /* initialize connector */ |
327 | struct drm_connector *omap_connector_init(struct drm_device *dev, | 329 | struct drm_connector *omap_connector_init(struct drm_device *dev, |
328 | int connector_type, struct omap_dss_device *dssdev, | 330 | int connector_type, struct omap_dss_device *output, |
329 | struct drm_encoder *encoder) | 331 | struct omap_dss_device *display, struct drm_encoder *encoder) |
330 | { | 332 | { |
331 | struct drm_connector *connector = NULL; | 333 | struct drm_connector *connector = NULL; |
332 | struct omap_connector *omap_connector; | 334 | struct omap_connector *omap_connector; |
335 | struct omap_dss_device *dssdev; | ||
333 | 336 | ||
334 | DBG("%s", dssdev->name); | 337 | DBG("%s", display->name); |
335 | 338 | ||
336 | omap_connector = kzalloc(sizeof(*omap_connector), GFP_KERNEL); | 339 | omap_connector = kzalloc(sizeof(*omap_connector), GFP_KERNEL); |
337 | if (!omap_connector) | 340 | if (!omap_connector) |
338 | goto fail; | 341 | goto fail; |
339 | 342 | ||
340 | omap_connector->dssdev = omapdss_device_get(dssdev); | 343 | omap_connector->output = omapdss_device_get(output); |
344 | omap_connector->display = omapdss_device_get(display); | ||
341 | 345 | ||
342 | connector = &omap_connector->base; | 346 | connector = &omap_connector->base; |
343 | connector->interlace_allowed = 1; | 347 | connector->interlace_allowed = 1; |
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.h b/drivers/gpu/drm/omapdrm/omap_connector.h index 465b3c9499d5..42ff0a106179 100644 --- a/drivers/gpu/drm/omapdrm/omap_connector.h +++ b/drivers/gpu/drm/omapdrm/omap_connector.h | |||
@@ -28,8 +28,8 @@ struct drm_encoder; | |||
28 | struct omap_dss_device; | 28 | struct omap_dss_device; |
29 | 29 | ||
30 | struct drm_connector *omap_connector_init(struct drm_device *dev, | 30 | struct drm_connector *omap_connector_init(struct drm_device *dev, |
31 | int connector_type, struct omap_dss_device *dssdev, | 31 | int connector_type, struct omap_dss_device *output, |
32 | struct drm_encoder *encoder); | 32 | struct omap_dss_device *display, struct drm_encoder *encoder); |
33 | struct drm_encoder *omap_connector_attached_encoder( | 33 | struct drm_encoder *omap_connector_attached_encoder( |
34 | struct drm_connector *connector); | 34 | struct drm_connector *connector); |
35 | bool omap_connector_get_hdmi_mode(struct drm_connector *connector); | 35 | bool omap_connector_get_hdmi_mode(struct drm_connector *connector); |
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index 174bf498f4e5..03771f818eaa 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c | |||
@@ -323,7 +323,8 @@ static int omap_modeset_init(struct drm_device *dev) | |||
323 | return -ENOMEM; | 323 | return -ENOMEM; |
324 | 324 | ||
325 | connector = omap_connector_init(dev, | 325 | connector = omap_connector_init(dev, |
326 | get_connector_type(display), display, encoder); | 326 | get_connector_type(display), pipe->output, |
327 | display, encoder); | ||
327 | if (!connector) | 328 | if (!connector) |
328 | return -ENOMEM; | 329 | return -ENOMEM; |
329 | 330 | ||