|
@@ -23,6 +23,7 @@
|
|
struct mdp4_lvds_connector {
|
|
struct mdp4_lvds_connector {
|
|
struct drm_connector base;
|
|
struct drm_connector base;
|
|
struct drm_encoder *encoder;
|
|
struct drm_encoder *encoder;
|
|
|
|
+ struct device_node *panel_node;
|
|
struct drm_panel *panel;
|
|
struct drm_panel *panel;
|
|
};
|
|
};
|
|
#define to_mdp4_lvds_connector(x) container_of(x, struct mdp4_lvds_connector, base)
|
|
#define to_mdp4_lvds_connector(x) container_of(x, struct mdp4_lvds_connector, base)
|
|
@@ -33,6 +34,10 @@ static enum drm_connector_status mdp4_lvds_connector_detect(
|
|
struct mdp4_lvds_connector *mdp4_lvds_connector =
|
|
struct mdp4_lvds_connector *mdp4_lvds_connector =
|
|
to_mdp4_lvds_connector(connector);
|
|
to_mdp4_lvds_connector(connector);
|
|
|
|
|
|
|
|
+ if (!mdp4_lvds_connector->panel)
|
|
|
|
+ mdp4_lvds_connector->panel =
|
|
|
|
+ of_drm_find_panel(mdp4_lvds_connector->panel_node);
|
|
|
|
+
|
|
return mdp4_lvds_connector->panel ?
|
|
return mdp4_lvds_connector->panel ?
|
|
connector_status_connected :
|
|
connector_status_connected :
|
|
connector_status_disconnected;
|
|
connector_status_disconnected;
|
|
@@ -42,10 +47,6 @@ static void mdp4_lvds_connector_destroy(struct drm_connector *connector)
|
|
{
|
|
{
|
|
struct mdp4_lvds_connector *mdp4_lvds_connector =
|
|
struct mdp4_lvds_connector *mdp4_lvds_connector =
|
|
to_mdp4_lvds_connector(connector);
|
|
to_mdp4_lvds_connector(connector);
|
|
- struct drm_panel *panel = mdp4_lvds_connector->panel;
|
|
|
|
-
|
|
|
|
- if (panel)
|
|
|
|
- drm_panel_detach(panel);
|
|
|
|
|
|
|
|
drm_connector_unregister(connector);
|
|
drm_connector_unregister(connector);
|
|
drm_connector_cleanup(connector);
|
|
drm_connector_cleanup(connector);
|
|
@@ -60,9 +61,14 @@ static int mdp4_lvds_connector_get_modes(struct drm_connector *connector)
|
|
struct drm_panel *panel = mdp4_lvds_connector->panel;
|
|
struct drm_panel *panel = mdp4_lvds_connector->panel;
|
|
int ret = 0;
|
|
int ret = 0;
|
|
|
|
|
|
- if (panel)
|
|
|
|
|
|
+ if (panel) {
|
|
|
|
+ drm_panel_attach(panel, connector);
|
|
|
|
+
|
|
ret = panel->funcs->get_modes(panel);
|
|
ret = panel->funcs->get_modes(panel);
|
|
|
|
|
|
|
|
+ drm_panel_detach(panel);
|
|
|
|
+ }
|
|
|
|
+
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -111,7 +117,7 @@ static const struct drm_connector_helper_funcs mdp4_lvds_connector_helper_funcs
|
|
|
|
|
|
/* initialize connector */
|
|
/* initialize connector */
|
|
struct drm_connector *mdp4_lvds_connector_init(struct drm_device *dev,
|
|
struct drm_connector *mdp4_lvds_connector_init(struct drm_device *dev,
|
|
- struct drm_panel *panel, struct drm_encoder *encoder)
|
|
|
|
|
|
+ struct device_node *panel_node, struct drm_encoder *encoder)
|
|
{
|
|
{
|
|
struct drm_connector *connector = NULL;
|
|
struct drm_connector *connector = NULL;
|
|
struct mdp4_lvds_connector *mdp4_lvds_connector;
|
|
struct mdp4_lvds_connector *mdp4_lvds_connector;
|
|
@@ -124,7 +130,7 @@ struct drm_connector *mdp4_lvds_connector_init(struct drm_device *dev,
|
|
}
|
|
}
|
|
|
|
|
|
mdp4_lvds_connector->encoder = encoder;
|
|
mdp4_lvds_connector->encoder = encoder;
|
|
- mdp4_lvds_connector->panel = panel;
|
|
|
|
|
|
+ mdp4_lvds_connector->panel_node = panel_node;
|
|
|
|
|
|
connector = &mdp4_lvds_connector->base;
|
|
connector = &mdp4_lvds_connector->base;
|
|
|
|
|
|
@@ -141,9 +147,6 @@ struct drm_connector *mdp4_lvds_connector_init(struct drm_device *dev,
|
|
|
|
|
|
drm_mode_connector_attach_encoder(connector, encoder);
|
|
drm_mode_connector_attach_encoder(connector, encoder);
|
|
|
|
|
|
- if (panel)
|
|
|
|
- drm_panel_attach(panel, connector);
|
|
|
|
-
|
|
|
|
return connector;
|
|
return connector;
|
|
|
|
|
|
fail:
|
|
fail:
|